From 52f019a358ce6cc153f18f3094fdf3e831daeff9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darko=20Miji=C4=87?= Date: Wed, 19 Aug 2026 23:33:19 +0200 Subject: [PATCH 1/6] migrate libar-platform delivery tooling from architect to SDP Replace @libar-dev/architect with a local @libar-dev/software-delivery-protocol link, author Specs/Packs under specs/, bind former architect patterns via codeAnchor, strip live @architect delivery tags, and guard the cutover with vitest plus sdp build/validate. --- .gitignore | 24 + README.md | 35 +- apps/frontend/convex/admin/intents.ts | 4 - apps/frontend/convex/admin/poison.ts | 4 - apps/frontend/convex/admin/projections.ts | 7 - apps/frontend/convex/admin/rebuildDemo.ts | 4 - .../convex/commands/durableOrchestrator.ts | 4 - apps/frontend/convex/contexts/agent/index.ts | 9 - .../domain/deciders/reserveMultipleDCB.ts | 4 - .../contexts/inventory/handlers/commands.ts | 9 - .../contexts/orders/handlers/commands.ts | 9 - apps/frontend/convex/dcb/retryExecution.ts | 4 - .../convex/eventStore/durableAppend.ts | 6 - apps/frontend/convex/infrastructure.ts | 8 - .../crossContext/orderWithInventory.ts | 8 - .../convex/projections/evolve/index.ts | 3 - .../projections/evolve/orderSummary.evolve.ts | 3 - .../convex/projections/orders/orderSummary.ts | 9 - apps/frontend/convex/queries/events.ts | 3 - apps/frontend/convex/rateLimits.ts | 4 - .../frontend/convex/sagas/orderFulfillment.ts | 8 - .../frontend/convex/sagas/payments/actions.ts | 6 - apps/frontend/convex/sagas/payments/outbox.ts | 6 - apps/frontend/convex/schema.ts | 2 - .../hooks/use-reactive-order-detail.ts | 3 - .../frontend/hooks/use-reactive-projection.ts | 3 - architect/ARCHITECT-GUIDE.md | 171 +---- examples/order-management/ARCHITECTURE.md | 6 - .../order-management/convex/admin/intents.ts | 4 - .../order-management/convex/admin/poison.ts | 4 - .../convex/admin/projections.ts | 6 - .../convex/admin/rebuildDemo.ts | 4 - .../convex/commands/durableOrchestrator.ts | 4 - .../convex/commands/inventory/configs.ts | 11 - .../convex/commands/orders/configs.ts | 11 - .../convex/commands/registry.ts | 9 - .../convex/contexts/agent/_config.ts | 8 - .../convex/contexts/agent/_llm/config.ts | 6 - .../convex/contexts/agent/_llm/index.ts | 6 - .../convex/contexts/agent/_llm/runtime.ts | 6 - .../contexts/agent/_patterns/churnRisk.ts | 6 - .../contexts/agent/_utils/confidence.ts | 6 - .../convex/contexts/agent/_utils/customer.ts | 6 - .../convex/contexts/agent/_utils/index.ts | 6 - .../contexts/agent/handlers/analyzeEvent.ts | 10 - .../contexts/agent/handlers/onComplete.ts | 10 - .../convex/contexts/agent/index.ts | 8 - .../convex/contexts/agent/tools/approval.ts | 6 - .../contexts/agent/tools/emitCommand.ts | 6 - .../inventory/domain/deciders/index.ts | 9 - .../domain/deciders/reserveMultipleDCB.ts | 3 - .../contexts/inventory/domain/events.ts | 9 - .../contexts/inventory/handlers/commands.ts | 10 - .../contexts/orders/domain/deciders/index.ts | 9 - .../convex/contexts/orders/domain/events.ts | 9 - .../contexts/orders/handlers/commands.ts | 10 - .../order-management/convex/convex.config.ts | 8 - .../convex/crossContextQueries.ts | 7 - .../convex/dcb/retryExecution.ts | 7 - .../convex/eventStore/durableAppend.ts | 8 - .../convex/eventSubscriptions.ts | 10 - .../order-management/convex/infrastructure.ts | 9 - .../convex/integration/deadLetters.ts | 7 - .../convex/integration/events.ts | 7 - .../convex/integration/handlers.ts | 7 - .../convex/integration/routes.ts | 9 - examples/order-management/convex/inventory.ts | 8 - .../convex/inventoryInternal.ts | 8 - examples/order-management/convex/orders.ts | 8 - examples/order-management/convex/pools.ts | 7 - .../processManagers/orderNotification.ts | 11 - .../processManagers/reservationRelease.ts | 11 - .../crossContext/orderWithInventory.ts | 8 - .../customers/customerCancellations.ts | 10 - .../convex/projections/deadLetters.ts | 8 - .../convex/projections/definitions.ts | 7 - .../convex/projections/evolve/index.ts | 3 - .../projections/evolve/orderSummary.evolve.ts | 3 - .../inventory/activeReservations.ts | 10 - .../projections/inventory/productCatalog.ts | 10 - .../convex/projections/orders/orderItems.ts | 9 - .../convex/projections/orders/orderSummary.ts | 10 - .../order-management/convex/queries/events.ts | 3 - .../order-management/convex/rateLimits.ts | 7 - .../convex/sagas/completion.ts | 9 - .../convex/sagas/orderFulfillment.ts | 10 - .../convex/sagas/payments/actions.ts | 8 - .../convex/sagas/payments/outbox.ts | 8 - .../order-management/convex/sagas/registry.ts | 8 - .../order-management/convex/sagas/router.ts | 8 - examples/order-management/convex/schema.ts | 2 - .../behavior/agent/on-complete.feature | 5 - .../behavior/orders/cancel-order.feature | 2 - .../data-table-parsing.feature | 1 - .../decider-assertions.feature | 1 - .../fsm-assertions.feature | 1 - .../test-isolation.feature | 1 - .../dcb-multi-product-reservation.feature | 5 - .../fat-events-order-submitted.feature | 5 - .../reactive-order-detail.feature | 5 - .../reference-documentation.feature | 5 - .../durability/durable-commands.feature | 2 - .../durability/durable-publication.feature | 2 - .../durability/event-replay.feature | 2 - .../durability/idempotent-append.feature | 2 - .../durability/orphan-detection.feature | 2 - .../durability/poison-event.feature | 2 - .../orders/cancel-order.feature | 2 - .../modernization/modernization.steps.ts | 2 - .../modernization/dcb-reservation.steps.ts | 3 - .../steps/modernization/fat-events.steps.ts | 2 - .../reactive-projection.steps.ts | 3 - .../reference-documentation.steps.ts | 3 - package.json | 33 +- .../src/contracts/dual-write-contract.ts | 7 - .../platform-bc/src/contracts/identity.ts | 6 - .../features/behavior/bc-contracts.feature | 3 - ...ontext-foundation-executable-tests.feature | 6 - .../tests/steps/bc-contracts.steps.ts | 2 - packages/platform-bc/tsconfig.json | 2 +- packages/platform-bus/src/client/index.ts | 8 - ...nd-bus-foundation-executable-tests.feature | 6 - .../features/behavior/idempotency.feature | 11 - .../steps/idempotency.integration.steps.ts | 2 - .../platform-bus/tests/support/helpers.ts | 1 - packages/platform-bus/tsconfig.json | 2 +- .../platform-contracts-shared/tsconfig.json | 2 +- packages/platform-core/src/cms/types.ts | 7 - .../platform-core/src/correlation/types.ts | 6 - packages/platform-core/src/dcb/backoff.ts | 4 - packages/platform-core/src/dcb/scopeKey.ts | 7 - packages/platform-core/src/dcb/types.ts | 7 - packages/platform-core/src/dcb/withRetry.ts | 5 - .../src/durability/durableAppend.ts | 9 - .../src/durability/idempotentAppend.ts | 8 - .../platform-core/src/durability/index.ts | 9 - .../src/durability/intentCompletion.ts | 8 - .../platform-core/src/durability/outbox.ts | 8 - .../src/durability/poisonEvent.ts | 8 - .../src/durability/publication.ts | 9 - .../platform-core/src/durability/types.ts | 7 - packages/platform-core/src/ecst/builder.ts | 4 - packages/platform-core/src/ecst/embed.ts | 4 - packages/platform-core/src/ecst/index.ts | 2 - packages/platform-core/src/ecst/privacy.ts | 4 - packages/platform-core/src/ecst/types.ts | 4 - packages/platform-core/src/ecst/versioning.ts | 4 - .../src/eventbus/ConvexEventBus.ts | 7 - packages/platform-core/src/events/upcaster.ts | 6 - .../src/invariants/createInvariant.ts | 6 - packages/platform-core/src/logging/scoped.ts | 6 - .../src/middleware/MiddlewarePipeline.ts | 7 - .../src/middleware/rateLimitAdapter.ts | 5 - .../src/orchestration/CommandOrchestrator.ts | 10 - .../src/orchestration/validation.ts | 7 - .../platform-core/src/processManager/index.ts | 10 - .../src/processManager/lifecycle.ts | 6 - .../platform-core/src/projections/conflict.ts | 3 - .../platform-core/src/projections/reactive.ts | 3 - .../src/projections/replay/index.ts | 2 - .../src/projections/replay/progress.ts | 4 - .../src/projections/replay/types.ts | 4 - .../src/projections/withCheckpoint.ts | 6 - packages/platform-core/src/queries/factory.ts | 6 - .../src/repository/CMSRepository.ts | 7 - .../src/workpool/partitioning/complexity.ts | 5 - .../src/workpool/partitioning/config.ts | 5 - .../src/workpool/partitioning/helpers.ts | 9 - .../src/workpool/partitioning/index.ts | 5 - .../src/workpool/partitioning/types.ts | 9 - .../behavior/agent/audit-trail.feature | 5 - .../behavior/agent/command-emission.feature | 5 - .../behavior/agent/event-subscription.feature | 5 - .../behavior/agent/human-in-loop.feature | 5 - .../behavior/agent/pattern-detection.feature | 5 - .../features/behavior/dcb/execute.feature | 4 - .../features/behavior/dcb/scope-key.feature | 4 - .../dcb-conflict-retry.feature | 4 - .../integration-patterns.feature | 4 - .../rate-limit-adapter.feature | 4 - .../behavior/ecst/fat-event-builder.feature | 6 - .../ecst/fat-vs-thin-selection.feature | 6 - .../behavior/ecst/privacy-markers.feature | 5 - .../behavior/ecst/schema-versioning.feature | 6 - .../event-replay/replay-progress.feature | 2 - .../durable-append.feature | 2 - .../durable-publication.feature | 2 - .../idempotent-append.feature | 2 - .../intent-completion.feature | 2 - .../outbox-handler.feature | 2 - .../poison-event.feature | 2 - .../tests/features/behavior/fsm/fsm.feature | 1 - .../integration/anti-corruption-layer.feature | 5 - .../behavior/integration/context-map.feature | 5 - .../integration/contract-testing.feature | 5 - .../integration/event-versioning.feature | 5 - .../integration/published-language.feature | 5 - .../invariants/create-invariant-set.feature | 1 - .../invariants/create-invariant.feature | 1 - .../invariants/invariant-error.feature | 1 - .../behavior/logging/commands.feature | 1 - .../features/behavior/logging/scoped.feature | 1 - .../features/behavior/logging/testing.feature | 1 - .../features/behavior/logging/types.feature | 1 - .../monitoring/circuit-breaker.feature | 1 - ...aga-orchestration-executable-tests.feature | 6 - .../behavior/processManager/executor.feature | 1 - .../behavior/processManager/lifecycle.feature | 1 - .../behavior/processManager/registry.feature | 1 - .../processManager/subscription.feature | 1 - .../behavior/processManager/types.feature | 1 - .../admin-tooling.feature | 5 - .../circuit-breakers.feature | 5 - .../distributed-tracing.feature | 5 - .../durable-function-integration.feature | 5 - .../health-endpoints.feature | 5 - .../metrics-collection.feature | 5 - .../rate-limiting.feature | 5 - .../category-definitions.feature | 6 - .../explicit-declaration.feature | 6 - .../registry-lookup.feature | 6 - .../behavior/projections/lifecycle.feature | 1 - .../conflict-detection.feature | 7 - .../reactive-projections/hybrid-model.feature | 7 - .../reactive-eligibility.feature | 7 - .../shared-evolve.feature | 7 - .../reservation/confirm-operation.feature | 5 - .../reservation/release-operation.feature | 5 - .../reservation/reservation-key.feature | 5 - .../reservation/reserve-operation.feature | 5 - .../features/behavior/testing/guards.feature | 13 - .../testing/integration-isolation.feature | 7 - .../testing/platform-coverage.feature | 7 - .../features/behavior/testing/polling.feature | 13 - .../features/behavior/testing/world.feature | 13 - .../complexity-classifier.feature | 2 - .../partition-key-helpers.feature | 2 - .../partition-validation.feature | 2 - .../idempotent-append.integration.steps.ts | 4 - .../poison-event.integration.steps.ts | 4 - .../dcb-retry.integration.steps.ts | 4 - .../integration-patterns.integration.steps.ts | 4 - .../rate-limit.integration.steps.ts | 4 - .../tests/planning-stubs/agent/agent.steps.ts | 2 - .../integration/patterns.steps.ts | 3 - .../admin-tooling.steps.ts | 2 - .../circuit-breakers.steps.ts | 2 - .../distributed-tracing.steps.ts | 2 - .../durable-function-integration.steps.ts | 2 - .../health-endpoints.steps.ts | 2 - .../metrics-collection.steps.ts | 2 - .../rate-limiting.steps.ts | 2 - .../tests/steps/agent/agent.steps.ts | 2 - .../steps/durability/durable-append.steps.ts | 2 - .../durability/durable-publication.steps.ts | 2 - .../durability/idempotent-append.steps.ts | 2 - .../durability/intent-completion.steps.ts | 2 - .../steps/durability/outbox-handler.steps.ts | 2 - .../steps/durability/poison-event.steps.ts | 2 - .../tests/steps/ecst/builder.steps.ts | 2 - .../tests/steps/ecst/privacy.steps.ts | 2 - .../tests/steps/ecst/selection.steps.ts | 2 - .../tests/steps/ecst/versioning.steps.ts | 2 - .../event-replay/replay-progress.steps.ts | 2 - .../tests/steps/projections/reactive.steps.ts | 2 - .../testing/integration-isolation.steps.ts | 2 - .../steps/testing/platform-coverage.steps.ts | 2 - packages/platform-core/tsconfig.json | 2 +- packages/platform-decider/src/types.ts | 6 - .../features/behavior/decider-outputs.feature | 11 - .../tests/steps/decider-outputs.steps.ts | 2 - packages/platform-decider/tsconfig.json | 2 +- .../features/behavior/fsm-transitions.feature | 5 - .../tests/steps/fsm-transitions.steps.ts | 2 - packages/platform-fsm/tsconfig.json | 2 +- packages/platform-store/src/client/index.ts | 8 - ...-store-foundation-executable-tests.feature | 6 - .../behavior/event-store-types.feature | 3 - .../tests/steps/event-store-types.steps.ts | 2 - packages/platform-store/tsconfig.json | 2 +- pnpm-lock.yaml | 387 +++------- scripts/generate-dcb-docs.ts | 94 +-- scripts/migrate-architect-corpus.mjs | 317 +++++++++ scripts/migrate-architect-tags.mjs | 278 ++++++++ specs/README.md | 31 + .../codec-driven-reference-generation.sdp.md | 12 + specs/decisions.pack.sdp.md | 30 + .../pdr-001-process-decisions-folder.sdp.md | 16 + ...002-release-management-architecture.sdp.md | 16 + ...003-behavior-feature-file-structure.sdp.md | 16 + ...004-unified-tag-prefix-architecture.sdp.md | 16 + specs/decisions/pdr-005-mvp-workflow.sdp.md | 16 + ...pdr-006-typescript-sourced-taxonomy.sdp.md | 16 + .../pdr-007-two-tier-spec-architecture.sdp.md | 16 + .../pdr-008-example-app-purpose.sdp.md | 16 + .../pdr-009-design-session-methodology.sdp.md | 16 + ...-cross-component-argument-injection.sdp.md | 16 + ...1-agent-action-handler-architecture.sdp.md | 16 + .../pdr-012-agent-command-routing.sdp.md | 16 + .../pdr-013-agent-lifecycle-fsm.sdp.md | 16 + ...-boundary-authentication-convention.sdp.md | 16 + ...bal-position-numeric-representation.sdp.md | 16 + ...-pool-split-named-pools-per-concern.sdp.md | 16 + ...ranche-3-platform-architecture-gate.sdp.md | 16 + ...cy-enforcement-for-append-to-stream.sdp.md | 16 + ...-v-any-vs-v-unknown-boundary-policy.sdp.md | 16 + .../pdr-020-events-table-index-policy.sdp.md | 16 + ...runtime-dependency-on-platform-core.sdp.md | 16 + ...22-value-transfer-doctrine-adoption.sdp.md | 16 + ...bulk-doctrine-rollback-and-recovery.sdp.md | 16 + specs/epic-process-enhancements.sdp.md | 12 + specs/example-app/agent-admin-frontend.sdp.md | 12 + specs/platform-patterns.pack.sdp.md | 115 +++ specs/platform.pack.sdp.md | 137 ++++ .../admin-tooling-consolidation.sdp.md | 12 + .../agent-bc-component-isolation.sdp.md | 12 + .../agent-command-infrastructure.sdp.md | 12 + specs/platform/agent-llm-integration.sdp.md | 12 + specs/platform/circuit-breaker-pattern.sdp.md | 12 + ...-boundary-authentication-convention.sdp.md | 12 + .../confirmed-order-cancellation.sdp.md | 12 + .../platform/deterministic-id-hashing.sdp.md | 12 + .../event-correctness-migration.sdp.md | 12 + .../generated-docs/dcb-api-reference.feature | 169 ----- .../generated-docs/dcb-api-reference.sdp.md | 12 + specs/platform/health-observability.sdp.md | 12 + .../platform/integration-patterns-21a.sdp.md | 12 + .../platform/integration-patterns-21b.sdp.md | 12 + specs/platform/package-architecture.sdp.md | 12 + .../active-reservations-projection.sdp.md | 12 + .../patterns/agent-action-handler.sdp.md | 12 + .../patterns/agent-as-bounded-context.sdp.md | 12 + ...rn-risk-completion-executable-tests.sdp.md | 12 + .../agent-churn-risk-completion.sdp.md | 12 + .../patterns/agent-on-complete-handler.sdp.md | 12 + .../patterns/app-composition-root.sdp.md | 12 + ...ing-infrastructure-executable-tests.sdp.md | 12 + .../bdd-testing-infrastructure.sdp.md | 12 + specs/platform/patterns/bdd-world.sdp.md | 12 + ...context-foundation-executable-tests.sdp.md | 12 + .../bounded-context-foundation.sdp.md | 12 + .../patterns/bounded-context-identity.sdp.md | 12 + specs/platform/patterns/cms-dual-write.sdp.md | 12 + specs/platform/patterns/cms-repository.sdp.md | 12 + ...and-bus-foundation-executable-tests.sdp.md | 12 + .../patterns/command-bus-foundation.sdp.md | 12 + .../patterns/command-bus-idempotency.sdp.md | 12 + specs/platform/patterns/command-bus.sdp.md | 12 + .../patterns/command-orchestrator.sdp.md | 12 + .../platform/patterns/command-registry.sdp.md | 12 + ...order-cancellation-executable-tests.sdp.md | 12 + .../patterns/correlation-chain-system.sdp.md | 12 + .../patterns/cross-context-read-model.sdp.md | 12 + .../customer-cancellations-projection.sdp.md | 12 + .../patterns/data-table-parsing.sdp.md | 12 + .../dcb-multi-product-reservation.sdp.md | 12 + .../patterns/dcb-retry-execution.sdp.md | 12 + .../patterns/dcb-scope-key-utilities.sdp.md | 12 + specs/platform/patterns/dcb-types.sdp.md | 12 + .../patterns/decider-assertions.sdp.md | 12 + .../platform/patterns/decider-outputs.sdp.md | 12 + .../platform/patterns/decider-pattern.sdp.md | 12 + .../patterns/dual-write-contract.sdp.md | 12 + .../patterns/durable-append-action.sdp.md | 12 + ...events-integration-executable-tests.sdp.md | 12 + .../durable-events-integration.sdp.md | 12 + .../patterns/durable-function-adapters.sdp.md | 12 + .../dynamic-consistency-boundaries.sdp.md | 12 + .../platform/patterns/ecst-fat-events.sdp.md | 12 + .../patterns/event-bus-abstraction.sdp.md | 12 + .../event-replay-infrastructure.sdp.md | 12 + .../patterns/event-store-durability.sdp.md | 12 + ...t-store-foundation-executable-tests.sdp.md | 12 + .../patterns/event-store-foundation.sdp.md | 12 + specs/platform/patterns/event-store.sdp.md | 12 + .../event-subscription-registry.sdp.md | 12 + .../platform/patterns/event-upcasting.sdp.md | 12 + .../patterns/example-app-architecture.sdp.md | 12 + ...-app-modernization-executable-tests.sdp.md | 12 + .../patterns/example-app-modernization.sdp.md | 12 + specs/platform/patterns/fsm-assertions.sdp.md | 12 + .../platform/patterns/fsm-transitions.sdp.md | 12 + .../patterns/handler-factories.sdp.md | 12 + .../patterns/integration-dead-letters.sdp.md | 12 + .../integration-event-handlers.sdp.md | 12 + .../patterns/integration-event-schemas.sdp.md | 12 + .../patterns/integration-patterns-21-a.sdp.md | 12 + .../patterns/integration-patterns-21-b.sdp.md | 12 + .../patterns/integration-routes.sdp.md | 12 + .../patterns/invariant-framework.sdp.md | 12 + .../patterns/inventory-command-configs.sdp.md | 12 + .../inventory-command-handlers.sdp.md | 12 + .../patterns/inventory-deciders.sdp.md | 12 + .../patterns/inventory-domain-events.sdp.md | 12 + .../inventory-internal-mutations.sdp.md | 12 + .../patterns/inventory-public-api.sdp.md | 12 + .../patterns/logging-infrastructure.sdp.md | 12 + .../patterns/middleware-pipeline.sdp.md | 12 + .../patterns/mock-payment-actions.sdp.md | 12 + .../patterns/order-command-configs.sdp.md | 12 + .../patterns/order-command-handlers.sdp.md | 12 + specs/platform/patterns/order-deciders.sdp.md | 12 + .../patterns/order-domain-events.sdp.md | 12 + .../patterns/order-fulfillment-saga.sdp.md | 12 + .../patterns/order-items-projection.sdp.md | 12 + .../order-management-infrastructure.sdp.md | 12 + .../patterns/order-notification-pm.sdp.md | 12 + .../platform/patterns/order-public-api.sdp.md | 12 + .../patterns/order-summary-projection.sdp.md | 12 + .../order-with-inventory-projection.sdp.md | 12 + .../patterns/payment-outbox-handler.sdp.md | 12 + .../patterns/polling-utilities.sdp.md | 12 + .../patterns/process-manager-lifecycle.sdp.md | 12 + .../platform/patterns/process-manager.sdp.md | 12 + .../product-catalog-projection.sdp.md | 12 + ...jection-categories-executable-tests.sdp.md | 12 + .../patterns/projection-categories.sdp.md | 12 + .../patterns/projection-checkpointing.sdp.md | 12 + .../patterns/projection-dead-letters.sdp.md | 12 + .../patterns/projection-definitions.sdp.md | 12 + .../patterns/query-abstraction.sdp.md | 12 + .../patterns/rate-limit-definitions.sdp.md | 12 + ...ctive-projection-conflict-detection.sdp.md | 12 + .../reactive-projection-eligibility.sdp.md | 12 + .../reactive-projection-hybrid-model.sdp.md | 12 + .../reactive-projection-shared-evolve.sdp.md | 12 + .../patterns/reactive-projections.sdp.md | 12 + .../patterns/reservation-pattern.sdp.md | 12 + .../patterns/reservation-release-pm.sdp.md | 12 + .../patterns/saga-completion-handler.sdp.md | 12 + ...saga-orchestration-executable-tests.sdp.md | 12 + .../patterns/saga-orchestration.sdp.md | 12 + specs/platform/patterns/saga-registry.sdp.md | 12 + specs/platform/patterns/saga-router.sdp.md | 12 + .../patterns/test-environment-guards.sdp.md | 12 + specs/platform/patterns/test-isolation.sdp.md | 12 + .../workpool-partitioning-strategy.sdp.md | 12 + specs/platform/production-hardening.sdp.md | 12 + specs/platform/sdp-bindings.ts | 666 ++++++++++++++++++ ...ss-harness-and-dependency-hardening.sdp.md | 12 + ...ease-ci-and-docs-process-guardrails.sdp.md | 12 + ...porting-security-and-contract-sweep.sdp.md | 12 + specs/releases.pack.sdp.md | 11 + specs/releases/v0.1.0.sdp.md | 16 + specs/releases/v0.2.0.sdp.md | 16 + specs/releases/v0.3.0.sdp.md | 16 + specs/releases/vNEXT.sdp.md | 16 + specs/test-content-blocks.sdp.md | 12 + specs/themed-decision-architecture.sdp.md | 12 + test/sdp-migration-guard.test.ts | 112 +++ tsconfig.base.json | 27 +- vitest.migration.config.ts | 8 + 452 files changed, 3943 insertions(+), 2105 deletions(-) create mode 100644 .gitignore create mode 100644 scripts/migrate-architect-corpus.mjs create mode 100644 scripts/migrate-architect-tags.mjs create mode 100644 specs/README.md create mode 100644 specs/codec-driven-reference-generation.sdp.md create mode 100644 specs/decisions.pack.sdp.md create mode 100644 specs/decisions/pdr-001-process-decisions-folder.sdp.md create mode 100644 specs/decisions/pdr-002-release-management-architecture.sdp.md create mode 100644 specs/decisions/pdr-003-behavior-feature-file-structure.sdp.md create mode 100644 specs/decisions/pdr-004-unified-tag-prefix-architecture.sdp.md create mode 100644 specs/decisions/pdr-005-mvp-workflow.sdp.md create mode 100644 specs/decisions/pdr-006-typescript-sourced-taxonomy.sdp.md create mode 100644 specs/decisions/pdr-007-two-tier-spec-architecture.sdp.md create mode 100644 specs/decisions/pdr-008-example-app-purpose.sdp.md create mode 100644 specs/decisions/pdr-009-design-session-methodology.sdp.md create mode 100644 specs/decisions/pdr-010-cross-component-argument-injection.sdp.md create mode 100644 specs/decisions/pdr-011-agent-action-handler-architecture.sdp.md create mode 100644 specs/decisions/pdr-012-agent-command-routing.sdp.md create mode 100644 specs/decisions/pdr-013-agent-lifecycle-fsm.sdp.md create mode 100644 specs/decisions/pdr-014-component-boundary-authentication-convention.sdp.md create mode 100644 specs/decisions/pdr-015-global-position-numeric-representation.sdp.md create mode 100644 specs/decisions/pdr-016-projection-pool-split-named-pools-per-concern.sdp.md create mode 100644 specs/decisions/pdr-017-tranche-3-platform-architecture-gate.sdp.md create mode 100644 specs/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.sdp.md create mode 100644 specs/decisions/pdr-019-v-any-vs-v-unknown-boundary-policy.sdp.md create mode 100644 specs/decisions/pdr-020-events-table-index-policy.sdp.md create mode 100644 specs/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.sdp.md create mode 100644 specs/decisions/pdr-022-value-transfer-doctrine-adoption.sdp.md create mode 100644 specs/decisions/pdr-023-bulk-doctrine-rollback-and-recovery.sdp.md create mode 100644 specs/epic-process-enhancements.sdp.md create mode 100644 specs/example-app/agent-admin-frontend.sdp.md create mode 100644 specs/platform-patterns.pack.sdp.md create mode 100644 specs/platform.pack.sdp.md create mode 100644 specs/platform/admin-tooling-consolidation.sdp.md create mode 100644 specs/platform/agent-bc-component-isolation.sdp.md create mode 100644 specs/platform/agent-command-infrastructure.sdp.md create mode 100644 specs/platform/agent-llm-integration.sdp.md create mode 100644 specs/platform/circuit-breaker-pattern.sdp.md create mode 100644 specs/platform/component-boundary-authentication-convention.sdp.md create mode 100644 specs/platform/confirmed-order-cancellation.sdp.md create mode 100644 specs/platform/deterministic-id-hashing.sdp.md create mode 100644 specs/platform/event-correctness-migration.sdp.md delete mode 100644 specs/platform/generated-docs/dcb-api-reference.feature create mode 100644 specs/platform/generated-docs/dcb-api-reference.sdp.md create mode 100644 specs/platform/health-observability.sdp.md create mode 100644 specs/platform/integration-patterns-21a.sdp.md create mode 100644 specs/platform/integration-patterns-21b.sdp.md create mode 100644 specs/platform/package-architecture.sdp.md create mode 100644 specs/platform/patterns/active-reservations-projection.sdp.md create mode 100644 specs/platform/patterns/agent-action-handler.sdp.md create mode 100644 specs/platform/patterns/agent-as-bounded-context.sdp.md create mode 100644 specs/platform/patterns/agent-churn-risk-completion-executable-tests.sdp.md create mode 100644 specs/platform/patterns/agent-churn-risk-completion.sdp.md create mode 100644 specs/platform/patterns/agent-on-complete-handler.sdp.md create mode 100644 specs/platform/patterns/app-composition-root.sdp.md create mode 100644 specs/platform/patterns/bdd-testing-infrastructure-executable-tests.sdp.md create mode 100644 specs/platform/patterns/bdd-testing-infrastructure.sdp.md create mode 100644 specs/platform/patterns/bdd-world.sdp.md create mode 100644 specs/platform/patterns/bounded-context-foundation-executable-tests.sdp.md create mode 100644 specs/platform/patterns/bounded-context-foundation.sdp.md create mode 100644 specs/platform/patterns/bounded-context-identity.sdp.md create mode 100644 specs/platform/patterns/cms-dual-write.sdp.md create mode 100644 specs/platform/patterns/cms-repository.sdp.md create mode 100644 specs/platform/patterns/command-bus-foundation-executable-tests.sdp.md create mode 100644 specs/platform/patterns/command-bus-foundation.sdp.md create mode 100644 specs/platform/patterns/command-bus-idempotency.sdp.md create mode 100644 specs/platform/patterns/command-bus.sdp.md create mode 100644 specs/platform/patterns/command-orchestrator.sdp.md create mode 100644 specs/platform/patterns/command-registry.sdp.md create mode 100644 specs/platform/patterns/confirmed-order-cancellation-executable-tests.sdp.md create mode 100644 specs/platform/patterns/correlation-chain-system.sdp.md create mode 100644 specs/platform/patterns/cross-context-read-model.sdp.md create mode 100644 specs/platform/patterns/customer-cancellations-projection.sdp.md create mode 100644 specs/platform/patterns/data-table-parsing.sdp.md create mode 100644 specs/platform/patterns/dcb-multi-product-reservation.sdp.md create mode 100644 specs/platform/patterns/dcb-retry-execution.sdp.md create mode 100644 specs/platform/patterns/dcb-scope-key-utilities.sdp.md create mode 100644 specs/platform/patterns/dcb-types.sdp.md create mode 100644 specs/platform/patterns/decider-assertions.sdp.md create mode 100644 specs/platform/patterns/decider-outputs.sdp.md create mode 100644 specs/platform/patterns/decider-pattern.sdp.md create mode 100644 specs/platform/patterns/dual-write-contract.sdp.md create mode 100644 specs/platform/patterns/durable-append-action.sdp.md create mode 100644 specs/platform/patterns/durable-events-integration-executable-tests.sdp.md create mode 100644 specs/platform/patterns/durable-events-integration.sdp.md create mode 100644 specs/platform/patterns/durable-function-adapters.sdp.md create mode 100644 specs/platform/patterns/dynamic-consistency-boundaries.sdp.md create mode 100644 specs/platform/patterns/ecst-fat-events.sdp.md create mode 100644 specs/platform/patterns/event-bus-abstraction.sdp.md create mode 100644 specs/platform/patterns/event-replay-infrastructure.sdp.md create mode 100644 specs/platform/patterns/event-store-durability.sdp.md create mode 100644 specs/platform/patterns/event-store-foundation-executable-tests.sdp.md create mode 100644 specs/platform/patterns/event-store-foundation.sdp.md create mode 100644 specs/platform/patterns/event-store.sdp.md create mode 100644 specs/platform/patterns/event-subscription-registry.sdp.md create mode 100644 specs/platform/patterns/event-upcasting.sdp.md create mode 100644 specs/platform/patterns/example-app-architecture.sdp.md create mode 100644 specs/platform/patterns/example-app-modernization-executable-tests.sdp.md create mode 100644 specs/platform/patterns/example-app-modernization.sdp.md create mode 100644 specs/platform/patterns/fsm-assertions.sdp.md create mode 100644 specs/platform/patterns/fsm-transitions.sdp.md create mode 100644 specs/platform/patterns/handler-factories.sdp.md create mode 100644 specs/platform/patterns/integration-dead-letters.sdp.md create mode 100644 specs/platform/patterns/integration-event-handlers.sdp.md create mode 100644 specs/platform/patterns/integration-event-schemas.sdp.md create mode 100644 specs/platform/patterns/integration-patterns-21-a.sdp.md create mode 100644 specs/platform/patterns/integration-patterns-21-b.sdp.md create mode 100644 specs/platform/patterns/integration-routes.sdp.md create mode 100644 specs/platform/patterns/invariant-framework.sdp.md create mode 100644 specs/platform/patterns/inventory-command-configs.sdp.md create mode 100644 specs/platform/patterns/inventory-command-handlers.sdp.md create mode 100644 specs/platform/patterns/inventory-deciders.sdp.md create mode 100644 specs/platform/patterns/inventory-domain-events.sdp.md create mode 100644 specs/platform/patterns/inventory-internal-mutations.sdp.md create mode 100644 specs/platform/patterns/inventory-public-api.sdp.md create mode 100644 specs/platform/patterns/logging-infrastructure.sdp.md create mode 100644 specs/platform/patterns/middleware-pipeline.sdp.md create mode 100644 specs/platform/patterns/mock-payment-actions.sdp.md create mode 100644 specs/platform/patterns/order-command-configs.sdp.md create mode 100644 specs/platform/patterns/order-command-handlers.sdp.md create mode 100644 specs/platform/patterns/order-deciders.sdp.md create mode 100644 specs/platform/patterns/order-domain-events.sdp.md create mode 100644 specs/platform/patterns/order-fulfillment-saga.sdp.md create mode 100644 specs/platform/patterns/order-items-projection.sdp.md create mode 100644 specs/platform/patterns/order-management-infrastructure.sdp.md create mode 100644 specs/platform/patterns/order-notification-pm.sdp.md create mode 100644 specs/platform/patterns/order-public-api.sdp.md create mode 100644 specs/platform/patterns/order-summary-projection.sdp.md create mode 100644 specs/platform/patterns/order-with-inventory-projection.sdp.md create mode 100644 specs/platform/patterns/payment-outbox-handler.sdp.md create mode 100644 specs/platform/patterns/polling-utilities.sdp.md create mode 100644 specs/platform/patterns/process-manager-lifecycle.sdp.md create mode 100644 specs/platform/patterns/process-manager.sdp.md create mode 100644 specs/platform/patterns/product-catalog-projection.sdp.md create mode 100644 specs/platform/patterns/projection-categories-executable-tests.sdp.md create mode 100644 specs/platform/patterns/projection-categories.sdp.md create mode 100644 specs/platform/patterns/projection-checkpointing.sdp.md create mode 100644 specs/platform/patterns/projection-dead-letters.sdp.md create mode 100644 specs/platform/patterns/projection-definitions.sdp.md create mode 100644 specs/platform/patterns/query-abstraction.sdp.md create mode 100644 specs/platform/patterns/rate-limit-definitions.sdp.md create mode 100644 specs/platform/patterns/reactive-projection-conflict-detection.sdp.md create mode 100644 specs/platform/patterns/reactive-projection-eligibility.sdp.md create mode 100644 specs/platform/patterns/reactive-projection-hybrid-model.sdp.md create mode 100644 specs/platform/patterns/reactive-projection-shared-evolve.sdp.md create mode 100644 specs/platform/patterns/reactive-projections.sdp.md create mode 100644 specs/platform/patterns/reservation-pattern.sdp.md create mode 100644 specs/platform/patterns/reservation-release-pm.sdp.md create mode 100644 specs/platform/patterns/saga-completion-handler.sdp.md create mode 100644 specs/platform/patterns/saga-orchestration-executable-tests.sdp.md create mode 100644 specs/platform/patterns/saga-orchestration.sdp.md create mode 100644 specs/platform/patterns/saga-registry.sdp.md create mode 100644 specs/platform/patterns/saga-router.sdp.md create mode 100644 specs/platform/patterns/test-environment-guards.sdp.md create mode 100644 specs/platform/patterns/test-isolation.sdp.md create mode 100644 specs/platform/patterns/workpool-partitioning-strategy.sdp.md create mode 100644 specs/platform/production-hardening.sdp.md create mode 100644 specs/platform/sdp-bindings.ts create mode 100644 specs/platform/tranche-0-readiness-harness-and-dependency-hardening.sdp.md create mode 100644 specs/platform/tranche-0-release-ci-and-docs-process-guardrails.sdp.md create mode 100644 specs/platform/tranche-1-supporting-security-and-contract-sweep.sdp.md create mode 100644 specs/releases.pack.sdp.md create mode 100644 specs/releases/v0.1.0.sdp.md create mode 100644 specs/releases/v0.2.0.sdp.md create mode 100644 specs/releases/v0.3.0.sdp.md create mode 100644 specs/releases/vNEXT.sdp.md create mode 100644 specs/test-content-blocks.sdp.md create mode 100644 specs/themed-decision-architecture.sdp.md create mode 100644 test/sdp-migration-guard.test.ts create mode 100644 vitest.migration.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..34dc2415 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Dependencies and package manager noise +node_modules/ + +# Build outputs +dist/ +*.tsbuildinfo + +# SDP regenerable extraction output +specs/generated/ +generated/ + +# Test / coverage +coverage/ + +# Env and local overrides +.env +.env.* +!.env.example + +# Editor / OS +.DS_Store +*.swp +.idea/ +.vscode/ diff --git a/README.md b/README.md index 4d820f1d..71cb8c0c 100644 --- a/README.md +++ b/README.md @@ -7,27 +7,36 @@ This directory contains the platform workspaces that power the Convex event sour - `packages/` contains the reusable platform packages. - `examples/order-management/` contains the reference bounded contexts and app wiring. - `apps/frontend/` contains the frontend, stories, and browser tests. -- `architect/` contains roadmap specs, decisions, generators, and validation inputs. -- `docs-living/` contains generated projections of the architect sources. +- `specs/` is the designated **Libar Software Delivery Protocol (SDP)** corpus root — Specs, Packs, and identity bindings (`*.sdp.md`, `*.pack.sdp.md`, `sdp-bindings.ts`). +- `architect/` retains historical Gherkin lineage only; it is not on the live delivery path. +- `docs-living/` retains archived generated projections from the retired architect workflow. ## Working rules -- Edit source specs, annotations, and package code. -- Do not hand-edit `docs-living/`. -- Use `pnpm docs:all` after docs or annotation changes. -- Use `pnpm test:coverage` for the package-level coverage gate. +- Author and mature delivery intent under `specs/` (SDP carriers). +- Bind implementation with SDP `codeAnchor` identity bindings (see `specs/platform/sdp-bindings.ts`), not `@architect` tags. +- Do not hand-edit `docs-living/` as a live workflow output. +- Use `pnpm test:packages` / package-level coverage gates for runtime quality. ## Key commands -| Command | Purpose | -| -------------------------------- | --------------------------------------------------------- | -| `pnpm test:packages` | Run the six platform package suites | -| `pnpm test:integration:platform` | Run isolated infrastructure integration tests | -| `pnpm test:coverage` | Enforce measured coverage floors across platform packages | -| `pnpm docs:all` | Refresh generated platform docs | +| Command | Purpose | +| ---------------------- | ---------------------------------------------------- | +| `pnpm test:packages` | Run the six platform package suites | +| `pnpm sdp:build` | Extract the SDP graph and contracts from `specs/` | +| `pnpm sdp:validate` | Run conformance + honesty checks over the one graph | +| `pnpm sdp:view` | Generate the Design Review projection | +| `pnpm sdp:q '…'` | Script the graph (`g` / `graph` / `report` bindings) | +| `pnpm check:sdp-migration` | Guard: no architect dep/scripts; corpus present | + +```sh +pnpm sdp:build +pnpm sdp:validate +pnpm exec sdp q --root specs 'return { specs: g.specs().length, packs: g.packs().length, anchors: g.anchors().length }' +``` ## Read next +- `specs/README.md` for the corpus map - `packages/platform-*/README.md` for package-specific usage - `examples/order-management/README.md` for the reference application -- `../docs/README.md` for the hand-written docs index diff --git a/apps/frontend/convex/admin/intents.ts b/apps/frontend/convex/admin/intents.ts index f0d2b197..f858c765 100644 --- a/apps/frontend/convex/admin/intents.ts +++ b/apps/frontend/convex/admin/intents.ts @@ -1,8 +1,4 @@ /** - * @architect - * @architect-implements DurableEventsIntegration - * @architect-infra - * * Intent Admin Functions - CRUD operations for commandIntents table. * * Provides dependencies for platform-core's recordIntent, recordCompletion, diff --git a/apps/frontend/convex/admin/poison.ts b/apps/frontend/convex/admin/poison.ts index 50e4fc41..b577f81d 100644 --- a/apps/frontend/convex/admin/poison.ts +++ b/apps/frontend/convex/admin/poison.ts @@ -1,8 +1,4 @@ /** - * @architect - * @architect-implements DurableEventsIntegration - * @architect-infra - * * Poison Event Admin Functions - CRUD operations for poisonEvents table. * * Provides dependencies for platform-core's withPoisonEventHandling wrapper. diff --git a/apps/frontend/convex/admin/projections.ts b/apps/frontend/convex/admin/projections.ts index bd2c4383..8b46c52f 100644 --- a/apps/frontend/convex/admin/projections.ts +++ b/apps/frontend/convex/admin/projections.ts @@ -1,13 +1,6 @@ /** * Admin mutations for projection replay and rebuilding. * - * @architect - * @architect-pattern EventReplayInfrastructure - * @architect-implements EventReplayInfrastructure - * @architect-status active - * @architect-event-sourcing - * @architect-projection - * @architect-infra * * All admin operations use internal mutations for security. * No public API exposure for admin operations. diff --git a/apps/frontend/convex/admin/rebuildDemo.ts b/apps/frontend/convex/admin/rebuildDemo.ts index 3617f39a..c97de78f 100644 --- a/apps/frontend/convex/admin/rebuildDemo.ts +++ b/apps/frontend/convex/admin/rebuildDemo.ts @@ -1,8 +1,4 @@ /** - * @architect - * @architect-implements DurableEventsIntegration - * @architect-projection - * * Rebuild Demonstration - Projection rebuild from event stream. * * Demonstrates the key event sourcing benefit: projections can be diff --git a/apps/frontend/convex/commands/durableOrchestrator.ts b/apps/frontend/convex/commands/durableOrchestrator.ts index 956f2101..0de62b37 100644 --- a/apps/frontend/convex/commands/durableOrchestrator.ts +++ b/apps/frontend/convex/commands/durableOrchestrator.ts @@ -1,8 +1,4 @@ /** - * @architect - * @architect-implements DurableEventsIntegration - * @architect-command - * * Durable Command Orchestrator - Intent/Completion Bracketing Wrapper * * Wraps the standard CommandOrchestrator with durability features: diff --git a/apps/frontend/convex/contexts/agent/index.ts b/apps/frontend/convex/contexts/agent/index.ts index 125954cd..cb4de5f9 100644 --- a/apps/frontend/convex/contexts/agent/index.ts +++ b/apps/frontend/convex/contexts/agent/index.ts @@ -1,13 +1,4 @@ -/** @architect */ - /** - * @architect-ddd @architect-core - * @architect-pattern AgentAsBoundedContext - * @architect-status roadmap - * @architect-phase 22 - * @architect-depends-on IntegrationPatterns,ReactiveProjections - * @architect-brief docs/project-management/aggregate-less-pivot/pattern-briefs/08-agent-as-bc.md - * * ## Agent as Bounded Context - AI-Driven Event Reactors * * Demonstrate AI agent as event reactor pattern with autonomous command emission. diff --git a/apps/frontend/convex/contexts/inventory/domain/deciders/reserveMultipleDCB.ts b/apps/frontend/convex/contexts/inventory/domain/deciders/reserveMultipleDCB.ts index d981f2d1..b5bb93b6 100644 --- a/apps/frontend/convex/contexts/inventory/domain/deciders/reserveMultipleDCB.ts +++ b/apps/frontend/convex/contexts/inventory/domain/deciders/reserveMultipleDCB.ts @@ -7,10 +7,6 @@ * - Returns `DCBStateUpdates` (updates per entity) * - Enables atomic cross-entity invariant validation via executeWithDCB * - * @architect - * @architect-pattern ExampleAppModernization - * @architect-status roadmap - * @architect-uses DynamicConsistencyBoundaries, ReservationPattern * * @since Phase 23 (Example App Modernization - Rule 1) */ diff --git a/apps/frontend/convex/contexts/inventory/handlers/commands.ts b/apps/frontend/convex/contexts/inventory/handlers/commands.ts index ff9a3b5a..d2269352 100644 --- a/apps/frontend/convex/contexts/inventory/handlers/commands.ts +++ b/apps/frontend/convex/contexts/inventory/handlers/commands.ts @@ -1,13 +1,4 @@ /** - * @architect - * @architect-pattern InventoryCommandHandlers - * @architect-status completed - * @architect-command - * @architect-arch-role command-handler - * @architect-arch-context inventory - * @architect-arch-layer application - * @architect-uses InventoryDeciders, InventoryRepository - * * Inventory command handlers implementing the dual-write pattern. * * CRITICAL: Every handler follows this pattern: diff --git a/apps/frontend/convex/contexts/orders/handlers/commands.ts b/apps/frontend/convex/contexts/orders/handlers/commands.ts index af529a54..9e2429bf 100644 --- a/apps/frontend/convex/contexts/orders/handlers/commands.ts +++ b/apps/frontend/convex/contexts/orders/handlers/commands.ts @@ -1,13 +1,4 @@ /** - * @architect - * @architect-pattern OrderCommandHandlers - * @architect-status completed - * @architect-command - * @architect-arch-role command-handler - * @architect-arch-context orders - * @architect-arch-layer application - * @architect-uses OrderDeciders, OrderRepository - * * Order command handlers implementing the dual-write pattern. * * CRITICAL: Every handler follows this pattern: diff --git a/apps/frontend/convex/dcb/retryExecution.ts b/apps/frontend/convex/dcb/retryExecution.ts index 70104d56..7f681b36 100644 --- a/apps/frontend/convex/dcb/retryExecution.ts +++ b/apps/frontend/convex/dcb/retryExecution.ts @@ -5,10 +5,6 @@ * command handlers. It shows the self-referential retry pattern where * the retry mutation schedules itself for re-execution on OCC conflicts. * - * @architect - * @architect-pattern DurableFunctionAdapters - * @architect-status active - * @architect-infra * * ## Pattern Overview * diff --git a/apps/frontend/convex/eventStore/durableAppend.ts b/apps/frontend/convex/eventStore/durableAppend.ts index 23e99ac0..9b7d5995 100644 --- a/apps/frontend/convex/eventStore/durableAppend.ts +++ b/apps/frontend/convex/eventStore/durableAppend.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-pattern DurableAppendAction - * @architect-status completed - * @architect-implements DurableEventsIntegration - * @architect-infra - * * Durable Append - Workpool-backed event append with retry. * * Provides the action handler for durableAppendEvent() from platform-core. diff --git a/apps/frontend/convex/infrastructure.ts b/apps/frontend/convex/infrastructure.ts index 69bd2f84..d0c3cbab 100644 --- a/apps/frontend/convex/infrastructure.ts +++ b/apps/frontend/convex/infrastructure.ts @@ -1,12 +1,4 @@ /** - * @architect - * @architect-pattern OrderManagementInfrastructure - * @architect-status completed - * @architect-infra - * @architect-arch-role infrastructure - * @architect-arch-layer infrastructure - * @architect-uses Workpool, Workflow, EventStore, CommandBus - * * Infrastructure setup for the order-management application. * * Initializes Workpool, Workflow, and other infrastructure components. diff --git a/apps/frontend/convex/projections/crossContext/orderWithInventory.ts b/apps/frontend/convex/projections/crossContext/orderWithInventory.ts index e23c5ca4..fd98d7bc 100644 --- a/apps/frontend/convex/projections/crossContext/orderWithInventory.ts +++ b/apps/frontend/convex/projections/crossContext/orderWithInventory.ts @@ -1,12 +1,4 @@ /** - * @architect - * @architect-pattern OrderWithInventoryProjection - * @architect-status completed - * @architect-projection - * @architect-arch-role projection - * @architect-arch-layer application - * @architect-uses OrderCommandHandlers, InventoryCommandHandlers - * * OrderWithInventoryStatus cross-context projection handlers (app-level). * * Combines order status with inventory reservation status for dashboard views. diff --git a/apps/frontend/convex/projections/evolve/index.ts b/apps/frontend/convex/projections/evolve/index.ts index c4cabb64..a4999aa9 100644 --- a/apps/frontend/convex/projections/evolve/index.ts +++ b/apps/frontend/convex/projections/evolve/index.ts @@ -14,9 +14,6 @@ * import { evolveOrderSummary } from "@convex/projections/evolve"; * ``` * - * @architect - * @architect-implements ReactiveProjections - * @architect-status completed */ // Order Summary evolve function diff --git a/apps/frontend/convex/projections/evolve/orderSummary.evolve.ts b/apps/frontend/convex/projections/evolve/orderSummary.evolve.ts index eb8083b2..a21130d8 100644 --- a/apps/frontend/convex/projections/evolve/orderSummary.evolve.ts +++ b/apps/frontend/convex/projections/evolve/orderSummary.evolve.ts @@ -13,9 +13,6 @@ * 2. **Deterministic**: Same inputs always produce same outputs * 3. **Total**: Handles ALL event types (unknown types return state unchanged) * - * @architect - * @architect-implements ReactiveProjections - * @architect-status completed */ // Types for documentation purposes - the evolve function implements EvolveFunction pattern diff --git a/apps/frontend/convex/projections/orders/orderSummary.ts b/apps/frontend/convex/projections/orders/orderSummary.ts index 285ced9b..f5da9214 100644 --- a/apps/frontend/convex/projections/orders/orderSummary.ts +++ b/apps/frontend/convex/projections/orders/orderSummary.ts @@ -1,13 +1,4 @@ /** - * @architect - * @architect-pattern OrderSummaryProjection - * @architect-status completed - * @architect-projection - * @architect-arch-role projection - * @architect-arch-context orders - * @architect-arch-layer application - * @architect-uses EventStore - * * OrderSummary projection handlers (app-level). * * Updates the orderSummaries read model based on order events. diff --git a/apps/frontend/convex/queries/events.ts b/apps/frontend/convex/queries/events.ts index 08183536..b9fdd6e6 100644 --- a/apps/frontend/convex/queries/events.ts +++ b/apps/frontend/convex/queries/events.ts @@ -13,9 +13,6 @@ * Event payloads may contain sensitive data. These queries filter events * to only return those for the requesting entity (streamId match). * - * @architect - * @architect-implements ReactiveProjections - * @architect-status completed */ import { query } from "../_generated/server"; diff --git a/apps/frontend/convex/rateLimits.ts b/apps/frontend/convex/rateLimits.ts index 943fc7ae..33a4bbbd 100644 --- a/apps/frontend/convex/rateLimits.ts +++ b/apps/frontend/convex/rateLimits.ts @@ -4,10 +4,6 @@ * Centralized rate limit configuration for the order-management application. * Uses @convex-dev/rate-limiter for production-grade limiting with sharding. * - * @architect - * @architect-pattern DurableFunctionAdapters - * @architect-status active - * @architect-infra */ import { RateLimiter, MINUTE, HOUR } from "@convex-dev/rate-limiter"; import { components } from "./_generated/api"; diff --git a/apps/frontend/convex/sagas/orderFulfillment.ts b/apps/frontend/convex/sagas/orderFulfillment.ts index 021d6ae3..c305fd07 100644 --- a/apps/frontend/convex/sagas/orderFulfillment.ts +++ b/apps/frontend/convex/sagas/orderFulfillment.ts @@ -1,12 +1,4 @@ /** - * @architect - * @architect-pattern OrderFulfillmentSaga - * @architect-status completed - * @architect-saga - * @architect-arch-role saga - * @architect-arch-layer application - * @architect-uses OrderCommandHandlers, InventoryCommandHandlers - * * Order Fulfillment Saga. * * Coordinates the order fulfillment process across bounded contexts: diff --git a/apps/frontend/convex/sagas/payments/actions.ts b/apps/frontend/convex/sagas/payments/actions.ts index 64a03b64..fce0eeab 100644 --- a/apps/frontend/convex/sagas/payments/actions.ts +++ b/apps/frontend/convex/sagas/payments/actions.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-pattern MockPaymentActions - * @architect-status completed - * @architect-implements DurableEventsIntegration - * @architect-saga - * * Mock Payment Actions - Simulated external payment service. * * Provides a mock Stripe charge action for integration testing. diff --git a/apps/frontend/convex/sagas/payments/outbox.ts b/apps/frontend/convex/sagas/payments/outbox.ts index 7ff8d153..22a42967 100644 --- a/apps/frontend/convex/sagas/payments/outbox.ts +++ b/apps/frontend/convex/sagas/payments/outbox.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-pattern PaymentOutboxHandler - * @architect-status completed - * @architect-implements DurableEventsIntegration - * @architect-saga - * * Payment Outbox Handler - Captures payment action results as events. * * Uses the outbox pattern to ensure that payment results (success/failure) diff --git a/apps/frontend/convex/schema.ts b/apps/frontend/convex/schema.ts index 0a971417..096d96f1 100644 --- a/apps/frontend/convex/schema.ts +++ b/apps/frontend/convex/schema.ts @@ -482,8 +482,6 @@ export default defineSchema({ * Tracks progress of projection rebuild operations. * Enables checkpoint-based resumption for long-running replays. * - * @architect - * @architect-implements EventReplayInfrastructure */ replayCheckpoints: defineTable({ replayId: v.string(), // Unique identifier (for external reference) diff --git a/apps/frontend/hooks/use-reactive-order-detail.ts b/apps/frontend/hooks/use-reactive-order-detail.ts index f3bf3593..d1dbfea8 100644 --- a/apps/frontend/hooks/use-reactive-order-detail.ts +++ b/apps/frontend/hooks/use-reactive-order-detail.ts @@ -10,9 +10,6 @@ * - Recent events from event store (reactive push) * - Shared evolve logic (same on client and server) * - * @architect - * @architect-implements ReactiveProjections - * @architect-status completed */ import { useQuery } from "convex/react"; diff --git a/apps/frontend/hooks/use-reactive-projection.ts b/apps/frontend/hooks/use-reactive-projection.ts index 1fa20f28..63ec1701 100644 --- a/apps/frontend/hooks/use-reactive-projection.ts +++ b/apps/frontend/hooks/use-reactive-projection.ts @@ -21,9 +21,6 @@ * }); * ``` * - * @architect - * @architect-implements ReactiveProjections - * @architect-status completed */ import { useMemo } from "react"; diff --git a/architect/ARCHITECT-GUIDE.md b/architect/ARCHITECT-GUIDE.md index 0f8e90c3..e55b4e53 100644 --- a/architect/ARCHITECT-GUIDE.md +++ b/architect/ARCHITECT-GUIDE.md @@ -1,161 +1,20 @@ -# Architect Guide +# Architect Guide (historical) -> Repo-specific setup for `@libar-dev/architect`. -> For workflow details and package internals, use the upstream architect docs linked below. +> **Retired delivery path.** libar-platform now uses **Libar Software Delivery Protocol (SDP)** — +> package `@libar-dev/software-delivery-protocol`, CLI `sdp`. Live intent lives under `specs/`. +> See the repo root `README.md` and `specs/README.md`. ---- +This file previously documented `@libar-dev/architect` setup for this repo. The `architect/` tree +is retained as lineage only. Do not run `architect-generate`, `architect-guard`, +`architect-lint-patterns`, or `architect-validate` as the delivery workflow. -## Package Documentation +## Current commands -The monorepo installs `@libar-dev/architect` from the npm registry and keeps -`deps-packages/architect/` as a read-only subtree for source exploration. +| Command | Purpose | +| --- | --- | +| `pnpm sdp:build` | Extract the SDP graph from `specs/` | +| `pnpm sdp:validate` | Conformance + honesty checks | +| `pnpm sdp:view` | Design Review projection | +| `pnpm sdp:q '…'` | Script the graph | -| Topic | Upstream Doc | -| ----------------- | ------------------------------------------------------------------------------------------------ | -| Core methodology | [METHODOLOGY.md](https://github.com/libar-dev/architect/blob/main/docs/METHODOLOGY.md) | -| Session workflows | [SESSION-GUIDES.md](https://github.com/libar-dev/architect/blob/main/docs/SESSION-GUIDES.md) | -| Gherkin authoring | [GHERKIN-PATTERNS.md](https://github.com/libar-dev/architect/blob/main/docs/GHERKIN-PATTERNS.md) | -| Process guard | [PROCESS-GUARD.md](https://github.com/libar-dev/architect/blob/main/docs/PROCESS-GUARD.md) | -| Validation tools | [VALIDATION.md](https://github.com/libar-dev/architect/blob/main/docs/VALIDATION.md) | -| Configuration | [CONFIGURATION.md](https://github.com/libar-dev/architect/blob/main/docs/CONFIGURATION.md) | -| Process API | [PROCESS-API.md](https://github.com/libar-dev/architect/blob/main/docs/PROCESS-API.md) | -| Annotation guide | [ANNOTATION-GUIDE.md](https://github.com/libar-dev/architect/blob/main/docs/ANNOTATION-GUIDE.md) | -| Architecture | [ARCHITECTURE.md](https://github.com/libar-dev/architect/blob/main/docs/ARCHITECTURE.md) | -| MCP setup | [MCP-SETUP.md](https://github.com/libar-dev/architect/blob/main/docs/MCP-SETUP.md) | - -Local generated references: - -- `libar-platform/architect/docs/tag-taxonomy.md` -- `libar-platform/docs-living/reference/` -- `CLAUDE.md` via `pnpm claude:build` - ---- - -## Repo Configuration - -The repo root config is [`architect.config.js`](../../architect.config.js): - -```javascript -import { defineConfig } from "@libar-dev/architect/config"; - -export default defineConfig({ - preset: "ddd-es-cqrs", -}); -``` - -This repo uses the `ddd-es-cqrs` preset: - -- Tag prefix: `@architect-*` -- Opt-in marker: `@architect` -- Categories: 21 DDD/ES/CQRS tags -- Local docs output: `libar-platform/docs-living/` - -Reference-doc overrides in `architect.config.js` also define this repo's scoped -architecture outputs, including the component-topology reference doc. - ---- - -## Directory Map - -| Purpose | Location | -| ---------------------------- | ----------------------------------------------- | -| Roadmap specs | `libar-platform/architect/specs/` | -| Platform specs | `libar-platform/architect/specs/platform/` | -| Example-app specs | `libar-platform/architect/specs/example-app/` | -| Decision records | `libar-platform/architect/decisions/` | -| Release definitions | `libar-platform/architect/releases/` | -| Design stubs | `libar-platform/architect/stubs/` | -| Generated taxonomy reference | `libar-platform/architect/docs/tag-taxonomy.md` | -| Generated living docs | `libar-platform/docs-living/` | -| Source-exploration subtree | `deps-packages/architect/` | - -The subtree is read-only in this repo. Treat it as package source and documentation -reference, not as an editable dependency. - ---- - -## Common Commands - -### CLI - -| Command | Purpose | -| ---------------------------------------------------------------- | -------------------------------- | -| `pnpm exec architect -- overview` | Project health and active work | -| `pnpm architect -- overview` | Repo wrapper around the same API | -| `pnpm exec architect -- context --session ` | Curated session context | -| `pnpm exec architect -- scope-validate ` | FSM and prerequisite pre-flight | - -### Generation - -| Command | Purpose | -| ------------------------------------------------ | --------------------------------------- | -| `pnpm docs:all` | Regenerate the main living docs set | -| `pnpm docs:tag-taxonomy` | Regenerate the local taxonomy reference | -| `pnpm exec architect-generate -g reference-docs` | Regenerate reference docs from config | -| `pnpm exec architect-generate -g patterns` | Regenerate pattern registry outputs | - -### Validation - -| Command | Purpose | -| ------------------------------------ | ----------------------------- | -| `pnpm exec architect-guard --staged` | Pre-commit FSM guard | -| `pnpm exec architect-guard --all` | Full-repo FSM validation | -| `pnpm exec architect-lint-patterns` | Annotation and authoring lint | -| `pnpm exec architect-validate` | Full validation pipeline | - -### Claude Modules - -| Command | Purpose | -| ---------------------- | -------------------------------------- | -| `pnpm claude:build` | Rebuild `CLAUDE.md` from `_claude-md/` | -| `pnpm claude:validate` | Validate modular source files | -| `pnpm claude:preview` | Preview output without writing | - ---- - -## Session Output Paths - -| Session Type | Output Location | -| -------------- | ------------------------------------------------------------------------------------------ | -| Planning | `libar-platform/architect/specs/{product-area}/` | -| Design | `libar-platform/architect/decisions/` and `libar-platform/architect/stubs/{pattern-name}/` | -| Implementation | Runtime packages, tests, and docs under `libar-platform/` | - -For interactive sessions, prefer the architect CLI and `pnpm architect` over -manually reading generated markdown. - ---- - -## Taxonomy Source of Truth - -The repo's generated reference is: - -- `libar-platform/architect/docs/tag-taxonomy.md` - -The package source of truth is: - -- `deps-packages/architect/src/taxonomy/registry-builder.ts` -- `deps-packages/architect/src/taxonomy/status-values.ts` -- `deps-packages/architect/src/taxonomy/categories.ts` -- `deps-packages/architect/src/taxonomy/format-types.ts` - -Regenerate the local reference after config or upstream taxonomy changes: - -```bash -pnpm docs:tag-taxonomy -``` - ---- - -## Quick Links - -| Task | Reference | -| -------------------------- | ------------------------------------------------------------------------------------------------ | -| Understand the methodology | [METHODOLOGY.md](https://github.com/libar-dev/architect/blob/main/docs/METHODOLOGY.md) | -| Choose a session workflow | [SESSION-GUIDES.md](https://github.com/libar-dev/architect/blob/main/docs/SESSION-GUIDES.md) | -| Write feature files | [GHERKIN-PATTERNS.md](https://github.com/libar-dev/architect/blob/main/docs/GHERKIN-PATTERNS.md) | -| Review tags and formats | [ANNOTATION-GUIDE.md](https://github.com/libar-dev/architect/blob/main/docs/ANNOTATION-GUIDE.md) | -| Understand the guard | [PROCESS-GUARD.md](https://github.com/libar-dev/architect/blob/main/docs/PROCESS-GUARD.md) | -| Review local taxonomy | [docs/tag-taxonomy.md](docs/tag-taxonomy.md) | -| View current roadmap | [ROADMAP.md](../docs-living/ROADMAP.md) | -| View pattern registry | [PATTERNS.md](../docs-living/PATTERNS.md) | +Upstream architect package docs remain useful as historical design evidence only. diff --git a/examples/order-management/ARCHITECTURE.md b/examples/order-management/ARCHITECTURE.md index 62a917a3..5a11fecd 100644 --- a/examples/order-management/ARCHITECTURE.md +++ b/examples/order-management/ARCHITECTURE.md @@ -1,10 +1,4 @@ # Order Management Example App Architecture diff --git a/examples/order-management/convex/admin/intents.ts b/examples/order-management/convex/admin/intents.ts index f0d2b197..f858c765 100644 --- a/examples/order-management/convex/admin/intents.ts +++ b/examples/order-management/convex/admin/intents.ts @@ -1,8 +1,4 @@ /** - * @architect - * @architect-implements DurableEventsIntegration - * @architect-infra - * * Intent Admin Functions - CRUD operations for commandIntents table. * * Provides dependencies for platform-core's recordIntent, recordCompletion, diff --git a/examples/order-management/convex/admin/poison.ts b/examples/order-management/convex/admin/poison.ts index 50e4fc41..b577f81d 100644 --- a/examples/order-management/convex/admin/poison.ts +++ b/examples/order-management/convex/admin/poison.ts @@ -1,8 +1,4 @@ /** - * @architect - * @architect-implements DurableEventsIntegration - * @architect-infra - * * Poison Event Admin Functions - CRUD operations for poisonEvents table. * * Provides dependencies for platform-core's withPoisonEventHandling wrapper. diff --git a/examples/order-management/convex/admin/projections.ts b/examples/order-management/convex/admin/projections.ts index a1d7fb74..4f826987 100644 --- a/examples/order-management/convex/admin/projections.ts +++ b/examples/order-management/convex/admin/projections.ts @@ -1,12 +1,6 @@ /** * Admin mutations for projection replay and rebuilding. * - * @architect - * @architect-implements EventReplayInfrastructure - * @architect-status active - * @architect-event-sourcing - * @architect-projection - * @architect-infra * * All admin operations use internal mutations for security. * No public API exposure for admin operations. diff --git a/examples/order-management/convex/admin/rebuildDemo.ts b/examples/order-management/convex/admin/rebuildDemo.ts index 7ed6ec8a..0c2dda35 100644 --- a/examples/order-management/convex/admin/rebuildDemo.ts +++ b/examples/order-management/convex/admin/rebuildDemo.ts @@ -1,8 +1,4 @@ /** - * @architect - * @architect-implements DurableEventsIntegration - * @architect-projection - * * Rebuild Demonstration - Projection rebuild from event stream. * * Demonstrates the key event sourcing benefit: projections can be diff --git a/examples/order-management/convex/commands/durableOrchestrator.ts b/examples/order-management/convex/commands/durableOrchestrator.ts index 956f2101..0de62b37 100644 --- a/examples/order-management/convex/commands/durableOrchestrator.ts +++ b/examples/order-management/convex/commands/durableOrchestrator.ts @@ -1,8 +1,4 @@ /** - * @architect - * @architect-implements DurableEventsIntegration - * @architect-command - * * Durable Command Orchestrator - Intent/Completion Bracketing Wrapper * * Wraps the standard CommandOrchestrator with durability features: diff --git a/examples/order-management/convex/commands/inventory/configs.ts b/examples/order-management/convex/commands/inventory/configs.ts index 2fef768d..7b2cd7bb 100644 --- a/examples/order-management/convex/commands/inventory/configs.ts +++ b/examples/order-management/convex/commands/inventory/configs.ts @@ -1,15 +1,4 @@ /** - * @architect - * @architect-pattern InventoryCommandConfigs - * @architect-status completed - * @architect-command - * @architect-arch-role infrastructure - * @architect-arch-context inventory - * @architect-arch-layer application - * @architect-include overview-topology - * @architect-uses ActiveReservationsProjection, ProductCatalogProjection, OrderWithInventoryProjection - * @architect-used-by OrderManagementInfrastructure - * * Command configs for 7 inventory commands. Wires each command to * primary/secondary projections including cross-context orderWithInventory. */ diff --git a/examples/order-management/convex/commands/orders/configs.ts b/examples/order-management/convex/commands/orders/configs.ts index ff2ce192..26176e9d 100644 --- a/examples/order-management/convex/commands/orders/configs.ts +++ b/examples/order-management/convex/commands/orders/configs.ts @@ -1,15 +1,4 @@ /** - * @architect - * @architect-pattern OrderCommandConfigs - * @architect-status completed - * @architect-command - * @architect-arch-role infrastructure - * @architect-arch-context orders - * @architect-arch-layer application - * @architect-include overview-topology - * @architect-uses OrderSummaryProjection, OrderWithInventoryProjection, OrderItemsProjection, CustomerCancellationsProjection - * @architect-used-by OrderManagementInfrastructure - * * Command configs for 6 order commands. Wires each command to primary/secondary * projections, saga routes, and integration events. */ diff --git a/examples/order-management/convex/commands/registry.ts b/examples/order-management/convex/commands/registry.ts index a096f27e..7e18e143 100644 --- a/examples/order-management/convex/commands/registry.ts +++ b/examples/order-management/convex/commands/registry.ts @@ -1,13 +1,4 @@ /** - * @architect - * @architect-pattern CommandRegistry - * @architect-status completed - * @architect-infra - * @architect-arch-role infrastructure - * @architect-arch-layer infrastructure - * @architect-uses OrderCommandHandlers, InventoryCommandHandlers - * @architect-used-by OrderManagementInfrastructure - * * Command registry with Zod validation schemas per command type. * Used by registry validation middleware for runtime args validation. */ diff --git a/examples/order-management/convex/contexts/agent/_config.ts b/examples/order-management/convex/contexts/agent/_config.ts index 664e8df1..1d09ff5b 100644 --- a/examples/order-management/convex/contexts/agent/_config.ts +++ b/examples/order-management/convex/contexts/agent/_config.ts @@ -1,12 +1,4 @@ /** - * @architect - * @architect-uses AgentAsBoundedContext - * @architect-arch-role infrastructure - * @architect-arch-context agent - * @architect-arch-layer application - * @architect-include overview-topology - * @architect-extract-shapes CHURN_RISK_AGENT_ID, CHURN_RISK_SUBSCRIPTIONS, churnRiskAgentConfig - * * Churn Risk Agent Configuration * * Defines the configuration for the churn risk detection agent. diff --git a/examples/order-management/convex/contexts/agent/_llm/config.ts b/examples/order-management/convex/contexts/agent/_llm/config.ts index c9bbb5b7..354e4424 100644 --- a/examples/order-management/convex/contexts/agent/_llm/config.ts +++ b/examples/order-management/convex/contexts/agent/_llm/config.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-uses AgentAsBoundedContext - * @architect-arch-role infrastructure - * @architect-arch-context agent - * @architect-arch-layer infrastructure - * * LLM Provider Configuration * * Configures the language model for agent pattern analysis. diff --git a/examples/order-management/convex/contexts/agent/_llm/index.ts b/examples/order-management/convex/contexts/agent/_llm/index.ts index 5a30bbe7..a82f80a8 100644 --- a/examples/order-management/convex/contexts/agent/_llm/index.ts +++ b/examples/order-management/convex/contexts/agent/_llm/index.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-uses AgentAsBoundedContext - * @architect-arch-role infrastructure - * @architect-arch-context agent - * @architect-arch-layer infrastructure - * * LLM Configuration and Runtime Exports * * @module contexts/agent/_llm diff --git a/examples/order-management/convex/contexts/agent/_llm/runtime.ts b/examples/order-management/convex/contexts/agent/_llm/runtime.ts index 6eb3ec14..2002bd4e 100644 --- a/examples/order-management/convex/contexts/agent/_llm/runtime.ts +++ b/examples/order-management/convex/contexts/agent/_llm/runtime.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-uses AgentAsBoundedContext - * @architect-arch-role infrastructure - * @architect-arch-context agent - * @architect-arch-layer infrastructure - * * OpenRouter Agent Runtime * * Implements AgentRuntimeConfig using the Vercel AI SDK with OpenRouter. diff --git a/examples/order-management/convex/contexts/agent/_patterns/churnRisk.ts b/examples/order-management/convex/contexts/agent/_patterns/churnRisk.ts index 7ce1f5f7..423e741b 100644 --- a/examples/order-management/convex/contexts/agent/_patterns/churnRisk.ts +++ b/examples/order-management/convex/contexts/agent/_patterns/churnRisk.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-uses AgentAsBoundedContext - * @architect-arch-role decider - * @architect-arch-context agent - * @architect-arch-layer domain - * * Churn Risk Pattern Definition * * Defines the pattern detection rules for identifying customers at risk of churning. diff --git a/examples/order-management/convex/contexts/agent/_utils/confidence.ts b/examples/order-management/convex/contexts/agent/_utils/confidence.ts index cc8bd4e3..74fa7c05 100644 --- a/examples/order-management/convex/contexts/agent/_utils/confidence.ts +++ b/examples/order-management/convex/contexts/agent/_utils/confidence.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-uses AgentAsBoundedContext - * @architect-arch-role service - * @architect-arch-context agent - * @architect-arch-layer domain - * * Confidence Calculation Utilities for Agent BC * * Shared utilities for calculating churn risk confidence scores. diff --git a/examples/order-management/convex/contexts/agent/_utils/customer.ts b/examples/order-management/convex/contexts/agent/_utils/customer.ts index 15c1d92d..64e679d5 100644 --- a/examples/order-management/convex/contexts/agent/_utils/customer.ts +++ b/examples/order-management/convex/contexts/agent/_utils/customer.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-uses AgentAsBoundedContext - * @architect-arch-role service - * @architect-arch-context agent - * @architect-arch-layer domain - * * Customer Utility Functions for Agent BC * * Shared utilities for extracting customer information from events. diff --git a/examples/order-management/convex/contexts/agent/_utils/index.ts b/examples/order-management/convex/contexts/agent/_utils/index.ts index 6d0ff54d..5a103643 100644 --- a/examples/order-management/convex/contexts/agent/_utils/index.ts +++ b/examples/order-management/convex/contexts/agent/_utils/index.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-uses AgentAsBoundedContext - * @architect-arch-role service - * @architect-arch-context agent - * @architect-arch-layer domain - * * Agent BC Utility Functions * * Shared utilities for agent bounded context operations. diff --git a/examples/order-management/convex/contexts/agent/handlers/analyzeEvent.ts b/examples/order-management/convex/contexts/agent/handlers/analyzeEvent.ts index e793434c..23092953 100644 --- a/examples/order-management/convex/contexts/agent/handlers/analyzeEvent.ts +++ b/examples/order-management/convex/contexts/agent/handlers/analyzeEvent.ts @@ -1,14 +1,4 @@ /** - * @architect - * @architect-pattern AgentActionHandler - * @architect-status completed - * @architect-infra - * @architect-arch-role command-handler - * @architect-arch-context agent - * @architect-arch-layer application - * @architect-include overview-topology - * @architect-uses AgentLLMIntegration, AgentBCComponentIsolation - * * Agent action handler for churn risk detection. * This is the ACTION half of the action/mutation split pattern. * Runs in Workpool action context -- can call external APIs (LLM). diff --git a/examples/order-management/convex/contexts/agent/handlers/onComplete.ts b/examples/order-management/convex/contexts/agent/handlers/onComplete.ts index 580e88f5..fa65bf67 100644 --- a/examples/order-management/convex/contexts/agent/handlers/onComplete.ts +++ b/examples/order-management/convex/contexts/agent/handlers/onComplete.ts @@ -1,14 +1,4 @@ /** - * @architect - * @architect-pattern AgentOnCompleteHandler - * @architect-status completed - * @architect-infra - * @architect-arch-role infrastructure - * @architect-arch-context agent - * @architect-arch-layer infrastructure - * @architect-include overview-topology - * @architect-uses AgentAsBoundedContext, AgentLLMIntegration - * * Workpool job completion handler for agent BC. * This is the MUTATION half of the action/mutation split pattern. * diff --git a/examples/order-management/convex/contexts/agent/index.ts b/examples/order-management/convex/contexts/agent/index.ts index ed52bd6c..ac074673 100644 --- a/examples/order-management/convex/contexts/agent/index.ts +++ b/examples/order-management/convex/contexts/agent/index.ts @@ -1,12 +1,4 @@ /** - * @architect - * @architect-ddd @architect-core - * @architect-implements AgentAsBoundedContext - * @architect-status active - * @architect-phase 22 - * @architect-depends-on ReactiveProjections - * @architect-brief docs/project-management/aggregate-less-pivot/pattern-briefs/08-agent-as-bc.md - * * ## Agent as Bounded Context - AI-Driven Event Reactors * * Demonstrates the Agent as Bounded Context pattern where AI agents subscribe to diff --git a/examples/order-management/convex/contexts/agent/tools/approval.ts b/examples/order-management/convex/contexts/agent/tools/approval.ts index b669d9f1..ea25b67b 100644 --- a/examples/order-management/convex/contexts/agent/tools/approval.ts +++ b/examples/order-management/convex/contexts/agent/tools/approval.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-uses AgentAsBoundedContext - * @architect-arch-role service - * @architect-arch-context agent - * @architect-arch-layer application - * * Agent Approval Workflow Tools * * Provides utilities for managing human-in-loop approval workflow for diff --git a/examples/order-management/convex/contexts/agent/tools/emitCommand.ts b/examples/order-management/convex/contexts/agent/tools/emitCommand.ts index 2c744e8f..94d85287 100644 --- a/examples/order-management/convex/contexts/agent/tools/emitCommand.ts +++ b/examples/order-management/convex/contexts/agent/tools/emitCommand.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-uses AgentAsBoundedContext - * @architect-arch-role service - * @architect-arch-context agent - * @architect-arch-layer application - * * Agent Command Emission Tool * * Provides utilities for emitting commands from the agent. diff --git a/examples/order-management/convex/contexts/inventory/domain/deciders/index.ts b/examples/order-management/convex/contexts/inventory/domain/deciders/index.ts index 7f799fdb..67c3b994 100644 --- a/examples/order-management/convex/contexts/inventory/domain/deciders/index.ts +++ b/examples/order-management/convex/contexts/inventory/domain/deciders/index.ts @@ -1,13 +1,4 @@ /** - * @architect - * @architect-pattern InventoryDeciders - * @architect-status completed - * @architect-decider - * @architect-arch-role decider - * @architect-arch-context inventory - * @architect-arch-layer domain - * @architect-used-by InventoryCommandHandlers - * * Pure decision functions for Inventory aggregate (product + reservation). * SKU uniqueness, stock sufficiency, reservation lifecycle invariants. No I/O. */ diff --git a/examples/order-management/convex/contexts/inventory/domain/deciders/reserveMultipleDCB.ts b/examples/order-management/convex/contexts/inventory/domain/deciders/reserveMultipleDCB.ts index 241cb01f..b5bb93b6 100644 --- a/examples/order-management/convex/contexts/inventory/domain/deciders/reserveMultipleDCB.ts +++ b/examples/order-management/convex/contexts/inventory/domain/deciders/reserveMultipleDCB.ts @@ -7,9 +7,6 @@ * - Returns `DCBStateUpdates` (updates per entity) * - Enables atomic cross-entity invariant validation via executeWithDCB * - * @architect - * @architect-implements ExampleAppModernization - * @architect-status roadmap * * @since Phase 23 (Example App Modernization - Rule 1) */ diff --git a/examples/order-management/convex/contexts/inventory/domain/events.ts b/examples/order-management/convex/contexts/inventory/domain/events.ts index 31e97858..571e59cc 100644 --- a/examples/order-management/convex/contexts/inventory/domain/events.ts +++ b/examples/order-management/convex/contexts/inventory/domain/events.ts @@ -1,13 +1,4 @@ /** - * @architect - * @architect-pattern InventoryDomainEvents - * @architect-status completed - * @architect-event-sourcing - * @architect-arch-role bounded-context - * @architect-arch-context inventory - * @architect-arch-layer domain - * @architect-used-by InventoryCommandHandlers, OrderWithInventoryProjection, ActiveReservationsProjection, ProductCatalogProjection - * * Inventory BC domain events (7 types). Product lifecycle (Created, StockAdded) * and reservation lifecycle (Reserved, Failed, Confirmed, Released, Expired). */ diff --git a/examples/order-management/convex/contexts/inventory/handlers/commands.ts b/examples/order-management/convex/contexts/inventory/handlers/commands.ts index 577abaa2..d2269352 100644 --- a/examples/order-management/convex/contexts/inventory/handlers/commands.ts +++ b/examples/order-management/convex/contexts/inventory/handlers/commands.ts @@ -1,14 +1,4 @@ /** - * @architect - * @architect-pattern InventoryCommandHandlers - * @architect-status completed - * @architect-command - * @architect-arch-role command-handler - * @architect-arch-context inventory - * @architect-arch-layer application - * @architect-include overview-topology - * @architect-uses InventoryDeciders, InventoryRepository - * * Inventory command handlers implementing the dual-write pattern. * * CRITICAL: Every handler follows this pattern: diff --git a/examples/order-management/convex/contexts/orders/domain/deciders/index.ts b/examples/order-management/convex/contexts/orders/domain/deciders/index.ts index 5db34d0a..24b61c8b 100644 --- a/examples/order-management/convex/contexts/orders/domain/deciders/index.ts +++ b/examples/order-management/convex/contexts/orders/domain/deciders/index.ts @@ -1,13 +1,4 @@ /** - * @architect - * @architect-pattern OrderDeciders - * @architect-status completed - * @architect-decider - * @architect-arch-role decider - * @architect-arch-context orders - * @architect-arch-layer domain - * @architect-used-by OrderCommandHandlers - * * Pure decision functions for Order aggregate. * Each decider validates invariants and produces events. * No I/O, no ctx — pure functions only. diff --git a/examples/order-management/convex/contexts/orders/domain/events.ts b/examples/order-management/convex/contexts/orders/domain/events.ts index 7286d2b0..134fada7 100644 --- a/examples/order-management/convex/contexts/orders/domain/events.ts +++ b/examples/order-management/convex/contexts/orders/domain/events.ts @@ -1,13 +1,4 @@ /** - * @architect - * @architect-pattern OrderDomainEvents - * @architect-status completed - * @architect-event-sourcing - * @architect-arch-role bounded-context - * @architect-arch-context orders - * @architect-arch-layer domain - * @architect-used-by OrderCommandHandlers, OrderSummaryProjection, OrderFulfillmentSaga, OrderNotificationPM, ReservationReleasePM - * * Orders BC domain events (6 types, 2 schema versions). * V1: Original schemas. V2: OrderSubmitted with CustomerSnapshot (Fat Events). * Use upcasters to migrate V1 events to V2 at read time. diff --git a/examples/order-management/convex/contexts/orders/handlers/commands.ts b/examples/order-management/convex/contexts/orders/handlers/commands.ts index 659c2079..9e2429bf 100644 --- a/examples/order-management/convex/contexts/orders/handlers/commands.ts +++ b/examples/order-management/convex/contexts/orders/handlers/commands.ts @@ -1,14 +1,4 @@ /** - * @architect - * @architect-pattern OrderCommandHandlers - * @architect-status completed - * @architect-command - * @architect-arch-role command-handler - * @architect-arch-context orders - * @architect-arch-layer application - * @architect-include overview-topology - * @architect-uses OrderDeciders, OrderRepository - * * Order command handlers implementing the dual-write pattern. * * CRITICAL: Every handler follows this pattern: diff --git a/examples/order-management/convex/convex.config.ts b/examples/order-management/convex/convex.config.ts index d72d5322..ec026689 100644 --- a/examples/order-management/convex/convex.config.ts +++ b/examples/order-management/convex/convex.config.ts @@ -1,12 +1,4 @@ /** - * @architect - * @architect-pattern AppCompositionRoot - * @architect-status completed - * @architect-infra - * @architect-arch-role infrastructure - * @architect-arch-layer infrastructure - * @architect-include overview-topology - * * Application composition root. Mounts all Convex components (workpool, workflow, * event store, command bus, rate limiter, agent BC) and bounded contexts (orders, inventory). */ diff --git a/examples/order-management/convex/crossContextQueries.ts b/examples/order-management/convex/crossContextQueries.ts index 20ec8ff3..15951d58 100644 --- a/examples/order-management/convex/crossContextQueries.ts +++ b/examples/order-management/convex/crossContextQueries.ts @@ -1,11 +1,4 @@ /** - * @architect - * @architect-pattern CrossContextReadModel - * @architect-status completed - * @architect-cqrs - * @architect-arch-role read-model - * @architect-arch-layer application - * * Cross-context query APIs. Combines data from multiple bounded contexts * into unified read models for the frontend. Uses app-level projections. */ diff --git a/examples/order-management/convex/dcb/retryExecution.ts b/examples/order-management/convex/dcb/retryExecution.ts index 326278ae..543a6c11 100644 --- a/examples/order-management/convex/dcb/retryExecution.ts +++ b/examples/order-management/convex/dcb/retryExecution.ts @@ -1,11 +1,4 @@ /** - * @architect - * @architect-pattern DCBRetryExecution - * @architect-status active - * @architect-infra - * @architect-arch-role infrastructure - * @architect-arch-layer infrastructure - * * DCB Retry Execution — reference implementation for integrating withDCBRetry * into command handlers. Self-referential retry pattern where the retry mutation * schedules itself for re-execution on OCC conflicts. diff --git a/examples/order-management/convex/eventStore/durableAppend.ts b/examples/order-management/convex/eventStore/durableAppend.ts index d77b153c..076cce7e 100644 --- a/examples/order-management/convex/eventStore/durableAppend.ts +++ b/examples/order-management/convex/eventStore/durableAppend.ts @@ -1,12 +1,4 @@ /** - * @architect - * @architect-pattern DurableAppendAction - * @architect-status completed - * @architect-implements DurableEventsIntegration - * @architect-infra - * @architect-arch-role infrastructure - * @architect-arch-layer infrastructure - * * Durable Append - Workpool-backed event append with retry. * * Provides the action handler for durableAppendEvent() from platform-core. diff --git a/examples/order-management/convex/eventSubscriptions.ts b/examples/order-management/convex/eventSubscriptions.ts index a2790dc1..dfc49aa6 100644 --- a/examples/order-management/convex/eventSubscriptions.ts +++ b/examples/order-management/convex/eventSubscriptions.ts @@ -1,14 +1,4 @@ /** - * @architect - * @architect-pattern EventSubscriptionRegistry - * @architect-status completed - * @architect-infra - * @architect-arch-role infrastructure - * @architect-arch-layer infrastructure - * @architect-include overview-topology - * @architect-uses OrderNotificationPM, ReservationReleasePM, AgentAsBoundedContext, AgentLLMIntegration - * @architect-used-by OrderManagementInfrastructure - * * EventBus pub/sub subscription definitions. * PM subscriptions (priority 200) + Agent subscriptions (priority 250). * NOTE: Projections via CommandConfig are NOT duplicated here. diff --git a/examples/order-management/convex/infrastructure.ts b/examples/order-management/convex/infrastructure.ts index c388ce7f..25799751 100644 --- a/examples/order-management/convex/infrastructure.ts +++ b/examples/order-management/convex/infrastructure.ts @@ -1,13 +1,4 @@ /** - * @architect - * @architect-pattern OrderManagementInfrastructure - * @architect-status completed - * @architect-infra - * @architect-arch-role infrastructure - * @architect-arch-layer infrastructure - * @architect-include overview-topology - * @architect-uses Workpool, Workflow, EventStore, CommandBus - * * Infrastructure setup for the order-management application. * * Initializes Workpool, Workflow, and other infrastructure components. diff --git a/examples/order-management/convex/integration/deadLetters.ts b/examples/order-management/convex/integration/deadLetters.ts index 5393dbcd..aef5d768 100644 --- a/examples/order-management/convex/integration/deadLetters.ts +++ b/examples/order-management/convex/integration/deadLetters.ts @@ -1,11 +1,4 @@ /** - * @architect - * @architect-pattern IntegrationDeadLetters - * @architect-status completed - * @architect-infra - * @architect-arch-role infrastructure - * @architect-arch-layer infrastructure - * * Dead letter queue management for cross-context event publications. * Handles failed integration event processing with replay and ignore operations. */ diff --git a/examples/order-management/convex/integration/events.ts b/examples/order-management/convex/integration/events.ts index 68a4196c..40c9f64d 100644 --- a/examples/order-management/convex/integration/events.ts +++ b/examples/order-management/convex/integration/events.ts @@ -1,11 +1,4 @@ /** - * @architect - * @architect-pattern IntegrationEventSchemas - * @architect-status completed - * @architect-infra - * @architect-arch-role infrastructure - * @architect-arch-layer infrastructure - * * Integration event schema definitions for cross-context communication. * Published Language pattern — defines the contract for external consumers. */ diff --git a/examples/order-management/convex/integration/handlers.ts b/examples/order-management/convex/integration/handlers.ts index 74dae9e8..9cce34b6 100644 --- a/examples/order-management/convex/integration/handlers.ts +++ b/examples/order-management/convex/integration/handlers.ts @@ -1,11 +1,4 @@ /** - * @architect - * @architect-pattern IntegrationEventHandlers - * @architect-status completed - * @architect-infra - * @architect-arch-role infrastructure - * @architect-arch-layer infrastructure - * * Integration event handlers. Processes integration events from the Published Language * and dispatches to appropriate bounded context commands. */ diff --git a/examples/order-management/convex/integration/routes.ts b/examples/order-management/convex/integration/routes.ts index a33f5047..038ecc81 100644 --- a/examples/order-management/convex/integration/routes.ts +++ b/examples/order-management/convex/integration/routes.ts @@ -1,13 +1,4 @@ /** - * @architect - * @architect-pattern IntegrationRoutes - * @architect-status completed - * @architect-infra - * @architect-arch-role infrastructure - * @architect-arch-layer infrastructure - * @architect-uses OrderCommandHandlers - * @architect-used-by OrderManagementInfrastructure - * * Integration event routes. Translates internal domain events to integration * events for external consumers. Currently: OrderSubmitted -> OrderPlacedIntegration. */ diff --git a/examples/order-management/convex/inventory.ts b/examples/order-management/convex/inventory.ts index 9f01ab6b..1e5ae441 100644 --- a/examples/order-management/convex/inventory.ts +++ b/examples/order-management/convex/inventory.ts @@ -1,12 +1,4 @@ /** - * @architect - * @architect-pattern InventoryPublicAPI - * @architect-status completed - * @architect-infra - * @architect-arch-role infrastructure - * @architect-arch-context inventory - * @architect-arch-layer infrastructure - * * App-level public API for Inventory bounded context. * Exposes CommandOrchestrator-backed mutations for external consumers. */ diff --git a/examples/order-management/convex/inventoryInternal.ts b/examples/order-management/convex/inventoryInternal.ts index d004f2da..d5d18093 100644 --- a/examples/order-management/convex/inventoryInternal.ts +++ b/examples/order-management/convex/inventoryInternal.ts @@ -1,12 +1,4 @@ /** - * @architect - * @architect-pattern InventoryInternalMutations - * @architect-status completed - * @architect-infra - * @architect-arch-role infrastructure - * @architect-arch-context inventory - * @architect-arch-layer infrastructure - * * Internal mutations for Inventory operations. * Used by sagas and process managers for programmatic inventory commands. */ diff --git a/examples/order-management/convex/orders.ts b/examples/order-management/convex/orders.ts index fc5b7538..7e2d688b 100644 --- a/examples/order-management/convex/orders.ts +++ b/examples/order-management/convex/orders.ts @@ -1,12 +1,4 @@ /** - * @architect - * @architect-pattern OrderPublicAPI - * @architect-status completed - * @architect-infra - * @architect-arch-role infrastructure - * @architect-arch-context orders - * @architect-arch-layer infrastructure - * * App-level public API for Orders bounded context. * Exposes CommandOrchestrator-backed mutations for external consumers. */ diff --git a/examples/order-management/convex/pools.ts b/examples/order-management/convex/pools.ts index d7f523f5..47f83b17 100644 --- a/examples/order-management/convex/pools.ts +++ b/examples/order-management/convex/pools.ts @@ -7,13 +7,6 @@ * Both infrastructure.ts and eventSubscriptions.ts can safely import * from this module without creating cycles. * - * @architect - * @architect-pattern OrderManagementInfrastructure - * @architect-status completed - * @architect-unlock-reason:'Extract-agentPool-break-circular-dep' - * @architect-infra - * @architect-arch-role infrastructure - * @architect-arch-layer infrastructure */ import { Workpool, type WorkpoolComponent, type WorkpoolOptions } from "@convex-dev/workpool"; diff --git a/examples/order-management/convex/processManagers/orderNotification.ts b/examples/order-management/convex/processManagers/orderNotification.ts index 517395b0..23a23e61 100644 --- a/examples/order-management/convex/processManagers/orderNotification.ts +++ b/examples/order-management/convex/processManagers/orderNotification.ts @@ -1,15 +1,4 @@ /** - * @architect - * @architect-pattern OrderNotificationPM - * @architect-status completed - * @architect-saga - * @architect-arch-role process-manager - * @architect-arch-context orders - * @architect-arch-layer application - * @architect-include overview-topology - * @architect-uses OrderCommandHandlers - * @architect-used-by OrderManagementInfrastructure - * * Process manager: OrderConfirmed -> SendNotification command. * Fire-and-forget coordinator (no compensation, unlike Sagas). * Subscribed via EventBus at PM priority (200). diff --git a/examples/order-management/convex/processManagers/reservationRelease.ts b/examples/order-management/convex/processManagers/reservationRelease.ts index 50f52235..80a8af6f 100644 --- a/examples/order-management/convex/processManagers/reservationRelease.ts +++ b/examples/order-management/convex/processManagers/reservationRelease.ts @@ -1,15 +1,4 @@ /** - * @architect - * @architect-pattern ReservationReleasePM - * @architect-status completed - * @architect-saga - * @architect-arch-role process-manager - * @architect-arch-context orders - * @architect-arch-layer application - * @architect-include overview-topology - * @architect-uses InventoryCommandHandlers, OrderWithInventoryProjection - * @architect-used-by OrderManagementInfrastructure - * * Process manager: OrderCancelled -> ReleaseReservation command. * Queries orderWithInventory projection to check active reservation exists before emitting release. * Subscribed via EventBus at PM priority (200). diff --git a/examples/order-management/convex/projections/crossContext/orderWithInventory.ts b/examples/order-management/convex/projections/crossContext/orderWithInventory.ts index 125d04fa..09ce90ba 100644 --- a/examples/order-management/convex/projections/crossContext/orderWithInventory.ts +++ b/examples/order-management/convex/projections/crossContext/orderWithInventory.ts @@ -1,12 +1,4 @@ /** - * @architect - * @architect-pattern OrderWithInventoryProjection - * @architect-status completed - * @architect-projection - * @architect-arch-role projection - * @architect-arch-layer application - * @architect-uses OrderCommandHandlers, InventoryCommandHandlers - * * OrderWithInventoryStatus cross-context projection handlers (app-level). * * Combines order status with inventory reservation status for dashboard views. diff --git a/examples/order-management/convex/projections/customers/customerCancellations.ts b/examples/order-management/convex/projections/customers/customerCancellations.ts index afa10391..8632884d 100644 --- a/examples/order-management/convex/projections/customers/customerCancellations.ts +++ b/examples/order-management/convex/projections/customers/customerCancellations.ts @@ -1,14 +1,4 @@ /** - * @architect - * @architect-pattern CustomerCancellationsProjection - * @architect-status completed - * @architect-projection - * @architect-arch-role projection - * @architect-arch-context orders - * @architect-arch-layer application - * @architect-uses OrderCommandHandlers - * @architect-used-by AgentAsBoundedContext - * * Customer cancellation history with rolling 30-day window. * Provides getCustomerCancellations() for churn risk agent pattern detection. Added in Phase 22. */ diff --git a/examples/order-management/convex/projections/deadLetters.ts b/examples/order-management/convex/projections/deadLetters.ts index 4f2d0bab..132ea84f 100644 --- a/examples/order-management/convex/projections/deadLetters.ts +++ b/examples/order-management/convex/projections/deadLetters.ts @@ -2,14 +2,6 @@ // apps/frontend/convex/projections/deadLetters.ts /** - * @architect - * @architect-pattern ProjectionDeadLetters - * @architect-status completed - * @architect-infra - * @architect-arch-role infrastructure - * @architect-arch-layer infrastructure - * @architect-used-by OrderManagementInfrastructure - * * Dead letter queue for failed projection and subscription handlers. * Shared onComplete handler for both direct projections and EventBus delivery. * Provides replay, ignore, and bulk retry operations. diff --git a/examples/order-management/convex/projections/definitions.ts b/examples/order-management/convex/projections/definitions.ts index 203c023c..cacea17f 100644 --- a/examples/order-management/convex/projections/definitions.ts +++ b/examples/order-management/convex/projections/definitions.ts @@ -1,11 +1,4 @@ /** - * @architect - * @architect-pattern ProjectionDefinitions - * @architect-status completed - * @architect-infra - * @architect-arch-role infrastructure - * @architect-arch-layer infrastructure - * * Registry of all projection definitions and replay handler registry. * Central configuration for projection infrastructure. * diff --git a/examples/order-management/convex/projections/evolve/index.ts b/examples/order-management/convex/projections/evolve/index.ts index c4cabb64..a4999aa9 100644 --- a/examples/order-management/convex/projections/evolve/index.ts +++ b/examples/order-management/convex/projections/evolve/index.ts @@ -14,9 +14,6 @@ * import { evolveOrderSummary } from "@convex/projections/evolve"; * ``` * - * @architect - * @architect-implements ReactiveProjections - * @architect-status completed */ // Order Summary evolve function diff --git a/examples/order-management/convex/projections/evolve/orderSummary.evolve.ts b/examples/order-management/convex/projections/evolve/orderSummary.evolve.ts index 99d8e128..a90b1b10 100644 --- a/examples/order-management/convex/projections/evolve/orderSummary.evolve.ts +++ b/examples/order-management/convex/projections/evolve/orderSummary.evolve.ts @@ -13,9 +13,6 @@ * 2. **Deterministic**: Same inputs always produce same outputs * 3. **Total**: Handles ALL event types (unknown types return state unchanged) * - * @architect - * @architect-implements ReactiveProjections - * @architect-status completed */ // Types for documentation purposes - the evolve function implements EvolveFunction pattern diff --git a/examples/order-management/convex/projections/inventory/activeReservations.ts b/examples/order-management/convex/projections/inventory/activeReservations.ts index eebbdaf0..e494cb61 100644 --- a/examples/order-management/convex/projections/inventory/activeReservations.ts +++ b/examples/order-management/convex/projections/inventory/activeReservations.ts @@ -1,14 +1,4 @@ /** - * @architect - * @architect-pattern ActiveReservationsProjection - * @architect-status completed - * @architect-projection - * @architect-arch-role projection - * @architect-arch-context inventory - * @architect-arch-layer application - * @architect-include overview-topology - * @architect-uses InventoryCommandHandlers - * * Tracks active stock reservations and updates stock levels. * Handles StockReserved, ReservationConfirmed, ReservationReleased, * ReservationExpired. Uses EVENT DATA ONLY — proper ES projection. diff --git a/examples/order-management/convex/projections/inventory/productCatalog.ts b/examples/order-management/convex/projections/inventory/productCatalog.ts index 368d6f35..45f376de 100644 --- a/examples/order-management/convex/projections/inventory/productCatalog.ts +++ b/examples/order-management/convex/projections/inventory/productCatalog.ts @@ -1,14 +1,4 @@ /** - * @architect - * @architect-pattern ProductCatalogProjection - * @architect-status completed - * @architect-projection - * @architect-arch-role projection - * @architect-arch-context inventory - * @architect-arch-layer application - * @architect-include overview-topology - * @architect-uses InventoryCommandHandlers - * * Product catalog read model. Handles ProductCreated, StockAdded. * Also updates stockAvailability as secondary projection. */ diff --git a/examples/order-management/convex/projections/orders/orderItems.ts b/examples/order-management/convex/projections/orders/orderItems.ts index 50517d3e..992007a8 100644 --- a/examples/order-management/convex/projections/orders/orderItems.ts +++ b/examples/order-management/convex/projections/orders/orderItems.ts @@ -1,13 +1,4 @@ /** - * @architect - * @architect-pattern OrderItemsProjection - * @architect-status completed - * @architect-projection - * @architect-arch-role projection - * @architect-arch-context orders - * @architect-arch-layer application - * @architect-uses OrderCommandHandlers - * * Order line items read model. Upsert behavior for individual items. * Handles OrderItemAdded, OrderItemRemoved. */ diff --git a/examples/order-management/convex/projections/orders/orderSummary.ts b/examples/order-management/convex/projections/orders/orderSummary.ts index 3a37d6f9..506120c6 100644 --- a/examples/order-management/convex/projections/orders/orderSummary.ts +++ b/examples/order-management/convex/projections/orders/orderSummary.ts @@ -1,14 +1,4 @@ /** - * @architect - * @architect-pattern OrderSummaryProjection - * @architect-status completed - * @architect-projection - * @architect-arch-role projection - * @architect-arch-context orders - * @architect-arch-layer application - * @architect-include overview-topology - * @architect-uses EventStore - * * OrderSummary projection handlers (app-level). * * Updates the orderSummaries read model based on order events. diff --git a/examples/order-management/convex/queries/events.ts b/examples/order-management/convex/queries/events.ts index 37226018..865fc7ee 100644 --- a/examples/order-management/convex/queries/events.ts +++ b/examples/order-management/convex/queries/events.ts @@ -13,9 +13,6 @@ * Event payloads may contain sensitive data. These queries filter events * to only return those for the requesting entity (streamId match). * - * @architect - * @architect-implements ReactiveProjections - * @architect-status completed */ import { query } from "../_generated/server"; diff --git a/examples/order-management/convex/rateLimits.ts b/examples/order-management/convex/rateLimits.ts index 39c90749..66dca689 100644 --- a/examples/order-management/convex/rateLimits.ts +++ b/examples/order-management/convex/rateLimits.ts @@ -1,11 +1,4 @@ /** - * @architect - * @architect-pattern RateLimitDefinitions - * @architect-status completed - * @architect-infra - * @architect-arch-role infrastructure - * @architect-arch-layer infrastructure - * * Centralized rate limit configuration for the order-management application. * Uses @convex-dev/rate-limiter for production-grade limiting with sharding. */ diff --git a/examples/order-management/convex/sagas/completion.ts b/examples/order-management/convex/sagas/completion.ts index a0520f20..679a6331 100644 --- a/examples/order-management/convex/sagas/completion.ts +++ b/examples/order-management/convex/sagas/completion.ts @@ -1,13 +1,4 @@ /** - * @architect - * @architect-pattern SagaCompletionHandler - * @architect-status completed - * @architect-saga - * @architect-arch-role infrastructure - * @architect-arch-layer infrastructure - * @architect-uses SagaRegistry - * @architect-used-by OrderManagementInfrastructure - * * Workflow onComplete callback handler. Updates saga status on completion * and cleans up workflow state. */ diff --git a/examples/order-management/convex/sagas/orderFulfillment.ts b/examples/order-management/convex/sagas/orderFulfillment.ts index b8666562..c305fd07 100644 --- a/examples/order-management/convex/sagas/orderFulfillment.ts +++ b/examples/order-management/convex/sagas/orderFulfillment.ts @@ -1,14 +1,4 @@ /** - * @architect - * @architect-pattern OrderFulfillmentSaga - * @architect-status completed - * @architect-saga - * @architect-arch-role saga - * @architect-arch-layer application - * @architect-include overview-topology - * @architect-extract-shapes OrderFulfillmentArgs, OrderFulfillmentResult - * @architect-uses OrderCommandHandlers, InventoryCommandHandlers - * * Order Fulfillment Saga. * * Coordinates the order fulfillment process across bounded contexts: diff --git a/examples/order-management/convex/sagas/payments/actions.ts b/examples/order-management/convex/sagas/payments/actions.ts index bf408bfc..fce0eeab 100644 --- a/examples/order-management/convex/sagas/payments/actions.ts +++ b/examples/order-management/convex/sagas/payments/actions.ts @@ -1,12 +1,4 @@ /** - * @architect - * @architect-pattern MockPaymentActions - * @architect-status completed - * @architect-implements DurableEventsIntegration - * @architect-saga - * @architect-arch-role infrastructure - * @architect-arch-layer infrastructure - * * Mock Payment Actions - Simulated external payment service. * * Provides a mock Stripe charge action for integration testing. diff --git a/examples/order-management/convex/sagas/payments/outbox.ts b/examples/order-management/convex/sagas/payments/outbox.ts index 5a4c6e44..22a42967 100644 --- a/examples/order-management/convex/sagas/payments/outbox.ts +++ b/examples/order-management/convex/sagas/payments/outbox.ts @@ -1,12 +1,4 @@ /** - * @architect - * @architect-pattern PaymentOutboxHandler - * @architect-status completed - * @architect-implements DurableEventsIntegration - * @architect-saga - * @architect-arch-role infrastructure - * @architect-arch-layer infrastructure - * * Payment Outbox Handler - Captures payment action results as events. * * Uses the outbox pattern to ensure that payment results (success/failure) diff --git a/examples/order-management/convex/sagas/registry.ts b/examples/order-management/convex/sagas/registry.ts index 9dde8a7b..a1395b78 100644 --- a/examples/order-management/convex/sagas/registry.ts +++ b/examples/order-management/convex/sagas/registry.ts @@ -1,12 +1,4 @@ /** - * @architect - * @architect-pattern SagaRegistry - * @architect-status completed - * @architect-saga - * @architect-arch-role infrastructure - * @architect-arch-layer infrastructure - * @architect-used-by SagaRouter, OrderFulfillmentSaga - * * Saga registry providing idempotent saga start (startSagaIfNotExists), * status tracking, and Zod payload validation at runtime. */ diff --git a/examples/order-management/convex/sagas/router.ts b/examples/order-management/convex/sagas/router.ts index e02b32ac..90901530 100644 --- a/examples/order-management/convex/sagas/router.ts +++ b/examples/order-management/convex/sagas/router.ts @@ -1,12 +1,4 @@ /** - * @architect - * @architect-pattern SagaRouter - * @architect-status completed - * @architect-saga - * @architect-arch-role infrastructure - * @architect-arch-layer infrastructure - * @architect-uses OrderFulfillmentSaga - * * Routes domain events to saga workflows. * Currently: OrderSubmitted -> OrderFulfillment saga (idempotent start). */ diff --git a/examples/order-management/convex/schema.ts b/examples/order-management/convex/schema.ts index d009b810..eae332dc 100644 --- a/examples/order-management/convex/schema.ts +++ b/examples/order-management/convex/schema.ts @@ -540,8 +540,6 @@ export default defineSchema({ * Tracks progress of projection rebuild operations. * Enables checkpoint-based resumption for long-running replays. * - * @architect - * @architect-implements EventReplayInfrastructure */ replayCheckpoints: defineTable({ replayId: v.string(), // Unique identifier (for external reference) diff --git a/examples/order-management/tests/features/behavior/agent/on-complete.feature b/examples/order-management/tests/features/behavior/agent/on-complete.feature index 363c1539..9edc14e8 100644 --- a/examples/order-management/tests/features/behavior/agent/on-complete.feature +++ b/examples/order-management/tests/features/behavior/agent/on-complete.feature @@ -1,9 +1,4 @@ -@architect @agent-on-complete -@architect-pattern:AgentChurnRiskCompletionExecutableTests -@architect-status:completed -@architect-unlock-reason:carrier-opt-in-for-shipped-pattern-continuity -@architect-implements:AgentChurnRiskCompletion Feature: Agent onComplete Handler As a system operator diff --git a/examples/order-management/tests/features/behavior/orders/cancel-order.feature b/examples/order-management/tests/features/behavior/orders/cancel-order.feature index c05387ed..7f249fb3 100644 --- a/examples/order-management/tests/features/behavior/orders/cancel-order.feature +++ b/examples/order-management/tests/features/behavior/orders/cancel-order.feature @@ -1,6 +1,4 @@ @orders @commands -@architect-pattern:ConfirmedOrderCancellationExecutableTests -@architect-implements:ConfirmedOrderCancellation Feature: Cancel Order As a customer I want to cancel my order diff --git a/examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature b/examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature index d7b2062f..6e3c5e8a 100644 --- a/examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature +++ b/examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature @@ -1,4 +1,3 @@ -@architect-pattern:DataTableParsing @testing-infrastructure Feature: Gherkin DataTable Parsing Utilities diff --git a/examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature b/examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature index 12b2a09f..0fe2db90 100644 --- a/examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature +++ b/examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature @@ -1,4 +1,3 @@ -@architect-pattern:DeciderAssertions @testing-infrastructure Feature: Decider Testing Assertions diff --git a/examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature b/examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature index 5624de8f..be9a4842 100644 --- a/examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature +++ b/examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature @@ -1,4 +1,3 @@ -@architect-pattern:FSMAssertions @testing-infrastructure Feature: FSM Testing Assertions diff --git a/examples/order-management/tests/features/behavior/testing-infrastructure/test-isolation.feature b/examples/order-management/tests/features/behavior/testing-infrastructure/test-isolation.feature index 784c0227..77061778 100644 --- a/examples/order-management/tests/features/behavior/testing-infrastructure/test-isolation.feature +++ b/examples/order-management/tests/features/behavior/testing-infrastructure/test-isolation.feature @@ -1,4 +1,3 @@ -@architect-pattern:TestIsolation @testing-infrastructure Feature: Test Isolation via Namespace Prefixing diff --git a/examples/order-management/tests/features/modernization/dcb-multi-product-reservation.feature b/examples/order-management/tests/features/modernization/dcb-multi-product-reservation.feature index 578b4e3a..aa44e8c9 100644 --- a/examples/order-management/tests/features/modernization/dcb-multi-product-reservation.feature +++ b/examples/order-management/tests/features/modernization/dcb-multi-product-reservation.feature @@ -1,8 +1,3 @@ -@architect-phase:23 -@architect-product-area:ExampleApp -@architect-pattern:DCBMultiProductReservation -@architect-implements:ExampleAppModernization -@architect-status:completed @acceptance-criteria Feature: DCB Multi-Product Reservation diff --git a/examples/order-management/tests/features/modernization/fat-events-order-submitted.feature b/examples/order-management/tests/features/modernization/fat-events-order-submitted.feature index c41999e9..163b622e 100644 --- a/examples/order-management/tests/features/modernization/fat-events-order-submitted.feature +++ b/examples/order-management/tests/features/modernization/fat-events-order-submitted.feature @@ -1,8 +1,3 @@ -@architect-phase:23 -@architect-product-area:ExampleApp -@architect-pattern:EcstFatEvents -@architect-implements:ExampleAppModernization -@architect-status:completed @acceptance-criteria Feature: Fat Events - Enriched OrderSubmitted diff --git a/examples/order-management/tests/features/modernization/reactive-order-detail.feature b/examples/order-management/tests/features/modernization/reactive-order-detail.feature index 1aeb051b..050b5b64 100644 --- a/examples/order-management/tests/features/modernization/reactive-order-detail.feature +++ b/examples/order-management/tests/features/modernization/reactive-order-detail.feature @@ -1,8 +1,3 @@ -@architect-phase:23 -@architect-product-area:ExampleApp -@architect-pattern:ReactiveProjections -@architect-implements:ExampleAppModernization -@architect-status:completed @acceptance-criteria Feature: Reactive Order Detail View diff --git a/examples/order-management/tests/features/modernization/reference-documentation.feature b/examples/order-management/tests/features/modernization/reference-documentation.feature index 15051ef8..3364512a 100644 --- a/examples/order-management/tests/features/modernization/reference-documentation.feature +++ b/examples/order-management/tests/features/modernization/reference-documentation.feature @@ -1,8 +1,3 @@ -@architect-phase:23 -@architect-product-area:ExampleApp -@architect-pattern:ExampleAppModernizationExecutableTests -@architect-implements:ExampleAppModernization -@architect-status:completed @acceptance-criteria Feature: Reference Implementation Documentation diff --git a/examples/order-management/tests/integration-features/durability/durable-commands.feature b/examples/order-management/tests/integration-features/durability/durable-commands.feature index b6f5a66f..824cf1c3 100644 --- a/examples/order-management/tests/integration-features/durability/durable-commands.feature +++ b/examples/order-management/tests/integration-features/durability/durable-commands.feature @@ -1,6 +1,4 @@ @integration @durability @durable-commands -@architect-pattern:DurableEventsIntegrationExecutableTests -@architect-implements:DurableEventsIntegration Feature: Durable Command Execution (App Integration) As a developer using event sourcing I want commands to be tracked with intent/completion bracketing diff --git a/examples/order-management/tests/integration-features/durability/durable-publication.feature b/examples/order-management/tests/integration-features/durability/durable-publication.feature index 4ed7bba5..7e2d8a61 100644 --- a/examples/order-management/tests/integration-features/durability/durable-publication.feature +++ b/examples/order-management/tests/integration-features/durability/durable-publication.feature @@ -1,6 +1,4 @@ @integration @durability @publication -@architect-pattern:DurableEventsIntegrationExecutableTests -@architect-implements:DurableEventsIntegration Feature: Durable Cross-Context Publication (App Integration) As a developer using event sourcing I want cross-context event publications to be tracked and retryable diff --git a/examples/order-management/tests/integration-features/durability/event-replay.feature b/examples/order-management/tests/integration-features/durability/event-replay.feature index 16487aeb..bbbb4dcf 100644 --- a/examples/order-management/tests/integration-features/durability/event-replay.feature +++ b/examples/order-management/tests/integration-features/durability/event-replay.feature @@ -1,6 +1,4 @@ @integration @durability @event-replay -@architect-pattern:DurableEventsIntegrationExecutableTests -@architect-implements:DurableEventsIntegration Feature: Event Replay Infrastructure (App Integration) As a developer maintaining projections I want to rebuild projections from event history diff --git a/examples/order-management/tests/integration-features/durability/idempotent-append.feature b/examples/order-management/tests/integration-features/durability/idempotent-append.feature index c2ff9913..5350d90f 100644 --- a/examples/order-management/tests/integration-features/durability/idempotent-append.feature +++ b/examples/order-management/tests/integration-features/durability/idempotent-append.feature @@ -1,6 +1,4 @@ @integration @durability @idempotent-append -@architect-pattern:DurableEventsIntegrationExecutableTests -@architect-implements:DurableEventsIntegration Feature: Idempotent Event Append (App Integration) As a developer using the order-management app I want event appends with idempotency keys to be deduplicated diff --git a/examples/order-management/tests/integration-features/durability/orphan-detection.feature b/examples/order-management/tests/integration-features/durability/orphan-detection.feature index e6e6200b..660b6f90 100644 --- a/examples/order-management/tests/integration-features/durability/orphan-detection.feature +++ b/examples/order-management/tests/integration-features/durability/orphan-detection.feature @@ -1,6 +1,4 @@ @integration @durability @orphan-detection -@architect-pattern:DurableEventsIntegrationExecutableTests -@architect-implements:DurableEventsIntegration Feature: Orphan Intent Detection (App Integration) As a developer using event sourcing I want orphaned intents to be detected and flagged diff --git a/examples/order-management/tests/integration-features/durability/poison-event.feature b/examples/order-management/tests/integration-features/durability/poison-event.feature index 93e38253..7092700e 100644 --- a/examples/order-management/tests/integration-features/durability/poison-event.feature +++ b/examples/order-management/tests/integration-features/durability/poison-event.feature @@ -1,6 +1,4 @@ @integration @durability @poison-event -@architect-pattern:DurableEventsIntegrationExecutableTests -@architect-implements:DurableEventsIntegration Feature: Poison Event Handling (App Integration) As a developer using event sourcing I want malformed events to be quarantined after repeated failures diff --git a/examples/order-management/tests/integration-features/orders/cancel-order.feature b/examples/order-management/tests/integration-features/orders/cancel-order.feature index 9c676af7..a8cd9b92 100644 --- a/examples/order-management/tests/integration-features/orders/cancel-order.feature +++ b/examples/order-management/tests/integration-features/orders/cancel-order.feature @@ -1,6 +1,4 @@ @orders @integration @commands -@architect-pattern:ConfirmedOrderCancellationExecutableTests -@architect-implements:ConfirmedOrderCancellation Feature: Cancel Order (Integration) As a customer I want to cancel my order diff --git a/examples/order-management/tests/planning-stubs/modernization/modernization.steps.ts b/examples/order-management/tests/planning-stubs/modernization/modernization.steps.ts index 0a6e70d0..5685e385 100644 --- a/examples/order-management/tests/planning-stubs/modernization/modernization.steps.ts +++ b/examples/order-management/tests/planning-stubs/modernization/modernization.steps.ts @@ -1,8 +1,6 @@ /** * Example App Modernization - Step Definitions Stub * - * @architect - * @architect-implements ExampleAppModernization * * NOTE: This file is in tests/planning-stubs/ and excluded from vitest. * Move to tests/steps/modernization/ during implementation and replace throw statements. diff --git a/examples/order-management/tests/steps/modernization/dcb-reservation.steps.ts b/examples/order-management/tests/steps/modernization/dcb-reservation.steps.ts index 70839de6..c58e7ef0 100644 --- a/examples/order-management/tests/steps/modernization/dcb-reservation.steps.ts +++ b/examples/order-management/tests/steps/modernization/dcb-reservation.steps.ts @@ -1,9 +1,6 @@ /** * DCB Multi-Product Reservation - Step Definitions * - * @architect - * @architect-implements ExampleAppModernization - * @architect-phase 23 * * These tests verify the DCB (Dynamic Consistency Boundaries) pattern for * multi-product reservation using executeWithDCB: diff --git a/examples/order-management/tests/steps/modernization/fat-events.steps.ts b/examples/order-management/tests/steps/modernization/fat-events.steps.ts index 33db9c54..707c8f85 100644 --- a/examples/order-management/tests/steps/modernization/fat-events.steps.ts +++ b/examples/order-management/tests/steps/modernization/fat-events.steps.ts @@ -1,8 +1,6 @@ /** * Fat Events - OrderSubmitted with Customer Snapshot * - * @architect - * @architect-implements ExampleAppModernization * * These tests verify the Fat Events pattern for OrderSubmitted: * - V2 events include customer snapshot (name, email) diff --git a/examples/order-management/tests/steps/modernization/reactive-projection.steps.ts b/examples/order-management/tests/steps/modernization/reactive-projection.steps.ts index a2cd7bce..a4c4d2ff 100644 --- a/examples/order-management/tests/steps/modernization/reactive-projection.steps.ts +++ b/examples/order-management/tests/steps/modernization/reactive-projection.steps.ts @@ -1,9 +1,6 @@ /** * Reactive Order Detail View - Step Definitions * - * @architect - * @architect-implements ExampleAppModernization - * @architect-phase 23 * * These tests verify the reactive projection pattern for OrderDetailView: * - Instant updates via synchronous event merging diff --git a/examples/order-management/tests/steps/modernization/reference-documentation.steps.ts b/examples/order-management/tests/steps/modernization/reference-documentation.steps.ts index 00d8a0d2..9fc6c34e 100644 --- a/examples/order-management/tests/steps/modernization/reference-documentation.steps.ts +++ b/examples/order-management/tests/steps/modernization/reference-documentation.steps.ts @@ -1,9 +1,6 @@ /** * Reference Implementation Documentation - Step Definitions * - * @architect - * @architect-implements ExampleAppModernization - * @architect-phase 23 * * These tests verify the README.md structure and link validity: * - Reference Implementation designation is present diff --git a/package.json b/package.json index 008a73d7..0527152b 100644 --- a/package.json +++ b/package.json @@ -20,28 +20,18 @@ "format:check": "prettier --check .", "dev": "pnpm --filter order-management dev", "ladle": "pnpm --filter frontend ladle", - "docs:all": "pnpm docs:prd:all && pnpm docs:pdrs && pnpm docs:changelog && pnpm docs:business-rules", - "docs:patterns": "architect-generate --input 'packages/*/src/**/*.ts' --input 'architect/src/**/*.ts' --generators patterns --output docs-living --features 'examples/order-management/tests/**/*.feature' --features 'architect/specs/**/*.feature' --overwrite && prettier --write 'docs-living/**/*.md'", - "docs:roadmap": "architect-generate --input 'architect/src/**/*.ts' --input 'packages/*/src/**/*.ts' --features 'architect/specs/**/*.feature' --features 'architect/specs/**/*.feature.md' --features 'packages/platform-core/tests/features/behavior/**/*.feature' --features 'examples/order-management/tests/features/timeline/*.feature' --generators roadmap --output docs-living --overwrite && prettier --write 'docs-living/ROADMAP.md' 'docs-living/phases/*.md'", - "docs:prd": "architect-generate --input 'architect/src/**/*.ts' --input 'packages/*/src/**/*.ts' --features 'architect/specs/**/*.feature' --features 'architect/specs/**/*.feature.md' --features 'packages/platform-core/tests/features/behavior/**/*.feature' --generators requirements --output docs-living --overwrite && prettier --write 'docs-living/PRODUCT-REQUIREMENTS.md' 'docs-living/requirements/*.md'", - "docs:prd:roadmap": "architect-generate --input 'architect/src/**/*.ts' --input 'packages/*/src/**/*.ts' --features 'architect/specs/**/*.feature' --features 'architect/specs/**/*.feature.md' --features 'packages/platform-core/tests/features/behavior/**/*.feature' --generators roadmap --output docs-living --overwrite && prettier --write 'docs-living/ROADMAP.md' 'docs-living/phases/*.md'", - "docs:prd:remaining": "architect-generate --input 'architect/src/**/*.ts' --input 'packages/*/src/**/*.ts' --features 'architect/specs/**/*.feature' --features 'architect/specs/**/*.feature.md' --features 'packages/platform-core/tests/features/behavior/**/*.feature' --generators remaining --output docs-living --overwrite && prettier --write 'docs-living/REMAINING-WORK.md' 'docs-living/remaining/*.md'", - "docs:prd:current": "architect-generate --input 'architect/src/**/*.ts' --input 'packages/*/src/**/*.ts' --features 'architect/specs/**/*.feature' --features 'architect/specs/**/*.feature.md' --features 'packages/platform-core/tests/features/behavior/**/*.feature' --generators current --output docs-living --overwrite && prettier --write 'docs-living/CURRENT-WORK.md' && (ls docs-living/current/*.md >/dev/null 2>&1 && prettier --write 'docs-living/current/*.md' || true)", - "docs:prd:milestones": "architect-generate --input 'architect/src/**/*.ts' --input 'packages/*/src/**/*.ts' --features 'architect/specs/**/*.feature' --features 'architect/specs/**/*.feature.md' --features 'packages/platform-core/tests/features/behavior/**/*.feature' --generators milestones --output docs-living/timeline --overwrite && prettier --write 'docs-living/timeline/COMPLETED-MILESTONES.md' 'docs-living/timeline/milestones/*.md'", - "docs:prd:all": "pnpm docs:prd && pnpm docs:prd:roadmap && pnpm docs:prd:remaining && pnpm docs:prd:current && pnpm docs:prd:milestones", - "docs:pdrs": "architect-generate --input 'architect/src/**/*.ts' --features 'architect/decisions/*.feature' --generators adrs --output docs-living --overwrite && prettier --write 'docs-living/DECISIONS.md' 'docs-living/decisions/**/*.md'", - "docs:business-rules": "architect-generate --input 'architect/src/**/*.ts' --input 'packages/*/src/**/*.ts' --features 'architect/specs/**/*.feature' --features 'architect/specs/**/*.feature.md' --features 'packages/platform-core/tests/features/behavior/**/*.feature' --generators business-rules --output docs-living --overwrite && prettier --write 'docs-living/BUSINESS-RULES.md'", - "docs:changelog": "architect-generate --input 'packages/*/src/**/*.ts' --input 'architect/src/**/*.ts' --features 'architect/decisions/*.feature' --features 'architect/releases/*.feature' --features 'architect/specs/**/*.feature' --features 'packages/platform-core/tests/features/behavior/**/*.feature' --generators changelog --output docs-living --overwrite && prettier --write 'docs-living/CHANGELOG-GENERATED.md'", - "lint:patterns": "architect-lint-patterns -i 'packages/*/src/**/*.ts'", - "lint:layers": "node ../scripts/lint-layers.mjs", - "architect-guard": "architect-guard", - "release:plan": "node ../scripts/build-release-plan.mjs", - "release:check": "pnpm release:plan -- --check-all" + "sdp": "sdp", + "sdp:build": "sdp build specs", + "sdp:validate": "sdp validate specs", + "sdp:view": "sdp view specs", + "sdp:q": "sdp q --root specs", + "docs:all": "echo \"docs-living architect generators are retired; use pnpm sdp:build / pnpm sdp:validate / pnpm sdp:view\" && exit 1", + "check:sdp-migration": "vitest run --config vitest.migration.config.ts" }, "devDependencies": { "@convex-dev/eslint-plugin": "catalog:", - "@libar-dev/architect": "1.0.0-pre.3", "@edge-runtime/vm": "catalog:", + "@libar-dev/software-delivery-protocol": "file:../software-delivery-protocol", "concurrently": "^9.2.1", "convex-helpers": "catalog:", "eslint": "catalog:", @@ -62,7 +52,12 @@ "@typescript-eslint/types": "8.59.0", "@typescript-eslint/typescript-estree": "8.59.0", "@typescript-eslint/visitor-keys": "8.59.0" - } + }, + "onlyBuiltDependencies": [ + "@swc/core", + "esbuild", + "msw" + ] }, "packageManager": "pnpm@10.26.1" } diff --git a/packages/platform-bc/src/contracts/dual-write-contract.ts b/packages/platform-bc/src/contracts/dual-write-contract.ts index 0302c816..86cf5222 100644 --- a/packages/platform-bc/src/contracts/dual-write-contract.ts +++ b/packages/platform-bc/src/contracts/dual-write-contract.ts @@ -1,11 +1,4 @@ /** - * @architect - * @architect-pattern DualWriteContract - * @architect-status completed - * @architect-core - * @architect-deliverable BoundedContextFoundation:dual-write-contract - * @architect-uses BoundedContextIdentity - * * ## Dual-Write Contract - BC Type Declaration * * Type-safe contract for bounded contexts using the dual-write pattern, diff --git a/packages/platform-bc/src/contracts/identity.ts b/packages/platform-bc/src/contracts/identity.ts index 9319a04f..e03cda53 100644 --- a/packages/platform-bc/src/contracts/identity.ts +++ b/packages/platform-bc/src/contracts/identity.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-pattern BoundedContextIdentity - * @architect-status completed - * @architect-ddd - * @architect-deliverable BoundedContextFoundation:bounded-context-identity - * * ## Bounded Context Identity - Domain Metadata * * Core identification contract for bounded contexts, providing metadata diff --git a/packages/platform-bc/tests/features/behavior/bc-contracts.feature b/packages/platform-bc/tests/features/behavior/bc-contracts.feature index 5736d893..74b64b74 100644 --- a/packages/platform-bc/tests/features/behavior/bc-contracts.feature +++ b/packages/platform-bc/tests/features/behavior/bc-contracts.feature @@ -1,6 +1,3 @@ -@architect -@architect-phase:19 -@architect-product-area:PlatformBC @testing-infrastructure Feature: Bounded Context Contract Helper Functions diff --git a/packages/platform-bc/tests/features/behavior/bounded-context-foundation-executable-tests.feature b/packages/platform-bc/tests/features/behavior/bounded-context-foundation-executable-tests.feature index 42d26cd3..3739ab75 100644 --- a/packages/platform-bc/tests/features/behavior/bounded-context-foundation-executable-tests.feature +++ b/packages/platform-bc/tests/features/behavior/bounded-context-foundation-executable-tests.feature @@ -1,9 +1,3 @@ -@architect -@architect-pattern:BoundedContextFoundationExecutableTests -@architect-implements:BoundedContextFoundation -@architect-status:completed -@architect-unlock-reason:refactoring-carve-out-executable-tests-for-shipped-pattern-predates-implements-convention -@architect-product-area:PlatformBC Feature: BoundedContextFoundation Executable Tests **Provenance:** This file was authored under the refactoring carve-out diff --git a/packages/platform-bc/tests/steps/bc-contracts.steps.ts b/packages/platform-bc/tests/steps/bc-contracts.steps.ts index 3cfbf62e..f2403875 100644 --- a/packages/platform-bc/tests/steps/bc-contracts.steps.ts +++ b/packages/platform-bc/tests/steps/bc-contracts.steps.ts @@ -5,8 +5,6 @@ * This is a Layer 0 package (pure TypeScript, no Convex dependencies), * so tests run without any backend - just pure function testing. * - * @architect - * @architect-pattern BddTestingInfrastructure */ import { loadFeature, describeFeature } from "@amiceli/vitest-cucumber"; import { expect } from "vitest"; diff --git a/packages/platform-bc/tsconfig.json b/packages/platform-bc/tsconfig.json index b33a80bb..1245c38f 100644 --- a/packages/platform-bc/tsconfig.json +++ b/packages/platform-bc/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../tsconfig.base.json", + "extends": "../../tsconfig.base.json", "compilerOptions": { "composite": true, "rootDir": "src", diff --git a/packages/platform-bus/src/client/index.ts b/packages/platform-bus/src/client/index.ts index ead5df6c..3a2068da 100644 --- a/packages/platform-bus/src/client/index.ts +++ b/packages/platform-bus/src/client/index.ts @@ -163,14 +163,6 @@ export interface CommandBusApi { } /** - * @architect - * @architect-pattern CommandBus - * @architect-command @architect-overview @architect-core - * @architect-status completed - * @architect-usecase "Ensuring command idempotency" - * @architect-usecase "Tracking command execution status" - * @architect-used-by CommandOrchestrator - * * ## CommandBus - Command Idempotency Infrastructure * * Type-safe client for the Convex Command Bus component providing infrastructure-level idempotency. Provides command diff --git a/packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature b/packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature index ad26aca4..3466c35d 100644 --- a/packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature +++ b/packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature @@ -1,9 +1,3 @@ -@architect -@architect-pattern:CommandBusFoundationExecutableTests -@architect-implements:CommandBusFoundation -@architect-status:completed -@architect-unlock-reason:refactoring-carve-out-executable-tests-for-shipped-pattern-predates-implements-convention -@architect-product-area:PlatformBus Feature: CommandBusFoundation Executable Tests **Provenance:** This file was authored under the refactoring carve-out diff --git a/packages/platform-bus/tests/features/behavior/idempotency.feature b/packages/platform-bus/tests/features/behavior/idempotency.feature index d4074e7b..4e59a6bf 100644 --- a/packages/platform-bus/tests/features/behavior/idempotency.feature +++ b/packages/platform-bus/tests/features/behavior/idempotency.feature @@ -1,15 +1,4 @@ -@architect-pattern:CommandBusIdempotency @acceptance-criteria -@architect-pattern:CommandBusIdempotency -@architect-status:completed -@architect-phase:59 -@architect-quarter:Q1-2026 -@architect-effort:4h -@architect-effort-actual:4h -@architect-completed:2026-01-08 -@architect-product-area:PlatformBus -@architect-business-value:prevent-duplicate-command-processing -@architect-priority:critical Feature: Command Bus Idempotency Command idempotency ensures that duplicate command submissions (same commandId) diff --git a/packages/platform-bus/tests/steps/idempotency.integration.steps.ts b/packages/platform-bus/tests/steps/idempotency.integration.steps.ts index 0770d0f7..145bed46 100644 --- a/packages/platform-bus/tests/steps/idempotency.integration.steps.ts +++ b/packages/platform-bus/tests/steps/idempotency.integration.steps.ts @@ -9,8 +9,6 @@ * just test-infrastructure # Full cycle on port 3210 * just test-infrastructure-isolated # Full cycle on port 3215 (parallel safe) * - * @architect-command - * @architect-pattern CommandBusIdempotency */ import { loadFeature, describeFeature } from "@amiceli/vitest-cucumber"; diff --git a/packages/platform-bus/tests/support/helpers.ts b/packages/platform-bus/tests/support/helpers.ts index 657c435e..8d94f204 100644 --- a/packages/platform-bus/tests/support/helpers.ts +++ b/packages/platform-bus/tests/support/helpers.ts @@ -4,7 +4,6 @@ * Provides test isolation through unique command ID prefixes per test run. * This eliminates the need for database cleanup between tests. * - * @architect-pattern CommandBusIdempotency */ import { ConvexTestingHelper } from "convex-helpers/testing"; diff --git a/packages/platform-bus/tsconfig.json b/packages/platform-bus/tsconfig.json index 341bf76a..483e56d2 100644 --- a/packages/platform-bus/tsconfig.json +++ b/packages/platform-bus/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../tsconfig.base.json", + "extends": "../../tsconfig.base.json", "compilerOptions": { "composite": true, "rootDir": "src", diff --git a/packages/platform-contracts-shared/tsconfig.json b/packages/platform-contracts-shared/tsconfig.json index c4359b7e..2163857b 100644 --- a/packages/platform-contracts-shared/tsconfig.json +++ b/packages/platform-contracts-shared/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../tsconfig.base.json", + "extends": "../../tsconfig.base.json", "compilerOptions": { "composite": true, "rootDir": "src", diff --git a/packages/platform-core/src/cms/types.ts b/packages/platform-core/src/cms/types.ts index 585165ca..aa417cc3 100644 --- a/packages/platform-core/src/cms/types.ts +++ b/packages/platform-core/src/cms/types.ts @@ -1,11 +1,4 @@ /** - * @architect - * @architect-pattern CMSDualWrite - * @architect-status completed - * @architect-phase 01 - * @architect-core - * @architect-used-by CommandOrchestrator, CMSRepository - * * ## CMS Dual-Write Pattern - O(1) State + Full Audit * * Core types for Command Model State - the continuously updated aggregate snapshot diff --git a/packages/platform-core/src/correlation/types.ts b/packages/platform-core/src/correlation/types.ts index 61f45da5..b642ddb8 100644 --- a/packages/platform-core/src/correlation/types.ts +++ b/packages/platform-core/src/correlation/types.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-pattern CorrelationChainSystem - * @architect-status completed - * @architect-phase 09 - * @architect-used-by CommandOrchestrator, SagaOrchestration - * * ## Correlation Chain - Request Tracing * * Correlation types for tracking causal relationships in command-event flows. diff --git a/packages/platform-core/src/dcb/backoff.ts b/packages/platform-core/src/dcb/backoff.ts index 91c97a65..a1d51e39 100644 --- a/packages/platform-core/src/dcb/backoff.ts +++ b/packages/platform-core/src/dcb/backoff.ts @@ -3,10 +3,6 @@ * * Exponential backoff with jitter for DCB conflict retry scheduling. * - * @architect - * @architect-implements DurableFunctionAdapters - * @architect-status completed - * @architect-infra * * ### Formula * diff --git a/packages/platform-core/src/dcb/scopeKey.ts b/packages/platform-core/src/dcb/scopeKey.ts index 3649aa8a..29001608 100644 --- a/packages/platform-core/src/dcb/scopeKey.ts +++ b/packages/platform-core/src/dcb/scopeKey.ts @@ -1,11 +1,4 @@ /** - * @architect - * @architect-pattern DCBScopeKeyUtilities - * @architect-status completed - * @architect-phase 16 - * @architect-ddd - * @architect-extract-shapes SCOPE_KEY_PREFIX, createScopeKey, tryCreateScopeKey, parseScopeKey, validateScopeKey, isValidScopeKey, assertValidScopeKey, isScopeTenant, extractTenantId, extractScopeType, extractScopeId - * * ## DCB Scope Key Utilities * * Re-export the canonical shared scope-key contract used across platform packages. diff --git a/packages/platform-core/src/dcb/types.ts b/packages/platform-core/src/dcb/types.ts index d1c62ad6..2ddcbcc0 100644 --- a/packages/platform-core/src/dcb/types.ts +++ b/packages/platform-core/src/dcb/types.ts @@ -1,11 +1,4 @@ /** - * @architect - * @architect-pattern DCBTypes - * @architect-status completed - * @architect-phase 16 - * @architect-ddd - * @architect-extract-shapes DCBScopeKey, ParsedScopeKey, ScopeKeyValidationError, DCBScope, ScopeVersionCheckResult, ScopeCommitResult, ScopeOperations, DCBEntityState, DCBAggregatedState, DCBStateUpdates, DCBDecider, DCBEntityConfig, ExecuteWithDCBConfig, DCBExecutionResult, DCBSuccessResult, DCBRejectedResult, DCBFailedResult, DCBConflictResult, DCBDeferredResult, DCBRetryResult - * * ## Dynamic Consistency Boundaries (DCB) - Type Definitions * * Types for scope-based multi-entity coordination within bounded contexts. diff --git a/packages/platform-core/src/dcb/withRetry.ts b/packages/platform-core/src/dcb/withRetry.ts index 69ce594f..f27ed066 100644 --- a/packages/platform-core/src/dcb/withRetry.ts +++ b/packages/platform-core/src/dcb/withRetry.ts @@ -1,11 +1,6 @@ /** * ## DCB Retry Helper - Automatic OCC Conflict Retry via Workpool * - * @architect - * @architect-implements DurableFunctionAdapters - * @architect-status completed - * @architect-infra - * @architect-uses DCB, Workpool * * Wraps DCB operations to automatically retry on OCC (Optimistic Concurrency * Control) conflicts using Workpool for durable, delayed execution. diff --git a/packages/platform-core/src/durability/durableAppend.ts b/packages/platform-core/src/durability/durableAppend.ts index 4a479666..11a5f593 100644 --- a/packages/platform-core/src/durability/durableAppend.ts +++ b/packages/platform-core/src/durability/durableAppend.ts @@ -1,13 +1,4 @@ /** - * @architect - * @architect-implements EventStoreDurability - * @architect-status completed - * @architect-event-sourcing - * - * @architect-uses WorkpoolPartitioningStrategy - * @architect-used-by SagaEngine, ScheduledJobs, outbox - * @architect-usecase "When event append must survive failures in async contexts" - * * ## Durable Append via Workpool Actions * * Failed event appends from async contexts are retried via Workpool actions diff --git a/packages/platform-core/src/durability/idempotentAppend.ts b/packages/platform-core/src/durability/idempotentAppend.ts index eef269c1..acbfc1b7 100644 --- a/packages/platform-core/src/durability/idempotentAppend.ts +++ b/packages/platform-core/src/durability/idempotentAppend.ts @@ -1,12 +1,4 @@ /** - * @architect - * @architect-implements EventStoreDurability - * @architect-status completed - * @architect-event-sourcing - * - * @architect-used-by outbox, durableAppend, publication, SagaEngine - * @architect-usecase "When appending events that may be retried or deduplicated" - * * ## Idempotent Event Append * * Ensures each logical event is stored exactly once in the event store, diff --git a/packages/platform-core/src/durability/index.ts b/packages/platform-core/src/durability/index.ts index b9da0b1e..790c512b 100644 --- a/packages/platform-core/src/durability/index.ts +++ b/packages/platform-core/src/durability/index.ts @@ -1,13 +1,4 @@ /** - * @architect - * @architect-implements EventStoreDurability - * @architect-status completed - * @architect-event-sourcing - * @architect-core - * - * @architect-uses WorkpoolPartitioningStrategy - * @architect-used-by CommandOrchestrator, SagaEngine, ProjectionProcessor - * * ## Event Store Durability * * Guaranteed event persistence patterns for Convex-native event sourcing. diff --git a/packages/platform-core/src/durability/intentCompletion.ts b/packages/platform-core/src/durability/intentCompletion.ts index f82f4b82..acba874f 100644 --- a/packages/platform-core/src/durability/intentCompletion.ts +++ b/packages/platform-core/src/durability/intentCompletion.ts @@ -1,12 +1,4 @@ /** - * @architect - * @architect-implements EventStoreDurability - * @architect-status completed - * @architect-event-sourcing - * - * @architect-used-by SagaEngine, LongRunningOperations, ReconciliationService - * @architect-usecase "When operations span multiple steps and need visibility" - * * ## Intent/Completion Event Pattern * * Long-running operations bracket with intent and completion events diff --git a/packages/platform-core/src/durability/outbox.ts b/packages/platform-core/src/durability/outbox.ts index e67c1844..437baef3 100644 --- a/packages/platform-core/src/durability/outbox.ts +++ b/packages/platform-core/src/durability/outbox.ts @@ -1,12 +1,4 @@ /** - * @architect - * @architect-implements EventStoreDurability - * @architect-status completed - * @architect-event-sourcing - * - * @architect-used-by CommandOrchestrator, SagaEngine, PaymentHandler - * @architect-usecase "When capturing external API results as domain events" - * * ## Outbox Pattern for Action Results * * Captures external API results (success or failure) as domain events using diff --git a/packages/platform-core/src/durability/poisonEvent.ts b/packages/platform-core/src/durability/poisonEvent.ts index c084e093..d3aaf8ad 100644 --- a/packages/platform-core/src/durability/poisonEvent.ts +++ b/packages/platform-core/src/durability/poisonEvent.ts @@ -1,12 +1,4 @@ /** - * @architect - * @architect-implements EventStoreDurability - * @architect-status completed - * @architect-event-sourcing - * - * @architect-used-by ProjectionProcessor, EventReplayInfrastructure, ProjectionRebuilder - * @architect-usecase "When projection processing must not be blocked by malformed events" - * * ## Poison Event Handling * * Events that cause projection processing failures are tracked; after N diff --git a/packages/platform-core/src/durability/publication.ts b/packages/platform-core/src/durability/publication.ts index 5a53bab0..1faff4d8 100644 --- a/packages/platform-core/src/durability/publication.ts +++ b/packages/platform-core/src/durability/publication.ts @@ -1,13 +1,4 @@ /** - * @architect - * @architect-implements EventStoreDurability - * @architect-status completed - * @architect-event-sourcing - * - * @architect-uses WorkpoolPartitioningStrategy, EventBusAbstraction - * @architect-used-by IntegrationRoutes, CrossContextIntegration, SagaEngine - * @architect-usecase "When publishing events across bounded contexts durably" - * * ## Durable Cross-Context Event Publication * * Cross-context events use Workpool-backed publication with tracking, diff --git a/packages/platform-core/src/durability/types.ts b/packages/platform-core/src/durability/types.ts index d434ed04..30537220 100644 --- a/packages/platform-core/src/durability/types.ts +++ b/packages/platform-core/src/durability/types.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-implements EventStoreDurability - * @architect-status completed - * @architect-event-sourcing - * @architect-core - * * ## Event Store Durability Types * * Core types for durable event persistence patterns: @@ -20,7 +14,6 @@ * - Sharing a common type vocabulary for event append, publication, and recovery flows * - Typing retry-safe interfaces passed between platform-core and mounted components * - * @architect-used-by idempotentAppend, outbox, durableAppend, publication, intentCompletion, poisonEvent */ import type { SafeMutationRef, SafeQueryRef } from "../function-refs/types.js"; diff --git a/packages/platform-core/src/ecst/builder.ts b/packages/platform-core/src/ecst/builder.ts index d347a5e5..0d2d7cab 100644 --- a/packages/platform-core/src/ecst/builder.ts +++ b/packages/platform-core/src/ecst/builder.ts @@ -1,10 +1,6 @@ /** * Fat Event Builder - Creates ECST (Event-Carried State Transfer) events * - * @architect - * @architect-implements EcstFatEvents - * @architect-status completed - * @architect-event-sourcing * * Builder utilities for creating fat events with embedded context. * Fat events carry full context for downstream consumers, eliminating diff --git a/packages/platform-core/src/ecst/embed.ts b/packages/platform-core/src/ecst/embed.ts index 598d1da0..ebff019c 100644 --- a/packages/platform-core/src/ecst/embed.ts +++ b/packages/platform-core/src/ecst/embed.ts @@ -1,10 +1,6 @@ /** * Entity Embedding Helpers - Snapshot entity data into fat events * - * @architect - * @architect-implements EcstFatEvents - * @architect-status completed - * @architect-event-sourcing * * Helper functions for embedding entity data into fat events. * Enables selective field inclusion and crypto-shredding markers. diff --git a/packages/platform-core/src/ecst/index.ts b/packages/platform-core/src/ecst/index.ts index 0125420d..abc326fd 100644 --- a/packages/platform-core/src/ecst/index.ts +++ b/packages/platform-core/src/ecst/index.ts @@ -55,8 +55,6 @@ * } * ``` * - * @architect - * @architect-implements EcstFatEvents */ // Type exports diff --git a/packages/platform-core/src/ecst/privacy.ts b/packages/platform-core/src/ecst/privacy.ts index 09c33557..3bc384e3 100644 --- a/packages/platform-core/src/ecst/privacy.ts +++ b/packages/platform-core/src/ecst/privacy.ts @@ -1,10 +1,6 @@ /** * Crypto-Shredding Markers - GDPR compliance for fat events * - * @architect - * @architect-implements EcstFatEvents - * @architect-status completed - * @architect-event-sourcing * * Provides tools for marking PII (Personally Identifiable Information) in * fat events for GDPR-compliant deletion. Marked fields can be identified diff --git a/packages/platform-core/src/ecst/types.ts b/packages/platform-core/src/ecst/types.ts index 5adfa13d..e459aa0b 100644 --- a/packages/platform-core/src/ecst/types.ts +++ b/packages/platform-core/src/ecst/types.ts @@ -1,10 +1,6 @@ /** * ECST Type Definitions * - * @architect - * @architect-implements EcstFatEvents - * @architect-status completed - * @architect-event-sourcing * * Core type definitions for Event-Carried State Transfer (ECST) fat events. */ diff --git a/packages/platform-core/src/ecst/versioning.ts b/packages/platform-core/src/ecst/versioning.ts index 63e04a67..bb0db1ae 100644 --- a/packages/platform-core/src/ecst/versioning.ts +++ b/packages/platform-core/src/ecst/versioning.ts @@ -1,10 +1,6 @@ /** * Schema Versioning - Fat event schema evolution support * - * @architect - * @architect-implements EcstFatEvents - * @architect-status completed - * @architect-event-sourcing * * Provides schema versioning and migration capabilities for fat events. * Enables backward-compatible evolution of event structures over time. diff --git a/packages/platform-core/src/eventbus/ConvexEventBus.ts b/packages/platform-core/src/eventbus/ConvexEventBus.ts index 6bbcd6e4..6ba90610 100644 --- a/packages/platform-core/src/eventbus/ConvexEventBus.ts +++ b/packages/platform-core/src/eventbus/ConvexEventBus.ts @@ -1,11 +1,4 @@ /** - * @architect - * @architect-pattern EventBusAbstraction - * @architect-status completed - * @architect-phase 09 - * @architect-event-sourcing - * @architect-used-by ProcessManagerLifecycle, SagaOrchestration - * * ## EventBus - Pub/Sub for Domain Events * * Durable event pub/sub using Workpool for parallelism, retries, and dead letter handling. diff --git a/packages/platform-core/src/events/upcaster.ts b/packages/platform-core/src/events/upcaster.ts index 35d7c6f0..e767b517 100644 --- a/packages/platform-core/src/events/upcaster.ts +++ b/packages/platform-core/src/events/upcaster.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-pattern EventUpcasting - * @architect-status completed - * @architect-phase 09 - * @architect-event-sourcing - * * ## Event Upcasting Pipeline - Schema Evolution * * Transforms events from older schema versions to current version at read time. diff --git a/packages/platform-core/src/invariants/createInvariant.ts b/packages/platform-core/src/invariants/createInvariant.ts index 32731ba8..028502f2 100644 --- a/packages/platform-core/src/invariants/createInvariant.ts +++ b/packages/platform-core/src/invariants/createInvariant.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-pattern InvariantFramework - * @architect-status completed - * @architect-phase 11 - * @architect-ddd - * * ## Invariant Framework - Declarative Business Rules * * Factory for declarative business rule validation with typed error codes. diff --git a/packages/platform-core/src/logging/scoped.ts b/packages/platform-core/src/logging/scoped.ts index 0ca5c104..7905afb4 100644 --- a/packages/platform-core/src/logging/scoped.ts +++ b/packages/platform-core/src/logging/scoped.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-pattern LoggingInfrastructure - * @architect-status completed - * @architect-phase 13 - * @architect-infra - * * ## Logging Infrastructure - Scoped Loggers * * Factory for domain-specific loggers with scope prefixes and level filtering. diff --git a/packages/platform-core/src/middleware/MiddlewarePipeline.ts b/packages/platform-core/src/middleware/MiddlewarePipeline.ts index 55205737..f691d8e9 100644 --- a/packages/platform-core/src/middleware/MiddlewarePipeline.ts +++ b/packages/platform-core/src/middleware/MiddlewarePipeline.ts @@ -1,11 +1,4 @@ /** - * @architect - * @architect-pattern MiddlewarePipeline - * @architect-status completed - * @architect-phase 10 - * @architect-command - * @architect-used-by CommandOrchestrator - * * ## Middleware Pipeline - Command Execution Hooks * * Orchestrates middleware execution in the correct order. diff --git a/packages/platform-core/src/middleware/rateLimitAdapter.ts b/packages/platform-core/src/middleware/rateLimitAdapter.ts index 10b0466a..08d8e1a8 100644 --- a/packages/platform-core/src/middleware/rateLimitAdapter.ts +++ b/packages/platform-core/src/middleware/rateLimitAdapter.ts @@ -5,11 +5,6 @@ * Enables production-grade rate limiting with persistence and sharding without * requiring changes to the middleware pipeline. * - * @architect - * @architect-implements DurableFunctionAdapters - * @architect-status active - * @architect-infra - * @architect-uses RateLimitChecker */ import type { RateLimitChecker, RateLimitResult } from "./types.js"; diff --git a/packages/platform-core/src/orchestration/CommandOrchestrator.ts b/packages/platform-core/src/orchestration/CommandOrchestrator.ts index 2329745b..0da93a48 100644 --- a/packages/platform-core/src/orchestration/CommandOrchestrator.ts +++ b/packages/platform-core/src/orchestration/CommandOrchestrator.ts @@ -36,16 +36,6 @@ type EventAppendResult = Awaited< >; /** - * @architect - * @architect-command @architect-core @architect-overview - * @architect-pattern CommandOrchestrator - * @architect-status completed - * @architect-usecase "Executing commands with dual-write pattern" - * @architect-usecase "Coordinating CMS update, event append, and projection trigger" - * @architect-usecase "Ensuring command idempotency across retries" - * @architect-uses EventStore, CommandBus, MiddlewarePipeline - * @architect-used-by BoundedContextHandlers - * * ## CommandOrchestrator - Dual-Write Pattern Implementation * * The CommandOrchestrator encapsulates the 7-step dual-write + projection execution diff --git a/packages/platform-core/src/orchestration/validation.ts b/packages/platform-core/src/orchestration/validation.ts index a24d7007..6a174f52 100644 --- a/packages/platform-core/src/orchestration/validation.ts +++ b/packages/platform-core/src/orchestration/validation.ts @@ -1,13 +1,6 @@ /** - * @architect - * @architect-implements WorkpoolPartitioningStrategy - * @architect-status active - * @architect-command * @contract-status: Planned * - * @architect-uses WorkpoolPartitioningStrategy - * @architect-used-by CommandOrchestrator - * @architect-usecase "When validating command configs have explicit partition keys" * * ## Command Config Partition Key Validation * diff --git a/packages/platform-core/src/processManager/index.ts b/packages/platform-core/src/processManager/index.ts index 6c033b92..522d390b 100644 --- a/packages/platform-core/src/processManager/index.ts +++ b/packages/platform-core/src/processManager/index.ts @@ -1,14 +1,4 @@ /** - * @architect - * @architect-saga @architect-ddd @architect-core - * @architect-pattern ProcessManager - * @architect-status completed - * @architect-usecase "Event-reactive coordination without orchestration" - * @architect-usecase "Fire-and-forget command emission from events" - * @architect-usecase "Time-triggered or hybrid event/time patterns" - * @architect-uses EventBusAbstraction - * @architect-used-by BoundedContextHandlers - * * ## ProcessManager - Event-Reactive Coordination * * Process Manager module for event-reactive coordination. diff --git a/packages/platform-core/src/processManager/lifecycle.ts b/packages/platform-core/src/processManager/lifecycle.ts index 90e16283..95ac738f 100644 --- a/packages/platform-core/src/processManager/lifecycle.ts +++ b/packages/platform-core/src/processManager/lifecycle.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-pattern ProcessManagerLifecycle - * @architect-status completed - * @architect-phase 13 - * @architect-uses EventBusAbstraction - * * ## Process Manager Lifecycle FSM * * FSM for managing PM state transitions (idle/processing/completed/failed) with validation. diff --git a/packages/platform-core/src/projections/conflict.ts b/packages/platform-core/src/projections/conflict.ts index ca499796..200cd0a8 100644 --- a/packages/platform-core/src/projections/conflict.ts +++ b/packages/platform-core/src/projections/conflict.ts @@ -20,9 +20,6 @@ * - Timestamps can drift, be out of sync, or have precision issues * - Position comparison is deterministic and reliable * - * @architect - * @architect-implements ReactiveProjections - * @architect-status completed */ // ============================================================================ diff --git a/packages/platform-core/src/projections/reactive.ts b/packages/platform-core/src/projections/reactive.ts index 6b75c4cc..f1017e86 100644 --- a/packages/platform-core/src/projections/reactive.ts +++ b/packages/platform-core/src/projections/reactive.ts @@ -49,9 +49,6 @@ * }); * ``` * - * @architect - * @architect-implements ReactiveProjections - * @architect-status completed */ import { isViewProjection, type ProjectionCategory } from "@libar-dev/platform-bc"; diff --git a/packages/platform-core/src/projections/replay/index.ts b/packages/platform-core/src/projections/replay/index.ts index 5c10fd44..abb90f92 100644 --- a/packages/platform-core/src/projections/replay/index.ts +++ b/packages/platform-core/src/projections/replay/index.ts @@ -3,8 +3,6 @@ * * Provides checkpoint-based replay for projection recovery and schema migration. * - * @architect - * @architect-implements EventReplayInfrastructure */ // Types diff --git a/packages/platform-core/src/projections/replay/progress.ts b/packages/platform-core/src/projections/replay/progress.ts index ed8e3ed1..4cd4d21a 100644 --- a/packages/platform-core/src/projections/replay/progress.ts +++ b/packages/platform-core/src/projections/replay/progress.ts @@ -1,8 +1,4 @@ /** - * @architect - * @architect-implements EventReplayInfrastructure - * @architect-status completed - * * ## Replay Progress Utilities * * Progress calculation utilities for replay operations. diff --git a/packages/platform-core/src/projections/replay/types.ts b/packages/platform-core/src/projections/replay/types.ts index fe7f72ed..2317e8d6 100644 --- a/packages/platform-core/src/projections/replay/types.ts +++ b/packages/platform-core/src/projections/replay/types.ts @@ -1,8 +1,4 @@ /** - * @architect - * @architect-implements EventReplayInfrastructure - * @architect-status completed - * * ## Event Replay Infrastructure Types * * Types for event replay and projection rebuilding. diff --git a/packages/platform-core/src/projections/withCheckpoint.ts b/packages/platform-core/src/projections/withCheckpoint.ts index 077b5e3a..29a7e4c6 100644 --- a/packages/platform-core/src/projections/withCheckpoint.ts +++ b/packages/platform-core/src/projections/withCheckpoint.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-pattern ProjectionCheckpointing - * @architect-status completed - * @architect-phase 04 - * @architect-projection - * * ## Projection Checkpointing - Idempotent Processing * * Projection checkpoint helper for idempotent event processing. diff --git a/packages/platform-core/src/queries/factory.ts b/packages/platform-core/src/queries/factory.ts index 0b7310e5..269adb39 100644 --- a/packages/platform-core/src/queries/factory.ts +++ b/packages/platform-core/src/queries/factory.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-pattern QueryAbstraction - * @architect-status completed - * @architect-phase 12 - * @architect-cqrs - * * ## Query Abstraction - Read Model Factories * * Query factory functions for creating type-safe read model queries. diff --git a/packages/platform-core/src/repository/CMSRepository.ts b/packages/platform-core/src/repository/CMSRepository.ts index e89a904a..62ff3d2e 100644 --- a/packages/platform-core/src/repository/CMSRepository.ts +++ b/packages/platform-core/src/repository/CMSRepository.ts @@ -1,11 +1,4 @@ /** - * @architect - * @architect-pattern CMSRepository - * @architect-status completed - * @architect-phase 11 - * @architect-uses CMSDualWrite - * @architect-used-by BoundedContextHandlers - * * ## CMS Repository - Entity Access with Auto-Upcast * * Factory for typed data access with automatic schema upcasting in dual-write handlers. diff --git a/packages/platform-core/src/workpool/partitioning/complexity.ts b/packages/platform-core/src/workpool/partitioning/complexity.ts index 0824791a..16d6abf2 100644 --- a/packages/platform-core/src/workpool/partitioning/complexity.ts +++ b/packages/platform-core/src/workpool/partitioning/complexity.ts @@ -1,9 +1,4 @@ /** - * @architect - * @architect-implements WorkpoolPartitioningStrategy - * @architect-status completed - * @architect-projection - * * ## Projection Complexity Classifier * * Analyzes projection characteristics and recommends appropriate diff --git a/packages/platform-core/src/workpool/partitioning/config.ts b/packages/platform-core/src/workpool/partitioning/config.ts index 55298259..9ce86e95 100644 --- a/packages/platform-core/src/workpool/partitioning/config.ts +++ b/packages/platform-core/src/workpool/partitioning/config.ts @@ -1,9 +1,4 @@ /** - * @architect - * @architect-implements WorkpoolPartitioningStrategy - * @architect-status completed - * @architect-projection - * * ## Per-Projection Partition Configuration * * Defines configuration types and constants for projection partitioning diff --git a/packages/platform-core/src/workpool/partitioning/helpers.ts b/packages/platform-core/src/workpool/partitioning/helpers.ts index 52b3cf25..0bb5772f 100644 --- a/packages/platform-core/src/workpool/partitioning/helpers.ts +++ b/packages/platform-core/src/workpool/partitioning/helpers.ts @@ -1,13 +1,4 @@ /** - * @architect - * @architect-implements WorkpoolPartitioningStrategy - * @architect-status completed - * @architect-projection - * - * @architect-uses EventBusAbstraction - * @architect-used-by CommandOrchestrator, Projections, DCBRetry - * @architect-usecase "When creating partition keys for Workpool-based event processing" - * * ## Partition Key Helper Functions * * Standardized partition key generation for per-entity event ordering diff --git a/packages/platform-core/src/workpool/partitioning/index.ts b/packages/platform-core/src/workpool/partitioning/index.ts index 8a7aed99..da3413fe 100644 --- a/packages/platform-core/src/workpool/partitioning/index.ts +++ b/packages/platform-core/src/workpool/partitioning/index.ts @@ -1,9 +1,4 @@ /** - * @architect - * @architect-implements WorkpoolPartitioningStrategy - * @architect-status completed - * @architect-projection - * * ## Workpool Partitioning Strategy * * Standardized partition key patterns for event ordering and OCC prevention diff --git a/packages/platform-core/src/workpool/partitioning/types.ts b/packages/platform-core/src/workpool/partitioning/types.ts index 7a518caa..f4647f30 100644 --- a/packages/platform-core/src/workpool/partitioning/types.ts +++ b/packages/platform-core/src/workpool/partitioning/types.ts @@ -1,13 +1,4 @@ /** - * @architect - * @architect-implements WorkpoolPartitioningStrategy - * @architect-status completed - * @architect-projection - * - * @architect-uses EventBusAbstraction - * @architect-used-by CommandOrchestrator, Projections, DCBRetry - * @architect-usecase "When configuring partition keys for Workpool-based event processing" - * * ## Workpool Partition Key Types * * Provides type definitions for partition key strategies that ensure diff --git a/packages/platform-core/tests/features/behavior/agent/audit-trail.feature b/packages/platform-core/tests/features/behavior/agent/audit-trail.feature index d0eb3ef0..a5b73f04 100644 --- a/packages/platform-core/tests/features/behavior/agent/audit-trail.feature +++ b/packages/platform-core/tests/features/behavior/agent/audit-trail.feature @@ -1,8 +1,3 @@ -@architect -@architect-status:completed -@architect-implements:AgentAsBoundedContext -@architect-phase:22 -@architect-product-area:Platform @agent Feature: Agent Audit Trail diff --git a/packages/platform-core/tests/features/behavior/agent/command-emission.feature b/packages/platform-core/tests/features/behavior/agent/command-emission.feature index 3eb2d91a..014b3a71 100644 --- a/packages/platform-core/tests/features/behavior/agent/command-emission.feature +++ b/packages/platform-core/tests/features/behavior/agent/command-emission.feature @@ -1,8 +1,3 @@ -@architect -@architect-status:completed -@architect-implements:AgentAsBoundedContext -@architect-phase:22 -@architect-product-area:Platform @agent Feature: Agent Command Emission diff --git a/packages/platform-core/tests/features/behavior/agent/event-subscription.feature b/packages/platform-core/tests/features/behavior/agent/event-subscription.feature index b24bdafc..780111cf 100644 --- a/packages/platform-core/tests/features/behavior/agent/event-subscription.feature +++ b/packages/platform-core/tests/features/behavior/agent/event-subscription.feature @@ -1,8 +1,3 @@ -@architect -@architect-status:completed -@architect-implements:AgentAsBoundedContext -@architect-phase:22 -@architect-product-area:Platform @agent Feature: Agent Event Subscription diff --git a/packages/platform-core/tests/features/behavior/agent/human-in-loop.feature b/packages/platform-core/tests/features/behavior/agent/human-in-loop.feature index ac7b4bf1..40af2394 100644 --- a/packages/platform-core/tests/features/behavior/agent/human-in-loop.feature +++ b/packages/platform-core/tests/features/behavior/agent/human-in-loop.feature @@ -1,8 +1,3 @@ -@architect -@architect-status:completed -@architect-implements:AgentAsBoundedContext -@architect-phase:22 -@architect-product-area:Platform @agent Feature: Human-in-Loop Configuration diff --git a/packages/platform-core/tests/features/behavior/agent/pattern-detection.feature b/packages/platform-core/tests/features/behavior/agent/pattern-detection.feature index c3fbd832..5a202af9 100644 --- a/packages/platform-core/tests/features/behavior/agent/pattern-detection.feature +++ b/packages/platform-core/tests/features/behavior/agent/pattern-detection.feature @@ -1,8 +1,3 @@ -@architect -@architect-status:completed -@architect-implements:AgentAsBoundedContext -@architect-phase:22 -@architect-product-area:Platform @agent Feature: Agent Pattern Detection diff --git a/packages/platform-core/tests/features/behavior/dcb/execute.feature b/packages/platform-core/tests/features/behavior/dcb/execute.feature index 51dcb344..6fbad715 100644 --- a/packages/platform-core/tests/features/behavior/dcb/execute.feature +++ b/packages/platform-core/tests/features/behavior/dcb/execute.feature @@ -1,7 +1,3 @@ -@architect-implements:DynamicConsistencyBoundaries -@architect-status:active -@architect-phase:16 -@architect-product-area:PlatformCore Feature: DCB Execution with OCC As a platform developer diff --git a/packages/platform-core/tests/features/behavior/dcb/scope-key.feature b/packages/platform-core/tests/features/behavior/dcb/scope-key.feature index a0989a5c..014a9488 100644 --- a/packages/platform-core/tests/features/behavior/dcb/scope-key.feature +++ b/packages/platform-core/tests/features/behavior/dcb/scope-key.feature @@ -1,7 +1,3 @@ -@architect-implements:DynamicConsistencyBoundaries -@architect-status:active -@architect-phase:16 -@architect-product-area:PlatformCore Feature: DCB Scope Key Utilities As a platform developer diff --git a/packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature b/packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature index 2a405fba..d00c6863 100644 --- a/packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature +++ b/packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature @@ -1,7 +1,3 @@ -@architect-implements:DurableFunctionAdapters -@architect-status:active -@architect-phase:18a -@architect-product-area:Platform @acceptance-criteria Feature: DCB Conflict Retry diff --git a/packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature b/packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature index 32edcac9..faaf5927 100644 --- a/packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature +++ b/packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature @@ -1,7 +1,3 @@ -@architect-implements:DurableFunctionAdapters -@architect-status:active -@architect-phase:18a -@architect-product-area:Platform @acceptance-criteria Feature: Adapter Integration Patterns diff --git a/packages/platform-core/tests/features/behavior/durable-function-adapters/rate-limit-adapter.feature b/packages/platform-core/tests/features/behavior/durable-function-adapters/rate-limit-adapter.feature index 8ee2de28..ec2ffe06 100644 --- a/packages/platform-core/tests/features/behavior/durable-function-adapters/rate-limit-adapter.feature +++ b/packages/platform-core/tests/features/behavior/durable-function-adapters/rate-limit-adapter.feature @@ -1,7 +1,3 @@ -@architect-implements:DurableFunctionAdapters -@architect-status:active -@architect-phase:18a -@architect-product-area:Platform @acceptance-criteria Feature: Rate Limit Adapter diff --git a/packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature b/packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature index 19391a8f..40da52ac 100644 --- a/packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature +++ b/packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature @@ -1,9 +1,3 @@ -@architect -@architect-status:completed -@architect-unlock-reason:Initial-implementation-complete -@architect-implements:EcstFatEvents -@architect-phase:20 -@architect-product-area:PlatformCore @ecst Feature: Fat Event Builder diff --git a/packages/platform-core/tests/features/behavior/ecst/fat-vs-thin-selection.feature b/packages/platform-core/tests/features/behavior/ecst/fat-vs-thin-selection.feature index 5867ab6c..f1a48942 100644 --- a/packages/platform-core/tests/features/behavior/ecst/fat-vs-thin-selection.feature +++ b/packages/platform-core/tests/features/behavior/ecst/fat-vs-thin-selection.feature @@ -1,9 +1,3 @@ -@architect -@architect-status:completed -@architect-unlock-reason:Initial-implementation-complete -@architect-implements:EcstFatEvents -@architect-phase:20 -@architect-product-area:PlatformCore @ecst Feature: Fat vs Thin Event Selection diff --git a/packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature b/packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature index 095d187b..0f3c9b97 100644 --- a/packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature +++ b/packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature @@ -1,8 +1,3 @@ -@architect -@architect-status:completed -@architect-implements:EcstFatEvents -@architect-phase:20 -@architect-product-area:PlatformCore @ecst @gdpr Feature: Privacy Markers (Crypto-Shredding) diff --git a/packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature b/packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature index 87228ea1..583e3454 100644 --- a/packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature +++ b/packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature @@ -1,9 +1,3 @@ -@architect -@architect-status:completed -@architect-unlock-reason:Initial-implementation-complete -@architect-implements:EcstFatEvents -@architect-phase:20 -@architect-product-area:PlatformCore @ecst Feature: Schema Versioning diff --git a/packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature b/packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature index e81d85b9..292604e7 100644 --- a/packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature +++ b/packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature @@ -1,5 +1,3 @@ -@architect -@architect-implements:EventReplayInfrastructure @acceptance-criteria Feature: Replay Progress Calculator diff --git a/packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature b/packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature index c8c62a61..adb63224 100644 --- a/packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature +++ b/packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature @@ -1,5 +1,3 @@ -@architect -@architect-implements:EventStoreDurability @acceptance-criteria Feature: Durable Event Append diff --git a/packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature b/packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature index 1c000954..7f4d66e6 100644 --- a/packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature +++ b/packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature @@ -1,5 +1,3 @@ -@architect -@architect-implements:EventStoreDurability @acceptance-criteria Feature: Durable Cross-Context Event Publication diff --git a/packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature b/packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature index 4914ae89..ca338915 100644 --- a/packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature +++ b/packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature @@ -1,5 +1,3 @@ -@architect -@architect-implements:EventStoreDurability @acceptance-criteria Feature: Idempotent Event Append diff --git a/packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature b/packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature index 96ada51d..f6240a76 100644 --- a/packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature +++ b/packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature @@ -1,5 +1,3 @@ -@architect -@architect-implements:EventStoreDurability @acceptance-criteria Feature: Intent and Completion Bracketing diff --git a/packages/platform-core/tests/features/behavior/event-store-durability/outbox-handler.feature b/packages/platform-core/tests/features/behavior/event-store-durability/outbox-handler.feature index 633879d6..1905fdc8 100644 --- a/packages/platform-core/tests/features/behavior/event-store-durability/outbox-handler.feature +++ b/packages/platform-core/tests/features/behavior/event-store-durability/outbox-handler.feature @@ -1,5 +1,3 @@ -@architect -@architect-implements:EventStoreDurability @acceptance-criteria Feature: Outbox Handler Pattern diff --git a/packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature b/packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature index 88b1e525..8367338e 100644 --- a/packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature +++ b/packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature @@ -1,5 +1,3 @@ -@architect -@architect-implements:EventStoreDurability @acceptance-criteria Feature: Poison Event Handling diff --git a/packages/platform-core/tests/features/behavior/fsm/fsm.feature b/packages/platform-core/tests/features/behavior/fsm/fsm.feature index 68fe72ce..e14589ff 100644 --- a/packages/platform-core/tests/features/behavior/fsm/fsm.feature +++ b/packages/platform-core/tests/features/behavior/fsm/fsm.feature @@ -1,4 +1,3 @@ -@architect Feature: FSM Core As a platform developer diff --git a/packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature b/packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature index ce3a25dd..c65549f5 100644 --- a/packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature +++ b/packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature @@ -1,8 +1,3 @@ -@architect -@architect-status:roadmap -@architect-implements:IntegrationPatterns21a -@architect-phase:21 -@architect-product-area:PlatformCore @integration Feature: Anti-Corruption Layer (ACL) diff --git a/packages/platform-core/tests/features/behavior/integration/context-map.feature b/packages/platform-core/tests/features/behavior/integration/context-map.feature index 8a143411..c2cf7866 100644 --- a/packages/platform-core/tests/features/behavior/integration/context-map.feature +++ b/packages/platform-core/tests/features/behavior/integration/context-map.feature @@ -1,8 +1,3 @@ -@architect -@architect-status:roadmap -@architect-implements:IntegrationPatterns21a -@architect-phase:21 -@architect-product-area:PlatformCore @integration Feature: Context Map Documentation diff --git a/packages/platform-core/tests/features/behavior/integration/contract-testing.feature b/packages/platform-core/tests/features/behavior/integration/contract-testing.feature index 5517f0c4..cf4a1112 100644 --- a/packages/platform-core/tests/features/behavior/integration/contract-testing.feature +++ b/packages/platform-core/tests/features/behavior/integration/contract-testing.feature @@ -1,8 +1,3 @@ -@architect -@architect-status:roadmap -@architect-implements:IntegrationPatterns21b -@architect-phase:21 -@architect-product-area:PlatformCore @integration Feature: Contract Testing Utilities diff --git a/packages/platform-core/tests/features/behavior/integration/event-versioning.feature b/packages/platform-core/tests/features/behavior/integration/event-versioning.feature index ebdf2ba1..4c45c0a2 100644 --- a/packages/platform-core/tests/features/behavior/integration/event-versioning.feature +++ b/packages/platform-core/tests/features/behavior/integration/event-versioning.feature @@ -1,8 +1,3 @@ -@architect -@architect-status:roadmap -@architect-implements:IntegrationPatterns21b -@architect-phase:21 -@architect-product-area:PlatformCore @integration Feature: Integration Event Versioning diff --git a/packages/platform-core/tests/features/behavior/integration/published-language.feature b/packages/platform-core/tests/features/behavior/integration/published-language.feature index e0084e40..a10ffbb2 100644 --- a/packages/platform-core/tests/features/behavior/integration/published-language.feature +++ b/packages/platform-core/tests/features/behavior/integration/published-language.feature @@ -1,8 +1,3 @@ -@architect -@architect-status:roadmap -@architect-implements:IntegrationPatterns21a -@architect-phase:21 -@architect-product-area:PlatformCore @integration Feature: Published Language Registry diff --git a/packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature b/packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature index f14d8df7..198be5c9 100644 --- a/packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature +++ b/packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature @@ -1,4 +1,3 @@ -@architect @invariants Feature: createInvariantSet diff --git a/packages/platform-core/tests/features/behavior/invariants/create-invariant.feature b/packages/platform-core/tests/features/behavior/invariants/create-invariant.feature index 58fa1797..c74fed9b 100644 --- a/packages/platform-core/tests/features/behavior/invariants/create-invariant.feature +++ b/packages/platform-core/tests/features/behavior/invariants/create-invariant.feature @@ -1,4 +1,3 @@ -@architect @invariants Feature: createInvariant diff --git a/packages/platform-core/tests/features/behavior/invariants/invariant-error.feature b/packages/platform-core/tests/features/behavior/invariants/invariant-error.feature index 2eeaf24c..34617042 100644 --- a/packages/platform-core/tests/features/behavior/invariants/invariant-error.feature +++ b/packages/platform-core/tests/features/behavior/invariants/invariant-error.feature @@ -1,4 +1,3 @@ -@architect @invariants Feature: InvariantError diff --git a/packages/platform-core/tests/features/behavior/logging/commands.feature b/packages/platform-core/tests/features/behavior/logging/commands.feature index ab745261..035d016f 100644 --- a/packages/platform-core/tests/features/behavior/logging/commands.feature +++ b/packages/platform-core/tests/features/behavior/logging/commands.feature @@ -1,4 +1,3 @@ -@architect Feature: Command Logging Helpers As a platform developer diff --git a/packages/platform-core/tests/features/behavior/logging/scoped.feature b/packages/platform-core/tests/features/behavior/logging/scoped.feature index 891bdf9d..ca33137f 100644 --- a/packages/platform-core/tests/features/behavior/logging/scoped.feature +++ b/packages/platform-core/tests/features/behavior/logging/scoped.feature @@ -1,4 +1,3 @@ -@architect Feature: Scoped Logger As a platform developer diff --git a/packages/platform-core/tests/features/behavior/logging/testing.feature b/packages/platform-core/tests/features/behavior/logging/testing.feature index a2c6778b..ccdcc8f5 100644 --- a/packages/platform-core/tests/features/behavior/logging/testing.feature +++ b/packages/platform-core/tests/features/behavior/logging/testing.feature @@ -1,4 +1,3 @@ -@architect Feature: Logging Testing Utilities As a platform developer diff --git a/packages/platform-core/tests/features/behavior/logging/types.feature b/packages/platform-core/tests/features/behavior/logging/types.feature index 7a144107..a67a924e 100644 --- a/packages/platform-core/tests/features/behavior/logging/types.feature +++ b/packages/platform-core/tests/features/behavior/logging/types.feature @@ -1,4 +1,3 @@ -@architect Feature: Logging Types As a platform developer diff --git a/packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature b/packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature index c4e024c4..32fef85f 100644 --- a/packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature +++ b/packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature @@ -1,4 +1,3 @@ -@architect Feature: Circuit Breaker As a platform developer diff --git a/packages/platform-core/tests/features/behavior/orchestration/saga-orchestration-executable-tests.feature b/packages/platform-core/tests/features/behavior/orchestration/saga-orchestration-executable-tests.feature index ea9b1cf4..78d30fab 100644 --- a/packages/platform-core/tests/features/behavior/orchestration/saga-orchestration-executable-tests.feature +++ b/packages/platform-core/tests/features/behavior/orchestration/saga-orchestration-executable-tests.feature @@ -1,9 +1,3 @@ -@architect -@architect-pattern:SagaOrchestrationExecutableTests -@architect-implements:SagaOrchestration -@architect-status:completed -@architect-unlock-reason:refactoring-carve-out-executable-tests-for-shipped-pattern-predates-implements-convention -@architect-product-area:Platform Feature: SagaOrchestration Executable Tests **Provenance:** This file was authored under the refactoring carve-out diff --git a/packages/platform-core/tests/features/behavior/processManager/executor.feature b/packages/platform-core/tests/features/behavior/processManager/executor.feature index 0711f750..5b1e4277 100644 --- a/packages/platform-core/tests/features/behavior/processManager/executor.feature +++ b/packages/platform-core/tests/features/behavior/processManager/executor.feature @@ -1,4 +1,3 @@ -@architect Feature: Process Manager Executor As a platform developer diff --git a/packages/platform-core/tests/features/behavior/processManager/lifecycle.feature b/packages/platform-core/tests/features/behavior/processManager/lifecycle.feature index 1109a8a9..6ad74c3d 100644 --- a/packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +++ b/packages/platform-core/tests/features/behavior/processManager/lifecycle.feature @@ -1,4 +1,3 @@ -@architect Feature: Process Manager Lifecycle State Machine As a platform developer diff --git a/packages/platform-core/tests/features/behavior/processManager/registry.feature b/packages/platform-core/tests/features/behavior/processManager/registry.feature index 50e0974b..56903294 100644 --- a/packages/platform-core/tests/features/behavior/processManager/registry.feature +++ b/packages/platform-core/tests/features/behavior/processManager/registry.feature @@ -1,4 +1,3 @@ -@architect Feature: Process Manager Registry As a platform developer diff --git a/packages/platform-core/tests/features/behavior/processManager/subscription.feature b/packages/platform-core/tests/features/behavior/processManager/subscription.feature index 17accf22..4cda162e 100644 --- a/packages/platform-core/tests/features/behavior/processManager/subscription.feature +++ b/packages/platform-core/tests/features/behavior/processManager/subscription.feature @@ -1,4 +1,3 @@ -@architect Feature: Process Manager EventBus Subscription As a platform developer diff --git a/packages/platform-core/tests/features/behavior/processManager/types.feature b/packages/platform-core/tests/features/behavior/processManager/types.feature index e4638484..7003235f 100644 --- a/packages/platform-core/tests/features/behavior/processManager/types.feature +++ b/packages/platform-core/tests/features/behavior/processManager/types.feature @@ -1,4 +1,3 @@ -@architect Feature: Process Manager Types As a platform developer diff --git a/packages/platform-core/tests/features/behavior/production-hardening/admin-tooling.feature b/packages/platform-core/tests/features/behavior/production-hardening/admin-tooling.feature index e85c1012..4b177cd3 100644 --- a/packages/platform-core/tests/features/behavior/production-hardening/admin-tooling.feature +++ b/packages/platform-core/tests/features/behavior/production-hardening/admin-tooling.feature @@ -1,9 +1,4 @@ -@architect -@architect-implements:ProductionHardening @acceptance-criteria -@architect-status:roadmap -@architect-phase:18 -@architect-product-area:Platform Feature: Admin Tooling - Operational Tasks As a platform operator diff --git a/packages/platform-core/tests/features/behavior/production-hardening/circuit-breakers.feature b/packages/platform-core/tests/features/behavior/production-hardening/circuit-breakers.feature index 78811fcb..c0f269dc 100644 --- a/packages/platform-core/tests/features/behavior/production-hardening/circuit-breakers.feature +++ b/packages/platform-core/tests/features/behavior/production-hardening/circuit-breakers.feature @@ -1,9 +1,4 @@ -@architect -@architect-implements:ProductionHardening @acceptance-criteria -@architect-status:roadmap -@architect-phase:18 -@architect-product-area:Platform Feature: Circuit Breakers - Fault Isolation As a platform developer diff --git a/packages/platform-core/tests/features/behavior/production-hardening/distributed-tracing.feature b/packages/platform-core/tests/features/behavior/production-hardening/distributed-tracing.feature index 14cedd3d..c852b616 100644 --- a/packages/platform-core/tests/features/behavior/production-hardening/distributed-tracing.feature +++ b/packages/platform-core/tests/features/behavior/production-hardening/distributed-tracing.feature @@ -1,9 +1,4 @@ -@architect -@architect-implements:ProductionHardening @acceptance-criteria -@architect-status:roadmap -@architect-phase:18 -@architect-product-area:Platform Feature: Distributed Tracing - Event Flow Visualization As a platform operator diff --git a/packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature b/packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature index 967b7242..a0581ff2 100644 --- a/packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature +++ b/packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature @@ -1,9 +1,4 @@ -@architect -@architect-implements:ProductionHardening @acceptance-criteria -@architect-status:roadmap -@architect-phase:18 -@architect-product-area:Platform Feature: Durable Function Integration - Reliable Execution Patterns As a platform developer diff --git a/packages/platform-core/tests/features/behavior/production-hardening/health-endpoints.feature b/packages/platform-core/tests/features/behavior/production-hardening/health-endpoints.feature index ec394816..0800d114 100644 --- a/packages/platform-core/tests/features/behavior/production-hardening/health-endpoints.feature +++ b/packages/platform-core/tests/features/behavior/production-hardening/health-endpoints.feature @@ -1,9 +1,4 @@ -@architect -@architect-implements:ProductionHardening @acceptance-criteria -@architect-status:roadmap -@architect-phase:18 -@architect-product-area:Platform Feature: Health Endpoints - Kubernetes Probes As a Kubernetes operator diff --git a/packages/platform-core/tests/features/behavior/production-hardening/metrics-collection.feature b/packages/platform-core/tests/features/behavior/production-hardening/metrics-collection.feature index 13207587..012d2e1f 100644 --- a/packages/platform-core/tests/features/behavior/production-hardening/metrics-collection.feature +++ b/packages/platform-core/tests/features/behavior/production-hardening/metrics-collection.feature @@ -1,9 +1,4 @@ -@architect -@architect-implements:ProductionHardening @acceptance-criteria -@architect-status:roadmap -@architect-phase:18 -@architect-product-area:Platform Feature: Metrics Collection - System Health Tracking As a platform operator diff --git a/packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature b/packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature index d85d05aa..e84db46f 100644 --- a/packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature +++ b/packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature @@ -1,9 +1,4 @@ -@architect -@architect-implements:ProductionHardening @acceptance-criteria -@architect-status:roadmap -@architect-phase:18 -@architect-product-area:Platform Feature: Rate Limiting - API Protection As a platform developer diff --git a/packages/platform-core/tests/features/behavior/projection-categories/category-definitions.feature b/packages/platform-core/tests/features/behavior/projection-categories/category-definitions.feature index 3b1f6054..02f8d841 100644 --- a/packages/platform-core/tests/features/behavior/projection-categories/category-definitions.feature +++ b/packages/platform-core/tests/features/behavior/projection-categories/category-definitions.feature @@ -1,9 +1,3 @@ -@architect -@architect-pattern:ProjectionCategoriesExecutableTests -@architect-implements:ProjectionCategories -@architect-status:active -@architect-phase:15 -@architect-product-area:PlatformCore Feature: Projection Category Definitions As a platform developer diff --git a/packages/platform-core/tests/features/behavior/projection-categories/explicit-declaration.feature b/packages/platform-core/tests/features/behavior/projection-categories/explicit-declaration.feature index cd4127ba..1026cd1a 100644 --- a/packages/platform-core/tests/features/behavior/projection-categories/explicit-declaration.feature +++ b/packages/platform-core/tests/features/behavior/projection-categories/explicit-declaration.feature @@ -1,9 +1,3 @@ -@architect -@architect-pattern:ProjectionCategoriesExecutableTests -@architect-implements:ProjectionCategories -@architect-status:active -@architect-phase:15 -@architect-product-area:PlatformCore Feature: Explicit Category Declaration As a platform developer diff --git a/packages/platform-core/tests/features/behavior/projection-categories/registry-lookup.feature b/packages/platform-core/tests/features/behavior/projection-categories/registry-lookup.feature index 749fcfda..6ef25c8c 100644 --- a/packages/platform-core/tests/features/behavior/projection-categories/registry-lookup.feature +++ b/packages/platform-core/tests/features/behavior/projection-categories/registry-lookup.feature @@ -1,9 +1,3 @@ -@architect -@architect-pattern:ProjectionCategoriesExecutableTests -@architect-implements:ProjectionCategories -@architect-status:active -@architect-phase:15 -@architect-product-area:PlatformCore Feature: Registry Category Lookup As a platform developer diff --git a/packages/platform-core/tests/features/behavior/projections/lifecycle.feature b/packages/platform-core/tests/features/behavior/projections/lifecycle.feature index 84708977..49bedae3 100644 --- a/packages/platform-core/tests/features/behavior/projections/lifecycle.feature +++ b/packages/platform-core/tests/features/behavior/projections/lifecycle.feature @@ -1,4 +1,3 @@ -@architect Feature: Projection Lifecycle State Machine As a platform developer diff --git a/packages/platform-core/tests/features/behavior/reactive-projections/conflict-detection.feature b/packages/platform-core/tests/features/behavior/reactive-projections/conflict-detection.feature index a2f8f436..7cc577cb 100644 --- a/packages/platform-core/tests/features/behavior/reactive-projections/conflict-detection.feature +++ b/packages/platform-core/tests/features/behavior/reactive-projections/conflict-detection.feature @@ -1,10 +1,3 @@ -@architect -@architect-pattern:ReactiveProjectionConflictDetection -@architect-implements:ReactiveProjections -@architect-status:completed -@architect-unlock-reason:value-transfer-add-reverse-tags-and-enrich-rule-blocks-per-new-architect-doctrine -@architect-phase:17 -@architect-product-area:Platform @acceptance-criteria Feature: Conflict Detection and Rollback diff --git a/packages/platform-core/tests/features/behavior/reactive-projections/hybrid-model.feature b/packages/platform-core/tests/features/behavior/reactive-projections/hybrid-model.feature index b299b489..9c31724c 100644 --- a/packages/platform-core/tests/features/behavior/reactive-projections/hybrid-model.feature +++ b/packages/platform-core/tests/features/behavior/reactive-projections/hybrid-model.feature @@ -1,10 +1,3 @@ -@architect -@architect-pattern:ReactiveProjectionHybridModel -@architect-implements:ReactiveProjections -@architect-status:completed -@architect-unlock-reason:value-transfer-add-reverse-tags-and-enrich-rule-blocks-per-new-architect-doctrine -@architect-phase:17 -@architect-product-area:Platform @acceptance-criteria Feature: Hybrid Model - Durable + Reactive Projections diff --git a/packages/platform-core/tests/features/behavior/reactive-projections/reactive-eligibility.feature b/packages/platform-core/tests/features/behavior/reactive-projections/reactive-eligibility.feature index 67a72d10..d5231391 100644 --- a/packages/platform-core/tests/features/behavior/reactive-projections/reactive-eligibility.feature +++ b/packages/platform-core/tests/features/behavior/reactive-projections/reactive-eligibility.feature @@ -1,10 +1,3 @@ -@architect -@architect-pattern:ReactiveProjectionEligibility -@architect-implements:ReactiveProjections -@architect-status:completed -@architect-unlock-reason:value-transfer-add-reverse-tags-and-enrich-rule-blocks-per-new-architect-doctrine -@architect-phase:17 -@architect-product-area:Platform @acceptance-criteria Feature: Reactive Eligibility by Category diff --git a/packages/platform-core/tests/features/behavior/reactive-projections/shared-evolve.feature b/packages/platform-core/tests/features/behavior/reactive-projections/shared-evolve.feature index 080f80b0..cce262d5 100644 --- a/packages/platform-core/tests/features/behavior/reactive-projections/shared-evolve.feature +++ b/packages/platform-core/tests/features/behavior/reactive-projections/shared-evolve.feature @@ -1,10 +1,3 @@ -@architect -@architect-pattern:ReactiveProjectionSharedEvolve -@architect-implements:ReactiveProjections -@architect-status:completed -@architect-unlock-reason:value-transfer-add-reverse-tags-and-enrich-rule-blocks-per-new-architect-doctrine -@architect-phase:17 -@architect-product-area:Platform @acceptance-criteria Feature: Shared Evolve Logic - Client/Server Consistency diff --git a/packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature b/packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature index 55286b8b..05507457 100644 --- a/packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature +++ b/packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature @@ -1,8 +1,3 @@ -@architect -@architect-implements:ReservationPattern -@architect-status:active -@architect-phase:20 -@architect-product-area:PlatformCore @reservation Feature: Confirm Operation diff --git a/packages/platform-core/tests/features/behavior/reservation/release-operation.feature b/packages/platform-core/tests/features/behavior/reservation/release-operation.feature index 5ad25c44..70ebf564 100644 --- a/packages/platform-core/tests/features/behavior/reservation/release-operation.feature +++ b/packages/platform-core/tests/features/behavior/reservation/release-operation.feature @@ -1,8 +1,3 @@ -@architect -@architect-implements:ReservationPattern -@architect-status:active -@architect-phase:20 -@architect-product-area:PlatformCore @reservation Feature: Release Operation diff --git a/packages/platform-core/tests/features/behavior/reservation/reservation-key.feature b/packages/platform-core/tests/features/behavior/reservation/reservation-key.feature index 9a278887..10e78f8d 100644 --- a/packages/platform-core/tests/features/behavior/reservation/reservation-key.feature +++ b/packages/platform-core/tests/features/behavior/reservation/reservation-key.feature @@ -1,8 +1,3 @@ -@architect -@architect-implements:ReservationPattern -@architect-status:active -@architect-phase:20 -@architect-product-area:PlatformCore @reservation Feature: Reservation Key Format diff --git a/packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature b/packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature index a1deebc3..3a1c69d0 100644 --- a/packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature +++ b/packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature @@ -1,8 +1,3 @@ -@architect -@architect-implements:ReservationPattern -@architect-status:active -@architect-phase:20 -@architect-product-area:PlatformCore @reservation Feature: Reserve Operation diff --git a/packages/platform-core/tests/features/behavior/testing/guards.feature b/packages/platform-core/tests/features/behavior/testing/guards.feature index b149bd69..fe688296 100644 --- a/packages/platform-core/tests/features/behavior/testing/guards.feature +++ b/packages/platform-core/tests/features/behavior/testing/guards.feature @@ -1,17 +1,4 @@ -@architect -@architect-pattern:TestEnvironmentGuards -@architect-implements:BddTestingInfrastructure @testing-infrastructure -@architect-status:completed -@architect-unlock-reason:Task-3-branch-wide-remediation-guard-unblock -@architect-phase:58 -@architect-quarter:Q1-2026 -@architect-effort:1h -@architect-effort-actual:1h -@architect-completed:2026-01-08 -@architect-product-area:PlatformCore -@architect-business-value:prevent-test-utilities-in-production -@architect-priority:high Feature: Test Environment Guards As a platform developer diff --git a/packages/platform-core/tests/features/behavior/testing/integration-isolation.feature b/packages/platform-core/tests/features/behavior/testing/integration-isolation.feature index 07149e93..b35a0c71 100644 --- a/packages/platform-core/tests/features/behavior/testing/integration-isolation.feature +++ b/packages/platform-core/tests/features/behavior/testing/integration-isolation.feature @@ -1,10 +1,3 @@ -@architect -@architect-pattern:BddTestingInfrastructureExecutableTests -@architect-implements:BddTestingInfrastructure -@architect-status:completed -@architect-unlock-reason:refactoring-carve-out-executable-tests-for-shipped-pattern-predates-implements-convention -@architect-phase:19 -@architect-product-area:PlatformCore @testing-infrastructure Feature: Integration Test Isolation diff --git a/packages/platform-core/tests/features/behavior/testing/platform-coverage.feature b/packages/platform-core/tests/features/behavior/testing/platform-coverage.feature index 8b276153..4f05eeb6 100644 --- a/packages/platform-core/tests/features/behavior/testing/platform-coverage.feature +++ b/packages/platform-core/tests/features/behavior/testing/platform-coverage.feature @@ -1,10 +1,3 @@ -@architect -@architect-pattern:BddTestingInfrastructureExecutableTests -@architect-implements:BddTestingInfrastructure -@architect-status:completed -@architect-unlock-reason:refactoring-carve-out-executable-tests-for-shipped-pattern-predates-implements-convention -@architect-phase:19 -@architect-product-area:PlatformCore @testing-infrastructure Feature: Platform Package BDD Coverage diff --git a/packages/platform-core/tests/features/behavior/testing/polling.feature b/packages/platform-core/tests/features/behavior/testing/polling.feature index 73c93c36..57d05c24 100644 --- a/packages/platform-core/tests/features/behavior/testing/polling.feature +++ b/packages/platform-core/tests/features/behavior/testing/polling.feature @@ -1,17 +1,4 @@ -@architect -@architect-pattern:PollingUtilities -@architect-implements:BddTestingInfrastructure @testing-infrastructure -@architect-status:completed -@architect-unlock-reason:value-transfer-add-reverse-tags-and-enrich-rule-blocks-per-new-architect-doctrine -@architect-phase:56 -@architect-quarter:Q1-2026 -@architect-effort:2h -@architect-effort-actual:2h -@architect-completed:2026-01-08 -@architect-product-area:PlatformCore -@architect-business-value:enable-async-condition-waiting-in-tests -@architect-priority:high Feature: Polling Utilities for Integration Tests As a developer writing integration tests diff --git a/packages/platform-core/tests/features/behavior/testing/world.feature b/packages/platform-core/tests/features/behavior/testing/world.feature index 640163fb..80aee7be 100644 --- a/packages/platform-core/tests/features/behavior/testing/world.feature +++ b/packages/platform-core/tests/features/behavior/testing/world.feature @@ -1,17 +1,4 @@ -@architect -@architect-pattern:BDDWorld -@architect-implements:BddTestingInfrastructure @testing-infrastructure -@architect-status:completed -@architect-unlock-reason:value-transfer-add-reverse-tags-and-enrich-rule-blocks-per-new-architect-doctrine -@architect-phase:57 -@architect-quarter:Q1-2026 -@architect-effort:2h -@architect-effort-actual:2h -@architect-completed:2026-01-08 -@architect-product-area:PlatformCore -@architect-business-value:manage-scenario-context-across-steps -@architect-priority:high Feature: BDD Test World State Management As a BDD test author diff --git a/packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature b/packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature index e1804540..bb9d4ff3 100644 --- a/packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature +++ b/packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature @@ -1,5 +1,3 @@ -@architect -@architect-implements:WorkpoolPartitioningStrategy Feature: Projection Complexity Classifier As a platform developer diff --git a/packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature b/packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature index f0055370..608c573b 100644 --- a/packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +++ b/packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature @@ -1,5 +1,3 @@ -@architect -@architect-implements:WorkpoolPartitioningStrategy Feature: Workpool Partition Key Helpers As a platform developer diff --git a/packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature b/packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature index 7fe67e36..bf545538 100644 --- a/packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +++ b/packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature @@ -1,5 +1,3 @@ -@architect -@architect-implements:WorkpoolPartitioningStrategy Feature: Command Config Partition Key Validation As a platform developer diff --git a/packages/platform-core/tests/integration/durability/idempotent-append.integration.steps.ts b/packages/platform-core/tests/integration/durability/idempotent-append.integration.steps.ts index c3afdca7..77ba2cc2 100644 --- a/packages/platform-core/tests/integration/durability/idempotent-append.integration.steps.ts +++ b/packages/platform-core/tests/integration/durability/idempotent-append.integration.steps.ts @@ -4,10 +4,6 @@ * Integration test steps for validating idempotent event append * against a real Convex backend with the Event Store component. * - * @architect - * @architect-implements EventStoreDurability - * @architect-status active - * @architect-event-sourcing * * @since Phase 18b */ diff --git a/packages/platform-core/tests/integration/durability/poison-event.integration.steps.ts b/packages/platform-core/tests/integration/durability/poison-event.integration.steps.ts index b58d285a..8a2b54f8 100644 --- a/packages/platform-core/tests/integration/durability/poison-event.integration.steps.ts +++ b/packages/platform-core/tests/integration/durability/poison-event.integration.steps.ts @@ -4,10 +4,6 @@ * Integration test steps for validating poison event handling * against a real Convex backend with the poisonEvents table. * - * @architect - * @architect-implements EventStoreDurability - * @architect-status active - * @architect-event-sourcing * * @since Phase 18b */ diff --git a/packages/platform-core/tests/integration/durable-adapters/dcb-retry.integration.steps.ts b/packages/platform-core/tests/integration/durable-adapters/dcb-retry.integration.steps.ts index 388f381e..77615075 100644 --- a/packages/platform-core/tests/integration/durable-adapters/dcb-retry.integration.steps.ts +++ b/packages/platform-core/tests/integration/durable-adapters/dcb-retry.integration.steps.ts @@ -4,10 +4,6 @@ * Integration test steps for validating the withDCBRetry adapter * that handles OCC conflicts with automatic retry scheduling via Workpool. * - * @architect - * @architect-pattern DurableFunctionAdapters - * @architect-status active - * @architect-infra * * @since Phase 18a */ diff --git a/packages/platform-core/tests/integration/durable-adapters/integration-patterns.integration.steps.ts b/packages/platform-core/tests/integration/durable-adapters/integration-patterns.integration.steps.ts index 79cab9b3..fa8bc67e 100644 --- a/packages/platform-core/tests/integration/durable-adapters/integration-patterns.integration.steps.ts +++ b/packages/platform-core/tests/integration/durable-adapters/integration-patterns.integration.steps.ts @@ -4,10 +4,6 @@ * Integration tests for validating adapter integration with * middleware pipeline, Workpool infrastructure, and component mounting. * - * @architect - * @architect-pattern DurableFunctionAdapters - * @architect-status active - * @architect-infra * * @since Phase 18a */ diff --git a/packages/platform-core/tests/integration/durable-adapters/rate-limit.integration.steps.ts b/packages/platform-core/tests/integration/durable-adapters/rate-limit.integration.steps.ts index 54f514e4..ecb23a89 100644 --- a/packages/platform-core/tests/integration/durable-adapters/rate-limit.integration.steps.ts +++ b/packages/platform-core/tests/integration/durable-adapters/rate-limit.integration.steps.ts @@ -4,10 +4,6 @@ * Integration test steps for validating the ConvexRateLimitAdapter * that bridges the RateLimitChecker interface to @convex-dev/rate-limiter. * - * @architect - * @architect-pattern DurableFunctionAdapters - * @architect-status active - * @architect-infra */ import { loadFeature, describeFeature } from "@amiceli/vitest-cucumber"; import { expect } from "vitest"; diff --git a/packages/platform-core/tests/planning-stubs/agent/agent.steps.ts b/packages/platform-core/tests/planning-stubs/agent/agent.steps.ts index 236b3742..147b73d3 100644 --- a/packages/platform-core/tests/planning-stubs/agent/agent.steps.ts +++ b/packages/platform-core/tests/planning-stubs/agent/agent.steps.ts @@ -1,8 +1,6 @@ /** * Agent as Bounded Context - Step Definitions (Stub) * - * @architect - * @architect-roadmap-spec AgentAsBoundedContext * * PLANNING ARTIFACT: Stub step definitions for Phase 22 Agent features. * Covers: event-subscription, pattern-detection, command-emission, human-in-loop, audit-trail diff --git a/packages/platform-core/tests/planning-stubs/integration/patterns.steps.ts b/packages/platform-core/tests/planning-stubs/integration/patterns.steps.ts index 4d47b3fc..8797092d 100644 --- a/packages/platform-core/tests/planning-stubs/integration/patterns.steps.ts +++ b/packages/platform-core/tests/planning-stubs/integration/patterns.steps.ts @@ -1,9 +1,6 @@ /** * Integration Patterns - Step Definitions (Stub) * - * @architect - * @architect-roadmap-spec IntegrationPatterns21a (context-map, published-language, anti-corruption-layer) - * @architect-roadmap-spec IntegrationPatterns21b (event-versioning, contract-testing) * * PLANNING ARTIFACT: Stub step definitions for Phase 21 Integration Patterns. * Split into two phases: diff --git a/packages/platform-core/tests/planning-stubs/production-hardening/admin-tooling.steps.ts b/packages/platform-core/tests/planning-stubs/production-hardening/admin-tooling.steps.ts index 8be1e68a..56d4ff79 100644 --- a/packages/platform-core/tests/planning-stubs/production-hardening/admin-tooling.steps.ts +++ b/packages/platform-core/tests/planning-stubs/production-hardening/admin-tooling.steps.ts @@ -1,8 +1,6 @@ /** * Admin Tooling - Step Definitions Stub * - * @architect - * @architect-roadmap-spec ProductionHardening * * NOTE: This file is in tests/planning-stubs/ and excluded from vitest. * Move to tests/steps/monitoring/ during implementation. diff --git a/packages/platform-core/tests/planning-stubs/production-hardening/circuit-breakers.steps.ts b/packages/platform-core/tests/planning-stubs/production-hardening/circuit-breakers.steps.ts index 929a6228..e07c53b5 100644 --- a/packages/platform-core/tests/planning-stubs/production-hardening/circuit-breakers.steps.ts +++ b/packages/platform-core/tests/planning-stubs/production-hardening/circuit-breakers.steps.ts @@ -1,8 +1,6 @@ /** * Circuit Breakers - Step Definitions Stub * - * @architect - * @architect-roadmap-spec ProductionHardening * * NOTE: This file is in tests/planning-stubs/ and excluded from vitest. * Move to tests/steps/monitoring/ during implementation. diff --git a/packages/platform-core/tests/planning-stubs/production-hardening/distributed-tracing.steps.ts b/packages/platform-core/tests/planning-stubs/production-hardening/distributed-tracing.steps.ts index 7c5f3aed..5925f885 100644 --- a/packages/platform-core/tests/planning-stubs/production-hardening/distributed-tracing.steps.ts +++ b/packages/platform-core/tests/planning-stubs/production-hardening/distributed-tracing.steps.ts @@ -1,8 +1,6 @@ /** * Distributed Tracing - Step Definitions Stub * - * @architect - * @architect-roadmap-spec ProductionHardening * * NOTE: This file is in tests/planning-stubs/ and excluded from vitest. * Move to tests/steps/monitoring/ during implementation. diff --git a/packages/platform-core/tests/planning-stubs/production-hardening/durable-function-integration.steps.ts b/packages/platform-core/tests/planning-stubs/production-hardening/durable-function-integration.steps.ts index c408e441..e26a58e2 100644 --- a/packages/platform-core/tests/planning-stubs/production-hardening/durable-function-integration.steps.ts +++ b/packages/platform-core/tests/planning-stubs/production-hardening/durable-function-integration.steps.ts @@ -1,8 +1,6 @@ /** * Durable Function Integration - Step Definitions Stub * - * @architect - * @architect-roadmap-spec ProductionHardening * * NOTE: This file is in tests/planning-stubs/ and excluded from vitest. * Move to tests/steps/monitoring/ during implementation. diff --git a/packages/platform-core/tests/planning-stubs/production-hardening/health-endpoints.steps.ts b/packages/platform-core/tests/planning-stubs/production-hardening/health-endpoints.steps.ts index 82a0a2a6..4eb4f5ba 100644 --- a/packages/platform-core/tests/planning-stubs/production-hardening/health-endpoints.steps.ts +++ b/packages/platform-core/tests/planning-stubs/production-hardening/health-endpoints.steps.ts @@ -1,8 +1,6 @@ /** * Health Endpoints - Step Definitions Stub * - * @architect - * @architect-roadmap-spec ProductionHardening * * NOTE: This file is in tests/planning-stubs/ and excluded from vitest. * Move to tests/steps/monitoring/ during implementation. diff --git a/packages/platform-core/tests/planning-stubs/production-hardening/metrics-collection.steps.ts b/packages/platform-core/tests/planning-stubs/production-hardening/metrics-collection.steps.ts index 586c0078..a9c643fc 100644 --- a/packages/platform-core/tests/planning-stubs/production-hardening/metrics-collection.steps.ts +++ b/packages/platform-core/tests/planning-stubs/production-hardening/metrics-collection.steps.ts @@ -1,8 +1,6 @@ /** * Metrics Collection - Step Definitions Stub * - * @architect - * @architect-roadmap-spec ProductionHardening * * NOTE: This file is in tests/planning-stubs/ and excluded from vitest. * Move to tests/steps/monitoring/ during implementation. diff --git a/packages/platform-core/tests/planning-stubs/production-hardening/rate-limiting.steps.ts b/packages/platform-core/tests/planning-stubs/production-hardening/rate-limiting.steps.ts index 5cd0315c..f3e67229 100644 --- a/packages/platform-core/tests/planning-stubs/production-hardening/rate-limiting.steps.ts +++ b/packages/platform-core/tests/planning-stubs/production-hardening/rate-limiting.steps.ts @@ -1,8 +1,6 @@ /** * Rate Limiting - Step Definitions Stub * - * @architect - * @architect-roadmap-spec ProductionHardening * * NOTE: This file is in tests/planning-stubs/ and excluded from vitest. * Move to tests/steps/monitoring/ during implementation. diff --git a/packages/platform-core/tests/steps/agent/agent.steps.ts b/packages/platform-core/tests/steps/agent/agent.steps.ts index 0c765297..c6c2b695 100644 --- a/packages/platform-core/tests/steps/agent/agent.steps.ts +++ b/packages/platform-core/tests/steps/agent/agent.steps.ts @@ -1,8 +1,6 @@ /** * Agent as Bounded Context - Step Definitions * - * @architect - * @architect-pattern AgentAsBoundedContext * * BDD step definitions for Phase 22 Agent features. * Tests the PURE FUNCTIONS from the agent module: diff --git a/packages/platform-core/tests/steps/durability/durable-append.steps.ts b/packages/platform-core/tests/steps/durability/durable-append.steps.ts index 79e99a77..334cd5ba 100644 --- a/packages/platform-core/tests/steps/durability/durable-append.steps.ts +++ b/packages/platform-core/tests/steps/durability/durable-append.steps.ts @@ -6,8 +6,6 @@ * - Workpool enqueue behavior * - Action handler factory * - * @architect - * @architect-implements EventStoreDurability */ import { loadFeature, describeFeature } from "@amiceli/vitest-cucumber"; import { expect, vi } from "vitest"; diff --git a/packages/platform-core/tests/steps/durability/durable-publication.steps.ts b/packages/platform-core/tests/steps/durability/durable-publication.steps.ts index 53b715e8..1dde18ed 100644 --- a/packages/platform-core/tests/steps/durability/durable-publication.steps.ts +++ b/packages/platform-core/tests/steps/durability/durable-publication.steps.ts @@ -9,8 +9,6 @@ * - retryPublication mutation * - onComplete callback behavior * - * @architect - * @architect-implements EventStoreDurability */ import { loadFeature, describeFeature } from "@amiceli/vitest-cucumber"; import { expect, vi } from "vitest"; diff --git a/packages/platform-core/tests/steps/durability/idempotent-append.steps.ts b/packages/platform-core/tests/steps/durability/idempotent-append.steps.ts index 4f8463cf..7a2cf83f 100644 --- a/packages/platform-core/tests/steps/durability/idempotent-append.steps.ts +++ b/packages/platform-core/tests/steps/durability/idempotent-append.steps.ts @@ -6,8 +6,6 @@ * - Idempotent append function behavior * - OCC conflict handling * - * @architect - * @architect-implements EventStoreDurability */ import { loadFeature, describeFeature } from "@amiceli/vitest-cucumber"; import { expect, vi } from "vitest"; diff --git a/packages/platform-core/tests/steps/durability/intent-completion.steps.ts b/packages/platform-core/tests/steps/durability/intent-completion.steps.ts index 923f62a5..130fe914 100644 --- a/packages/platform-core/tests/steps/durability/intent-completion.steps.ts +++ b/packages/platform-core/tests/steps/durability/intent-completion.steps.ts @@ -8,8 +8,6 @@ * - checkIntentTimeout function * - queryOrphanedIntents function * - * @architect - * @architect-implements EventStoreDurability */ import { loadFeature, describeFeature } from "@amiceli/vitest-cucumber"; import { expect, vi } from "vitest"; diff --git a/packages/platform-core/tests/steps/durability/outbox-handler.steps.ts b/packages/platform-core/tests/steps/durability/outbox-handler.steps.ts index 72e2ebf9..5b39ebe6 100644 --- a/packages/platform-core/tests/steps/durability/outbox-handler.steps.ts +++ b/packages/platform-core/tests/steps/durability/outbox-handler.steps.ts @@ -5,8 +5,6 @@ * - createOutboxHandler factory * - Event building from action results * - * @architect - * @architect-implements EventStoreDurability */ import { loadFeature, describeFeature } from "@amiceli/vitest-cucumber"; import { expect, vi } from "vitest"; diff --git a/packages/platform-core/tests/steps/durability/poison-event.steps.ts b/packages/platform-core/tests/steps/durability/poison-event.steps.ts index 5991393f..eb625451 100644 --- a/packages/platform-core/tests/steps/durability/poison-event.steps.ts +++ b/packages/platform-core/tests/steps/durability/poison-event.steps.ts @@ -9,8 +9,6 @@ * - listQuarantinedEvents query * - getPoisonEventStats query * - * @architect - * @architect-implements EventStoreDurability */ import { loadFeature, describeFeature } from "@amiceli/vitest-cucumber"; import { expect, vi } from "vitest"; diff --git a/packages/platform-core/tests/steps/ecst/builder.steps.ts b/packages/platform-core/tests/steps/ecst/builder.steps.ts index 01417183..b791c070 100644 --- a/packages/platform-core/tests/steps/ecst/builder.steps.ts +++ b/packages/platform-core/tests/steps/ecst/builder.steps.ts @@ -1,8 +1,6 @@ /** * Fat Event Builder - Step Definitions * - * @architect - * @architect-pattern EcstFatEvents * * BDD step definitions for fat event builder behavior: * - createFatEvent() creation diff --git a/packages/platform-core/tests/steps/ecst/privacy.steps.ts b/packages/platform-core/tests/steps/ecst/privacy.steps.ts index 2f4467a9..17aea244 100644 --- a/packages/platform-core/tests/steps/ecst/privacy.steps.ts +++ b/packages/platform-core/tests/steps/ecst/privacy.steps.ts @@ -1,8 +1,6 @@ /** * Privacy Markers (Crypto-Shredding) - Step Definitions * - * @architect - * @architect-pattern EcstFatEvents * * BDD step definitions for crypto-shredding behavior: * - PII field marking diff --git a/packages/platform-core/tests/steps/ecst/selection.steps.ts b/packages/platform-core/tests/steps/ecst/selection.steps.ts index 3dbc1665..b15d81b4 100644 --- a/packages/platform-core/tests/steps/ecst/selection.steps.ts +++ b/packages/platform-core/tests/steps/ecst/selection.steps.ts @@ -1,8 +1,6 @@ /** * Fat vs Thin Event Selection - Step Definitions * - * @architect - * @architect-pattern EcstFatEvents * * BDD step definitions for fat vs thin event selection guidelines: * - Cross-context integration scenarios diff --git a/packages/platform-core/tests/steps/ecst/versioning.steps.ts b/packages/platform-core/tests/steps/ecst/versioning.steps.ts index 1df30dd0..360e52d3 100644 --- a/packages/platform-core/tests/steps/ecst/versioning.steps.ts +++ b/packages/platform-core/tests/steps/ecst/versioning.steps.ts @@ -1,8 +1,6 @@ /** * Schema Versioning - Step Definitions * - * @architect - * @architect-pattern EcstFatEvents * * BDD step definitions for fat event schema versioning: * - Schema version tracking diff --git a/packages/platform-core/tests/steps/event-replay/replay-progress.steps.ts b/packages/platform-core/tests/steps/event-replay/replay-progress.steps.ts index 2e476efa..fe3732c6 100644 --- a/packages/platform-core/tests/steps/event-replay/replay-progress.steps.ts +++ b/packages/platform-core/tests/steps/event-replay/replay-progress.steps.ts @@ -8,8 +8,6 @@ * - isActiveReplay * - isTerminalReplayStatus * - * @architect - * @architect-implements EventReplayInfrastructure */ import { loadFeature, describeFeature } from "@amiceli/vitest-cucumber"; import { expect } from "vitest"; diff --git a/packages/platform-core/tests/steps/projections/reactive.steps.ts b/packages/platform-core/tests/steps/projections/reactive.steps.ts index 657db813..84671b3a 100644 --- a/packages/platform-core/tests/steps/projections/reactive.steps.ts +++ b/packages/platform-core/tests/steps/projections/reactive.steps.ts @@ -7,8 +7,6 @@ * - conflict-detection.feature: Conflict detection and rollback * - reactive-eligibility.feature: Category-based eligibility * - * @architect - * @architect-roadmap-spec ReactiveProjections */ import { loadFeature, describeFeature } from "@amiceli/vitest-cucumber"; import { expect } from "vitest"; diff --git a/packages/platform-core/tests/steps/testing/integration-isolation.steps.ts b/packages/platform-core/tests/steps/testing/integration-isolation.steps.ts index 0d97a0ef..9c6a582e 100644 --- a/packages/platform-core/tests/steps/testing/integration-isolation.steps.ts +++ b/packages/platform-core/tests/steps/testing/integration-isolation.steps.ts @@ -1,8 +1,6 @@ /** * Integration Test Isolation - Step Definitions * - * @architect - * @architect-pattern BddTestingInfrastructure * * BDD step definitions validating the Docker restart pattern for state cleanup, * test namespacing for entity isolation, and Workpool/scheduler isolation. diff --git a/packages/platform-core/tests/steps/testing/platform-coverage.steps.ts b/packages/platform-core/tests/steps/testing/platform-coverage.steps.ts index 1b3f9833..b34d08a5 100644 --- a/packages/platform-core/tests/steps/testing/platform-coverage.steps.ts +++ b/packages/platform-core/tests/steps/testing/platform-coverage.steps.ts @@ -1,8 +1,6 @@ /** * Platform Package BDD Coverage - Step Definitions * - * @architect - * @architect-pattern BddTestingInfrastructure * * BDD step definitions validating that each @libar-dev/platform-* package * has appropriate BDD test coverage for its public APIs. diff --git a/packages/platform-core/tsconfig.json b/packages/platform-core/tsconfig.json index 5396a0bd..52294739 100644 --- a/packages/platform-core/tsconfig.json +++ b/packages/platform-core/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../tsconfig.base.json", + "extends": "../../tsconfig.base.json", "compilerOptions": { "composite": true, "rootDir": "src", diff --git a/packages/platform-decider/src/types.ts b/packages/platform-decider/src/types.ts index b912d0aa..c6411320 100644 --- a/packages/platform-decider/src/types.ts +++ b/packages/platform-decider/src/types.ts @@ -1,10 +1,4 @@ /** - * @architect - * @architect-pattern HandlerFactories - * @architect-status completed - * @architect-phase 14 - * @architect-decider - * * ## Handler Factories - Decider-to-Handler Wrappers * * ## Decider Pattern - Pure Domain Decision Logic diff --git a/packages/platform-decider/tests/features/behavior/decider-outputs.feature b/packages/platform-decider/tests/features/behavior/decider-outputs.feature index cd4258b9..d610265d 100644 --- a/packages/platform-decider/tests/features/behavior/decider-outputs.feature +++ b/packages/platform-decider/tests/features/behavior/decider-outputs.feature @@ -1,15 +1,4 @@ -@architect-pattern:DeciderOutputs @acceptance-criteria -@architect-status:completed -@architect-phase:60 -@architect-quarter:Q1-2026 -@architect-effort:3h -@architect-effort-actual:3h -@architect-completed:2026-01-08 -@architect-product-area:PlatformDecider -@architect-business-value:type-safe-command-outcome-handling -@architect-priority:high -@architect-implements:DeciderPattern Feature: Decider Output Helpers and Type Guards The Decider pattern uses discriminated unions to represent command outcomes: diff --git a/packages/platform-decider/tests/steps/decider-outputs.steps.ts b/packages/platform-decider/tests/steps/decider-outputs.steps.ts index b4ee71ce..0b986426 100644 --- a/packages/platform-decider/tests/steps/decider-outputs.steps.ts +++ b/packages/platform-decider/tests/steps/decider-outputs.steps.ts @@ -6,8 +6,6 @@ * This is a Layer 0 package (pure TypeScript, no Convex dependencies), * so tests run without any backend - just pure function testing. * - * @architect-decider - * @architect-pattern DeciderOutputs */ import { loadFeature, describeFeature } from "@amiceli/vitest-cucumber"; import { expect } from "vitest"; diff --git a/packages/platform-decider/tsconfig.json b/packages/platform-decider/tsconfig.json index c4359b7e..2163857b 100644 --- a/packages/platform-decider/tsconfig.json +++ b/packages/platform-decider/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../tsconfig.base.json", + "extends": "../../tsconfig.base.json", "compilerOptions": { "composite": true, "rootDir": "src", diff --git a/packages/platform-fsm/tests/features/behavior/fsm-transitions.feature b/packages/platform-fsm/tests/features/behavior/fsm-transitions.feature index 14360a76..0da5c7a9 100644 --- a/packages/platform-fsm/tests/features/behavior/fsm-transitions.feature +++ b/packages/platform-fsm/tests/features/behavior/fsm-transitions.feature @@ -1,9 +1,4 @@ -@architect -@architect-pattern:FSMTransitions -@architect-status:completed @acceptance-criteria -@architect-implements:DeciderPattern -@architect-unlock-reason:metadata-alignment Feature: FSM State Transitions The FSM (Finite State Machine) module provides type-safe state management diff --git a/packages/platform-fsm/tests/steps/fsm-transitions.steps.ts b/packages/platform-fsm/tests/steps/fsm-transitions.steps.ts index 1a60d541..aedd43c1 100644 --- a/packages/platform-fsm/tests/steps/fsm-transitions.steps.ts +++ b/packages/platform-fsm/tests/steps/fsm-transitions.steps.ts @@ -6,8 +6,6 @@ * This is a Layer 0 package (pure TypeScript, no Convex dependencies), * so tests run without any backend - just pure function testing. * - * @architect-fsm - * @architect-pattern FSMTransitions */ import { loadFeature, describeFeature } from "@amiceli/vitest-cucumber"; import { expect } from "vitest"; diff --git a/packages/platform-fsm/tsconfig.json b/packages/platform-fsm/tsconfig.json index c4359b7e..2163857b 100644 --- a/packages/platform-fsm/tsconfig.json +++ b/packages/platform-fsm/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../tsconfig.base.json", + "extends": "../../tsconfig.base.json", "compilerOptions": { "composite": true, "rootDir": "src", diff --git a/packages/platform-store/src/client/index.ts b/packages/platform-store/src/client/index.ts index b4e6309c..dd7aa299 100644 --- a/packages/platform-store/src/client/index.ts +++ b/packages/platform-store/src/client/index.ts @@ -260,14 +260,6 @@ export interface EventStoreApi { } /** - * @architect - * @architect-pattern EventStore - * @architect-event-sourcing @architect-overview @architect-core - * @architect-status completed - * @architect-usecase "Appending events after CMS updates" - * @architect-usecase "Reading events for projection processing" - * @architect-used-by CommandOrchestrator - * * ## EventStore - Central Event Storage * * Central event storage component for Event Sourcing. diff --git a/packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature b/packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature index 4d35220c..db0b6c18 100644 --- a/packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature +++ b/packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature @@ -1,9 +1,3 @@ -@architect -@architect-pattern:EventStoreFoundationExecutableTests -@architect-implements:EventStoreFoundation -@architect-status:completed -@architect-unlock-reason:refactoring-carve-out-executable-tests-for-shipped-pattern-predates-implements-convention -@architect-product-area:PlatformStore Feature: EventStoreFoundation Executable Tests **Provenance:** This file was authored under the refactoring carve-out diff --git a/packages/platform-store/tests/features/behavior/event-store-types.feature b/packages/platform-store/tests/features/behavior/event-store-types.feature index eb102421..f2fbf00e 100644 --- a/packages/platform-store/tests/features/behavior/event-store-types.feature +++ b/packages/platform-store/tests/features/behavior/event-store-types.feature @@ -1,6 +1,3 @@ -@architect -@architect-phase:19 -@architect-product-area:PlatformStore @testing-infrastructure Feature: Event Store Type Contracts diff --git a/packages/platform-store/tests/steps/event-store-types.steps.ts b/packages/platform-store/tests/steps/event-store-types.steps.ts index 1e1d7b62..da28d94f 100644 --- a/packages/platform-store/tests/steps/event-store-types.steps.ts +++ b/packages/platform-store/tests/steps/event-store-types.steps.ts @@ -6,8 +6,6 @@ * This is a Layer 1 package (Convex component), but these tests focus on * type contracts which are pure TypeScript - no Convex runtime required. * - * @architect-event-sourcing - * @architect-pattern BddTestingInfrastructure */ import { loadFeature, describeFeature } from "@amiceli/vitest-cucumber"; import { expect } from "vitest"; diff --git a/packages/platform-store/tsconfig.json b/packages/platform-store/tsconfig.json index 341bf76a..483e56d2 100644 --- a/packages/platform-store/tsconfig.json +++ b/packages/platform-store/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../../tsconfig.base.json", + "extends": "../../tsconfig.base.json", "compilerOptions": { "composite": true, "rootDir": "src", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8de2b08a..c186e874 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -156,9 +156,9 @@ importers: '@edge-runtime/vm': specifier: 'catalog:' version: 5.0.0 - '@libar-dev/architect': - specifier: 1.0.0-pre.3 - version: 1.0.0-pre.3(typescript@6.0.3) + '@libar-dev/software-delivery-protocol': + specifier: file:../software-delivery-protocol + version: file:../software-delivery-protocol(vitest@4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -182,7 +182,7 @@ importers: version: 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) vitest: specifier: 'catalog:' - version: 4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)) + version: 4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) zod: specifier: 'catalog:' version: 4.3.6 @@ -236,7 +236,7 @@ importers: version: 1.166.11(@tanstack/query-core@5.99.2)(@tanstack/react-query@5.99.2(react@19.2.5))(@tanstack/react-router@1.168.23(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@tanstack/router-core@1.168.15)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@tanstack/react-start': specifier: 'catalog:' - version: 1.167.42(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)) + version: 1.167.42(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -279,13 +279,13 @@ importers: version: 5.2.5 '@ladle/react': specifier: ^5.1.1 - version: 5.1.1(@types/node@25.6.0)(@types/react@19.2.14)(jiti@2.6.1)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(tsx@4.21.0)(typescript@6.0.3) + version: 5.1.1(@types/node@25.6.0)(@types/react@19.2.14)(jiti@2.6.1)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.9.0) '@playwright/test': specifier: 'catalog:' version: 1.59.1 '@tailwindcss/vite': specifier: 'catalog:' - version: 4.2.4(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)) + version: 4.2.4(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) '@types/node': specifier: 'catalog:' version: 25.6.0 @@ -297,7 +297,7 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: 'catalog:' - version: 6.0.1(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)) + version: 6.0.1(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) playwright-bdd: specifier: 'catalog:' version: 8.5.0(@playwright/test@1.59.1) @@ -312,7 +312,7 @@ importers: version: 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) vite: specifier: 'catalog:' - version: 8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0) + version: 8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0) examples/order-management: dependencies: @@ -361,7 +361,7 @@ importers: devDependencies: '@amiceli/vitest-cucumber': specifier: 'catalog:' - version: 6.3.0(vitest@4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0))) + version: 6.3.0(vitest@4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) '@edge-runtime/vm': specifier: 'catalog:' version: 5.0.0 @@ -376,7 +376,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)) + version: 4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) packages/platform-bc: dependencies: @@ -386,13 +386,13 @@ importers: devDependencies: '@amiceli/vitest-cucumber': specifier: 'catalog:' - version: 6.3.0(vitest@4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0))) + version: 6.3.0(vitest@4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) typescript: specifier: 'catalog:' version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)) + version: 4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) zod: specifier: 'catalog:' version: 4.3.6 @@ -408,7 +408,7 @@ importers: devDependencies: '@amiceli/vitest-cucumber': specifier: 'catalog:' - version: 6.3.0(vitest@4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0))) + version: 6.3.0(vitest@4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) convex: specifier: 'catalog:' version: 1.36.0(react@19.2.5) @@ -417,7 +417,7 @@ importers: version: 0.1.115(@standard-schema/spec@1.1.0)(convex@1.36.0(react@19.2.5))(hono@4.11.7)(react@19.2.5)(typescript@6.0.3)(zod@4.3.6) vitest: specifier: 'catalog:' - version: 4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)) + version: 4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) zod: specifier: 'catalog:' version: 4.3.6 @@ -429,7 +429,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)) + version: 4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) packages/platform-core: dependencies: @@ -463,7 +463,7 @@ importers: devDependencies: '@amiceli/vitest-cucumber': specifier: 'catalog:' - version: 6.3.0(vitest@4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0))) + version: 6.3.0(vitest@4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) convex: specifier: 'catalog:' version: 1.36.0(react@19.2.5) @@ -472,7 +472,7 @@ importers: version: 0.1.115(@standard-schema/spec@1.1.0)(convex@1.36.0(react@19.2.5))(hono@4.11.7)(react@19.2.5)(typescript@6.0.3)(zod@4.3.6) vitest: specifier: 'catalog:' - version: 4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)) + version: 4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) zod: specifier: 'catalog:' version: 4.3.6 @@ -481,25 +481,25 @@ importers: devDependencies: '@amiceli/vitest-cucumber': specifier: 'catalog:' - version: 6.3.0(vitest@4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0))) + version: 6.3.0(vitest@4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) typescript: specifier: 'catalog:' version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)) + version: 4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) packages/platform-fsm: devDependencies: '@amiceli/vitest-cucumber': specifier: 'catalog:' - version: 6.3.0(vitest@4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0))) + version: 6.3.0(vitest@4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) typescript: specifier: 'catalog:' version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)) + version: 4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) packages/platform-store: dependencies: @@ -515,7 +515,7 @@ importers: devDependencies: '@amiceli/vitest-cucumber': specifier: 'catalog:' - version: 6.3.0(vitest@4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0))) + version: 6.3.0(vitest@4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))) convex: specifier: 'catalog:' version: 1.36.0(react@19.2.5) @@ -524,7 +524,7 @@ importers: version: 0.1.115(@standard-schema/spec@1.1.0)(convex@1.36.0(react@19.2.5))(hono@4.11.7)(react@19.2.5)(typescript@6.0.3)(zod@4.3.6) vitest: specifier: 'catalog:' - version: 4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)) + version: 4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) zod: specifier: 'catalog:' version: 4.3.6 @@ -794,15 +794,15 @@ packages: resolution: {integrity: sha512-3nmRbG1bUAZP3fAaUBNmqWO0z0OSkykZZotfLjyhc8KWwDSOrOmMJlBTd474lpA8EWh4JFLAX3iXgynBqBvKzw==} hasBin: true - '@cucumber/gherkin@29.0.0': - resolution: {integrity: sha512-6t3V7fFsLlyhLSj4FS+fPz22pPVcFhFZ3QOP7otFYmkhZ4g1ierj5pf7fxJWvEsI555hGatg+Iql6cqK93RFUg==} - '@cucumber/gherkin@31.0.0': resolution: {integrity: sha512-wlZfdPif7JpBWJdqvHk1Mkr21L5vl4EfxVUOS4JinWGf3FLRV6IKUekBv5bb5VX79fkDcfDvESzcQ8WQc07Wgw==} '@cucumber/gherkin@32.2.0': resolution: {integrity: sha512-X8xuVhSIqlUjxSRifRJ7t0TycVWyX58fygJH3wDNmHINLg9sYEkvQT0SO2G5YlRZnYc11TIFr4YPenscvdlBIw==} + '@cucumber/gherkin@42.0.1': + resolution: {integrity: sha512-Kqg0ULhWqbXp/a1c04ND4sS4KTlIL831tQ0NhZLXWdEhT6LiNsZ5LFRzy/lBy7QQpcKhroKp/i3C2WdEnRBKNg==} + '@cucumber/html-formatter@21.15.1': resolution: {integrity: sha512-tjxEpP161sQ7xc3VREc94v1ymwIckR3ySViy7lTvfi1jUpyqy2Hd/p4oE3YT1kQ9fFDvUflPwu5ugK5mA7BQLA==} peerDependencies: @@ -813,15 +813,15 @@ packages: peerDependencies: '@cucumber/messages': '*' - '@cucumber/messages@25.0.1': - resolution: {integrity: sha512-RjjhmzcauX5eYfcKns5pgenefDJQcfXE3ZDrVWdUDGcoaoyFVDmj+ZzQZWRWqFrfMjP3lKHJss6LtvIP/z+h8g==} - '@cucumber/messages@26.0.1': resolution: {integrity: sha512-DIxSg+ZGariumO+Lq6bn4kOUIUET83A4umrnWmidjGFl8XxkBieUZtsmNbLYgH/gnsmP07EfxxdTr0hOchV1Sg==} '@cucumber/messages@27.2.0': resolution: {integrity: sha512-f2o/HqKHgsqzFLdq6fAhfG1FNOQPdBdyMGpKwhb7hZqg0yZtx9BVqkTyuoNk83Fcvk3wjMVfouFXXHNEk4nddA==} + '@cucumber/messages@34.2.1': + resolution: {integrity: sha512-aj2iCAG9ZOpMVcMxcgShifv5fbR96b7SMgdWcPXXh2QbFp7OEcAnQ5MC5YfWUDSDasmw7FU5NJEsOrXdTQOU1A==} + '@cucumber/query@13.6.0': resolution: {integrity: sha512-tiDneuD5MoWsJ9VKPBmQok31mSX9Ybl+U4wqDoXeZgsXHDURqzM3rnpWVV3bC34y9W6vuFxrlwF/m7HdOxwqRw==} peerDependencies: @@ -1453,10 +1453,6 @@ packages: '@types/node': optional: true - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1487,10 +1483,15 @@ packages: react: '>=18.0.0' react-dom: '>=18.0.0' - '@libar-dev/architect@1.0.0-pre.3': - resolution: {integrity: sha512-TP/gq6dqrQrqr/0mE9D0x8SmKyZ1TZ5EyOk3jNpoFFKWxHY35BYEIgUM/NMYTjZJyNQb3G3k5HisTmQ/3c95sg==} - engines: {node: '>=18.0.0'} + '@libar-dev/software-delivery-protocol@file:../software-delivery-protocol': + resolution: {directory: ../software-delivery-protocol, type: directory} + engines: {node: '>=20'} hasBin: true + peerDependencies: + vitest: '>=2' + peerDependenciesMeta: + vitest: + optional: true '@mdx-js/mdx@3.1.1': resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} @@ -1584,10 +1585,6 @@ packages: '@oxc-project/types@0.126.0': resolution: {integrity: sha512-oGfVtjAgwQVVpfBrbtk4e1XDyWHRFta6BS3GWVzrF8xYBT2VGQAk39yJS/wFSMrZqoiCU4oghT3Ch0HaHGIHcQ==} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - '@playwright/test@1.59.1': resolution: {integrity: sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==} engines: {node: '>=18'} @@ -2155,6 +2152,9 @@ packages: '@ts-morph/common@0.28.1': resolution: {integrity: sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==} + '@ts-morph/common@0.29.0': + resolution: {integrity: sha512-35oUmphHbJvQ/+UTwFNme/t2p3FoKiGJ5auTjjpNTop2dyREspirjMy82PLSC1pnDJ8ah1GU98hwpVt64YXQsg==} + '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -2229,9 +2229,6 @@ packages: '@types/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} - '@types/uuid@9.0.8': - resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - '@types/validate-npm-package-name@4.0.2': resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} @@ -2467,9 +2464,6 @@ packages: bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - balanced-match@4.0.4: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} @@ -2496,9 +2490,6 @@ packages: resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} engines: {node: '>=18'} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - brace-expansion@5.0.5: resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} engines: {node: 18 || 20 || >=22} @@ -2592,10 +2583,6 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} - chokidar@5.0.0: - resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} - engines: {node: '>= 20.19.0'} - class-transformer@0.5.1: resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} @@ -2894,9 +2881,6 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - eciesjs@0.4.17: resolution: {integrity: sha512-TOOURki4G7sD1wDCjj7NfLaXZZ49dFOeEb5y39IXpb8p0hRzVvfvzZHOi5JcT+PpyAbi/Y+lxPb8eTag2WYH8w==} engines: {bun: '>=1', deno: '>=2', node: '>=16'} @@ -2913,9 +2897,6 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -3172,10 +3153,6 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} @@ -3263,11 +3240,6 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.5.0: - resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - hasBin: true - globby@14.1.0: resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} engines: {node: '>=18'} @@ -3536,9 +3508,6 @@ packages: resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} engines: {node: '>=16'} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -3711,9 +3680,6 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -3944,17 +3910,9 @@ packages: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -4075,9 +4033,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -4124,10 +4079,6 @@ packages: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -4288,10 +4239,6 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} - readdirp@5.0.0: - resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} - engines: {node: '>= 20.19.0'} - recast@0.23.11: resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} engines: {node: '>= 4'} @@ -4544,10 +4491,6 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - string-width@7.2.0: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} @@ -4670,6 +4613,9 @@ packages: ts-morph@27.0.2: resolution: {integrity: sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==} + ts-morph@28.0.0: + resolution: {integrity: sha512-Wp3tnZ2bzwxyTZMtgWVzXDfm7lB1Drz+y9DmmYH/L702PQhPyVrp3pkou3yIz4qjS14GY9kcpmLiOOMvl8oG1g==} + tsconfck@3.1.6: resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} @@ -4810,10 +4756,6 @@ packages: resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} hasBin: true - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - validate-npm-package-name@7.0.2: resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} engines: {node: ^20.17.0 || >=22.9.0} @@ -5021,10 +4963,6 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - wrap-ansi@9.0.2: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} @@ -5067,6 +5005,11 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -5125,13 +5068,13 @@ snapshots: dependencies: json-schema: 0.4.0 - '@amiceli/vitest-cucumber@6.3.0(vitest@4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)))': + '@amiceli/vitest-cucumber@6.3.0(vitest@4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: callsites: 4.2.0 minimist: 1.2.8 parsecurrency: 1.1.1 ts-morph: 27.0.2 - vitest: 4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)) + vitest: 4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) '@babel/code-frame@7.27.1': dependencies: @@ -5424,10 +5367,6 @@ snapshots: commander: 13.1.0 source-map-support: 0.5.21 - '@cucumber/gherkin@29.0.0': - dependencies: - '@cucumber/messages': 25.0.1 - '@cucumber/gherkin@31.0.0': dependencies: '@cucumber/messages': 26.0.1 @@ -5436,6 +5375,10 @@ snapshots: dependencies: '@cucumber/messages': 27.2.0 + '@cucumber/gherkin@42.0.1': + dependencies: + '@cucumber/messages': 34.2.1 + '@cucumber/html-formatter@21.15.1(@cucumber/messages@27.2.0)': dependencies: '@cucumber/messages': 27.2.0 @@ -5448,13 +5391,6 @@ snapshots: luxon: 3.7.2 xmlbuilder: 15.1.1 - '@cucumber/messages@25.0.1': - dependencies: - '@types/uuid': 9.0.8 - class-transformer: 0.5.1 - reflect-metadata: 0.2.2 - uuid: 9.0.1 - '@cucumber/messages@26.0.1': dependencies: '@types/uuid': 10.0.0 @@ -5469,6 +5405,8 @@ snapshots: reflect-metadata: 0.2.2 uuid: 11.0.5 + '@cucumber/messages@34.2.1': {} + '@cucumber/query@13.6.0(@cucumber/messages@27.2.0)': dependencies: '@cucumber/messages': 27.2.0 @@ -5855,15 +5793,6 @@ snapshots: optionalDependencies: '@types/node': 25.6.0 - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.2 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -5888,7 +5817,7 @@ snapshots: react: 19.2.5 react-dom: 19.2.5(react@19.2.5) - '@ladle/react@5.1.1(@types/node@25.6.0)(@types/react@19.2.14)(jiti@2.6.1)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(tsx@4.21.0)(typescript@6.0.3)': + '@ladle/react@5.1.1(@types/node@25.6.0)(@types/react@19.2.14)(jiti@2.6.1)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.9.0)': dependencies: '@babel/code-frame': 7.29.0 '@babel/core': 7.29.0 @@ -5900,8 +5829,8 @@ snapshots: '@ladle/react-context': 1.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@mdx-js/mdx': 3.1.1 '@mdx-js/react': 3.1.1(@types/react@19.2.14)(react@19.2.5) - '@vitejs/plugin-react': 4.7.0(vite@6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)) - '@vitejs/plugin-react-swc': 3.11.0(vite@6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)) + '@vitejs/plugin-react': 4.7.0(vite@6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) + '@vitejs/plugin-react-swc': 3.11.0(vite@6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) axe-core: 4.11.1 boxen: 8.0.1 chokidar: 4.0.3 @@ -5928,8 +5857,8 @@ snapshots: remark-gfm: 4.0.1 source-map: 0.7.6 vfile: 6.0.3 - vite: 6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0) - vite-tsconfig-paths: 5.1.4(typescript@6.0.3)(vite@6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)) + vite: 6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0) + vite-tsconfig-paths: 5.1.4(typescript@6.0.3)(vite@6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)) transitivePeerDependencies: - '@swc/helpers' - '@types/node' @@ -5947,19 +5876,14 @@ snapshots: - typescript - yaml - '@libar-dev/architect@1.0.0-pre.3(typescript@6.0.3)': + '@libar-dev/software-delivery-protocol@file:../software-delivery-protocol(vitest@4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)))': dependencies: - '@cucumber/gherkin': 29.0.0 - '@cucumber/messages': 25.0.1 - '@modelcontextprotocol/sdk': 1.28.0(zod@4.3.6) - '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) - chokidar: 5.0.0 - glob: 10.5.0 - zod: 4.3.6 - transitivePeerDependencies: - - '@cfworker/json-schema' - - supports-color - - typescript + '@cucumber/gherkin': 42.0.1 + '@cucumber/messages': 34.2.1 + ts-morph: 28.0.0 + yaml: 2.9.0 + optionalDependencies: + vitest: 4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) '@mdx-js/mdx@3.1.1': dependencies: @@ -6019,28 +5943,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@modelcontextprotocol/sdk@1.28.0(zod@4.3.6)': - dependencies: - '@hono/node-server': 1.19.9(hono@4.11.7) - ajv: 8.17.1 - ajv-formats: 3.0.1(ajv@8.17.1) - content-type: 1.0.5 - cors: 2.8.6 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - eventsource-parser: 3.0.6 - express: 5.2.1 - express-rate-limit: 8.2.1(express@5.2.1) - hono: 4.11.7 - jose: 6.1.3 - json-schema-typed: 8.0.2 - pkce-challenge: 5.0.1 - raw-body: 3.0.2 - zod: 4.3.6 - zod-to-json-schema: 3.25.1(zod@4.3.6) - transitivePeerDependencies: - - supports-color - '@mswjs/interceptors@0.41.2': dependencies: '@open-draft/deferred-promise': 2.2.0 @@ -6112,9 +6014,6 @@ snapshots: '@oxc-project/types@0.126.0': {} - '@pkgjs/parseargs@0.11.0': - optional: true - '@playwright/test@1.59.1': dependencies: playwright: 1.59.1 @@ -6372,12 +6271,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.2.4 '@tailwindcss/oxide-win32-x64-msvc': 4.2.4 - '@tailwindcss/vite@4.2.4(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0))': + '@tailwindcss/vite@4.2.4(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.2.4 '@tailwindcss/oxide': 4.2.4 tailwindcss: 4.2.4 - vite: 8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0) + vite: 8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0) '@tanstack/history@1.161.6': {} @@ -6416,7 +6315,7 @@ snapshots: react: 19.2.5 react-dom: 19.2.5(react@19.2.5) - '@tanstack/react-start-rsc@0.0.21(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0))': + '@tanstack/react-start-rsc@0.0.21(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@tanstack/react-router': 1.168.23(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@tanstack/react-start-server': 1.166.41(react-dom@19.2.5(react@19.2.5))(react@19.2.5) @@ -6424,7 +6323,7 @@ snapshots: '@tanstack/router-utils': 1.161.6 '@tanstack/start-client-core': 1.167.17 '@tanstack/start-fn-stubs': 1.161.6 - '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)) + '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/start-server-core': 1.167.19 '@tanstack/start-storage-context': 1.166.29 pathe: 2.0.3 @@ -6450,20 +6349,20 @@ snapshots: transitivePeerDependencies: - crossws - '@tanstack/react-start@1.167.42(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0))': + '@tanstack/react-start@1.167.42(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@tanstack/react-router': 1.168.23(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@tanstack/react-start-client': 1.166.40(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@tanstack/react-start-rsc': 0.0.21(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)) + '@tanstack/react-start-rsc': 0.0.21(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/react-start-server': 1.166.41(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@tanstack/router-utils': 1.161.6 '@tanstack/start-client-core': 1.167.17 - '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)) + '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/start-server-core': 1.167.19 pathe: 2.0.3 react: 19.2.5 react-dom: 19.2.5(react@19.2.5) - vite: 8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0) + vite: 8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - '@rsbuild/core' - crossws @@ -6498,7 +6397,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.167.22(@tanstack/react-router@1.168.23(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0))': + '@tanstack/router-plugin@1.167.22(@tanstack/react-router@1.168.23(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) @@ -6515,7 +6414,7 @@ snapshots: zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.168.23(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - vite: 8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0) + vite: 8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -6547,7 +6446,7 @@ snapshots: '@tanstack/start-fn-stubs@1.161.6': {} - '@tanstack/start-plugin-core@1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0))': + '@tanstack/start-plugin-core@1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.0 @@ -6555,7 +6454,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.40 '@tanstack/router-core': 1.168.15 '@tanstack/router-generator': 1.166.32 - '@tanstack/router-plugin': 1.167.22(@tanstack/react-router@1.168.23(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)) + '@tanstack/router-plugin': 1.167.22(@tanstack/react-router@1.168.23(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/router-utils': 1.161.6 '@tanstack/start-client-core': 1.167.17 '@tanstack/start-server-core': 1.167.19 @@ -6568,8 +6467,8 @@ snapshots: srvx: 0.11.15 tinyglobby: 0.2.15 ufo: 1.6.3 - vite: 8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0) - vitefu: 1.1.1(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)) + vite: 8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0) + vitefu: 1.1.1(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) xmlbuilder2: 4.0.3 zod: 3.25.76 transitivePeerDependencies: @@ -6613,6 +6512,12 @@ snapshots: path-browserify: 1.0.1 tinyglobby: 0.2.16 + '@ts-morph/common@0.29.0': + dependencies: + minimatch: 10.2.5 + path-browserify: 1.0.1 + tinyglobby: 0.2.16 + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 @@ -6694,8 +6599,6 @@ snapshots: '@types/uuid@10.0.0': {} - '@types/uuid@9.0.8': {} - '@types/validate-npm-package-name@4.0.2': {} '@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)': @@ -6809,15 +6712,15 @@ snapshots: '@vercel/oidc@3.2.0': {} - '@vitejs/plugin-react-swc@3.11.0(vite@6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0))': + '@vitejs/plugin-react-swc@3.11.0(vite@6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.27 '@swc/core': 1.15.11 - vite: 6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0) + vite: 6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0))': + '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -6825,14 +6728,14 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0) + vite: 6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@6.0.1(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0))': + '@vitejs/plugin-react@6.0.1(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.7 - vite: 8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0) + vite: 8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0) '@vitest/expect@4.1.5': dependencies: @@ -6843,14 +6746,14 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.5(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0))': + '@vitest/mocker@4.1.5(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.5 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.12.8(@types/node@25.6.0)(typescript@6.0.3) - vite: 8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0) + vite: 8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0) '@vitest/pretty-format@4.1.5': dependencies: @@ -6972,8 +6875,6 @@ snapshots: bail@2.0.2: {} - balanced-match@1.0.2: {} - balanced-match@4.0.4: {} baseline-browser-mapping@2.9.19: {} @@ -7009,10 +6910,6 @@ snapshots: widest-line: 5.0.0 wrap-ansi: 9.0.2 - brace-expansion@2.0.2: - dependencies: - balanced-match: 1.0.2 - brace-expansion@5.0.5: dependencies: balanced-match: 4.0.4 @@ -7118,10 +7015,6 @@ snapshots: dependencies: readdirp: 4.1.2 - chokidar@5.0.0: - dependencies: - readdirp: 5.0.0 - class-transformer@0.5.1: {} class-variance-authority@0.7.1: @@ -7344,8 +7237,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - eastasianwidth@0.2.0: {} - eciesjs@0.4.17: dependencies: '@ecies/ciphers': 0.2.5(@noble/ciphers@1.3.0) @@ -7361,8 +7252,6 @@ snapshots: emoji-regex@8.0.0: {} - emoji-regex@9.2.2: {} - encodeurl@1.0.2: {} encodeurl@2.0.0: {} @@ -7758,11 +7647,6 @@ snapshots: flatted@3.3.3: {} - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 @@ -7838,15 +7722,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.5.0: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - globby@14.1.0: dependencies: '@sindresorhus/merge-streams': 2.3.0 @@ -8162,12 +8037,6 @@ snapshots: isexe@3.1.1: {} - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - jiti@2.6.1: {} jose@6.1.3: {} @@ -8324,8 +8193,6 @@ snapshots: dependencies: js-tokens: 4.0.0 - lru-cache@10.4.3: {} - lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -8808,14 +8675,8 @@ snapshots: dependencies: brace-expansion: 5.0.5 - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.2 - minimist@1.2.8: {} - minipass@7.1.2: {} - ms@2.1.3: {} msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3): @@ -8951,8 +8812,6 @@ snapshots: dependencies: p-limit: 3.1.0 - package-json-from-dist@1.0.1: {} - parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -9001,11 +8860,6 @@ snapshots: path-key@4.0.0: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - path-to-regexp@6.3.0: {} path-to-regexp@8.3.0: {} @@ -9150,8 +9004,6 @@ snapshots: readdirp@4.1.2: {} - readdirp@5.0.0: {} - recast@0.23.11: dependencies: ast-types: 0.16.1 @@ -9525,12 +9377,6 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.2 - string-width@7.2.0: dependencies: emoji-regex: 10.6.0 @@ -9640,6 +9486,11 @@ snapshots: '@ts-morph/common': 0.28.1 code-block-writer: 13.0.3 + ts-morph@28.0.0: + dependencies: + '@ts-morph/common': 0.29.0 + code-block-writer: 13.0.3 + tsconfck@3.1.6(typescript@6.0.3): optionalDependencies: typescript: 6.0.3 @@ -9777,8 +9628,6 @@ snapshots: uuid@14.0.0: {} - uuid@9.0.1: {} - validate-npm-package-name@7.0.2: {} vary@1.1.2: {} @@ -9798,18 +9647,18 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-tsconfig-paths@5.1.4(typescript@6.0.3)(vite@6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)): + vite-tsconfig-paths@5.1.4(typescript@6.0.3)(vite@6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@6.0.3) optionalDependencies: - vite: 6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0) + vite: 6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color - typescript - vite@6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0): + vite@6.4.1(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.9.0): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -9823,8 +9672,9 @@ snapshots: jiti: 2.6.1 lightningcss: 1.32.0 tsx: 4.21.0 + yaml: 2.9.0 - vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0): + vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -9837,15 +9687,16 @@ snapshots: fsevents: 2.3.3 jiti: 2.6.1 tsx: 4.21.0 + yaml: 2.9.0 - vitefu@1.1.1(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)): + vitefu@1.1.1(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)): optionalDependencies: - vite: 8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0) + vite: 8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0) - vitest@4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)): + vitest@4.1.5(@edge-runtime/vm@5.0.0)(@opentelemetry/api@1.9.0)(@types/node@25.6.0)(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)) + '@vitest/mocker': 4.1.5(msw@2.12.8(@types/node@25.6.0)(typescript@6.0.3))(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.5 '@vitest/runner': 4.1.5 '@vitest/snapshot': 4.1.5 @@ -9862,7 +9713,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0) + vite: 8.0.9(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@edge-runtime/vm': 5.0.0 @@ -9914,12 +9765,6 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.3 - string-width: 5.1.2 - strip-ansi: 7.1.2 - wrap-ansi@9.0.2: dependencies: ansi-styles: 6.2.3 @@ -9952,6 +9797,8 @@ snapshots: yallist@3.1.1: {} + yaml@2.9.0: {} + yargs-parser@21.1.1: {} yargs@17.7.2: @@ -9976,10 +9823,6 @@ snapshots: dependencies: zod: 3.25.76 - zod-to-json-schema@3.25.1(zod@4.3.6): - dependencies: - zod: 4.3.6 - zod@3.25.76: {} zod@4.3.6: {} diff --git a/scripts/generate-dcb-docs.ts b/scripts/generate-dcb-docs.ts index 05535721..18b96758 100644 --- a/scripts/generate-dcb-docs.ts +++ b/scripts/generate-dcb-docs.ts @@ -1,89 +1,17 @@ #!/usr/bin/env npx tsx /** - * POC: Generate DCB API Reference Documentation + * Retired: DCB API reference generation via architect-generate. * - * Demonstrates code-first documentation generation using architect's built-in - * `doc-from-decision` generator. Extracts TypeScript types from annotated source files - * and generates both compact (for Claude context) and detailed (for humans) output. + * The architect docs-living / doc-from-decision workflow is no longer on the delivery path. + * Author and bind DCB intent under specs/ (see spec:platform.dcb-api-reference and related + * pattern Specs) and use SDP projections instead: * - * Usage: npx tsx scripts/generate-dcb-docs.ts - * - * Output: - * - docs-generated/_claude-md/platform/dcb-api-reference.md (compact) - * - docs-generated/docs/DCB-API-REFERENCE.md (detailed) + * pnpm sdp:build + * pnpm sdp:validate + * pnpm sdp:view */ -import { execSync } from "node:child_process"; -import * as path from "node:path"; -import * as fs from "node:fs"; - -const ROOT_DIR = path.resolve(import.meta.dirname, ".."); -const OUTPUT_DIR = path.join(ROOT_DIR, "docs-generated"); - -console.log("=".repeat(60)); -console.log("POC: DCB API Reference - Code-First Documentation"); -console.log("=".repeat(60)); -console.log(); - -// Ensure output directory exists -if (!fs.existsSync(OUTPUT_DIR)) { - fs.mkdirSync(OUTPUT_DIR, { recursive: true }); - console.log(`Created output directory: ${OUTPUT_DIR}`); -} - -// Use architect-generate with the built-in doc-from-decision generator. -const cmd = [ - "pnpm exec architect-generate", - "-g doc-from-decision", - "-i 'packages/platform-core/src/dcb/**/*.ts'", // TypeScript sources for shape extraction - "--features 'specs/platform/generated-docs/*.feature'", - `-o docs-generated`, - "-f", // force overwrite -].join(" "); - -console.log(`Running: ${cmd}`); -console.log(); - -try { - execSync(cmd, { - cwd: ROOT_DIR, - stdio: "inherit", - }); - - console.log(); - console.log("=".repeat(60)); - console.log("POC Complete!"); - console.log("=".repeat(60)); - console.log(); - - // List generated files - const listFiles = (dir: string, prefix = "") => { - if (!fs.existsSync(dir)) return; - const entries = fs.readdirSync(dir, { withFileTypes: true }); - for (const entry of entries) { - const fullPath = path.join(dir, entry.name); - if (entry.isDirectory()) { - console.log(`${prefix}${entry.name}/`); - listFiles(fullPath, prefix + " "); - } else { - const stats = fs.statSync(fullPath); - console.log(`${prefix}${entry.name} (${stats.size} bytes)`); - } - } - }; - - console.log("Generated files:"); - listFiles(OUTPUT_DIR); - console.log(); -} catch (error) { - console.error("Generation failed:"); - if (error instanceof Error) { - console.error(error.message); - if ("stderr" in error && error.stderr) { - console.error("stderr:", String(error.stderr)); - } - } else { - console.error(error); - } - process.exit(1); -} +console.error( + "generate-dcb-docs.ts is retired with @libar-dev/architect. Use pnpm sdp:build / sdp:validate / sdp:view.", +); +process.exit(1); diff --git a/scripts/migrate-architect-corpus.mjs b/scripts/migrate-architect-corpus.mjs new file mode 100644 index 00000000..a12c4159 --- /dev/null +++ b/scripts/migrate-architect-corpus.mjs @@ -0,0 +1,317 @@ +#!/usr/bin/env node +/** + * Migrate architect/*.feature carriers into SDP Markdown Specs/Packs under specs/. + * Distills Feature title + problem/solution into Intent; does not dump full Gherkin. + * + * Usage: node scripts/migrate-architect-corpus.mjs [--dry-run] + */ +import fs from "node:fs"; +import path from "node:path"; + +const ROOT = path.resolve(import.meta.dirname, ".."); +const DRY_RUN = process.argv.includes("--dry-run"); +const ARCHITECT = path.join(ROOT, "architect"); + +/** @param {string} name */ +function toKebab(name) { + return name + .replace(/([a-z0-9])([A-Z])/g, "$1-$2") + .replace(/([A-Z]+)([A-Z][a-z])/g, "$1-$2") + .replace(/([A-Za-z])(\d)/g, "$1-$2") + .replace(/(\d)([A-Za-z])/g, "$1-$2") + .toLowerCase() + .replace(/[^a-z0-9]+/g, "-") + .replace(/^-+|-+$/g, ""); +} + +/** + * @param {string} content + */ +function parseFeature(content) { + const lines = content.split("\n"); + /** @type {Record} */ + const tags = {}; + let title = ""; + const prose = []; + + for (const line of lines) { + const trimmed = line.trim(); + if (trimmed.startsWith("@architect")) { + const body = trimmed.slice(1); // drop @ + const colon = body.indexOf(":"); + if (colon === -1) { + tags[body] = "true"; + } else { + tags[body.slice(0, colon)] = body.slice(colon + 1).trim(); + } + continue; + } + if (trimmed.startsWith("Feature:")) { + title = trimmed.slice("Feature:".length).trim(); + continue; + } + if (/^(Background:|Rule:|Scenario:|Scenario Outline:|Example:)/.test(trimmed)) { + break; + } + if (title) prose.push(line); + } + + const proseText = prose.join("\n").trim(); + const problem = extractSection(proseText, "Problem"); + const solution = extractSection(proseText, "Solution"); + return { tags, title, problem, solution, proseText }; +} + +/** + * @param {string} text + * @param {string} heading + */ +function extractSection(text, heading) { + const re = new RegExp( + `\\*\\*${heading}:?\\*\\*\\s*([\\s\\S]*?)(?=\\n\\s*\\*\\*[A-Z][^*]+\\*\\*|$)`, + "i", + ); + const m = text.match(re); + if (!m) return ""; + return m[1] + .split("\n") + .map((l) => l.replace(/^\s*-\s*/, "").trim()) + .filter(Boolean) + .join(" ") + .replace(/\s+/g, " ") + .trim() + .slice(0, 400); +} + +/** + * @param {string} filePath + * @param {"platform"|"decisions"|"releases"|"example-app"|"specs"} family + */ +function migrateFile(filePath, family) { + const content = fs.readFileSync(filePath, "utf8"); + const { tags, title, problem, solution } = parseFeature(content); + const base = path.basename(filePath, ".feature"); + const pattern = tags["architect-pattern"] || tags["architect-implements"]; + + let id; + let kind; + let altitude = "feature"; + let outDir; + let fileStem; + + if (family === "decisions") { + id = `spec:decisions.${toKebab(base)}`; + kind = "decision"; + altitude = "feature"; + outDir = path.join(ROOT, "specs", "decisions"); + fileStem = toKebab(base); + } else if (family === "releases") { + id = `spec:releases.${toKebab(base)}`; + kind = "behavior"; + altitude = "epic"; + outDir = path.join(ROOT, "specs", "releases"); + fileStem = toKebab(base); + } else if (family === "example-app") { + const stem = pattern ? toKebab(pattern) : toKebab(base); + id = `spec:example-app.${stem}`; + kind = "behavior"; + outDir = path.join(ROOT, "specs", "example-app"); + fileStem = stem; + } else { + const stem = pattern ? toKebab(pattern) : toKebab(base); + id = `spec:platform.${stem}`; + kind = stem.includes("architecture") || stem.includes("package") ? "model" : "behavior"; + outDir = path.join(ROOT, "specs", "platform"); + fileStem = stem; + } + + const outcome = + (problem && `Address: ${problem}`) || + (solution && `Deliver: ${solution}`) || + `Capture former architect intent for ${title || base}.`; + + const status = tags["architect-status"]; + const readiness = + status === "completed" || status === "active" ? "scoped" : "idea"; + + const body = `--- +id: ${id} +kind: ${kind} +altitude: ${altitude} +readiness: ${readiness} +relations: {} +--- +# ${title || base} + +## Intent + +- outcome: ${outcome.slice(0, 500)} +${ + solution + ? ` +## Design + +${solution} +` + : "" +}${ + kind === "decision" + ? ` +## Decision + +- ruling: Migrated from architect decision carrier \`${path.relative(ROOT, filePath)}\`; see Intent for the durable outcome. +` + : "" +}`; + + const outPath = path.join(outDir, `${fileStem}.sdp.md`); + return { id, outPath, body, title: title || base }; +} + +/** @type {{ id: string, outPath: string, body: string, title: string }[]} */ +const migrated = []; + +function migrateGlob(dir, family) { + if (!fs.existsSync(dir)) return; + for (const name of fs.readdirSync(dir)) { + if (!name.endsWith(".feature")) continue; + migrated.push(migrateFile(path.join(dir, name), family)); + } +} + +migrateGlob(path.join(ARCHITECT, "specs", "platform"), "platform"); +migrateGlob(path.join(ARCHITECT, "specs", "example-app"), "example-app"); +migrateGlob(path.join(ARCHITECT, "decisions"), "decisions"); +migrateGlob(path.join(ARCHITECT, "releases"), "releases"); + +// Top-level architect/specs/*.feature (not in platform/ or example-app/) +for (const name of fs.readdirSync(path.join(ARCHITECT, "specs"))) { + if (!name.endsWith(".feature")) continue; + migrated.push( + migrateFile(path.join(ARCHITECT, "specs", name), "platform"), + ); +} + +// DCB API reference formerly under specs/platform/generated-docs +const dcbFeature = path.join( + ROOT, + "specs", + "platform", + "generated-docs", + "dcb-api-reference.feature", +); +if (fs.existsSync(dcbFeature)) { + migrated.push(migrateFile(dcbFeature, "platform")); +} + +const byFamily = { + platform: migrated.filter((m) => m.id.startsWith("spec:platform.")), + decisions: migrated.filter((m) => m.id.startsWith("spec:decisions.")), + releases: migrated.filter((m) => m.id.startsWith("spec:releases.")), + "example-app": migrated.filter((m) => m.id.startsWith("spec:example-app.")), +}; + +if (!DRY_RUN) { + for (const item of migrated) { + fs.mkdirSync(path.dirname(item.outPath), { recursive: true }); + // Prefer richer existing Spec if already present with same path; overwrite for migration freshness. + fs.writeFileSync(item.outPath, item.body); + } + + // Remove foreign bare-.feature carrier so it is not confused with SDP. + if (fs.existsSync(dcbFeature)) { + fs.unlinkSync(dcbFeature); + const genDocsDir = path.dirname(dcbFeature); + if (fs.existsSync(genDocsDir) && fs.readdirSync(genDocsDir).length === 0) { + fs.rmdirSync(genDocsDir); + } + } + + writePack( + path.join(ROOT, "specs", "platform.pack.sdp.md"), + "pack:platform", + "Platform", + "Platform delivery Specs migrated from the former architect corpus.", + byFamily.platform.map((m) => m.id), + ); + writePack( + path.join(ROOT, "specs", "decisions.pack.sdp.md"), + "pack:decisions", + "Decisions", + "Decision Specs migrated from architect/decisions.", + byFamily.decisions.map((m) => m.id), + ); + writePack( + path.join(ROOT, "specs", "releases.pack.sdp.md"), + "pack:releases", + "Releases", + "Release Specs migrated from architect/releases.", + byFamily.releases.map((m) => m.id), + ); + if (byFamily["example-app"].length > 0) { + writePack( + path.join(ROOT, "specs", "example-app.pack.sdp.md"), + "pack:example-app", + "Example app", + "Example-app Specs migrated from architect/specs/example-app.", + byFamily["example-app"].map((m) => m.id), + ); + } + + const readme = `# SDP corpus (libar-platform) + +Designated delivery corpus root for Libar Software Delivery Protocol: repository root \`.\\` +with carriers under \`specs/\`. Historical \`architect/\` Gherkin is retained as lineage only and +is excluded from \`sdp\` discovery. + +## Commands + +\`\`\`sh +pnpm sdp:build # extract graph + contracts +pnpm sdp:validate # conformance + honesty checks +pnpm sdp:view # Design Review projection +pnpm sdp:q 'return g.specs().map((s) => s.id)' +\`\`\` + +Excludes (wired in package scripts): \`docs-living\`, \`docs-generated\`, \`architect\`, \`docs\`. +\`node_modules\`, \`dist\`, and \`generated\` are skipped by Protocol discovery automatically. +`; + fs.writeFileSync(path.join(ROOT, "specs", "README.md"), readme); +} + +/** + * @param {string} outPath + * @param {string} id + * @param {string} title + * @param {string} framing + * @param {string[]} specIds + */ +function writePack(outPath, id, title, framing, specIds) { + const unique = [...new Set(specIds)].sort(); + const body = `--- +id: ${id} +specs: +${unique.map((s) => ` - ${s}`).join("\n")} +--- +# ${title} + +${framing} +`; + fs.writeFileSync(outPath, body); +} + +console.log( + JSON.stringify( + { + dryRun: DRY_RUN, + migrated: migrated.length, + packs: ["pack:platform", "pack:decisions", "pack:releases", "pack:example-app"], + byFamily: Object.fromEntries( + Object.entries(byFamily).map(([k, v]) => [k, v.length]), + ), + ids: migrated.map((m) => m.id).sort(), + }, + null, + 2, + ), +); diff --git a/scripts/migrate-architect-tags.mjs b/scripts/migrate-architect-tags.mjs new file mode 100644 index 00000000..a26e8d3e --- /dev/null +++ b/scripts/migrate-architect-tags.mjs @@ -0,0 +1,278 @@ +#!/usr/bin/env node +/** + * Strip retired @architect / @architect-* annotation tags from the live delivery + * surface, ensure idea-rung Specs exist for each discovered pattern, and emit one + * SDP codeAnchor binding module (unique IDs) for the migrated surface. + * + * Usage: node scripts/migrate-architect-tags.mjs [--dry-run] + */ +import fs from "node:fs"; +import path from "node:path"; + +const ROOT = path.resolve(import.meta.dirname, ".."); +const DRY_RUN = process.argv.includes("--dry-run"); + +const SKIP_DIR_NAMES = new Set([ + "node_modules", + "dist", + "generated", + "coverage", + "docs-living", + "docs-generated", + "architect", + ".git", +]); + +const SOURCE_SUFFIXES = new Set([".ts", ".tsx", ".feature", ".feature.md", ".md"]); + +/** @param {string} name */ +function toKebab(name) { + return name + .replace(/([a-z0-9])([A-Z])/g, "$1-$2") + .replace(/([A-Z]+)([A-Z][a-z])/g, "$1-$2") + .replace(/([A-Za-z])(\d)/g, "$1-$2") + .replace(/(\d)([A-Za-z])/g, "$1-$2") + .toLowerCase() + .replace(/[^a-z0-9]+/g, "-") + .replace(/^-+|-+$/g, ""); +} + +/** @param {string} pattern */ +function patternToSpecId(pattern) { + return `spec:platform.${toKebab(pattern)}`; +} + +/** @param {string} pattern */ +function patternToAnchorId(pattern) { + return `impl:platform.${toKebab(pattern)}`; +} + +/** @param {string} pattern */ +function camelFromPattern(pattern) { + const kebab = toKebab(pattern); + const parts = kebab.split("-"); + return ( + parts[0] + + parts + .slice(1) + .map((p) => p.charAt(0).toUpperCase() + p.slice(1)) + .join("") + ); +} + +/** + * @param {string} dir + * @param {(filePath: string) => void} visit + */ +function walk(dir, visit) { + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + if (entry.name.startsWith(".")) continue; + const full = path.join(dir, entry.name); + if (entry.isDirectory()) { + if (SKIP_DIR_NAMES.has(entry.name)) continue; + walk(full, visit); + continue; + } + if (!entry.isFile()) continue; + const ext = entry.name.endsWith(".feature.md") + ? ".feature.md" + : path.extname(entry.name); + if (!SOURCE_SUFFIXES.has(ext)) continue; + // Do not rewrite our own generated SDP carriers or this script's outputs mid-pass. + if (entry.name.endsWith(".sdp.md") || entry.name.endsWith(".pack.sdp.md")) continue; + if (entry.name === "sdp-bindings.ts") continue; + visit(full); + } +} + +/** + * @param {string} content + */ +function stripArchitectTags(content) { + const lines = content.split("\n"); + const out = []; + let removed = 0; + + for (const line of lines) { + if (/^\s*\*\s*@architect(?:-[\w-]+)?(?:\s|$|:)/.test(line)) { + removed++; + continue; + } + if (/^@architect(?:-[\w-]+)?(?:$|[\s:])/.test(line.trim())) { + removed++; + continue; + } + out.push(line); + } + + let text = out.join("\n"); + text = text.replace(/\/\*\*\s*\n(?:\s*\*\s*\n)*\s*\*\//g, ""); + text = text.replace(/\/\*\*\n(\s*\*\s*\n)+/g, "/**\n"); + return { text, removed }; +} + +/** + * Only JSDoc / feature-tag lines; require PascalCase pattern tokens (reject prose hits). + * @param {string} content + */ +function extractBindingPatterns(content) { + const patterns = []; + const lineRe = + /^\s*(?:\*\s*)?@architect-(?:pattern|implements)[:\s]+([A-Z][A-Za-z0-9]*)\b/; + for (const line of content.split("\n")) { + const m = line.match(lineRe); + if (m) patterns.push(m[1]); + } + return patterns; +} + +/** + * @param {string} pattern + */ +function ensurePatternSpec(pattern) { + const kebab = toKebab(pattern); + const specDir = path.join(ROOT, "specs", "platform", "patterns"); + const specPath = path.join(specDir, `${kebab}.sdp.md`); + const id = patternToSpecId(pattern); + if (fs.existsSync(specPath)) return { specPath, created: false, id }; + + // Also skip if another family already carries this id (corpus migration may have authored it). + const existing = findSpecById(id); + if (existing) return { specPath: existing, created: false, id }; + + const content = `--- +id: ${id} +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# ${pattern} + +## Intent + +- outcome: Preserve the former architect pattern "${pattern}" as an SDP Spec for delivery binding. +`; + + if (!DRY_RUN) { + fs.mkdirSync(specDir, { recursive: true }); + fs.writeFileSync(specPath, content); + } + return { specPath, created: true, id }; +} + +/** @param {string} id */ +function findSpecById(id) { + const specsRoot = path.join(ROOT, "specs"); + if (!fs.existsSync(specsRoot)) return null; + /** @type {string[]} */ + const found = []; + walkMarkdown(specsRoot, (filePath) => { + const text = fs.readFileSync(filePath, "utf8"); + if (text.includes(`id: ${id}`)) found.push(filePath); + }); + return found[0] ?? null; +} + +/** + * @param {string} dir + * @param {(filePath: string) => void} visit + */ +function walkMarkdown(dir, visit) { + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + if (entry.name.startsWith(".")) continue; + const full = path.join(dir, entry.name); + if (entry.isDirectory()) { + if (SKIP_DIR_NAMES.has(entry.name)) continue; + walkMarkdown(full, visit); + continue; + } + if (entry.name.endsWith(".sdp.md")) visit(full); + } +} + +const stats = { + scanned: 0, + strippedFiles: 0, + tagsRemoved: 0, + specsCreated: 0, + patterns: new Set(), +}; + +const scanRoots = [ + path.join(ROOT, "packages"), + path.join(ROOT, "examples"), + path.join(ROOT, "apps"), + path.join(ROOT, "specs"), + path.join(ROOT, "scripts"), +]; + +for (const root of scanRoots) { + if (!fs.existsSync(root)) continue; + walk(root, (filePath) => { + stats.scanned++; + const original = fs.readFileSync(filePath, "utf8"); + if (!original.includes("@architect")) return; + + for (const p of extractBindingPatterns(original)) { + stats.patterns.add(p); + } + + const { text, removed } = stripArchitectTags(original); + if (removed === 0) return; + + stats.strippedFiles++; + stats.tagsRemoved += removed; + if (!DRY_RUN && text !== original) { + fs.writeFileSync(filePath, text); + } + }); +} + +const sortedPatterns = [...stats.patterns].sort(); +for (const pattern of sortedPatterns) { + const result = ensurePatternSpec(pattern); + if (result.created) stats.specsCreated++; +} + +const bindingsPath = path.join(ROOT, "specs", "platform", "sdp-bindings.ts"); +const bindingsBody = + `import { codeAnchor, codeAnchorId, ref } from "@libar-dev/software-delivery-protocol";\n\n` + + `/**\n` + + ` * SDP identity bindings for the migrated platform delivery surface.\n` + + ` * One anchor per former architect pattern / implements target.\n` + + ` */\n\n` + + sortedPatterns + .map((pattern) => { + const exportName = `${camelFromPattern(pattern)}Anchor`; + return ( + `export const ${exportName} = codeAnchor({\n` + + ` id: codeAnchorId("${patternToAnchorId(pattern)}"),\n` + + ` label: ${JSON.stringify(pattern)},\n` + + ` satisfies: ref("${patternToSpecId(pattern)}"),\n` + + `});\n` + ); + }) + .join("\n"); + +if (!DRY_RUN) { + fs.mkdirSync(path.dirname(bindingsPath), { recursive: true }); + fs.writeFileSync(bindingsPath, bindingsBody); +} + +console.log( + JSON.stringify( + { + dryRun: DRY_RUN, + scanned: stats.scanned, + strippedFiles: stats.strippedFiles, + tagsRemoved: stats.tagsRemoved, + specsCreated: stats.specsCreated, + bindingsPath: path.relative(ROOT, bindingsPath), + uniquePatterns: sortedPatterns.length, + patterns: sortedPatterns, + }, + null, + 2, + ), +); diff --git a/specs/README.md b/specs/README.md new file mode 100644 index 00000000..c30a350e --- /dev/null +++ b/specs/README.md @@ -0,0 +1,31 @@ +# Libar Platform — SDP corpus + +Designated **corpus root** for Libar Software Delivery Protocol (SDP) Specs and Packs: + +`specs/` (run from the libar-platform repo root via `pnpm sdp:*`) + +Carriers are Markdown: Specs as `*.sdp.md`, Packs as `*.pack.sdp.md`. Identity bindings live in +`platform/sdp-bindings.ts`. This tree replaces the former `architect/` Gherkin intent surface for +SDP extraction and validation. The `architect/` tree may still exist as lineage; bare `.feature` +files are not SDP carriers. + +## Packs + +| Pack ID | Path | Contents | +|---|---|---| +| `pack:platform` | `platform.pack.sdp.md` | Platform Specs including code-originated patterns | +| `pack:platform-patterns` | `platform-patterns.pack.sdp.md` | Pattern Specs from former architect bindings | +| `pack:decisions` | `decisions.pack.sdp.md` | Migrated PDRs | +| `pack:releases` | `releases.pack.sdp.md` | Release-boundary Specs | + +## Commands + +```bash +pnpm sdp:build +pnpm sdp:validate +pnpm sdp:view +pnpm sdp:q 'return g.specs().map((s) => s.id)' +``` + +`sdp build` must exit 0 with a non-empty Specs/Packs/anchors summary. Re-measure findings with +`sdp validate`; do not quote stale counts from this README. diff --git a/specs/codec-driven-reference-generation.sdp.md b/specs/codec-driven-reference-generation.sdp.md new file mode 100644 index 00000000..033ec3f2 --- /dev/null +++ b/specs/codec-driven-reference-generation.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.codec-driven-reference-generation +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# Codec-driven reference generation + +## Intent + +- outcome: Generate API/reference docs from codecs and source annotations so documentation tracks the live contract. diff --git a/specs/decisions.pack.sdp.md b/specs/decisions.pack.sdp.md new file mode 100644 index 00000000..ddbb254c --- /dev/null +++ b/specs/decisions.pack.sdp.md @@ -0,0 +1,30 @@ +--- +id: pack:decisions +specs: + - spec:decisions.pdr-001-process-decisions-folder + - spec:decisions.pdr-002-release-management-architecture + - spec:decisions.pdr-003-behavior-feature-file-structure + - spec:decisions.pdr-004-unified-tag-prefix-architecture + - spec:decisions.pdr-005-mvp-workflow + - spec:decisions.pdr-006-typescript-sourced-taxonomy + - spec:decisions.pdr-007-two-tier-spec-architecture + - spec:decisions.pdr-008-example-app-purpose + - spec:decisions.pdr-009-design-session-methodology + - spec:decisions.pdr-010-cross-component-argument-injection + - spec:decisions.pdr-011-agent-action-handler-architecture + - spec:decisions.pdr-012-agent-command-routing + - spec:decisions.pdr-013-agent-lifecycle-fsm + - spec:decisions.pdr-014-component-boundary-authentication-convention + - spec:decisions.pdr-015-global-position-numeric-representation + - spec:decisions.pdr-016-projection-pool-split-named-pools-per-concern + - spec:decisions.pdr-017-tranche-3-platform-architecture-gate + - spec:decisions.pdr-018-idempotency-enforcement-for-append-to-stream + - spec:decisions.pdr-019-v-any-vs-v-unknown-boundary-policy + - spec:decisions.pdr-020-events-table-index-policy + - spec:decisions.pdr-021-platform-store-runtime-dependency-on-platform-core + - spec:decisions.pdr-022-value-transfer-doctrine-adoption + - spec:decisions.pdr-023-bulk-doctrine-rollback-and-recovery +--- +# Decisions + +Process Decision Records (PDRs) migrated from architect/decisions into SDP decision Specs. diff --git a/specs/decisions/pdr-001-process-decisions-folder.sdp.md b/specs/decisions/pdr-001-process-decisions-folder.sdp.md new file mode 100644 index 00000000..62365d67 --- /dev/null +++ b/specs/decisions/pdr-001-process-decisions-folder.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-001-process-decisions-folder +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-001 Process decisions live in a dedicated decisions folder + +## Intent + +- outcome: Keep monorepo process decisions (PDRs) separate from package ADRs in a dedicated decisions corpus. + +## Decision + +- decision: Process Decision Records for the monorepo live as first-class decision Specs (historically under architect/decisions/ as pdr-NNN-*.feature). diff --git a/specs/decisions/pdr-002-release-management-architecture.sdp.md b/specs/decisions/pdr-002-release-management-architecture.sdp.md new file mode 100644 index 00000000..6691063b --- /dev/null +++ b/specs/decisions/pdr-002-release-management-architecture.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-002-release-management-architecture +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-002 Release management architecture + +## Intent + +- outcome: Organize delivery around releases as the external unit of ship, not internal phases. + +## Decision + +- decision: Adopt a minimal release-management architecture: release Specs name shipped/unreleased scope; release authority stays explicit; phases map many-to-one onto releases. diff --git a/specs/decisions/pdr-003-behavior-feature-file-structure.sdp.md b/specs/decisions/pdr-003-behavior-feature-file-structure.sdp.md new file mode 100644 index 00000000..fc2208e6 --- /dev/null +++ b/specs/decisions/pdr-003-behavior-feature-file-structure.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-003-behavior-feature-file-structure +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-003 Behavior Spec structure + +## Intent + +- outcome: Separate durable requirements from release/process tracking metadata. + +## Decision + +- decision: Specs carry WHAT (requirements and acceptance intent); release association and process metadata live elsewhere so Specs can evolve independently. diff --git a/specs/decisions/pdr-004-unified-tag-prefix-architecture.sdp.md b/specs/decisions/pdr-004-unified-tag-prefix-architecture.sdp.md new file mode 100644 index 00000000..1954cda3 --- /dev/null +++ b/specs/decisions/pdr-004-unified-tag-prefix-architecture.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-004-unified-tag-prefix-architecture +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-004 Unified tag prefix architecture + +## Intent + +- outcome: Eliminate dual tag-prefix mental models for process and docs metadata. + +## Decision + +- decision: All architect-era process tags use a unified @architect-* prefix; unprefixed BDD tags remain for acceptance/happy-path style markers. diff --git a/specs/decisions/pdr-005-mvp-workflow.sdp.md b/specs/decisions/pdr-005-mvp-workflow.sdp.md new file mode 100644 index 00000000..0bf11c77 --- /dev/null +++ b/specs/decisions/pdr-005-mvp-workflow.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-005-mvp-workflow +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-005 MVP workflow state machine + +## Intent + +- outcome: Give work-item status one enforceable lifecycle instead of overlapping free-text statuses. + +## Decision + +- decision: Adopt a phase-state-machine with Decider enforcement: roadmap → active → completed, with deferred as an explicit park state and validated transitions only. diff --git a/specs/decisions/pdr-006-typescript-sourced-taxonomy.sdp.md b/specs/decisions/pdr-006-typescript-sourced-taxonomy.sdp.md new file mode 100644 index 00000000..fccfa745 --- /dev/null +++ b/specs/decisions/pdr-006-typescript-sourced-taxonomy.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-006-typescript-sourced-taxonomy +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-006 TypeScript-sourced taxonomy + +## Intent + +- outcome: Make taxonomy compile-time truth instead of hand-edited JSON registries. + +## Decision + +- decision: TypeScript modules are the source of truth for tag/category taxonomy; generated docs and registries are projections. diff --git a/specs/decisions/pdr-007-two-tier-spec-architecture.sdp.md b/specs/decisions/pdr-007-two-tier-spec-architecture.sdp.md new file mode 100644 index 00000000..51829b0b --- /dev/null +++ b/specs/decisions/pdr-007-two-tier-spec-architecture.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-007-two-tier-spec-architecture +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-007 Two-tier Spec architecture + +## Intent + +- outcome: Separate planning Specs from implementation-proof Specs without conflating the two jobs. + +## Decision + +- decision: Establish two tiers: plan/tracking Specs for what to build, and implementation-proof carriers for how it works under test — with clear ownership boundaries. diff --git a/specs/decisions/pdr-008-example-app-purpose.sdp.md b/specs/decisions/pdr-008-example-app-purpose.sdp.md new file mode 100644 index 00000000..12895c8b --- /dev/null +++ b/specs/decisions/pdr-008-example-app-purpose.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-008-example-app-purpose +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-008 Example app purpose and guidelines + +## Intent + +- outcome: Keep the example app oriented to platform development, not a standalone product roadmap. + +## Decision + +- decision: The example app exists to serve platform development: features demonstrate platform capabilities; completeness is secondary to demonstration value. diff --git a/specs/decisions/pdr-009-design-session-methodology.sdp.md b/specs/decisions/pdr-009-design-session-methodology.sdp.md new file mode 100644 index 00000000..19212a8b --- /dev/null +++ b/specs/decisions/pdr-009-design-session-methodology.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-009-design-session-methodology +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-009 Design session methodology + +## Intent + +- outcome: Bridge plan-level Specs to implementation via design-session outputs without breaking the main tree. + +## Decision + +- decision: Design sessions produce HOW decisions and interface contracts; stubs live outside production source folders so compilation and lint stay green. diff --git a/specs/decisions/pdr-010-cross-component-argument-injection.sdp.md b/specs/decisions/pdr-010-cross-component-argument-injection.sdp.md new file mode 100644 index 00000000..2a624d48 --- /dev/null +++ b/specs/decisions/pdr-010-cross-component-argument-injection.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-010-cross-component-argument-injection +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-010 Cross-component argument injection + +## Intent + +- outcome: Preserve Convex component isolation when handlers need data from outside their boundary. + +## Decision + +- decision: App-level callers load cross-boundary data and pass it as arguments into component handlers; handlers never reach into another component's tables. diff --git a/specs/decisions/pdr-011-agent-action-handler-architecture.sdp.md b/specs/decisions/pdr-011-agent-action-handler-architecture.sdp.md new file mode 100644 index 00000000..b596f790 --- /dev/null +++ b/specs/decisions/pdr-011-agent-action-handler-architecture.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-011-agent-action-handler-architecture +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-011 Agent action handler architecture + +## Intent + +- outcome: Allow agent handlers to call LLMs without violating Convex mutation constraints. + +## Decision + +- decision: Agent event processing splits into an action phase (analysis/LLM, no DB writes) and an onComplete mutation (atomic persistence with OCC); supersedes single-mutation handlers. diff --git a/specs/decisions/pdr-012-agent-command-routing.sdp.md b/specs/decisions/pdr-012-agent-command-routing.sdp.md new file mode 100644 index 00000000..dc7b386c --- /dev/null +++ b/specs/decisions/pdr-012-agent-command-routing.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-012-agent-command-routing +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-012 Agent command routing and pattern unification + +## Intent + +- outcome: Route agent-emitted commands through the CommandOrchestrator and unify pattern detection. + +## Decision + +- decision: Agent commands bridge via Workpool from onComplete into CommandOrchestrator; PatternDefinition is the single source of truth for trigger and analysis. diff --git a/specs/decisions/pdr-013-agent-lifecycle-fsm.sdp.md b/specs/decisions/pdr-013-agent-lifecycle-fsm.sdp.md new file mode 100644 index 00000000..4ecfc226 --- /dev/null +++ b/specs/decisions/pdr-013-agent-lifecycle-fsm.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-013-agent-lifecycle-fsm +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-013 Agent lifecycle FSM + +## Intent + +- outcome: Govern agent start/pause/resume/stop/reconfigure with a formal lifecycle FSM. + +## Decision + +- decision: Lifecycle transitions follow the event-driven Map pattern with checkpoint status as source of truth; lifecycle commands are infrastructure mutations, not CommandOrchestrator traffic. diff --git a/specs/decisions/pdr-014-component-boundary-authentication-convention.sdp.md b/specs/decisions/pdr-014-component-boundary-authentication-convention.sdp.md new file mode 100644 index 00000000..e7555ad4 --- /dev/null +++ b/specs/decisions/pdr-014-component-boundary-authentication-convention.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-014-component-boundary-authentication-convention +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-014 Component-boundary authentication convention + +## Intent + +- outcome: Close the trust gap when Convex does not carry ctx.auth across component boundaries. + +## Decision + +- decision: Every identity-bearing component mutation accepts a canonical verificationProof and calls verifyActor() inside the component before reading or writing component state. diff --git a/specs/decisions/pdr-015-global-position-numeric-representation.sdp.md b/specs/decisions/pdr-015-global-position-numeric-representation.sdp.md new file mode 100644 index 00000000..ca794624 --- /dev/null +++ b/specs/decisions/pdr-015-global-position-numeric-representation.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-015-global-position-numeric-representation +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-015 globalPosition numeric representation + +## Intent + +- outcome: Keep event ordering exact without exceeding Number.MAX_SAFE_INTEGER. + +## Decision + +- decision: Adopt a canonical safe numeric (or otherwise exact) representation for globalPosition so checkpoint and replay comparisons stay lossless. diff --git a/specs/decisions/pdr-016-projection-pool-split-named-pools-per-concern.sdp.md b/specs/decisions/pdr-016-projection-pool-split-named-pools-per-concern.sdp.md new file mode 100644 index 00000000..b61ff6e3 --- /dev/null +++ b/specs/decisions/pdr-016-projection-pool-split-named-pools-per-concern.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-016-projection-pool-split-named-pools-per-concern +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-016 Projection pool split into named pools + +## Intent + +- outcome: Isolate async traffic classes so projection work does not contend as one shared pool. + +## Decision + +- decision: Split projectionPool into named pools per concern so tranche-2 async traffic classes stay isolated and operable. diff --git a/specs/decisions/pdr-017-tranche-3-platform-architecture-gate.sdp.md b/specs/decisions/pdr-017-tranche-3-platform-architecture-gate.sdp.md new file mode 100644 index 00000000..7b8ca30e --- /dev/null +++ b/specs/decisions/pdr-017-tranche-3-platform-architecture-gate.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-017-tranche-3-platform-architecture-gate +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-017 Tranche 3 platform architecture gate + +## Intent + +- outcome: Gate tranche-3 remediation behind explicit architecture answers before implementation sprawls. + +## Decision + +- decision: Tranche-3 work proceeds only after design-gate answers for the three remediation kinds are recorded and accepted. diff --git a/specs/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.sdp.md b/specs/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.sdp.md new file mode 100644 index 00000000..38c5c990 --- /dev/null +++ b/specs/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-018-idempotency-enforcement-for-append-to-stream +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-018 Idempotency enforcement for appendToStream + +## Intent + +- outcome: Make advertised event idempotency real on the append path. + +## Decision + +- decision: For every event with an idempotencyKey, appendToStream enforces a semantic fingerprint and rejects or deduplicates conflicting appends instead of treating the key as write-only metadata. diff --git a/specs/decisions/pdr-019-v-any-vs-v-unknown-boundary-policy.sdp.md b/specs/decisions/pdr-019-v-any-vs-v-unknown-boundary-policy.sdp.md new file mode 100644 index 00000000..632602d1 --- /dev/null +++ b/specs/decisions/pdr-019-v-any-vs-v-unknown-boundary-policy.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-019-v-any-vs-v-unknown-boundary-policy +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-019 v.any() vs v.unknown() boundary policy + +## Intent + +- outcome: Constrain flexible payload boundaries without pretending they are fully typed. + +## Decision + +- decision: Payload-like component boundaries follow an explicit v.any()/v.unknown() policy that rejects malformed or unbounded inputs before they become a scalability problem. diff --git a/specs/decisions/pdr-020-events-table-index-policy.sdp.md b/specs/decisions/pdr-020-events-table-index-policy.sdp.md new file mode 100644 index 00000000..ca86a25b --- /dev/null +++ b/specs/decisions/pdr-020-events-table-index-policy.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-020-events-table-index-policy +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-020 events table index policy + +## Intent + +- outcome: Align events-table indexes with active read paths without premature breaking removals. + +## Decision + +- decision: Replace or retire unused events indexes on a recorded policy so append cost drops only after consumers no longer depend on the old shapes. diff --git a/specs/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.sdp.md b/specs/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.sdp.md new file mode 100644 index 00000000..5504343b --- /dev/null +++ b/specs/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-021-platform-store-runtime-dependency-on-platform-core +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-021 platform-store runtime dependency on platform-core + +## Intent + +- outcome: Accept a constrained platform-store → platform-core dependency instead of denying package-manager reality. + +## Decision + +- decision: platform-store may depend on platform-core only through an approved import set; live imports stay inside that set and are guarded. diff --git a/specs/decisions/pdr-022-value-transfer-doctrine-adoption.sdp.md b/specs/decisions/pdr-022-value-transfer-doctrine-adoption.sdp.md new file mode 100644 index 00000000..b7ddf1dd --- /dev/null +++ b/specs/decisions/pdr-022-value-transfer-doctrine-adoption.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-022-value-transfer-doctrine-adoption +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-022 Value-transfer doctrine adoption + +## Intent + +- outcome: End split-brain doctrine that lived only on off-branch paths. + +## Decision + +- decision: Adopt the in-repo architect/_shared doctrine set as authoritative for value transfer, annotation ownership, pattern-carrier relationships, maturity, and FSM interpretation. diff --git a/specs/decisions/pdr-023-bulk-doctrine-rollback-and-recovery.sdp.md b/specs/decisions/pdr-023-bulk-doctrine-rollback-and-recovery.sdp.md new file mode 100644 index 00000000..0eb958b8 --- /dev/null +++ b/specs/decisions/pdr-023-bulk-doctrine-rollback-and-recovery.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.pdr-023-bulk-doctrine-rollback-and-recovery +kind: decision +altitude: feature +readiness: idea +relations: {} +--- +# PDR-023 Bulk doctrine rollback and recovery governance + +## Intent + +- outcome: Recover safely after a bulk doctrine cleanup that deleted live Specs and left transitional carve-outs. + +## Decision + +- decision: Recovery restores gate-passing design Specs deliberately, records exemptions, and forbids silent bulk deletion without recovery governance. diff --git a/specs/epic-process-enhancements.sdp.md b/specs/epic-process-enhancements.sdp.md new file mode 100644 index 00000000..18f6268c --- /dev/null +++ b/specs/epic-process-enhancements.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.epic-process-enhancements +kind: behavior +altitude: epic +readiness: idea +relations: {} +--- +# Epic process enhancements + +## Intent + +- outcome: Improve delivery-process epic tooling and workflows that sit above individual platform feature Specs. diff --git a/specs/example-app/agent-admin-frontend.sdp.md b/specs/example-app/agent-admin-frontend.sdp.md new file mode 100644 index 00000000..cd5cd436 --- /dev/null +++ b/specs/example-app/agent-admin-frontend.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.agent-admin-frontend +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# Agent admin frontend + +## Intent + +- outcome: Give operators an admin UI for approvals, monitoring, decision history, and dead letters over the Agent BC APIs. diff --git a/specs/platform-patterns.pack.sdp.md b/specs/platform-patterns.pack.sdp.md new file mode 100644 index 00000000..42e425ed --- /dev/null +++ b/specs/platform-patterns.pack.sdp.md @@ -0,0 +1,115 @@ +--- +id: pack:platform-patterns +specs: + - spec:platform.active-reservations-projection + - spec:platform.agent-action-handler + - spec:platform.agent-as-bounded-context + - spec:platform.agent-churn-risk-completion + - spec:platform.agent-churn-risk-completion-executable-tests + - spec:platform.agent-on-complete-handler + - spec:platform.app-composition-root + - spec:platform.bdd-testing-infrastructure + - spec:platform.bdd-testing-infrastructure-executable-tests + - spec:platform.bdd-world + - spec:platform.bounded-context-foundation + - spec:platform.bounded-context-foundation-executable-tests + - spec:platform.bounded-context-identity + - spec:platform.cms-dual-write + - spec:platform.cms-repository + - spec:platform.command-bus + - spec:platform.command-bus-foundation + - spec:platform.command-bus-foundation-executable-tests + - spec:platform.command-bus-idempotency + - spec:platform.command-orchestrator + - spec:platform.command-registry + - spec:platform.confirmed-order-cancellation-executable-tests + - spec:platform.correlation-chain-system + - spec:platform.cross-context-read-model + - spec:platform.customer-cancellations-projection + - spec:platform.data-table-parsing + - spec:platform.dcb-multi-product-reservation + - spec:platform.dcb-retry-execution + - spec:platform.dcb-scope-key-utilities + - spec:platform.dcb-types + - spec:platform.decider-assertions + - spec:platform.decider-outputs + - spec:platform.decider-pattern + - spec:platform.dual-write-contract + - spec:platform.durable-append-action + - spec:platform.durable-events-integration + - spec:platform.durable-events-integration-executable-tests + - spec:platform.durable-function-adapters + - spec:platform.dynamic-consistency-boundaries + - spec:platform.ecst-fat-events + - spec:platform.event-bus-abstraction + - spec:platform.event-replay-infrastructure + - spec:platform.event-store + - spec:platform.event-store-durability + - spec:platform.event-store-foundation + - spec:platform.event-store-foundation-executable-tests + - spec:platform.event-subscription-registry + - spec:platform.event-upcasting + - spec:platform.example-app-architecture + - spec:platform.example-app-modernization + - spec:platform.example-app-modernization-executable-tests + - spec:platform.fsm-assertions + - spec:platform.fsm-transitions + - spec:platform.handler-factories + - spec:platform.integration-dead-letters + - spec:platform.integration-event-handlers + - spec:platform.integration-event-schemas + - spec:platform.integration-patterns-21-a + - spec:platform.integration-patterns-21-b + - spec:platform.integration-routes + - spec:platform.invariant-framework + - spec:platform.inventory-command-configs + - spec:platform.inventory-command-handlers + - spec:platform.inventory-deciders + - spec:platform.inventory-domain-events + - spec:platform.inventory-internal-mutations + - spec:platform.inventory-public-api + - spec:platform.logging-infrastructure + - spec:platform.middleware-pipeline + - spec:platform.mock-payment-actions + - spec:platform.order-command-configs + - spec:platform.order-command-handlers + - spec:platform.order-deciders + - spec:platform.order-domain-events + - spec:platform.order-fulfillment-saga + - spec:platform.order-items-projection + - spec:platform.order-management-infrastructure + - spec:platform.order-notification-pm + - spec:platform.order-public-api + - spec:platform.order-summary-projection + - spec:platform.order-with-inventory-projection + - spec:platform.payment-outbox-handler + - spec:platform.polling-utilities + - spec:platform.process-manager + - spec:platform.process-manager-lifecycle + - spec:platform.product-catalog-projection + - spec:platform.projection-categories + - spec:platform.projection-categories-executable-tests + - spec:platform.projection-checkpointing + - spec:platform.projection-dead-letters + - spec:platform.projection-definitions + - spec:platform.query-abstraction + - spec:platform.rate-limit-definitions + - spec:platform.reactive-projection-conflict-detection + - spec:platform.reactive-projection-eligibility + - spec:platform.reactive-projection-hybrid-model + - spec:platform.reactive-projection-shared-evolve + - spec:platform.reactive-projections + - spec:platform.reservation-pattern + - spec:platform.reservation-release-pm + - spec:platform.saga-completion-handler + - spec:platform.saga-orchestration + - spec:platform.saga-orchestration-executable-tests + - spec:platform.saga-registry + - spec:platform.saga-router + - spec:platform.test-environment-guards + - spec:platform.test-isolation + - spec:platform.workpool-partitioning-strategy +--- +# Platform patterns + +Code-originated pattern Specs derived from former @architect-pattern / @architect-implements bindings. diff --git a/specs/platform.pack.sdp.md b/specs/platform.pack.sdp.md new file mode 100644 index 00000000..79860fab --- /dev/null +++ b/specs/platform.pack.sdp.md @@ -0,0 +1,137 @@ +--- +id: pack:platform +specs: + - spec:platform.active-reservations-projection + - spec:platform.admin-tooling-consolidation + - spec:platform.agent-action-handler + - spec:platform.agent-as-bounded-context + - spec:platform.agent-bc-component-isolation + - spec:platform.agent-churn-risk-completion + - spec:platform.agent-churn-risk-completion-executable-tests + - spec:platform.agent-command-infrastructure + - spec:platform.agent-llm-integration + - spec:platform.agent-on-complete-handler + - spec:platform.app-composition-root + - spec:platform.bdd-testing-infrastructure + - spec:platform.bdd-testing-infrastructure-executable-tests + - spec:platform.bdd-world + - spec:platform.bounded-context-foundation + - spec:platform.bounded-context-foundation-executable-tests + - spec:platform.bounded-context-identity + - spec:platform.circuit-breaker-pattern + - spec:platform.cms-dual-write + - spec:platform.cms-repository + - spec:platform.codec-driven-reference-generation + - spec:platform.command-bus + - spec:platform.command-bus-foundation + - spec:platform.command-bus-foundation-executable-tests + - spec:platform.command-bus-idempotency + - spec:platform.command-orchestrator + - spec:platform.command-registry + - spec:platform.component-boundary-authentication-convention + - spec:platform.confirmed-order-cancellation + - spec:platform.confirmed-order-cancellation-executable-tests + - spec:platform.correlation-chain-system + - spec:platform.cross-context-read-model + - spec:platform.customer-cancellations-projection + - spec:platform.data-table-parsing + - spec:platform.dcb-api-reference + - spec:platform.dcb-multi-product-reservation + - spec:platform.dcb-retry-execution + - spec:platform.dcb-scope-key-utilities + - spec:platform.dcb-types + - spec:platform.decider-assertions + - spec:platform.decider-outputs + - spec:platform.decider-pattern + - spec:platform.deterministic-id-hashing + - spec:platform.dual-write-contract + - spec:platform.durable-append-action + - spec:platform.durable-events-integration + - spec:platform.durable-events-integration-executable-tests + - spec:platform.durable-function-adapters + - spec:platform.dynamic-consistency-boundaries + - spec:platform.ecst-fat-events + - spec:platform.epic-process-enhancements + - spec:platform.event-bus-abstraction + - spec:platform.event-correctness-migration + - spec:platform.event-replay-infrastructure + - spec:platform.event-store + - spec:platform.event-store-durability + - spec:platform.event-store-foundation + - spec:platform.event-store-foundation-executable-tests + - spec:platform.event-subscription-registry + - spec:platform.event-upcasting + - spec:platform.example-app-architecture + - spec:platform.example-app-modernization + - spec:platform.example-app-modernization-executable-tests + - spec:platform.fsm-assertions + - spec:platform.fsm-transitions + - spec:platform.handler-factories + - spec:platform.health-observability + - spec:platform.integration-dead-letters + - spec:platform.integration-event-handlers + - spec:platform.integration-event-schemas + - spec:platform.integration-patterns-21-a + - spec:platform.integration-patterns-21-b + - spec:platform.integration-patterns-21a + - spec:platform.integration-patterns-21b + - spec:platform.integration-routes + - spec:platform.invariant-framework + - spec:platform.inventory-command-configs + - spec:platform.inventory-command-handlers + - spec:platform.inventory-deciders + - spec:platform.inventory-domain-events + - spec:platform.inventory-internal-mutations + - spec:platform.inventory-public-api + - spec:platform.logging-infrastructure + - spec:platform.middleware-pipeline + - spec:platform.mock-payment-actions + - spec:platform.order-command-configs + - spec:platform.order-command-handlers + - spec:platform.order-deciders + - spec:platform.order-domain-events + - spec:platform.order-fulfillment-saga + - spec:platform.order-items-projection + - spec:platform.order-management-infrastructure + - spec:platform.order-notification-pm + - spec:platform.order-public-api + - spec:platform.order-summary-projection + - spec:platform.order-with-inventory-projection + - spec:platform.package-architecture + - spec:platform.payment-outbox-handler + - spec:platform.polling-utilities + - spec:platform.process-manager + - spec:platform.process-manager-lifecycle + - spec:platform.product-catalog-projection + - spec:platform.production-hardening + - spec:platform.projection-categories + - spec:platform.projection-categories-executable-tests + - spec:platform.projection-checkpointing + - spec:platform.projection-dead-letters + - spec:platform.projection-definitions + - spec:platform.query-abstraction + - spec:platform.rate-limit-definitions + - spec:platform.reactive-projection-conflict-detection + - spec:platform.reactive-projection-eligibility + - spec:platform.reactive-projection-hybrid-model + - spec:platform.reactive-projection-shared-evolve + - spec:platform.reactive-projections + - spec:platform.reservation-pattern + - spec:platform.reservation-release-pm + - spec:platform.saga-completion-handler + - spec:platform.saga-orchestration + - spec:platform.saga-orchestration-executable-tests + - spec:platform.saga-registry + - spec:platform.saga-router + - spec:platform.test-content-blocks + - spec:platform.test-environment-guards + - spec:platform.test-isolation + - spec:platform.themed-decision-architecture + - spec:platform.tranche-0-readiness-harness-and-dependency-hardening + - spec:platform.tranche-0-release-ci-and-docs-process-guardrails + - spec:platform.tranche-1-supporting-security-and-contract-sweep + - spec:platform.workpool-partitioning-strategy +--- +# Platform + +Platform delivery Specs migrated from the former architect corpus, including code-originated pattern Specs. diff --git a/specs/platform/admin-tooling-consolidation.sdp.md b/specs/platform/admin-tooling-consolidation.sdp.md new file mode 100644 index 00000000..d770f84f --- /dev/null +++ b/specs/platform/admin-tooling-consolidation.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.admin-tooling-consolidation +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# Admin tooling consolidation + +## Intent + +- outcome: Consolidate cross-cutting admin operations into one discoverable admin surface with uniform auth and diagnostics. diff --git a/specs/platform/agent-bc-component-isolation.sdp.md b/specs/platform/agent-bc-component-isolation.sdp.md new file mode 100644 index 00000000..5025e7f0 --- /dev/null +++ b/specs/platform/agent-bc-component-isolation.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.agent-bc-component-isolation +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# Agent BC component isolation + +## Intent + +- outcome: Enforce Agent BC as a Convex component with private tables and a public API so agent state is not shared-schema writable. diff --git a/specs/platform/agent-command-infrastructure.sdp.md b/specs/platform/agent-command-infrastructure.sdp.md new file mode 100644 index 00000000..a002a22d --- /dev/null +++ b/specs/platform/agent-command-infrastructure.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.agent-command-infrastructure +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# Agent command infrastructure + +## Intent + +- outcome: Complete agent command routing, lifecycle control, and a unified pattern registry so agent decisions have effect and operators can control agents. diff --git a/specs/platform/agent-llm-integration.sdp.md b/specs/platform/agent-llm-integration.sdp.md new file mode 100644 index 00000000..1b37a2ce --- /dev/null +++ b/specs/platform/agent-llm-integration.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.agent-llm-integration +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# Agent LLM integration + +## Intent + +- outcome: Integrate LLM analysis into agent pattern detection via a hybrid action/mutation flow while the platform owns EventBus, checkpoints, and rate limits. diff --git a/specs/platform/circuit-breaker-pattern.sdp.md b/specs/platform/circuit-breaker-pattern.sdp.md new file mode 100644 index 00000000..23de9f48 --- /dev/null +++ b/specs/platform/circuit-breaker-pattern.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.circuit-breaker-pattern +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# Circuit breaker pattern for external service resilience + +## Intent + +- outcome: Isolate failing external APIs with a database-backed CLOSED/OPEN/HALF_OPEN circuit breaker so failures fail fast instead of cascading. diff --git a/specs/platform/component-boundary-authentication-convention.sdp.md b/specs/platform/component-boundary-authentication-convention.sdp.md new file mode 100644 index 00000000..63f78fd2 --- /dev/null +++ b/specs/platform/component-boundary-authentication-convention.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.component-boundary-authentication-convention +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# Atomic component-boundary authentication convention + +## Intent + +- outcome: Migrate identity-bearing component mutations atomically onto the PDR-014 verificationProof and verifyActor() contract. diff --git a/specs/platform/confirmed-order-cancellation.sdp.md b/specs/platform/confirmed-order-cancellation.sdp.md new file mode 100644 index 00000000..f68d9a4f --- /dev/null +++ b/specs/platform/confirmed-order-cancellation.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.confirmed-order-cancellation +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# Confirmed order cancellation with reservation release + +## Intent + +- outcome: Allow confirmed orders to cancel with coordinated reservation release so agent demos can exercise multi-cancellation churn patterns. diff --git a/specs/platform/deterministic-id-hashing.sdp.md b/specs/platform/deterministic-id-hashing.sdp.md new file mode 100644 index 00000000..e36000a3 --- /dev/null +++ b/specs/platform/deterministic-id-hashing.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.deterministic-id-hashing +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# Deterministic ID hashing for OCC-based uniqueness + +## Intent + +- outcome: Derive stream IDs from business keys via deterministic hashing so concurrent creates collide under OCC without TTL reservations. diff --git a/specs/platform/event-correctness-migration.sdp.md b/specs/platform/event-correctness-migration.sdp.md new file mode 100644 index 00000000..7a84f532 --- /dev/null +++ b/specs/platform/event-correctness-migration.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.event-correctness-migration +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# Atomic event correctness migration + +## Intent + +- outcome: Land idempotency, globalPosition precision, and process-manager lifecycle parity as one correctness packet so event-store guarantees stay consistent. diff --git a/specs/platform/generated-docs/dcb-api-reference.feature b/specs/platform/generated-docs/dcb-api-reference.feature deleted file mode 100644 index 41051b20..00000000 --- a/specs/platform/generated-docs/dcb-api-reference.feature +++ /dev/null @@ -1,169 +0,0 @@ -@architect -@architect-pattern:DCBAPIReference -@architect-status:active -@architect-phase:99 -@architect-core -@architect-ddd -@architect-claude-md-section:platform -Feature: DCB API Reference - Auto-Generated Documentation - - This feature file demonstrates code-first documentation generation. - The API reference is extracted directly from annotated TypeScript source files, - proving that documentation can be a projection of code. - - **Key Insight:** DCB enables cross-entity invariant validation within a single - bounded context with scope-based OCC. - - Rule: Source Mapping - Content Extraction Configuration - - The following table defines which content is extracted from which source files: - -| Section | Source File | Extraction Method | -| --- | --- | --- | -| Core Types | packages/platform-core/src/dcb/types.ts | @extract-shapes tag | -| Scope Key Utilities | packages/platform-core/src/dcb/scopeKey.ts | @extract-shapes tag | -| executeWithDCB Flow | THIS DECISION | Fenced code block (Mermaid) | -| Usage Example | THIS DECISION | Fenced code block | -| Constraints | THIS DECISION | Rule block table | -| Guarantees | THIS DECISION | Rule block table | - - **Usage Example:** - - """typescript - import { executeWithDCB, createScopeKey } from "@libar-dev/platform-core/dcb"; - - const result = await executeWithDCB(ctx, { - scopeKey: createScopeKey("tenant_1", "reservation", "res_123"), - expectedVersion: 0, - boundedContext: "inventory", - streamType: "Reservation", - schemaVersion: 1, - entities: { - streamIds: ["product-1", "product-2"], - loadEntity: async (ctx, streamId) => { - const product = await inventoryRepo.tryLoad(ctx, streamId); - return product ? { cms: product, _id: product._id } : null; - }, - }, - decider: reserveMultipleDecider, - command: { orderId: "order_456", items }, - applyUpdate: async (ctx, _id, cms, update, version, timestamp) => { - await ctx.db.patch(_id, { ...update, version, updatedAt: timestamp }); - }, - commandId: "cmd_789", - correlationId: "corr_abc", - }); - - switch (result.status) { - case "success": - // Append result.events to Event Store - break; - case "rejected": - // Business rule violation - result.code, result.reason - break; - case "conflict": - // OCC conflict - retry with fresh state - break; - } - """ - - Rule: Context - Why DCB Exists - - **Problem:** Traditional approaches to multi-entity coordination have significant - drawbacks: - - **Saga coordination** provides only eventual consistency - - **Sequential commands** create race condition windows - - **Aggregate enlargement** violates single responsibility - - **Solution:** DCB provides atomic validation across multiple entities with - scope-based optimistic concurrency control (OCC), all within a single - bounded context. - - Rule: Decision - Scope-Based OCC - - DCB uses a scope key to coordinate multiple entities atomically. - - **Scope Key Format:** `tenant:${tenantId}:${scopeType}:${scopeId}` - - The tenant prefix is mandatory to ensure multi-tenant isolation at the scope level. - - Rule: Decision - executeWithDCB Flow - - The following diagram shows the step-by-step flow of the `executeWithDCB` function: - - """mermaid - flowchart TD - A[1. Validate Scope Key] --> B[2. Load All Entities] - B --> C[3. Build Aggregated State] - C --> D[4. Execute Pure Decider] - D --> E{Result Status?} - E -->|rejected| F[Return Rejection
No events, no state changes] - E -->|failed| G[Return Failure
With failure event] - E -->|success| H[5. Check Scope Version OCC] - H --> I{Version Match?} - I -->|no| J[Return Conflict
currentVersion in result] - I -->|yes| K[6. Apply State Updates] - K --> L[7. Return Success
data + scopeVersion + events] - - style A fill:#e1f5fe - style D fill:#fff3e0 - style E fill:#fce4ec - style I fill:#fce4ec - style L fill:#e8f5e9 - """ - - **Step Details:** - - 1. **Validate Scope Key** - Ensures tenant prefix is present for isolation - 2. **Load All Entities** - Calls `loadEntity()` for each streamId in config - 3. **Build Aggregated State** - Creates `DCBAggregatedState` with all entities - 4. **Execute Pure Decider** - Calls decider function with aggregated state - 5. **Check Scope Version** - OCC validation via `scopeOperations.commitScope()` - 6. **Apply State Updates** - Calls `applyUpdate()` for each entity with changes - 7. **Return Success** - Returns data, new scopeVersion, and events to append - - Rule: Consequences - When to Use DCB vs Alternatives - -| Criterion | DCB | Saga | Regular Decider | -| --- | --- | --- | --- | -| Scope | Single BC | Cross-BC | Single entity | -| Consistency | Atomic | Eventual | Atomic | -| Use Case | Multi-product reservation | Order fulfillment | Simple updates | - - Rule: Consequences - Constraints and Error Codes - - **Mandatory Constraints:** - -| Constraint | Enforcement | Error Code | -| --- | --- | --- | -| Single bounded context only | Runtime validation | CROSS_BC_NOT_ALLOWED | -| Tenant-aware scope key | Scope key format | TENANT_ID_REQUIRED | -| Non-empty scope components | Scope key validation | SCOPE_KEY_EMPTY | -| Valid scope key format | Regex validation | INVALID_SCOPE_KEY_FORMAT | -| Decider must be pure | Design pattern | N/A (enforced by types) | - - **Scope Key Validation:** - - The `tenant:` prefix is mandatory in all scope keys - - Empty `tenantId`, `scopeType`, or `scopeId` are rejected - - Colons are not allowed in `tenantId` or `scopeType` (but allowed in `scopeId`) - - Rule: Consequences - Guarantees - - **System Guarantees:** - -| Guarantee | How Enforced | -| --- | --- | -| Tenant isolation | Scope key must include tenant prefix; validated at creation | -| Atomicity | All state updates + scope commit in same Convex mutation | -| OCC protection | Scope version checked before commit; conflict returns currentVersion | -| No partial updates | Rejected/failed status means no CMS changes persisted | -| Decider purity | Type system enforces no ctx/I/O in decider function signature | -| Event immutability | Events returned for caller to append; not modified by DCB | - - **Conflict Resolution:** - When an OCC conflict occurs (`status: "conflict"`), the caller should: - 1. Reload the current scope version from the result - 2. Re-fetch entity state - 3. Retry the operation with updated `expectedVersion` - - The `withDCBRetry` helper automates this pattern via Workpool scheduling. diff --git a/specs/platform/generated-docs/dcb-api-reference.sdp.md b/specs/platform/generated-docs/dcb-api-reference.sdp.md new file mode 100644 index 00000000..55f19354 --- /dev/null +++ b/specs/platform/generated-docs/dcb-api-reference.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.dcb-api-reference +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# DCB API reference — code-first documentation + +## Intent + +- outcome: Project DCB API reference documentation from annotated TypeScript sources so docs stay a regenerable view of code, not a hand-maintained twin. diff --git a/specs/platform/health-observability.sdp.md b/specs/platform/health-observability.sdp.md new file mode 100644 index 00000000..da7b9578 --- /dev/null +++ b/specs/platform/health-observability.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.health-observability +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# Health endpoints and metrics collection + +## Intent + +- outcome: Expose readiness/liveness health endpoints and structured metrics so operators can detect degradation before outage. diff --git a/specs/platform/integration-patterns-21a.sdp.md b/specs/platform/integration-patterns-21a.sdp.md new file mode 100644 index 00000000..5949be4f --- /dev/null +++ b/specs/platform/integration-patterns-21a.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.integration-patterns-21a +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# Integration patterns (21a) — registry and core patterns + +## Intent + +- outcome: Make cross-context communication explicit via context maps, published language, and an integration-pattern registry. diff --git a/specs/platform/integration-patterns-21b.sdp.md b/specs/platform/integration-patterns-21b.sdp.md new file mode 100644 index 00000000..19979178 --- /dev/null +++ b/specs/platform/integration-patterns-21b.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.integration-patterns-21b +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# Integration patterns (21b) — schema evolution and contract testing + +## Intent + +- outcome: Support schema evolution with upcasters/downcasters and contract testing so producer/consumer compatibility is validated before runtime failures. diff --git a/specs/platform/package-architecture.sdp.md b/specs/platform/package-architecture.sdp.md new file mode 100644 index 00000000..4dbe3cf0 --- /dev/null +++ b/specs/platform/package-architecture.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.package-architecture +kind: model +altitude: epic +readiness: idea +relations: {} +--- +# Package architecture — extraction and naming strategy + +## Intent + +- outcome: Extract focused @libar-dev/platform-* packages with layered dependency direction instead of one oversized core package. diff --git a/specs/platform/patterns/active-reservations-projection.sdp.md b/specs/platform/patterns/active-reservations-projection.sdp.md new file mode 100644 index 00000000..da11554c --- /dev/null +++ b/specs/platform/patterns/active-reservations-projection.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.active-reservations-projection +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# ActiveReservationsProjection + +## Intent + +- outcome: Preserve the former architect pattern "ActiveReservationsProjection" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/agent-action-handler.sdp.md b/specs/platform/patterns/agent-action-handler.sdp.md new file mode 100644 index 00000000..ab17b548 --- /dev/null +++ b/specs/platform/patterns/agent-action-handler.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.agent-action-handler +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# AgentActionHandler + +## Intent + +- outcome: Preserve the former architect pattern "AgentActionHandler" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/agent-as-bounded-context.sdp.md b/specs/platform/patterns/agent-as-bounded-context.sdp.md new file mode 100644 index 00000000..bae34530 --- /dev/null +++ b/specs/platform/patterns/agent-as-bounded-context.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.agent-as-bounded-context +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# AgentAsBoundedContext + +## Intent + +- outcome: Preserve the former architect pattern "AgentAsBoundedContext" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/agent-churn-risk-completion-executable-tests.sdp.md b/specs/platform/patterns/agent-churn-risk-completion-executable-tests.sdp.md new file mode 100644 index 00000000..038625c2 --- /dev/null +++ b/specs/platform/patterns/agent-churn-risk-completion-executable-tests.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.agent-churn-risk-completion-executable-tests +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# AgentChurnRiskCompletionExecutableTests + +## Intent + +- outcome: Preserve the former architect pattern "AgentChurnRiskCompletionExecutableTests" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/agent-churn-risk-completion.sdp.md b/specs/platform/patterns/agent-churn-risk-completion.sdp.md new file mode 100644 index 00000000..df285719 --- /dev/null +++ b/specs/platform/patterns/agent-churn-risk-completion.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.agent-churn-risk-completion +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# AgentChurnRiskCompletion + +## Intent + +- outcome: Preserve the former architect pattern "AgentChurnRiskCompletion" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/agent-on-complete-handler.sdp.md b/specs/platform/patterns/agent-on-complete-handler.sdp.md new file mode 100644 index 00000000..402c2c6b --- /dev/null +++ b/specs/platform/patterns/agent-on-complete-handler.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.agent-on-complete-handler +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# AgentOnCompleteHandler + +## Intent + +- outcome: Preserve the former architect pattern "AgentOnCompleteHandler" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/app-composition-root.sdp.md b/specs/platform/patterns/app-composition-root.sdp.md new file mode 100644 index 00000000..264c66a5 --- /dev/null +++ b/specs/platform/patterns/app-composition-root.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.app-composition-root +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# AppCompositionRoot + +## Intent + +- outcome: Preserve the former architect pattern "AppCompositionRoot" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/bdd-testing-infrastructure-executable-tests.sdp.md b/specs/platform/patterns/bdd-testing-infrastructure-executable-tests.sdp.md new file mode 100644 index 00000000..1f8b7ae5 --- /dev/null +++ b/specs/platform/patterns/bdd-testing-infrastructure-executable-tests.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.bdd-testing-infrastructure-executable-tests +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# BddTestingInfrastructureExecutableTests + +## Intent + +- outcome: Preserve the former architect pattern "BddTestingInfrastructureExecutableTests" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/bdd-testing-infrastructure.sdp.md b/specs/platform/patterns/bdd-testing-infrastructure.sdp.md new file mode 100644 index 00000000..dcb5ae03 --- /dev/null +++ b/specs/platform/patterns/bdd-testing-infrastructure.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.bdd-testing-infrastructure +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# BddTestingInfrastructure + +## Intent + +- outcome: Preserve the former architect pattern "BddTestingInfrastructure" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/bdd-world.sdp.md b/specs/platform/patterns/bdd-world.sdp.md new file mode 100644 index 00000000..32d33264 --- /dev/null +++ b/specs/platform/patterns/bdd-world.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.bdd-world +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# BDDWorld + +## Intent + +- outcome: Preserve the former architect pattern "BDDWorld" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/bounded-context-foundation-executable-tests.sdp.md b/specs/platform/patterns/bounded-context-foundation-executable-tests.sdp.md new file mode 100644 index 00000000..7146a1ce --- /dev/null +++ b/specs/platform/patterns/bounded-context-foundation-executable-tests.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.bounded-context-foundation-executable-tests +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# BoundedContextFoundationExecutableTests + +## Intent + +- outcome: Preserve the former architect pattern "BoundedContextFoundationExecutableTests" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/bounded-context-foundation.sdp.md b/specs/platform/patterns/bounded-context-foundation.sdp.md new file mode 100644 index 00000000..2aa40b0f --- /dev/null +++ b/specs/platform/patterns/bounded-context-foundation.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.bounded-context-foundation +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# BoundedContextFoundation + +## Intent + +- outcome: Preserve the former architect pattern "BoundedContextFoundation" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/bounded-context-identity.sdp.md b/specs/platform/patterns/bounded-context-identity.sdp.md new file mode 100644 index 00000000..d239e1b9 --- /dev/null +++ b/specs/platform/patterns/bounded-context-identity.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.bounded-context-identity +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# BoundedContextIdentity + +## Intent + +- outcome: Preserve the former architect pattern "BoundedContextIdentity" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/cms-dual-write.sdp.md b/specs/platform/patterns/cms-dual-write.sdp.md new file mode 100644 index 00000000..0e4c4a54 --- /dev/null +++ b/specs/platform/patterns/cms-dual-write.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.cms-dual-write +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# CMSDualWrite + +## Intent + +- outcome: Preserve the former architect pattern "CMSDualWrite" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/cms-repository.sdp.md b/specs/platform/patterns/cms-repository.sdp.md new file mode 100644 index 00000000..ef2bee01 --- /dev/null +++ b/specs/platform/patterns/cms-repository.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.cms-repository +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# CMSRepository + +## Intent + +- outcome: Preserve the former architect pattern "CMSRepository" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/command-bus-foundation-executable-tests.sdp.md b/specs/platform/patterns/command-bus-foundation-executable-tests.sdp.md new file mode 100644 index 00000000..ffdb84f1 --- /dev/null +++ b/specs/platform/patterns/command-bus-foundation-executable-tests.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.command-bus-foundation-executable-tests +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# CommandBusFoundationExecutableTests + +## Intent + +- outcome: Preserve the former architect pattern "CommandBusFoundationExecutableTests" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/command-bus-foundation.sdp.md b/specs/platform/patterns/command-bus-foundation.sdp.md new file mode 100644 index 00000000..eca044d8 --- /dev/null +++ b/specs/platform/patterns/command-bus-foundation.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.command-bus-foundation +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# CommandBusFoundation + +## Intent + +- outcome: Preserve the former architect pattern "CommandBusFoundation" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/command-bus-idempotency.sdp.md b/specs/platform/patterns/command-bus-idempotency.sdp.md new file mode 100644 index 00000000..07f930a4 --- /dev/null +++ b/specs/platform/patterns/command-bus-idempotency.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.command-bus-idempotency +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# CommandBusIdempotency + +## Intent + +- outcome: Preserve the former architect pattern "CommandBusIdempotency" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/command-bus.sdp.md b/specs/platform/patterns/command-bus.sdp.md new file mode 100644 index 00000000..e4b8eb82 --- /dev/null +++ b/specs/platform/patterns/command-bus.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.command-bus +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# CommandBus + +## Intent + +- outcome: Preserve the former architect pattern "CommandBus" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/command-orchestrator.sdp.md b/specs/platform/patterns/command-orchestrator.sdp.md new file mode 100644 index 00000000..ca39a7bd --- /dev/null +++ b/specs/platform/patterns/command-orchestrator.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.command-orchestrator +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# CommandOrchestrator + +## Intent + +- outcome: Preserve the former architect pattern "CommandOrchestrator" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/command-registry.sdp.md b/specs/platform/patterns/command-registry.sdp.md new file mode 100644 index 00000000..a52d6bfc --- /dev/null +++ b/specs/platform/patterns/command-registry.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.command-registry +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# CommandRegistry + +## Intent + +- outcome: Preserve the former architect pattern "CommandRegistry" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/confirmed-order-cancellation-executable-tests.sdp.md b/specs/platform/patterns/confirmed-order-cancellation-executable-tests.sdp.md new file mode 100644 index 00000000..6905cb6e --- /dev/null +++ b/specs/platform/patterns/confirmed-order-cancellation-executable-tests.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.confirmed-order-cancellation-executable-tests +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# ConfirmedOrderCancellationExecutableTests + +## Intent + +- outcome: Preserve the former architect pattern "ConfirmedOrderCancellationExecutableTests" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/correlation-chain-system.sdp.md b/specs/platform/patterns/correlation-chain-system.sdp.md new file mode 100644 index 00000000..012cbf76 --- /dev/null +++ b/specs/platform/patterns/correlation-chain-system.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.correlation-chain-system +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# CorrelationChainSystem + +## Intent + +- outcome: Preserve the former architect pattern "CorrelationChainSystem" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/cross-context-read-model.sdp.md b/specs/platform/patterns/cross-context-read-model.sdp.md new file mode 100644 index 00000000..2173cd08 --- /dev/null +++ b/specs/platform/patterns/cross-context-read-model.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.cross-context-read-model +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# CrossContextReadModel + +## Intent + +- outcome: Preserve the former architect pattern "CrossContextReadModel" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/customer-cancellations-projection.sdp.md b/specs/platform/patterns/customer-cancellations-projection.sdp.md new file mode 100644 index 00000000..c1b78621 --- /dev/null +++ b/specs/platform/patterns/customer-cancellations-projection.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.customer-cancellations-projection +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# CustomerCancellationsProjection + +## Intent + +- outcome: Preserve the former architect pattern "CustomerCancellationsProjection" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/data-table-parsing.sdp.md b/specs/platform/patterns/data-table-parsing.sdp.md new file mode 100644 index 00000000..fbe705de --- /dev/null +++ b/specs/platform/patterns/data-table-parsing.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.data-table-parsing +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# DataTableParsing + +## Intent + +- outcome: Preserve the former architect pattern "DataTableParsing" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/dcb-multi-product-reservation.sdp.md b/specs/platform/patterns/dcb-multi-product-reservation.sdp.md new file mode 100644 index 00000000..06957e6d --- /dev/null +++ b/specs/platform/patterns/dcb-multi-product-reservation.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.dcb-multi-product-reservation +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# DCBMultiProductReservation + +## Intent + +- outcome: Preserve the former architect pattern "DCBMultiProductReservation" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/dcb-retry-execution.sdp.md b/specs/platform/patterns/dcb-retry-execution.sdp.md new file mode 100644 index 00000000..027c9668 --- /dev/null +++ b/specs/platform/patterns/dcb-retry-execution.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.dcb-retry-execution +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# DCBRetryExecution + +## Intent + +- outcome: Preserve the former architect pattern "DCBRetryExecution" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/dcb-scope-key-utilities.sdp.md b/specs/platform/patterns/dcb-scope-key-utilities.sdp.md new file mode 100644 index 00000000..a22cc602 --- /dev/null +++ b/specs/platform/patterns/dcb-scope-key-utilities.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.dcb-scope-key-utilities +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# DCBScopeKeyUtilities + +## Intent + +- outcome: Preserve the former architect pattern "DCBScopeKeyUtilities" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/dcb-types.sdp.md b/specs/platform/patterns/dcb-types.sdp.md new file mode 100644 index 00000000..dbb687c2 --- /dev/null +++ b/specs/platform/patterns/dcb-types.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.dcb-types +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# DCBTypes + +## Intent + +- outcome: Preserve the former architect pattern "DCBTypes" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/decider-assertions.sdp.md b/specs/platform/patterns/decider-assertions.sdp.md new file mode 100644 index 00000000..550045f5 --- /dev/null +++ b/specs/platform/patterns/decider-assertions.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.decider-assertions +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# DeciderAssertions + +## Intent + +- outcome: Preserve the former architect pattern "DeciderAssertions" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/decider-outputs.sdp.md b/specs/platform/patterns/decider-outputs.sdp.md new file mode 100644 index 00000000..d67eb44c --- /dev/null +++ b/specs/platform/patterns/decider-outputs.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.decider-outputs +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# DeciderOutputs + +## Intent + +- outcome: Preserve the former architect pattern "DeciderOutputs" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/decider-pattern.sdp.md b/specs/platform/patterns/decider-pattern.sdp.md new file mode 100644 index 00000000..cc8a4a96 --- /dev/null +++ b/specs/platform/patterns/decider-pattern.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.decider-pattern +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# DeciderPattern + +## Intent + +- outcome: Preserve the former architect pattern "DeciderPattern" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/dual-write-contract.sdp.md b/specs/platform/patterns/dual-write-contract.sdp.md new file mode 100644 index 00000000..6addfda8 --- /dev/null +++ b/specs/platform/patterns/dual-write-contract.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.dual-write-contract +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# DualWriteContract + +## Intent + +- outcome: Preserve the former architect pattern "DualWriteContract" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/durable-append-action.sdp.md b/specs/platform/patterns/durable-append-action.sdp.md new file mode 100644 index 00000000..11d688b7 --- /dev/null +++ b/specs/platform/patterns/durable-append-action.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.durable-append-action +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# DurableAppendAction + +## Intent + +- outcome: Preserve the former architect pattern "DurableAppendAction" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/durable-events-integration-executable-tests.sdp.md b/specs/platform/patterns/durable-events-integration-executable-tests.sdp.md new file mode 100644 index 00000000..126bd1c2 --- /dev/null +++ b/specs/platform/patterns/durable-events-integration-executable-tests.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.durable-events-integration-executable-tests +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# DurableEventsIntegrationExecutableTests + +## Intent + +- outcome: Preserve the former architect pattern "DurableEventsIntegrationExecutableTests" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/durable-events-integration.sdp.md b/specs/platform/patterns/durable-events-integration.sdp.md new file mode 100644 index 00000000..4132df09 --- /dev/null +++ b/specs/platform/patterns/durable-events-integration.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.durable-events-integration +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# DurableEventsIntegration + +## Intent + +- outcome: Preserve the former architect pattern "DurableEventsIntegration" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/durable-function-adapters.sdp.md b/specs/platform/patterns/durable-function-adapters.sdp.md new file mode 100644 index 00000000..538c0e62 --- /dev/null +++ b/specs/platform/patterns/durable-function-adapters.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.durable-function-adapters +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# DurableFunctionAdapters + +## Intent + +- outcome: Preserve the former architect pattern "DurableFunctionAdapters" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/dynamic-consistency-boundaries.sdp.md b/specs/platform/patterns/dynamic-consistency-boundaries.sdp.md new file mode 100644 index 00000000..e06b04b3 --- /dev/null +++ b/specs/platform/patterns/dynamic-consistency-boundaries.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.dynamic-consistency-boundaries +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# DynamicConsistencyBoundaries + +## Intent + +- outcome: Preserve the former architect pattern "DynamicConsistencyBoundaries" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/ecst-fat-events.sdp.md b/specs/platform/patterns/ecst-fat-events.sdp.md new file mode 100644 index 00000000..ed48f2d7 --- /dev/null +++ b/specs/platform/patterns/ecst-fat-events.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.ecst-fat-events +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# EcstFatEvents + +## Intent + +- outcome: Preserve the former architect pattern "EcstFatEvents" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/event-bus-abstraction.sdp.md b/specs/platform/patterns/event-bus-abstraction.sdp.md new file mode 100644 index 00000000..79c4f409 --- /dev/null +++ b/specs/platform/patterns/event-bus-abstraction.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.event-bus-abstraction +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# EventBusAbstraction + +## Intent + +- outcome: Preserve the former architect pattern "EventBusAbstraction" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/event-replay-infrastructure.sdp.md b/specs/platform/patterns/event-replay-infrastructure.sdp.md new file mode 100644 index 00000000..883b99cc --- /dev/null +++ b/specs/platform/patterns/event-replay-infrastructure.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.event-replay-infrastructure +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# EventReplayInfrastructure + +## Intent + +- outcome: Preserve the former architect pattern "EventReplayInfrastructure" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/event-store-durability.sdp.md b/specs/platform/patterns/event-store-durability.sdp.md new file mode 100644 index 00000000..6a368b1e --- /dev/null +++ b/specs/platform/patterns/event-store-durability.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.event-store-durability +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# EventStoreDurability + +## Intent + +- outcome: Preserve the former architect pattern "EventStoreDurability" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/event-store-foundation-executable-tests.sdp.md b/specs/platform/patterns/event-store-foundation-executable-tests.sdp.md new file mode 100644 index 00000000..a9bd412e --- /dev/null +++ b/specs/platform/patterns/event-store-foundation-executable-tests.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.event-store-foundation-executable-tests +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# EventStoreFoundationExecutableTests + +## Intent + +- outcome: Preserve the former architect pattern "EventStoreFoundationExecutableTests" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/event-store-foundation.sdp.md b/specs/platform/patterns/event-store-foundation.sdp.md new file mode 100644 index 00000000..729bb5de --- /dev/null +++ b/specs/platform/patterns/event-store-foundation.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.event-store-foundation +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# EventStoreFoundation + +## Intent + +- outcome: Preserve the former architect pattern "EventStoreFoundation" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/event-store.sdp.md b/specs/platform/patterns/event-store.sdp.md new file mode 100644 index 00000000..418d3238 --- /dev/null +++ b/specs/platform/patterns/event-store.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.event-store +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# EventStore + +## Intent + +- outcome: Preserve the former architect pattern "EventStore" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/event-subscription-registry.sdp.md b/specs/platform/patterns/event-subscription-registry.sdp.md new file mode 100644 index 00000000..a619855b --- /dev/null +++ b/specs/platform/patterns/event-subscription-registry.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.event-subscription-registry +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# EventSubscriptionRegistry + +## Intent + +- outcome: Preserve the former architect pattern "EventSubscriptionRegistry" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/event-upcasting.sdp.md b/specs/platform/patterns/event-upcasting.sdp.md new file mode 100644 index 00000000..0064fbeb --- /dev/null +++ b/specs/platform/patterns/event-upcasting.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.event-upcasting +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# EventUpcasting + +## Intent + +- outcome: Preserve the former architect pattern "EventUpcasting" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/example-app-architecture.sdp.md b/specs/platform/patterns/example-app-architecture.sdp.md new file mode 100644 index 00000000..d2167b15 --- /dev/null +++ b/specs/platform/patterns/example-app-architecture.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.example-app-architecture +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# ExampleAppArchitecture + +## Intent + +- outcome: Preserve the former architect pattern "ExampleAppArchitecture" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/example-app-modernization-executable-tests.sdp.md b/specs/platform/patterns/example-app-modernization-executable-tests.sdp.md new file mode 100644 index 00000000..b15348c2 --- /dev/null +++ b/specs/platform/patterns/example-app-modernization-executable-tests.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.example-app-modernization-executable-tests +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# ExampleAppModernizationExecutableTests + +## Intent + +- outcome: Preserve the former architect pattern "ExampleAppModernizationExecutableTests" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/example-app-modernization.sdp.md b/specs/platform/patterns/example-app-modernization.sdp.md new file mode 100644 index 00000000..91baff5b --- /dev/null +++ b/specs/platform/patterns/example-app-modernization.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.example-app-modernization +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# ExampleAppModernization + +## Intent + +- outcome: Preserve the former architect pattern "ExampleAppModernization" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/fsm-assertions.sdp.md b/specs/platform/patterns/fsm-assertions.sdp.md new file mode 100644 index 00000000..21baf91d --- /dev/null +++ b/specs/platform/patterns/fsm-assertions.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.fsm-assertions +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# FSMAssertions + +## Intent + +- outcome: Preserve the former architect pattern "FSMAssertions" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/fsm-transitions.sdp.md b/specs/platform/patterns/fsm-transitions.sdp.md new file mode 100644 index 00000000..1602b800 --- /dev/null +++ b/specs/platform/patterns/fsm-transitions.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.fsm-transitions +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# FSMTransitions + +## Intent + +- outcome: Preserve the former architect pattern "FSMTransitions" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/handler-factories.sdp.md b/specs/platform/patterns/handler-factories.sdp.md new file mode 100644 index 00000000..dd888d7d --- /dev/null +++ b/specs/platform/patterns/handler-factories.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.handler-factories +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# HandlerFactories + +## Intent + +- outcome: Preserve the former architect pattern "HandlerFactories" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/integration-dead-letters.sdp.md b/specs/platform/patterns/integration-dead-letters.sdp.md new file mode 100644 index 00000000..082fd938 --- /dev/null +++ b/specs/platform/patterns/integration-dead-letters.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.integration-dead-letters +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# IntegrationDeadLetters + +## Intent + +- outcome: Preserve the former architect pattern "IntegrationDeadLetters" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/integration-event-handlers.sdp.md b/specs/platform/patterns/integration-event-handlers.sdp.md new file mode 100644 index 00000000..9d6012e2 --- /dev/null +++ b/specs/platform/patterns/integration-event-handlers.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.integration-event-handlers +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# IntegrationEventHandlers + +## Intent + +- outcome: Preserve the former architect pattern "IntegrationEventHandlers" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/integration-event-schemas.sdp.md b/specs/platform/patterns/integration-event-schemas.sdp.md new file mode 100644 index 00000000..d0dd9a2c --- /dev/null +++ b/specs/platform/patterns/integration-event-schemas.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.integration-event-schemas +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# IntegrationEventSchemas + +## Intent + +- outcome: Preserve the former architect pattern "IntegrationEventSchemas" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/integration-patterns-21-a.sdp.md b/specs/platform/patterns/integration-patterns-21-a.sdp.md new file mode 100644 index 00000000..5187c58b --- /dev/null +++ b/specs/platform/patterns/integration-patterns-21-a.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.integration-patterns-21-a +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# IntegrationPatterns21a + +## Intent + +- outcome: Preserve the former architect pattern "IntegrationPatterns21a" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/integration-patterns-21-b.sdp.md b/specs/platform/patterns/integration-patterns-21-b.sdp.md new file mode 100644 index 00000000..aace48c0 --- /dev/null +++ b/specs/platform/patterns/integration-patterns-21-b.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.integration-patterns-21-b +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# IntegrationPatterns21b + +## Intent + +- outcome: Preserve the former architect pattern "IntegrationPatterns21b" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/integration-routes.sdp.md b/specs/platform/patterns/integration-routes.sdp.md new file mode 100644 index 00000000..81730b6c --- /dev/null +++ b/specs/platform/patterns/integration-routes.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.integration-routes +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# IntegrationRoutes + +## Intent + +- outcome: Preserve the former architect pattern "IntegrationRoutes" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/invariant-framework.sdp.md b/specs/platform/patterns/invariant-framework.sdp.md new file mode 100644 index 00000000..c6584da1 --- /dev/null +++ b/specs/platform/patterns/invariant-framework.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.invariant-framework +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# InvariantFramework + +## Intent + +- outcome: Preserve the former architect pattern "InvariantFramework" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/inventory-command-configs.sdp.md b/specs/platform/patterns/inventory-command-configs.sdp.md new file mode 100644 index 00000000..a0506da2 --- /dev/null +++ b/specs/platform/patterns/inventory-command-configs.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.inventory-command-configs +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# InventoryCommandConfigs + +## Intent + +- outcome: Preserve the former architect pattern "InventoryCommandConfigs" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/inventory-command-handlers.sdp.md b/specs/platform/patterns/inventory-command-handlers.sdp.md new file mode 100644 index 00000000..302f3fc9 --- /dev/null +++ b/specs/platform/patterns/inventory-command-handlers.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.inventory-command-handlers +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# InventoryCommandHandlers + +## Intent + +- outcome: Preserve the former architect pattern "InventoryCommandHandlers" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/inventory-deciders.sdp.md b/specs/platform/patterns/inventory-deciders.sdp.md new file mode 100644 index 00000000..cfdbc8fb --- /dev/null +++ b/specs/platform/patterns/inventory-deciders.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.inventory-deciders +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# InventoryDeciders + +## Intent + +- outcome: Preserve the former architect pattern "InventoryDeciders" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/inventory-domain-events.sdp.md b/specs/platform/patterns/inventory-domain-events.sdp.md new file mode 100644 index 00000000..30a3250b --- /dev/null +++ b/specs/platform/patterns/inventory-domain-events.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.inventory-domain-events +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# InventoryDomainEvents + +## Intent + +- outcome: Preserve the former architect pattern "InventoryDomainEvents" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/inventory-internal-mutations.sdp.md b/specs/platform/patterns/inventory-internal-mutations.sdp.md new file mode 100644 index 00000000..91d0962e --- /dev/null +++ b/specs/platform/patterns/inventory-internal-mutations.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.inventory-internal-mutations +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# InventoryInternalMutations + +## Intent + +- outcome: Preserve the former architect pattern "InventoryInternalMutations" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/inventory-public-api.sdp.md b/specs/platform/patterns/inventory-public-api.sdp.md new file mode 100644 index 00000000..e895f842 --- /dev/null +++ b/specs/platform/patterns/inventory-public-api.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.inventory-public-api +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# InventoryPublicAPI + +## Intent + +- outcome: Preserve the former architect pattern "InventoryPublicAPI" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/logging-infrastructure.sdp.md b/specs/platform/patterns/logging-infrastructure.sdp.md new file mode 100644 index 00000000..618a279a --- /dev/null +++ b/specs/platform/patterns/logging-infrastructure.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.logging-infrastructure +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# LoggingInfrastructure + +## Intent + +- outcome: Preserve the former architect pattern "LoggingInfrastructure" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/middleware-pipeline.sdp.md b/specs/platform/patterns/middleware-pipeline.sdp.md new file mode 100644 index 00000000..5b649ec6 --- /dev/null +++ b/specs/platform/patterns/middleware-pipeline.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.middleware-pipeline +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# MiddlewarePipeline + +## Intent + +- outcome: Preserve the former architect pattern "MiddlewarePipeline" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/mock-payment-actions.sdp.md b/specs/platform/patterns/mock-payment-actions.sdp.md new file mode 100644 index 00000000..26f67d82 --- /dev/null +++ b/specs/platform/patterns/mock-payment-actions.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.mock-payment-actions +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# MockPaymentActions + +## Intent + +- outcome: Preserve the former architect pattern "MockPaymentActions" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/order-command-configs.sdp.md b/specs/platform/patterns/order-command-configs.sdp.md new file mode 100644 index 00000000..29da0b07 --- /dev/null +++ b/specs/platform/patterns/order-command-configs.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.order-command-configs +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# OrderCommandConfigs + +## Intent + +- outcome: Preserve the former architect pattern "OrderCommandConfigs" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/order-command-handlers.sdp.md b/specs/platform/patterns/order-command-handlers.sdp.md new file mode 100644 index 00000000..2034b7fc --- /dev/null +++ b/specs/platform/patterns/order-command-handlers.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.order-command-handlers +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# OrderCommandHandlers + +## Intent + +- outcome: Preserve the former architect pattern "OrderCommandHandlers" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/order-deciders.sdp.md b/specs/platform/patterns/order-deciders.sdp.md new file mode 100644 index 00000000..5b532300 --- /dev/null +++ b/specs/platform/patterns/order-deciders.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.order-deciders +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# OrderDeciders + +## Intent + +- outcome: Preserve the former architect pattern "OrderDeciders" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/order-domain-events.sdp.md b/specs/platform/patterns/order-domain-events.sdp.md new file mode 100644 index 00000000..480af3f0 --- /dev/null +++ b/specs/platform/patterns/order-domain-events.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.order-domain-events +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# OrderDomainEvents + +## Intent + +- outcome: Preserve the former architect pattern "OrderDomainEvents" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/order-fulfillment-saga.sdp.md b/specs/platform/patterns/order-fulfillment-saga.sdp.md new file mode 100644 index 00000000..391fe867 --- /dev/null +++ b/specs/platform/patterns/order-fulfillment-saga.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.order-fulfillment-saga +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# OrderFulfillmentSaga + +## Intent + +- outcome: Preserve the former architect pattern "OrderFulfillmentSaga" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/order-items-projection.sdp.md b/specs/platform/patterns/order-items-projection.sdp.md new file mode 100644 index 00000000..2cdec190 --- /dev/null +++ b/specs/platform/patterns/order-items-projection.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.order-items-projection +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# OrderItemsProjection + +## Intent + +- outcome: Preserve the former architect pattern "OrderItemsProjection" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/order-management-infrastructure.sdp.md b/specs/platform/patterns/order-management-infrastructure.sdp.md new file mode 100644 index 00000000..775926d5 --- /dev/null +++ b/specs/platform/patterns/order-management-infrastructure.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.order-management-infrastructure +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# OrderManagementInfrastructure + +## Intent + +- outcome: Preserve the former architect pattern "OrderManagementInfrastructure" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/order-notification-pm.sdp.md b/specs/platform/patterns/order-notification-pm.sdp.md new file mode 100644 index 00000000..b5f33ce7 --- /dev/null +++ b/specs/platform/patterns/order-notification-pm.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.order-notification-pm +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# OrderNotificationPM + +## Intent + +- outcome: Preserve the former architect pattern "OrderNotificationPM" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/order-public-api.sdp.md b/specs/platform/patterns/order-public-api.sdp.md new file mode 100644 index 00000000..d29053bf --- /dev/null +++ b/specs/platform/patterns/order-public-api.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.order-public-api +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# OrderPublicAPI + +## Intent + +- outcome: Preserve the former architect pattern "OrderPublicAPI" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/order-summary-projection.sdp.md b/specs/platform/patterns/order-summary-projection.sdp.md new file mode 100644 index 00000000..ee1f46aa --- /dev/null +++ b/specs/platform/patterns/order-summary-projection.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.order-summary-projection +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# OrderSummaryProjection + +## Intent + +- outcome: Preserve the former architect pattern "OrderSummaryProjection" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/order-with-inventory-projection.sdp.md b/specs/platform/patterns/order-with-inventory-projection.sdp.md new file mode 100644 index 00000000..59d75624 --- /dev/null +++ b/specs/platform/patterns/order-with-inventory-projection.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.order-with-inventory-projection +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# OrderWithInventoryProjection + +## Intent + +- outcome: Preserve the former architect pattern "OrderWithInventoryProjection" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/payment-outbox-handler.sdp.md b/specs/platform/patterns/payment-outbox-handler.sdp.md new file mode 100644 index 00000000..87afa927 --- /dev/null +++ b/specs/platform/patterns/payment-outbox-handler.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.payment-outbox-handler +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# PaymentOutboxHandler + +## Intent + +- outcome: Preserve the former architect pattern "PaymentOutboxHandler" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/polling-utilities.sdp.md b/specs/platform/patterns/polling-utilities.sdp.md new file mode 100644 index 00000000..f9bd656c --- /dev/null +++ b/specs/platform/patterns/polling-utilities.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.polling-utilities +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# PollingUtilities + +## Intent + +- outcome: Preserve the former architect pattern "PollingUtilities" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/process-manager-lifecycle.sdp.md b/specs/platform/patterns/process-manager-lifecycle.sdp.md new file mode 100644 index 00000000..6fdf9c07 --- /dev/null +++ b/specs/platform/patterns/process-manager-lifecycle.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.process-manager-lifecycle +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# ProcessManagerLifecycle + +## Intent + +- outcome: Preserve the former architect pattern "ProcessManagerLifecycle" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/process-manager.sdp.md b/specs/platform/patterns/process-manager.sdp.md new file mode 100644 index 00000000..f21c8089 --- /dev/null +++ b/specs/platform/patterns/process-manager.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.process-manager +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# ProcessManager + +## Intent + +- outcome: Preserve the former architect pattern "ProcessManager" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/product-catalog-projection.sdp.md b/specs/platform/patterns/product-catalog-projection.sdp.md new file mode 100644 index 00000000..4f802527 --- /dev/null +++ b/specs/platform/patterns/product-catalog-projection.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.product-catalog-projection +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# ProductCatalogProjection + +## Intent + +- outcome: Preserve the former architect pattern "ProductCatalogProjection" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/projection-categories-executable-tests.sdp.md b/specs/platform/patterns/projection-categories-executable-tests.sdp.md new file mode 100644 index 00000000..444e1f42 --- /dev/null +++ b/specs/platform/patterns/projection-categories-executable-tests.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.projection-categories-executable-tests +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# ProjectionCategoriesExecutableTests + +## Intent + +- outcome: Preserve the former architect pattern "ProjectionCategoriesExecutableTests" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/projection-categories.sdp.md b/specs/platform/patterns/projection-categories.sdp.md new file mode 100644 index 00000000..d324d4a4 --- /dev/null +++ b/specs/platform/patterns/projection-categories.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.projection-categories +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# ProjectionCategories + +## Intent + +- outcome: Preserve the former architect pattern "ProjectionCategories" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/projection-checkpointing.sdp.md b/specs/platform/patterns/projection-checkpointing.sdp.md new file mode 100644 index 00000000..0b6c2b6e --- /dev/null +++ b/specs/platform/patterns/projection-checkpointing.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.projection-checkpointing +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# ProjectionCheckpointing + +## Intent + +- outcome: Preserve the former architect pattern "ProjectionCheckpointing" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/projection-dead-letters.sdp.md b/specs/platform/patterns/projection-dead-letters.sdp.md new file mode 100644 index 00000000..2fac779a --- /dev/null +++ b/specs/platform/patterns/projection-dead-letters.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.projection-dead-letters +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# ProjectionDeadLetters + +## Intent + +- outcome: Preserve the former architect pattern "ProjectionDeadLetters" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/projection-definitions.sdp.md b/specs/platform/patterns/projection-definitions.sdp.md new file mode 100644 index 00000000..9e142f76 --- /dev/null +++ b/specs/platform/patterns/projection-definitions.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.projection-definitions +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# ProjectionDefinitions + +## Intent + +- outcome: Preserve the former architect pattern "ProjectionDefinitions" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/query-abstraction.sdp.md b/specs/platform/patterns/query-abstraction.sdp.md new file mode 100644 index 00000000..22a417f1 --- /dev/null +++ b/specs/platform/patterns/query-abstraction.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.query-abstraction +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# QueryAbstraction + +## Intent + +- outcome: Preserve the former architect pattern "QueryAbstraction" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/rate-limit-definitions.sdp.md b/specs/platform/patterns/rate-limit-definitions.sdp.md new file mode 100644 index 00000000..fe2e8843 --- /dev/null +++ b/specs/platform/patterns/rate-limit-definitions.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.rate-limit-definitions +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# RateLimitDefinitions + +## Intent + +- outcome: Preserve the former architect pattern "RateLimitDefinitions" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/reactive-projection-conflict-detection.sdp.md b/specs/platform/patterns/reactive-projection-conflict-detection.sdp.md new file mode 100644 index 00000000..359ef673 --- /dev/null +++ b/specs/platform/patterns/reactive-projection-conflict-detection.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.reactive-projection-conflict-detection +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# ReactiveProjectionConflictDetection + +## Intent + +- outcome: Preserve the former architect pattern "ReactiveProjectionConflictDetection" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/reactive-projection-eligibility.sdp.md b/specs/platform/patterns/reactive-projection-eligibility.sdp.md new file mode 100644 index 00000000..8dd52a6a --- /dev/null +++ b/specs/platform/patterns/reactive-projection-eligibility.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.reactive-projection-eligibility +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# ReactiveProjectionEligibility + +## Intent + +- outcome: Preserve the former architect pattern "ReactiveProjectionEligibility" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/reactive-projection-hybrid-model.sdp.md b/specs/platform/patterns/reactive-projection-hybrid-model.sdp.md new file mode 100644 index 00000000..271da03e --- /dev/null +++ b/specs/platform/patterns/reactive-projection-hybrid-model.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.reactive-projection-hybrid-model +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# ReactiveProjectionHybridModel + +## Intent + +- outcome: Preserve the former architect pattern "ReactiveProjectionHybridModel" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/reactive-projection-shared-evolve.sdp.md b/specs/platform/patterns/reactive-projection-shared-evolve.sdp.md new file mode 100644 index 00000000..4a874c3b --- /dev/null +++ b/specs/platform/patterns/reactive-projection-shared-evolve.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.reactive-projection-shared-evolve +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# ReactiveProjectionSharedEvolve + +## Intent + +- outcome: Preserve the former architect pattern "ReactiveProjectionSharedEvolve" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/reactive-projections.sdp.md b/specs/platform/patterns/reactive-projections.sdp.md new file mode 100644 index 00000000..ea289cf5 --- /dev/null +++ b/specs/platform/patterns/reactive-projections.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.reactive-projections +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# ReactiveProjections + +## Intent + +- outcome: Preserve the former architect pattern "ReactiveProjections" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/reservation-pattern.sdp.md b/specs/platform/patterns/reservation-pattern.sdp.md new file mode 100644 index 00000000..589ee839 --- /dev/null +++ b/specs/platform/patterns/reservation-pattern.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.reservation-pattern +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# ReservationPattern + +## Intent + +- outcome: Preserve the former architect pattern "ReservationPattern" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/reservation-release-pm.sdp.md b/specs/platform/patterns/reservation-release-pm.sdp.md new file mode 100644 index 00000000..29b4238d --- /dev/null +++ b/specs/platform/patterns/reservation-release-pm.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.reservation-release-pm +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# ReservationReleasePM + +## Intent + +- outcome: Preserve the former architect pattern "ReservationReleasePM" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/saga-completion-handler.sdp.md b/specs/platform/patterns/saga-completion-handler.sdp.md new file mode 100644 index 00000000..654e6cd5 --- /dev/null +++ b/specs/platform/patterns/saga-completion-handler.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.saga-completion-handler +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# SagaCompletionHandler + +## Intent + +- outcome: Preserve the former architect pattern "SagaCompletionHandler" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/saga-orchestration-executable-tests.sdp.md b/specs/platform/patterns/saga-orchestration-executable-tests.sdp.md new file mode 100644 index 00000000..99e2df62 --- /dev/null +++ b/specs/platform/patterns/saga-orchestration-executable-tests.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.saga-orchestration-executable-tests +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# SagaOrchestrationExecutableTests + +## Intent + +- outcome: Preserve the former architect pattern "SagaOrchestrationExecutableTests" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/saga-orchestration.sdp.md b/specs/platform/patterns/saga-orchestration.sdp.md new file mode 100644 index 00000000..df2f65ad --- /dev/null +++ b/specs/platform/patterns/saga-orchestration.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.saga-orchestration +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# SagaOrchestration + +## Intent + +- outcome: Preserve the former architect pattern "SagaOrchestration" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/saga-registry.sdp.md b/specs/platform/patterns/saga-registry.sdp.md new file mode 100644 index 00000000..db9fc0d5 --- /dev/null +++ b/specs/platform/patterns/saga-registry.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.saga-registry +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# SagaRegistry + +## Intent + +- outcome: Preserve the former architect pattern "SagaRegistry" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/saga-router.sdp.md b/specs/platform/patterns/saga-router.sdp.md new file mode 100644 index 00000000..bef7d402 --- /dev/null +++ b/specs/platform/patterns/saga-router.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.saga-router +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# SagaRouter + +## Intent + +- outcome: Preserve the former architect pattern "SagaRouter" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/test-environment-guards.sdp.md b/specs/platform/patterns/test-environment-guards.sdp.md new file mode 100644 index 00000000..76416069 --- /dev/null +++ b/specs/platform/patterns/test-environment-guards.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.test-environment-guards +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# TestEnvironmentGuards + +## Intent + +- outcome: Preserve the former architect pattern "TestEnvironmentGuards" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/test-isolation.sdp.md b/specs/platform/patterns/test-isolation.sdp.md new file mode 100644 index 00000000..58540276 --- /dev/null +++ b/specs/platform/patterns/test-isolation.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.test-isolation +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# TestIsolation + +## Intent + +- outcome: Preserve the former architect pattern "TestIsolation" as an SDP Spec for delivery binding. diff --git a/specs/platform/patterns/workpool-partitioning-strategy.sdp.md b/specs/platform/patterns/workpool-partitioning-strategy.sdp.md new file mode 100644 index 00000000..4231e057 --- /dev/null +++ b/specs/platform/patterns/workpool-partitioning-strategy.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.workpool-partitioning-strategy +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# WorkpoolPartitioningStrategy + +## Intent + +- outcome: Preserve the former architect pattern "WorkpoolPartitioningStrategy" as an SDP Spec for delivery binding. diff --git a/specs/platform/production-hardening.sdp.md b/specs/platform/production-hardening.sdp.md new file mode 100644 index 00000000..6082ac2e --- /dev/null +++ b/specs/platform/production-hardening.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.production-hardening +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# Production hardening — observability and operational tooling + +## Intent + +- outcome: Add metrics, tracing, health checks, and admin tooling so production operations do not require direct database access. diff --git a/specs/platform/sdp-bindings.ts b/specs/platform/sdp-bindings.ts new file mode 100644 index 00000000..6d40bbfc --- /dev/null +++ b/specs/platform/sdp-bindings.ts @@ -0,0 +1,666 @@ +import { codeAnchor, codeAnchorId, ref } from "@libar-dev/software-delivery-protocol"; + +/** + * SDP identity bindings for the migrated platform delivery surface. + * One anchor per former architect pattern / implements target. + */ + +export const activeReservationsProjectionAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.active-reservations-projection"), + label: "ActiveReservationsProjection", + satisfies: ref("spec:platform.active-reservations-projection"), +}); + +export const agentActionHandlerAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.agent-action-handler"), + label: "AgentActionHandler", + satisfies: ref("spec:platform.agent-action-handler"), +}); + +export const agentAsBoundedContextAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.agent-as-bounded-context"), + label: "AgentAsBoundedContext", + satisfies: ref("spec:platform.agent-as-bounded-context"), +}); + +export const agentChurnRiskCompletionAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.agent-churn-risk-completion"), + label: "AgentChurnRiskCompletion", + satisfies: ref("spec:platform.agent-churn-risk-completion"), +}); + +export const agentChurnRiskCompletionExecutableTestsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.agent-churn-risk-completion-executable-tests"), + label: "AgentChurnRiskCompletionExecutableTests", + satisfies: ref("spec:platform.agent-churn-risk-completion-executable-tests"), +}); + +export const agentOnCompleteHandlerAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.agent-on-complete-handler"), + label: "AgentOnCompleteHandler", + satisfies: ref("spec:platform.agent-on-complete-handler"), +}); + +export const appCompositionRootAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.app-composition-root"), + label: "AppCompositionRoot", + satisfies: ref("spec:platform.app-composition-root"), +}); + +export const bddWorldAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.bdd-world"), + label: "BDDWorld", + satisfies: ref("spec:platform.bdd-world"), +}); + +export const bddTestingInfrastructureAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.bdd-testing-infrastructure"), + label: "BddTestingInfrastructure", + satisfies: ref("spec:platform.bdd-testing-infrastructure"), +}); + +export const bddTestingInfrastructureExecutableTestsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.bdd-testing-infrastructure-executable-tests"), + label: "BddTestingInfrastructureExecutableTests", + satisfies: ref("spec:platform.bdd-testing-infrastructure-executable-tests"), +}); + +export const boundedContextFoundationAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.bounded-context-foundation"), + label: "BoundedContextFoundation", + satisfies: ref("spec:platform.bounded-context-foundation"), +}); + +export const boundedContextFoundationExecutableTestsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.bounded-context-foundation-executable-tests"), + label: "BoundedContextFoundationExecutableTests", + satisfies: ref("spec:platform.bounded-context-foundation-executable-tests"), +}); + +export const boundedContextIdentityAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.bounded-context-identity"), + label: "BoundedContextIdentity", + satisfies: ref("spec:platform.bounded-context-identity"), +}); + +export const cmsDualWriteAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.cms-dual-write"), + label: "CMSDualWrite", + satisfies: ref("spec:platform.cms-dual-write"), +}); + +export const cmsRepositoryAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.cms-repository"), + label: "CMSRepository", + satisfies: ref("spec:platform.cms-repository"), +}); + +export const commandBusAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.command-bus"), + label: "CommandBus", + satisfies: ref("spec:platform.command-bus"), +}); + +export const commandBusFoundationAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.command-bus-foundation"), + label: "CommandBusFoundation", + satisfies: ref("spec:platform.command-bus-foundation"), +}); + +export const commandBusFoundationExecutableTestsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.command-bus-foundation-executable-tests"), + label: "CommandBusFoundationExecutableTests", + satisfies: ref("spec:platform.command-bus-foundation-executable-tests"), +}); + +export const commandBusIdempotencyAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.command-bus-idempotency"), + label: "CommandBusIdempotency", + satisfies: ref("spec:platform.command-bus-idempotency"), +}); + +export const commandOrchestratorAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.command-orchestrator"), + label: "CommandOrchestrator", + satisfies: ref("spec:platform.command-orchestrator"), +}); + +export const commandRegistryAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.command-registry"), + label: "CommandRegistry", + satisfies: ref("spec:platform.command-registry"), +}); + +export const confirmedOrderCancellationAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.confirmed-order-cancellation"), + label: "ConfirmedOrderCancellation", + satisfies: ref("spec:platform.confirmed-order-cancellation"), +}); + +export const confirmedOrderCancellationExecutableTestsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.confirmed-order-cancellation-executable-tests"), + label: "ConfirmedOrderCancellationExecutableTests", + satisfies: ref("spec:platform.confirmed-order-cancellation-executable-tests"), +}); + +export const correlationChainSystemAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.correlation-chain-system"), + label: "CorrelationChainSystem", + satisfies: ref("spec:platform.correlation-chain-system"), +}); + +export const crossContextReadModelAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.cross-context-read-model"), + label: "CrossContextReadModel", + satisfies: ref("spec:platform.cross-context-read-model"), +}); + +export const customerCancellationsProjectionAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.customer-cancellations-projection"), + label: "CustomerCancellationsProjection", + satisfies: ref("spec:platform.customer-cancellations-projection"), +}); + +export const dcbMultiProductReservationAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.dcb-multi-product-reservation"), + label: "DCBMultiProductReservation", + satisfies: ref("spec:platform.dcb-multi-product-reservation"), +}); + +export const dcbRetryExecutionAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.dcb-retry-execution"), + label: "DCBRetryExecution", + satisfies: ref("spec:platform.dcb-retry-execution"), +}); + +export const dcbScopeKeyUtilitiesAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.dcb-scope-key-utilities"), + label: "DCBScopeKeyUtilities", + satisfies: ref("spec:platform.dcb-scope-key-utilities"), +}); + +export const dcbTypesAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.dcb-types"), + label: "DCBTypes", + satisfies: ref("spec:platform.dcb-types"), +}); + +export const dataTableParsingAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.data-table-parsing"), + label: "DataTableParsing", + satisfies: ref("spec:platform.data-table-parsing"), +}); + +export const deciderAssertionsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.decider-assertions"), + label: "DeciderAssertions", + satisfies: ref("spec:platform.decider-assertions"), +}); + +export const deciderOutputsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.decider-outputs"), + label: "DeciderOutputs", + satisfies: ref("spec:platform.decider-outputs"), +}); + +export const deciderPatternAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.decider-pattern"), + label: "DeciderPattern", + satisfies: ref("spec:platform.decider-pattern"), +}); + +export const dualWriteContractAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.dual-write-contract"), + label: "DualWriteContract", + satisfies: ref("spec:platform.dual-write-contract"), +}); + +export const durableAppendActionAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.durable-append-action"), + label: "DurableAppendAction", + satisfies: ref("spec:platform.durable-append-action"), +}); + +export const durableEventsIntegrationAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.durable-events-integration"), + label: "DurableEventsIntegration", + satisfies: ref("spec:platform.durable-events-integration"), +}); + +export const durableEventsIntegrationExecutableTestsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.durable-events-integration-executable-tests"), + label: "DurableEventsIntegrationExecutableTests", + satisfies: ref("spec:platform.durable-events-integration-executable-tests"), +}); + +export const durableFunctionAdaptersAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.durable-function-adapters"), + label: "DurableFunctionAdapters", + satisfies: ref("spec:platform.durable-function-adapters"), +}); + +export const dynamicConsistencyBoundariesAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.dynamic-consistency-boundaries"), + label: "DynamicConsistencyBoundaries", + satisfies: ref("spec:platform.dynamic-consistency-boundaries"), +}); + +export const ecstFatEventsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.ecst-fat-events"), + label: "EcstFatEvents", + satisfies: ref("spec:platform.ecst-fat-events"), +}); + +export const eventBusAbstractionAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.event-bus-abstraction"), + label: "EventBusAbstraction", + satisfies: ref("spec:platform.event-bus-abstraction"), +}); + +export const eventReplayInfrastructureAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.event-replay-infrastructure"), + label: "EventReplayInfrastructure", + satisfies: ref("spec:platform.event-replay-infrastructure"), +}); + +export const eventStoreAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.event-store"), + label: "EventStore", + satisfies: ref("spec:platform.event-store"), +}); + +export const eventStoreDurabilityAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.event-store-durability"), + label: "EventStoreDurability", + satisfies: ref("spec:platform.event-store-durability"), +}); + +export const eventStoreFoundationAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.event-store-foundation"), + label: "EventStoreFoundation", + satisfies: ref("spec:platform.event-store-foundation"), +}); + +export const eventStoreFoundationExecutableTestsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.event-store-foundation-executable-tests"), + label: "EventStoreFoundationExecutableTests", + satisfies: ref("spec:platform.event-store-foundation-executable-tests"), +}); + +export const eventSubscriptionRegistryAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.event-subscription-registry"), + label: "EventSubscriptionRegistry", + satisfies: ref("spec:platform.event-subscription-registry"), +}); + +export const eventUpcastingAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.event-upcasting"), + label: "EventUpcasting", + satisfies: ref("spec:platform.event-upcasting"), +}); + +export const exampleAppArchitectureAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.example-app-architecture"), + label: "ExampleAppArchitecture", + satisfies: ref("spec:platform.example-app-architecture"), +}); + +export const exampleAppModernizationAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.example-app-modernization"), + label: "ExampleAppModernization", + satisfies: ref("spec:platform.example-app-modernization"), +}); + +export const exampleAppModernizationExecutableTestsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.example-app-modernization-executable-tests"), + label: "ExampleAppModernizationExecutableTests", + satisfies: ref("spec:platform.example-app-modernization-executable-tests"), +}); + +export const fsmAssertionsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.fsm-assertions"), + label: "FSMAssertions", + satisfies: ref("spec:platform.fsm-assertions"), +}); + +export const fsmTransitionsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.fsm-transitions"), + label: "FSMTransitions", + satisfies: ref("spec:platform.fsm-transitions"), +}); + +export const handlerFactoriesAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.handler-factories"), + label: "HandlerFactories", + satisfies: ref("spec:platform.handler-factories"), +}); + +export const integrationDeadLettersAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.integration-dead-letters"), + label: "IntegrationDeadLetters", + satisfies: ref("spec:platform.integration-dead-letters"), +}); + +export const integrationEventHandlersAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.integration-event-handlers"), + label: "IntegrationEventHandlers", + satisfies: ref("spec:platform.integration-event-handlers"), +}); + +export const integrationEventSchemasAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.integration-event-schemas"), + label: "IntegrationEventSchemas", + satisfies: ref("spec:platform.integration-event-schemas"), +}); + +export const integrationPatterns21AAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.integration-patterns-21-a"), + label: "IntegrationPatterns21a", + satisfies: ref("spec:platform.integration-patterns-21-a"), +}); + +export const integrationPatterns21BAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.integration-patterns-21-b"), + label: "IntegrationPatterns21b", + satisfies: ref("spec:platform.integration-patterns-21-b"), +}); + +export const integrationRoutesAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.integration-routes"), + label: "IntegrationRoutes", + satisfies: ref("spec:platform.integration-routes"), +}); + +export const invariantFrameworkAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.invariant-framework"), + label: "InvariantFramework", + satisfies: ref("spec:platform.invariant-framework"), +}); + +export const inventoryCommandConfigsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.inventory-command-configs"), + label: "InventoryCommandConfigs", + satisfies: ref("spec:platform.inventory-command-configs"), +}); + +export const inventoryCommandHandlersAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.inventory-command-handlers"), + label: "InventoryCommandHandlers", + satisfies: ref("spec:platform.inventory-command-handlers"), +}); + +export const inventoryDecidersAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.inventory-deciders"), + label: "InventoryDeciders", + satisfies: ref("spec:platform.inventory-deciders"), +}); + +export const inventoryDomainEventsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.inventory-domain-events"), + label: "InventoryDomainEvents", + satisfies: ref("spec:platform.inventory-domain-events"), +}); + +export const inventoryInternalMutationsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.inventory-internal-mutations"), + label: "InventoryInternalMutations", + satisfies: ref("spec:platform.inventory-internal-mutations"), +}); + +export const inventoryPublicApiAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.inventory-public-api"), + label: "InventoryPublicAPI", + satisfies: ref("spec:platform.inventory-public-api"), +}); + +export const loggingInfrastructureAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.logging-infrastructure"), + label: "LoggingInfrastructure", + satisfies: ref("spec:platform.logging-infrastructure"), +}); + +export const middlewarePipelineAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.middleware-pipeline"), + label: "MiddlewarePipeline", + satisfies: ref("spec:platform.middleware-pipeline"), +}); + +export const mockPaymentActionsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.mock-payment-actions"), + label: "MockPaymentActions", + satisfies: ref("spec:platform.mock-payment-actions"), +}); + +export const orderCommandConfigsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.order-command-configs"), + label: "OrderCommandConfigs", + satisfies: ref("spec:platform.order-command-configs"), +}); + +export const orderCommandHandlersAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.order-command-handlers"), + label: "OrderCommandHandlers", + satisfies: ref("spec:platform.order-command-handlers"), +}); + +export const orderDecidersAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.order-deciders"), + label: "OrderDeciders", + satisfies: ref("spec:platform.order-deciders"), +}); + +export const orderDomainEventsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.order-domain-events"), + label: "OrderDomainEvents", + satisfies: ref("spec:platform.order-domain-events"), +}); + +export const orderFulfillmentSagaAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.order-fulfillment-saga"), + label: "OrderFulfillmentSaga", + satisfies: ref("spec:platform.order-fulfillment-saga"), +}); + +export const orderItemsProjectionAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.order-items-projection"), + label: "OrderItemsProjection", + satisfies: ref("spec:platform.order-items-projection"), +}); + +export const orderManagementInfrastructureAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.order-management-infrastructure"), + label: "OrderManagementInfrastructure", + satisfies: ref("spec:platform.order-management-infrastructure"), +}); + +export const orderNotificationPmAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.order-notification-pm"), + label: "OrderNotificationPM", + satisfies: ref("spec:platform.order-notification-pm"), +}); + +export const orderPublicApiAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.order-public-api"), + label: "OrderPublicAPI", + satisfies: ref("spec:platform.order-public-api"), +}); + +export const orderSummaryProjectionAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.order-summary-projection"), + label: "OrderSummaryProjection", + satisfies: ref("spec:platform.order-summary-projection"), +}); + +export const orderWithInventoryProjectionAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.order-with-inventory-projection"), + label: "OrderWithInventoryProjection", + satisfies: ref("spec:platform.order-with-inventory-projection"), +}); + +export const paymentOutboxHandlerAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.payment-outbox-handler"), + label: "PaymentOutboxHandler", + satisfies: ref("spec:platform.payment-outbox-handler"), +}); + +export const pollingUtilitiesAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.polling-utilities"), + label: "PollingUtilities", + satisfies: ref("spec:platform.polling-utilities"), +}); + +export const processManagerAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.process-manager"), + label: "ProcessManager", + satisfies: ref("spec:platform.process-manager"), +}); + +export const processManagerLifecycleAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.process-manager-lifecycle"), + label: "ProcessManagerLifecycle", + satisfies: ref("spec:platform.process-manager-lifecycle"), +}); + +export const productCatalogProjectionAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.product-catalog-projection"), + label: "ProductCatalogProjection", + satisfies: ref("spec:platform.product-catalog-projection"), +}); + +export const productionHardeningAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.production-hardening"), + label: "ProductionHardening", + satisfies: ref("spec:platform.production-hardening"), +}); + +export const projectionCategoriesAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.projection-categories"), + label: "ProjectionCategories", + satisfies: ref("spec:platform.projection-categories"), +}); + +export const projectionCategoriesExecutableTestsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.projection-categories-executable-tests"), + label: "ProjectionCategoriesExecutableTests", + satisfies: ref("spec:platform.projection-categories-executable-tests"), +}); + +export const projectionCheckpointingAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.projection-checkpointing"), + label: "ProjectionCheckpointing", + satisfies: ref("spec:platform.projection-checkpointing"), +}); + +export const projectionDeadLettersAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.projection-dead-letters"), + label: "ProjectionDeadLetters", + satisfies: ref("spec:platform.projection-dead-letters"), +}); + +export const projectionDefinitionsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.projection-definitions"), + label: "ProjectionDefinitions", + satisfies: ref("spec:platform.projection-definitions"), +}); + +export const queryAbstractionAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.query-abstraction"), + label: "QueryAbstraction", + satisfies: ref("spec:platform.query-abstraction"), +}); + +export const rateLimitDefinitionsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.rate-limit-definitions"), + label: "RateLimitDefinitions", + satisfies: ref("spec:platform.rate-limit-definitions"), +}); + +export const reactiveProjectionConflictDetectionAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.reactive-projection-conflict-detection"), + label: "ReactiveProjectionConflictDetection", + satisfies: ref("spec:platform.reactive-projection-conflict-detection"), +}); + +export const reactiveProjectionEligibilityAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.reactive-projection-eligibility"), + label: "ReactiveProjectionEligibility", + satisfies: ref("spec:platform.reactive-projection-eligibility"), +}); + +export const reactiveProjectionHybridModelAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.reactive-projection-hybrid-model"), + label: "ReactiveProjectionHybridModel", + satisfies: ref("spec:platform.reactive-projection-hybrid-model"), +}); + +export const reactiveProjectionSharedEvolveAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.reactive-projection-shared-evolve"), + label: "ReactiveProjectionSharedEvolve", + satisfies: ref("spec:platform.reactive-projection-shared-evolve"), +}); + +export const reactiveProjectionsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.reactive-projections"), + label: "ReactiveProjections", + satisfies: ref("spec:platform.reactive-projections"), +}); + +export const reservationPatternAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.reservation-pattern"), + label: "ReservationPattern", + satisfies: ref("spec:platform.reservation-pattern"), +}); + +export const reservationReleasePmAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.reservation-release-pm"), + label: "ReservationReleasePM", + satisfies: ref("spec:platform.reservation-release-pm"), +}); + +export const sagaCompletionHandlerAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.saga-completion-handler"), + label: "SagaCompletionHandler", + satisfies: ref("spec:platform.saga-completion-handler"), +}); + +export const sagaOrchestrationAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.saga-orchestration"), + label: "SagaOrchestration", + satisfies: ref("spec:platform.saga-orchestration"), +}); + +export const sagaOrchestrationExecutableTestsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.saga-orchestration-executable-tests"), + label: "SagaOrchestrationExecutableTests", + satisfies: ref("spec:platform.saga-orchestration-executable-tests"), +}); + +export const sagaRegistryAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.saga-registry"), + label: "SagaRegistry", + satisfies: ref("spec:platform.saga-registry"), +}); + +export const sagaRouterAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.saga-router"), + label: "SagaRouter", + satisfies: ref("spec:platform.saga-router"), +}); + +export const testEnvironmentGuardsAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.test-environment-guards"), + label: "TestEnvironmentGuards", + satisfies: ref("spec:platform.test-environment-guards"), +}); + +export const testIsolationAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.test-isolation"), + label: "TestIsolation", + satisfies: ref("spec:platform.test-isolation"), +}); + +export const workpoolPartitioningStrategyAnchor = codeAnchor({ + id: codeAnchorId("impl:platform.workpool-partitioning-strategy"), + label: "WorkpoolPartitioningStrategy", + satisfies: ref("spec:platform.workpool-partitioning-strategy"), +}); diff --git a/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.sdp.md b/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.sdp.md new file mode 100644 index 00000000..2afb956d --- /dev/null +++ b/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.tranche-0-readiness-harness-and-dependency-hardening +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# Tranche 0 readiness harness and dependency hardening + +## Intent + +- outcome: Land store/bus backend integration harnesses and strict package validation baselines before security or correctness remediation starts. diff --git a/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.sdp.md b/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.sdp.md new file mode 100644 index 00000000..38ba0e96 --- /dev/null +++ b/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.tranche-0-release-ci-and-docs-process-guardrails +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# Tranche 0 release, CI, and docs/process guardrails + +## Intent + +- outcome: Align release automation and docs/process CI with release authority so governance and docs-only work cannot bypass validation. diff --git a/specs/platform/tranche-1-supporting-security-and-contract-sweep.sdp.md b/specs/platform/tranche-1-supporting-security-and-contract-sweep.sdp.md new file mode 100644 index 00000000..c34a5a14 --- /dev/null +++ b/specs/platform/tranche-1-supporting-security-and-contract-sweep.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.tranche-1-supporting-security-and-contract-sweep +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# Tranche 1 supporting security and contract sweep + +## Intent + +- outcome: Close remaining fail-open, correlation, authorization, lifecycle-stub, and store-dependency gaps after the auth keystone. diff --git a/specs/releases.pack.sdp.md b/specs/releases.pack.sdp.md new file mode 100644 index 00000000..b2d8341a --- /dev/null +++ b/specs/releases.pack.sdp.md @@ -0,0 +1,11 @@ +--- +id: pack:releases +specs: + - spec:releases.v0.1.0 + - spec:releases.v0.2.0 + - spec:releases.v0.3.0 + - spec:releases.vNEXT +--- +# Releases + +Release-boundary Specs migrated from architect/releases. diff --git a/specs/releases/v0.1.0.sdp.md b/specs/releases/v0.1.0.sdp.md new file mode 100644 index 00000000..d7e2a2f5 --- /dev/null +++ b/specs/releases/v0.1.0.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:releases.v0.1.0 +kind: decision +altitude: epic +readiness: idea +relations: {} +--- +# v0.1.0 — Delivery process foundation + +## Intent + +- outcome: Ship the delivery-process foundation: decisions folder, release management, Spec structure, and unified tag prefix. + +## Decision + +- decision: Treat v0.1.0 as a release-scoped decision Spec summarizing the ship boundary for that release train. diff --git a/specs/releases/v0.2.0.sdp.md b/specs/releases/v0.2.0.sdp.md new file mode 100644 index 00000000..1340d8a1 --- /dev/null +++ b/specs/releases/v0.2.0.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:releases.v0.2.0 +kind: decision +altitude: epic +readiness: idea +relations: {} +--- +# v0.2.0 — Platform roadmap (aggregate-less pivot) + +## Intent + +- outcome: Ship the aggregate-less platform roadmap release that repositions platform packages and example guidance. + +## Decision + +- decision: Treat v0.2.0 as a release-scoped decision Spec summarizing the ship boundary for that release train. diff --git a/specs/releases/v0.3.0.sdp.md b/specs/releases/v0.3.0.sdp.md new file mode 100644 index 00000000..fb75a1c7 --- /dev/null +++ b/specs/releases/v0.3.0.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:releases.v0.3.0 +kind: decision +altitude: epic +readiness: idea +relations: {} +--- +# v0.3.0 — TypeScript taxonomy migration + +## Intent + +- outcome: Ship the TypeScript-sourced taxonomy migration and related process tooling updates. + +## Decision + +- decision: Treat v0.3.0 as a release-scoped decision Spec summarizing the ship boundary for that release train. diff --git a/specs/releases/vNEXT.sdp.md b/specs/releases/vNEXT.sdp.md new file mode 100644 index 00000000..21c98ee7 --- /dev/null +++ b/specs/releases/vNEXT.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:releases.vNEXT +kind: decision +altitude: epic +readiness: idea +relations: {} +--- +# vNEXT — Unreleased work + +## Intent + +- outcome: Track unreleased platform and process work until it is cut into a named release. + +## Decision + +- decision: Treat vNEXT as a release-scoped decision Spec summarizing the ship boundary for that release train. diff --git a/specs/test-content-blocks.sdp.md b/specs/test-content-blocks.sdp.md new file mode 100644 index 00000000..f07dd3cb --- /dev/null +++ b/specs/test-content-blocks.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.test-content-blocks +kind: example +altitude: story +readiness: idea +relations: {} +--- +# Test content blocks + +## Intent + +- outcome: Demonstrate which rich Markdown content blocks generators capture, as a reference for authoring Specs. diff --git a/specs/themed-decision-architecture.sdp.md b/specs/themed-decision-architecture.sdp.md new file mode 100644 index 00000000..168d97de --- /dev/null +++ b/specs/themed-decision-architecture.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:platform.themed-decision-architecture +kind: behavior +altitude: feature +readiness: idea +relations: {} +--- +# Themed decision architecture + +## Intent + +- outcome: Generate themed decision documents and dependency graphs so decision structure reflects conceptual architecture, not only chronology. diff --git a/test/sdp-migration-guard.test.ts b/test/sdp-migration-guard.test.ts new file mode 100644 index 00000000..3fc75e9b --- /dev/null +++ b/test/sdp-migration-guard.test.ts @@ -0,0 +1,112 @@ +import { readFileSync, existsSync, readdirSync, statSync } from "node:fs"; +import { join, relative } from "node:path"; +import { describe, expect, it } from "vitest"; + +const ROOT = join(import.meta.dirname, ".."); + +function readJson(path: string): Record { + return JSON.parse(readFileSync(path, "utf8")) as Record; +} + +function walkFiles(dir: string, out: string[] = []): string[] { + if (!existsSync(dir)) return out; + for (const name of readdirSync(dir)) { + if (name === "node_modules" || name === "dist" || name === "generated") continue; + const full = join(dir, name); + const st = statSync(full); + if (st.isDirectory()) { + if (name.startsWith(".")) continue; + walkFiles(full, out); + } else { + out.push(full); + } + } + return out; +} + +describe("SDP migration guard", () => { + it("does not depend on @libar-dev/architect and installs SDP", () => { + const pkg = readJson(join(ROOT, "package.json")); + const deps = { + ...(pkg.dependencies as Record | undefined), + ...(pkg.devDependencies as Record | undefined), + }; + expect(deps["@libar-dev/architect"]).toBeUndefined(); + expect(deps["@libar-dev/software-delivery-protocol"]).toBeTruthy(); + + const lock = readFileSync(join(ROOT, "pnpm-lock.yaml"), "utf8"); + expect(lock).not.toMatch(/['"]@libar-dev\/architect@/); + expect(lock).toMatch(/@libar-dev\/software-delivery-protocol/); + }); + + it("does not wire architect bins as live package scripts", () => { + const pkg = readJson(join(ROOT, "package.json")); + const scripts = pkg.scripts as Record; + const joined = Object.entries(scripts) + .map(([name, body]) => `${name}=${body}`) + .join("\n"); + + expect(joined).not.toMatch(/\barchitect-generate\b/); + expect(joined).not.toMatch(/\barchitect-guard\b/); + expect(joined).not.toMatch(/\barchitect-lint-patterns\b/); + expect(joined).not.toMatch(/\barchitect-validate\b/); + expect(joined).not.toMatch(/\barchitect-lint-/); + + expect(scripts["sdp:build"]).toMatch(/\bsdp build\b/); + expect(scripts["sdp:validate"]).toMatch(/\bsdp validate\b/); + }); + + it("has a designated SDP corpus with carriers under specs/", () => { + const specsRoot = join(ROOT, "specs"); + expect(existsSync(specsRoot)).toBe(true); + + const carriers = walkFiles(specsRoot).filter( + (f) => f.endsWith(".sdp.md") || f.endsWith(".pack.sdp.md"), + ); + expect(carriers.length).toBeGreaterThan(0); + + const packs = carriers.filter((f) => f.endsWith(".pack.sdp.md")); + expect(packs.length).toBeGreaterThan(0); + + const bindings = join(specsRoot, "platform", "sdp-bindings.ts"); + expect(existsSync(bindings)).toBe(true); + const bindingsText = readFileSync(bindings, "utf8"); + expect(bindingsText).toMatch(/codeAnchor/); + expect(bindingsText).toMatch(/@libar-dev\/software-delivery-protocol/); + }); + + it("does not require @architect delivery tags on migrated package src bindings", () => { + const srcRoots = [ + join(ROOT, "packages"), + join(ROOT, "examples"), + join(ROOT, "apps"), + ]; + const offenders: string[] = []; + + for (const root of srcRoots) { + for (const file of walkFiles(root)) { + if (!file.endsWith(".ts") && !file.endsWith(".tsx")) continue; + // Skip tests and stories; delivery bindings live in src / convex implementation. + const rel = relative(ROOT, file).split("\\").join("/"); + if (rel.includes("/tests/") || rel.includes("/test/") || rel.includes("/stories/")) { + continue; + } + const text = readFileSync(file, "utf8"); + // Real tag lines only (JSDoc or lone tag), not historical prose mentions. + const lines = text.split("\n"); + for (let i = 0; i < lines.length; i++) { + const line = lines[i] ?? ""; + if (/^\s*\/\*\*\s*@architect(?:-[\w-]+)?(?:\s|\*|\/|$)/.test(line)) { + offenders.push(`${rel}:${i + 1}`); + continue; + } + if (/^\s*\*\s*@architect(?:-[\w-]+)?(?:\s|$|:)/.test(line)) { + offenders.push(`${rel}:${i + 1}`); + } + } + } + } + + expect(offenders, `remaining @architect tags:\n${offenders.join("\n")}`).toEqual([]); + }); +}); diff --git a/tsconfig.base.json b/tsconfig.base.json index 4eb37fee..8d5ceafe 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1,3 +1,28 @@ { - "extends": "../tsconfig.base.json" + "files": [], + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022"], + "module": "ESNext", + "moduleResolution": "bundler", + "esModuleInterop": true, + "strict": true, + "skipLibCheck": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "forceConsistentCasingInFileNames": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "exactOptionalPropertyTypes": true, + "preserveConstEnums": true, + "isolatedModules": true, + "verbatimModuleSyntax": true, + "resolveJsonModule": true, + "useUnknownInCatchVariables": true, + "ignoreDeprecations": "6.0" + }, + "exclude": ["node_modules", "dist"] } diff --git a/vitest.migration.config.ts b/vitest.migration.config.ts new file mode 100644 index 00000000..6d624496 --- /dev/null +++ b/vitest.migration.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + include: ["test/sdp-migration-guard.test.ts"], + environment: "node", + }, +}); From 02bc0104628b368dd4907f031d7abd73a9fb870a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darko=20Miji=C4=87?= Date: Wed, 19 Aug 2026 23:49:08 +0200 Subject: [PATCH 2/6] migrate executable Gherkin features into SDP Specs Author one idea-rung Spec per packages/examples/apps .feature file under specs/behavior/, pack them by family, and require the corpus to hold at least 200 Specs so the hundreds-scale delivery corpus is in the graph. --- scripts/migrate-executable-features.mjs | 322 ++++++++++++++++++ specs/README.md | 7 +- specs/behavior-frontend.pack.sdp.md | 17 + specs/behavior-order-management.pack.sdp.md | 105 ++++++ specs/behavior-platform-bc.pack.sdp.md | 10 + specs/behavior-platform-bus.pack.sdp.md | 10 + specs/behavior-platform-core.pack.sdp.md | 132 +++++++ specs/behavior-platform-decider.pack.sdp.md | 9 + specs/behavior-platform-fsm.pack.sdp.md | 9 + specs/behavior-platform-store.pack.sdp.md | 10 + specs/behavior.pack.sdp.md | 253 ++++++++++++++ specs/behavior/frontend/_epic.sdp.md | 12 + .../behavior/frontend/admin/add-stock.sdp.md | 13 + .../frontend/admin/agent-approvals.sdp.md | 13 + .../frontend/admin/create-product.sdp.md | 13 + .../frontend/dashboard/dashboard.sdp.md | 13 + .../e2e-journeys/full-order-journey.sdp.md | 13 + .../frontend/orders/create-order.sdp.md | 13 + .../frontend/orders/order-detail.sdp.md | 13 + .../frontend/orders/view-orders.sdp.md | 13 + .../frontend/products/browse-products.sdp.md | 13 + specs/behavior/order-management/_epic.sdp.md | 12 + .../order-management/agent/on-complete.sdp.md | 13 + .../deciders/add-order-item-decider.sdp.md | 13 + .../deciders/add-stock-decider.sdp.md | 13 + .../deciders/cancel-order-decider.sdp.md | 13 + .../deciders/confirm-order-decider.sdp.md | 13 + .../confirm-reservation-decider.sdp.md | 13 + .../deciders/create-order-decider.sdp.md | 13 + .../deciders/create-product-decider.sdp.md | 13 + .../expire-reservation-decider.sdp.md | 13 + .../deciders/inventory-evolve.sdp.md | 13 + .../deciders/order-evolve.sdp.md | 13 + .../release-reservation-decider.sdp.md | 13 + .../deciders/remove-order-item-decider.sdp.md | 13 + .../deciders/reservation-evolve.sdp.md | 13 + .../deciders/reserve-stock-decider.sdp.md | 13 + .../deciders/submit-order-decider.sdp.md | 13 + .../inventory/add-stock.sdp.md | 13 + .../inventory/confirm-reservation.sdp.md | 13 + .../inventory/create-product.sdp.md | 13 + .../inventory/inventory-domain.sdp.md | 13 + .../inventory/product-invariants.sdp.md | 13 + .../inventory/release-reservation.sdp.md | 13 + .../inventory/reservation-domain.sdp.md | 13 + .../inventory/reservation-invariants.sdp.md | 13 + .../inventory/reserve-stock.sdp.md | 13 + .../inventory/stock-invariants.sdp.md | 13 + .../dcb-multi-product-reservation.sdp.md | 13 + .../fat-events-order-submitted.sdp.md | 13 + .../reactive-order-detail.sdp.md | 13 + .../reference-documentation.sdp.md | 13 + .../order-management/orders/add-items.sdp.md | 13 + .../orders/cancel-order.sdp.md | 13 + .../orders/confirm-order.sdp.md | 13 + .../orders/create-order.sdp.md | 13 + .../orders/order-domain.sdp.md | 13 + .../orders/order-invariant-sets.sdp.md | 13 + .../orders/order-invariants.sdp.md | 13 + .../orders/remove-order-item.sdp.md | 13 + .../orders/submit-order.sdp.md | 13 + .../roadmap/projection-categories.sdp.md | 13 + .../order-management/sagas/admin.sdp.md | 13 + .../data-table-parsing.sdp.md | 13 + .../decider-assertions.sdp.md | 13 + .../fsm-assertions.sdp.md | 13 + .../test-isolation.sdp.md | 13 + .../durability/durable-commands.sdp.md | 13 + .../durability/durable-publication.sdp.md | 13 + .../durability/event-replay.sdp.md | 13 + .../durability/idempotent-append.sdp.md | 13 + .../durability/orphan-detection.sdp.md | 13 + .../durability/poison-event.sdp.md | 13 + .../durable-adapters/dcb-retry.sdp.md | 13 + .../durable-adapters/rate-limiting.sdp.md | 13 + .../inventory/add-stock.sdp.md | 13 + .../inventory/confirm-reservation.sdp.md | 13 + .../inventory/create-product.sdp.md | 13 + .../inventory/query-inventory.sdp.md | 13 + .../inventory/release-reservation.sdp.md | 13 + .../inventory/reservation-expiration.sdp.md | 13 + .../inventory/reserve-stock.sdp.md | 13 + .../orders/add-order-item.sdp.md | 13 + .../orders/batch-operations.sdp.md | 13 + .../orders/cancel-order.sdp.md | 13 + .../orders/create-order.sdp.md | 13 + .../orders/query-orders.sdp.md | 13 + .../orders/submit-order.sdp.md | 13 + .../sagas/order-fulfillment.sdp.md | 13 + .../sagas/saga-admin.sdp.md | 13 + .../timeline/phase-00-initialization.sdp.md | 13 + .../phase-01-core-infrastructure.sdp.md | 13 + .../phase-02-event-store-orchestration.sdp.md | 13 + .../timeline/phase-03-command-bus.sdp.md | 13 + .../timeline/phase-04-orders-bc.sdp.md | 13 + .../timeline/phase-05-inventory-bc.sdp.md | 13 + .../phase-06-cross-context-integration.sdp.md | 13 + .../phase-07-projection-engine.sdp.md | 13 + .../phase-08-documentation-polish.sdp.md | 13 + .../timeline/phase-09-event-system.sdp.md | 13 + .../timeline/phase-10-command-system.sdp.md | 13 + .../timeline/phase-11-bc-formalization.sdp.md | 13 + .../phase-12-repository-read-model.sdp.md | 13 + .../timeline/phase-13-process-manager.sdp.md | 13 + .../phase-14-decider-formalization.sdp.md | 13 + .../phase-15-projection-categories.sdp.md | 13 + .../timeline/phase-16-dcb.sdp.md | 13 + .../phase-17-reactive-projections.sdp.md | 13 + .../phase-18-production-hardening.sdp.md | 13 + .../phase-19-testing-infrastructure.sdp.md | 13 + .../phase-20-service-independence.sdp.md | 13 + .../phase-21-integration-patterns.sdp.md | 13 + .../timeline/phase-22-agent-as-bc.sdp.md | 13 + .../timeline/phase-23-process-setup.sdp.md | 13 + .../phase-24-old-roadmap-porting.sdp.md | 13 + .../timeline/phase-25-adr-porting.sdp.md | 13 + .../phase-26-workflow-configuration.sdp.md | 13 + ...se-27-pattern-annotation-priorities.sdp.md | 13 + .../phase-28-modular-claude-md.sdp.md | 13 + specs/behavior/platform-bc/_epic.sdp.md | 12 + .../behavior/platform-bc/bc-contracts.sdp.md | 13 + ...context-foundation-executable-tests.sdp.md | 13 + specs/behavior/platform-bus/_epic.sdp.md | 12 + ...and-bus-foundation-executable-tests.sdp.md | 13 + .../behavior/platform-bus/idempotency.sdp.md | 13 + specs/behavior/platform-core/_epic.sdp.md | 12 + .../platform-core/agent/action-handler.sdp.md | 13 + .../agent/agent-rate-limiter.sdp.md | 13 + .../agent/agent-subscription-action.sdp.md | 13 + .../agent/agent-subscription.sdp.md | 13 + .../platform-core/agent/approval.sdp.md | 13 + .../platform-core/agent/audit-trail.sdp.md | 13 + .../behavior/platform-core/agent/audit.sdp.md | 13 + .../agent/checkpoint-extension.sdp.md | 13 + .../platform-core/agent/checkpoint.sdp.md | 13 + .../platform-core/agent/command-bridge.sdp.md | 13 + .../agent/command-emission.sdp.md | 13 + .../platform-core/agent/command-router.sdp.md | 13 + .../platform-core/agent/commands.sdp.md | 13 + .../platform-core/agent/cost-budget.sdp.md | 13 + .../platform-core/agent/dead-letter.sdp.md | 13 + .../agent/event-subscription.sdp.md | 13 + .../platform-core/agent/human-in-loop.sdp.md | 13 + .../behavior/platform-core/agent/init.sdp.md | 13 + .../agent/lifecycle-commands.sdp.md | 13 + .../platform-core/agent/lifecycle-fsm.sdp.md | 13 + .../agent/lifecycle-handlers.sdp.md | 13 + .../agent/oncomplete-handler.sdp.md | 13 + .../agent/pattern-detection.sdp.md | 13 + .../agent/pattern-executor.sdp.md | 13 + .../agent/pattern-registry.sdp.md | 13 + .../platform-core/agent/patterns.sdp.md | 13 + .../platform-core/agent/rate-limit.sdp.md | 13 + .../platform-core/agent/thread-adapter.sdp.md | 13 + .../platform-core/batch/batch-executor.sdp.md | 13 + .../platform-core/batch/validation.sdp.md | 13 + .../platform-core/cms/upcaster.sdp.md | 13 + .../platform-core/commands/categories.sdp.md | 13 + .../platform-core/commands/errors.sdp.md | 13 + .../platform-core/commands/factories.sdp.md | 13 + .../platform-core/commands/naming.sdp.md | 13 + .../platform-core/correlation/chain.sdp.md | 13 + .../correlation/correlation-service.sdp.md | 13 + .../behavior/platform-core/dcb/execute.sdp.md | 13 + .../platform-core/dcb/scope-key.sdp.md | 13 + .../platform-core/decider/factory.sdp.md | 13 + .../dcb-conflict-retry.sdp.md | 13 + .../integration-patterns.sdp.md | 13 + .../rate-limit-adapter.sdp.md | 13 + .../ecst/fat-event-builder.sdp.md | 13 + .../ecst/fat-vs-thin-selection.sdp.md | 13 + .../platform-core/ecst/privacy-markers.sdp.md | 13 + .../ecst/schema-versioning.sdp.md | 13 + .../event-replay/replay-progress.sdp.md | 13 + .../durable-append.sdp.md | 13 + .../durable-publication.sdp.md | 13 + .../idempotent-append.sdp.md | 13 + .../intent-completion.sdp.md | 13 + .../outbox-handler.sdp.md | 13 + .../poison-event.sdp.md | 13 + .../eventbus/convex-event-bus.sdp.md | 13 + .../platform-core/eventbus/registry.sdp.md | 13 + .../platform-core/events/builder.sdp.md | 13 + .../platform-core/events/category.sdp.md | 13 + .../platform-core/events/schemas.sdp.md | 13 + .../platform-core/events/upcaster.sdp.md | 13 + specs/behavior/platform-core/fsm/fsm.sdp.md | 13 + .../platform-core/handlers/result.sdp.md | 13 + .../behavior/platform-core/ids/branded.sdp.md | 13 + .../platform-core/ids/generator.sdp.md | 13 + .../integration/anti-corruption-layer.sdp.md | 13 + .../integration/context-map.sdp.md | 13 + .../integration/contract-testing.sdp.md | 13 + .../integration/event-versioning.sdp.md | 13 + .../integration-event-publisher.sdp.md | 13 + .../integration/published-language.sdp.md | 13 + .../invariants/create-invariant-set.sdp.md | 13 + .../invariants/create-invariant.sdp.md | 13 + .../invariants/invariant-error.sdp.md | 13 + .../platform-core/logging/commands.sdp.md | 13 + .../platform-core/logging/scoped.sdp.md | 13 + .../platform-core/logging/testing.sdp.md | 13 + .../platform-core/logging/types.sdp.md | 13 + .../middleware/middleware-pipeline.sdp.md | 13 + .../middleware/middlewares.sdp.md | 13 + .../monitoring/circuit-breaker.sdp.md | 13 + .../orchestration/command-orchestrator.sdp.md | 13 + ...saga-orchestration-executable-tests.sdp.md | 13 + .../process-manager/executor.sdp.md | 13 + .../process-manager/lifecycle.sdp.md | 13 + .../process-manager/registry.sdp.md | 13 + .../process-manager/subscription.sdp.md | 13 + .../process-manager/types.sdp.md | 13 + .../process-manager/with-pm-checkpoint.sdp.md | 13 + .../production-hardening/admin-tooling.sdp.md | 13 + .../circuit-breakers.sdp.md | 13 + .../distributed-tracing.sdp.md | 13 + .../durable-function-integration.sdp.md | 13 + .../health-endpoints.sdp.md | 13 + .../metrics-collection.sdp.md | 13 + .../production-hardening/rate-limiting.sdp.md | 13 + .../category-definitions.sdp.md | 13 + .../explicit-declaration.sdp.md | 13 + .../registry-lookup.sdp.md | 13 + .../projections/categories.sdp.md | 13 + .../projections/lifecycle.sdp.md | 13 + .../platform-core/projections/registry.sdp.md | 13 + .../projections/with-checkpoint.sdp.md | 13 + .../platform-core/queries/factory.sdp.md | 13 + .../platform-core/queries/pagination.sdp.md | 13 + .../conflict-detection.sdp.md | 13 + .../reactive-projections/hybrid-model.sdp.md | 13 + .../reactive-eligibility.sdp.md | 13 + .../reactive-projections/shared-evolve.sdp.md | 13 + .../registry/command-registry.sdp.md | 13 + .../registry/define-command.sdp.md | 13 + .../repository/cms-repository.sdp.md | 13 + .../reservation/confirm-operation.sdp.md | 13 + .../reservation/release-operation.sdp.md | 13 + .../reservation/reservation-key.sdp.md | 13 + .../reservation/reserve-operation.sdp.md | 13 + .../schemas/command-schemas.sdp.md | 13 + .../platform-core/testing/guards.sdp.md | 13 + .../testing/integration-isolation.sdp.md | 13 + .../testing/platform-coverage.sdp.md | 13 + .../platform-core/testing/polling.sdp.md | 13 + .../platform-core/testing/world.sdp.md | 13 + .../complexity-classifier.sdp.md | 13 + .../partition-key-helpers.sdp.md | 13 + .../partition-validation.sdp.md | 13 + specs/behavior/platform-decider/_epic.sdp.md | 12 + .../platform-decider/decider-outputs.sdp.md | 13 + specs/behavior/platform-fsm/_epic.sdp.md | 12 + .../platform-fsm/fsm-transitions.sdp.md | 13 + specs/behavior/platform-store/_epic.sdp.md | 12 + ...t-store-foundation-executable-tests.sdp.md | 13 + .../platform-store/event-store-types.sdp.md | 13 + test/sdp-migration-guard.test.ts | 3 + 258 files changed, 4075 insertions(+), 2 deletions(-) create mode 100644 scripts/migrate-executable-features.mjs create mode 100644 specs/behavior-frontend.pack.sdp.md create mode 100644 specs/behavior-order-management.pack.sdp.md create mode 100644 specs/behavior-platform-bc.pack.sdp.md create mode 100644 specs/behavior-platform-bus.pack.sdp.md create mode 100644 specs/behavior-platform-core.pack.sdp.md create mode 100644 specs/behavior-platform-decider.pack.sdp.md create mode 100644 specs/behavior-platform-fsm.pack.sdp.md create mode 100644 specs/behavior-platform-store.pack.sdp.md create mode 100644 specs/behavior.pack.sdp.md create mode 100644 specs/behavior/frontend/_epic.sdp.md create mode 100644 specs/behavior/frontend/admin/add-stock.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.sdp.md create mode 100644 specs/behavior/frontend/admin/create-product.sdp.md create mode 100644 specs/behavior/frontend/dashboard/dashboard.sdp.md create mode 100644 specs/behavior/frontend/e2e-journeys/full-order-journey.sdp.md create mode 100644 specs/behavior/frontend/orders/create-order.sdp.md create mode 100644 specs/behavior/frontend/orders/order-detail.sdp.md create mode 100644 specs/behavior/frontend/orders/view-orders.sdp.md create mode 100644 specs/behavior/frontend/products/browse-products.sdp.md create mode 100644 specs/behavior/order-management/_epic.sdp.md create mode 100644 specs/behavior/order-management/agent/on-complete.sdp.md create mode 100644 specs/behavior/order-management/deciders/add-order-item-decider.sdp.md create mode 100644 specs/behavior/order-management/deciders/add-stock-decider.sdp.md create mode 100644 specs/behavior/order-management/deciders/cancel-order-decider.sdp.md create mode 100644 specs/behavior/order-management/deciders/confirm-order-decider.sdp.md create mode 100644 specs/behavior/order-management/deciders/confirm-reservation-decider.sdp.md create mode 100644 specs/behavior/order-management/deciders/create-order-decider.sdp.md create mode 100644 specs/behavior/order-management/deciders/create-product-decider.sdp.md create mode 100644 specs/behavior/order-management/deciders/expire-reservation-decider.sdp.md create mode 100644 specs/behavior/order-management/deciders/inventory-evolve.sdp.md create mode 100644 specs/behavior/order-management/deciders/order-evolve.sdp.md create mode 100644 specs/behavior/order-management/deciders/release-reservation-decider.sdp.md create mode 100644 specs/behavior/order-management/deciders/remove-order-item-decider.sdp.md create mode 100644 specs/behavior/order-management/deciders/reservation-evolve.sdp.md create mode 100644 specs/behavior/order-management/deciders/reserve-stock-decider.sdp.md create mode 100644 specs/behavior/order-management/deciders/submit-order-decider.sdp.md create mode 100644 specs/behavior/order-management/inventory/add-stock.sdp.md create mode 100644 specs/behavior/order-management/inventory/confirm-reservation.sdp.md create mode 100644 specs/behavior/order-management/inventory/create-product.sdp.md create mode 100644 specs/behavior/order-management/inventory/inventory-domain.sdp.md create mode 100644 specs/behavior/order-management/inventory/product-invariants.sdp.md create mode 100644 specs/behavior/order-management/inventory/release-reservation.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.sdp.md create mode 100644 specs/behavior/order-management/inventory/reserve-stock.sdp.md create mode 100644 specs/behavior/order-management/inventory/stock-invariants.sdp.md create mode 100644 specs/behavior/order-management/modernization/dcb-multi-product-reservation.sdp.md create mode 100644 specs/behavior/order-management/modernization/fat-events-order-submitted.sdp.md create mode 100644 specs/behavior/order-management/modernization/reactive-order-detail.sdp.md create mode 100644 specs/behavior/order-management/modernization/reference-documentation.sdp.md create mode 100644 specs/behavior/order-management/orders/add-items.sdp.md create mode 100644 specs/behavior/order-management/orders/cancel-order.sdp.md create mode 100644 specs/behavior/order-management/orders/confirm-order.sdp.md create mode 100644 specs/behavior/order-management/orders/create-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-domain.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.sdp.md create mode 100644 specs/behavior/order-management/orders/remove-order-item.sdp.md create mode 100644 specs/behavior/order-management/orders/submit-order.sdp.md create mode 100644 specs/behavior/order-management/roadmap/projection-categories.sdp.md create mode 100644 specs/behavior/order-management/sagas/admin.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/test-isolation.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-commands.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-publication.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/event-replay.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/idempotent-append.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/orphan-detection.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/poison-event.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/add-stock.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/create-product.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/query-inventory.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/release-reservation.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/add-order-item.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/batch-operations.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/cancel-order.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/create-order.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/query-orders.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/submit-order.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/sagas/saga-admin.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-00-initialization.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-01-core-infrastructure.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-02-event-store-orchestration.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-03-command-bus.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-04-orders-bc.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-05-inventory-bc.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-06-cross-context-integration.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-07-projection-engine.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-08-documentation-polish.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-09-event-system.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-10-command-system.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-11-bc-formalization.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-12-repository-read-model.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-13-process-manager.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-14-decider-formalization.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-15-projection-categories.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-16-dcb.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-17-reactive-projections.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-18-production-hardening.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-19-testing-infrastructure.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-20-service-independence.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-21-integration-patterns.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-22-agent-as-bc.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-23-process-setup.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-25-adr-porting.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-26-workflow-configuration.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-28-modular-claude-md.sdp.md create mode 100644 specs/behavior/platform-bc/_epic.sdp.md create mode 100644 specs/behavior/platform-bc/bc-contracts.sdp.md create mode 100644 specs/behavior/platform-bc/bounded-context-foundation-executable-tests.sdp.md create mode 100644 specs/behavior/platform-bus/_epic.sdp.md create mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.sdp.md create mode 100644 specs/behavior/platform-bus/idempotency.sdp.md create mode 100644 specs/behavior/platform-core/_epic.sdp.md create mode 100644 specs/behavior/platform-core/agent/action-handler.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-rate-limiter.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit-trail.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-bridge.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-emission.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-router.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.sdp.md create mode 100644 specs/behavior/platform-core/agent/cost-budget.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.sdp.md create mode 100644 specs/behavior/platform-core/agent/event-subscription.sdp.md create mode 100644 specs/behavior/platform-core/agent/human-in-loop.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.sdp.md create mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-detection.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-registry.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.sdp.md create mode 100644 specs/behavior/platform-core/agent/thread-adapter.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.sdp.md create mode 100644 specs/behavior/platform-core/commands/categories.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.sdp.md create mode 100644 specs/behavior/platform-core/commands/factories.sdp.md create mode 100644 specs/behavior/platform-core/commands/naming.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.sdp.md create mode 100644 specs/behavior/platform-core/correlation/correlation-service.sdp.md create mode 100644 specs/behavior/platform-core/dcb/execute.sdp.md create mode 100644 specs/behavior/platform-core/dcb/scope-key.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/integration-patterns.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.sdp.md create mode 100644 specs/behavior/platform-core/ecst/fat-event-builder.sdp.md create mode 100644 specs/behavior/platform-core/ecst/fat-vs-thin-selection.sdp.md create mode 100644 specs/behavior/platform-core/ecst/privacy-markers.sdp.md create mode 100644 specs/behavior/platform-core/ecst/schema-versioning.sdp.md create mode 100644 specs/behavior/platform-core/event-replay/replay-progress.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-append.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/idempotent-append.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/outbox-handler.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.sdp.md create mode 100644 specs/behavior/platform-core/events/builder.sdp.md create mode 100644 specs/behavior/platform-core/events/category.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.sdp.md create mode 100644 specs/behavior/platform-core/fsm/fsm.sdp.md create mode 100644 specs/behavior/platform-core/handlers/result.sdp.md create mode 100644 specs/behavior/platform-core/ids/branded.sdp.md create mode 100644 specs/behavior/platform-core/ids/generator.sdp.md create mode 100644 specs/behavior/platform-core/integration/anti-corruption-layer.sdp.md create mode 100644 specs/behavior/platform-core/integration/context-map.sdp.md create mode 100644 specs/behavior/platform-core/integration/contract-testing.sdp.md create mode 100644 specs/behavior/platform-core/integration/event-versioning.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.sdp.md create mode 100644 specs/behavior/platform-core/integration/published-language.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant.sdp.md create mode 100644 specs/behavior/platform-core/invariants/invariant-error.sdp.md create mode 100644 specs/behavior/platform-core/logging/commands.sdp.md create mode 100644 specs/behavior/platform-core/logging/scoped.sdp.md create mode 100644 specs/behavior/platform-core/logging/testing.sdp.md create mode 100644 specs/behavior/platform-core/logging/types.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.sdp.md create mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.sdp.md create mode 100644 specs/behavior/platform-core/orchestration/command-orchestrator.sdp.md create mode 100644 specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/executor.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/admin-tooling.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/circuit-breakers.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/distributed-tracing.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/health-endpoints.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/metrics-collection.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/rate-limiting.sdp.md create mode 100644 specs/behavior/platform-core/projection-categories/category-definitions.sdp.md create mode 100644 specs/behavior/platform-core/projection-categories/explicit-declaration.sdp.md create mode 100644 specs/behavior/platform-core/projection-categories/registry-lookup.sdp.md create mode 100644 specs/behavior/platform-core/projections/categories.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.sdp.md create mode 100644 specs/behavior/platform-core/projections/with-checkpoint.sdp.md create mode 100644 specs/behavior/platform-core/queries/factory.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.sdp.md create mode 100644 specs/behavior/platform-core/reactive-projections/conflict-detection.sdp.md create mode 100644 specs/behavior/platform-core/reactive-projections/hybrid-model.sdp.md create mode 100644 specs/behavior/platform-core/reactive-projections/reactive-eligibility.sdp.md create mode 100644 specs/behavior/platform-core/reactive-projections/shared-evolve.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.sdp.md create mode 100644 specs/behavior/platform-core/reservation/confirm-operation.sdp.md create mode 100644 specs/behavior/platform-core/reservation/release-operation.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reservation-key.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reserve-operation.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.sdp.md create mode 100644 specs/behavior/platform-core/testing/guards.sdp.md create mode 100644 specs/behavior/platform-core/testing/integration-isolation.sdp.md create mode 100644 specs/behavior/platform-core/testing/platform-coverage.sdp.md create mode 100644 specs/behavior/platform-core/testing/polling.sdp.md create mode 100644 specs/behavior/platform-core/testing/world.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.sdp.md create mode 100644 specs/behavior/platform-decider/_epic.sdp.md create mode 100644 specs/behavior/platform-decider/decider-outputs.sdp.md create mode 100644 specs/behavior/platform-fsm/_epic.sdp.md create mode 100644 specs/behavior/platform-fsm/fsm-transitions.sdp.md create mode 100644 specs/behavior/platform-store/_epic.sdp.md create mode 100644 specs/behavior/platform-store/event-store-foundation-executable-tests.sdp.md create mode 100644 specs/behavior/platform-store/event-store-types.sdp.md diff --git a/scripts/migrate-executable-features.mjs b/scripts/migrate-executable-features.mjs new file mode 100644 index 00000000..fc62c323 --- /dev/null +++ b/scripts/migrate-executable-features.mjs @@ -0,0 +1,322 @@ +#!/usr/bin/env node +/** + * Migrate remaining executable Gherkin feature files (packages/examples/apps) + * into SDP Markdown Specs under specs/behavior/. + * + * One Spec per feature file; each refines a family epic so the graph stays connected. + * Cucumber .feature files stay in place as runtime tests (not SDP carriers). + * + * Usage: node scripts/migrate-executable-features.mjs [--dry-run] + */ +import fs from "node:fs"; +import path from "node:path"; + +const ROOT = path.resolve(import.meta.dirname, ".."); +const DRY_RUN = process.argv.includes("--dry-run"); +const SPECS_ROOT = path.join(ROOT, "specs"); + +const SKIP_DIR = new Set(["node_modules", "dist", "generated", "coverage", ".git"]); + +/** @param {string} name */ +function toKebab(name) { + return name + .replace(/([a-z0-9])([A-Z])/g, "$1-$2") + .replace(/([A-Z]+)([A-Z][a-z])/g, "$1-$2") + .replace(/_/g, "-") + .toLowerCase() + .replace(/[^a-z0-9-]+/g, "-") + .replace(/^-+|-+$/g, "") + .replace(/-+/g, "-"); +} + +/** Path segments must match /^[A-Za-z0-9][A-Za-z0-9-]*$/ */ +function sanitizeSegment(name) { + let s = toKebab(name); + if (!s) s = "unnamed"; + if (!/^[A-Za-z]/.test(s)) s = `n-${s}`; + return s; +} + +/** + * @param {string} dir + * @param {(filePath: string) => void} visit + */ +function walk(dir, visit) { + if (!fs.existsSync(dir)) return; + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + if (entry.name.startsWith(".")) continue; + const full = path.join(dir, entry.name); + if (entry.isDirectory()) { + if (SKIP_DIR.has(entry.name)) continue; + walk(full, visit); + continue; + } + if (entry.isFile() && entry.name.endsWith(".feature")) visit(full); + } +} + +/** + * @param {string} content + */ +function parseFeature(content) { + const lines = content.split("\n"); + let title = ""; + const intentLines = []; + for (const line of lines) { + const trimmed = line.trim(); + if (trimmed.startsWith("@")) continue; + if (trimmed.startsWith("Feature:")) { + title = trimmed.slice("Feature:".length).trim(); + continue; + } + if ( + /^(Background:|Rule:|Scenario:|Scenario Outline:|Example:|# ===)/.test( + trimmed, + ) + ) { + break; + } + if (title && trimmed) intentLines.push(trimmed); + } + + const asA = intentLines.find((l) => /^As an?\b/i.test(l)); + const iWant = intentLines.find((l) => /^I want\b/i.test(l)); + const soThat = intentLines.find((l) => /^So that\b/i.test(l)); + let outcome = ""; + if (iWant && soThat) { + outcome = `${iWant.replace(/^I want\s+/i, "")} so that ${soThat.replace(/^So that\s+/i, "")}`; + } else if (soThat) { + outcome = soThat.replace(/^So that\s+/i, ""); + } else if (iWant) { + outcome = iWant.replace(/^I want\s+/i, ""); + } else if (asA) { + outcome = intentLines.slice(0, 3).join(" "); + } else { + outcome = intentLines.slice(0, 4).join(" ").slice(0, 400); + } + if (!outcome) outcome = `Capture executable behavior formerly carried in this Gherkin feature.`; + return { title, outcome: outcome.replace(/\s+/g, " ").trim().slice(0, 500) }; +} + +/** + * Map a feature file to family + relative stem under that family. + * @param {string} filePath + */ +function classify(filePath) { + const rel = path.relative(ROOT, filePath).split(path.sep).join("/"); + const parts = rel.split("/"); + /** @type {string} */ + let family; + /** @type {string[]} */ + let rest; + if (parts[0] === "packages") { + family = sanitizeSegment(parts[1] ?? "package"); + const testsIdx = parts.indexOf("tests"); + const featuresIdx = parts.indexOf("features"); + const cut = featuresIdx >= 0 ? featuresIdx + 1 : testsIdx >= 0 ? testsIdx + 1 : 2; + rest = parts.slice(cut); + if (rest[0] === "behavior") rest = rest.slice(1); + } else if (parts[0] === "examples") { + family = sanitizeSegment(parts[1] ?? "example"); + const featuresIdx = parts.indexOf("features"); + const cut = featuresIdx >= 0 ? featuresIdx + 1 : 2; + rest = parts.slice(cut); + if (rest[0] === "behavior") rest = rest.slice(1); + } else if (parts[0] === "apps") { + family = sanitizeSegment(parts[1] ?? "app"); + const featuresIdx = parts.indexOf("features"); + const testsIdx = parts.indexOf("tests"); + const cut = featuresIdx >= 0 ? featuresIdx + 1 : testsIdx >= 0 ? testsIdx + 1 : 2; + rest = parts.slice(cut); + if (rest[0] === "behavior") rest = rest.slice(1); + } else { + family = "misc"; + rest = parts.slice(1); + } + const file = rest.pop() ?? "feature.feature"; + const stem = sanitizeSegment(file.replace(/\.feature$/i, "")); + const dirs = rest.map(sanitizeSegment).filter(Boolean); + return { family, dirs, stem, rel }; +} + +/** @type {Set} */ +const usedIds = new Set(); + +function collectExistingIds() { + if (!fs.existsSync(SPECS_ROOT)) return; + walkMarkdown(SPECS_ROOT, (p) => { + if (p.endsWith(".pack.sdp.md")) return; + const text = fs.readFileSync(p, "utf8"); + const m = text.match(/^id:\s*(\S+)/m); + if (m) usedIds.add(m[1]); + }); +} + +/** + * @param {string} dir + * @param {(filePath: string) => void} visit + */ +function walkMarkdown(dir, visit) { + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + if (entry.name.startsWith(".")) continue; + const full = path.join(dir, entry.name); + if (entry.isDirectory()) { + if (SKIP_DIR.has(entry.name)) continue; + walkMarkdown(full, visit); + continue; + } + if (entry.name.endsWith(".sdp.md")) visit(full); + } +} + +/** + * @param {string} preferred + */ +function uniqueId(preferred) { + if (!usedIds.has(preferred)) { + usedIds.add(preferred); + return preferred; + } + let i = 2; + while (usedIds.has(`${preferred}-${i}`)) i++; + const id = `${preferred}-${i}`; + usedIds.add(id); + return id; +} + +collectExistingIds(); + +/** @type {Map} */ +const epics = new Map(); + +function ensureEpic(family) { + if (epics.has(family)) return epics.get(family); + const id = uniqueId(`spec:behavior.${family}`); + const title = `${family} executable behavior`; + const outPath = path.join(SPECS_ROOT, "behavior", family, `_epic.sdp.md`); + const body = `--- +id: ${id} +kind: behavior +altitude: epic +readiness: idea +relations: {} +--- +# ${title} + +## Intent + +- outcome: Hold the executable Gherkin behavior Specs migrated from the ${family} test corpus. +`; + if (!DRY_RUN) { + fs.mkdirSync(path.dirname(outPath), { recursive: true }); + fs.writeFileSync(outPath, body); + } + const epic = { id, title, outPath }; + epics.set(family, epic); + return epic; +} + +/** @type {{ id: string, family: string, outPath: string, source: string }[]} */ +const created = []; +const features = []; +for (const root of [ + path.join(ROOT, "packages"), + path.join(ROOT, "examples"), + path.join(ROOT, "apps"), +]) { + walk(root, (filePath) => features.push(filePath)); +} +features.sort(); + +for (const filePath of features) { + const { family, dirs, stem, rel } = classify(filePath); + const epic = ensureEpic(family); + const pathSegs = ["behavior", family, ...dirs, stem]; + const preferredId = `spec:${pathSegs.join(".")}`; + const id = uniqueId(preferredId); + const { title, outcome } = parseFeature(fs.readFileSync(filePath, "utf8")); + const outPath = path.join(SPECS_ROOT, ...pathSegs) + ".sdp.md"; + const displayTitle = title || stem; + const body = `--- +id: ${id} +kind: behavior +altitude: story +readiness: idea +relations: + refines: ${epic.id} +--- +# ${displayTitle} + +## Intent + +- outcome: ${outcome} (test carrier: ${rel}) +`; + if (!DRY_RUN) { + fs.mkdirSync(path.dirname(outPath), { recursive: true }); + fs.writeFileSync(outPath, body); + } + created.push({ id, family, outPath, source: rel }); +} + +// Packs: one per family + an umbrella pack +/** @type {Map} */ +const byFamily = new Map(); +for (const item of created) { + const list = byFamily.get(item.family) ?? []; + list.push(item.id); + byFamily.set(item.family, list); +} + +function writePack(outPath, packId, title, framing, ids) { + const unique = [...new Set(ids)].sort(); + const body = `--- +id: ${packId} +specs: +${unique.map((s) => ` - ${s}`).join("\n")} +--- +# ${title} + +${framing} +`; + if (!DRY_RUN) { + fs.mkdirSync(path.dirname(outPath), { recursive: true }); + fs.writeFileSync(outPath, body); + } +} + +const umbrella = []; +for (const [family, ids] of [...byFamily.entries()].sort()) { + const epic = epics.get(family); + const members = epic ? [epic.id, ...ids] : ids; + umbrella.push(...members); + writePack( + path.join(SPECS_ROOT, `behavior-${family}.pack.sdp.md`), + `pack:behavior-${family}`, + `${family} behavior`, + `Executable Gherkin behavior Specs migrated from the ${family} test corpus.`, + members, + ); +} +writePack( + path.join(SPECS_ROOT, "behavior.pack.sdp.md"), + "pack:behavior", + "Executable behavior", + "All executable Gherkin behavior Specs migrated from packages, examples, and apps.", + umbrella, +); + +console.log( + JSON.stringify( + { + dryRun: DRY_RUN, + featuresScanned: features.length, + specsCreated: created.length, + epics: [...epics.keys()], + byFamily: Object.fromEntries( + [...byFamily.entries()].map(([k, v]) => [k, v.length]), + ), + }, + null, + 2, + ), +); diff --git a/specs/README.md b/specs/README.md index c30a350e..f4abf7bb 100644 --- a/specs/README.md +++ b/specs/README.md @@ -6,8 +6,9 @@ Designated **corpus root** for Libar Software Delivery Protocol (SDP) Specs and Carriers are Markdown: Specs as `*.sdp.md`, Packs as `*.pack.sdp.md`. Identity bindings live in `platform/sdp-bindings.ts`. This tree replaces the former `architect/` Gherkin intent surface for -SDP extraction and validation. The `architect/` tree may still exist as lineage; bare `.feature` -files are not SDP carriers. +SDP extraction and validation. Executable Cucumber `.feature` files remain test carriers; each +has a matching SDP Spec under `specs/behavior/`. The `architect/` tree may still exist as lineage; +bare `.feature` files are not SDP carriers. ## Packs @@ -17,6 +18,8 @@ files are not SDP carriers. | `pack:platform-patterns` | `platform-patterns.pack.sdp.md` | Pattern Specs from former architect bindings | | `pack:decisions` | `decisions.pack.sdp.md` | Migrated PDRs | | `pack:releases` | `releases.pack.sdp.md` | Release-boundary Specs | +| `pack:behavior` | `behavior.pack.sdp.md` | Umbrella pack for all migrated executable Gherkin Specs | +| `pack:behavior-*` | `behavior-.pack.sdp.md` | Per-package/example/app behavior families | ## Commands diff --git a/specs/behavior-frontend.pack.sdp.md b/specs/behavior-frontend.pack.sdp.md new file mode 100644 index 00000000..76ba958f --- /dev/null +++ b/specs/behavior-frontend.pack.sdp.md @@ -0,0 +1,17 @@ +--- +id: pack:behavior-frontend +specs: + - spec:behavior.frontend + - spec:behavior.frontend.admin.add-stock + - spec:behavior.frontend.admin.agent-approvals + - spec:behavior.frontend.admin.create-product + - spec:behavior.frontend.dashboard.dashboard + - spec:behavior.frontend.e2e-journeys.full-order-journey + - spec:behavior.frontend.orders.create-order + - spec:behavior.frontend.orders.order-detail + - spec:behavior.frontend.orders.view-orders + - spec:behavior.frontend.products.browse-products +--- +# frontend behavior + +Executable Gherkin behavior Specs migrated from the frontend test corpus. diff --git a/specs/behavior-order-management.pack.sdp.md b/specs/behavior-order-management.pack.sdp.md new file mode 100644 index 00000000..80fe717d --- /dev/null +++ b/specs/behavior-order-management.pack.sdp.md @@ -0,0 +1,105 @@ +--- +id: pack:behavior-order-management +specs: + - spec:behavior.order-management + - spec:behavior.order-management.agent.on-complete + - spec:behavior.order-management.deciders.add-order-item-decider + - spec:behavior.order-management.deciders.add-stock-decider + - spec:behavior.order-management.deciders.cancel-order-decider + - spec:behavior.order-management.deciders.confirm-order-decider + - spec:behavior.order-management.deciders.confirm-reservation-decider + - spec:behavior.order-management.deciders.create-order-decider + - spec:behavior.order-management.deciders.create-product-decider + - spec:behavior.order-management.deciders.expire-reservation-decider + - spec:behavior.order-management.deciders.inventory-evolve + - spec:behavior.order-management.deciders.order-evolve + - spec:behavior.order-management.deciders.release-reservation-decider + - spec:behavior.order-management.deciders.remove-order-item-decider + - spec:behavior.order-management.deciders.reservation-evolve + - spec:behavior.order-management.deciders.reserve-stock-decider + - spec:behavior.order-management.deciders.submit-order-decider + - spec:behavior.order-management.inventory.add-stock + - spec:behavior.order-management.inventory.confirm-reservation + - spec:behavior.order-management.inventory.create-product + - spec:behavior.order-management.inventory.inventory-domain + - spec:behavior.order-management.inventory.product-invariants + - spec:behavior.order-management.inventory.release-reservation + - spec:behavior.order-management.inventory.reservation-domain + - spec:behavior.order-management.inventory.reservation-invariants + - spec:behavior.order-management.inventory.reserve-stock + - spec:behavior.order-management.inventory.stock-invariants + - spec:behavior.order-management.modernization.dcb-multi-product-reservation + - spec:behavior.order-management.modernization.fat-events-order-submitted + - spec:behavior.order-management.modernization.reactive-order-detail + - spec:behavior.order-management.modernization.reference-documentation + - spec:behavior.order-management.orders.add-items + - spec:behavior.order-management.orders.cancel-order + - spec:behavior.order-management.orders.confirm-order + - spec:behavior.order-management.orders.create-order + - spec:behavior.order-management.orders.order-domain + - spec:behavior.order-management.orders.order-invariant-sets + - spec:behavior.order-management.orders.order-invariants + - spec:behavior.order-management.orders.remove-order-item + - spec:behavior.order-management.orders.submit-order + - spec:behavior.order-management.roadmap.projection-categories + - spec:behavior.order-management.sagas.admin + - spec:behavior.order-management.testing-infrastructure.data-table-parsing + - spec:behavior.order-management.testing-infrastructure.decider-assertions + - spec:behavior.order-management.testing-infrastructure.fsm-assertions + - spec:behavior.order-management.testing-infrastructure.test-isolation + - spec:behavior.order-management.tests.integration-features.durability.durable-commands + - spec:behavior.order-management.tests.integration-features.durability.durable-publication + - spec:behavior.order-management.tests.integration-features.durability.event-replay + - spec:behavior.order-management.tests.integration-features.durability.idempotent-append + - spec:behavior.order-management.tests.integration-features.durability.orphan-detection + - spec:behavior.order-management.tests.integration-features.durability.poison-event + - spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry + - spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting + - spec:behavior.order-management.tests.integration-features.inventory.add-stock + - spec:behavior.order-management.tests.integration-features.inventory.confirm-reservation + - spec:behavior.order-management.tests.integration-features.inventory.create-product + - spec:behavior.order-management.tests.integration-features.inventory.query-inventory + - spec:behavior.order-management.tests.integration-features.inventory.release-reservation + - spec:behavior.order-management.tests.integration-features.inventory.reservation-expiration + - spec:behavior.order-management.tests.integration-features.inventory.reserve-stock + - spec:behavior.order-management.tests.integration-features.orders.add-order-item + - spec:behavior.order-management.tests.integration-features.orders.batch-operations + - spec:behavior.order-management.tests.integration-features.orders.cancel-order + - spec:behavior.order-management.tests.integration-features.orders.create-order + - spec:behavior.order-management.tests.integration-features.orders.query-orders + - spec:behavior.order-management.tests.integration-features.orders.submit-order + - spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment + - spec:behavior.order-management.tests.integration-features.sagas.saga-admin + - spec:behavior.order-management.timeline.phase-00-initialization + - spec:behavior.order-management.timeline.phase-01-core-infrastructure + - spec:behavior.order-management.timeline.phase-02-event-store-orchestration + - spec:behavior.order-management.timeline.phase-03-command-bus + - spec:behavior.order-management.timeline.phase-04-orders-bc + - spec:behavior.order-management.timeline.phase-05-inventory-bc + - spec:behavior.order-management.timeline.phase-06-cross-context-integration + - spec:behavior.order-management.timeline.phase-07-projection-engine + - spec:behavior.order-management.timeline.phase-08-documentation-polish + - spec:behavior.order-management.timeline.phase-09-event-system + - spec:behavior.order-management.timeline.phase-10-command-system + - spec:behavior.order-management.timeline.phase-11-bc-formalization + - spec:behavior.order-management.timeline.phase-12-repository-read-model + - spec:behavior.order-management.timeline.phase-13-process-manager + - spec:behavior.order-management.timeline.phase-14-decider-formalization + - spec:behavior.order-management.timeline.phase-15-projection-categories + - spec:behavior.order-management.timeline.phase-16-dcb + - spec:behavior.order-management.timeline.phase-17-reactive-projections + - spec:behavior.order-management.timeline.phase-18-production-hardening + - spec:behavior.order-management.timeline.phase-19-testing-infrastructure + - spec:behavior.order-management.timeline.phase-20-service-independence + - spec:behavior.order-management.timeline.phase-21-integration-patterns + - spec:behavior.order-management.timeline.phase-22-agent-as-bc + - spec:behavior.order-management.timeline.phase-23-process-setup + - spec:behavior.order-management.timeline.phase-24-old-roadmap-porting + - spec:behavior.order-management.timeline.phase-25-adr-porting + - spec:behavior.order-management.timeline.phase-26-workflow-configuration + - spec:behavior.order-management.timeline.phase-27-pattern-annotation-priorities + - spec:behavior.order-management.timeline.phase-28-modular-claude-md +--- +# order-management behavior + +Executable Gherkin behavior Specs migrated from the order-management test corpus. diff --git a/specs/behavior-platform-bc.pack.sdp.md b/specs/behavior-platform-bc.pack.sdp.md new file mode 100644 index 00000000..b3bc1cf1 --- /dev/null +++ b/specs/behavior-platform-bc.pack.sdp.md @@ -0,0 +1,10 @@ +--- +id: pack:behavior-platform-bc +specs: + - spec:behavior.platform-bc + - spec:behavior.platform-bc.bc-contracts + - spec:behavior.platform-bc.bounded-context-foundation-executable-tests +--- +# platform-bc behavior + +Executable Gherkin behavior Specs migrated from the platform-bc test corpus. diff --git a/specs/behavior-platform-bus.pack.sdp.md b/specs/behavior-platform-bus.pack.sdp.md new file mode 100644 index 00000000..d7949e3c --- /dev/null +++ b/specs/behavior-platform-bus.pack.sdp.md @@ -0,0 +1,10 @@ +--- +id: pack:behavior-platform-bus +specs: + - spec:behavior.platform-bus + - spec:behavior.platform-bus.command-bus-foundation-executable-tests + - spec:behavior.platform-bus.idempotency +--- +# platform-bus behavior + +Executable Gherkin behavior Specs migrated from the platform-bus test corpus. diff --git a/specs/behavior-platform-core.pack.sdp.md b/specs/behavior-platform-core.pack.sdp.md new file mode 100644 index 00000000..ce66547f --- /dev/null +++ b/specs/behavior-platform-core.pack.sdp.md @@ -0,0 +1,132 @@ +--- +id: pack:behavior-platform-core +specs: + - spec:behavior.platform-core + - spec:behavior.platform-core.agent.action-handler + - spec:behavior.platform-core.agent.agent-rate-limiter + - spec:behavior.platform-core.agent.agent-subscription + - spec:behavior.platform-core.agent.agent-subscription-action + - spec:behavior.platform-core.agent.approval + - spec:behavior.platform-core.agent.audit + - spec:behavior.platform-core.agent.audit-trail + - spec:behavior.platform-core.agent.checkpoint + - spec:behavior.platform-core.agent.checkpoint-extension + - spec:behavior.platform-core.agent.command-bridge + - spec:behavior.platform-core.agent.command-emission + - spec:behavior.platform-core.agent.command-router + - spec:behavior.platform-core.agent.commands + - spec:behavior.platform-core.agent.cost-budget + - spec:behavior.platform-core.agent.dead-letter + - spec:behavior.platform-core.agent.event-subscription + - spec:behavior.platform-core.agent.human-in-loop + - spec:behavior.platform-core.agent.init + - spec:behavior.platform-core.agent.lifecycle-commands + - spec:behavior.platform-core.agent.lifecycle-fsm + - spec:behavior.platform-core.agent.lifecycle-handlers + - spec:behavior.platform-core.agent.oncomplete-handler + - spec:behavior.platform-core.agent.pattern-detection + - spec:behavior.platform-core.agent.pattern-executor + - spec:behavior.platform-core.agent.pattern-registry + - spec:behavior.platform-core.agent.patterns + - spec:behavior.platform-core.agent.rate-limit + - spec:behavior.platform-core.agent.thread-adapter + - spec:behavior.platform-core.batch.batch-executor + - spec:behavior.platform-core.batch.validation + - spec:behavior.platform-core.cms.upcaster + - spec:behavior.platform-core.commands.categories + - spec:behavior.platform-core.commands.errors + - spec:behavior.platform-core.commands.factories + - spec:behavior.platform-core.commands.naming + - spec:behavior.platform-core.correlation.chain + - spec:behavior.platform-core.correlation.correlation-service + - spec:behavior.platform-core.dcb.execute + - spec:behavior.platform-core.dcb.scope-key + - spec:behavior.platform-core.decider.factory + - spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry + - spec:behavior.platform-core.durable-function-adapters.integration-patterns + - spec:behavior.platform-core.durable-function-adapters.rate-limit-adapter + - spec:behavior.platform-core.ecst.fat-event-builder + - spec:behavior.platform-core.ecst.fat-vs-thin-selection + - spec:behavior.platform-core.ecst.privacy-markers + - spec:behavior.platform-core.ecst.schema-versioning + - spec:behavior.platform-core.event-replay.replay-progress + - spec:behavior.platform-core.event-store-durability.durable-append + - spec:behavior.platform-core.event-store-durability.durable-publication + - spec:behavior.platform-core.event-store-durability.idempotent-append + - spec:behavior.platform-core.event-store-durability.intent-completion + - spec:behavior.platform-core.event-store-durability.outbox-handler + - spec:behavior.platform-core.event-store-durability.poison-event + - spec:behavior.platform-core.eventbus.convex-event-bus + - spec:behavior.platform-core.eventbus.registry + - spec:behavior.platform-core.events.builder + - spec:behavior.platform-core.events.category + - spec:behavior.platform-core.events.schemas + - spec:behavior.platform-core.events.upcaster + - spec:behavior.platform-core.fsm.fsm + - spec:behavior.platform-core.handlers.result + - spec:behavior.platform-core.ids.branded + - spec:behavior.platform-core.ids.generator + - spec:behavior.platform-core.integration.anti-corruption-layer + - spec:behavior.platform-core.integration.context-map + - spec:behavior.platform-core.integration.contract-testing + - spec:behavior.platform-core.integration.event-versioning + - spec:behavior.platform-core.integration.integration-event-publisher + - spec:behavior.platform-core.integration.published-language + - spec:behavior.platform-core.invariants.create-invariant + - spec:behavior.platform-core.invariants.create-invariant-set + - spec:behavior.platform-core.invariants.invariant-error + - spec:behavior.platform-core.logging.commands + - spec:behavior.platform-core.logging.scoped + - spec:behavior.platform-core.logging.testing + - spec:behavior.platform-core.logging.types + - spec:behavior.platform-core.middleware.middleware-pipeline + - spec:behavior.platform-core.middleware.middlewares + - spec:behavior.platform-core.monitoring.circuit-breaker + - spec:behavior.platform-core.orchestration.command-orchestrator + - spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests + - spec:behavior.platform-core.process-manager.executor + - spec:behavior.platform-core.process-manager.lifecycle + - spec:behavior.platform-core.process-manager.registry + - spec:behavior.platform-core.process-manager.subscription + - spec:behavior.platform-core.process-manager.types + - spec:behavior.platform-core.process-manager.with-pm-checkpoint + - spec:behavior.platform-core.production-hardening.admin-tooling + - spec:behavior.platform-core.production-hardening.circuit-breakers + - spec:behavior.platform-core.production-hardening.distributed-tracing + - spec:behavior.platform-core.production-hardening.durable-function-integration + - spec:behavior.platform-core.production-hardening.health-endpoints + - spec:behavior.platform-core.production-hardening.metrics-collection + - spec:behavior.platform-core.production-hardening.rate-limiting + - spec:behavior.platform-core.projection-categories.category-definitions + - spec:behavior.platform-core.projection-categories.explicit-declaration + - spec:behavior.platform-core.projection-categories.registry-lookup + - spec:behavior.platform-core.projections.categories + - spec:behavior.platform-core.projections.lifecycle + - spec:behavior.platform-core.projections.registry + - spec:behavior.platform-core.projections.with-checkpoint + - spec:behavior.platform-core.queries.factory + - spec:behavior.platform-core.queries.pagination + - spec:behavior.platform-core.reactive-projections.conflict-detection + - spec:behavior.platform-core.reactive-projections.hybrid-model + - spec:behavior.platform-core.reactive-projections.reactive-eligibility + - spec:behavior.platform-core.reactive-projections.shared-evolve + - spec:behavior.platform-core.registry.command-registry + - spec:behavior.platform-core.registry.define-command + - spec:behavior.platform-core.repository.cms-repository + - spec:behavior.platform-core.reservation.confirm-operation + - spec:behavior.platform-core.reservation.release-operation + - spec:behavior.platform-core.reservation.reservation-key + - spec:behavior.platform-core.reservation.reserve-operation + - spec:behavior.platform-core.schemas.command-schemas + - spec:behavior.platform-core.testing.guards + - spec:behavior.platform-core.testing.integration-isolation + - spec:behavior.platform-core.testing.platform-coverage + - spec:behavior.platform-core.testing.polling + - spec:behavior.platform-core.testing.world + - spec:behavior.platform-core.workpool-partitioning.complexity-classifier + - spec:behavior.platform-core.workpool-partitioning.partition-key-helpers + - spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# platform-core behavior + +Executable Gherkin behavior Specs migrated from the platform-core test corpus. diff --git a/specs/behavior-platform-decider.pack.sdp.md b/specs/behavior-platform-decider.pack.sdp.md new file mode 100644 index 00000000..dfcad932 --- /dev/null +++ b/specs/behavior-platform-decider.pack.sdp.md @@ -0,0 +1,9 @@ +--- +id: pack:behavior-platform-decider +specs: + - spec:behavior.platform-decider + - spec:behavior.platform-decider.decider-outputs +--- +# platform-decider behavior + +Executable Gherkin behavior Specs migrated from the platform-decider test corpus. diff --git a/specs/behavior-platform-fsm.pack.sdp.md b/specs/behavior-platform-fsm.pack.sdp.md new file mode 100644 index 00000000..9fc55cf1 --- /dev/null +++ b/specs/behavior-platform-fsm.pack.sdp.md @@ -0,0 +1,9 @@ +--- +id: pack:behavior-platform-fsm +specs: + - spec:behavior.platform-fsm + - spec:behavior.platform-fsm.fsm-transitions +--- +# platform-fsm behavior + +Executable Gherkin behavior Specs migrated from the platform-fsm test corpus. diff --git a/specs/behavior-platform-store.pack.sdp.md b/specs/behavior-platform-store.pack.sdp.md new file mode 100644 index 00000000..2e1683c3 --- /dev/null +++ b/specs/behavior-platform-store.pack.sdp.md @@ -0,0 +1,10 @@ +--- +id: pack:behavior-platform-store +specs: + - spec:behavior.platform-store + - spec:behavior.platform-store.event-store-foundation-executable-tests + - spec:behavior.platform-store.event-store-types +--- +# platform-store behavior + +Executable Gherkin behavior Specs migrated from the platform-store test corpus. diff --git a/specs/behavior.pack.sdp.md b/specs/behavior.pack.sdp.md new file mode 100644 index 00000000..efe0b731 --- /dev/null +++ b/specs/behavior.pack.sdp.md @@ -0,0 +1,253 @@ +--- +id: pack:behavior +specs: + - spec:behavior.frontend + - spec:behavior.frontend.admin.add-stock + - spec:behavior.frontend.admin.agent-approvals + - spec:behavior.frontend.admin.create-product + - spec:behavior.frontend.dashboard.dashboard + - spec:behavior.frontend.e2e-journeys.full-order-journey + - spec:behavior.frontend.orders.create-order + - spec:behavior.frontend.orders.order-detail + - spec:behavior.frontend.orders.view-orders + - spec:behavior.frontend.products.browse-products + - spec:behavior.order-management + - spec:behavior.order-management.agent.on-complete + - spec:behavior.order-management.deciders.add-order-item-decider + - spec:behavior.order-management.deciders.add-stock-decider + - spec:behavior.order-management.deciders.cancel-order-decider + - spec:behavior.order-management.deciders.confirm-order-decider + - spec:behavior.order-management.deciders.confirm-reservation-decider + - spec:behavior.order-management.deciders.create-order-decider + - spec:behavior.order-management.deciders.create-product-decider + - spec:behavior.order-management.deciders.expire-reservation-decider + - spec:behavior.order-management.deciders.inventory-evolve + - spec:behavior.order-management.deciders.order-evolve + - spec:behavior.order-management.deciders.release-reservation-decider + - spec:behavior.order-management.deciders.remove-order-item-decider + - spec:behavior.order-management.deciders.reservation-evolve + - spec:behavior.order-management.deciders.reserve-stock-decider + - spec:behavior.order-management.deciders.submit-order-decider + - spec:behavior.order-management.inventory.add-stock + - spec:behavior.order-management.inventory.confirm-reservation + - spec:behavior.order-management.inventory.create-product + - spec:behavior.order-management.inventory.inventory-domain + - spec:behavior.order-management.inventory.product-invariants + - spec:behavior.order-management.inventory.release-reservation + - spec:behavior.order-management.inventory.reservation-domain + - spec:behavior.order-management.inventory.reservation-invariants + - spec:behavior.order-management.inventory.reserve-stock + - spec:behavior.order-management.inventory.stock-invariants + - spec:behavior.order-management.modernization.dcb-multi-product-reservation + - spec:behavior.order-management.modernization.fat-events-order-submitted + - spec:behavior.order-management.modernization.reactive-order-detail + - spec:behavior.order-management.modernization.reference-documentation + - spec:behavior.order-management.orders.add-items + - spec:behavior.order-management.orders.cancel-order + - spec:behavior.order-management.orders.confirm-order + - spec:behavior.order-management.orders.create-order + - spec:behavior.order-management.orders.order-domain + - spec:behavior.order-management.orders.order-invariant-sets + - spec:behavior.order-management.orders.order-invariants + - spec:behavior.order-management.orders.remove-order-item + - spec:behavior.order-management.orders.submit-order + - spec:behavior.order-management.roadmap.projection-categories + - spec:behavior.order-management.sagas.admin + - spec:behavior.order-management.testing-infrastructure.data-table-parsing + - spec:behavior.order-management.testing-infrastructure.decider-assertions + - spec:behavior.order-management.testing-infrastructure.fsm-assertions + - spec:behavior.order-management.testing-infrastructure.test-isolation + - spec:behavior.order-management.tests.integration-features.durability.durable-commands + - spec:behavior.order-management.tests.integration-features.durability.durable-publication + - spec:behavior.order-management.tests.integration-features.durability.event-replay + - spec:behavior.order-management.tests.integration-features.durability.idempotent-append + - spec:behavior.order-management.tests.integration-features.durability.orphan-detection + - spec:behavior.order-management.tests.integration-features.durability.poison-event + - spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry + - spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting + - spec:behavior.order-management.tests.integration-features.inventory.add-stock + - spec:behavior.order-management.tests.integration-features.inventory.confirm-reservation + - spec:behavior.order-management.tests.integration-features.inventory.create-product + - spec:behavior.order-management.tests.integration-features.inventory.query-inventory + - spec:behavior.order-management.tests.integration-features.inventory.release-reservation + - spec:behavior.order-management.tests.integration-features.inventory.reservation-expiration + - spec:behavior.order-management.tests.integration-features.inventory.reserve-stock + - spec:behavior.order-management.tests.integration-features.orders.add-order-item + - spec:behavior.order-management.tests.integration-features.orders.batch-operations + - spec:behavior.order-management.tests.integration-features.orders.cancel-order + - spec:behavior.order-management.tests.integration-features.orders.create-order + - spec:behavior.order-management.tests.integration-features.orders.query-orders + - spec:behavior.order-management.tests.integration-features.orders.submit-order + - spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment + - spec:behavior.order-management.tests.integration-features.sagas.saga-admin + - spec:behavior.order-management.timeline.phase-00-initialization + - spec:behavior.order-management.timeline.phase-01-core-infrastructure + - spec:behavior.order-management.timeline.phase-02-event-store-orchestration + - spec:behavior.order-management.timeline.phase-03-command-bus + - spec:behavior.order-management.timeline.phase-04-orders-bc + - spec:behavior.order-management.timeline.phase-05-inventory-bc + - spec:behavior.order-management.timeline.phase-06-cross-context-integration + - spec:behavior.order-management.timeline.phase-07-projection-engine + - spec:behavior.order-management.timeline.phase-08-documentation-polish + - spec:behavior.order-management.timeline.phase-09-event-system + - spec:behavior.order-management.timeline.phase-10-command-system + - spec:behavior.order-management.timeline.phase-11-bc-formalization + - spec:behavior.order-management.timeline.phase-12-repository-read-model + - spec:behavior.order-management.timeline.phase-13-process-manager + - spec:behavior.order-management.timeline.phase-14-decider-formalization + - spec:behavior.order-management.timeline.phase-15-projection-categories + - spec:behavior.order-management.timeline.phase-16-dcb + - spec:behavior.order-management.timeline.phase-17-reactive-projections + - spec:behavior.order-management.timeline.phase-18-production-hardening + - spec:behavior.order-management.timeline.phase-19-testing-infrastructure + - spec:behavior.order-management.timeline.phase-20-service-independence + - spec:behavior.order-management.timeline.phase-21-integration-patterns + - spec:behavior.order-management.timeline.phase-22-agent-as-bc + - spec:behavior.order-management.timeline.phase-23-process-setup + - spec:behavior.order-management.timeline.phase-24-old-roadmap-porting + - spec:behavior.order-management.timeline.phase-25-adr-porting + - spec:behavior.order-management.timeline.phase-26-workflow-configuration + - spec:behavior.order-management.timeline.phase-27-pattern-annotation-priorities + - spec:behavior.order-management.timeline.phase-28-modular-claude-md + - spec:behavior.platform-bc + - spec:behavior.platform-bc.bc-contracts + - spec:behavior.platform-bc.bounded-context-foundation-executable-tests + - spec:behavior.platform-bus + - spec:behavior.platform-bus.command-bus-foundation-executable-tests + - spec:behavior.platform-bus.idempotency + - spec:behavior.platform-core + - spec:behavior.platform-core.agent.action-handler + - spec:behavior.platform-core.agent.agent-rate-limiter + - spec:behavior.platform-core.agent.agent-subscription + - spec:behavior.platform-core.agent.agent-subscription-action + - spec:behavior.platform-core.agent.approval + - spec:behavior.platform-core.agent.audit + - spec:behavior.platform-core.agent.audit-trail + - spec:behavior.platform-core.agent.checkpoint + - spec:behavior.platform-core.agent.checkpoint-extension + - spec:behavior.platform-core.agent.command-bridge + - spec:behavior.platform-core.agent.command-emission + - spec:behavior.platform-core.agent.command-router + - spec:behavior.platform-core.agent.commands + - spec:behavior.platform-core.agent.cost-budget + - spec:behavior.platform-core.agent.dead-letter + - spec:behavior.platform-core.agent.event-subscription + - spec:behavior.platform-core.agent.human-in-loop + - spec:behavior.platform-core.agent.init + - spec:behavior.platform-core.agent.lifecycle-commands + - spec:behavior.platform-core.agent.lifecycle-fsm + - spec:behavior.platform-core.agent.lifecycle-handlers + - spec:behavior.platform-core.agent.oncomplete-handler + - spec:behavior.platform-core.agent.pattern-detection + - spec:behavior.platform-core.agent.pattern-executor + - spec:behavior.platform-core.agent.pattern-registry + - spec:behavior.platform-core.agent.patterns + - spec:behavior.platform-core.agent.rate-limit + - spec:behavior.platform-core.agent.thread-adapter + - spec:behavior.platform-core.batch.batch-executor + - spec:behavior.platform-core.batch.validation + - spec:behavior.platform-core.cms.upcaster + - spec:behavior.platform-core.commands.categories + - spec:behavior.platform-core.commands.errors + - spec:behavior.platform-core.commands.factories + - spec:behavior.platform-core.commands.naming + - spec:behavior.platform-core.correlation.chain + - spec:behavior.platform-core.correlation.correlation-service + - spec:behavior.platform-core.dcb.execute + - spec:behavior.platform-core.dcb.scope-key + - spec:behavior.platform-core.decider.factory + - spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry + - spec:behavior.platform-core.durable-function-adapters.integration-patterns + - spec:behavior.platform-core.durable-function-adapters.rate-limit-adapter + - spec:behavior.platform-core.ecst.fat-event-builder + - spec:behavior.platform-core.ecst.fat-vs-thin-selection + - spec:behavior.platform-core.ecst.privacy-markers + - spec:behavior.platform-core.ecst.schema-versioning + - spec:behavior.platform-core.event-replay.replay-progress + - spec:behavior.platform-core.event-store-durability.durable-append + - spec:behavior.platform-core.event-store-durability.durable-publication + - spec:behavior.platform-core.event-store-durability.idempotent-append + - spec:behavior.platform-core.event-store-durability.intent-completion + - spec:behavior.platform-core.event-store-durability.outbox-handler + - spec:behavior.platform-core.event-store-durability.poison-event + - spec:behavior.platform-core.eventbus.convex-event-bus + - spec:behavior.platform-core.eventbus.registry + - spec:behavior.platform-core.events.builder + - spec:behavior.platform-core.events.category + - spec:behavior.platform-core.events.schemas + - spec:behavior.platform-core.events.upcaster + - spec:behavior.platform-core.fsm.fsm + - spec:behavior.platform-core.handlers.result + - spec:behavior.platform-core.ids.branded + - spec:behavior.platform-core.ids.generator + - spec:behavior.platform-core.integration.anti-corruption-layer + - spec:behavior.platform-core.integration.context-map + - spec:behavior.platform-core.integration.contract-testing + - spec:behavior.platform-core.integration.event-versioning + - spec:behavior.platform-core.integration.integration-event-publisher + - spec:behavior.platform-core.integration.published-language + - spec:behavior.platform-core.invariants.create-invariant + - spec:behavior.platform-core.invariants.create-invariant-set + - spec:behavior.platform-core.invariants.invariant-error + - spec:behavior.platform-core.logging.commands + - spec:behavior.platform-core.logging.scoped + - spec:behavior.platform-core.logging.testing + - spec:behavior.platform-core.logging.types + - spec:behavior.platform-core.middleware.middleware-pipeline + - spec:behavior.platform-core.middleware.middlewares + - spec:behavior.platform-core.monitoring.circuit-breaker + - spec:behavior.platform-core.orchestration.command-orchestrator + - spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests + - spec:behavior.platform-core.process-manager.executor + - spec:behavior.platform-core.process-manager.lifecycle + - spec:behavior.platform-core.process-manager.registry + - spec:behavior.platform-core.process-manager.subscription + - spec:behavior.platform-core.process-manager.types + - spec:behavior.platform-core.process-manager.with-pm-checkpoint + - spec:behavior.platform-core.production-hardening.admin-tooling + - spec:behavior.platform-core.production-hardening.circuit-breakers + - spec:behavior.platform-core.production-hardening.distributed-tracing + - spec:behavior.platform-core.production-hardening.durable-function-integration + - spec:behavior.platform-core.production-hardening.health-endpoints + - spec:behavior.platform-core.production-hardening.metrics-collection + - spec:behavior.platform-core.production-hardening.rate-limiting + - spec:behavior.platform-core.projection-categories.category-definitions + - spec:behavior.platform-core.projection-categories.explicit-declaration + - spec:behavior.platform-core.projection-categories.registry-lookup + - spec:behavior.platform-core.projections.categories + - spec:behavior.platform-core.projections.lifecycle + - spec:behavior.platform-core.projections.registry + - spec:behavior.platform-core.projections.with-checkpoint + - spec:behavior.platform-core.queries.factory + - spec:behavior.platform-core.queries.pagination + - spec:behavior.platform-core.reactive-projections.conflict-detection + - spec:behavior.platform-core.reactive-projections.hybrid-model + - spec:behavior.platform-core.reactive-projections.reactive-eligibility + - spec:behavior.platform-core.reactive-projections.shared-evolve + - spec:behavior.platform-core.registry.command-registry + - spec:behavior.platform-core.registry.define-command + - spec:behavior.platform-core.repository.cms-repository + - spec:behavior.platform-core.reservation.confirm-operation + - spec:behavior.platform-core.reservation.release-operation + - spec:behavior.platform-core.reservation.reservation-key + - spec:behavior.platform-core.reservation.reserve-operation + - spec:behavior.platform-core.schemas.command-schemas + - spec:behavior.platform-core.testing.guards + - spec:behavior.platform-core.testing.integration-isolation + - spec:behavior.platform-core.testing.platform-coverage + - spec:behavior.platform-core.testing.polling + - spec:behavior.platform-core.testing.world + - spec:behavior.platform-core.workpool-partitioning.complexity-classifier + - spec:behavior.platform-core.workpool-partitioning.partition-key-helpers + - spec:behavior.platform-core.workpool-partitioning.partition-validation + - spec:behavior.platform-decider + - spec:behavior.platform-decider.decider-outputs + - spec:behavior.platform-fsm + - spec:behavior.platform-fsm.fsm-transitions + - spec:behavior.platform-store + - spec:behavior.platform-store.event-store-foundation-executable-tests + - spec:behavior.platform-store.event-store-types +--- +# Executable behavior + +All executable Gherkin behavior Specs migrated from packages, examples, and apps. diff --git a/specs/behavior/frontend/_epic.sdp.md b/specs/behavior/frontend/_epic.sdp.md new file mode 100644 index 00000000..fa6dd319 --- /dev/null +++ b/specs/behavior/frontend/_epic.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:behavior.frontend +kind: behavior +altitude: epic +readiness: idea +relations: {} +--- +# frontend executable behavior + +## Intent + +- outcome: Hold the executable Gherkin behavior Specs migrated from the frontend test corpus. diff --git a/specs/behavior/frontend/admin/add-stock.sdp.md b/specs/behavior/frontend/admin/add-stock.sdp.md new file mode 100644 index 00000000..5d55738e --- /dev/null +++ b/specs/behavior/frontend/admin/add-stock.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.add-stock +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend +--- +# Add Stock (Admin) + +## Intent + +- outcome: to add stock to existing products so that products are available for customers to order (test carrier: apps/frontend/tests/e2e/features/admin/add-stock.feature) diff --git a/specs/behavior/frontend/admin/agent-approvals.sdp.md b/specs/behavior/frontend/admin/agent-approvals.sdp.md new file mode 100644 index 00000000..884cf76d --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend +--- +# Agent Approval Workflow + +## Intent + +- outcome: to review and act on AI agent recommendations so that automated actions require human oversight before execution (test carrier: apps/frontend/tests/e2e/features/admin/agent-approvals.feature) diff --git a/specs/behavior/frontend/admin/create-product.sdp.md b/specs/behavior/frontend/admin/create-product.sdp.md new file mode 100644 index 00000000..07e5287f --- /dev/null +++ b/specs/behavior/frontend/admin/create-product.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.create-product +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend +--- +# Create Product (Admin) + +## Intent + +- outcome: to create new products in the system so that customers can order them (test carrier: apps/frontend/tests/e2e/features/admin/create-product.feature) diff --git a/specs/behavior/frontend/dashboard/dashboard.sdp.md b/specs/behavior/frontend/dashboard/dashboard.sdp.md new file mode 100644 index 00000000..77f25b04 --- /dev/null +++ b/specs/behavior/frontend/dashboard/dashboard.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.dashboard.dashboard +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend +--- +# Dashboard + +## Intent + +- outcome: As a user I want to see system overview (test carrier: apps/frontend/tests/e2e/features/dashboard/dashboard.feature) diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.sdp.md new file mode 100644 index 00000000..73546aa6 --- /dev/null +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.e2e-journeys.full-order-journey +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend +--- +# Full Order Journey + +## Intent + +- outcome: Complete end-to-end flow from product creation to order confirmation. This is the CRITICAL test that validates the entire DDD/ES/CQRS architecture including commands, events, projections, and sagas working together. (test carrier: apps/frontend/tests/e2e/features/e2e-journeys/full-order-journey.feature) diff --git a/specs/behavior/frontend/orders/create-order.sdp.md b/specs/behavior/frontend/orders/create-order.sdp.md new file mode 100644 index 00000000..3b211abf --- /dev/null +++ b/specs/behavior/frontend/orders/create-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.orders.create-order +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend +--- +# Create Order + +## Intent + +- outcome: Capture executable behavior formerly carried in this Gherkin feature. (test carrier: apps/frontend/tests/e2e/features/orders/create-order.feature) diff --git a/specs/behavior/frontend/orders/order-detail.sdp.md b/specs/behavior/frontend/orders/order-detail.sdp.md new file mode 100644 index 00000000..53911f5d --- /dev/null +++ b/specs/behavior/frontend/orders/order-detail.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.orders.order-detail +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend +--- +# Order Detail + +## Intent + +- outcome: Capture executable behavior formerly carried in this Gherkin feature. (test carrier: apps/frontend/tests/e2e/features/orders/order-detail.feature) diff --git a/specs/behavior/frontend/orders/view-orders.sdp.md b/specs/behavior/frontend/orders/view-orders.sdp.md new file mode 100644 index 00000000..4c02feb8 --- /dev/null +++ b/specs/behavior/frontend/orders/view-orders.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.orders.view-orders +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend +--- +# View Orders List + +## Intent + +- outcome: Capture executable behavior formerly carried in this Gherkin feature. (test carrier: apps/frontend/tests/e2e/features/orders/view-orders.feature) diff --git a/specs/behavior/frontend/products/browse-products.sdp.md b/specs/behavior/frontend/products/browse-products.sdp.md new file mode 100644 index 00000000..c4565a22 --- /dev/null +++ b/specs/behavior/frontend/products/browse-products.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.products.browse-products +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend +--- +# Browse Product Catalog + +## Intent + +- outcome: Capture executable behavior formerly carried in this Gherkin feature. (test carrier: apps/frontend/tests/e2e/features/products/browse-products.feature) diff --git a/specs/behavior/order-management/_epic.sdp.md b/specs/behavior/order-management/_epic.sdp.md new file mode 100644 index 00000000..26783d08 --- /dev/null +++ b/specs/behavior/order-management/_epic.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:behavior.order-management +kind: behavior +altitude: epic +readiness: idea +relations: {} +--- +# order-management executable behavior + +## Intent + +- outcome: Hold the executable Gherkin behavior Specs migrated from the order-management test corpus. diff --git a/specs/behavior/order-management/agent/on-complete.sdp.md b/specs/behavior/order-management/agent/on-complete.sdp.md new file mode 100644 index 00000000..ab642ca1 --- /dev/null +++ b/specs/behavior/order-management/agent/on-complete.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.agent.on-complete +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Agent onComplete Handler + +## Intent + +- outcome: agent failures to create dead letters for retry so that no events are silently lost during processing (test carrier: examples/order-management/tests/features/behavior/agent/on-complete.feature) diff --git a/specs/behavior/order-management/deciders/add-order-item-decider.sdp.md b/specs/behavior/order-management/deciders/add-order-item-decider.sdp.md new file mode 100644 index 00000000..7d08a9b3 --- /dev/null +++ b/specs/behavior/order-management/deciders/add-order-item-decider.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.add-order-item-decider +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Add Order Item Decider + +## Intent + +- outcome: Pure domain logic for adding an item to an order. The AddOrderItem decider validates that: - Order must be in draft status - Item quantity must be positive (test carrier: examples/order-management/tests/features/behavior/deciders/add-order-item.decider.feature) diff --git a/specs/behavior/order-management/deciders/add-stock-decider.sdp.md b/specs/behavior/order-management/deciders/add-stock-decider.sdp.md new file mode 100644 index 00000000..700342f3 --- /dev/null +++ b/specs/behavior/order-management/deciders/add-stock-decider.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.add-stock-decider +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Add Stock Decider + +## Intent + +- outcome: Pure domain logic for adding stock to an existing product. The AddStock decider validates that: - Quantity must be positive On success, it emits StockAdded and increases availableQuantity. (test carrier: examples/order-management/tests/features/behavior/deciders/add-stock.decider.feature) diff --git a/specs/behavior/order-management/deciders/cancel-order-decider.sdp.md b/specs/behavior/order-management/deciders/cancel-order-decider.sdp.md new file mode 100644 index 00000000..f31ea1cd --- /dev/null +++ b/specs/behavior/order-management/deciders/cancel-order-decider.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.cancel-order-decider +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Cancel Order Decider + +## Intent + +- outcome: Pure domain logic for cancelling an order. The CancelOrder decider validates that: - Order must be in draft, submitted, or confirmed status - Already cancelled orders cannot be cancelled (test carrier: examples/order-management/tests/features/behavior/deciders/cancel-order.decider.feature) diff --git a/specs/behavior/order-management/deciders/confirm-order-decider.sdp.md b/specs/behavior/order-management/deciders/confirm-order-decider.sdp.md new file mode 100644 index 00000000..49fbfdf6 --- /dev/null +++ b/specs/behavior/order-management/deciders/confirm-order-decider.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.confirm-order-decider +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Confirm Order Decider + +## Intent + +- outcome: Pure domain logic for confirming an order. The ConfirmOrder decider validates that: - Order must be in submitted status On success, it emits OrderConfirmed and transitions to confirmed status. (test carrier: examples/order-management/tests/features/behavior/deciders/confirm-order.decider.feature) diff --git a/specs/behavior/order-management/deciders/confirm-reservation-decider.sdp.md b/specs/behavior/order-management/deciders/confirm-reservation-decider.sdp.md new file mode 100644 index 00000000..9213e46c --- /dev/null +++ b/specs/behavior/order-management/deciders/confirm-reservation-decider.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.confirm-reservation-decider +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Confirm Reservation Decider + +## Intent + +- outcome: Pure domain logic for confirming a pending reservation. The ConfirmReservation decider validates that: - Reservation must be in pending status (FSM transition) - Reservation must not be expired (test carrier: examples/order-management/tests/features/behavior/deciders/confirm-reservation.decider.feature) diff --git a/specs/behavior/order-management/deciders/create-order-decider.sdp.md b/specs/behavior/order-management/deciders/create-order-decider.sdp.md new file mode 100644 index 00000000..69ce3952 --- /dev/null +++ b/specs/behavior/order-management/deciders/create-order-decider.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.create-order-decider +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Create Order Decider + +## Intent + +- outcome: Pure domain logic for creating a new order. The CreateOrder decider validates that: - No order with the same ID already exists On success, it emits OrderCreated with draft status. (test carrier: examples/order-management/tests/features/behavior/deciders/create-order.decider.feature) diff --git a/specs/behavior/order-management/deciders/create-product-decider.sdp.md b/specs/behavior/order-management/deciders/create-product-decider.sdp.md new file mode 100644 index 00000000..8175b42d --- /dev/null +++ b/specs/behavior/order-management/deciders/create-product-decider.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.create-product-decider +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Create Product Decider + +## Intent + +- outcome: Pure domain logic for creating a new product. The CreateProduct decider validates that: - No product with the same ID already exists - Product name is not empty (test carrier: examples/order-management/tests/features/behavior/deciders/create-product.decider.feature) diff --git a/specs/behavior/order-management/deciders/expire-reservation-decider.sdp.md b/specs/behavior/order-management/deciders/expire-reservation-decider.sdp.md new file mode 100644 index 00000000..b2a1c60d --- /dev/null +++ b/specs/behavior/order-management/deciders/expire-reservation-decider.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.expire-reservation-decider +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Expire Reservation Decider + +## Intent + +- outcome: Pure domain logic for expiring a timed-out reservation. The ExpireReservation decider validates that: - Reservation must be in pending status (only pending can expire) - Reservation expiration time must have passed (test carrier: examples/order-management/tests/features/behavior/deciders/expire-reservation.decider.feature) diff --git a/specs/behavior/order-management/deciders/inventory-evolve.sdp.md b/specs/behavior/order-management/deciders/inventory-evolve.sdp.md new file mode 100644 index 00000000..6804d2bd --- /dev/null +++ b/specs/behavior/order-management/deciders/inventory-evolve.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.inventory-evolve +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Inventory Evolve Functions + +## Intent + +- outcome: Pure state transition functions for inventory events. These evolve functions apply events to produce new state, enabling deterministic event replay and projection rebuilding. (test carrier: examples/order-management/tests/features/behavior/deciders/inventory-evolve.feature) diff --git a/specs/behavior/order-management/deciders/order-evolve.sdp.md b/specs/behavior/order-management/deciders/order-evolve.sdp.md new file mode 100644 index 00000000..167ebcaf --- /dev/null +++ b/specs/behavior/order-management/deciders/order-evolve.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.order-evolve +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Order State Evolution + +## Intent + +- outcome: Pure evolve functions that apply events to produce new state. These functions are the second half of the Decider pattern: - decide(state, command) -> event (tested in *.decider.feature) - evolve(state, event) -> new state (tested here) (test carrier: examples/order-management/tests/features/behavior/deciders/order-evolve.feature) diff --git a/specs/behavior/order-management/deciders/release-reservation-decider.sdp.md b/specs/behavior/order-management/deciders/release-reservation-decider.sdp.md new file mode 100644 index 00000000..ba9a45ad --- /dev/null +++ b/specs/behavior/order-management/deciders/release-reservation-decider.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.release-reservation-decider +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Release Reservation Decider + +## Intent + +- outcome: Pure domain logic for releasing a reservation. The ReleaseReservation decider validates that: - Reservation must be in pending or confirmed status (FSM allows release from both) On success, it emits ReservationReleased and updates status to "released". (test carrier: examples/order-management/tests/features/behavior/deciders/release-reservation.decider.feature) diff --git a/specs/behavior/order-management/deciders/remove-order-item-decider.sdp.md b/specs/behavior/order-management/deciders/remove-order-item-decider.sdp.md new file mode 100644 index 00000000..3b0d2be3 --- /dev/null +++ b/specs/behavior/order-management/deciders/remove-order-item-decider.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.remove-order-item-decider +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Remove Order Item Decider + +## Intent + +- outcome: Pure domain logic for removing an item from an order. The RemoveOrderItem decider validates that: - Order must be in draft status - Item with the given productId must exist in the order (test carrier: examples/order-management/tests/features/behavior/deciders/remove-order-item.decider.feature) diff --git a/specs/behavior/order-management/deciders/reservation-evolve.sdp.md b/specs/behavior/order-management/deciders/reservation-evolve.sdp.md new file mode 100644 index 00000000..2b96b9d4 --- /dev/null +++ b/specs/behavior/order-management/deciders/reservation-evolve.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.reservation-evolve +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Reservation Evolve Functions + +## Intent + +- outcome: Pure state transition functions for reservation events. These evolve functions apply events to produce new state, enabling deterministic event replay and projection rebuilding. (test carrier: examples/order-management/tests/features/behavior/deciders/reservation-evolve.feature) diff --git a/specs/behavior/order-management/deciders/reserve-stock-decider.sdp.md b/specs/behavior/order-management/deciders/reserve-stock-decider.sdp.md new file mode 100644 index 00000000..ecf3fd8c --- /dev/null +++ b/specs/behavior/order-management/deciders/reserve-stock-decider.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.reserve-stock-decider +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Reserve Stock Decider + +## Intent + +- outcome: Pure domain logic for reserving stock for an order. The ReserveStock decider validates that: - Items array must not be empty - All products must have sufficient available stock (test carrier: examples/order-management/tests/features/behavior/deciders/reserve-stock.decider.feature) diff --git a/specs/behavior/order-management/deciders/submit-order-decider.sdp.md b/specs/behavior/order-management/deciders/submit-order-decider.sdp.md new file mode 100644 index 00000000..c4693ab8 --- /dev/null +++ b/specs/behavior/order-management/deciders/submit-order-decider.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.submit-order-decider +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Submit Order Decider + +## Intent + +- outcome: Pure domain logic for submitting an order. The SubmitOrder decider validates that: - Order must be in draft status - Order must have at least one item (test carrier: examples/order-management/tests/features/behavior/deciders/submit-order.decider.feature) diff --git a/specs/behavior/order-management/inventory/add-stock.sdp.md b/specs/behavior/order-management/inventory/add-stock.sdp.md new file mode 100644 index 00000000..6e26fb9f --- /dev/null +++ b/specs/behavior/order-management/inventory/add-stock.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.add-stock +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Add Stock + +## Intent + +- outcome: to add stock to existing products so that products are available for sale (test carrier: examples/order-management/tests/features/behavior/inventory/add-stock.feature) diff --git a/specs/behavior/order-management/inventory/confirm-reservation.sdp.md b/specs/behavior/order-management/inventory/confirm-reservation.sdp.md new file mode 100644 index 00000000..7f4aa31c --- /dev/null +++ b/specs/behavior/order-management/inventory/confirm-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.confirm-reservation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Confirm Reservation + +## Intent + +- outcome: to confirm stock reservations so that reserved stock is permanently allocated to orders (test carrier: examples/order-management/tests/features/behavior/inventory/confirm-reservation.feature) diff --git a/specs/behavior/order-management/inventory/create-product.sdp.md b/specs/behavior/order-management/inventory/create-product.sdp.md new file mode 100644 index 00000000..44ad7bce --- /dev/null +++ b/specs/behavior/order-management/inventory/create-product.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.create-product +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Create Product + +## Intent + +- outcome: to create new products in the catalog so that they can be sold and tracked (test carrier: examples/order-management/tests/features/behavior/inventory/create-product.feature) diff --git a/specs/behavior/order-management/inventory/inventory-domain.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.sdp.md new file mode 100644 index 00000000..1e2a38af --- /dev/null +++ b/specs/behavior/order-management/inventory/inventory-domain.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.inventory-domain +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Inventory Domain Functions + +## Intent + +- outcome: pure domain functions to behave correctly so that inventory state is calculated, initialized, and upcasted reliably (test carrier: examples/order-management/tests/features/behavior/inventory/inventory-domain.feature) diff --git a/specs/behavior/order-management/inventory/product-invariants.sdp.md b/specs/behavior/order-management/inventory/product-invariants.sdp.md new file mode 100644 index 00000000..b5d53457 --- /dev/null +++ b/specs/behavior/order-management/inventory/product-invariants.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.product-invariants +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Product Invariants + +## Intent + +- outcome: pure invariant functions that validate product state so that invalid state transitions are prevented with structured error information (test carrier: examples/order-management/tests/features/behavior/inventory/product-invariants.feature) diff --git a/specs/behavior/order-management/inventory/release-reservation.sdp.md b/specs/behavior/order-management/inventory/release-reservation.sdp.md new file mode 100644 index 00000000..46c9340e --- /dev/null +++ b/specs/behavior/order-management/inventory/release-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.release-reservation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Release Reservation + +## Intent + +- outcome: to release stock reservations so that stock returns to available when orders are cancelled (test carrier: examples/order-management/tests/features/behavior/inventory/release-reservation.feature) diff --git a/specs/behavior/order-management/inventory/reservation-domain.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.sdp.md new file mode 100644 index 00000000..b79aa098 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Reservation Domain Functions + +## Intent + +- outcome: pure reservation domain functions to behave correctly so that reservation CMS state is managed reliably (test carrier: examples/order-management/tests/features/behavior/inventory/reservation-domain.feature) diff --git a/specs/behavior/order-management/inventory/reservation-invariants.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.sdp.md new file mode 100644 index 00000000..87c5ee25 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Reservation Invariants + +## Intent + +- outcome: reservation invariant functions to enforce domain rules so that invalid reservation state is rejected consistently (test carrier: examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature) diff --git a/specs/behavior/order-management/inventory/reserve-stock.sdp.md b/specs/behavior/order-management/inventory/reserve-stock.sdp.md new file mode 100644 index 00000000..be2a0828 --- /dev/null +++ b/specs/behavior/order-management/inventory/reserve-stock.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reserve-stock +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Reserve Stock + +## Intent + +- outcome: to reserve stock for orders so that stock is held until order is confirmed or cancelled (test carrier: examples/order-management/tests/features/behavior/inventory/reserve-stock.feature) diff --git a/specs/behavior/order-management/inventory/stock-invariants.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.sdp.md new file mode 100644 index 00000000..f25f2188 --- /dev/null +++ b/specs/behavior/order-management/inventory/stock-invariants.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.stock-invariants +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Stock Invariants + +## Intent + +- outcome: pure stock invariant functions that validate quantity constraints so that stock over-allocation is prevented with structured error information (test carrier: examples/order-management/tests/features/behavior/inventory/stock-invariants.feature) diff --git a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.sdp.md b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.sdp.md new file mode 100644 index 00000000..5f5dcaa9 --- /dev/null +++ b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.dcb-multi-product-reservation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# DCB Multi-Product Reservation + +## Intent + +- outcome: to see DCB demonstrated in the order submission flow so that I understand how to use executeWithDCB for multi-entity operations (test carrier: examples/order-management/tests/features/modernization/dcb-multi-product-reservation.feature) diff --git a/specs/behavior/order-management/modernization/fat-events-order-submitted.sdp.md b/specs/behavior/order-management/modernization/fat-events-order-submitted.sdp.md new file mode 100644 index 00000000..8ea83a03 --- /dev/null +++ b/specs/behavior/order-management/modernization/fat-events-order-submitted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.fat-events-order-submitted +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Fat Events - Enriched OrderSubmitted + +## Intent + +- outcome: OrderSubmitted events to include customer snapshots so that I can process orders without additional customer queries (test carrier: examples/order-management/tests/features/modernization/fat-events-order-submitted.feature) diff --git a/specs/behavior/order-management/modernization/reactive-order-detail.sdp.md b/specs/behavior/order-management/modernization/reactive-order-detail.sdp.md new file mode 100644 index 00000000..4f6da183 --- /dev/null +++ b/specs/behavior/order-management/modernization/reactive-order-detail.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.reactive-order-detail +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Reactive Order Detail View + +## Intent + +- outcome: to see useReactiveProjection demonstrated for order detail so that I understand how to build instant-updating UI components (test carrier: examples/order-management/tests/features/modernization/reactive-order-detail.feature) diff --git a/specs/behavior/order-management/modernization/reference-documentation.sdp.md b/specs/behavior/order-management/modernization/reference-documentation.sdp.md new file mode 100644 index 00000000..8a844a54 --- /dev/null +++ b/specs/behavior/order-management/modernization/reference-documentation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.reference-documentation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Reference Implementation Documentation + +## Intent + +- outcome: clear documentation designating this as a reference implementation so that I understand its purpose and how to learn from it (test carrier: examples/order-management/tests/features/modernization/reference-documentation.feature) diff --git a/specs/behavior/order-management/orders/add-items.sdp.md b/specs/behavior/order-management/orders/add-items.sdp.md new file mode 100644 index 00000000..2c868501 --- /dev/null +++ b/specs/behavior/order-management/orders/add-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.add-items +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Add Items to Order + +## Intent + +- outcome: to add items to my order so that I can purchase multiple products (test carrier: examples/order-management/tests/features/behavior/orders/add-items.feature) diff --git a/specs/behavior/order-management/orders/cancel-order.sdp.md b/specs/behavior/order-management/orders/cancel-order.sdp.md new file mode 100644 index 00000000..ba21f9ec --- /dev/null +++ b/specs/behavior/order-management/orders/cancel-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.cancel-order +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Cancel Order + +## Intent + +- outcome: to cancel my order so that I don't have to complete the purchase (test carrier: examples/order-management/tests/features/behavior/orders/cancel-order.feature) diff --git a/specs/behavior/order-management/orders/confirm-order.sdp.md b/specs/behavior/order-management/orders/confirm-order.sdp.md new file mode 100644 index 00000000..3a9eba4e --- /dev/null +++ b/specs/behavior/order-management/orders/confirm-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.confirm-order +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Confirm Order + +## Intent + +- outcome: to confirm submitted orders so that they can be marked as confirmed (test carrier: examples/order-management/tests/features/behavior/orders/confirm-order.feature) diff --git a/specs/behavior/order-management/orders/create-order.sdp.md b/specs/behavior/order-management/orders/create-order.sdp.md new file mode 100644 index 00000000..587b71f0 --- /dev/null +++ b/specs/behavior/order-management/orders/create-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.create-order +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Create Order + +## Intent + +- outcome: to create a new order so that I can add items and submit it later (test carrier: examples/order-management/tests/features/behavior/orders/create-order.feature) diff --git a/specs/behavior/order-management/orders/order-domain.sdp.md b/specs/behavior/order-management/orders/order-domain.sdp.md new file mode 100644 index 00000000..cef3b6f2 --- /dev/null +++ b/specs/behavior/order-management/orders/order-domain.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-domain +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Order Domain Functions + +## Intent + +- outcome: pure domain functions for order calculations, initialization, and upcasting so that order state is computed correctly without side effects (test carrier: examples/order-management/tests/features/behavior/orders/order-domain.feature) diff --git a/specs/behavior/order-management/orders/order-invariant-sets.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.sdp.md new file mode 100644 index 00000000..dbf7d7be --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Order Invariant Sets + +## Intent + +- outcome: checkAll, assertAll, and validateAll to enforce multiple invariants together so that command handlers get comprehensive validation with fail-fast or collect-all semantics (test carrier: examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature) diff --git a/specs/behavior/order-management/orders/order-invariants.sdp.md b/specs/behavior/order-management/orders/order-invariants.sdp.md new file mode 100644 index 00000000..9a4020a1 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Order Invariants + +## Intent + +- outcome: pure invariant functions that validate order state so that invalid state transitions are prevented with structured error information (test carrier: examples/order-management/tests/features/behavior/orders/order-invariants.feature) diff --git a/specs/behavior/order-management/orders/remove-order-item.sdp.md b/specs/behavior/order-management/orders/remove-order-item.sdp.md new file mode 100644 index 00000000..ded08f0b --- /dev/null +++ b/specs/behavior/order-management/orders/remove-order-item.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.remove-order-item +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Remove Items from Order + +## Intent + +- outcome: to remove items from my order so that I can adjust my purchase before submitting (test carrier: examples/order-management/tests/features/behavior/orders/remove-order-item.feature) diff --git a/specs/behavior/order-management/orders/submit-order.sdp.md b/specs/behavior/order-management/orders/submit-order.sdp.md new file mode 100644 index 00000000..3086b8dc --- /dev/null +++ b/specs/behavior/order-management/orders/submit-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.submit-order +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Submit Order + +## Intent + +- outcome: to submit my order so that it can be processed for fulfillment (test carrier: examples/order-management/tests/features/behavior/orders/submit-order.feature) diff --git a/specs/behavior/order-management/roadmap/projection-categories.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.sdp.md new file mode 100644 index 00000000..82963166 --- /dev/null +++ b/specs/behavior/order-management/roadmap/projection-categories.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.roadmap.projection-categories +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Projection Categories + +## Intent + +- outcome: A taxonomy that categorizes projections by their purpose and query pattern. Projection categories enable: - Clear separation between internal and client-facing projections - Targeted reactivity (only View projections need reactive layer) (test carrier: examples/order-management/tests/features/roadmap/projection-categories.feature) diff --git a/specs/behavior/order-management/sagas/admin.sdp.md b/specs/behavior/order-management/sagas/admin.sdp.md new file mode 100644 index 00000000..3735f7ed --- /dev/null +++ b/specs/behavior/order-management/sagas/admin.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.sagas.admin +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Saga Admin Operations + +## Intent + +- outcome: to query and manage saga instances so that I can monitor and recover from saga failures (test carrier: examples/order-management/tests/features/behavior/sagas/admin.feature) diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.sdp.md new file mode 100644 index 00000000..c8db6299 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.data-table-parsing +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Gherkin DataTable Parsing Utilities + +## Intent + +- outcome: DataTable parsing helpers so that I can easily extract structured data from Gherkin tables (test carrier: examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature) diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.sdp.md new file mode 100644 index 00000000..61dc8528 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.decider-assertions +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Decider Testing Assertions + +## Intent + +- outcome: assertion helpers for DeciderOutput results so that I can write clear, consistent test assertions (test carrier: examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature) diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.sdp.md new file mode 100644 index 00000000..36a26041 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.fsm-assertions +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# FSM Testing Assertions + +## Intent + +- outcome: FSM-specific assertion helpers so that I can verify transition validity concisely (test carrier: examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature) diff --git a/specs/behavior/order-management/testing-infrastructure/test-isolation.sdp.md b/specs/behavior/order-management/testing-infrastructure/test-isolation.sdp.md new file mode 100644 index 00000000..e78a9b58 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/test-isolation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.test-isolation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Test Isolation via Namespace Prefixing + +## Intent + +- outcome: automatic namespace isolation for test data so that tests don't interfere with each other (test carrier: examples/order-management/tests/features/behavior/testing-infrastructure/test-isolation.feature) diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.sdp.md new file mode 100644 index 00000000..f4fc5ad1 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.durable-commands +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Durable Command Execution (App Integration) + +## Intent + +- outcome: commands to be tracked with intent/completion bracketing so that crashed or hung commands can be detected and recovered (test carrier: examples/order-management/tests/integration-features/durability/durable-commands.feature) diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.sdp.md new file mode 100644 index 00000000..9f1c3f31 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.durable-publication +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Durable Cross-Context Publication (App Integration) + +## Intent + +- outcome: cross-context event publications to be tracked and retryable so that events are reliably delivered even when target contexts fail (test carrier: examples/order-management/tests/integration-features/durability/durable-publication.feature) diff --git a/specs/behavior/order-management/tests/integration-features/durability/event-replay.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/event-replay.sdp.md new file mode 100644 index 00000000..7c9c7e9a --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/event-replay.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.event-replay +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Event Replay Infrastructure (App Integration) + +## Intent + +- outcome: to rebuild projections from event history so that I can recover from bugs or add new projections (test carrier: examples/order-management/tests/integration-features/durability/event-replay.feature) diff --git a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.sdp.md new file mode 100644 index 00000000..9444af20 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.idempotent-append +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Idempotent Event Append (App Integration) + +## Intent + +- outcome: event appends with idempotency keys to be deduplicated so that retried operations don't create duplicate events (test carrier: examples/order-management/tests/integration-features/durability/idempotent-append.feature) diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.sdp.md new file mode 100644 index 00000000..23c4282e --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.orphan-detection +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Orphan Intent Detection (App Integration) + +## Intent + +- outcome: orphaned intents to be detected and flagged so that stuck commands can be investigated and recovered (test carrier: examples/order-management/tests/integration-features/durability/orphan-detection.feature) diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.sdp.md new file mode 100644 index 00000000..3fd5905d --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/poison-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.poison-event +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Poison Event Handling (App Integration) + +## Intent + +- outcome: malformed events to be quarantined after repeated failures so that a single bad event doesn't block all downstream projections (test carrier: examples/order-management/tests/integration-features/durability/poison-event.feature) diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.sdp.md new file mode 100644 index 00000000..ffea40bc --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# DCB Retry Adapter (App Integration) + +## Intent + +- outcome: DCB operations to automatically retry on OCC conflicts so that concurrent modifications are handled gracefully without manual retry logic (test carrier: examples/order-management/tests/integration-features/durable-adapters/dcb-retry.feature) diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.sdp.md new file mode 100644 index 00000000..8346dfb3 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Rate Limiting Middleware (App Integration) + +## Intent + +- outcome: commands to be rate limited at the middleware level so that the system is protected from excessive requests (test carrier: examples/order-management/tests/integration-features/durable-adapters/rate-limiting.feature) diff --git a/specs/behavior/order-management/tests/integration-features/inventory/add-stock.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/add-stock.sdp.md new file mode 100644 index 00000000..b86f16c5 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/add-stock.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.add-stock +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Add Stock (Integration) + +## Intent + +- outcome: to add stock to existing products so that products are available for sale (test carrier: examples/order-management/tests/integration-features/inventory/add-stock.feature) diff --git a/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.sdp.md new file mode 100644 index 00000000..09fa35ac --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.confirm-reservation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Confirm Reservation (Integration) + +## Intent + +- outcome: to confirm stock reservations so that reserved stock becomes committed to the order (test carrier: examples/order-management/tests/integration-features/inventory/confirm-reservation.feature) diff --git a/specs/behavior/order-management/tests/integration-features/inventory/create-product.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/create-product.sdp.md new file mode 100644 index 00000000..3e4bc4db --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/create-product.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.create-product +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Create Product (Integration) + +## Intent + +- outcome: to create new products in the catalog so that they can be sold and tracked (test carrier: examples/order-management/tests/integration-features/inventory/create-product.feature) diff --git a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.sdp.md new file mode 100644 index 00000000..8e19fe54 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.query-inventory +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Query Inventory (Integration) + +## Intent + +- outcome: to query inventory information so that I can view product availability and reservations (test carrier: examples/order-management/tests/integration-features/inventory/query-inventory.feature) diff --git a/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.sdp.md new file mode 100644 index 00000000..3130ad80 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.release-reservation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Release Reservation (Integration) + +## Intent + +- outcome: to release stock reservations so that reserved stock becomes available again when orders are cancelled (test carrier: examples/order-management/tests/integration-features/inventory/release-reservation.feature) diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.sdp.md new file mode 100644 index 00000000..bf87087d --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.reservation-expiration +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Reservation Expiration (Integration) + +## Intent + +- outcome: expired reservations to be automatically released so that reserved stock becomes available again when orders are not completed in time (test carrier: examples/order-management/tests/integration-features/inventory/reservation-expiration.feature) diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.sdp.md new file mode 100644 index 00000000..0d5c2219 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Reserve Stock (Integration) + +## Intent + +- outcome: to reserve stock for orders so that stock is held until order is confirmed or cancelled (test carrier: examples/order-management/tests/integration-features/inventory/reserve-stock.feature) diff --git a/specs/behavior/order-management/tests/integration-features/orders/add-order-item.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/add-order-item.sdp.md new file mode 100644 index 00000000..cee863a0 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/add-order-item.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.add-order-item +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Add Order Item (Integration) + +## Intent + +- outcome: to add items to my order so that I can purchase multiple products (test carrier: examples/order-management/tests/integration-features/orders/add-order-item.feature) diff --git a/specs/behavior/order-management/tests/integration-features/orders/batch-operations.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/batch-operations.sdp.md new file mode 100644 index 00000000..63ca5be5 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/batch-operations.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.batch-operations +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Order Batch Operations (Integration) + +## Intent + +- outcome: to add or remove multiple items from an order in a single batch so that I can efficiently manage order contents (test carrier: examples/order-management/tests/integration-features/orders/batch-operations.feature) diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.sdp.md new file mode 100644 index 00000000..0d8e8e7c --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.cancel-order +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Cancel Order (Integration) + +## Intent + +- outcome: to cancel my order so that I don't have to complete the purchase (test carrier: examples/order-management/tests/integration-features/orders/cancel-order.feature) diff --git a/specs/behavior/order-management/tests/integration-features/orders/create-order.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/create-order.sdp.md new file mode 100644 index 00000000..f6bf63e3 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/create-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.create-order +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Create Order (Integration) + +## Intent + +- outcome: to create new orders so that I can purchase products (test carrier: examples/order-management/tests/integration-features/orders/create-order.feature) diff --git a/specs/behavior/order-management/tests/integration-features/orders/query-orders.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/query-orders.sdp.md new file mode 100644 index 00000000..e42fc2de --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/query-orders.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.query-orders +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Query Orders (Integration) + +## Intent + +- outcome: to query orders by various criteria so that I can find and view order information (test carrier: examples/order-management/tests/integration-features/orders/query-orders.feature) diff --git a/specs/behavior/order-management/tests/integration-features/orders/submit-order.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/submit-order.sdp.md new file mode 100644 index 00000000..96017419 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/submit-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.submit-order +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Submit Order (Integration) + +## Intent + +- outcome: to submit my order so that it can be processed for fulfillment (test carrier: examples/order-management/tests/integration-features/orders/submit-order.feature) diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.sdp.md new file mode 100644 index 00000000..b0ff99a0 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Order Fulfillment Saga (Integration) + +## Intent + +- outcome: to coordinate order fulfillment across bounded contexts so that orders are confirmed when stock is available and cancelled when not (test carrier: examples/order-management/tests/integration-features/sagas/order-fulfillment.feature) diff --git a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.sdp.md new file mode 100644 index 00000000..31949476 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.sagas.saga-admin +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Saga Admin Operations (Integration) + +## Intent + +- outcome: to manage and monitor sagas so that I can troubleshoot and maintain saga workflows (test carrier: examples/order-management/tests/integration-features/sagas/saga-admin.feature) diff --git a/specs/behavior/order-management/timeline/phase-00-initialization.sdp.md b/specs/behavior/order-management/timeline/phase-00-initialization.sdp.md new file mode 100644 index 00000000..503e37a2 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-00-initialization.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-00-initialization +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Project Initialization + +## Intent + +- outcome: Set up repository structure and development tooling. Established monorepo structure with pnpm workspaces, configured development tooling (ESLint, Prettier, TypeScript), and initialized core package structure. Created initial documentation framework and CI/CD pipeline scaffolding. (test carrier: examples/order-management/tests/features/timeline/phase-00-initialization.feature) diff --git a/specs/behavior/order-management/timeline/phase-01-core-infrastructure.sdp.md b/specs/behavior/order-management/timeline/phase-01-core-infrastructure.sdp.md new file mode 100644 index 00000000..72b1c3ad --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-01-core-infrastructure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-01-core-infrastructure +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Core Infrastructure + +## Intent + +- outcome: Build shared types, schemas, and utilities for event sourcing platform. Delivered event and command abstractions with Zod validation, UUID v7 ID generation, and CMS infrastructure. Includes comprehensive type safety, validation framework, and projection support. Implemented in deps/libar-dev-packages/packages/platform/core across 4 sessions. (test carrier: examples/order-management/tests/features/timeline/phase-01-core-infrastructure.feature) diff --git a/specs/behavior/order-management/timeline/phase-02-event-store-orchestration.sdp.md b/specs/behavior/order-management/timeline/phase-02-event-store-orchestration.sdp.md new file mode 100644 index 00000000..0fdfc3f1 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-02-event-store-orchestration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-02-event-store-orchestration +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Event Store and Orchestration Infrastructure + +## Intent + +- outcome: Centralized event storage with orchestration infrastructure for reliable projections. Delivered stream-based event persistence with optimistic concurrency control, atomic globalPosition allocation, and comprehensive database schema. Integrated Workpool for projection processing, Action Retrier for external APIs, and Workflow for saga execution. (test carrier: examples/order-management/tests/features/timeline/phase-02-event-store-orchestration.feature) diff --git a/specs/behavior/order-management/timeline/phase-03-command-bus.sdp.md b/specs/behavior/order-management/timeline/phase-03-command-bus.sdp.md new file mode 100644 index 00000000..025b0864 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-03-command-bus.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-03-command-bus +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Command Bus Component + +## Intent + +- outcome: Centralized command routing with middleware and idempotency. Delivered synchronous and asynchronous command dispatch with middleware pipeline, idempotent command execution via commandId deduplication, and atomic status transitions. Includes command result persistence, event correlation tracking, and CommandOrchestrator (test carrier: examples/order-management/tests/features/timeline/phase-03-command-bus.feature) diff --git a/specs/behavior/order-management/timeline/phase-04-orders-bc.sdp.md b/specs/behavior/order-management/timeline/phase-04-orders-bc.sdp.md new file mode 100644 index 00000000..f1a5bd9e --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-04-orders-bc.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-04-orders-bc +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Orders Bounded Context + +## Intent + +- outcome: Complete reference implementation demonstrating all DDD/ES/CQRS patterns. Delivered full Orders bounded context with domain model, events, commands, invariants, projections, and saga infrastructure. Implemented OrderCMS with lazy upcast pattern, comprehensive OrderStatus state machine, and OrderSummary projections with globalPosition (test carrier: examples/order-management/tests/features/timeline/phase-04-orders-bc.feature) diff --git a/specs/behavior/order-management/timeline/phase-05-inventory-bc.sdp.md b/specs/behavior/order-management/timeline/phase-05-inventory-bc.sdp.md new file mode 100644 index 00000000..69f1598f --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-05-inventory-bc.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-05-inventory-bc +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Inventory Bounded Context + +## Intent + +- outcome: Multi-aggregate inventory management with stock tracking and reservations. Delivered Inventory bounded context with separate Product and Reservation aggregates, demonstrating the multi-aggregate pattern within a single context. Implemented atomic multi-item reservations with all-or-nothing semantics for saga compensation support. (test carrier: examples/order-management/tests/features/timeline/phase-05-inventory-bc.feature) diff --git a/specs/behavior/order-management/timeline/phase-06-cross-context-integration.sdp.md b/specs/behavior/order-management/timeline/phase-06-cross-context-integration.sdp.md new file mode 100644 index 00000000..7ca61b79 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-06-cross-context-integration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-06-cross-context-integration +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Cross-Context Integration + +## Intent + +- outcome: Saga-based coordination between Orders and Inventory bounded contexts. Delivered OrderFulfillment saga coordinating Orders and Inventory contexts via durable workflow with automatic compensation. Implemented event-triggered saga routing, cross-context projections, and workflow status tracking via onComplete callbacks. (test carrier: examples/order-management/tests/features/timeline/phase-06-cross-context-integration.feature) diff --git a/specs/behavior/order-management/timeline/phase-07-projection-engine.sdp.md b/specs/behavior/order-management/timeline/phase-07-projection-engine.sdp.md new file mode 100644 index 00000000..170e865d --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-07-projection-engine.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-07-projection-engine +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Projection Engine (Deferred) + +## Intent + +- outcome: Centralized projection management beyond Workpool capabilities. This phase was evaluated and deferred. Workpool (ADR-015) provides sufficient projection processing for current needs. The dedicated engine may be valuable for advanced subscription patterns, complex multi-projection coordination, (test carrier: examples/order-management/tests/features/timeline/phase-07-projection-engine.feature) diff --git a/specs/behavior/order-management/timeline/phase-08-documentation-polish.sdp.md b/specs/behavior/order-management/timeline/phase-08-documentation-polish.sdp.md new file mode 100644 index 00000000..4704450a --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-08-documentation-polish.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-08-documentation-polish +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Documentation & Knowledge Infrastructure + +## Intent + +- outcome: Knowledge management systems and frontend MVP with comprehensive testing. Delivered documentation generation infrastructure with @libar-dev/delivery-process package, comprehensive pattern registry, and DDD fundamentals skill. Built frontend MVP with React 19 + Next.js demonstrating real-time Convex features. Established multi-environment (test carrier: examples/order-management/tests/features/timeline/phase-08-documentation-polish.feature) diff --git a/specs/behavior/order-management/timeline/phase-09-event-system.sdp.md b/specs/behavior/order-management/timeline/phase-09-event-system.sdp.md new file mode 100644 index 00000000..d8ffd79e --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-09-event-system.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-09-event-system +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Event System Enhancement + +## Intent + +- outcome: Advanced event categorization, upcasting, and correlation tracking. Delivered comprehensive event system with 4-tier type taxonomy (domain, integration, trigger, fat) and schema factories for each category. Implemented sequential event upcasting pipeline with multi-hop migrations for schema evolution. Built correlation (test carrier: examples/order-management/tests/features/timeline/phase-09-event-system.feature) diff --git a/specs/behavior/order-management/timeline/phase-10-command-system.sdp.md b/specs/behavior/order-management/timeline/phase-10-command-system.sdp.md new file mode 100644 index 00000000..a95a7d7b --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-10-command-system.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-10-command-system +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Command System Enhancement + +## Intent + +- outcome: Command categorization, registry, middleware pipeline, and batch execution. Delivered comprehensive command infrastructure with 4-tier categorization taxonomy (aggregate, process, system, batch) and enforced verb-first naming policy. Implemented CommandRegistry for centralized command lookup and introspection. Built extensible (test carrier: examples/order-management/tests/features/timeline/phase-10-command-system.feature) diff --git a/specs/behavior/order-management/timeline/phase-11-bc-formalization.sdp.md b/specs/behavior/order-management/timeline/phase-11-bc-formalization.sdp.md new file mode 100644 index 00000000..019b2abe --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-11-bc-formalization.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-11-bc-formalization +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Bounded Context Formalization + +## Intent + +- outcome: Contract-based bounded context infrastructure with declarative invariants. Delivered comprehensive bounded context infrastructure with @convex-es/bounded-context package (pure TypeScript, zero Convex dependencies). Implemented DualWriteContextContract for defining commands, events, CMS types, and error codes with full type inference. (test carrier: examples/order-management/tests/features/timeline/phase-11-bc-formalization.feature) diff --git a/specs/behavior/order-management/timeline/phase-12-repository-read-model.sdp.md b/specs/behavior/order-management/timeline/phase-12-repository-read-model.sdp.md new file mode 100644 index 00000000..37e6ae66 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-12-repository-read-model.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-12-repository-read-model +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Repository & Read Model Infrastructure + +## Intent + +- outcome: Projection registry, lifecycle management, and query abstraction layer. Delivered comprehensive read model infrastructure with projection registry system supporting primary, secondary, and cross-context projections. Implemented projection lifecycle state machine with 10 valid transitions (active, rebuilding, paused, error). (test carrier: examples/order-management/tests/features/timeline/phase-12-repository-read-model.feature) diff --git a/specs/behavior/order-management/timeline/phase-13-process-manager.sdp.md b/specs/behavior/order-management/timeline/phase-13-process-manager.sdp.md new file mode 100644 index 00000000..396766ed --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-13-process-manager.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-13-process-manager +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Process Manager Abstraction + +## Intent + +- outcome: Event-triggered process managers with idempotent processing and logging infrastructure. Delivered comprehensive process manager infrastructure with event/time/hybrid trigger support. Implemented PM lifecycle state machine with 6 valid transitions (idle → processing → completed/failed). Built checkpoint-based idempotent processing with (test carrier: examples/order-management/tests/features/timeline/phase-13-process-manager.feature) diff --git a/specs/behavior/order-management/timeline/phase-14-decider-formalization.sdp.md b/specs/behavior/order-management/timeline/phase-14-decider-formalization.sdp.md new file mode 100644 index 00000000..73ca511d --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-14-decider-formalization.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-14-decider-formalization +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Decider Formalization + +## Intent + +- outcome: Pure decide functions extracted from command handlers for testable domain logic. Extracted pure `decide(state, command) → events` functions from all 12 command handlers (6 orders + 6 inventory), establishing the Decider pattern as foundation for aggregate-less architecture. Implemented FSM module for explicit state machine (test carrier: examples/order-management/tests/features/timeline/phase-14-decider-formalization.feature) diff --git a/specs/behavior/order-management/timeline/phase-15-projection-categories.sdp.md b/specs/behavior/order-management/timeline/phase-15-projection-categories.sdp.md new file mode 100644 index 00000000..ed477267 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-15-projection-categories.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-15-projection-categories +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Projection Categories + +## Intent + +- outcome: Formalize projection taxonomy with explicit Logic/View/Reporting/Integration categories. Introduce explicit projection categorization to distinguish between minimal command validation data (Logic), denormalized UI queries (View), analytics aggregations (Reporting), and cross-context synchronization (Integration). Update all existing (test carrier: examples/order-management/tests/features/timeline/phase-15-projection-categories.feature) diff --git a/specs/behavior/order-management/timeline/phase-16-dcb.sdp.md b/specs/behavior/order-management/timeline/phase-16-dcb.sdp.md new file mode 100644 index 00000000..13d6ba65 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-16-dcb.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-16-dcb +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Dynamic Consistency Boundaries + +## Intent + +- outcome: Enable cross-entity invariants within bounded contexts via scope-based OCC. Introduce Dynamic Consistency Boundaries (DCB) for enforcing invariants spanning multiple aggregates within a single bounded context. Implement dcbScopes table in Event Store for scope-level optimistic concurrency control. Create executeWithDCB (test carrier: examples/order-management/tests/features/timeline/phase-16-dcb.feature) diff --git a/specs/behavior/order-management/timeline/phase-17-reactive-projections.sdp.md b/specs/behavior/order-management/timeline/phase-17-reactive-projections.sdp.md new file mode 100644 index 00000000..0da7a7ce --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-17-reactive-projections.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-17-reactive-projections +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Reactive Projections + +## Intent + +- outcome: Hybrid Workpool + reactive model for 10-50ms UI updates without polling. Implement reactive layer on top of existing Workpool-based projections to enable near-instant UI updates (10-50ms) without client polling. Create hybrid architecture where Workpool ensures durability while reactive pushes provide speed. Build (test carrier: examples/order-management/tests/features/timeline/phase-17-reactive-projections.feature) diff --git a/specs/behavior/order-management/timeline/phase-18-production-hardening.sdp.md b/specs/behavior/order-management/timeline/phase-18-production-hardening.sdp.md new file mode 100644 index 00000000..3b946d5f --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-18-production-hardening.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-18-production-hardening +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Production Hardening + +## Intent + +- outcome: Production-ready observability, monitoring, and operational tooling. Comprehensive production hardening including advanced observability, monitoring dashboards, error tracking, performance profiling, and operational tooling. Build on existing logging infrastructure (Phase 13) with metrics collection, distributed (test carrier: examples/order-management/tests/features/timeline/phase-18-production-hardening.feature) diff --git a/specs/behavior/order-management/timeline/phase-19-testing-infrastructure.sdp.md b/specs/behavior/order-management/timeline/phase-19-testing-infrastructure.sdp.md new file mode 100644 index 00000000..7c6fc1ae --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-19-testing-infrastructure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-19-testing-infrastructure +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Testing Infrastructure + +## Intent + +- outcome: Comprehensive BDD migration with Gherkin feature files for all domain logic. Complete BDD migration for platform packages and remaining application code. Fix integration test duplicate step issue. Establish patterns for testing Deciders (pure Given/When/Then), handlers (with Docker), projections, and sagas. Create (test carrier: examples/order-management/tests/features/timeline/phase-19-testing-infrastructure.feature) diff --git a/specs/behavior/order-management/timeline/phase-20-service-independence.sdp.md b/specs/behavior/order-management/timeline/phase-20-service-independence.sdp.md new file mode 100644 index 00000000..82f17974 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-20-service-independence.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-20-service-independence +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Service Independence + +## Intent + +- outcome: Enable bounded contexts to operate independently via ECST/Fat Events and Reservation Pattern. Implement Event-Carried State Transfer (ECST) with Fat Events carrying full context for downstream consumers, eliminating query dependencies between bounded contexts. Create Reservation Pattern for optimistic uniqueness constraints (reserve/confirm/release (test carrier: examples/order-management/tests/features/timeline/phase-20-service-independence.feature) diff --git a/specs/behavior/order-management/timeline/phase-21-integration-patterns.sdp.md b/specs/behavior/order-management/timeline/phase-21-integration-patterns.sdp.md new file mode 100644 index 00000000..5927428c --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-21-integration-patterns.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-21-integration-patterns +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Integration Patterns + +## Intent + +- outcome: Formalize cross-context communication with Context Map, Published Language, and ACL. Formalize DDD strategic patterns for cross-context integration. Document Context Map showing Orders ↔ Inventory relationship (Customer/Supplier, Conformist patterns). Build Published Language Schema Registry for integration event versioning with (test carrier: examples/order-management/tests/features/timeline/phase-21-integration-patterns.feature) diff --git a/specs/behavior/order-management/timeline/phase-22-agent-as-bc.sdp.md b/specs/behavior/order-management/timeline/phase-22-agent-as-bc.sdp.md new file mode 100644 index 00000000..97c28028 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-22-agent-as-bc.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-22-agent-as-bc +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Agent as Bounded Context + +## Intent + +- outcome: Demonstrate AI agent as event reactor pattern with autonomous command emission. Implement AI agent as first-class bounded context subscribing to domain events via EventBus and emitting commands autonomously. Build Agent BC example demonstrating pattern detection (e.g., order submission → inventory reservation) with autonomous (test carrier: examples/order-management/tests/features/timeline/phase-22-agent-as-bc.feature) diff --git a/specs/behavior/order-management/timeline/phase-23-process-setup.sdp.md b/specs/behavior/order-management/timeline/phase-23-process-setup.sdp.md new file mode 100644 index 00000000..2d5adf28 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-23-process-setup.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-23-process-setup +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Monorepo Process Setup + +## Intent + +- outcome: Configure delivery process at monorepo level for automated documentation. **Problem:** - 23 feature files exist but lack Background: Deliverables DataTables - Schema validation fails on 9 files, warnings on others (test carrier: examples/order-management/tests/features/timeline/phase-23-process-setup.feature) diff --git a/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.sdp.md b/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.sdp.md new file mode 100644 index 00000000..c68c341d --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-24-old-roadmap-porting +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Old Roadmap Porting + +## Intent + +- outcome: Port completed milestones from old roadmap to feature file DataTables. **Problem:** - Rich detail in docs/project-management/roadmap/*.md (23 files) - Tasks, deliverables, verification steps not captured in feature files (test carrier: examples/order-management/tests/features/timeline/phase-24-old-roadmap-porting.feature) diff --git a/specs/behavior/order-management/timeline/phase-25-adr-porting.sdp.md b/specs/behavior/order-management/timeline/phase-25-adr-porting.sdp.md new file mode 100644 index 00000000..a75d6de3 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-25-adr-porting.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-25-adr-porting +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# ADR Porting to Feature Files + +## Intent + +- outcome: Port Architecture Decision Records from manual docs to generated documentation. **Problem:** - 33 ADRs exist in docs/architecture/decisions/ as manual .md files - ADRs are disconnected from delivery process (test carrier: examples/order-management/tests/features/timeline/phase-25-adr-porting.feature) diff --git a/specs/behavior/order-management/timeline/phase-26-workflow-configuration.sdp.md b/specs/behavior/order-management/timeline/phase-26-workflow-configuration.sdp.md new file mode 100644 index 00000000..64559177 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-26-workflow-configuration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-26-workflow-configuration +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Workflow Configuration for Planning Sessions + +## Intent + +- outcome: Configure delivery workflows at monorepo level to define session outputs. **Problem:** - Base process specs (PROCESS_MODEL.md, PROCESS_SETUP.md) define workflows - Monorepo needs customized workflow configuration for planning sessions (test carrier: examples/order-management/tests/features/timeline/phase-26-workflow-configuration.feature) diff --git a/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.sdp.md b/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.sdp.md new file mode 100644 index 00000000..9c69c67a --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-27-pattern-annotation-priorities +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Pattern Annotation Prioritization + +## Intent + +- outcome: Prioritize core infrastructure patterns for annotation to support roadmap design. **Problem:** - PATTERNS.md needs annotations in @convex-es/* packages - New roadmap milestones require understanding core patterns first (test carrier: examples/order-management/tests/features/timeline/phase-27-pattern-annotation-priorities.feature) diff --git a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.sdp.md b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.sdp.md new file mode 100644 index 00000000..6fe64379 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-28-modular-claude-md +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management +--- +# Modular CLAUDE.md with Hybrid Generation + +## Intent + +- outcome: Transform CLAUDE.md from monolithic file to modular, partially-generated system. **Problem:** - Current CLAUDE.md is 896 lines of organically accumulated content (2 weeks rapid iteration) - No variation support - same content for all work contexts (test carrier: examples/order-management/tests/features/timeline/phase-28-modular-claude-md.feature) diff --git a/specs/behavior/platform-bc/_epic.sdp.md b/specs/behavior/platform-bc/_epic.sdp.md new file mode 100644 index 00000000..a48bd92e --- /dev/null +++ b/specs/behavior/platform-bc/_epic.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:behavior.platform-bc +kind: behavior +altitude: epic +readiness: idea +relations: {} +--- +# platform-bc executable behavior + +## Intent + +- outcome: Hold the executable Gherkin behavior Specs migrated from the platform-bc test corpus. diff --git a/specs/behavior/platform-bc/bc-contracts.sdp.md b/specs/behavior/platform-bc/bc-contracts.sdp.md new file mode 100644 index 00000000..41a3161d --- /dev/null +++ b/specs/behavior/platform-bc/bc-contracts.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bc-contracts +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc +--- +# Bounded Context Contract Helper Functions + +## Intent + +- outcome: The @libar-dev/platform-bc package provides type-safe helper functions for defining bounded context contracts. These helpers preserve literal types for type-safe registries and provide runtime validators for category values. (test carrier: packages/platform-bc/tests/features/behavior/bc-contracts.feature) diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.sdp.md new file mode 100644 index 00000000..6b3cc66c --- /dev/null +++ b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bounded-context-foundation-executable-tests +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc +--- +# BoundedContextFoundation Executable Tests + +## Intent + +- outcome: **Provenance:** This file was authored under the refactoring carve-out to expose BoundedContextFoundation in the PatternGraph. The pattern was originally implemented before the `@architect-implements:` convention. Rule invariants and rationales below are transferred verbatim from (test carrier: packages/platform-bc/tests/features/behavior/bounded-context-foundation-executable-tests.feature) diff --git a/specs/behavior/platform-bus/_epic.sdp.md b/specs/behavior/platform-bus/_epic.sdp.md new file mode 100644 index 00000000..fe0bd2cb --- /dev/null +++ b/specs/behavior/platform-bus/_epic.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:behavior.platform-bus +kind: behavior +altitude: epic +readiness: idea +relations: {} +--- +# platform-bus executable behavior + +## Intent + +- outcome: Hold the executable Gherkin behavior Specs migrated from the platform-bus test corpus. diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.sdp.md new file mode 100644 index 00000000..396b7fb5 --- /dev/null +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bus.command-bus-foundation-executable-tests +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bus +--- +# CommandBusFoundation Executable Tests + +## Intent + +- outcome: **Provenance:** This file was authored under the refactoring carve-out to expose CommandBusFoundation in the PatternGraph. The pattern was originally implemented before the `@architect-implements:` convention. Rule invariants and rationales below are transferred verbatim from (test carrier: packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature) diff --git a/specs/behavior/platform-bus/idempotency.sdp.md b/specs/behavior/platform-bus/idempotency.sdp.md new file mode 100644 index 00000000..85d1afd9 --- /dev/null +++ b/specs/behavior/platform-bus/idempotency.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bus.idempotency +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bus +--- +# Command Bus Idempotency + +## Intent + +- outcome: Command idempotency ensures that duplicate command submissions (same commandId) are detected and handled gracefully, preventing double-processing. This is a core infrastructure guarantee that enables reliable command dispatch in distributed systems where retries may occur. (test carrier: packages/platform-bus/tests/features/behavior/idempotency.feature) diff --git a/specs/behavior/platform-core/_epic.sdp.md b/specs/behavior/platform-core/_epic.sdp.md new file mode 100644 index 00000000..2426d332 --- /dev/null +++ b/specs/behavior/platform-core/_epic.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:behavior.platform-core +kind: behavior +altitude: epic +readiness: idea +relations: {} +--- +# platform-core executable behavior + +## Intent + +- outcome: Hold the executable Gherkin behavior Specs migrated from the platform-core test corpus. diff --git a/specs/behavior/platform-core/agent/action-handler.sdp.md b/specs/behavior/platform-core/agent/action-handler.sdp.md new file mode 100644 index 00000000..67d3ded8 --- /dev/null +++ b/specs/behavior/platform-core/agent/action-handler.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.action-handler +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Agent Action Handler + +## Intent + +- outcome: createAgentActionHandler() factory creates the ACTION half of the Workpool action/mutation split. It loads state, checks idempotency via checkpoint position, checks agent active status, and runs pattern executor. (test carrier: packages/platform-core/tests/features/behavior/agent/action-handler.feature) diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.sdp.md new file mode 100644 index 00000000..b5edaedd --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-rate-limiter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-rate-limiter +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Agent Rate Limiter + +## Intent + +- outcome: withRateLimit() guards agent operations behind a rate limit check. If allowed, the operation executes and returns the result. If denied, the operation is skipped and retryAfterMs is returned. (test carrier: packages/platform-core/tests/features/behavior/agent/agent-rate-limiter.feature) diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.sdp.md new file mode 100644 index 00000000..f442c6d9 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription-action.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription-action +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Agent Subscription - Action Overload + +## Intent + +- outcome: The ACTION overload of createAgentSubscription() creates an ActionSubscription with handlerType "action", onComplete reference, optional retry config, default priority, correct naming convention, event filtering, toHandlerArgs transformation, toWorkpoolContext shape, and partition key. (test carrier: packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature) diff --git a/specs/behavior/platform-core/agent/agent-subscription.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.sdp.md new file mode 100644 index 00000000..8d50d064 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Agent Subscription - Mutation Overload + +## Intent + +- outcome: The createAgentSubscription() factory creates valid EventSubscription objects with correct naming, priority, event filtering, handler args transformation, partition key extraction, batch creation, and agentId memoization. The defaultAgentTransform function handles all PublishedEvent fields and edge cases. (test carrier: packages/platform-core/tests/features/behavior/agent/agent-subscription.feature) diff --git a/specs/behavior/platform-core/agent/approval.sdp.md b/specs/behavior/platform-core/agent/approval.sdp.md new file mode 100644 index 00000000..2700a3fc --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Approval Module + +## Intent + +- outcome: Pure functions for the human-in-loop approval workflow including approval determination, authorization checks, status transitions, factory functions, type guards, Zod schemas, and timeout helpers. (test carrier: packages/platform-core/tests/features/behavior/agent/approval.feature) diff --git a/specs/behavior/platform-core/agent/audit-trail.sdp.md b/specs/behavior/platform-core/agent/audit-trail.sdp.md new file mode 100644 index 00000000..d6e2d40a --- /dev/null +++ b/specs/behavior/platform-core/agent/audit-trail.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit-trail +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Agent Audit Trail + +## Intent + +- outcome: all agent decisions audited as events so that agent behavior is fully traceable (test carrier: packages/platform-core/tests/features/behavior/agent/audit-trail.feature) diff --git a/specs/behavior/platform-core/agent/audit.sdp.md b/specs/behavior/platform-core/agent/audit.sdp.md new file mode 100644 index 00000000..0c5cf7f6 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Agent Audit Trail + +## Intent + +- outcome: Pure functions for agent audit trail functionality: decision ID generation, audit event factory functions, type guards, and Zod schema validation. (test carrier: packages/platform-core/tests/features/behavior/agent/audit.feature) diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.sdp.md new file mode 100644 index 00000000..edf2af36 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Checkpoint Extension + +## Intent + +- outcome: Lifecycle-related checkpoint extensions including error recovery detection, effective config resolution with overrides, checkpoint update application with config merges, and initial checkpoint creation. (test carrier: packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature) diff --git a/specs/behavior/platform-core/agent/checkpoint.sdp.md b/specs/behavior/platform-core/agent/checkpoint.sdp.md new file mode 100644 index 00000000..36d0a6cc --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Agent Checkpoint + +## Intent + +- outcome: Pure functions for agent checkpoint management: creation, position tracking, idempotency guards, status helpers, and schema validation. (test carrier: packages/platform-core/tests/features/behavior/agent/checkpoint.feature) diff --git a/specs/behavior/platform-core/agent/command-bridge.sdp.md b/specs/behavior/platform-core/agent/command-bridge.sdp.md new file mode 100644 index 00000000..d2ebbc5d --- /dev/null +++ b/specs/behavior/platform-core/agent/command-bridge.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-bridge +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Agent Command Bridge Handler + +## Intent + +- outcome: createCommandBridgeHandler() wires agent decisions to domain command execution: it looks up the route, validates registry membership, transforms args, calls the orchestrator, records audit events, and updates decision status. Failures at each stage produce structured (test carrier: packages/platform-core/tests/features/behavior/agent/command-bridge.feature) diff --git a/specs/behavior/platform-core/agent/command-emission.sdp.md b/specs/behavior/platform-core/agent/command-emission.sdp.md new file mode 100644 index 00000000..bd8da61f --- /dev/null +++ b/specs/behavior/platform-core/agent/command-emission.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-emission +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Agent Command Emission + +## Intent + +- outcome: agents to emit commands with explainability so that agent actions are traceable and auditable (test carrier: packages/platform-core/tests/features/behavior/agent/command-emission.feature) diff --git a/specs/behavior/platform-core/agent/command-router.sdp.md b/specs/behavior/platform-core/agent/command-router.sdp.md new file mode 100644 index 00000000..272c7da2 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-router.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-router +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Agent Command Router + +## Intent + +- outcome: Pure functions for agent command routing: getRoute() looks up routes by commandType, validateRoutes() checks route map integrity, and COMMAND_ROUTING_ERROR_CODES enumerates all routing error codes. (test carrier: packages/platform-core/tests/features/behavior/agent/command-router.feature) diff --git a/specs/behavior/platform-core/agent/commands.sdp.md b/specs/behavior/platform-core/agent/commands.sdp.md new file mode 100644 index 00000000..f0dc2259 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Agent Commands Module + +## Intent + +- outcome: Pure functions for agent command emission: validation, factory functions, type guards, and decision-to-command conversion. (test carrier: packages/platform-core/tests/features/behavior/agent/commands.feature) diff --git a/specs/behavior/platform-core/agent/cost-budget.sdp.md b/specs/behavior/platform-core/agent/cost-budget.sdp.md new file mode 100644 index 00000000..23a920af --- /dev/null +++ b/specs/behavior/platform-core/agent/cost-budget.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.cost-budget +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Cost Budget + +## Intent + +- outcome: Pure functions for agent cost tracking: checkBudget() evaluates spend against budget limits, estimateCost() computes token costs, and DEFAULT_MODEL_COSTS provides per-model pricing data. (test carrier: packages/platform-core/tests/features/behavior/agent/cost-budget.feature) diff --git a/specs/behavior/platform-core/agent/dead-letter.sdp.md b/specs/behavior/platform-core/agent/dead-letter.sdp.md new file mode 100644 index 00000000..7f48132d --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Agent Dead Letter Queue + +## Intent + +- outcome: Pure domain functions for agent dead letter queue management: error message sanitization, factory functions, status transitions, type guards, validation, and Zod schema enforcement. (test carrier: packages/platform-core/tests/features/behavior/agent/dead-letter.feature) diff --git a/specs/behavior/platform-core/agent/event-subscription.sdp.md b/specs/behavior/platform-core/agent/event-subscription.sdp.md new file mode 100644 index 00000000..3fd2c0bf --- /dev/null +++ b/specs/behavior/platform-core/agent/event-subscription.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.event-subscription +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Agent Event Subscription + +## Intent + +- outcome: agents to subscribe to event streams via EventBus so that agents can react to business events in real-time (test carrier: packages/platform-core/tests/features/behavior/agent/event-subscription.feature) diff --git a/specs/behavior/platform-core/agent/human-in-loop.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.sdp.md new file mode 100644 index 00000000..2af216b9 --- /dev/null +++ b/specs/behavior/platform-core/agent/human-in-loop.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.human-in-loop +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Human-in-Loop Configuration + +## Intent + +- outcome: configurable human-in-loop controls so that agent actions can be reviewed when appropriate (test carrier: packages/platform-core/tests/features/behavior/agent/human-in-loop.feature) diff --git a/specs/behavior/platform-core/agent/init.sdp.md b/specs/behavior/platform-core/agent/init.sdp.md new file mode 100644 index 00000000..de096f10 --- /dev/null +++ b/specs/behavior/platform-core/agent/init.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Agent Initialization + +## Intent + +- outcome: Pure functions for agent initialization and configuration: validateAgentBCConfig (field validation, error codes), toAgentHandlerArgs (event + correlation chain transformation), generateSubscriptionId (deterministic ID generation), (test carrier: packages/platform-core/tests/features/behavior/agent/init.feature) diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.sdp.md new file mode 100644 index 00000000..ad3d9fe0 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-commands.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-commands +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Lifecycle Commands + +## Intent + +- outcome: Agent lifecycle command types, error codes, result types, and Convex validator exports for the discriminated-union command model. (test carrier: packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature) diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.sdp.md new file mode 100644 index 00000000..773e7f72 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Lifecycle FSM + +## Intent + +- outcome: Pure agent lifecycle state machine with states, events, transitions, classification helpers, and command-to-event mapping. (test carrier: packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature) diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.sdp.md new file mode 100644 index 00000000..34d7653b --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-handlers +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Lifecycle Handlers + +## Intent + +- outcome: Agent lifecycle handler functions and the createLifecycleHandlers factory. Each handler loads the checkpoint, validates the FSM transition via a pure decider, and atomically writes the new status plus an audit event. (test carrier: packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature) diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.sdp.md new file mode 100644 index 00000000..c989b700 --- /dev/null +++ b/specs/behavior/platform-core/agent/oncomplete-handler.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.oncomplete-handler +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Agent onComplete Handler + +## Intent + +- outcome: The createAgentOnCompleteHandler() factory produces a workpool onComplete callback that processes agent action results. It handles canceled, failed, and successful outcomes with appropriate persistence, idempotency guards, and NO-THROW guarantees. (test carrier: packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature) diff --git a/specs/behavior/platform-core/agent/pattern-detection.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.sdp.md new file mode 100644 index 00000000..a4e20f06 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-detection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-detection +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Agent Pattern Detection + +## Intent + +- outcome: agents to detect patterns across event streams so that business insights can be generated automatically (test carrier: packages/platform-core/tests/features/behavior/agent/pattern-detection.feature) diff --git a/specs/behavior/platform-core/agent/pattern-executor.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.sdp.md new file mode 100644 index 00000000..cec894dd --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Pattern Executor + +## Intent + +- outcome: Pattern execution pipeline for agent bounded contexts including executePatterns (pattern matching, window filtering, minEvents gating), buildDecisionFromAnalysis (command extraction, approval logic), and buildDecisionFromTrigger (heuristic confidence, always requires approval). (test carrier: packages/platform-core/tests/features/behavior/agent/pattern-executor.feature) diff --git a/specs/behavior/platform-core/agent/pattern-registry.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.sdp.md new file mode 100644 index 00000000..eb07689d --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-registry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-registry +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Pattern Registry + +## Intent + +- outcome: validatePatternDefinitions() validates an array of PatternDefinition objects, checking for missing names, missing triggers, duplicate names, and unknown error codes. PATTERN_REGISTRY_ERROR_CODES provides the canonical error code constants. (test carrier: packages/platform-core/tests/features/behavior/agent/pattern-registry.feature) diff --git a/specs/behavior/platform-core/agent/patterns.sdp.md b/specs/behavior/platform-core/agent/patterns.sdp.md new file mode 100644 index 00000000..229a79d6 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Pattern Detection Framework + +## Intent + +- outcome: Pure functions for pattern detection including duration parsing, schema validation, pattern definition validation, window boundary calculations, event filtering, minimum event checks, and composable pattern trigger factories. (test carrier: packages/platform-core/tests/features/behavior/agent/patterns.feature) diff --git a/specs/behavior/platform-core/agent/rate-limit.sdp.md b/specs/behavior/platform-core/agent/rate-limit.sdp.md new file mode 100644 index 00000000..affe1960 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Rate Limit Module + +## Intent + +- outcome: Pure functions and schemas for LLM rate limiting: error codes, Zod schema validation, config validation, factory functions, type guards, exponential backoff calculation, and budget helpers. (test carrier: packages/platform-core/tests/features/behavior/agent/rate-limit.feature) diff --git a/specs/behavior/platform-core/agent/thread-adapter.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.sdp.md new file mode 100644 index 00000000..6f2cacad --- /dev/null +++ b/specs/behavior/platform-core/agent/thread-adapter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.thread-adapter +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Thread Adapter + +## Intent + +- outcome: createThreadAdapter() returns an adapter with analyze() and reason() methods that wrap generateText calls, parse JSON responses, and track LLM context metadata including model, tokens, timing, and threadId. (test carrier: packages/platform-core/tests/features/behavior/agent/thread-adapter.feature) diff --git a/specs/behavior/platform-core/batch/batch-executor.sdp.md b/specs/behavior/platform-core/batch/batch-executor.sdp.md new file mode 100644 index 00000000..f4e4a259 --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# BatchExecutor + +## Intent + +- outcome: to execute batch commands in atomic and partial modes so that multiple commands can be processed with appropriate failure semantics (test carrier: packages/platform-core/tests/features/behavior/batch/batch-executor.feature) diff --git a/specs/behavior/platform-core/batch/validation.sdp.md b/specs/behavior/platform-core/batch/validation.sdp.md new file mode 100644 index 00000000..ff09dec0 --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Batch Validation + +## Intent + +- outcome: pre-flight validation for batch command execution so that invalid batches are rejected before processing begins (test carrier: packages/platform-core/tests/features/behavior/batch/validation.feature) diff --git a/specs/behavior/platform-core/cms/upcaster.sdp.md b/specs/behavior/platform-core/cms/upcaster.sdp.md new file mode 100644 index 00000000..90f2514c --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# CMS Upcaster Utilities + +## Intent + +- outcome: CMS schema evolution utilities with chain-based migration so that CMS state can be transparently upgraded to the latest schema version (test carrier: packages/platform-core/tests/features/behavior/cms/upcaster.feature) diff --git a/specs/behavior/platform-core/commands/categories.sdp.md b/specs/behavior/platform-core/commands/categories.sdp.md new file mode 100644 index 00000000..caf033c9 --- /dev/null +++ b/specs/behavior/platform-core/commands/categories.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.categories +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Command Category Utilities + +## Intent + +- outcome: command taxonomy utilities with type-safe categories so that commands are correctly classified and validated at runtime (test carrier: packages/platform-core/tests/features/behavior/commands/categories.feature) diff --git a/specs/behavior/platform-core/commands/errors.sdp.md b/specs/behavior/platform-core/commands/errors.sdp.md new file mode 100644 index 00000000..8bd92284 --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Command Error Categorization and Recovery + +## Intent + +- outcome: a structured error system with categories and recovery semantics so that command failures are classified, serializable, and recoverable (test carrier: packages/platform-core/tests/features/behavior/commands/errors.feature) diff --git a/specs/behavior/platform-core/commands/factories.sdp.md b/specs/behavior/platform-core/commands/factories.sdp.md new file mode 100644 index 00000000..df7a90a9 --- /dev/null +++ b/specs/behavior/platform-core/commands/factories.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.factories +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Command Category Factories + +## Intent + +- outcome: category-specific factory functions for command schemas so that commands are created with the correct category, validated fields, and typed payloads (test carrier: packages/platform-core/tests/features/behavior/commands/factories.feature) diff --git a/specs/behavior/platform-core/commands/naming.sdp.md b/specs/behavior/platform-core/commands/naming.sdp.md new file mode 100644 index 00000000..31f141fc --- /dev/null +++ b/specs/behavior/platform-core/commands/naming.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.naming +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Command Naming Policy + +## Intent + +- outcome: command naming conventions enforced at runtime so that commands follow consistent Verb+Noun PascalCase patterns across bounded contexts (test carrier: packages/platform-core/tests/features/behavior/commands/naming.feature) diff --git a/specs/behavior/platform-core/correlation/chain.sdp.md b/specs/behavior/platform-core/correlation/chain.sdp.md new file mode 100644 index 00000000..1eddf1db --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Correlation Chain - Chain Creation, Derivation, and Relationship Checks + +## Intent + +- outcome: correlation chain utilities that create, derive, and inspect chains so that I can trace causation through command-event flows (test carrier: packages/platform-core/tests/features/behavior/correlation/chain.feature) diff --git a/specs/behavior/platform-core/correlation/correlation-service.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.sdp.md new file mode 100644 index 00000000..1dcbdfbe --- /dev/null +++ b/specs/behavior/platform-core/correlation/correlation-service.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.correlation-service +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# CorrelationService - Command-Event Correlation Tracking + +## Intent + +- outcome: a correlation service that tracks command-to-event relationships so that I can trace which events resulted from which commands (test carrier: packages/platform-core/tests/features/behavior/correlation/correlation-service.feature) diff --git a/specs/behavior/platform-core/dcb/execute.sdp.md b/specs/behavior/platform-core/dcb/execute.sdp.md new file mode 100644 index 00000000..76fd372c --- /dev/null +++ b/specs/behavior/platform-core/dcb/execute.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.execute +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# DCB Execution with OCC + +## Intent + +- outcome: executeWithDCB to enforce scope-level OCC so that cross-entity invariants are protected from concurrent modifications (test carrier: packages/platform-core/tests/features/behavior/dcb/execute.feature) diff --git a/specs/behavior/platform-core/dcb/scope-key.sdp.md b/specs/behavior/platform-core/dcb/scope-key.sdp.md new file mode 100644 index 00000000..70019448 --- /dev/null +++ b/specs/behavior/platform-core/dcb/scope-key.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.scope-key +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# DCB Scope Key Utilities + +## Intent + +- outcome: standardized scope key creation and parsing utilities so that I can ensure tenant isolation in DCB operations (test carrier: packages/platform-core/tests/features/behavior/dcb/scope-key.feature) diff --git a/specs/behavior/platform-core/decider/factory.sdp.md b/specs/behavior/platform-core/decider/factory.sdp.md new file mode 100644 index 00000000..c4fe5bfe --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Decider Handler Factory + +## Intent + +- outcome: Factory functions that wrap pure decider functions with infrastructure concerns (load, persist, event building): - createDeciderHandler: For existing entity updates - createEntityDeciderHandler: For entity creation (null state support) (test carrier: packages/platform-core/tests/features/behavior/decider/factory.feature) diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.sdp.md new file mode 100644 index 00000000..4adf9a7a --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# DCB Conflict Retry + +## Intent + +- outcome: DCB OCC conflicts to be automatically retried so that I don't need to implement manual retry logic everywhere (test carrier: packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature) diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.sdp.md new file mode 100644 index 00000000..eddeeb6c --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.integration-patterns +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Adapter Integration Patterns + +## Intent + +- outcome: adapters to integrate seamlessly with existing infrastructure so that I can adopt production patterns without refactoring (test carrier: packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature) diff --git a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.sdp.md b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.sdp.md new file mode 100644 index 00000000..34bb9bc7 --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.rate-limit-adapter +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Rate Limit Adapter + +## Intent + +- outcome: the middleware rate limiter to use @convex-dev/rate-limiter so that rate limiting is production-grade with persistence and sharding (test carrier: packages/platform-core/tests/features/behavior/durable-function-adapters/rate-limit-adapter.feature) diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.sdp.md new file mode 100644 index 00000000..c8a7e761 --- /dev/null +++ b/specs/behavior/platform-core/ecst/fat-event-builder.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.fat-event-builder +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Fat Event Builder + +## Intent + +- outcome: to create fat events with embedded context so that downstream consumers have all data needed without back-queries (test carrier: packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature) diff --git a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.sdp.md b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.sdp.md new file mode 100644 index 00000000..e26d3d73 --- /dev/null +++ b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.fat-vs-thin-selection +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Fat vs Thin Event Selection + +## Intent + +- outcome: guidelines for when to use fat vs thin events so that I make appropriate trade-offs between payload size and independence (test carrier: packages/platform-core/tests/features/behavior/ecst/fat-vs-thin-selection.feature) diff --git a/specs/behavior/platform-core/ecst/privacy-markers.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.sdp.md new file mode 100644 index 00000000..231af3c3 --- /dev/null +++ b/specs/behavior/platform-core/ecst/privacy-markers.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.privacy-markers +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Privacy Markers (Crypto-Shredding) + +## Intent + +- outcome: to mark PII fields in fat events for crypto-shredding so that GDPR right-to-erasure requests can be properly handled (test carrier: packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature) diff --git a/specs/behavior/platform-core/ecst/schema-versioning.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.sdp.md new file mode 100644 index 00000000..f2621756 --- /dev/null +++ b/specs/behavior/platform-core/ecst/schema-versioning.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.schema-versioning +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Schema Versioning + +## Intent + +- outcome: fat events to include schema version information so that consumers can upcast events from older versions (test carrier: packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature) diff --git a/specs/behavior/platform-core/event-replay/replay-progress.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.sdp.md new file mode 100644 index 00000000..2d6c93cc --- /dev/null +++ b/specs/behavior/platform-core/event-replay/replay-progress.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-replay.replay-progress +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Replay Progress Calculator + +## Intent + +- outcome: Progress calculation utilities for replay operations including percentage completion, time estimation, and status checks. (test carrier: packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature) diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.sdp.md new file mode 100644 index 00000000..3655f99e --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-append.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-append +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Durable Event Append + +## Intent + +- outcome: Wraps event append in Workpool for automatic retry with exponential backoff. Failed appends from async contexts are recovered via Workpool actions. (test carrier: packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature) diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.sdp.md new file mode 100644 index 00000000..d31127ce --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-publication +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Durable Cross-Context Event Publication + +## Intent + +- outcome: Cross-context events use Workpool-backed publication with tracking, retry, and dead letter handling. Covers Rules 3 and 7 from EventStoreDurability spec. (test carrier: packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature) diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.sdp.md new file mode 100644 index 00000000..ad158260 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.idempotent-append +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Idempotent Event Append + +## Intent + +- outcome: Ensures events are only appended once even when the append operation is retried. This pattern prevents duplicate events from corrupting projections and causing double-processing in downstream systems. (test carrier: packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature) diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.sdp.md new file mode 100644 index 00000000..8015d88f --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.intent-completion +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Intent and Completion Bracketing + +## Intent + +- outcome: Records intent before long-running operations and completion after success/failure. Enables timeout detection, reconciliation, and audit trail for multi-step processes. (test carrier: packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature) diff --git a/specs/behavior/platform-core/event-store-durability/outbox-handler.sdp.md b/specs/behavior/platform-core/event-store-durability/outbox-handler.sdp.md new file mode 100644 index 00000000..1a1f1bb7 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/outbox-handler.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.outbox-handler +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Outbox Handler Pattern + +## Intent + +- outcome: Creates durable onComplete handlers for capturing action results as domain events. The outbox pattern ensures that external API results (success or failure) are reliably captured as events using idempotent append. (test carrier: packages/platform-core/tests/features/behavior/event-store-durability/outbox-handler.feature) diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.sdp.md new file mode 100644 index 00000000..833c5256 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/poison-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.poison-event +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Poison Event Handling + +## Intent + +- outcome: Handles events that repeatedly fail projection processing. After N failures, events are quarantined and skipped to prevent infinite retry loops. (test carrier: packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature) diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.sdp.md new file mode 100644 index 00000000..8a744feb --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# ConvexEventBus + +## Intent + +- outcome: a ConvexEventBus that routes published events to matching subscription handlers via workpool so that event-driven communication is decoupled and reliable (test carrier: packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature) diff --git a/specs/behavior/platform-core/eventbus/registry.sdp.md b/specs/behavior/platform-core/eventbus/registry.sdp.md new file mode 100644 index 00000000..4b2704ec --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# EventBus Registry + +## Intent + +- outcome: a subscription registry with builder API and event matching so that event handlers are configured declaratively and matched correctly (test carrier: packages/platform-core/tests/features/behavior/eventbus/registry.feature) diff --git a/specs/behavior/platform-core/events/builder.sdp.md b/specs/behavior/platform-core/events/builder.sdp.md new file mode 100644 index 00000000..44387487 --- /dev/null +++ b/specs/behavior/platform-core/events/builder.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.builder +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Event Data Builder Utilities + +## Intent + +- outcome: builder functions to create event data structures so that events are correctly formatted for Event Store persistence (test carrier: packages/platform-core/tests/features/behavior/events/builder.feature) diff --git a/specs/behavior/platform-core/events/category.sdp.md b/specs/behavior/platform-core/events/category.sdp.md new file mode 100644 index 00000000..6008ffdd --- /dev/null +++ b/specs/behavior/platform-core/events/category.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.category +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Event Category Utilities + +## Intent + +- outcome: event taxonomy utilities with type-safe categories so that events are correctly classified and validated at runtime (test carrier: packages/platform-core/tests/features/behavior/events/category.feature) diff --git a/specs/behavior/platform-core/events/schemas.sdp.md b/specs/behavior/platform-core/events/schemas.sdp.md new file mode 100644 index 00000000..37c4c263 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Event Schema Factories + +## Intent + +- outcome: schema factory functions that produce typed Zod schemas so that events are validated at runtime with correct eventType, category, and payload (test carrier: packages/platform-core/tests/features/behavior/events/schemas.feature) diff --git a/specs/behavior/platform-core/events/upcaster.sdp.md b/specs/behavior/platform-core/events/upcaster.sdp.md new file mode 100644 index 00000000..46f6c8b1 --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Event Upcaster Utilities + +## Intent + +- outcome: event schema evolution utilities with chain-based migration so that events can be transparently upgraded to the latest schema version (test carrier: packages/platform-core/tests/features/behavior/events/upcaster.feature) diff --git a/specs/behavior/platform-core/fsm/fsm.sdp.md b/specs/behavior/platform-core/fsm/fsm.sdp.md new file mode 100644 index 00000000..4c403cbf --- /dev/null +++ b/specs/behavior/platform-core/fsm/fsm.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.fsm.fsm +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# FSM Core + +## Intent + +- outcome: a finite state machine with transition validation so that domain state changes are always safe and auditable (test carrier: packages/platform-core/tests/features/behavior/fsm/fsm.feature) diff --git a/specs/behavior/platform-core/handlers/result.sdp.md b/specs/behavior/platform-core/handlers/result.sdp.md new file mode 100644 index 00000000..9494989a --- /dev/null +++ b/specs/behavior/platform-core/handlers/result.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.handlers.result +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Handler Result Helpers + +## Intent + +- outcome: Result helper functions for dual-write command handlers: - successResult: Create success results with event data - rejectedResult: Create rejection results for invariant failures - failedResult: Create failure results that still emit events (test carrier: packages/platform-core/tests/features/behavior/handlers/result.feature) diff --git a/specs/behavior/platform-core/ids/branded.sdp.md b/specs/behavior/platform-core/ids/branded.sdp.md new file mode 100644 index 00000000..c8cf2236 --- /dev/null +++ b/specs/behavior/platform-core/ids/branded.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.branded +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Branded ID Types + +## Intent + +- outcome: branded ID types that provide compile-time safety so that different ID kinds cannot be accidentally interchanged (test carrier: packages/platform-core/tests/features/behavior/ids/branded.feature) diff --git a/specs/behavior/platform-core/ids/generator.sdp.md b/specs/behavior/platform-core/ids/generator.sdp.md new file mode 100644 index 00000000..8694bccc --- /dev/null +++ b/specs/behavior/platform-core/ids/generator.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.generator +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# ID Generation Utilities + +## Intent + +- outcome: prefixed ID generation with validation so that IDs follow a consistent format across bounded contexts (test carrier: packages/platform-core/tests/features/behavior/ids/generator.feature) diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.sdp.md new file mode 100644 index 00000000..8e70d4f5 --- /dev/null +++ b/specs/behavior/platform-core/integration/anti-corruption-layer.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.anti-corruption-layer +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Anti-Corruption Layer (ACL) + +## Intent + +- outcome: ACL utilities to translate external models so that domain code remains clean of foreign concepts (test carrier: packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature) diff --git a/specs/behavior/platform-core/integration/context-map.sdp.md b/specs/behavior/platform-core/integration/context-map.sdp.md new file mode 100644 index 00000000..696542d4 --- /dev/null +++ b/specs/behavior/platform-core/integration/context-map.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.context-map +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Context Map Documentation + +## Intent + +- outcome: BC relationships documented in a Context Map so that integration points are explicit and maintainable (test carrier: packages/platform-core/tests/features/behavior/integration/context-map.feature) diff --git a/specs/behavior/platform-core/integration/contract-testing.sdp.md b/specs/behavior/platform-core/integration/contract-testing.sdp.md new file mode 100644 index 00000000..6e2b1f18 --- /dev/null +++ b/specs/behavior/platform-core/integration/contract-testing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.contract-testing +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Contract Testing Utilities + +## Intent + +- outcome: utilities for contract testing integration events so that producer-consumer compatibility is validated (test carrier: packages/platform-core/tests/features/behavior/integration/contract-testing.feature) diff --git a/specs/behavior/platform-core/integration/event-versioning.sdp.md b/specs/behavior/platform-core/integration/event-versioning.sdp.md new file mode 100644 index 00000000..2872daa3 --- /dev/null +++ b/specs/behavior/platform-core/integration/event-versioning.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.event-versioning +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Integration Event Versioning + +## Intent + +- outcome: integration events to support schema evolution so that old consumers continue working when schemas change (test carrier: packages/platform-core/tests/features/behavior/integration/event-versioning.feature) diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.sdp.md new file mode 100644 index 00000000..ccae9549 --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# IntegrationEventPublisher - Cross-Context Event Translation and Routing + +## Intent + +- outcome: an integration event publisher that translates domain events into integration events so that bounded contexts can communicate through well-defined published language contracts (test carrier: packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature) diff --git a/specs/behavior/platform-core/integration/published-language.sdp.md b/specs/behavior/platform-core/integration/published-language.sdp.md new file mode 100644 index 00000000..4bd35924 --- /dev/null +++ b/specs/behavior/platform-core/integration/published-language.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.published-language +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Published Language Registry + +## Intent + +- outcome: a registry of versioned integration event schemas so that cross-BC communication has stable contracts (test carrier: packages/platform-core/tests/features/behavior/integration/published-language.feature) diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.sdp.md new file mode 100644 index 00000000..c7e0a2c9 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant-set.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant-set +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# createInvariantSet + +## Intent + +- outcome: to group invariants into a set and validate them together so that I can check, assert, or validate multiple domain rules in one call (test carrier: packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature) diff --git a/specs/behavior/platform-core/invariants/create-invariant.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.sdp.md new file mode 100644 index 00000000..30711524 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# createInvariant + +## Intent + +- outcome: a factory function to create invariants from a specification so that domain rules are reusable, composable, and produce structured violations (test carrier: packages/platform-core/tests/features/behavior/invariants/create-invariant.feature) diff --git a/specs/behavior/platform-core/invariants/invariant-error.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.sdp.md new file mode 100644 index 00000000..25b521f2 --- /dev/null +++ b/specs/behavior/platform-core/invariants/invariant-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.invariant-error +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# InvariantError + +## Intent + +- outcome: a base invariant error class with factory and type guards so that domain rule violations are expressed as typed, inspectable errors (test carrier: packages/platform-core/tests/features/behavior/invariants/invariant-error.feature) diff --git a/specs/behavior/platform-core/logging/commands.sdp.md b/specs/behavior/platform-core/logging/commands.sdp.md new file mode 100644 index 00000000..d4aaf0d8 --- /dev/null +++ b/specs/behavior/platform-core/logging/commands.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.commands +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Command Logging Helpers + +## Intent + +- outcome: structured logging helpers for command lifecycle events so that I can trace command execution with consistent field naming (test carrier: packages/platform-core/tests/features/behavior/logging/commands.feature) diff --git a/specs/behavior/platform-core/logging/scoped.sdp.md b/specs/behavior/platform-core/logging/scoped.sdp.md new file mode 100644 index 00000000..474cad92 --- /dev/null +++ b/specs/behavior/platform-core/logging/scoped.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.scoped +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Scoped Logger + +## Intent + +- outcome: scoped loggers that prefix messages and filter by level so that I can organize and control logging output per component (test carrier: packages/platform-core/tests/features/behavior/logging/scoped.feature) diff --git a/specs/behavior/platform-core/logging/testing.sdp.md b/specs/behavior/platform-core/logging/testing.sdp.md new file mode 100644 index 00000000..e694bf6d --- /dev/null +++ b/specs/behavior/platform-core/logging/testing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.testing +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Logging Testing Utilities + +## Intent + +- outcome: mock loggers for testing so that I can assert on log output without real console side effects (test carrier: packages/platform-core/tests/features/behavior/logging/testing.feature) diff --git a/specs/behavior/platform-core/logging/types.sdp.md b/specs/behavior/platform-core/logging/types.sdp.md new file mode 100644 index 00000000..9df0cc8e --- /dev/null +++ b/specs/behavior/platform-core/logging/types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.types +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Logging Types + +## Intent + +- outcome: well-defined log level priorities and filtering so that I can control logging verbosity consistently (test carrier: packages/platform-core/tests/features/behavior/logging/types.feature) diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.sdp.md new file mode 100644 index 00000000..2aa12924 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middleware-pipeline +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# MiddlewarePipeline orchestration + +## Intent + +- outcome: Verifies middleware pipeline registration, ordering, before/after hook execution, short-circuiting, error handling, and lifecycle operations. (test carrier: packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature) diff --git a/specs/behavior/platform-core/middleware/middlewares.sdp.md b/specs/behavior/platform-core/middleware/middlewares.sdp.md new file mode 100644 index 00000000..4c8ed990 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Built-in middlewares + +## Intent + +- outcome: Verifies all 5 built-in middlewares: structure validation, domain validation, authorization, logging, and rate limiting. Each middleware has a fixed order and specific before/after hook behavior. (test carrier: packages/platform-core/tests/features/behavior/middleware/middlewares.feature) diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.sdp.md new file mode 100644 index 00000000..2d8c614e --- /dev/null +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.monitoring.circuit-breaker +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Circuit Breaker + +## Intent + +- outcome: a circuit breaker for fault isolation so that cascading failures are prevented when operations fail repeatedly (test carrier: packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature) diff --git a/specs/behavior/platform-core/orchestration/command-orchestrator.sdp.md b/specs/behavior/platform-core/orchestration/command-orchestrator.sdp.md new file mode 100644 index 00000000..a74fdfa6 --- /dev/null +++ b/specs/behavior/platform-core/orchestration/command-orchestrator.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.orchestration.command-orchestrator +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# CommandOrchestrator partition key structure + +## Intent + +- outcome: Verifies that the partition context passed to Workpool's enqueueMutation uses the structured { name, value } format across all projection paths. (test carrier: packages/platform-core/tests/features/behavior/orchestration/command-orchestrator.feature) diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.sdp.md new file mode 100644 index 00000000..bb996a92 --- /dev/null +++ b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# SagaOrchestration Executable Tests + +## Intent + +- outcome: **Provenance:** This file was authored under the refactoring carve-out to expose SagaOrchestration in the PatternGraph. The pattern was originally implemented before the `@architect-implements:` convention. Rule invariants and rationales below are transferred verbatim from (test carrier: packages/platform-core/tests/features/behavior/orchestration/saga-orchestration-executable-tests.feature) diff --git a/specs/behavior/platform-core/process-manager/executor.sdp.md b/specs/behavior/platform-core/process-manager/executor.sdp.md new file mode 100644 index 00000000..f026c2d5 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/executor.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.executor +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Process Manager Executor + +## Intent + +- outcome: a process manager executor that routes events to handlers so that process managers react to domain events and emit commands (test carrier: packages/platform-core/tests/features/behavior/processManager/executor.feature) diff --git a/specs/behavior/platform-core/process-manager/lifecycle.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.sdp.md new file mode 100644 index 00000000..fea91982 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Process Manager Lifecycle State Machine + +## Intent + +- outcome: a process manager lifecycle state machine so that PM state transitions are validated and auditable (test carrier: packages/platform-core/tests/features/behavior/processManager/lifecycle.feature) diff --git a/specs/behavior/platform-core/process-manager/registry.sdp.md b/specs/behavior/platform-core/process-manager/registry.sdp.md new file mode 100644 index 00000000..28a7b229 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Process Manager Registry + +## Intent + +- outcome: a process manager registry with CRUD and lookup capabilities so that process managers can be registered, retrieved, and queried by various criteria (test carrier: packages/platform-core/tests/features/behavior/processManager/registry.feature) diff --git a/specs/behavior/platform-core/process-manager/subscription.sdp.md b/specs/behavior/platform-core/process-manager/subscription.sdp.md new file mode 100644 index 00000000..9fb75898 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Process Manager EventBus Subscription + +## Intent + +- outcome: PM subscription helpers for EventBus registration so that process managers can subscribe to domain events with correct instance routing (test carrier: packages/platform-core/tests/features/behavior/processManager/subscription.feature) diff --git a/specs/behavior/platform-core/process-manager/types.sdp.md b/specs/behavior/platform-core/process-manager/types.sdp.md new file mode 100644 index 00000000..646f4a32 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Process Manager Types + +## Intent + +- outcome: type guards and constants for process manager runtime types so that status values are validated at runtime with full type narrowing (test carrier: packages/platform-core/tests/features/behavior/processManager/types.feature) diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.sdp.md new file mode 100644 index 00000000..f9581d61 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.with-pm-checkpoint +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# withPMCheckpoint Helper + +## Intent + +- outcome: Tests the PM checkpoint-based idempotency pattern including skip already-processed events (globalPosition check), skip terminal states (completed PM), process new events with lifecycle transitions, command emission tracking, dead letter recording on failures, (test carrier: packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature) diff --git a/specs/behavior/platform-core/production-hardening/admin-tooling.sdp.md b/specs/behavior/platform-core/production-hardening/admin-tooling.sdp.md new file mode 100644 index 00000000..e59344c5 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/admin-tooling.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.admin-tooling +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Admin Tooling - Operational Tasks + +## Intent + +- outcome: admin endpoints for operational tasks so that I can rebuild projections, manage dead letters, and diagnose issues (test carrier: packages/platform-core/tests/features/behavior/production-hardening/admin-tooling.feature) diff --git a/specs/behavior/platform-core/production-hardening/circuit-breakers.sdp.md b/specs/behavior/platform-core/production-hardening/circuit-breakers.sdp.md new file mode 100644 index 00000000..75ad965f --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/circuit-breakers.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.circuit-breakers +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Circuit Breakers - Fault Isolation + +## Intent + +- outcome: circuit breakers for external dependencies so that failures are isolated and the system degrades gracefully (test carrier: packages/platform-core/tests/features/behavior/production-hardening/circuit-breakers.feature) diff --git a/specs/behavior/platform-core/production-hardening/distributed-tracing.sdp.md b/specs/behavior/platform-core/production-hardening/distributed-tracing.sdp.md new file mode 100644 index 00000000..a5efd3b5 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/distributed-tracing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.distributed-tracing +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Distributed Tracing - Event Flow Visualization + +## Intent + +- outcome: to trace event flows through the system so that I can debug issues and understand command-to-projection paths (test carrier: packages/platform-core/tests/features/behavior/production-hardening/distributed-tracing.feature) diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.sdp.md new file mode 100644 index 00000000..53d91691 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.durable-function-integration +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Durable Function Integration - Reliable Execution Patterns + +## Intent + +- outcome: durable function components integrated with platform patterns so that external calls, retries, and conflict handling are reliable (test carrier: packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature) diff --git a/specs/behavior/platform-core/production-hardening/health-endpoints.sdp.md b/specs/behavior/platform-core/production-hardening/health-endpoints.sdp.md new file mode 100644 index 00000000..18c7ed0e --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/health-endpoints.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.health-endpoints +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Health Endpoints - Kubernetes Probes + +## Intent + +- outcome: health check endpoints so that I can configure readiness and liveness probes for the application (test carrier: packages/platform-core/tests/features/behavior/production-hardening/health-endpoints.feature) diff --git a/specs/behavior/platform-core/production-hardening/metrics-collection.sdp.md b/specs/behavior/platform-core/production-hardening/metrics-collection.sdp.md new file mode 100644 index 00000000..272c2a51 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/metrics-collection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.metrics-collection +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Metrics Collection - System Health Tracking + +## Intent + +- outcome: to collect system health metrics so that I can monitor projection lag, event throughput, and command latency (test carrier: packages/platform-core/tests/features/behavior/production-hardening/metrics-collection.feature) diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.sdp.md new file mode 100644 index 00000000..c8abfdfa --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/rate-limiting.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.rate-limiting +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Rate Limiting - API Protection + +## Intent + +- outcome: to rate limit commands and admin operations so that the system is protected from abuse and overload (test carrier: packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature) diff --git a/specs/behavior/platform-core/projection-categories/category-definitions.sdp.md b/specs/behavior/platform-core/projection-categories/category-definitions.sdp.md new file mode 100644 index 00000000..c794ceaf --- /dev/null +++ b/specs/behavior/platform-core/projection-categories/category-definitions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projection-categories.category-definitions +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Projection Category Definitions + +## Intent + +- outcome: projections classified into four distinct categories so that I can route queries and optimize projection behavior (test carrier: packages/platform-core/tests/features/behavior/projection-categories/category-definitions.feature) diff --git a/specs/behavior/platform-core/projection-categories/explicit-declaration.sdp.md b/specs/behavior/platform-core/projection-categories/explicit-declaration.sdp.md new file mode 100644 index 00000000..1c51fa90 --- /dev/null +++ b/specs/behavior/platform-core/projection-categories/explicit-declaration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projection-categories.explicit-declaration +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Explicit Category Declaration + +## Intent + +- outcome: projections to require explicit category declaration so that all projections have clear query routing semantics (test carrier: packages/platform-core/tests/features/behavior/projection-categories/explicit-declaration.feature) diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.sdp.md new file mode 100644 index 00000000..fff95c66 --- /dev/null +++ b/specs/behavior/platform-core/projection-categories/registry-lookup.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projection-categories.registry-lookup +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Registry Category Lookup + +## Intent + +- outcome: to query projections by category from the registry so that I can target specific projection types for different purposes (test carrier: packages/platform-core/tests/features/behavior/projection-categories/registry-lookup.feature) diff --git a/specs/behavior/platform-core/projections/categories.sdp.md b/specs/behavior/platform-core/projections/categories.sdp.md new file mode 100644 index 00000000..c071d93e --- /dev/null +++ b/specs/behavior/platform-core/projections/categories.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.categories +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Projection Categories Edge Cases and Schema Validation + +## Intent + +- outcome: Covers Zod schema validation, type guard edge cases for non-string types, validation error constants, and validateProjectionCategory edge cases that complement the core category-definitions and explicit-declaration features. (test carrier: packages/platform-core/tests/features/behavior/projections/categories.feature) diff --git a/specs/behavior/platform-core/projections/lifecycle.sdp.md b/specs/behavior/platform-core/projections/lifecycle.sdp.md new file mode 100644 index 00000000..f5d7a4d9 --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Projection Lifecycle State Machine + +## Intent + +- outcome: a projection lifecycle state machine so that projection state transitions are validated and auditable (test carrier: packages/platform-core/tests/features/behavior/projections/lifecycle.feature) diff --git a/specs/behavior/platform-core/projections/registry.sdp.md b/specs/behavior/platform-core/projections/registry.sdp.md new file mode 100644 index 00000000..f5ff257a --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Projection Registry CRUD and Lookup + +## Intent + +- outcome: The ProjectionRegistry provides CRUD operations and lookup capabilities for managing projection definitions across bounded contexts. (test carrier: packages/platform-core/tests/features/behavior/projections/registry.feature) diff --git a/specs/behavior/platform-core/projections/with-checkpoint.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.sdp.md new file mode 100644 index 00000000..a9ae1780 --- /dev/null +++ b/specs/behavior/platform-core/projections/with-checkpoint.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.with-checkpoint +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# withCheckpoint Projection Idempotency + +## Intent + +- outcome: Tests the checkpoint-based projection idempotency pattern including skip already-processed events, process new events, atomic checkpoint updates, and the createCheckpointHelper factory. (test carrier: packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature) diff --git a/specs/behavior/platform-core/queries/factory.sdp.md b/specs/behavior/platform-core/queries/factory.sdp.md new file mode 100644 index 00000000..1dff237e --- /dev/null +++ b/specs/behavior/platform-core/queries/factory.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.factory +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Query Factory + +## Intent + +- outcome: factory functions for query descriptors and pagination so that read model queries are created with correct types, configurations, and pagination defaults (test carrier: packages/platform-core/tests/features/behavior/queries/factory.feature) diff --git a/specs/behavior/platform-core/queries/pagination.sdp.md b/specs/behavior/platform-core/queries/pagination.sdp.md new file mode 100644 index 00000000..4d3916d2 --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Pagination Helpers + +## Intent + +- outcome: cursor-based pagination utilities for read model queries so that query results are paginated with consistent defaults, cursor encoding, and page size validation (test carrier: packages/platform-core/tests/features/behavior/queries/pagination.feature) diff --git a/specs/behavior/platform-core/reactive-projections/conflict-detection.sdp.md b/specs/behavior/platform-core/reactive-projections/conflict-detection.sdp.md new file mode 100644 index 00000000..88f91547 --- /dev/null +++ b/specs/behavior/platform-core/reactive-projections/conflict-detection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reactive-projections.conflict-detection +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Conflict Detection and Rollback + +## Intent + +- outcome: conflicts detected and resolved automatically so that data integrity is maintained despite optimistic updates (test carrier: packages/platform-core/tests/features/behavior/reactive-projections/conflict-detection.feature) diff --git a/specs/behavior/platform-core/reactive-projections/hybrid-model.sdp.md b/specs/behavior/platform-core/reactive-projections/hybrid-model.sdp.md new file mode 100644 index 00000000..30ef331c --- /dev/null +++ b/specs/behavior/platform-core/reactive-projections/hybrid-model.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reactive-projections.hybrid-model +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Hybrid Model - Durable + Reactive Projections + +## Intent + +- outcome: projections that combine durability with instant feedback so that users see optimistic updates while maintaining data integrity (test carrier: packages/platform-core/tests/features/behavior/reactive-projections/hybrid-model.feature) diff --git a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.sdp.md b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.sdp.md new file mode 100644 index 00000000..4a7a2b91 --- /dev/null +++ b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reactive-projections.reactive-eligibility +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Reactive Eligibility by Category + +## Intent + +- outcome: only view projections to support reactive updates so that system resources are optimized (test carrier: packages/platform-core/tests/features/behavior/reactive-projections/reactive-eligibility.feature) diff --git a/specs/behavior/platform-core/reactive-projections/shared-evolve.sdp.md b/specs/behavior/platform-core/reactive-projections/shared-evolve.sdp.md new file mode 100644 index 00000000..2e27a4c7 --- /dev/null +++ b/specs/behavior/platform-core/reactive-projections/shared-evolve.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reactive-projections.shared-evolve +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Shared Evolve Logic - Client/Server Consistency + +## Intent + +- outcome: evolve logic shared between client and server so that state transformations are always consistent (test carrier: packages/platform-core/tests/features/behavior/reactive-projections/shared-evolve.feature) diff --git a/specs/behavior/platform-core/registry/command-registry.sdp.md b/specs/behavior/platform-core/registry/command-registry.sdp.md new file mode 100644 index 00000000..a0e0cde5 --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# CommandRegistry + +## Intent + +- outcome: a central registry for command definitions so that commands can be looked up, validated, and filtered at runtime (test carrier: packages/platform-core/tests/features/behavior/registry/command-registry.feature) diff --git a/specs/behavior/platform-core/registry/define-command.sdp.md b/specs/behavior/platform-core/registry/define-command.sdp.md new file mode 100644 index 00000000..b826b3d8 --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# defineCommand Helpers + +## Intent + +- outcome: helper functions that reduce boilerplate for defining commands so that aggregate, process, and system commands can be defined concisely (test carrier: packages/platform-core/tests/features/behavior/registry/define-command.feature) diff --git a/specs/behavior/platform-core/repository/cms-repository.sdp.md b/specs/behavior/platform-core/repository/cms-repository.sdp.md new file mode 100644 index 00000000..d8f7b0ac --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# CMS Repository + +## Intent + +- outcome: Factory-created typed repositories for CMS persistence: - createCMSRepository: Factory for typed repositories with upcast support - NotFoundError: Entity not found errors with table and ID metadata - VersionConflictError: OCC failures with version mismatch details (test carrier: packages/platform-core/tests/features/behavior/repository/cms-repository.feature) diff --git a/specs/behavior/platform-core/reservation/confirm-operation.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.sdp.md new file mode 100644 index 00000000..06aa5d70 --- /dev/null +++ b/specs/behavior/platform-core/reservation/confirm-operation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.confirm-operation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Confirm Operation + +## Intent + +- outcome: to confirm reservations when entities are created so that the reserved value becomes permanently associated (test carrier: packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature) diff --git a/specs/behavior/platform-core/reservation/release-operation.sdp.md b/specs/behavior/platform-core/reservation/release-operation.sdp.md new file mode 100644 index 00000000..577ece74 --- /dev/null +++ b/specs/behavior/platform-core/reservation/release-operation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.release-operation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Release Operation + +## Intent + +- outcome: to release reservations before they expire so that values become immediately available when users cancel (test carrier: packages/platform-core/tests/features/behavior/reservation/release-operation.feature) diff --git a/specs/behavior/platform-core/reservation/reservation-key.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.sdp.md new file mode 100644 index 00000000..73faed99 --- /dev/null +++ b/specs/behavior/platform-core/reservation/reservation-key.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reservation-key +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Reservation Key Format + +## Intent + +- outcome: reservation keys to be type-scoped so that different uniqueness constraints don't conflict (test carrier: packages/platform-core/tests/features/behavior/reservation/reservation-key.feature) diff --git a/specs/behavior/platform-core/reservation/reserve-operation.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.sdp.md new file mode 100644 index 00000000..4b8b48e9 --- /dev/null +++ b/specs/behavior/platform-core/reservation/reserve-operation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reserve-operation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Reserve Operation + +## Intent + +- outcome: to reserve unique values with TTL so that I can enforce uniqueness before entity creation (test carrier: packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature) diff --git a/specs/behavior/platform-core/schemas/command-schemas.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.sdp.md new file mode 100644 index 00000000..38ed5fdb --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Command Schemas + +## Intent + +- outcome: Zod schemas for command metadata, command factory, and command result discriminated unions used throughout the platform. (test carrier: packages/platform-core/tests/features/behavior/schemas/command-schemas.feature) diff --git a/specs/behavior/platform-core/testing/guards.sdp.md b/specs/behavior/platform-core/testing/guards.sdp.md new file mode 100644 index 00000000..79689121 --- /dev/null +++ b/specs/behavior/platform-core/testing/guards.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.guards +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Test Environment Guards + +## Intent + +- outcome: environment guards for test-only functions so that test utilities cannot be called in production (test carrier: packages/platform-core/tests/features/behavior/testing/guards.feature) diff --git a/specs/behavior/platform-core/testing/integration-isolation.sdp.md b/specs/behavior/platform-core/testing/integration-isolation.sdp.md new file mode 100644 index 00000000..db638d1b --- /dev/null +++ b/specs/behavior/platform-core/testing/integration-isolation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.integration-isolation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Integration Test Isolation + +## Intent + +- outcome: integration tests to be properly isolated so that tests don't interfere with each other and produce reliable results (test carrier: packages/platform-core/tests/features/behavior/testing/integration-isolation.feature) diff --git a/specs/behavior/platform-core/testing/platform-coverage.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.sdp.md new file mode 100644 index 00000000..da9b67f6 --- /dev/null +++ b/specs/behavior/platform-core/testing/platform-coverage.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.platform-coverage +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Platform Package BDD Coverage + +## Intent + +- outcome: all platform packages to have BDD test coverage so that public APIs are documented through executable specifications (test carrier: packages/platform-core/tests/features/behavior/testing/platform-coverage.feature) diff --git a/specs/behavior/platform-core/testing/polling.sdp.md b/specs/behavior/platform-core/testing/polling.sdp.md new file mode 100644 index 00000000..91ca4544 --- /dev/null +++ b/specs/behavior/platform-core/testing/polling.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.polling +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Polling Utilities for Integration Tests + +## Intent + +- outcome: async polling utilities so that I can wait for eventual consistency patterns (test carrier: packages/platform-core/tests/features/behavior/testing/polling.feature) diff --git a/specs/behavior/platform-core/testing/world.sdp.md b/specs/behavior/platform-core/testing/world.sdp.md new file mode 100644 index 00000000..8c6e09f4 --- /dev/null +++ b/specs/behavior/platform-core/testing/world.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.world +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# BDD Test World State Management + +## Intent + +- outcome: world/state management utilities so that I can manage scenario context across steps (test carrier: packages/platform-core/tests/features/behavior/testing/world.feature) diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.sdp.md new file mode 100644 index 00000000..623a5b3c --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Projection Complexity Classifier + +## Intent + +- outcome: projections classified by complexity characteristics so that I can select appropriate partition strategies (test carrier: packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature) diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.sdp.md new file mode 100644 index 00000000..bff9ed07 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Workpool Partition Key Helpers + +## Intent + +- outcome: standardized partition key helper functions so that I can ensure consistent partition key generation across projections (test carrier: packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature) diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.sdp.md new file mode 100644 index 00000000..3a673c83 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core +--- +# Command Config Partition Key Validation + +## Intent + +- outcome: command configs validated for partition keys so that missing or invalid partition keys are caught at startup (test carrier: packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature) diff --git a/specs/behavior/platform-decider/_epic.sdp.md b/specs/behavior/platform-decider/_epic.sdp.md new file mode 100644 index 00000000..99503486 --- /dev/null +++ b/specs/behavior/platform-decider/_epic.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:behavior.platform-decider +kind: behavior +altitude: epic +readiness: idea +relations: {} +--- +# platform-decider executable behavior + +## Intent + +- outcome: Hold the executable Gherkin behavior Specs migrated from the platform-decider test corpus. diff --git a/specs/behavior/platform-decider/decider-outputs.sdp.md b/specs/behavior/platform-decider/decider-outputs.sdp.md new file mode 100644 index 00000000..fa4cb17a --- /dev/null +++ b/specs/behavior/platform-decider/decider-outputs.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-decider.decider-outputs +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-decider +--- +# Decider Output Helpers and Type Guards + +## Intent + +- outcome: The Decider pattern uses discriminated unions to represent command outcomes: - success: Command executed, event emitted, state updated - rejected: Business rule violation, no event, clear error code - failed: Unexpected failure, audit event, context preserved (test carrier: packages/platform-decider/tests/features/behavior/decider-outputs.feature) diff --git a/specs/behavior/platform-fsm/_epic.sdp.md b/specs/behavior/platform-fsm/_epic.sdp.md new file mode 100644 index 00000000..58148f5e --- /dev/null +++ b/specs/behavior/platform-fsm/_epic.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:behavior.platform-fsm +kind: behavior +altitude: epic +readiness: idea +relations: {} +--- +# platform-fsm executable behavior + +## Intent + +- outcome: Hold the executable Gherkin behavior Specs migrated from the platform-fsm test corpus. diff --git a/specs/behavior/platform-fsm/fsm-transitions.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.sdp.md new file mode 100644 index 00000000..33750e48 --- /dev/null +++ b/specs/behavior/platform-fsm/fsm-transitions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-fsm.fsm-transitions +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-fsm +--- +# FSM State Transitions + +## Intent + +- outcome: The FSM (Finite State Machine) module provides type-safe state management with explicit transition rules. It prevents invalid state transitions at runtime while providing clear error messages. This is a core infrastructure pattern used by aggregates to enforce (test carrier: packages/platform-fsm/tests/features/behavior/fsm-transitions.feature) diff --git a/specs/behavior/platform-store/_epic.sdp.md b/specs/behavior/platform-store/_epic.sdp.md new file mode 100644 index 00000000..8db67b42 --- /dev/null +++ b/specs/behavior/platform-store/_epic.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:behavior.platform-store +kind: behavior +altitude: epic +readiness: idea +relations: {} +--- +# platform-store executable behavior + +## Intent + +- outcome: Hold the executable Gherkin behavior Specs migrated from the platform-store test corpus. diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.sdp.md new file mode 100644 index 00000000..d4661c4e --- /dev/null +++ b/specs/behavior/platform-store/event-store-foundation-executable-tests.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-store.event-store-foundation-executable-tests +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-store +--- +# EventStoreFoundation Executable Tests + +## Intent + +- outcome: **Provenance:** This file was authored under the refactoring carve-out to expose EventStoreFoundation in the PatternGraph. The pattern was originally implemented before the `@architect-implements:` convention. Rule invariants and rationales below are transferred verbatim from (test carrier: packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature) diff --git a/specs/behavior/platform-store/event-store-types.sdp.md b/specs/behavior/platform-store/event-store-types.sdp.md new file mode 100644 index 00000000..c5295666 --- /dev/null +++ b/specs/behavior/platform-store/event-store-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-store.event-store-types +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-store +--- +# Event Store Type Contracts + +## Intent + +- outcome: The platform-store package exports type definitions for event store operations. These types define the contract between the EventStore client and consuming applications. Type contracts ensure: - EventInput captures all data needed to append an event (test carrier: packages/platform-store/tests/features/behavior/event-store-types.feature) diff --git a/test/sdp-migration-guard.test.ts b/test/sdp-migration-guard.test.ts index 3fc75e9b..e3ae9b31 100644 --- a/test/sdp-migration-guard.test.ts +++ b/test/sdp-migration-guard.test.ts @@ -68,6 +68,9 @@ describe("SDP migration guard", () => { const packs = carriers.filter((f) => f.endsWith(".pack.sdp.md")); expect(packs.length).toBeGreaterThan(0); + const specs = carriers.filter((f) => f.endsWith(".sdp.md") && !f.endsWith(".pack.sdp.md")); + expect(specs.length).toBeGreaterThanOrEqual(200); + const bindings = join(specsRoot, "platform", "sdp-bindings.ts"); expect(existsSync(bindings)).toBe(true); const bindingsText = readFileSync(bindings, "utf8"); From aa47bf63c90c93018aa2bf026dac04bcacbe07a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darko=20Miji=C4=87?= Date: Wed, 19 Aug 2026 23:55:51 +0200 Subject: [PATCH 3/6] migrate executable scenarios and unimplemented specs into SDP Add one example Spec per Gherkin Scenario (~3463) beside the parent behavior Specs, and author unimplemented backlog Specs from architect pending deliverables plus docs-living remaining/current work. --- .../migrate-scenarios-and-unimplemented.mjs | 325 ++++++++++++++++++ specs/README.md | 11 +- .../s-001-add-stock-successfully.sdp.md | 13 + .../s-002-add-stock-with-reason.sdp.md | 13 + ...add-stock-without-selecting-product.sdp.md | 13 + .../s-004-cannot-add-zero-quantity.sdp.md | 13 + ...5-cannot-add-stock-without-quantity.sdp.md | 13 + ...ts-dashboard-with-pending-approvals.sdp.md | 13 + ...dashboard-with-no-pending-approvals.sdp.md | 13 + ...e-to-approval-detail-from-dashboard.sdp.md | 13 + ...pproval-list-with-pending-approvals.sdp.md | 13 + .../s-005-filter-approvals-by-status.sdp.md | 13 + ...approval-card-to-navigate-to-detail.sdp.md | 13 + .../s-007-view-pending-approval-detail.sdp.md | 13 + ...-008-view-already-approved-approval.sdp.md | 13 + ...-009-view-already-rejected-approval.sdp.md | 13 + .../s-010-view-expired-approval.sdp.md | 13 + ...-conveyed-via-text-label-wcag-1-4-1.sdp.md | 13 + ...12-approve-pending-action-with-note.sdp.md | 13 + ...013-reject-pending-action-with-note.sdp.md | 13 + .../s-014-approve-without-note.sdp.md | 13 + .../s-015-error-during-approve-action.sdp.md | 13 + ...016-cannot-act-on-expired-approvals.sdp.md | 13 + ...iew-active-agents-in-monitoring-tab.sdp.md | 13 + ...s-018-view-agent-checkpoint-details.sdp.md | 13 + .../s-019-no-active-agents.sdp.md | 13 + .../s-020-view-agent-decision-history.sdp.md | 13 + ...view-decision-detail-with-reasoning.sdp.md | 13 + .../s-022-empty-decision-history.sdp.md | 13 + ...stomers-approaching-churn-threshold.sdp.md | 13 + ...24-customer-risk-progress-indicator.sdp.md | 13 + ...-no-customers-approaching-threshold.sdp.md | 13 + ...o-low-stock-restock-approval-detail.sdp.md | 13 + ...alert-approval-with-product-context.sdp.md | 13 + ...pprove-low-stock-restock-suggestion.sdp.md | 13 + ...reject-low-stock-restock-suggestion.sdp.md | 13 + ...ue-order-vip-review-approval-detail.sdp.md | 13 + ...e-order-approval-with-order-context.sdp.md | 13 + ...ove-vip-review-for-high-value-order.sdp.md | 13 + .../s-033-reject-vip-review-flag.sdp.md | 13 + ...lidation-suggestion-approval-detail.sdp.md | 13 + ...solidation-approval-with-order-list.sdp.md | 13 + ...rove-order-consolidation-suggestion.sdp.md | 13 + ...ject-order-consolidation-suggestion.sdp.md | 13 + ...sion-history-filtered-by-agent-type.sdp.md | 13 + ...low-stock-agent-decision-in-history.sdp.md | 13 + ...lue-order-agent-decision-in-history.sdp.md | 13 + ...olidation-agent-decision-in-history.sdp.md | 13 + ...cts-approaching-low-stock-threshold.sdp.md | 13 + ...-043-stock-level-progress-indicator.sdp.md | 13 + ...pproval-card-is-keyboard-accessible.sdp.md | 13 + ...der-announces-action-status-changes.sdp.md | 13 + ...el-conveyed-via-text-not-just-color.sdp.md | 13 + .../s-047-focus-trap-in-action-buttons.sdp.md | 13 + .../s-048-handle-approval-not-found.sdp.md | 13 + ...dle-network-error-loading-approvals.sdp.md | 13 + .../s-050-route-level-error-boundary.sdp.md | 13 + .../s-001-create-product-successfully.sdp.md | 13 + ...002-validation-errors-on-empty-form.sdp.md | 13 + .../s-003-invalid-sku-format.sdp.md | 13 + .../s-004-invalid-price-zero-value.sdp.md | 13 + ...s-005-invalid-price-exceeds-maximum.sdp.md | 13 + .../s-001-view-dashboard-stats.sdp.md | 13 + .../s-002-show-low-stock-warning.sdp.md | 13 + ...ck-action-navigates-to-create-order.sdp.md | 13 + ...duct-creation-to-order-confirmation.sdp.md | 13 + ...nsufficient-stock-saga-compensation.sdp.md | 13 + .../s-003-order-with-multiple-items.sdp.md | 13 + ...ly-when-one-product-lacks-stock-dcb.sdp.md | 13 + ...rigger-journey-churn-risk-detection.sdp.md | 13 + ...r-journey-low-stock-alert-detection.sdp.md | 13 + ...-journey-high-value-order-detection.sdp.md | 13 + ...rney-order-consolidation-suggestion.sdp.md | 13 + ...reate-and-submit-order-successfully.sdp.md | 13 + .../s-002-cannot-submit-empty-cart.sdp.md | 13 + .../s-003-update-quantity-in-cart.sdp.md | 13 + .../s-004-remove-item-from-cart.sdp.md | 13 + .../s-001-view-confirmed-order.sdp.md | 13 + .../s-002-view-cancelled-order.sdp.md | 13 + ...tus-updates-via-reactive-projection.sdp.md | 13 + .../s-004-cancel-a-submitted-order.sdp.md | 13 + ...pears-only-for-cancellable-statuses.sdp.md | 13 + ...og-prevents-accidental-cancellation.sdp.md | 13 + .../s-001-view-all-orders.sdp.md | 13 + .../s-002-navigate-to-create-order.sdp.md | 13 + ...001-view-products-with-stock-levels.sdp.md | 13 + .../s-002-loading-state.sdp.md | 13 + .../s-001-no-dead-letter-on-success.sdp.md | 13 + .../s-002-no-dead-letter-on-canceled.sdp.md | 13 + ...-003-creates-dead-letter-on-failure.sdp.md | 13 + ...s-attempt-count-on-repeated-failure.sdp.md | 13 + ...pdate-dead-letter-in-terminal-state.sdp.md | 13 + ...cron-expires-approval-after-timeout.sdp.md | 13 + ...expired-approval-cannot-be-approved.sdp.md | 13 + ...tes-outreach-record-and-emits-event.sdp.md | 13 + ...1-decide-to-add-item-to-draft-order.sdp.md | 13 + ...add-item-when-order-is-not-in-draft.sdp.md | 13 + ...ject-add-item-with-invalid-quantity.sdp.md | 13 + ...umulate-items-and-recalculate-total.sdp.md | 13 + ...-001-decide-to-add-stock-to-product.sdp.md | 13 + .../s-002-add-stock-with-reason.sdp.md | 13 + ...reject-add-stock-with-zero-quantity.sdp.md | 13 + ...ct-add-stock-with-negative-quantity.sdp.md | 13 + ...-001-decide-to-cancel-a-draft-order.sdp.md | 13 + ...-decide-to-cancel-a-submitted-order.sdp.md | 13 + ...-decide-to-cancel-a-confirmed-order.sdp.md | 13 + ...-cancel-for-already-cancelled-order.sdp.md | 13 + ...decide-to-confirm-a-submitted-order.sdp.md | 13 + ...t-confirm-for-order-in-draft-status.sdp.md | 13 + ...confirm-for-already-confirmed-order.sdp.md | 13 + ...-reject-confirm-for-cancelled-order.sdp.md | 13 + ...de-to-confirm-a-pending-reservation.sdp.md | 13 + ...en-reservation-is-already-confirmed.sdp.md | 13 + ...onfirm-when-reservation-is-released.sdp.md | 13 + ...confirm-when-reservation-is-expired.sdp.md | 13 + ...tion-has-passed-its-expiration-time.sdp.md | 13 + ...create-a-new-order-when-none-exists.sdp.md | 13 + ...ct-create-when-order-already-exists.sdp.md | 13 + ...eate-a-new-product-when-none-exists.sdp.md | 13 + ...-create-when-product-already-exists.sdp.md | 13 + ...ject-create-with-empty-product-name.sdp.md | 13 + .../s-004-reject-create-with-empty-sku.sdp.md | 13 + ...s-005-reject-create-with-zero-price.sdp.md | 13 + ...6-reject-create-with-negative-price.sdp.md | 13 + ...ding-reservation-that-has-timed-out.sdp.md | 13 + ...n-reservation-has-not-timed-out-yet.sdp.md | 13 + ...en-reservation-is-already-confirmed.sdp.md | 13 + ...hen-reservation-is-already-released.sdp.md | 13 + ...when-reservation-is-already-expired.sdp.md | 13 + ...ll-state-with-product-created-event.sdp.md | 13 + ...entory-state-with-stock-added-event.sdp.md | 13 + ...03-evolve-inventory-from-zero-stock.sdp.md | 13 + ...ory-state-with-stock-reserved-event.sdp.md | 13 + ...ate-when-product-not-in-reservation.sdp.md | 13 + ...-reservation-failed-event-no-change.sdp.md | 13 + ...eated-evolves-null-to-initial-state.sdp.md | 13 + ...m-added-appends-item-to-empty-order.sdp.md | 13 + ...ded-accumulates-with-existing-items.sdp.md | 13 + ...oved-removes-item-and-updates-total.sdp.md | 13 + ...bmitted-changes-status-to-submitted.sdp.md | 13 + ...nfirmed-changes-status-to-confirmed.sdp.md | 13 + ...nges-status-from-draft-to-cancelled.sdp.md | 13 + ...-status-from-submitted-to-cancelled.sdp.md | 13 + ...-status-from-confirmed-to-cancelled.sdp.md | 13 + ...de-to-release-a-pending-reservation.sdp.md | 13 + ...-to-release-a-confirmed-reservation.sdp.md | 13 + ...hen-reservation-is-already-released.sdp.md | 13 + ...release-when-reservation-is-expired.sdp.md | 13 + ...move-existing-item-from-draft-order.sdp.md | 13 + ...ove-item-when-order-is-not-in-draft.sdp.md | 13 + ...ect-remove-when-item-does-not-exist.sdp.md | 13 + ...on-state-with-reservation-confirmed.sdp.md | 13 + ...servation-with-reservation-released.sdp.md | 13 + ...servation-with-reservation-released.sdp.md | 13 + ...eservation-with-reservation-expired.sdp.md | 13 + ...oducts-have-sufficient-availability.sdp.md | 13 + ...-one-product-has-insufficient-stock.sdp.md | 13 + ...rvation-when-product-does-not-exist.sdp.md | 13 + ...reject-reservation-with-empty-items.sdp.md | 13 + ...de-to-submit-draft-order-with-items.sdp.md | 13 + ...ubmit-for-order-not-in-draft-status.sdp.md | 13 + ...ject-submit-for-order-with-no-items.sdp.md | 13 + ...fully-add-stock-to-existing-product.sdp.md | 13 + ...tock-to-product-with-existing-stock.sdp.md | 13 + ...t-add-stock-to-non-existent-product.sdp.md | 13 + ...-is-idempotent-with-same-command-id.sdp.md | 13 + ...ssfully-confirm-pending-reservation.sdp.md | 13 + ...ot-confirm-non-existent-reservation.sdp.md | 13 + ...nfirm-already-confirmed-reservation.sdp.md | 13 + ...-is-idempotent-with-same-command-id.sdp.md | 13 + ...1-successfully-create-a-new-product.sdp.md | 13 + ...not-create-product-with-existing-id.sdp.md | 13 + ...-is-idempotent-with-same-command-id.sdp.md | 13 + ...s-001-sum-of-available-and-reserved.sdp.md | 13 + ...nly-available-when-reserved-is-zero.sdp.md | 13 + ...nly-reserved-when-available-is-zero.sdp.md | 13 + .../s-004-both-quantities-are-zero.sdp.md | 13 + ...5-cms-fields-match-input-parameters.sdp.md | 13 + ...ial-quantities-and-version-are-zero.sdp.md | 13 + ...-timestamps-are-set-to-current-time.sdp.md | 13 + ...08-current-version-cms-is-unchanged.sdp.md | 13 + ...9-missing-state-version-is-upgraded.sdp.md | 13 + .../s-010-version-0-is-upgraded.sdp.md | 13 + ...-fields-are-preserved-during-upcast.sdp.md | 13 + .../s-012-future-version-throws-error.sdp.md | 13 + .../s-001-passes-for-a-valid-product.sdp.md | 13 + ...ot-found-for-null-product-reference.sdp.md | 13 + ...und-for-undefined-product-reference.sdp.md | 13 + ...4-passes-for-null-product-reference.sdp.md | 13 + ...ses-for-undefined-product-reference.sdp.md | 13 + ...already-exists-for-existing-product.sdp.md | 13 + .../s-007-passes-for-standard-sku.sdp.md | 13 + ...ses-for-sku-with-special-characters.sdp.md | 13 + ...09-throws-invalid-sku-for-empty-sku.sdp.md | 13 + ...invalid-sku-for-whitespace-only-sku.sdp.md | 13 + ...11-passes-for-standard-product-name.sdp.md | 13 + ...asses-for-product-name-with-numbers.sdp.md | 13 + ...product-name-for-empty-product-name.sdp.md | 13 + ...me-for-whitespace-only-product-name.sdp.md | 13 + ...-015-passes-for-positive-integer-10.sdp.md | 13 + ...s-016-passes-for-positive-integer-1.sdp.md | 13 + ...17-throws-invalid-quantity-for-zero.sdp.md | 13 + ...nvalid-quantity-for-negative-number.sdp.md | 13 + ...ws-invalid-quantity-for-non-integer.sdp.md | 13 + ...des-context-string-in-error-message.sdp.md | 13 + ...ssfully-release-pending-reservation.sdp.md | 13 + ...-reservation-for-order-cancellation.sdp.md | 13 + ...-is-idempotent-with-same-command-id.sdp.md | 13 + ...item-reservation-returns-count-of-1.sdp.md | 13 + ...s-reservation-returns-correct-count.sdp.md | 13 + ...tems-reservation-returns-count-of-0.sdp.md | 13 + ...items-returns-sum-of-all-quantities.sdp.md | 13 + ...05-single-item-returns-its-quantity.sdp.md | 13 + .../s-006-empty-items-returns-0.sdp.md | 13 + ...correct-reservation-id-and-order-id.sdp.md | 13 + ...8-initializes-items-array-correctly.sdp.md | 13 + .../s-009-sets-status-to-pending.sdp.md | 13 + ...10-sets-expires-at-with-default-ttl.sdp.md | 13 + .../s-011-supports-custom-ttl.sdp.md | 13 + .../s-012-initializes-version-to-0.sdp.md | 13 + ...tializes-with-current-state-version.sdp.md | 13 + ...and-updated-at-to-current-timestamp.sdp.md | 13 + ...se-when-reservation-has-not-expired.sdp.md | 13 + ...s-true-when-reservation-has-expired.sdp.md | 13 + ...n-is-confirmed-regardless-of-expiry.sdp.md | 13 + ...on-is-released-regardless-of-expiry.sdp.md | 13 + ...les-exact-expiry-boundary-correctly.sdp.md | 13 + ...cms-when-already-at-current-version.sdp.md | 13 + ...ng-state-version-to-current-version.sdp.md | 13 + ...22-throws-error-for-future-versions.sdp.md | 13 + ...-preserves-all-fields-during-upcast.sdp.md | 13 + ...s-not-throw-when-reservation-exists.sdp.md | 13 + ...-not-found-when-reservation-is-null.sdp.md | 13 + ...found-when-reservation-is-undefined.sdp.md | 13 + ...-not-throw-when-reservation-is-null.sdp.md | 13 + ...throw-when-reservation-is-undefined.sdp.md | 13 + ...eady-exists-when-reservation-exists.sdp.md | 13 + ...s-not-throw-when-items-has-one-item.sdp.md | 13 + ...throw-when-items-has-multiple-items.sdp.md | 13 + ...servation-when-items-array-is-empty.sdp.md | 13 + ...hrow-for-valid-item-with-quantity-5.sdp.md | 13 + ...-not-throw-for-item-with-quantity-1.sdp.md | 13 + ...-invalid-quantity-for-zero-quantity.sdp.md | 13 + ...alid-quantity-for-negative-quantity.sdp.md | 13 + ...d-quantity-for-non-integer-quantity.sdp.md | 13 + ...servation-item-for-empty-product-id.sdp.md | 13 + ...oes-not-throw-for-valid-items-array.sdp.md | 13 + ...s-empty-reservation-for-empty-array.sdp.md | 13 + ...-when-one-item-has-invalid-quantity.sdp.md | 13 + .../s-019-has-correct-name-property.sdp.md | 13 + .../s-020-has-correct-code-property.sdp.md | 13 + .../s-021-has-correct-message-property.sdp.md | 13 + .../s-022-has-correct-context-property.sdp.md | 13 + .../s-023-can-have-undefined-context.sdp.md | 13 + .../s-024-is-instance-of-error.sdp.md | 13 + ...eck-returns-true-for-pending-status.sdp.md | 13 + ...urns-false-for-non-pending-statuses.sdp.md | 13 + ...ng-assert-passes-for-pending-status.sdp.md | 13 + ...servation-not-pending-for-confirmed.sdp.md | 13 + ...eservation-not-pending-for-released.sdp.md | 13 + ...-validate-returns-valid-for-pending.sdp.md | 13 + ...lidate-returns-invalid-for-released.sdp.md | 13 + ...true-for-pending-with-future-expiry.sdp.md | 13 + ...true-for-confirmed-with-past-expiry.sdp.md | 13 + ...-true-for-released-with-past-expiry.sdp.md | 13 + ...-false-for-pending-with-past-expiry.sdp.md | 13 + ...sses-for-pending-with-future-expiry.sdp.md | 13 + ...sses-for-confirmed-with-past-expiry.sdp.md | 13 + ...eservation-expired-for-pending-with.sdp.md | 13 + ...s-valid-for-pending-with-future-exp.sdp.md | 13 + ...s-invalid-for-pending-with-past-exp.sdp.md | 13 + ...s-true-for-pending-with-past-expiry.sdp.md | 13 + ...turns-true-for-non-pending-statuses.sdp.md | 13 + ...alse-for-pending-with-future-expiry.sdp.md | 13 + ...passes-for-pending-with-past-expiry.sdp.md | 13 + ...-for-confirmed-regardless-of-expiry.sdp.md | 13 + ...reservation-not-expired-for-pending.sdp.md | 13 + ...turns-valid-for-expired-reservation.sdp.md | 13 + ...s-invalid-for-pending-with-future-e.sdp.md | 13 + ...ll-returns-true-for-pending-and-not.sdp.md | 13 + ...l-returns-false-for-confirmed-and-n.sdp.md | 13 + ...l-returns-false-for-pending-and-exp.sdp.md | 13 + ...ll-passes-for-pending-and-not-expir.sdp.md | 13 + ...ll-throws-reservation-not-pending-f.sdp.md | 13 + ...ll-throws-reservation-expired-for-p.sdp.md | 13 + ...e-all-returns-valid-for-pending-and.sdp.md | 13 + ...-all-returns-single-violation-for-c.sdp.md | 13 + ...e-all-returns-violation-for-pending.sdp.md | 13 + ...-returns-true-for-pending-and-expir.sdp.md | 13 + ...-returns-false-for-confirmed-and-ex.sdp.md | 13 + ...l-returns-false-for-pending-and-not.sdp.md | 13 + ...-all-passes-for-pending-and-expired.sdp.md | 13 + ...l-throws-reservation-not-pending-fo.sdp.md | 13 + ...l-throws-reservation-not-expired-fo.sdp.md | 13 + ...all-returns-valid-for-pending-and-e.sdp.md | 13 + ...all-returns-single-violation-for-re.sdp.md | 13 + ...all-returns-single-violation-for-pe.sdp.md | 13 + ...uccessfully-reserve-available-stock.sdp.md | 13 + ...2-reserve-multiple-items-atomically.sdp.md | 13 + ...ation-fails-when-insufficient-stock.sdp.md | 13 + ...-item-reservation-is-all-or-nothing.sdp.md | 13 + ...cannot-reserve-non-existent-product.sdp.md | 13 + ...-is-idempotent-with-same-command-id.sdp.md | 13 + ...001-passes-when-stock-is-sufficient.sdp.md | 13 + ...requesting-exact-available-quantity.sdp.md | 13 + ...ient-stock-when-stock-is-not-enough.sdp.md | 13 + ...sufficient-stock-when-stock-is-zero.sdp.md | 13 + ...-available-when-stock-is-sufficient.sdp.md | 13 + ...ilable-when-requesting-exact-amount.sdp.md | 13 + ...-deficit-when-stock-is-insufficient.sdp.md | 13 + ...urns-correct-deficit-for-zero-stock.sdp.md | 13 + ...der-uses-dcb-for-atomic-reservation.sdp.md | 13 + ...-product-rejects-entire-reservation.sdp.md | 13 + ...es-concurrent-reservation-conflicts.sdp.md | 13 + ...duplicate-product-i-ds-are-rejected.sdp.md | 13 + ...ubmitted-includes-customer-snapshot.sdp.md | 13 + ...ent-does-not-block-order-submission.sdp.md | 13 + ...omer-snapshot-is-immutable-in-event.sdp.md | 13 + ...ng-customer-data-handled-gracefully.sdp.md | 13 + ...e-upcasted-to-v2-with-null-customer.sdp.md | 13 + ...events-are-not-modified-by-upcaster.sdp.md | 13 + ...r-detail-view-shows-instant-updates.sdp.md | 13 + ...rapid-updates-are-applied-correctly.sdp.md | 13 + ...istic-update-rolls-back-on-conflict.sdp.md | 13 + ...-event-stream-is-handled-gracefully.sdp.md | 13 + ...eference-implementation-designation.sdp.md | 13 + ...demonstrated-patterns-are-cataloged.sdp.md | 13 + .../s-003-pattern-links-are-valid.sdp.md | 13 + ...004-architecture-diagram-is-present.sdp.md | 13 + ...dd-single-item-to-empty-draft-order.sdp.md | 13 + ...2-add-multiple-items-to-draft-order.sdp.md | 13 + ...cannot-add-items-to-submitted-order.sdp.md | 13 + ...cannot-add-items-to-cancelled-order.sdp.md | 13 + ...-cannot-add-item-with-zero-quantity.sdp.md | 13 + ...not-add-item-with-negative-quantity.sdp.md | 13 + ...cannot-add-item-with-negative-price.sdp.md | 13 + .../s-001-cancel-draft-order.sdp.md | 13 + .../s-002-cancel-submitted-order.sdp.md | 13 + ...nnot-cancel-already-cancelled-order.sdp.md | 13 + .../s-004-cancel-confirmed-order.sdp.md | 13 + ...05-cannot-cancel-non-existent-order.sdp.md | 13 + ...-is-idempotent-with-same-command-id.sdp.md | 13 + ...cessfully-confirm-a-submitted-order.sdp.md | 13 + .../s-002-cannot-confirm-a-draft-order.sdp.md | 13 + ...-confirm-an-already-confirmed-order.sdp.md | 13 + ...04-cannot-confirm-a-cancelled-order.sdp.md | 13 + ...cannot-confirm-a-non-existent-order.sdp.md | 13 + ...-is-idempotent-with-same-command-id.sdp.md | 13 + ...001-successfully-create-a-new-order.sdp.md | 13 + ...annot-create-order-with-existing-id.sdp.md | 13 + ...-is-idempotent-with-same-command-id.sdp.md | 13 + ...-001-empty-items-array-returns-zero.sdp.md | 13 + .../s-002-single-item-total.sdp.md | 13 + .../s-003-multiple-items-total.sdp.md | 13 + ...antity-results-in-zero-contribution.sdp.md | 13 + ...-price-results-in-zero-contribution.sdp.md | 13 + ...ecimal-prices-are-handled-correctly.sdp.md | 13 + ...e-provided-order-id-and-customer-id.sdp.md | 13 + ...8-cms-initializes-with-draft-status.sdp.md | 13 + ...-initializes-with-empty-items-array.sdp.md | 13 + ...-initializes-with-zero-total-amount.sdp.md | 13 + ...-011-cms-initializes-with-version-0.sdp.md | 13 + ...tializes-with-current-state-version.sdp.md | 13 + ...and-updated-at-to-current-timestamp.sdp.md | 13 + ...rrent-version-is-returned-unchanged.sdp.md | 13 + ...h-missing-state-version-is-upgraded.sdp.md | 13 + ...ms-with-state-version-0-is-upgraded.sdp.md | 13 + ...-fields-are-preserved-during-upcast.sdp.md | 13 + ...rns-true-for-draft-order-with-items.sdp.md | 13 + ...alse-for-non-draft-order-with-items.sdp.md | 13 + ...false-for-draft-order-without-items.sdp.md | 13 + ...ow-for-valid-draft-order-with-items.sdp.md | 13 + ...draft-for-submitted-order-fail-fast.sdp.md | 13 + ...items-for-draft-order-with-no-items.sdp.md | 13 + ...d-result-for-draft-order-with-items.sdp.md | 13 + ...s-for-submitted-order-with-no-items.sdp.md | 13 + ...ue-for-draft-order-under-item-limit.sdp.md | 13 + ...l-returns-false-for-non-draft-order.sdp.md | 13 + ...lse-for-draft-order-at-max-capacity.sdp.md | 13 + ...w-for-valid-draft-order-under-limit.sdp.md | 13 + ...draft-for-submitted-order-fail-fast.sdp.md | 13 + ...xceeded-for-draft-order-at-capacity.sdp.md | 13 + ...-result-for-draft-order-under-limit.sdp.md | 13 + ...ons-for-submitted-order-at-capacity.sdp.md | 13 + ...l-returns-expected-for-status-order.sdp.md | 13 + ...-all-does-not-throw-for-draft-order.sdp.md | 13 + ...-does-not-throw-for-submitted-order.sdp.md | 13 + ...ready-confirmed-for-confirmed-order.sdp.md | 13 + ...ready-cancelled-for-cancelled-order.sdp.md | 13 + ...eturns-valid-result-for-draft-order.sdp.md | 13 + ...ingle-violation-for-confirmed-order.sdp.md | 13 + ...ingle-violation-for-cancelled-order.sdp.md | 13 + .../s-001-passes-for-a-valid-order.sdp.md | 13 + ...-not-found-for-null-order-reference.sdp.md | 13 + ...found-for-undefined-order-reference.sdp.md | 13 + ...004-passes-for-null-order-reference.sdp.md | 13 + ...asses-for-undefined-order-reference.sdp.md | 13 + ...r-already-exists-for-existing-order.sdp.md | 13 + ...-check-returns-true-for-draft-order.sdp.md | 13 + ...k-returns-false-for-submitted-order.sdp.md | 13 + ...s-009-assert-passes-for-draft-order.sdp.md | 13 + ...not-in-draft-for-non-draft-statuses.sdp.md | 13 + ...ck-returns-true-for-submitted-order.sdp.md | 13 + ...check-returns-false-for-draft-order.sdp.md | 13 + ...3-assert-passes-for-submitted-order.sdp.md | 13 + ...ubmitted-for-non-submitted-statuses.sdp.md | 13 + ...-check-returns-true-for-draft-order.sdp.md | 13 + ...ck-returns-true-for-submitted-order.sdp.md | 13 + ...k-returns-false-for-cancelled-order.sdp.md | 13 + ...asses-for-draft-order-not-cancelled.sdp.md | 13 + ...s-for-confirmed-order-not-cancelled.sdp.md | 13 + ...ready-cancelled-for-cancelled-order.sdp.md | 13 + ...-true-for-draft-order-not-confirmed.sdp.md | 13 + ...e-for-submitted-order-not-confirmed.sdp.md | 13 + ...k-returns-false-for-confirmed-order.sdp.md | 13 + ...asses-for-draft-order-not-confirmed.sdp.md | 13 + ...s-for-cancelled-order-not-confirmed.sdp.md | 13 + ...ready-confirmed-for-confirmed-order.sdp.md | 13 + ...k-returns-true-when-order-has-items.sdp.md | 13 + ...turns-false-when-order-has-no-items.sdp.md | 13 + ...-assert-passes-when-order-has-items.sdp.md | 13 + ...asses-when-order-has-multiple-items.sdp.md | 13 + ...-order-has-no-items-for-empty-order.sdp.md | 13 + ...-true-when-order-has-room-for-items.sdp.md | 13 + ...false-when-order-is-at-max-capacity.sdp.md | 13 + ...asses-when-order-has-room-for-items.sdp.md | 13 + ...hen-order-is-one-under-max-capacity.sdp.md | 13 + ...-max-items-exceeded-at-max-capacity.sdp.md | 13 + ...37-passes-when-item-exists-in-order.sdp.md | 13 + ...038-passes-when-item-is-one-of-many.sdp.md | 13 + ...-not-found-when-item-does-not-exist.sdp.md | 13 + ...not-found-when-items-array-is-empty.sdp.md | 13 + .../s-041-passes-for-valid-item.sdp.md | 13 + ...-passes-for-item-with-decimal-price.sdp.md | 13 + ...-for-item-with-zero-price-free-item.sdp.md | 13 + ...alid-quantity-for-negative-quantity.sdp.md | 13 + ...-invalid-quantity-for-zero-quantity.sdp.md | 13 + ...d-quantity-for-non-integer-quantity.sdp.md | 13 + ...ws-invalid-price-for-negative-price.sdp.md | 13 + ...alid-item-data-for-empty-product-id.sdp.md | 13 + ...id-item-data-for-empty-product-name.sdp.md | 13 + ...050-error-has-correct-name-property.sdp.md | 13 + ...051-error-has-correct-code-property.sdp.md | 13 + ...-error-has-correct-message-property.sdp.md | 13 + ...-error-has-correct-context-property.sdp.md | 13 + ...54-error-can-have-undefined-context.sdp.md | 13 + ...s-055-error-is-an-instance-of-error.sdp.md | 13 + ...rom-draft-order-with-multiple-items.sdp.md | 13 + ...2-remove-last-item-from-draft-order.sdp.md | 13 + ...ot-remove-item-from-submitted-order.sdp.md | 13 + ...ot-remove-item-from-cancelled-order.sdp.md | 13 + ...ot-remove-item-from-confirmed-order.sdp.md | 13 + ...006-cannot-remove-non-existent-item.sdp.md | 13 + ...-is-idempotent-with-same-command-id.sdp.md | 13 + ...uccessfully-submit-order-with-items.sdp.md | 13 + .../s-002-cannot-submit-empty-order.sdp.md | 13 + ...c-projection-for-command-validation.sdp.md | 13 + ...ne-a-view-projection-for-ui-queries.sdp.md | 13 + ...-reporting-projection-for-analytics.sdp.md | 13 + ...n-projection-for-cross-context-sync.sdp.md | 13 + ...s-005-query-projections-by-category.sdp.md | 13 + ...-006-query-all-reactive-projections.sdp.md | 13 + ...nt-client-query-on-logic-projection.sdp.md | 13 + ...ion-is-not-optimized-for-reactivity.sdp.md | 13 + ...ng-projection-to-categorized-system.sdp.md | 13 + ...urns-zero-counts-for-empty-database.sdp.md | 13 + ...02-counts-sagas-by-status-correctly.sdp.md | 13 + .../s-003-filters-by-saga-type.sdp.md | 13 + ...rns-empty-array-when-no-sagas-exist.sdp.md | 13 + ...-running-sagas-older-than-threshold.sdp.md | 13 + .../s-006-respects-custom-threshold.sdp.md | 13 + ...ns-empty-array-when-no-failed-sagas.sdp.md | 13 + .../s-008-returns-only-failed-sagas.sdp.md | 13 + .../s-009-respects-limit-parameter.sdp.md | 13 + ...-valid-source-status-saga-as-failed.sdp.md | 13 + ...nvalid-source-status-saga-as-failed.sdp.md | 13 + ...rns-not-found-for-non-existent-saga.sdp.md | 13 + ...-marking-failed-saga-as-compensated.sdp.md | 13 + ...king-non-failed-saga-as-compensated.sdp.md | 13 + .../s-015-allows-retrying-failed-saga.sdp.md | 13 + ...16-rejects-retrying-non-failed-saga.sdp.md | 13 + ...parse-vertical-data-table-to-object.sdp.md | 13 + ...a-table-preserves-all-string-values.sdp.md | 13 + ...003-parse-integer-value-from-string.sdp.md | 13 + ...s-004-parse-float-value-from-string.sdp.md | 13 + ...-005-parse-boolean-true-from-string.sdp.md | 13 + ...006-parse-boolean-false-from-string.sdp.md | 13 + ...-parse-invalid-integer-throws-error.sdp.md | 13 + ...equired-field-succeeds-when-present.sdp.md | 13 + ...ired-field-throws-for-missing-field.sdp.md | 13 + ...al-field-returns-value-when-present.sdp.md | 13 + ...field-returns-undefined-for-missing.sdp.md | 13 + ...t-optional-field-with-default-value.sdp.md | 13 + .../s-001-assert-decision-success.sdp.md | 13 + ...n-success-fails-for-rejected-result.sdp.md | 13 + ...3-extract-success-event-from-result.sdp.md | 13 + ...04-extract-success-data-from-result.sdp.md | 13 + ...05-extract-state-update-from-result.sdp.md | 13 + .../s-006-assert-event-type-matches.sdp.md | 13 + ...ert-event-type-fails-for-wrong-type.sdp.md | 13 + .../s-008-assert-event-payload-field.sdp.md | 13 + .../s-009-assert-state-update-field.sdp.md | 13 + .../s-010-assert-decision-rejected.sdp.md | 13 + ...s-011-assert-rejection-code-matches.sdp.md | 13 + ...rejection-code-fails-for-wrong-code.sdp.md | 13 + ...ert-rejection-message-contains-text.sdp.md | 13 + .../s-014-assert-decision-failed.sdp.md | 13 + ...s-015-assert-failure-reason-matches.sdp.md | 13 + .../s-001-assert-valid-transition.sdp.md | 13 + ...002-assert-invalid-transition-fails.sdp.md | 13 + ...03-assert-transition-is-not-allowed.sdp.md | 13 + ...ansition-fails-for-valid-transition.sdp.md | 13 + .../s-005-assert-terminal-state.sdp.md | 13 + ...rminal-state-fails-for-non-terminal.sdp.md | 13 + .../s-007-assert-non-terminal-state.sdp.md | 13 + .../s-008-assert-initial-state.sdp.md | 13 + .../s-009-assert-valid-state.sdp.md | 13 + .../s-010-assert-invalid-state-fails.sdp.md | 13 + .../s-011-get-all-valid-transitions.sdp.md | 13 + .../s-012-get-all-states.sdp.md | 13 + .../s-013-get-terminal-states.sdp.md | 13 + .../s-014-get-non-terminal-states.sdp.md | 13 + ...sert-valid-transitions-from-a-state.sdp.md | 13 + .../s-001-generate-unique-test-run-id.sdp.md | 13 + ...-run-id-is-stable-within-a-test-run.sdp.md | 13 + ...entity-i-ds-with-test-run-namespace.sdp.md | 13 + ...ustom-prefix-for-specific-isolation.sdp.md | 13 + ...ation-prevents-cross-test-pollution.sdp.md | 13 + ...mmand-records-intent-and-completion.sdp.md | 13 + ...nt-record-captures-command-metadata.sdp.md | 13 + ...ess-rejection-records-failed-intent.sdp.md | 13 + ...nical-failure-records-failed-intent.sdp.md | 13 + ...tent-statistics-show-correct-counts.sdp.md | 13 + ...tes-records-for-each-target-context.sdp.md | 13 + ...tion-records-contain-event-metadata.sdp.md | 13 + ...sh-result-contains-publication-i-ds.sdp.md | 13 + ...-004-query-publications-by-event-id.sdp.md | 13 + ...ery-returns-empty-for-unknown-event.sdp.md | 13 + .../s-006-query-publications-by-status.sdp.md | 13 + .../s-007-stats-show-counts-by-status.sdp.md | 13 + ...s-for-different-events-are-isolated.sdp.md | 13 + ...ate-a-running-checkpoint-for-replay.sdp.md | 13 + .../s-002-update-checkpoint-progress.sdp.md | 13 + ...play-for-already-running-projection.sdp.md | 13 + ...s-004-query-checkpoint-by-replay-id.sdp.md | 13 + .../s-005-list-checkpoints-by-status.sdp.md | 13 + ...ith-unique-idempotency-key-succeeds.sdp.md | 13 + ...potency-keys-create-separate-events.sdp.md | 13 + ...e-idempotency-key-returns-duplicate.sdp.md | 13 + ...-with-different-payload-is-rejected.sdp.md | 13 + ...ent-streams-creates-separate-events.sdp.md | 13 + ...ing-timeout-is-flagged-as-abandoned.sdp.md | 13 + ...ntent-within-timeout-is-not-flagged.sdp.md | 13 + ...d-intent-is-not-flagged-even-if-old.sdp.md | 13 + ...d-intent-is-not-flagged-even-if-old.sdp.md | 13 + ...abandoned-intents-for-investigation.sdp.md | 13 + ...r-marks-pending-intent-as-abandoned.sdp.md | 13 + ...handler-no-ops-for-completed-intent.sdp.md | 13 + ...ilure-creates-pending-poison-record.sdp.md | 13 + ...nd-failure-increments-attempt-count.sdp.md | 13 + ...-event-quarantined-after-3-failures.sdp.md | 13 + ...4-quarantine-captures-error-details.sdp.md | 13 + ...d-event-bypasses-handler-completely.sdp.md | 13 + ...nquarantine-resets-status-for-retry.sdp.md | 13 + ...tined-event-returns-not-quarantined.sdp.md | 13 + ...rantined-event-counts-by-projection.sdp.md | 13 + ...operation-succeeds-on-first-attempt.sdp.md | 13 + ...ted-result-passes-through-unchanged.sdp.md | 13 + ...retry-metadata-with-updated-version.sdp.md | 13 + ...x-retries-exceeded-returns-rejected.sdp.md | 13 + ...e-conflict-rolls-back-state-updates.sdp.md | 13 + ...006-backoff-increases-exponentially.sdp.md | 13 + .../s-007-backoff-is-capped-at-maximum.sdp.md | 13 + ...etries-use-consistent-partition-key.sdp.md | 13 + ...-normal-requests-pass-rate-limiting.sdp.md | 13 + ...xhausted-rate-limit-rejects-request.sdp.md | 13 + ...erent-users-have-independent-limits.sdp.md | 13 + ...mmand-types-have-independent-limits.sdp.md | 13 + ...-command-returns-standard-rejection.sdp.md | 13 + ...check-commands-bypass-rate-limiting.sdp.md | 13 + ...me-rate-limit-uses-sharded-counting.sdp.md | 13 + ...fully-add-stock-to-existing-product.sdp.md | 13 + ...dding-stock-to-non-existent-product.sdp.md | 13 + ...-is-idempotent-with-same-command-id.sdp.md | 13 + .../s-001-confirm-pending-reservation.sdp.md | 13 + ...rming-already-confirmed-reservation.sdp.md | 13 + ...confirming-non-existent-reservation.sdp.md | 13 + ...a-new-product-and-verify-projection.sdp.md | 13 + .../s-002-reject-duplicate-product-id.sdp.md | 13 + .../s-003-reject-duplicate-sku.sdp.md | 13 + ...-is-idempotent-with-same-command-id.sdp.md | 13 + ...-list-products-returns-all-products.sdp.md | 13 + ...-get-stock-availability-for-product.sdp.md | 13 + ...eck-availability-for-multiple-items.sdp.md | 13 + .../s-004-get-reservation-by-order-id.sdp.md | 13 + .../s-001-release-pending-reservation.sdp.md | 13 + ...t-releasing-non-pending-reservation.sdp.md | 13 + ...xpire-pending-reservations-past-ttl.sdp.md | 13 + .../s-002-skip-confirmed-reservations.sdp.md | 13 + ...3-skip-reservations-not-yet-expired.sdp.md | 13 + ...expiration-of-multiple-reservations.sdp.md | 13 + .../s-001-reserve-stock-successfully.sdp.md | 13 + ...02-reserve-stock-for-multiple-items.sdp.md | 13 + ...-003-reject-when-insufficient-stock.sdp.md | 13 + ...ing-reservation-when-one-item-fails.sdp.md | 13 + ...005-reject-for-non-existent-product.sdp.md | 13 + ...ailed-status-when-reservation-fails.sdp.md | 13 + ...007-idempotent-with-same-command-id.sdp.md | 13 + ...o-draft-order-and-verify-projection.sdp.md | 13 + ...ject-adding-item-to-submitted-order.sdp.md | 13 + ...dd-multiple-items-to-order-in-batch.sdp.md | 13 + ...2-batch-respects-order-of-execution.sdp.md | 13 + ...ops-on-first-failure-in-atomic-mode.sdp.md | 13 + ...l-draft-order-and-verify-projection.sdp.md | 13 + ...bmitted-order-and-verify-projection.sdp.md | 13 + ...-cancelling-already-cancelled-order.sdp.md | 13 + ...nfirmed-order-and-verify-projection.sdp.md | 13 + ...d-when-confirmed-order-is-cancelled.sdp.md | 13 + ...oes-not-trigger-reservation-release.sdp.md | 13 + ...completion-releases-pending-reserva.sdp.md | 13 + ...ady-released-reservation-gracefully.sdp.md | 13 + ...reservation-when-order-is-cancelled.sdp.md | 13 + ...e-a-new-order-and-verify-projection.sdp.md | 13 + .../s-002-reject-duplicate-order-id.sdp.md | 13 + ...-is-idempotent-with-same-command-id.sdp.md | 13 + .../s-001-query-orders-by-customer-id.sdp.md | 13 + .../s-002-query-orders-by-status.sdp.md | 13 + ...m-draft-order-and-verify-projection.sdp.md | 13 + ...er-with-items-and-verify-projection.sdp.md | 13 + ...s-002-reject-submitting-empty-order.sdp.md | 13 + ...-submitting-already-submitted-order.sdp.md | 13 + ...-is-available-for-single-item-order.sdp.md | 13 + ...k-is-available-for-multi-item-order.sdp.md | 13 + ...-insufficient-stock-for-single-item.sdp.md | 13 + ...i-item-order-has-insufficient-stock.sdp.md | 13 + ...s-005-saga-runs-only-once-per-order.sdp.md | 13 + ...pleted-after-successful-fulfillment.sdp.md | 13 + ...tus-is-completed-after-compensation.sdp.md | 13 + ...leted-at-timestamp-after-completion.sdp.md | 13 + ...urns-workflow-id-for-completed-saga.sdp.md | 13 + ...get-saga-steps-returns-step-history.sdp.md | 13 + ...-returns-null-for-non-existent-saga.sdp.md | 13 + ...ompleted-saga-returns-invalid-state.sdp.md | 13 + ...non-existent-saga-returns-not-found.sdp.md | 13 + ...006-cleanup-completed-saga-workflow.sdp.md | 13 + ...eature-files-pass-schema-validation.sdp.md | 13 + ...-roadmap-md-reflects-planned-phases.sdp.md | 13 + ...storical-deliverables-are-preserved.sdp.md | 13 + ...plete-phases-deferred-appropriately.sdp.md | 13 + ...e-accessible-through-generated-docs.sdp.md | 13 + ...ity-is-assessed-against-new-roadmap.sdp.md | 13 + ...nning-sessions-have-defined-outputs.sdp.md | 13 + ...002-non-code-sessions-are-supported.sdp.md | 13 + ...003-configuration-inheritance-works.sdp.md | 13 + ...are-documented-for-roadmap-planning.sdp.md | 13 + ...ve-annotation-policy-is-sustainable.sdp.md | 13 + ...claude-md-is-generated-from-modules.sdp.md | 13 + ...ariations-produce-different-outputs.sdp.md | 13 + ...3-pattern-content-is-auto-generated.sdp.md | 13 + ...04-session-templates-are-includable.sdp.md | 13 + ...mand-preserves-literal-command-type.sdp.md | 13 + ...ommand-includes-all-metadata-fields.sdp.md | 13 + ...-event-preserves-literal-event-type.sdp.md | 13 + ...event-supports-all-event-categories.sdp.md | 13 + ...n-preserves-literal-projection-name.sdp.md | 13 + ...preserves-event-subscriptions-tuple.sdp.md | 13 + ...category-validates-category-strings.sdp.md | 13 + ...eturns-true-only-for-logic-category.sdp.md | 13 + ...returns-true-only-for-view-category.sdp.md | 13 + ...returns-true-only-for-view-category.sdp.md | 13 + ...turns-false-for-non-view-categories.sdp.md | 13 + ...time-triggered-requires-cron-config.sdp.md | 13 + ...nt-triggered-requires-subscriptions.sdp.md | 13 + ...ery-fails-across-component-boundary.sdp.md | 13 + ...s-002-component-api-access-succeeds.sdp.md | 13 + ...writes-commit-atomically-on-success.sdp.md | 13 + ...olls-back-only-the-component-writes.sdp.md | 13 + ...r-id-passed-explicitly-to-component.sdp.md | 13 + .../s-006-id-conversion-at-boundary.sdp.md | 13 + ...t-provides-type-safety-for-commands.sdp.md | 13 + ...first-command-execution-is-recorded.sdp.md | 13 + ...icate-command-returns-cached-result.sdp.md | 13 + ...ful-command-transitions-to-executed.sdp.md | 13 + ...s-rejection-transitions-to-rejected.sdp.md | 13 + ...xpected-error-transitions-to-failed.sdp.md | 13 + ...mmand-runs-all-7-orchestrator-steps.sdp.md | 13 + ...-short-circuits-before-event-append.sdp.md | 13 + ...ropagated-to-emitted-event-metadata.sdp.md | 13 + ...on-returns-the-events-for-a-command.sdp.md | 13 + ...-registered-middleware-run-in-order.sdp.md | 13 + ...ddleware-failure-halts-the-pipeline.sdp.md | 13 + ...irst-command-submission-is-recorded.sdp.md | 13 + ...urns-existing-status-when-completed.sdp.md | 13 + ...g-processing-returns-pending-status.sdp.md | 13 + ...ection-via-post-insert-verification.sdp.md | 13 + ...oint-position-equals-event-position.sdp.md | 13 + ...int-position-exceeds-event-position.sdp.md | 13 + ...ns-null-when-agent-status-is-paused.sdp.md | 13 + ...s-null-when-agent-status-is-stopped.sdp.md | 13 + ...when-agent-status-is-error-recovery.sdp.md | 13 + ...when-checkpoint-is-null-first-event.sdp.md | 13 + ...hen-pattern-has-no-analyze-function.sdp.md | 13 + ...-throws-when-pattern-trigger-throws.sdp.md | 13 + ...oad-state-errors-for-workpool-retry.sdp.md | 13 + ...d-from-agent-id-and-global-position.sdp.md | 13 + ...on-id-for-same-inputs-deterministic.sdp.md | 13 + ...ased-decision-when-pattern-triggers.sdp.md | 13 + ...d-when-pattern-has-analyze-function.sdp.md | 13 + ...-pattern-id-when-no-pattern-matches.sdp.md | 13 + ...t-invoke-llm-enrichment-via-runtime.sdp.md | 13 + ...-throws-when-pattern-executor-fails.sdp.md | 13 + ...and-result-is-returned-when-allowed.sdp.md | 13 + ...eration-is-not-executed-when-denied.sdp.md | 13 + ...ate-limit-receives-agent-scoped-key.sdp.md | 13 + ...peration-errors-propagate-to-caller.sdp.md | 13 + ...propagate-without-calling-operation.sdp.md | 13 + ...warning-is-logged-when-rate-limited.sdp.md | 13 + ...logged-when-rate-limit-check-passes.sdp.md | 13 + ...ion-has-correct-type-and-references.sdp.md | 13 + ...ject-retry-config-is-passed-through.sdp.md | 13 + ...lean-retry-config-is-passed-through.sdp.md | 13 + ...-field-is-absent-when-not-specified.sdp.md | 13 + ...context-returns-all-required-fields.sdp.md | 13 + ...sation-id-equals-the-event-event-id.sdp.md | 13 + ...iption-uses-default-priority-of-250.sdp.md | 13 + ...8-subscription-uses-custom-priority.sdp.md | 13 + ...name-includes-context-when-provided.sdp.md | 13 + ...ame-omits-context-when-not-provided.sdp.md | 13 + ...contains-all-configured-event-types.sdp.md | 13 + ...es-correct-agent-event-handler-args.sdp.md | 13 + ...y-returns-stream-id-based-partition.sdp.md | 13 + ...ption-with-context-has-correct-name.sdp.md | 13 + ...on-without-context-has-correct-name.sdp.md | 13 + ...iption-uses-default-priority-of-250.sdp.md | 13 + ...4-subscription-uses-custom-priority.sdp.md | 13 + ...filter-contains-correct-event-types.sdp.md | 13 + ...tion-attaches-the-handler-reference.sdp.md | 13 + ...es-correct-agent-event-handler-args.sdp.md | 13 + ...gs-includes-payload-in-handler-args.sdp.md | 13 + ...orm-wraps-non-object-payload-in-raw.sdp.md | 13 + ...to-handler-args-transformer-is-used.sdp.md | 13 + ...-partitions-by-stream-id-by-default.sdp.md | 13 + ...tom-partition-key-extractor-is-used.sdp.md | 13 + ...s-subscriptions-for-multiple-agents.sdp.md | 13 + ...-if-handler-is-missing-for-an-agent.sdp.md | 13 + ...common-options-to-all-subscriptions.sdp.md | 13 + ...-for-multiple-to-handler-args-calls.sdp.md | 13 + ...-handler-args-and-get-partition-key.sdp.md | 13 + ...ypes-and-rejects-unsubscribed-types.sdp.md | 13 + ...es-array-starts-with-correct-length.sdp.md | 13 + ...ll-published-event-fields-correctly.sdp.md | 13 + .../s-021-handles-null-payload.sdp.md | 13 + .../s-022-handles-array-payload.sdp.md | 13 + ...001-all-six-error-codes-are-present.sdp.md | 13 + ...contains-all-four-statuses-in-order.sdp.md | 13 + ...roval-statuses-is-a-4-element-array.sdp.md | 13 + ...turns-true-for-valid-status-strings.sdp.md | 13 + ...5-returns-false-for-invalid-strings.sdp.md | 13 + ...-returns-false-for-non-string-types.sdp.md | 13 + ...007-accepts-all-four-valid-statuses.sdp.md | 13 + ...s-008-rejects-invalid-status-values.sdp.md | 13 + ...009-accepts-a-valid-approval-object.sdp.md | 13 + ...proval-with-missing-required-fields.sdp.md | 13 + ...ts-approval-with-confidence-above-1.sdp.md | 13 + ...s-approval-with-negative-confidence.sdp.md | 13 + ...alid-auth-context-with-user-id-only.sdp.md | 13 + ...014-accepts-auth-context-with-roles.sdp.md | 13 + ...accepts-auth-context-with-agent-ids.sdp.md | 13 + ...cts-auth-context-with-empty-user-id.sdp.md | 13 + ...s-017-parses-valid-duration-strings.sdp.md | 13 + ...18-returns-null-for-invalid-formats.sdp.md | 13 + .../s-019-returns-null-for-zero-values.sdp.md | 13 + ...urns-true-for-valid-timeout-formats.sdp.md | 13 + ...s-false-for-invalid-timeout-formats.sdp.md | 13 + ...2-uses-explicit-timeout-from-config.sdp.md | 13 + ...-default-timeout-when-not-specified.sdp.md | 13 + ...-default-timeout-for-invalid-format.sdp.md | 13 + ...-when-confidence-is-below-threshold.sdp.md | 13 + ...nfidence-equals-threshold-inclusive.sdp.md | 13 + ...-when-confidence-is-above-threshold.sdp.md | 13 + ...threshold-of-0-9-when-not-specified.sdp.md | 13 + ...ed-action-even-with-high-confidence.sdp.md | 13 + ...nlisted-action-with-high-confidence.sdp.md | 13 + ...approved-action-with-low-confidence.sdp.md | 13 + ...akes-precedence-over-low-confidence.sdp.md | 13 + ...l-wins-when-action-is-in-both-lists.sdp.md | 13 + ...o-confidence-check-with-empty-lists.sdp.md | 13 + ...nfidence-check-with-undefined-lists.sdp.md | 13 + .../s-036-handles-confidence-of-0.sdp.md | 13 + .../s-037-handles-confidence-of-1.sdp.md | 13 + ...ent-id-is-in-auth-context-agent-ids.sdp.md | 13 + ...id-is-not-in-auth-context-agent-ids.sdp.md | 13 + ...s-false-when-agent-ids-is-undefined.sdp.md | 13 + ...turns-false-when-agent-ids-is-empty.sdp.md | 13 + ...rue-when-user-has-at-least-one-role.sdp.md | 13 + ...turns-false-when-roles-is-undefined.sdp.md | 13 + ...4-returns-false-when-roles-is-empty.sdp.md | 13 + ...ds-check-fails-even-with-admin-role.sdp.md | 13 + ...s-046-both-agent-ids-and-roles-pass.sdp.md | 13 + ...-with-apr-prefix-and-correct-format.sdp.md | 13 + ...tes-unique-i-ds-over-multiple-calls.sdp.md | 13 + ...9-sets-correct-initial-field-values.sdp.md | 13 + ...ue-approval-ids-over-multiple-calls.sdp.md | 13 + ...1-sets-requested-at-to-current-time.sdp.md | 13 + ...-expires-at-based-on-config-timeout.sdp.md | 13 + ...t-include-optional-fields-initially.sdp.md | 13 + ...itions-pending-approval-to-approved.sdp.md | 13 + ...-includes-review-note-when-provided.sdp.md | 13 + ...clude-review-note-when-not-provided.sdp.md | 13 + ...rows-error-for-non-pending-statuses.sdp.md | 13 + ...error-for-expired-pending-approvals.sdp.md | 13 + ...eserves-other-fields-after-approval.sdp.md | 13 + ...ng-approval-to-rejected-with-reason.sdp.md | 13 + ...wed-at-to-current-time-on-rejection.sdp.md | 13 + ...when-rejecting-non-pending-approval.sdp.md | 13 + ...-rejecting-expired-pending-approval.sdp.md | 13 + ...sitions-pending-approval-to-expired.sdp.md | 13 + ...-when-expiring-non-pending-approval.sdp.md | 13 + ...es-original-fields-after-expiration.sdp.md | 13 + ...-success-for-valid-pending-approval.sdp.md | 13 + ...orized-reviewer-when-not-authorized.sdp.md | 13 + ...s-transition-when-already-processed.sdp.md | 13 + ...proval-expired-when-past-expiration.sdp.md | 13 + ...returns-success-for-valid-rejection.sdp.md | 13 + ...nauthorized-reviewer-on-safe-reject.sdp.md | 13 + ...rns-approval-expired-on-safe-reject.sdp.md | 13 + ...nding-returns-true-only-for-pending.sdp.md | 13 + ...oved-returns-true-only-for-approved.sdp.md | 13 + ...cted-returns-true-only-for-rejected.sdp.md | 13 + ...ed-status-and-time-based-expiration.sdp.md | 13 + ...able-checks-pending-and-not-expired.sdp.md | 13 + ...remaining-time-for-pending-approval.sdp.md | 13 + ...-080-returns-0-for-expired-approval.sdp.md | 13 + ...81-returns-0-for-non-pending-status.sdp.md | 13 + .../s-082-formats-hours-and-minutes.sdp.md | 13 + .../s-083-formats-minutes-only.sdp.md | 13 + ...returns-expired-for-past-expiration.sdp.md | 13 + ...085-returns-true-for-valid-approval.sdp.md | 13 + ...86-returns-false-for-invalid-inputs.sdp.md | 13 + ...eturns-false-for-invalid-confidence.sdp.md | 13 + ...s-001-record-pattern-detected-event.sdp.md | 13 + ...02-audit-includes-triggering-events.sdp.md | 13 + ...s-003-audit-includes-execution-mode.sdp.md | 13 + .../s-004-audit-includes-llm-metadata.sdp.md | 13 + .../s-005-audit-llm-failures.sdp.md | 13 + .../s-006-record-auto-executed-action.sdp.md | 13 + .../s-007-record-approved-action.sdp.md | 13 + .../s-008-record-rejected-action.sdp.md | 13 + .../s-009-record-expired-action.sdp.md | 13 + ...10-query-all-decisions-for-an-agent.sdp.md | 13 + ...011-query-decisions-by-pattern-type.sdp.md | 13 + ...s-012-query-decisions-by-time-range.sdp.md | 13 + ...-013-query-decision-with-full-trace.sdp.md | 13 + ...-contains-all-ds-1-base-event-types.sdp.md | 13 + ...ll-ds-4-command-routing-event-types.sdp.md | 13 + ...ains-all-ds-5-lifecycle-event-types.sdp.md | 13 + ...ns-ds-6-failure-tracking-event-type.sdp.md | 13 + .../s-005-has-exactly-17-event-types.sdp.md | 13 + ...ue-for-all-valid-event-type-strings.sdp.md | 13 + ...07-returns-false-for-invalid-values.sdp.md | 13 + ...returns-false-for-non-string-values.sdp.md | 13 + ...s-009-accepts-all-valid-event-types.sdp.md | 13 + .../s-010-rejects-invalid-event-types.sdp.md | 13 + ...1-rejects-non-string-values-via-zod.sdp.md | 13 + .../s-012-accepts-valid-llm-context.sdp.md | 13 + .../s-013-rejects-negative-tokens.sdp.md | 13 + .../s-014-rejects-negative-duration.sdp.md | 13 + .../s-015-rejects-non-integer-tokens.sdp.md | 13 + .../s-016-accepts-zero-values.sdp.md | 13 + ...s-valid-action-with-flag-for-review.sdp.md | 13 + ...epts-valid-action-with-auto-execute.sdp.md | 13 + ...-019-rejects-action-with-empty-type.sdp.md | 13 + ...-action-with-invalid-execution-mode.sdp.md | 13 + ...on-with-extra-fields-in-strict-mode.sdp.md | 13 + ...2-accepts-valid-payload-with-action.sdp.md | 13 + ...-payload-with-null-pattern-detected.sdp.md | 13 + ...24-accepts-payload-with-null-action.sdp.md | 13 + ...25-accepts-payload-with-llm-context.sdp.md | 13 + ...cts-payload-with-confidence-below-0.sdp.md | 13 + ...cts-payload-with-confidence-above-1.sdp.md | 13 + ...epts-valid-approval-granted-payload.sdp.md | 13 + ...29-accepts-payload-with-review-note.sdp.md | 13 + ...ejects-payload-with-empty-action-id.sdp.md | 13 + ...pts-valid-approval-rejected-payload.sdp.md | 13 + ...llows-empty-rejection-reason-string.sdp.md | 13 + ...epts-valid-approval-expired-payload.sdp.md | 13 + ...ejects-payload-with-empty-action-id.sdp.md | 13 + .../s-035-accepts-valid-audit-event.sdp.md | 13 + ...6-rejects-event-with-empty-agent-id.sdp.md | 13 + ...ejects-event-with-empty-decision-id.sdp.md | 13 + ...-038-generates-i-ds-with-dec-prefix.sdp.md | 13 + ...generates-i-ds-with-expected-format.sdp.md | 13 + ...tes-unique-i-ds-over-multiple-calls.sdp.md | 13 + ...41-uses-a-uui-dv7-payload-in-the-id.sdp.md | 13 + ...es-event-with-pattern-detected-type.sdp.md | 13 + .../s-043-includes-all-required-fields.sdp.md | 13 + ...-includes-llm-context-when-provided.sdp.md | 13 + ...clude-llm-context-when-not-provided.sdp.md | 13 + ...s-046-handles-null-pattern-detected.sdp.md | 13 + .../s-047-handles-null-action.sdp.md | 13 + ...es-event-with-approval-granted-type.sdp.md | 13 + ...equired-fields-for-approval-granted.sdp.md | 13 + ...-includes-review-note-when-provided.sdp.md | 13 + ...clude-review-note-when-not-provided.sdp.md | 13 + ...s-event-with-approval-rejected-type.sdp.md | 13 + ...quired-fields-for-approval-rejected.sdp.md | 13 + ...es-event-with-approval-expired-type.sdp.md | 13 + ...equired-fields-for-approval-expired.sdp.md | 13 + ...6-creates-event-with-specified-type.sdp.md | 13 + ...l-required-fields-for-generic-event.sdp.md | 13 + ...d-to-empty-object-when-not-provided.sdp.md | 13 + ...rks-with-ds-4-command-routing-types.sdp.md | 13 + ...060-works-with-ds-5-lifecycle-types.sdp.md | 13 + ...rns-true-for-pattern-detected-event.sdp.md | 13 + ...anted-event-via-is-pattern-detected.sdp.md | 13 + ...ected-event-via-is-pattern-detected.sdp.md | 13 + ...rns-true-for-approval-granted-event.sdp.md | 13 + ...ected-event-via-is-approval-granted.sdp.md | 13 + ...ected-event-via-is-approval-granted.sdp.md | 13 + ...ns-true-for-approval-rejected-event.sdp.md | 13 + ...nted-event-via-is-approval-rejected.sdp.md | 13 + ...cted-event-via-is-approval-rejected.sdp.md | 13 + ...-valid-pattern-detected-audit-event.sdp.md | 13 + ...-valid-approval-granted-audit-event.sdp.md | 13 + ...valid-approval-rejected-audit-event.sdp.md | 13 + ...-valid-approval-expired-audit-event.sdp.md | 13 + .../s-074-returns-false-for-null.sdp.md | 13 + .../s-075-returns-false-for-undefined.sdp.md | 13 + ...-076-returns-false-for-empty-object.sdp.md | 13 + ...eturns-false-for-invalid-event-type.sdp.md | 13 + ...s-false-for-missing-required-fields.sdp.md | 13 + ...ete-audit-trail-for-approved-action.sdp.md | 13 + ...ete-audit-trail-for-rejected-action.sdp.md | 13 + ...ates-audit-trail-for-expired-action.sdp.md | 13 + ...urns-true-for-error-recovery-status.sdp.md | 13 + ...002-returns-false-for-active-status.sdp.md | 13 + ...003-returns-false-for-paused-status.sdp.md | 13 + ...04-returns-false-for-stopped-status.sdp.md | 13 + ...values-when-overrides-are-undefined.sdp.md | 13 + ...-base-rate-limits-when-no-overrides.sdp.md | 13 + ...when-base-has-none-and-no-overrides.sdp.md | 13 + ...-preserving-pattern-window-duration.sdp.md | 13 + ...ile-preserving-confidence-threshold.sdp.md | 13 + ...minute-while-preserving-base-cost-b.sdp.md | 13 + ...serving-cost-budget-alert-threshold.sdp.md | 13 + ...-while-preserving-cost-budget-daily.sdp.md | 13 + ...3-fully-overrides-all-config-values.sdp.md | 13 + ...ts-via-overrides-when-base-has-none.sdp.md | 13 + ...s-object-returns-base-config-values.sdp.md | 13 + ...eckpoint-without-existing-overrides.sdp.md | 13 + ...g-overrides-with-existing-overrides.sdp.md | 13 + ...rides-take-precedence-over-existing.sdp.md | 13 + ...rrides-when-update-has-no-overrides.sdp.md | 13 + ...cost-budget-in-checkpoint-overrides.sdp.md | 13 + .../s-021-updates-updated-at-timestamp.sdp.md | 13 + ...2-increments-events-processed-count.sdp.md | 13 + ...rocessed-when-no-increment-provided.sdp.md | 13 + ...neither-existing-nor-update-have-th.sdp.md | 13 + ...ntinel-last-processed-position-of-1.sdp.md | 13 + ...eates-checkpoint-with-active-status.sdp.md | 13 + ...eckpoint-with-zero-events-processed.sdp.md | 13 + ...checkpoint-with-empty-last-event-id.sdp.md | 13 + ...029-sets-updated-at-to-current-time.sdp.md | 13 + ...serves-agent-id-and-subscription-id.sdp.md | 13 + ...1-does-not-include-config-overrides.sdp.md | 13 + .../s-001-contains-all-four-statuses.sdp.md | 13 + ...is-a-readonly-tuple-with-4-elements.sdp.md | 13 + .../s-003-accepts-all-valid-statuses.sdp.md | 13 + .../s-004-rejects-invalid-statuses.sdp.md | 13 + ...5-accepts-a-valid-checkpoint-object.sdp.md | 13 + ...checkpoint-with-sentinel-position-1.sdp.md | 13 + ...ts-checkpoint-with-position-below-1.sdp.md | 13 + ...oint-with-negative-events-processed.sdp.md | 13 + ...ects-checkpoint-with-empty-agent-id.sdp.md | 13 + ...eckpoint-with-empty-subscription-id.sdp.md | 13 + ...kpoint-with-missing-required-fields.sdp.md | 13 + ...orrect-agent-id-and-subscription-id.sdp.md | 13 + ...osition-and-event-tracking-defaults.sdp.md | 13 + .../s-014-initializes-status-to-active.sdp.md | 13 + ...015-sets-updated-at-to-current-time.sdp.md | 13 + ...point-that-passes-schema-validation.sdp.md | 13 + ...017-updates-last-processed-position.sdp.md | 13 + .../s-018-updates-last-event-id.sdp.md | 13 + .../s-019-updates-status.sdp.md | 13 + ...vents-processed-by-specified-amount.sdp.md | 13 + ...nts-processed-by-1-for-single-event.sdp.md | 13 + ...events-processed-when-not-specified.sdp.md | 13 + .../s-023-preserves-unchanged-fields.sdp.md | 13 + ...-updates-updated-at-to-current-time.sdp.md | 13 + ...25-applies-multiple-updates-at-once.sdp.md | 13 + ...y-update-by-only-updating-timestamp.sdp.md | 13 + ...position-is-greater-than-checkpoint.sdp.md | 13 + ...or-duplicate-event-at-same-position.sdp.md | 13 + ...s-false-for-already-processed-event.sdp.md | 13 + ...-against-sentinel-1-for-a-new-agent.sdp.md | 13 + ...e-for-position-1-against-sentinel-1.sdp.md | 13 + ...ositive-position-against-sentinel-1.sdp.md | 13 + ...for-position-1-against-checkpoint-0.sdp.md | 13 + ...for-position-0-against-checkpoint-0.sdp.md | 13 + ...s-035-handles-large-position-values.sdp.md | 13 + ...ocesses-sequential-events-correctly.sdp.md | 13 + ...037-handles-gaps-in-event-positions.sdp.md | 13 + ...returns-true-only-for-active-status.sdp.md | 13 + ...returns-true-only-for-paused-status.sdp.md | 13 + ...eturns-true-only-for-stopped-status.sdp.md | 13 + ...returns-true-for-a-valid-checkpoint.sdp.md | 13 + ...r-checkpoint-with-sentinel-position.sdp.md | 13 + ...for-null-undefined-and-empty-object.sdp.md | 13 + ...returns-false-for-non-object-values.sdp.md | 13 + ...-for-checkpoint-with-invalid-status.sdp.md | 13 + ...or-checkpoint-with-position-below-1.sdp.md | 13 + ...oint-with-negative-events-processed.sdp.md | 13 + ...48-new-agent-processes-first-events.sdp.md | 13 + ...pause-and-resume-preserves-position.sdp.md | 13 + ...very-skips-already-processed-events.sdp.md | 13 + ...licate-event-delivery-is-idempotent.sdp.md | 13 + ...rator-records-audit-and-updates-sta.sdp.md | 13 + ...dit-and-sets-status-to-failed-for-u.sdp.md | 13 + ...en-registry-does-not-contain-the-co.sdp.md | 13 + ...or-when-to-orchestrator-args-throws.sdp.md | 13 + ...dit-and-sets-status-to-failed-on-or.sdp.md | 13 + ...dit-recording-fails-on-success-path.sdp.md | 13 + ...atus-mutation-fails-on-success-path.sdp.md | 13 + ...update-status-is-undefined-on-succe.sdp.md | 13 + ...ure-when-update-status-is-undefined.sdp.md | 13 + ...-event-payload-when-present-in-args.sdp.md | 13 + ...audit-payload-when-absent-from-args.sdp.md | 13 + .../s-001-emit-recommendation-command.sdp.md | 13 + ...002-command-includes-correlation-id.sdp.md | 13 + ...ommand-includes-agent-bc-identifier.sdp.md | 13 + .../s-004-command-includes-reason.sdp.md | 13 + .../s-005-command-includes-confidence.sdp.md | 13 + ...-command-includes-triggering-events.sdp.md | 13 + .../s-007-command-includes-llm-context.sdp.md | 13 + ...s-008-reject-command-without-reason.sdp.md | 13 + ...9-reject-command-without-confidence.sdp.md | 13 + ...ject-confidence-outside-valid-range.sdp.md | 13 + ...is-handled-with-exponential-backoff.sdp.md | 13 + ...t-falls-back-to-rule-based-emission.sdp.md | 13 + .../s-013-emit-notification-command.sdp.md | 13 + .../s-014-emit-action-command.sdp.md | 13 + .../s-015-emit-escalation-command.sdp.md | 13 + ...when-command-type-exists-in-the-map.sdp.md | 13 + ...mand-type-does-not-exist-in-the-map.sdp.md | 13 + ...turns-undefined-for-empty-route-map.sdp.md | 13 + ...es-success-results-for-valid-routes.sdp.md | 13 + ...ered-error-for-missing-command-type.sdp.md | 13 + ...e-error-for-missing-bounded-context.sdp.md | 13 + ...or-for-missing-to-orchestrator-args.sdp.md | 13 + ...rns-empty-array-for-empty-route-map.sdp.md | 13 + ...id-and-invalid-routes-independently.sdp.md | 13 + ...0-contains-all-expected-error-codes.sdp.md | 13 + .../s-011-has-exactly-4-error-codes.sdp.md | 13 + ...tring-constants-matching-their-keys.sdp.md | 13 + ...1-contains-all-expected-error-codes.sdp.md | 13 + .../s-002-has-exactly-5-error-codes.sdp.md | 13 + .../s-003-accepts-valid-metadata.sdp.md | 13 + ...s-metadata-with-optional-pattern-id.sdp.md | 13 + ...pts-metadata-with-optional-analysis.sdp.md | 13 + ...ejects-metadata-with-empty-agent-id.sdp.md | 13 + ...cts-metadata-with-empty-decision-id.sdp.md | 13 + ...ts-metadata-with-confidence-below-0.sdp.md | 13 + ...ts-metadata-with-confidence-above-1.sdp.md | 13 + ...-rejects-metadata-with-empty-reason.sdp.md | 13 + ...metadata-with-empty-event-ids-array.sdp.md | 13 + ...ts-confidence-at-boundaries-0-and-1.sdp.md | 13 + .../s-013-accepts-valid-command.sdp.md | 13 + ...014-rejects-command-with-empty-type.sdp.md | 13 + ...cepts-command-with-any-payload-type.sdp.md | 13 + ...jects-command-with-invalid-metadata.sdp.md | 13 + ...urns-invalid-when-type-is-undefined.sdp.md | 13 + ...s-invalid-when-type-is-empty-string.sdp.md | 13 + ...nvalid-when-type-is-whitespace-only.sdp.md | 13 + ...nvalid-when-confidence-is-undefined.sdp.md | 13 + ...-invalid-when-confidence-is-below-0.sdp.md | 13 + ...-invalid-when-confidence-is-above-1.sdp.md | 13 + ...cepts-confidence-at-boundary-values.sdp.md | 13 + ...ns-invalid-when-reason-is-undefined.sdp.md | 13 + ...invalid-when-reason-is-empty-string.sdp.md | 13 + ...alid-when-reason-is-whitespace-only.sdp.md | 13 + ...invalid-when-event-ids-is-undefined.sdp.md | 13 + ...valid-when-event-ids-is-empty-array.sdp.md | 13 + .../s-029-accepts-single-event-id.sdp.md | 13 + .../s-030-accepts-multiple-event-i-ds.sdp.md | 13 + ...rns-valid-for-complete-command-args.sdp.md | 13 + ...es-command-with-all-required-fields.sdp.md | 13 + .../s-033-generates-unique-decision-id.sdp.md | 13 + ...pattern-id-when-provided-in-options.sdp.md | 13 + ...nclude-pattern-id-when-not-provided.sdp.md | 13 + ...s-analysis-when-provided-in-options.sdp.md | 13 + ...-include-analysis-when-not-provided.sdp.md | 13 + ...ttern-id-and-analysis-when-provided.sdp.md | 13 + ...ids-array-without-reference-sharing.sdp.md | 13 + .../s-040-throws-error-for-empty-type.sdp.md | 13 + ...throws-error-for-invalid-confidence.sdp.md | 13 + ...s-042-throws-error-for-empty-reason.sdp.md | 13 + ...43-throws-error-for-empty-event-ids.sdp.md | 13 + ...cludes-error-code-in-thrown-message.sdp.md | 13 + ...-command-from-decision-with-command.sdp.md | 13 + ...s-null-when-decision-has-no-command.sdp.md | 13 + ...7-includes-pattern-id-when-provided.sdp.md | 13 + ...048-includes-analysis-when-provided.sdp.md | 13 + ...-maps-all-decision-fields-correctly.sdp.md | 13 + ...-050-returns-true-for-valid-command.sdp.md | 13 + ...ue-for-command-with-optional-fields.sdp.md | 13 + ...eturns-false-for-non-command-values.sdp.md | 13 + ...ns-true-when-command-has-pattern-id.sdp.md | 13 + ...alse-when-command-has-no-pattern-id.sdp.md | 13 + ...-pattern-id-is-undefined-explicitly.sdp.md | 13 + ...urns-true-when-command-has-analysis.sdp.md | 13 + ...-false-when-command-has-no-analysis.sdp.md | 13 + ...en-analysis-is-undefined-explicitly.sdp.md | 13 + ...-059-returns-true-for-null-analysis.sdp.md | 13 + ...idates-creates-and-verifies-command.sdp.md | 13 + ...-command-from-decision-and-verifies.sdp.md | 13 + ...plus-estimated-cost-is-under-budget.sdp.md | 13 + ...-estimated-cost-would-exceed-budget.sdp.md | 13 + ...current-spend-already-equals-budget.sdp.md | 13 + ...timated-cost-exactly-reaches-budget.sdp.md | 13 + ...-when-spend-exceeds-alert-threshold.sdp.md | 13 + ...lert-threshold-when-below-threshold.sdp.md | 13 + ...reshold-at-exact-threshold-boundary.sdp.md | 13 + ...cation-of-tokens-and-cost-per-token.sdp.md | 13 + .../s-009-returns-0-for-0-tokens.sdp.md | 13 + .../s-010-handles-large-token-counts.sdp.md | 13 + ...1-handles-very-small-cost-per-token.sdp.md | 13 + ...nd-output-costs-with-output-greater.sdp.md | 13 + ...has-positive-input-and-output-costs.sdp.md | 13 + ...-model-entry-is-cheaper-than-gpt-4o.sdp.md | 13 + ...1-contains-all-expected-error-codes.sdp.md | 13 + .../s-002-has-exactly-3-error-codes.sdp.md | 13 + ...ontains-all-three-statuses-in-order.sdp.md | 13 + ...is-a-readonly-tuple-with-3-elements.sdp.md | 13 + ...5-type-guard-accepts-valid-statuses.sdp.md | 13 + ...6-type-guard-rejects-invalid-values.sdp.md | 13 + ...type-guard-rejects-non-string-types.sdp.md | 13 + .../s-008-accepts-all-valid-statuses.sdp.md | 13 + ...s-009-rejects-invalid-status-values.sdp.md | 13 + ...cepts-valid-context-with-all-fields.sdp.md | 13 + ...ts-context-with-only-correlation-id.sdp.md | 13 + ...ccepts-context-with-only-error-code.sdp.md | 13 + .../s-013-accepts-empty-context-object.sdp.md | 13 + ...-with-unknown-fields-in-strict-mode.sdp.md | 13 + .../s-015-accepts-valid-dead-letter.sdp.md | 13 + ...16-accepts-dead-letter-with-context.sdp.md | 13 + ...cts-dead-letter-with-empty-agent-id.sdp.md | 13 + ...d-letter-with-empty-subscription-id.sdp.md | 13 + ...cts-dead-letter-with-empty-event-id.sdp.md | 13 + ...etter-with-negative-global-position.sdp.md | 13 + ...ad-letter-with-global-position-of-0.sdp.md | 13 + ...ter-with-non-positive-attempt-count.sdp.md | 13 + ...letter-with-missing-required-fields.sdp.md | 13 + ...-when-followed-by-path-like-content.sdp.md | 13 + ...025-removes-multi-line-stack-traces.sdp.md | 13 + ...-preserves-the-error-message-itself.sdp.md | 13 + ...pe-script-file-paths-with-at-prefix.sdp.md | 13 + ...-without-at-prefix-with-path-marker.sdp.md | 13 + ...-esm-file-paths-when-preceded-by-at.sdp.md | 13 + ...path-marker-when-not-preceded-by-at.sdp.md | 13 + ...-paths-with-line-and-column-numbers.sdp.md | 13 + ...500-characters-ending-with-ellipsis.sdp.md | 13 + ...ncate-messages-under-500-characters.sdp.md | 13 + ...-messages-of-exactly-500-characters.sdp.md | 13 + .../s-035-handles-error-objects.sdp.md | 13 + .../s-036-handles-string-errors.sdp.md | 13 + ...ndles-objects-with-message-property.sdp.md | 13 + .../s-038-handles-unknown-error-types.sdp.md | 13 + .../s-039-handles-null.sdp.md | 13 + .../s-040-handles-undefined.sdp.md | 13 + .../s-041-handles-empty-string.sdp.md | 13 + .../s-042-collapses-multiple-spaces.sdp.md | 13 + ...ims-leading-and-trailing-whitespace.sdp.md | 13 + .../s-044-handles-newlines.sdp.md | 13 + ...es-dead-letter-with-required-fields.sdp.md | 13 + ...tes-dead-letter-with-pending-status.sdp.md | 13 + .../s-047-sets-attempt-count-to-1.sdp.md | 13 + ...-048-sets-failed-at-to-current-time.sdp.md | 13 + ...-049-includes-context-when-provided.sdp.md | 13 + ...t-include-context-when-not-provided.sdp.md | 13 + ...bjects-removing-stack-like-patterns.sdp.md | 13 + .../s-052-sanitizes-string-errors.sdp.md | 13 + ...s-paths-in-errors-without-at-prefix.sdp.md | 13 + ...laces-paths-with-line-column-suffix.sdp.md | 13 + ...s-055-sanitizes-unknown-error-types.sdp.md | 13 + .../s-056-increments-attempt-count.sdp.md | 13 + .../s-057-updates-error-message.sdp.md | 13 + ...s-new-error-message-with-at-pattern.sdp.md | 13 + ...error-message-with-path-replacement.sdp.md | 13 + ...0-updates-failed-at-to-current-time.sdp.md | 13 + ...erves-other-fields-during-increment.sdp.md | 13 + .../s-062-handles-multiple-increments.sdp.md | 13 + ...063-transitions-pending-to-replayed.sdp.md | 13 + ...elds-when-transitioning-to-replayed.sdp.md | 13 + ...ng-replayed-dead-letter-as-replayed.sdp.md | 13 + ...ing-ignored-dead-letter-as-replayed.sdp.md | 13 + ...-067-transitions-pending-to-ignored.sdp.md | 13 + ...ields-when-transitioning-to-ignored.sdp.md | 13 + ...ing-replayed-dead-letter-as-ignored.sdp.md | 13 + ...eady-ignored-dead-letter-as-ignored.sdp.md | 13 + ...nding-returns-true-only-for-pending.sdp.md | 13 + ...ayed-returns-true-only-for-replayed.sdp.md | 13 + ...nored-returns-true-only-for-ignored.sdp.md | 13 + ...-returns-true-for-valid-dead-letter.sdp.md | 13 + ...s-true-for-dead-letter-with-context.sdp.md | 13 + .../s-076-returns-false-for-null.sdp.md | 13 + .../s-077-returns-false-for-undefined.sdp.md | 13 + ...-078-returns-false-for-empty-object.sdp.md | 13 + ...-returns-false-for-non-object-types.sdp.md | 13 + ...for-dead-letter-with-invalid-status.sdp.md | 13 + ...for-dead-letter-with-missing-fields.sdp.md | 13 + ...ent-processing-and-replay-lifecycle.sdp.md | 13 + ...olete-event-being-ignored-lifecycle.sdp.md | 13 + ...-001-subscribe-to-single-event-type.sdp.md | 13 + ...2-subscribe-to-multiple-event-types.sdp.md | 13 + ...oes-not-receive-unsubscribed-events.sdp.md | 13 + .../s-004-filter-by-payload-field.sdp.md | 13 + .../s-005-filter-by-customer-segment.sdp.md | 13 + ...ents-delivered-in-publication-order.sdp.md | 13 + ...nts-from-same-stream-maintain-order.sdp.md | 13 + ...st-processed-position-after-restart.sdp.md | 13 + ...t-updated-after-successful-analysis.sdp.md | 13 + ...letter-without-advancing-checkpoint.sdp.md | 13 + ...t-persists-agent-subscription-state.sdp.md | 13 + .../s-012-pause-subscription.sdp.md | 13 + .../s-013-resume-subscription.sdp.md | 13 + ...nsubscribe-stops-all-event-delivery.sdp.md | 13 + ...-execution-mode-based-on-confidence.sdp.md | 13 + .../s-002-custom-threshold-per-agent.sdp.md | 13 + ...pproval-action-with-high-confidence.sdp.md | 13 + ...-approve-action-with-low-confidence.sdp.md | 13 + ...gure-multiple-approval-requirements.sdp.md | 13 + .../s-006-create-review-task.sdp.md | 13 + .../s-007-approve-pending-action.sdp.md | 13 + .../s-008-reject-pending-action.sdp.md | 13 + .../s-009-action-expires-after-timeout.sdp.md | 13 + ...-010-custom-timeout-per-action-type.sdp.md | 13 + .../s-011-approve-action-near-timeout.sdp.md | 13 + .../s-001-rejects-empty-string-id.sdp.md | 13 + .../s-002-rejects-undefined-id.sdp.md | 13 + .../s-003-rejects-whitespace-only-id.sdp.md | 13 + ...4-rejects-empty-subscriptions-array.sdp.md | 13 + ...005-rejects-undefined-subscriptions.sdp.md | 13 + .../s-006-rejects-negative-threshold.sdp.md | 13 + ...07-rejects-threshold-greater-than-1.sdp.md | 13 + ...jects-empty-pattern-window-duration.sdp.md | 13 + ...espace-only-pattern-window-duration.sdp.md | 13 + ...-requires-approval-and-auto-approve.sdp.md | 13 + ...jects-config-with-no-patterns-array.sdp.md | 13 + ...ts-config-with-empty-patterns-array.sdp.md | 13 + ...-accepts-valid-config-with-patterns.sdp.md | 13 + ...config-without-confidence-threshold.sdp.md | 13 + ...ansforms-a-standard-event-correctly.sdp.md | 13 + ...-wraps-array-payload-in-raw-wrapper.sdp.md | 13 + ...7-wraps-null-payload-in-raw-wrapper.sdp.md | 13 + ...gh-object-payloads-without-wrapping.sdp.md | 13 + ...d-from-the-chain-not-from-the-event.sdp.md | 13 + ...scription-id-starts-with-sub-prefix.sdp.md | 13 + ...bscription-id-contains-the-agent-id.sdp.md | 13 + ...cription-id-contains-a-uuid-segment.sdp.md | 13 + ...fferent-i-ds-when-timestamp-differs.sdp.md | 13 + ...cess-with-handle-for-a-valid-config.sdp.md | 13 + ...alid-config-code-for-invalid-config.sdp.md | 13 + ...s-existing-checkpoint-when-provided.sdp.md | 13 + ...hen-no-existing-checkpoint-provided.sdp.md | 13 + ...nd-carries-type-and-required-fields.sdp.md | 13 + ...rries-optional-reason-when-provided.sdp.md | 13 + ...d-has-undefined-reason-when-omitted.sdp.md | 13 + ...-agent-command-carries-correct-type.sdp.md | 13 + ...rries-optional-reason-when-provided.sdp.md | 13 + ...config-overrides-with-nested-fields.sdp.md | 13 + ...on-narrows-by-type-field-at-runtime.sdp.md | 13 + ...-optional-in-agent-config-overrides.sdp.md | 13 + ...s-with-only-max-requests-per-minute.sdp.md | 13 + ...st-budget-overrides-with-only-daily.sdp.md | 13 + ...s-contain-expected-values-and-count.sdp.md | 13 + ...ult-carries-state-transition-fields.sdp.md | 13 + ...rror-code-carries-message-and-state.sdp.md | 13 + ...t-current-state-for-agent-not-found.sdp.md | 13 + ...ted-union-narrows-to-success-branch.sdp.md | 13 + ...ted-union-narrows-to-failure-branch.sdp.md | 13 + ...l-lifecycle-validators-are-exported.sdp.md | 13 + ...cle-states-contains-all-four-states.sdp.md | 13 + ...le-events-contains-all-seven-events.sdp.md | 13 + ...t-target-for-every-valid-transition.sdp.md | 13 + ...n-returns-true-for-every-valid-pair.sdp.md | 13 + ...ll-for-representative-invalid-pairs.sdp.md | 13 + ...id-pairs-exist-and-all-return-false.sdp.md | 13 + ...rn-null-from-transition-agent-state.sdp.md | 13 + ...ns-next-state-for-valid-transitions.sdp.md | 13 + ...ition-throws-for-invalid-transition.sdp.md | 13 + ...tion-error-message-includes-details.sdp.md | 13 + ...-returns-correct-events-for-stopped.sdp.md | 13 + ...m-returns-correct-events-for-active.sdp.md | 13 + ...m-returns-correct-events-for-paused.sdp.md | 13 + ...s-correct-events-for-error-recovery.sdp.md | 13 + ...ions-returns-exactly-10-transitions.sdp.md | 13 + ...sition-has-from-event-and-to-fields.sdp.md | 13 + ...tions-contains-specific-transitions.sdp.md | 13 + ...ns-returns-same-reference-each-call.sdp.md | 13 + ...rrect-classification-for-all-states.sdp.md | 13 + ...rrect-classification-for-all-states.sdp.md | 13 + ...mmands-and-returns-null-for-unknown.sdp.md | 13 + ...-to-active-with-agent-started-audit.sdp.md | 13 + ...002-rejects-start-from-active-state.sdp.md | 13 + ...003-rejects-start-from-paused-state.sdp.md | 13 + ...-with-agent-paused-audit-and-reason.sdp.md | 13 + ...05-rejects-pause-from-stopped-state.sdp.md | 13 + ...-to-active-with-agent-resumed-audit.sdp.md | 13 + ...7-rejects-resume-from-stopped-state.sdp.md | 13 + ...to-stopped-with-agent-stopped-audit.sdp.md | 13 + ...o-stopped-as-universal-escape-hatch.sdp.md | 13 + ...appy-path-error-recovery-to-stopped.sdp.md | 13 + ...cts-stop-from-already-stopped-state.sdp.md | 13 + ...-active-agent-with-merged-overrides.sdp.md | 13 + ...aused-agent-transitioning-to-active.sdp.md | 13 + ...ects-reconfigure-from-stopped-state.sdp.md | 13 + ...-overrides-when-checkpoint-has-none.sdp.md | 13 + ...ory-returns-all-5-handler-functions.sdp.md | 13 + ...plete-a-start-pause-stop-round-trip.sdp.md | 13 + ...ses-no-op-logger-when-none-provided.sdp.md | 13 + ...-logs-warning-on-invalid-transition.sdp.md | 13 + ...ately-without-calling-any-mutations.sdp.md | 13 + ...ent-but-does-not-advance-checkpoint.sdp.md | 13 + ...heckpoint-when-return-value-is-null.sdp.md | 13 + ...rder-when-requires-approval-is-true.sdp.md | 13 + ...pdates-checkpoint-with-correct-args.sdp.md | 13 + ...24h-timeout-for-approval-expires-at.sdp.md | 13 + ...val-when-requires-approval-is-false.sdp.md | 13 + ...approval-is-true-but-command-is-nul.sdp.md | 13 + ...-timeout-ms-for-approval-expires-at.sdp.md | 13 + ...oint-but-skips-command-and-approval.sdp.md | 13 + ...oint-position-equals-event-position.sdp.md | 13 + ...tes-dead-letter-instead-of-throwing.sdp.md | 13 + ...kpoint-when-audit-persistence-fails.sdp.md | 13 + ...oint-when-command-persistence-fails.sdp.md | 13 + ...int-when-approval-persistence-fails.sdp.md | 13 + ...e-calls-include-verification-proofs.sdp.md | 13 + ...en-dead-letter-recording-also-fails.sdp.md | 13 + ...-result-dead-letter-recording-fails.sdp.md | 13 + .../s-001-define-rule-based-pattern.sdp.md | 13 + .../s-002-define-llm-analyzed-pattern.sdp.md | 13 + ...s-003-window-respects-time-boundary.sdp.md | 13 + .../s-004-window-respects-event-limit.sdp.md | 13 + ...05-empty-window-returns-no-patterns.sdp.md | 13 + ...events-lazily-for-memory-efficiency.sdp.md | 13 + ...etect-churn-risk-from-cancellations.sdp.md | 13 + ...t-fraud-risk-from-frequency-anomaly.sdp.md | 13 + ...9-no-pattern-when-threshold-not-met.sdp.md | 13 + .../s-010-llm-analyzes-event-sequence.sdp.md | 13 + ...-response-includes-suggested-action.sdp.md | 13 + ...-012-llm-timeout-handled-gracefully.sdp.md | 13 + ...l-decision-for-empty-patterns-array.sdp.md | 13 + ...trigger-returns-true-and-no-analyze.sdp.md | 13 + ...-pattern-when-trigger-returns-false.sdp.md | 13 + ...ision-when-analyze-returns-detected.sdp.md | 13 + ...n-when-analyze-returns-not-detected.sdp.md | 13 + ...ropagates-error-when-analyze-throws.sdp.md | 13 + ...-stops-after-first-matching-pattern.sdp.md | 13 + ...pattern-when-first-trigger-is-false.sdp.md | 13 + ...-pattern-when-min-events-is-not-met.sdp.md | 13 + ...sses-pattern-when-min-events-is-met.sdp.md | 13 + ...s-events-outside-the-pattern-window.sdp.md | 13 + ...n-all-events-are-outside-the-window.sdp.md | 13 + ...s-command-type-from-analysis-result.sdp.md | 13 + ...ull-command-when-no-command-present.sdp.md | 13 + ...and-payload-when-command-is-present.sdp.md | 13 + ...-as-payload-when-no-command-present.sdp.md | 13 + ...-when-confidence-is-below-threshold.sdp.md | 13 + ...val-when-confidence-meets-threshold.sdp.md | 13 + ...al-when-confidence-equals-threshold.sdp.md | 13 + ...approval-when-no-command-is-present.sdp.md | 13 + ...ommand-is-in-requires-approval-list.sdp.md | 13 + ...hen-command-is-in-auto-approve-list.sdp.md | 13 + ...-over-auto-approve-for-same-command.sdp.md | 13 + ...l-command-for-trigger-only-decision.sdp.md | 13 + ...-approval-for-trigger-only-decision.sdp.md | 13 + ...ern-name-in-trigger-decision-reason.sdp.md | 13 + ...nt-count-in-trigger-decision-reason.sdp.md | 13 + ...all-event-i-ds-in-triggering-events.sdp.md | 13 + ...-returns-0-6-confidence-for-1-event.sdp.md | 13 + ...returns-0-7-confidence-for-2-events.sdp.md | 13 + ...returns-0-8-confidence-for-3-events.sdp.md | 13 + .../s-032-caps-at-0-85-for-4-events.sdp.md | 13 + .../s-033-caps-at-0-85-for-10-events.sdp.md | 13 + ...-returns-0-5-for-0-events-edge-case.sdp.md | 13 + ...-object-contains-all-expected-codes.sdp.md | 13 + .../s-002-single-valid-pattern-passes.sdp.md | 13 + ...ple-patterns-with-unique-names-pass.sdp.md | 13 + ...ifferent-window-configurations-pass.sdp.md | 13 + ...attern-with-analyze-function-passes.sdp.md | 13 + .../s-006-empty-array-returns-valid.sdp.md | 13 + ...07-two-patterns-with-same-name-fail.sdp.md | 13 + ...plicate-detected-in-middle-of-array.sdp.md | 13 + ...t-circuits-on-first-duplicate-found.sdp.md | 13 + ...me-fails-with-pattern-name-required.sdp.md | 13 + ...me-fails-with-pattern-name-required.sdp.md | 13 + ...ort-circuits-before-duplicate-check.sdp.md | 13 + ...tern-without-trigger-function-fails.sdp.md | 13 + ...ern-with-non-function-trigger-fails.sdp.md | 13 + ...s-to-registry-pattern-name-required.sdp.md | 13 + ...d-maps-to-registry-trigger-required.sdp.md | 13 + ...-error-codes-map-to-invalid-pattern.sdp.md | 13 + .../s-018-accepts-readonly-array-input.sdp.md | 13 + ...s-correct-discriminated-union-shape.sdp.md | 13 + ...r-codes-contain-all-expected-values.sdp.md | 13 + ...pts-valid-window-with-duration-only.sdp.md | 13 + ...pts-window-with-all-optional-fields.sdp.md | 13 + ...-rejects-window-with-empty-duration.sdp.md | 13 + ...ejects-window-with-missing-duration.sdp.md | 13 + ...indow-with-non-positive-event-limit.sdp.md | 13 + ...ts-window-with-negative-event-limit.sdp.md | 13 + ...window-with-non-positive-min-events.sdp.md | 13 + ...w-with-non-positive-load-batch-size.sdp.md | 13 + ...window-with-non-integer-event-limit.sdp.md | 13 + .../s-011-parses-days-format-correctly.sdp.md | 13 + ...s-012-parses-hours-format-correctly.sdp.md | 13 + ...013-parses-minutes-format-correctly.sdp.md | 13 + .../s-014-handles-uppercase-units.sdp.md | 13 + ...15-returns-null-for-invalid-formats.sdp.md | 13 + ...ims-leading-and-trailing-whitespace.sdp.md | 13 + ...rns-true-for-valid-duration-formats.sdp.md | 13 + ...-false-for-invalid-duration-formats.sdp.md | 13 + ...eturns-invalid-when-name-is-missing.sdp.md | 13 + ...s-invalid-when-name-is-empty-string.sdp.md | 13 + ...nvalid-when-name-is-whitespace-only.sdp.md | 13 + ...rns-invalid-when-trigger-is-missing.sdp.md | 13 + ...alid-when-trigger-is-not-a-function.sdp.md | 13 + ...lid-when-duration-format-is-invalid.sdp.md | 13 + ...urns-invalid-when-duration-is-empty.sdp.md | 13 + ...id-when-event-limit-is-non-positive.sdp.md | 13 + ...nvalid-when-event-limit-is-negative.sdp.md | 13 + ...-when-event-limit-is-not-an-integer.sdp.md | 13 + ...lid-when-min-events-is-non-positive.sdp.md | 13 + ...hen-load-batch-size-is-non-positive.sdp.md | 13 + ...eturns-valid-for-minimal-definition.sdp.md | 13 + ...turns-valid-for-complete-definition.sdp.md | 13 + ...-definition-with-all-window-options.sdp.md | 13 + ...4-returns-the-definition-when-valid.sdp.md | 13 + ...5-throws-error-when-name-is-missing.sdp.md | 13 + ...hrows-error-when-trigger-is-missing.sdp.md | 13 + ...rows-error-when-duration-is-invalid.sdp.md | 13 + ...-error-code-in-thrown-error-message.sdp.md | 13 + .../s-039-calculates-boundary-for-days.sdp.md | 13 + ...s-040-calculates-boundary-for-hours.sdp.md | 13 + ...041-calculates-boundary-for-minutes.sdp.md | 13 + ...s-date-now-when-now-is-not-provided.sdp.md | 13 + ...s-error-for-invalid-duration-format.sdp.md | 13 + ...4-includes-events-within-the-window.sdp.md | 13 + ...-excludes-events-outside-the-window.sdp.md | 13 + ...udes-events-exactly-at-the-boundary.sdp.md | 13 + ...s-event-limit-and-takes-most-recent.sdp.md | 13 + ...es-not-limit-when-under-event-limit.sdp.md | 13 + ...ns-empty-array-when-no-events-match.sdp.md | 13 + .../s-050-handles-empty-events-array.sdp.md | 13 + ...-when-events-count-meets-min-events.sdp.md | 13 + ...hen-events-count-exceeds-min-events.sdp.md | 13 + ...en-events-count-is-below-min-events.sdp.md | 13 + .../s-054-defaults-to-min-events-of-1.sdp.md | 13 + ...y-events-when-min-events-is-default.sdp.md | 13 + ...ue-when-event-count-meets-threshold.sdp.md | 13 + ...-when-event-count-exceeds-threshold.sdp.md | 13 + ...when-event-count-is-below-threshold.sdp.md | 13 + ...rns-true-when-event-type-is-present.sdp.md | 13 + ...alse-when-event-type-is-not-present.sdp.md | 13 + ...-of-multiple-event-types-is-present.sdp.md | 13 + .../s-062-respects-min-count-parameter.sdp.md | 13 + ...-returns-true-when-min-count-is-met.sdp.md | 13 + ...ue-when-minimum-streams-are-present.sdp.md | 13 + ...ns-false-when-below-minimum-streams.sdp.md | 13 + ...066-counts-unique-streams-correctly.sdp.md | 13 + ...eturns-true-when-all-triggers-match.sdp.md | 13 + ...lse-when-any-trigger-does-not-match.sdp.md | 13 + ...eturns-false-when-no-triggers-match.sdp.md | 13 + ...turns-true-for-empty-triggers-array.sdp.md | 13 + ...s-071-passes-events-to-each-trigger.sdp.md | 13 + ...turns-true-when-any-trigger-matches.sdp.md | 13 + ...eturns-true-when-all-triggers-match.sdp.md | 13 + ...eturns-false-when-no-triggers-match.sdp.md | 13 + ...urns-false-for-empty-triggers-array.sdp.md | 13 + ...s-076-short-circuits-on-first-match.sdp.md | 13 + ...threshold-with-event-type-using-all.sdp.md | 13 + ...vent-type-missing-despite-count-met.sdp.md | 13 + ...with-count-thresholds-alert-present.sdp.md | 13 + ...nt-thresholds-neither-condition-met.sdp.md | 13 + ...des-are-present-with-correct-values.sdp.md | 13 + ...-codes-object-has-exactly-8-entries.sdp.md | 13 + .../s-003-accepts-valid-cost-budget.sdp.md | 13 + ...-004-rejects-budget-with-zero-daily.sdp.md | 13 + ...-rejects-budget-with-negative-daily.sdp.md | 13 + ...budget-with-alert-threshold-above-1.sdp.md | 13 + ...udget-with-negative-alert-threshold.sdp.md | 13 + ...cepts-alert-threshold-at-boundary-0.sdp.md | 13 + ...cepts-alert-threshold-at-boundary-1.sdp.md | 13 + ...id-config-with-required-fields-only.sdp.md | 13 + ...pts-config-with-all-optional-fields.sdp.md | 13 + ...g-with-zero-max-requests-per-minute.sdp.md | 13 + ...th-negative-max-requests-per-minute.sdp.md | 13 + ...non-integer-max-requests-per-minute.sdp.md | 13 + ...cts-config-with-zero-max-concurrent.sdp.md | 13 + ...ejects-config-with-zero-queue-depth.sdp.md | 13 + ...ax-requests-per-minute-is-undefined.sdp.md | 13 + ...hen-max-requests-per-minute-is-zero.sdp.md | 13 + ...max-requests-per-minute-is-negative.sdp.md | 13 + ...quests-per-minute-is-not-an-integer.sdp.md | 13 + ...ive-integer-max-requests-per-minute.sdp.md | 13 + ...invalid-when-max-concurrent-is-zero.sdp.md | 13 + ...lid-when-max-concurrent-is-negative.sdp.md | 13 + ...en-max-concurrent-is-not-an-integer.sdp.md | 13 + ...id-when-max-concurrent-is-undefined.sdp.md | 13 + ...ns-invalid-when-queue-depth-is-zero.sdp.md | 13 + ...nvalid-when-queue-depth-is-negative.sdp.md | 13 + ...-when-queue-depth-is-not-an-integer.sdp.md | 13 + ...alid-when-cost-budget-daily-is-zero.sdp.md | 13 + ...-when-cost-budget-daily-is-negative.sdp.md | 13 + ...t-budget-alert-threshold-is-below-0.sdp.md | 13 + ...t-budget-alert-threshold-is-above-1.sdp.md | 13 + ...rns-valid-when-cost-budget-is-valid.sdp.md | 13 + ...rns-valid-for-complete-valid-config.sdp.md | 13 + ...ult-config-has-correct-field-values.sdp.md | 13 + ...36-default-config-passes-validation.sdp.md | 13 + ...-config-with-specified-daily-budget.sdp.md | 13 + ...-alert-threshold-when-not-specified.sdp.md | 13 + ...-039-uses-specified-alert-threshold.sdp.md | 13 + ...s-specified-max-requests-per-minute.sdp.md | 13 + ...uests-per-minute-when-not-specified.sdp.md | 13 + .../s-042-includes-all-optional-fields.sdp.md | 13 + ...creates-error-with-code-and-message.sdp.md | 13 + ...t-optional-fields-when-not-provided.sdp.md | 13 + ...r-with-retry-after-ms-when-provided.sdp.md | 13 + ...es-error-with-context-when-provided.sdp.md | 13 + ...ith-both-retry-after-ms-and-context.sdp.md | 13 + ...rns-true-for-valid-rate-limit-error.sdp.md | 13 + ...urns-true-for-all-known-error-codes.sdp.md | 13 + ...-returns-false-for-non-error-values.sdp.md | 13 + .../s-051-retryable-error-codes.sdp.md | 13 + ...rns-false-for-non-rate-limit-errors.sdp.md | 13 + .../s-053-permanent-error-codes.sdp.md | 13 + ...rns-false-for-non-rate-limit-errors.sdp.md | 13 + ...attern-with-math-random-mocked-to-0.sdp.md | 13 + ...aps-at-default-max-delay-of-60000ms.sdp.md | 13 + .../s-057-caps-at-custom-max-delay.sdp.md | 13 + ...oes-not-cap-when-delay-is-below-max.sdp.md | 13 + ...s-059-adds-jitter-up-to-25-of-delay.sdp.md | 13 + ...s-max-jitter-of-25-when-random-is-1.sdp.md | 13 + ...1-uses-default-base-delay-of-1000ms.sdp.md | 13 + ...2-uses-default-max-delay-of-60000ms.sdp.md | 13 + .../s-063-returns-floored-integer.sdp.md | 13 + ...urns-true-when-total-exceeds-budget.sdp.md | 13 + ...ns-false-when-total-is-under-budget.sdp.md | 13 + ...se-when-total-equals-budget-exactly.sdp.md | 13 + ...urrent-spend-already-exceeds-budget.sdp.md | 13 + ...les-zero-current-spend-under-budget.sdp.md | 13 + ...dles-zero-current-spend-over-budget.sdp.md | 13 + ...s-small-decimal-values-under-budget.sdp.md | 13 + ...es-small-decimal-values-over-budget.sdp.md | 13 + ...-spend-reaches-threshold-percentage.sdp.md | 13 + ...s-true-when-spend-exceeds-threshold.sdp.md | 13 + ...false-when-spend-is-below-threshold.sdp.md | 13 + ...handles-threshold-of-0-always-alert.sdp.md | 13 + ...es-threshold-of-1-below-full-budget.sdp.md | 13 + ...ndles-threshold-of-1-at-full-budget.sdp.md | 13 + ...ns-defaults-when-no-config-provided.sdp.md | 13 + ...ults-when-undefined-config-provided.sdp.md | 13 + ...es-provided-max-requests-per-minute.sdp.md | 13 + ...lt-max-concurrent-when-not-provided.sdp.md | 13 + .../s-082-uses-provided-max-concurrent.sdp.md | 13 + ...fault-queue-depth-when-not-provided.sdp.md | 13 + .../s-084-uses-provided-queue-depth.sdp.md | 13 + ...preserves-cost-budget-when-provided.sdp.md | 13 + ...clude-cost-budget-when-not-provided.sdp.md | 13 + ...xt-and-parses-a-valid-json-response.sdp.md | 13 + ...les-non-json-response-with-defaults.sdp.md | 13 + ...3-handles-malformed-json-gracefully.sdp.md | 13 + ...-004-re-throws-generate-text-errors.sdp.md | 13 + .../s-005-tracks-timing-in-llm-context.sdp.md | 13 + ...read-id-in-llm-context-when-present.sdp.md | 13 + ...d-from-llm-context-when-not-present.sdp.md | 13 + ...dles-missing-usage-with-zero-tokens.sdp.md | 13 + ...and-parses-json-response-for-reason.sdp.md | 13 + ...-raw-text-when-response-is-not-json.sdp.md | 13 + ...ws-generate-text-errors-from-reason.sdp.md | 13 + ...logs-reasoning-start-and-completion.sdp.md | 13 + ...ommands-sequentially-in-atomic-mode.sdp.md | 13 + ...-and-skips-remaining-in-atomic-mode.sdp.md | 13 + ...s-aggregate-commands-in-atomic-mode.sdp.md | 13 + ...hared-correlation-id-in-atomic-mode.sdp.md | 13 + ...relation-id-override-in-atomic-mode.sdp.md | 13 + ...-even-with-failures-in-partial-mode.sdp.md | 13 + ...ll-commands-succeed-in-partial-mode.sdp.md | 13 + ...-aggregate-commands-in-partial-mode.sdp.md | 13 + ...cts-max-concurrency-in-partial-mode.sdp.md | 13 + ...e-on-error-is-false-in-partial-mode.sdp.md | 13 + ...1-tracks-individual-command-results.sdp.md | 13 + ...-includes-duration-for-each-command.sdp.md | 13 + ...s-error-message-for-failed-commands.sdp.md | 13 + ...lculates-correct-summary-statistics.sdp.md | 13 + ...15-handles-executor-throwing-errors.sdp.md | 13 + ...-016-handles-empty-batch-gracefully.sdp.md | 13 + ...-max-command-count-before-execution.sdp.md | 13 + ...-batch-exactly-at-max-command-count.sdp.md | 13 + ...xactly-at-default-max-command-count.sdp.md | 13 + ...-max-command-count-before-execution.sdp.md | 13 + ...commands-from-wrong-bounded-context.sdp.md | 13 + ...batch-executor-instance-via-factory.sdp.md | 13 + .../s-001-rejects-empty-batch.sdp.md | 13 + ...2-accepts-batch-exactly-at-max-size.sdp.md | 13 + ...03-rejects-batch-exceeding-max-size.sdp.md | 13 + ...s-batch-exactly-at-default-max-size.sdp.md | 13 + ...ts-batch-exceeding-default-max-size.sdp.md | 13 + ...pts-valid-commands-without-registry.sdp.md | 13 + ...mands-in-different-bounded-contexts.sdp.md | 13 + .../s-008-requires-aggregate-id-option.sdp.md | 13 + ...-requires-aggregate-id-field-option.sdp.md | 13 + ...-all-commands-target-same-aggregate.sdp.md | 13 + ...ommands-target-different-aggregates.sdp.md | 13 + ...ggregate-with-explicit-aggregate-id.sdp.md | 13 + ...om-first-command-when-not-specified.sdp.md | 13 + ...arget-different-aggregate-instances.sdp.md | 13 + ...ds-target-different-aggregate-types.sdp.md | 13 + ...n-aggregate-commands-in-atomic-mode.sdp.md | 13 + ...s-017-rejects-unregistered-commands.sdp.md | 13 + ...-matching-specified-bounded-context.sdp.md | 13 + ...commands-from-wrong-bounded-context.sdp.md | 13 + ...s-020-extracts-id-from-command-args.sdp.md | 13 + ...returns-undefined-for-missing-field.sdp.md | 13 + ...urns-undefined-for-non-string-value.sdp.md | 13 + ...023-groups-commands-by-aggregate-id.sdp.md | 13 + ...4-uses-placeholder-for-missing-i-ds.sdp.md | 13 + ...t-current-version-is-returned-as-is.sdp.md | 13 + ...002-state-is-migrated-from-v1-to-v2.sdp.md | 13 + ...003-state-is-migrated-from-v1-to-v3.sdp.md | 13 + ...ate-version-is-treated-as-version-0.sdp.md | 13 + ...ull-input-throws-cms-upcaster-error.sdp.md | 13 + ...ned-input-throws-cms-upcaster-error.sdp.md | 13 + ...ation-chain-throws-at-creation-time.sdp.md | 13 + ...e-version-throws-cms-upcaster-error.sdp.md | 13 + ...function-error-propagates-mid-chain.sdp.md | 13 + ...migration-function-error-propagates.sdp.md | 13 + ...returned-as-is-via-upcast-if-needed.sdp.md | 13 + ...te-is-migrated-via-upcast-if-needed.sdp.md | 13 + ...lidation-passes-when-state-is-valid.sdp.md | 13 + ...idation-fails-when-state-is-invalid.sdp.md | 13 + ...upcaster-error-via-upcast-if-needed.sdp.md | 13 + .../s-016-error-has-correct-name.sdp.md | 13 + .../s-017-error-has-correct-code.sdp.md | 13 + .../s-018-error-has-correct-message.sdp.md | 13 + ...-error-stores-context-when-provided.sdp.md | 13 + ...undefined-context-when-not-provided.sdp.md | 13 + .../s-021-error-is-instanceof-error.sdp.md | 13 + ...on-passes-for-current-version-state.sdp.md | 13 + ...ersion-state-with-empty-description.sdp.md | 13 + ...tion-passes-after-upcasting-from-v1.sdp.md | 13 + ...er-upcasting-produces-invalid-state.sdp.md | 13 + ...s-026-static-default-value-is-added.sdp.md | 13 + ...027-computed-default-value-is-added.sdp.md | 13 + ...028-computed-default-accesses-state.sdp.md | 13 + ...s-029-existing-fields-are-preserved.sdp.md | 13 + .../s-030-field-is-renamed.sdp.md | 13 + ...-fields-are-preserved-when-renaming.sdp.md | 13 + ...d-value-in-renamed-field-is-handled.sdp.md | 13 + .../s-033-specified-field-is-removed.sdp.md | 13 + ...-fields-are-preserved-when-removing.sdp.md | 13 + ...xistent-field-is-handled-gracefully.sdp.md | 13 + ...-migration-works-in-migration-chain.sdp.md | 13 + ...tiple-helper-migrations-are-chained.sdp.md | 13 + ...y-four-entries-in-the-correct-order.sdp.md | 13 + ...hema-accepts-valid-category-strings.sdp.md | 13 + ...ema-rejects-invalid-category-values.sdp.md | 13 + ...fault-command-category-is-aggregate.sdp.md | 13 + ...-guard-accepts-all-valid-categories.sdp.md | 13 + ...6-type-guard-rejects-invalid-values.sdp.md | 13 + ...d-categories-are-returned-unchanged.sdp.md | 13 + ...valid-values-normalize-to-aggregate.sdp.md | 13 + ...fication-of-categories-as-aggregate.sdp.md | 13 + ...sification-of-categories-as-process.sdp.md | 13 + ...ssification-of-categories-as-system.sdp.md | 13 + ...assification-of-categories-as-batch.sdp.md | 13 + ...ema-accepts-valid-aggregate-targets.sdp.md | 13 + ...a-rejects-invalid-aggregate-targets.sdp.md | 13 + ...ly-four-entries-with-correct-values.sdp.md | 13 + ...-members-have-correct-string-values.sdp.md | 13 + ...uard-accepts-valid-error-categories.sdp.md | 13 + ...4-type-guard-rejects-invalid-values.sdp.md | 13 + ...rror-is-created-with-all-properties.sdp.md | 13 + ...mmand-error-is-an-instance-of-error.sdp.md | 13 + ...ns-existing-command-error-unchanged.sdp.md | 13 + ...nd-error-from-wraps-a-regular-error.sdp.md | 13 + ...and-error-from-wraps-a-string-value.sdp.md | 13 + ...d-error-from-wraps-an-unknown-value.sdp.md | 13 + ...-json-serializes-error-with-context.sdp.md | 13 + ...2-to-json-handles-undefined-context.sdp.md | 13 + .../s-013-factory-creates-domain-error.sdp.md | 13 + ...14-factory-creates-validation-error.sdp.md | 13 + ...5-factory-creates-concurrency-error.sdp.md | 13 + ...actory-creates-infrastructure-error.sdp.md | 13 + ...017-factory-creates-not-found-error.sdp.md | 13 + ...actory-creates-already-exists-error.sdp.md | 13 + ...factory-creates-invalid-state-error.sdp.md | 13 + ...-factory-creates-unauthorized-error.sdp.md | 13 + ...-factory-creates-rate-limited-error.sdp.md | 13 + ...-returns-true-for-matching-category.sdp.md | 13 + ...rns-false-for-non-matching-category.sdp.md | 13 + ...returns-false-for-non-command-error.sdp.md | 13 + ...ble-errors-are-identified-correctly.sdp.md | 13 + ...n-recoverable-error-gets-delay-of-1.sdp.md | 13 + ...ency-error-delays-escalate-then-cap.sdp.md | 13 + ...ture-error-delays-escalate-then-cap.sdp.md | 13 + ...ror-gets-infrastructure-style-delay.sdp.md | 13 + ...category-and-preserves-command-type.sdp.md | 13 + ...target-is-present-on-parsed-command.sdp.md | 13 + ...et-is-undefined-when-not-configured.sdp.md | 13 + ...a-rejects-a-mismatched-command-type.sdp.md | 13 + ...ts-commands-missing-required-fields.sdp.md | 13 + ...category-and-preserves-command-type.sdp.md | 13 + ...s-type-is-present-on-parsed-command.sdp.md | 13 + ...pe-is-undefined-when-not-configured.sdp.md | 13 + ...category-and-preserves-command-type.sdp.md | 13 + ...uires-idempotency-defaults-to-false.sdp.md | 13 + ...ires-idempotency-can-be-set-to-true.sdp.md | 13 + ...a-assigns-batch-category-with-items.sdp.md | 13 + ...config-is-present-on-parsed-command.sdp.md | 13 + ...ms-that-fail-item-schema-validation.sdp.md | 13 + ...s-015-empty-items-array-is-accepted.sdp.md | 13 + ...-extracted-from-each-factory-schema.sdp.md | 13 + ...on-command-schemas-return-undefined.sdp.md | 13 + ...ixes-includes-all-standard-prefixes.sdp.md | 13 + ...accepts-valid-create-prefixed-names.sdp.md | 13 + ...rn-accepts-valid-add-prefixed-names.sdp.md | 13 + ...s-update-change-and-modify-prefixes.sdp.md | 13 + ...05-valid-command-names-are-accepted.sdp.md | 13 + ...-invalid-command-names-are-rejected.sdp.md | 13 + ...eturn-matched-prefix-and-valid-flag.sdp.md | 13 + ...turns-suggestions-and-error-message.sdp.md | 13 + ...-name-receives-corrected-suggestion.sdp.md | 13 + ...uggestions-are-limited-to-at-most-3.sdp.md | 13 + ...011-known-names-return-their-prefix.sdp.md | 13 + ...lid-or-empty-names-return-undefined.sdp.md | 13 + ...s-produce-correct-pascal-case-names.sdp.md | 13 + ...ion-id-and-generates-correlation-id.sdp.md | 13 + ...-chain-uses-provided-correlation-id.sdp.md | 13 + .../s-003-chain-uses-provided-user-id.sdp.md | 13 + .../s-004-chain-uses-provided-context.sdp.md | 13 + ...05-chain-uses-provided-initiated-at.sdp.md | 13 + ...-chain-accepts-all-options-together.sdp.md | 13 + ...d-and-uses-event-id-as-causation-id.sdp.md | 13 + ...-chain-inherits-user-id-from-source.sdp.md | 13 + ...-chain-inherits-context-from-source.sdp.md | 13 + ...n-merges-source-and-option-contexts.sdp.md | 13 + ...akes-precedence-over-source-context.sdp.md | 13 + ...served-when-options-have-no-context.sdp.md | 13 + ...ext-used-when-source-has-no-context.sdp.md | 13 + ...her-source-nor-options-have-context.sdp.md | 13 + ...mpty-contexts-merge-to-empty-object.sdp.md | 13 + ...erved-when-options-context-is-empty.sdp.md | 13 + ...t-used-when-source-context-is-empty.sdp.md | 13 + ...ived-chain-uses-provided-command-id.sdp.md | 13 + ...ed-chain-uses-provided-initiated-at.sdp.md | 13 + ...cts-correlation-id-and-causation-id.sdp.md | 13 + ...s-021-includes-user-id-when-present.sdp.md | 13 + ...022-excludes-user-id-when-undefined.sdp.md | 13 + .../s-023-merges-additional-metadata.sdp.md | 13 + ...itiated-at-or-command-id-from-chain.sdp.md | 13 + ...for-chains-with-same-correlation-id.sdp.md | 13 + ...ains-with-different-correlation-ids.sdp.md | 13 + ...sation-id-matches-parent-command-id.sdp.md | 13 + ...n-child-causation-id-does-not-match.sdp.md | 13 + ...hain-where-command-is-its-own-cause.sdp.md | 13 + ...-user-command-through-saga-reaction.sdp.md | 13 + ...s-correlation-id-across-three-links.sdp.md | 13 + .../s-001-record-a-new-correlation.sdp.md | 13 + ...event-i-ds-for-existing-correlation.sdp.md | 13 + ...eturn-null-for-non-existent-command.sdp.md | 13 + ...rn-correlation-for-existing-command.sdp.md | 13 + .../s-005-filter-by-bounded-context.sdp.md | 13 + ...row-when-bounded-context-is-missing.sdp.md | 13 + .../s-007-respect-limit-parameter.sdp.md | 13 + ...return-true-for-command-with-events.sdp.md | 13 + ...turn-false-for-non-existent-command.sdp.md | 13 + ...rn-event-count-for-existing-command.sdp.md | 13 + ...1-return-0-for-non-existent-command.sdp.md | 13 + ...eate-a-correlation-service-instance.sdp.md | 13 + ...-execution-without-scope-operations.sdp.md | 13 + ...hema-version-and-category-in-events.sdp.md | 13 + ...ed-decider-result-returns-rejection.sdp.md | 13 + ...r-result-returns-failure-with-event.sdp.md | 13 + ...ected-version-matches-scope-version.sdp.md | 13 + ...heck-detects-stale-expected-version.sdp.md | 13 + ...e-not-found-when-expected-version-0.sdp.md | 13 + ...s-new-scope-with-expected-version-0.sdp.md | 13 + ...mit-detects-concurrent-modification.sdp.md | 13 + ...c-commit-tracks-updated-stream-i-ds.sdp.md | 13 + ...invalid-scope-key-returns-rejection.sdp.md | 13 + ...-missing-entities-returns-rejection.sdp.md | 13 + ...ate-valid-scope-key-from-components.sdp.md | 13 + ...in-colons-for-composite-identifiers.sdp.md | 13 + ...e-scope-key-throws-on-invalid-input.sdp.md | 13 + ...y-returns-scope-key-for-valid-input.sdp.md | 13 + ...-key-returns-null-for-invalid-input.sdp.md | 13 + ...rse-valid-scope-key-into-components.sdp.md | 13 + ...omposite-scope-id-containing-colons.sdp.md | 13 + ...key-returns-null-for-invalid-format.sdp.md | 13 + ...ey-returns-null-for-valid-scope-key.sdp.md | 13 + ...pe-key-empty-error-for-empty-string.sdp.md | 13 + ...rns-error-for-missing-tenant-prefix.sdp.md | 13 + ...turns-error-for-malformed-scope-key.sdp.md | 13 + ...s-013-is-valid-scope-key-type-guard.sdp.md | 13 + ...d-scope-key-throws-on-invalid-input.sdp.md | 13 + ...d-scope-key-succeeds-on-valid-input.sdp.md | 13 + ...ope-tenant-checks-tenant-membership.sdp.md | 13 + ...id-returns-tenant-id-from-scope-key.sdp.md | 13 + ...e-returns-scope-type-from-scope-key.sdp.md | 13 + ...-id-returns-scope-id-from-scope-key.sdp.md | 13 + ...s-load-state-with-correct-entity-id.sdp.md | 13 + ...ith-state-command-input-and-context.sdp.md | 13 + ...pply-update-with-correct-parameters.sdp.md | 13 + ...ccess-result-with-correct-structure.sdp.md | 13 + ...ion-correctly-from-existing-version.sdp.md | 13 + ...result-without-calling-apply-update.sdp.md | 13 + ...d-result-includes-rejection-details.sdp.md | 13 + ...result-without-calling-apply-update.sdp.md | 13 + ...-includes-failure-event-and-details.sdp.md | 13 + ...andler-propagates-load-state-errors.sdp.md | 13 + ...-custom-error-handler-when-provided.sdp.md | 13 + ...ustom-error-handler-returns-nothing.sdp.md | 13 + ...s-013-handler-logs-debug-on-success.sdp.md | 13 + ...014-handler-logs-debug-on-rejection.sdp.md | 13 + ...015-handler-logs-error-on-exception.sdp.md | 13 + ...ates-unique-event-id-per-invocation.sdp.md | 13 + ...es-schema-version-in-event-metadata.sdp.md | 13 + ...ds-correct-stream-id-from-entity-id.sdp.md | 13 + ...y-load-state-with-correct-entity-id.sdp.md | 13 + ...ll-state-when-entity-does-not-exist.sdp.md | 13 + ...ndler-calls-insert-for-new-entities.sdp.md | 13 + ...ess-with-version-1-for-new-entities.sdp.md | 13 + ...ect-event-metadata-for-new-entities.sdp.md | 13 + ...h-existing-state-when-entity-exists.sdp.md | 13 + ...ejection-when-entity-already-exists.sdp.md | 13 + ...l-insert-when-entity-already-exists.sdp.md | 13 + ...th-version-0-for-non-existent-entit.sdp.md | 13 + ...not-call-insert-on-business-failure.sdp.md | 13 + ...er-propagates-try-load-state-errors.sdp.md | 13 + ...ty-handler-propagates-insert-errors.sdp.md | 13 + ...-custom-error-handler-when-provided.sdp.md | 13 + ...gs-debug-on-entity-creation-success.sdp.md | 13 + ...ity-handler-logs-debug-on-rejection.sdp.md | 13 + ...s-unique-event-id-for-each-creation.sdp.md | 13 + ...includes-schema-version-in-metadata.sdp.md | 13 + ...te-rejection-short-circuits-handler.sdp.md | 13 + ...urning-undefined-allows-normal-flow.sdp.md | 13 + ...validate-receives-correct-arguments.sdp.md | 13 + ...-039-pre-validate-failure-is-logged.sdp.md | 13 + ...lly-without-pre-validate-configured.sdp.md | 13 + ...s-001-dcb-succeeds-on-first-attempt.sdp.md | 13 + ...ted-result-passes-through-unchanged.sdp.md | 13 + ...triggers-retry-with-updated-version.sdp.md | 13 + ...x-retries-exceeded-returns-rejected.sdp.md | 13 + ...e-aware-scheduling-key-is-preserved.sdp.md | 13 + ...retry-calls-on-complete-with-result.sdp.md | 13 + ...version-advances-during-retry-delay.sdp.md | 13 + ...008-backoff-increases-exponentially.sdp.md | 13 + .../s-009-backoff-is-capped-at-maximum.sdp.md | 13 + ...ndomness-to-prevent-thundering-herd.sdp.md | 13 + ...-injectable-for-deterministic-tests.sdp.md | 13 + ...pter-plugs-into-existing-middleware.sdp.md | 13 + ...-command-returns-standard-rejection.sdp.md | 13 + ...03-dcb-retry-uses-separate-workpool.sdp.md | 13 + ...mutation-receives-correct-arguments.sdp.md | 13 + ...th-on-complete-callback-integration.sdp.md | 13 + ...t-retry-dcb-mutations-clarification.sdp.md | 13 + ...te-limiter-component-creates-tables.sdp.md | 13 + ...-008-multiple-workpools-can-coexist.sdp.md | 13 + ...er-allows-request-within-rate-limit.sdp.md | 13 + ...ejects-request-exceeding-rate-limit.sdp.md | 13 + ...ferent-keys-have-independent-limits.sdp.md | 13 + ...mmand-types-have-independent-limits.sdp.md | 13 + .../s-001-create-basic-fat-event.sdp.md | 13 + ...te-fat-event-with-schema-definition.sdp.md | 13 + .../s-003-schema-validation-failure.sdp.md | 13 + ...reate-fat-event-with-correlation-id.sdp.md | 13 + .../s-005-embed-selected-entity-fields.sdp.md | 13 + .../s-006-embed-all-fields.sdp.md | 13 + .../s-007-embed-non-existent-field.sdp.md | 13 + .../s-008-embed-collection-of-items.sdp.md | 13 + ...bed-collection-with-field-selection.sdp.md | 13 + .../s-010-embed-empty-collection.sdp.md | 13 + ...vent-type-for-integration-scenarios.sdp.md | 13 + ...002-inventory-updated-as-thin-event.sdp.md | 13 + .../s-003-order-submitted-as-fat-event.sdp.md | 13 + ...004-published-language-event-is-fat.sdp.md | 13 + .../s-005-category-suggests-event-type.sdp.md | 13 + ...001-mark-single-field-for-shredding.sdp.md | 13 + ...-mark-multiple-fields-for-shredding.sdp.md | 13 + ...s-003-non-pii-fields-are-not-marked.sdp.md | 13 + ...find-all-shreddable-fields-in-event.sdp.md | 13 + ...-no-shreddable-fields-returns-empty.sdp.md | 13 + ...006-mark-fields-in-collection-items.sdp.md | 13 + .../s-007-shred-all-marked-fields.sdp.md | 13 + ...008-non-marked-fields-are-preserved.sdp.md | 13 + ...009-shred-event-returns-audit-trail.sdp.md | 13 + ...-if-event-has-any-shreddable-fields.sdp.md | 13 + ...eck-event-without-shreddable-fields.sdp.md | 13 + .../s-012-count-shreddable-fields.sdp.md | 13 + .../s-013-cannot-shred-required-fields.sdp.md | 13 + ...ping-shred-and-required-fields-work.sdp.md | 13 + ...a-version-is-included-automatically.sdp.md | 13 + ...s-002-custom-schema-version-is-used.sdp.md | 13 + ...003-valid-payload-passes-validation.sdp.md | 13 + ...ing-required-field-fails-validation.sdp.md | 13 + ...5-wrong-field-type-fails-validation.sdp.md | 13 + ...s-006-migrate-v1-event-to-v2-format.sdp.md | 13 + ...igration-needed-for-current-version.sdp.md | 13 + ...nown-source-version-fails-migration.sdp.md | 13 + ...pare-older-version-to-newer-version.sdp.md | 13 + ...pare-newer-version-to-older-version.sdp.md | 13 + .../s-011-compare-equal-versions.sdp.md | 13 + ...mpare-versions-with-different-minor.sdp.md | 13 + ...3-invalid-semver-format-is-rejected.sdp.md | 13 + ...-negative-major-version-is-rejected.sdp.md | 13 + ...-negative-minor-version-is-rejected.sdp.md | 13 + ...nt-needs-migration-to-newer-version.sdp.md | 13 + ...not-need-migration-for-same-version.sdp.md | 13 + ...not-need-migration-for-older-target.sdp.md | 13 + ...ge-is-50-when-half-events-processed.sdp.md | 13 + ...ge-is-100-when-all-events-processed.sdp.md | 13 + ...ge-is-100-when-total-events-is-zero.sdp.md | 13 + ...age-has-one-decimal-place-precision.sdp.md | 13 + ...ning-time-estimated-from-throughput.sdp.md | 13 + ...-undefined-when-no-events-processed.sdp.md | 13 + ...undefined-when-elapsed-time-is-zero.sdp.md | 13 + ...e-is-zero-when-all-events-processed.sdp.md | 13 + ...lculate-progress-for-running-replay.sdp.md | 13 + ...ulate-progress-for-completed-replay.sdp.md | 13 + ...ss-includes-error-for-failed-replay.sdp.md | 13 + .../s-012-running-status-is-active.sdp.md | 13 + .../s-013-paused-status-is-active.sdp.md | 13 + ...-014-completed-status-is-not-active.sdp.md | 13 + .../s-015-failed-status-is-not-active.sdp.md | 13 + .../s-016-completed-status-is-terminal.sdp.md | 13 + .../s-017-failed-status-is-terminal.sdp.md | 13 + .../s-018-cancelled-status-is-terminal.sdp.md | 13 + ...-019-running-status-is-not-terminal.sdp.md | 13 + ...s-020-paused-status-is-not-terminal.sdp.md | 13 + ...tition-key-generates-correct-format.sdp.md | 13 + ...on-key-handles-various-stream-types.sdp.md | 13 + ...d-event-enqueues-action-to-workpool.sdp.md | 13 + ...event-returns-work-id-from-workpool.sdp.md | 13 + ...vent-passes-on-complete-to-workpool.sdp.md | 13 + ...includes-idempotency-key-in-context.sdp.md | 13 + ...d-action-handler-returns-a-function.sdp.md | 13 + ...ler-invokes-idempotent-append-event.sdp.md | 13 + ...y-format-is-event-id-target-context.sdp.md | 13 + ...events-get-different-partition-keys.sdp.md | 13 + ...es-tracking-records-for-each-target.sdp.md | 13 + ...ueues-delivery-actions-via-workpool.sdp.md | 13 + ...ns-publication-i-ds-for-each-target.sdp.md | 13 + ...-passed-through-to-tracking-records.sdp.md | 13 + ...-status-returns-all-target-contexts.sdp.md | 13 + ...turns-empty-array-for-unknown-event.sdp.md | 13 + ...ication-re-enqueues-delivery-action.sdp.md | 13 + ...s-not-found-for-unknown-publication.sdp.md | 13 + ...delivered-for-delivered-publication.sdp.md | 13 + ...-increments-attempt-count-correctly.sdp.md | 13 + ...ates-status-to-delivered-on-success.sdp.md | 13 + ...increments-attempt-count-on-failure.sdp.md | 13 + ...eates-dead-letter-after-max-retries.sdp.md | 13 + ...nd-type-entity-id-command-id-format.sdp.md | 13 + ...y-uses-action-type-entity-id-format.sdp.md | 13 + ...-uses-saga-type-saga-id-step-format.sdp.md | 13 + ...b-type-schedule-id-timestamp-format.sdp.md | 13 + ...ppend-with-idempotency-key-succeeds.sdp.md | 13 + ...icate-append-returns-existing-event.sdp.md | 13 + ...-with-different-payload-is-rejected.sdp.md | 13 + ...potency-keys-create-separate-events.sdp.md | 13 + ...licate-on-recheck-returns-duplicate.sdp.md | 13 + ...-010-true-occ-conflict-throws-error.sdp.md | 13 + ...intent-key-generates-correct-format.sdp.md | 13 + ...key-handles-various-operation-types.sdp.md | 13 + ...ates-intent-event-with-correct-type.sdp.md | 13 + ...cord-intent-schedules-timeout-check.sdp.md | 13 + ...ent-returns-intent-key-and-event-id.sdp.md | 13 + ...rd-completion-creates-success-event.sdp.md | 13 + ...on-creates-failure-event-with-error.sdp.md | 13 + ...ompletion-creates-abandonment-event.sdp.md | 13 + ...ady-resolved-when-completion-exists.sdp.md | 13 + ...ates-abandonment-when-no-completion.sdp.md | 13 + ...-check-intent-timeout-is-idempotent.sdp.md | 13 + ...-returns-intents-without-completion.sdp.md | 13 + ...d-intents-filters-by-operation-type.sdp.md | 13 + ...handler-returns-a-callable-function.sdp.md | 13 + ...tracts-idempotency-key-from-context.sdp.md | 13 + ...completed-event-from-success-result.sdp.md | 13 + ...nt-failed-event-from-failure-result.sdp.md | 13 + ...-idempotent-append-event-internally.sdp.md | 13 + ...pletes-without-error-for-duplicates.sdp.md | 13 + ...processing-creates-no-poison-record.sdp.md | 13 + ...rds-attempt-but-does-not-quarantine.sdp.md | 13 + ...comes-quarantined-after-max-retries.sdp.md | 13 + ...arantined-event-is-silently-skipped.sdp.md | 13 + ...ed-when-alert-on-quarantine-is-true.sdp.md | 13 + ...d-when-alert-on-quarantine-is-false.sdp.md | 13 + ...-returns-true-for-quarantined-event.sdp.md | 13 + ...rns-false-for-non-quarantined-event.sdp.md | 13 + ...nt-record-returns-normalized-record.sdp.md | 13 + ...returns-null-for-non-existent-event.sdp.md | 13 + ...tine-event-clears-quarantine-status.sdp.md | 13 + ...returns-not-found-for-missing-event.sdp.md | 13 + ...s-not-quarantined-for-pending-event.sdp.md | 13 + ...-events-returns-quarantined-records.sdp.md | 13 + ...ntined-events-filters-by-projection.sdp.md | 13 + ...stats-returns-aggregated-statistics.sdp.md | 13 + ...reates-bus-with-empty-subscriptions.sdp.md | 13 + ...th-subscriptions-sorted-by-priority.sdp.md | 13 + ...-result-when-no-subscriptions-match.sdp.md | 13 + ...matching-subscriptions-via-workpool.sdp.md | 13 + ...ues-multiple-matching-subscriptions.sdp.md | 13 + ...passes-transformed-args-to-workpool.sdp.md | 13 + ...s-partition-key-in-workpool-context.sdp.md | 13 + ...ion-level-on-complete-when-provided.sdp.md | 13 + ...m-config-when-subscription-has-none.sdp.md | 13 + ...-subscription-nor-config-provides-i.sdp.md | 13 + ...ype-and-false-for-unsubscribed-type.sdp.md | 13 + ...e-when-wildcard-subscription-exists.sdp.md | 13 + ...s-false-when-no-subscriptions-exist.sdp.md | 13 + .../s-014-returns-all-subscriptions.sdp.md | 13 + ...s-empty-array-when-no-subscriptions.sdp.md | 13 + ...riptions-matching-event-type-filter.sdp.md | 13 + ...scriptions-matching-category-filter.sdp.md | 13 + ...-to-subscriptions-in-priority-order.sdp.md | 13 + ...-workpool-errors-when-enqueue-fails.sdp.md | 13 + ...scriptions-if-earlier-enqueue-fails.sdp.md | 13 + ...-subscriptions-match-any-event-type.sdp.md | 13 + ...xt-filter-only-matches-that-context.sdp.md | 13 + ...s-instance-with-empty-subscriptions.sdp.md | 13 + ...s-024-creates-event-bus-with-config.sdp.md | 13 + ...-subscription-with-name-and-handler.sdp.md | 13 + ...02-builder-defaults-to-empty-filter.sdp.md | 13 + ...03-builder-defaults-to-priority-100.sdp.md | 13 + ...defaults-partition-key-to-stream-id.sdp.md | 13 + ...-event-types-sets-event-type-filter.sdp.md | 13 + ...for-categories-sets-category-filter.sdp.md | 13 + ...ontexts-sets-bounded-context-filter.sdp.md | 13 + ...tream-types-sets-stream-type-filter.sdp.md | 13 + ...ning-multiple-filters-composes-them.sdp.md | 13 + ...mplete-sets-the-on-complete-handler.sdp.md | 13 + .../s-011-with-priority-sets-priority.sdp.md | 13 + ...h-transform-sets-custom-transformer.sdp.md | 13 + ...sets-custom-partition-key-extractor.sdp.md | 13 + ...adds-a-subscription-to-the-registry.sdp.md | 13 + .../s-015-add-supports-chaining.sdp.md | 13 + ...rows-on-duplicate-subscription-name.sdp.md | 13 + ...lder-that-adds-to-registry-on-build.sdp.md | 13 + ...ns-returns-configured-subscriptions.sdp.md | 13 + ...duplicate-names-via-subscribe-build.sdp.md | 13 + ...s-throws-on-duplicate-names-via-add.sdp.md | 13 + ...cription-creates-standalone-builder.sdp.md | 13 + ...-022-empty-filter-matches-any-event.sdp.md | 13 + ...ches-when-event-type-is-in-the-list.sdp.md | 13 + ...-when-event-type-is-not-in-the-list.sdp.md | 13 + ...atches-when-category-is-in-the-list.sdp.md | 13 + ...ch-when-category-is-not-in-the-list.sdp.md | 13 + ...when-bounded-context-is-in-the-list.sdp.md | 13 + ...-bounded-context-is-not-in-the-list.sdp.md | 13 + ...hes-when-stream-type-is-in-the-list.sdp.md | 13 + ...when-stream-type-is-not-in-the-list.sdp.md | 13 + ...1-all-filters-matching-returns-true.sdp.md | 13 + ...returns-false-with-combined-filters.sdp.md | 13 + ...returns-false-with-combined-filters.sdp.md | 13 + ...vent-id-with-bounded-context-prefix.sdp.md | 13 + ...02-copies-all-core-fields-correctly.sdp.md | 13 + .../s-003-copies-payload-correctly.sdp.md | 13 + ...ion-id-and-causation-id-in-metadata.sdp.md | 13 + ...-ids-for-different-bounded-contexts.sdp.md | 13 + ...s-complete-new-event-data-structure.sdp.md | 13 + ...ent-id-without-generating-a-new-one.sdp.md | 13 + ...ext-from-event-id-when-not-provided.sdp.md | 13 + ...bounded-context-when-explicitly-set.sdp.md | 13 + ...-context-when-no-underscore-present.sdp.md | 13 + ...rrectly-with-pre-generated-event-id.sdp.md | 13 + ...with-multiple-underscores-correctly.sdp.md | 13 + ...ructure-with-pre-generated-event-id.sdp.md | 13 + ...y-four-entries-in-the-correct-order.sdp.md | 13 + ...hema-accepts-valid-category-strings.sdp.md | 13 + ...ema-rejects-invalid-category-values.sdp.md | 13 + ...04-default-event-category-is-domain.sdp.md | 13 + .../s-005-default-schema-version-is-1.sdp.md | 13 + ...-guard-accepts-all-valid-categories.sdp.md | 13 + ...7-type-guard-rejects-invalid-values.sdp.md | 13 + ...d-categories-are-returned-unchanged.sdp.md | 13 + ...-invalid-values-normalize-to-domain.sdp.md | 13 + ...ive-integers-are-returned-unchanged.sdp.md | 13 + ...s-011-invalid-values-normalize-to-1.sdp.md | 13 + ...-categories-as-external-or-internal.sdp.md | 13 + ...tion-of-categories-as-cross-context.sdp.md | 13 + ...s-accepted-and-fields-are-preserved.sdp.md | 13 + ...issing-required-fields-are-rejected.sdp.md | 13 + ...data-with-only-event-id-is-rejected.sdp.md | 13 + ...-optional-causation-id-is-supported.sdp.md | 13 + ...invalid-version-values-are-rejected.sdp.md | 13 + ...06-zero-global-position-is-accepted.sdp.md | 13 + ...ncludes-category-and-schema-version.sdp.md | 13 + ...efaults-to-domain-when-not-provided.sdp.md | 13 + ...ion-defaults-to-1-when-not-provided.sdp.md | 13 + ...0-all-valid-categories-are-accepted.sdp.md | 13 + ...011-invalid-categories-are-rejected.sdp.md | 13 + ...tching-event-type-and-valid-payload.sdp.md | 13 + ...ejects-events-with-wrong-event-type.sdp.md | 13 + ...chema-validates-payload-constraints.sdp.md | 13 + ...ptional-metadata-field-is-supported.sdp.md | 13 + ...vent-schema-sets-category-to-domain.sdp.md | 13 + ...efaults-to-domain-when-not-in-input.sdp.md | 13 + ...on-defaults-to-1-when-not-in-config.sdp.md | 13 + ...chema-version-in-config-is-enforced.sdp.md | 13 + ...20-wrong-schema-version-is-rejected.sdp.md | 13 + ...schema-sets-category-to-integration.sdp.md | 13 + ...ts-to-integration-when-not-in-input.sdp.md | 13 + ...efaults-to-1-for-integration-events.sdp.md | 13 + ...y-to-trigger-with-entity-id-payload.sdp.md | 13 + ...ger-event-rejects-missing-entity-id.sdp.md | 13 + ...faults-to-trigger-when-not-in-input.sdp.md | 13 + ...m-schema-version-for-trigger-events.sdp.md | 13 + ...s-category-to-fat-with-full-payload.sdp.md | 13 + ...y-defaults-to-fat-when-not-in-input.sdp.md | 13 + ...d-payload-with-valid-positive-value.sdp.md | 13 + ...sted-payload-rejects-negative-value.sdp.md | 13 + ...ustom-schema-version-for-fat-events.sdp.md | 13 + ...nt-schema-accepts-any-payload-shape.sdp.md | 13 + ...main-event-schema-includes-defaults.sdp.md | 13 + ...ent-schema-allows-optional-metadata.sdp.md | 13 + ...t-current-version-is-returned-as-is.sdp.md | 13 + ...002-event-is-migrated-from-v1-to-v2.sdp.md | 13 + ...003-event-is-migrated-from-v1-to-v3.sdp.md | 13 + ...ation-chain-throws-at-creation-time.sdp.md | 13 + ...version-throws-future-version-error.sdp.md | 13 + ...6-validation-passes-after-migration.sdp.md | 13 + ...07-validation-fails-after-migration.sdp.md | 13 + ...stered-and-unregistered-event-types.sdp.md | 13 + ...-returns-all-registered-event-types.sdp.md | 13 + ...nd-registration-overrides-the-first.sdp.md | 13 + ...1-registered-event-type-is-upcasted.sdp.md | 13 + ...stered-event-type-is-returned-as-is.sdp.md | 13 + ...s-013-static-default-value-is-added.sdp.md | 13 + ...value-is-added-from-event-timestamp.sdp.md | 13 + ...015-field-is-renamed-in-the-payload.sdp.md | 13 + ...r-has-correct-name-code-and-message.sdp.md | 13 + ...-error-stores-context-when-provided.sdp.md | 13 + ...undefined-context-when-not-provided.sdp.md | 13 + .../s-019-error-is-instanceof-error.sdp.md | 13 + ...rror-preserves-specific-code-values.sdp.md | 13 + ...-021-error-preserves-custom-message.sdp.md | 13 + ...-created-with-correct-initial-state.sdp.md | 13 + .../s-002-fsm-preserves-the-definition.sdp.md | 13 + ...s-003-valid-transitions-return-true.sdp.md | 13 + ...04-invalid-transitions-return-false.sdp.md | 13 + ...alone-can-transition-function-works.sdp.md | 13 + ...-006-valid-transitions-do-not-throw.sdp.md | 13 + ...nsition-throws-fsm-transition-error.sdp.md | 13 + ...n-error-includes-transition-details.sdp.md | 13 + ...ne-assert-transition-function-works.sdp.md | 13 + ...ns-valid-transitions-for-each-state.sdp.md | 13 + ...ne-valid-transitions-function-works.sdp.md | 13 + ...-012-terminal-states-are-identified.sdp.md | 13 + ...-non-terminal-states-are-identified.sdp.md | 13 + ...andalone-is-terminal-function-works.sdp.md | 13 + .../s-015-valid-states-return-true.sdp.md | 13 + .../s-016-invalid-states-return-false.sdp.md | 13 + ...alone-is-valid-state-function-works.sdp.md | 13 + .../s-018-error-has-correct-properties.sdp.md | 13 + ...-handles-terminal-states-in-message.sdp.md | 13 + ...uccess-result-has-correct-structure.sdp.md | 13 + ...success-result-preserves-typed-data.sdp.md | 13 + ...sult-returns-status-as-literal-type.sdp.md | 13 + ...rejected-result-has-code-and-reason.sdp.md | 13 + ...sult-includes-context-when-provided.sdp.md | 13 + ...ult-omits-context-when-not-provided.sdp.md | 13 + ...sult-returns-status-as-literal-type.sdp.md | 13 + .../s-008-failed-result-has-event-data.sdp.md | 13 + ...udes-expected-version-when-provided.sdp.md | 13 + ...sult-includes-context-when-provided.sdp.md | 13 + ...s-both-expected-version-and-context.sdp.md | 13 + ...tional-properties-when-not-provided.sdp.md | 13 + ...sult-returns-status-as-literal-type.sdp.md | 13 + ...ded-i-ds-preserving-the-input-value.sdp.md | 13 + ...ssignable-to-plain-string-variables.sdp.md | 13 + ...-ds-support-standard-string-methods.sdp.md | 13 + ...uce-correctly-prefixed-branded-i-ds.sdp.md | 13 + ...-produce-valid-uuid-v7-after-prefix.sdp.md | 13 + ...-returns-true-for-non-empty-strings.sdp.md | 13 + ...ring-returns-false-for-empty-string.sdp.md | 13 + ...returns-false-for-non-string-values.sdp.md | 13 + ...string-narrows-type-for-type-script.sdp.md | 13 + ...enerated-command-ids-are-all-unique.sdp.md | 13 + ...ated-correlation-ids-are-all-unique.sdp.md | 13 + ...ated-id-matches-the-expected-format.sdp.md | 13 + ...-002-each-call-produces-a-unique-id.sdp.md | 13 + ...-with-the-provided-context-and-type.sdp.md | 13 + ...s-are-accepted-for-context-and-type.sdp.md | 13 + ...pty-context-or-type-throws-an-error.sdp.md | 13 + ...sallowed-characters-throws-an-error.sdp.md | 13 + ...ype-with-underscore-throws-an-error.sdp.md | 13 + ...ed-id-is-parsed-into-its-components.sdp.md | 13 + ...roduced-by-generate-id-is-parseable.sdp.md | 13 + ...containing-underscores-is-preserved.sdp.md | 13 + ...-fewer-than-three-parts-return-null.sdp.md | 13 + ...h-empty-context-or-type-return-null.sdp.md | 13 + ...ected-format-and-is-unique-per-call.sdp.md | 13 + ...ected-format-and-is-unique-per-call.sdp.md | 13 + ...ormat-and-uses-the-provided-context.sdp.md | 13 + ...-016-event-i-ds-are-unique-per-call.sdp.md | 13 + ...s-017-empty-context-throws-an-error.sdp.md | 13 + ...ected-format-and-is-unique-per-call.sdp.md | 13 + ...uid-portion-has-version-7-indicator.sdp.md | 13 + ...l-i-ds-are-lexicographically-sorted.sdp.md | 13 + ...-001-define-acl-for-payment-gateway.sdp.md | 13 + .../s-002-acl-translates-field-names.sdp.md | 13 + .../s-003-acl-transforms-field-values.sdp.md | 13 + ...4-acl-translates-domain-to-external.sdp.md | 13 + ...und-trip-translation-preserves-data.sdp.md | 13 + ...006-missing-required-external-field.sdp.md | 13 + .../s-007-invalid-external-field-type.sdp.md | 13 + .../s-008-unknown-external-status.sdp.md | 13 + ...ent-gateways-with-different-schemas.sdp.md | 13 + ...er-upstream-downstream-relationship.sdp.md | 13 + ...ster-customer-supplier-relationship.sdp.md | 13 + ...03-register-conformist-relationship.sdp.md | 13 + .../s-004-register-acl-relationship.sdp.md | 13 + ...5-register-partnership-relationship.sdp.md | 13 + ...register-shared-kernel-relationship.sdp.md | 13 + ...ster-open-host-service-relationship.sdp.md | 13 + ...08-query-all-relationships-for-a-bc.sdp.md | 13 + .../s-009-query-upstream-b-cs.sdp.md | 13 + ...-010-query-bc-with-no-relationships.sdp.md | 13 + ...-duplicate-relationship-is-rejected.sdp.md | 13 + ...eferential-relationship-is-rejected.sdp.md | 13 + .../s-001-generate-sample-from-schema.sdp.md | 13 + ...-002-generate-sample-with-overrides.sdp.md | 13 + .../s-003-generate-multiple-samples.sdp.md | 13 + .../s-004-producer-emits-valid-event.sdp.md | 13 + .../s-005-producer-emits-invalid-event.sdp.md | 13 + .../s-006-producer-emits-wrong-version.sdp.md | 13 + ...-007-consumer-processes-valid-event.sdp.md | 13 + ...sumer-handles-all-sample-variations.sdp.md | 13 + .../s-009-consumer-rejects-valid-event.sdp.md | 13 + ...10-compatible-producer-and-consumer.sdp.md | 13 + ...-011-incompatible-versions-detected.sdp.md | 13 + .../s-012-compatible-with-downcaster.sdp.md | 13 + ...-013-contract-violation-is-recorded.sdp.md | 13 + .../s-014-query-contract-violations.sdp.md | 13 + ...15-query-violations-since-timestamp.sdp.md | 13 + ...6-no-violations-returns-empty-array.sdp.md | 13 + .../s-001-upcast-v1-event-to-v2.sdp.md | 13 + ...ain-upcasters-for-multiple-versions.sdp.md | 13 + .../s-003-upcast-adds-computed-field.sdp.md | 13 + .../s-004-downcast-v2-event-to-v1.sdp.md | 13 + ...ncast-removes-required-in-new-field.sdp.md | 13 + ...-006-register-schema-with-migration.sdp.md | 13 + .../s-007-missing-migration-path.sdp.md | 13 + ...8-breaking-change-without-migration.sdp.md | 13 + ...-detect-version-from-event-metadata.sdp.md | 13 + ...10-infer-version-from-payload-shape.sdp.md | 13 + ...-create-publisher-with-empty-routes.sdp.md | 13 + ...002-create-publisher-with-one-route.sdp.md | 13 + ...-duplicate-source-event-type-routes.sdp.md | 13 + ...r-registered-and-unregistered-types.sdp.md | 13 + ...-005-retrieve-all-registered-routes.sdp.md | 13 + ...6-return-null-when-no-route-matches.sdp.md | 13 + ...ranslate-and-publish-a-domain-event.sdp.md | 13 + .../s-008-enqueue-multiple-handlers.sdp.md | 13 + ...y-integration-event-metadata-fields.sdp.md | 13 + ...clude-user-id-when-present-in-chain.sdp.md | 13 + ...omit-user-id-when-absent-from-chain.sdp.md | 13 + ...ass-on-complete-handler-to-workpool.sdp.md | 13 + .../s-013-propagate-translator-error.sdp.md | 13 + ...-014-verify-workpool-context-fields.sdp.md | 13 + ...ld-a-route-with-all-required-fields.sdp.md | 13 + ...t-schema-version-via-version-method.sdp.md | 13 + ...17-pass-multiple-handlers-to-notify.sdp.md | 13 + ...or-function-transforms-source-event.sdp.md | 13 + ...19-reject-missing-source-event-type.sdp.md | 13 + ...20-reject-missing-target-event-type.sdp.md | 13 + .../s-021-reject-missing-translator.sdp.md | 13 + .../s-022-reject-missing-handlers.sdp.md | 13 + ...ia-define-integration-route-factory.sdp.md | 13 + ...eate-publisher-via-factory-function.sdp.md | 13 + ...-integration-route-error-properties.sdp.md | 13 + ...ntegration-route-error-with-context.sdp.md | 13 + ...ration-route-error-instanceof-chain.sdp.md | 13 + ...1-register-integration-event-schema.sdp.md | 13 + .../s-002-register-multiple-versions.sdp.md | 13 + ...s-003-duplicate-version-is-rejected.sdp.md | 13 + ...t-domain-event-to-integration-event.sdp.md | 13 + ...s-005-convert-with-explicit-version.sdp.md | 13 + ...s-006-unregistered-event-type-fails.sdp.md | 13 + ...lid-payload-fails-schema-validation.sdp.md | 13 + ...8-event-tagging-for-routing-and-dcb.sdp.md | 13 + .../s-009-multiple-tags-for-routing.sdp.md | 13 + ...ster-schema-with-compatibility-mode.sdp.md | 13 + ...011-query-schema-compatibility-mode.sdp.md | 13 + .../s-012-list-all-event-types.sdp.md | 13 + .../s-013-list-versions-for-event-type.sdp.md | 13 + ...et-contains-all-provided-invariants.sdp.md | 13 + ...rray-is-immutable-and-a-frozen-copy.sdp.md | 13 + ...turns-true-when-all-invariants-pass.sdp.md | 13 + ...ns-false-when-first-invariant-fails.sdp.md | 13 + ...s-false-when-second-invariant-fails.sdp.md | 13 + ...urns-false-when-all-invariants-fail.sdp.md | 13 + ...-not-throw-when-all-invariants-pass.sdp.md | 13 + ...ows-on-first-failure-with-fail-fast.sdp.md | 13 + ...sert-all-throws-correct-error-class.sdp.md | 13 + ...ws-error-with-context-when-provided.sdp.md | 13 + ...urns-valid-when-all-invariants-pass.sdp.md | 13 + ...idate-all-collects-single-violation.sdp.md | 13 + ...violations-without-short-circuiting.sdp.md | 13 + ...ations-from-non-adjacent-invariants.sdp.md | 13 + ...n-invariant-has-no-context-function.sdp.md | 13 + ...016-empty-set-passes-all-operations.sdp.md | 13 + ...ses-all-operations-with-valid-state.sdp.md | 13 + ...invariant-has-correct-name-and-code.sdp.md | 13 + ...-when-state-satisfies-the-predicate.sdp.md | 13 + ...e-when-state-violates-the-predicate.sdp.md | 13 + ...-does-not-throw-when-state-is-valid.sdp.md | 13 + ...variant-error-when-state-is-invalid.sdp.md | 13 + ...-has-correct-code-for-invalid-state.sdp.md | 13 + ...s-correct-message-for-invalid-state.sdp.md | 13 + ...s-correct-context-for-invalid-state.sdp.md | 13 + ...eturns-valid-result-for-valid-state.sdp.md | 13 + ...violation-details-for-invalid-state.sdp.md | 13 + ...ed-context-when-no-context-function.sdp.md | 13 + ...ed-context-when-no-context-function.sdp.md | 13 + ...ses-parameter-to-find-matching-item.sdp.md | 13 + ...false-when-parameter-does-not-match.sdp.md | 13 + ...ameter-in-error-message-and-context.sdp.md | 13 + ...6-validate-uses-parameter-in-result.sdp.md | 13 + ...s-error-of-the-correct-custom-class.sdp.md | 13 + ...ting-an-error-with-code-and-message.sdp.md | 13 + ...002-including-context-when-provided.sdp.md | 13 + ...text-is-undefined-when-not-provided.sdp.md | 13 + .../s-004-error-has-proper-stack-trace.sdp.md | 13 + ...ting-a-context-specific-error-class.sdp.md | 13 + ...-contexts-produce-different-classes.sdp.md | 13 + ...007-typed-error-codes-are-supported.sdp.md | 13 + ...pecific-errors-include-context-data.sdp.md | 13 + ...c-class-has-proper-constructor-name.sdp.md | 13 + ...-true-for-invariant-error-instances.sdp.md | 13 + ...or-context-specific-error-instances.sdp.md | 13 + ...s-false-for-regular-error-instances.sdp.md | 13 + ...-returns-false-for-non-error-values.sdp.md | 13 + ...e-when-error-has-the-specified-code.sdp.md | 13 + ...lse-when-error-has-a-different-code.sdp.md | 13 + ...alse-for-non-invariant-error-values.sdp.md | 13 + ...-works-with-context-specific-errors.sdp.md | 13 + ...mmand-start-is-logged-at-info-level.sdp.md | 13 + ...elds-are-included-in-start-log-data.sdp.md | 13 + ...is-logged-at-info-level-with-result.sdp.md | 13 + ...e-preserved-alongside-result-fields.sdp.md | 13 + ...d-rejection-is-logged-at-warn-level.sdp.md | 13 + ...ed-field-names-not-raw-code-message.sdp.md | 13 + ...ess-failure-is-logged-at-warn-level.sdp.md | 13 + ...lure-uses-failure-reason-not-reason.sdp.md | 13 + ...-error-level-with-message-and-stack.sdp.md | 13 + ...010-string-error-is-logged-directly.sdp.md | 13 + ...ng-non-error-values-are-stringified.sdp.md | 13 + .../s-012-null-error-is-stringified.sdp.md | 13 + ...-013-undefined-error-is-stringified.sdp.md | 13 + ...ck-trace-is-preserved-for-debugging.sdp.md | 13 + ...cle-produces-start-and-success-logs.sdp.md | 13 + ...fecycle-produces-info-and-warn-logs.sdp.md | 13 + ...ecycle-produces-info-and-error-logs.sdp.md | 13 + ...01-messages-are-prefixed-with-scope.sdp.md | 13 + ...002-data-object-is-appended-as-json.sdp.md | 13 + ...-data-object-is-omitted-from-output.sdp.md | 13 + ...4-debug-level-allows-debug-messages.sdp.md | 13 + ...nfo-level-suppresses-debug-messages.sdp.md | 13 + ...006-info-level-allows-info-messages.sdp.md | 13 + ...007-info-level-allows-warn-messages.sdp.md | 13 + ...8-error-level-allows-error-messages.sdp.md | 13 + ...lt-level-is-info-when-not-specified.sdp.md | 13 + ...es-its-corresponding-console-method.sdp.md | 13 + ...uts-structured-json-via-console-log.sdp.md | 13 + ...-012-timing-start-uses-console-time.sdp.md | 13 + ...13-timing-end-uses-console-time-end.sdp.md | 13 + ...e-without-timing-uses-console-debug.sdp.md | 13 + ...r-does-not-call-any-console-methods.sdp.md | 13 + ...mplements-the-full-logger-interface.sdp.md | 13 + ...logger-prefixes-with-combined-scope.sdp.md | 13 + ...-logger-respects-provided-log-level.sdp.md | 13 + ...child-logger-defaults-to-info-level.sdp.md | 13 + ...l-six-log-method-calls-are-captured.sdp.md | 13 + ...-call-records-the-correct-log-level.sdp.md | 13 + ...-message-text-is-captured-correctly.sdp.md | 13 + ...ructured-data-is-captured-correctly.sdp.md | 13 + ...data-is-undefined-when-not-provided.sdp.md | 13 + ...timestamp-is-captured-within-bounds.sdp.md | 13 + ...-007-clearing-resets-calls-to-empty.sdp.md | 13 + ...lls-are-filtered-by-level-correctly.sdp.md | 13 + ...-partial-and-exact-message-matching.sdp.md | 13 + .../s-010-exact-message-match-works.sdp.md | 13 + ...1-level-and-message-must-both-match.sdp.md | 13 + ...urns-the-last-call-at-a-given-level.sdp.md | 13 + ...ns-undefined-when-no-calls-at-level.sdp.md | 13 + ...ltiple-accesses-return-equal-arrays.sdp.md | 13 + ...aptures-info-report-warn-error-only.sdp.md | 13 + ...debug-minimum-captures-all-6-levels.sdp.md | 13 + ...7-error-minimum-captures-only-error.sdp.md | 13 + ...arn-minimum-captures-warn-and-error.sdp.md | 13 + .../s-019-clear-resets-filtered-calls.sdp.md | 13 + ...essage-only-searches-filtered-calls.sdp.md | 13 + ...values-increase-from-debug-to-error.sdp.md | 13 + ...6-log-levels-are-defined-as-numbers.sdp.md | 13 + .../s-003-default-log-level-is-info.sdp.md | 13 + ...or-above-info-level-pass-the-filter.sdp.md | 13 + ...s-below-info-level-are-filtered-out.sdp.md | 13 + ...onfigured-level-allows-all-messages.sdp.md | 13 + ...-configured-level-only-allows-error.sdp.md | 13 + ...ed-level-allows-warn-and-error-only.sdp.md | 13 + ...e-and-returns-pipeline-for-chaining.sdp.md | 13 + ...are-returns-true-and-decreases-size.sdp.md | 13 + ...n-existent-middleware-returns-false.sdp.md | 13 + ...eturns-true-for-existing-middleware.sdp.md | 13 + ...s-false-for-non-existent-middleware.sdp.md | 13 + ...-names-are-returned-sorted-by-order.sdp.md | 13 + ...ecutes-directly-with-empty-pipeline.sdp.md | 13 + ...efore-hooks-run-in-order-10-then-20.sdp.md | 13 + ...after-hooks-run-in-order-20-then-10.sdp.md | 13 + ...nts-subsequent-middleware-execution.sdp.md | 13 + ...om-context-to-subsequent-middleware.sdp.md | 13 + ...fore-hook-produces-middleware-error.sdp.md | 13 + ...wing-handler-produces-handler-error.sdp.md | 13 + ...-does-not-prevent-other-after-hooks.sdp.md | 13 + ...-circuit-middleware-after-hooks-run.sdp.md | 13 + .../s-016-clear-empties-the-pipeline.sdp.md | 13 + ...same-middlewares-but-is-independent.sdp.md | 13 + ...ry-creates-pipeline-without-options.sdp.md | 13 + ...-creates-pipeline-with-debug-option.sdp.md | 13 + ...ucture-validation-has-correct-order.sdp.md | 13 + ...payload-passes-structure-validation.sdp.md | 13 + ...is-rejected-by-structure-validation.sdp.md | 13 + ...-command-skips-structure-validation.sdp.md | 13 + ...n-validates-against-registry-schema.sdp.md | 13 + ...idation-skips-unregistered-commands.sdp.md | 13 + ...domain-validation-has-correct-order.sdp.md | 13 + ...es-when-validator-returns-undefined.sdp.md | 13 + ...hen-validator-returns-error-message.sdp.md | 13 + ...n-skips-commands-without-validators.sdp.md | 13 + ...bined-validators-return-first-error.sdp.md | 13 + ...tors-return-undefined-when-all-pass.sdp.md | 13 + ...-string-validates-non-empty-strings.sdp.md | 13 + ...e-number-validates-positive-numbers.sdp.md | 13 + ...number-range-validates-within-range.sdp.md | 13 + ...starts-with-prefix-validates-prefix.sdp.md | 13 + ...017-authorization-has-correct-order.sdp.md | 13 + ...s-when-checker-returns-allowed-true.sdp.md | 13 + ...-when-checker-returns-allowed-false.sdp.md | 13 + ...orization-skips-configured-commands.sdp.md | 13 + ...cker-allows-user-with-required-role.sdp.md | 13 + ...-rejects-user-without-required-role.sdp.md | 13 + ...sed-checker-requires-authentication.sdp.md | 13 + ...cker-allows-when-no-roles-specified.sdp.md | 13 + .../s-025-logging-has-correct-order.sdp.md | 13 + ...are-logs-before-and-after-execution.sdp.md | 13 + ...are-logs-errors-for-failed-commands.sdp.md | 13 + ...-logger-does-not-throw-on-any-level.sdp.md | 13 + ...er-outputs-correctly-formatted-logs.sdp.md | 13 + ...-includes-timestamp-when-configured.sdp.md | 13 + .../s-031-rate-limit-has-correct-order.sdp.md | 13 + ...rate-limit-allows-when-not-exceeded.sdp.md | 13 + ...33-rate-limit-rejects-when-exceeded.sdp.md | 13 + ...ate-limit-skips-configured-commands.sdp.md | 13 + ...35-by-user-id-generates-correct-key.sdp.md | 13 + ...-by-user-id-handles-anonymous-users.sdp.md | 13 + ...-command-type-generates-correct-key.sdp.md | 13 + ...and-command-generates-composite-key.sdp.md | 13 + ...ware-orders-follow-correct-sequence.sdp.md | 13 + ...xecutes-normally-and-returns-result.sdp.md | 13 + ...mains-closed-after-a-single-failure.sdp.md | 13 + ...ult-failure-threshold-of-5-failures.sdp.md | 13 + ...nsitions-to-half-open-after-timeout.sdp.md | 13 + ...loses-on-success-in-half-open-state.sdp.md | 13 + ...opens-on-failure-in-half-open-state.sdp.md | 13 + ...esses-in-half-open-to-close-circuit.sdp.md | 13 + ...-returns-closed-for-unknown-circuit.sdp.md | 13 + ...-state-after-a-successful-operation.sdp.md | 13 + ...ears-an-open-circuit-back-to-closed.sdp.md | 13 + ...1-respects-custom-failure-threshold.sdp.md | 13 + .../s-012-respects-custom-timeout.sdp.md | 13 + ...t-resets-on-success-in-closed-state.sdp.md | 13 + ...ctured-field-for-primary-projection.sdp.md | 13 + ...red-field-for-secondary-projections.sdp.md | 13 + ...uctured-field-for-failed-projection.sdp.md | 13 + ...-routes-saga-work-to-saga-pool-only.sdp.md | 13 + ...ccessful-cross-context-coordination.sdp.md | 13 + .../s-002-compensation-on-step-failure.sdp.md | 13 + ...e-last-completed-step-after-restart.sdp.md | 13 + ...in-reverse-order-of-completed-steps.sdp.md | 13 + .../s-005-first-trigger-starts-saga.sdp.md | 13 + ...icate-trigger-returns-existing-saga.sdp.md | 13 + ...saga-status-after-workflow-finishes.sdp.md | 13 + ...ses-pm-name-and-event-subscriptions.sdp.md | 13 + ...d-and-false-for-unsubscribed-events.sdp.md | 13 + ...-processes-event-and-emits-commands.sdp.md | 13 + ...ed-event-with-not-subscribed-reason.sdp.md | 13 + ...-005-passes-custom-state-to-handler.sdp.md | 13 + ...es-stream-id-as-default-instance-id.sdp.md | 13 + ...07-uses-custom-instance-id-resolver.sdp.md | 13 + ...s-failed-status-when-handler-throws.sdp.md | 13 + ...-status-when-command-emitter-throws.sdp.md | 13 + .../s-010-returns-all-pm-names.sdp.md | 13 + ...s-011-finds-executors-by-event-type.sdp.md | 13 + ...vent-through-all-matching-executors.sdp.md | 13 + ...-empty-array-for-unsubscribed-event.sdp.md | 13 + ...-processes-single-matching-executor.sdp.md | 13 + ...ptions-so-other-executors-still-run.sdp.md | 13 + ...s-016-handles-empty-executors-array.sdp.md | 13 + .../s-001-idle-state-allows-start.sdp.md | 13 + ...2-idle-state-rejects-invalid-events.sdp.md | 13 + ...ssing-state-allows-success-and-fail.sdp.md | 13 + ...essing-state-rejects-invalid-events.sdp.md | 13 + .../s-005-completed-state-allows-reset.sdp.md | 13 + ...pleted-state-rejects-invalid-events.sdp.md | 13 + ...failed-state-allows-retry-and-reset.sdp.md | 13 + ...failed-state-rejects-invalid-events.sdp.md | 13 + ...sitions-return-correct-target-state.sdp.md | 13 + ...010-invalid-transitions-return-null.sdp.md | 13 + ...e-state-has-exactly-one-valid-event.sdp.md | 13 + ...-state-has-exactly-two-valid-events.sdp.md | 13 + ...d-state-has-exactly-one-valid-event.sdp.md | 13 + ...-state-has-exactly-two-valid-events.sdp.md | 13 + ...transitions-with-correct-properties.sdp.md | 13 + ...ll-expected-transitions-are-present.sdp.md | 13 + ...e-array-reference-on-repeated-calls.sdp.md | 13 + ...-valid-transition-returns-new-state.sdp.md | 13 + ...throws-with-pm-name-and-instance-id.sdp.md | 13 + .../s-020-completed-is-terminal.sdp.md | 13 + ...21-non-terminal-states-return-false.sdp.md | 13 + .../s-022-failed-is-an-error-state.sdp.md | 13 + ...s-023-non-error-states-return-false.sdp.md | 13 + ...tates-have-at-least-one-valid-event.sdp.md | 13 + ...5-critical-reachability-paths-exist.sdp.md | 13 + ...ath-idle-to-processing-to-completed.sdp.md | 13 + ...e-path-idle-to-processing-to-failed.sdp.md | 13 + ...o-failed-to-processing-to-completed.sdp.md | 13 + ...-to-processing-to-completed-to-idle.sdp.md | 13 + ...dle-to-processing-to-failed-to-idle.sdp.md | 13 + ...1-register-a-single-process-manager.sdp.md | 13 + ...-register-multiple-process-managers.sdp.md | 13 + ...licate-registration-throws-an-error.sdp.md | 13 + .../s-004-get-returns-pm-by-name.sdp.md | 13 + ...et-returns-undefined-for-unknown-pm.sdp.md | 13 + ...-has-returns-true-for-registered-pm.sdp.md | 13 + ...s-returns-false-for-unregistered-pm.sdp.md | 13 + ...urns-empty-array-for-empty-registry.sdp.md | 13 + ...09-list-returns-all-registered-p-ms.sdp.md | 13 + .../s-010-size-is-0-for-empty-registry.sdp.md | 13 + ...11-size-reflects-registration-count.sdp.md | 13 + ...s-pm-subscribed-to-a-specific-event.sdp.md | 13 + ...m-for-shared-event-across-hybrid-pm.sdp.md | 13 + ...eturns-empty-for-unknown-event-type.sdp.md | 13 + ...for-event-matching-no-subscriptions.sdp.md | 13 + ...urns-empty-array-for-empty-registry.sdp.md | 13 + ...7-returns-unique-sorted-event-types.sdp.md | 13 + ...ray-for-empty-registry-for-commands.sdp.md | 13 + ...returns-unique-sorted-command-types.sdp.md | 13 + .../s-020-filters-by-orders-context.sdp.md | 13 + .../s-021-filters-by-inventory-context.sdp.md | 13 + ...2-returns-empty-for-unknown-context.sdp.md | 13 + ...s-023-filters-by-event-trigger-type.sdp.md | 13 + .../s-024-filters-by-time-trigger-type.sdp.md | 13 + ...-025-filters-by-hybrid-trigger-type.sdp.md | 13 + ...urns-time-and-hybrid-triggered-p-ms.sdp.md | 13 + ...-excludes-event-only-triggered-p-ms.sdp.md | 13 + ...ime-triggered-p-ms-have-cron-config.sdp.md | 13 + ...ll-handlers-for-order-shipped-event.sdp.md | 13 + ...-triggered-p-ms-for-cron-scheduling.sdp.md | 13 + ...s-and-commands-is-handled-correctly.sdp.md | 13 + ...d-p-ms-where-some-have-empty-arrays.sdp.md | 13 + ...correlation-strategy-uses-stream-id.sdp.md | 13 + ...-property-is-extracted-from-payload.sdp.md | 13 + ...correlation-property-not-in-payload.sdp.md | 13 + ...orrelation-property-is-not-a-string.sdp.md | 13 + ...d-when-correlation-property-is-null.sdp.md | 13 + ...n-correlation-property-is-undefined.sdp.md | 13 + ...lation-property-value-is-used-as-is.sdp.md | 13 + ...lation-property-value-is-used-as-is.sdp.md | 13 + ...elation-strategy-extracts-correctly.sdp.md | 13 + ...0-subscription-name-without-context.sdp.md | 13 + ...-011-subscription-name-with-context.sdp.md | 13 + .../s-012-default-priority-is-200.sdp.md | 13 + ...3-custom-priority-overrides-default.sdp.md | 13 + ...s-by-event-types-from-pm-definition.sdp.md | 13 + ...creates-mutable-copy-of-event-types.sdp.md | 13 + ...andler-args-produces-correct-output.sdp.md | 13 + ...stance-id-from-correlation-strategy.sdp.md | 13 + ...to-handler-args-transformer-is-used.sdp.md | 13 + ...19-default-partition-by-instance-id.sdp.md | 13 + ...tion-strategy-affects-partition-key.sdp.md | 13 + ...21-custom-get-partition-key-is-used.sdp.md | 13 + ...handler-reference-is-passed-through.sdp.md | 13 + ...produces-correct-subscription-names.sdp.md | 13 + .../s-024-missing-handler-throws-error.sdp.md | 13 + ...iority-applies-to-all-subscriptions.sdp.md | 13 + ...bscription-has-correct-event-filter.sdp.md | 13 + ...itions-produces-empty-subscriptions.sdp.md | 13 + ...28-handlers-match-their-definitions.sdp.md | 13 + ...29-default-priority-constant-is-200.sdp.md | 13 + ...-after-projections-and-before-sagas.sdp.md | 13 + ...-all-valid-pm-statuses-are-accepted.sdp.md | 13 + ...s-manager-statuses-passes-the-guard.sdp.md | 13 + ...invalid-status-strings-are-rejected.sdp.md | 13 + ...jected-by-is-process-manager-status.sdp.md | 13 + ...jected-by-is-process-manager-status.sdp.md | 13 + ...ss-manager-status-is-case-sensitive.sdp.md | 13 + ...ype-narrowing-works-in-conditionals.sdp.md | 13 + ...ard-works-as-array-filter-predicate.sdp.md | 13 + ...ontains-exactly-4-statuses-in-order.sdp.md | 13 + ...-readonly-array-with-correct-bounds.sdp.md | 13 + ...tuses-contains-all-lifecycle-states.sdp.md | 13 + ...tuses-is-in-logical-lifecycle-order.sdp.md | 13 + ...d-dead-letter-statuses-are-accepted.sdp.md | 13 + ...ad-letter-statuses-passes-the-guard.sdp.md | 13 + ...e-rejected-by-is-dead-letter-status.sdp.md | 13 + ...e-rejected-by-is-dead-letter-status.sdp.md | 13 + ...e-rejected-by-is-dead-letter-status.sdp.md | 13 + ...ning-valid-dl-statuses-are-rejected.sdp.md | 13 + ...ead-letter-status-is-case-sensitive.sdp.md | 13 + ...ype-narrowing-works-in-conditionals.sdp.md | 13 + ...ard-works-as-array-filter-predicate.sdp.md | 13 + ...ontains-exactly-3-statuses-in-order.sdp.md | 13 + ...-readonly-array-with-correct-bounds.sdp.md | 13 + ...ses-contains-all-dead-letter-states.sdp.md | 13 + ...atuses-is-in-logical-workflow-order.sdp.md | 13 + ...th-all-fields-has-correct-structure.sdp.md | 13 + ...ired-fields-has-undefined-optionals.sdp.md | 13 + ...r-supports-each-status-individually.sdp.md | 13 + ...es-command-type-and-complex-payload.sdp.md | 13 + ...failed-command-allows-empty-payload.sdp.md | 13 + ...d-letter-handles-high-attempt-count.sdp.md | 13 + ...-letter-handles-long-error-messages.sdp.md | 13 + ...ter-handles-complex-context-objects.sdp.md | 13 + ...ocess-event-when-no-pm-state-exists.sdp.md | 13 + ...-global-position-exceeds-checkpoint.sdp.md | 13 + ...m-state-is-updated-after-processing.sdp.md | 13 + ...n-global-position-equals-checkpoint.sdp.md | 13 + ...al-position-is-less-than-checkpoint.sdp.md | 13 + ...event-when-pm-is-in-completed-state.sdp.md | 13 + ...stances-are-processed-independently.sdp.md | 13 + ...ucceeds-after-emit-commands-failure.sdp.md | 13 + ...hen-pm-is-stuck-in-processing-state.sdp.md | 13 + ...010-reject-negative-global-position.sdp.md | 13 + ...ero-is-treated-as-already-processed.sdp.md | 13 + ...t-after-initialization-is-processed.sdp.md | 13 + ...letter-recorded-when-process-throws.sdp.md | 13 + ...-recorded-when-emit-commands-throws.sdp.md | 13 + ...d-counter-is-incremented-on-failure.sdp.md | 13 + ...ed-counter-tracks-multiple-commands.sdp.md | 13 + ...sult-contains-emitted-command-types.sdp.md | 13 + ...ist-produces-no-op-processed-result.sdp.md | 13 + ...r-processes-event-and-updates-state.sdp.md | 13 + ...-maintains-pm-idempotency-semantics.sdp.md | 13 + ...jection-rebuild-re-processes-events.sdp.md | 13 + ...dead-letter-retry-re-enqueues-event.sdp.md | 13 + ...ent-flow-trace-returns-full-history.sdp.md | 13 + ...s-004-rebuild-status-shows-progress.sdp.md | 13 + ...-letter-retry-processes-all-pending.sdp.md | 13 + ...nostics-returns-comprehensive-state.sdp.md | 13 + ...rcuit-opens-after-repeated-failures.sdp.md | 13 + ...nsitions-to-half-open-after-timeout.sdp.md | 13 + ...ul-half-open-request-closes-circuit.sdp.md | 13 + ...d-half-open-request-reopens-circuit.sdp.md | 13 + ...ersists-across-function-invocations.sdp.md | 13 + ...cuit-breakers-operate-independently.sdp.md | 13 + ...ce-spans-command-to-projection-flow.sdp.md | 13 + ...-missing-trace-context-uses-default.sdp.md | 13 + ...text-is-preserved-in-event-metadata.sdp.md | 13 + ...ltiple-projections-share-same-trace.sdp.md | 13 + ...-action-retrier-for-half-open-probe.sdp.md | 13 + ...-reopens-circuit-via-action-retrier.sdp.md | 13 + ...ion-retrier-with-configured-retries.sdp.md | 13 + ...flict-triggers-workpool-based-retry.sdp.md | 13 + ...cts-exponential-backoff-with-jitter.sdp.md | 13 + ...-uses-latest-version-after-conflict.sdp.md | 13 + ...ion-key-prevents-concurrent-retries.sdp.md | 13 + ...s-action-retrier-for-external-calls.sdp.md | 13 + ...dlq-retry-returns-to-pending-status.sdp.md | 13 + ...ssful-dlq-retry-marks-item-resolved.sdp.md | 13 + .../s-011-dlq-retry-tracks-retry-count.sdp.md | 13 + ...readiness-probe-checks-dependencies.sdp.md | 13 + ...nhealthy-dependency-fails-readiness.sdp.md | 13 + ...-003-liveness-probe-always-succeeds.sdp.md | 13 + ...ion-lag-threshold-determines-health.sdp.md | 13 + ...nse-includes-all-component-statuses.sdp.md | 13 + .../s-001-projection-lag-is-tracked.sdp.md | 13 + ...lection-handles-missing-checkpoints.sdp.md | 13 + ...-003-event-throughput-is-calculated.sdp.md | 13 + ...4-dead-letter-queue-size-is-tracked.sdp.md | 13 + ...-requests-within-rate-limit-succeed.sdp.md | 13 + ...s-exceeding-rate-limit-are-rejected.sdp.md | 13 + ...-003-token-bucket-refills-over-time.sdp.md | 13 + ...04-rate-limit-key-isolation-by-user.sdp.md | 13 + ...admin-rebuild-respects-hourly-limit.sdp.md | 13 + ...rebuild-blocked-when-limit-exceeded.sdp.md | 13 + ...onent-response-to-rate-limit-result.sdp.md | 13 + ...handles-component-errors-gracefully.sdp.md | 13 + ...tuple-contains-all-valid-categories.sdp.md | 13 + ...category-validates-category-strings.sdp.md | 13 + ...nctions-identify-correct-categories.sdp.md | 13 + ...sed-returns-correct-exposure-status.sdp.md | 13 + ...ory-returns-category-required-error.sdp.md | 13 + ...ory-returns-category-required-error.sdp.md | 13 + ...03-valid-category-passes-validation.sdp.md | 13 + ...ory-returns-category-on-valid-input.sdp.md | 13 + ...gory-returns-invalid-category-error.sdp.md | 13 + ...id-category-throws-on-invalid-input.sdp.md | 13 + ...tegory-returns-all-view-projections.sdp.md | 13 + ...egory-returns-all-logic-projections.sdp.md | 13 + ...y-returns-all-reporting-projections.sdp.md | 13 + ...returns-all-integration-projections.sdp.md | 13 + ...ay-for-category-with-no-projections.sdp.md | 13 + ...view-projections-for-reactive-layer.sdp.md | 13 + ...n-projections-for-event-bus-routing.sdp.md | 13 + ...schema-accepts-all-valid-categories.sdp.md | 13 + ...egory-schema-rejects-invalid-values.sdp.md | 13 + ...ory-schema-rejects-non-string-types.sdp.md | 13 + ...projection-category-rejects-objects.sdp.md | 13 + ...-projection-category-rejects-arrays.sdp.md | 13 + ...rojection-category-rejects-booleans.sdp.md | 13 + ...y-rejects-whitespace-padded-strings.sdp.md | 13 + ...ion-errors-has-expected-error-codes.sdp.md | 13 + ...n-category-rejects-non-string-types.sdp.md | 13 + ...ows-category-required-for-undefined.sdp.md | 13 + ...lowed-transitions-from-active-state.sdp.md | 13 + ...ected-transitions-from-active-state.sdp.md | 13 + ...d-transitions-from-rebuilding-state.sdp.md | 13 + ...d-transitions-from-rebuilding-state.sdp.md | 13 + ...lowed-transitions-from-paused-state.sdp.md | 13 + ...ected-transitions-from-paused-state.sdp.md | 13 + ...llowed-transitions-from-error-state.sdp.md | 13 + ...jected-transitions-from-error-state.sdp.md | 13 + ...tions-produce-correct-target-states.sdp.md | 13 + ...010-invalid-transitions-return-null.sdp.md | 13 + ...-011-valid-events-from-active-state.sdp.md | 13 + ...-valid-events-from-rebuilding-state.sdp.md | 13 + ...-013-valid-events-from-paused-state.sdp.md | 13 + ...s-014-valid-events-from-error-state.sdp.md | 13 + ...-transitions-with-correct-structure.sdp.md | 13 + ...l-expected-transitions-are-included.sdp.md | 13 + ...turns-same-array-reference-memoized.sdp.md | 13 + ...urns-new-state-for-valid-transition.sdp.md | 13 + ...lid-transition-with-projection-name.sdp.md | 13 + ...hable-from-at-least-one-other-state.sdp.md | 13 + ...ve-at-least-one-outgoing-transition.sdp.md | 13 + ...ry-path-exists-from-error-to-active.sdp.md | 13 + ...s-023-error-path-exists-from-active.sdp.md | 13 + ...ebuild-retry-path-exists-from-error.sdp.md | 13 + ...sing-active-state-allows-fail-event.sdp.md | 13 + ...flow-active-to-rebuilding-to-active.sdp.md | 13 + ...-workflow-active-to-error-to-active.sdp.md | 13 + ...ve-to-error-to-rebuilding-to-active.sdp.md | 13 + ...workflow-active-to-paused-to-active.sdp.md | 13 + ...ve-to-rebuilding-to-error-to-active.sdp.md | 13 + ...e-to-paused-to-rebuilding-to-active.sdp.md | 13 + ...active-to-paused-to-error-to-active.sdp.md | 13 + .../s-001-register-a-single-projection.sdp.md | 13 + ...s-002-register-multiple-projections.sdp.md | 13 + ...licate-projection-name-throws-error.sdp.md | 13 + ...-004-get-returns-projection-by-name.sdp.md | 13 + ...ns-undefined-for-unknown-projection.sdp.md | 13 + ...urns-true-for-registered-projection.sdp.md | 13 + ...s-false-for-unregistered-projection.sdp.md | 13 + ...urns-empty-array-for-empty-registry.sdp.md | 13 + ...-returns-all-registered-projections.sdp.md | 13 + .../s-010-size-is-0-for-empty-registry.sdp.md | 13 + ...11-size-reflects-registration-count.sdp.md | 13 + ...turns-multiple-matching-projections.sdp.md | 13 + ...-single-context-specific-projection.sdp.md | 13 + ...ype-returns-empty-for-unknown-event.sdp.md | 13 + ...es-returns-empty-for-empty-registry.sdp.md | 13 + ...s-returns-sorted-unique-event-types.sdp.md | 13 + ...y-context-filters-by-orders-context.sdp.md | 13 + ...ontext-filters-by-inventory-context.sdp.md | 13 + ...by-context-filters-by-cross-context.sdp.md | 13 + ...t-returns-empty-for-unknown-context.sdp.md | 13 + ...er-returns-empty-for-empty-registry.sdp.md | 13 + ...places-primary-before-cross-context.sdp.md | 13 + ...y-category-returns-view-projections.sdp.md | 13 + ...-category-returns-logic-projections.sdp.md | 13 + ...egory-returns-reporting-projections.sdp.md | 13 + ...ory-returns-integration-projections.sdp.md | 13 + ...rns-empty-when-no-projections-match.sdp.md | 13 + ...all-results-have-requested-category.sdp.md | 13 + ...ks-regardless-of-registration-order.sdp.md | 13 + ...y-index-is-maintained-incrementally.sdp.md | 13 + ...ess-event-when-no-checkpoint-exists.sdp.md | 13 + ...-global-position-exceeds-checkpoint.sdp.md | 13 + ...ckpoint-is-updated-after-processing.sdp.md | 13 + ...n-global-position-equals-checkpoint.sdp.md | 13 + ...al-position-is-less-than-checkpoint.sdp.md | 13 + ...-separate-checkpoints-per-partition.sdp.md | 13 + ...rent-partitions-does-not-cause-skip.sdp.md | 13 + ...int-not-updated-when-process-throws.sdp.md | 13 + ...etry-succeeds-after-process-failure.sdp.md | 13 + ...-checkpoint-fields-stored-correctly.sdp.md | 13 + ...per-processes-and-stores-checkpoint.sdp.md | 13 + ...s-checkpoint-semantics-across-calls.sdp.md | 13 + ...-process-event-position-comparisons.sdp.md | 13 + ...tial-checkpoint-has-sentinel-values.sdp.md | 13 + ...checkpoint-gets-a-unique-updated-at.sdp.md | 13 + ...-has-correct-result-type-and-config.sdp.md | 13 + ...-descriptor-has-correct-result-type.sdp.md | 13 + ...-descriptor-has-correct-result-type.sdp.md | 13 + ...-descriptor-uses-default-page-sizes.sdp.md | 13 + ...y-descriptor-uses-custom-page-sizes.sdp.md | 13 + ...-receives-default-pagination-values.sdp.md | 13 + ...-has-correct-context-and-projection.sdp.md | 13 + ...tiple-queries-provides-keyed-access.sdp.md | 13 + ...cess-to-registered-query-descriptor.sdp.md | 13 + ...options-returns-descriptor-defaults.sdp.md | 13 + ...ded-page-size-within-limits-is-used.sdp.md | 13 + ...-page-size-exceeding-max-is-clamped.sdp.md | 13 + ...egative-page-sizes-are-clamped-to-1.sdp.md | 13 + ...cursor-is-passed-through-to-options.sdp.md | 13 + ...rsor-is-undefined-when-not-provided.sdp.md | 13 + ...d-descriptors-preserve-result-types.sdp.md | 13 + ...tion-constants-have-expected-values.sdp.md | 13 + ...s-defaults-when-no-options-provided.sdp.md | 13 + ...es-provided-page-size-within-limits.sdp.md | 13 + .../s-004-caps-page-size-at-max.sdp.md | 13 + ...-page-size-of-1-for-boundary-values.sdp.md | 13 + .../s-006-passes-through-cursor.sdp.md | 13 + ...007-works-with-custom-config-values.sdp.md | 13 + ...unds-floating-point-page-sizes-down.sdp.md | 13 + ...n-empty-page-with-correct-structure.sdp.md | 13 + ...s-type-information-with-empty-array.sdp.md | 13 + ...reates-a-page-with-items-and-cursor.sdp.md | 13 + ...tes-a-done-page-when-cursor-is-null.sdp.md | 13 + ...-empty-items-array-with-null-cursor.sdp.md | 13 + ...es-and-decodes-simple-position-data.sdp.md | 13 + ...s-and-decodes-complex-position-data.sdp.md | 13 + ...-016-produces-base64-encoded-string.sdp.md | 13 + ...017-round-trips-various-data-shapes.sdp.md | 13 + ...urns-null-for-invalid-cursor-inputs.sdp.md | 13 + ...invalid-characters-in-middle-or-end.sdp.md | 13 + ...-null-for-truncated-utf-8-sequences.sdp.md | 13 + ...1-returns-true-for-valid-page-sizes.sdp.md | 13 + ...eturns-false-for-invalid-page-sizes.sdp.md | 13 + ...s-023-respects-custom-max-page-size.sdp.md | 13 + ...4-returns-requested-size-when-valid.sdp.md | 13 + ...-returns-default-when-not-specified.sdp.md | 13 + ...26-caps-at-max-and-enforces-minimum.sdp.md | 13 + ...7-uses-custom-default-and-max-sizes.sdp.md | 13 + ...28-rounds-floating-point-sizes-down.sdp.md | 13 + ...-simulates-complete-pagination-flow.sdp.md | 13 + .../s-030-handles-empty-result-set.sdp.md | 13 + ...t-page-size-match-with-continuation.sdp.md | 13 + ...ng-optimistic-update-is-rolled-back.sdp.md | 13 + ...detection-handles-network-partition.sdp.md | 13 + ...when-optimistic-is-ahead-of-durable.sdp.md | 13 + ...4-rollback-triggers-ui-notification.sdp.md | 13 + ...earing-preserves-unconfirmed-events.sdp.md | 13 + ...nt-update-then-durable-confirmation.sdp.md | 13 + ...pdate-works-during-workpool-backlog.sdp.md | 13 + ...-takes-precedence-after-convergence.sdp.md | 13 + ...ory-determines-reactive-eligibility.sdp.md | 13 + ...ction-rejects-reactive-subscription.sdp.md | 13 + ...enables-full-reactive-functionality.sdp.md | 13 + ...ive-result-represents-loading-state.sdp.md | 13 + ...ntical-results-on-client-and-server.sdp.md | 13 + ...dles-unknown-event-types-gracefully.sdp.md | 13 + ...-multiple-events-evolve-in-sequence.sdp.md | 13 + ...evolve-error-includes-event-context.sdp.md | 13 + ...the-same-instance-on-multiple-calls.sdp.md | 13 + .../s-002-reset-creates-a-new-instance.sdp.md | 13 + ...003-register-a-command-successfully.sdp.md | 13 + ...licate-registration-throws-an-error.sdp.md | 13 + ...ent-command-types-can-be-registered.sdp.md | 13 + ...gister-removes-a-registered-command.sdp.md | 13 + ...urns-false-for-non-existent-command.sdp.md | 13 + ...rns-config-for-a-registered-command.sdp.md | 13 + ...ndefined-for-a-non-existent-command.sdp.md | 13 + ...gistration-for-a-registered-command.sdp.md | 13 + ...ndefined-for-a-non-existent-command.sdp.md | 13 + ...turns-true-for-a-registered-command.sdp.md | 13 + ...ns-false-for-a-non-existent-command.sdp.md | 13 + ...e-returns-valid-for-correct-payload.sdp.md | 13 + ...turns-invalid-for-incorrect-payload.sdp.md | 13 + ...wn-command-for-non-existent-command.sdp.md | 13 + ...ray-when-no-commands-are-registered.sdp.md | 13 + ...ist-returns-all-registered-commands.sdp.md | 13 + ...and-info-objects-with-correct-shape.sdp.md | 13 + .../s-020-filter-commands-by-category.sdp.md | 13 + ...-filter-commands-by-bounded-context.sdp.md | 13 + .../s-022-filter-commands-by-tag.sdp.md | 13 + ...3-group-commands-by-bounded-context.sdp.md | 13 + ...-returns-empty-map-when-no-commands.sdp.md | 13 + ...e-reflects-registered-command-count.sdp.md | 13 + ...026-clear-removes-all-registrations.sdp.md | 13 + ...y-is-a-functional-registry-instance.sdp.md | 13 + ...bounded-context-and-projection-name.sdp.md | 13 + ...-with-command-id-and-correlation-id.sdp.md | 13 + ...rtition-key-uses-aggregate-id-field.sdp.md | 13 + ...partition-key-overrides-the-default.sdp.md | 13 + ...gregate-category-and-custom-options.sdp.md | 13 + ...mmand-is-auto-registered-by-default.sdp.md | 13 + ...istered-when-auto-register-is-false.sdp.md | 13 + ...-projections-are-included-in-config.sdp.md | 13 + ...09-saga-route-is-included-in-config.sdp.md | 13 + ...saga-route-on-complete-is-preserved.sdp.md | 13 + ...ed-projection-is-included-in-config.sdp.md | 13 + .../s-012-schema-version-defaults-to-1.sdp.md | 13 + ...and-has-correct-category-and-target.sdp.md | 13 + ...partition-key-uses-process-id-field.sdp.md | 13 + ...sters-with-category-and-target-info.sdp.md | 13 + ...-category-subsystem-and-description.sdp.md | 13 + ...-with-command-id-and-correlation-id.sdp.md | 13 + ...ojection-has-no-projection-property.sdp.md | 13 + ...th-projection-includes-it-in-config.sdp.md | 13 + ...key-defaults-to-system-command-type.sdp.md | 13 + ...t-registered-even-with-auto-registe.sdp.md | 13 + ...system-schema-version-defaults-to-1.sdp.md | 13 + ...01-load-and-upcast-cms-by-entity-id.sdp.md | 13 + ...-not-found-error-for-missing-entity.sdp.md | 13 + .../s-003-load-returns-upcast-metadata.sdp.md | 13 + ...s-004-load-propagates-upcast-errors.sdp.md | 13 + ...load-returns-cms-when-entity-exists.sdp.md | 13 + ...rns-null-when-entity-does-not-exist.sdp.md | 13 + ...d-resolves-to-null-without-throwing.sdp.md | 13 + ...8-try-load-propagates-upcast-errors.sdp.md | 13 + ...sts-returns-true-when-entity-exists.sdp.md | 13 + ...ns-false-when-entity-does-not-exist.sdp.md | 13 + ...xists-does-not-call-upcast-function.sdp.md | 13 + ...loads-multiple-entities-in-parallel.sdp.md | 13 + ...y-returns-null-for-missing-entities.sdp.md | 13 + ...returns-empty-array-for-empty-input.sdp.md | 13 + ...ad-many-upcasts-all-loaded-entities.sdp.md | 13 + ...-many-preserves-order-of-input-i-ds.sdp.md | 13 + ...agates-upcast-errors-for-any-entity.sdp.md | 13 + ...-cms-record-and-returns-document-id.sdp.md | 13 + ...te-patches-cms-when-version-matches.sdp.md | 13 + ...ot-found-error-for-missing-document.sdp.md | 13 + ...-conflict-error-on-version-mismatch.sdp.md | 13 + ...-found-error-has-correct-properties.sdp.md | 13 + ...not-found-error-is-instanceof-error.sdp.md | 13 + ...rd-returns-true-for-not-found-error.sdp.md | 13 + ...alse-for-non-not-found-error-values.sdp.md | 13 + ...nflict-error-has-correct-properties.sdp.md | 13 + ...-conflict-error-is-instanceof-error.sdp.md | 13 + ...turns-true-for-version-conflict-err.sdp.md | 13 + ...uard-returns-false-for-other-errors.sdp.md | 13 + ...-confirm-reservation-with-entity-id.sdp.md | 13 + ...-confirmed-reservation-is-permanent.sdp.md | 13 + ...-cannot-confirm-expired-reservation.sdp.md | 13 + ...nfirm-already-confirmed-reservation.sdp.md | 13 + ...ot-confirm-non-existent-reservation.sdp.md | 13 + ...cannot-confirm-released-reservation.sdp.md | 13 + .../s-007-entity-id-is-required.sdp.md | 13 + ...ity-id-can-be-any-string-identifier.sdp.md | 13 + .../s-001-release-active-reservation.sdp.md | 13 + ...d-value-can-be-immediately-reserved.sdp.md | 13 + ...annot-release-confirmed-reservation.sdp.md | 13 + ...elease-already-released-reservation.sdp.md | 13 + ...-cannot-release-expired-reservation.sdp.md | 13 + ...ot-release-non-existent-reservation.sdp.md | 13 + ...red-reservations-are-marked-by-cron.sdp.md | 13 + ...does-not-affect-active-reservations.sdp.md | 13 + ...s-not-affect-confirmed-reservations.sdp.md | 13 + .../s-001-email-reservation-key-format.sdp.md | 13 + ...002-username-reservation-key-format.sdp.md | 13 + ...-custom-type-reservation-key-format.sdp.md | 13 + .../s-004-same-value-different-types.sdp.md | 13 + .../s-005-independent-type-uniqueness.sdp.md | 13 + .../s-006-type-is-required.sdp.md | 13 + .../s-007-value-is-required.sdp.md | 13 + .../s-008-empty-type-is-invalid.sdp.md | 13 + .../s-009-empty-value-is-invalid.sdp.md | 13 + .../s-010-find-reservation-by-key.sdp.md | 13 + ...-find-reservation-by-type-and-value.sdp.md | 13 + ...s-012-non-existent-key-returns-null.sdp.md | 13 + ...3-type-containing-colon-is-rejected.sdp.md | 13 + ...lue-can-contain-colon-url-with-port.sdp.md | 13 + .../s-001-reserve-an-email-address.sdp.md | 13 + .../s-002-reserve-with-correlation-id.sdp.md | 13 + .../s-003-first-reservation-wins.sdp.md | 13 + ...eserved-value-cannot-be-re-reserved.sdp.md | 13 + .../s-005-different-ttl-values.sdp.md | 13 + .../s-006-ttl-must-be-positive.sdp.md | 13 + .../s-007-ttl-has-maximum-limit.sdp.md | 13 + .../s-008-negative-ttl-is-rejected.sdp.md | 13 + ...09-ttl-at-minimum-boundary-succeeds.sdp.md | 13 + ...-ttl-just-below-minimum-is-rejected.sdp.md | 13 + .../s-011-na-n-ttl-is-rejected.sdp.md | 13 + .../s-012-infinity-ttl-is-rejected.sdp.md | 13 + ...013-whitespace-only-type-is-invalid.sdp.md | 13 + ...14-whitespace-only-value-is-invalid.sdp.md | 13 + ...s-001-complete-metadata-is-accepted.sdp.md | 13 + ...a-with-optional-user-id-is-accepted.sdp.md | 13 + ...with-invalid-timestamps-is-rejected.sdp.md | 13 + ...missing-required-fields-is-rejected.sdp.md | 13 + .../s-005-complete-command-is-accepted.sdp.md | 13 + ...optional-payload-fields-is-accepted.sdp.md | 13 + ...ng-command-type-literal-is-rejected.sdp.md | 13 + ...th-invalid-payload-type-is-rejected.sdp.md | 13 + ...-required-payload-field-is-rejected.sdp.md | 13 + ...-missing-target-context-is-rejected.sdp.md | 13 + ...-inference-for-command-type-literal.sdp.md | 13 + ...s-with-version-and-data-is-accepted.sdp.md | 13 + ...ess-with-undefined-data-is-accepted.sdp.md | 13 + ...success-without-version-is-rejected.sdp.md | 13 + ...ed-with-code-and-reason-is-accepted.sdp.md | 13 + ...d-with-optional-context-is-accepted.sdp.md | 13 + ...rejected-without-reason-is-rejected.sdp.md | 13 + ...rrent-modification-code-is-accepted.sdp.md | 13 + ...onflict-with-wrong-code-is-rejected.sdp.md | 13 + ...without-current-version-is-rejected.sdp.md | 13 + ...-021-error-with-message-is-accepted.sdp.md | 13 + ...2-error-without-message-is-rejected.sdp.md | 13 + ...nates-success-and-preserves-version.sdp.md | 13 + ...ected-and-preserves-code-and-reason.sdp.md | 13 + ...flict-and-preserves-current-version.sdp.md | 13 + ...minates-error-and-preserves-message.sdp.md | 13 + .../s-027-union-rejects-unknown-status.sdp.md | 13 + ...ution-when-convex-test-mode-is-true.sdp.md | 13 + ...w-execution-when-is-test-env-is-set.sdp.md | 13 + ...untime-without-explicit-test-signal.sdp.md | 13 + ...block-execution-in-cloud-production.sdp.md | 13 + ...vironment-returns-true-in-test-mode.sdp.md | 13 + ...nment-returns-true-with-is-test-env.sdp.md | 13 + ...ronment-returns-false-in-production.sdp.md | 13 + ...environment-is-a-safe-boolean-check.sdp.md | 13 + ...01-fresh-state-after-docker-restart.sdp.md | 13 + ...ect-state-pollution-without-restart.sdp.md | 13 + .../s-003-unique-namespace-per-test.sdp.md | 13 + ...mespace-applied-to-correlation-i-ds.sdp.md | 13 + ...-from-previous-test-don-t-interfere.sdp.md | 13 + ...functions-use-test-specific-context.sdp.md | 13 + ...has-feature-directory-platform-core.sdp.md | 13 + ...-feature-directory-platform-decider.sdp.md | 13 + ...-has-feature-directory-platform-fsm.sdp.md | 13 + ...as-feature-directory-platform-store.sdp.md | 13 + ...-has-feature-directory-platform-bus.sdp.md | 13 + ...e-has-feature-directory-platform-bc.sdp.md | 13 + ...orted-function-has-feature-coverage.sdp.md | 13 + .../s-008-missing-coverage-is-detected.sdp.md | 13 + ...efinitions-follow-naming-convention.sdp.md | 13 + ...-010-step-file-matches-feature-file.sdp.md | 13 + .../s-001-sleep-for-specified-duration.sdp.md | 13 + .../s-002-sleep-returns-a-promise.sdp.md | 13 + ...l-returns-truthy-result-immediately.sdp.md | 13 + ...-until-polls-until-condition-is-met.sdp.md | 13 + .../s-005-wait-until-throws-on-timeout.sdp.md | 13 + ...t-until-uses-custom-timeout-message.sdp.md | 13 + ...ait-until-respects-poll-interval-ms.sdp.md | 13 + ...esolves-when-predicate-returns-true.sdp.md | 13 + .../s-009-wait-for-throws-on-timeout.sdp.md | 13 + ...s-010-default-timeout-is-30-seconds.sdp.md | 13 + ...-011-default-poll-interval-is-100ms.sdp.md | 13 + .../s-001-create-base-unit-test-world.sdp.md | 13 + ...est-world-supports-scenario-context.sdp.md | 13 + ...-unit-test-world-tracks-last-result.sdp.md | 13 + ...4-unit-test-world-tracks-last-error.sdp.md | 13 + ...-create-base-integration-test-world.sdp.md | 13 + ...-test-world-uses-custom-backend-url.sdp.md | 13 + ...on-test-world-defaults-to-localhost.sdp.md | 13 + ...reset-world-state-clears-all-fields.sdp.md | 13 + ...et-preserves-test-backend-reference.sdp.md | 13 + ...ojections-recommend-entity-strategy.sdp.md | 13 + ...rojections-return-simple-complexity.sdp.md | 13 + ...s-include-rationale-about-stream-id.sdp.md | 13 + ...-to-entity-when-all-flags-are-false.sdp.md | 13 + ...ojections-recommend-global-strategy.sdp.md | 13 + ...ojections-return-complex-complexity.sdp.md | 13 + ...clude-rationale-about-occ-conflicts.sdp.md | 13 + ...rategy-prioritizes-over-other-flags.sdp.md | 13 + ...projections-recommend-saga-strategy.sdp.md | 13 + ...ojections-return-complex-complexity.sdp.md | 13 + ...lude-rationale-about-correlation-id.sdp.md | 13 + ...rioritizes-over-customer-and-entity.sdp.md | 13 + ...ections-recommend-customer-strategy.sdp.md | 13 + ...jections-return-moderate-complexity.sdp.md | 13 + ...include-rationale-about-customer-id.sdp.md | 13 + ...er-strategy-prioritizes-over-entity.sdp.md | 13 + ...riority-global-saga-customer-entity.sdp.md | 13 + .../s-018-strategy-parallelism-values.sdp.md | 13 + ...recommended-parallelism-by-strategy.sdp.md | 13 + ...lobal-partition-key-has-name-global.sdp.md | 13 + ...obal-partition-key-has-value-global.sdp.md | 13 + ...y-uses-stream-type-stream-id-format.sdp.md | 13 + ...izes-stream-id-over-other-id-fields.sdp.md | 13 + ...y-falls-back-to-alternate-id-fields.sdp.md | 13 + ...ey-throws-when-no-id-field-provided.sdp.md | 13 + ...des-available-keys-in-error-message.sdp.md | 13 + ...-uses-provided-stream-type-in-value.sdp.md | 13 + ...r-partition-key-returns-customer-id.sdp.md | 13 + ...ition-key-ignores-additional-fields.sdp.md | 13 + ...hrows-when-customer-id-is-undefined.sdp.md | 13 + ...-throws-when-customer-id-is-missing.sdp.md | 13 + ...ws-when-customer-id-is-empty-string.sdp.md | 13 + ...artition-key-returns-correlation-id.sdp.md | 13 + ...ition-key-ignores-additional-fields.sdp.md | 13 + ...ws-when-correlation-id-is-undefined.sdp.md | 13 + ...rows-when-correlation-id-is-missing.sdp.md | 13 + ...when-correlation-id-is-empty-string.sdp.md | 13 + ...on-key-returns-global-partition-key.sdp.md | 13 + ...partition-key-ignores-any-arguments.sdp.md | 13 + ...ns-same-reference-on-multiple-calls.sdp.md | 13 + ...-022-dcb-partition-key-has-name-dcb.sdp.md | 13 + ...rtition-key-uses-scope-key-as-value.sdp.md | 13 + ...y-handles-various-scope-key-formats.sdp.md | 13 + ...t-for-config-with-get-partition-key.sdp.md | 13 + ...t-for-inline-partition-key-function.sdp.md | 13 + ...-projections-with-get-partition-key.sdp.md | 13 + ...d-projection-with-get-partition-key.sdp.md | 13 + ...error-for-missing-get-partition-key.sdp.md | 13 + ...6-includes-projection-name-in-error.sdp.md | 13 + ...s-007-includes-config-path-in-error.sdp.md | 13 + ...s-helper-functions-in-error-message.sdp.md | 13 + ...ition-key-shape-when-returning-null.sdp.md | 13 + ...key-shape-when-returning-wrong-type.sdp.md | 13 + ...rtition-key-shape-when-missing-name.sdp.md | 13 + ...tition-key-shape-when-missing-value.sdp.md | 13 + ...tion-key-shape-when-value-is-number.sdp.md | 13 + ...ty-partition-value-for-empty-string.sdp.md | 13 + ...on-value-for-whitespace-only-string.sdp.md | 13 + ...ollects-errors-from-all-projections.sdp.md | 13 + ...fig-paths-for-secondary-projections.sdp.md | 13 + ...t-config-path-for-failed-projection.sdp.md | 13 + ...s-not-throw-for-valid-configs-array.sdp.md | 13 + ...-020-does-not-throw-for-empty-array.sdp.md | 13 + ...-021-throws-on-first-invalid-config.sdp.md | 13 + ...cludes-all-errors-in-thrown-message.sdp.md | 13 + ...ludes-error-codes-in-thrown-message.sdp.md | 13 + ...ludes-config-path-in-thrown-message.sdp.md | 13 + ...-creates-output-with-correct-status.sdp.md | 13 + ...ss-includes-all-required-properties.sdp.md | 13 + ...reates-output-with-code-and-message.sdp.md | 13 + ...cted-includes-context-when-provided.sdp.md | 13 + ...reates-output-with-reason-and-event.sdp.md | 13 + ...iled-includes-context-when-provided.sdp.md | 13 + ...ess-returns-true-for-success-output.sdp.md | 13 + ...s-returns-false-for-rejected-output.sdp.md | 13 + ...ess-returns-false-for-failed-output.sdp.md | 13 + ...0-is-success-enables-type-narrowing.sdp.md | 13 + ...ed-returns-true-for-rejected-output.sdp.md | 13 + ...ed-returns-false-for-success-output.sdp.md | 13 + ...ted-returns-false-for-failed-output.sdp.md | 13 + ...-is-rejected-enables-type-narrowing.sdp.md | 13 + ...iled-returns-true-for-failed-output.sdp.md | 13 + ...ed-returns-false-for-success-output.sdp.md | 13 + ...d-returns-false-for-rejected-output.sdp.md | 13 + ...18-is-failed-enables-type-narrowing.sdp.md | 13 + ...-type-guards-are-mutually-exclusive.sdp.md | 13 + ...-created-with-correct-initial-state.sdp.md | 13 + ...s-002-valid-transitions-are-allowed.sdp.md | 13 + ...oes-not-throw-for-valid-transitions.sdp.md | 13 + ...04-invalid-transitions-are-detected.sdp.md | 13 + ...ition-error-for-invalid-transitions.sdp.md | 13 + ...nal-states-are-correctly-identified.sdp.md | 13 + ...sage-indicates-no-valid-transitions.sdp.md | 13 + ...state-validity-is-correctly-checked.sdp.md | 13 + ...itions-can-be-queried-for-any-state.sdp.md | 13 + ...ons-work-identically-to-fsm-methods.sdp.md | 13 + ...ssert-transition-throws-same-errors.sdp.md | 13 + ...-client-exposes-no-event-update-api.sdp.md | 13 + ...-client-exposes-no-event-delete-api.sdp.md | 13 + ...-to-a-new-stream-produces-version-1.sdp.md | 13 + ...nt-the-stream-version-monotonically.sdp.md | 13 + ...sition-is-unique-across-two-streams.sdp.md | 13 + ...eases-monotonically-within-a-stream.sdp.md | 13 + ...essful-append-with-matching-version.sdp.md | 13 + .../s-008-conflict-on-version-mismatch.sdp.md | 13 + ...-projection-resumes-from-checkpoint.sdp.md | 13 + ...tegory-supports-all-taxonomy-values.sdp.md | 13 + ...nt-input-requires-core-event-fields.sdp.md | 13 + ...ptional-category-and-schema-version.sdp.md | 13 + ...-metadata-with-correlation-tracking.sdp.md | 13 + ...ncludes-all-required-storage-fields.sdp.md | 13 + ...lt-success-includes-event-positions.sdp.md | 13 + ...t-conflict-includes-current-version.sdp.md | 13 + specs/unimplemented.pack.sdp.md | 156 +++++++++ specs/unimplemented/_epic.sdp.md | 12 + ...y-is-created-with-correct-structure.sdp.md | 13 + ...kward-compatibility-for-dlq-imports.sdp.md | 13 + .../s-003-get-dead-letter-statistics.sdp.md | 13 + ...004-bulk-retry-pending-dead-letters.sdp.md | 13 + .../s-005-trace-complete-event-flow.sdp.md | 13 + .../s-006-trace-shows-failure-point.sdp.md | 13 + ...em-state-provides-complete-overview.sdp.md | 13 + .../s-008-query-workpool-item-status.sdp.md | 13 + ...query-workflow-execution-with-steps.sdp.md | 13 + ...query-non-existent-durable-function.sdp.md | 13 + ...unauthenticated-request-is-rejected.sdp.md | 13 + .../s-012-non-admin-user-is-rejected.sdp.md | 13 + .../s-013-admin-action-is-logged.sdp.md | 13 + ...lays-failed-events-from-both-agents.sdp.md | 13 + ...ackend-mutation-with-toast-feedback.sdp.md | 13 + ...n-with-reason-provides-confirmation.sdp.md | 13 + ...04-replay-failure-shows-error-toast.sdp.md | 13 + .../s-005-filter-dead-letters-by-agent.sdp.md | 13 + ...ory-with-decisions-from-both-agents.sdp.md | 13 + ...07-filter-decision-history-by-agent.sdp.md | 13 + ...ter-decision-history-by-action-type.sdp.md | 13 + ...decision-detail-with-full-reasoning.sdp.md | 13 + ...sion-history-shows-guidance-message.sdp.md | 13 + ...-approve-action-shows-success-toast.sdp.md | 13 + ...2-reject-action-shows-success-toast.sdp.md | 13 + ...ction-shows-descriptive-error-toast.sdp.md | 13 + ...e-rapid-actions-show-stacked-toasts.sdp.md | 13 + ...tected-and-surfaces-as-vip-approval.sdp.md | 13 + ...-value-order-does-not-trigger-agent.sdp.md | 13 + ...roves-vip-flag-for-high-value-order.sdp.md | 13 + ...trigger-from-same-customer-activity.sdp.md | 13 + ...-dashboard-shows-both-active-agents.sdp.md | 13 + ...pprovals-count-includes-both-agents.sdp.md | 13 + .../s-021-one-agent-stopped-one-active.sdp.md | 13 + ...nent-registers-with-isolated-schema.sdp.md | 13 + ...-provides-full-crud-for-checkpoints.sdp.md | 13 + ...-access-is-not-possible-from-parent.sdp.md | 13 + ...-sub-transactions-provide-isolation.sdp.md | 13 + ...eceives-projection-data-as-argument.sdp.md | 13 + ...rojection-data-returns-empty-result.sdp.md | 13 + ...-access-app-level-projection-tables.sdp.md | 13 + ...access-agent-data-via-component-api.sdp.md | 13 + ...ugh-command-orchestrator-to-handler.sdp.md | 13 + ...e-is-rejected-with-validation-error.sdp.md | 13 + ...tency-prevents-duplicate-processing.sdp.md | 13 + ...-transitions-active-agent-to-paused.sdp.md | 13 + ...nt-resumes-from-checkpoint-position.sdp.md | 13 + ...id-lifecycle-transition-is-rejected.sdp.md | 13 + ...-configuration-without-losing-state.sdp.md | 13 + ...g-references-patterns-from-registry.sdp.md | 13 + ...pattern-trigger-for-cheap-detection.sdp.md | 13 + ...es-pattern-analyze-for-llm-analysis.sdp.md | 13 + ...ern-name-in-config-fails-validation.sdp.md | 13 + ...dler-calls-llm-and-returns-decision.sdp.md | 13 + ...tation-persists-decision-atomically.sdp.md | 13 + ...rejects-invalid-agent-configuration.sdp.md | 13 + ...rror-through-retries-to-dead-letter.sdp.md | 13 + ...riggers-dead-letter-via-on-complete.sdp.md | 13 + ...miter-allows-llm-call-within-limits.sdp.md | 13 + ...miter-blocks-llm-call-when-exceeded.sdp.md | 13 + ...8-cost-budget-exceeded-pauses-agent.sdp.md | 13 + ...queue-overflow-triggers-dead-letter.sdp.md | 13 + ...plete-receives-completion-callbacks.sdp.md | 13 + ...create-dead-letters-via-on-complete.sdp.md | 13 + ...out-on-complete-uses-global-default.sdp.md | 13 + ...1-circuit-remains-closed-on-success.sdp.md | 13 + ...cuit-opens-after-threshold-failures.sdp.md | 13 + ...nsitions-to-half-open-after-timeout.sdp.md | 13 + ...004-successful-probe-closes-circuit.sdp.md | 13 + .../s-005-failed-probe-reopens-circuit.sdp.md | 13 + ...tate-persists-across-function-calls.sdp.md | 13 + ...existent-circuit-defaults-to-closed.sdp.md | 13 + ...meout-transitions-open-to-half-open.sdp.md | 13 + .../s-009-stale-timeout-is-ignored.sdp.md | 13 + ...pen-probe-closes-circuit-on-success.sdp.md | 13 + ...en-probe-reopens-circuit-on-failure.sdp.md | 13 + ...2-open-circuit-returns-fast-failure.sdp.md | 13 + ...ment-circuit-opens-after-3-failures.sdp.md | 13 + ...ail-circuit-tolerates-more-failures.sdp.md | 13 + ...-services-have-independent-circuits.sdp.md | 13 + ...-reference-at-standard-detail-level.sdp.md | 13 + ...d-reference-at-summary-detail-level.sdp.md | 13 + ...03-extract-conventions-by-tag-value.sdp.md | 13 + ...tent-preserves-rule-block-structure.sdp.md | 13 + ...ions-found-for-requested-tag-values.sdp.md | 13 + ...ources-match-any-pattern-file-paths.sdp.md | 13 + ...g-matches-multiple-decision-records.sdp.md | 13 + .../s-008-dual-output-generation.sdp.md | 13 + .../s-009-summary-compaction-quality.sdp.md | 13 + ...appear-in-available-generators-list.sdp.md | 13 + ...invocation-generates-reference-docs.sdp.md | 13 + ...ntion-tag-is-registered-in-taxonomy.sdp.md | 13 + ...ontent-preserved-in-decision-record.sdp.md | 13 + ...ion-is-not-split-by-mutation-family.sdp.md | 13 + ...forged-proof-is-rejected-by-default.sdp.md | 13 + .../s-001-cancel-a-confirmed-order.sdp.md | 13 + ...-cancelled-order-unchanged-behavior.sdp.md | 13 + ...volves-confirmed-state-to-cancelled.sdp.md | 13 + ...-after-confirmed-order-cancellation.sdp.md | 13 + ...oes-not-trigger-reservation-release.sdp.md | 13 + ...ith-pending-reservation-releases-it.sdp.md | 13 + ...or-duplicate-order-cancelled-events.sdp.md | 13 + ...cellations-trigger-churn-risk-agent.sdp.md | 13 + ...-same-email-produces-same-stream-id.sdp.md | 13 + ...posite-key-produces-consistent-hash.sdp.md | 13 + ...mails-produce-different-stream-i-ds.sdp.md | 13 + .../s-004-first-create-succeeds.sdp.md | 13 + ...5-second-create-fails-with-conflict.sdp.md | 13 + ...urrent-creates-exactly-one-succeeds.sdp.md | 13 + .../s-007-hash-output-is-url-safe.sdp.md | 13 + .../s-008-hash-is-not-reversible.sdp.md | 13 + ...s-009-pattern-selection-by-use-case.sdp.md | 13 + ...-can-evolve-independently-of-phases.sdp.md | 13 + ...-phase-files-link-specs-to-releases.sdp.md | 13 + ...starts-from-decisions-and-inventory.sdp.md | 13 + ...oint-formats-are-handled-explicitly.sdp.md | 13 + ...urns-healthy-when-all-components-ok.sdp.md | 13 + ...returns-unhealthy-on-projection-lag.sdp.md | 13 + ...liveness-probe-always-returns-alive.sdp.md | 13 + ...04-workpool-backlog-fails-readiness.sdp.md | 13 + ...normal-queue-depth-passes-readiness.sdp.md | 13 + ...jection-lag-is-calculated-correctly.sdp.md | 13 + ...g-checkpoint-treated-as-maximum-lag.sdp.md | 13 + .../s-008-zero-lag-is-healthy.sdp.md | 13 + ...s-collection-gathers-all-dimensions.sdp.md | 13 + ...ics-emitted-as-json-for-log-streams.sdp.md | 13 + ...rics-collection-handles-empty-state.sdp.md | 13 + ...nents-healthy-yields-healthy-system.sdp.md | 13 + ...hy-component-makes-system-unhealthy.sdp.md | 13 + ...ed-component-yields-degraded-system.sdp.md | 13 + ...s-001-context-map-shows-bc-topology.sdp.md | 13 + ...2-register-partnership-relationship.sdp.md | 13 + ...register-shared-kernel-relationship.sdp.md | 13 + ...ster-open-host-service-relationship.sdp.md | 13 + ...-duplicate-relationship-is-rejected.sdp.md | 13 + ...eferential-relationship-is-rejected.sdp.md | 13 + ...ation-event-uses-published-language.sdp.md | 13 + ...8-event-tagging-for-routing-and-dcb.sdp.md | 13 + ...hema-compatibility-mode-is-enforced.sdp.md | 13 + ...ster-schema-with-compatibility-mode.sdp.md | 13 + ...istered-event-type-fails-conversion.sdp.md | 13 + ...lid-payload-fails-schema-validation.sdp.md | 13 + ...translates-external-system-response.sdp.md | 13 + ...l-handles-bidirectional-translation.sdp.md | 13 + .../s-015-acl-validates-external-input.sdp.md | 13 + .../s-016-acl-rejects-unmapped-values.sdp.md | 13 + ...s-001-v1-consumer-receives-v2-event.sdp.md | 13 + .../s-002-upcast-historical-events.sdp.md | 13 + ...casters-for-multi-version-migration.sdp.md | 13 + .../s-004-upcast-adds-computed-field.sdp.md | 13 + ...ompatible-schema-change-is-rejected.sdp.md | 13 + ...6-breaking-change-without-migration.sdp.md | 13 + ...test-validates-schema-compatibility.sdp.md | 13 + .../s-008-contract-sample-generation.sdp.md | 13 + ...09-generate-multiple-unique-samples.sdp.md | 13 + ...-010-producer-contract-test-utility.sdp.md | 13 + ...-011-consumer-contract-test-utility.sdp.md | 13 + ...ible-producer-and-consumer-verified.sdp.md | 13 + .../s-013-compatible-with-downcaster.sdp.md | 13 + ...4-detect-producer-consumer-mismatch.sdp.md | 13 + ...-015-contract-violation-is-recorded.sdp.md | 13 + ...6-contract-violations-are-queryable.sdp.md | 13 + ...01-platform-fsm-has-no-dependencies.sdp.md | 13 + ...ecider-depends-only-on-platform-fsm.sdp.md | 13 + ...der-package-is-independently-usable.sdp.md | 13 + ...kages-are-independently-publishable.sdp.md | 13 + ...rk-tests-live-in-framework-packages.sdp.md | 13 + ...6-existing-imports-continue-to-work.sdp.md | 13 + ...platform-namespace-avoids-conflicts.sdp.md | 13 + ...rs-appear-in-generated-decisions-md.sdp.md | 13 + ...g-is-independent-from-package-ad-rs.sdp.md | 13 + ...-001-minimal-release-file-structure.sdp.md | 13 + ...002-pdr-tagged-with-release-version.sdp.md | 13 + ...elog-generation-from-scattered-tags.sdp.md | 13 + ...ype-script-phase-files-are-separate.sdp.md | 13 + ...2-spec-files-use-semantic-tags-only.sdp.md | 13 + ...iles-centralize-release-information.sdp.md | 13 + ...-can-evolve-independently-of-phases.sdp.md | 13 + ...ease-references-in-spec-data-tables.sdp.md | 13 + ...hase-files-support-process-metadata.sdp.md | 13 + ...e-files-support-dependency-tracking.sdp.md | 13 + ...-all-metadata-uses-architect-prefix.sdp.md | 13 + .../s-002-bdd-tags-remain-unprefixed.sdp.md | 13 + ...-deprecated-prefix-during-migration.sdp.md | 13 + ...1-compiler-enforces-taxonomy-values.sdp.md | 13 + ...s-derive-from-type-script-constants.sdp.md | 13 + ...-builder-creates-valid-tag-registry.sdp.md | 13 + ...s-004-type-inference-from-constants.sdp.md | 13 + .../s-001-roadmap-spec-structure.sdp.md | 13 + .../s-002-package-spec-structure.sdp.md | 13 + ...03-linking-roadmap-to-package-specs.sdp.md | 13 + ...-004-completed-pattern-roadmap-spec.sdp.md | 13 + ...ve-pattern-with-acceptance-criteria.sdp.md | 13 + ...ing-a-platform-demonstration-change.sdp.md | 13 + ...valuating-a-business-feature-change.sdp.md | 13 + ...-003-evaluating-an-uncertain-change.sdp.md | 13 + ...oduces-decision-specs-not-documents.sdp.md | 13 + ...-design-session-produces-code-stubs.sdp.md | 13 + ...003-stub-file-has-target-annotation.sdp.md | 13 + ...ubs-use-pattern-based-folder-naming.sdp.md | 13 + ...ssion-decision-uses-design-category.sdp.md | 13 + ...eceives-projection-data-as-argument.sdp.md | 13 + ...external-data-is-handled-gracefully.sdp.md | 13 + ...jected-data-interface-is-extensible.sdp.md | 13 + ...rforms-analysis-without-persistence.sdp.md | 13 + ...tation-persists-decision-atomically.sdp.md | 13 + ...e-falls-back-to-rule-based-analysis.sdp.md | 13 + ...riggers-dead-letter-via-on-complete.sdp.md | 13 + ...ces-checkpoint-without-side-effects.sdp.md | 13 + ...ion-subscription-via-enqueue-action.sdp.md | 13 + ...tion-subscriptions-remain-unchanged.sdp.md | 13 + ...uires-on-complete-at-the-type-level.sdp.md | 13 + ...sequential-events-process-correctly.sdp.md | 13 + ...ntity-are-serialized-at-on-complete.sdp.md | 13 + ...rocessed-event-is-skipped-in-action.sdp.md | 13 + ...-on-complete-failure-replays-safely.sdp.md | 13 + ...iption-specific-pool-when-available.sdp.md | 13 + ...ough-orchestrator-to-domain-handler.sdp.md | 13 + ...mmand-type-fails-with-routing-error.sdp.md | 13 + ...by-command-orchestrator-idempotency.sdp.md | 13 + ...gger-for-cheap-detection-before-llm.sdp.md | 13 + ...s-analyze-for-llm-powered-detection.sdp.md | 13 + ...id-lifecycle-transition-is-rejected.sdp.md | 13 + ...nt-works-from-any-non-stopped-state.sdp.md | 13 + ...-transitions-active-agent-to-paused.sdp.md | 13 + ...nt-resumes-from-checkpoint-position.sdp.md | 13 + ...-configuration-without-losing-state.sdp.md | 13 + ...egitimate-component-boundary-action.sdp.md | 13 + ...-proof-is-rejected-before-any-write.sdp.md | 13 + ...ation-family-migrates-in-one-packet.sdp.md | 13 + ...rictly-monotonic-at-real-timestamps.sdp.md | 13 + ...nts-are-read-safely-by-the-new-code.sdp.md | 13 + ...nger-share-the-primary-projection-p.sdp.md | 13 + ...existent-workpool-ordering-behavior.sdp.md | 13 + ...e-chooses-the-low-blast-radius-path.sdp.md | 13 + ...age-splits-are-not-silently-started.sdp.md | 13 + ...zes-the-non-split-contract-surfaces.sdp.md | 13 + ...-tranche-3-non-split-boundary-rules.sdp.md | 13 + ...-returns-the-original-append-result.sdp.md | 13 + ...ent-payload-is-rejected-and-audited.sdp.md | 13 + ...d-cap-passes-the-component-boundary.sdp.md | 13 + ...load-is-rejected-before-persistence.sdp.md | 13 + ...uses-the-replacement-compound-index.sdp.md | 13 + ...sent-after-the-audit-driven-cleanup.sdp.md | 13 + ...cy-decision-rather-than-a-package-r.sdp.md | 13 + ...pen-the-deferred-platform-core-spli.sdp.md | 13 + ...across-roadmap-and-decision-sources.sdp.md | 13 + ...mes-identify-carrier-artifacts-only.sdp.md | 13 + ...lements-carries-the-continuity-edge.sdp.md | 13 + ...c-pattern-without-undoing-the-whole.sdp.md | 13 + ...-enforcement-in-the-normal-ci-lanes.sdp.md | 13 + .../s-001-projection-lag-is-tracked.sdp.md | 13 + ...lection-handles-missing-checkpoints.sdp.md | 13 + ...ce-spans-command-to-projection-flow.sdp.md | 13 + ...-missing-trace-context-uses-default.sdp.md | 13 + ...readiness-probe-checks-dependencies.sdp.md | 13 + ...nhealthy-dependency-fails-readiness.sdp.md | 13 + ...-007-liveness-probe-always-succeeds.sdp.md | 13 + ...08-workpool-backlog-fails-readiness.sdp.md | 13 + ...rcuit-opens-after-repeated-failures.sdp.md | 13 + ...nsitions-to-half-open-after-timeout.sdp.md | 13 + ...ul-half-open-request-closes-circuit.sdp.md | 13 + ...d-half-open-request-reopens-circuit.sdp.md | 13 + ...jection-rebuild-re-processes-events.sdp.md | 13 + ...dead-letter-retry-re-enqueues-event.sdp.md | 13 + ...ent-flow-trace-returns-full-history.sdp.md | 13 + ...16-durable-function-run-diagnostics.sdp.md | 13 + ...-action-retrier-for-half-open-probe.sdp.md | 13 + ...-reopens-circuit-via-action-retrier.sdp.md | 13 + ...s-action-retrier-for-external-calls.sdp.md | 13 + ...dlq-retry-returns-to-pending-status.sdp.md | 13 + ...ction-calls-propagate-trace-context.sdp.md | 13 + ...io-with-doc-string-for-rich-content.sdp.md | 13 + ...with-data-table-for-structured-data.sdp.md | 13 + ...3-simple-scenario-under-second-rule.sdp.md | 13 + .../s-004-scenario-with-examples-table.sdp.md | 13 + ...1-generate-themed-decision-document.sdp.md | 13 + .../s-002-theme-tag-in-decision-file.sdp.md | 13 + ...003-adr-with-dependency-declaration.sdp.md | 13 + .../s-004-generate-dependency-graph.sdp.md | 13 + ...layer-information-in-generated-docs.sdp.md | 13 + ...adr-from-old-format-to-feature-file.sdp.md | 13 + ...eview-for-validity-during-migration.sdp.md | 13 + ...008-generate-all-decision-artifacts.sdp.md | 13 + ...ist-before-tranche-1-implementation.sdp.md | 13 + ...lidation-remains-machine-verifiable.sdp.md | 13 + ...elease-governance-points-to-pdr-002.sdp.md | 13 + ...architect-guard-and-docs-generation.sdp.md | 13 + ...p-does-not-bypass-the-auth-keystone.sdp.md | 13 + ...-gaps-fail-closed-after-remediation.sdp.md | 13 + ...0-codec-driven-reference-generation.sdp.md | 13 + ...se-100-themed-decision-architecture.sdp.md | 13 + ...jection-categories-executable-tests.sdp.md | 13 + ...ed-context-ai-driven-event-reactors.sdp.md | 13 + .../phase-22-agent-as-bounded-context.sdp.md | 13 + ...hase-22-agent-churn-risk-completion.sdp.md | 13 + ...ase-22-confirmed-order-cancellation.sdp.md | 13 + .../d-001-create-admin-directory.sdp.md | 13 + .../d-002-projection-admin-endpoints.sdp.md | 13 + .../d-003-refactored-dlq-endpoints.sdp.md | 13 + .../d-004-event-flow-trace-query.sdp.md | 13 + .../d-005-system-state-snapshot-query.sdp.md | 13 + .../d-006-durable-function-run-queries.sdp.md | 13 + .../d-007-admin-authorization-wrapper.sdp.md | 13 + .../d-008-admin-api-documentation.sdp.md | 13 + .../d-001-high-value-agent-config.sdp.md | 13 + ...d-002-high-value-pattern-definition.sdp.md | 13 + .../d-003-high-value-action-handler.sdp.md | 13 + ...-004-high-value-on-complete-handler.sdp.md | 13 + .../d-005-high-value-command-route.sdp.md | 13 + ...6-high-value-event-bus-subscription.sdp.md | 13 + ...igh-value-integration-test-real-llm.sdp.md | 13 + ...er-management-section-in-monitoring.sdp.md | 13 + .../d-009-use-dead-letters-hook.sdp.md | 13 + .../d-010-use-dead-letter-actions-hook.sdp.md | 13 + .../d-011-decision-history-tab.sdp.md | 13 + ...-decision-history-hook-with-filters.sdp.md | 13 + ...ast-notification-integration-sonner.sdp.md | 13 + .../d-014-action-feedback-toasts.sdp.md | 13 + ...15-dashboard-update-for-multi-agent.sdp.md | 13 + .../d-016-e2-e-step-definitions.sdp.md | 13 + .../d-017-agent-admin-page-page-object.sdp.md | 13 + ...mplemented-agent-e2e-scenarios-skip.sdp.md | 13 + ...-019-auth-integration-documentation.sdp.md | 13 + .../d-001-agent-component-definition.sdp.md | 13 + .../d-002-agent-component-schema.sdp.md | 13 + .../d-003-checkpoint-public-api.sdp.md | 13 + .../d-004-audit-public-api.sdp.md | 13 + .../d-005-dead-letter-public-api.sdp.md | 13 + .../d-006-command-public-api.sdp.md | 13 + .../d-007-approval-public-api.sdp.md | 13 + ...d-008-cross-component-query-pattern.sdp.md | 13 + .../d-001-agent-action-handler-factory.sdp.md | 13 + ...-llm-integrated-on-complete-handler.sdp.md | 13 + .../d-003-rate-limiter-integration.sdp.md | 13 + .../d-004-cost-budget-tracking.sdp.md | 13 + ...005-convex-dev-agent-thread-adapter.sdp.md | 13 + ...n-create-agent-subscription-options.sdp.md | 13 + .../d-007-circuit-breaker-for-llm.sdp.md | 13 + .../d-008-agent-workpool-configuration.sdp.md | 13 + ...09-action-mutation-integration-test.sdp.md | 13 + ...-circuit-breaker-state-machine-pure.sdp.md | 13 + .../d-002-circuit-breaker-types.sdp.md | 13 + ...d-003-circuit-breakers-table-schema.sdp.md | 13 + .../d-004-with-circuit-breaker-wrapper.sdp.md | 13 + .../d-005-load-circuit-state-query.sdp.md | 13 + .../d-006-record-success-mutation.sdp.md | 13 + .../d-007-record-failure-mutation.sdp.md | 13 + ...-check-half-open-scheduled-mutation.sdp.md | 13 + ...9-on-circuit-probe-complete-handler.sdp.md | 13 + .../d-010-circuit-breaker-metrics.sdp.md | 13 + .../d-001-pdr-014-placeholder.sdp.md | 13 + ...nonical-verification-proof-contract.sdp.md | 13 + .../d-003-verify-actor-helper.sdp.md | 13 + ...identity-bearing-mutation-migration.sdp.md | 13 + ...-tagging-for-system-only-exceptions.sdp.md | 13 + ...ent-boundary-auth-integration-suite.sdp.md | 13 + ...01-deterministic-stream-id-function.sdp.md | 13 + .../d-002-hash-algorithm-selection.sdp.md | 13 + .../d-003-conflict-error-handling.sdp.md | 13 + .../d-004-pattern-documentation.sdp.md | 13 + ...-global-position-consumer-inventory.sdp.md | 13 + .../d-002-pdr-018-placeholder.sdp.md | 13 + .../d-003-pdr-015-placeholder.sdp.md | 13 + ...end-to-stream-idempotency-migration.sdp.md | 13 + ...ntation-migration-and-compat-reader.sdp.md | 13 + ...-canonical-pm-transition-map-parity.sdp.md | 13 + ...event-correctness-integration-suite.sdp.md | 13 + .../d-001-health-check-types.sdp.md | 13 + .../d-002-check-readiness-query.sdp.md | 13 + .../d-003-check-liveness-query.sdp.md | 13 + ...-004-http-router-with-health-routes.sdp.md | 13 + .../d-005-metrics-types.sdp.md | 13 + .../d-006-metrics-collector.sdp.md | 13 + .../d-007-projection-lag-calculator.sdp.md | 13 + .../d-008-workpool-depth-query.sdp.md | 13 + .../d-009-system-health-aggregator.sdp.md | 13 + .../d-001-context-map-registry.sdp.md | 13 + .../d-002-context-map-documentation.sdp.md | 13 + .../d-003-published-language-registry.sdp.md | 13 + ...004-to-published-language-converter.sdp.md | 13 + .../d-005-acl-builder-enhancement.sdp.md | 13 + ...ntegration-event-metadata-extension.sdp.md | 13 + .../d-001-upcaster-implementation.sdp.md | 13 + .../d-002-downcaster-implementation.sdp.md | 13 + .../d-003-migration-path-validation.sdp.md | 13 + .../d-004-contract-sample-generation.sdp.md | 13 + .../d-005-producer-contract-tests.sdp.md | 13 + .../d-006-consumer-contract-tests.sdp.md | 13 + .../d-007-compatibility-verification.sdp.md | 13 + .../d-008-contract-violation-detection.sdp.md | 13 + .../d-001-metrics-collection-types.sdp.md | 13 + .../d-002-metrics-collector.sdp.md | 13 + .../d-003-health-check-queries.sdp.md | 13 + .../d-004-health-http-router.sdp.md | 13 + ...-005-circuit-breaker-implementation.sdp.md | 13 + .../d-006-admin-projection-endpoints.sdp.md | 13 + .../d-007-admin-dlq-endpoints.sdp.md | 13 + .../d-008-admin-diagnostics.sdp.md | 13 + ...09-durable-function-run-diagnostics.sdp.md | 13 + .../d-010-contract-violation-types.sdp.md | 13 + .../d-011-grafana-dashboard-templates.sdp.md | 13 + .../d-012-runbook-documentation.sdp.md | 13 + ...circuit-breaker-retrier-integration.sdp.md | 13 + .../d-014-dlq-action-retrier-pattern.sdp.md | 13 + ...015-durable-function-decision-guide.sdp.md | 13 + .../d-001-demo-item-1.sdp.md | 13 + ...d-001-add-adr-theme-tag-to-registry.sdp.md | 13 + ...02-theme-grouped-decision-generator.sdp.md | 13 + .../d-003-dependency-graph-generator.sdp.md | 13 + .../d-004-adr-migration-scripts.sdp.md | 13 + ...005-review-and-port-33-active-ad-rs.sdp.md | 13 + .../d-001-dependency-delta-memo.sdp.md | 13 + ...2-store-backend-integration-harness.sdp.md | 13 + ...003-bus-backend-integration-harness.sdp.md | 13 + ...pecheck-and-vitest-config-alignment.sdp.md | 13 + ...005-strict-ts-and-es-lint-hardening.sdp.md | 13 + ...ation-aligned-to-architect-releases.sdp.md | 13 + .../d-002-dependency-scanning-in-ci.sdp.md | 13 + ...tract-status-convention-and-linting.sdp.md | 13 + .../d-004-convex-es-rename-guard.sdp.md | 13 + ...05-docs-process-validation-workflow.sdp.md | 13 + ...ensure-test-environment-fail-closed.sdp.md | 13 + ...n-id-required-at-validator-boundary.sdp.md | 13 + ...ength-uui-dv7-helper-centralization.sdp.md | 13 + ...uthorization-default-deny-migration.sdp.md | 13 + ...05-approval-expiration-ordering-fix.sdp.md | 13 + ...ifecycle-stubs-throw-or-are-removed.sdp.md | 13 + ...tore-dependency-decision-guardrails.sdp.md | 13 + ...se-100-themed-decision-architecture.sdp.md | 13 + .../phase-18-production-hardening.sdp.md | 13 + ...e-18-workpool-partitioning-strategy.sdp.md | 13 + .../phase-20-reservation-pattern.sdp.md | 13 + .../phase-21-integration-patterns-21b.sdp.md | 13 + ...ed-context-ai-driven-event-reactors.sdp.md | 13 + .../phase-22-agent-as-bounded-context.sdp.md | 13 + ...hase-22-agent-churn-risk-completion.sdp.md | 13 + ...ase-22-confirmed-order-cancellation.sdp.md | 13 + test/sdp-migration-guard.test.ts | 9 +- 3616 files changed, 47452 insertions(+), 4 deletions(-) create mode 100644 scripts/migrate-scenarios-and-unimplemented.mjs create mode 100644 specs/behavior/frontend/admin/add-stock.examples/s-001-add-stock-successfully.sdp.md create mode 100644 specs/behavior/frontend/admin/add-stock.examples/s-002-add-stock-with-reason.sdp.md create mode 100644 specs/behavior/frontend/admin/add-stock.examples/s-003-cannot-add-stock-without-selecting-product.sdp.md create mode 100644 specs/behavior/frontend/admin/add-stock.examples/s-004-cannot-add-zero-quantity.sdp.md create mode 100644 specs/behavior/frontend/admin/add-stock.examples/s-005-cannot-add-stock-without-quantity.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-001-view-agents-dashboard-with-pending-approvals.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-002-view-agents-dashboard-with-no-pending-approvals.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-003-navigate-to-approval-detail-from-dashboard.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-004-view-approval-list-with-pending-approvals.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-005-filter-approvals-by-status.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-006-click-approval-card-to-navigate-to-detail.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-007-view-pending-approval-detail.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-008-view-already-approved-approval.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-009-view-already-rejected-approval.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-010-view-expired-approval.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-011-confidence-conveyed-via-text-label-wcag-1-4-1.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-012-approve-pending-action-with-note.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-013-reject-pending-action-with-note.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-014-approve-without-note.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-015-error-during-approve-action.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-016-cannot-act-on-expired-approvals.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-017-view-active-agents-in-monitoring-tab.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-018-view-agent-checkpoint-details.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-019-no-active-agents.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-020-view-agent-decision-history.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-021-view-decision-detail-with-reasoning.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-022-empty-decision-history.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-023-view-customers-approaching-churn-threshold.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-024-customer-risk-progress-indicator.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-025-no-customers-approaching-threshold.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-026-navigate-to-low-stock-restock-approval-detail.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-027-view-low-stock-alert-approval-with-product-context.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-028-approve-low-stock-restock-suggestion.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-029-reject-low-stock-restock-suggestion.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-030-navigate-to-high-value-order-vip-review-approval-detail.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-031-view-high-value-order-approval-with-order-context.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-032-approve-vip-review-for-high-value-order.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-033-reject-vip-review-flag.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-034-navigate-to-order-consolidation-suggestion-approval-detail.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-035-view-order-consolidation-approval-with-order-list.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-036-approve-order-consolidation-suggestion.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-037-reject-order-consolidation-suggestion.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-038-view-decision-history-filtered-by-agent-type.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-039-view-low-stock-agent-decision-in-history.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-040-view-high-value-order-agent-decision-in-history.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-041-view-order-consolidation-agent-decision-in-history.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-042-view-products-approaching-low-stock-threshold.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-043-stock-level-progress-indicator.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-044-approval-card-is-keyboard-accessible.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-045-screen-reader-announces-action-status-changes.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-046-confidence-level-conveyed-via-text-not-just-color.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-047-focus-trap-in-action-buttons.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-048-handle-approval-not-found.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-049-handle-network-error-loading-approvals.sdp.md create mode 100644 specs/behavior/frontend/admin/agent-approvals.examples/s-050-route-level-error-boundary.sdp.md create mode 100644 specs/behavior/frontend/admin/create-product.examples/s-001-create-product-successfully.sdp.md create mode 100644 specs/behavior/frontend/admin/create-product.examples/s-002-validation-errors-on-empty-form.sdp.md create mode 100644 specs/behavior/frontend/admin/create-product.examples/s-003-invalid-sku-format.sdp.md create mode 100644 specs/behavior/frontend/admin/create-product.examples/s-004-invalid-price-zero-value.sdp.md create mode 100644 specs/behavior/frontend/admin/create-product.examples/s-005-invalid-price-exceeds-maximum.sdp.md create mode 100644 specs/behavior/frontend/dashboard/dashboard.examples/s-001-view-dashboard-stats.sdp.md create mode 100644 specs/behavior/frontend/dashboard/dashboard.examples/s-002-show-low-stock-warning.sdp.md create mode 100644 specs/behavior/frontend/dashboard/dashboard.examples/s-003-quick-action-navigates-to-create-order.sdp.md create mode 100644 specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-001-complete-flow-product-creation-to-order-confirmation.sdp.md create mode 100644 specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-002-order-fails-due-to-insufficient-stock-saga-compensation.sdp.md create mode 100644 specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-003-order-with-multiple-items.sdp.md create mode 100644 specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-004-multi-product-order-rejected-atomically-when-one-product-lacks-stock-dcb.sdp.md create mode 100644 specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-005-full-agent-trigger-journey-churn-risk-detection.sdp.md create mode 100644 specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-006-full-agent-trigger-journey-low-stock-alert-detection.sdp.md create mode 100644 specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-007-full-agent-trigger-journey-high-value-order-detection.sdp.md create mode 100644 specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-008-full-agent-trigger-journey-order-consolidation-suggestion.sdp.md create mode 100644 specs/behavior/frontend/orders/create-order.examples/s-001-create-and-submit-order-successfully.sdp.md create mode 100644 specs/behavior/frontend/orders/create-order.examples/s-002-cannot-submit-empty-cart.sdp.md create mode 100644 specs/behavior/frontend/orders/create-order.examples/s-003-update-quantity-in-cart.sdp.md create mode 100644 specs/behavior/frontend/orders/create-order.examples/s-004-remove-item-from-cart.sdp.md create mode 100644 specs/behavior/frontend/orders/order-detail.examples/s-001-view-confirmed-order.sdp.md create mode 100644 specs/behavior/frontend/orders/order-detail.examples/s-002-view-cancelled-order.sdp.md create mode 100644 specs/behavior/frontend/orders/order-detail.examples/s-003-order-detail-shows-instant-status-updates-via-reactive-projection.sdp.md create mode 100644 specs/behavior/frontend/orders/order-detail.examples/s-004-cancel-a-submitted-order.sdp.md create mode 100644 specs/behavior/frontend/orders/order-detail.examples/s-005-cancel-button-appears-only-for-cancellable-statuses.sdp.md create mode 100644 specs/behavior/frontend/orders/order-detail.examples/s-006-cancel-confirmation-dialog-prevents-accidental-cancellation.sdp.md create mode 100644 specs/behavior/frontend/orders/view-orders.examples/s-001-view-all-orders.sdp.md create mode 100644 specs/behavior/frontend/orders/view-orders.examples/s-002-navigate-to-create-order.sdp.md create mode 100644 specs/behavior/frontend/products/browse-products.examples/s-001-view-products-with-stock-levels.sdp.md create mode 100644 specs/behavior/frontend/products/browse-products.examples/s-002-loading-state.sdp.md create mode 100644 specs/behavior/order-management/agent/on-complete.examples/s-001-no-dead-letter-on-success.sdp.md create mode 100644 specs/behavior/order-management/agent/on-complete.examples/s-002-no-dead-letter-on-canceled.sdp.md create mode 100644 specs/behavior/order-management/agent/on-complete.examples/s-003-creates-dead-letter-on-failure.sdp.md create mode 100644 specs/behavior/order-management/agent/on-complete.examples/s-004-increments-attempt-count-on-repeated-failure.sdp.md create mode 100644 specs/behavior/order-management/agent/on-complete.examples/s-005-does-not-update-dead-letter-in-terminal-state.sdp.md create mode 100644 specs/behavior/order-management/agent/on-complete.examples/s-006-cron-expires-approval-after-timeout.sdp.md create mode 100644 specs/behavior/order-management/agent/on-complete.examples/s-007-expired-approval-cannot-be-approved.sdp.md create mode 100644 specs/behavior/order-management/agent/on-complete.examples/s-008-suggest-customer-outreach-creates-outreach-record-and-emits-event.sdp.md create mode 100644 specs/behavior/order-management/deciders/add-order-item-decider.examples/s-001-decide-to-add-item-to-draft-order.sdp.md create mode 100644 specs/behavior/order-management/deciders/add-order-item-decider.examples/s-002-reject-add-item-when-order-is-not-in-draft.sdp.md create mode 100644 specs/behavior/order-management/deciders/add-order-item-decider.examples/s-003-reject-add-item-with-invalid-quantity.sdp.md create mode 100644 specs/behavior/order-management/deciders/add-order-item-decider.examples/s-004-accumulate-items-and-recalculate-total.sdp.md create mode 100644 specs/behavior/order-management/deciders/add-stock-decider.examples/s-001-decide-to-add-stock-to-product.sdp.md create mode 100644 specs/behavior/order-management/deciders/add-stock-decider.examples/s-002-add-stock-with-reason.sdp.md create mode 100644 specs/behavior/order-management/deciders/add-stock-decider.examples/s-003-reject-add-stock-with-zero-quantity.sdp.md create mode 100644 specs/behavior/order-management/deciders/add-stock-decider.examples/s-004-reject-add-stock-with-negative-quantity.sdp.md create mode 100644 specs/behavior/order-management/deciders/cancel-order-decider.examples/s-001-decide-to-cancel-a-draft-order.sdp.md create mode 100644 specs/behavior/order-management/deciders/cancel-order-decider.examples/s-002-decide-to-cancel-a-submitted-order.sdp.md create mode 100644 specs/behavior/order-management/deciders/cancel-order-decider.examples/s-003-decide-to-cancel-a-confirmed-order.sdp.md create mode 100644 specs/behavior/order-management/deciders/cancel-order-decider.examples/s-004-reject-cancel-for-already-cancelled-order.sdp.md create mode 100644 specs/behavior/order-management/deciders/confirm-order-decider.examples/s-001-decide-to-confirm-a-submitted-order.sdp.md create mode 100644 specs/behavior/order-management/deciders/confirm-order-decider.examples/s-002-reject-confirm-for-order-in-draft-status.sdp.md create mode 100644 specs/behavior/order-management/deciders/confirm-order-decider.examples/s-003-reject-confirm-for-already-confirmed-order.sdp.md create mode 100644 specs/behavior/order-management/deciders/confirm-order-decider.examples/s-004-reject-confirm-for-cancelled-order.sdp.md create mode 100644 specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-001-decide-to-confirm-a-pending-reservation.sdp.md create mode 100644 specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-002-reject-confirm-when-reservation-is-already-confirmed.sdp.md create mode 100644 specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-003-reject-confirm-when-reservation-is-released.sdp.md create mode 100644 specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-004-reject-confirm-when-reservation-is-expired.sdp.md create mode 100644 specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-005-reject-confirm-when-reservation-has-passed-its-expiration-time.sdp.md create mode 100644 specs/behavior/order-management/deciders/create-order-decider.examples/s-001-decide-to-create-a-new-order-when-none-exists.sdp.md create mode 100644 specs/behavior/order-management/deciders/create-order-decider.examples/s-002-reject-create-when-order-already-exists.sdp.md create mode 100644 specs/behavior/order-management/deciders/create-product-decider.examples/s-001-decide-to-create-a-new-product-when-none-exists.sdp.md create mode 100644 specs/behavior/order-management/deciders/create-product-decider.examples/s-002-reject-create-when-product-already-exists.sdp.md create mode 100644 specs/behavior/order-management/deciders/create-product-decider.examples/s-003-reject-create-with-empty-product-name.sdp.md create mode 100644 specs/behavior/order-management/deciders/create-product-decider.examples/s-004-reject-create-with-empty-sku.sdp.md create mode 100644 specs/behavior/order-management/deciders/create-product-decider.examples/s-005-reject-create-with-zero-price.sdp.md create mode 100644 specs/behavior/order-management/deciders/create-product-decider.examples/s-006-reject-create-with-negative-price.sdp.md create mode 100644 specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-001-decide-to-expire-a-pending-reservation-that-has-timed-out.sdp.md create mode 100644 specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-002-reject-expire-when-reservation-has-not-timed-out-yet.sdp.md create mode 100644 specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-003-reject-expire-when-reservation-is-already-confirmed.sdp.md create mode 100644 specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-004-reject-expire-when-reservation-is-already-released.sdp.md create mode 100644 specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-005-reject-expire-when-reservation-is-already-expired.sdp.md create mode 100644 specs/behavior/order-management/deciders/inventory-evolve.examples/s-001-evolve-null-state-with-product-created-event.sdp.md create mode 100644 specs/behavior/order-management/deciders/inventory-evolve.examples/s-002-evolve-inventory-state-with-stock-added-event.sdp.md create mode 100644 specs/behavior/order-management/deciders/inventory-evolve.examples/s-003-evolve-inventory-from-zero-stock.sdp.md create mode 100644 specs/behavior/order-management/deciders/inventory-evolve.examples/s-004-evolve-inventory-state-with-stock-reserved-event.sdp.md create mode 100644 specs/behavior/order-management/deciders/inventory-evolve.examples/s-005-evolve-inventory-state-when-product-not-in-reservation.sdp.md create mode 100644 specs/behavior/order-management/deciders/inventory-evolve.examples/s-006-evolve-inventory-state-with-reservation-failed-event-no-change.sdp.md create mode 100644 specs/behavior/order-management/deciders/order-evolve.examples/s-001-order-created-evolves-null-to-initial-state.sdp.md create mode 100644 specs/behavior/order-management/deciders/order-evolve.examples/s-002-order-item-added-appends-item-to-empty-order.sdp.md create mode 100644 specs/behavior/order-management/deciders/order-evolve.examples/s-003-order-item-added-accumulates-with-existing-items.sdp.md create mode 100644 specs/behavior/order-management/deciders/order-evolve.examples/s-004-order-item-removed-removes-item-and-updates-total.sdp.md create mode 100644 specs/behavior/order-management/deciders/order-evolve.examples/s-005-order-submitted-changes-status-to-submitted.sdp.md create mode 100644 specs/behavior/order-management/deciders/order-evolve.examples/s-006-order-confirmed-changes-status-to-confirmed.sdp.md create mode 100644 specs/behavior/order-management/deciders/order-evolve.examples/s-007-order-cancelled-changes-status-from-draft-to-cancelled.sdp.md create mode 100644 specs/behavior/order-management/deciders/order-evolve.examples/s-008-order-cancelled-changes-status-from-submitted-to-cancelled.sdp.md create mode 100644 specs/behavior/order-management/deciders/order-evolve.examples/s-009-order-cancelled-changes-status-from-confirmed-to-cancelled.sdp.md create mode 100644 specs/behavior/order-management/deciders/release-reservation-decider.examples/s-001-decide-to-release-a-pending-reservation.sdp.md create mode 100644 specs/behavior/order-management/deciders/release-reservation-decider.examples/s-002-decide-to-release-a-confirmed-reservation.sdp.md create mode 100644 specs/behavior/order-management/deciders/release-reservation-decider.examples/s-003-reject-release-when-reservation-is-already-released.sdp.md create mode 100644 specs/behavior/order-management/deciders/release-reservation-decider.examples/s-004-reject-release-when-reservation-is-expired.sdp.md create mode 100644 specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-001-decide-to-remove-existing-item-from-draft-order.sdp.md create mode 100644 specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-002-reject-remove-item-when-order-is-not-in-draft.sdp.md create mode 100644 specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-003-reject-remove-when-item-does-not-exist.sdp.md create mode 100644 specs/behavior/order-management/deciders/reservation-evolve.examples/s-001-evolve-reservation-state-with-reservation-confirmed.sdp.md create mode 100644 specs/behavior/order-management/deciders/reservation-evolve.examples/s-002-evolve-pending-reservation-with-reservation-released.sdp.md create mode 100644 specs/behavior/order-management/deciders/reservation-evolve.examples/s-003-evolve-confirmed-reservation-with-reservation-released.sdp.md create mode 100644 specs/behavior/order-management/deciders/reservation-evolve.examples/s-004-evolve-pending-reservation-with-reservation-expired.sdp.md create mode 100644 specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-001-decide-to-reserve-stock-when-all-products-have-sufficient-availability.sdp.md create mode 100644 specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-002-fail-reservation-when-one-product-has-insufficient-stock.sdp.md create mode 100644 specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-003-fail-reservation-when-product-does-not-exist.sdp.md create mode 100644 specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-004-reject-reservation-with-empty-items.sdp.md create mode 100644 specs/behavior/order-management/deciders/submit-order-decider.examples/s-001-decide-to-submit-draft-order-with-items.sdp.md create mode 100644 specs/behavior/order-management/deciders/submit-order-decider.examples/s-002-reject-submit-for-order-not-in-draft-status.sdp.md create mode 100644 specs/behavior/order-management/deciders/submit-order-decider.examples/s-003-reject-submit-for-order-with-no-items.sdp.md create mode 100644 specs/behavior/order-management/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md create mode 100644 specs/behavior/order-management/inventory/add-stock.examples/s-002-add-stock-to-product-with-existing-stock.sdp.md create mode 100644 specs/behavior/order-management/inventory/add-stock.examples/s-003-cannot-add-stock-to-non-existent-product.sdp.md create mode 100644 specs/behavior/order-management/inventory/add-stock.examples/s-004-add-stock-is-idempotent-with-same-command-id.sdp.md create mode 100644 specs/behavior/order-management/inventory/confirm-reservation.examples/s-001-successfully-confirm-pending-reservation.sdp.md create mode 100644 specs/behavior/order-management/inventory/confirm-reservation.examples/s-002-cannot-confirm-non-existent-reservation.sdp.md create mode 100644 specs/behavior/order-management/inventory/confirm-reservation.examples/s-003-cannot-confirm-already-confirmed-reservation.sdp.md create mode 100644 specs/behavior/order-management/inventory/confirm-reservation.examples/s-004-confirm-reservation-is-idempotent-with-same-command-id.sdp.md create mode 100644 specs/behavior/order-management/inventory/create-product.examples/s-001-successfully-create-a-new-product.sdp.md create mode 100644 specs/behavior/order-management/inventory/create-product.examples/s-002-cannot-create-product-with-existing-id.sdp.md create mode 100644 specs/behavior/order-management/inventory/create-product.examples/s-003-create-product-is-idempotent-with-same-command-id.sdp.md create mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-001-sum-of-available-and-reserved.sdp.md create mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-002-only-available-when-reserved-is-zero.sdp.md create mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-003-only-reserved-when-available-is-zero.sdp.md create mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-004-both-quantities-are-zero.sdp.md create mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-005-cms-fields-match-input-parameters.sdp.md create mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-006-initial-quantities-and-version-are-zero.sdp.md create mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-007-timestamps-are-set-to-current-time.sdp.md create mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-008-current-version-cms-is-unchanged.sdp.md create mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-009-missing-state-version-is-upgraded.sdp.md create mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-010-version-0-is-upgraded.sdp.md create mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-011-all-fields-are-preserved-during-upcast.sdp.md create mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-012-future-version-throws-error.sdp.md create mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-001-passes-for-a-valid-product.sdp.md create mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-002-throws-product-not-found-for-null-product-reference.sdp.md create mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-003-throws-product-not-found-for-undefined-product-reference.sdp.md create mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-004-passes-for-null-product-reference.sdp.md create mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-005-passes-for-undefined-product-reference.sdp.md create mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-006-throws-product-already-exists-for-existing-product.sdp.md create mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-007-passes-for-standard-sku.sdp.md create mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-008-passes-for-sku-with-special-characters.sdp.md create mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-009-throws-invalid-sku-for-empty-sku.sdp.md create mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-010-throws-invalid-sku-for-whitespace-only-sku.sdp.md create mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-011-passes-for-standard-product-name.sdp.md create mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-012-passes-for-product-name-with-numbers.sdp.md create mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-013-throws-invalid-product-name-for-empty-product-name.sdp.md create mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-014-throws-invalid-product-name-for-whitespace-only-product-name.sdp.md create mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-015-passes-for-positive-integer-10.sdp.md create mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-016-passes-for-positive-integer-1.sdp.md create mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-017-throws-invalid-quantity-for-zero.sdp.md create mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-018-throws-invalid-quantity-for-negative-number.sdp.md create mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-019-throws-invalid-quantity-for-non-integer.sdp.md create mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-020-includes-context-string-in-error-message.sdp.md create mode 100644 specs/behavior/order-management/inventory/release-reservation.examples/s-001-successfully-release-pending-reservation.sdp.md create mode 100644 specs/behavior/order-management/inventory/release-reservation.examples/s-002-can-release-confirmed-reservation-for-order-cancellation.sdp.md create mode 100644 specs/behavior/order-management/inventory/release-reservation.examples/s-003-release-reservation-is-idempotent-with-same-command-id.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-001-single-item-reservation-returns-count-of-1.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-002-multiple-items-reservation-returns-correct-count.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-003-empty-items-reservation-returns-count-of-0.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-004-multiple-items-returns-sum-of-all-quantities.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-005-single-item-returns-its-quantity.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-006-empty-items-returns-0.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-007-creates-cms-with-correct-reservation-id-and-order-id.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-008-initializes-items-array-correctly.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-009-sets-status-to-pending.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-010-sets-expires-at-with-default-ttl.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-011-supports-custom-ttl.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-012-initializes-version-to-0.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-013-initializes-with-current-state-version.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-014-sets-created-at-and-updated-at-to-current-timestamp.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-015-returns-false-when-reservation-has-not-expired.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-016-returns-true-when-reservation-has-expired.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-017-returns-false-when-reservation-is-confirmed-regardless-of-expiry.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-018-returns-false-when-reservation-is-released-regardless-of-expiry.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-019-handles-exact-expiry-boundary-correctly.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-020-returns-unchanged-cms-when-already-at-current-version.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-021-upgrades-cms-with-missing-state-version-to-current-version.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-022-throws-error-for-future-versions.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-023-preserves-all-fields-during-upcast.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-001-does-not-throw-when-reservation-exists.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-002-throws-reservation-not-found-when-reservation-is-null.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-003-throws-reservation-not-found-when-reservation-is-undefined.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-004-does-not-throw-when-reservation-is-null.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-005-does-not-throw-when-reservation-is-undefined.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-006-throws-reservation-already-exists-when-reservation-exists.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-007-does-not-throw-when-items-has-one-item.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-008-does-not-throw-when-items-has-multiple-items.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-009-throws-empty-reservation-when-items-array-is-empty.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-010-does-not-throw-for-valid-item-with-quantity-5.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-011-does-not-throw-for-item-with-quantity-1.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-012-throws-invalid-quantity-for-zero-quantity.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-013-throws-invalid-quantity-for-negative-quantity.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-014-throws-invalid-quantity-for-non-integer-quantity.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-015-throws-invalid-reservation-item-for-empty-product-id.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-016-does-not-throw-for-valid-items-array.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-017-throws-empty-reservation-for-empty-array.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-018-throws-invalid-quantity-when-one-item-has-invalid-quantity.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-019-has-correct-name-property.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-020-has-correct-code-property.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-021-has-correct-message-property.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-022-has-correct-context-property.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-023-can-have-undefined-context.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-024-is-instance-of-error.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-025-reservation-is-pending-check-returns-true-for-pending-status.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-026-reservation-is-pending-check-returns-false-for-non-pending-statuses.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-027-reservation-is-pending-assert-passes-for-pending-status.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-028-reservation-is-pending-assert-throws-reservation-not-pending-for-confirmed.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-029-reservation-is-pending-assert-throws-reservation-not-pending-for-released.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-030-reservation-is-pending-validate-returns-valid-for-pending.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-031-reservation-is-pending-validate-returns-invalid-for-released.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-032-reservation-not-expired-check-returns-true-for-pending-with-future-expiry.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-033-reservation-not-expired-check-returns-true-for-confirmed-with-past-expiry.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-034-reservation-not-expired-check-returns-true-for-released-with-past-expiry.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-035-reservation-not-expired-check-returns-false-for-pending-with-past-expiry.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-036-reservation-not-expired-assert-passes-for-pending-with-future-expiry.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-037-reservation-not-expired-assert-passes-for-confirmed-with-past-expiry.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-038-reservation-not-expired-assert-throws-reservation-expired-for-pending-with.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-039-reservation-not-expired-validate-returns-valid-for-pending-with-future-exp.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-040-reservation-not-expired-validate-returns-invalid-for-pending-with-past-exp.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-041-reservation-has-expired-check-returns-true-for-pending-with-past-expiry.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-042-reservation-has-expired-check-returns-true-for-non-pending-statuses.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-043-reservation-has-expired-check-returns-false-for-pending-with-future-expiry.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-044-reservation-has-expired-assert-passes-for-pending-with-past-expiry.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-045-reservation-has-expired-assert-passes-for-confirmed-regardless-of-expiry.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-046-reservation-has-expired-assert-throws-reservation-not-expired-for-pending.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-047-reservation-has-expired-validate-returns-valid-for-expired-reservation.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-048-reservation-has-expired-validate-returns-invalid-for-pending-with-future-e.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-049-confirm-reservation-invariants-check-all-returns-true-for-pending-and-not.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-050-confirm-reservation-invariants-check-all-returns-false-for-confirmed-and-n.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-051-confirm-reservation-invariants-check-all-returns-false-for-pending-and-exp.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-052-confirm-reservation-invariants-assert-all-passes-for-pending-and-not-expir.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-053-confirm-reservation-invariants-assert-all-throws-reservation-not-pending-f.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-054-confirm-reservation-invariants-assert-all-throws-reservation-expired-for-p.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-055-confirm-reservation-invariants-validate-all-returns-valid-for-pending-and.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-056-confirm-reservation-invariants-validate-all-returns-single-violation-for-c.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-057-confirm-reservation-invariants-validate-all-returns-violation-for-pending.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-058-expire-reservation-invariants-check-all-returns-true-for-pending-and-expir.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-059-expire-reservation-invariants-check-all-returns-false-for-confirmed-and-ex.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-060-expire-reservation-invariants-check-all-returns-false-for-pending-and-not.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-061-expire-reservation-invariants-assert-all-passes-for-pending-and-expired.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-062-expire-reservation-invariants-assert-all-throws-reservation-not-pending-fo.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-063-expire-reservation-invariants-assert-all-throws-reservation-not-expired-fo.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-064-expire-reservation-invariants-validate-all-returns-valid-for-pending-and-e.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-065-expire-reservation-invariants-validate-all-returns-single-violation-for-re.sdp.md create mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-066-expire-reservation-invariants-validate-all-returns-single-violation-for-pe.sdp.md create mode 100644 specs/behavior/order-management/inventory/reserve-stock.examples/s-001-successfully-reserve-available-stock.sdp.md create mode 100644 specs/behavior/order-management/inventory/reserve-stock.examples/s-002-reserve-multiple-items-atomically.sdp.md create mode 100644 specs/behavior/order-management/inventory/reserve-stock.examples/s-003-reservation-fails-when-insufficient-stock.sdp.md create mode 100644 specs/behavior/order-management/inventory/reserve-stock.examples/s-004-multi-item-reservation-is-all-or-nothing.sdp.md create mode 100644 specs/behavior/order-management/inventory/reserve-stock.examples/s-005-cannot-reserve-non-existent-product.sdp.md create mode 100644 specs/behavior/order-management/inventory/reserve-stock.examples/s-006-reserve-stock-is-idempotent-with-same-command-id.sdp.md create mode 100644 specs/behavior/order-management/inventory/stock-invariants.examples/s-001-passes-when-stock-is-sufficient.sdp.md create mode 100644 specs/behavior/order-management/inventory/stock-invariants.examples/s-002-passes-when-requesting-exact-available-quantity.sdp.md create mode 100644 specs/behavior/order-management/inventory/stock-invariants.examples/s-003-throws-insufficient-stock-when-stock-is-not-enough.sdp.md create mode 100644 specs/behavior/order-management/inventory/stock-invariants.examples/s-004-throws-insufficient-stock-when-stock-is-zero.sdp.md create mode 100644 specs/behavior/order-management/inventory/stock-invariants.examples/s-005-returns-available-when-stock-is-sufficient.sdp.md create mode 100644 specs/behavior/order-management/inventory/stock-invariants.examples/s-006-returns-available-when-requesting-exact-amount.sdp.md create mode 100644 specs/behavior/order-management/inventory/stock-invariants.examples/s-007-returns-unavailable-with-deficit-when-stock-is-insufficient.sdp.md create mode 100644 specs/behavior/order-management/inventory/stock-invariants.examples/s-008-returns-correct-deficit-for-zero-stock.sdp.md create mode 100644 specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-001-multi-product-order-uses-dcb-for-atomic-reservation.sdp.md create mode 100644 specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-002-insufficient-inventory-for-one-product-rejects-entire-reservation.sdp.md create mode 100644 specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-003-dcb-handles-concurrent-reservation-conflicts.sdp.md create mode 100644 specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-004-duplicate-product-i-ds-are-rejected.sdp.md create mode 100644 specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-001-order-submitted-includes-customer-snapshot.sdp.md create mode 100644 specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-002-event-enrichment-does-not-block-order-submission.sdp.md create mode 100644 specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-003-customer-snapshot-is-immutable-in-event.sdp.md create mode 100644 specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-004-missing-customer-data-handled-gracefully.sdp.md create mode 100644 specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-005-v1-events-are-upcasted-to-v2-with-null-customer.sdp.md create mode 100644 specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-006-v2-events-are-not-modified-by-upcaster.sdp.md create mode 100644 specs/behavior/order-management/modernization/reactive-order-detail.examples/s-001-order-detail-view-shows-instant-updates.sdp.md create mode 100644 specs/behavior/order-management/modernization/reactive-order-detail.examples/s-002-multiple-rapid-updates-are-applied-correctly.sdp.md create mode 100644 specs/behavior/order-management/modernization/reactive-order-detail.examples/s-003-optimistic-update-rolls-back-on-conflict.sdp.md create mode 100644 specs/behavior/order-management/modernization/reactive-order-detail.examples/s-004-stale-event-stream-is-handled-gracefully.sdp.md create mode 100644 specs/behavior/order-management/modernization/reference-documentation.examples/s-001-readme-has-reference-implementation-designation.sdp.md create mode 100644 specs/behavior/order-management/modernization/reference-documentation.examples/s-002-all-demonstrated-patterns-are-cataloged.sdp.md create mode 100644 specs/behavior/order-management/modernization/reference-documentation.examples/s-003-pattern-links-are-valid.sdp.md create mode 100644 specs/behavior/order-management/modernization/reference-documentation.examples/s-004-architecture-diagram-is-present.sdp.md create mode 100644 specs/behavior/order-management/orders/add-items.examples/s-001-add-single-item-to-empty-draft-order.sdp.md create mode 100644 specs/behavior/order-management/orders/add-items.examples/s-002-add-multiple-items-to-draft-order.sdp.md create mode 100644 specs/behavior/order-management/orders/add-items.examples/s-003-cannot-add-items-to-submitted-order.sdp.md create mode 100644 specs/behavior/order-management/orders/add-items.examples/s-004-cannot-add-items-to-cancelled-order.sdp.md create mode 100644 specs/behavior/order-management/orders/add-items.examples/s-005-cannot-add-item-with-zero-quantity.sdp.md create mode 100644 specs/behavior/order-management/orders/add-items.examples/s-006-cannot-add-item-with-negative-quantity.sdp.md create mode 100644 specs/behavior/order-management/orders/add-items.examples/s-007-cannot-add-item-with-negative-price.sdp.md create mode 100644 specs/behavior/order-management/orders/cancel-order.examples/s-001-cancel-draft-order.sdp.md create mode 100644 specs/behavior/order-management/orders/cancel-order.examples/s-002-cancel-submitted-order.sdp.md create mode 100644 specs/behavior/order-management/orders/cancel-order.examples/s-003-cannot-cancel-already-cancelled-order.sdp.md create mode 100644 specs/behavior/order-management/orders/cancel-order.examples/s-004-cancel-confirmed-order.sdp.md create mode 100644 specs/behavior/order-management/orders/cancel-order.examples/s-005-cannot-cancel-non-existent-order.sdp.md create mode 100644 specs/behavior/order-management/orders/cancel-order.examples/s-006-cancel-order-is-idempotent-with-same-command-id.sdp.md create mode 100644 specs/behavior/order-management/orders/confirm-order.examples/s-001-successfully-confirm-a-submitted-order.sdp.md create mode 100644 specs/behavior/order-management/orders/confirm-order.examples/s-002-cannot-confirm-a-draft-order.sdp.md create mode 100644 specs/behavior/order-management/orders/confirm-order.examples/s-003-cannot-confirm-an-already-confirmed-order.sdp.md create mode 100644 specs/behavior/order-management/orders/confirm-order.examples/s-004-cannot-confirm-a-cancelled-order.sdp.md create mode 100644 specs/behavior/order-management/orders/confirm-order.examples/s-005-cannot-confirm-a-non-existent-order.sdp.md create mode 100644 specs/behavior/order-management/orders/confirm-order.examples/s-006-confirm-order-is-idempotent-with-same-command-id.sdp.md create mode 100644 specs/behavior/order-management/orders/create-order.examples/s-001-successfully-create-a-new-order.sdp.md create mode 100644 specs/behavior/order-management/orders/create-order.examples/s-002-cannot-create-order-with-existing-id.sdp.md create mode 100644 specs/behavior/order-management/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md create mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-001-empty-items-array-returns-zero.sdp.md create mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-002-single-item-total.sdp.md create mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-003-multiple-items-total.sdp.md create mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-004-zero-quantity-results-in-zero-contribution.sdp.md create mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-005-zero-price-results-in-zero-contribution.sdp.md create mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-006-decimal-prices-are-handled-correctly.sdp.md create mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-007-cms-is-created-with-the-provided-order-id-and-customer-id.sdp.md create mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-008-cms-initializes-with-draft-status.sdp.md create mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-009-cms-initializes-with-empty-items-array.sdp.md create mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-010-cms-initializes-with-zero-total-amount.sdp.md create mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-011-cms-initializes-with-version-0.sdp.md create mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-012-cms-initializes-with-current-state-version.sdp.md create mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-013-cms-sets-created-at-and-updated-at-to-current-timestamp.sdp.md create mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-014-cms-already-at-current-version-is-returned-unchanged.sdp.md create mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-015-cms-with-missing-state-version-is-upgraded.sdp.md create mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-016-cms-with-state-version-0-is-upgraded.sdp.md create mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-017-all-fields-are-preserved-during-upcast.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-001-check-all-returns-true-for-draft-order-with-items.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-002-check-all-returns-false-for-non-draft-order-with-items.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-003-check-all-returns-false-for-draft-order-without-items.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-004-assert-all-does-not-throw-for-valid-draft-order-with-items.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-005-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-006-assert-all-throws-order-has-no-items-for-draft-order-with-no-items.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-007-validate-all-returns-valid-result-for-draft-order-with-items.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-008-validate-all-returns-both-violations-for-submitted-order-with-no-items.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-009-check-all-returns-true-for-draft-order-under-item-limit.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-010-check-all-returns-false-for-non-draft-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-011-check-all-returns-false-for-draft-order-at-max-capacity.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-012-assert-all-does-not-throw-for-valid-draft-order-under-limit.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-013-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-014-assert-all-throws-max-items-exceeded-for-draft-order-at-capacity.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-015-validate-all-returns-valid-result-for-draft-order-under-limit.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-016-validate-all-returns-both-violations-for-submitted-order-at-capacity.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-017-check-all-returns-expected-for-status-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-018-assert-all-does-not-throw-for-draft-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-019-assert-all-does-not-throw-for-submitted-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-020-assert-all-throws-order-already-confirmed-for-confirmed-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-021-assert-all-throws-order-already-cancelled-for-cancelled-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-022-validate-all-returns-valid-result-for-draft-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-023-validate-all-returns-single-violation-for-confirmed-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-024-validate-all-returns-single-violation-for-cancelled-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-001-passes-for-a-valid-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-002-throws-order-not-found-for-null-order-reference.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-003-throws-order-not-found-for-undefined-order-reference.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-004-passes-for-null-order-reference.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-005-passes-for-undefined-order-reference.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-006-throws-order-already-exists-for-existing-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-007-check-returns-true-for-draft-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-008-check-returns-false-for-submitted-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-009-assert-passes-for-draft-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-010-assert-throws-order-not-in-draft-for-non-draft-statuses.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-011-check-returns-true-for-submitted-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-012-check-returns-false-for-draft-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-013-assert-passes-for-submitted-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-014-assert-throws-order-not-submitted-for-non-submitted-statuses.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-015-check-returns-true-for-draft-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-016-check-returns-true-for-submitted-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-017-check-returns-false-for-cancelled-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-018-assert-passes-for-draft-order-not-cancelled.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-019-assert-passes-for-confirmed-order-not-cancelled.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-020-assert-throws-order-already-cancelled-for-cancelled-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-021-check-returns-true-for-draft-order-not-confirmed.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-022-check-returns-true-for-submitted-order-not-confirmed.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-023-check-returns-false-for-confirmed-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-024-assert-passes-for-draft-order-not-confirmed.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-025-assert-passes-for-cancelled-order-not-confirmed.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-026-assert-throws-order-already-confirmed-for-confirmed-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-027-check-returns-true-when-order-has-items.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-028-check-returns-false-when-order-has-no-items.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-029-assert-passes-when-order-has-items.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-030-assert-passes-when-order-has-multiple-items.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-031-assert-throws-order-has-no-items-for-empty-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-032-check-returns-true-when-order-has-room-for-items.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-033-check-returns-false-when-order-is-at-max-capacity.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-034-assert-passes-when-order-has-room-for-items.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-035-assert-passes-when-order-is-one-under-max-capacity.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-036-assert-throws-max-items-exceeded-at-max-capacity.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-037-passes-when-item-exists-in-order.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-038-passes-when-item-is-one-of-many.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-039-throws-item-not-found-when-item-does-not-exist.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-040-throws-item-not-found-when-items-array-is-empty.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-041-passes-for-valid-item.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-042-passes-for-item-with-decimal-price.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-043-passes-for-item-with-zero-price-free-item.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-044-throws-invalid-quantity-for-negative-quantity.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-045-throws-invalid-quantity-for-zero-quantity.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-046-throws-invalid-quantity-for-non-integer-quantity.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-047-throws-invalid-price-for-negative-price.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-048-throws-invalid-item-data-for-empty-product-id.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-049-throws-invalid-item-data-for-empty-product-name.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-050-error-has-correct-name-property.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-051-error-has-correct-code-property.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-052-error-has-correct-message-property.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-053-error-has-correct-context-property.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-054-error-can-have-undefined-context.sdp.md create mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-055-error-is-an-instance-of-error.sdp.md create mode 100644 specs/behavior/order-management/orders/remove-order-item.examples/s-001-remove-item-from-draft-order-with-multiple-items.sdp.md create mode 100644 specs/behavior/order-management/orders/remove-order-item.examples/s-002-remove-last-item-from-draft-order.sdp.md create mode 100644 specs/behavior/order-management/orders/remove-order-item.examples/s-003-cannot-remove-item-from-submitted-order.sdp.md create mode 100644 specs/behavior/order-management/orders/remove-order-item.examples/s-004-cannot-remove-item-from-cancelled-order.sdp.md create mode 100644 specs/behavior/order-management/orders/remove-order-item.examples/s-005-cannot-remove-item-from-confirmed-order.sdp.md create mode 100644 specs/behavior/order-management/orders/remove-order-item.examples/s-006-cannot-remove-non-existent-item.sdp.md create mode 100644 specs/behavior/order-management/orders/remove-order-item.examples/s-007-remove-order-item-is-idempotent-with-same-command-id.sdp.md create mode 100644 specs/behavior/order-management/orders/submit-order.examples/s-001-successfully-submit-order-with-items.sdp.md create mode 100644 specs/behavior/order-management/orders/submit-order.examples/s-002-cannot-submit-empty-order.sdp.md create mode 100644 specs/behavior/order-management/roadmap/projection-categories.examples/s-001-define-a-logic-projection-for-command-validation.sdp.md create mode 100644 specs/behavior/order-management/roadmap/projection-categories.examples/s-002-define-a-view-projection-for-ui-queries.sdp.md create mode 100644 specs/behavior/order-management/roadmap/projection-categories.examples/s-003-define-a-reporting-projection-for-analytics.sdp.md create mode 100644 specs/behavior/order-management/roadmap/projection-categories.examples/s-004-define-an-integration-projection-for-cross-context-sync.sdp.md create mode 100644 specs/behavior/order-management/roadmap/projection-categories.examples/s-005-query-projections-by-category.sdp.md create mode 100644 specs/behavior/order-management/roadmap/projection-categories.examples/s-006-query-all-reactive-projections.sdp.md create mode 100644 specs/behavior/order-management/roadmap/projection-categories.examples/s-007-prevent-client-query-on-logic-projection.sdp.md create mode 100644 specs/behavior/order-management/roadmap/projection-categories.examples/s-008-warn-when-view-projection-is-not-optimized-for-reactivity.sdp.md create mode 100644 specs/behavior/order-management/roadmap/projection-categories.examples/s-009-migrate-existing-projection-to-categorized-system.sdp.md create mode 100644 specs/behavior/order-management/sagas/admin.examples/s-001-returns-zero-counts-for-empty-database.sdp.md create mode 100644 specs/behavior/order-management/sagas/admin.examples/s-002-counts-sagas-by-status-correctly.sdp.md create mode 100644 specs/behavior/order-management/sagas/admin.examples/s-003-filters-by-saga-type.sdp.md create mode 100644 specs/behavior/order-management/sagas/admin.examples/s-004-returns-empty-array-when-no-sagas-exist.sdp.md create mode 100644 specs/behavior/order-management/sagas/admin.examples/s-005-returns-running-sagas-older-than-threshold.sdp.md create mode 100644 specs/behavior/order-management/sagas/admin.examples/s-006-respects-custom-threshold.sdp.md create mode 100644 specs/behavior/order-management/sagas/admin.examples/s-007-returns-empty-array-when-no-failed-sagas.sdp.md create mode 100644 specs/behavior/order-management/sagas/admin.examples/s-008-returns-only-failed-sagas.sdp.md create mode 100644 specs/behavior/order-management/sagas/admin.examples/s-009-respects-limit-parameter.sdp.md create mode 100644 specs/behavior/order-management/sagas/admin.examples/s-010-allows-marking-valid-source-status-saga-as-failed.sdp.md create mode 100644 specs/behavior/order-management/sagas/admin.examples/s-011-rejects-marking-invalid-source-status-saga-as-failed.sdp.md create mode 100644 specs/behavior/order-management/sagas/admin.examples/s-012-returns-not-found-for-non-existent-saga.sdp.md create mode 100644 specs/behavior/order-management/sagas/admin.examples/s-013-allows-marking-failed-saga-as-compensated.sdp.md create mode 100644 specs/behavior/order-management/sagas/admin.examples/s-014-rejects-marking-non-failed-saga-as-compensated.sdp.md create mode 100644 specs/behavior/order-management/sagas/admin.examples/s-015-allows-retrying-failed-saga.sdp.md create mode 100644 specs/behavior/order-management/sagas/admin.examples/s-016-rejects-retrying-non-failed-saga.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-001-parse-vertical-data-table-to-object.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-002-parse-data-table-preserves-all-string-values.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-003-parse-integer-value-from-string.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-004-parse-float-value-from-string.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-005-parse-boolean-true-from-string.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-006-parse-boolean-false-from-string.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-007-parse-invalid-integer-throws-error.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-008-get-required-field-succeeds-when-present.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-009-get-required-field-throws-for-missing-field.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-010-get-optional-field-returns-value-when-present.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-011-get-optional-field-returns-undefined-for-missing.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-012-get-optional-field-with-default-value.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-001-assert-decision-success.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-002-assert-decision-success-fails-for-rejected-result.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-003-extract-success-event-from-result.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-004-extract-success-data-from-result.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-005-extract-state-update-from-result.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-006-assert-event-type-matches.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-007-assert-event-type-fails-for-wrong-type.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-008-assert-event-payload-field.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-009-assert-state-update-field.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-010-assert-decision-rejected.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-011-assert-rejection-code-matches.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-012-assert-rejection-code-fails-for-wrong-code.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-013-assert-rejection-message-contains-text.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-014-assert-decision-failed.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-015-assert-failure-reason-matches.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-001-assert-valid-transition.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-002-assert-invalid-transition-fails.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-003-assert-transition-is-not-allowed.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-004-assert-cannot-transition-fails-for-valid-transition.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-005-assert-terminal-state.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-006-assert-terminal-state-fails-for-non-terminal.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-007-assert-non-terminal-state.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-008-assert-initial-state.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-009-assert-valid-state.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-010-assert-invalid-state-fails.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-011-get-all-valid-transitions.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-012-get-all-states.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-013-get-terminal-states.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-014-get-non-terminal-states.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-015-assert-valid-transitions-from-a-state.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-001-generate-unique-test-run-id.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-002-module-level-test-run-id-is-stable-within-a-test-run.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-003-prefix-entity-i-ds-with-test-run-namespace.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-004-custom-prefix-for-specific-isolation.sdp.md create mode 100644 specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-005-test-isolation-prevents-cross-test-pollution.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-001-successful-command-records-intent-and-completion.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-002-intent-record-captures-command-metadata.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-003-business-rejection-records-failed-intent.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-004-technical-failure-records-failed-intent.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-005-intent-statistics-show-correct-counts.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-001-publishing-creates-records-for-each-target-context.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-002-publication-records-contain-event-metadata.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-003-publish-result-contains-publication-i-ds.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-004-query-publications-by-event-id.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-005-query-returns-empty-for-unknown-event.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-006-query-publications-by-status.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-007-stats-show-counts-by-status.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-008-publications-for-different-events-are-isolated.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-001-create-a-running-checkpoint-for-replay.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-002-update-checkpoint-progress.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-003-cannot-start-replay-for-already-running-projection.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-004-query-checkpoint-by-replay-id.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-005-list-checkpoints-by-status.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-001-append-event-with-unique-idempotency-key-succeeds.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-002-different-idempotency-keys-create-separate-events.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-003-second-append-with-same-idempotency-key-returns-duplicate.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-004-same-key-with-different-payload-is-rejected.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-005-same-idempotency-key-on-different-streams-creates-separate-events.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-001-intent-exceeding-timeout-is-flagged-as-abandoned.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-002-intent-within-timeout-is-not-flagged.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-003-completed-intent-is-not-flagged-even-if-old.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-004-failed-intent-is-not-flagged-even-if-old.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-005-list-abandoned-intents-for-investigation.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-006-timeout-handler-marks-pending-intent-as-abandoned.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-007-timeout-handler-no-ops-for-completed-intent.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-001-first-failure-creates-pending-poison-record.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-002-second-failure-increments-attempt-count.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-003-event-quarantined-after-3-failures.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-004-quarantine-captures-error-details.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-005-quarantined-event-bypasses-handler-completely.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-006-unquarantine-resets-status-for-retry.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-007-unquarantine-of-non-quarantined-event-returns-not-quarantined.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-008-stats-show-quarantined-event-counts-by-projection.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-001-dcb-operation-succeeds-on-first-attempt.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-002-dcb-rejected-result-passes-through-unchanged.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-003-dcb-conflict-returns-retry-metadata-with-updated-version.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-005-final-scope-conflict-rolls-back-state-updates.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-006-backoff-increases-exponentially.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-007-backoff-is-capped-at-maximum.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-008-retries-use-consistent-partition-key.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-001-normal-requests-pass-rate-limiting.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-002-exhausted-rate-limit-rejects-request.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-003-different-users-have-independent-limits.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-005-rate-limited-command-returns-standard-rejection.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-006-health-check-commands-bypass-rate-limiting.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-007-high-volume-rate-limit-uses-sharded-counting.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-002-reject-adding-stock-to-non-existent-product.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-003-add-stock-is-idempotent-with-same-command-id.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-001-confirm-pending-reservation.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-002-reject-confirming-already-confirmed-reservation.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-003-reject-confirming-non-existent-reservation.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-001-successfully-create-a-new-product-and-verify-projection.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-002-reject-duplicate-product-id.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-003-reject-duplicate-sku.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-004-create-product-is-idempotent-with-same-command-id.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-001-list-products-returns-all-products.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-002-get-stock-availability-for-product.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-003-check-availability-for-multiple-items.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-004-get-reservation-by-order-id.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-001-release-pending-reservation.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-002-reject-releasing-non-pending-reservation.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-001-expire-pending-reservations-past-ttl.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-002-skip-confirmed-reservations.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-003-skip-reservations-not-yet-expired.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-004-batch-expiration-of-multiple-reservations.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-001-reserve-stock-successfully.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-002-reserve-stock-for-multiple-items.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-003-reject-when-insufficient-stock.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-004-all-or-nothing-reservation-when-one-item-fails.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-005-reject-for-non-existent-product.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-006-return-failed-status-when-reservation-fails.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-007-idempotent-with-same-command-id.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-001-add-item-to-draft-order-and-verify-projection.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-002-reject-adding-item-to-submitted-order.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-001-add-multiple-items-to-order-in-batch.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-002-batch-respects-order-of-execution.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-003-batch-stops-on-first-failure-in-atomic-mode.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-001-cancel-draft-order-and-verify-projection.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-002-cancel-submitted-order-and-verify-projection.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-003-reject-cancelling-already-cancelled-order.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-004-cancel-confirmed-order-and-verify-projection.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-005-reservation-is-released-when-confirmed-order-is-cancelled.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-006-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-007-cancelling-submitted-order-before-saga-completion-releases-pending-reserva.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-008-pm-handles-already-released-reservation-gracefully.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-009-pm-skips-expired-reservation-when-order-is-cancelled.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-001-successfully-create-a-new-order-and-verify-projection.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-002-reject-duplicate-order-id.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-001-query-orders-by-customer-id.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-002-query-orders-by-status.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-003-remove-item-from-draft-order-and-verify-projection.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-001-submit-order-with-items-and-verify-projection.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-002-reject-submitting-empty-order.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-003-reject-submitting-already-submitted-order.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-001-complete-saga-when-stock-is-available-for-single-item-order.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-002-complete-saga-when-stock-is-available-for-multi-item-order.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-003-cancel-order-when-insufficient-stock-for-single-item.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-004-cancel-order-when-one-item-in-multi-item-order-has-insufficient-stock.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-005-saga-runs-only-once-per-order.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-006-saga-status-is-completed-after-successful-fulfillment.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-007-saga-status-is-completed-after-compensation.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-008-saga-has-completed-at-timestamp-after-completion.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-001-get-saga-details-returns-workflow-id-for-completed-saga.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-002-get-saga-steps-returns-step-history.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-003-get-saga-steps-returns-null-for-non-existent-saga.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-004-cancel-completed-saga-returns-invalid-state.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-005-cancel-non-existent-saga-returns-not-found.sdp.md create mode 100644 specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-006-cleanup-completed-saga-workflow.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-001-all-feature-files-pass-schema-validation.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-002-roadmap-md-reflects-planned-phases.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-001-historical-deliverables-are-preserved.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-002-incomplete-phases-deferred-appropriately.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-001-ad-rs-are-accessible-through-generated-docs.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-002-adr-validity-is-assessed-against-new-roadmap.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-001-planning-sessions-have-defined-outputs.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-002-non-code-sessions-are-supported.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-003-configuration-inheritance-works.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-001-core-patterns-are-documented-for-roadmap-planning.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-002-progressive-annotation-policy-is-sustainable.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-001-claude-md-is-generated-from-modules.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-002-variations-produce-different-outputs.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-003-pattern-content-is-auto-generated.sdp.md create mode 100644 specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-004-session-templates-are-includable.sdp.md create mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-001-define-command-preserves-literal-command-type.sdp.md create mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-002-define-command-includes-all-metadata-fields.sdp.md create mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-003-define-event-preserves-literal-event-type.sdp.md create mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-004-define-event-supports-all-event-categories.sdp.md create mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-005-define-projection-preserves-literal-projection-name.sdp.md create mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-006-define-projection-preserves-event-subscriptions-tuple.sdp.md create mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-007-is-projection-category-validates-category-strings.sdp.md create mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-008-is-logic-projection-returns-true-only-for-logic-category.sdp.md create mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-009-is-view-projection-returns-true-only-for-view-category.sdp.md create mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-010-is-client-exposed-returns-true-only-for-view-category.sdp.md create mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-011-is-client-exposed-returns-false-for-non-view-categories.sdp.md create mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-012-define-process-manager-validates-time-triggered-requires-cron-config.sdp.md create mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-013-define-process-manager-validates-event-triggered-requires-subscriptions.sdp.md create mode 100644 specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-001-direct-table-query-fails-across-component-boundary.sdp.md create mode 100644 specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-002-component-api-access-succeeds.sdp.md create mode 100644 specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-003-component-handler-writes-commit-atomically-on-success.sdp.md create mode 100644 specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-004-caught-component-failure-rolls-back-only-the-component-writes.sdp.md create mode 100644 specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-005-user-id-passed-explicitly-to-component.sdp.md create mode 100644 specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-006-id-conversion-at-boundary.sdp.md create mode 100644 specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-007-contract-provides-type-safety-for-commands.sdp.md create mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-001-first-command-execution-is-recorded.sdp.md create mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-002-duplicate-command-returns-cached-result.sdp.md create mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-003-successful-command-transitions-to-executed.sdp.md create mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-004-business-rejection-transitions-to-rejected.sdp.md create mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-005-unexpected-error-transitions-to-failed.sdp.md create mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-006-successful-command-runs-all-7-orchestrator-steps.sdp.md create mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-007-rejected-command-short-circuits-before-event-append.sdp.md create mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-008-correlation-id-is-propagated-to-emitted-event-metadata.sdp.md create mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-009-get-by-correlation-returns-the-events-for-a-command.sdp.md create mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-010-registered-middleware-run-in-order.sdp.md create mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-011-middleware-failure-halts-the-pipeline.sdp.md create mode 100644 specs/behavior/platform-bus/idempotency.examples/s-001-first-command-submission-is-recorded.sdp.md create mode 100644 specs/behavior/platform-bus/idempotency.examples/s-002-duplicate-command-returns-existing-status-when-completed.sdp.md create mode 100644 specs/behavior/platform-bus/idempotency.examples/s-003-duplicate-command-during-processing-returns-pending-status.sdp.md create mode 100644 specs/behavior/platform-bus/idempotency.examples/s-004-concurrent-duplicate-detection-via-post-insert-verification.sdp.md create mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-001-returns-null-when-checkpoint-position-equals-event-position.sdp.md create mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-002-returns-null-when-checkpoint-position-exceeds-event-position.sdp.md create mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-003-returns-null-when-agent-status-is-paused.sdp.md create mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-004-returns-null-when-agent-status-is-stopped.sdp.md create mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-005-returns-null-when-agent-status-is-error-recovery.sdp.md create mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-006-processes-normally-when-checkpoint-is-null-first-event.sdp.md create mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-007-returns-rule-based-analysis-when-pattern-has-no-analyze-function.sdp.md create mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-008-re-throws-when-pattern-trigger-throws.sdp.md create mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-009-propagates-load-state-errors-for-workpool-retry.sdp.md create mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-010-generates-deterministic-decision-id-from-agent-id-and-global-position.sdp.md create mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-011-generates-same-decision-id-for-same-inputs-deterministic.sdp.md create mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-012-returns-pattern-id-and-rule-based-decision-when-pattern-triggers.sdp.md create mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-013-returns-llm-analysis-method-when-pattern-has-analyze-function.sdp.md create mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-014-returns-no-pattern-id-when-no-pattern-matches.sdp.md create mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-015-does-not-invoke-llm-enrichment-via-runtime.sdp.md create mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-016-re-throws-when-pattern-executor-fails.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-001-operation-executes-and-result-is-returned-when-allowed.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-002-operation-is-not-executed-when-denied.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-003-check-rate-limit-receives-agent-scoped-key.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-004-operation-errors-propagate-to-caller.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-005-check-rate-limit-callback-errors-propagate-without-calling-operation.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-006-warning-is-logged-when-rate-limited.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-007-debug-is-logged-when-rate-limit-check-passes.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-001-action-subscription-has-correct-type-and-references.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-002-object-retry-config-is-passed-through.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-003-boolean-retry-config-is-passed-through.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-004-retry-field-is-absent-when-not-specified.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-005-to-workpool-context-returns-all-required-fields.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-006-causation-id-equals-the-event-event-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-007-subscription-uses-default-priority-of-250.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-008-subscription-uses-custom-priority.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-009-name-includes-context-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-010-name-omits-context-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-011-filter-contains-all-configured-event-types.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-012-to-handler-args-produces-correct-agent-event-handler-args.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-013-get-partition-key-returns-stream-id-based-partition.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-001-subscription-with-context-has-correct-name.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-002-subscription-without-context-has-correct-name.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-003-subscription-uses-default-priority-of-250.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-004-subscription-uses-custom-priority.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-005-subscription-filter-contains-correct-event-types.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-006-subscription-attaches-the-handler-reference.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-007-to-handler-args-produces-correct-agent-event-handler-args.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-008-to-handler-args-includes-payload-in-handler-args.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-009-default-agent-transform-wraps-non-object-payload-in-raw.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-010-custom-to-handler-args-transformer-is-used.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-011-partitions-by-stream-id-by-default.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-012-custom-partition-key-extractor-is-used.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-013-creates-subscriptions-for-multiple-agents.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-014-throws-if-handler-is-missing-for-an-agent.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-015-applies-common-options-to-all-subscriptions.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-016-same-agent-id-for-multiple-to-handler-args-calls.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-017-same-agent-id-for-to-handler-args-and-get-partition-key.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-018-filter-matches-subscribed-types-and-rejects-unsubscribed-types.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-019-event-types-array-starts-with-correct-length.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-020-transforms-all-published-event-fields-correctly.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-021-handles-null-payload.sdp.md create mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-022-handles-array-payload.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-001-all-six-error-codes-are-present.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-002-approval-statuses-contains-all-four-statuses-in-order.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-003-approval-statuses-is-a-4-element-array.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-004-returns-true-for-valid-status-strings.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-005-returns-false-for-invalid-strings.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-006-returns-false-for-non-string-types.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-007-accepts-all-four-valid-statuses.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-008-rejects-invalid-status-values.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-009-accepts-a-valid-approval-object.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-010-rejects-approval-with-missing-required-fields.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-011-rejects-approval-with-confidence-above-1.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-012-rejects-approval-with-negative-confidence.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-013-accepts-valid-auth-context-with-user-id-only.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-014-accepts-auth-context-with-roles.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-015-accepts-auth-context-with-agent-ids.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-016-rejects-auth-context-with-empty-user-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-017-parses-valid-duration-strings.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-018-returns-null-for-invalid-formats.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-019-returns-null-for-zero-values.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-020-returns-true-for-valid-timeout-formats.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-021-returns-false-for-invalid-timeout-formats.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-022-uses-explicit-timeout-from-config.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-023-uses-default-timeout-when-not-specified.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-024-uses-default-timeout-for-invalid-format.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-025-returns-true-when-confidence-is-below-threshold.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-026-returns-true-when-confidence-equals-threshold-inclusive.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-027-returns-false-when-confidence-is-above-threshold.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-028-uses-default-threshold-of-0-9-when-not-specified.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-029-returns-true-for-listed-action-even-with-high-confidence.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-030-returns-false-for-unlisted-action-with-high-confidence.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-031-returns-false-for-auto-approved-action-with-low-confidence.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-032-auto-approve-takes-precedence-over-low-confidence.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-033-requires-approval-wins-when-action-is-in-both-lists.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-034-falls-through-to-confidence-check-with-empty-lists.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-035-falls-through-to-confidence-check-with-undefined-lists.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-036-handles-confidence-of-0.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-037-handles-confidence-of-1.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-038-returns-true-when-agent-id-is-in-auth-context-agent-ids.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-039-returns-false-when-agent-id-is-not-in-auth-context-agent-ids.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-040-returns-false-when-agent-ids-is-undefined.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-041-returns-false-when-agent-ids-is-empty.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-042-returns-true-when-user-has-at-least-one-role.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-043-returns-false-when-roles-is-undefined.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-044-returns-false-when-roles-is-empty.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-045-agent-ids-check-fails-even-with-admin-role.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-046-both-agent-ids-and-roles-pass.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-047-generates-id-with-apr-prefix-and-correct-format.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-048-generates-unique-i-ds-over-multiple-calls.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-049-sets-correct-initial-field-values.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-050-generates-unique-approval-ids-over-multiple-calls.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-051-sets-requested-at-to-current-time.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-052-calculates-expires-at-based-on-config-timeout.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-053-does-not-include-optional-fields-initially.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-054-transitions-pending-approval-to-approved.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-055-includes-review-note-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-056-does-not-include-review-note-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-057-throws-error-for-non-pending-statuses.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-058-throws-error-for-expired-pending-approvals.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-059-preserves-other-fields-after-approval.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-060-transitions-pending-approval-to-rejected-with-reason.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-061-sets-reviewed-at-to-current-time-on-rejection.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-062-throws-error-when-rejecting-non-pending-approval.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-063-throws-error-when-rejecting-expired-pending-approval.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-064-transitions-pending-approval-to-expired.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-065-throws-error-when-expiring-non-pending-approval.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-066-preserves-original-fields-after-expiration.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-067-returns-success-for-valid-pending-approval.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-068-returns-unauthorized-reviewer-when-not-authorized.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-069-returns-invalid-status-transition-when-already-processed.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-070-returns-approval-expired-when-past-expiration.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-071-returns-success-for-valid-rejection.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-072-returns-unauthorized-reviewer-on-safe-reject.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-073-returns-approval-expired-on-safe-reject.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-074-is-approval-pending-returns-true-only-for-pending.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-075-is-approval-approved-returns-true-only-for-approved.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-076-is-approval-rejected-returns-true-only-for-rejected.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-077-is-approval-expired-detects-expired-status-and-time-based-expiration.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-078-is-approval-actionable-checks-pending-and-not-expired.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-079-returns-remaining-time-for-pending-approval.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-080-returns-0-for-expired-approval.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-081-returns-0-for-non-pending-status.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-082-formats-hours-and-minutes.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-083-formats-minutes-only.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-084-returns-expired-for-past-expiration.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-085-returns-true-for-valid-approval.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-086-returns-false-for-invalid-inputs.sdp.md create mode 100644 specs/behavior/platform-core/agent/approval.examples/s-087-returns-false-for-invalid-confidence.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-001-record-pattern-detected-event.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-002-audit-includes-triggering-events.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-003-audit-includes-execution-mode.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-004-audit-includes-llm-metadata.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-005-audit-llm-failures.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-006-record-auto-executed-action.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-007-record-approved-action.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-008-record-rejected-action.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-009-record-expired-action.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-010-query-all-decisions-for-an-agent.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-011-query-decisions-by-pattern-type.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-012-query-decisions-by-time-range.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-013-query-decision-with-full-trace.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-001-contains-all-ds-1-base-event-types.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-002-contains-all-ds-4-command-routing-event-types.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-003-contains-all-ds-5-lifecycle-event-types.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-004-contains-ds-6-failure-tracking-event-type.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-005-has-exactly-17-event-types.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-006-returns-true-for-all-valid-event-type-strings.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-007-returns-false-for-invalid-values.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-008-returns-false-for-non-string-values.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-009-accepts-all-valid-event-types.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-010-rejects-invalid-event-types.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-011-rejects-non-string-values-via-zod.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-012-accepts-valid-llm-context.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-013-rejects-negative-tokens.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-014-rejects-negative-duration.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-015-rejects-non-integer-tokens.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-016-accepts-zero-values.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-017-accepts-valid-action-with-flag-for-review.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-018-accepts-valid-action-with-auto-execute.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-019-rejects-action-with-empty-type.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-020-rejects-action-with-invalid-execution-mode.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-021-rejects-action-with-extra-fields-in-strict-mode.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-022-accepts-valid-payload-with-action.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-023-accepts-payload-with-null-pattern-detected.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-024-accepts-payload-with-null-action.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-025-accepts-payload-with-llm-context.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-026-rejects-payload-with-confidence-below-0.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-027-rejects-payload-with-confidence-above-1.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-028-accepts-valid-approval-granted-payload.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-029-accepts-payload-with-review-note.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-030-rejects-payload-with-empty-action-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-031-accepts-valid-approval-rejected-payload.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-032-allows-empty-rejection-reason-string.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-033-accepts-valid-approval-expired-payload.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-034-rejects-payload-with-empty-action-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-035-accepts-valid-audit-event.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-036-rejects-event-with-empty-agent-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-037-rejects-event-with-empty-decision-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-038-generates-i-ds-with-dec-prefix.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-039-generates-i-ds-with-expected-format.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-040-generates-unique-i-ds-over-multiple-calls.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-041-uses-a-uui-dv7-payload-in-the-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-042-creates-event-with-pattern-detected-type.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-043-includes-all-required-fields.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-044-includes-llm-context-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-045-does-not-include-llm-context-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-046-handles-null-pattern-detected.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-047-handles-null-action.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-048-creates-event-with-approval-granted-type.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-049-includes-all-required-fields-for-approval-granted.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-050-includes-review-note-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-051-does-not-include-review-note-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-052-creates-event-with-approval-rejected-type.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-053-includes-all-required-fields-for-approval-rejected.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-054-creates-event-with-approval-expired-type.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-055-includes-all-required-fields-for-approval-expired.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-056-creates-event-with-specified-type.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-057-includes-all-required-fields-for-generic-event.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-058-defaults-payload-to-empty-object-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-059-works-with-ds-4-command-routing-types.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-060-works-with-ds-5-lifecycle-types.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-061-returns-true-for-pattern-detected-event.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-062-returns-false-for-approval-granted-event-via-is-pattern-detected.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-063-returns-false-for-approval-rejected-event-via-is-pattern-detected.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-064-returns-true-for-approval-granted-event.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-065-returns-false-for-pattern-detected-event-via-is-approval-granted.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-066-returns-false-for-approval-rejected-event-via-is-approval-granted.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-067-returns-true-for-approval-rejected-event.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-068-returns-false-for-approval-granted-event-via-is-approval-rejected.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-069-returns-false-for-pattern-detected-event-via-is-approval-rejected.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-070-returns-true-for-valid-pattern-detected-audit-event.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-071-returns-true-for-valid-approval-granted-audit-event.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-072-returns-true-for-valid-approval-rejected-audit-event.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-073-returns-true-for-valid-approval-expired-audit-event.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-074-returns-false-for-null.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-075-returns-false-for-undefined.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-076-returns-false-for-empty-object.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-077-returns-false-for-invalid-event-type.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-078-returns-false-for-missing-required-fields.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-079-creates-complete-audit-trail-for-approved-action.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-080-creates-complete-audit-trail-for-rejected-action.sdp.md create mode 100644 specs/behavior/platform-core/agent/audit.examples/s-081-creates-audit-trail-for-expired-action.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-001-returns-true-for-error-recovery-status.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-002-returns-false-for-active-status.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-003-returns-false-for-paused-status.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-004-returns-false-for-stopped-status.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-005-returns-base-config-values-when-overrides-are-undefined.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-006-passes-through-base-rate-limits-when-no-overrides.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-007-omits-rate-limits-when-base-has-none-and-no-overrides.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-008-overrides-confidence-threshold-while-preserving-pattern-window-duration.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-009-overrides-pattern-window-duration-while-preserving-confidence-threshold.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-010-overrides-rate-limits-max-requests-per-minute-while-preserving-base-cost-b.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-011-deep-merges-cost-budget-daily-while-preserving-cost-budget-alert-threshold.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-012-deep-merges-cost-budget-alert-threshold-while-preserving-cost-budget-daily.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-013-fully-overrides-all-config-values.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-014-adds-rate-limits-via-overrides-when-base-has-none.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-015-empty-overrides-object-returns-base-config-values.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-016-applies-config-overrides-to-a-checkpoint-without-existing-overrides.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-017-merges-new-config-overrides-with-existing-overrides.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-018-update-overrides-take-precedence-over-existing.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-019-preserves-existing-config-overrides-when-update-has-no-overrides.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-020-deep-merges-rate-limits-cost-budget-in-checkpoint-overrides.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-021-updates-updated-at-timestamp.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-022-increments-events-processed-count.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-023-preserves-events-processed-when-no-increment-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-024-does-not-add-config-overrides-key-when-neither-existing-nor-update-have-th.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-025-creates-checkpoint-with-sentinel-last-processed-position-of-1.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-026-creates-checkpoint-with-active-status.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-027-creates-checkpoint-with-zero-events-processed.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-028-creates-checkpoint-with-empty-last-event-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-029-sets-updated-at-to-current-time.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-030-preserves-agent-id-and-subscription-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-031-does-not-include-config-overrides.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-001-contains-all-four-statuses.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-002-is-a-readonly-tuple-with-4-elements.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-003-accepts-all-valid-statuses.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-004-rejects-invalid-statuses.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-005-accepts-a-valid-checkpoint-object.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-006-accepts-checkpoint-with-sentinel-position-1.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-007-rejects-checkpoint-with-position-below-1.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-008-rejects-checkpoint-with-negative-events-processed.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-009-rejects-checkpoint-with-empty-agent-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-010-rejects-checkpoint-with-empty-subscription-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-011-rejects-checkpoint-with-missing-required-fields.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-012-creates-checkpoint-with-correct-agent-id-and-subscription-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-013-initializes-position-and-event-tracking-defaults.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-014-initializes-status-to-active.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-015-sets-updated-at-to-current-time.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-016-creates-a-checkpoint-that-passes-schema-validation.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-017-updates-last-processed-position.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-018-updates-last-event-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-019-updates-status.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-020-increments-events-processed-by-specified-amount.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-021-increments-events-processed-by-1-for-single-event.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-022-does-not-increment-events-processed-when-not-specified.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-023-preserves-unchanged-fields.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-024-updates-updated-at-to-current-time.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-025-applies-multiple-updates-at-once.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-026-handles-empty-update-by-only-updating-timestamp.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-027-returns-true-when-event-position-is-greater-than-checkpoint.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-028-returns-false-for-duplicate-event-at-same-position.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-029-returns-false-for-already-processed-event.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-030-returns-true-for-position-0-against-sentinel-1-for-a-new-agent.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-031-returns-true-for-position-1-against-sentinel-1.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-032-returns-true-for-any-positive-position-against-sentinel-1.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-033-returns-true-for-position-1-against-checkpoint-0.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-034-returns-false-for-position-0-against-checkpoint-0.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-035-handles-large-position-values.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-036-processes-sequential-events-correctly.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-037-handles-gaps-in-event-positions.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-038-is-agent-active-returns-true-only-for-active-status.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-039-is-agent-paused-returns-true-only-for-paused-status.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-040-is-agent-stopped-returns-true-only-for-stopped-status.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-041-returns-true-for-a-valid-checkpoint.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-042-returns-true-for-checkpoint-with-sentinel-position.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-043-returns-false-for-null-undefined-and-empty-object.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-044-returns-false-for-non-object-values.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-045-returns-false-for-checkpoint-with-invalid-status.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-046-returns-false-for-checkpoint-with-position-below-1.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-047-returns-false-for-checkpoint-with-negative-events-processed.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-048-new-agent-processes-first-events.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-049-agent-pause-and-resume-preserves-position.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-050-agent-restart-recovery-skips-already-processed-events.sdp.md create mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-051-duplicate-event-delivery-is-idempotent.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-001-routes-command-through-registry-orchestrator-records-audit-and-updates-sta.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-002-records-agent-command-routing-failed-audit-and-sets-status-to-failed-for-u.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-003-records-command-not-registered-error-when-registry-does-not-contain-the-co.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-004-records-invalid-transform-error-when-to-orchestrator-args-throws.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-005-records-agent-command-routing-failed-audit-and-sets-status-to-failed-on-or.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-006-does-not-throw-when-audit-recording-fails-on-success-path.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-007-does-not-throw-when-update-status-mutation-fails-on-success-path.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-008-skips-status-update-without-error-when-update-status-is-undefined-on-succe.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-009-skips-status-update-on-routing-failure-when-update-status-is-undefined.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-010-includes-pattern-id-in-audit-event-payload-when-present-in-args.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-011-does-not-include-pattern-id-in-audit-payload-when-absent-from-args.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-001-emit-recommendation-command.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-002-command-includes-correlation-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-003-command-includes-agent-bc-identifier.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-004-command-includes-reason.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-005-command-includes-confidence.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-006-command-includes-triggering-events.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-007-command-includes-llm-context.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-008-reject-command-without-reason.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-009-reject-command-without-confidence.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-010-reject-confidence-outside-valid-range.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-011-llm-rate-limit-is-handled-with-exponential-backoff.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-012-llm-timeout-falls-back-to-rule-based-emission.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-013-emit-notification-command.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-014-emit-action-command.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-015-emit-escalation-command.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-001-returns-the-route-when-command-type-exists-in-the-map.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-002-returns-undefined-when-command-type-does-not-exist-in-the-map.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-003-returns-undefined-for-empty-route-map.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-004-produces-success-results-for-valid-routes.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-005-returns-command-not-registered-error-for-missing-command-type.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-006-returns-unknown-route-error-for-missing-bounded-context.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-007-returns-invalid-transform-error-for-missing-to-orchestrator-args.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-008-returns-empty-array-for-empty-route-map.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-009-validates-mixed-valid-and-invalid-routes-independently.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-010-contains-all-expected-error-codes.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-011-has-exactly-4-error-codes.sdp.md create mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-012-values-are-string-constants-matching-their-keys.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-001-contains-all-expected-error-codes.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-002-has-exactly-5-error-codes.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-003-accepts-valid-metadata.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-004-accepts-metadata-with-optional-pattern-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-005-accepts-metadata-with-optional-analysis.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-006-rejects-metadata-with-empty-agent-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-007-rejects-metadata-with-empty-decision-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-008-rejects-metadata-with-confidence-below-0.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-009-rejects-metadata-with-confidence-above-1.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-010-rejects-metadata-with-empty-reason.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-011-rejects-metadata-with-empty-event-ids-array.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-012-accepts-confidence-at-boundaries-0-and-1.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-013-accepts-valid-command.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-014-rejects-command-with-empty-type.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-015-accepts-command-with-any-payload-type.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-016-rejects-command-with-invalid-metadata.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-017-returns-invalid-when-type-is-undefined.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-018-returns-invalid-when-type-is-empty-string.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-019-returns-invalid-when-type-is-whitespace-only.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-020-returns-invalid-when-confidence-is-undefined.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-021-returns-invalid-when-confidence-is-below-0.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-022-returns-invalid-when-confidence-is-above-1.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-023-accepts-confidence-at-boundary-values.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-024-returns-invalid-when-reason-is-undefined.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-025-returns-invalid-when-reason-is-empty-string.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-026-returns-invalid-when-reason-is-whitespace-only.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-027-returns-invalid-when-event-ids-is-undefined.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-028-returns-invalid-when-event-ids-is-empty-array.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-029-accepts-single-event-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-030-accepts-multiple-event-i-ds.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-031-returns-valid-for-complete-command-args.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-032-creates-command-with-all-required-fields.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-033-generates-unique-decision-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-034-includes-pattern-id-when-provided-in-options.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-035-does-not-include-pattern-id-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-036-includes-analysis-when-provided-in-options.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-037-does-not-include-analysis-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-038-includes-both-pattern-id-and-analysis-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-039-copies-event-ids-array-without-reference-sharing.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-040-throws-error-for-empty-type.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-041-throws-error-for-invalid-confidence.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-042-throws-error-for-empty-reason.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-043-throws-error-for-empty-event-ids.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-044-includes-error-code-in-thrown-message.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-045-creates-command-from-decision-with-command.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-046-returns-null-when-decision-has-no-command.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-047-includes-pattern-id-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-048-includes-analysis-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-049-maps-all-decision-fields-correctly.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-050-returns-true-for-valid-command.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-051-returns-true-for-command-with-optional-fields.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-052-returns-false-for-non-command-values.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-053-returns-true-when-command-has-pattern-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-054-returns-false-when-command-has-no-pattern-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-055-returns-false-when-pattern-id-is-undefined-explicitly.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-056-returns-true-when-command-has-analysis.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-057-returns-false-when-command-has-no-analysis.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-058-returns-false-when-analysis-is-undefined-explicitly.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-059-returns-true-for-null-analysis.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-060-validates-creates-and-verifies-command.sdp.md create mode 100644 specs/behavior/platform-core/agent/commands.examples/s-061-creates-command-from-decision-and-verifies.sdp.md create mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-001-allowed-when-current-spend-plus-estimated-cost-is-under-budget.sdp.md create mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-002-denied-when-estimated-cost-would-exceed-budget.sdp.md create mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-003-denied-when-current-spend-already-equals-budget.sdp.md create mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-004-allowed-when-estimated-cost-exactly-reaches-budget.sdp.md create mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-005-sets-at-alert-threshold-when-spend-exceeds-alert-threshold.sdp.md create mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-006-does-not-set-at-alert-threshold-when-below-threshold.sdp.md create mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-007-sets-at-alert-threshold-at-exact-threshold-boundary.sdp.md create mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-008-simple-multiplication-of-tokens-and-cost-per-token.sdp.md create mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-009-returns-0-for-0-tokens.sdp.md create mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-010-handles-large-token-counts.sdp.md create mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-011-handles-very-small-cost-per-token.sdp.md create mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-012-claude-model-entry-has-positive-input-and-output-costs-with-output-greater.sdp.md create mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-013-gpt-4o-model-entry-has-positive-input-and-output-costs.sdp.md create mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-014-gpt-4o-mini-model-entry-is-cheaper-than-gpt-4o.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-001-contains-all-expected-error-codes.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-002-has-exactly-3-error-codes.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-003-contains-all-three-statuses-in-order.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-004-is-a-readonly-tuple-with-3-elements.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-005-type-guard-accepts-valid-statuses.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-006-type-guard-rejects-invalid-values.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-007-type-guard-rejects-non-string-types.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-008-accepts-all-valid-statuses.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-009-rejects-invalid-status-values.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-010-accepts-valid-context-with-all-fields.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-011-accepts-context-with-only-correlation-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-012-accepts-context-with-only-error-code.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-013-accepts-empty-context-object.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-014-rejects-context-with-unknown-fields-in-strict-mode.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-015-accepts-valid-dead-letter.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-016-accepts-dead-letter-with-context.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-017-rejects-dead-letter-with-empty-agent-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-018-rejects-dead-letter-with-empty-subscription-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-019-rejects-dead-letter-with-empty-event-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-020-rejects-dead-letter-with-negative-global-position.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-021-accepts-dead-letter-with-global-position-of-0.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-022-rejects-dead-letter-with-non-positive-attempt-count.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-023-rejects-dead-letter-with-missing-required-fields.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-024-removes-content-after-at-when-followed-by-path-like-content.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-025-removes-multi-line-stack-traces.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-026-preserves-the-error-message-itself.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-027-removes-type-script-file-paths-with-at-prefix.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-028-replaces-file-paths-without-at-prefix-with-path-marker.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-029-removes-esm-file-paths-when-preceded-by-at.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-030-replaces-cjs-file-paths-with-path-marker-when-not-preceded-by-at.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-031-removes-paths-with-line-and-column-numbers.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-032-truncates-long-messages-to-500-characters-ending-with-ellipsis.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-033-does-not-truncate-messages-under-500-characters.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-034-does-not-truncate-messages-of-exactly-500-characters.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-035-handles-error-objects.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-036-handles-string-errors.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-037-handles-objects-with-message-property.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-038-handles-unknown-error-types.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-039-handles-null.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-040-handles-undefined.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-041-handles-empty-string.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-042-collapses-multiple-spaces.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-043-trims-leading-and-trailing-whitespace.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-044-handles-newlines.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-045-creates-dead-letter-with-required-fields.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-046-creates-dead-letter-with-pending-status.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-047-sets-attempt-count-to-1.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-048-sets-failed-at-to-current-time.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-049-includes-context-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-050-does-not-include-context-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-051-sanitizes-error-objects-removing-stack-like-patterns.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-052-sanitizes-string-errors.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-053-replaces-paths-in-errors-without-at-prefix.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-054-replaces-paths-with-line-column-suffix.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-055-sanitizes-unknown-error-types.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-056-increments-attempt-count.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-057-updates-error-message.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-058-sanitizes-new-error-message-with-at-pattern.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-059-sanitizes-new-error-message-with-path-replacement.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-060-updates-failed-at-to-current-time.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-061-preserves-other-fields-during-increment.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-062-handles-multiple-increments.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-063-transitions-pending-to-replayed.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-064-preserves-all-other-fields-when-transitioning-to-replayed.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-065-throws-when-marking-replayed-dead-letter-as-replayed.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-066-throws-when-marking-ignored-dead-letter-as-replayed.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-067-transitions-pending-to-ignored.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-068-preserves-all-other-fields-when-transitioning-to-ignored.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-069-throws-when-marking-replayed-dead-letter-as-ignored.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-070-throws-when-marking-already-ignored-dead-letter-as-ignored.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-071-is-dead-letter-pending-returns-true-only-for-pending.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-072-is-dead-letter-replayed-returns-true-only-for-replayed.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-073-is-dead-letter-ignored-returns-true-only-for-ignored.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-074-returns-true-for-valid-dead-letter.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-075-returns-true-for-dead-letter-with-context.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-076-returns-false-for-null.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-077-returns-false-for-undefined.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-078-returns-false-for-empty-object.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-079-returns-false-for-non-object-types.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-080-returns-false-for-dead-letter-with-invalid-status.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-081-returns-false-for-dead-letter-with-missing-fields.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-082-failed-event-processing-and-replay-lifecycle.sdp.md create mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-083-obsolete-event-being-ignored-lifecycle.sdp.md create mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-001-subscribe-to-single-event-type.sdp.md create mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-002-subscribe-to-multiple-event-types.sdp.md create mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-003-agent-does-not-receive-unsubscribed-events.sdp.md create mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-004-filter-by-payload-field.sdp.md create mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-005-filter-by-customer-segment.sdp.md create mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-006-events-delivered-in-publication-order.sdp.md create mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-007-events-from-same-stream-maintain-order.sdp.md create mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-008-agent-resumes-from-last-processed-position-after-restart.sdp.md create mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-009-checkpoint-updated-after-successful-analysis.sdp.md create mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-010-failed-analysis-records-to-dead-letter-without-advancing-checkpoint.sdp.md create mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-011-checkpoint-persists-agent-subscription-state.sdp.md create mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-012-pause-subscription.sdp.md create mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-013-resume-subscription.sdp.md create mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-014-unsubscribe-stops-all-event-delivery.sdp.md create mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-001-execution-mode-based-on-confidence.sdp.md create mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-002-custom-threshold-per-agent.sdp.md create mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-003-requires-approval-action-with-high-confidence.sdp.md create mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-004-auto-approve-action-with-low-confidence.sdp.md create mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-005-configure-multiple-approval-requirements.sdp.md create mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-006-create-review-task.sdp.md create mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-007-approve-pending-action.sdp.md create mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-008-reject-pending-action.sdp.md create mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-009-action-expires-after-timeout.sdp.md create mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-010-custom-timeout-per-action-type.sdp.md create mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-011-approve-action-near-timeout.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-001-rejects-empty-string-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-002-rejects-undefined-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-003-rejects-whitespace-only-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-004-rejects-empty-subscriptions-array.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-005-rejects-undefined-subscriptions.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-006-rejects-negative-threshold.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-007-rejects-threshold-greater-than-1.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-008-rejects-empty-pattern-window-duration.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-009-rejects-whitespace-only-pattern-window-duration.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-010-rejects-action-in-both-requires-approval-and-auto-approve.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-011-rejects-config-with-no-patterns-array.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-012-rejects-config-with-empty-patterns-array.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-013-accepts-valid-config-with-patterns.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-014-accepts-config-without-confidence-threshold.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-015-transforms-a-standard-event-correctly.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-016-wraps-array-payload-in-raw-wrapper.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-017-wraps-null-payload-in-raw-wrapper.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-018-passes-through-object-payloads-without-wrapping.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-019-uses-correlation-id-from-the-chain-not-from-the-event.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-020-subscription-id-starts-with-sub-prefix.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-021-subscription-id-contains-the-agent-id.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-022-subscription-id-contains-a-uuid-segment.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-023-produces-different-i-ds-when-timestamp-differs.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-024-returns-success-with-handle-for-a-valid-config.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-025-returns-error-with-invalid-config-code-for-invalid-config.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-026-uses-existing-checkpoint-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/init.examples/s-027-creates-a-new-checkpoint-when-no-existing-checkpoint-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-001-start-agent-command-carries-type-and-required-fields.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-002-pause-agent-command-carries-optional-reason-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-003-pause-agent-command-has-undefined-reason-when-omitted.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-004-resume-agent-command-carries-correct-type.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-005-stop-agent-command-carries-optional-reason-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-006-reconfigure-agent-command-carries-config-overrides-with-nested-fields.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-007-discriminated-union-narrows-by-type-field-at-runtime.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-008-all-fields-are-optional-in-agent-config-overrides.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-009-partial-rate-limits-with-only-max-requests-per-minute.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-010-nested-cost-budget-overrides-with-only-daily.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-011-error-codes-contain-expected-values-and-count.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-012-success-result-carries-state-transition-fields.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-013-failure-result-with-error-code-carries-message-and-state.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-014-failure-result-without-current-state-for-agent-not-found.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-015-discriminated-union-narrows-to-success-branch.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-016-discriminated-union-narrows-to-failure-branch.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-017-all-lifecycle-validators-are-exported.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-001-agent-lifecycle-states-contains-all-four-states.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-002-agent-lifecycle-events-contains-all-seven-events.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-003-transition-agent-state-returns-correct-target-for-every-valid-transition.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-004-is-valid-agent-transition-returns-true-for-every-valid-pair.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-005-transition-agent-state-returns-null-for-representative-invalid-pairs.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-006-exactly-18-invalid-pairs-exist-and-all-return-false.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-007-exactly-18-invalid-pairs-return-null-from-transition-agent-state.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-008-assert-valid-agent-transition-returns-next-state-for-valid-transitions.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-009-assert-valid-agent-transition-throws-for-invalid-transition.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-010-assert-valid-agent-transition-error-message-includes-details.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-011-get-valid-agent-events-from-returns-correct-events-for-stopped.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-012-get-valid-agent-events-from-returns-correct-events-for-active.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-013-get-valid-agent-events-from-returns-correct-events-for-paused.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-014-get-valid-agent-events-from-returns-correct-events-for-error-recovery.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-015-get-all-agent-transitions-returns-exactly-10-transitions.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-016-each-transition-has-from-event-and-to-fields.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-017-get-all-agent-transitions-contains-specific-transitions.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-018-get-all-agent-transitions-returns-same-reference-each-call.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-019-is-agent-error-state-returns-correct-classification-for-all-states.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-020-is-agent-processing-state-returns-correct-classification-for-all-states.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-021-command-to-event-maps-known-commands-and-returns-null-for-unknown.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-001-happy-path-stopped-to-active-with-agent-started-audit.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-002-rejects-start-from-active-state.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-003-rejects-start-from-paused-state.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-004-happy-path-active-to-paused-with-agent-paused-audit-and-reason.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-005-rejects-pause-from-stopped-state.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-006-happy-path-paused-to-active-with-agent-resumed-audit.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-007-rejects-resume-from-stopped-state.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-008-happy-path-active-to-stopped-with-agent-stopped-audit.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-009-happy-path-paused-to-stopped-as-universal-escape-hatch.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-010-happy-path-error-recovery-to-stopped.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-011-rejects-stop-from-already-stopped-state.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-012-reconfigures-active-agent-with-merged-overrides.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-013-reconfigures-paused-agent-transitioning-to-active.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-014-rejects-reconfigure-from-stopped-state.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-015-handles-first-time-config-overrides-when-checkpoint-has-none.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-016-factory-returns-all-5-handler-functions.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-017-factory-handlers-complete-a-start-pause-stop-round-trip.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-018-uses-no-op-logger-when-none-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-019-logs-warning-on-invalid-transition.sdp.md create mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-001-returns-immediately-without-calling-any-mutations.sdp.md create mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-002-records-dead-letter-and-audit-event-but-does-not-advance-checkpoint.sdp.md create mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-003-advances-checkpoint-when-return-value-is-null.sdp.md create mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-004-persists-in-correct-order-when-requires-approval-is-true.sdp.md create mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-005-updates-checkpoint-with-correct-args.sdp.md create mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-006-uses-default-24h-timeout-for-approval-expires-at.sdp.md create mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-007-records-command-but-not-approval-when-requires-approval-is-false.sdp.md create mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-008-does-not-create-approval-when-requires-approval-is-true-but-command-is-nul.sdp.md create mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-009-uses-custom-approval-timeout-ms-for-approval-expires-at.sdp.md create mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-010-records-audit-and-checkpoint-but-skips-command-and-approval.sdp.md create mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-011-skips-when-checkpoint-position-equals-event-position.sdp.md create mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-012-catches-checkpoint-error-and-creates-dead-letter-instead-of-throwing.sdp.md create mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-013-dead-letters-and-skips-checkpoint-when-audit-persistence-fails.sdp.md create mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-014-dead-letters-and-skips-checkpoint-when-command-persistence-fails.sdp.md create mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-015-dead-letters-and-skips-checkpoint-when-approval-persistence-fails.sdp.md create mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-016-success-persistence-calls-include-verification-proofs.sdp.md create mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-017-does-not-throw-even-when-dead-letter-recording-also-fails.sdp.md create mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-018-does-not-throw-when-failed-result-dead-letter-recording-fails.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-001-define-rule-based-pattern.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-002-define-llm-analyzed-pattern.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-003-window-respects-time-boundary.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-004-window-respects-event-limit.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-005-empty-window-returns-no-patterns.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-006-pattern-window-loads-events-lazily-for-memory-efficiency.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-007-detect-churn-risk-from-cancellations.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-008-detect-fraud-risk-from-frequency-anomaly.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-009-no-pattern-when-threshold-not-met.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-010-llm-analyzes-event-sequence.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-011-llm-response-includes-suggested-action.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-012-llm-timeout-handled-gracefully.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-001-returns-null-matched-pattern-and-null-decision-for-empty-patterns-array.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-002-returns-rule-based-decision-when-trigger-returns-true-and-no-analyze.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-003-skips-pattern-when-trigger-returns-false.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-004-returns-llm-decision-when-analyze-returns-detected.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-005-continues-to-next-pattern-when-analyze-returns-not-detected.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-006-propagates-error-when-analyze-throws.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-007-stops-after-first-matching-pattern.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-008-falls-through-to-second-pattern-when-first-trigger-is-false.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-009-skips-pattern-when-min-events-is-not-met.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-010-processes-pattern-when-min-events-is-met.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-011-excludes-events-outside-the-pattern-window.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-012-returns-no-match-when-all-events-are-outside-the-window.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-013-extracts-command-type-from-analysis-result.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-014-returns-null-command-when-no-command-present.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-015-uses-command-payload-when-command-is-present.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-016-uses-result-data-as-payload-when-no-command-present.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-017-requires-approval-when-confidence-is-below-threshold.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-018-does-not-require-approval-when-confidence-meets-threshold.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-019-does-not-require-approval-when-confidence-equals-threshold.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-020-always-requires-approval-when-no-command-is-present.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-021-forces-approval-when-command-is-in-requires-approval-list.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-022-skips-approval-when-command-is-in-auto-approve-list.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-023-requires-approval-takes-precedence-over-auto-approve-for-same-command.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-024-returns-null-command-for-trigger-only-decision.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-025-always-requires-approval-for-trigger-only-decision.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-026-includes-pattern-name-in-trigger-decision-reason.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-027-includes-event-count-in-trigger-decision-reason.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-028-includes-all-event-i-ds-in-triggering-events.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-029-returns-0-6-confidence-for-1-event.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-030-returns-0-7-confidence-for-2-events.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-031-returns-0-8-confidence-for-3-events.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-032-caps-at-0-85-for-4-events.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-033-caps-at-0-85-for-10-events.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-034-returns-0-5-for-0-events-edge-case.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-001-error-codes-object-contains-all-expected-codes.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-002-single-valid-pattern-passes.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-003-multiple-patterns-with-unique-names-pass.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-004-patterns-with-different-window-configurations-pass.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-005-pattern-with-analyze-function-passes.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-006-empty-array-returns-valid.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-007-two-patterns-with-same-name-fail.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-008-duplicate-detected-in-middle-of-array.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-009-short-circuits-on-first-duplicate-found.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-010-empty-name-fails-with-pattern-name-required.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-011-whitespace-only-name-fails-with-pattern-name-required.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-012-invalid-pattern-short-circuits-before-duplicate-check.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-013-pattern-without-trigger-function-fails.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-014-pattern-with-non-function-trigger-fails.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-015-pattern-name-required-maps-to-registry-pattern-name-required.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-016-trigger-required-maps-to-registry-trigger-required.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-017-unknown-pattern-error-codes-map-to-invalid-pattern.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-018-accepts-readonly-array-input.sdp.md create mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-019-error-result-has-correct-discriminated-union-shape.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-001-error-codes-contain-all-expected-values.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-002-accepts-valid-window-with-duration-only.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-003-accepts-window-with-all-optional-fields.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-004-rejects-window-with-empty-duration.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-005-rejects-window-with-missing-duration.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-006-rejects-window-with-non-positive-event-limit.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-007-rejects-window-with-negative-event-limit.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-008-rejects-window-with-non-positive-min-events.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-009-rejects-window-with-non-positive-load-batch-size.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-010-rejects-window-with-non-integer-event-limit.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-011-parses-days-format-correctly.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-012-parses-hours-format-correctly.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-013-parses-minutes-format-correctly.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-014-handles-uppercase-units.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-015-returns-null-for-invalid-formats.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-016-trims-leading-and-trailing-whitespace.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-017-returns-true-for-valid-duration-formats.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-018-returns-false-for-invalid-duration-formats.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-019-returns-invalid-when-name-is-missing.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-020-returns-invalid-when-name-is-empty-string.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-021-returns-invalid-when-name-is-whitespace-only.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-022-returns-invalid-when-trigger-is-missing.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-023-returns-invalid-when-trigger-is-not-a-function.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-024-returns-invalid-when-duration-format-is-invalid.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-025-returns-invalid-when-duration-is-empty.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-026-returns-invalid-when-event-limit-is-non-positive.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-027-returns-invalid-when-event-limit-is-negative.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-028-returns-invalid-when-event-limit-is-not-an-integer.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-029-returns-invalid-when-min-events-is-non-positive.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-030-returns-invalid-when-load-batch-size-is-non-positive.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-031-returns-valid-for-minimal-definition.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-032-returns-valid-for-complete-definition.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-033-returns-valid-for-definition-with-all-window-options.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-034-returns-the-definition-when-valid.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-035-throws-error-when-name-is-missing.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-036-throws-error-when-trigger-is-missing.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-037-throws-error-when-duration-is-invalid.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-038-includes-error-code-in-thrown-error-message.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-039-calculates-boundary-for-days.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-040-calculates-boundary-for-hours.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-041-calculates-boundary-for-minutes.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-042-uses-date-now-when-now-is-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-043-throws-error-for-invalid-duration-format.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-044-includes-events-within-the-window.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-045-excludes-events-outside-the-window.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-046-includes-events-exactly-at-the-boundary.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-047-applies-event-limit-and-takes-most-recent.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-048-does-not-limit-when-under-event-limit.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-049-returns-empty-array-when-no-events-match.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-050-handles-empty-events-array.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-051-returns-true-when-events-count-meets-min-events.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-052-returns-true-when-events-count-exceeds-min-events.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-053-returns-false-when-events-count-is-below-min-events.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-054-defaults-to-min-events-of-1.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-055-returns-false-for-empty-events-when-min-events-is-default.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-056-returns-true-when-event-count-meets-threshold.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-057-returns-true-when-event-count-exceeds-threshold.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-058-returns-false-when-event-count-is-below-threshold.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-059-returns-true-when-event-type-is-present.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-060-returns-false-when-event-type-is-not-present.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-061-returns-true-when-any-of-multiple-event-types-is-present.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-062-respects-min-count-parameter.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-063-returns-true-when-min-count-is-met.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-064-returns-true-when-minimum-streams-are-present.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-065-returns-false-when-below-minimum-streams.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-066-counts-unique-streams-correctly.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-067-returns-true-when-all-triggers-match.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-068-returns-false-when-any-trigger-does-not-match.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-069-returns-false-when-no-triggers-match.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-070-returns-true-for-empty-triggers-array.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-071-passes-events-to-each-trigger.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-072-returns-true-when-any-trigger-matches.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-073-returns-true-when-all-triggers-match.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-074-returns-false-when-no-triggers-match.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-075-returns-false-for-empty-triggers-array.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-076-short-circuits-on-first-match.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-077-combines-count-threshold-with-event-type-using-all.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-078-fails-all-when-event-type-missing-despite-count-met.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-079-combines-any-with-count-thresholds-alert-present.sdp.md create mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-080-combines-any-with-count-thresholds-neither-condition-met.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-001-all-expected-error-codes-are-present-with-correct-values.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-002-error-codes-object-has-exactly-8-entries.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-003-accepts-valid-cost-budget.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-004-rejects-budget-with-zero-daily.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-005-rejects-budget-with-negative-daily.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-006-rejects-budget-with-alert-threshold-above-1.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-007-rejects-budget-with-negative-alert-threshold.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-008-accepts-alert-threshold-at-boundary-0.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-009-accepts-alert-threshold-at-boundary-1.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-010-accepts-valid-config-with-required-fields-only.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-011-accepts-config-with-all-optional-fields.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-012-rejects-config-with-zero-max-requests-per-minute.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-013-rejects-config-with-negative-max-requests-per-minute.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-014-rejects-config-with-non-integer-max-requests-per-minute.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-015-rejects-config-with-zero-max-concurrent.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-016-rejects-config-with-zero-queue-depth.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-017-returns-invalid-when-max-requests-per-minute-is-undefined.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-018-returns-invalid-when-max-requests-per-minute-is-zero.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-019-returns-invalid-when-max-requests-per-minute-is-negative.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-020-returns-invalid-when-max-requests-per-minute-is-not-an-integer.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-021-returns-valid-for-positive-integer-max-requests-per-minute.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-022-returns-invalid-when-max-concurrent-is-zero.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-023-returns-invalid-when-max-concurrent-is-negative.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-024-returns-invalid-when-max-concurrent-is-not-an-integer.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-025-returns-valid-when-max-concurrent-is-undefined.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-026-returns-invalid-when-queue-depth-is-zero.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-027-returns-invalid-when-queue-depth-is-negative.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-028-returns-invalid-when-queue-depth-is-not-an-integer.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-029-returns-invalid-when-cost-budget-daily-is-zero.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-030-returns-invalid-when-cost-budget-daily-is-negative.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-031-returns-invalid-when-cost-budget-alert-threshold-is-below-0.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-032-returns-invalid-when-cost-budget-alert-threshold-is-above-1.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-033-returns-valid-when-cost-budget-is-valid.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-034-returns-valid-for-complete-valid-config.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-035-default-config-has-correct-field-values.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-036-default-config-passes-validation.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-037-creates-config-with-specified-daily-budget.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-038-uses-default-alert-threshold-when-not-specified.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-039-uses-specified-alert-threshold.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-040-uses-specified-max-requests-per-minute.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-041-uses-default-max-requests-per-minute-when-not-specified.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-042-includes-all-optional-fields.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-043-creates-error-with-code-and-message.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-044-creates-error-without-optional-fields-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-045-creates-error-with-retry-after-ms-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-046-creates-error-with-context-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-047-creates-error-with-both-retry-after-ms-and-context.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-048-returns-true-for-valid-rate-limit-error.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-049-returns-true-for-all-known-error-codes.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-050-returns-false-for-non-error-values.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-051-retryable-error-codes.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-052-returns-false-for-non-rate-limit-errors.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-053-permanent-error-codes.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-054-returns-false-for-non-rate-limit-errors.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-055-exponential-2-n-growth-pattern-with-math-random-mocked-to-0.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-056-caps-at-default-max-delay-of-60000ms.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-057-caps-at-custom-max-delay.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-058-does-not-cap-when-delay-is-below-max.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-059-adds-jitter-up-to-25-of-delay.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-060-adds-max-jitter-of-25-when-random-is-1.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-061-uses-default-base-delay-of-1000ms.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-062-uses-default-max-delay-of-60000ms.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-063-returns-floored-integer.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-064-returns-true-when-total-exceeds-budget.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-065-returns-false-when-total-is-under-budget.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-066-returns-false-when-total-equals-budget-exactly.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-067-returns-true-when-current-spend-already-exceeds-budget.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-068-handles-zero-current-spend-under-budget.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-069-handles-zero-current-spend-over-budget.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-070-handles-small-decimal-values-under-budget.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-071-handles-small-decimal-values-over-budget.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-072-returns-true-when-spend-reaches-threshold-percentage.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-073-returns-true-when-spend-exceeds-threshold.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-074-returns-false-when-spend-is-below-threshold.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-075-handles-threshold-of-0-always-alert.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-076-handles-threshold-of-1-below-full-budget.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-077-handles-threshold-of-1-at-full-budget.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-078-returns-defaults-when-no-config-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-079-returns-defaults-when-undefined-config-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-080-uses-provided-max-requests-per-minute.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-081-uses-default-max-concurrent-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-082-uses-provided-max-concurrent.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-083-uses-default-queue-depth-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-084-uses-provided-queue-depth.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-085-preserves-cost-budget-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-086-does-not-include-cost-budget-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-001-calls-generate-text-and-parses-a-valid-json-response.sdp.md create mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-002-handles-non-json-response-with-defaults.sdp.md create mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-003-handles-malformed-json-gracefully.sdp.md create mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-004-re-throws-generate-text-errors.sdp.md create mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-005-tracks-timing-in-llm-context.sdp.md create mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-006-includes-thread-id-in-llm-context-when-present.sdp.md create mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-007-omits-thread-id-from-llm-context-when-not-present.sdp.md create mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-008-handles-missing-usage-with-zero-tokens.sdp.md create mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-009-calls-generate-text-and-parses-json-response-for-reason.sdp.md create mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-010-returns-raw-text-when-response-is-not-json.sdp.md create mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-011-re-throws-generate-text-errors-from-reason.sdp.md create mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-012-logs-reasoning-start-and-completion.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-001-executes-commands-sequentially-in-atomic-mode.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-002-stops-on-first-failure-and-skips-remaining-in-atomic-mode.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-003-rejects-batch-for-cross-aggregate-commands-in-atomic-mode.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-004-uses-shared-correlation-id-in-atomic-mode.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-005-allows-command-level-correlation-id-override-in-atomic-mode.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-006-executes-all-commands-even-with-failures-in-partial-mode.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-007-returns-success-when-all-commands-succeed-in-partial-mode.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-008-allows-cross-aggregate-commands-in-partial-mode.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-009-respects-max-concurrency-in-partial-mode.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-010-stops-on-failure-when-continue-on-error-is-false-in-partial-mode.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-011-tracks-individual-command-results.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-012-includes-duration-for-each-command.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-013-includes-error-message-for-failed-commands.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-014-calculates-correct-summary-statistics.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-015-handles-executor-throwing-errors.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-016-handles-empty-batch-gracefully.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-017-rejects-batch-exceeding-max-command-count-before-execution.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-018-accepts-batch-exactly-at-max-command-count.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-019-accepts-batch-exactly-at-default-max-command-count.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-020-rejects-batch-exceeding-default-max-command-count-before-execution.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-021-rejects-commands-from-wrong-bounded-context.sdp.md create mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-022-creates-a-batch-executor-instance-via-factory.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-001-rejects-empty-batch.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-002-accepts-batch-exactly-at-max-size.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-003-rejects-batch-exceeding-max-size.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-004-accepts-batch-exactly-at-default-max-size.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-005-rejects-batch-exceeding-default-max-size.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-006-accepts-valid-commands-without-registry.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-007-accepts-commands-in-different-bounded-contexts.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-008-requires-aggregate-id-option.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-009-requires-aggregate-id-field-option.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-010-accepts-when-all-commands-target-same-aggregate.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-011-rejects-when-commands-target-different-aggregates.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-012-accepts-commands-targeting-same-aggregate-with-explicit-aggregate-id.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-013-infers-aggregate-id-from-first-command-when-not-specified.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-014-rejects-when-commands-target-different-aggregate-instances.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-015-rejects-when-commands-target-different-aggregate-types.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-016-rejects-non-aggregate-commands-in-atomic-mode.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-017-rejects-unregistered-commands.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-018-accepts-commands-matching-specified-bounded-context.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-019-rejects-commands-from-wrong-bounded-context.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-020-extracts-id-from-command-args.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-021-returns-undefined-for-missing-field.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-022-returns-undefined-for-non-string-value.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-023-groups-commands-by-aggregate-id.sdp.md create mode 100644 specs/behavior/platform-core/batch/validation.examples/s-024-uses-placeholder-for-missing-i-ds.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-001-state-at-current-version-is-returned-as-is.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-002-state-is-migrated-from-v1-to-v2.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-003-state-is-migrated-from-v1-to-v3.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-004-legacy-state-without-state-version-is-treated-as-version-0.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-005-null-input-throws-cms-upcaster-error.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-006-undefined-input-throws-cms-upcaster-error.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-007-incomplete-migration-chain-throws-at-creation-time.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-008-future-state-version-throws-cms-upcaster-error.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-009-migration-function-error-propagates-mid-chain.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-010-first-migration-function-error-propagates.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-011-state-at-current-version-is-returned-as-is-via-upcast-if-needed.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-012-state-is-migrated-via-upcast-if-needed.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-013-validation-passes-when-state-is-valid.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-014-validation-fails-when-state-is-invalid.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-015-future-state-version-throws-cms-upcaster-error-via-upcast-if-needed.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-016-error-has-correct-name.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-017-error-has-correct-code.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-018-error-has-correct-message.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-019-error-stores-context-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-020-error-has-undefined-context-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-021-error-is-instanceof-error.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-022-validation-passes-for-current-version-state.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-023-validation-fails-for-current-version-state-with-empty-description.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-024-validation-passes-after-upcasting-from-v1.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-025-validation-fails-after-upcasting-produces-invalid-state.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-026-static-default-value-is-added.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-027-computed-default-value-is-added.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-028-computed-default-accesses-state.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-029-existing-fields-are-preserved.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-030-field-is-renamed.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-031-other-fields-are-preserved-when-renaming.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-032-undefined-value-in-renamed-field-is-handled.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-033-specified-field-is-removed.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-034-other-fields-are-preserved-when-removing.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-035-non-existent-field-is-handled-gracefully.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-036-add-cms-field-migration-works-in-migration-chain.sdp.md create mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-037-multiple-helper-migrations-are-chained.sdp.md create mode 100644 specs/behavior/platform-core/commands/categories.examples/s-001-command-categories-has-exactly-four-entries-in-the-correct-order.sdp.md create mode 100644 specs/behavior/platform-core/commands/categories.examples/s-002-schema-accepts-valid-category-strings.sdp.md create mode 100644 specs/behavior/platform-core/commands/categories.examples/s-003-schema-rejects-invalid-category-values.sdp.md create mode 100644 specs/behavior/platform-core/commands/categories.examples/s-004-default-command-category-is-aggregate.sdp.md create mode 100644 specs/behavior/platform-core/commands/categories.examples/s-005-type-guard-accepts-all-valid-categories.sdp.md create mode 100644 specs/behavior/platform-core/commands/categories.examples/s-006-type-guard-rejects-invalid-values.sdp.md create mode 100644 specs/behavior/platform-core/commands/categories.examples/s-007-valid-categories-are-returned-unchanged.sdp.md create mode 100644 specs/behavior/platform-core/commands/categories.examples/s-008-invalid-values-normalize-to-aggregate.sdp.md create mode 100644 specs/behavior/platform-core/commands/categories.examples/s-009-classification-of-categories-as-aggregate.sdp.md create mode 100644 specs/behavior/platform-core/commands/categories.examples/s-010-classification-of-categories-as-process.sdp.md create mode 100644 specs/behavior/platform-core/commands/categories.examples/s-011-classification-of-categories-as-system.sdp.md create mode 100644 specs/behavior/platform-core/commands/categories.examples/s-012-classification-of-categories-as-batch.sdp.md create mode 100644 specs/behavior/platform-core/commands/categories.examples/s-013-schema-accepts-valid-aggregate-targets.sdp.md create mode 100644 specs/behavior/platform-core/commands/categories.examples/s-014-schema-rejects-invalid-aggregate-targets.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-001-error-categories-has-exactly-four-entries-with-correct-values.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-002-error-category-members-have-correct-string-values.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-003-type-guard-accepts-valid-error-categories.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-004-type-guard-rejects-invalid-values.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-005-command-error-is-created-with-all-properties.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-006-command-error-is-an-instance-of-error.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-007-command-error-from-returns-existing-command-error-unchanged.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-008-command-error-from-wraps-a-regular-error.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-009-command-error-from-wraps-a-string-value.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-010-command-error-from-wraps-an-unknown-value.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-011-to-json-serializes-error-with-context.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-012-to-json-handles-undefined-context.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-013-factory-creates-domain-error.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-014-factory-creates-validation-error.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-015-factory-creates-concurrency-error.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-016-factory-creates-infrastructure-error.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-017-factory-creates-not-found-error.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-018-factory-creates-already-exists-error.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-019-factory-creates-invalid-state-error.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-020-factory-creates-unauthorized-error.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-021-factory-creates-rate-limited-error.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-022-returns-true-for-matching-category.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-023-returns-false-for-non-matching-category.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-024-returns-false-for-non-command-error.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-025-recoverable-errors-are-identified-correctly.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-026-non-recoverable-error-gets-delay-of-1.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-027-concurrency-error-delays-escalate-then-cap.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-028-infrastructure-error-delays-escalate-then-cap.sdp.md create mode 100644 specs/behavior/platform-core/commands/errors.examples/s-029-unknown-error-gets-infrastructure-style-delay.sdp.md create mode 100644 specs/behavior/platform-core/commands/factories.examples/s-001-schema-assigns-aggregate-category-and-preserves-command-type.sdp.md create mode 100644 specs/behavior/platform-core/commands/factories.examples/s-002-aggregate-target-is-present-on-parsed-command.sdp.md create mode 100644 specs/behavior/platform-core/commands/factories.examples/s-003-aggregate-target-is-undefined-when-not-configured.sdp.md create mode 100644 specs/behavior/platform-core/commands/factories.examples/s-004-schema-rejects-a-mismatched-command-type.sdp.md create mode 100644 specs/behavior/platform-core/commands/factories.examples/s-005-schema-rejects-commands-missing-required-fields.sdp.md create mode 100644 specs/behavior/platform-core/commands/factories.examples/s-006-schema-assigns-process-category-and-preserves-command-type.sdp.md create mode 100644 specs/behavior/platform-core/commands/factories.examples/s-007-process-type-is-present-on-parsed-command.sdp.md create mode 100644 specs/behavior/platform-core/commands/factories.examples/s-008-process-type-is-undefined-when-not-configured.sdp.md create mode 100644 specs/behavior/platform-core/commands/factories.examples/s-009-schema-assigns-system-category-and-preserves-command-type.sdp.md create mode 100644 specs/behavior/platform-core/commands/factories.examples/s-010-requires-idempotency-defaults-to-false.sdp.md create mode 100644 specs/behavior/platform-core/commands/factories.examples/s-011-requires-idempotency-can-be-set-to-true.sdp.md create mode 100644 specs/behavior/platform-core/commands/factories.examples/s-012-schema-assigns-batch-category-with-items.sdp.md create mode 100644 specs/behavior/platform-core/commands/factories.examples/s-013-batch-config-is-present-on-parsed-command.sdp.md create mode 100644 specs/behavior/platform-core/commands/factories.examples/s-014-schema-rejects-items-that-fail-item-schema-validation.sdp.md create mode 100644 specs/behavior/platform-core/commands/factories.examples/s-015-empty-items-array-is-accepted.sdp.md create mode 100644 specs/behavior/platform-core/commands/factories.examples/s-016-category-is-extracted-from-each-factory-schema.sdp.md create mode 100644 specs/behavior/platform-core/commands/factories.examples/s-017-non-command-schemas-return-undefined.sdp.md create mode 100644 specs/behavior/platform-core/commands/naming.examples/s-001-command-name-prefixes-includes-all-standard-prefixes.sdp.md create mode 100644 specs/behavior/platform-core/commands/naming.examples/s-002-create-pattern-accepts-valid-create-prefixed-names.sdp.md create mode 100644 specs/behavior/platform-core/commands/naming.examples/s-003-add-pattern-accepts-valid-add-prefixed-names.sdp.md create mode 100644 specs/behavior/platform-core/commands/naming.examples/s-004-update-pattern-accepts-update-change-and-modify-prefixes.sdp.md create mode 100644 specs/behavior/platform-core/commands/naming.examples/s-005-valid-command-names-are-accepted.sdp.md create mode 100644 specs/behavior/platform-core/commands/naming.examples/s-006-invalid-command-names-are-rejected.sdp.md create mode 100644 specs/behavior/platform-core/commands/naming.examples/s-007-valid-names-return-matched-prefix-and-valid-flag.sdp.md create mode 100644 specs/behavior/platform-core/commands/naming.examples/s-008-invalid-name-returns-suggestions-and-error-message.sdp.md create mode 100644 specs/behavior/platform-core/commands/naming.examples/s-009-inverted-name-receives-corrected-suggestion.sdp.md create mode 100644 specs/behavior/platform-core/commands/naming.examples/s-010-suggestions-are-limited-to-at-most-3.sdp.md create mode 100644 specs/behavior/platform-core/commands/naming.examples/s-011-known-names-return-their-prefix.sdp.md create mode 100644 specs/behavior/platform-core/commands/naming.examples/s-012-invalid-or-empty-names-return-undefined.sdp.md create mode 100644 specs/behavior/platform-core/commands/naming.examples/s-013-various-input-formats-produce-correct-pascal-case-names.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-001-chain-uses-command-id-as-causation-id-and-generates-correlation-id.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-002-chain-uses-provided-correlation-id.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-003-chain-uses-provided-user-id.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-004-chain-uses-provided-context.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-005-chain-uses-provided-initiated-at.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-006-chain-accepts-all-options-together.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-007-derived-chain-preserves-correlation-id-and-uses-event-id-as-causation-id.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-008-derived-chain-inherits-user-id-from-source.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-009-derived-chain-inherits-context-from-source.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-010-derived-chain-merges-source-and-option-contexts.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-011-option-context-takes-precedence-over-source-context.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-012-source-context-preserved-when-options-have-no-context.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-013-options-context-used-when-source-has-no-context.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-014-context-is-undefined-when-neither-source-nor-options-have-context.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-015-both-empty-contexts-merge-to-empty-object.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-016-source-context-preserved-when-options-context-is-empty.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-017-options-context-used-when-source-context-is-empty.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-018-derived-chain-uses-provided-command-id.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-019-derived-chain-uses-provided-initiated-at.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-020-extracts-correlation-id-and-causation-id.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-021-includes-user-id-when-present.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-022-excludes-user-id-when-undefined.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-023-merges-additional-metadata.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-024-does-not-include-context-initiated-at-or-command-id-from-chain.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-025-returns-true-for-chains-with-same-correlation-id.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-026-returns-false-for-chains-with-different-correlation-ids.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-027-returns-true-when-child-causation-id-matches-parent-command-id.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-028-returns-false-when-child-causation-id-does-not-match.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-029-returns-true-for-same-chain-where-command-is-its-own-cause.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-030-full-request-flow-tracing-from-user-command-through-saga-reaction.sdp.md create mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-031-multi-step-saga-preserves-correlation-id-across-three-links.sdp.md create mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-001-record-a-new-correlation.sdp.md create mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-002-merge-event-i-ds-for-existing-correlation.sdp.md create mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-003-return-null-for-non-existent-command.sdp.md create mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-004-return-correlation-for-existing-command.sdp.md create mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-005-filter-by-bounded-context.sdp.md create mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-006-throw-when-bounded-context-is-missing.sdp.md create mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-007-respect-limit-parameter.sdp.md create mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-008-return-true-for-command-with-events.sdp.md create mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-009-return-false-for-non-existent-command.sdp.md create mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-010-return-event-count-for-existing-command.sdp.md create mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-011-return-0-for-non-existent-command.sdp.md create mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-012-create-a-correlation-service-instance.sdp.md create mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-001-successful-execution-without-scope-operations.sdp.md create mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-002-successful-execution-includes-schema-version-and-category-in-events.sdp.md create mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-003-rejected-decider-result-returns-rejection.sdp.md create mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-004-failed-decider-result-returns-failure-with-event.sdp.md create mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-005-occ-pre-check-passes-when-expected-version-matches-scope-version.sdp.md create mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-006-occ-pre-check-detects-stale-expected-version.sdp.md create mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-007-occ-pre-check-detects-scope-not-found-when-expected-version-0.sdp.md create mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-008-occ-pre-check-allows-new-scope-with-expected-version-0.sdp.md create mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-009-occ-commit-detects-concurrent-modification.sdp.md create mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-010-occ-commit-tracks-updated-stream-i-ds.sdp.md create mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-011-invalid-scope-key-returns-rejection.sdp.md create mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-012-missing-entities-returns-rejection.sdp.md create mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-001-create-valid-scope-key-from-components.sdp.md create mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-002-scope-id-may-contain-colons-for-composite-identifiers.sdp.md create mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-003-create-scope-key-throws-on-invalid-input.sdp.md create mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-004-try-create-scope-key-returns-scope-key-for-valid-input.sdp.md create mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-005-try-create-scope-key-returns-null-for-invalid-input.sdp.md create mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-006-parse-valid-scope-key-into-components.sdp.md create mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-007-parse-scope-key-with-composite-scope-id-containing-colons.sdp.md create mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-008-parse-scope-key-returns-null-for-invalid-format.sdp.md create mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-009-validate-scope-key-returns-null-for-valid-scope-key.sdp.md create mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-010-validate-scope-key-returns-scope-key-empty-error-for-empty-string.sdp.md create mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-011-validate-scope-key-returns-error-for-missing-tenant-prefix.sdp.md create mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-012-validate-scope-key-returns-error-for-malformed-scope-key.sdp.md create mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-013-is-valid-scope-key-type-guard.sdp.md create mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-014-assert-valid-scope-key-throws-on-invalid-input.sdp.md create mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-015-assert-valid-scope-key-succeeds-on-valid-input.sdp.md create mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-016-is-scope-tenant-checks-tenant-membership.sdp.md create mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-017-extract-tenant-id-returns-tenant-id-from-scope-key.sdp.md create mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-018-extract-scope-type-returns-scope-type-from-scope-key.sdp.md create mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-019-extract-scope-id-returns-scope-id-from-scope-key.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-001-handler-calls-load-state-with-correct-entity-id.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-002-handler-calls-decider-with-state-command-input-and-context.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-003-handler-calls-apply-update-with-correct-parameters.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-004-handler-returns-success-result-with-correct-structure.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-005-handler-increments-version-correctly-from-existing-version.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-006-handler-returns-rejected-result-without-calling-apply-update.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-007-rejected-result-includes-rejection-details.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-008-handler-returns-failed-result-without-calling-apply-update.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-009-failed-result-includes-failure-event-and-details.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-010-handler-propagates-load-state-errors.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-011-handler-uses-custom-error-handler-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-012-handler-rethrows-when-custom-error-handler-returns-nothing.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-013-handler-logs-debug-on-success.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-014-handler-logs-debug-on-rejection.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-015-handler-logs-error-on-exception.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-016-handler-generates-unique-event-id-per-invocation.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-017-handler-includes-schema-version-in-event-metadata.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-018-handler-builds-correct-stream-id-from-entity-id.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-019-entity-handler-calls-try-load-state-with-correct-entity-id.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-020-entity-handler-calls-decider-with-null-state-when-entity-does-not-exist.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-021-entity-handler-calls-insert-for-new-entities.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-022-entity-handler-returns-success-with-version-1-for-new-entities.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-023-entity-handler-generates-correct-event-metadata-for-new-entities.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-024-entity-handler-calls-decider-with-existing-state-when-entity-exists.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-025-entity-handler-returns-rejection-when-entity-already-exists.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-026-entity-handler-does-not-call-insert-when-entity-already-exists.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-027-entity-handler-returns-failed-result-with-version-0-for-non-existent-entit.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-028-entity-handler-does-not-call-insert-on-business-failure.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-029-entity-handler-propagates-try-load-state-errors.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-030-entity-handler-propagates-insert-errors.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-031-entity-handler-uses-custom-error-handler-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-032-entity-handler-logs-debug-on-entity-creation-success.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-033-entity-handler-logs-debug-on-rejection.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-034-entity-handler-generates-unique-event-id-for-each-creation.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-035-entity-handler-includes-schema-version-in-metadata.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-036-pre-validate-rejection-short-circuits-handler.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-037-pre-validate-returning-undefined-allows-normal-flow.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-038-pre-validate-receives-correct-arguments.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-039-pre-validate-failure-is-logged.sdp.md create mode 100644 specs/behavior/platform-core/decider/factory.examples/s-040-handler-works-normally-without-pre-validate-configured.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-001-dcb-succeeds-on-first-attempt.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-002-rejected-result-passes-through-unchanged.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-003-conflict-triggers-retry-with-updated-version.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-005-scope-aware-scheduling-key-is-preserved.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-006-successful-retry-calls-on-complete-with-result.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-007-version-advances-during-retry-delay.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-008-backoff-increases-exponentially.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-009-backoff-is-capped-at-maximum.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-010-jitter-adds-randomness-to-prevent-thundering-herd.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-011-jitter-function-is-injectable-for-deterministic-tests.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-001-adapter-plugs-into-existing-middleware.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-002-rate-limited-command-returns-standard-rejection.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-003-dcb-retry-uses-separate-workpool.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-004-retry-mutation-receives-correct-arguments.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-005-dcb-retry-with-on-complete-callback-integration.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-006-workpool-does-not-retry-dcb-mutations-clarification.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-007-rate-limiter-component-creates-tables.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-008-multiple-workpools-can-coexist.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-001-adapter-allows-request-within-rate-limit.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-002-adapter-rejects-request-exceeding-rate-limit.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-003-different-keys-have-independent-limits.sdp.md create mode 100644 specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md create mode 100644 specs/behavior/platform-core/ecst/fat-event-builder.examples/s-001-create-basic-fat-event.sdp.md create mode 100644 specs/behavior/platform-core/ecst/fat-event-builder.examples/s-002-create-fat-event-with-schema-definition.sdp.md create mode 100644 specs/behavior/platform-core/ecst/fat-event-builder.examples/s-003-schema-validation-failure.sdp.md create mode 100644 specs/behavior/platform-core/ecst/fat-event-builder.examples/s-004-create-fat-event-with-correlation-id.sdp.md create mode 100644 specs/behavior/platform-core/ecst/fat-event-builder.examples/s-005-embed-selected-entity-fields.sdp.md create mode 100644 specs/behavior/platform-core/ecst/fat-event-builder.examples/s-006-embed-all-fields.sdp.md create mode 100644 specs/behavior/platform-core/ecst/fat-event-builder.examples/s-007-embed-non-existent-field.sdp.md create mode 100644 specs/behavior/platform-core/ecst/fat-event-builder.examples/s-008-embed-collection-of-items.sdp.md create mode 100644 specs/behavior/platform-core/ecst/fat-event-builder.examples/s-009-embed-collection-with-field-selection.sdp.md create mode 100644 specs/behavior/platform-core/ecst/fat-event-builder.examples/s-010-embed-empty-collection.sdp.md create mode 100644 specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-001-event-type-for-integration-scenarios.sdp.md create mode 100644 specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-002-inventory-updated-as-thin-event.sdp.md create mode 100644 specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-003-order-submitted-as-fat-event.sdp.md create mode 100644 specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-004-published-language-event-is-fat.sdp.md create mode 100644 specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-005-category-suggests-event-type.sdp.md create mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-001-mark-single-field-for-shredding.sdp.md create mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-002-mark-multiple-fields-for-shredding.sdp.md create mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-003-non-pii-fields-are-not-marked.sdp.md create mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-004-find-all-shreddable-fields-in-event.sdp.md create mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-005-no-shreddable-fields-returns-empty.sdp.md create mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-006-mark-fields-in-collection-items.sdp.md create mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-007-shred-all-marked-fields.sdp.md create mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-008-non-marked-fields-are-preserved.sdp.md create mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-009-shred-event-returns-audit-trail.sdp.md create mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-010-check-if-event-has-any-shreddable-fields.sdp.md create mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-011-check-event-without-shreddable-fields.sdp.md create mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-012-count-shreddable-fields.sdp.md create mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-013-cannot-shred-required-fields.sdp.md create mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-014-non-overlapping-shred-and-required-fields-work.sdp.md create mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-001-schema-version-is-included-automatically.sdp.md create mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-002-custom-schema-version-is-used.sdp.md create mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-003-valid-payload-passes-validation.sdp.md create mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-004-missing-required-field-fails-validation.sdp.md create mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-005-wrong-field-type-fails-validation.sdp.md create mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-006-migrate-v1-event-to-v2-format.sdp.md create mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-007-no-migration-needed-for-current-version.sdp.md create mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-008-unknown-source-version-fails-migration.sdp.md create mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-009-compare-older-version-to-newer-version.sdp.md create mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-010-compare-newer-version-to-older-version.sdp.md create mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-011-compare-equal-versions.sdp.md create mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-012-compare-versions-with-different-minor.sdp.md create mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-013-invalid-semver-format-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-014-negative-major-version-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-015-negative-minor-version-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-016-event-needs-migration-to-newer-version.sdp.md create mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-017-event-does-not-need-migration-for-same-version.sdp.md create mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-018-event-does-not-need-migration-for-older-target.sdp.md create mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-001-percentage-is-50-when-half-events-processed.sdp.md create mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-002-percentage-is-100-when-all-events-processed.sdp.md create mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-003-percentage-is-100-when-total-events-is-zero.sdp.md create mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-004-percentage-has-one-decimal-place-precision.sdp.md create mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-005-remaining-time-estimated-from-throughput.sdp.md create mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-006-remaining-time-is-undefined-when-no-events-processed.sdp.md create mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-007-remaining-time-is-undefined-when-elapsed-time-is-zero.sdp.md create mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-008-remaining-time-is-zero-when-all-events-processed.sdp.md create mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-009-calculate-progress-for-running-replay.sdp.md create mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-010-calculate-progress-for-completed-replay.sdp.md create mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-011-calculate-progress-includes-error-for-failed-replay.sdp.md create mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-012-running-status-is-active.sdp.md create mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-013-paused-status-is-active.sdp.md create mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-014-completed-status-is-not-active.sdp.md create mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-015-failed-status-is-not-active.sdp.md create mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-016-completed-status-is-terminal.sdp.md create mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-017-failed-status-is-terminal.sdp.md create mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-018-cancelled-status-is-terminal.sdp.md create mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-019-running-status-is-not-terminal.sdp.md create mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-020-paused-status-is-not-terminal.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-append.examples/s-001-create-append-partition-key-generates-correct-format.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-append.examples/s-002-partition-key-handles-various-stream-types.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-append.examples/s-003-durable-append-event-enqueues-action-to-workpool.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-append.examples/s-004-durable-append-event-returns-work-id-from-workpool.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-append.examples/s-005-durable-append-event-passes-on-complete-to-workpool.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-append.examples/s-006-durable-append-event-includes-idempotency-key-in-context.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-append.examples/s-007-create-durable-append-action-handler-returns-a-function.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-append.examples/s-008-action-handler-invokes-idempotent-append-event.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-001-partition-key-format-is-event-id-target-context.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-002-different-events-get-different-partition-keys.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-003-publishing-event-creates-tracking-records-for-each-target.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-004-publishing-event-enqueues-delivery-actions-via-workpool.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-005-publish-result-contains-publication-i-ds-for-each-target.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-006-correlation-id-is-passed-through-to-tracking-records.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-007-get-publication-status-returns-all-target-contexts.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-008-get-publication-status-returns-empty-array-for-unknown-event.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-009-retry-publication-re-enqueues-delivery-action.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-010-retry-publication-returns-not-found-for-unknown-publication.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-011-retry-publication-returns-already-delivered-for-delivered-publication.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-012-retry-increments-attempt-count-correctly.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-013-on-complete-updates-status-to-delivered-on-success.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-014-on-complete-increments-attempt-count-on-failure.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-015-on-complete-creates-dead-letter-after-max-retries.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-001-command-idempotency-key-uses-command-type-entity-id-command-id-format.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-002-action-idempotency-key-uses-action-type-entity-id-format.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-003-saga-step-idempotency-key-uses-saga-type-saga-id-step-format.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-004-scheduled-job-idempotency-key-uses-job-type-schedule-id-timestamp-format.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-005-first-append-with-idempotency-key-succeeds.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-006-duplicate-append-returns-existing-event.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-007-same-key-with-different-payload-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-008-different-idempotency-keys-create-separate-events.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-009-occ-conflict-with-duplicate-on-recheck-returns-duplicate.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-010-true-occ-conflict-throws-error.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-001-build-intent-key-generates-correct-format.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-002-intent-key-handles-various-operation-types.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-003-record-intent-creates-intent-event-with-correct-type.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-004-record-intent-schedules-timeout-check.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-005-record-intent-returns-intent-key-and-event-id.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-006-record-completion-creates-success-event.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-007-record-completion-creates-failure-event-with-error.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-008-record-completion-creates-abandonment-event.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-009-check-intent-timeout-returns-already-resolved-when-completion-exists.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-010-check-intent-timeout-creates-abandonment-when-no-completion.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-011-check-intent-timeout-is-idempotent.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-012-query-orphaned-intents-returns-intents-without-completion.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-013-query-orphaned-intents-filters-by-operation-type.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-001-create-outbox-handler-returns-a-callable-function.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-002-outbox-handler-extracts-idempotency-key-from-context.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-003-outbox-handler-builds-payment-completed-event-from-success-result.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-004-outbox-handler-builds-payment-failed-event-from-failure-result.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-005-outbox-handler-calls-idempotent-append-event-internally.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-006-outbox-handler-completes-without-error-for-duplicates.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-001-successful-processing-creates-no-poison-record.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-002-first-failure-records-attempt-but-does-not-quarantine.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-003-event-becomes-quarantined-after-max-retries.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-004-quarantined-event-is-silently-skipped.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-005-on-quarantine-callback-invoked-when-alert-on-quarantine-is-true.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-006-on-quarantine-not-invoked-when-alert-on-quarantine-is-false.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-007-is-event-quarantined-returns-true-for-quarantined-event.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-008-is-event-quarantined-returns-false-for-non-quarantined-event.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-009-get-poison-event-record-returns-normalized-record.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-010-get-poison-event-record-returns-null-for-non-existent-event.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-011-unquarantine-event-clears-quarantine-status.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-012-unquarantine-event-returns-not-found-for-missing-event.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-013-unquarantine-event-returns-not-quarantined-for-pending-event.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-014-list-quarantined-events-returns-quarantined-records.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-015-list-quarantined-events-filters-by-projection.sdp.md create mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-016-get-poison-event-stats-returns-aggregated-statistics.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-001-creates-bus-with-empty-subscriptions.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-002-creates-bus-with-subscriptions-sorted-by-priority.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-003-returns-empty-result-when-no-subscriptions-match.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-004-enqueues-matching-subscriptions-via-workpool.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-005-enqueues-multiple-matching-subscriptions.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-006-passes-transformed-args-to-workpool.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-007-includes-partition-key-in-workpool-context.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-008-uses-subscription-level-on-complete-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-009-uses-default-on-complete-from-config-when-subscription-has-none.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-010-does-not-include-on-complete-if-neither-subscription-nor-config-provides-i.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-011-returns-true-for-indexed-event-type-and-false-for-unsubscribed-type.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-012-returns-true-for-any-event-type-when-wildcard-subscription-exists.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-013-returns-false-when-no-subscriptions-exist.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-014-returns-all-subscriptions.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-015-returns-empty-array-when-no-subscriptions.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-016-returns-subscriptions-matching-event-type-filter.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-017-returns-subscriptions-matching-category-filter.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-018-publishes-to-subscriptions-in-priority-order.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-019-propagates-workpool-errors-when-enqueue-fails.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-020-does-not-enqueue-subsequent-subscriptions-if-earlier-enqueue-fails.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-021-wildcard-subscriptions-match-any-event-type.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-022-wildcard-with-bounded-context-filter-only-matches-that-context.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-023-creates-event-bus-instance-with-empty-subscriptions.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-024-creates-event-bus-with-config.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-001-builder-creates-subscription-with-name-and-handler.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-002-builder-defaults-to-empty-filter.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-003-builder-defaults-to-priority-100.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-004-builder-defaults-partition-key-to-stream-id.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-005-for-event-types-sets-event-type-filter.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-006-for-categories-sets-category-filter.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-007-for-bounded-contexts-sets-bounded-context-filter.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-008-for-stream-types-sets-stream-type-filter.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-009-chaining-multiple-filters-composes-them.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-010-with-on-complete-sets-the-on-complete-handler.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-011-with-priority-sets-priority.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-012-with-transform-sets-custom-transformer.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-013-with-partition-key-sets-custom-partition-key-extractor.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-014-add-adds-a-subscription-to-the-registry.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-015-add-supports-chaining.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-016-add-throws-on-duplicate-subscription-name.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-017-subscribe-returns-builder-that-adds-to-registry-on-build.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-018-define-subscriptions-returns-configured-subscriptions.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-019-define-subscriptions-throws-on-duplicate-names-via-subscribe-build.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-020-define-subscriptions-throws-on-duplicate-names-via-add.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-021-create-subscription-creates-standalone-builder.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-022-empty-filter-matches-any-event.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-023-matches-when-event-type-is-in-the-list.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-024-does-not-match-when-event-type-is-not-in-the-list.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-025-matches-when-category-is-in-the-list.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-026-does-not-match-when-category-is-not-in-the-list.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-027-matches-when-bounded-context-is-in-the-list.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-028-does-not-match-when-bounded-context-is-not-in-the-list.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-029-matches-when-stream-type-is-in-the-list.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-030-does-not-match-when-stream-type-is-not-in-the-list.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-031-all-filters-matching-returns-true.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-032-non-matching-event-type-returns-false-with-combined-filters.sdp.md create mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-033-non-matching-category-returns-false-with-combined-filters.sdp.md create mode 100644 specs/behavior/platform-core/events/builder.examples/s-001-generates-event-id-with-bounded-context-prefix.sdp.md create mode 100644 specs/behavior/platform-core/events/builder.examples/s-002-copies-all-core-fields-correctly.sdp.md create mode 100644 specs/behavior/platform-core/events/builder.examples/s-003-copies-payload-correctly.sdp.md create mode 100644 specs/behavior/platform-core/events/builder.examples/s-004-includes-correlation-id-and-causation-id-in-metadata.sdp.md create mode 100644 specs/behavior/platform-core/events/builder.examples/s-005-generates-different-event-ids-for-different-bounded-contexts.sdp.md create mode 100644 specs/behavior/platform-core/events/builder.examples/s-006-returns-complete-new-event-data-structure.sdp.md create mode 100644 specs/behavior/platform-core/events/builder.examples/s-007-uses-provided-event-id-without-generating-a-new-one.sdp.md create mode 100644 specs/behavior/platform-core/events/builder.examples/s-008-extracts-bounded-context-from-event-id-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/events/builder.examples/s-009-uses-provided-bounded-context-when-explicitly-set.sdp.md create mode 100644 specs/behavior/platform-core/events/builder.examples/s-010-uses-full-event-id-as-bounded-context-when-no-underscore-present.sdp.md create mode 100644 specs/behavior/platform-core/events/builder.examples/s-011-copies-all-other-fields-correctly-with-pre-generated-event-id.sdp.md create mode 100644 specs/behavior/platform-core/events/builder.examples/s-012-handles-event-id-with-multiple-underscores-correctly.sdp.md create mode 100644 specs/behavior/platform-core/events/builder.examples/s-013-returns-complete-new-event-data-structure-with-pre-generated-event-id.sdp.md create mode 100644 specs/behavior/platform-core/events/category.examples/s-001-event-categories-has-exactly-four-entries-in-the-correct-order.sdp.md create mode 100644 specs/behavior/platform-core/events/category.examples/s-002-schema-accepts-valid-category-strings.sdp.md create mode 100644 specs/behavior/platform-core/events/category.examples/s-003-schema-rejects-invalid-category-values.sdp.md create mode 100644 specs/behavior/platform-core/events/category.examples/s-004-default-event-category-is-domain.sdp.md create mode 100644 specs/behavior/platform-core/events/category.examples/s-005-default-schema-version-is-1.sdp.md create mode 100644 specs/behavior/platform-core/events/category.examples/s-006-type-guard-accepts-all-valid-categories.sdp.md create mode 100644 specs/behavior/platform-core/events/category.examples/s-007-type-guard-rejects-invalid-values.sdp.md create mode 100644 specs/behavior/platform-core/events/category.examples/s-008-valid-categories-are-returned-unchanged.sdp.md create mode 100644 specs/behavior/platform-core/events/category.examples/s-009-invalid-values-normalize-to-domain.sdp.md create mode 100644 specs/behavior/platform-core/events/category.examples/s-010-positive-integers-are-returned-unchanged.sdp.md create mode 100644 specs/behavior/platform-core/events/category.examples/s-011-invalid-values-normalize-to-1.sdp.md create mode 100644 specs/behavior/platform-core/events/category.examples/s-012-classification-of-categories-as-external-or-internal.sdp.md create mode 100644 specs/behavior/platform-core/events/category.examples/s-013-classification-of-categories-as-cross-context.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-001-valid-event-metadata-is-accepted-and-fields-are-preserved.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-002-missing-required-fields-are-rejected.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-003-partial-metadata-with-only-event-id-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-004-optional-causation-id-is-supported.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-005-invalid-version-values-are-rejected.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-006-zero-global-position-is-accepted.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-007-enhanced-metadata-includes-category-and-schema-version.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-008-category-defaults-to-domain-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-009-schema-version-defaults-to-1-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-010-all-valid-categories-are-accepted.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-011-invalid-categories-are-rejected.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-012-schema-accepts-events-with-matching-event-type-and-valid-payload.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-013-schema-rejects-events-with-wrong-event-type.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-014-schema-validates-payload-constraints.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-015-optional-metadata-field-is-supported.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-016-domain-event-schema-sets-category-to-domain.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-017-category-defaults-to-domain-when-not-in-input.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-018-schema-version-defaults-to-1-when-not-in-config.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-019-custom-schema-version-in-config-is-enforced.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-020-wrong-schema-version-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-021-integration-event-schema-sets-category-to-integration.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-022-category-defaults-to-integration-when-not-in-input.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-023-schema-version-defaults-to-1-for-integration-events.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-024-trigger-event-schema-sets-category-to-trigger-with-entity-id-payload.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-025-trigger-event-rejects-missing-entity-id.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-026-category-defaults-to-trigger-when-not-in-input.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-027-custom-schema-version-for-trigger-events.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-028-fat-event-schema-sets-category-to-fat-with-full-payload.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-029-category-defaults-to-fat-when-not-in-input.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-030-complex-nested-payload-with-valid-positive-value.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-031-complex-nested-payload-rejects-negative-value.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-032-custom-schema-version-for-fat-events.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-033-domain-event-schema-accepts-any-payload-shape.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-034-enhanced-domain-event-schema-includes-defaults.sdp.md create mode 100644 specs/behavior/platform-core/events/schemas.examples/s-035-enhanced-domain-event-schema-allows-optional-metadata.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-001-event-at-current-version-is-returned-as-is.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-002-event-is-migrated-from-v1-to-v2.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-003-event-is-migrated-from-v1-to-v3.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-004-incomplete-migration-chain-throws-at-creation-time.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-005-future-schema-version-throws-future-version-error.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-006-validation-passes-after-migration.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-007-validation-fails-after-migration.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-008-registry-reports-registered-and-unregistered-event-types.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-009-registry-returns-all-registered-event-types.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-010-second-registration-overrides-the-first.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-011-registered-event-type-is-upcasted.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-012-unregistered-event-type-is-returned-as-is.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-013-static-default-value-is-added.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-014-computed-default-value-is-added-from-event-timestamp.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-015-field-is-renamed-in-the-payload.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-016-error-has-correct-name-code-and-message.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-017-error-stores-context-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-018-error-has-undefined-context-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-019-error-is-instanceof-error.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-020-error-preserves-specific-code-values.sdp.md create mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-021-error-preserves-custom-message.sdp.md create mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md create mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-002-fsm-preserves-the-definition.sdp.md create mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-003-valid-transitions-return-true.sdp.md create mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-004-invalid-transitions-return-false.sdp.md create mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-005-standalone-can-transition-function-works.sdp.md create mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-006-valid-transitions-do-not-throw.sdp.md create mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-007-invalid-transition-throws-fsm-transition-error.sdp.md create mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-008-fsm-transition-error-includes-transition-details.sdp.md create mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-009-standalone-assert-transition-function-works.sdp.md create mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-010-returns-valid-transitions-for-each-state.sdp.md create mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-011-standalone-valid-transitions-function-works.sdp.md create mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-012-terminal-states-are-identified.sdp.md create mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-013-non-terminal-states-are-identified.sdp.md create mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-014-standalone-is-terminal-function-works.sdp.md create mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-015-valid-states-return-true.sdp.md create mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-016-invalid-states-return-false.sdp.md create mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-017-standalone-is-valid-state-function-works.sdp.md create mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-018-error-has-correct-properties.sdp.md create mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-019-error-handles-terminal-states-in-message.sdp.md create mode 100644 specs/behavior/platform-core/handlers/result.examples/s-001-success-result-has-correct-structure.sdp.md create mode 100644 specs/behavior/platform-core/handlers/result.examples/s-002-success-result-preserves-typed-data.sdp.md create mode 100644 specs/behavior/platform-core/handlers/result.examples/s-003-success-result-returns-status-as-literal-type.sdp.md create mode 100644 specs/behavior/platform-core/handlers/result.examples/s-004-rejected-result-has-code-and-reason.sdp.md create mode 100644 specs/behavior/platform-core/handlers/result.examples/s-005-rejected-result-includes-context-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/handlers/result.examples/s-006-rejected-result-omits-context-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/handlers/result.examples/s-007-rejected-result-returns-status-as-literal-type.sdp.md create mode 100644 specs/behavior/platform-core/handlers/result.examples/s-008-failed-result-has-event-data.sdp.md create mode 100644 specs/behavior/platform-core/handlers/result.examples/s-009-failed-result-includes-expected-version-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/handlers/result.examples/s-010-failed-result-includes-context-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/handlers/result.examples/s-011-failed-result-includes-both-expected-version-and-context.sdp.md create mode 100644 specs/behavior/platform-core/handlers/result.examples/s-012-failed-result-omits-optional-properties-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/handlers/result.examples/s-013-failed-result-returns-status-as-literal-type.sdp.md create mode 100644 specs/behavior/platform-core/ids/branded.examples/s-001-factory-functions-produce-branded-i-ds-preserving-the-input-value.sdp.md create mode 100644 specs/behavior/platform-core/ids/branded.examples/s-002-branded-i-ds-are-assignable-to-plain-string-variables.sdp.md create mode 100644 specs/behavior/platform-core/ids/branded.examples/s-003-branded-i-ds-support-standard-string-methods.sdp.md create mode 100644 specs/behavior/platform-core/ids/branded.examples/s-004-generators-produce-correctly-prefixed-branded-i-ds.sdp.md create mode 100644 specs/behavior/platform-core/ids/branded.examples/s-005-command-and-correlation-generators-produce-valid-uuid-v7-after-prefix.sdp.md create mode 100644 specs/behavior/platform-core/ids/branded.examples/s-006-is-valid-id-string-returns-true-for-non-empty-strings.sdp.md create mode 100644 specs/behavior/platform-core/ids/branded.examples/s-007-is-valid-id-string-returns-false-for-empty-string.sdp.md create mode 100644 specs/behavior/platform-core/ids/branded.examples/s-008-is-valid-id-string-returns-false-for-non-string-values.sdp.md create mode 100644 specs/behavior/platform-core/ids/branded.examples/s-009-is-valid-id-string-narrows-type-for-type-script.sdp.md create mode 100644 specs/behavior/platform-core/ids/branded.examples/s-010-n-100-generated-command-ids-are-all-unique.sdp.md create mode 100644 specs/behavior/platform-core/ids/branded.examples/s-011-n-100-generated-correlation-ids-are-all-unique.sdp.md create mode 100644 specs/behavior/platform-core/ids/generator.examples/s-001-generated-id-matches-the-expected-format.sdp.md create mode 100644 specs/behavior/platform-core/ids/generator.examples/s-002-each-call-produces-a-unique-id.sdp.md create mode 100644 specs/behavior/platform-core/ids/generator.examples/s-003-generated-id-starts-with-the-provided-context-and-type.sdp.md create mode 100644 specs/behavior/platform-core/ids/generator.examples/s-004-lowercase-alphanumeric-values-are-accepted-for-context-and-type.sdp.md create mode 100644 specs/behavior/platform-core/ids/generator.examples/s-005-empty-context-or-type-throws-an-error.sdp.md create mode 100644 specs/behavior/platform-core/ids/generator.examples/s-006-context-with-disallowed-characters-throws-an-error.sdp.md create mode 100644 specs/behavior/platform-core/ids/generator.examples/s-007-type-with-underscore-throws-an-error.sdp.md create mode 100644 specs/behavior/platform-core/ids/generator.examples/s-008-a-well-formed-id-is-parsed-into-its-components.sdp.md create mode 100644 specs/behavior/platform-core/ids/generator.examples/s-009-an-id-produced-by-generate-id-is-parseable.sdp.md create mode 100644 specs/behavior/platform-core/ids/generator.examples/s-010-uuid-portion-containing-underscores-is-preserved.sdp.md create mode 100644 specs/behavior/platform-core/ids/generator.examples/s-011-i-ds-with-fewer-than-three-parts-return-null.sdp.md create mode 100644 specs/behavior/platform-core/ids/generator.examples/s-012-i-ds-with-empty-context-or-type-return-null.sdp.md create mode 100644 specs/behavior/platform-core/ids/generator.examples/s-013-correlation-id-has-the-expected-format-and-is-unique-per-call.sdp.md create mode 100644 specs/behavior/platform-core/ids/generator.examples/s-014-command-id-has-the-expected-format-and-is-unique-per-call.sdp.md create mode 100644 specs/behavior/platform-core/ids/generator.examples/s-015-event-id-has-the-expected-format-and-uses-the-provided-context.sdp.md create mode 100644 specs/behavior/platform-core/ids/generator.examples/s-016-event-i-ds-are-unique-per-call.sdp.md create mode 100644 specs/behavior/platform-core/ids/generator.examples/s-017-empty-context-throws-an-error.sdp.md create mode 100644 specs/behavior/platform-core/ids/generator.examples/s-018-integration-event-id-has-the-expected-format-and-is-unique-per-call.sdp.md create mode 100644 specs/behavior/platform-core/ids/generator.examples/s-019-uuid-portion-has-version-7-indicator.sdp.md create mode 100644 specs/behavior/platform-core/ids/generator.examples/s-020-ten-sequential-i-ds-are-lexicographically-sorted.sdp.md create mode 100644 specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-001-define-acl-for-payment-gateway.sdp.md create mode 100644 specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-002-acl-translates-field-names.sdp.md create mode 100644 specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-003-acl-transforms-field-values.sdp.md create mode 100644 specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-004-acl-translates-domain-to-external.sdp.md create mode 100644 specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-005-round-trip-translation-preserves-data.sdp.md create mode 100644 specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-006-missing-required-external-field.sdp.md create mode 100644 specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-007-invalid-external-field-type.sdp.md create mode 100644 specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-008-unknown-external-status.sdp.md create mode 100644 specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-009-multiple-payment-gateways-with-different-schemas.sdp.md create mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-001-register-upstream-downstream-relationship.sdp.md create mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-002-register-customer-supplier-relationship.sdp.md create mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-003-register-conformist-relationship.sdp.md create mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-004-register-acl-relationship.sdp.md create mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-005-register-partnership-relationship.sdp.md create mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-006-register-shared-kernel-relationship.sdp.md create mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-007-register-open-host-service-relationship.sdp.md create mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-008-query-all-relationships-for-a-bc.sdp.md create mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-009-query-upstream-b-cs.sdp.md create mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-010-query-bc-with-no-relationships.sdp.md create mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-011-duplicate-relationship-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-012-self-referential-relationship-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-001-generate-sample-from-schema.sdp.md create mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-002-generate-sample-with-overrides.sdp.md create mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-003-generate-multiple-samples.sdp.md create mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-004-producer-emits-valid-event.sdp.md create mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-005-producer-emits-invalid-event.sdp.md create mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-006-producer-emits-wrong-version.sdp.md create mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-007-consumer-processes-valid-event.sdp.md create mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-008-consumer-handles-all-sample-variations.sdp.md create mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-009-consumer-rejects-valid-event.sdp.md create mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-010-compatible-producer-and-consumer.sdp.md create mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-011-incompatible-versions-detected.sdp.md create mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-012-compatible-with-downcaster.sdp.md create mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-013-contract-violation-is-recorded.sdp.md create mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-014-query-contract-violations.sdp.md create mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-015-query-violations-since-timestamp.sdp.md create mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-016-no-violations-returns-empty-array.sdp.md create mode 100644 specs/behavior/platform-core/integration/event-versioning.examples/s-001-upcast-v1-event-to-v2.sdp.md create mode 100644 specs/behavior/platform-core/integration/event-versioning.examples/s-002-chain-upcasters-for-multiple-versions.sdp.md create mode 100644 specs/behavior/platform-core/integration/event-versioning.examples/s-003-upcast-adds-computed-field.sdp.md create mode 100644 specs/behavior/platform-core/integration/event-versioning.examples/s-004-downcast-v2-event-to-v1.sdp.md create mode 100644 specs/behavior/platform-core/integration/event-versioning.examples/s-005-downcast-removes-required-in-new-field.sdp.md create mode 100644 specs/behavior/platform-core/integration/event-versioning.examples/s-006-register-schema-with-migration.sdp.md create mode 100644 specs/behavior/platform-core/integration/event-versioning.examples/s-007-missing-migration-path.sdp.md create mode 100644 specs/behavior/platform-core/integration/event-versioning.examples/s-008-breaking-change-without-migration.sdp.md create mode 100644 specs/behavior/platform-core/integration/event-versioning.examples/s-009-detect-version-from-event-metadata.sdp.md create mode 100644 specs/behavior/platform-core/integration/event-versioning.examples/s-010-infer-version-from-payload-shape.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-001-create-publisher-with-empty-routes.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-002-create-publisher-with-one-route.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-003-reject-duplicate-source-event-type-routes.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-004-check-route-existence-for-registered-and-unregistered-types.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-005-retrieve-all-registered-routes.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-006-return-null-when-no-route-matches.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-007-translate-and-publish-a-domain-event.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-008-enqueue-multiple-handlers.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-009-verify-integration-event-metadata-fields.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-010-include-user-id-when-present-in-chain.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-011-omit-user-id-when-absent-from-chain.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-012-pass-on-complete-handler-to-workpool.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-013-propagate-translator-error.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-014-verify-workpool-context-fields.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-015-build-a-route-with-all-required-fields.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-016-set-schema-version-via-version-method.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-017-pass-multiple-handlers-to-notify.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-018-translator-function-transforms-source-event.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-019-reject-missing-source-event-type.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-020-reject-missing-target-event-type.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-021-reject-missing-translator.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-022-reject-missing-handlers.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-023-build-route-via-define-integration-route-factory.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-024-create-publisher-via-factory-function.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-025-verify-integration-route-error-properties.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-026-verify-integration-route-error-with-context.sdp.md create mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-027-verify-integration-route-error-instanceof-chain.sdp.md create mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-001-register-integration-event-schema.sdp.md create mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-002-register-multiple-versions.sdp.md create mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-003-duplicate-version-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-004-convert-domain-event-to-integration-event.sdp.md create mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-005-convert-with-explicit-version.sdp.md create mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-006-unregistered-event-type-fails.sdp.md create mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-007-invalid-payload-fails-schema-validation.sdp.md create mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-008-event-tagging-for-routing-and-dcb.sdp.md create mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-009-multiple-tags-for-routing.sdp.md create mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-010-register-schema-with-compatibility-mode.sdp.md create mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-011-query-schema-compatibility-mode.sdp.md create mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-012-list-all-event-types.sdp.md create mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-013-list-versions-for-event-type.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-001-set-contains-all-provided-invariants.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-002-invariants-array-is-immutable-and-a-frozen-copy.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-003-check-all-returns-true-when-all-invariants-pass.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-004-check-all-returns-false-when-first-invariant-fails.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-005-check-all-returns-false-when-second-invariant-fails.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-006-check-all-returns-false-when-all-invariants-fail.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-007-assert-all-does-not-throw-when-all-invariants-pass.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-008-assert-all-throws-on-first-failure-with-fail-fast.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-009-assert-all-throws-correct-error-class.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-010-assert-all-throws-error-with-context-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-011-validate-all-returns-valid-when-all-invariants-pass.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-012-validate-all-collects-single-violation.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-013-validate-all-collects-multiple-violations-without-short-circuiting.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-014-validate-all-collects-violations-from-non-adjacent-invariants.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-015-validate-all-omits-context-when-invariant-has-no-context-function.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-016-empty-set-passes-all-operations.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-017-single-invariant-set-passes-all-operations-with-valid-state.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-001-invariant-has-correct-name-and-code.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-002-check-returns-true-when-state-satisfies-the-predicate.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-003-check-returns-false-when-state-violates-the-predicate.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-004-assert-does-not-throw-when-state-is-valid.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-005-assert-throws-invariant-error-when-state-is-invalid.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-006-assert-error-has-correct-code-for-invalid-state.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-007-assert-error-has-correct-message-for-invalid-state.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-008-assert-error-has-correct-context-for-invalid-state.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-009-validate-returns-valid-result-for-valid-state.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-010-validate-returns-violation-details-for-invalid-state.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-011-assert-error-has-undefined-context-when-no-context-function.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-012-validate-result-has-undefined-context-when-no-context-function.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-013-check-uses-parameter-to-find-matching-item.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-014-check-returns-false-when-parameter-does-not-match.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-015-assert-uses-parameter-in-error-message-and-context.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-016-validate-uses-parameter-in-result.sdp.md create mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-017-assert-throws-error-of-the-correct-custom-class.sdp.md create mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-001-creating-an-error-with-code-and-message.sdp.md create mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-002-including-context-when-provided.sdp.md create mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-003-context-is-undefined-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-004-error-has-proper-stack-trace.sdp.md create mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-005-creating-a-context-specific-error-class.sdp.md create mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-006-different-contexts-produce-different-classes.sdp.md create mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-007-typed-error-codes-are-supported.sdp.md create mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-008-context-specific-errors-include-context-data.sdp.md create mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-009-context-specific-class-has-proper-constructor-name.sdp.md create mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-010-returns-true-for-invariant-error-instances.sdp.md create mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-011-returns-true-for-context-specific-error-instances.sdp.md create mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-012-returns-false-for-regular-error-instances.sdp.md create mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-013-returns-false-for-non-error-values.sdp.md create mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-014-returns-true-when-error-has-the-specified-code.sdp.md create mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-015-returns-false-when-error-has-a-different-code.sdp.md create mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-016-returns-false-for-non-invariant-error-values.sdp.md create mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-017-works-with-context-specific-errors.sdp.md create mode 100644 specs/behavior/platform-core/logging/commands.examples/s-001-command-start-is-logged-at-info-level.sdp.md create mode 100644 specs/behavior/platform-core/logging/commands.examples/s-002-entity-specific-fields-are-included-in-start-log-data.sdp.md create mode 100644 specs/behavior/platform-core/logging/commands.examples/s-003-command-success-is-logged-at-info-level-with-result.sdp.md create mode 100644 specs/behavior/platform-core/logging/commands.examples/s-004-context-fields-are-preserved-alongside-result-fields.sdp.md create mode 100644 specs/behavior/platform-core/logging/commands.examples/s-005-command-rejection-is-logged-at-warn-level.sdp.md create mode 100644 specs/behavior/platform-core/logging/commands.examples/s-006-rejection-uses-prefixed-field-names-not-raw-code-message.sdp.md create mode 100644 specs/behavior/platform-core/logging/commands.examples/s-007-business-failure-is-logged-at-warn-level.sdp.md create mode 100644 specs/behavior/platform-core/logging/commands.examples/s-008-business-failure-uses-failure-reason-not-reason.sdp.md create mode 100644 specs/behavior/platform-core/logging/commands.examples/s-009-error-object-is-logged-at-error-level-with-message-and-stack.sdp.md create mode 100644 specs/behavior/platform-core/logging/commands.examples/s-010-string-error-is-logged-directly.sdp.md create mode 100644 specs/behavior/platform-core/logging/commands.examples/s-011-non-string-non-error-values-are-stringified.sdp.md create mode 100644 specs/behavior/platform-core/logging/commands.examples/s-012-null-error-is-stringified.sdp.md create mode 100644 specs/behavior/platform-core/logging/commands.examples/s-013-undefined-error-is-stringified.sdp.md create mode 100644 specs/behavior/platform-core/logging/commands.examples/s-014-stack-trace-is-preserved-for-debugging.sdp.md create mode 100644 specs/behavior/platform-core/logging/commands.examples/s-015-full-success-lifecycle-produces-start-and-success-logs.sdp.md create mode 100644 specs/behavior/platform-core/logging/commands.examples/s-016-rejection-lifecycle-produces-info-and-warn-logs.sdp.md create mode 100644 specs/behavior/platform-core/logging/commands.examples/s-017-error-lifecycle-produces-info-and-error-logs.sdp.md create mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-001-messages-are-prefixed-with-scope.sdp.md create mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-002-data-object-is-appended-as-json.sdp.md create mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-003-empty-data-object-is-omitted-from-output.sdp.md create mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-004-debug-level-allows-debug-messages.sdp.md create mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-005-info-level-suppresses-debug-messages.sdp.md create mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-006-info-level-allows-info-messages.sdp.md create mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-007-info-level-allows-warn-messages.sdp.md create mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-008-error-level-allows-error-messages.sdp.md create mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-009-default-level-is-info-when-not-specified.sdp.md create mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-010-each-log-level-uses-its-corresponding-console-method.sdp.md create mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-011-report-level-outputs-structured-json-via-console-log.sdp.md create mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-012-timing-start-uses-console-time.sdp.md create mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-013-timing-end-uses-console-time-end.sdp.md create mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-014-regular-trace-without-timing-uses-console-debug.sdp.md create mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-015-no-op-logger-does-not-call-any-console-methods.sdp.md create mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-016-no-op-logger-implements-the-full-logger-interface.sdp.md create mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-017-child-logger-prefixes-with-combined-scope.sdp.md create mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-018-child-logger-respects-provided-log-level.sdp.md create mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-019-child-logger-defaults-to-info-level.sdp.md create mode 100644 specs/behavior/platform-core/logging/testing.examples/s-001-all-six-log-method-calls-are-captured.sdp.md create mode 100644 specs/behavior/platform-core/logging/testing.examples/s-002-each-call-records-the-correct-log-level.sdp.md create mode 100644 specs/behavior/platform-core/logging/testing.examples/s-003-message-text-is-captured-correctly.sdp.md create mode 100644 specs/behavior/platform-core/logging/testing.examples/s-004-structured-data-is-captured-correctly.sdp.md create mode 100644 specs/behavior/platform-core/logging/testing.examples/s-005-data-is-undefined-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/logging/testing.examples/s-006-timestamp-is-captured-within-bounds.sdp.md create mode 100644 specs/behavior/platform-core/logging/testing.examples/s-007-clearing-resets-calls-to-empty.sdp.md create mode 100644 specs/behavior/platform-core/logging/testing.examples/s-008-calls-are-filtered-by-level-correctly.sdp.md create mode 100644 specs/behavior/platform-core/logging/testing.examples/s-009-partial-and-exact-message-matching.sdp.md create mode 100644 specs/behavior/platform-core/logging/testing.examples/s-010-exact-message-match-works.sdp.md create mode 100644 specs/behavior/platform-core/logging/testing.examples/s-011-level-and-message-must-both-match.sdp.md create mode 100644 specs/behavior/platform-core/logging/testing.examples/s-012-returns-the-last-call-at-a-given-level.sdp.md create mode 100644 specs/behavior/platform-core/logging/testing.examples/s-013-returns-undefined-when-no-calls-at-level.sdp.md create mode 100644 specs/behavior/platform-core/logging/testing.examples/s-014-multiple-accesses-return-equal-arrays.sdp.md create mode 100644 specs/behavior/platform-core/logging/testing.examples/s-015-info-minimum-captures-info-report-warn-error-only.sdp.md create mode 100644 specs/behavior/platform-core/logging/testing.examples/s-016-debug-minimum-captures-all-6-levels.sdp.md create mode 100644 specs/behavior/platform-core/logging/testing.examples/s-017-error-minimum-captures-only-error.sdp.md create mode 100644 specs/behavior/platform-core/logging/testing.examples/s-018-warn-minimum-captures-warn-and-error.sdp.md create mode 100644 specs/behavior/platform-core/logging/testing.examples/s-019-clear-resets-filtered-calls.sdp.md create mode 100644 specs/behavior/platform-core/logging/testing.examples/s-020-has-logged-message-only-searches-filtered-calls.sdp.md create mode 100644 specs/behavior/platform-core/logging/types.examples/s-001-priority-values-increase-from-debug-to-error.sdp.md create mode 100644 specs/behavior/platform-core/logging/types.examples/s-002-all-6-log-levels-are-defined-as-numbers.sdp.md create mode 100644 specs/behavior/platform-core/logging/types.examples/s-003-default-log-level-is-info.sdp.md create mode 100644 specs/behavior/platform-core/logging/types.examples/s-004-messages-at-or-above-info-level-pass-the-filter.sdp.md create mode 100644 specs/behavior/platform-core/logging/types.examples/s-005-messages-below-info-level-are-filtered-out.sdp.md create mode 100644 specs/behavior/platform-core/logging/types.examples/s-006-debug-configured-level-allows-all-messages.sdp.md create mode 100644 specs/behavior/platform-core/logging/types.examples/s-007-error-configured-level-only-allows-error.sdp.md create mode 100644 specs/behavior/platform-core/logging/types.examples/s-008-warn-configured-level-allows-warn-and-error-only.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-001-adding-middleware-increases-size-and-returns-pipeline-for-chaining.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-002-removing-an-existing-middleware-returns-true-and-decreases-size.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-003-removing-a-non-existent-middleware-returns-false.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-004-has-returns-true-for-existing-middleware.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-005-has-returns-false-for-non-existent-middleware.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-006-names-are-returned-sorted-by-order.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-007-handler-executes-directly-with-empty-pipeline.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-008-before-hooks-run-in-order-10-then-20.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-009-after-hooks-run-in-order-20-then-10.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-010-short-circuit-prevents-subsequent-middleware-execution.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-011-enricher-middleware-passes-custom-context-to-subsequent-middleware.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-012-throwing-before-hook-produces-middleware-error.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-013-throwing-handler-produces-handler-error.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-014-failing-after-hook-does-not-prevent-other-after-hooks.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-015-only-pre-short-circuit-middleware-after-hooks-run.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-016-clear-empties-the-pipeline.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-017-clone-has-same-middlewares-but-is-independent.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-018-factory-creates-pipeline-without-options.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-019-factory-creates-pipeline-with-debug-option.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-001-structure-validation-has-correct-order.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-002-valid-payload-passes-structure-validation.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-003-invalid-payload-is-rejected-by-structure-validation.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-004-unregistered-command-skips-structure-validation.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-005-registry-validation-validates-against-registry-schema.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-006-registry-validation-skips-unregistered-commands.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-007-domain-validation-has-correct-order.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-008-domain-validation-passes-when-validator-returns-undefined.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-009-domain-validation-rejects-when-validator-returns-error-message.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-010-domain-validation-skips-commands-without-validators.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-011-combined-validators-return-first-error.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-012-combined-validators-return-undefined-when-all-pass.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-013-required-string-validates-non-empty-strings.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-014-positive-number-validates-positive-numbers.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-015-number-range-validates-within-range.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-016-starts-with-prefix-validates-prefix.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-017-authorization-has-correct-order.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-018-authorization-allows-when-checker-returns-allowed-true.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-019-authorization-rejects-when-checker-returns-allowed-false.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-020-authorization-skips-configured-commands.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-021-role-based-checker-allows-user-with-required-role.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-022-role-based-checker-rejects-user-without-required-role.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-023-role-based-checker-requires-authentication.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-024-role-based-checker-allows-when-no-roles-specified.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-025-logging-has-correct-order.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-026-logging-middleware-logs-before-and-after-execution.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-027-logging-middleware-logs-errors-for-failed-commands.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-028-no-op-logger-does-not-throw-on-any-level.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-029-json-logger-outputs-correctly-formatted-logs.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-030-json-logger-includes-timestamp-when-configured.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-031-rate-limit-has-correct-order.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-032-rate-limit-allows-when-not-exceeded.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-033-rate-limit-rejects-when-exceeded.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-034-rate-limit-skips-configured-commands.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-035-by-user-id-generates-correct-key.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-036-by-user-id-handles-anonymous-users.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-037-by-command-type-generates-correct-key.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-038-by-user-and-command-generates-composite-key.sdp.md create mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-039-all-middleware-orders-follow-correct-sequence.sdp.md create mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-001-operation-executes-normally-and-returns-result.sdp.md create mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-002-circuit-remains-closed-after-a-single-failure.sdp.md create mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-003-circuit-opens-after-default-failure-threshold-of-5-failures.sdp.md create mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-004-circuit-transitions-to-half-open-after-timeout.sdp.md create mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-005-circuit-closes-on-success-in-half-open-state.sdp.md create mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-006-circuit-re-opens-on-failure-in-half-open-state.sdp.md create mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-007-requires-3-consecutive-successes-in-half-open-to-close-circuit.sdp.md create mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-008-returns-closed-for-unknown-circuit.sdp.md create mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-009-reflects-current-state-after-a-successful-operation.sdp.md create mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-010-reset-clears-an-open-circuit-back-to-closed.sdp.md create mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-011-respects-custom-failure-threshold.sdp.md create mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-012-respects-custom-timeout.sdp.md create mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-013-failure-count-resets-on-success-in-closed-state.sdp.md create mode 100644 specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-001-wraps-partition-key-in-structured-field-for-primary-projection.sdp.md create mode 100644 specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-002-wraps-partition-key-in-structured-field-for-secondary-projections.sdp.md create mode 100644 specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-003-wraps-partition-key-in-structured-field-for-failed-projection.sdp.md create mode 100644 specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-004-routes-saga-work-to-saga-pool-only.sdp.md create mode 100644 specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-001-successful-cross-context-coordination.sdp.md create mode 100644 specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-002-compensation-on-step-failure.sdp.md create mode 100644 specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-003-workflow-resumes-from-the-last-completed-step-after-restart.sdp.md create mode 100644 specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-004-compensation-executes-in-reverse-order-of-completed-steps.sdp.md create mode 100644 specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-005-first-trigger-starts-saga.sdp.md create mode 100644 specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-006-duplicate-trigger-returns-existing-saga.sdp.md create mode 100644 specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-007-on-complete-updates-saga-status-after-workflow-finishes.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-001-executor-exposes-pm-name-and-event-subscriptions.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-002-handles-returns-true-for-subscribed-and-false-for-unsubscribed-events.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-003-processes-event-and-emits-commands.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-004-skips-unsubscribed-event-with-not-subscribed-reason.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-005-passes-custom-state-to-handler.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-006-uses-stream-id-as-default-instance-id.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-007-uses-custom-instance-id-resolver.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-008-returns-failed-status-when-handler-throws.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-009-returns-failed-status-when-command-emitter-throws.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-010-returns-all-pm-names.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-011-finds-executors-by-event-type.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-012-processes-event-through-all-matching-executors.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-013-returns-empty-array-for-unsubscribed-event.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-014-processes-single-matching-executor.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-015-isolates-exceptions-so-other-executors-still-run.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-016-handles-empty-executors-array.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-001-idle-state-allows-start.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-002-idle-state-rejects-invalid-events.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-003-processing-state-allows-success-and-fail.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-004-processing-state-rejects-invalid-events.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-005-completed-state-allows-reset.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-006-completed-state-rejects-invalid-events.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-007-failed-state-allows-retry-and-reset.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-008-failed-state-rejects-invalid-events.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-009-valid-transitions-return-correct-target-state.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-011-idle-state-has-exactly-one-valid-event.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-012-processing-state-has-exactly-two-valid-events.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-013-completed-state-has-exactly-one-valid-event.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-014-failed-state-has-exactly-two-valid-events.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-015-returns-exactly-6-transitions-with-correct-properties.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-016-all-expected-transitions-are-present.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-017-returns-same-array-reference-on-repeated-calls.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-018-valid-transition-returns-new-state.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-019-invalid-transition-throws-with-pm-name-and-instance-id.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-020-completed-is-terminal.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-021-non-terminal-states-return-false.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-022-failed-is-an-error-state.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-023-non-error-states-return-false.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-024-all-non-terminal-states-have-at-least-one-valid-event.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-025-critical-reachability-paths-exist.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-026-happy-path-idle-to-processing-to-completed.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-027-failure-path-idle-to-processing-to-failed.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-028-retry-workflow-idle-to-processing-to-failed-to-processing-to-completed.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-029-time-triggered-pm-workflow-idle-to-processing-to-completed-to-idle.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-030-failed-reset-workflow-idle-to-processing-to-failed-to-idle.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-001-register-a-single-process-manager.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-002-register-multiple-process-managers.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-003-duplicate-registration-throws-an-error.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-004-get-returns-pm-by-name.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-005-get-returns-undefined-for-unknown-pm.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-006-has-returns-true-for-registered-pm.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-007-has-returns-false-for-unregistered-pm.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-009-list-returns-all-registered-p-ms.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-011-size-reflects-registration-count.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-012-returns-pm-subscribed-to-a-specific-event.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-013-returns-pm-for-shared-event-across-hybrid-pm.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-014-returns-empty-for-unknown-event-type.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-015-returns-empty-for-event-matching-no-subscriptions.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-016-returns-empty-array-for-empty-registry.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-017-returns-unique-sorted-event-types.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-018-returns-empty-array-for-empty-registry-for-commands.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-019-returns-unique-sorted-command-types.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-020-filters-by-orders-context.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-021-filters-by-inventory-context.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-022-returns-empty-for-unknown-context.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-023-filters-by-event-trigger-type.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-024-filters-by-time-trigger-type.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-025-filters-by-hybrid-trigger-type.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-026-returns-time-and-hybrid-triggered-p-ms.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-027-excludes-event-only-triggered-p-ms.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-028-all-time-triggered-p-ms-have-cron-config.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-029-find-all-handlers-for-order-shipped-event.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-030-get-all-time-triggered-p-ms-for-cron-scheduling.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-031-pm-with-empty-subscriptions-and-commands-is-handled-correctly.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-032-mixed-p-ms-where-some-have-empty-arrays.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-001-no-correlation-strategy-uses-stream-id.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-002-correlation-property-is-extracted-from-payload.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-003-falls-back-to-stream-id-when-correlation-property-not-in-payload.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-004-falls-back-to-stream-id-when-correlation-property-is-not-a-string.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-005-falls-back-to-stream-id-when-correlation-property-is-null.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-006-falls-back-to-stream-id-when-correlation-property-is-undefined.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-007-empty-string-correlation-property-value-is-used-as-is.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-008-whitespace-only-correlation-property-value-is-used-as-is.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-009-order-id-correlation-strategy-extracts-correctly.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-010-subscription-name-without-context.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-011-subscription-name-with-context.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-012-default-priority-is-200.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-013-custom-priority-overrides-default.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-014-filters-by-event-types-from-pm-definition.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-015-creates-mutable-copy-of-event-types.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-016-default-to-handler-args-produces-correct-output.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-017-instance-id-from-correlation-strategy.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-018-custom-to-handler-args-transformer-is-used.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-019-default-partition-by-instance-id.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-020-correlation-strategy-affects-partition-key.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-021-custom-get-partition-key-is-used.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-022-handler-reference-is-passed-through.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-023-bulk-creation-produces-correct-subscription-names.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-024-missing-handler-throws-error.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-025-common-priority-applies-to-all-subscriptions.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-026-each-subscription-has-correct-event-filter.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-027-empty-definitions-produces-empty-subscriptions.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-028-handlers-match-their-definitions.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-029-default-priority-constant-is-200.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-030-priority-is-after-projections-and-before-sagas.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-001-all-valid-pm-statuses-are-accepted.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-002-every-entry-in-process-manager-statuses-passes-the-guard.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-003-invalid-status-strings-are-rejected.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-004-non-string-values-are-rejected-by-is-process-manager-status.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-005-arrays-containing-valid-statuses-are-rejected-by-is-process-manager-status.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-006-is-process-manager-status-is-case-sensitive.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-007-type-narrowing-works-in-conditionals.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-008-type-guard-works-as-array-filter-predicate.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-009-process-manager-statuses-contains-exactly-4-statuses-in-order.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-010-process-manager-statuses-is-a-readonly-array-with-correct-bounds.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-011-process-manager-statuses-contains-all-lifecycle-states.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-012-process-manager-statuses-is-in-logical-lifecycle-order.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-013-all-valid-dead-letter-statuses-are-accepted.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-014-every-entry-in-dead-letter-statuses-passes-the-guard.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-015-invalid-status-strings-are-rejected-by-is-dead-letter-status.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-016-pm-statuses-are-rejected-by-is-dead-letter-status.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-017-non-string-values-are-rejected-by-is-dead-letter-status.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-018-arrays-containing-valid-dl-statuses-are-rejected.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-019-is-dead-letter-status-is-case-sensitive.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-020-dl-type-narrowing-works-in-conditionals.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-021-dl-type-guard-works-as-array-filter-predicate.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-022-dead-letter-statuses-contains-exactly-3-statuses-in-order.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-023-dead-letter-statuses-is-a-readonly-array-with-correct-bounds.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-024-dead-letter-statuses-contains-all-dead-letter-states.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-025-dead-letter-statuses-is-in-logical-workflow-order.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-026-full-dead-letter-with-all-fields-has-correct-structure.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-027-dead-letter-with-only-required-fields-has-undefined-optionals.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-028-dead-letter-supports-each-status-individually.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-029-failed-command-captures-command-type-and-complex-payload.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-030-failed-command-allows-empty-payload.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-031-dead-letter-handles-high-attempt-count.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-032-dead-letter-handles-long-error-messages.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-033-dead-letter-handles-complex-context-objects.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-001-process-event-when-no-pm-state-exists.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-003-pm-state-is-updated-after-processing.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-006-skip-event-when-pm-is-in-completed-state.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-007-separate-instances-are-processed-independently.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-008-retry-succeeds-after-emit-commands-failure.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-009-retry-succeeds-when-pm-is-stuck-in-processing-state.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-010-reject-negative-global-position.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-011-global-position-zero-is-treated-as-already-processed.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-012-first-real-event-after-initialization-is-processed.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-013-dead-letter-recorded-when-process-throws.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-014-dead-letter-recorded-when-emit-commands-throws.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-015-commands-failed-counter-is-incremented-on-failure.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-016-commands-emitted-counter-tracks-multiple-commands.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-017-result-contains-emitted-command-types.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-018-empty-command-list-produces-no-op-processed-result.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-019-helper-processes-event-and-updates-state.sdp.md create mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-020-helper-maintains-pm-idempotency-semantics.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-001-projection-rebuild-re-processes-events.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-002-dead-letter-retry-re-enqueues-event.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-003-event-flow-trace-returns-full-history.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-004-rebuild-status-shows-progress.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-005-bulk-dead-letter-retry-processes-all-pending.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-006-system-diagnostics-returns-comprehensive-state.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-001-circuit-opens-after-repeated-failures.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-002-circuit-transitions-to-half-open-after-timeout.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-003-successful-half-open-request-closes-circuit.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-004-failed-half-open-request-reopens-circuit.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-005-circuit-state-persists-across-function-invocations.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-006-multiple-circuit-breakers-operate-independently.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-001-trace-spans-command-to-projection-flow.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-002-missing-trace-context-uses-default.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-003-trace-context-is-preserved-in-event-metadata.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-004-multiple-projections-share-same-trace.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-001-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-002-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-003-closed-circuit-uses-action-retrier-with-configured-retries.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-004-dcb-conflict-triggers-workpool-based-retry.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-005-dcb-retry-respects-exponential-backoff-with-jitter.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-006-dcb-retry-uses-latest-version-after-conflict.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-007-dcb-retry-partition-key-prevents-concurrent-retries.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-008-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-009-failed-dlq-retry-returns-to-pending-status.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-010-successful-dlq-retry-marks-item-resolved.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-011-dlq-retry-tracks-retry-count.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-001-readiness-probe-checks-dependencies.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-002-unhealthy-dependency-fails-readiness.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-003-liveness-probe-always-succeeds.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-004-projection-lag-threshold-determines-health.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-005-health-response-includes-all-component-statuses.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-001-projection-lag-is-tracked.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-002-metrics-collection-handles-missing-checkpoints.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-003-event-throughput-is-calculated.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-004-dead-letter-queue-size-is-tracked.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-001-requests-within-rate-limit-succeed.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-002-requests-exceeding-rate-limit-are-rejected.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-003-token-bucket-refills-over-time.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-004-rate-limit-key-isolation-by-user.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-005-admin-rebuild-respects-hourly-limit.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-006-admin-rebuild-blocked-when-limit-exceeded.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-007-adapter-converts-component-response-to-rate-limit-result.sdp.md create mode 100644 specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-008-adapter-handles-component-errors-gracefully.sdp.md create mode 100644 specs/behavior/platform-core/projection-categories/category-definitions.examples/s-001-projection-categories-tuple-contains-all-valid-categories.sdp.md create mode 100644 specs/behavior/platform-core/projection-categories/category-definitions.examples/s-002-is-projection-category-validates-category-strings.sdp.md create mode 100644 specs/behavior/platform-core/projection-categories/category-definitions.examples/s-003-category-helper-functions-identify-correct-categories.sdp.md create mode 100644 specs/behavior/platform-core/projection-categories/category-definitions.examples/s-004-is-client-exposed-returns-correct-exposure-status.sdp.md create mode 100644 specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-001-missing-category-returns-category-required-error.sdp.md create mode 100644 specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-002-null-category-returns-category-required-error.sdp.md create mode 100644 specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-003-valid-category-passes-validation.sdp.md create mode 100644 specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-004-assert-valid-category-returns-category-on-valid-input.sdp.md create mode 100644 specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-005-invalid-category-returns-invalid-category-error.sdp.md create mode 100644 specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-006-assert-valid-category-throws-on-invalid-input.sdp.md create mode 100644 specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-001-get-by-category-returns-all-view-projections.sdp.md create mode 100644 specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-002-get-by-category-returns-all-logic-projections.sdp.md create mode 100644 specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-003-get-by-category-returns-all-reporting-projections.sdp.md create mode 100644 specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-004-get-by-category-returns-all-integration-projections.sdp.md create mode 100644 specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-005-get-by-category-returns-empty-array-for-category-with-no-projections.sdp.md create mode 100644 specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-006-target-view-projections-for-reactive-layer.sdp.md create mode 100644 specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-007-target-integration-projections-for-event-bus-routing.sdp.md create mode 100644 specs/behavior/platform-core/projections/categories.examples/s-001-projection-category-schema-accepts-all-valid-categories.sdp.md create mode 100644 specs/behavior/platform-core/projections/categories.examples/s-002-projection-category-schema-rejects-invalid-values.sdp.md create mode 100644 specs/behavior/platform-core/projections/categories.examples/s-003-projection-category-schema-rejects-non-string-types.sdp.md create mode 100644 specs/behavior/platform-core/projections/categories.examples/s-004-is-projection-category-rejects-objects.sdp.md create mode 100644 specs/behavior/platform-core/projections/categories.examples/s-005-is-projection-category-rejects-arrays.sdp.md create mode 100644 specs/behavior/platform-core/projections/categories.examples/s-006-is-projection-category-rejects-booleans.sdp.md create mode 100644 specs/behavior/platform-core/projections/categories.examples/s-007-is-projection-category-rejects-whitespace-padded-strings.sdp.md create mode 100644 specs/behavior/platform-core/projections/categories.examples/s-008-projection-validation-errors-has-expected-error-codes.sdp.md create mode 100644 specs/behavior/platform-core/projections/categories.examples/s-009-validate-projection-category-rejects-non-string-types.sdp.md create mode 100644 specs/behavior/platform-core/projections/categories.examples/s-010-assert-valid-category-throws-category-required-for-undefined.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-001-allowed-transitions-from-active-state.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-002-rejected-transitions-from-active-state.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-003-allowed-transitions-from-rebuilding-state.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-004-rejected-transitions-from-rebuilding-state.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-005-allowed-transitions-from-paused-state.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-006-rejected-transitions-from-paused-state.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-007-allowed-transitions-from-error-state.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-008-rejected-transitions-from-error-state.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-009-valid-transitions-produce-correct-target-states.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-011-valid-events-from-active-state.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-012-valid-events-from-rebuilding-state.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-013-valid-events-from-paused-state.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-014-valid-events-from-error-state.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-015-returns-all-10-valid-transitions-with-correct-structure.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-016-all-expected-transitions-are-included.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-017-returns-same-array-reference-memoized.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-018-returns-new-state-for-valid-transition.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-019-throws-for-invalid-transition-with-projection-name.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-020-all-states-are-reachable-from-at-least-one-other-state.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-021-all-states-have-at-least-one-outgoing-transition.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-022-recovery-path-exists-from-error-to-active.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-023-error-path-exists-from-active.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-024-rebuild-retry-path-exists-from-error.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-025-normal-processing-active-state-allows-fail-event.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-026-rebuild-workflow-active-to-rebuilding-to-active.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-027-error-recovery-workflow-active-to-error-to-active.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-028-error-rebuild-workflow-active-to-error-to-rebuilding-to-active.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-029-pause-and-resume-workflow-active-to-paused-to-active.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-030-rebuild-failure-workflow-active-to-rebuilding-to-error-to-active.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-031-paused-rebuild-workflow-active-to-paused-to-rebuilding-to-active.sdp.md create mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-032-paused-error-workflow-active-to-paused-to-error-to-active.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-001-register-a-single-projection.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-002-register-multiple-projections.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-003-duplicate-projection-name-throws-error.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-004-get-returns-projection-by-name.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-005-get-returns-undefined-for-unknown-projection.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-006-has-returns-true-for-registered-projection.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-007-has-returns-false-for-unregistered-projection.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-009-list-returns-all-registered-projections.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-011-size-reflects-registration-count.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-012-get-by-event-type-returns-multiple-matching-projections.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-013-get-by-event-type-returns-single-context-specific-projection.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-014-get-by-event-type-returns-empty-for-unknown-event.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-015-get-all-event-types-returns-empty-for-empty-registry.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-016-get-all-event-types-returns-sorted-unique-event-types.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-017-get-by-context-filters-by-orders-context.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-018-get-by-context-filters-by-inventory-context.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-019-get-by-context-filters-by-cross-context.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-020-get-by-context-returns-empty-for-unknown-context.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-021-get-rebuild-order-returns-empty-for-empty-registry.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-022-get-rebuild-order-places-primary-before-cross-context.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-023-get-by-category-returns-view-projections.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-024-get-by-category-returns-logic-projections.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-025-get-by-category-returns-reporting-projections.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-026-get-by-category-returns-integration-projections.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-027-get-by-category-returns-empty-when-no-projections-match.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-028-get-by-category-verifies-all-results-have-requested-category.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-029-get-by-category-works-regardless-of-registration-order.sdp.md create mode 100644 specs/behavior/platform-core/projections/registry.examples/s-030-category-index-is-maintained-incrementally.sdp.md create mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-001-process-event-when-no-checkpoint-exists.sdp.md create mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md create mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-003-checkpoint-is-updated-after-processing.sdp.md create mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md create mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md create mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-006-separate-checkpoints-per-partition.sdp.md create mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-007-same-position-in-different-partitions-does-not-cause-skip.sdp.md create mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-008-checkpoint-not-updated-when-process-throws.sdp.md create mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-009-retry-succeeds-after-process-failure.sdp.md create mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-010-all-checkpoint-fields-stored-correctly.sdp.md create mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-011-helper-processes-and-stores-checkpoint.sdp.md create mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-012-helper-maintains-checkpoint-semantics-across-calls.sdp.md create mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-013-should-process-event-position-comparisons.sdp.md create mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-014-initial-checkpoint-has-sentinel-values.sdp.md create mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-015-each-initial-checkpoint-gets-a-unique-updated-at.sdp.md create mode 100644 specs/behavior/platform-core/queries/factory.examples/s-001-single-result-query-descriptor-has-correct-result-type-and-config.sdp.md create mode 100644 specs/behavior/platform-core/queries/factory.examples/s-002-list-result-query-descriptor-has-correct-result-type.sdp.md create mode 100644 specs/behavior/platform-core/queries/factory.examples/s-003-count-result-query-descriptor-has-correct-result-type.sdp.md create mode 100644 specs/behavior/platform-core/queries/factory.examples/s-004-paginated-query-descriptor-uses-default-page-sizes.sdp.md create mode 100644 specs/behavior/platform-core/queries/factory.examples/s-005-paginated-query-descriptor-uses-custom-page-sizes.sdp.md create mode 100644 specs/behavior/platform-core/queries/factory.examples/s-006-config-receives-default-pagination-values.sdp.md create mode 100644 specs/behavior/platform-core/queries/factory.examples/s-007-empty-registry-has-correct-context-and-projection.sdp.md create mode 100644 specs/behavior/platform-core/queries/factory.examples/s-008-registry-with-multiple-queries-provides-keyed-access.sdp.md create mode 100644 specs/behavior/platform-core/queries/factory.examples/s-009-type-safe-access-to-registered-query-descriptor.sdp.md create mode 100644 specs/behavior/platform-core/queries/factory.examples/s-010-no-options-returns-descriptor-defaults.sdp.md create mode 100644 specs/behavior/platform-core/queries/factory.examples/s-011-provided-page-size-within-limits-is-used.sdp.md create mode 100644 specs/behavior/platform-core/queries/factory.examples/s-012-page-size-exceeding-max-is-clamped.sdp.md create mode 100644 specs/behavior/platform-core/queries/factory.examples/s-013-zero-and-negative-page-sizes-are-clamped-to-1.sdp.md create mode 100644 specs/behavior/platform-core/queries/factory.examples/s-014-cursor-is-passed-through-to-options.sdp.md create mode 100644 specs/behavior/platform-core/queries/factory.examples/s-015-cursor-is-undefined-when-not-provided.sdp.md create mode 100644 specs/behavior/platform-core/queries/factory.examples/s-016-read-model-and-paginated-descriptors-preserve-result-types.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-001-pagination-constants-have-expected-values.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-002-returns-defaults-when-no-options-provided.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-003-uses-provided-page-size-within-limits.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-004-caps-page-size-at-max.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-005-enforces-minimum-page-size-of-1-for-boundary-values.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-006-passes-through-cursor.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-007-works-with-custom-config-values.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-008-rounds-floating-point-page-sizes-down.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-009-creates-an-empty-page-with-correct-structure.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-010-preserves-type-information-with-empty-array.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-011-creates-a-page-with-items-and-cursor.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-012-creates-a-done-page-when-cursor-is-null.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-013-handles-empty-items-array-with-null-cursor.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-014-encodes-and-decodes-simple-position-data.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-015-encodes-and-decodes-complex-position-data.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-016-produces-base64-encoded-string.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-017-round-trips-various-data-shapes.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-018-returns-null-for-invalid-cursor-inputs.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-019-returns-null-for-base64-with-invalid-characters-in-middle-or-end.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-020-returns-null-for-truncated-utf-8-sequences.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-021-returns-true-for-valid-page-sizes.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-022-returns-false-for-invalid-page-sizes.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-023-respects-custom-max-page-size.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-024-returns-requested-size-when-valid.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-025-returns-default-when-not-specified.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-026-caps-at-max-and-enforces-minimum.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-027-uses-custom-default-and-max-sizes.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-028-rounds-floating-point-sizes-down.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-029-simulates-complete-pagination-flow.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-030-handles-empty-result-set.sdp.md create mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-031-handles-exact-page-size-match-with-continuation.sdp.md create mode 100644 specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-001-conflicting-optimistic-update-is-rolled-back.sdp.md create mode 100644 specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-002-conflict-detection-handles-network-partition.sdp.md create mode 100644 specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-003-no-conflict-when-optimistic-is-ahead-of-durable.sdp.md create mode 100644 specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-004-rollback-triggers-ui-notification.sdp.md create mode 100644 specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-005-partial-clearing-preserves-unconfirmed-events.sdp.md create mode 100644 specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-001-client-receives-instant-update-then-durable-confirmation.sdp.md create mode 100644 specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-002-optimistic-update-works-during-workpool-backlog.sdp.md create mode 100644 specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-003-durable-state-takes-precedence-after-convergence.sdp.md create mode 100644 specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-001-category-determines-reactive-eligibility.sdp.md create mode 100644 specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-002-non-view-projection-rejects-reactive-subscription.sdp.md create mode 100644 specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-003-view-projection-enables-full-reactive-functionality.sdp.md create mode 100644 specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-004-initial-reactive-result-represents-loading-state.sdp.md create mode 100644 specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-001-evolve-produces-identical-results-on-client-and-server.sdp.md create mode 100644 specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-002-evolve-handles-unknown-event-types-gracefully.sdp.md create mode 100644 specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-003-multiple-events-evolve-in-sequence.sdp.md create mode 100644 specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-004-evolve-error-includes-event-context.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-001-get-instance-returns-the-same-instance-on-multiple-calls.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-002-reset-creates-a-new-instance.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-003-register-a-command-successfully.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-004-duplicate-registration-throws-an-error.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-005-different-command-types-can-be-registered.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-006-unregister-removes-a-registered-command.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-007-unregister-returns-false-for-non-existent-command.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-008-get-config-returns-config-for-a-registered-command.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-009-get-config-returns-undefined-for-a-non-existent-command.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-010-get-registration-returns-full-registration-for-a-registered-command.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-011-get-registration-returns-undefined-for-a-non-existent-command.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-012-has-returns-true-for-a-registered-command.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-013-has-returns-false-for-a-non-existent-command.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-014-validate-returns-valid-for-correct-payload.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-015-validate-returns-invalid-for-incorrect-payload.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-016-validate-returns-unknown-command-for-non-existent-command.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-017-list-returns-empty-array-when-no-commands-are-registered.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-018-list-returns-all-registered-commands.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-019-list-returns-command-info-objects-with-correct-shape.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-020-filter-commands-by-category.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-021-filter-commands-by-bounded-context.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-022-filter-commands-by-tag.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-023-group-commands-by-bounded-context.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-024-group-by-context-returns-empty-map-when-no-commands.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-025-size-reflects-registered-command-count.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-026-clear-removes-all-registrations.sdp.md create mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-027-global-registry-is-a-functional-registry-instance.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-001-config-has-correct-command-type-bounded-context-and-projection-name.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-002-to-handler-args-merges-original-args-with-command-id-and-correlation-id.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-003-default-partition-key-uses-aggregate-id-field.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-004-custom-partition-key-overrides-the-default.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-005-metadata-reflects-aggregate-category-and-custom-options.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-006-command-is-auto-registered-by-default.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-007-command-is-not-registered-when-auto-register-is-false.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-008-secondary-projections-are-included-in-config.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-009-saga-route-is-included-in-config.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-010-saga-route-on-complete-is-preserved.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-011-failed-projection-is-included-in-config.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-012-schema-version-defaults-to-1.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-013-process-command-has-correct-category-and-target.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-014-partition-key-uses-process-id-field.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-015-process-command-auto-registers-with-category-and-target-info.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-016-system-command-has-correct-category-subsystem-and-description.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-017-system-to-handler-args-merges-args-with-command-id-and-correlation-id.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-018-system-command-without-projection-has-no-projection-property.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-019-system-command-with-projection-includes-it-in-config.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-020-system-partition-key-defaults-to-system-command-type.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-021-system-command-without-projection-is-not-registered-even-with-auto-registe.sdp.md create mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-022-system-schema-version-defaults-to-1.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-001-load-and-upcast-cms-by-entity-id.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-002-load-throws-not-found-error-for-missing-entity.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-003-load-returns-upcast-metadata.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-004-load-propagates-upcast-errors.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-005-try-load-returns-cms-when-entity-exists.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-006-try-load-returns-null-when-entity-does-not-exist.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-007-try-load-resolves-to-null-without-throwing.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-008-try-load-propagates-upcast-errors.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-009-exists-returns-true-when-entity-exists.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-010-exists-returns-false-when-entity-does-not-exist.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-011-exists-does-not-call-upcast-function.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-012-load-many-loads-multiple-entities-in-parallel.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-013-load-many-returns-null-for-missing-entities.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-014-load-many-returns-empty-array-for-empty-input.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-015-load-many-upcasts-all-loaded-entities.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-016-load-many-preserves-order-of-input-i-ds.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-017-load-many-propagates-upcast-errors-for-any-entity.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-018-insert-creates-cms-record-and-returns-document-id.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-019-update-patches-cms-when-version-matches.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-020-update-throws-not-found-error-for-missing-document.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-021-update-throws-version-conflict-error-on-version-mismatch.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-022-not-found-error-has-correct-properties.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-023-not-found-error-is-instanceof-error.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-024-is-not-found-error-type-guard-returns-true-for-not-found-error.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-025-is-not-found-error-type-guard-returns-false-for-non-not-found-error-values.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-026-version-conflict-error-has-correct-properties.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-027-version-conflict-error-is-instanceof-error.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-028-is-version-conflict-error-type-guard-returns-true-for-version-conflict-err.sdp.md create mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-029-is-version-conflict-error-type-guard-returns-false-for-other-errors.sdp.md create mode 100644 specs/behavior/platform-core/reservation/confirm-operation.examples/s-001-confirm-reservation-with-entity-id.sdp.md create mode 100644 specs/behavior/platform-core/reservation/confirm-operation.examples/s-002-confirmed-reservation-is-permanent.sdp.md create mode 100644 specs/behavior/platform-core/reservation/confirm-operation.examples/s-003-cannot-confirm-expired-reservation.sdp.md create mode 100644 specs/behavior/platform-core/reservation/confirm-operation.examples/s-004-cannot-confirm-already-confirmed-reservation.sdp.md create mode 100644 specs/behavior/platform-core/reservation/confirm-operation.examples/s-005-cannot-confirm-non-existent-reservation.sdp.md create mode 100644 specs/behavior/platform-core/reservation/confirm-operation.examples/s-006-cannot-confirm-released-reservation.sdp.md create mode 100644 specs/behavior/platform-core/reservation/confirm-operation.examples/s-007-entity-id-is-required.sdp.md create mode 100644 specs/behavior/platform-core/reservation/confirm-operation.examples/s-008-entity-id-can-be-any-string-identifier.sdp.md create mode 100644 specs/behavior/platform-core/reservation/release-operation.examples/s-001-release-active-reservation.sdp.md create mode 100644 specs/behavior/platform-core/reservation/release-operation.examples/s-002-released-value-can-be-immediately-reserved.sdp.md create mode 100644 specs/behavior/platform-core/reservation/release-operation.examples/s-003-cannot-release-confirmed-reservation.sdp.md create mode 100644 specs/behavior/platform-core/reservation/release-operation.examples/s-004-cannot-release-already-released-reservation.sdp.md create mode 100644 specs/behavior/platform-core/reservation/release-operation.examples/s-005-cannot-release-expired-reservation.sdp.md create mode 100644 specs/behavior/platform-core/reservation/release-operation.examples/s-006-cannot-release-non-existent-reservation.sdp.md create mode 100644 specs/behavior/platform-core/reservation/release-operation.examples/s-007-expired-reservations-are-marked-by-cron.sdp.md create mode 100644 specs/behavior/platform-core/reservation/release-operation.examples/s-008-cron-does-not-affect-active-reservations.sdp.md create mode 100644 specs/behavior/platform-core/reservation/release-operation.examples/s-009-cron-does-not-affect-confirmed-reservations.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-001-email-reservation-key-format.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-002-username-reservation-key-format.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-003-custom-type-reservation-key-format.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-004-same-value-different-types.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-005-independent-type-uniqueness.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-006-type-is-required.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-007-value-is-required.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-008-empty-type-is-invalid.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-009-empty-value-is-invalid.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-010-find-reservation-by-key.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-011-find-reservation-by-type-and-value.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-012-non-existent-key-returns-null.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-013-type-containing-colon-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-014-value-can-contain-colon-url-with-port.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-001-reserve-an-email-address.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-002-reserve-with-correlation-id.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-003-first-reservation-wins.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-004-reserved-value-cannot-be-re-reserved.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-005-different-ttl-values.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-006-ttl-must-be-positive.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-007-ttl-has-maximum-limit.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-008-negative-ttl-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-009-ttl-at-minimum-boundary-succeeds.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-010-ttl-just-below-minimum-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-011-na-n-ttl-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-012-infinity-ttl-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-013-whitespace-only-type-is-invalid.sdp.md create mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-014-whitespace-only-value-is-invalid.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-001-complete-metadata-is-accepted.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-002-metadata-with-optional-user-id-is-accepted.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-003-metadata-with-invalid-timestamps-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-004-metadata-missing-required-fields-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-005-complete-command-is-accepted.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-006-command-with-optional-payload-fields-is-accepted.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-007-command-with-wrong-command-type-literal-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-008-command-with-invalid-payload-type-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-009-command-with-missing-required-payload-field-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-010-command-missing-target-context-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-011-schema-provides-type-inference-for-command-type-literal.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-012-success-with-version-and-data-is-accepted.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-013-success-with-undefined-data-is-accepted.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-014-success-without-version-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-015-rejected-with-code-and-reason-is-accepted.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-016-rejected-with-optional-context-is-accepted.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-017-rejected-without-reason-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-018-conflict-with-concurrent-modification-code-is-accepted.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-019-conflict-with-wrong-code-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-020-conflict-without-current-version-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-021-error-with-message-is-accepted.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-022-error-without-message-is-rejected.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-023-union-discriminates-success-and-preserves-version.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-024-union-discriminates-rejected-and-preserves-code-and-reason.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-025-union-discriminates-conflict-and-preserves-current-version.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-026-union-discriminates-error-and-preserves-message.sdp.md create mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-027-union-rejects-unknown-status.sdp.md create mode 100644 specs/behavior/platform-core/testing/guards.examples/s-001-allow-execution-when-convex-test-mode-is-true.sdp.md create mode 100644 specs/behavior/platform-core/testing/guards.examples/s-002-allow-execution-when-is-test-env-is-set.sdp.md create mode 100644 specs/behavior/platform-core/testing/guards.examples/s-003-allow-execution-on-self-hosted-runtime-without-explicit-test-signal.sdp.md create mode 100644 specs/behavior/platform-core/testing/guards.examples/s-004-block-execution-in-cloud-production.sdp.md create mode 100644 specs/behavior/platform-core/testing/guards.examples/s-005-is-test-environment-returns-true-in-test-mode.sdp.md create mode 100644 specs/behavior/platform-core/testing/guards.examples/s-006-is-test-environment-returns-true-with-is-test-env.sdp.md create mode 100644 specs/behavior/platform-core/testing/guards.examples/s-007-is-test-environment-returns-false-in-production.sdp.md create mode 100644 specs/behavior/platform-core/testing/guards.examples/s-008-is-test-environment-is-a-safe-boolean-check.sdp.md create mode 100644 specs/behavior/platform-core/testing/integration-isolation.examples/s-001-fresh-state-after-docker-restart.sdp.md create mode 100644 specs/behavior/platform-core/testing/integration-isolation.examples/s-002-detect-state-pollution-without-restart.sdp.md create mode 100644 specs/behavior/platform-core/testing/integration-isolation.examples/s-003-unique-namespace-per-test.sdp.md create mode 100644 specs/behavior/platform-core/testing/integration-isolation.examples/s-004-namespace-applied-to-correlation-i-ds.sdp.md create mode 100644 specs/behavior/platform-core/testing/integration-isolation.examples/s-005-workpool-jobs-from-previous-test-don-t-interfere.sdp.md create mode 100644 specs/behavior/platform-core/testing/integration-isolation.examples/s-006-scheduled-functions-use-test-specific-context.sdp.md create mode 100644 specs/behavior/platform-core/testing/platform-coverage.examples/s-001-package-has-feature-directory-platform-core.sdp.md create mode 100644 specs/behavior/platform-core/testing/platform-coverage.examples/s-002-package-has-feature-directory-platform-decider.sdp.md create mode 100644 specs/behavior/platform-core/testing/platform-coverage.examples/s-003-package-has-feature-directory-platform-fsm.sdp.md create mode 100644 specs/behavior/platform-core/testing/platform-coverage.examples/s-004-package-has-feature-directory-platform-store.sdp.md create mode 100644 specs/behavior/platform-core/testing/platform-coverage.examples/s-005-package-has-feature-directory-platform-bus.sdp.md create mode 100644 specs/behavior/platform-core/testing/platform-coverage.examples/s-006-package-has-feature-directory-platform-bc.sdp.md create mode 100644 specs/behavior/platform-core/testing/platform-coverage.examples/s-007-exported-function-has-feature-coverage.sdp.md create mode 100644 specs/behavior/platform-core/testing/platform-coverage.examples/s-008-missing-coverage-is-detected.sdp.md create mode 100644 specs/behavior/platform-core/testing/platform-coverage.examples/s-009-step-definitions-follow-naming-convention.sdp.md create mode 100644 specs/behavior/platform-core/testing/platform-coverage.examples/s-010-step-file-matches-feature-file.sdp.md create mode 100644 specs/behavior/platform-core/testing/polling.examples/s-001-sleep-for-specified-duration.sdp.md create mode 100644 specs/behavior/platform-core/testing/polling.examples/s-002-sleep-returns-a-promise.sdp.md create mode 100644 specs/behavior/platform-core/testing/polling.examples/s-003-wait-until-returns-truthy-result-immediately.sdp.md create mode 100644 specs/behavior/platform-core/testing/polling.examples/s-004-wait-until-polls-until-condition-is-met.sdp.md create mode 100644 specs/behavior/platform-core/testing/polling.examples/s-005-wait-until-throws-on-timeout.sdp.md create mode 100644 specs/behavior/platform-core/testing/polling.examples/s-006-wait-until-uses-custom-timeout-message.sdp.md create mode 100644 specs/behavior/platform-core/testing/polling.examples/s-007-wait-until-respects-poll-interval-ms.sdp.md create mode 100644 specs/behavior/platform-core/testing/polling.examples/s-008-wait-for-resolves-when-predicate-returns-true.sdp.md create mode 100644 specs/behavior/platform-core/testing/polling.examples/s-009-wait-for-throws-on-timeout.sdp.md create mode 100644 specs/behavior/platform-core/testing/polling.examples/s-010-default-timeout-is-30-seconds.sdp.md create mode 100644 specs/behavior/platform-core/testing/polling.examples/s-011-default-poll-interval-is-100ms.sdp.md create mode 100644 specs/behavior/platform-core/testing/world.examples/s-001-create-base-unit-test-world.sdp.md create mode 100644 specs/behavior/platform-core/testing/world.examples/s-002-unit-test-world-supports-scenario-context.sdp.md create mode 100644 specs/behavior/platform-core/testing/world.examples/s-003-unit-test-world-tracks-last-result.sdp.md create mode 100644 specs/behavior/platform-core/testing/world.examples/s-004-unit-test-world-tracks-last-error.sdp.md create mode 100644 specs/behavior/platform-core/testing/world.examples/s-005-create-base-integration-test-world.sdp.md create mode 100644 specs/behavior/platform-core/testing/world.examples/s-006-integration-test-world-uses-custom-backend-url.sdp.md create mode 100644 specs/behavior/platform-core/testing/world.examples/s-007-integration-test-world-defaults-to-localhost.sdp.md create mode 100644 specs/behavior/platform-core/testing/world.examples/s-008-reset-world-state-clears-all-fields.sdp.md create mode 100644 specs/behavior/platform-core/testing/world.examples/s-009-reset-preserves-test-backend-reference.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-001-single-entity-projections-recommend-entity-strategy.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-002-single-entity-projections-return-simple-complexity.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-003-single-entity-projections-include-rationale-about-stream-id.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-004-classification-defaults-to-entity-when-all-flags-are-false.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-005-global-rollup-projections-recommend-global-strategy.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-006-global-rollup-projections-return-complex-complexity.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-007-global-rollup-projections-include-rationale-about-occ-conflicts.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-008-global-strategy-prioritizes-over-other-flags.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-009-cross-context-projections-recommend-saga-strategy.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-010-cross-context-projections-return-complex-complexity.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-011-cross-context-projections-include-rationale-about-correlation-id.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-012-saga-strategy-prioritizes-over-customer-and-entity.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-013-customer-scoped-projections-recommend-customer-strategy.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-014-customer-scoped-projections-return-moderate-complexity.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-015-customer-scoped-projections-include-rationale-about-customer-id.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-016-customer-strategy-prioritizes-over-entity.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-017-decision-tree-follows-priority-global-saga-customer-entity.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-018-strategy-parallelism-values.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-019-get-recommended-parallelism-by-strategy.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-001-global-partition-key-has-name-global.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-002-global-partition-key-has-value-global.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-003-entity-partition-key-uses-stream-type-stream-id-format.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-004-entity-partition-key-prioritizes-stream-id-over-other-id-fields.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-005-entity-partition-key-falls-back-to-alternate-id-fields.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-006-entity-partition-key-throws-when-no-id-field-provided.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-007-entity-partition-key-includes-available-keys-in-error-message.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-008-entity-partition-key-uses-provided-stream-type-in-value.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-009-customer-partition-key-returns-customer-id.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-010-customer-partition-key-ignores-additional-fields.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-011-customer-partition-key-throws-when-customer-id-is-undefined.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-012-customer-partition-key-throws-when-customer-id-is-missing.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-013-customer-partition-key-throws-when-customer-id-is-empty-string.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-014-saga-partition-key-returns-correlation-id.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-015-saga-partition-key-ignores-additional-fields.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-016-saga-partition-key-throws-when-correlation-id-is-undefined.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-017-saga-partition-key-throws-when-correlation-id-is-missing.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-018-saga-partition-key-throws-when-correlation-id-is-empty-string.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-019-global-partition-key-returns-global-partition-key.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-020-global-partition-key-ignores-any-arguments.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-021-global-partition-key-returns-same-reference-on-multiple-calls.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-022-dcb-partition-key-has-name-dcb.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-023-dcb-partition-key-uses-scope-key-as-value.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-024-dcb-partition-key-handles-various-scope-key-formats.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-001-valid-result-for-config-with-get-partition-key.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-002-valid-result-for-inline-partition-key-function.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-003-validates-secondary-projections-with-get-partition-key.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-004-validates-failed-projection-with-get-partition-key.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-005-returns-missing-partition-key-error-for-missing-get-partition-key.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-006-includes-projection-name-in-error.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-007-includes-config-path-in-error.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-008-suggests-helper-functions-in-error-message.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-009-returns-invalid-partition-key-shape-when-returning-null.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-010-returns-invalid-partition-key-shape-when-returning-wrong-type.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-011-returns-invalid-partition-key-shape-when-missing-name.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-012-returns-invalid-partition-key-shape-when-missing-value.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-013-returns-invalid-partition-key-shape-when-value-is-number.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-014-returns-empty-partition-value-for-empty-string.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-015-returns-empty-partition-value-for-whitespace-only-string.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-016-collects-errors-from-all-projections.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-017-reports-correct-config-paths-for-secondary-projections.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-018-reports-correct-config-path-for-failed-projection.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-019-does-not-throw-for-valid-configs-array.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-020-does-not-throw-for-empty-array.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-021-throws-on-first-invalid-config.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-022-includes-all-errors-in-thrown-message.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-023-includes-error-codes-in-thrown-message.sdp.md create mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-024-includes-config-path-in-thrown-message.sdp.md create mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-001-success-creates-output-with-correct-status.sdp.md create mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-002-success-includes-all-required-properties.sdp.md create mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-003-rejected-creates-output-with-code-and-message.sdp.md create mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-004-rejected-includes-context-when-provided.sdp.md create mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-005-failed-creates-output-with-reason-and-event.sdp.md create mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-006-failed-includes-context-when-provided.sdp.md create mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-007-is-success-returns-true-for-success-output.sdp.md create mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-008-is-success-returns-false-for-rejected-output.sdp.md create mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-009-is-success-returns-false-for-failed-output.sdp.md create mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-010-is-success-enables-type-narrowing.sdp.md create mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-011-is-rejected-returns-true-for-rejected-output.sdp.md create mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-012-is-rejected-returns-false-for-success-output.sdp.md create mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-013-is-rejected-returns-false-for-failed-output.sdp.md create mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-014-is-rejected-enables-type-narrowing.sdp.md create mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-015-is-failed-returns-true-for-failed-output.sdp.md create mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-016-is-failed-returns-false-for-success-output.sdp.md create mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-017-is-failed-returns-false-for-rejected-output.sdp.md create mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-018-is-failed-enables-type-narrowing.sdp.md create mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-019-type-guards-are-mutually-exclusive.sdp.md create mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md create mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-002-valid-transitions-are-allowed.sdp.md create mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-003-assert-transition-does-not-throw-for-valid-transitions.sdp.md create mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-004-invalid-transitions-are-detected.sdp.md create mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-005-assert-transition-throws-fsm-transition-error-for-invalid-transitions.sdp.md create mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-006-terminal-states-are-correctly-identified.sdp.md create mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-007-terminal-state-error-message-indicates-no-valid-transitions.sdp.md create mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-008-state-validity-is-correctly-checked.sdp.md create mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-009-valid-transitions-can-be-queried-for-any-state.sdp.md create mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-010-standalone-functions-work-identically-to-fsm-methods.sdp.md create mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-011-standalone-assert-transition-throws-same-errors.sdp.md create mode 100644 specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-001-event-store-client-exposes-no-event-update-api.sdp.md create mode 100644 specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-002-event-store-client-exposes-no-event-delete-api.sdp.md create mode 100644 specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-003-first-append-to-a-new-stream-produces-version-1.sdp.md create mode 100644 specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-004-subsequent-appends-increment-the-stream-version-monotonically.sdp.md create mode 100644 specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-005-global-position-is-unique-across-two-streams.sdp.md create mode 100644 specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-006-global-position-increases-monotonically-within-a-stream.sdp.md create mode 100644 specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-007-successful-append-with-matching-version.sdp.md create mode 100644 specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-008-conflict-on-version-mismatch.sdp.md create mode 100644 specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-009-projection-resumes-from-checkpoint.sdp.md create mode 100644 specs/behavior/platform-store/event-store-types.examples/s-001-event-category-supports-all-taxonomy-values.sdp.md create mode 100644 specs/behavior/platform-store/event-store-types.examples/s-002-event-input-requires-core-event-fields.sdp.md create mode 100644 specs/behavior/platform-store/event-store-types.examples/s-003-event-input-supports-optional-category-and-schema-version.sdp.md create mode 100644 specs/behavior/platform-store/event-store-types.examples/s-004-event-input-supports-metadata-with-correlation-tracking.sdp.md create mode 100644 specs/behavior/platform-store/event-store-types.examples/s-005-stored-event-includes-all-required-storage-fields.sdp.md create mode 100644 specs/behavior/platform-store/event-store-types.examples/s-006-append-result-success-includes-event-positions.sdp.md create mode 100644 specs/behavior/platform-store/event-store-types.examples/s-007-append-result-conflict-includes-current-version.sdp.md create mode 100644 specs/unimplemented.pack.sdp.md create mode 100644 specs/unimplemented/_epic.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-001-admin-directory-is-created-with-correct-structure.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-002-backward-compatibility-for-dlq-imports.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-003-get-dead-letter-statistics.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-004-bulk-retry-pending-dead-letters.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-005-trace-complete-event-flow.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-006-trace-shows-failure-point.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-007-system-state-provides-complete-overview.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-008-query-workpool-item-status.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-009-query-workflow-execution-with-steps.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-010-query-non-existent-durable-function.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-011-unauthenticated-request-is-rejected.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-012-non-admin-user-is-rejected.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-013-admin-action-is-logged.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-001-dead-letter-list-displays-failed-events-from-both-agents.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-002-replay-action-triggers-backend-mutation-with-toast-feedback.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-003-ignore-action-with-reason-provides-confirmation.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-004-replay-failure-shows-error-toast.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-005-filter-dead-letters-by-agent.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-006-view-decision-history-with-decisions-from-both-agents.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-007-filter-decision-history-by-agent.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-008-filter-decision-history-by-action-type.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-009-view-decision-detail-with-full-reasoning.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-010-empty-decision-history-shows-guidance-message.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-011-approve-action-shows-success-toast.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-012-reject-action-shows-success-toast.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-013-error-action-shows-descriptive-error-toast.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-014-multiple-rapid-actions-show-stacked-toasts.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-015-high-value-order-detected-and-surfaces-as-vip-approval.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-016-low-value-order-does-not-trigger-agent.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-017-admin-approves-vip-flag-for-high-value-order.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-018-both-agents-trigger-from-same-customer-activity.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-019-dashboard-shows-both-active-agents.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-020-pending-approvals-count-includes-both-agents.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-021-one-agent-stopped-one-active.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-001-agent-component-registers-with-isolated-schema.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-002-component-api-provides-full-crud-for-checkpoints.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-003-direct-table-access-is-not-possible-from-parent.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-004-component-sub-transactions-provide-isolation.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-005-agent-handler-receives-projection-data-as-argument.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-006-missing-projection-data-returns-empty-result.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-007-agent-handler-cannot-directly-access-app-level-projection-tables.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-008-app-level-queries-can-access-agent-data-via-component-api.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-001-agent-command-routes-through-command-orchestrator-to-handler.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-002-unknown-command-type-is-rejected-with-validation-error.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-003-command-idempotency-prevents-duplicate-processing.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-004-pause-agent-transitions-active-agent-to-paused.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-005-resume-agent-resumes-from-checkpoint-position.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-006-invalid-lifecycle-transition-is-rejected.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-007-reconfigure-agent-updates-configuration-without-losing-state.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-008-agent-config-references-patterns-from-registry.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-009-handler-uses-pattern-trigger-for-cheap-detection.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-010-handler-uses-pattern-analyze-for-llm-analysis.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-011-unknown-pattern-name-in-config-fails-validation.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-001-agent-action-handler-calls-llm-and-returns-decision.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-002-on-complete-mutation-persists-decision-atomically.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-003-action-handler-rejects-invalid-agent-configuration.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-004-llm-unavailable-propagates-error-through-retries-to-dead-letter.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-005-action-failure-triggers-dead-letter-via-on-complete.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-006-rate-limiter-allows-llm-call-within-limits.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-007-rate-limiter-blocks-llm-call-when-exceeded.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-008-cost-budget-exceeded-pauses-agent.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-009-queue-overflow-triggers-dead-letter.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-010-agent-subscription-with-on-complete-receives-completion-callbacks.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-011-failed-agent-jobs-create-dead-letters-via-on-complete.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-012-agent-subscription-without-on-complete-uses-global-default.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-001-circuit-remains-closed-on-success.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-002-circuit-opens-after-threshold-failures.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-003-circuit-transitions-to-half-open-after-timeout.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-004-successful-probe-closes-circuit.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-005-failed-probe-reopens-circuit.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-006-circuit-state-persists-across-function-calls.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-007-non-existent-circuit-defaults-to-closed.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-008-timeout-transitions-open-to-half-open.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-009-stale-timeout-is-ignored.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-010-half-open-probe-closes-circuit-on-success.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-011-half-open-probe-reopens-circuit-on-failure.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-012-open-circuit-returns-fast-failure.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-013-payment-circuit-opens-after-3-failures.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-014-email-circuit-tolerates-more-failures.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-015-different-services-have-independent-circuits.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-001-generate-process-guard-reference-at-standard-detail-level.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-002-generate-process-guard-reference-at-summary-detail-level.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-003-extract-conventions-by-tag-value.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-004-convention-content-preserves-rule-block-structure.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-005-no-conventions-found-for-requested-tag-values.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-006-no-shape-sources-match-any-pattern-file-paths.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-007-convention-tag-matches-multiple-decision-records.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-008-dual-output-generation.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-009-summary-compaction-quality.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-010-reference-generators-appear-in-available-generators-list.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-011-cli-invocation-generates-reference-docs.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-012-convention-tag-is-registered-in-taxonomy.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-013-recipe-rule-block-content-preserved-in-decision-record.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-001-auth-remediation-is-not-split-by-mutation-family.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-by-default.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-001-cancel-a-confirmed-order.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-002-cannot-cancel-already-cancelled-order-unchanged-behavior.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-003-order-cancelled-evolves-confirmed-state-to-cancelled.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-004-reservation-is-released-after-confirmed-order-cancellation.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-005-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-006-cancelling-submitted-order-with-pending-reservation-releases-it.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-007-pm-is-idempotent-for-duplicate-order-cancelled-events.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-008-three-cancellations-trigger-churn-risk-agent.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-001-same-email-produces-same-stream-id.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-002-composite-key-produces-consistent-hash.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-003-different-emails-produce-different-stream-i-ds.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-004-first-create-succeeds.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-005-second-create-fails-with-conflict.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-006-concurrent-creates-exactly-one-succeeds.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-007-hash-output-is-url-safe.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-008-hash-is-not-reversible.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-009-pattern-selection-by-use-case.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/epic-process-enhancements/s-001-specs-can-evolve-independently-of-phases.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/epic-process-enhancements/s-002-type-script-phase-files-link-specs-to-releases.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/event-correctness-migration/s-001-event-correctness-packet-starts-from-decisions-and-inventory.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/event-correctness-migration/s-002-old-and-new-checkpoint-formats-are-handled-explicitly.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-001-readiness-probe-returns-healthy-when-all-components-ok.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-002-readiness-probe-returns-unhealthy-on-projection-lag.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-003-liveness-probe-always-returns-alive.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-004-workpool-backlog-fails-readiness.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-005-normal-queue-depth-passes-readiness.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-006-projection-lag-is-calculated-correctly.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-007-missing-checkpoint-treated-as-maximum-lag.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-008-zero-lag-is-healthy.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-009-metrics-collection-gathers-all-dimensions.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-010-metrics-emitted-as-json-for-log-streams.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-011-metrics-collection-handles-empty-state.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-012-all-components-healthy-yields-healthy-system.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-013-single-unhealthy-component-makes-system-unhealthy.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-014-degraded-component-yields-degraded-system.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-001-context-map-shows-bc-topology.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-002-register-partnership-relationship.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-003-register-shared-kernel-relationship.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-004-register-open-host-service-relationship.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-005-duplicate-relationship-is-rejected.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-006-self-referential-relationship-is-rejected.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-007-integration-event-uses-published-language.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-008-event-tagging-for-routing-and-dcb.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-009-schema-compatibility-mode-is-enforced.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-010-register-schema-with-compatibility-mode.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-011-unregistered-event-type-fails-conversion.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-012-invalid-payload-fails-schema-validation.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-013-acl-translates-external-system-response.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-014-acl-handles-bidirectional-translation.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-015-acl-validates-external-input.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-016-acl-rejects-unmapped-values.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-001-v1-consumer-receives-v2-event.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-002-upcast-historical-events.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-003-chain-upcasters-for-multi-version-migration.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-004-upcast-adds-computed-field.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-005-incompatible-schema-change-is-rejected.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-006-breaking-change-without-migration.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-007-contract-test-validates-schema-compatibility.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-008-contract-sample-generation.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-009-generate-multiple-unique-samples.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-010-producer-contract-test-utility.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-011-consumer-contract-test-utility.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-012-compatible-producer-and-consumer-verified.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-013-compatible-with-downcaster.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-014-detect-producer-consumer-mismatch.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-015-contract-violation-is-recorded.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-016-contract-violations-are-queryable.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/package-architecture/s-001-platform-fsm-has-no-dependencies.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/package-architecture/s-002-platform-decider-depends-only-on-platform-fsm.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/package-architecture/s-003-decider-package-is-independently-usable.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/package-architecture/s-004-packages-are-independently-publishable.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/package-architecture/s-005-framework-tests-live-in-framework-packages.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/package-architecture/s-006-existing-imports-continue-to-work.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/package-architecture/s-007-platform-namespace-avoids-conflicts.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-001-pd-rs-appear-in-generated-decisions-md.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-002-pdr-numbering-is-independent-from-package-ad-rs.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-001-minimal-release-file-structure.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-002-pdr-tagged-with-release-version.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-003-changelog-generation-from-scattered-tags.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-001-specs-and-type-script-phase-files-are-separate.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-002-spec-files-use-semantic-tags-only.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-003-type-script-phase-files-centralize-release-information.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-004-specs-can-evolve-independently-of-phases.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-005-no-release-references-in-spec-data-tables.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-006-type-script-phase-files-support-process-metadata.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-007-type-script-phase-files-support-dependency-tracking.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-001-all-metadata-uses-architect-prefix.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-002-bdd-tags-remain-unprefixed.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-003-scanner-accepts-deprecated-prefix-during-migration.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-001-compiler-enforces-taxonomy-values.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-002-zod-schemas-derive-from-type-script-constants.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-003-registry-builder-creates-valid-tag-registry.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-004-type-inference-from-constants.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-001-roadmap-spec-structure.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-002-package-spec-structure.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-003-linking-roadmap-to-package-specs.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-004-completed-pattern-roadmap-spec.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-005-active-pattern-with-acceptance-criteria.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-001-evaluating-a-platform-demonstration-change.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-002-evaluating-a-business-feature-change.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-003-evaluating-an-uncertain-change.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-001-design-session-produces-decision-specs-not-documents.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-002-design-session-produces-code-stubs.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-003-stub-file-has-target-annotation.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-004-stubs-use-pattern-based-folder-naming.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-005-design-session-decision-uses-design-category.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-001-agent-handler-receives-projection-data-as-argument.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-002-missing-external-data-is-handled-gracefully.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-003-injected-data-interface-is-extensible.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-001-action-handler-performs-analysis-without-persistence.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-002-on-complete-mutation-persists-decision-atomically.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-003-llm-unavailable-falls-back-to-rule-based-analysis.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-004-action-failure-triggers-dead-letter-via-on-complete.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-005-null-decision-advances-checkpoint-without-side-effects.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-006-event-bus-dispatches-action-subscription-via-enqueue-action.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-007-existing-mutation-subscriptions-remain-unchanged.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-008-action-subscription-requires-on-complete-at-the-type-level.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-009-sequential-events-process-correctly.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-010-concurrent-actions-for-same-entity-are-serialized-at-on-complete.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-011-already-processed-event-is-skipped-in-action.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-012-partial-on-complete-failure-replays-safely.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-013-event-bus-uses-subscription-specific-pool-when-available.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-001-command-routes-through-orchestrator-to-domain-handler.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-002-unknown-command-type-fails-with-routing-error.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-003-duplicate-command-rejected-by-command-orchestrator-idempotency.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-004-handler-uses-trigger-for-cheap-detection-before-llm.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-005-handler-uses-analyze-for-llm-powered-detection.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-001-invalid-lifecycle-transition-is-rejected.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-002-stop-agent-works-from-any-non-stopped-state.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-003-pause-agent-transitions-active-agent-to-paused.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-004-resume-agent-resumes-from-checkpoint-position.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-005-reconfigure-agent-updates-configuration-without-losing-state.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-001-valid-proof-allows-a-legitimate-component-boundary-action.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-before-any-write.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-003-targeted-mutation-family-migrates-in-one-packet.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-001-sequential-appends-remain-strictly-monotonic-at-real-timestamps.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-002-legacy-numeric-checkpoints-are-read-safely-by-the-new-code.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-001-secondary-fanout-and-saga-routing-no-longer-share-the-primary-projection-p.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-002-the-pool-split-does-not-claim-nonexistent-workpool-ordering-behavior.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-001-tranche-3-gate-chooses-the-low-blast-radius-path.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-002-optional-package-splits-are-not-silently-started.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-003-shared-contracts-package-centralizes-the-non-split-contract-surfaces.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-004-layering-command-enforces-the-tranche-3-non-split-boundary-rules.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-001-same-key-plus-same-payload-returns-the-original-append-result.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-002-same-key-plus-different-payload-is-rejected-and-audited.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-001-payload-below-the-configured-cap-passes-the-component-boundary.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-002-oversized-payload-is-rejected-before-persistence.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-001-event-type-catch-up-uses-the-replacement-compound-index.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-002-removed-indexes-stay-absent-after-the-audit-driven-cleanup.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-001-ac4-is-closed-by-a-constrained-dependency-decision-rather-than-a-package-r.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-002-the-constrained-dependency-does-not-reopen-the-deferred-platform-core-spli.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-001-bare-names-remain-canonical-across-roadmap-and-decision-sources.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-002-executable-tests-names-identify-carrier-artifacts-only.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-003-architect-implements-carries-the-continuity-edge.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-001-selective-rollback-restores-one-semantic-pattern-without-undoing-the-whole.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-002-whole-packet-rollback-keeps-enforcement-in-the-normal-ci-lanes.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-001-projection-lag-is-tracked.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-002-metrics-collection-handles-missing-checkpoints.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-003-trace-spans-command-to-projection-flow.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-004-missing-trace-context-uses-default.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-005-readiness-probe-checks-dependencies.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-006-unhealthy-dependency-fails-readiness.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-007-liveness-probe-always-succeeds.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-008-workpool-backlog-fails-readiness.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-009-circuit-opens-after-repeated-failures.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-010-circuit-transitions-to-half-open-after-timeout.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-011-successful-half-open-request-closes-circuit.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-012-failed-half-open-request-reopens-circuit.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-013-projection-rebuild-re-processes-events.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-014-dead-letter-retry-re-enqueues-event.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-015-event-flow-trace-returns-full-history.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-016-durable-function-run-diagnostics.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-017-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-018-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-019-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-020-failed-dlq-retry-returns-to-pending-status.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-021-durable-function-calls-propagate-trace-context.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/test-content-blocks/s-001-scenario-with-doc-string-for-rich-content.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/test-content-blocks/s-002-scenario-with-data-table-for-structured-data.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/test-content-blocks/s-003-simple-scenario-under-second-rule.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/test-content-blocks/s-004-scenario-with-examples-table.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/themed-decision-architecture/s-001-generate-themed-decision-document.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/themed-decision-architecture/s-002-theme-tag-in-decision-file.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/themed-decision-architecture/s-003-adr-with-dependency-declaration.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/themed-decision-architecture/s-004-generate-dependency-graph.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/themed-decision-architecture/s-005-layer-information-in-generated-docs.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/themed-decision-architecture/s-006-port-adr-from-old-format-to-feature-file.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/themed-decision-architecture/s-007-review-for-validity-during-migration.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/themed-decision-architecture/s-008-generate-all-decision-artifacts.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-001-store-and-bus-readiness-harnesses-exist-before-tranche-1-implementation.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-002-readiness-validation-remains-machine-verifiable.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-001-release-governance-points-to-pdr-002.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-002-docs-only-changes-still-run-architect-guard-and-docs-generation.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-001-supporting-cleanup-does-not-bypass-the-auth-keystone.sdp.md create mode 100644 specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-002-supporting-contract-gaps-fail-closed-after-remediation.sdp.md create mode 100644 specs/unimplemented/current/phase-100-codec-driven-reference-generation.sdp.md create mode 100644 specs/unimplemented/current/phase-100-themed-decision-architecture.sdp.md create mode 100644 specs/unimplemented/current/phase-15-projection-categories-executable-tests.sdp.md create mode 100644 specs/unimplemented/current/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md create mode 100644 specs/unimplemented/current/phase-22-agent-as-bounded-context.sdp.md create mode 100644 specs/unimplemented/current/phase-22-agent-churn-risk-completion.sdp.md create mode 100644 specs/unimplemented/current/phase-22-confirmed-order-cancellation.sdp.md create mode 100644 specs/unimplemented/deliverables/admin-tooling-consolidation/d-001-create-admin-directory.sdp.md create mode 100644 specs/unimplemented/deliverables/admin-tooling-consolidation/d-002-projection-admin-endpoints.sdp.md create mode 100644 specs/unimplemented/deliverables/admin-tooling-consolidation/d-003-refactored-dlq-endpoints.sdp.md create mode 100644 specs/unimplemented/deliverables/admin-tooling-consolidation/d-004-event-flow-trace-query.sdp.md create mode 100644 specs/unimplemented/deliverables/admin-tooling-consolidation/d-005-system-state-snapshot-query.sdp.md create mode 100644 specs/unimplemented/deliverables/admin-tooling-consolidation/d-006-durable-function-run-queries.sdp.md create mode 100644 specs/unimplemented/deliverables/admin-tooling-consolidation/d-007-admin-authorization-wrapper.sdp.md create mode 100644 specs/unimplemented/deliverables/admin-tooling-consolidation/d-008-admin-api-documentation.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-admin-frontend/d-001-high-value-agent-config.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-admin-frontend/d-002-high-value-pattern-definition.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-admin-frontend/d-003-high-value-action-handler.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-admin-frontend/d-004-high-value-on-complete-handler.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-admin-frontend/d-005-high-value-command-route.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-admin-frontend/d-006-high-value-event-bus-subscription.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-admin-frontend/d-007-high-value-integration-test-real-llm.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-admin-frontend/d-008-dead-letter-management-section-in-monitoring.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-admin-frontend/d-009-use-dead-letters-hook.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-admin-frontend/d-010-use-dead-letter-actions-hook.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-admin-frontend/d-011-decision-history-tab.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-admin-frontend/d-012-use-decision-history-hook-with-filters.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-admin-frontend/d-013-toast-notification-integration-sonner.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-admin-frontend/d-014-action-feedback-toasts.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-admin-frontend/d-015-dashboard-update-for-multi-agent.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-admin-frontend/d-016-e2-e-step-definitions.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-admin-frontend/d-017-agent-admin-page-page-object.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-admin-frontend/d-018-tag-unimplemented-agent-e2e-scenarios-skip.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-admin-frontend/d-019-auth-integration-documentation.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-bc-component-isolation/d-001-agent-component-definition.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-bc-component-isolation/d-002-agent-component-schema.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-bc-component-isolation/d-003-checkpoint-public-api.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-bc-component-isolation/d-004-audit-public-api.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-bc-component-isolation/d-005-dead-letter-public-api.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-bc-component-isolation/d-006-command-public-api.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-bc-component-isolation/d-007-approval-public-api.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-bc-component-isolation/d-008-cross-component-query-pattern.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-llm-integration/d-001-agent-action-handler-factory.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-llm-integration/d-002-llm-integrated-on-complete-handler.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-llm-integration/d-003-rate-limiter-integration.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-llm-integration/d-004-cost-budget-tracking.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-llm-integration/d-005-convex-dev-agent-thread-adapter.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-llm-integration/d-006-on-complete-in-create-agent-subscription-options.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-llm-integration/d-007-circuit-breaker-for-llm.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-llm-integration/d-008-agent-workpool-configuration.sdp.md create mode 100644 specs/unimplemented/deliverables/agent-llm-integration/d-009-action-mutation-integration-test.sdp.md create mode 100644 specs/unimplemented/deliverables/circuit-breaker-pattern/d-001-circuit-breaker-state-machine-pure.sdp.md create mode 100644 specs/unimplemented/deliverables/circuit-breaker-pattern/d-002-circuit-breaker-types.sdp.md create mode 100644 specs/unimplemented/deliverables/circuit-breaker-pattern/d-003-circuit-breakers-table-schema.sdp.md create mode 100644 specs/unimplemented/deliverables/circuit-breaker-pattern/d-004-with-circuit-breaker-wrapper.sdp.md create mode 100644 specs/unimplemented/deliverables/circuit-breaker-pattern/d-005-load-circuit-state-query.sdp.md create mode 100644 specs/unimplemented/deliverables/circuit-breaker-pattern/d-006-record-success-mutation.sdp.md create mode 100644 specs/unimplemented/deliverables/circuit-breaker-pattern/d-007-record-failure-mutation.sdp.md create mode 100644 specs/unimplemented/deliverables/circuit-breaker-pattern/d-008-check-half-open-scheduled-mutation.sdp.md create mode 100644 specs/unimplemented/deliverables/circuit-breaker-pattern/d-009-on-circuit-probe-complete-handler.sdp.md create mode 100644 specs/unimplemented/deliverables/circuit-breaker-pattern/d-010-circuit-breaker-metrics.sdp.md create mode 100644 specs/unimplemented/deliverables/component-boundary-authentication-convention/d-001-pdr-014-placeholder.sdp.md create mode 100644 specs/unimplemented/deliverables/component-boundary-authentication-convention/d-002-canonical-verification-proof-contract.sdp.md create mode 100644 specs/unimplemented/deliverables/component-boundary-authentication-convention/d-003-verify-actor-helper.sdp.md create mode 100644 specs/unimplemented/deliverables/component-boundary-authentication-convention/d-004-identity-bearing-mutation-migration.sdp.md create mode 100644 specs/unimplemented/deliverables/component-boundary-authentication-convention/d-005-contract-status-tagging-for-system-only-exceptions.sdp.md create mode 100644 specs/unimplemented/deliverables/component-boundary-authentication-convention/d-006-component-boundary-auth-integration-suite.sdp.md create mode 100644 specs/unimplemented/deliverables/deterministic-id-hashing/d-001-deterministic-stream-id-function.sdp.md create mode 100644 specs/unimplemented/deliverables/deterministic-id-hashing/d-002-hash-algorithm-selection.sdp.md create mode 100644 specs/unimplemented/deliverables/deterministic-id-hashing/d-003-conflict-error-handling.sdp.md create mode 100644 specs/unimplemented/deliverables/deterministic-id-hashing/d-004-pattern-documentation.sdp.md create mode 100644 specs/unimplemented/deliverables/event-correctness-migration/d-001-global-position-consumer-inventory.sdp.md create mode 100644 specs/unimplemented/deliverables/event-correctness-migration/d-002-pdr-018-placeholder.sdp.md create mode 100644 specs/unimplemented/deliverables/event-correctness-migration/d-003-pdr-015-placeholder.sdp.md create mode 100644 specs/unimplemented/deliverables/event-correctness-migration/d-004-append-to-stream-idempotency-migration.sdp.md create mode 100644 specs/unimplemented/deliverables/event-correctness-migration/d-005-global-position-representation-migration-and-compat-reader.sdp.md create mode 100644 specs/unimplemented/deliverables/event-correctness-migration/d-006-canonical-pm-transition-map-parity.sdp.md create mode 100644 specs/unimplemented/deliverables/event-correctness-migration/d-007-event-correctness-integration-suite.sdp.md create mode 100644 specs/unimplemented/deliverables/health-observability/d-001-health-check-types.sdp.md create mode 100644 specs/unimplemented/deliverables/health-observability/d-002-check-readiness-query.sdp.md create mode 100644 specs/unimplemented/deliverables/health-observability/d-003-check-liveness-query.sdp.md create mode 100644 specs/unimplemented/deliverables/health-observability/d-004-http-router-with-health-routes.sdp.md create mode 100644 specs/unimplemented/deliverables/health-observability/d-005-metrics-types.sdp.md create mode 100644 specs/unimplemented/deliverables/health-observability/d-006-metrics-collector.sdp.md create mode 100644 specs/unimplemented/deliverables/health-observability/d-007-projection-lag-calculator.sdp.md create mode 100644 specs/unimplemented/deliverables/health-observability/d-008-workpool-depth-query.sdp.md create mode 100644 specs/unimplemented/deliverables/health-observability/d-009-system-health-aggregator.sdp.md create mode 100644 specs/unimplemented/deliverables/integration-patterns-21a/d-001-context-map-registry.sdp.md create mode 100644 specs/unimplemented/deliverables/integration-patterns-21a/d-002-context-map-documentation.sdp.md create mode 100644 specs/unimplemented/deliverables/integration-patterns-21a/d-003-published-language-registry.sdp.md create mode 100644 specs/unimplemented/deliverables/integration-patterns-21a/d-004-to-published-language-converter.sdp.md create mode 100644 specs/unimplemented/deliverables/integration-patterns-21a/d-005-acl-builder-enhancement.sdp.md create mode 100644 specs/unimplemented/deliverables/integration-patterns-21a/d-006-integration-event-metadata-extension.sdp.md create mode 100644 specs/unimplemented/deliverables/integration-patterns-21b/d-001-upcaster-implementation.sdp.md create mode 100644 specs/unimplemented/deliverables/integration-patterns-21b/d-002-downcaster-implementation.sdp.md create mode 100644 specs/unimplemented/deliverables/integration-patterns-21b/d-003-migration-path-validation.sdp.md create mode 100644 specs/unimplemented/deliverables/integration-patterns-21b/d-004-contract-sample-generation.sdp.md create mode 100644 specs/unimplemented/deliverables/integration-patterns-21b/d-005-producer-contract-tests.sdp.md create mode 100644 specs/unimplemented/deliverables/integration-patterns-21b/d-006-consumer-contract-tests.sdp.md create mode 100644 specs/unimplemented/deliverables/integration-patterns-21b/d-007-compatibility-verification.sdp.md create mode 100644 specs/unimplemented/deliverables/integration-patterns-21b/d-008-contract-violation-detection.sdp.md create mode 100644 specs/unimplemented/deliverables/production-hardening/d-001-metrics-collection-types.sdp.md create mode 100644 specs/unimplemented/deliverables/production-hardening/d-002-metrics-collector.sdp.md create mode 100644 specs/unimplemented/deliverables/production-hardening/d-003-health-check-queries.sdp.md create mode 100644 specs/unimplemented/deliverables/production-hardening/d-004-health-http-router.sdp.md create mode 100644 specs/unimplemented/deliverables/production-hardening/d-005-circuit-breaker-implementation.sdp.md create mode 100644 specs/unimplemented/deliverables/production-hardening/d-006-admin-projection-endpoints.sdp.md create mode 100644 specs/unimplemented/deliverables/production-hardening/d-007-admin-dlq-endpoints.sdp.md create mode 100644 specs/unimplemented/deliverables/production-hardening/d-008-admin-diagnostics.sdp.md create mode 100644 specs/unimplemented/deliverables/production-hardening/d-009-durable-function-run-diagnostics.sdp.md create mode 100644 specs/unimplemented/deliverables/production-hardening/d-010-contract-violation-types.sdp.md create mode 100644 specs/unimplemented/deliverables/production-hardening/d-011-grafana-dashboard-templates.sdp.md create mode 100644 specs/unimplemented/deliverables/production-hardening/d-012-runbook-documentation.sdp.md create mode 100644 specs/unimplemented/deliverables/production-hardening/d-013-circuit-breaker-retrier-integration.sdp.md create mode 100644 specs/unimplemented/deliverables/production-hardening/d-014-dlq-action-retrier-pattern.sdp.md create mode 100644 specs/unimplemented/deliverables/production-hardening/d-015-durable-function-decision-guide.sdp.md create mode 100644 specs/unimplemented/deliverables/test-content-blocks/d-001-demo-item-1.sdp.md create mode 100644 specs/unimplemented/deliverables/themed-decision-architecture/d-001-add-adr-theme-tag-to-registry.sdp.md create mode 100644 specs/unimplemented/deliverables/themed-decision-architecture/d-002-theme-grouped-decision-generator.sdp.md create mode 100644 specs/unimplemented/deliverables/themed-decision-architecture/d-003-dependency-graph-generator.sdp.md create mode 100644 specs/unimplemented/deliverables/themed-decision-architecture/d-004-adr-migration-scripts.sdp.md create mode 100644 specs/unimplemented/deliverables/themed-decision-architecture/d-005-review-and-port-33-active-ad-rs.sdp.md create mode 100644 specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-001-dependency-delta-memo.sdp.md create mode 100644 specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-002-store-backend-integration-harness.sdp.md create mode 100644 specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-003-bus-backend-integration-harness.sdp.md create mode 100644 specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-004-typecheck-and-vitest-config-alignment.sdp.md create mode 100644 specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-005-strict-ts-and-es-lint-hardening.sdp.md create mode 100644 specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-001-release-automation-aligned-to-architect-releases.sdp.md create mode 100644 specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-002-dependency-scanning-in-ci.sdp.md create mode 100644 specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-003-contract-status-convention-and-linting.sdp.md create mode 100644 specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-004-convex-es-rename-guard.sdp.md create mode 100644 specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-005-docs-process-validation-workflow.sdp.md create mode 100644 specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-001-ensure-test-environment-fail-closed.sdp.md create mode 100644 specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-002-correlation-id-required-at-validator-boundary.sdp.md create mode 100644 specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-003-full-length-uui-dv7-helper-centralization.sdp.md create mode 100644 specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-004-reviewer-authorization-default-deny-migration.sdp.md create mode 100644 specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-005-approval-expiration-ordering-fix.sdp.md create mode 100644 specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-006-lifecycle-stubs-throw-or-are-removed.sdp.md create mode 100644 specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-007-platform-store-dependency-decision-guardrails.sdp.md create mode 100644 specs/unimplemented/remaining/phase-100-themed-decision-architecture.sdp.md create mode 100644 specs/unimplemented/remaining/phase-18-production-hardening.sdp.md create mode 100644 specs/unimplemented/remaining/phase-18-workpool-partitioning-strategy.sdp.md create mode 100644 specs/unimplemented/remaining/phase-20-reservation-pattern.sdp.md create mode 100644 specs/unimplemented/remaining/phase-21-integration-patterns-21b.sdp.md create mode 100644 specs/unimplemented/remaining/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md create mode 100644 specs/unimplemented/remaining/phase-22-agent-as-bounded-context.sdp.md create mode 100644 specs/unimplemented/remaining/phase-22-agent-churn-risk-completion.sdp.md create mode 100644 specs/unimplemented/remaining/phase-22-confirmed-order-cancellation.sdp.md diff --git a/scripts/migrate-scenarios-and-unimplemented.mjs b/scripts/migrate-scenarios-and-unimplemented.mjs new file mode 100644 index 00000000..4859976c --- /dev/null +++ b/scripts/migrate-scenarios-and-unimplemented.mjs @@ -0,0 +1,325 @@ +#!/usr/bin/env node +/** + * Migrate (1) every Gherkin Scenario as an SDP example Spec and + * (2) non-implemented architect deliverables / remaining-work items + * as idea-rung behavior Specs. + * + * Usage: node scripts/migrate-scenarios-and-unimplemented.mjs [--dry-run] + */ +import fs from "node:fs"; +import path from "node:path"; + +const ROOT = path.resolve(import.meta.dirname, ".."); +const SPECS = path.join(ROOT, "specs"); +const DRY_RUN = process.argv.includes("--dry-run"); +const SKIP = new Set(["node_modules", "dist", "generated", "coverage", ".git"]); + +function toKebab(name) { + return String(name) + .replace(/([a-z0-9])([A-Z])/g, "$1-$2") + .replace(/([A-Z]+)([A-Z][a-z])/g, "$1-$2") + .replace(/_/g, "-") + .toLowerCase() + .replace(/[^a-z0-9-]+/g, "-") + .replace(/^-+|-+$/g, "") + .replace(/-+/g, "-"); +} + +function sanitizeSegment(name) { + let s = toKebab(name); + if (!s) s = "unnamed"; + if (!/^[A-Za-z]/.test(s)) s = `n-${s}`; + if (s.length > 80) s = s.slice(0, 80).replace(/-+$/g, ""); + return s; +} + +function walk(dir, pred, out = []) { + if (!fs.existsSync(dir)) return out; + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + if (entry.name.startsWith(".")) continue; + const full = path.join(dir, entry.name); + if (entry.isDirectory()) { + if (SKIP.has(entry.name)) continue; + walk(full, pred, out); + continue; + } + if (entry.isFile() && pred(full, entry.name)) out.push(full); + } + return out; +} + +function relPosix(filePath) { + return path.relative(ROOT, filePath).split(path.sep).join("/"); +} + +/** @type {Set} */ +const usedIds = new Set(); + +function loadExistingIdsAndParents() { + /** @type {Map} */ + const carrierToId = new Map(); + /** @type {Map} */ + const stemToId = new Map(); + /** @type {Map} */ + const idToFile = new Map(); + for (const file of walk(SPECS, (p, name) => name.endsWith(".sdp.md") && !name.endsWith(".pack.sdp.md"))) { + const text = fs.readFileSync(file, "utf8"); + const idMatch = text.match(/^id:\s*(\S+)/m); + if (!idMatch) continue; + usedIds.add(idMatch[1]); + idToFile.set(idMatch[1], file); + const carrier = text.match(/test carrier:\s*([^)\n]+)/); + if (carrier) carrierToId.set(carrier[1].trim(), idMatch[1]); + stemToId.set(path.basename(file, ".sdp.md"), idMatch[1]); + } + return { carrierToId, stemToId, idToFile }; +} + +function uniqueId(preferred) { + if (!usedIds.has(preferred)) { + usedIds.add(preferred); + return preferred; + } + let i = 2; + while (usedIds.has(`${preferred}-${i}`)) i++; + const id = `${preferred}-${i}`; + usedIds.add(id); + return id; +} + +function parseScenarios(content) { + const lines = content.split("\n"); + /** @type {{ title: string, outline: boolean, line: number }[]} */ + const out = []; + for (let i = 0; i < lines.length; i++) { + const m = lines[i].match(/^\s*Scenario(?: Outline)?:\s*(.*)$/); + if (!m) continue; + out.push({ + title: (m[1] ?? "").trim() || `scenario-${out.length + 1}`, + outline: /^\s*Scenario Outline:/.test(lines[i]), + line: i + 1, + }); + } + return out; +} + +function parsePendingDeliverables(content) { + const rows = []; + for (const line of content.split("\n")) { + if (!/\|\s*pending\s*\|/i.test(line)) continue; + const cells = line + .split("|") + .map((c) => c.trim()) + .filter((c) => c.length > 0); + if (cells.length < 2) continue; + if (/^deliverable$/i.test(cells[0])) continue; + rows.push({ name: cells[0], status: "pending", location: cells[2] ?? "" }); + } + return rows; +} + +function writeSpec(outPath, body) { + if (DRY_RUN) return; + fs.mkdirSync(path.dirname(outPath), { recursive: true }); + fs.writeFileSync(outPath, body); +} + +function specBody({ id, kind, altitude, parent, title, outcome }) { + const relations = parent + ? `relations:\n refines: ${parent}` + : "relations: {}"; + return `--- +id: ${id} +kind: ${kind} +altitude: ${altitude} +readiness: idea +${relations} +--- +# ${title} + +## Intent + +- outcome: ${outcome} +`; +} + +const { carrierToId, stemToId, idToFile } = loadExistingIdsAndParents(); + +const unimplementedEpicId = uniqueId("spec:unimplemented.backlog"); +writeSpec( + path.join(SPECS, "unimplemented", "_epic.sdp.md"), + specBody({ + id: unimplementedEpicId, + kind: "behavior", + altitude: "epic", + parent: null, + title: "Unimplemented delivery backlog", + outcome: + "Hold non-implemented architect deliverables and remaining-work items until they are authored to a higher readiness rung.", + }), +); + +let exampleCount = 0; +let unimplementedCount = 0; +/** @type {string[]} */ +const unimplementedIds = [unimplementedEpicId]; +/** @type {Map} */ +const examplesByParent = new Map(); + +function addExample(parentId, id) { + const list = examplesByParent.get(parentId) ?? []; + list.push(id); + examplesByParent.set(parentId, list); +} + +function migrateFeatureScenarios(filePath, parentId, destDir, kindLabel) { + const rel = relPosix(filePath); + const scenarios = parseScenarios(fs.readFileSync(filePath, "utf8")); + scenarios.forEach((scenario, index) => { + const slug = sanitizeSegment(scenario.title); + const seq = String(index + 1).padStart(3, "0"); + const id = uniqueId(`${parentId}.${slug}`); + const fileName = `${sanitizeSegment(`s-${seq}-${slug}`)}.sdp.md`; + const title = scenario.title.replace(/"/g, "'").replace(/<([^>]+)>/g, "$1"); + const outcome = `${kindLabel} "${title}" from ${rel}`; + writeSpec( + path.join(destDir, fileName), + specBody({ + id, + kind: "example", + altitude: "story", + parent: parentId, + title, + outcome, + }), + ); + addExample(parentId, id); + exampleCount++; + }); + return scenarios.length; +} + +// --- executable tests (packages / examples / apps) --- +for (const rootName of ["packages", "examples", "apps"]) { + for (const filePath of walk(path.join(ROOT, rootName), (p, name) => + name.endsWith(".feature"), + ).sort()) { + const rel = relPosix(filePath); + const parentId = carrierToId.get(rel); + if (!parentId) { + console.error(`missing parent Spec for ${rel}`); + continue; + } + const parentFile = idToFile.get(parentId); + const destDir = parentFile + ? path.join(path.dirname(parentFile), path.basename(parentFile, ".sdp.md") + ".examples") + : path.join(SPECS, "behavior", "unmapped.examples"); + migrateFeatureScenarios(filePath, parentId, destDir, "Executable scenario"); + } +} + +// --- architect scenarios (design / often unimplemented) --- +for (const filePath of walk(path.join(ROOT, "architect"), (p, name) => + name.endsWith(".feature"), +).sort()) { + const stem = path.basename(filePath, ".feature"); + const parentId = stemToId.get(toKebab(stem)) ?? stemToId.get(stem) ?? unimplementedEpicId; + const destDir = path.join(SPECS, "unimplemented", "architect-scenarios", sanitizeSegment(stem)); + migrateFeatureScenarios(filePath, parentId, destDir, "Architect scenario (not an SDP test carrier)"); +} + +// --- pending deliverable rows --- +for (const filePath of walk(path.join(ROOT, "architect"), (p, name) => + name.endsWith(".feature"), +).sort()) { + const stem = path.basename(filePath, ".feature"); + const parentId = stemToId.get(toKebab(stem)) ?? stemToId.get(stem) ?? unimplementedEpicId; + const rows = parsePendingDeliverables(fs.readFileSync(filePath, "utf8")); + rows.forEach((row, index) => { + const slug = sanitizeSegment(row.name); + const seq = String(index + 1).padStart(3, "0"); + const id = uniqueId(`spec:unimplemented.${sanitizeSegment(stem)}.${slug}`); + const title = row.name.replace(/"/g, "'").replace(/<([^>]+)>/g, "$1"); + writeSpec( + path.join( + SPECS, + "unimplemented", + "deliverables", + sanitizeSegment(stem), + `${sanitizeSegment(`d-${seq}-${slug}`)}.sdp.md`, + ), + specBody({ + id, + kind: "behavior", + altitude: "story", + parent: parentId, + title, + outcome: `Unimplemented deliverable "${title}" from ${relPosix(filePath)}${row.location ? ` at ${row.location}` : ""}.`, + }), + ); + unimplementedIds.push(id); + unimplementedCount++; + }); +} + +// --- docs-living remaining + current (non-implemented / in-flight) --- +for (const folder of ["remaining", "current"]) { + const dir = path.join(ROOT, "docs-living", folder); + if (!fs.existsSync(dir)) continue; + for (const name of fs.readdirSync(dir).filter((n) => n.endsWith(".md")).sort()) { + const filePath = path.join(dir, name); + const text = fs.readFileSync(filePath, "utf8"); + const heading = (text.match(/^#\s+(.+)$/m)?.[1] ?? name).trim(); + const slug = sanitizeSegment(name.replace(/\.md$/, "")); + const id = uniqueId(`spec:unimplemented.${folder}.${slug}`); + writeSpec( + path.join(SPECS, "unimplemented", folder, `${slug}.sdp.md`), + specBody({ + id, + kind: "behavior", + altitude: "feature", + parent: unimplementedEpicId, + title: heading.replace(/"/g, "'"), + outcome: `Non-implemented or in-flight work captured from docs-living/${folder}/${name}.`, + }), + ); + unimplementedIds.push(id); + unimplementedCount++; + } +} + +function writePack(outPath, packId, title, framing, ids) { + const unique = [...new Set(ids)].sort(); + const body = `--- +id: ${packId} +specs: +${unique.map((s) => ` - ${s}`).join("\n")} +--- +# ${title} + +${framing} +`; + writeSpec(outPath, body); +} + +writePack( + path.join(SPECS, "unimplemented.pack.sdp.md"), + "pack:unimplemented", + "Unimplemented", + "Non-implemented architect deliverables, remaining-work items, and in-flight docs-living rows.", + unimplementedIds, +); + +console.log( + JSON.stringify( + { + dryRun: DRY_RUN, + exampleSpecs: exampleCount, + unimplementedSpecs: unimplementedCount, + parentsWithExamples: examplesByParent.size, + knownCarriers: carrierToId.size, + }, + null, + 2, + ), +); diff --git a/specs/README.md b/specs/README.md index f4abf7bb..dadf1ffc 100644 --- a/specs/README.md +++ b/specs/README.md @@ -6,9 +6,13 @@ Designated **corpus root** for Libar Software Delivery Protocol (SDP) Specs and Carriers are Markdown: Specs as `*.sdp.md`, Packs as `*.pack.sdp.md`. Identity bindings live in `platform/sdp-bindings.ts`. This tree replaces the former `architect/` Gherkin intent surface for -SDP extraction and validation. Executable Cucumber `.feature` files remain test carriers; each -has a matching SDP Spec under `specs/behavior/`. The `architect/` tree may still exist as lineage; -bare `.feature` files are not SDP carriers. +SDP extraction and validation. + +- Feature files under `packages/`, `examples/`, and `apps/` remain Cucumber test carriers; each + Feature has a behavior Spec and each Scenario has an example Spec under `specs/behavior/**/**.examples/`. +- Non-implemented architect deliverables, architect design scenarios, and docs-living remaining/current + work live under `specs/unimplemented/`. +- The `architect/` tree may still exist as lineage; bare `.feature` files are not SDP carriers. ## Packs @@ -20,6 +24,7 @@ bare `.feature` files are not SDP carriers. | `pack:releases` | `releases.pack.sdp.md` | Release-boundary Specs | | `pack:behavior` | `behavior.pack.sdp.md` | Umbrella pack for all migrated executable Gherkin Specs | | `pack:behavior-*` | `behavior-.pack.sdp.md` | Per-package/example/app behavior families | +| `pack:unimplemented` | `unimplemented.pack.sdp.md` | Pending deliverables and remaining-work items | ## Commands diff --git a/specs/behavior/frontend/admin/add-stock.examples/s-001-add-stock-successfully.sdp.md b/specs/behavior/frontend/admin/add-stock.examples/s-001-add-stock-successfully.sdp.md new file mode 100644 index 00000000..78d67e93 --- /dev/null +++ b/specs/behavior/frontend/admin/add-stock.examples/s-001-add-stock-successfully.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.add-stock.add-stock-successfully +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.add-stock +--- +# Add stock successfully + +## Intent + +- outcome: Executable scenario "Add stock successfully" from apps/frontend/tests/e2e/features/admin/add-stock.feature diff --git a/specs/behavior/frontend/admin/add-stock.examples/s-002-add-stock-with-reason.sdp.md b/specs/behavior/frontend/admin/add-stock.examples/s-002-add-stock-with-reason.sdp.md new file mode 100644 index 00000000..3b717126 --- /dev/null +++ b/specs/behavior/frontend/admin/add-stock.examples/s-002-add-stock-with-reason.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.add-stock.add-stock-with-reason +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.add-stock +--- +# Add stock with reason + +## Intent + +- outcome: Executable scenario "Add stock with reason" from apps/frontend/tests/e2e/features/admin/add-stock.feature diff --git a/specs/behavior/frontend/admin/add-stock.examples/s-003-cannot-add-stock-without-selecting-product.sdp.md b/specs/behavior/frontend/admin/add-stock.examples/s-003-cannot-add-stock-without-selecting-product.sdp.md new file mode 100644 index 00000000..a4a25ced --- /dev/null +++ b/specs/behavior/frontend/admin/add-stock.examples/s-003-cannot-add-stock-without-selecting-product.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.add-stock.cannot-add-stock-without-selecting-product +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.add-stock +--- +# Cannot add stock without selecting product + +## Intent + +- outcome: Executable scenario "Cannot add stock without selecting product" from apps/frontend/tests/e2e/features/admin/add-stock.feature diff --git a/specs/behavior/frontend/admin/add-stock.examples/s-004-cannot-add-zero-quantity.sdp.md b/specs/behavior/frontend/admin/add-stock.examples/s-004-cannot-add-zero-quantity.sdp.md new file mode 100644 index 00000000..58953e3e --- /dev/null +++ b/specs/behavior/frontend/admin/add-stock.examples/s-004-cannot-add-zero-quantity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.add-stock.cannot-add-zero-quantity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.add-stock +--- +# Cannot add zero quantity + +## Intent + +- outcome: Executable scenario "Cannot add zero quantity" from apps/frontend/tests/e2e/features/admin/add-stock.feature diff --git a/specs/behavior/frontend/admin/add-stock.examples/s-005-cannot-add-stock-without-quantity.sdp.md b/specs/behavior/frontend/admin/add-stock.examples/s-005-cannot-add-stock-without-quantity.sdp.md new file mode 100644 index 00000000..ebbf835e --- /dev/null +++ b/specs/behavior/frontend/admin/add-stock.examples/s-005-cannot-add-stock-without-quantity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.add-stock.cannot-add-stock-without-quantity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.add-stock +--- +# Cannot add stock without quantity + +## Intent + +- outcome: Executable scenario "Cannot add stock without quantity" from apps/frontend/tests/e2e/features/admin/add-stock.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-001-view-agents-dashboard-with-pending-approvals.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-001-view-agents-dashboard-with-pending-approvals.sdp.md new file mode 100644 index 00000000..cec8f281 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-001-view-agents-dashboard-with-pending-approvals.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.view-agents-dashboard-with-pending-approvals +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# View agents dashboard with pending approvals + +## Intent + +- outcome: Executable scenario "View agents dashboard with pending approvals" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-002-view-agents-dashboard-with-no-pending-approvals.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-002-view-agents-dashboard-with-no-pending-approvals.sdp.md new file mode 100644 index 00000000..70758b35 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-002-view-agents-dashboard-with-no-pending-approvals.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.view-agents-dashboard-with-no-pending-approvals +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# View agents dashboard with no pending approvals + +## Intent + +- outcome: Executable scenario "View agents dashboard with no pending approvals" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-003-navigate-to-approval-detail-from-dashboard.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-003-navigate-to-approval-detail-from-dashboard.sdp.md new file mode 100644 index 00000000..2b951b34 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-003-navigate-to-approval-detail-from-dashboard.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.navigate-to-approval-detail-from-dashboard +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Navigate to approval detail from dashboard + +## Intent + +- outcome: Executable scenario "Navigate to approval detail from dashboard" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-004-view-approval-list-with-pending-approvals.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-004-view-approval-list-with-pending-approvals.sdp.md new file mode 100644 index 00000000..24a93b1f --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-004-view-approval-list-with-pending-approvals.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.view-approval-list-with-pending-approvals +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# View approval list with pending approvals + +## Intent + +- outcome: Executable scenario "View approval list with pending approvals" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-005-filter-approvals-by-status.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-005-filter-approvals-by-status.sdp.md new file mode 100644 index 00000000..2b281cc6 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-005-filter-approvals-by-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.filter-approvals-by-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Filter approvals by status + +## Intent + +- outcome: Executable scenario "Filter approvals by status" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-006-click-approval-card-to-navigate-to-detail.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-006-click-approval-card-to-navigate-to-detail.sdp.md new file mode 100644 index 00000000..a2c2d6ab --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-006-click-approval-card-to-navigate-to-detail.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.click-approval-card-to-navigate-to-detail +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Click approval card to navigate to detail + +## Intent + +- outcome: Executable scenario "Click approval card to navigate to detail" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-007-view-pending-approval-detail.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-007-view-pending-approval-detail.sdp.md new file mode 100644 index 00000000..a8a9ee85 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-007-view-pending-approval-detail.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.view-pending-approval-detail +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# View pending approval detail + +## Intent + +- outcome: Executable scenario "View pending approval detail" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-008-view-already-approved-approval.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-008-view-already-approved-approval.sdp.md new file mode 100644 index 00000000..69a89b01 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-008-view-already-approved-approval.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.view-already-approved-approval +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# View already approved approval + +## Intent + +- outcome: Executable scenario "View already approved approval" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-009-view-already-rejected-approval.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-009-view-already-rejected-approval.sdp.md new file mode 100644 index 00000000..4424cf99 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-009-view-already-rejected-approval.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.view-already-rejected-approval +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# View already rejected approval + +## Intent + +- outcome: Executable scenario "View already rejected approval" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-010-view-expired-approval.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-010-view-expired-approval.sdp.md new file mode 100644 index 00000000..3421c4c6 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-010-view-expired-approval.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.view-expired-approval +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# View expired approval + +## Intent + +- outcome: Executable scenario "View expired approval" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-011-confidence-conveyed-via-text-label-wcag-1-4-1.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-011-confidence-conveyed-via-text-label-wcag-1-4-1.sdp.md new file mode 100644 index 00000000..f9fbfd7c --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-011-confidence-conveyed-via-text-label-wcag-1-4-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.confidence-conveyed-via-text-label-wcag-1-4-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Confidence conveyed via text label (WCAG 1.4.1) + +## Intent + +- outcome: Executable scenario "Confidence conveyed via text label (WCAG 1.4.1)" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-012-approve-pending-action-with-note.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-012-approve-pending-action-with-note.sdp.md new file mode 100644 index 00000000..8fd7803a --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-012-approve-pending-action-with-note.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.approve-pending-action-with-note +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Approve pending action with note + +## Intent + +- outcome: Executable scenario "Approve pending action with note" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-013-reject-pending-action-with-note.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-013-reject-pending-action-with-note.sdp.md new file mode 100644 index 00000000..c4b9e704 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-013-reject-pending-action-with-note.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.reject-pending-action-with-note +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Reject pending action with note + +## Intent + +- outcome: Executable scenario "Reject pending action with note" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-014-approve-without-note.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-014-approve-without-note.sdp.md new file mode 100644 index 00000000..9c1d1696 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-014-approve-without-note.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.approve-without-note +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Approve without note + +## Intent + +- outcome: Executable scenario "Approve without note" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-015-error-during-approve-action.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-015-error-during-approve-action.sdp.md new file mode 100644 index 00000000..3b77eaff --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-015-error-during-approve-action.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.error-during-approve-action +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Error during approve action + +## Intent + +- outcome: Executable scenario "Error during approve action" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-016-cannot-act-on-expired-approvals.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-016-cannot-act-on-expired-approvals.sdp.md new file mode 100644 index 00000000..c790916a --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-016-cannot-act-on-expired-approvals.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.cannot-act-on-expired-approvals +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Cannot act on expired approvals + +## Intent + +- outcome: Executable scenario "Cannot act on expired approvals" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-017-view-active-agents-in-monitoring-tab.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-017-view-active-agents-in-monitoring-tab.sdp.md new file mode 100644 index 00000000..de8191bf --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-017-view-active-agents-in-monitoring-tab.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.view-active-agents-in-monitoring-tab +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# View active agents in monitoring tab + +## Intent + +- outcome: Executable scenario "View active agents in monitoring tab" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-018-view-agent-checkpoint-details.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-018-view-agent-checkpoint-details.sdp.md new file mode 100644 index 00000000..a9cf3f04 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-018-view-agent-checkpoint-details.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.view-agent-checkpoint-details +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# View agent checkpoint details + +## Intent + +- outcome: Executable scenario "View agent checkpoint details" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-019-no-active-agents.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-019-no-active-agents.sdp.md new file mode 100644 index 00000000..20b32215 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-019-no-active-agents.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.no-active-agents +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# No active agents + +## Intent + +- outcome: Executable scenario "No active agents" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-020-view-agent-decision-history.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-020-view-agent-decision-history.sdp.md new file mode 100644 index 00000000..1eb4c53f --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-020-view-agent-decision-history.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.view-agent-decision-history +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# View agent decision history + +## Intent + +- outcome: Executable scenario "View agent decision history" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-021-view-decision-detail-with-reasoning.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-021-view-decision-detail-with-reasoning.sdp.md new file mode 100644 index 00000000..4d20d5f1 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-021-view-decision-detail-with-reasoning.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.view-decision-detail-with-reasoning +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# View decision detail with reasoning + +## Intent + +- outcome: Executable scenario "View decision detail with reasoning" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-022-empty-decision-history.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-022-empty-decision-history.sdp.md new file mode 100644 index 00000000..804b97a8 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-022-empty-decision-history.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.empty-decision-history +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Empty decision history + +## Intent + +- outcome: Executable scenario "Empty decision history" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-023-view-customers-approaching-churn-threshold.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-023-view-customers-approaching-churn-threshold.sdp.md new file mode 100644 index 00000000..ddadf6c6 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-023-view-customers-approaching-churn-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.view-customers-approaching-churn-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# View customers approaching churn threshold + +## Intent + +- outcome: Executable scenario "View customers approaching churn threshold" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-024-customer-risk-progress-indicator.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-024-customer-risk-progress-indicator.sdp.md new file mode 100644 index 00000000..590dc431 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-024-customer-risk-progress-indicator.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.customer-risk-progress-indicator +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Customer risk progress indicator + +## Intent + +- outcome: Executable scenario "Customer risk progress indicator" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-025-no-customers-approaching-threshold.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-025-no-customers-approaching-threshold.sdp.md new file mode 100644 index 00000000..f97b21a3 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-025-no-customers-approaching-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.no-customers-approaching-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# No customers approaching threshold + +## Intent + +- outcome: Executable scenario "No customers approaching threshold" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-026-navigate-to-low-stock-restock-approval-detail.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-026-navigate-to-low-stock-restock-approval-detail.sdp.md new file mode 100644 index 00000000..56d04447 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-026-navigate-to-low-stock-restock-approval-detail.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.navigate-to-low-stock-restock-approval-detail +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Navigate to low stock restock approval detail + +## Intent + +- outcome: Executable scenario "Navigate to low stock restock approval detail" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-027-view-low-stock-alert-approval-with-product-context.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-027-view-low-stock-alert-approval-with-product-context.sdp.md new file mode 100644 index 00000000..990b5be9 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-027-view-low-stock-alert-approval-with-product-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.view-low-stock-alert-approval-with-product-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# View low stock alert approval with product context + +## Intent + +- outcome: Executable scenario "View low stock alert approval with product context" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-028-approve-low-stock-restock-suggestion.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-028-approve-low-stock-restock-suggestion.sdp.md new file mode 100644 index 00000000..9aafcad2 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-028-approve-low-stock-restock-suggestion.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.approve-low-stock-restock-suggestion +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Approve low stock restock suggestion + +## Intent + +- outcome: Executable scenario "Approve low stock restock suggestion" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-029-reject-low-stock-restock-suggestion.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-029-reject-low-stock-restock-suggestion.sdp.md new file mode 100644 index 00000000..37146105 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-029-reject-low-stock-restock-suggestion.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.reject-low-stock-restock-suggestion +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Reject low stock restock suggestion + +## Intent + +- outcome: Executable scenario "Reject low stock restock suggestion" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-030-navigate-to-high-value-order-vip-review-approval-detail.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-030-navigate-to-high-value-order-vip-review-approval-detail.sdp.md new file mode 100644 index 00000000..243dcaee --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-030-navigate-to-high-value-order-vip-review-approval-detail.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.navigate-to-high-value-order-vip-review-approval-detail +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Navigate to high-value order VIP review approval detail + +## Intent + +- outcome: Executable scenario "Navigate to high-value order VIP review approval detail" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-031-view-high-value-order-approval-with-order-context.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-031-view-high-value-order-approval-with-order-context.sdp.md new file mode 100644 index 00000000..a89a5494 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-031-view-high-value-order-approval-with-order-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.view-high-value-order-approval-with-order-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# View high-value order approval with order context + +## Intent + +- outcome: Executable scenario "View high-value order approval with order context" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-032-approve-vip-review-for-high-value-order.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-032-approve-vip-review-for-high-value-order.sdp.md new file mode 100644 index 00000000..85db0a33 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-032-approve-vip-review-for-high-value-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.approve-vip-review-for-high-value-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Approve VIP review for high-value order + +## Intent + +- outcome: Executable scenario "Approve VIP review for high-value order" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-033-reject-vip-review-flag.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-033-reject-vip-review-flag.sdp.md new file mode 100644 index 00000000..3b117c73 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-033-reject-vip-review-flag.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.reject-vip-review-flag +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Reject VIP review flag + +## Intent + +- outcome: Executable scenario "Reject VIP review flag" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-034-navigate-to-order-consolidation-suggestion-approval-detail.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-034-navigate-to-order-consolidation-suggestion-approval-detail.sdp.md new file mode 100644 index 00000000..8217d822 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-034-navigate-to-order-consolidation-suggestion-approval-detail.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.navigate-to-order-consolidation-suggestion-approval-detail +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Navigate to order consolidation suggestion approval detail + +## Intent + +- outcome: Executable scenario "Navigate to order consolidation suggestion approval detail" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-035-view-order-consolidation-approval-with-order-list.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-035-view-order-consolidation-approval-with-order-list.sdp.md new file mode 100644 index 00000000..cd945caf --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-035-view-order-consolidation-approval-with-order-list.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.view-order-consolidation-approval-with-order-list +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# View order consolidation approval with order list + +## Intent + +- outcome: Executable scenario "View order consolidation approval with order list" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-036-approve-order-consolidation-suggestion.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-036-approve-order-consolidation-suggestion.sdp.md new file mode 100644 index 00000000..d8e931c9 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-036-approve-order-consolidation-suggestion.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.approve-order-consolidation-suggestion +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Approve order consolidation suggestion + +## Intent + +- outcome: Executable scenario "Approve order consolidation suggestion" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-037-reject-order-consolidation-suggestion.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-037-reject-order-consolidation-suggestion.sdp.md new file mode 100644 index 00000000..f6e3bbd3 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-037-reject-order-consolidation-suggestion.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.reject-order-consolidation-suggestion +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Reject order consolidation suggestion + +## Intent + +- outcome: Executable scenario "Reject order consolidation suggestion" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-038-view-decision-history-filtered-by-agent-type.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-038-view-decision-history-filtered-by-agent-type.sdp.md new file mode 100644 index 00000000..e3c590e0 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-038-view-decision-history-filtered-by-agent-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.view-decision-history-filtered-by-agent-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# View decision history filtered by agent type + +## Intent + +- outcome: Executable scenario "View decision history filtered by agent type" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-039-view-low-stock-agent-decision-in-history.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-039-view-low-stock-agent-decision-in-history.sdp.md new file mode 100644 index 00000000..f9a80778 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-039-view-low-stock-agent-decision-in-history.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.view-low-stock-agent-decision-in-history +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# View low stock agent decision in history + +## Intent + +- outcome: Executable scenario "View low stock agent decision in history" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-040-view-high-value-order-agent-decision-in-history.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-040-view-high-value-order-agent-decision-in-history.sdp.md new file mode 100644 index 00000000..2e5c0899 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-040-view-high-value-order-agent-decision-in-history.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.view-high-value-order-agent-decision-in-history +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# View high-value order agent decision in history + +## Intent + +- outcome: Executable scenario "View high-value order agent decision in history" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-041-view-order-consolidation-agent-decision-in-history.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-041-view-order-consolidation-agent-decision-in-history.sdp.md new file mode 100644 index 00000000..19d94e20 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-041-view-order-consolidation-agent-decision-in-history.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.view-order-consolidation-agent-decision-in-history +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# View order consolidation agent decision in history + +## Intent + +- outcome: Executable scenario "View order consolidation agent decision in history" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-042-view-products-approaching-low-stock-threshold.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-042-view-products-approaching-low-stock-threshold.sdp.md new file mode 100644 index 00000000..9310a207 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-042-view-products-approaching-low-stock-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.view-products-approaching-low-stock-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# View products approaching low stock threshold + +## Intent + +- outcome: Executable scenario "View products approaching low stock threshold" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-043-stock-level-progress-indicator.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-043-stock-level-progress-indicator.sdp.md new file mode 100644 index 00000000..357941b6 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-043-stock-level-progress-indicator.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.stock-level-progress-indicator +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Stock level progress indicator + +## Intent + +- outcome: Executable scenario "Stock level progress indicator" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-044-approval-card-is-keyboard-accessible.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-044-approval-card-is-keyboard-accessible.sdp.md new file mode 100644 index 00000000..b5bbdd3a --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-044-approval-card-is-keyboard-accessible.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.approval-card-is-keyboard-accessible +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Approval card is keyboard accessible + +## Intent + +- outcome: Executable scenario "Approval card is keyboard accessible" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-045-screen-reader-announces-action-status-changes.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-045-screen-reader-announces-action-status-changes.sdp.md new file mode 100644 index 00000000..dddc996a --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-045-screen-reader-announces-action-status-changes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.screen-reader-announces-action-status-changes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Screen reader announces action status changes + +## Intent + +- outcome: Executable scenario "Screen reader announces action status changes" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-046-confidence-level-conveyed-via-text-not-just-color.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-046-confidence-level-conveyed-via-text-not-just-color.sdp.md new file mode 100644 index 00000000..05c98270 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-046-confidence-level-conveyed-via-text-not-just-color.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.confidence-level-conveyed-via-text-not-just-color +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Confidence level conveyed via text not just color + +## Intent + +- outcome: Executable scenario "Confidence level conveyed via text not just color" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-047-focus-trap-in-action-buttons.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-047-focus-trap-in-action-buttons.sdp.md new file mode 100644 index 00000000..3e750d81 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-047-focus-trap-in-action-buttons.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.focus-trap-in-action-buttons +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Focus trap in action buttons + +## Intent + +- outcome: Executable scenario "Focus trap in action buttons" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-048-handle-approval-not-found.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-048-handle-approval-not-found.sdp.md new file mode 100644 index 00000000..5271cf81 --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-048-handle-approval-not-found.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.handle-approval-not-found +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Handle approval not found + +## Intent + +- outcome: Executable scenario "Handle approval not found" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-049-handle-network-error-loading-approvals.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-049-handle-network-error-loading-approvals.sdp.md new file mode 100644 index 00000000..0594b8fb --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-049-handle-network-error-loading-approvals.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.handle-network-error-loading-approvals +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Handle network error loading approvals + +## Intent + +- outcome: Executable scenario "Handle network error loading approvals" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-050-route-level-error-boundary.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-050-route-level-error-boundary.sdp.md new file mode 100644 index 00000000..52cc707e --- /dev/null +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-050-route-level-error-boundary.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.agent-approvals.route-level-error-boundary +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.agent-approvals +--- +# Route-level error boundary + +## Intent + +- outcome: Executable scenario "Route-level error boundary" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature diff --git a/specs/behavior/frontend/admin/create-product.examples/s-001-create-product-successfully.sdp.md b/specs/behavior/frontend/admin/create-product.examples/s-001-create-product-successfully.sdp.md new file mode 100644 index 00000000..4d2e93a8 --- /dev/null +++ b/specs/behavior/frontend/admin/create-product.examples/s-001-create-product-successfully.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.create-product.create-product-successfully +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.create-product +--- +# Create product successfully + +## Intent + +- outcome: Executable scenario "Create product successfully" from apps/frontend/tests/e2e/features/admin/create-product.feature diff --git a/specs/behavior/frontend/admin/create-product.examples/s-002-validation-errors-on-empty-form.sdp.md b/specs/behavior/frontend/admin/create-product.examples/s-002-validation-errors-on-empty-form.sdp.md new file mode 100644 index 00000000..7db1d9cf --- /dev/null +++ b/specs/behavior/frontend/admin/create-product.examples/s-002-validation-errors-on-empty-form.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.create-product.validation-errors-on-empty-form +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.create-product +--- +# Validation errors on empty form + +## Intent + +- outcome: Executable scenario "Validation errors on empty form" from apps/frontend/tests/e2e/features/admin/create-product.feature diff --git a/specs/behavior/frontend/admin/create-product.examples/s-003-invalid-sku-format.sdp.md b/specs/behavior/frontend/admin/create-product.examples/s-003-invalid-sku-format.sdp.md new file mode 100644 index 00000000..bf06bec3 --- /dev/null +++ b/specs/behavior/frontend/admin/create-product.examples/s-003-invalid-sku-format.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.create-product.invalid-sku-format +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.create-product +--- +# Invalid SKU format + +## Intent + +- outcome: Executable scenario "Invalid SKU format" from apps/frontend/tests/e2e/features/admin/create-product.feature diff --git a/specs/behavior/frontend/admin/create-product.examples/s-004-invalid-price-zero-value.sdp.md b/specs/behavior/frontend/admin/create-product.examples/s-004-invalid-price-zero-value.sdp.md new file mode 100644 index 00000000..983e8482 --- /dev/null +++ b/specs/behavior/frontend/admin/create-product.examples/s-004-invalid-price-zero-value.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.create-product.invalid-price-zero-value +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.create-product +--- +# Invalid price - zero value + +## Intent + +- outcome: Executable scenario "Invalid price - zero value" from apps/frontend/tests/e2e/features/admin/create-product.feature diff --git a/specs/behavior/frontend/admin/create-product.examples/s-005-invalid-price-exceeds-maximum.sdp.md b/specs/behavior/frontend/admin/create-product.examples/s-005-invalid-price-exceeds-maximum.sdp.md new file mode 100644 index 00000000..dd3f9e6e --- /dev/null +++ b/specs/behavior/frontend/admin/create-product.examples/s-005-invalid-price-exceeds-maximum.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.admin.create-product.invalid-price-exceeds-maximum +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.admin.create-product +--- +# Invalid price - exceeds maximum + +## Intent + +- outcome: Executable scenario "Invalid price - exceeds maximum" from apps/frontend/tests/e2e/features/admin/create-product.feature diff --git a/specs/behavior/frontend/dashboard/dashboard.examples/s-001-view-dashboard-stats.sdp.md b/specs/behavior/frontend/dashboard/dashboard.examples/s-001-view-dashboard-stats.sdp.md new file mode 100644 index 00000000..49a1b07e --- /dev/null +++ b/specs/behavior/frontend/dashboard/dashboard.examples/s-001-view-dashboard-stats.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.dashboard.dashboard.view-dashboard-stats +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.dashboard.dashboard +--- +# View dashboard stats + +## Intent + +- outcome: Executable scenario "View dashboard stats" from apps/frontend/tests/e2e/features/dashboard/dashboard.feature diff --git a/specs/behavior/frontend/dashboard/dashboard.examples/s-002-show-low-stock-warning.sdp.md b/specs/behavior/frontend/dashboard/dashboard.examples/s-002-show-low-stock-warning.sdp.md new file mode 100644 index 00000000..e314f77a --- /dev/null +++ b/specs/behavior/frontend/dashboard/dashboard.examples/s-002-show-low-stock-warning.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.dashboard.dashboard.show-low-stock-warning +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.dashboard.dashboard +--- +# Show low stock warning + +## Intent + +- outcome: Executable scenario "Show low stock warning" from apps/frontend/tests/e2e/features/dashboard/dashboard.feature diff --git a/specs/behavior/frontend/dashboard/dashboard.examples/s-003-quick-action-navigates-to-create-order.sdp.md b/specs/behavior/frontend/dashboard/dashboard.examples/s-003-quick-action-navigates-to-create-order.sdp.md new file mode 100644 index 00000000..6fc03fe8 --- /dev/null +++ b/specs/behavior/frontend/dashboard/dashboard.examples/s-003-quick-action-navigates-to-create-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.dashboard.dashboard.quick-action-navigates-to-create-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.dashboard.dashboard +--- +# Quick action navigates to create order + +## Intent + +- outcome: Executable scenario "Quick action navigates to create order" from apps/frontend/tests/e2e/features/dashboard/dashboard.feature diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-001-complete-flow-product-creation-to-order-confirmation.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-001-complete-flow-product-creation-to-order-confirmation.sdp.md new file mode 100644 index 00000000..f3148ef5 --- /dev/null +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-001-complete-flow-product-creation-to-order-confirmation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.e2e-journeys.full-order-journey.complete-flow-product-creation-to-order-confirmation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.e2e-journeys.full-order-journey +--- +# Complete flow - Product creation to order confirmation + +## Intent + +- outcome: Executable scenario "Complete flow - Product creation to order confirmation" from apps/frontend/tests/e2e/features/e2e-journeys/full-order-journey.feature diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-002-order-fails-due-to-insufficient-stock-saga-compensation.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-002-order-fails-due-to-insufficient-stock-saga-compensation.sdp.md new file mode 100644 index 00000000..7116c741 --- /dev/null +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-002-order-fails-due-to-insufficient-stock-saga-compensation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.e2e-journeys.full-order-journey.order-fails-due-to-insufficient-stock-saga-compensation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.e2e-journeys.full-order-journey +--- +# Order fails due to insufficient stock - Saga compensation + +## Intent + +- outcome: Executable scenario "Order fails due to insufficient stock - Saga compensation" from apps/frontend/tests/e2e/features/e2e-journeys/full-order-journey.feature diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-003-order-with-multiple-items.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-003-order-with-multiple-items.sdp.md new file mode 100644 index 00000000..d0f310e3 --- /dev/null +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-003-order-with-multiple-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.e2e-journeys.full-order-journey.order-with-multiple-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.e2e-journeys.full-order-journey +--- +# Order with multiple items + +## Intent + +- outcome: Executable scenario "Order with multiple items" from apps/frontend/tests/e2e/features/e2e-journeys/full-order-journey.feature diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-004-multi-product-order-rejected-atomically-when-one-product-lacks-stock-dcb.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-004-multi-product-order-rejected-atomically-when-one-product-lacks-stock-dcb.sdp.md new file mode 100644 index 00000000..4693aec7 --- /dev/null +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-004-multi-product-order-rejected-atomically-when-one-product-lacks-stock-dcb.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.e2e-journeys.full-order-journey.multi-product-order-rejected-atomically-when-one-product-lacks-stock-dcb +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.e2e-journeys.full-order-journey +--- +# Multi-product order rejected atomically when one product lacks stock (DCB) + +## Intent + +- outcome: Executable scenario "Multi-product order rejected atomically when one product lacks stock (DCB)" from apps/frontend/tests/e2e/features/e2e-journeys/full-order-journey.feature diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-005-full-agent-trigger-journey-churn-risk-detection.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-005-full-agent-trigger-journey-churn-risk-detection.sdp.md new file mode 100644 index 00000000..76788942 --- /dev/null +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-005-full-agent-trigger-journey-churn-risk-detection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.e2e-journeys.full-order-journey.full-agent-trigger-journey-churn-risk-detection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.e2e-journeys.full-order-journey +--- +# Full agent trigger journey - Churn risk detection + +## Intent + +- outcome: Executable scenario "Full agent trigger journey - Churn risk detection" from apps/frontend/tests/e2e/features/e2e-journeys/full-order-journey.feature diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-006-full-agent-trigger-journey-low-stock-alert-detection.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-006-full-agent-trigger-journey-low-stock-alert-detection.sdp.md new file mode 100644 index 00000000..caa1f729 --- /dev/null +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-006-full-agent-trigger-journey-low-stock-alert-detection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.e2e-journeys.full-order-journey.full-agent-trigger-journey-low-stock-alert-detection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.e2e-journeys.full-order-journey +--- +# Full agent trigger journey - Low stock alert detection + +## Intent + +- outcome: Executable scenario "Full agent trigger journey - Low stock alert detection" from apps/frontend/tests/e2e/features/e2e-journeys/full-order-journey.feature diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-007-full-agent-trigger-journey-high-value-order-detection.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-007-full-agent-trigger-journey-high-value-order-detection.sdp.md new file mode 100644 index 00000000..6a104277 --- /dev/null +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-007-full-agent-trigger-journey-high-value-order-detection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.e2e-journeys.full-order-journey.full-agent-trigger-journey-high-value-order-detection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.e2e-journeys.full-order-journey +--- +# Full agent trigger journey - High-value order detection + +## Intent + +- outcome: Executable scenario "Full agent trigger journey - High-value order detection" from apps/frontend/tests/e2e/features/e2e-journeys/full-order-journey.feature diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-008-full-agent-trigger-journey-order-consolidation-suggestion.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-008-full-agent-trigger-journey-order-consolidation-suggestion.sdp.md new file mode 100644 index 00000000..52fa1858 --- /dev/null +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-008-full-agent-trigger-journey-order-consolidation-suggestion.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.e2e-journeys.full-order-journey.full-agent-trigger-journey-order-consolidation-suggestion +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.e2e-journeys.full-order-journey +--- +# Full agent trigger journey - Order consolidation suggestion + +## Intent + +- outcome: Executable scenario "Full agent trigger journey - Order consolidation suggestion" from apps/frontend/tests/e2e/features/e2e-journeys/full-order-journey.feature diff --git a/specs/behavior/frontend/orders/create-order.examples/s-001-create-and-submit-order-successfully.sdp.md b/specs/behavior/frontend/orders/create-order.examples/s-001-create-and-submit-order-successfully.sdp.md new file mode 100644 index 00000000..d45254a4 --- /dev/null +++ b/specs/behavior/frontend/orders/create-order.examples/s-001-create-and-submit-order-successfully.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.orders.create-order.create-and-submit-order-successfully +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.orders.create-order +--- +# Create and submit order successfully + +## Intent + +- outcome: Executable scenario "Create and submit order successfully" from apps/frontend/tests/e2e/features/orders/create-order.feature diff --git a/specs/behavior/frontend/orders/create-order.examples/s-002-cannot-submit-empty-cart.sdp.md b/specs/behavior/frontend/orders/create-order.examples/s-002-cannot-submit-empty-cart.sdp.md new file mode 100644 index 00000000..b6e637c0 --- /dev/null +++ b/specs/behavior/frontend/orders/create-order.examples/s-002-cannot-submit-empty-cart.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.orders.create-order.cannot-submit-empty-cart +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.orders.create-order +--- +# Cannot submit empty cart + +## Intent + +- outcome: Executable scenario "Cannot submit empty cart" from apps/frontend/tests/e2e/features/orders/create-order.feature diff --git a/specs/behavior/frontend/orders/create-order.examples/s-003-update-quantity-in-cart.sdp.md b/specs/behavior/frontend/orders/create-order.examples/s-003-update-quantity-in-cart.sdp.md new file mode 100644 index 00000000..ede77238 --- /dev/null +++ b/specs/behavior/frontend/orders/create-order.examples/s-003-update-quantity-in-cart.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.orders.create-order.update-quantity-in-cart +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.orders.create-order +--- +# Update quantity in cart + +## Intent + +- outcome: Executable scenario "Update quantity in cart" from apps/frontend/tests/e2e/features/orders/create-order.feature diff --git a/specs/behavior/frontend/orders/create-order.examples/s-004-remove-item-from-cart.sdp.md b/specs/behavior/frontend/orders/create-order.examples/s-004-remove-item-from-cart.sdp.md new file mode 100644 index 00000000..cd2dd28b --- /dev/null +++ b/specs/behavior/frontend/orders/create-order.examples/s-004-remove-item-from-cart.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.orders.create-order.remove-item-from-cart +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.orders.create-order +--- +# Remove item from cart + +## Intent + +- outcome: Executable scenario "Remove item from cart" from apps/frontend/tests/e2e/features/orders/create-order.feature diff --git a/specs/behavior/frontend/orders/order-detail.examples/s-001-view-confirmed-order.sdp.md b/specs/behavior/frontend/orders/order-detail.examples/s-001-view-confirmed-order.sdp.md new file mode 100644 index 00000000..438c5347 --- /dev/null +++ b/specs/behavior/frontend/orders/order-detail.examples/s-001-view-confirmed-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.orders.order-detail.view-confirmed-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.orders.order-detail +--- +# View confirmed order + +## Intent + +- outcome: Executable scenario "View confirmed order" from apps/frontend/tests/e2e/features/orders/order-detail.feature diff --git a/specs/behavior/frontend/orders/order-detail.examples/s-002-view-cancelled-order.sdp.md b/specs/behavior/frontend/orders/order-detail.examples/s-002-view-cancelled-order.sdp.md new file mode 100644 index 00000000..5a414afa --- /dev/null +++ b/specs/behavior/frontend/orders/order-detail.examples/s-002-view-cancelled-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.orders.order-detail.view-cancelled-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.orders.order-detail +--- +# View cancelled order + +## Intent + +- outcome: Executable scenario "View cancelled order" from apps/frontend/tests/e2e/features/orders/order-detail.feature diff --git a/specs/behavior/frontend/orders/order-detail.examples/s-003-order-detail-shows-instant-status-updates-via-reactive-projection.sdp.md b/specs/behavior/frontend/orders/order-detail.examples/s-003-order-detail-shows-instant-status-updates-via-reactive-projection.sdp.md new file mode 100644 index 00000000..3a62b078 --- /dev/null +++ b/specs/behavior/frontend/orders/order-detail.examples/s-003-order-detail-shows-instant-status-updates-via-reactive-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.orders.order-detail.order-detail-shows-instant-status-updates-via-reactive-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.orders.order-detail +--- +# Order detail shows instant status updates via reactive projection + +## Intent + +- outcome: Executable scenario "Order detail shows instant status updates via reactive projection" from apps/frontend/tests/e2e/features/orders/order-detail.feature diff --git a/specs/behavior/frontend/orders/order-detail.examples/s-004-cancel-a-submitted-order.sdp.md b/specs/behavior/frontend/orders/order-detail.examples/s-004-cancel-a-submitted-order.sdp.md new file mode 100644 index 00000000..950997d8 --- /dev/null +++ b/specs/behavior/frontend/orders/order-detail.examples/s-004-cancel-a-submitted-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.orders.order-detail.cancel-a-submitted-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.orders.order-detail +--- +# Cancel a submitted order + +## Intent + +- outcome: Executable scenario "Cancel a submitted order" from apps/frontend/tests/e2e/features/orders/order-detail.feature diff --git a/specs/behavior/frontend/orders/order-detail.examples/s-005-cancel-button-appears-only-for-cancellable-statuses.sdp.md b/specs/behavior/frontend/orders/order-detail.examples/s-005-cancel-button-appears-only-for-cancellable-statuses.sdp.md new file mode 100644 index 00000000..0e6aaa16 --- /dev/null +++ b/specs/behavior/frontend/orders/order-detail.examples/s-005-cancel-button-appears-only-for-cancellable-statuses.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.orders.order-detail.cancel-button-appears-only-for-cancellable-statuses +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.orders.order-detail +--- +# Cancel button appears only for cancellable statuses + +## Intent + +- outcome: Executable scenario "Cancel button appears only for cancellable statuses" from apps/frontend/tests/e2e/features/orders/order-detail.feature diff --git a/specs/behavior/frontend/orders/order-detail.examples/s-006-cancel-confirmation-dialog-prevents-accidental-cancellation.sdp.md b/specs/behavior/frontend/orders/order-detail.examples/s-006-cancel-confirmation-dialog-prevents-accidental-cancellation.sdp.md new file mode 100644 index 00000000..c800179d --- /dev/null +++ b/specs/behavior/frontend/orders/order-detail.examples/s-006-cancel-confirmation-dialog-prevents-accidental-cancellation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.orders.order-detail.cancel-confirmation-dialog-prevents-accidental-cancellation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.orders.order-detail +--- +# Cancel confirmation dialog prevents accidental cancellation + +## Intent + +- outcome: Executable scenario "Cancel confirmation dialog prevents accidental cancellation" from apps/frontend/tests/e2e/features/orders/order-detail.feature diff --git a/specs/behavior/frontend/orders/view-orders.examples/s-001-view-all-orders.sdp.md b/specs/behavior/frontend/orders/view-orders.examples/s-001-view-all-orders.sdp.md new file mode 100644 index 00000000..bbc7c819 --- /dev/null +++ b/specs/behavior/frontend/orders/view-orders.examples/s-001-view-all-orders.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.orders.view-orders.view-all-orders +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.orders.view-orders +--- +# View all orders + +## Intent + +- outcome: Executable scenario "View all orders" from apps/frontend/tests/e2e/features/orders/view-orders.feature diff --git a/specs/behavior/frontend/orders/view-orders.examples/s-002-navigate-to-create-order.sdp.md b/specs/behavior/frontend/orders/view-orders.examples/s-002-navigate-to-create-order.sdp.md new file mode 100644 index 00000000..4dbd3d57 --- /dev/null +++ b/specs/behavior/frontend/orders/view-orders.examples/s-002-navigate-to-create-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.orders.view-orders.navigate-to-create-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.orders.view-orders +--- +# Navigate to create order + +## Intent + +- outcome: Executable scenario "Navigate to create order" from apps/frontend/tests/e2e/features/orders/view-orders.feature diff --git a/specs/behavior/frontend/products/browse-products.examples/s-001-view-products-with-stock-levels.sdp.md b/specs/behavior/frontend/products/browse-products.examples/s-001-view-products-with-stock-levels.sdp.md new file mode 100644 index 00000000..9373a98e --- /dev/null +++ b/specs/behavior/frontend/products/browse-products.examples/s-001-view-products-with-stock-levels.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.products.browse-products.view-products-with-stock-levels +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.products.browse-products +--- +# View products with stock levels + +## Intent + +- outcome: Executable scenario "View products with stock levels" from apps/frontend/tests/e2e/features/products/browse-products.feature diff --git a/specs/behavior/frontend/products/browse-products.examples/s-002-loading-state.sdp.md b/specs/behavior/frontend/products/browse-products.examples/s-002-loading-state.sdp.md new file mode 100644 index 00000000..42be6127 --- /dev/null +++ b/specs/behavior/frontend/products/browse-products.examples/s-002-loading-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.frontend.products.browse-products.loading-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.frontend.products.browse-products +--- +# Loading state + +## Intent + +- outcome: Executable scenario "Loading state" from apps/frontend/tests/e2e/features/products/browse-products.feature diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-001-no-dead-letter-on-success.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-001-no-dead-letter-on-success.sdp.md new file mode 100644 index 00000000..6d84fb6d --- /dev/null +++ b/specs/behavior/order-management/agent/on-complete.examples/s-001-no-dead-letter-on-success.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.agent.on-complete.no-dead-letter-on-success +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.agent.on-complete +--- +# No dead letter on success + +## Intent + +- outcome: Executable scenario "No dead letter on success" from examples/order-management/tests/features/behavior/agent/on-complete.feature diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-002-no-dead-letter-on-canceled.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-002-no-dead-letter-on-canceled.sdp.md new file mode 100644 index 00000000..9eed0095 --- /dev/null +++ b/specs/behavior/order-management/agent/on-complete.examples/s-002-no-dead-letter-on-canceled.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.agent.on-complete.no-dead-letter-on-canceled +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.agent.on-complete +--- +# No dead letter on canceled + +## Intent + +- outcome: Executable scenario "No dead letter on canceled" from examples/order-management/tests/features/behavior/agent/on-complete.feature diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-003-creates-dead-letter-on-failure.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-003-creates-dead-letter-on-failure.sdp.md new file mode 100644 index 00000000..2ecf03be --- /dev/null +++ b/specs/behavior/order-management/agent/on-complete.examples/s-003-creates-dead-letter-on-failure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.agent.on-complete.creates-dead-letter-on-failure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.agent.on-complete +--- +# Creates dead letter on failure + +## Intent + +- outcome: Executable scenario "Creates dead letter on failure" from examples/order-management/tests/features/behavior/agent/on-complete.feature diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-004-increments-attempt-count-on-repeated-failure.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-004-increments-attempt-count-on-repeated-failure.sdp.md new file mode 100644 index 00000000..e6c0e42c --- /dev/null +++ b/specs/behavior/order-management/agent/on-complete.examples/s-004-increments-attempt-count-on-repeated-failure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.agent.on-complete.increments-attempt-count-on-repeated-failure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.agent.on-complete +--- +# Increments attemptCount on repeated failure + +## Intent + +- outcome: Executable scenario "Increments attemptCount on repeated failure" from examples/order-management/tests/features/behavior/agent/on-complete.feature diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-005-does-not-update-dead-letter-in-terminal-state.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-005-does-not-update-dead-letter-in-terminal-state.sdp.md new file mode 100644 index 00000000..8670770a --- /dev/null +++ b/specs/behavior/order-management/agent/on-complete.examples/s-005-does-not-update-dead-letter-in-terminal-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.agent.on-complete.does-not-update-dead-letter-in-terminal-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.agent.on-complete +--- +# Does not update dead letter in terminal state + +## Intent + +- outcome: Executable scenario "Does not update dead letter in terminal state" from examples/order-management/tests/features/behavior/agent/on-complete.feature diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-006-cron-expires-approval-after-timeout.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-006-cron-expires-approval-after-timeout.sdp.md new file mode 100644 index 00000000..18aff0ba --- /dev/null +++ b/specs/behavior/order-management/agent/on-complete.examples/s-006-cron-expires-approval-after-timeout.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.agent.on-complete.cron-expires-approval-after-timeout +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.agent.on-complete +--- +# Cron expires approval after timeout + +## Intent + +- outcome: Executable scenario "Cron expires approval after timeout" from examples/order-management/tests/features/behavior/agent/on-complete.feature diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-007-expired-approval-cannot-be-approved.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-007-expired-approval-cannot-be-approved.sdp.md new file mode 100644 index 00000000..7ec9c7d6 --- /dev/null +++ b/specs/behavior/order-management/agent/on-complete.examples/s-007-expired-approval-cannot-be-approved.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.agent.on-complete.expired-approval-cannot-be-approved +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.agent.on-complete +--- +# Expired approval cannot be approved + +## Intent + +- outcome: Executable scenario "Expired approval cannot be approved" from examples/order-management/tests/features/behavior/agent/on-complete.feature diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-008-suggest-customer-outreach-creates-outreach-record-and-emits-event.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-008-suggest-customer-outreach-creates-outreach-record-and-emits-event.sdp.md new file mode 100644 index 00000000..f1505b26 --- /dev/null +++ b/specs/behavior/order-management/agent/on-complete.examples/s-008-suggest-customer-outreach-creates-outreach-record-and-emits-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.agent.on-complete.suggest-customer-outreach-creates-outreach-record-and-emits-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.agent.on-complete +--- +# SuggestCustomerOutreach creates outreach record and emits event + +## Intent + +- outcome: Executable scenario "SuggestCustomerOutreach creates outreach record and emits event" from examples/order-management/tests/features/behavior/agent/on-complete.feature diff --git a/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-001-decide-to-add-item-to-draft-order.sdp.md b/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-001-decide-to-add-item-to-draft-order.sdp.md new file mode 100644 index 00000000..6fb2c2cf --- /dev/null +++ b/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-001-decide-to-add-item-to-draft-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.add-order-item-decider.decide-to-add-item-to-draft-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.add-order-item-decider +--- +# Decide to add item to draft order + +## Intent + +- outcome: Executable scenario "Decide to add item to draft order" from examples/order-management/tests/features/behavior/deciders/add-order-item.decider.feature diff --git a/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-002-reject-add-item-when-order-is-not-in-draft.sdp.md b/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-002-reject-add-item-when-order-is-not-in-draft.sdp.md new file mode 100644 index 00000000..7cc6312a --- /dev/null +++ b/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-002-reject-add-item-when-order-is-not-in-draft.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.add-order-item-decider.reject-add-item-when-order-is-not-in-draft +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.add-order-item-decider +--- +# Reject add item when order is not in draft + +## Intent + +- outcome: Executable scenario "Reject add item when order is not in draft" from examples/order-management/tests/features/behavior/deciders/add-order-item.decider.feature diff --git a/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-003-reject-add-item-with-invalid-quantity.sdp.md b/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-003-reject-add-item-with-invalid-quantity.sdp.md new file mode 100644 index 00000000..fda8448e --- /dev/null +++ b/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-003-reject-add-item-with-invalid-quantity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.add-order-item-decider.reject-add-item-with-invalid-quantity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.add-order-item-decider +--- +# Reject add item with invalid quantity + +## Intent + +- outcome: Executable scenario "Reject add item with invalid quantity" from examples/order-management/tests/features/behavior/deciders/add-order-item.decider.feature diff --git a/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-004-accumulate-items-and-recalculate-total.sdp.md b/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-004-accumulate-items-and-recalculate-total.sdp.md new file mode 100644 index 00000000..a9ff0127 --- /dev/null +++ b/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-004-accumulate-items-and-recalculate-total.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.add-order-item-decider.accumulate-items-and-recalculate-total +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.add-order-item-decider +--- +# Accumulate items and recalculate total + +## Intent + +- outcome: Executable scenario "Accumulate items and recalculate total" from examples/order-management/tests/features/behavior/deciders/add-order-item.decider.feature diff --git a/specs/behavior/order-management/deciders/add-stock-decider.examples/s-001-decide-to-add-stock-to-product.sdp.md b/specs/behavior/order-management/deciders/add-stock-decider.examples/s-001-decide-to-add-stock-to-product.sdp.md new file mode 100644 index 00000000..d436c2de --- /dev/null +++ b/specs/behavior/order-management/deciders/add-stock-decider.examples/s-001-decide-to-add-stock-to-product.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.add-stock-decider.decide-to-add-stock-to-product +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.add-stock-decider +--- +# Decide to add stock to product + +## Intent + +- outcome: Executable scenario "Decide to add stock to product" from examples/order-management/tests/features/behavior/deciders/add-stock.decider.feature diff --git a/specs/behavior/order-management/deciders/add-stock-decider.examples/s-002-add-stock-with-reason.sdp.md b/specs/behavior/order-management/deciders/add-stock-decider.examples/s-002-add-stock-with-reason.sdp.md new file mode 100644 index 00000000..75563818 --- /dev/null +++ b/specs/behavior/order-management/deciders/add-stock-decider.examples/s-002-add-stock-with-reason.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.add-stock-decider.add-stock-with-reason +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.add-stock-decider +--- +# Add stock with reason + +## Intent + +- outcome: Executable scenario "Add stock with reason" from examples/order-management/tests/features/behavior/deciders/add-stock.decider.feature diff --git a/specs/behavior/order-management/deciders/add-stock-decider.examples/s-003-reject-add-stock-with-zero-quantity.sdp.md b/specs/behavior/order-management/deciders/add-stock-decider.examples/s-003-reject-add-stock-with-zero-quantity.sdp.md new file mode 100644 index 00000000..ea864ca1 --- /dev/null +++ b/specs/behavior/order-management/deciders/add-stock-decider.examples/s-003-reject-add-stock-with-zero-quantity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.add-stock-decider.reject-add-stock-with-zero-quantity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.add-stock-decider +--- +# Reject add stock with zero quantity + +## Intent + +- outcome: Executable scenario "Reject add stock with zero quantity" from examples/order-management/tests/features/behavior/deciders/add-stock.decider.feature diff --git a/specs/behavior/order-management/deciders/add-stock-decider.examples/s-004-reject-add-stock-with-negative-quantity.sdp.md b/specs/behavior/order-management/deciders/add-stock-decider.examples/s-004-reject-add-stock-with-negative-quantity.sdp.md new file mode 100644 index 00000000..a35db8a9 --- /dev/null +++ b/specs/behavior/order-management/deciders/add-stock-decider.examples/s-004-reject-add-stock-with-negative-quantity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.add-stock-decider.reject-add-stock-with-negative-quantity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.add-stock-decider +--- +# Reject add stock with negative quantity + +## Intent + +- outcome: Executable scenario "Reject add stock with negative quantity" from examples/order-management/tests/features/behavior/deciders/add-stock.decider.feature diff --git a/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-001-decide-to-cancel-a-draft-order.sdp.md b/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-001-decide-to-cancel-a-draft-order.sdp.md new file mode 100644 index 00000000..f1a0edea --- /dev/null +++ b/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-001-decide-to-cancel-a-draft-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.cancel-order-decider.decide-to-cancel-a-draft-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.cancel-order-decider +--- +# Decide to cancel a draft order + +## Intent + +- outcome: Executable scenario "Decide to cancel a draft order" from examples/order-management/tests/features/behavior/deciders/cancel-order.decider.feature diff --git a/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-002-decide-to-cancel-a-submitted-order.sdp.md b/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-002-decide-to-cancel-a-submitted-order.sdp.md new file mode 100644 index 00000000..6a688ebe --- /dev/null +++ b/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-002-decide-to-cancel-a-submitted-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.cancel-order-decider.decide-to-cancel-a-submitted-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.cancel-order-decider +--- +# Decide to cancel a submitted order + +## Intent + +- outcome: Executable scenario "Decide to cancel a submitted order" from examples/order-management/tests/features/behavior/deciders/cancel-order.decider.feature diff --git a/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-003-decide-to-cancel-a-confirmed-order.sdp.md b/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-003-decide-to-cancel-a-confirmed-order.sdp.md new file mode 100644 index 00000000..5e9ddca6 --- /dev/null +++ b/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-003-decide-to-cancel-a-confirmed-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.cancel-order-decider.decide-to-cancel-a-confirmed-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.cancel-order-decider +--- +# Decide to cancel a confirmed order + +## Intent + +- outcome: Executable scenario "Decide to cancel a confirmed order" from examples/order-management/tests/features/behavior/deciders/cancel-order.decider.feature diff --git a/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-004-reject-cancel-for-already-cancelled-order.sdp.md b/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-004-reject-cancel-for-already-cancelled-order.sdp.md new file mode 100644 index 00000000..54866a56 --- /dev/null +++ b/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-004-reject-cancel-for-already-cancelled-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.cancel-order-decider.reject-cancel-for-already-cancelled-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.cancel-order-decider +--- +# Reject cancel for already cancelled order + +## Intent + +- outcome: Executable scenario "Reject cancel for already cancelled order" from examples/order-management/tests/features/behavior/deciders/cancel-order.decider.feature diff --git a/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-001-decide-to-confirm-a-submitted-order.sdp.md b/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-001-decide-to-confirm-a-submitted-order.sdp.md new file mode 100644 index 00000000..f64efd49 --- /dev/null +++ b/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-001-decide-to-confirm-a-submitted-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.confirm-order-decider.decide-to-confirm-a-submitted-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.confirm-order-decider +--- +# Decide to confirm a submitted order + +## Intent + +- outcome: Executable scenario "Decide to confirm a submitted order" from examples/order-management/tests/features/behavior/deciders/confirm-order.decider.feature diff --git a/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-002-reject-confirm-for-order-in-draft-status.sdp.md b/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-002-reject-confirm-for-order-in-draft-status.sdp.md new file mode 100644 index 00000000..12b59007 --- /dev/null +++ b/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-002-reject-confirm-for-order-in-draft-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.confirm-order-decider.reject-confirm-for-order-in-draft-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.confirm-order-decider +--- +# Reject confirm for order in draft status + +## Intent + +- outcome: Executable scenario "Reject confirm for order in draft status" from examples/order-management/tests/features/behavior/deciders/confirm-order.decider.feature diff --git a/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-003-reject-confirm-for-already-confirmed-order.sdp.md b/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-003-reject-confirm-for-already-confirmed-order.sdp.md new file mode 100644 index 00000000..45b11a5d --- /dev/null +++ b/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-003-reject-confirm-for-already-confirmed-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.confirm-order-decider.reject-confirm-for-already-confirmed-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.confirm-order-decider +--- +# Reject confirm for already confirmed order + +## Intent + +- outcome: Executable scenario "Reject confirm for already confirmed order" from examples/order-management/tests/features/behavior/deciders/confirm-order.decider.feature diff --git a/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-004-reject-confirm-for-cancelled-order.sdp.md b/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-004-reject-confirm-for-cancelled-order.sdp.md new file mode 100644 index 00000000..23ca71d8 --- /dev/null +++ b/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-004-reject-confirm-for-cancelled-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.confirm-order-decider.reject-confirm-for-cancelled-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.confirm-order-decider +--- +# Reject confirm for cancelled order + +## Intent + +- outcome: Executable scenario "Reject confirm for cancelled order" from examples/order-management/tests/features/behavior/deciders/confirm-order.decider.feature diff --git a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-001-decide-to-confirm-a-pending-reservation.sdp.md b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-001-decide-to-confirm-a-pending-reservation.sdp.md new file mode 100644 index 00000000..ee3ff17c --- /dev/null +++ b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-001-decide-to-confirm-a-pending-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.confirm-reservation-decider.decide-to-confirm-a-pending-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.confirm-reservation-decider +--- +# Decide to confirm a pending reservation + +## Intent + +- outcome: Executable scenario "Decide to confirm a pending reservation" from examples/order-management/tests/features/behavior/deciders/confirm-reservation.decider.feature diff --git a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-002-reject-confirm-when-reservation-is-already-confirmed.sdp.md b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-002-reject-confirm-when-reservation-is-already-confirmed.sdp.md new file mode 100644 index 00000000..8edce893 --- /dev/null +++ b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-002-reject-confirm-when-reservation-is-already-confirmed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.confirm-reservation-decider.reject-confirm-when-reservation-is-already-confirmed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.confirm-reservation-decider +--- +# Reject confirm when reservation is already confirmed + +## Intent + +- outcome: Executable scenario "Reject confirm when reservation is already confirmed" from examples/order-management/tests/features/behavior/deciders/confirm-reservation.decider.feature diff --git a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-003-reject-confirm-when-reservation-is-released.sdp.md b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-003-reject-confirm-when-reservation-is-released.sdp.md new file mode 100644 index 00000000..b70294f4 --- /dev/null +++ b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-003-reject-confirm-when-reservation-is-released.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.confirm-reservation-decider.reject-confirm-when-reservation-is-released +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.confirm-reservation-decider +--- +# Reject confirm when reservation is released + +## Intent + +- outcome: Executable scenario "Reject confirm when reservation is released" from examples/order-management/tests/features/behavior/deciders/confirm-reservation.decider.feature diff --git a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-004-reject-confirm-when-reservation-is-expired.sdp.md b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-004-reject-confirm-when-reservation-is-expired.sdp.md new file mode 100644 index 00000000..f9a30488 --- /dev/null +++ b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-004-reject-confirm-when-reservation-is-expired.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.confirm-reservation-decider.reject-confirm-when-reservation-is-expired +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.confirm-reservation-decider +--- +# Reject confirm when reservation is expired + +## Intent + +- outcome: Executable scenario "Reject confirm when reservation is expired" from examples/order-management/tests/features/behavior/deciders/confirm-reservation.decider.feature diff --git a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-005-reject-confirm-when-reservation-has-passed-its-expiration-time.sdp.md b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-005-reject-confirm-when-reservation-has-passed-its-expiration-time.sdp.md new file mode 100644 index 00000000..844d2313 --- /dev/null +++ b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-005-reject-confirm-when-reservation-has-passed-its-expiration-time.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.confirm-reservation-decider.reject-confirm-when-reservation-has-passed-its-expiration-time +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.confirm-reservation-decider +--- +# Reject confirm when reservation has passed its expiration time + +## Intent + +- outcome: Executable scenario "Reject confirm when reservation has passed its expiration time" from examples/order-management/tests/features/behavior/deciders/confirm-reservation.decider.feature diff --git a/specs/behavior/order-management/deciders/create-order-decider.examples/s-001-decide-to-create-a-new-order-when-none-exists.sdp.md b/specs/behavior/order-management/deciders/create-order-decider.examples/s-001-decide-to-create-a-new-order-when-none-exists.sdp.md new file mode 100644 index 00000000..da83a8f6 --- /dev/null +++ b/specs/behavior/order-management/deciders/create-order-decider.examples/s-001-decide-to-create-a-new-order-when-none-exists.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.create-order-decider.decide-to-create-a-new-order-when-none-exists +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.create-order-decider +--- +# Decide to create a new order when none exists + +## Intent + +- outcome: Executable scenario "Decide to create a new order when none exists" from examples/order-management/tests/features/behavior/deciders/create-order.decider.feature diff --git a/specs/behavior/order-management/deciders/create-order-decider.examples/s-002-reject-create-when-order-already-exists.sdp.md b/specs/behavior/order-management/deciders/create-order-decider.examples/s-002-reject-create-when-order-already-exists.sdp.md new file mode 100644 index 00000000..b46ba7a9 --- /dev/null +++ b/specs/behavior/order-management/deciders/create-order-decider.examples/s-002-reject-create-when-order-already-exists.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.create-order-decider.reject-create-when-order-already-exists +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.create-order-decider +--- +# Reject create when order already exists + +## Intent + +- outcome: Executable scenario "Reject create when order already exists" from examples/order-management/tests/features/behavior/deciders/create-order.decider.feature diff --git a/specs/behavior/order-management/deciders/create-product-decider.examples/s-001-decide-to-create-a-new-product-when-none-exists.sdp.md b/specs/behavior/order-management/deciders/create-product-decider.examples/s-001-decide-to-create-a-new-product-when-none-exists.sdp.md new file mode 100644 index 00000000..1333b622 --- /dev/null +++ b/specs/behavior/order-management/deciders/create-product-decider.examples/s-001-decide-to-create-a-new-product-when-none-exists.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.create-product-decider.decide-to-create-a-new-product-when-none-exists +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.create-product-decider +--- +# Decide to create a new product when none exists + +## Intent + +- outcome: Executable scenario "Decide to create a new product when none exists" from examples/order-management/tests/features/behavior/deciders/create-product.decider.feature diff --git a/specs/behavior/order-management/deciders/create-product-decider.examples/s-002-reject-create-when-product-already-exists.sdp.md b/specs/behavior/order-management/deciders/create-product-decider.examples/s-002-reject-create-when-product-already-exists.sdp.md new file mode 100644 index 00000000..d5490027 --- /dev/null +++ b/specs/behavior/order-management/deciders/create-product-decider.examples/s-002-reject-create-when-product-already-exists.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.create-product-decider.reject-create-when-product-already-exists +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.create-product-decider +--- +# Reject create when product already exists + +## Intent + +- outcome: Executable scenario "Reject create when product already exists" from examples/order-management/tests/features/behavior/deciders/create-product.decider.feature diff --git a/specs/behavior/order-management/deciders/create-product-decider.examples/s-003-reject-create-with-empty-product-name.sdp.md b/specs/behavior/order-management/deciders/create-product-decider.examples/s-003-reject-create-with-empty-product-name.sdp.md new file mode 100644 index 00000000..eb91f777 --- /dev/null +++ b/specs/behavior/order-management/deciders/create-product-decider.examples/s-003-reject-create-with-empty-product-name.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.create-product-decider.reject-create-with-empty-product-name +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.create-product-decider +--- +# Reject create with empty product name + +## Intent + +- outcome: Executable scenario "Reject create with empty product name" from examples/order-management/tests/features/behavior/deciders/create-product.decider.feature diff --git a/specs/behavior/order-management/deciders/create-product-decider.examples/s-004-reject-create-with-empty-sku.sdp.md b/specs/behavior/order-management/deciders/create-product-decider.examples/s-004-reject-create-with-empty-sku.sdp.md new file mode 100644 index 00000000..9a917c84 --- /dev/null +++ b/specs/behavior/order-management/deciders/create-product-decider.examples/s-004-reject-create-with-empty-sku.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.create-product-decider.reject-create-with-empty-sku +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.create-product-decider +--- +# Reject create with empty SKU + +## Intent + +- outcome: Executable scenario "Reject create with empty SKU" from examples/order-management/tests/features/behavior/deciders/create-product.decider.feature diff --git a/specs/behavior/order-management/deciders/create-product-decider.examples/s-005-reject-create-with-zero-price.sdp.md b/specs/behavior/order-management/deciders/create-product-decider.examples/s-005-reject-create-with-zero-price.sdp.md new file mode 100644 index 00000000..989667f0 --- /dev/null +++ b/specs/behavior/order-management/deciders/create-product-decider.examples/s-005-reject-create-with-zero-price.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.create-product-decider.reject-create-with-zero-price +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.create-product-decider +--- +# Reject create with zero price + +## Intent + +- outcome: Executable scenario "Reject create with zero price" from examples/order-management/tests/features/behavior/deciders/create-product.decider.feature diff --git a/specs/behavior/order-management/deciders/create-product-decider.examples/s-006-reject-create-with-negative-price.sdp.md b/specs/behavior/order-management/deciders/create-product-decider.examples/s-006-reject-create-with-negative-price.sdp.md new file mode 100644 index 00000000..fea40f6f --- /dev/null +++ b/specs/behavior/order-management/deciders/create-product-decider.examples/s-006-reject-create-with-negative-price.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.create-product-decider.reject-create-with-negative-price +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.create-product-decider +--- +# Reject create with negative price + +## Intent + +- outcome: Executable scenario "Reject create with negative price" from examples/order-management/tests/features/behavior/deciders/create-product.decider.feature diff --git a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-001-decide-to-expire-a-pending-reservation-that-has-timed-out.sdp.md b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-001-decide-to-expire-a-pending-reservation-that-has-timed-out.sdp.md new file mode 100644 index 00000000..6e1112c0 --- /dev/null +++ b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-001-decide-to-expire-a-pending-reservation-that-has-timed-out.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.expire-reservation-decider.decide-to-expire-a-pending-reservation-that-has-timed-out +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.expire-reservation-decider +--- +# Decide to expire a pending reservation that has timed out + +## Intent + +- outcome: Executable scenario "Decide to expire a pending reservation that has timed out" from examples/order-management/tests/features/behavior/deciders/expire-reservation.decider.feature diff --git a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-002-reject-expire-when-reservation-has-not-timed-out-yet.sdp.md b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-002-reject-expire-when-reservation-has-not-timed-out-yet.sdp.md new file mode 100644 index 00000000..2f959b8e --- /dev/null +++ b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-002-reject-expire-when-reservation-has-not-timed-out-yet.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.expire-reservation-decider.reject-expire-when-reservation-has-not-timed-out-yet +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.expire-reservation-decider +--- +# Reject expire when reservation has not timed out yet + +## Intent + +- outcome: Executable scenario "Reject expire when reservation has not timed out yet" from examples/order-management/tests/features/behavior/deciders/expire-reservation.decider.feature diff --git a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-003-reject-expire-when-reservation-is-already-confirmed.sdp.md b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-003-reject-expire-when-reservation-is-already-confirmed.sdp.md new file mode 100644 index 00000000..db0aacf1 --- /dev/null +++ b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-003-reject-expire-when-reservation-is-already-confirmed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.expire-reservation-decider.reject-expire-when-reservation-is-already-confirmed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.expire-reservation-decider +--- +# Reject expire when reservation is already confirmed + +## Intent + +- outcome: Executable scenario "Reject expire when reservation is already confirmed" from examples/order-management/tests/features/behavior/deciders/expire-reservation.decider.feature diff --git a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-004-reject-expire-when-reservation-is-already-released.sdp.md b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-004-reject-expire-when-reservation-is-already-released.sdp.md new file mode 100644 index 00000000..000f4d92 --- /dev/null +++ b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-004-reject-expire-when-reservation-is-already-released.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.expire-reservation-decider.reject-expire-when-reservation-is-already-released +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.expire-reservation-decider +--- +# Reject expire when reservation is already released + +## Intent + +- outcome: Executable scenario "Reject expire when reservation is already released" from examples/order-management/tests/features/behavior/deciders/expire-reservation.decider.feature diff --git a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-005-reject-expire-when-reservation-is-already-expired.sdp.md b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-005-reject-expire-when-reservation-is-already-expired.sdp.md new file mode 100644 index 00000000..f5b5854e --- /dev/null +++ b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-005-reject-expire-when-reservation-is-already-expired.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.expire-reservation-decider.reject-expire-when-reservation-is-already-expired +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.expire-reservation-decider +--- +# Reject expire when reservation is already expired + +## Intent + +- outcome: Executable scenario "Reject expire when reservation is already expired" from examples/order-management/tests/features/behavior/deciders/expire-reservation.decider.feature diff --git a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-001-evolve-null-state-with-product-created-event.sdp.md b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-001-evolve-null-state-with-product-created-event.sdp.md new file mode 100644 index 00000000..093703b1 --- /dev/null +++ b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-001-evolve-null-state-with-product-created-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.inventory-evolve.evolve-null-state-with-product-created-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.inventory-evolve +--- +# Evolve null state with ProductCreated event + +## Intent + +- outcome: Executable scenario "Evolve null state with ProductCreated event" from examples/order-management/tests/features/behavior/deciders/inventory-evolve.feature diff --git a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-002-evolve-inventory-state-with-stock-added-event.sdp.md b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-002-evolve-inventory-state-with-stock-added-event.sdp.md new file mode 100644 index 00000000..b6e232e0 --- /dev/null +++ b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-002-evolve-inventory-state-with-stock-added-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.inventory-evolve.evolve-inventory-state-with-stock-added-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.inventory-evolve +--- +# Evolve inventory state with StockAdded event + +## Intent + +- outcome: Executable scenario "Evolve inventory state with StockAdded event" from examples/order-management/tests/features/behavior/deciders/inventory-evolve.feature diff --git a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-003-evolve-inventory-from-zero-stock.sdp.md b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-003-evolve-inventory-from-zero-stock.sdp.md new file mode 100644 index 00000000..683d5082 --- /dev/null +++ b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-003-evolve-inventory-from-zero-stock.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.inventory-evolve.evolve-inventory-from-zero-stock +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.inventory-evolve +--- +# Evolve inventory from zero stock + +## Intent + +- outcome: Executable scenario "Evolve inventory from zero stock" from examples/order-management/tests/features/behavior/deciders/inventory-evolve.feature diff --git a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-004-evolve-inventory-state-with-stock-reserved-event.sdp.md b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-004-evolve-inventory-state-with-stock-reserved-event.sdp.md new file mode 100644 index 00000000..65339702 --- /dev/null +++ b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-004-evolve-inventory-state-with-stock-reserved-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.inventory-evolve.evolve-inventory-state-with-stock-reserved-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.inventory-evolve +--- +# Evolve inventory state with StockReserved event + +## Intent + +- outcome: Executable scenario "Evolve inventory state with StockReserved event" from examples/order-management/tests/features/behavior/deciders/inventory-evolve.feature diff --git a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-005-evolve-inventory-state-when-product-not-in-reservation.sdp.md b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-005-evolve-inventory-state-when-product-not-in-reservation.sdp.md new file mode 100644 index 00000000..0a0ac984 --- /dev/null +++ b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-005-evolve-inventory-state-when-product-not-in-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.inventory-evolve.evolve-inventory-state-when-product-not-in-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.inventory-evolve +--- +# Evolve inventory state when product not in reservation + +## Intent + +- outcome: Executable scenario "Evolve inventory state when product not in reservation" from examples/order-management/tests/features/behavior/deciders/inventory-evolve.feature diff --git a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-006-evolve-inventory-state-with-reservation-failed-event-no-change.sdp.md b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-006-evolve-inventory-state-with-reservation-failed-event-no-change.sdp.md new file mode 100644 index 00000000..7a992944 --- /dev/null +++ b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-006-evolve-inventory-state-with-reservation-failed-event-no-change.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.inventory-evolve.evolve-inventory-state-with-reservation-failed-event-no-change +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.inventory-evolve +--- +# Evolve inventory state with ReservationFailed event (no change) + +## Intent + +- outcome: Executable scenario "Evolve inventory state with ReservationFailed event (no change)" from examples/order-management/tests/features/behavior/deciders/inventory-evolve.feature diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-001-order-created-evolves-null-to-initial-state.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-001-order-created-evolves-null-to-initial-state.sdp.md new file mode 100644 index 00000000..305221cd --- /dev/null +++ b/specs/behavior/order-management/deciders/order-evolve.examples/s-001-order-created-evolves-null-to-initial-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.order-evolve.order-created-evolves-null-to-initial-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.order-evolve +--- +# OrderCreated evolves null to initial state + +## Intent + +- outcome: Executable scenario "OrderCreated evolves null to initial state" from examples/order-management/tests/features/behavior/deciders/order-evolve.feature diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-002-order-item-added-appends-item-to-empty-order.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-002-order-item-added-appends-item-to-empty-order.sdp.md new file mode 100644 index 00000000..a9edcc98 --- /dev/null +++ b/specs/behavior/order-management/deciders/order-evolve.examples/s-002-order-item-added-appends-item-to-empty-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.order-evolve.order-item-added-appends-item-to-empty-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.order-evolve +--- +# OrderItemAdded appends item to empty order + +## Intent + +- outcome: Executable scenario "OrderItemAdded appends item to empty order" from examples/order-management/tests/features/behavior/deciders/order-evolve.feature diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-003-order-item-added-accumulates-with-existing-items.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-003-order-item-added-accumulates-with-existing-items.sdp.md new file mode 100644 index 00000000..706c249f --- /dev/null +++ b/specs/behavior/order-management/deciders/order-evolve.examples/s-003-order-item-added-accumulates-with-existing-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.order-evolve.order-item-added-accumulates-with-existing-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.order-evolve +--- +# OrderItemAdded accumulates with existing items + +## Intent + +- outcome: Executable scenario "OrderItemAdded accumulates with existing items" from examples/order-management/tests/features/behavior/deciders/order-evolve.feature diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-004-order-item-removed-removes-item-and-updates-total.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-004-order-item-removed-removes-item-and-updates-total.sdp.md new file mode 100644 index 00000000..886f2a13 --- /dev/null +++ b/specs/behavior/order-management/deciders/order-evolve.examples/s-004-order-item-removed-removes-item-and-updates-total.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.order-evolve.order-item-removed-removes-item-and-updates-total +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.order-evolve +--- +# OrderItemRemoved removes item and updates total + +## Intent + +- outcome: Executable scenario "OrderItemRemoved removes item and updates total" from examples/order-management/tests/features/behavior/deciders/order-evolve.feature diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-005-order-submitted-changes-status-to-submitted.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-005-order-submitted-changes-status-to-submitted.sdp.md new file mode 100644 index 00000000..fcd96b87 --- /dev/null +++ b/specs/behavior/order-management/deciders/order-evolve.examples/s-005-order-submitted-changes-status-to-submitted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.order-evolve.order-submitted-changes-status-to-submitted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.order-evolve +--- +# OrderSubmitted changes status to submitted + +## Intent + +- outcome: Executable scenario "OrderSubmitted changes status to submitted" from examples/order-management/tests/features/behavior/deciders/order-evolve.feature diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-006-order-confirmed-changes-status-to-confirmed.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-006-order-confirmed-changes-status-to-confirmed.sdp.md new file mode 100644 index 00000000..15ecc1bc --- /dev/null +++ b/specs/behavior/order-management/deciders/order-evolve.examples/s-006-order-confirmed-changes-status-to-confirmed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.order-evolve.order-confirmed-changes-status-to-confirmed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.order-evolve +--- +# OrderConfirmed changes status to confirmed + +## Intent + +- outcome: Executable scenario "OrderConfirmed changes status to confirmed" from examples/order-management/tests/features/behavior/deciders/order-evolve.feature diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-007-order-cancelled-changes-status-from-draft-to-cancelled.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-007-order-cancelled-changes-status-from-draft-to-cancelled.sdp.md new file mode 100644 index 00000000..acc7b08c --- /dev/null +++ b/specs/behavior/order-management/deciders/order-evolve.examples/s-007-order-cancelled-changes-status-from-draft-to-cancelled.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.order-evolve.order-cancelled-changes-status-from-draft-to-cancelled +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.order-evolve +--- +# OrderCancelled changes status from draft to cancelled + +## Intent + +- outcome: Executable scenario "OrderCancelled changes status from draft to cancelled" from examples/order-management/tests/features/behavior/deciders/order-evolve.feature diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-008-order-cancelled-changes-status-from-submitted-to-cancelled.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-008-order-cancelled-changes-status-from-submitted-to-cancelled.sdp.md new file mode 100644 index 00000000..0c9ee6ce --- /dev/null +++ b/specs/behavior/order-management/deciders/order-evolve.examples/s-008-order-cancelled-changes-status-from-submitted-to-cancelled.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.order-evolve.order-cancelled-changes-status-from-submitted-to-cancelled +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.order-evolve +--- +# OrderCancelled changes status from submitted to cancelled + +## Intent + +- outcome: Executable scenario "OrderCancelled changes status from submitted to cancelled" from examples/order-management/tests/features/behavior/deciders/order-evolve.feature diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-009-order-cancelled-changes-status-from-confirmed-to-cancelled.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-009-order-cancelled-changes-status-from-confirmed-to-cancelled.sdp.md new file mode 100644 index 00000000..f85e1463 --- /dev/null +++ b/specs/behavior/order-management/deciders/order-evolve.examples/s-009-order-cancelled-changes-status-from-confirmed-to-cancelled.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.order-evolve.order-cancelled-changes-status-from-confirmed-to-cancelled +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.order-evolve +--- +# OrderCancelled changes status from confirmed to cancelled + +## Intent + +- outcome: Executable scenario "OrderCancelled changes status from confirmed to cancelled" from examples/order-management/tests/features/behavior/deciders/order-evolve.feature diff --git a/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-001-decide-to-release-a-pending-reservation.sdp.md b/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-001-decide-to-release-a-pending-reservation.sdp.md new file mode 100644 index 00000000..b96d4555 --- /dev/null +++ b/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-001-decide-to-release-a-pending-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.release-reservation-decider.decide-to-release-a-pending-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.release-reservation-decider +--- +# Decide to release a pending reservation + +## Intent + +- outcome: Executable scenario "Decide to release a pending reservation" from examples/order-management/tests/features/behavior/deciders/release-reservation.decider.feature diff --git a/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-002-decide-to-release-a-confirmed-reservation.sdp.md b/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-002-decide-to-release-a-confirmed-reservation.sdp.md new file mode 100644 index 00000000..bbeefdb6 --- /dev/null +++ b/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-002-decide-to-release-a-confirmed-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.release-reservation-decider.decide-to-release-a-confirmed-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.release-reservation-decider +--- +# Decide to release a confirmed reservation + +## Intent + +- outcome: Executable scenario "Decide to release a confirmed reservation" from examples/order-management/tests/features/behavior/deciders/release-reservation.decider.feature diff --git a/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-003-reject-release-when-reservation-is-already-released.sdp.md b/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-003-reject-release-when-reservation-is-already-released.sdp.md new file mode 100644 index 00000000..a8be331d --- /dev/null +++ b/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-003-reject-release-when-reservation-is-already-released.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.release-reservation-decider.reject-release-when-reservation-is-already-released +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.release-reservation-decider +--- +# Reject release when reservation is already released + +## Intent + +- outcome: Executable scenario "Reject release when reservation is already released" from examples/order-management/tests/features/behavior/deciders/release-reservation.decider.feature diff --git a/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-004-reject-release-when-reservation-is-expired.sdp.md b/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-004-reject-release-when-reservation-is-expired.sdp.md new file mode 100644 index 00000000..e44be146 --- /dev/null +++ b/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-004-reject-release-when-reservation-is-expired.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.release-reservation-decider.reject-release-when-reservation-is-expired +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.release-reservation-decider +--- +# Reject release when reservation is expired + +## Intent + +- outcome: Executable scenario "Reject release when reservation is expired" from examples/order-management/tests/features/behavior/deciders/release-reservation.decider.feature diff --git a/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-001-decide-to-remove-existing-item-from-draft-order.sdp.md b/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-001-decide-to-remove-existing-item-from-draft-order.sdp.md new file mode 100644 index 00000000..268345d6 --- /dev/null +++ b/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-001-decide-to-remove-existing-item-from-draft-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.remove-order-item-decider.decide-to-remove-existing-item-from-draft-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.remove-order-item-decider +--- +# Decide to remove existing item from draft order + +## Intent + +- outcome: Executable scenario "Decide to remove existing item from draft order" from examples/order-management/tests/features/behavior/deciders/remove-order-item.decider.feature diff --git a/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-002-reject-remove-item-when-order-is-not-in-draft.sdp.md b/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-002-reject-remove-item-when-order-is-not-in-draft.sdp.md new file mode 100644 index 00000000..826255a9 --- /dev/null +++ b/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-002-reject-remove-item-when-order-is-not-in-draft.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.remove-order-item-decider.reject-remove-item-when-order-is-not-in-draft +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.remove-order-item-decider +--- +# Reject remove item when order is not in draft + +## Intent + +- outcome: Executable scenario "Reject remove item when order is not in draft" from examples/order-management/tests/features/behavior/deciders/remove-order-item.decider.feature diff --git a/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-003-reject-remove-when-item-does-not-exist.sdp.md b/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-003-reject-remove-when-item-does-not-exist.sdp.md new file mode 100644 index 00000000..c13b0a19 --- /dev/null +++ b/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-003-reject-remove-when-item-does-not-exist.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.remove-order-item-decider.reject-remove-when-item-does-not-exist +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.remove-order-item-decider +--- +# Reject remove when item does not exist + +## Intent + +- outcome: Executable scenario "Reject remove when item does not exist" from examples/order-management/tests/features/behavior/deciders/remove-order-item.decider.feature diff --git a/specs/behavior/order-management/deciders/reservation-evolve.examples/s-001-evolve-reservation-state-with-reservation-confirmed.sdp.md b/specs/behavior/order-management/deciders/reservation-evolve.examples/s-001-evolve-reservation-state-with-reservation-confirmed.sdp.md new file mode 100644 index 00000000..7662e87d --- /dev/null +++ b/specs/behavior/order-management/deciders/reservation-evolve.examples/s-001-evolve-reservation-state-with-reservation-confirmed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.reservation-evolve.evolve-reservation-state-with-reservation-confirmed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.reservation-evolve +--- +# Evolve reservation state with ReservationConfirmed + +## Intent + +- outcome: Executable scenario "Evolve reservation state with ReservationConfirmed" from examples/order-management/tests/features/behavior/deciders/reservation-evolve.feature diff --git a/specs/behavior/order-management/deciders/reservation-evolve.examples/s-002-evolve-pending-reservation-with-reservation-released.sdp.md b/specs/behavior/order-management/deciders/reservation-evolve.examples/s-002-evolve-pending-reservation-with-reservation-released.sdp.md new file mode 100644 index 00000000..da802d03 --- /dev/null +++ b/specs/behavior/order-management/deciders/reservation-evolve.examples/s-002-evolve-pending-reservation-with-reservation-released.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.reservation-evolve.evolve-pending-reservation-with-reservation-released +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.reservation-evolve +--- +# Evolve pending reservation with ReservationReleased + +## Intent + +- outcome: Executable scenario "Evolve pending reservation with ReservationReleased" from examples/order-management/tests/features/behavior/deciders/reservation-evolve.feature diff --git a/specs/behavior/order-management/deciders/reservation-evolve.examples/s-003-evolve-confirmed-reservation-with-reservation-released.sdp.md b/specs/behavior/order-management/deciders/reservation-evolve.examples/s-003-evolve-confirmed-reservation-with-reservation-released.sdp.md new file mode 100644 index 00000000..aaeb1b12 --- /dev/null +++ b/specs/behavior/order-management/deciders/reservation-evolve.examples/s-003-evolve-confirmed-reservation-with-reservation-released.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.reservation-evolve.evolve-confirmed-reservation-with-reservation-released +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.reservation-evolve +--- +# Evolve confirmed reservation with ReservationReleased + +## Intent + +- outcome: Executable scenario "Evolve confirmed reservation with ReservationReleased" from examples/order-management/tests/features/behavior/deciders/reservation-evolve.feature diff --git a/specs/behavior/order-management/deciders/reservation-evolve.examples/s-004-evolve-pending-reservation-with-reservation-expired.sdp.md b/specs/behavior/order-management/deciders/reservation-evolve.examples/s-004-evolve-pending-reservation-with-reservation-expired.sdp.md new file mode 100644 index 00000000..a2e16b15 --- /dev/null +++ b/specs/behavior/order-management/deciders/reservation-evolve.examples/s-004-evolve-pending-reservation-with-reservation-expired.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.reservation-evolve.evolve-pending-reservation-with-reservation-expired +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.reservation-evolve +--- +# Evolve pending reservation with ReservationExpired + +## Intent + +- outcome: Executable scenario "Evolve pending reservation with ReservationExpired" from examples/order-management/tests/features/behavior/deciders/reservation-evolve.feature diff --git a/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-001-decide-to-reserve-stock-when-all-products-have-sufficient-availability.sdp.md b/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-001-decide-to-reserve-stock-when-all-products-have-sufficient-availability.sdp.md new file mode 100644 index 00000000..2a3b6bd9 --- /dev/null +++ b/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-001-decide-to-reserve-stock-when-all-products-have-sufficient-availability.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.reserve-stock-decider.decide-to-reserve-stock-when-all-products-have-sufficient-availability +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.reserve-stock-decider +--- +# Decide to reserve stock when all products have sufficient availability + +## Intent + +- outcome: Executable scenario "Decide to reserve stock when all products have sufficient availability" from examples/order-management/tests/features/behavior/deciders/reserve-stock.decider.feature diff --git a/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-002-fail-reservation-when-one-product-has-insufficient-stock.sdp.md b/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-002-fail-reservation-when-one-product-has-insufficient-stock.sdp.md new file mode 100644 index 00000000..dca69fae --- /dev/null +++ b/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-002-fail-reservation-when-one-product-has-insufficient-stock.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.reserve-stock-decider.fail-reservation-when-one-product-has-insufficient-stock +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.reserve-stock-decider +--- +# Fail reservation when one product has insufficient stock + +## Intent + +- outcome: Executable scenario "Fail reservation when one product has insufficient stock" from examples/order-management/tests/features/behavior/deciders/reserve-stock.decider.feature diff --git a/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-003-fail-reservation-when-product-does-not-exist.sdp.md b/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-003-fail-reservation-when-product-does-not-exist.sdp.md new file mode 100644 index 00000000..babef856 --- /dev/null +++ b/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-003-fail-reservation-when-product-does-not-exist.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.reserve-stock-decider.fail-reservation-when-product-does-not-exist +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.reserve-stock-decider +--- +# Fail reservation when product does not exist + +## Intent + +- outcome: Executable scenario "Fail reservation when product does not exist" from examples/order-management/tests/features/behavior/deciders/reserve-stock.decider.feature diff --git a/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-004-reject-reservation-with-empty-items.sdp.md b/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-004-reject-reservation-with-empty-items.sdp.md new file mode 100644 index 00000000..9ef53bd3 --- /dev/null +++ b/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-004-reject-reservation-with-empty-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.reserve-stock-decider.reject-reservation-with-empty-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.reserve-stock-decider +--- +# Reject reservation with empty items + +## Intent + +- outcome: Executable scenario "Reject reservation with empty items" from examples/order-management/tests/features/behavior/deciders/reserve-stock.decider.feature diff --git a/specs/behavior/order-management/deciders/submit-order-decider.examples/s-001-decide-to-submit-draft-order-with-items.sdp.md b/specs/behavior/order-management/deciders/submit-order-decider.examples/s-001-decide-to-submit-draft-order-with-items.sdp.md new file mode 100644 index 00000000..d6c48f06 --- /dev/null +++ b/specs/behavior/order-management/deciders/submit-order-decider.examples/s-001-decide-to-submit-draft-order-with-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.submit-order-decider.decide-to-submit-draft-order-with-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.submit-order-decider +--- +# Decide to submit draft order with items + +## Intent + +- outcome: Executable scenario "Decide to submit draft order with items" from examples/order-management/tests/features/behavior/deciders/submit-order.decider.feature diff --git a/specs/behavior/order-management/deciders/submit-order-decider.examples/s-002-reject-submit-for-order-not-in-draft-status.sdp.md b/specs/behavior/order-management/deciders/submit-order-decider.examples/s-002-reject-submit-for-order-not-in-draft-status.sdp.md new file mode 100644 index 00000000..afd3e0bf --- /dev/null +++ b/specs/behavior/order-management/deciders/submit-order-decider.examples/s-002-reject-submit-for-order-not-in-draft-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.submit-order-decider.reject-submit-for-order-not-in-draft-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.submit-order-decider +--- +# Reject submit for order not in draft status + +## Intent + +- outcome: Executable scenario "Reject submit for order not in draft status" from examples/order-management/tests/features/behavior/deciders/submit-order.decider.feature diff --git a/specs/behavior/order-management/deciders/submit-order-decider.examples/s-003-reject-submit-for-order-with-no-items.sdp.md b/specs/behavior/order-management/deciders/submit-order-decider.examples/s-003-reject-submit-for-order-with-no-items.sdp.md new file mode 100644 index 00000000..9be4e08c --- /dev/null +++ b/specs/behavior/order-management/deciders/submit-order-decider.examples/s-003-reject-submit-for-order-with-no-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.deciders.submit-order-decider.reject-submit-for-order-with-no-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.deciders.submit-order-decider +--- +# Reject submit for order with no items + +## Intent + +- outcome: Executable scenario "Reject submit for order with no items" from examples/order-management/tests/features/behavior/deciders/submit-order.decider.feature diff --git a/specs/behavior/order-management/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md b/specs/behavior/order-management/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md new file mode 100644 index 00000000..450ec303 --- /dev/null +++ b/specs/behavior/order-management/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.add-stock.successfully-add-stock-to-existing-product +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.add-stock +--- +# Successfully add stock to existing product + +## Intent + +- outcome: Executable scenario "Successfully add stock to existing product" from examples/order-management/tests/features/behavior/inventory/add-stock.feature diff --git a/specs/behavior/order-management/inventory/add-stock.examples/s-002-add-stock-to-product-with-existing-stock.sdp.md b/specs/behavior/order-management/inventory/add-stock.examples/s-002-add-stock-to-product-with-existing-stock.sdp.md new file mode 100644 index 00000000..335c1f59 --- /dev/null +++ b/specs/behavior/order-management/inventory/add-stock.examples/s-002-add-stock-to-product-with-existing-stock.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.add-stock.add-stock-to-product-with-existing-stock +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.add-stock +--- +# Add stock to product with existing stock + +## Intent + +- outcome: Executable scenario "Add stock to product with existing stock" from examples/order-management/tests/features/behavior/inventory/add-stock.feature diff --git a/specs/behavior/order-management/inventory/add-stock.examples/s-003-cannot-add-stock-to-non-existent-product.sdp.md b/specs/behavior/order-management/inventory/add-stock.examples/s-003-cannot-add-stock-to-non-existent-product.sdp.md new file mode 100644 index 00000000..9ded9921 --- /dev/null +++ b/specs/behavior/order-management/inventory/add-stock.examples/s-003-cannot-add-stock-to-non-existent-product.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.add-stock.cannot-add-stock-to-non-existent-product +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.add-stock +--- +# Cannot add stock to non-existent product + +## Intent + +- outcome: Executable scenario "Cannot add stock to non-existent product" from examples/order-management/tests/features/behavior/inventory/add-stock.feature diff --git a/specs/behavior/order-management/inventory/add-stock.examples/s-004-add-stock-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/inventory/add-stock.examples/s-004-add-stock-is-idempotent-with-same-command-id.sdp.md new file mode 100644 index 00000000..e0f63702 --- /dev/null +++ b/specs/behavior/order-management/inventory/add-stock.examples/s-004-add-stock-is-idempotent-with-same-command-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.add-stock.add-stock-is-idempotent-with-same-command-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.add-stock +--- +# AddStock is idempotent with same commandId + +## Intent + +- outcome: Executable scenario "AddStock is idempotent with same commandId" from examples/order-management/tests/features/behavior/inventory/add-stock.feature diff --git a/specs/behavior/order-management/inventory/confirm-reservation.examples/s-001-successfully-confirm-pending-reservation.sdp.md b/specs/behavior/order-management/inventory/confirm-reservation.examples/s-001-successfully-confirm-pending-reservation.sdp.md new file mode 100644 index 00000000..d8b391be --- /dev/null +++ b/specs/behavior/order-management/inventory/confirm-reservation.examples/s-001-successfully-confirm-pending-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.confirm-reservation.successfully-confirm-pending-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.confirm-reservation +--- +# Successfully confirm pending reservation + +## Intent + +- outcome: Executable scenario "Successfully confirm pending reservation" from examples/order-management/tests/features/behavior/inventory/confirm-reservation.feature diff --git a/specs/behavior/order-management/inventory/confirm-reservation.examples/s-002-cannot-confirm-non-existent-reservation.sdp.md b/specs/behavior/order-management/inventory/confirm-reservation.examples/s-002-cannot-confirm-non-existent-reservation.sdp.md new file mode 100644 index 00000000..3f85f64c --- /dev/null +++ b/specs/behavior/order-management/inventory/confirm-reservation.examples/s-002-cannot-confirm-non-existent-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.confirm-reservation.cannot-confirm-non-existent-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.confirm-reservation +--- +# Cannot confirm non-existent reservation + +## Intent + +- outcome: Executable scenario "Cannot confirm non-existent reservation" from examples/order-management/tests/features/behavior/inventory/confirm-reservation.feature diff --git a/specs/behavior/order-management/inventory/confirm-reservation.examples/s-003-cannot-confirm-already-confirmed-reservation.sdp.md b/specs/behavior/order-management/inventory/confirm-reservation.examples/s-003-cannot-confirm-already-confirmed-reservation.sdp.md new file mode 100644 index 00000000..3be07fa4 --- /dev/null +++ b/specs/behavior/order-management/inventory/confirm-reservation.examples/s-003-cannot-confirm-already-confirmed-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.confirm-reservation.cannot-confirm-already-confirmed-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.confirm-reservation +--- +# Cannot confirm already confirmed reservation + +## Intent + +- outcome: Executable scenario "Cannot confirm already confirmed reservation" from examples/order-management/tests/features/behavior/inventory/confirm-reservation.feature diff --git a/specs/behavior/order-management/inventory/confirm-reservation.examples/s-004-confirm-reservation-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/inventory/confirm-reservation.examples/s-004-confirm-reservation-is-idempotent-with-same-command-id.sdp.md new file mode 100644 index 00000000..6725545d --- /dev/null +++ b/specs/behavior/order-management/inventory/confirm-reservation.examples/s-004-confirm-reservation-is-idempotent-with-same-command-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.confirm-reservation.confirm-reservation-is-idempotent-with-same-command-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.confirm-reservation +--- +# ConfirmReservation is idempotent with same commandId + +## Intent + +- outcome: Executable scenario "ConfirmReservation is idempotent with same commandId" from examples/order-management/tests/features/behavior/inventory/confirm-reservation.feature diff --git a/specs/behavior/order-management/inventory/create-product.examples/s-001-successfully-create-a-new-product.sdp.md b/specs/behavior/order-management/inventory/create-product.examples/s-001-successfully-create-a-new-product.sdp.md new file mode 100644 index 00000000..de38e25b --- /dev/null +++ b/specs/behavior/order-management/inventory/create-product.examples/s-001-successfully-create-a-new-product.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.create-product.successfully-create-a-new-product +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.create-product +--- +# Successfully create a new product + +## Intent + +- outcome: Executable scenario "Successfully create a new product" from examples/order-management/tests/features/behavior/inventory/create-product.feature diff --git a/specs/behavior/order-management/inventory/create-product.examples/s-002-cannot-create-product-with-existing-id.sdp.md b/specs/behavior/order-management/inventory/create-product.examples/s-002-cannot-create-product-with-existing-id.sdp.md new file mode 100644 index 00000000..65d9e799 --- /dev/null +++ b/specs/behavior/order-management/inventory/create-product.examples/s-002-cannot-create-product-with-existing-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.create-product.cannot-create-product-with-existing-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.create-product +--- +# Cannot create product with existing ID + +## Intent + +- outcome: Executable scenario "Cannot create product with existing ID" from examples/order-management/tests/features/behavior/inventory/create-product.feature diff --git a/specs/behavior/order-management/inventory/create-product.examples/s-003-create-product-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/inventory/create-product.examples/s-003-create-product-is-idempotent-with-same-command-id.sdp.md new file mode 100644 index 00000000..66586a8b --- /dev/null +++ b/specs/behavior/order-management/inventory/create-product.examples/s-003-create-product-is-idempotent-with-same-command-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.create-product.create-product-is-idempotent-with-same-command-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.create-product +--- +# CreateProduct is idempotent with same commandId + +## Intent + +- outcome: Executable scenario "CreateProduct is idempotent with same commandId" from examples/order-management/tests/features/behavior/inventory/create-product.feature diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-001-sum-of-available-and-reserved.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-001-sum-of-available-and-reserved.sdp.md new file mode 100644 index 00000000..2163c040 --- /dev/null +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-001-sum-of-available-and-reserved.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.inventory-domain.sum-of-available-and-reserved +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.inventory-domain +--- +# Sum of available and reserved + +## Intent + +- outcome: Executable scenario "Sum of available and reserved" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-002-only-available-when-reserved-is-zero.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-002-only-available-when-reserved-is-zero.sdp.md new file mode 100644 index 00000000..88f73122 --- /dev/null +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-002-only-available-when-reserved-is-zero.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.inventory-domain.only-available-when-reserved-is-zero +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.inventory-domain +--- +# Only available when reserved is zero + +## Intent + +- outcome: Executable scenario "Only available when reserved is zero" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-003-only-reserved-when-available-is-zero.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-003-only-reserved-when-available-is-zero.sdp.md new file mode 100644 index 00000000..8376b85f --- /dev/null +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-003-only-reserved-when-available-is-zero.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.inventory-domain.only-reserved-when-available-is-zero +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.inventory-domain +--- +# Only reserved when available is zero + +## Intent + +- outcome: Executable scenario "Only reserved when available is zero" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-004-both-quantities-are-zero.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-004-both-quantities-are-zero.sdp.md new file mode 100644 index 00000000..7691341c --- /dev/null +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-004-both-quantities-are-zero.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.inventory-domain.both-quantities-are-zero +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.inventory-domain +--- +# Both quantities are zero + +## Intent + +- outcome: Executable scenario "Both quantities are zero" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-005-cms-fields-match-input-parameters.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-005-cms-fields-match-input-parameters.sdp.md new file mode 100644 index 00000000..753954a8 --- /dev/null +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-005-cms-fields-match-input-parameters.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.inventory-domain.cms-fields-match-input-parameters +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.inventory-domain +--- +# CMS fields match input parameters + +## Intent + +- outcome: Executable scenario "CMS fields match input parameters" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-006-initial-quantities-and-version-are-zero.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-006-initial-quantities-and-version-are-zero.sdp.md new file mode 100644 index 00000000..c09d61ed --- /dev/null +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-006-initial-quantities-and-version-are-zero.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.inventory-domain.initial-quantities-and-version-are-zero +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.inventory-domain +--- +# Initial quantities and version are zero + +## Intent + +- outcome: Executable scenario "Initial quantities and version are zero" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-007-timestamps-are-set-to-current-time.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-007-timestamps-are-set-to-current-time.sdp.md new file mode 100644 index 00000000..3bf7cec3 --- /dev/null +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-007-timestamps-are-set-to-current-time.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.inventory-domain.timestamps-are-set-to-current-time +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.inventory-domain +--- +# Timestamps are set to current time + +## Intent + +- outcome: Executable scenario "Timestamps are set to current time" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-008-current-version-cms-is-unchanged.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-008-current-version-cms-is-unchanged.sdp.md new file mode 100644 index 00000000..8bb31225 --- /dev/null +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-008-current-version-cms-is-unchanged.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.inventory-domain.current-version-cms-is-unchanged +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.inventory-domain +--- +# Current version CMS is unchanged + +## Intent + +- outcome: Executable scenario "Current version CMS is unchanged" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-009-missing-state-version-is-upgraded.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-009-missing-state-version-is-upgraded.sdp.md new file mode 100644 index 00000000..7105496b --- /dev/null +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-009-missing-state-version-is-upgraded.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.inventory-domain.missing-state-version-is-upgraded +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.inventory-domain +--- +# Missing stateVersion is upgraded + +## Intent + +- outcome: Executable scenario "Missing stateVersion is upgraded" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-010-version-0-is-upgraded.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-010-version-0-is-upgraded.sdp.md new file mode 100644 index 00000000..75cf10a2 --- /dev/null +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-010-version-0-is-upgraded.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.inventory-domain.version-0-is-upgraded +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.inventory-domain +--- +# Version 0 is upgraded + +## Intent + +- outcome: Executable scenario "Version 0 is upgraded" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-011-all-fields-are-preserved-during-upcast.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-011-all-fields-are-preserved-during-upcast.sdp.md new file mode 100644 index 00000000..8f1061fe --- /dev/null +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-011-all-fields-are-preserved-during-upcast.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.inventory-domain.all-fields-are-preserved-during-upcast +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.inventory-domain +--- +# All fields are preserved during upcast + +## Intent + +- outcome: Executable scenario "All fields are preserved during upcast" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-012-future-version-throws-error.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-012-future-version-throws-error.sdp.md new file mode 100644 index 00000000..38b18116 --- /dev/null +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-012-future-version-throws-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.inventory-domain.future-version-throws-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.inventory-domain +--- +# Future version throws error + +## Intent + +- outcome: Executable scenario "Future version throws error" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-001-passes-for-a-valid-product.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-001-passes-for-a-valid-product.sdp.md new file mode 100644 index 00000000..63774e30 --- /dev/null +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-001-passes-for-a-valid-product.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.product-invariants.passes-for-a-valid-product +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.product-invariants +--- +# passes for a valid product + +## Intent + +- outcome: Executable scenario "passes for a valid product" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-002-throws-product-not-found-for-null-product-reference.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-002-throws-product-not-found-for-null-product-reference.sdp.md new file mode 100644 index 00000000..860ef04b --- /dev/null +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-002-throws-product-not-found-for-null-product-reference.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.product-invariants.throws-product-not-found-for-null-product-reference +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.product-invariants +--- +# throws PRODUCT_NOT_FOUND for null product reference + +## Intent + +- outcome: Executable scenario "throws PRODUCT_NOT_FOUND for null product reference" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-003-throws-product-not-found-for-undefined-product-reference.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-003-throws-product-not-found-for-undefined-product-reference.sdp.md new file mode 100644 index 00000000..d15f4400 --- /dev/null +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-003-throws-product-not-found-for-undefined-product-reference.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.product-invariants.throws-product-not-found-for-undefined-product-reference +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.product-invariants +--- +# throws PRODUCT_NOT_FOUND for undefined product reference + +## Intent + +- outcome: Executable scenario "throws PRODUCT_NOT_FOUND for undefined product reference" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-004-passes-for-null-product-reference.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-004-passes-for-null-product-reference.sdp.md new file mode 100644 index 00000000..86520bb2 --- /dev/null +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-004-passes-for-null-product-reference.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.product-invariants.passes-for-null-product-reference +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.product-invariants +--- +# passes for null product reference + +## Intent + +- outcome: Executable scenario "passes for null product reference" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-005-passes-for-undefined-product-reference.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-005-passes-for-undefined-product-reference.sdp.md new file mode 100644 index 00000000..3f47ab08 --- /dev/null +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-005-passes-for-undefined-product-reference.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.product-invariants.passes-for-undefined-product-reference +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.product-invariants +--- +# passes for undefined product reference + +## Intent + +- outcome: Executable scenario "passes for undefined product reference" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-006-throws-product-already-exists-for-existing-product.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-006-throws-product-already-exists-for-existing-product.sdp.md new file mode 100644 index 00000000..f81c2ab3 --- /dev/null +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-006-throws-product-already-exists-for-existing-product.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.product-invariants.throws-product-already-exists-for-existing-product +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.product-invariants +--- +# throws PRODUCT_ALREADY_EXISTS for existing product + +## Intent + +- outcome: Executable scenario "throws PRODUCT_ALREADY_EXISTS for existing product" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-007-passes-for-standard-sku.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-007-passes-for-standard-sku.sdp.md new file mode 100644 index 00000000..759ebb85 --- /dev/null +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-007-passes-for-standard-sku.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.product-invariants.passes-for-standard-sku +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.product-invariants +--- +# passes for standard SKU + +## Intent + +- outcome: Executable scenario "passes for standard SKU" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-008-passes-for-sku-with-special-characters.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-008-passes-for-sku-with-special-characters.sdp.md new file mode 100644 index 00000000..90b23787 --- /dev/null +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-008-passes-for-sku-with-special-characters.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.product-invariants.passes-for-sku-with-special-characters +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.product-invariants +--- +# passes for SKU with special characters + +## Intent + +- outcome: Executable scenario "passes for SKU with special characters" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-009-throws-invalid-sku-for-empty-sku.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-009-throws-invalid-sku-for-empty-sku.sdp.md new file mode 100644 index 00000000..7097cc6b --- /dev/null +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-009-throws-invalid-sku-for-empty-sku.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.product-invariants.throws-invalid-sku-for-empty-sku +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.product-invariants +--- +# throws INVALID_SKU for empty SKU + +## Intent + +- outcome: Executable scenario "throws INVALID_SKU for empty SKU" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-010-throws-invalid-sku-for-whitespace-only-sku.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-010-throws-invalid-sku-for-whitespace-only-sku.sdp.md new file mode 100644 index 00000000..977472a4 --- /dev/null +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-010-throws-invalid-sku-for-whitespace-only-sku.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.product-invariants.throws-invalid-sku-for-whitespace-only-sku +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.product-invariants +--- +# throws INVALID_SKU for whitespace-only SKU + +## Intent + +- outcome: Executable scenario "throws INVALID_SKU for whitespace-only SKU" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-011-passes-for-standard-product-name.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-011-passes-for-standard-product-name.sdp.md new file mode 100644 index 00000000..10f637aa --- /dev/null +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-011-passes-for-standard-product-name.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.product-invariants.passes-for-standard-product-name +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.product-invariants +--- +# passes for standard product name + +## Intent + +- outcome: Executable scenario "passes for standard product name" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-012-passes-for-product-name-with-numbers.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-012-passes-for-product-name-with-numbers.sdp.md new file mode 100644 index 00000000..747dc2a6 --- /dev/null +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-012-passes-for-product-name-with-numbers.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.product-invariants.passes-for-product-name-with-numbers +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.product-invariants +--- +# passes for product name with numbers + +## Intent + +- outcome: Executable scenario "passes for product name with numbers" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-013-throws-invalid-product-name-for-empty-product-name.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-013-throws-invalid-product-name-for-empty-product-name.sdp.md new file mode 100644 index 00000000..2b8b62e8 --- /dev/null +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-013-throws-invalid-product-name-for-empty-product-name.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.product-invariants.throws-invalid-product-name-for-empty-product-name +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.product-invariants +--- +# throws INVALID_PRODUCT_NAME for empty product name + +## Intent + +- outcome: Executable scenario "throws INVALID_PRODUCT_NAME for empty product name" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-014-throws-invalid-product-name-for-whitespace-only-product-name.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-014-throws-invalid-product-name-for-whitespace-only-product-name.sdp.md new file mode 100644 index 00000000..57698cef --- /dev/null +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-014-throws-invalid-product-name-for-whitespace-only-product-name.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.product-invariants.throws-invalid-product-name-for-whitespace-only-product-name +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.product-invariants +--- +# throws INVALID_PRODUCT_NAME for whitespace-only product name + +## Intent + +- outcome: Executable scenario "throws INVALID_PRODUCT_NAME for whitespace-only product name" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-015-passes-for-positive-integer-10.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-015-passes-for-positive-integer-10.sdp.md new file mode 100644 index 00000000..d79d6a55 --- /dev/null +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-015-passes-for-positive-integer-10.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.product-invariants.passes-for-positive-integer-10 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.product-invariants +--- +# passes for positive integer 10 + +## Intent + +- outcome: Executable scenario "passes for positive integer 10" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-016-passes-for-positive-integer-1.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-016-passes-for-positive-integer-1.sdp.md new file mode 100644 index 00000000..30f12908 --- /dev/null +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-016-passes-for-positive-integer-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.product-invariants.passes-for-positive-integer-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.product-invariants +--- +# passes for positive integer 1 + +## Intent + +- outcome: Executable scenario "passes for positive integer 1" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-017-throws-invalid-quantity-for-zero.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-017-throws-invalid-quantity-for-zero.sdp.md new file mode 100644 index 00000000..efd1c826 --- /dev/null +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-017-throws-invalid-quantity-for-zero.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.product-invariants.throws-invalid-quantity-for-zero +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.product-invariants +--- +# throws INVALID_QUANTITY for zero + +## Intent + +- outcome: Executable scenario "throws INVALID_QUANTITY for zero" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-018-throws-invalid-quantity-for-negative-number.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-018-throws-invalid-quantity-for-negative-number.sdp.md new file mode 100644 index 00000000..a13308f9 --- /dev/null +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-018-throws-invalid-quantity-for-negative-number.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.product-invariants.throws-invalid-quantity-for-negative-number +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.product-invariants +--- +# throws INVALID_QUANTITY for negative number + +## Intent + +- outcome: Executable scenario "throws INVALID_QUANTITY for negative number" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-019-throws-invalid-quantity-for-non-integer.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-019-throws-invalid-quantity-for-non-integer.sdp.md new file mode 100644 index 00000000..d36659da --- /dev/null +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-019-throws-invalid-quantity-for-non-integer.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.product-invariants.throws-invalid-quantity-for-non-integer +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.product-invariants +--- +# throws INVALID_QUANTITY for non-integer + +## Intent + +- outcome: Executable scenario "throws INVALID_QUANTITY for non-integer" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-020-includes-context-string-in-error-message.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-020-includes-context-string-in-error-message.sdp.md new file mode 100644 index 00000000..fcdeee6b --- /dev/null +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-020-includes-context-string-in-error-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.product-invariants.includes-context-string-in-error-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.product-invariants +--- +# includes context string in error message + +## Intent + +- outcome: Executable scenario "includes context string in error message" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature diff --git a/specs/behavior/order-management/inventory/release-reservation.examples/s-001-successfully-release-pending-reservation.sdp.md b/specs/behavior/order-management/inventory/release-reservation.examples/s-001-successfully-release-pending-reservation.sdp.md new file mode 100644 index 00000000..256093d9 --- /dev/null +++ b/specs/behavior/order-management/inventory/release-reservation.examples/s-001-successfully-release-pending-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.release-reservation.successfully-release-pending-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.release-reservation +--- +# Successfully release pending reservation + +## Intent + +- outcome: Executable scenario "Successfully release pending reservation" from examples/order-management/tests/features/behavior/inventory/release-reservation.feature diff --git a/specs/behavior/order-management/inventory/release-reservation.examples/s-002-can-release-confirmed-reservation-for-order-cancellation.sdp.md b/specs/behavior/order-management/inventory/release-reservation.examples/s-002-can-release-confirmed-reservation-for-order-cancellation.sdp.md new file mode 100644 index 00000000..60ec980d --- /dev/null +++ b/specs/behavior/order-management/inventory/release-reservation.examples/s-002-can-release-confirmed-reservation-for-order-cancellation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.release-reservation.can-release-confirmed-reservation-for-order-cancellation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.release-reservation +--- +# Can release confirmed reservation (for order cancellation) + +## Intent + +- outcome: Executable scenario "Can release confirmed reservation (for order cancellation)" from examples/order-management/tests/features/behavior/inventory/release-reservation.feature diff --git a/specs/behavior/order-management/inventory/release-reservation.examples/s-003-release-reservation-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/inventory/release-reservation.examples/s-003-release-reservation-is-idempotent-with-same-command-id.sdp.md new file mode 100644 index 00000000..f219cc95 --- /dev/null +++ b/specs/behavior/order-management/inventory/release-reservation.examples/s-003-release-reservation-is-idempotent-with-same-command-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.release-reservation.release-reservation-is-idempotent-with-same-command-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.release-reservation +--- +# ReleaseReservation is idempotent with same commandId + +## Intent + +- outcome: Executable scenario "ReleaseReservation is idempotent with same commandId" from examples/order-management/tests/features/behavior/inventory/release-reservation.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-001-single-item-reservation-returns-count-of-1.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-001-single-item-reservation-returns-count-of-1.sdp.md new file mode 100644 index 00000000..e3a750bc --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-001-single-item-reservation-returns-count-of-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.single-item-reservation-returns-count-of-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Single item reservation returns count of 1 + +## Intent + +- outcome: Executable scenario "Single item reservation returns count of 1" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-002-multiple-items-reservation-returns-correct-count.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-002-multiple-items-reservation-returns-correct-count.sdp.md new file mode 100644 index 00000000..35a12b00 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-002-multiple-items-reservation-returns-correct-count.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.multiple-items-reservation-returns-correct-count +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Multiple items reservation returns correct count + +## Intent + +- outcome: Executable scenario "Multiple items reservation returns correct count" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-003-empty-items-reservation-returns-count-of-0.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-003-empty-items-reservation-returns-count-of-0.sdp.md new file mode 100644 index 00000000..d30b2a12 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-003-empty-items-reservation-returns-count-of-0.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.empty-items-reservation-returns-count-of-0 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Empty items reservation returns count of 0 + +## Intent + +- outcome: Executable scenario "Empty items reservation returns count of 0" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-004-multiple-items-returns-sum-of-all-quantities.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-004-multiple-items-returns-sum-of-all-quantities.sdp.md new file mode 100644 index 00000000..ba0157df --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-004-multiple-items-returns-sum-of-all-quantities.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.multiple-items-returns-sum-of-all-quantities +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Multiple items returns sum of all quantities + +## Intent + +- outcome: Executable scenario "Multiple items returns sum of all quantities" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-005-single-item-returns-its-quantity.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-005-single-item-returns-its-quantity.sdp.md new file mode 100644 index 00000000..4c3c1668 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-005-single-item-returns-its-quantity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.single-item-returns-its-quantity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Single item returns its quantity + +## Intent + +- outcome: Executable scenario "Single item returns its quantity" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-006-empty-items-returns-0.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-006-empty-items-returns-0.sdp.md new file mode 100644 index 00000000..9899606e --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-006-empty-items-returns-0.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.empty-items-returns-0 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Empty items returns 0 + +## Intent + +- outcome: Executable scenario "Empty items returns 0" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-007-creates-cms-with-correct-reservation-id-and-order-id.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-007-creates-cms-with-correct-reservation-id-and-order-id.sdp.md new file mode 100644 index 00000000..e63ed15b --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-007-creates-cms-with-correct-reservation-id-and-order-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.creates-cms-with-correct-reservation-id-and-order-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Creates CMS with correct reservationId and orderId + +## Intent + +- outcome: Executable scenario "Creates CMS with correct reservationId and orderId" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-008-initializes-items-array-correctly.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-008-initializes-items-array-correctly.sdp.md new file mode 100644 index 00000000..2da9f452 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-008-initializes-items-array-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.initializes-items-array-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Initializes items array correctly + +## Intent + +- outcome: Executable scenario "Initializes items array correctly" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-009-sets-status-to-pending.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-009-sets-status-to-pending.sdp.md new file mode 100644 index 00000000..fc3b2632 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-009-sets-status-to-pending.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.sets-status-to-pending +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Sets status to pending + +## Intent + +- outcome: Executable scenario "Sets status to pending" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-010-sets-expires-at-with-default-ttl.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-010-sets-expires-at-with-default-ttl.sdp.md new file mode 100644 index 00000000..2f2e95e7 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-010-sets-expires-at-with-default-ttl.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.sets-expires-at-with-default-ttl +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Sets expiresAt with default TTL + +## Intent + +- outcome: Executable scenario "Sets expiresAt with default TTL" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-011-supports-custom-ttl.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-011-supports-custom-ttl.sdp.md new file mode 100644 index 00000000..8cb6aa9f --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-011-supports-custom-ttl.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.supports-custom-ttl +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Supports custom TTL + +## Intent + +- outcome: Executable scenario "Supports custom TTL" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-012-initializes-version-to-0.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-012-initializes-version-to-0.sdp.md new file mode 100644 index 00000000..eb120310 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-012-initializes-version-to-0.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.initializes-version-to-0 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Initializes version to 0 + +## Intent + +- outcome: Executable scenario "Initializes version to 0" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-013-initializes-with-current-state-version.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-013-initializes-with-current-state-version.sdp.md new file mode 100644 index 00000000..d0e74c0b --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-013-initializes-with-current-state-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.initializes-with-current-state-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Initializes with current state version + +## Intent + +- outcome: Executable scenario "Initializes with current state version" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-014-sets-created-at-and-updated-at-to-current-timestamp.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-014-sets-created-at-and-updated-at-to-current-timestamp.sdp.md new file mode 100644 index 00000000..1161fa7a --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-014-sets-created-at-and-updated-at-to-current-timestamp.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.sets-created-at-and-updated-at-to-current-timestamp +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Sets createdAt and updatedAt to current timestamp + +## Intent + +- outcome: Executable scenario "Sets createdAt and updatedAt to current timestamp" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-015-returns-false-when-reservation-has-not-expired.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-015-returns-false-when-reservation-has-not-expired.sdp.md new file mode 100644 index 00000000..9b37a805 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-015-returns-false-when-reservation-has-not-expired.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.returns-false-when-reservation-has-not-expired +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Returns false when reservation has not expired + +## Intent + +- outcome: Executable scenario "Returns false when reservation has not expired" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-016-returns-true-when-reservation-has-expired.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-016-returns-true-when-reservation-has-expired.sdp.md new file mode 100644 index 00000000..ab0f74ac --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-016-returns-true-when-reservation-has-expired.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.returns-true-when-reservation-has-expired +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Returns true when reservation has expired + +## Intent + +- outcome: Executable scenario "Returns true when reservation has expired" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-017-returns-false-when-reservation-is-confirmed-regardless-of-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-017-returns-false-when-reservation-is-confirmed-regardless-of-expiry.sdp.md new file mode 100644 index 00000000..b39db067 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-017-returns-false-when-reservation-is-confirmed-regardless-of-expiry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.returns-false-when-reservation-is-confirmed-regardless-of-expiry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Returns false when reservation is confirmed regardless of expiry + +## Intent + +- outcome: Executable scenario "Returns false when reservation is confirmed regardless of expiry" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-018-returns-false-when-reservation-is-released-regardless-of-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-018-returns-false-when-reservation-is-released-regardless-of-expiry.sdp.md new file mode 100644 index 00000000..791dddc9 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-018-returns-false-when-reservation-is-released-regardless-of-expiry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.returns-false-when-reservation-is-released-regardless-of-expiry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Returns false when reservation is released regardless of expiry + +## Intent + +- outcome: Executable scenario "Returns false when reservation is released regardless of expiry" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-019-handles-exact-expiry-boundary-correctly.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-019-handles-exact-expiry-boundary-correctly.sdp.md new file mode 100644 index 00000000..5164a5a1 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-019-handles-exact-expiry-boundary-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.handles-exact-expiry-boundary-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Handles exact expiry boundary correctly + +## Intent + +- outcome: Executable scenario "Handles exact expiry boundary correctly" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-020-returns-unchanged-cms-when-already-at-current-version.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-020-returns-unchanged-cms-when-already-at-current-version.sdp.md new file mode 100644 index 00000000..97dc7d9c --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-020-returns-unchanged-cms-when-already-at-current-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.returns-unchanged-cms-when-already-at-current-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Returns unchanged CMS when already at current version + +## Intent + +- outcome: Executable scenario "Returns unchanged CMS when already at current version" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-021-upgrades-cms-with-missing-state-version-to-current-version.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-021-upgrades-cms-with-missing-state-version-to-current-version.sdp.md new file mode 100644 index 00000000..4ce5b6e1 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-021-upgrades-cms-with-missing-state-version-to-current-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.upgrades-cms-with-missing-state-version-to-current-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Upgrades CMS with missing stateVersion to current version + +## Intent + +- outcome: Executable scenario "Upgrades CMS with missing stateVersion to current version" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-022-throws-error-for-future-versions.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-022-throws-error-for-future-versions.sdp.md new file mode 100644 index 00000000..356add6d --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-022-throws-error-for-future-versions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.throws-error-for-future-versions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Throws error for future versions + +## Intent + +- outcome: Executable scenario "Throws error for future versions" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-023-preserves-all-fields-during-upcast.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-023-preserves-all-fields-during-upcast.sdp.md new file mode 100644 index 00000000..dd3cde9a --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-023-preserves-all-fields-during-upcast.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-domain.preserves-all-fields-during-upcast +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-domain +--- +# Preserves all fields during upcast + +## Intent + +- outcome: Executable scenario "Preserves all fields during upcast" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-001-does-not-throw-when-reservation-exists.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-001-does-not-throw-when-reservation-exists.sdp.md new file mode 100644 index 00000000..b265c4f3 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-001-does-not-throw-when-reservation-exists.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.does-not-throw-when-reservation-exists +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Does not throw when reservation exists + +## Intent + +- outcome: Executable scenario "Does not throw when reservation exists" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-002-throws-reservation-not-found-when-reservation-is-null.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-002-throws-reservation-not-found-when-reservation-is-null.sdp.md new file mode 100644 index 00000000..15a79f94 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-002-throws-reservation-not-found-when-reservation-is-null.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.throws-reservation-not-found-when-reservation-is-null +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Throws RESERVATION_NOT_FOUND when reservation is null + +## Intent + +- outcome: Executable scenario "Throws RESERVATION_NOT_FOUND when reservation is null" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-003-throws-reservation-not-found-when-reservation-is-undefined.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-003-throws-reservation-not-found-when-reservation-is-undefined.sdp.md new file mode 100644 index 00000000..e99752af --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-003-throws-reservation-not-found-when-reservation-is-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.throws-reservation-not-found-when-reservation-is-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Throws RESERVATION_NOT_FOUND when reservation is undefined + +## Intent + +- outcome: Executable scenario "Throws RESERVATION_NOT_FOUND when reservation is undefined" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-004-does-not-throw-when-reservation-is-null.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-004-does-not-throw-when-reservation-is-null.sdp.md new file mode 100644 index 00000000..84cb298f --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-004-does-not-throw-when-reservation-is-null.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.does-not-throw-when-reservation-is-null +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Does not throw when reservation is null + +## Intent + +- outcome: Executable scenario "Does not throw when reservation is null" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-005-does-not-throw-when-reservation-is-undefined.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-005-does-not-throw-when-reservation-is-undefined.sdp.md new file mode 100644 index 00000000..743fcf48 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-005-does-not-throw-when-reservation-is-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.does-not-throw-when-reservation-is-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Does not throw when reservation is undefined + +## Intent + +- outcome: Executable scenario "Does not throw when reservation is undefined" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-006-throws-reservation-already-exists-when-reservation-exists.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-006-throws-reservation-already-exists-when-reservation-exists.sdp.md new file mode 100644 index 00000000..ccba365d --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-006-throws-reservation-already-exists-when-reservation-exists.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.throws-reservation-already-exists-when-reservation-exists +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Throws RESERVATION_ALREADY_EXISTS when reservation exists + +## Intent + +- outcome: Executable scenario "Throws RESERVATION_ALREADY_EXISTS when reservation exists" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-007-does-not-throw-when-items-has-one-item.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-007-does-not-throw-when-items-has-one-item.sdp.md new file mode 100644 index 00000000..7453e7c6 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-007-does-not-throw-when-items-has-one-item.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.does-not-throw-when-items-has-one-item +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Does not throw when items has one item + +## Intent + +- outcome: Executable scenario "Does not throw when items has one item" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-008-does-not-throw-when-items-has-multiple-items.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-008-does-not-throw-when-items-has-multiple-items.sdp.md new file mode 100644 index 00000000..b0993cf1 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-008-does-not-throw-when-items-has-multiple-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.does-not-throw-when-items-has-multiple-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Does not throw when items has multiple items + +## Intent + +- outcome: Executable scenario "Does not throw when items has multiple items" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-009-throws-empty-reservation-when-items-array-is-empty.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-009-throws-empty-reservation-when-items-array-is-empty.sdp.md new file mode 100644 index 00000000..e7a6d89f --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-009-throws-empty-reservation-when-items-array-is-empty.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.throws-empty-reservation-when-items-array-is-empty +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Throws EMPTY_RESERVATION when items array is empty + +## Intent + +- outcome: Executable scenario "Throws EMPTY_RESERVATION when items array is empty" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-010-does-not-throw-for-valid-item-with-quantity-5.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-010-does-not-throw-for-valid-item-with-quantity-5.sdp.md new file mode 100644 index 00000000..6c449e79 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-010-does-not-throw-for-valid-item-with-quantity-5.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.does-not-throw-for-valid-item-with-quantity-5 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Does not throw for valid item with quantity 5 + +## Intent + +- outcome: Executable scenario "Does not throw for valid item with quantity 5" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-011-does-not-throw-for-item-with-quantity-1.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-011-does-not-throw-for-item-with-quantity-1.sdp.md new file mode 100644 index 00000000..97c9abb9 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-011-does-not-throw-for-item-with-quantity-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.does-not-throw-for-item-with-quantity-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Does not throw for item with quantity 1 + +## Intent + +- outcome: Executable scenario "Does not throw for item with quantity 1" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-012-throws-invalid-quantity-for-zero-quantity.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-012-throws-invalid-quantity-for-zero-quantity.sdp.md new file mode 100644 index 00000000..c74c45ef --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-012-throws-invalid-quantity-for-zero-quantity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.throws-invalid-quantity-for-zero-quantity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Throws INVALID_QUANTITY for zero quantity + +## Intent + +- outcome: Executable scenario "Throws INVALID_QUANTITY for zero quantity" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-013-throws-invalid-quantity-for-negative-quantity.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-013-throws-invalid-quantity-for-negative-quantity.sdp.md new file mode 100644 index 00000000..4edbe7db --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-013-throws-invalid-quantity-for-negative-quantity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.throws-invalid-quantity-for-negative-quantity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Throws INVALID_QUANTITY for negative quantity + +## Intent + +- outcome: Executable scenario "Throws INVALID_QUANTITY for negative quantity" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-014-throws-invalid-quantity-for-non-integer-quantity.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-014-throws-invalid-quantity-for-non-integer-quantity.sdp.md new file mode 100644 index 00000000..b2cf2472 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-014-throws-invalid-quantity-for-non-integer-quantity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.throws-invalid-quantity-for-non-integer-quantity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Throws INVALID_QUANTITY for non-integer quantity + +## Intent + +- outcome: Executable scenario "Throws INVALID_QUANTITY for non-integer quantity" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-015-throws-invalid-reservation-item-for-empty-product-id.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-015-throws-invalid-reservation-item-for-empty-product-id.sdp.md new file mode 100644 index 00000000..e5cbfc17 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-015-throws-invalid-reservation-item-for-empty-product-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.throws-invalid-reservation-item-for-empty-product-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Throws INVALID_RESERVATION_ITEM for empty productId + +## Intent + +- outcome: Executable scenario "Throws INVALID_RESERVATION_ITEM for empty productId" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-016-does-not-throw-for-valid-items-array.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-016-does-not-throw-for-valid-items-array.sdp.md new file mode 100644 index 00000000..aaa7f40a --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-016-does-not-throw-for-valid-items-array.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.does-not-throw-for-valid-items-array +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Does not throw for valid items array + +## Intent + +- outcome: Executable scenario "Does not throw for valid items array" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-017-throws-empty-reservation-for-empty-array.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-017-throws-empty-reservation-for-empty-array.sdp.md new file mode 100644 index 00000000..00e74d3c --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-017-throws-empty-reservation-for-empty-array.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.throws-empty-reservation-for-empty-array +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Throws EMPTY_RESERVATION for empty array + +## Intent + +- outcome: Executable scenario "Throws EMPTY_RESERVATION for empty array" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-018-throws-invalid-quantity-when-one-item-has-invalid-quantity.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-018-throws-invalid-quantity-when-one-item-has-invalid-quantity.sdp.md new file mode 100644 index 00000000..c7685383 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-018-throws-invalid-quantity-when-one-item-has-invalid-quantity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.throws-invalid-quantity-when-one-item-has-invalid-quantity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Throws INVALID_QUANTITY when one item has invalid quantity + +## Intent + +- outcome: Executable scenario "Throws INVALID_QUANTITY when one item has invalid quantity" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-019-has-correct-name-property.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-019-has-correct-name-property.sdp.md new file mode 100644 index 00000000..74aef44c --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-019-has-correct-name-property.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.has-correct-name-property +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Has correct name property + +## Intent + +- outcome: Executable scenario "Has correct name property" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-020-has-correct-code-property.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-020-has-correct-code-property.sdp.md new file mode 100644 index 00000000..1cbb5e74 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-020-has-correct-code-property.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.has-correct-code-property +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Has correct code property + +## Intent + +- outcome: Executable scenario "Has correct code property" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-021-has-correct-message-property.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-021-has-correct-message-property.sdp.md new file mode 100644 index 00000000..4e401afe --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-021-has-correct-message-property.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.has-correct-message-property +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Has correct message property + +## Intent + +- outcome: Executable scenario "Has correct message property" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-022-has-correct-context-property.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-022-has-correct-context-property.sdp.md new file mode 100644 index 00000000..ca85ea11 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-022-has-correct-context-property.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.has-correct-context-property +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Has correct context property + +## Intent + +- outcome: Executable scenario "Has correct context property" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-023-can-have-undefined-context.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-023-can-have-undefined-context.sdp.md new file mode 100644 index 00000000..61f40046 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-023-can-have-undefined-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.can-have-undefined-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Can have undefined context + +## Intent + +- outcome: Executable scenario "Can have undefined context" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-024-is-instance-of-error.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-024-is-instance-of-error.sdp.md new file mode 100644 index 00000000..e002dc47 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-024-is-instance-of-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.is-instance-of-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# Is instance of Error + +## Intent + +- outcome: Executable scenario "Is instance of Error" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-025-reservation-is-pending-check-returns-true-for-pending-status.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-025-reservation-is-pending-check-returns-true-for-pending-status.sdp.md new file mode 100644 index 00000000..68247f9e --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-025-reservation-is-pending-check-returns-true-for-pending-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-is-pending-check-returns-true-for-pending-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationIsPending.check returns true for pending status + +## Intent + +- outcome: Executable scenario "reservationIsPending.check returns true for pending status" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-026-reservation-is-pending-check-returns-false-for-non-pending-statuses.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-026-reservation-is-pending-check-returns-false-for-non-pending-statuses.sdp.md new file mode 100644 index 00000000..c71bb892 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-026-reservation-is-pending-check-returns-false-for-non-pending-statuses.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-is-pending-check-returns-false-for-non-pending-statuses +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationIsPending.check returns false for non-pending statuses + +## Intent + +- outcome: Executable scenario "reservationIsPending.check returns false for non-pending statuses" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-027-reservation-is-pending-assert-passes-for-pending-status.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-027-reservation-is-pending-assert-passes-for-pending-status.sdp.md new file mode 100644 index 00000000..0b4ab080 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-027-reservation-is-pending-assert-passes-for-pending-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-is-pending-assert-passes-for-pending-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationIsPending.assert passes for pending status + +## Intent + +- outcome: Executable scenario "reservationIsPending.assert passes for pending status" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-028-reservation-is-pending-assert-throws-reservation-not-pending-for-confirmed.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-028-reservation-is-pending-assert-throws-reservation-not-pending-for-confirmed.sdp.md new file mode 100644 index 00000000..f45b93b0 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-028-reservation-is-pending-assert-throws-reservation-not-pending-for-confirmed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-is-pending-assert-throws-reservation-not-pending-for-confirmed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationIsPending.assert throws RESERVATION_NOT_PENDING for confirmed + +## Intent + +- outcome: Executable scenario "reservationIsPending.assert throws RESERVATION_NOT_PENDING for confirmed" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-029-reservation-is-pending-assert-throws-reservation-not-pending-for-released.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-029-reservation-is-pending-assert-throws-reservation-not-pending-for-released.sdp.md new file mode 100644 index 00000000..ef1fcfc6 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-029-reservation-is-pending-assert-throws-reservation-not-pending-for-released.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-is-pending-assert-throws-reservation-not-pending-for-released +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationIsPending.assert throws RESERVATION_NOT_PENDING for released + +## Intent + +- outcome: Executable scenario "reservationIsPending.assert throws RESERVATION_NOT_PENDING for released" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-030-reservation-is-pending-validate-returns-valid-for-pending.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-030-reservation-is-pending-validate-returns-valid-for-pending.sdp.md new file mode 100644 index 00000000..215a990d --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-030-reservation-is-pending-validate-returns-valid-for-pending.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-is-pending-validate-returns-valid-for-pending +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationIsPending.validate returns valid for pending + +## Intent + +- outcome: Executable scenario "reservationIsPending.validate returns valid for pending" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-031-reservation-is-pending-validate-returns-invalid-for-released.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-031-reservation-is-pending-validate-returns-invalid-for-released.sdp.md new file mode 100644 index 00000000..cba6b24b --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-031-reservation-is-pending-validate-returns-invalid-for-released.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-is-pending-validate-returns-invalid-for-released +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationIsPending.validate returns invalid for released + +## Intent + +- outcome: Executable scenario "reservationIsPending.validate returns invalid for released" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-032-reservation-not-expired-check-returns-true-for-pending-with-future-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-032-reservation-not-expired-check-returns-true-for-pending-with-future-expiry.sdp.md new file mode 100644 index 00000000..67e64559 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-032-reservation-not-expired-check-returns-true-for-pending-with-future-expiry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-not-expired-check-returns-true-for-pending-with-future-expiry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationNotExpired.check returns true for pending with future expiry + +## Intent + +- outcome: Executable scenario "reservationNotExpired.check returns true for pending with future expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-033-reservation-not-expired-check-returns-true-for-confirmed-with-past-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-033-reservation-not-expired-check-returns-true-for-confirmed-with-past-expiry.sdp.md new file mode 100644 index 00000000..62387130 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-033-reservation-not-expired-check-returns-true-for-confirmed-with-past-expiry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-not-expired-check-returns-true-for-confirmed-with-past-expiry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationNotExpired.check returns true for confirmed with past expiry + +## Intent + +- outcome: Executable scenario "reservationNotExpired.check returns true for confirmed with past expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-034-reservation-not-expired-check-returns-true-for-released-with-past-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-034-reservation-not-expired-check-returns-true-for-released-with-past-expiry.sdp.md new file mode 100644 index 00000000..49d31350 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-034-reservation-not-expired-check-returns-true-for-released-with-past-expiry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-not-expired-check-returns-true-for-released-with-past-expiry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationNotExpired.check returns true for released with past expiry + +## Intent + +- outcome: Executable scenario "reservationNotExpired.check returns true for released with past expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-035-reservation-not-expired-check-returns-false-for-pending-with-past-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-035-reservation-not-expired-check-returns-false-for-pending-with-past-expiry.sdp.md new file mode 100644 index 00000000..988c9d69 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-035-reservation-not-expired-check-returns-false-for-pending-with-past-expiry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-not-expired-check-returns-false-for-pending-with-past-expiry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationNotExpired.check returns false for pending with past expiry + +## Intent + +- outcome: Executable scenario "reservationNotExpired.check returns false for pending with past expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-036-reservation-not-expired-assert-passes-for-pending-with-future-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-036-reservation-not-expired-assert-passes-for-pending-with-future-expiry.sdp.md new file mode 100644 index 00000000..6e7efab6 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-036-reservation-not-expired-assert-passes-for-pending-with-future-expiry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-not-expired-assert-passes-for-pending-with-future-expiry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationNotExpired.assert passes for pending with future expiry + +## Intent + +- outcome: Executable scenario "reservationNotExpired.assert passes for pending with future expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-037-reservation-not-expired-assert-passes-for-confirmed-with-past-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-037-reservation-not-expired-assert-passes-for-confirmed-with-past-expiry.sdp.md new file mode 100644 index 00000000..bc0382e5 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-037-reservation-not-expired-assert-passes-for-confirmed-with-past-expiry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-not-expired-assert-passes-for-confirmed-with-past-expiry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationNotExpired.assert passes for confirmed with past expiry + +## Intent + +- outcome: Executable scenario "reservationNotExpired.assert passes for confirmed with past expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-038-reservation-not-expired-assert-throws-reservation-expired-for-pending-with.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-038-reservation-not-expired-assert-throws-reservation-expired-for-pending-with.sdp.md new file mode 100644 index 00000000..7aa1ee1c --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-038-reservation-not-expired-assert-throws-reservation-expired-for-pending-with.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-not-expired-assert-throws-reservation-expired-for-pending-with-past +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationNotExpired.assert throws RESERVATION_EXPIRED for pending with past expiry + +## Intent + +- outcome: Executable scenario "reservationNotExpired.assert throws RESERVATION_EXPIRED for pending with past expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-039-reservation-not-expired-validate-returns-valid-for-pending-with-future-exp.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-039-reservation-not-expired-validate-returns-valid-for-pending-with-future-exp.sdp.md new file mode 100644 index 00000000..660eed0c --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-039-reservation-not-expired-validate-returns-valid-for-pending-with-future-exp.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-not-expired-validate-returns-valid-for-pending-with-future-expiry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationNotExpired.validate returns valid for pending with future expiry + +## Intent + +- outcome: Executable scenario "reservationNotExpired.validate returns valid for pending with future expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-040-reservation-not-expired-validate-returns-invalid-for-pending-with-past-exp.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-040-reservation-not-expired-validate-returns-invalid-for-pending-with-past-exp.sdp.md new file mode 100644 index 00000000..15a14186 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-040-reservation-not-expired-validate-returns-invalid-for-pending-with-past-exp.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-not-expired-validate-returns-invalid-for-pending-with-past-expiry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationNotExpired.validate returns invalid for pending with past expiry + +## Intent + +- outcome: Executable scenario "reservationNotExpired.validate returns invalid for pending with past expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-041-reservation-has-expired-check-returns-true-for-pending-with-past-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-041-reservation-has-expired-check-returns-true-for-pending-with-past-expiry.sdp.md new file mode 100644 index 00000000..d623fe97 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-041-reservation-has-expired-check-returns-true-for-pending-with-past-expiry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-has-expired-check-returns-true-for-pending-with-past-expiry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationHasExpired.check returns true for pending with past expiry + +## Intent + +- outcome: Executable scenario "reservationHasExpired.check returns true for pending with past expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-042-reservation-has-expired-check-returns-true-for-non-pending-statuses.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-042-reservation-has-expired-check-returns-true-for-non-pending-statuses.sdp.md new file mode 100644 index 00000000..04fce13c --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-042-reservation-has-expired-check-returns-true-for-non-pending-statuses.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-has-expired-check-returns-true-for-non-pending-statuses +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationHasExpired.check returns true for non-pending statuses + +## Intent + +- outcome: Executable scenario "reservationHasExpired.check returns true for non-pending statuses" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-043-reservation-has-expired-check-returns-false-for-pending-with-future-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-043-reservation-has-expired-check-returns-false-for-pending-with-future-expiry.sdp.md new file mode 100644 index 00000000..e48b8843 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-043-reservation-has-expired-check-returns-false-for-pending-with-future-expiry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-has-expired-check-returns-false-for-pending-with-future-expiry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationHasExpired.check returns false for pending with future expiry + +## Intent + +- outcome: Executable scenario "reservationHasExpired.check returns false for pending with future expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-044-reservation-has-expired-assert-passes-for-pending-with-past-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-044-reservation-has-expired-assert-passes-for-pending-with-past-expiry.sdp.md new file mode 100644 index 00000000..d1f9011b --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-044-reservation-has-expired-assert-passes-for-pending-with-past-expiry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-has-expired-assert-passes-for-pending-with-past-expiry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationHasExpired.assert passes for pending with past expiry + +## Intent + +- outcome: Executable scenario "reservationHasExpired.assert passes for pending with past expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-045-reservation-has-expired-assert-passes-for-confirmed-regardless-of-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-045-reservation-has-expired-assert-passes-for-confirmed-regardless-of-expiry.sdp.md new file mode 100644 index 00000000..55b291b0 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-045-reservation-has-expired-assert-passes-for-confirmed-regardless-of-expiry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-has-expired-assert-passes-for-confirmed-regardless-of-expiry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationHasExpired.assert passes for confirmed regardless of expiry + +## Intent + +- outcome: Executable scenario "reservationHasExpired.assert passes for confirmed regardless of expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-046-reservation-has-expired-assert-throws-reservation-not-expired-for-pending.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-046-reservation-has-expired-assert-throws-reservation-not-expired-for-pending.sdp.md new file mode 100644 index 00000000..7acb2596 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-046-reservation-has-expired-assert-throws-reservation-not-expired-for-pending.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-has-expired-assert-throws-reservation-not-expired-for-pending-with-f +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationHasExpired.assert throws RESERVATION_NOT_EXPIRED for pending with future expiry + +## Intent + +- outcome: Executable scenario "reservationHasExpired.assert throws RESERVATION_NOT_EXPIRED for pending with future expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-047-reservation-has-expired-validate-returns-valid-for-expired-reservation.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-047-reservation-has-expired-validate-returns-valid-for-expired-reservation.sdp.md new file mode 100644 index 00000000..ac79e0bd --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-047-reservation-has-expired-validate-returns-valid-for-expired-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-has-expired-validate-returns-valid-for-expired-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationHasExpired.validate returns valid for expired reservation + +## Intent + +- outcome: Executable scenario "reservationHasExpired.validate returns valid for expired reservation" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-048-reservation-has-expired-validate-returns-invalid-for-pending-with-future-e.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-048-reservation-has-expired-validate-returns-invalid-for-pending-with-future-e.sdp.md new file mode 100644 index 00000000..f6f18135 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-048-reservation-has-expired-validate-returns-invalid-for-pending-with-future-e.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.reservation-has-expired-validate-returns-invalid-for-pending-with-future-expiry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# reservationHasExpired.validate returns invalid for pending with future expiry + +## Intent + +- outcome: Executable scenario "reservationHasExpired.validate returns invalid for pending with future expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-049-confirm-reservation-invariants-check-all-returns-true-for-pending-and-not.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-049-confirm-reservation-invariants-check-all-returns-true-for-pending-and-not.sdp.md new file mode 100644 index 00000000..704ab575 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-049-confirm-reservation-invariants-check-all-returns-true-for-pending-and-not.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.confirm-reservation-invariants-check-all-returns-true-for-pending-and-not-expire +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# confirmReservationInvariants.checkAll returns true for pending and not expired + +## Intent + +- outcome: Executable scenario "confirmReservationInvariants.checkAll returns true for pending and not expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-050-confirm-reservation-invariants-check-all-returns-false-for-confirmed-and-n.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-050-confirm-reservation-invariants-check-all-returns-false-for-confirmed-and-n.sdp.md new file mode 100644 index 00000000..24a5adc4 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-050-confirm-reservation-invariants-check-all-returns-false-for-confirmed-and-n.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.confirm-reservation-invariants-check-all-returns-false-for-confirmed-and-not-exp +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# confirmReservationInvariants.checkAll returns false for confirmed and not expired + +## Intent + +- outcome: Executable scenario "confirmReservationInvariants.checkAll returns false for confirmed and not expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-051-confirm-reservation-invariants-check-all-returns-false-for-pending-and-exp.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-051-confirm-reservation-invariants-check-all-returns-false-for-pending-and-exp.sdp.md new file mode 100644 index 00000000..dd510dc9 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-051-confirm-reservation-invariants-check-all-returns-false-for-pending-and-exp.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.confirm-reservation-invariants-check-all-returns-false-for-pending-and-expired +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# confirmReservationInvariants.checkAll returns false for pending and expired + +## Intent + +- outcome: Executable scenario "confirmReservationInvariants.checkAll returns false for pending and expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-052-confirm-reservation-invariants-assert-all-passes-for-pending-and-not-expir.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-052-confirm-reservation-invariants-assert-all-passes-for-pending-and-not-expir.sdp.md new file mode 100644 index 00000000..54e6eb2b --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-052-confirm-reservation-invariants-assert-all-passes-for-pending-and-not-expir.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.confirm-reservation-invariants-assert-all-passes-for-pending-and-not-expired +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# confirmReservationInvariants.assertAll passes for pending and not expired + +## Intent + +- outcome: Executable scenario "confirmReservationInvariants.assertAll passes for pending and not expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-053-confirm-reservation-invariants-assert-all-throws-reservation-not-pending-f.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-053-confirm-reservation-invariants-assert-all-throws-reservation-not-pending-f.sdp.md new file mode 100644 index 00000000..77b289a2 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-053-confirm-reservation-invariants-assert-all-throws-reservation-not-pending-f.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.confirm-reservation-invariants-assert-all-throws-reservation-not-pending-for-con +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# confirmReservationInvariants.assertAll throws RESERVATION_NOT_PENDING for confirmed + +## Intent + +- outcome: Executable scenario "confirmReservationInvariants.assertAll throws RESERVATION_NOT_PENDING for confirmed" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-054-confirm-reservation-invariants-assert-all-throws-reservation-expired-for-p.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-054-confirm-reservation-invariants-assert-all-throws-reservation-expired-for-p.sdp.md new file mode 100644 index 00000000..960b2279 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-054-confirm-reservation-invariants-assert-all-throws-reservation-expired-for-p.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.confirm-reservation-invariants-assert-all-throws-reservation-expired-for-pending +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# confirmReservationInvariants.assertAll throws RESERVATION_EXPIRED for pending and expired + +## Intent + +- outcome: Executable scenario "confirmReservationInvariants.assertAll throws RESERVATION_EXPIRED for pending and expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-055-confirm-reservation-invariants-validate-all-returns-valid-for-pending-and.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-055-confirm-reservation-invariants-validate-all-returns-valid-for-pending-and.sdp.md new file mode 100644 index 00000000..a33fdecc --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-055-confirm-reservation-invariants-validate-all-returns-valid-for-pending-and.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.confirm-reservation-invariants-validate-all-returns-valid-for-pending-and-not-ex +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# confirmReservationInvariants.validateAll returns valid for pending and not expired + +## Intent + +- outcome: Executable scenario "confirmReservationInvariants.validateAll returns valid for pending and not expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-056-confirm-reservation-invariants-validate-all-returns-single-violation-for-c.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-056-confirm-reservation-invariants-validate-all-returns-single-violation-for-c.sdp.md new file mode 100644 index 00000000..64dd460b --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-056-confirm-reservation-invariants-validate-all-returns-single-violation-for-c.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.confirm-reservation-invariants-validate-all-returns-single-violation-for-confirm +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# confirmReservationInvariants.validateAll returns single violation for confirmed and not expired + +## Intent + +- outcome: Executable scenario "confirmReservationInvariants.validateAll returns single violation for confirmed and not expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-057-confirm-reservation-invariants-validate-all-returns-violation-for-pending.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-057-confirm-reservation-invariants-validate-all-returns-violation-for-pending.sdp.md new file mode 100644 index 00000000..21c7eb7a --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-057-confirm-reservation-invariants-validate-all-returns-violation-for-pending.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.confirm-reservation-invariants-validate-all-returns-violation-for-pending-and-ex +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# confirmReservationInvariants.validateAll returns violation for pending and expired + +## Intent + +- outcome: Executable scenario "confirmReservationInvariants.validateAll returns violation for pending and expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-058-expire-reservation-invariants-check-all-returns-true-for-pending-and-expir.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-058-expire-reservation-invariants-check-all-returns-true-for-pending-and-expir.sdp.md new file mode 100644 index 00000000..14a5004b --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-058-expire-reservation-invariants-check-all-returns-true-for-pending-and-expir.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.expire-reservation-invariants-check-all-returns-true-for-pending-and-expired +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# expireReservationInvariants.checkAll returns true for pending and expired + +## Intent + +- outcome: Executable scenario "expireReservationInvariants.checkAll returns true for pending and expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-059-expire-reservation-invariants-check-all-returns-false-for-confirmed-and-ex.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-059-expire-reservation-invariants-check-all-returns-false-for-confirmed-and-ex.sdp.md new file mode 100644 index 00000000..c41f0817 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-059-expire-reservation-invariants-check-all-returns-false-for-confirmed-and-ex.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.expire-reservation-invariants-check-all-returns-false-for-confirmed-and-expired +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# expireReservationInvariants.checkAll returns false for confirmed and expired + +## Intent + +- outcome: Executable scenario "expireReservationInvariants.checkAll returns false for confirmed and expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-060-expire-reservation-invariants-check-all-returns-false-for-pending-and-not.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-060-expire-reservation-invariants-check-all-returns-false-for-pending-and-not.sdp.md new file mode 100644 index 00000000..b46c55f6 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-060-expire-reservation-invariants-check-all-returns-false-for-pending-and-not.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.expire-reservation-invariants-check-all-returns-false-for-pending-and-not-expire +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# expireReservationInvariants.checkAll returns false for pending and not expired + +## Intent + +- outcome: Executable scenario "expireReservationInvariants.checkAll returns false for pending and not expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-061-expire-reservation-invariants-assert-all-passes-for-pending-and-expired.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-061-expire-reservation-invariants-assert-all-passes-for-pending-and-expired.sdp.md new file mode 100644 index 00000000..3a229118 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-061-expire-reservation-invariants-assert-all-passes-for-pending-and-expired.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.expire-reservation-invariants-assert-all-passes-for-pending-and-expired +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# expireReservationInvariants.assertAll passes for pending and expired + +## Intent + +- outcome: Executable scenario "expireReservationInvariants.assertAll passes for pending and expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-062-expire-reservation-invariants-assert-all-throws-reservation-not-pending-fo.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-062-expire-reservation-invariants-assert-all-throws-reservation-not-pending-fo.sdp.md new file mode 100644 index 00000000..43c4d9b9 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-062-expire-reservation-invariants-assert-all-throws-reservation-not-pending-fo.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.expire-reservation-invariants-assert-all-throws-reservation-not-pending-for-conf +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# expireReservationInvariants.assertAll throws RESERVATION_NOT_PENDING for confirmed + +## Intent + +- outcome: Executable scenario "expireReservationInvariants.assertAll throws RESERVATION_NOT_PENDING for confirmed" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-063-expire-reservation-invariants-assert-all-throws-reservation-not-expired-fo.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-063-expire-reservation-invariants-assert-all-throws-reservation-not-expired-fo.sdp.md new file mode 100644 index 00000000..0384cd98 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-063-expire-reservation-invariants-assert-all-throws-reservation-not-expired-fo.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.expire-reservation-invariants-assert-all-throws-reservation-not-expired-for-pend +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# expireReservationInvariants.assertAll throws RESERVATION_NOT_EXPIRED for pending and not expired + +## Intent + +- outcome: Executable scenario "expireReservationInvariants.assertAll throws RESERVATION_NOT_EXPIRED for pending and not expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-064-expire-reservation-invariants-validate-all-returns-valid-for-pending-and-e.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-064-expire-reservation-invariants-validate-all-returns-valid-for-pending-and-e.sdp.md new file mode 100644 index 00000000..11ede76f --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-064-expire-reservation-invariants-validate-all-returns-valid-for-pending-and-e.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.expire-reservation-invariants-validate-all-returns-valid-for-pending-and-expired +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# expireReservationInvariants.validateAll returns valid for pending and expired + +## Intent + +- outcome: Executable scenario "expireReservationInvariants.validateAll returns valid for pending and expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-065-expire-reservation-invariants-validate-all-returns-single-violation-for-re.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-065-expire-reservation-invariants-validate-all-returns-single-violation-for-re.sdp.md new file mode 100644 index 00000000..b1dacf0d --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-065-expire-reservation-invariants-validate-all-returns-single-violation-for-re.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.expire-reservation-invariants-validate-all-returns-single-violation-for-released +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# expireReservationInvariants.validateAll returns single violation for released and expired + +## Intent + +- outcome: Executable scenario "expireReservationInvariants.validateAll returns single violation for released and expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-066-expire-reservation-invariants-validate-all-returns-single-violation-for-pe.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-066-expire-reservation-invariants-validate-all-returns-single-violation-for-pe.sdp.md new file mode 100644 index 00000000..12986624 --- /dev/null +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-066-expire-reservation-invariants-validate-all-returns-single-violation-for-pe.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reservation-invariants.expire-reservation-invariants-validate-all-returns-single-violation-for-pending +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reservation-invariants +--- +# expireReservationInvariants.validateAll returns single violation for pending and not expired + +## Intent + +- outcome: Executable scenario "expireReservationInvariants.validateAll returns single violation for pending and not expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature diff --git a/specs/behavior/order-management/inventory/reserve-stock.examples/s-001-successfully-reserve-available-stock.sdp.md b/specs/behavior/order-management/inventory/reserve-stock.examples/s-001-successfully-reserve-available-stock.sdp.md new file mode 100644 index 00000000..1d91ce63 --- /dev/null +++ b/specs/behavior/order-management/inventory/reserve-stock.examples/s-001-successfully-reserve-available-stock.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reserve-stock.successfully-reserve-available-stock +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reserve-stock +--- +# Successfully reserve available stock + +## Intent + +- outcome: Executable scenario "Successfully reserve available stock" from examples/order-management/tests/features/behavior/inventory/reserve-stock.feature diff --git a/specs/behavior/order-management/inventory/reserve-stock.examples/s-002-reserve-multiple-items-atomically.sdp.md b/specs/behavior/order-management/inventory/reserve-stock.examples/s-002-reserve-multiple-items-atomically.sdp.md new file mode 100644 index 00000000..4cc1edbf --- /dev/null +++ b/specs/behavior/order-management/inventory/reserve-stock.examples/s-002-reserve-multiple-items-atomically.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reserve-stock.reserve-multiple-items-atomically +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reserve-stock +--- +# Reserve multiple items atomically + +## Intent + +- outcome: Executable scenario "Reserve multiple items atomically" from examples/order-management/tests/features/behavior/inventory/reserve-stock.feature diff --git a/specs/behavior/order-management/inventory/reserve-stock.examples/s-003-reservation-fails-when-insufficient-stock.sdp.md b/specs/behavior/order-management/inventory/reserve-stock.examples/s-003-reservation-fails-when-insufficient-stock.sdp.md new file mode 100644 index 00000000..2e279dc6 --- /dev/null +++ b/specs/behavior/order-management/inventory/reserve-stock.examples/s-003-reservation-fails-when-insufficient-stock.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reserve-stock.reservation-fails-when-insufficient-stock +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reserve-stock +--- +# Reservation fails when insufficient stock + +## Intent + +- outcome: Executable scenario "Reservation fails when insufficient stock" from examples/order-management/tests/features/behavior/inventory/reserve-stock.feature diff --git a/specs/behavior/order-management/inventory/reserve-stock.examples/s-004-multi-item-reservation-is-all-or-nothing.sdp.md b/specs/behavior/order-management/inventory/reserve-stock.examples/s-004-multi-item-reservation-is-all-or-nothing.sdp.md new file mode 100644 index 00000000..49af2ac2 --- /dev/null +++ b/specs/behavior/order-management/inventory/reserve-stock.examples/s-004-multi-item-reservation-is-all-or-nothing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reserve-stock.multi-item-reservation-is-all-or-nothing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reserve-stock +--- +# Multi-item reservation is all-or-nothing + +## Intent + +- outcome: Executable scenario "Multi-item reservation is all-or-nothing" from examples/order-management/tests/features/behavior/inventory/reserve-stock.feature diff --git a/specs/behavior/order-management/inventory/reserve-stock.examples/s-005-cannot-reserve-non-existent-product.sdp.md b/specs/behavior/order-management/inventory/reserve-stock.examples/s-005-cannot-reserve-non-existent-product.sdp.md new file mode 100644 index 00000000..8581a114 --- /dev/null +++ b/specs/behavior/order-management/inventory/reserve-stock.examples/s-005-cannot-reserve-non-existent-product.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reserve-stock.cannot-reserve-non-existent-product +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reserve-stock +--- +# Cannot reserve non-existent product + +## Intent + +- outcome: Executable scenario "Cannot reserve non-existent product" from examples/order-management/tests/features/behavior/inventory/reserve-stock.feature diff --git a/specs/behavior/order-management/inventory/reserve-stock.examples/s-006-reserve-stock-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/inventory/reserve-stock.examples/s-006-reserve-stock-is-idempotent-with-same-command-id.sdp.md new file mode 100644 index 00000000..a418fb95 --- /dev/null +++ b/specs/behavior/order-management/inventory/reserve-stock.examples/s-006-reserve-stock-is-idempotent-with-same-command-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.reserve-stock.reserve-stock-is-idempotent-with-same-command-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.reserve-stock +--- +# ReserveStock is idempotent with same commandId + +## Intent + +- outcome: Executable scenario "ReserveStock is idempotent with same commandId" from examples/order-management/tests/features/behavior/inventory/reserve-stock.feature diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-001-passes-when-stock-is-sufficient.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-001-passes-when-stock-is-sufficient.sdp.md new file mode 100644 index 00000000..a4adbbf8 --- /dev/null +++ b/specs/behavior/order-management/inventory/stock-invariants.examples/s-001-passes-when-stock-is-sufficient.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.stock-invariants.passes-when-stock-is-sufficient +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.stock-invariants +--- +# passes when stock is sufficient + +## Intent + +- outcome: Executable scenario "passes when stock is sufficient" from examples/order-management/tests/features/behavior/inventory/stock-invariants.feature diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-002-passes-when-requesting-exact-available-quantity.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-002-passes-when-requesting-exact-available-quantity.sdp.md new file mode 100644 index 00000000..a162a2b9 --- /dev/null +++ b/specs/behavior/order-management/inventory/stock-invariants.examples/s-002-passes-when-requesting-exact-available-quantity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.stock-invariants.passes-when-requesting-exact-available-quantity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.stock-invariants +--- +# passes when requesting exact available quantity + +## Intent + +- outcome: Executable scenario "passes when requesting exact available quantity" from examples/order-management/tests/features/behavior/inventory/stock-invariants.feature diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-003-throws-insufficient-stock-when-stock-is-not-enough.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-003-throws-insufficient-stock-when-stock-is-not-enough.sdp.md new file mode 100644 index 00000000..1ce0bd9e --- /dev/null +++ b/specs/behavior/order-management/inventory/stock-invariants.examples/s-003-throws-insufficient-stock-when-stock-is-not-enough.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.stock-invariants.throws-insufficient-stock-when-stock-is-not-enough +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.stock-invariants +--- +# throws INSUFFICIENT_STOCK when stock is not enough + +## Intent + +- outcome: Executable scenario "throws INSUFFICIENT_STOCK when stock is not enough" from examples/order-management/tests/features/behavior/inventory/stock-invariants.feature diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-004-throws-insufficient-stock-when-stock-is-zero.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-004-throws-insufficient-stock-when-stock-is-zero.sdp.md new file mode 100644 index 00000000..bc6053bf --- /dev/null +++ b/specs/behavior/order-management/inventory/stock-invariants.examples/s-004-throws-insufficient-stock-when-stock-is-zero.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.stock-invariants.throws-insufficient-stock-when-stock-is-zero +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.stock-invariants +--- +# throws INSUFFICIENT_STOCK when stock is zero + +## Intent + +- outcome: Executable scenario "throws INSUFFICIENT_STOCK when stock is zero" from examples/order-management/tests/features/behavior/inventory/stock-invariants.feature diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-005-returns-available-when-stock-is-sufficient.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-005-returns-available-when-stock-is-sufficient.sdp.md new file mode 100644 index 00000000..65f95fbd --- /dev/null +++ b/specs/behavior/order-management/inventory/stock-invariants.examples/s-005-returns-available-when-stock-is-sufficient.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.stock-invariants.returns-available-when-stock-is-sufficient +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.stock-invariants +--- +# returns available when stock is sufficient + +## Intent + +- outcome: Executable scenario "returns available when stock is sufficient" from examples/order-management/tests/features/behavior/inventory/stock-invariants.feature diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-006-returns-available-when-requesting-exact-amount.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-006-returns-available-when-requesting-exact-amount.sdp.md new file mode 100644 index 00000000..bc52df0c --- /dev/null +++ b/specs/behavior/order-management/inventory/stock-invariants.examples/s-006-returns-available-when-requesting-exact-amount.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.stock-invariants.returns-available-when-requesting-exact-amount +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.stock-invariants +--- +# returns available when requesting exact amount + +## Intent + +- outcome: Executable scenario "returns available when requesting exact amount" from examples/order-management/tests/features/behavior/inventory/stock-invariants.feature diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-007-returns-unavailable-with-deficit-when-stock-is-insufficient.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-007-returns-unavailable-with-deficit-when-stock-is-insufficient.sdp.md new file mode 100644 index 00000000..ad16f903 --- /dev/null +++ b/specs/behavior/order-management/inventory/stock-invariants.examples/s-007-returns-unavailable-with-deficit-when-stock-is-insufficient.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.stock-invariants.returns-unavailable-with-deficit-when-stock-is-insufficient +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.stock-invariants +--- +# returns unavailable with deficit when stock is insufficient + +## Intent + +- outcome: Executable scenario "returns unavailable with deficit when stock is insufficient" from examples/order-management/tests/features/behavior/inventory/stock-invariants.feature diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-008-returns-correct-deficit-for-zero-stock.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-008-returns-correct-deficit-for-zero-stock.sdp.md new file mode 100644 index 00000000..6dfb7768 --- /dev/null +++ b/specs/behavior/order-management/inventory/stock-invariants.examples/s-008-returns-correct-deficit-for-zero-stock.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.inventory.stock-invariants.returns-correct-deficit-for-zero-stock +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.inventory.stock-invariants +--- +# returns correct deficit for zero stock + +## Intent + +- outcome: Executable scenario "returns correct deficit for zero stock" from examples/order-management/tests/features/behavior/inventory/stock-invariants.feature diff --git a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-001-multi-product-order-uses-dcb-for-atomic-reservation.sdp.md b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-001-multi-product-order-uses-dcb-for-atomic-reservation.sdp.md new file mode 100644 index 00000000..d63793f2 --- /dev/null +++ b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-001-multi-product-order-uses-dcb-for-atomic-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.dcb-multi-product-reservation.multi-product-order-uses-dcb-for-atomic-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.modernization.dcb-multi-product-reservation +--- +# Multi-product order uses DCB for atomic reservation + +## Intent + +- outcome: Executable scenario "Multi-product order uses DCB for atomic reservation" from examples/order-management/tests/features/modernization/dcb-multi-product-reservation.feature diff --git a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-002-insufficient-inventory-for-one-product-rejects-entire-reservation.sdp.md b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-002-insufficient-inventory-for-one-product-rejects-entire-reservation.sdp.md new file mode 100644 index 00000000..69d6678f --- /dev/null +++ b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-002-insufficient-inventory-for-one-product-rejects-entire-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.dcb-multi-product-reservation.insufficient-inventory-for-one-product-rejects-entire-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.modernization.dcb-multi-product-reservation +--- +# Insufficient inventory for one product rejects entire reservation + +## Intent + +- outcome: Executable scenario "Insufficient inventory for one product rejects entire reservation" from examples/order-management/tests/features/modernization/dcb-multi-product-reservation.feature diff --git a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-003-dcb-handles-concurrent-reservation-conflicts.sdp.md b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-003-dcb-handles-concurrent-reservation-conflicts.sdp.md new file mode 100644 index 00000000..ee83b40c --- /dev/null +++ b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-003-dcb-handles-concurrent-reservation-conflicts.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.dcb-multi-product-reservation.dcb-handles-concurrent-reservation-conflicts +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.modernization.dcb-multi-product-reservation +--- +# DCB handles concurrent reservation conflicts + +## Intent + +- outcome: Executable scenario "DCB handles concurrent reservation conflicts" from examples/order-management/tests/features/modernization/dcb-multi-product-reservation.feature diff --git a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-004-duplicate-product-i-ds-are-rejected.sdp.md b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-004-duplicate-product-i-ds-are-rejected.sdp.md new file mode 100644 index 00000000..2ea0d463 --- /dev/null +++ b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-004-duplicate-product-i-ds-are-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.dcb-multi-product-reservation.duplicate-product-i-ds-are-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.modernization.dcb-multi-product-reservation +--- +# Duplicate product IDs are rejected + +## Intent + +- outcome: Executable scenario "Duplicate product IDs are rejected" from examples/order-management/tests/features/modernization/dcb-multi-product-reservation.feature diff --git a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-001-order-submitted-includes-customer-snapshot.sdp.md b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-001-order-submitted-includes-customer-snapshot.sdp.md new file mode 100644 index 00000000..d5fcb8df --- /dev/null +++ b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-001-order-submitted-includes-customer-snapshot.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.fat-events-order-submitted.order-submitted-includes-customer-snapshot +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.modernization.fat-events-order-submitted +--- +# OrderSubmitted includes customer snapshot + +## Intent + +- outcome: Executable scenario "OrderSubmitted includes customer snapshot" from examples/order-management/tests/features/modernization/fat-events-order-submitted.feature diff --git a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-002-event-enrichment-does-not-block-order-submission.sdp.md b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-002-event-enrichment-does-not-block-order-submission.sdp.md new file mode 100644 index 00000000..f68a7fb5 --- /dev/null +++ b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-002-event-enrichment-does-not-block-order-submission.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.fat-events-order-submitted.event-enrichment-does-not-block-order-submission +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.modernization.fat-events-order-submitted +--- +# Event enrichment does not block order submission + +## Intent + +- outcome: Executable scenario "Event enrichment does not block order submission" from examples/order-management/tests/features/modernization/fat-events-order-submitted.feature diff --git a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-003-customer-snapshot-is-immutable-in-event.sdp.md b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-003-customer-snapshot-is-immutable-in-event.sdp.md new file mode 100644 index 00000000..9dde7dae --- /dev/null +++ b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-003-customer-snapshot-is-immutable-in-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.fat-events-order-submitted.customer-snapshot-is-immutable-in-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.modernization.fat-events-order-submitted +--- +# Customer snapshot is immutable in event + +## Intent + +- outcome: Executable scenario "Customer snapshot is immutable in event" from examples/order-management/tests/features/modernization/fat-events-order-submitted.feature diff --git a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-004-missing-customer-data-handled-gracefully.sdp.md b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-004-missing-customer-data-handled-gracefully.sdp.md new file mode 100644 index 00000000..db10bb97 --- /dev/null +++ b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-004-missing-customer-data-handled-gracefully.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.fat-events-order-submitted.missing-customer-data-handled-gracefully +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.modernization.fat-events-order-submitted +--- +# Missing customer data handled gracefully + +## Intent + +- outcome: Executable scenario "Missing customer data handled gracefully" from examples/order-management/tests/features/modernization/fat-events-order-submitted.feature diff --git a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-005-v1-events-are-upcasted-to-v2-with-null-customer.sdp.md b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-005-v1-events-are-upcasted-to-v2-with-null-customer.sdp.md new file mode 100644 index 00000000..20052bbb --- /dev/null +++ b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-005-v1-events-are-upcasted-to-v2-with-null-customer.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.fat-events-order-submitted.v1-events-are-upcasted-to-v2-with-null-customer +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.modernization.fat-events-order-submitted +--- +# V1 events are upcasted to V2 with null customer + +## Intent + +- outcome: Executable scenario "V1 events are upcasted to V2 with null customer" from examples/order-management/tests/features/modernization/fat-events-order-submitted.feature diff --git a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-006-v2-events-are-not-modified-by-upcaster.sdp.md b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-006-v2-events-are-not-modified-by-upcaster.sdp.md new file mode 100644 index 00000000..d3db3fce --- /dev/null +++ b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-006-v2-events-are-not-modified-by-upcaster.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.fat-events-order-submitted.v2-events-are-not-modified-by-upcaster +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.modernization.fat-events-order-submitted +--- +# V2 events are not modified by upcaster + +## Intent + +- outcome: Executable scenario "V2 events are not modified by upcaster" from examples/order-management/tests/features/modernization/fat-events-order-submitted.feature diff --git a/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-001-order-detail-view-shows-instant-updates.sdp.md b/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-001-order-detail-view-shows-instant-updates.sdp.md new file mode 100644 index 00000000..20cb7c68 --- /dev/null +++ b/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-001-order-detail-view-shows-instant-updates.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.reactive-order-detail.order-detail-view-shows-instant-updates +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.modernization.reactive-order-detail +--- +# Order detail view shows instant updates + +## Intent + +- outcome: Executable scenario "Order detail view shows instant updates" from examples/order-management/tests/features/modernization/reactive-order-detail.feature diff --git a/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-002-multiple-rapid-updates-are-applied-correctly.sdp.md b/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-002-multiple-rapid-updates-are-applied-correctly.sdp.md new file mode 100644 index 00000000..1a90aa5e --- /dev/null +++ b/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-002-multiple-rapid-updates-are-applied-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.reactive-order-detail.multiple-rapid-updates-are-applied-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.modernization.reactive-order-detail +--- +# Multiple rapid updates are applied correctly + +## Intent + +- outcome: Executable scenario "Multiple rapid updates are applied correctly" from examples/order-management/tests/features/modernization/reactive-order-detail.feature diff --git a/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-003-optimistic-update-rolls-back-on-conflict.sdp.md b/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-003-optimistic-update-rolls-back-on-conflict.sdp.md new file mode 100644 index 00000000..c947df82 --- /dev/null +++ b/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-003-optimistic-update-rolls-back-on-conflict.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.reactive-order-detail.optimistic-update-rolls-back-on-conflict +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.modernization.reactive-order-detail +--- +# Optimistic update rolls back on conflict + +## Intent + +- outcome: Executable scenario "Optimistic update rolls back on conflict" from examples/order-management/tests/features/modernization/reactive-order-detail.feature diff --git a/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-004-stale-event-stream-is-handled-gracefully.sdp.md b/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-004-stale-event-stream-is-handled-gracefully.sdp.md new file mode 100644 index 00000000..0cc921cc --- /dev/null +++ b/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-004-stale-event-stream-is-handled-gracefully.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.reactive-order-detail.stale-event-stream-is-handled-gracefully +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.modernization.reactive-order-detail +--- +# Stale event stream is handled gracefully + +## Intent + +- outcome: Executable scenario "Stale event stream is handled gracefully" from examples/order-management/tests/features/modernization/reactive-order-detail.feature diff --git a/specs/behavior/order-management/modernization/reference-documentation.examples/s-001-readme-has-reference-implementation-designation.sdp.md b/specs/behavior/order-management/modernization/reference-documentation.examples/s-001-readme-has-reference-implementation-designation.sdp.md new file mode 100644 index 00000000..498866a9 --- /dev/null +++ b/specs/behavior/order-management/modernization/reference-documentation.examples/s-001-readme-has-reference-implementation-designation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.reference-documentation.readme-has-reference-implementation-designation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.modernization.reference-documentation +--- +# README has Reference Implementation designation + +## Intent + +- outcome: Executable scenario "README has Reference Implementation designation" from examples/order-management/tests/features/modernization/reference-documentation.feature diff --git a/specs/behavior/order-management/modernization/reference-documentation.examples/s-002-all-demonstrated-patterns-are-cataloged.sdp.md b/specs/behavior/order-management/modernization/reference-documentation.examples/s-002-all-demonstrated-patterns-are-cataloged.sdp.md new file mode 100644 index 00000000..699bca3a --- /dev/null +++ b/specs/behavior/order-management/modernization/reference-documentation.examples/s-002-all-demonstrated-patterns-are-cataloged.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.reference-documentation.all-demonstrated-patterns-are-cataloged +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.modernization.reference-documentation +--- +# All demonstrated patterns are cataloged + +## Intent + +- outcome: Executable scenario "All demonstrated patterns are cataloged" from examples/order-management/tests/features/modernization/reference-documentation.feature diff --git a/specs/behavior/order-management/modernization/reference-documentation.examples/s-003-pattern-links-are-valid.sdp.md b/specs/behavior/order-management/modernization/reference-documentation.examples/s-003-pattern-links-are-valid.sdp.md new file mode 100644 index 00000000..3a469989 --- /dev/null +++ b/specs/behavior/order-management/modernization/reference-documentation.examples/s-003-pattern-links-are-valid.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.reference-documentation.pattern-links-are-valid +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.modernization.reference-documentation +--- +# Pattern links are valid + +## Intent + +- outcome: Executable scenario "Pattern links are valid" from examples/order-management/tests/features/modernization/reference-documentation.feature diff --git a/specs/behavior/order-management/modernization/reference-documentation.examples/s-004-architecture-diagram-is-present.sdp.md b/specs/behavior/order-management/modernization/reference-documentation.examples/s-004-architecture-diagram-is-present.sdp.md new file mode 100644 index 00000000..0759c401 --- /dev/null +++ b/specs/behavior/order-management/modernization/reference-documentation.examples/s-004-architecture-diagram-is-present.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.modernization.reference-documentation.architecture-diagram-is-present +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.modernization.reference-documentation +--- +# Architecture diagram is present + +## Intent + +- outcome: Executable scenario "Architecture diagram is present" from examples/order-management/tests/features/modernization/reference-documentation.feature diff --git a/specs/behavior/order-management/orders/add-items.examples/s-001-add-single-item-to-empty-draft-order.sdp.md b/specs/behavior/order-management/orders/add-items.examples/s-001-add-single-item-to-empty-draft-order.sdp.md new file mode 100644 index 00000000..b91a0f37 --- /dev/null +++ b/specs/behavior/order-management/orders/add-items.examples/s-001-add-single-item-to-empty-draft-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.add-items.add-single-item-to-empty-draft-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.add-items +--- +# Add single item to empty draft order + +## Intent + +- outcome: Executable scenario "Add single item to empty draft order" from examples/order-management/tests/features/behavior/orders/add-items.feature diff --git a/specs/behavior/order-management/orders/add-items.examples/s-002-add-multiple-items-to-draft-order.sdp.md b/specs/behavior/order-management/orders/add-items.examples/s-002-add-multiple-items-to-draft-order.sdp.md new file mode 100644 index 00000000..92888f25 --- /dev/null +++ b/specs/behavior/order-management/orders/add-items.examples/s-002-add-multiple-items-to-draft-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.add-items.add-multiple-items-to-draft-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.add-items +--- +# Add multiple items to draft order + +## Intent + +- outcome: Executable scenario "Add multiple items to draft order" from examples/order-management/tests/features/behavior/orders/add-items.feature diff --git a/specs/behavior/order-management/orders/add-items.examples/s-003-cannot-add-items-to-submitted-order.sdp.md b/specs/behavior/order-management/orders/add-items.examples/s-003-cannot-add-items-to-submitted-order.sdp.md new file mode 100644 index 00000000..89ded015 --- /dev/null +++ b/specs/behavior/order-management/orders/add-items.examples/s-003-cannot-add-items-to-submitted-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.add-items.cannot-add-items-to-submitted-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.add-items +--- +# Cannot add items to submitted order + +## Intent + +- outcome: Executable scenario "Cannot add items to submitted order" from examples/order-management/tests/features/behavior/orders/add-items.feature diff --git a/specs/behavior/order-management/orders/add-items.examples/s-004-cannot-add-items-to-cancelled-order.sdp.md b/specs/behavior/order-management/orders/add-items.examples/s-004-cannot-add-items-to-cancelled-order.sdp.md new file mode 100644 index 00000000..1b941428 --- /dev/null +++ b/specs/behavior/order-management/orders/add-items.examples/s-004-cannot-add-items-to-cancelled-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.add-items.cannot-add-items-to-cancelled-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.add-items +--- +# Cannot add items to cancelled order + +## Intent + +- outcome: Executable scenario "Cannot add items to cancelled order" from examples/order-management/tests/features/behavior/orders/add-items.feature diff --git a/specs/behavior/order-management/orders/add-items.examples/s-005-cannot-add-item-with-zero-quantity.sdp.md b/specs/behavior/order-management/orders/add-items.examples/s-005-cannot-add-item-with-zero-quantity.sdp.md new file mode 100644 index 00000000..c3163a0c --- /dev/null +++ b/specs/behavior/order-management/orders/add-items.examples/s-005-cannot-add-item-with-zero-quantity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.add-items.cannot-add-item-with-zero-quantity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.add-items +--- +# Cannot add item with zero quantity + +## Intent + +- outcome: Executable scenario "Cannot add item with zero quantity" from examples/order-management/tests/features/behavior/orders/add-items.feature diff --git a/specs/behavior/order-management/orders/add-items.examples/s-006-cannot-add-item-with-negative-quantity.sdp.md b/specs/behavior/order-management/orders/add-items.examples/s-006-cannot-add-item-with-negative-quantity.sdp.md new file mode 100644 index 00000000..d1f9543e --- /dev/null +++ b/specs/behavior/order-management/orders/add-items.examples/s-006-cannot-add-item-with-negative-quantity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.add-items.cannot-add-item-with-negative-quantity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.add-items +--- +# Cannot add item with negative quantity + +## Intent + +- outcome: Executable scenario "Cannot add item with negative quantity" from examples/order-management/tests/features/behavior/orders/add-items.feature diff --git a/specs/behavior/order-management/orders/add-items.examples/s-007-cannot-add-item-with-negative-price.sdp.md b/specs/behavior/order-management/orders/add-items.examples/s-007-cannot-add-item-with-negative-price.sdp.md new file mode 100644 index 00000000..1bec579c --- /dev/null +++ b/specs/behavior/order-management/orders/add-items.examples/s-007-cannot-add-item-with-negative-price.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.add-items.cannot-add-item-with-negative-price +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.add-items +--- +# Cannot add item with negative price + +## Intent + +- outcome: Executable scenario "Cannot add item with negative price" from examples/order-management/tests/features/behavior/orders/add-items.feature diff --git a/specs/behavior/order-management/orders/cancel-order.examples/s-001-cancel-draft-order.sdp.md b/specs/behavior/order-management/orders/cancel-order.examples/s-001-cancel-draft-order.sdp.md new file mode 100644 index 00000000..9675f52c --- /dev/null +++ b/specs/behavior/order-management/orders/cancel-order.examples/s-001-cancel-draft-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.cancel-order.cancel-draft-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.cancel-order +--- +# Cancel draft order + +## Intent + +- outcome: Executable scenario "Cancel draft order" from examples/order-management/tests/features/behavior/orders/cancel-order.feature diff --git a/specs/behavior/order-management/orders/cancel-order.examples/s-002-cancel-submitted-order.sdp.md b/specs/behavior/order-management/orders/cancel-order.examples/s-002-cancel-submitted-order.sdp.md new file mode 100644 index 00000000..7b2ef432 --- /dev/null +++ b/specs/behavior/order-management/orders/cancel-order.examples/s-002-cancel-submitted-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.cancel-order.cancel-submitted-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.cancel-order +--- +# Cancel submitted order + +## Intent + +- outcome: Executable scenario "Cancel submitted order" from examples/order-management/tests/features/behavior/orders/cancel-order.feature diff --git a/specs/behavior/order-management/orders/cancel-order.examples/s-003-cannot-cancel-already-cancelled-order.sdp.md b/specs/behavior/order-management/orders/cancel-order.examples/s-003-cannot-cancel-already-cancelled-order.sdp.md new file mode 100644 index 00000000..497cab74 --- /dev/null +++ b/specs/behavior/order-management/orders/cancel-order.examples/s-003-cannot-cancel-already-cancelled-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.cancel-order.cannot-cancel-already-cancelled-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.cancel-order +--- +# Cannot cancel already cancelled order + +## Intent + +- outcome: Executable scenario "Cannot cancel already cancelled order" from examples/order-management/tests/features/behavior/orders/cancel-order.feature diff --git a/specs/behavior/order-management/orders/cancel-order.examples/s-004-cancel-confirmed-order.sdp.md b/specs/behavior/order-management/orders/cancel-order.examples/s-004-cancel-confirmed-order.sdp.md new file mode 100644 index 00000000..2f1bc3d7 --- /dev/null +++ b/specs/behavior/order-management/orders/cancel-order.examples/s-004-cancel-confirmed-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.cancel-order.cancel-confirmed-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.cancel-order +--- +# Cancel confirmed order + +## Intent + +- outcome: Executable scenario "Cancel confirmed order" from examples/order-management/tests/features/behavior/orders/cancel-order.feature diff --git a/specs/behavior/order-management/orders/cancel-order.examples/s-005-cannot-cancel-non-existent-order.sdp.md b/specs/behavior/order-management/orders/cancel-order.examples/s-005-cannot-cancel-non-existent-order.sdp.md new file mode 100644 index 00000000..e174f925 --- /dev/null +++ b/specs/behavior/order-management/orders/cancel-order.examples/s-005-cannot-cancel-non-existent-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.cancel-order.cannot-cancel-non-existent-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.cancel-order +--- +# Cannot cancel non-existent order + +## Intent + +- outcome: Executable scenario "Cannot cancel non-existent order" from examples/order-management/tests/features/behavior/orders/cancel-order.feature diff --git a/specs/behavior/order-management/orders/cancel-order.examples/s-006-cancel-order-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/orders/cancel-order.examples/s-006-cancel-order-is-idempotent-with-same-command-id.sdp.md new file mode 100644 index 00000000..5fe319dc --- /dev/null +++ b/specs/behavior/order-management/orders/cancel-order.examples/s-006-cancel-order-is-idempotent-with-same-command-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.cancel-order.cancel-order-is-idempotent-with-same-command-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.cancel-order +--- +# CancelOrder is idempotent with same commandId + +## Intent + +- outcome: Executable scenario "CancelOrder is idempotent with same commandId" from examples/order-management/tests/features/behavior/orders/cancel-order.feature diff --git a/specs/behavior/order-management/orders/confirm-order.examples/s-001-successfully-confirm-a-submitted-order.sdp.md b/specs/behavior/order-management/orders/confirm-order.examples/s-001-successfully-confirm-a-submitted-order.sdp.md new file mode 100644 index 00000000..f7d11acb --- /dev/null +++ b/specs/behavior/order-management/orders/confirm-order.examples/s-001-successfully-confirm-a-submitted-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.confirm-order.successfully-confirm-a-submitted-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.confirm-order +--- +# Successfully confirm a submitted order + +## Intent + +- outcome: Executable scenario "Successfully confirm a submitted order" from examples/order-management/tests/features/behavior/orders/confirm-order.feature diff --git a/specs/behavior/order-management/orders/confirm-order.examples/s-002-cannot-confirm-a-draft-order.sdp.md b/specs/behavior/order-management/orders/confirm-order.examples/s-002-cannot-confirm-a-draft-order.sdp.md new file mode 100644 index 00000000..903f52b0 --- /dev/null +++ b/specs/behavior/order-management/orders/confirm-order.examples/s-002-cannot-confirm-a-draft-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.confirm-order.cannot-confirm-a-draft-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.confirm-order +--- +# Cannot confirm a draft order + +## Intent + +- outcome: Executable scenario "Cannot confirm a draft order" from examples/order-management/tests/features/behavior/orders/confirm-order.feature diff --git a/specs/behavior/order-management/orders/confirm-order.examples/s-003-cannot-confirm-an-already-confirmed-order.sdp.md b/specs/behavior/order-management/orders/confirm-order.examples/s-003-cannot-confirm-an-already-confirmed-order.sdp.md new file mode 100644 index 00000000..d6aa247e --- /dev/null +++ b/specs/behavior/order-management/orders/confirm-order.examples/s-003-cannot-confirm-an-already-confirmed-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.confirm-order.cannot-confirm-an-already-confirmed-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.confirm-order +--- +# Cannot confirm an already confirmed order + +## Intent + +- outcome: Executable scenario "Cannot confirm an already confirmed order" from examples/order-management/tests/features/behavior/orders/confirm-order.feature diff --git a/specs/behavior/order-management/orders/confirm-order.examples/s-004-cannot-confirm-a-cancelled-order.sdp.md b/specs/behavior/order-management/orders/confirm-order.examples/s-004-cannot-confirm-a-cancelled-order.sdp.md new file mode 100644 index 00000000..96947261 --- /dev/null +++ b/specs/behavior/order-management/orders/confirm-order.examples/s-004-cannot-confirm-a-cancelled-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.confirm-order.cannot-confirm-a-cancelled-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.confirm-order +--- +# Cannot confirm a cancelled order + +## Intent + +- outcome: Executable scenario "Cannot confirm a cancelled order" from examples/order-management/tests/features/behavior/orders/confirm-order.feature diff --git a/specs/behavior/order-management/orders/confirm-order.examples/s-005-cannot-confirm-a-non-existent-order.sdp.md b/specs/behavior/order-management/orders/confirm-order.examples/s-005-cannot-confirm-a-non-existent-order.sdp.md new file mode 100644 index 00000000..4e71e200 --- /dev/null +++ b/specs/behavior/order-management/orders/confirm-order.examples/s-005-cannot-confirm-a-non-existent-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.confirm-order.cannot-confirm-a-non-existent-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.confirm-order +--- +# Cannot confirm a non-existent order + +## Intent + +- outcome: Executable scenario "Cannot confirm a non-existent order" from examples/order-management/tests/features/behavior/orders/confirm-order.feature diff --git a/specs/behavior/order-management/orders/confirm-order.examples/s-006-confirm-order-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/orders/confirm-order.examples/s-006-confirm-order-is-idempotent-with-same-command-id.sdp.md new file mode 100644 index 00000000..64d136b6 --- /dev/null +++ b/specs/behavior/order-management/orders/confirm-order.examples/s-006-confirm-order-is-idempotent-with-same-command-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.confirm-order.confirm-order-is-idempotent-with-same-command-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.confirm-order +--- +# ConfirmOrder is idempotent with same commandId + +## Intent + +- outcome: Executable scenario "ConfirmOrder is idempotent with same commandId" from examples/order-management/tests/features/behavior/orders/confirm-order.feature diff --git a/specs/behavior/order-management/orders/create-order.examples/s-001-successfully-create-a-new-order.sdp.md b/specs/behavior/order-management/orders/create-order.examples/s-001-successfully-create-a-new-order.sdp.md new file mode 100644 index 00000000..e0c190e3 --- /dev/null +++ b/specs/behavior/order-management/orders/create-order.examples/s-001-successfully-create-a-new-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.create-order.successfully-create-a-new-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.create-order +--- +# Successfully create a new order + +## Intent + +- outcome: Executable scenario "Successfully create a new order" from examples/order-management/tests/features/behavior/orders/create-order.feature diff --git a/specs/behavior/order-management/orders/create-order.examples/s-002-cannot-create-order-with-existing-id.sdp.md b/specs/behavior/order-management/orders/create-order.examples/s-002-cannot-create-order-with-existing-id.sdp.md new file mode 100644 index 00000000..90b0f38c --- /dev/null +++ b/specs/behavior/order-management/orders/create-order.examples/s-002-cannot-create-order-with-existing-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.create-order.cannot-create-order-with-existing-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.create-order +--- +# Cannot create order with existing ID + +## Intent + +- outcome: Executable scenario "Cannot create order with existing ID" from examples/order-management/tests/features/behavior/orders/create-order.feature diff --git a/specs/behavior/order-management/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md new file mode 100644 index 00000000..1fc4b104 --- /dev/null +++ b/specs/behavior/order-management/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.create-order.create-order-is-idempotent-with-same-command-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.create-order +--- +# CreateOrder is idempotent with same commandId + +## Intent + +- outcome: Executable scenario "CreateOrder is idempotent with same commandId" from examples/order-management/tests/features/behavior/orders/create-order.feature diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-001-empty-items-array-returns-zero.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-001-empty-items-array-returns-zero.sdp.md new file mode 100644 index 00000000..9cb83f0d --- /dev/null +++ b/specs/behavior/order-management/orders/order-domain.examples/s-001-empty-items-array-returns-zero.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-domain.empty-items-array-returns-zero +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-domain +--- +# Empty items array returns zero + +## Intent + +- outcome: Executable scenario "Empty items array returns zero" from examples/order-management/tests/features/behavior/orders/order-domain.feature diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-002-single-item-total.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-002-single-item-total.sdp.md new file mode 100644 index 00000000..1f09e44b --- /dev/null +++ b/specs/behavior/order-management/orders/order-domain.examples/s-002-single-item-total.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-domain.single-item-total +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-domain +--- +# Single item total + +## Intent + +- outcome: Executable scenario "Single item total" from examples/order-management/tests/features/behavior/orders/order-domain.feature diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-003-multiple-items-total.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-003-multiple-items-total.sdp.md new file mode 100644 index 00000000..bc21284c --- /dev/null +++ b/specs/behavior/order-management/orders/order-domain.examples/s-003-multiple-items-total.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-domain.multiple-items-total +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-domain +--- +# Multiple items total + +## Intent + +- outcome: Executable scenario "Multiple items total" from examples/order-management/tests/features/behavior/orders/order-domain.feature diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-004-zero-quantity-results-in-zero-contribution.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-004-zero-quantity-results-in-zero-contribution.sdp.md new file mode 100644 index 00000000..0181d62e --- /dev/null +++ b/specs/behavior/order-management/orders/order-domain.examples/s-004-zero-quantity-results-in-zero-contribution.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-domain.zero-quantity-results-in-zero-contribution +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-domain +--- +# Zero quantity results in zero contribution + +## Intent + +- outcome: Executable scenario "Zero quantity results in zero contribution" from examples/order-management/tests/features/behavior/orders/order-domain.feature diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-005-zero-price-results-in-zero-contribution.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-005-zero-price-results-in-zero-contribution.sdp.md new file mode 100644 index 00000000..027d90ae --- /dev/null +++ b/specs/behavior/order-management/orders/order-domain.examples/s-005-zero-price-results-in-zero-contribution.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-domain.zero-price-results-in-zero-contribution +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-domain +--- +# Zero price results in zero contribution + +## Intent + +- outcome: Executable scenario "Zero price results in zero contribution" from examples/order-management/tests/features/behavior/orders/order-domain.feature diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-006-decimal-prices-are-handled-correctly.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-006-decimal-prices-are-handled-correctly.sdp.md new file mode 100644 index 00000000..67052900 --- /dev/null +++ b/specs/behavior/order-management/orders/order-domain.examples/s-006-decimal-prices-are-handled-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-domain.decimal-prices-are-handled-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-domain +--- +# Decimal prices are handled correctly + +## Intent + +- outcome: Executable scenario "Decimal prices are handled correctly" from examples/order-management/tests/features/behavior/orders/order-domain.feature diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-007-cms-is-created-with-the-provided-order-id-and-customer-id.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-007-cms-is-created-with-the-provided-order-id-and-customer-id.sdp.md new file mode 100644 index 00000000..0eccb2ce --- /dev/null +++ b/specs/behavior/order-management/orders/order-domain.examples/s-007-cms-is-created-with-the-provided-order-id-and-customer-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-domain.cms-is-created-with-the-provided-order-id-and-customer-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-domain +--- +# CMS is created with the provided orderId and customerId + +## Intent + +- outcome: Executable scenario "CMS is created with the provided orderId and customerId" from examples/order-management/tests/features/behavior/orders/order-domain.feature diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-008-cms-initializes-with-draft-status.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-008-cms-initializes-with-draft-status.sdp.md new file mode 100644 index 00000000..e0f3348e --- /dev/null +++ b/specs/behavior/order-management/orders/order-domain.examples/s-008-cms-initializes-with-draft-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-domain.cms-initializes-with-draft-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-domain +--- +# CMS initializes with draft status + +## Intent + +- outcome: Executable scenario "CMS initializes with draft status" from examples/order-management/tests/features/behavior/orders/order-domain.feature diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-009-cms-initializes-with-empty-items-array.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-009-cms-initializes-with-empty-items-array.sdp.md new file mode 100644 index 00000000..00f29bf5 --- /dev/null +++ b/specs/behavior/order-management/orders/order-domain.examples/s-009-cms-initializes-with-empty-items-array.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-domain.cms-initializes-with-empty-items-array +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-domain +--- +# CMS initializes with empty items array + +## Intent + +- outcome: Executable scenario "CMS initializes with empty items array" from examples/order-management/tests/features/behavior/orders/order-domain.feature diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-010-cms-initializes-with-zero-total-amount.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-010-cms-initializes-with-zero-total-amount.sdp.md new file mode 100644 index 00000000..a72028eb --- /dev/null +++ b/specs/behavior/order-management/orders/order-domain.examples/s-010-cms-initializes-with-zero-total-amount.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-domain.cms-initializes-with-zero-total-amount +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-domain +--- +# CMS initializes with zero totalAmount + +## Intent + +- outcome: Executable scenario "CMS initializes with zero totalAmount" from examples/order-management/tests/features/behavior/orders/order-domain.feature diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-011-cms-initializes-with-version-0.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-011-cms-initializes-with-version-0.sdp.md new file mode 100644 index 00000000..182d2df0 --- /dev/null +++ b/specs/behavior/order-management/orders/order-domain.examples/s-011-cms-initializes-with-version-0.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-domain.cms-initializes-with-version-0 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-domain +--- +# CMS initializes with version 0 + +## Intent + +- outcome: Executable scenario "CMS initializes with version 0" from examples/order-management/tests/features/behavior/orders/order-domain.feature diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-012-cms-initializes-with-current-state-version.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-012-cms-initializes-with-current-state-version.sdp.md new file mode 100644 index 00000000..f03b2e93 --- /dev/null +++ b/specs/behavior/order-management/orders/order-domain.examples/s-012-cms-initializes-with-current-state-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-domain.cms-initializes-with-current-state-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-domain +--- +# CMS initializes with current state version + +## Intent + +- outcome: Executable scenario "CMS initializes with current state version" from examples/order-management/tests/features/behavior/orders/order-domain.feature diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-013-cms-sets-created-at-and-updated-at-to-current-timestamp.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-013-cms-sets-created-at-and-updated-at-to-current-timestamp.sdp.md new file mode 100644 index 00000000..14d24d14 --- /dev/null +++ b/specs/behavior/order-management/orders/order-domain.examples/s-013-cms-sets-created-at-and-updated-at-to-current-timestamp.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-domain.cms-sets-created-at-and-updated-at-to-current-timestamp +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-domain +--- +# CMS sets createdAt and updatedAt to current timestamp + +## Intent + +- outcome: Executable scenario "CMS sets createdAt and updatedAt to current timestamp" from examples/order-management/tests/features/behavior/orders/order-domain.feature diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-014-cms-already-at-current-version-is-returned-unchanged.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-014-cms-already-at-current-version-is-returned-unchanged.sdp.md new file mode 100644 index 00000000..53af95d5 --- /dev/null +++ b/specs/behavior/order-management/orders/order-domain.examples/s-014-cms-already-at-current-version-is-returned-unchanged.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-domain.cms-already-at-current-version-is-returned-unchanged +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-domain +--- +# CMS already at current version is returned unchanged + +## Intent + +- outcome: Executable scenario "CMS already at current version is returned unchanged" from examples/order-management/tests/features/behavior/orders/order-domain.feature diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-015-cms-with-missing-state-version-is-upgraded.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-015-cms-with-missing-state-version-is-upgraded.sdp.md new file mode 100644 index 00000000..742ff198 --- /dev/null +++ b/specs/behavior/order-management/orders/order-domain.examples/s-015-cms-with-missing-state-version-is-upgraded.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-domain.cms-with-missing-state-version-is-upgraded +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-domain +--- +# CMS with missing stateVersion is upgraded + +## Intent + +- outcome: Executable scenario "CMS with missing stateVersion is upgraded" from examples/order-management/tests/features/behavior/orders/order-domain.feature diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-016-cms-with-state-version-0-is-upgraded.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-016-cms-with-state-version-0-is-upgraded.sdp.md new file mode 100644 index 00000000..1eec1ed9 --- /dev/null +++ b/specs/behavior/order-management/orders/order-domain.examples/s-016-cms-with-state-version-0-is-upgraded.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-domain.cms-with-state-version-0-is-upgraded +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-domain +--- +# CMS with stateVersion 0 is upgraded + +## Intent + +- outcome: Executable scenario "CMS with stateVersion 0 is upgraded" from examples/order-management/tests/features/behavior/orders/order-domain.feature diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-017-all-fields-are-preserved-during-upcast.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-017-all-fields-are-preserved-during-upcast.sdp.md new file mode 100644 index 00000000..7f33f9ba --- /dev/null +++ b/specs/behavior/order-management/orders/order-domain.examples/s-017-all-fields-are-preserved-during-upcast.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-domain.all-fields-are-preserved-during-upcast +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-domain +--- +# All fields are preserved during upcast + +## Intent + +- outcome: Executable scenario "All fields are preserved during upcast" from examples/order-management/tests/features/behavior/orders/order-domain.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-001-check-all-returns-true-for-draft-order-with-items.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-001-check-all-returns-true-for-draft-order-with-items.sdp.md new file mode 100644 index 00000000..7800209b --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-001-check-all-returns-true-for-draft-order-with-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.check-all-returns-true-for-draft-order-with-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# checkAll returns true for draft order with items + +## Intent + +- outcome: Executable scenario "checkAll returns true for draft order with items" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-002-check-all-returns-false-for-non-draft-order-with-items.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-002-check-all-returns-false-for-non-draft-order-with-items.sdp.md new file mode 100644 index 00000000..8a4ef968 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-002-check-all-returns-false-for-non-draft-order-with-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.check-all-returns-false-for-non-draft-order-with-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# checkAll returns false for non-draft order with items + +## Intent + +- outcome: Executable scenario "checkAll returns false for non-draft order with items" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-003-check-all-returns-false-for-draft-order-without-items.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-003-check-all-returns-false-for-draft-order-without-items.sdp.md new file mode 100644 index 00000000..96add58b --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-003-check-all-returns-false-for-draft-order-without-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.check-all-returns-false-for-draft-order-without-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# checkAll returns false for draft order without items + +## Intent + +- outcome: Executable scenario "checkAll returns false for draft order without items" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-004-assert-all-does-not-throw-for-valid-draft-order-with-items.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-004-assert-all-does-not-throw-for-valid-draft-order-with-items.sdp.md new file mode 100644 index 00000000..7c8696a3 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-004-assert-all-does-not-throw-for-valid-draft-order-with-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.assert-all-does-not-throw-for-valid-draft-order-with-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# assertAll does not throw for valid draft order with items + +## Intent + +- outcome: Executable scenario "assertAll does not throw for valid draft order with items" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-005-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-005-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md new file mode 100644 index 00000000..6503e364 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-005-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# assertAll throws ORDER_NOT_IN_DRAFT for submitted order (fail-fast) + +## Intent + +- outcome: Executable scenario "assertAll throws ORDER_NOT_IN_DRAFT for submitted order (fail-fast)" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-006-assert-all-throws-order-has-no-items-for-draft-order-with-no-items.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-006-assert-all-throws-order-has-no-items-for-draft-order-with-no-items.sdp.md new file mode 100644 index 00000000..24c5f9e3 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-006-assert-all-throws-order-has-no-items-for-draft-order-with-no-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.assert-all-throws-order-has-no-items-for-draft-order-with-no-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# assertAll throws ORDER_HAS_NO_ITEMS for draft order with no items + +## Intent + +- outcome: Executable scenario "assertAll throws ORDER_HAS_NO_ITEMS for draft order with no items" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-007-validate-all-returns-valid-result-for-draft-order-with-items.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-007-validate-all-returns-valid-result-for-draft-order-with-items.sdp.md new file mode 100644 index 00000000..58c2a7a7 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-007-validate-all-returns-valid-result-for-draft-order-with-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.validate-all-returns-valid-result-for-draft-order-with-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# validateAll returns valid result for draft order with items + +## Intent + +- outcome: Executable scenario "validateAll returns valid result for draft order with items" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-008-validate-all-returns-both-violations-for-submitted-order-with-no-items.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-008-validate-all-returns-both-violations-for-submitted-order-with-no-items.sdp.md new file mode 100644 index 00000000..ac314458 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-008-validate-all-returns-both-violations-for-submitted-order-with-no-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.validate-all-returns-both-violations-for-submitted-order-with-no-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# validateAll returns both violations for submitted order with no items + +## Intent + +- outcome: Executable scenario "validateAll returns both violations for submitted order with no items" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-009-check-all-returns-true-for-draft-order-under-item-limit.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-009-check-all-returns-true-for-draft-order-under-item-limit.sdp.md new file mode 100644 index 00000000..be5595ec --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-009-check-all-returns-true-for-draft-order-under-item-limit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.check-all-returns-true-for-draft-order-under-item-limit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# checkAll returns true for draft order under item limit + +## Intent + +- outcome: Executable scenario "checkAll returns true for draft order under item limit" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-010-check-all-returns-false-for-non-draft-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-010-check-all-returns-false-for-non-draft-order.sdp.md new file mode 100644 index 00000000..bf8023bd --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-010-check-all-returns-false-for-non-draft-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.check-all-returns-false-for-non-draft-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# checkAll returns false for non-draft order + +## Intent + +- outcome: Executable scenario "checkAll returns false for non-draft order" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-011-check-all-returns-false-for-draft-order-at-max-capacity.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-011-check-all-returns-false-for-draft-order-at-max-capacity.sdp.md new file mode 100644 index 00000000..1e5fc2ef --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-011-check-all-returns-false-for-draft-order-at-max-capacity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.check-all-returns-false-for-draft-order-at-max-capacity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# checkAll returns false for draft order at max capacity + +## Intent + +- outcome: Executable scenario "checkAll returns false for draft order at max capacity" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-012-assert-all-does-not-throw-for-valid-draft-order-under-limit.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-012-assert-all-does-not-throw-for-valid-draft-order-under-limit.sdp.md new file mode 100644 index 00000000..1e69bff8 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-012-assert-all-does-not-throw-for-valid-draft-order-under-limit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.assert-all-does-not-throw-for-valid-draft-order-under-limit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# assertAll does not throw for valid draft order under limit + +## Intent + +- outcome: Executable scenario "assertAll does not throw for valid draft order under limit" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-013-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-013-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md new file mode 100644 index 00000000..0a23c54f --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-013-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast-2 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# assertAll throws ORDER_NOT_IN_DRAFT for submitted order (fail-fast) + +## Intent + +- outcome: Executable scenario "assertAll throws ORDER_NOT_IN_DRAFT for submitted order (fail-fast)" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-014-assert-all-throws-max-items-exceeded-for-draft-order-at-capacity.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-014-assert-all-throws-max-items-exceeded-for-draft-order-at-capacity.sdp.md new file mode 100644 index 00000000..226ba0e2 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-014-assert-all-throws-max-items-exceeded-for-draft-order-at-capacity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.assert-all-throws-max-items-exceeded-for-draft-order-at-capacity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# assertAll throws MAX_ITEMS_EXCEEDED for draft order at capacity + +## Intent + +- outcome: Executable scenario "assertAll throws MAX_ITEMS_EXCEEDED for draft order at capacity" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-015-validate-all-returns-valid-result-for-draft-order-under-limit.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-015-validate-all-returns-valid-result-for-draft-order-under-limit.sdp.md new file mode 100644 index 00000000..c3d22a9f --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-015-validate-all-returns-valid-result-for-draft-order-under-limit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.validate-all-returns-valid-result-for-draft-order-under-limit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# validateAll returns valid result for draft order under limit + +## Intent + +- outcome: Executable scenario "validateAll returns valid result for draft order under limit" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-016-validate-all-returns-both-violations-for-submitted-order-at-capacity.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-016-validate-all-returns-both-violations-for-submitted-order-at-capacity.sdp.md new file mode 100644 index 00000000..7a47e659 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-016-validate-all-returns-both-violations-for-submitted-order-at-capacity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.validate-all-returns-both-violations-for-submitted-order-at-capacity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# validateAll returns both violations for submitted order at capacity + +## Intent + +- outcome: Executable scenario "validateAll returns both violations for submitted order at capacity" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-017-check-all-returns-expected-for-status-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-017-check-all-returns-expected-for-status-order.sdp.md new file mode 100644 index 00000000..75b8421c --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-017-check-all-returns-expected-for-status-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.check-all-returns-expected-for-status-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# checkAll returns expected for status order + +## Intent + +- outcome: Executable scenario "checkAll returns expected for status order" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-018-assert-all-does-not-throw-for-draft-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-018-assert-all-does-not-throw-for-draft-order.sdp.md new file mode 100644 index 00000000..f87060d5 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-018-assert-all-does-not-throw-for-draft-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.assert-all-does-not-throw-for-draft-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# assertAll does not throw for draft order + +## Intent + +- outcome: Executable scenario "assertAll does not throw for draft order" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-019-assert-all-does-not-throw-for-submitted-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-019-assert-all-does-not-throw-for-submitted-order.sdp.md new file mode 100644 index 00000000..8b6fb918 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-019-assert-all-does-not-throw-for-submitted-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.assert-all-does-not-throw-for-submitted-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# assertAll does not throw for submitted order + +## Intent + +- outcome: Executable scenario "assertAll does not throw for submitted order" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-020-assert-all-throws-order-already-confirmed-for-confirmed-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-020-assert-all-throws-order-already-confirmed-for-confirmed-order.sdp.md new file mode 100644 index 00000000..36fe925c --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-020-assert-all-throws-order-already-confirmed-for-confirmed-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.assert-all-throws-order-already-confirmed-for-confirmed-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# assertAll throws ORDER_ALREADY_CONFIRMED for confirmed order + +## Intent + +- outcome: Executable scenario "assertAll throws ORDER_ALREADY_CONFIRMED for confirmed order" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-021-assert-all-throws-order-already-cancelled-for-cancelled-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-021-assert-all-throws-order-already-cancelled-for-cancelled-order.sdp.md new file mode 100644 index 00000000..efeb07d3 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-021-assert-all-throws-order-already-cancelled-for-cancelled-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.assert-all-throws-order-already-cancelled-for-cancelled-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# assertAll throws ORDER_ALREADY_CANCELLED for cancelled order + +## Intent + +- outcome: Executable scenario "assertAll throws ORDER_ALREADY_CANCELLED for cancelled order" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-022-validate-all-returns-valid-result-for-draft-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-022-validate-all-returns-valid-result-for-draft-order.sdp.md new file mode 100644 index 00000000..b196f82f --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-022-validate-all-returns-valid-result-for-draft-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.validate-all-returns-valid-result-for-draft-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# validateAll returns valid result for draft order + +## Intent + +- outcome: Executable scenario "validateAll returns valid result for draft order" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-023-validate-all-returns-single-violation-for-confirmed-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-023-validate-all-returns-single-violation-for-confirmed-order.sdp.md new file mode 100644 index 00000000..e72d03da --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-023-validate-all-returns-single-violation-for-confirmed-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.validate-all-returns-single-violation-for-confirmed-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# validateAll returns single violation for confirmed order + +## Intent + +- outcome: Executable scenario "validateAll returns single violation for confirmed order" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-024-validate-all-returns-single-violation-for-cancelled-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-024-validate-all-returns-single-violation-for-cancelled-order.sdp.md new file mode 100644 index 00000000..9b736e9d --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-024-validate-all-returns-single-violation-for-cancelled-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariant-sets.validate-all-returns-single-violation-for-cancelled-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariant-sets +--- +# validateAll returns single violation for cancelled order + +## Intent + +- outcome: Executable scenario "validateAll returns single violation for cancelled order" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-001-passes-for-a-valid-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-001-passes-for-a-valid-order.sdp.md new file mode 100644 index 00000000..1a5c5ef6 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-001-passes-for-a-valid-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.passes-for-a-valid-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# passes for a valid order + +## Intent + +- outcome: Executable scenario "passes for a valid order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-002-throws-order-not-found-for-null-order-reference.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-002-throws-order-not-found-for-null-order-reference.sdp.md new file mode 100644 index 00000000..ace8fe54 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-002-throws-order-not-found-for-null-order-reference.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.throws-order-not-found-for-null-order-reference +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# throws ORDER_NOT_FOUND for null order reference + +## Intent + +- outcome: Executable scenario "throws ORDER_NOT_FOUND for null order reference" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-003-throws-order-not-found-for-undefined-order-reference.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-003-throws-order-not-found-for-undefined-order-reference.sdp.md new file mode 100644 index 00000000..e7f961e5 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-003-throws-order-not-found-for-undefined-order-reference.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.throws-order-not-found-for-undefined-order-reference +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# throws ORDER_NOT_FOUND for undefined order reference + +## Intent + +- outcome: Executable scenario "throws ORDER_NOT_FOUND for undefined order reference" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-004-passes-for-null-order-reference.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-004-passes-for-null-order-reference.sdp.md new file mode 100644 index 00000000..d2a76e09 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-004-passes-for-null-order-reference.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.passes-for-null-order-reference +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# passes for null order reference + +## Intent + +- outcome: Executable scenario "passes for null order reference" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-005-passes-for-undefined-order-reference.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-005-passes-for-undefined-order-reference.sdp.md new file mode 100644 index 00000000..d4bd6232 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-005-passes-for-undefined-order-reference.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.passes-for-undefined-order-reference +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# passes for undefined order reference + +## Intent + +- outcome: Executable scenario "passes for undefined order reference" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-006-throws-order-already-exists-for-existing-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-006-throws-order-already-exists-for-existing-order.sdp.md new file mode 100644 index 00000000..98d5c323 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-006-throws-order-already-exists-for-existing-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.throws-order-already-exists-for-existing-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# throws ORDER_ALREADY_EXISTS for existing order + +## Intent + +- outcome: Executable scenario "throws ORDER_ALREADY_EXISTS for existing order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-007-check-returns-true-for-draft-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-007-check-returns-true-for-draft-order.sdp.md new file mode 100644 index 00000000..55113ea6 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-007-check-returns-true-for-draft-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.check-returns-true-for-draft-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# check returns true for draft order + +## Intent + +- outcome: Executable scenario "check returns true for draft order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-008-check-returns-false-for-submitted-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-008-check-returns-false-for-submitted-order.sdp.md new file mode 100644 index 00000000..49360b25 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-008-check-returns-false-for-submitted-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.check-returns-false-for-submitted-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# check returns false for submitted order + +## Intent + +- outcome: Executable scenario "check returns false for submitted order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-009-assert-passes-for-draft-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-009-assert-passes-for-draft-order.sdp.md new file mode 100644 index 00000000..a483f559 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-009-assert-passes-for-draft-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.assert-passes-for-draft-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# assert passes for draft order + +## Intent + +- outcome: Executable scenario "assert passes for draft order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-010-assert-throws-order-not-in-draft-for-non-draft-statuses.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-010-assert-throws-order-not-in-draft-for-non-draft-statuses.sdp.md new file mode 100644 index 00000000..208d2006 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-010-assert-throws-order-not-in-draft-for-non-draft-statuses.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.assert-throws-order-not-in-draft-for-non-draft-statuses +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# assert throws ORDER_NOT_IN_DRAFT for non-draft statuses + +## Intent + +- outcome: Executable scenario "assert throws ORDER_NOT_IN_DRAFT for non-draft statuses" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-011-check-returns-true-for-submitted-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-011-check-returns-true-for-submitted-order.sdp.md new file mode 100644 index 00000000..09c81111 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-011-check-returns-true-for-submitted-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.check-returns-true-for-submitted-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# check returns true for submitted order + +## Intent + +- outcome: Executable scenario "check returns true for submitted order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-012-check-returns-false-for-draft-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-012-check-returns-false-for-draft-order.sdp.md new file mode 100644 index 00000000..0235a4a0 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-012-check-returns-false-for-draft-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.check-returns-false-for-draft-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# check returns false for draft order + +## Intent + +- outcome: Executable scenario "check returns false for draft order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-013-assert-passes-for-submitted-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-013-assert-passes-for-submitted-order.sdp.md new file mode 100644 index 00000000..26855a26 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-013-assert-passes-for-submitted-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.assert-passes-for-submitted-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# assert passes for submitted order + +## Intent + +- outcome: Executable scenario "assert passes for submitted order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-014-assert-throws-order-not-submitted-for-non-submitted-statuses.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-014-assert-throws-order-not-submitted-for-non-submitted-statuses.sdp.md new file mode 100644 index 00000000..ce4ecf54 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-014-assert-throws-order-not-submitted-for-non-submitted-statuses.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.assert-throws-order-not-submitted-for-non-submitted-statuses +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# assert throws ORDER_NOT_SUBMITTED for non-submitted statuses + +## Intent + +- outcome: Executable scenario "assert throws ORDER_NOT_SUBMITTED for non-submitted statuses" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-015-check-returns-true-for-draft-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-015-check-returns-true-for-draft-order.sdp.md new file mode 100644 index 00000000..7bb73bbd --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-015-check-returns-true-for-draft-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.check-returns-true-for-draft-order-2 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# check returns true for draft order + +## Intent + +- outcome: Executable scenario "check returns true for draft order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-016-check-returns-true-for-submitted-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-016-check-returns-true-for-submitted-order.sdp.md new file mode 100644 index 00000000..ed0f980d --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-016-check-returns-true-for-submitted-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.check-returns-true-for-submitted-order-2 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# check returns true for submitted order + +## Intent + +- outcome: Executable scenario "check returns true for submitted order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-017-check-returns-false-for-cancelled-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-017-check-returns-false-for-cancelled-order.sdp.md new file mode 100644 index 00000000..c26afaca --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-017-check-returns-false-for-cancelled-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.check-returns-false-for-cancelled-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# check returns false for cancelled order + +## Intent + +- outcome: Executable scenario "check returns false for cancelled order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-018-assert-passes-for-draft-order-not-cancelled.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-018-assert-passes-for-draft-order-not-cancelled.sdp.md new file mode 100644 index 00000000..3281d22f --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-018-assert-passes-for-draft-order-not-cancelled.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.assert-passes-for-draft-order-not-cancelled +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# assert passes for draft order (not cancelled) + +## Intent + +- outcome: Executable scenario "assert passes for draft order (not cancelled)" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-019-assert-passes-for-confirmed-order-not-cancelled.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-019-assert-passes-for-confirmed-order-not-cancelled.sdp.md new file mode 100644 index 00000000..546a5d02 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-019-assert-passes-for-confirmed-order-not-cancelled.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.assert-passes-for-confirmed-order-not-cancelled +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# assert passes for confirmed order (not cancelled) + +## Intent + +- outcome: Executable scenario "assert passes for confirmed order (not cancelled)" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-020-assert-throws-order-already-cancelled-for-cancelled-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-020-assert-throws-order-already-cancelled-for-cancelled-order.sdp.md new file mode 100644 index 00000000..0a4331cf --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-020-assert-throws-order-already-cancelled-for-cancelled-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.assert-throws-order-already-cancelled-for-cancelled-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# assert throws ORDER_ALREADY_CANCELLED for cancelled order + +## Intent + +- outcome: Executable scenario "assert throws ORDER_ALREADY_CANCELLED for cancelled order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-021-check-returns-true-for-draft-order-not-confirmed.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-021-check-returns-true-for-draft-order-not-confirmed.sdp.md new file mode 100644 index 00000000..012d7a09 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-021-check-returns-true-for-draft-order-not-confirmed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.check-returns-true-for-draft-order-not-confirmed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# check returns true for draft order (not confirmed) + +## Intent + +- outcome: Executable scenario "check returns true for draft order (not confirmed)" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-022-check-returns-true-for-submitted-order-not-confirmed.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-022-check-returns-true-for-submitted-order-not-confirmed.sdp.md new file mode 100644 index 00000000..bb9cfdda --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-022-check-returns-true-for-submitted-order-not-confirmed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.check-returns-true-for-submitted-order-not-confirmed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# check returns true for submitted order (not confirmed) + +## Intent + +- outcome: Executable scenario "check returns true for submitted order (not confirmed)" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-023-check-returns-false-for-confirmed-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-023-check-returns-false-for-confirmed-order.sdp.md new file mode 100644 index 00000000..ebb47e39 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-023-check-returns-false-for-confirmed-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.check-returns-false-for-confirmed-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# check returns false for confirmed order + +## Intent + +- outcome: Executable scenario "check returns false for confirmed order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-024-assert-passes-for-draft-order-not-confirmed.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-024-assert-passes-for-draft-order-not-confirmed.sdp.md new file mode 100644 index 00000000..f49ec2e2 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-024-assert-passes-for-draft-order-not-confirmed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.assert-passes-for-draft-order-not-confirmed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# assert passes for draft order (not confirmed) + +## Intent + +- outcome: Executable scenario "assert passes for draft order (not confirmed)" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-025-assert-passes-for-cancelled-order-not-confirmed.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-025-assert-passes-for-cancelled-order-not-confirmed.sdp.md new file mode 100644 index 00000000..57228321 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-025-assert-passes-for-cancelled-order-not-confirmed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.assert-passes-for-cancelled-order-not-confirmed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# assert passes for cancelled order (not confirmed) + +## Intent + +- outcome: Executable scenario "assert passes for cancelled order (not confirmed)" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-026-assert-throws-order-already-confirmed-for-confirmed-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-026-assert-throws-order-already-confirmed-for-confirmed-order.sdp.md new file mode 100644 index 00000000..931b7ef2 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-026-assert-throws-order-already-confirmed-for-confirmed-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.assert-throws-order-already-confirmed-for-confirmed-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# assert throws ORDER_ALREADY_CONFIRMED for confirmed order + +## Intent + +- outcome: Executable scenario "assert throws ORDER_ALREADY_CONFIRMED for confirmed order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-027-check-returns-true-when-order-has-items.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-027-check-returns-true-when-order-has-items.sdp.md new file mode 100644 index 00000000..86eaef01 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-027-check-returns-true-when-order-has-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.check-returns-true-when-order-has-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# check returns true when order has items + +## Intent + +- outcome: Executable scenario "check returns true when order has items" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-028-check-returns-false-when-order-has-no-items.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-028-check-returns-false-when-order-has-no-items.sdp.md new file mode 100644 index 00000000..7b4f2f77 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-028-check-returns-false-when-order-has-no-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.check-returns-false-when-order-has-no-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# check returns false when order has no items + +## Intent + +- outcome: Executable scenario "check returns false when order has no items" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-029-assert-passes-when-order-has-items.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-029-assert-passes-when-order-has-items.sdp.md new file mode 100644 index 00000000..876598ab --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-029-assert-passes-when-order-has-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.assert-passes-when-order-has-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# assert passes when order has items + +## Intent + +- outcome: Executable scenario "assert passes when order has items" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-030-assert-passes-when-order-has-multiple-items.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-030-assert-passes-when-order-has-multiple-items.sdp.md new file mode 100644 index 00000000..2a41d257 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-030-assert-passes-when-order-has-multiple-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.assert-passes-when-order-has-multiple-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# assert passes when order has multiple items + +## Intent + +- outcome: Executable scenario "assert passes when order has multiple items" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-031-assert-throws-order-has-no-items-for-empty-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-031-assert-throws-order-has-no-items-for-empty-order.sdp.md new file mode 100644 index 00000000..c96de24e --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-031-assert-throws-order-has-no-items-for-empty-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.assert-throws-order-has-no-items-for-empty-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# assert throws ORDER_HAS_NO_ITEMS for empty order + +## Intent + +- outcome: Executable scenario "assert throws ORDER_HAS_NO_ITEMS for empty order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-032-check-returns-true-when-order-has-room-for-items.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-032-check-returns-true-when-order-has-room-for-items.sdp.md new file mode 100644 index 00000000..f45306b0 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-032-check-returns-true-when-order-has-room-for-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.check-returns-true-when-order-has-room-for-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# check returns true when order has room for items + +## Intent + +- outcome: Executable scenario "check returns true when order has room for items" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-033-check-returns-false-when-order-is-at-max-capacity.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-033-check-returns-false-when-order-is-at-max-capacity.sdp.md new file mode 100644 index 00000000..705766b4 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-033-check-returns-false-when-order-is-at-max-capacity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.check-returns-false-when-order-is-at-max-capacity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# check returns false when order is at max capacity + +## Intent + +- outcome: Executable scenario "check returns false when order is at max capacity" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-034-assert-passes-when-order-has-room-for-items.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-034-assert-passes-when-order-has-room-for-items.sdp.md new file mode 100644 index 00000000..52a77bdf --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-034-assert-passes-when-order-has-room-for-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.assert-passes-when-order-has-room-for-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# assert passes when order has room for items + +## Intent + +- outcome: Executable scenario "assert passes when order has room for items" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-035-assert-passes-when-order-is-one-under-max-capacity.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-035-assert-passes-when-order-is-one-under-max-capacity.sdp.md new file mode 100644 index 00000000..85f1d299 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-035-assert-passes-when-order-is-one-under-max-capacity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.assert-passes-when-order-is-one-under-max-capacity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# assert passes when order is one under max capacity + +## Intent + +- outcome: Executable scenario "assert passes when order is one under max capacity" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-036-assert-throws-max-items-exceeded-at-max-capacity.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-036-assert-throws-max-items-exceeded-at-max-capacity.sdp.md new file mode 100644 index 00000000..102015c4 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-036-assert-throws-max-items-exceeded-at-max-capacity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.assert-throws-max-items-exceeded-at-max-capacity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# assert throws MAX_ITEMS_EXCEEDED at max capacity + +## Intent + +- outcome: Executable scenario "assert throws MAX_ITEMS_EXCEEDED at max capacity" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-037-passes-when-item-exists-in-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-037-passes-when-item-exists-in-order.sdp.md new file mode 100644 index 00000000..335f70ca --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-037-passes-when-item-exists-in-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.passes-when-item-exists-in-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# passes when item exists in order + +## Intent + +- outcome: Executable scenario "passes when item exists in order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-038-passes-when-item-is-one-of-many.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-038-passes-when-item-is-one-of-many.sdp.md new file mode 100644 index 00000000..ba6a4641 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-038-passes-when-item-is-one-of-many.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.passes-when-item-is-one-of-many +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# passes when item is one of many + +## Intent + +- outcome: Executable scenario "passes when item is one of many" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-039-throws-item-not-found-when-item-does-not-exist.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-039-throws-item-not-found-when-item-does-not-exist.sdp.md new file mode 100644 index 00000000..c3bc61c8 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-039-throws-item-not-found-when-item-does-not-exist.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.throws-item-not-found-when-item-does-not-exist +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# throws ITEM_NOT_FOUND when item does not exist + +## Intent + +- outcome: Executable scenario "throws ITEM_NOT_FOUND when item does not exist" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-040-throws-item-not-found-when-items-array-is-empty.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-040-throws-item-not-found-when-items-array-is-empty.sdp.md new file mode 100644 index 00000000..fc229bab --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-040-throws-item-not-found-when-items-array-is-empty.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.throws-item-not-found-when-items-array-is-empty +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# throws ITEM_NOT_FOUND when items array is empty + +## Intent + +- outcome: Executable scenario "throws ITEM_NOT_FOUND when items array is empty" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-041-passes-for-valid-item.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-041-passes-for-valid-item.sdp.md new file mode 100644 index 00000000..4ca8e076 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-041-passes-for-valid-item.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.passes-for-valid-item +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# passes for valid item + +## Intent + +- outcome: Executable scenario "passes for valid item" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-042-passes-for-item-with-decimal-price.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-042-passes-for-item-with-decimal-price.sdp.md new file mode 100644 index 00000000..499c615e --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-042-passes-for-item-with-decimal-price.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.passes-for-item-with-decimal-price +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# passes for item with decimal price + +## Intent + +- outcome: Executable scenario "passes for item with decimal price" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-043-passes-for-item-with-zero-price-free-item.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-043-passes-for-item-with-zero-price-free-item.sdp.md new file mode 100644 index 00000000..6c4ed18a --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-043-passes-for-item-with-zero-price-free-item.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.passes-for-item-with-zero-price-free-item +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# passes for item with zero price (free item) + +## Intent + +- outcome: Executable scenario "passes for item with zero price (free item)" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-044-throws-invalid-quantity-for-negative-quantity.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-044-throws-invalid-quantity-for-negative-quantity.sdp.md new file mode 100644 index 00000000..e06e8078 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-044-throws-invalid-quantity-for-negative-quantity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.throws-invalid-quantity-for-negative-quantity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# throws INVALID_QUANTITY for negative quantity + +## Intent + +- outcome: Executable scenario "throws INVALID_QUANTITY for negative quantity" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-045-throws-invalid-quantity-for-zero-quantity.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-045-throws-invalid-quantity-for-zero-quantity.sdp.md new file mode 100644 index 00000000..0753b7cf --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-045-throws-invalid-quantity-for-zero-quantity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.throws-invalid-quantity-for-zero-quantity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# throws INVALID_QUANTITY for zero quantity + +## Intent + +- outcome: Executable scenario "throws INVALID_QUANTITY for zero quantity" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-046-throws-invalid-quantity-for-non-integer-quantity.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-046-throws-invalid-quantity-for-non-integer-quantity.sdp.md new file mode 100644 index 00000000..af3a904c --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-046-throws-invalid-quantity-for-non-integer-quantity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.throws-invalid-quantity-for-non-integer-quantity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# throws INVALID_QUANTITY for non-integer quantity + +## Intent + +- outcome: Executable scenario "throws INVALID_QUANTITY for non-integer quantity" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-047-throws-invalid-price-for-negative-price.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-047-throws-invalid-price-for-negative-price.sdp.md new file mode 100644 index 00000000..f08af2db --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-047-throws-invalid-price-for-negative-price.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.throws-invalid-price-for-negative-price +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# throws INVALID_PRICE for negative price + +## Intent + +- outcome: Executable scenario "throws INVALID_PRICE for negative price" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-048-throws-invalid-item-data-for-empty-product-id.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-048-throws-invalid-item-data-for-empty-product-id.sdp.md new file mode 100644 index 00000000..55aa9d24 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-048-throws-invalid-item-data-for-empty-product-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.throws-invalid-item-data-for-empty-product-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# throws INVALID_ITEM_DATA for empty productId + +## Intent + +- outcome: Executable scenario "throws INVALID_ITEM_DATA for empty productId" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-049-throws-invalid-item-data-for-empty-product-name.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-049-throws-invalid-item-data-for-empty-product-name.sdp.md new file mode 100644 index 00000000..0fdc7658 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-049-throws-invalid-item-data-for-empty-product-name.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.throws-invalid-item-data-for-empty-product-name +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# throws INVALID_ITEM_DATA for empty productName + +## Intent + +- outcome: Executable scenario "throws INVALID_ITEM_DATA for empty productName" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-050-error-has-correct-name-property.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-050-error-has-correct-name-property.sdp.md new file mode 100644 index 00000000..519661bd --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-050-error-has-correct-name-property.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.error-has-correct-name-property +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# error has correct name property + +## Intent + +- outcome: Executable scenario "error has correct name property" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-051-error-has-correct-code-property.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-051-error-has-correct-code-property.sdp.md new file mode 100644 index 00000000..c6280a7f --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-051-error-has-correct-code-property.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.error-has-correct-code-property +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# error has correct code property + +## Intent + +- outcome: Executable scenario "error has correct code property" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-052-error-has-correct-message-property.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-052-error-has-correct-message-property.sdp.md new file mode 100644 index 00000000..15359cbe --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-052-error-has-correct-message-property.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.error-has-correct-message-property +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# error has correct message property + +## Intent + +- outcome: Executable scenario "error has correct message property" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-053-error-has-correct-context-property.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-053-error-has-correct-context-property.sdp.md new file mode 100644 index 00000000..3697aefd --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-053-error-has-correct-context-property.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.error-has-correct-context-property +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# error has correct context property + +## Intent + +- outcome: Executable scenario "error has correct context property" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-054-error-can-have-undefined-context.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-054-error-can-have-undefined-context.sdp.md new file mode 100644 index 00000000..4c799c0d --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-054-error-can-have-undefined-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.error-can-have-undefined-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# error can have undefined context + +## Intent + +- outcome: Executable scenario "error can have undefined context" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-055-error-is-an-instance-of-error.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-055-error-is-an-instance-of-error.sdp.md new file mode 100644 index 00000000..f9687979 --- /dev/null +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-055-error-is-an-instance-of-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.order-invariants.error-is-an-instance-of-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.order-invariants +--- +# error is an instance of Error + +## Intent + +- outcome: Executable scenario "error is an instance of Error" from examples/order-management/tests/features/behavior/orders/order-invariants.feature diff --git a/specs/behavior/order-management/orders/remove-order-item.examples/s-001-remove-item-from-draft-order-with-multiple-items.sdp.md b/specs/behavior/order-management/orders/remove-order-item.examples/s-001-remove-item-from-draft-order-with-multiple-items.sdp.md new file mode 100644 index 00000000..68b92e2f --- /dev/null +++ b/specs/behavior/order-management/orders/remove-order-item.examples/s-001-remove-item-from-draft-order-with-multiple-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.remove-order-item.remove-item-from-draft-order-with-multiple-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.remove-order-item +--- +# Remove item from draft order with multiple items + +## Intent + +- outcome: Executable scenario "Remove item from draft order with multiple items" from examples/order-management/tests/features/behavior/orders/remove-order-item.feature diff --git a/specs/behavior/order-management/orders/remove-order-item.examples/s-002-remove-last-item-from-draft-order.sdp.md b/specs/behavior/order-management/orders/remove-order-item.examples/s-002-remove-last-item-from-draft-order.sdp.md new file mode 100644 index 00000000..7ac68ed6 --- /dev/null +++ b/specs/behavior/order-management/orders/remove-order-item.examples/s-002-remove-last-item-from-draft-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.remove-order-item.remove-last-item-from-draft-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.remove-order-item +--- +# Remove last item from draft order + +## Intent + +- outcome: Executable scenario "Remove last item from draft order" from examples/order-management/tests/features/behavior/orders/remove-order-item.feature diff --git a/specs/behavior/order-management/orders/remove-order-item.examples/s-003-cannot-remove-item-from-submitted-order.sdp.md b/specs/behavior/order-management/orders/remove-order-item.examples/s-003-cannot-remove-item-from-submitted-order.sdp.md new file mode 100644 index 00000000..75c931cc --- /dev/null +++ b/specs/behavior/order-management/orders/remove-order-item.examples/s-003-cannot-remove-item-from-submitted-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.remove-order-item.cannot-remove-item-from-submitted-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.remove-order-item +--- +# Cannot remove item from submitted order + +## Intent + +- outcome: Executable scenario "Cannot remove item from submitted order" from examples/order-management/tests/features/behavior/orders/remove-order-item.feature diff --git a/specs/behavior/order-management/orders/remove-order-item.examples/s-004-cannot-remove-item-from-cancelled-order.sdp.md b/specs/behavior/order-management/orders/remove-order-item.examples/s-004-cannot-remove-item-from-cancelled-order.sdp.md new file mode 100644 index 00000000..696054d0 --- /dev/null +++ b/specs/behavior/order-management/orders/remove-order-item.examples/s-004-cannot-remove-item-from-cancelled-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.remove-order-item.cannot-remove-item-from-cancelled-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.remove-order-item +--- +# Cannot remove item from cancelled order + +## Intent + +- outcome: Executable scenario "Cannot remove item from cancelled order" from examples/order-management/tests/features/behavior/orders/remove-order-item.feature diff --git a/specs/behavior/order-management/orders/remove-order-item.examples/s-005-cannot-remove-item-from-confirmed-order.sdp.md b/specs/behavior/order-management/orders/remove-order-item.examples/s-005-cannot-remove-item-from-confirmed-order.sdp.md new file mode 100644 index 00000000..70b3f48d --- /dev/null +++ b/specs/behavior/order-management/orders/remove-order-item.examples/s-005-cannot-remove-item-from-confirmed-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.remove-order-item.cannot-remove-item-from-confirmed-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.remove-order-item +--- +# Cannot remove item from confirmed order + +## Intent + +- outcome: Executable scenario "Cannot remove item from confirmed order" from examples/order-management/tests/features/behavior/orders/remove-order-item.feature diff --git a/specs/behavior/order-management/orders/remove-order-item.examples/s-006-cannot-remove-non-existent-item.sdp.md b/specs/behavior/order-management/orders/remove-order-item.examples/s-006-cannot-remove-non-existent-item.sdp.md new file mode 100644 index 00000000..9542b31a --- /dev/null +++ b/specs/behavior/order-management/orders/remove-order-item.examples/s-006-cannot-remove-non-existent-item.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.remove-order-item.cannot-remove-non-existent-item +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.remove-order-item +--- +# Cannot remove non-existent item + +## Intent + +- outcome: Executable scenario "Cannot remove non-existent item" from examples/order-management/tests/features/behavior/orders/remove-order-item.feature diff --git a/specs/behavior/order-management/orders/remove-order-item.examples/s-007-remove-order-item-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/orders/remove-order-item.examples/s-007-remove-order-item-is-idempotent-with-same-command-id.sdp.md new file mode 100644 index 00000000..b06d4230 --- /dev/null +++ b/specs/behavior/order-management/orders/remove-order-item.examples/s-007-remove-order-item-is-idempotent-with-same-command-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.remove-order-item.remove-order-item-is-idempotent-with-same-command-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.remove-order-item +--- +# RemoveOrderItem is idempotent with same commandId + +## Intent + +- outcome: Executable scenario "RemoveOrderItem is idempotent with same commandId" from examples/order-management/tests/features/behavior/orders/remove-order-item.feature diff --git a/specs/behavior/order-management/orders/submit-order.examples/s-001-successfully-submit-order-with-items.sdp.md b/specs/behavior/order-management/orders/submit-order.examples/s-001-successfully-submit-order-with-items.sdp.md new file mode 100644 index 00000000..ade6acfd --- /dev/null +++ b/specs/behavior/order-management/orders/submit-order.examples/s-001-successfully-submit-order-with-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.submit-order.successfully-submit-order-with-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.submit-order +--- +# Successfully submit order with items + +## Intent + +- outcome: Executable scenario "Successfully submit order with items" from examples/order-management/tests/features/behavior/orders/submit-order.feature diff --git a/specs/behavior/order-management/orders/submit-order.examples/s-002-cannot-submit-empty-order.sdp.md b/specs/behavior/order-management/orders/submit-order.examples/s-002-cannot-submit-empty-order.sdp.md new file mode 100644 index 00000000..59728b4d --- /dev/null +++ b/specs/behavior/order-management/orders/submit-order.examples/s-002-cannot-submit-empty-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.orders.submit-order.cannot-submit-empty-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.orders.submit-order +--- +# Cannot submit empty order + +## Intent + +- outcome: Executable scenario "Cannot submit empty order" from examples/order-management/tests/features/behavior/orders/submit-order.feature diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-001-define-a-logic-projection-for-command-validation.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-001-define-a-logic-projection-for-command-validation.sdp.md new file mode 100644 index 00000000..a37b78bb --- /dev/null +++ b/specs/behavior/order-management/roadmap/projection-categories.examples/s-001-define-a-logic-projection-for-command-validation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.roadmap.projection-categories.define-a-logic-projection-for-command-validation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.roadmap.projection-categories +--- +# Define a Logic projection for command validation + +## Intent + +- outcome: Executable scenario "Define a Logic projection for command validation" from examples/order-management/tests/features/roadmap/projection-categories.feature diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-002-define-a-view-projection-for-ui-queries.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-002-define-a-view-projection-for-ui-queries.sdp.md new file mode 100644 index 00000000..256dd00d --- /dev/null +++ b/specs/behavior/order-management/roadmap/projection-categories.examples/s-002-define-a-view-projection-for-ui-queries.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.roadmap.projection-categories.define-a-view-projection-for-ui-queries +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.roadmap.projection-categories +--- +# Define a View projection for UI queries + +## Intent + +- outcome: Executable scenario "Define a View projection for UI queries" from examples/order-management/tests/features/roadmap/projection-categories.feature diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-003-define-a-reporting-projection-for-analytics.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-003-define-a-reporting-projection-for-analytics.sdp.md new file mode 100644 index 00000000..5286b123 --- /dev/null +++ b/specs/behavior/order-management/roadmap/projection-categories.examples/s-003-define-a-reporting-projection-for-analytics.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.roadmap.projection-categories.define-a-reporting-projection-for-analytics +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.roadmap.projection-categories +--- +# Define a Reporting projection for analytics + +## Intent + +- outcome: Executable scenario "Define a Reporting projection for analytics" from examples/order-management/tests/features/roadmap/projection-categories.feature diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-004-define-an-integration-projection-for-cross-context-sync.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-004-define-an-integration-projection-for-cross-context-sync.sdp.md new file mode 100644 index 00000000..3ead4a73 --- /dev/null +++ b/specs/behavior/order-management/roadmap/projection-categories.examples/s-004-define-an-integration-projection-for-cross-context-sync.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.roadmap.projection-categories.define-an-integration-projection-for-cross-context-sync +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.roadmap.projection-categories +--- +# Define an Integration projection for cross-context sync + +## Intent + +- outcome: Executable scenario "Define an Integration projection for cross-context sync" from examples/order-management/tests/features/roadmap/projection-categories.feature diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-005-query-projections-by-category.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-005-query-projections-by-category.sdp.md new file mode 100644 index 00000000..64c6c5aa --- /dev/null +++ b/specs/behavior/order-management/roadmap/projection-categories.examples/s-005-query-projections-by-category.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.roadmap.projection-categories.query-projections-by-category +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.roadmap.projection-categories +--- +# Query projections by category + +## Intent + +- outcome: Executable scenario "Query projections by category" from examples/order-management/tests/features/roadmap/projection-categories.feature diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-006-query-all-reactive-projections.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-006-query-all-reactive-projections.sdp.md new file mode 100644 index 00000000..47665e55 --- /dev/null +++ b/specs/behavior/order-management/roadmap/projection-categories.examples/s-006-query-all-reactive-projections.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.roadmap.projection-categories.query-all-reactive-projections +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.roadmap.projection-categories +--- +# Query all reactive projections + +## Intent + +- outcome: Executable scenario "Query all reactive projections" from examples/order-management/tests/features/roadmap/projection-categories.feature diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-007-prevent-client-query-on-logic-projection.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-007-prevent-client-query-on-logic-projection.sdp.md new file mode 100644 index 00000000..8127d3b4 --- /dev/null +++ b/specs/behavior/order-management/roadmap/projection-categories.examples/s-007-prevent-client-query-on-logic-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.roadmap.projection-categories.prevent-client-query-on-logic-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.roadmap.projection-categories +--- +# Prevent client query on Logic projection + +## Intent + +- outcome: Executable scenario "Prevent client query on Logic projection" from examples/order-management/tests/features/roadmap/projection-categories.feature diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-008-warn-when-view-projection-is-not-optimized-for-reactivity.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-008-warn-when-view-projection-is-not-optimized-for-reactivity.sdp.md new file mode 100644 index 00000000..a3d58b2e --- /dev/null +++ b/specs/behavior/order-management/roadmap/projection-categories.examples/s-008-warn-when-view-projection-is-not-optimized-for-reactivity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.roadmap.projection-categories.warn-when-view-projection-is-not-optimized-for-reactivity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.roadmap.projection-categories +--- +# Warn when View projection is not optimized for reactivity + +## Intent + +- outcome: Executable scenario "Warn when View projection is not optimized for reactivity" from examples/order-management/tests/features/roadmap/projection-categories.feature diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-009-migrate-existing-projection-to-categorized-system.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-009-migrate-existing-projection-to-categorized-system.sdp.md new file mode 100644 index 00000000..3202d298 --- /dev/null +++ b/specs/behavior/order-management/roadmap/projection-categories.examples/s-009-migrate-existing-projection-to-categorized-system.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.roadmap.projection-categories.migrate-existing-projection-to-categorized-system +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.roadmap.projection-categories +--- +# Migrate existing projection to categorized system + +## Intent + +- outcome: Executable scenario "Migrate existing projection to categorized system" from examples/order-management/tests/features/roadmap/projection-categories.feature diff --git a/specs/behavior/order-management/sagas/admin.examples/s-001-returns-zero-counts-for-empty-database.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-001-returns-zero-counts-for-empty-database.sdp.md new file mode 100644 index 00000000..7e01bf29 --- /dev/null +++ b/specs/behavior/order-management/sagas/admin.examples/s-001-returns-zero-counts-for-empty-database.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.sagas.admin.returns-zero-counts-for-empty-database +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.sagas.admin +--- +# Returns zero counts for empty database + +## Intent + +- outcome: Executable scenario "Returns zero counts for empty database" from examples/order-management/tests/features/behavior/sagas/admin.feature diff --git a/specs/behavior/order-management/sagas/admin.examples/s-002-counts-sagas-by-status-correctly.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-002-counts-sagas-by-status-correctly.sdp.md new file mode 100644 index 00000000..a54cb850 --- /dev/null +++ b/specs/behavior/order-management/sagas/admin.examples/s-002-counts-sagas-by-status-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.sagas.admin.counts-sagas-by-status-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.sagas.admin +--- +# Counts sagas by status correctly + +## Intent + +- outcome: Executable scenario "Counts sagas by status correctly" from examples/order-management/tests/features/behavior/sagas/admin.feature diff --git a/specs/behavior/order-management/sagas/admin.examples/s-003-filters-by-saga-type.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-003-filters-by-saga-type.sdp.md new file mode 100644 index 00000000..33453f4f --- /dev/null +++ b/specs/behavior/order-management/sagas/admin.examples/s-003-filters-by-saga-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.sagas.admin.filters-by-saga-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.sagas.admin +--- +# Filters by saga type + +## Intent + +- outcome: Executable scenario "Filters by saga type" from examples/order-management/tests/features/behavior/sagas/admin.feature diff --git a/specs/behavior/order-management/sagas/admin.examples/s-004-returns-empty-array-when-no-sagas-exist.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-004-returns-empty-array-when-no-sagas-exist.sdp.md new file mode 100644 index 00000000..d1265700 --- /dev/null +++ b/specs/behavior/order-management/sagas/admin.examples/s-004-returns-empty-array-when-no-sagas-exist.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.sagas.admin.returns-empty-array-when-no-sagas-exist +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.sagas.admin +--- +# Returns empty array when no sagas exist + +## Intent + +- outcome: Executable scenario "Returns empty array when no sagas exist" from examples/order-management/tests/features/behavior/sagas/admin.feature diff --git a/specs/behavior/order-management/sagas/admin.examples/s-005-returns-running-sagas-older-than-threshold.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-005-returns-running-sagas-older-than-threshold.sdp.md new file mode 100644 index 00000000..00425bb2 --- /dev/null +++ b/specs/behavior/order-management/sagas/admin.examples/s-005-returns-running-sagas-older-than-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.sagas.admin.returns-running-sagas-older-than-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.sagas.admin +--- +# Returns running sagas older than threshold + +## Intent + +- outcome: Executable scenario "Returns running sagas older than threshold" from examples/order-management/tests/features/behavior/sagas/admin.feature diff --git a/specs/behavior/order-management/sagas/admin.examples/s-006-respects-custom-threshold.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-006-respects-custom-threshold.sdp.md new file mode 100644 index 00000000..7d0ce1c0 --- /dev/null +++ b/specs/behavior/order-management/sagas/admin.examples/s-006-respects-custom-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.sagas.admin.respects-custom-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.sagas.admin +--- +# Respects custom threshold + +## Intent + +- outcome: Executable scenario "Respects custom threshold" from examples/order-management/tests/features/behavior/sagas/admin.feature diff --git a/specs/behavior/order-management/sagas/admin.examples/s-007-returns-empty-array-when-no-failed-sagas.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-007-returns-empty-array-when-no-failed-sagas.sdp.md new file mode 100644 index 00000000..bda46d2a --- /dev/null +++ b/specs/behavior/order-management/sagas/admin.examples/s-007-returns-empty-array-when-no-failed-sagas.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.sagas.admin.returns-empty-array-when-no-failed-sagas +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.sagas.admin +--- +# Returns empty array when no failed sagas + +## Intent + +- outcome: Executable scenario "Returns empty array when no failed sagas" from examples/order-management/tests/features/behavior/sagas/admin.feature diff --git a/specs/behavior/order-management/sagas/admin.examples/s-008-returns-only-failed-sagas.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-008-returns-only-failed-sagas.sdp.md new file mode 100644 index 00000000..e3d06d0a --- /dev/null +++ b/specs/behavior/order-management/sagas/admin.examples/s-008-returns-only-failed-sagas.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.sagas.admin.returns-only-failed-sagas +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.sagas.admin +--- +# Returns only failed sagas + +## Intent + +- outcome: Executable scenario "Returns only failed sagas" from examples/order-management/tests/features/behavior/sagas/admin.feature diff --git a/specs/behavior/order-management/sagas/admin.examples/s-009-respects-limit-parameter.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-009-respects-limit-parameter.sdp.md new file mode 100644 index 00000000..170b6d63 --- /dev/null +++ b/specs/behavior/order-management/sagas/admin.examples/s-009-respects-limit-parameter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.sagas.admin.respects-limit-parameter +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.sagas.admin +--- +# Respects limit parameter + +## Intent + +- outcome: Executable scenario "Respects limit parameter" from examples/order-management/tests/features/behavior/sagas/admin.feature diff --git a/specs/behavior/order-management/sagas/admin.examples/s-010-allows-marking-valid-source-status-saga-as-failed.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-010-allows-marking-valid-source-status-saga-as-failed.sdp.md new file mode 100644 index 00000000..e2f492bf --- /dev/null +++ b/specs/behavior/order-management/sagas/admin.examples/s-010-allows-marking-valid-source-status-saga-as-failed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.sagas.admin.allows-marking-valid-source-status-saga-as-failed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.sagas.admin +--- +# Allows marking valid-source-status saga as failed + +## Intent + +- outcome: Executable scenario "Allows marking valid-source-status saga as failed" from examples/order-management/tests/features/behavior/sagas/admin.feature diff --git a/specs/behavior/order-management/sagas/admin.examples/s-011-rejects-marking-invalid-source-status-saga-as-failed.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-011-rejects-marking-invalid-source-status-saga-as-failed.sdp.md new file mode 100644 index 00000000..75ea95e8 --- /dev/null +++ b/specs/behavior/order-management/sagas/admin.examples/s-011-rejects-marking-invalid-source-status-saga-as-failed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.sagas.admin.rejects-marking-invalid-source-status-saga-as-failed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.sagas.admin +--- +# Rejects marking invalid-source-status saga as failed + +## Intent + +- outcome: Executable scenario "Rejects marking invalid-source-status saga as failed" from examples/order-management/tests/features/behavior/sagas/admin.feature diff --git a/specs/behavior/order-management/sagas/admin.examples/s-012-returns-not-found-for-non-existent-saga.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-012-returns-not-found-for-non-existent-saga.sdp.md new file mode 100644 index 00000000..3bb5b25c --- /dev/null +++ b/specs/behavior/order-management/sagas/admin.examples/s-012-returns-not-found-for-non-existent-saga.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.sagas.admin.returns-not-found-for-non-existent-saga +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.sagas.admin +--- +# Returns not_found for non-existent saga + +## Intent + +- outcome: Executable scenario "Returns not_found for non-existent saga" from examples/order-management/tests/features/behavior/sagas/admin.feature diff --git a/specs/behavior/order-management/sagas/admin.examples/s-013-allows-marking-failed-saga-as-compensated.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-013-allows-marking-failed-saga-as-compensated.sdp.md new file mode 100644 index 00000000..338e64ee --- /dev/null +++ b/specs/behavior/order-management/sagas/admin.examples/s-013-allows-marking-failed-saga-as-compensated.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.sagas.admin.allows-marking-failed-saga-as-compensated +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.sagas.admin +--- +# Allows marking failed saga as compensated + +## Intent + +- outcome: Executable scenario "Allows marking failed saga as compensated" from examples/order-management/tests/features/behavior/sagas/admin.feature diff --git a/specs/behavior/order-management/sagas/admin.examples/s-014-rejects-marking-non-failed-saga-as-compensated.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-014-rejects-marking-non-failed-saga-as-compensated.sdp.md new file mode 100644 index 00000000..7165453b --- /dev/null +++ b/specs/behavior/order-management/sagas/admin.examples/s-014-rejects-marking-non-failed-saga-as-compensated.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.sagas.admin.rejects-marking-non-failed-saga-as-compensated +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.sagas.admin +--- +# Rejects marking non-failed saga as compensated + +## Intent + +- outcome: Executable scenario "Rejects marking non-failed saga as compensated" from examples/order-management/tests/features/behavior/sagas/admin.feature diff --git a/specs/behavior/order-management/sagas/admin.examples/s-015-allows-retrying-failed-saga.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-015-allows-retrying-failed-saga.sdp.md new file mode 100644 index 00000000..e74c78b7 --- /dev/null +++ b/specs/behavior/order-management/sagas/admin.examples/s-015-allows-retrying-failed-saga.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.sagas.admin.allows-retrying-failed-saga +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.sagas.admin +--- +# Allows retrying failed saga + +## Intent + +- outcome: Executable scenario "Allows retrying failed saga" from examples/order-management/tests/features/behavior/sagas/admin.feature diff --git a/specs/behavior/order-management/sagas/admin.examples/s-016-rejects-retrying-non-failed-saga.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-016-rejects-retrying-non-failed-saga.sdp.md new file mode 100644 index 00000000..62e8d08a --- /dev/null +++ b/specs/behavior/order-management/sagas/admin.examples/s-016-rejects-retrying-non-failed-saga.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.sagas.admin.rejects-retrying-non-failed-saga +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.sagas.admin +--- +# Rejects retrying non-failed saga + +## Intent + +- outcome: Executable scenario "Rejects retrying non-failed saga" from examples/order-management/tests/features/behavior/sagas/admin.feature diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-001-parse-vertical-data-table-to-object.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-001-parse-vertical-data-table-to-object.sdp.md new file mode 100644 index 00000000..1371ab8a --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-001-parse-vertical-data-table-to-object.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.parse-vertical-data-table-to-object +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing +--- +# Parse vertical DataTable to object + +## Intent + +- outcome: Executable scenario "Parse vertical DataTable to object" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-002-parse-data-table-preserves-all-string-values.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-002-parse-data-table-preserves-all-string-values.sdp.md new file mode 100644 index 00000000..00887738 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-002-parse-data-table-preserves-all-string-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.parse-data-table-preserves-all-string-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing +--- +# Parse DataTable preserves all string values + +## Intent + +- outcome: Executable scenario "Parse DataTable preserves all string values" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-003-parse-integer-value-from-string.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-003-parse-integer-value-from-string.sdp.md new file mode 100644 index 00000000..15c38038 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-003-parse-integer-value-from-string.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.parse-integer-value-from-string +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing +--- +# Parse integer value from string + +## Intent + +- outcome: Executable scenario "Parse integer value from string" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-004-parse-float-value-from-string.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-004-parse-float-value-from-string.sdp.md new file mode 100644 index 00000000..6cda5311 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-004-parse-float-value-from-string.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.parse-float-value-from-string +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing +--- +# Parse float value from string + +## Intent + +- outcome: Executable scenario "Parse float value from string" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-005-parse-boolean-true-from-string.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-005-parse-boolean-true-from-string.sdp.md new file mode 100644 index 00000000..fc7f5c6b --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-005-parse-boolean-true-from-string.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.parse-boolean-true-from-string +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing +--- +# Parse boolean true from string + +## Intent + +- outcome: Executable scenario "Parse boolean true from string" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-006-parse-boolean-false-from-string.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-006-parse-boolean-false-from-string.sdp.md new file mode 100644 index 00000000..57cfca2f --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-006-parse-boolean-false-from-string.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.parse-boolean-false-from-string +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing +--- +# Parse boolean false from string + +## Intent + +- outcome: Executable scenario "Parse boolean false from string" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-007-parse-invalid-integer-throws-error.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-007-parse-invalid-integer-throws-error.sdp.md new file mode 100644 index 00000000..da24cbe0 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-007-parse-invalid-integer-throws-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.parse-invalid-integer-throws-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing +--- +# Parse invalid integer throws error + +## Intent + +- outcome: Executable scenario "Parse invalid integer throws error" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-008-get-required-field-succeeds-when-present.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-008-get-required-field-succeeds-when-present.sdp.md new file mode 100644 index 00000000..b1f2dfef --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-008-get-required-field-succeeds-when-present.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.get-required-field-succeeds-when-present +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing +--- +# Get required field succeeds when present + +## Intent + +- outcome: Executable scenario "Get required field succeeds when present" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-009-get-required-field-throws-for-missing-field.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-009-get-required-field-throws-for-missing-field.sdp.md new file mode 100644 index 00000000..25863da2 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-009-get-required-field-throws-for-missing-field.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.get-required-field-throws-for-missing-field +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing +--- +# Get required field throws for missing field + +## Intent + +- outcome: Executable scenario "Get required field throws for missing field" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-010-get-optional-field-returns-value-when-present.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-010-get-optional-field-returns-value-when-present.sdp.md new file mode 100644 index 00000000..d31c38da --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-010-get-optional-field-returns-value-when-present.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.get-optional-field-returns-value-when-present +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing +--- +# Get optional field returns value when present + +## Intent + +- outcome: Executable scenario "Get optional field returns value when present" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-011-get-optional-field-returns-undefined-for-missing.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-011-get-optional-field-returns-undefined-for-missing.sdp.md new file mode 100644 index 00000000..537c01d7 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-011-get-optional-field-returns-undefined-for-missing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.get-optional-field-returns-undefined-for-missing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing +--- +# Get optional field returns undefined for missing + +## Intent + +- outcome: Executable scenario "Get optional field returns undefined for missing" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-012-get-optional-field-with-default-value.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-012-get-optional-field-with-default-value.sdp.md new file mode 100644 index 00000000..6d578f4e --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-012-get-optional-field-with-default-value.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.get-optional-field-with-default-value +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing +--- +# Get optional field with default value + +## Intent + +- outcome: Executable scenario "Get optional field with default value" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-001-assert-decision-success.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-001-assert-decision-success.sdp.md new file mode 100644 index 00000000..61d1b06d --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-001-assert-decision-success.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-decision-success +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.decider-assertions +--- +# Assert decision success + +## Intent + +- outcome: Executable scenario "Assert decision success" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-002-assert-decision-success-fails-for-rejected-result.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-002-assert-decision-success-fails-for-rejected-result.sdp.md new file mode 100644 index 00000000..b0b5d3eb --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-002-assert-decision-success-fails-for-rejected-result.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-decision-success-fails-for-rejected-result +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.decider-assertions +--- +# Assert decision success fails for rejected result + +## Intent + +- outcome: Executable scenario "Assert decision success fails for rejected result" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-003-extract-success-event-from-result.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-003-extract-success-event-from-result.sdp.md new file mode 100644 index 00000000..beee9744 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-003-extract-success-event-from-result.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.decider-assertions.extract-success-event-from-result +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.decider-assertions +--- +# Extract success event from result + +## Intent + +- outcome: Executable scenario "Extract success event from result" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-004-extract-success-data-from-result.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-004-extract-success-data-from-result.sdp.md new file mode 100644 index 00000000..6d496adc --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-004-extract-success-data-from-result.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.decider-assertions.extract-success-data-from-result +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.decider-assertions +--- +# Extract success data from result + +## Intent + +- outcome: Executable scenario "Extract success data from result" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-005-extract-state-update-from-result.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-005-extract-state-update-from-result.sdp.md new file mode 100644 index 00000000..347811a8 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-005-extract-state-update-from-result.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.decider-assertions.extract-state-update-from-result +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.decider-assertions +--- +# Extract state update from result + +## Intent + +- outcome: Executable scenario "Extract state update from result" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-006-assert-event-type-matches.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-006-assert-event-type-matches.sdp.md new file mode 100644 index 00000000..70554b13 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-006-assert-event-type-matches.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-event-type-matches +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.decider-assertions +--- +# Assert event type matches + +## Intent + +- outcome: Executable scenario "Assert event type matches" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-007-assert-event-type-fails-for-wrong-type.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-007-assert-event-type-fails-for-wrong-type.sdp.md new file mode 100644 index 00000000..0dabee72 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-007-assert-event-type-fails-for-wrong-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-event-type-fails-for-wrong-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.decider-assertions +--- +# Assert event type fails for wrong type + +## Intent + +- outcome: Executable scenario "Assert event type fails for wrong type" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-008-assert-event-payload-field.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-008-assert-event-payload-field.sdp.md new file mode 100644 index 00000000..06945fe4 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-008-assert-event-payload-field.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-event-payload-field +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.decider-assertions +--- +# Assert event payload field + +## Intent + +- outcome: Executable scenario "Assert event payload field" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-009-assert-state-update-field.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-009-assert-state-update-field.sdp.md new file mode 100644 index 00000000..5c35381e --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-009-assert-state-update-field.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-state-update-field +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.decider-assertions +--- +# Assert state update field + +## Intent + +- outcome: Executable scenario "Assert state update field" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-010-assert-decision-rejected.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-010-assert-decision-rejected.sdp.md new file mode 100644 index 00000000..332d8c0c --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-010-assert-decision-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-decision-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.decider-assertions +--- +# Assert decision rejected + +## Intent + +- outcome: Executable scenario "Assert decision rejected" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-011-assert-rejection-code-matches.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-011-assert-rejection-code-matches.sdp.md new file mode 100644 index 00000000..28bc3e8d --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-011-assert-rejection-code-matches.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-rejection-code-matches +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.decider-assertions +--- +# Assert rejection code matches + +## Intent + +- outcome: Executable scenario "Assert rejection code matches" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-012-assert-rejection-code-fails-for-wrong-code.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-012-assert-rejection-code-fails-for-wrong-code.sdp.md new file mode 100644 index 00000000..7ea67958 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-012-assert-rejection-code-fails-for-wrong-code.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-rejection-code-fails-for-wrong-code +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.decider-assertions +--- +# Assert rejection code fails for wrong code + +## Intent + +- outcome: Executable scenario "Assert rejection code fails for wrong code" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-013-assert-rejection-message-contains-text.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-013-assert-rejection-message-contains-text.sdp.md new file mode 100644 index 00000000..9252153a --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-013-assert-rejection-message-contains-text.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-rejection-message-contains-text +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.decider-assertions +--- +# Assert rejection message contains text + +## Intent + +- outcome: Executable scenario "Assert rejection message contains text" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-014-assert-decision-failed.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-014-assert-decision-failed.sdp.md new file mode 100644 index 00000000..04534f0c --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-014-assert-decision-failed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-decision-failed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.decider-assertions +--- +# Assert decision failed + +## Intent + +- outcome: Executable scenario "Assert decision failed" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-015-assert-failure-reason-matches.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-015-assert-failure-reason-matches.sdp.md new file mode 100644 index 00000000..e68bcec5 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-015-assert-failure-reason-matches.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-failure-reason-matches +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.decider-assertions +--- +# Assert failure reason matches + +## Intent + +- outcome: Executable scenario "Assert failure reason matches" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-001-assert-valid-transition.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-001-assert-valid-transition.sdp.md new file mode 100644 index 00000000..2e42d2ef --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-001-assert-valid-transition.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-valid-transition +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions +--- +# Assert valid transition + +## Intent + +- outcome: Executable scenario "Assert valid transition" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-002-assert-invalid-transition-fails.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-002-assert-invalid-transition-fails.sdp.md new file mode 100644 index 00000000..540e79bd --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-002-assert-invalid-transition-fails.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-invalid-transition-fails +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions +--- +# Assert invalid transition fails + +## Intent + +- outcome: Executable scenario "Assert invalid transition fails" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-003-assert-transition-is-not-allowed.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-003-assert-transition-is-not-allowed.sdp.md new file mode 100644 index 00000000..311f488d --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-003-assert-transition-is-not-allowed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-transition-is-not-allowed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions +--- +# Assert transition is not allowed + +## Intent + +- outcome: Executable scenario "Assert transition is not allowed" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-004-assert-cannot-transition-fails-for-valid-transition.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-004-assert-cannot-transition-fails-for-valid-transition.sdp.md new file mode 100644 index 00000000..d918bb89 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-004-assert-cannot-transition-fails-for-valid-transition.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-cannot-transition-fails-for-valid-transition +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions +--- +# Assert cannot transition fails for valid transition + +## Intent + +- outcome: Executable scenario "Assert cannot transition fails for valid transition" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-005-assert-terminal-state.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-005-assert-terminal-state.sdp.md new file mode 100644 index 00000000..7d607105 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-005-assert-terminal-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-terminal-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions +--- +# Assert terminal state + +## Intent + +- outcome: Executable scenario "Assert terminal state" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-006-assert-terminal-state-fails-for-non-terminal.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-006-assert-terminal-state-fails-for-non-terminal.sdp.md new file mode 100644 index 00000000..7dd7d565 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-006-assert-terminal-state-fails-for-non-terminal.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-terminal-state-fails-for-non-terminal +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions +--- +# Assert terminal state fails for non-terminal + +## Intent + +- outcome: Executable scenario "Assert terminal state fails for non-terminal" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-007-assert-non-terminal-state.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-007-assert-non-terminal-state.sdp.md new file mode 100644 index 00000000..405523f5 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-007-assert-non-terminal-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-non-terminal-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions +--- +# Assert non-terminal state + +## Intent + +- outcome: Executable scenario "Assert non-terminal state" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-008-assert-initial-state.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-008-assert-initial-state.sdp.md new file mode 100644 index 00000000..efba5cb9 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-008-assert-initial-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-initial-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions +--- +# Assert initial state + +## Intent + +- outcome: Executable scenario "Assert initial state" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-009-assert-valid-state.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-009-assert-valid-state.sdp.md new file mode 100644 index 00000000..523956e8 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-009-assert-valid-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-valid-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions +--- +# Assert valid state + +## Intent + +- outcome: Executable scenario "Assert valid state" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-010-assert-invalid-state-fails.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-010-assert-invalid-state-fails.sdp.md new file mode 100644 index 00000000..bc6e6e52 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-010-assert-invalid-state-fails.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-invalid-state-fails +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions +--- +# Assert invalid state fails + +## Intent + +- outcome: Executable scenario "Assert invalid state fails" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-011-get-all-valid-transitions.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-011-get-all-valid-transitions.sdp.md new file mode 100644 index 00000000..6cf8e992 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-011-get-all-valid-transitions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.get-all-valid-transitions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions +--- +# Get all valid transitions + +## Intent + +- outcome: Executable scenario "Get all valid transitions" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-012-get-all-states.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-012-get-all-states.sdp.md new file mode 100644 index 00000000..d0825444 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-012-get-all-states.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.get-all-states +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions +--- +# Get all states + +## Intent + +- outcome: Executable scenario "Get all states" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-013-get-terminal-states.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-013-get-terminal-states.sdp.md new file mode 100644 index 00000000..7cdcc7f5 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-013-get-terminal-states.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.get-terminal-states +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions +--- +# Get terminal states + +## Intent + +- outcome: Executable scenario "Get terminal states" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-014-get-non-terminal-states.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-014-get-non-terminal-states.sdp.md new file mode 100644 index 00000000..95485647 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-014-get-non-terminal-states.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.get-non-terminal-states +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions +--- +# Get non-terminal states + +## Intent + +- outcome: Executable scenario "Get non-terminal states" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-015-assert-valid-transitions-from-a-state.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-015-assert-valid-transitions-from-a-state.sdp.md new file mode 100644 index 00000000..c093fe92 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-015-assert-valid-transitions-from-a-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-valid-transitions-from-a-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions +--- +# Assert valid transitions from a state + +## Intent + +- outcome: Executable scenario "Assert valid transitions from a state" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature diff --git a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-001-generate-unique-test-run-id.sdp.md b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-001-generate-unique-test-run-id.sdp.md new file mode 100644 index 00000000..a1fbe54d --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-001-generate-unique-test-run-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.test-isolation.generate-unique-test-run-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.test-isolation +--- +# Generate unique test run ID + +## Intent + +- outcome: Executable scenario "Generate unique test run ID" from examples/order-management/tests/features/behavior/testing-infrastructure/test-isolation.feature diff --git a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-002-module-level-test-run-id-is-stable-within-a-test-run.sdp.md b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-002-module-level-test-run-id-is-stable-within-a-test-run.sdp.md new file mode 100644 index 00000000..ed869404 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-002-module-level-test-run-id-is-stable-within-a-test-run.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.test-isolation.module-level-test-run-id-is-stable-within-a-test-run +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.test-isolation +--- +# Module-level testRunId is stable within a test run + +## Intent + +- outcome: Executable scenario "Module-level testRunId is stable within a test run" from examples/order-management/tests/features/behavior/testing-infrastructure/test-isolation.feature diff --git a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-003-prefix-entity-i-ds-with-test-run-namespace.sdp.md b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-003-prefix-entity-i-ds-with-test-run-namespace.sdp.md new file mode 100644 index 00000000..b02073d7 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-003-prefix-entity-i-ds-with-test-run-namespace.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.test-isolation.prefix-entity-i-ds-with-test-run-namespace +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.test-isolation +--- +# Prefix entity IDs with test run namespace + +## Intent + +- outcome: Executable scenario "Prefix entity IDs with test run namespace" from examples/order-management/tests/features/behavior/testing-infrastructure/test-isolation.feature diff --git a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-004-custom-prefix-for-specific-isolation.sdp.md b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-004-custom-prefix-for-specific-isolation.sdp.md new file mode 100644 index 00000000..36ae96db --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-004-custom-prefix-for-specific-isolation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.test-isolation.custom-prefix-for-specific-isolation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.test-isolation +--- +# Custom prefix for specific isolation + +## Intent + +- outcome: Executable scenario "Custom prefix for specific isolation" from examples/order-management/tests/features/behavior/testing-infrastructure/test-isolation.feature diff --git a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-005-test-isolation-prevents-cross-test-pollution.sdp.md b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-005-test-isolation-prevents-cross-test-pollution.sdp.md new file mode 100644 index 00000000..183f9f40 --- /dev/null +++ b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-005-test-isolation-prevents-cross-test-pollution.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.testing-infrastructure.test-isolation.test-isolation-prevents-cross-test-pollution +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.testing-infrastructure.test-isolation +--- +# Test isolation prevents cross-test pollution + +## Intent + +- outcome: Executable scenario "Test isolation prevents cross-test pollution" from examples/order-management/tests/features/behavior/testing-infrastructure/test-isolation.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-001-successful-command-records-intent-and-completion.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-001-successful-command-records-intent-and-completion.sdp.md new file mode 100644 index 00000000..a56dd42b --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-001-successful-command-records-intent-and-completion.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.durable-commands.successful-command-records-intent-and-completion +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.durable-commands +--- +# Successful command records intent and completion + +## Intent + +- outcome: Executable scenario "Successful command records intent and completion" from examples/order-management/tests/integration-features/durability/durable-commands.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-002-intent-record-captures-command-metadata.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-002-intent-record-captures-command-metadata.sdp.md new file mode 100644 index 00000000..7fed7761 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-002-intent-record-captures-command-metadata.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.durable-commands.intent-record-captures-command-metadata +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.durable-commands +--- +# Intent record captures command metadata + +## Intent + +- outcome: Executable scenario "Intent record captures command metadata" from examples/order-management/tests/integration-features/durability/durable-commands.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-003-business-rejection-records-failed-intent.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-003-business-rejection-records-failed-intent.sdp.md new file mode 100644 index 00000000..32a6807b --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-003-business-rejection-records-failed-intent.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.durable-commands.business-rejection-records-failed-intent +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.durable-commands +--- +# Business rejection records failed intent + +## Intent + +- outcome: Executable scenario "Business rejection records failed intent" from examples/order-management/tests/integration-features/durability/durable-commands.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-004-technical-failure-records-failed-intent.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-004-technical-failure-records-failed-intent.sdp.md new file mode 100644 index 00000000..d0dd4a98 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-004-technical-failure-records-failed-intent.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.durable-commands.technical-failure-records-failed-intent +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.durable-commands +--- +# Technical failure records failed intent + +## Intent + +- outcome: Executable scenario "Technical failure records failed intent" from examples/order-management/tests/integration-features/durability/durable-commands.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-005-intent-statistics-show-correct-counts.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-005-intent-statistics-show-correct-counts.sdp.md new file mode 100644 index 00000000..b602efd9 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-005-intent-statistics-show-correct-counts.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.durable-commands.intent-statistics-show-correct-counts +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.durable-commands +--- +# Intent statistics show correct counts + +## Intent + +- outcome: Executable scenario "Intent statistics show correct counts" from examples/order-management/tests/integration-features/durability/durable-commands.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-001-publishing-creates-records-for-each-target-context.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-001-publishing-creates-records-for-each-target-context.sdp.md new file mode 100644 index 00000000..144ce704 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-001-publishing-creates-records-for-each-target-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.durable-publication.publishing-creates-records-for-each-target-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication +--- +# Publishing creates records for each target context + +## Intent + +- outcome: Executable scenario "Publishing creates records for each target context" from examples/order-management/tests/integration-features/durability/durable-publication.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-002-publication-records-contain-event-metadata.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-002-publication-records-contain-event-metadata.sdp.md new file mode 100644 index 00000000..245d782f --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-002-publication-records-contain-event-metadata.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.durable-publication.publication-records-contain-event-metadata +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication +--- +# Publication records contain event metadata + +## Intent + +- outcome: Executable scenario "Publication records contain event metadata" from examples/order-management/tests/integration-features/durability/durable-publication.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-003-publish-result-contains-publication-i-ds.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-003-publish-result-contains-publication-i-ds.sdp.md new file mode 100644 index 00000000..27164d09 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-003-publish-result-contains-publication-i-ds.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.durable-publication.publish-result-contains-publication-i-ds +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication +--- +# Publish result contains publication IDs + +## Intent + +- outcome: Executable scenario "Publish result contains publication IDs" from examples/order-management/tests/integration-features/durability/durable-publication.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-004-query-publications-by-event-id.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-004-query-publications-by-event-id.sdp.md new file mode 100644 index 00000000..d695db1c --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-004-query-publications-by-event-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.durable-publication.query-publications-by-event-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication +--- +# Query publications by event ID + +## Intent + +- outcome: Executable scenario "Query publications by event ID" from examples/order-management/tests/integration-features/durability/durable-publication.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-005-query-returns-empty-for-unknown-event.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-005-query-returns-empty-for-unknown-event.sdp.md new file mode 100644 index 00000000..6d5f8aa3 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-005-query-returns-empty-for-unknown-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.durable-publication.query-returns-empty-for-unknown-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication +--- +# Query returns empty for unknown event + +## Intent + +- outcome: Executable scenario "Query returns empty for unknown event" from examples/order-management/tests/integration-features/durability/durable-publication.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-006-query-publications-by-status.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-006-query-publications-by-status.sdp.md new file mode 100644 index 00000000..b9fad86b --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-006-query-publications-by-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.durable-publication.query-publications-by-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication +--- +# Query publications by status + +## Intent + +- outcome: Executable scenario "Query publications by status" from examples/order-management/tests/integration-features/durability/durable-publication.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-007-stats-show-counts-by-status.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-007-stats-show-counts-by-status.sdp.md new file mode 100644 index 00000000..b5686675 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-007-stats-show-counts-by-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.durable-publication.stats-show-counts-by-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication +--- +# Stats show counts by status + +## Intent + +- outcome: Executable scenario "Stats show counts by status" from examples/order-management/tests/integration-features/durability/durable-publication.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-008-publications-for-different-events-are-isolated.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-008-publications-for-different-events-are-isolated.sdp.md new file mode 100644 index 00000000..5c2ce919 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-008-publications-for-different-events-are-isolated.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.durable-publication.publications-for-different-events-are-isolated +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication +--- +# Publications for different events are isolated + +## Intent + +- outcome: Executable scenario "Publications for different events are isolated" from examples/order-management/tests/integration-features/durability/durable-publication.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-001-create-a-running-checkpoint-for-replay.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-001-create-a-running-checkpoint-for-replay.sdp.md new file mode 100644 index 00000000..f718a3dc --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-001-create-a-running-checkpoint-for-replay.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.event-replay.create-a-running-checkpoint-for-replay +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.event-replay +--- +# Create a running checkpoint for replay + +## Intent + +- outcome: Executable scenario "Create a running checkpoint for replay" from examples/order-management/tests/integration-features/durability/event-replay.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-002-update-checkpoint-progress.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-002-update-checkpoint-progress.sdp.md new file mode 100644 index 00000000..35fdf6d2 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-002-update-checkpoint-progress.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.event-replay.update-checkpoint-progress +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.event-replay +--- +# Update checkpoint progress + +## Intent + +- outcome: Executable scenario "Update checkpoint progress" from examples/order-management/tests/integration-features/durability/event-replay.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-003-cannot-start-replay-for-already-running-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-003-cannot-start-replay-for-already-running-projection.sdp.md new file mode 100644 index 00000000..5b7e9ee8 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-003-cannot-start-replay-for-already-running-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.event-replay.cannot-start-replay-for-already-running-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.event-replay +--- +# Cannot start replay for already running projection + +## Intent + +- outcome: Executable scenario "Cannot start replay for already running projection" from examples/order-management/tests/integration-features/durability/event-replay.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-004-query-checkpoint-by-replay-id.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-004-query-checkpoint-by-replay-id.sdp.md new file mode 100644 index 00000000..395efbec --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-004-query-checkpoint-by-replay-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.event-replay.query-checkpoint-by-replay-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.event-replay +--- +# Query checkpoint by replayId + +## Intent + +- outcome: Executable scenario "Query checkpoint by replayId" from examples/order-management/tests/integration-features/durability/event-replay.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-005-list-checkpoints-by-status.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-005-list-checkpoints-by-status.sdp.md new file mode 100644 index 00000000..d246712d --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-005-list-checkpoints-by-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.event-replay.list-checkpoints-by-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.event-replay +--- +# List checkpoints by status + +## Intent + +- outcome: Executable scenario "List checkpoints by status" from examples/order-management/tests/integration-features/durability/event-replay.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-001-append-event-with-unique-idempotency-key-succeeds.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-001-append-event-with-unique-idempotency-key-succeeds.sdp.md new file mode 100644 index 00000000..f3ab2097 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-001-append-event-with-unique-idempotency-key-succeeds.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.idempotent-append.append-event-with-unique-idempotency-key-succeeds +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.idempotent-append +--- +# Append event with unique idempotency key succeeds + +## Intent + +- outcome: Executable scenario "Append event with unique idempotency key succeeds" from examples/order-management/tests/integration-features/durability/idempotent-append.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-002-different-idempotency-keys-create-separate-events.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-002-different-idempotency-keys-create-separate-events.sdp.md new file mode 100644 index 00000000..e4592fe1 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-002-different-idempotency-keys-create-separate-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.idempotent-append.different-idempotency-keys-create-separate-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.idempotent-append +--- +# Different idempotency keys create separate events + +## Intent + +- outcome: Executable scenario "Different idempotency keys create separate events" from examples/order-management/tests/integration-features/durability/idempotent-append.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-003-second-append-with-same-idempotency-key-returns-duplicate.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-003-second-append-with-same-idempotency-key-returns-duplicate.sdp.md new file mode 100644 index 00000000..deab74cb --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-003-second-append-with-same-idempotency-key-returns-duplicate.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.idempotent-append.second-append-with-same-idempotency-key-returns-duplicate +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.idempotent-append +--- +# Second append with same idempotency key returns duplicate + +## Intent + +- outcome: Executable scenario "Second append with same idempotency key returns duplicate" from examples/order-management/tests/integration-features/durability/idempotent-append.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-004-same-key-with-different-payload-is-rejected.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-004-same-key-with-different-payload-is-rejected.sdp.md new file mode 100644 index 00000000..e0c74e86 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-004-same-key-with-different-payload-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.idempotent-append.same-key-with-different-payload-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.idempotent-append +--- +# Same key with different payload is rejected + +## Intent + +- outcome: Executable scenario "Same key with different payload is rejected" from examples/order-management/tests/integration-features/durability/idempotent-append.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-005-same-idempotency-key-on-different-streams-creates-separate-events.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-005-same-idempotency-key-on-different-streams-creates-separate-events.sdp.md new file mode 100644 index 00000000..b9099408 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-005-same-idempotency-key-on-different-streams-creates-separate-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.idempotent-append.same-idempotency-key-on-different-streams-creates-separate-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.idempotent-append +--- +# Same idempotency key on different streams creates separate events + +## Intent + +- outcome: Executable scenario "Same idempotency key on different streams creates separate events" from examples/order-management/tests/integration-features/durability/idempotent-append.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-001-intent-exceeding-timeout-is-flagged-as-abandoned.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-001-intent-exceeding-timeout-is-flagged-as-abandoned.sdp.md new file mode 100644 index 00000000..0c49e5a3 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-001-intent-exceeding-timeout-is-flagged-as-abandoned.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.orphan-detection.intent-exceeding-timeout-is-flagged-as-abandoned +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.orphan-detection +--- +# Intent exceeding timeout is flagged as abandoned + +## Intent + +- outcome: Executable scenario "Intent exceeding timeout is flagged as abandoned" from examples/order-management/tests/integration-features/durability/orphan-detection.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-002-intent-within-timeout-is-not-flagged.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-002-intent-within-timeout-is-not-flagged.sdp.md new file mode 100644 index 00000000..1bb43c55 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-002-intent-within-timeout-is-not-flagged.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.orphan-detection.intent-within-timeout-is-not-flagged +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.orphan-detection +--- +# Intent within timeout is not flagged + +## Intent + +- outcome: Executable scenario "Intent within timeout is not flagged" from examples/order-management/tests/integration-features/durability/orphan-detection.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-003-completed-intent-is-not-flagged-even-if-old.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-003-completed-intent-is-not-flagged-even-if-old.sdp.md new file mode 100644 index 00000000..f3393b82 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-003-completed-intent-is-not-flagged-even-if-old.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.orphan-detection.completed-intent-is-not-flagged-even-if-old +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.orphan-detection +--- +# Completed intent is not flagged even if old + +## Intent + +- outcome: Executable scenario "Completed intent is not flagged even if old" from examples/order-management/tests/integration-features/durability/orphan-detection.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-004-failed-intent-is-not-flagged-even-if-old.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-004-failed-intent-is-not-flagged-even-if-old.sdp.md new file mode 100644 index 00000000..962e0a67 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-004-failed-intent-is-not-flagged-even-if-old.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.orphan-detection.failed-intent-is-not-flagged-even-if-old +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.orphan-detection +--- +# Failed intent is not flagged even if old + +## Intent + +- outcome: Executable scenario "Failed intent is not flagged even if old" from examples/order-management/tests/integration-features/durability/orphan-detection.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-005-list-abandoned-intents-for-investigation.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-005-list-abandoned-intents-for-investigation.sdp.md new file mode 100644 index 00000000..228651bf --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-005-list-abandoned-intents-for-investigation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.orphan-detection.list-abandoned-intents-for-investigation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.orphan-detection +--- +# List abandoned intents for investigation + +## Intent + +- outcome: Executable scenario "List abandoned intents for investigation" from examples/order-management/tests/integration-features/durability/orphan-detection.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-006-timeout-handler-marks-pending-intent-as-abandoned.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-006-timeout-handler-marks-pending-intent-as-abandoned.sdp.md new file mode 100644 index 00000000..1d3290d7 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-006-timeout-handler-marks-pending-intent-as-abandoned.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.orphan-detection.timeout-handler-marks-pending-intent-as-abandoned +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.orphan-detection +--- +# Timeout handler marks pending intent as abandoned + +## Intent + +- outcome: Executable scenario "Timeout handler marks pending intent as abandoned" from examples/order-management/tests/integration-features/durability/orphan-detection.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-007-timeout-handler-no-ops-for-completed-intent.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-007-timeout-handler-no-ops-for-completed-intent.sdp.md new file mode 100644 index 00000000..8539fce5 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-007-timeout-handler-no-ops-for-completed-intent.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.orphan-detection.timeout-handler-no-ops-for-completed-intent +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.orphan-detection +--- +# Timeout handler no-ops for completed intent + +## Intent + +- outcome: Executable scenario "Timeout handler no-ops for completed intent" from examples/order-management/tests/integration-features/durability/orphan-detection.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-001-first-failure-creates-pending-poison-record.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-001-first-failure-creates-pending-poison-record.sdp.md new file mode 100644 index 00000000..d07ca3fb --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-001-first-failure-creates-pending-poison-record.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.poison-event.first-failure-creates-pending-poison-record +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.poison-event +--- +# First failure creates pending poison record + +## Intent + +- outcome: Executable scenario "First failure creates pending poison record" from examples/order-management/tests/integration-features/durability/poison-event.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-002-second-failure-increments-attempt-count.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-002-second-failure-increments-attempt-count.sdp.md new file mode 100644 index 00000000..f360a23e --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-002-second-failure-increments-attempt-count.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.poison-event.second-failure-increments-attempt-count +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.poison-event +--- +# Second failure increments attempt count + +## Intent + +- outcome: Executable scenario "Second failure increments attempt count" from examples/order-management/tests/integration-features/durability/poison-event.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-003-event-quarantined-after-3-failures.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-003-event-quarantined-after-3-failures.sdp.md new file mode 100644 index 00000000..648a5e06 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-003-event-quarantined-after-3-failures.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.poison-event.event-quarantined-after-3-failures +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.poison-event +--- +# Event quarantined after 3 failures + +## Intent + +- outcome: Executable scenario "Event quarantined after 3 failures" from examples/order-management/tests/integration-features/durability/poison-event.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-004-quarantine-captures-error-details.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-004-quarantine-captures-error-details.sdp.md new file mode 100644 index 00000000..0a2d229a --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-004-quarantine-captures-error-details.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.poison-event.quarantine-captures-error-details +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.poison-event +--- +# Quarantine captures error details + +## Intent + +- outcome: Executable scenario "Quarantine captures error details" from examples/order-management/tests/integration-features/durability/poison-event.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-005-quarantined-event-bypasses-handler-completely.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-005-quarantined-event-bypasses-handler-completely.sdp.md new file mode 100644 index 00000000..32741973 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-005-quarantined-event-bypasses-handler-completely.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.poison-event.quarantined-event-bypasses-handler-completely +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.poison-event +--- +# Quarantined event bypasses handler completely + +## Intent + +- outcome: Executable scenario "Quarantined event bypasses handler completely" from examples/order-management/tests/integration-features/durability/poison-event.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-006-unquarantine-resets-status-for-retry.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-006-unquarantine-resets-status-for-retry.sdp.md new file mode 100644 index 00000000..a878fde0 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-006-unquarantine-resets-status-for-retry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.poison-event.unquarantine-resets-status-for-retry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.poison-event +--- +# Unquarantine resets status for retry + +## Intent + +- outcome: Executable scenario "Unquarantine resets status for retry" from examples/order-management/tests/integration-features/durability/poison-event.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-007-unquarantine-of-non-quarantined-event-returns-not-quarantined.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-007-unquarantine-of-non-quarantined-event-returns-not-quarantined.sdp.md new file mode 100644 index 00000000..237ed1b0 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-007-unquarantine-of-non-quarantined-event-returns-not-quarantined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.poison-event.unquarantine-of-non-quarantined-event-returns-not-quarantined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.poison-event +--- +# Unquarantine of non-quarantined event returns not_quarantined + +## Intent + +- outcome: Executable scenario "Unquarantine of non-quarantined event returns not_quarantined" from examples/order-management/tests/integration-features/durability/poison-event.feature diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-008-stats-show-quarantined-event-counts-by-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-008-stats-show-quarantined-event-counts-by-projection.sdp.md new file mode 100644 index 00000000..6f19d63d --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-008-stats-show-quarantined-event-counts-by-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durability.poison-event.stats-show-quarantined-event-counts-by-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durability.poison-event +--- +# Stats show quarantined event counts by projection + +## Intent + +- outcome: Executable scenario "Stats show quarantined event counts by projection" from examples/order-management/tests/integration-features/durability/poison-event.feature diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-001-dcb-operation-succeeds-on-first-attempt.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-001-dcb-operation-succeeds-on-first-attempt.sdp.md new file mode 100644 index 00000000..b58ab921 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-001-dcb-operation-succeeds-on-first-attempt.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry.dcb-operation-succeeds-on-first-attempt +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry +--- +# DCB operation succeeds on first attempt + +## Intent + +- outcome: Executable scenario "DCB operation succeeds on first attempt" from examples/order-management/tests/integration-features/durable-adapters/dcb-retry.feature diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-002-dcb-rejected-result-passes-through-unchanged.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-002-dcb-rejected-result-passes-through-unchanged.sdp.md new file mode 100644 index 00000000..6f1af5bb --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-002-dcb-rejected-result-passes-through-unchanged.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry.dcb-rejected-result-passes-through-unchanged +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry +--- +# DCB rejected result passes through unchanged + +## Intent + +- outcome: Executable scenario "DCB rejected result passes through unchanged" from examples/order-management/tests/integration-features/durable-adapters/dcb-retry.feature diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-003-dcb-conflict-returns-retry-metadata-with-updated-version.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-003-dcb-conflict-returns-retry-metadata-with-updated-version.sdp.md new file mode 100644 index 00000000..9cbf174f --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-003-dcb-conflict-returns-retry-metadata-with-updated-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry.dcb-conflict-returns-retry-metadata-with-updated-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry +--- +# DCB conflict returns retry metadata with updated version + +## Intent + +- outcome: Executable scenario "DCB conflict returns retry metadata with updated version" from examples/order-management/tests/integration-features/durable-adapters/dcb-retry.feature diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md new file mode 100644 index 00000000..c0780812 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry.max-retries-exceeded-returns-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry +--- +# Max retries exceeded returns rejected + +## Intent + +- outcome: Executable scenario "Max retries exceeded returns rejected" from examples/order-management/tests/integration-features/durable-adapters/dcb-retry.feature diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-005-final-scope-conflict-rolls-back-state-updates.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-005-final-scope-conflict-rolls-back-state-updates.sdp.md new file mode 100644 index 00000000..decfc1f7 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-005-final-scope-conflict-rolls-back-state-updates.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry.final-scope-conflict-rolls-back-state-updates +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry +--- +# Final scope conflict rolls back state updates + +## Intent + +- outcome: Executable scenario "Final scope conflict rolls back state updates" from examples/order-management/tests/integration-features/durable-adapters/dcb-retry.feature diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-006-backoff-increases-exponentially.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-006-backoff-increases-exponentially.sdp.md new file mode 100644 index 00000000..29a4fff2 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-006-backoff-increases-exponentially.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry.backoff-increases-exponentially +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry +--- +# Backoff increases exponentially + +## Intent + +- outcome: Executable scenario "Backoff increases exponentially" from examples/order-management/tests/integration-features/durable-adapters/dcb-retry.feature diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-007-backoff-is-capped-at-maximum.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-007-backoff-is-capped-at-maximum.sdp.md new file mode 100644 index 00000000..5a579297 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-007-backoff-is-capped-at-maximum.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry.backoff-is-capped-at-maximum +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry +--- +# Backoff is capped at maximum + +## Intent + +- outcome: Executable scenario "Backoff is capped at maximum" from examples/order-management/tests/integration-features/durable-adapters/dcb-retry.feature diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-008-retries-use-consistent-partition-key.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-008-retries-use-consistent-partition-key.sdp.md new file mode 100644 index 00000000..f85880d2 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-008-retries-use-consistent-partition-key.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry.retries-use-consistent-partition-key +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry +--- +# Retries use consistent partition key + +## Intent + +- outcome: Executable scenario "Retries use consistent partition key" from examples/order-management/tests/integration-features/durable-adapters/dcb-retry.feature diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-001-normal-requests-pass-rate-limiting.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-001-normal-requests-pass-rate-limiting.sdp.md new file mode 100644 index 00000000..d676f78d --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-001-normal-requests-pass-rate-limiting.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting.normal-requests-pass-rate-limiting +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting +--- +# Normal requests pass rate limiting + +## Intent + +- outcome: Executable scenario "Normal requests pass rate limiting" from examples/order-management/tests/integration-features/durable-adapters/rate-limiting.feature diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-002-exhausted-rate-limit-rejects-request.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-002-exhausted-rate-limit-rejects-request.sdp.md new file mode 100644 index 00000000..0935f6c1 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-002-exhausted-rate-limit-rejects-request.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting.exhausted-rate-limit-rejects-request +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting +--- +# Exhausted rate limit rejects request + +## Intent + +- outcome: Executable scenario "Exhausted rate limit rejects request" from examples/order-management/tests/integration-features/durable-adapters/rate-limiting.feature diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-003-different-users-have-independent-limits.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-003-different-users-have-independent-limits.sdp.md new file mode 100644 index 00000000..57deec8e --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-003-different-users-have-independent-limits.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting.different-users-have-independent-limits +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting +--- +# Different users have independent limits + +## Intent + +- outcome: Executable scenario "Different users have independent limits" from examples/order-management/tests/integration-features/durable-adapters/rate-limiting.feature diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md new file mode 100644 index 00000000..29bedb86 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting.same-user-different-command-types-have-independent-limits +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting +--- +# Same user different command types have independent limits + +## Intent + +- outcome: Executable scenario "Same user different command types have independent limits" from examples/order-management/tests/integration-features/durable-adapters/rate-limiting.feature diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-005-rate-limited-command-returns-standard-rejection.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-005-rate-limited-command-returns-standard-rejection.sdp.md new file mode 100644 index 00000000..c9d99736 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-005-rate-limited-command-returns-standard-rejection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting.rate-limited-command-returns-standard-rejection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting +--- +# Rate limited command returns standard rejection + +## Intent + +- outcome: Executable scenario "Rate limited command returns standard rejection" from examples/order-management/tests/integration-features/durable-adapters/rate-limiting.feature diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-006-health-check-commands-bypass-rate-limiting.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-006-health-check-commands-bypass-rate-limiting.sdp.md new file mode 100644 index 00000000..1da003bb --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-006-health-check-commands-bypass-rate-limiting.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting.health-check-commands-bypass-rate-limiting +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting +--- +# Health check commands bypass rate limiting + +## Intent + +- outcome: Executable scenario "Health check commands bypass rate limiting" from examples/order-management/tests/integration-features/durable-adapters/rate-limiting.feature diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-007-high-volume-rate-limit-uses-sharded-counting.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-007-high-volume-rate-limit-uses-sharded-counting.sdp.md new file mode 100644 index 00000000..de9110fc --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-007-high-volume-rate-limit-uses-sharded-counting.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting.high-volume-rate-limit-uses-sharded-counting +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting +--- +# High-volume rate limit uses sharded counting + +## Intent + +- outcome: Executable scenario "High-volume rate limit uses sharded counting" from examples/order-management/tests/integration-features/durable-adapters/rate-limiting.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md new file mode 100644 index 00000000..c0d7e09a --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.add-stock.successfully-add-stock-to-existing-product +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.add-stock +--- +# Successfully add stock to existing product + +## Intent + +- outcome: Executable scenario "Successfully add stock to existing product" from examples/order-management/tests/integration-features/inventory/add-stock.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-002-reject-adding-stock-to-non-existent-product.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-002-reject-adding-stock-to-non-existent-product.sdp.md new file mode 100644 index 00000000..1dd0c3ae --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-002-reject-adding-stock-to-non-existent-product.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.add-stock.reject-adding-stock-to-non-existent-product +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.add-stock +--- +# Reject adding stock to non-existent product + +## Intent + +- outcome: Executable scenario "Reject adding stock to non-existent product" from examples/order-management/tests/integration-features/inventory/add-stock.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-003-add-stock-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-003-add-stock-is-idempotent-with-same-command-id.sdp.md new file mode 100644 index 00000000..6e15670a --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-003-add-stock-is-idempotent-with-same-command-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.add-stock.add-stock-is-idempotent-with-same-command-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.add-stock +--- +# AddStock is idempotent with same commandId + +## Intent + +- outcome: Executable scenario "AddStock is idempotent with same commandId" from examples/order-management/tests/integration-features/inventory/add-stock.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-001-confirm-pending-reservation.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-001-confirm-pending-reservation.sdp.md new file mode 100644 index 00000000..ba7e90fa --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-001-confirm-pending-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.confirm-reservation.confirm-pending-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.confirm-reservation +--- +# Confirm pending reservation + +## Intent + +- outcome: Executable scenario "Confirm pending reservation" from examples/order-management/tests/integration-features/inventory/confirm-reservation.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-002-reject-confirming-already-confirmed-reservation.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-002-reject-confirming-already-confirmed-reservation.sdp.md new file mode 100644 index 00000000..a2884a20 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-002-reject-confirming-already-confirmed-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.confirm-reservation.reject-confirming-already-confirmed-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.confirm-reservation +--- +# Reject confirming already confirmed reservation + +## Intent + +- outcome: Executable scenario "Reject confirming already confirmed reservation" from examples/order-management/tests/integration-features/inventory/confirm-reservation.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-003-reject-confirming-non-existent-reservation.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-003-reject-confirming-non-existent-reservation.sdp.md new file mode 100644 index 00000000..a6e3b88e --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-003-reject-confirming-non-existent-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.confirm-reservation.reject-confirming-non-existent-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.confirm-reservation +--- +# Reject confirming non-existent reservation + +## Intent + +- outcome: Executable scenario "Reject confirming non-existent reservation" from examples/order-management/tests/integration-features/inventory/confirm-reservation.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-001-successfully-create-a-new-product-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-001-successfully-create-a-new-product-and-verify-projection.sdp.md new file mode 100644 index 00000000..08d262fd --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-001-successfully-create-a-new-product-and-verify-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.create-product.successfully-create-a-new-product-and-verify-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.create-product +--- +# Successfully create a new product and verify projection + +## Intent + +- outcome: Executable scenario "Successfully create a new product and verify projection" from examples/order-management/tests/integration-features/inventory/create-product.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-002-reject-duplicate-product-id.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-002-reject-duplicate-product-id.sdp.md new file mode 100644 index 00000000..cb2d9d4a --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-002-reject-duplicate-product-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.create-product.reject-duplicate-product-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.create-product +--- +# Reject duplicate product ID + +## Intent + +- outcome: Executable scenario "Reject duplicate product ID" from examples/order-management/tests/integration-features/inventory/create-product.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-003-reject-duplicate-sku.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-003-reject-duplicate-sku.sdp.md new file mode 100644 index 00000000..38922679 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-003-reject-duplicate-sku.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.create-product.reject-duplicate-sku +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.create-product +--- +# Reject duplicate SKU + +## Intent + +- outcome: Executable scenario "Reject duplicate SKU" from examples/order-management/tests/integration-features/inventory/create-product.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-004-create-product-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-004-create-product-is-idempotent-with-same-command-id.sdp.md new file mode 100644 index 00000000..46c59111 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-004-create-product-is-idempotent-with-same-command-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.create-product.create-product-is-idempotent-with-same-command-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.create-product +--- +# CreateProduct is idempotent with same commandId + +## Intent + +- outcome: Executable scenario "CreateProduct is idempotent with same commandId" from examples/order-management/tests/integration-features/inventory/create-product.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-001-list-products-returns-all-products.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-001-list-products-returns-all-products.sdp.md new file mode 100644 index 00000000..9727e352 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-001-list-products-returns-all-products.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.query-inventory.list-products-returns-all-products +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.query-inventory +--- +# List products returns all products + +## Intent + +- outcome: Executable scenario "List products returns all products" from examples/order-management/tests/integration-features/inventory/query-inventory.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-002-get-stock-availability-for-product.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-002-get-stock-availability-for-product.sdp.md new file mode 100644 index 00000000..1185cfea --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-002-get-stock-availability-for-product.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.query-inventory.get-stock-availability-for-product +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.query-inventory +--- +# Get stock availability for product + +## Intent + +- outcome: Executable scenario "Get stock availability for product" from examples/order-management/tests/integration-features/inventory/query-inventory.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-003-check-availability-for-multiple-items.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-003-check-availability-for-multiple-items.sdp.md new file mode 100644 index 00000000..2f1885ea --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-003-check-availability-for-multiple-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.query-inventory.check-availability-for-multiple-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.query-inventory +--- +# Check availability for multiple items + +## Intent + +- outcome: Executable scenario "Check availability for multiple items" from examples/order-management/tests/integration-features/inventory/query-inventory.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-004-get-reservation-by-order-id.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-004-get-reservation-by-order-id.sdp.md new file mode 100644 index 00000000..e6c97f42 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-004-get-reservation-by-order-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.query-inventory.get-reservation-by-order-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.query-inventory +--- +# Get reservation by order ID + +## Intent + +- outcome: Executable scenario "Get reservation by order ID" from examples/order-management/tests/integration-features/inventory/query-inventory.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-001-release-pending-reservation.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-001-release-pending-reservation.sdp.md new file mode 100644 index 00000000..f2f18542 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-001-release-pending-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.release-reservation.release-pending-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.release-reservation +--- +# Release pending reservation + +## Intent + +- outcome: Executable scenario "Release pending reservation" from examples/order-management/tests/integration-features/inventory/release-reservation.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-002-reject-releasing-non-pending-reservation.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-002-reject-releasing-non-pending-reservation.sdp.md new file mode 100644 index 00000000..0cb83b7c --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-002-reject-releasing-non-pending-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.release-reservation.reject-releasing-non-pending-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.release-reservation +--- +# Reject releasing non-pending reservation + +## Intent + +- outcome: Executable scenario "Reject releasing non-pending reservation" from examples/order-management/tests/integration-features/inventory/release-reservation.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-001-expire-pending-reservations-past-ttl.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-001-expire-pending-reservations-past-ttl.sdp.md new file mode 100644 index 00000000..e97c20c7 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-001-expire-pending-reservations-past-ttl.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.reservation-expiration.expire-pending-reservations-past-ttl +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.reservation-expiration +--- +# Expire pending reservations past TTL + +## Intent + +- outcome: Executable scenario "Expire pending reservations past TTL" from examples/order-management/tests/integration-features/inventory/reservation-expiration.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-002-skip-confirmed-reservations.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-002-skip-confirmed-reservations.sdp.md new file mode 100644 index 00000000..e8e5636a --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-002-skip-confirmed-reservations.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.reservation-expiration.skip-confirmed-reservations +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.reservation-expiration +--- +# Skip confirmed reservations + +## Intent + +- outcome: Executable scenario "Skip confirmed reservations" from examples/order-management/tests/integration-features/inventory/reservation-expiration.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-003-skip-reservations-not-yet-expired.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-003-skip-reservations-not-yet-expired.sdp.md new file mode 100644 index 00000000..51b6fbde --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-003-skip-reservations-not-yet-expired.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.reservation-expiration.skip-reservations-not-yet-expired +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.reservation-expiration +--- +# Skip reservations not yet expired + +## Intent + +- outcome: Executable scenario "Skip reservations not yet expired" from examples/order-management/tests/integration-features/inventory/reservation-expiration.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-004-batch-expiration-of-multiple-reservations.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-004-batch-expiration-of-multiple-reservations.sdp.md new file mode 100644 index 00000000..bc6d2cd3 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-004-batch-expiration-of-multiple-reservations.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.reservation-expiration.batch-expiration-of-multiple-reservations +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.reservation-expiration +--- +# Batch expiration of multiple reservations + +## Intent + +- outcome: Executable scenario "Batch expiration of multiple reservations" from examples/order-management/tests/integration-features/inventory/reservation-expiration.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-001-reserve-stock-successfully.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-001-reserve-stock-successfully.sdp.md new file mode 100644 index 00000000..39338a95 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-001-reserve-stock-successfully.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock.reserve-stock-successfully +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock +--- +# Reserve stock successfully + +## Intent + +- outcome: Executable scenario "Reserve stock successfully" from examples/order-management/tests/integration-features/inventory/reserve-stock.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-002-reserve-stock-for-multiple-items.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-002-reserve-stock-for-multiple-items.sdp.md new file mode 100644 index 00000000..59cf18da --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-002-reserve-stock-for-multiple-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock.reserve-stock-for-multiple-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock +--- +# Reserve stock for multiple items + +## Intent + +- outcome: Executable scenario "Reserve stock for multiple items" from examples/order-management/tests/integration-features/inventory/reserve-stock.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-003-reject-when-insufficient-stock.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-003-reject-when-insufficient-stock.sdp.md new file mode 100644 index 00000000..c3d4b240 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-003-reject-when-insufficient-stock.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock.reject-when-insufficient-stock +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock +--- +# Reject when insufficient stock + +## Intent + +- outcome: Executable scenario "Reject when insufficient stock" from examples/order-management/tests/integration-features/inventory/reserve-stock.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-004-all-or-nothing-reservation-when-one-item-fails.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-004-all-or-nothing-reservation-when-one-item-fails.sdp.md new file mode 100644 index 00000000..2decc79e --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-004-all-or-nothing-reservation-when-one-item-fails.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock.all-or-nothing-reservation-when-one-item-fails +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock +--- +# All-or-nothing reservation when one item fails + +## Intent + +- outcome: Executable scenario "All-or-nothing reservation when one item fails" from examples/order-management/tests/integration-features/inventory/reserve-stock.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-005-reject-for-non-existent-product.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-005-reject-for-non-existent-product.sdp.md new file mode 100644 index 00000000..c09e44ba --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-005-reject-for-non-existent-product.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock.reject-for-non-existent-product +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock +--- +# Reject for non-existent product + +## Intent + +- outcome: Executable scenario "Reject for non-existent product" from examples/order-management/tests/integration-features/inventory/reserve-stock.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-006-return-failed-status-when-reservation-fails.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-006-return-failed-status-when-reservation-fails.sdp.md new file mode 100644 index 00000000..096751ef --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-006-return-failed-status-when-reservation-fails.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock.return-failed-status-when-reservation-fails +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock +--- +# Return failed status when reservation fails + +## Intent + +- outcome: Executable scenario "Return failed status when reservation fails" from examples/order-management/tests/integration-features/inventory/reserve-stock.feature diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-007-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-007-idempotent-with-same-command-id.sdp.md new file mode 100644 index 00000000..89e3f5e3 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-007-idempotent-with-same-command-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock.idempotent-with-same-command-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock +--- +# Idempotent with same commandId + +## Intent + +- outcome: Executable scenario "Idempotent with same commandId" from examples/order-management/tests/integration-features/inventory/reserve-stock.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-001-add-item-to-draft-order-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-001-add-item-to-draft-order-and-verify-projection.sdp.md new file mode 100644 index 00000000..97b9c221 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-001-add-item-to-draft-order-and-verify-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.add-order-item.add-item-to-draft-order-and-verify-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.add-order-item +--- +# Add item to draft order and verify projection + +## Intent + +- outcome: Executable scenario "Add item to draft order and verify projection" from examples/order-management/tests/integration-features/orders/add-order-item.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-002-reject-adding-item-to-submitted-order.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-002-reject-adding-item-to-submitted-order.sdp.md new file mode 100644 index 00000000..983dc11d --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-002-reject-adding-item-to-submitted-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.add-order-item.reject-adding-item-to-submitted-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.add-order-item +--- +# Reject adding item to submitted order + +## Intent + +- outcome: Executable scenario "Reject adding item to submitted order" from examples/order-management/tests/integration-features/orders/add-order-item.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-001-add-multiple-items-to-order-in-batch.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-001-add-multiple-items-to-order-in-batch.sdp.md new file mode 100644 index 00000000..780ded83 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-001-add-multiple-items-to-order-in-batch.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.batch-operations.add-multiple-items-to-order-in-batch +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.batch-operations +--- +# Add multiple items to order in batch + +## Intent + +- outcome: Executable scenario "Add multiple items to order in batch" from examples/order-management/tests/integration-features/orders/batch-operations.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-002-batch-respects-order-of-execution.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-002-batch-respects-order-of-execution.sdp.md new file mode 100644 index 00000000..bff1e86d --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-002-batch-respects-order-of-execution.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.batch-operations.batch-respects-order-of-execution +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.batch-operations +--- +# Batch respects order of execution + +## Intent + +- outcome: Executable scenario "Batch respects order of execution" from examples/order-management/tests/integration-features/orders/batch-operations.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-003-batch-stops-on-first-failure-in-atomic-mode.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-003-batch-stops-on-first-failure-in-atomic-mode.sdp.md new file mode 100644 index 00000000..74663bbd --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-003-batch-stops-on-first-failure-in-atomic-mode.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.batch-operations.batch-stops-on-first-failure-in-atomic-mode +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.batch-operations +--- +# Batch stops on first failure in atomic mode + +## Intent + +- outcome: Executable scenario "Batch stops on first failure in atomic mode" from examples/order-management/tests/integration-features/orders/batch-operations.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-001-cancel-draft-order-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-001-cancel-draft-order-and-verify-projection.sdp.md new file mode 100644 index 00000000..bf5011ea --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-001-cancel-draft-order-and-verify-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.cancel-order.cancel-draft-order-and-verify-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.cancel-order +--- +# Cancel draft order and verify projection + +## Intent + +- outcome: Executable scenario "Cancel draft order and verify projection" from examples/order-management/tests/integration-features/orders/cancel-order.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-002-cancel-submitted-order-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-002-cancel-submitted-order-and-verify-projection.sdp.md new file mode 100644 index 00000000..e717a8bf --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-002-cancel-submitted-order-and-verify-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.cancel-order.cancel-submitted-order-and-verify-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.cancel-order +--- +# Cancel submitted order and verify projection + +## Intent + +- outcome: Executable scenario "Cancel submitted order and verify projection" from examples/order-management/tests/integration-features/orders/cancel-order.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-003-reject-cancelling-already-cancelled-order.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-003-reject-cancelling-already-cancelled-order.sdp.md new file mode 100644 index 00000000..236a10bf --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-003-reject-cancelling-already-cancelled-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.cancel-order.reject-cancelling-already-cancelled-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.cancel-order +--- +# Reject cancelling already cancelled order + +## Intent + +- outcome: Executable scenario "Reject cancelling already cancelled order" from examples/order-management/tests/integration-features/orders/cancel-order.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-004-cancel-confirmed-order-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-004-cancel-confirmed-order-and-verify-projection.sdp.md new file mode 100644 index 00000000..ae0f7f3d --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-004-cancel-confirmed-order-and-verify-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.cancel-order.cancel-confirmed-order-and-verify-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.cancel-order +--- +# Cancel confirmed order and verify projection + +## Intent + +- outcome: Executable scenario "Cancel confirmed order and verify projection" from examples/order-management/tests/integration-features/orders/cancel-order.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-005-reservation-is-released-when-confirmed-order-is-cancelled.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-005-reservation-is-released-when-confirmed-order-is-cancelled.sdp.md new file mode 100644 index 00000000..40abe989 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-005-reservation-is-released-when-confirmed-order-is-cancelled.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.cancel-order.reservation-is-released-when-confirmed-order-is-cancelled +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.cancel-order +--- +# Reservation is released when confirmed order is cancelled + +## Intent + +- outcome: Executable scenario "Reservation is released when confirmed order is cancelled" from examples/order-management/tests/integration-features/orders/cancel-order.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-006-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-006-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md new file mode 100644 index 00000000..a032b480 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-006-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.cancel-order.cancelling-draft-order-does-not-trigger-reservation-release +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.cancel-order +--- +# Cancelling draft order does not trigger reservation release + +## Intent + +- outcome: Executable scenario "Cancelling draft order does not trigger reservation release" from examples/order-management/tests/integration-features/orders/cancel-order.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-007-cancelling-submitted-order-before-saga-completion-releases-pending-reserva.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-007-cancelling-submitted-order-before-saga-completion-releases-pending-reserva.sdp.md new file mode 100644 index 00000000..c0bdb60d --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-007-cancelling-submitted-order-before-saga-completion-releases-pending-reserva.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.cancel-order.cancelling-submitted-order-before-saga-completion-releases-pending-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.cancel-order +--- +# Cancelling submitted order before saga completion releases pending reservation + +## Intent + +- outcome: Executable scenario "Cancelling submitted order before saga completion releases pending reservation" from examples/order-management/tests/integration-features/orders/cancel-order.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-008-pm-handles-already-released-reservation-gracefully.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-008-pm-handles-already-released-reservation-gracefully.sdp.md new file mode 100644 index 00000000..7ab118d6 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-008-pm-handles-already-released-reservation-gracefully.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.cancel-order.pm-handles-already-released-reservation-gracefully +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.cancel-order +--- +# PM handles already released reservation gracefully + +## Intent + +- outcome: Executable scenario "PM handles already released reservation gracefully" from examples/order-management/tests/integration-features/orders/cancel-order.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-009-pm-skips-expired-reservation-when-order-is-cancelled.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-009-pm-skips-expired-reservation-when-order-is-cancelled.sdp.md new file mode 100644 index 00000000..60218d11 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-009-pm-skips-expired-reservation-when-order-is-cancelled.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.cancel-order.pm-skips-expired-reservation-when-order-is-cancelled +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.cancel-order +--- +# PM skips expired reservation when order is cancelled + +## Intent + +- outcome: Executable scenario "PM skips expired reservation when order is cancelled" from examples/order-management/tests/integration-features/orders/cancel-order.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-001-successfully-create-a-new-order-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-001-successfully-create-a-new-order-and-verify-projection.sdp.md new file mode 100644 index 00000000..6214b30c --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-001-successfully-create-a-new-order-and-verify-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.create-order.successfully-create-a-new-order-and-verify-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.create-order +--- +# Successfully create a new order and verify projection + +## Intent + +- outcome: Executable scenario "Successfully create a new order and verify projection" from examples/order-management/tests/integration-features/orders/create-order.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-002-reject-duplicate-order-id.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-002-reject-duplicate-order-id.sdp.md new file mode 100644 index 00000000..3e2250f0 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-002-reject-duplicate-order-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.create-order.reject-duplicate-order-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.create-order +--- +# Reject duplicate order ID + +## Intent + +- outcome: Executable scenario "Reject duplicate order ID" from examples/order-management/tests/integration-features/orders/create-order.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md new file mode 100644 index 00000000..14143c8a --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.create-order.create-order-is-idempotent-with-same-command-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.create-order +--- +# CreateOrder is idempotent with same commandId + +## Intent + +- outcome: Executable scenario "CreateOrder is idempotent with same commandId" from examples/order-management/tests/integration-features/orders/create-order.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-001-query-orders-by-customer-id.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-001-query-orders-by-customer-id.sdp.md new file mode 100644 index 00000000..6b815548 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-001-query-orders-by-customer-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.query-orders.query-orders-by-customer-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.query-orders +--- +# Query orders by customer ID + +## Intent + +- outcome: Executable scenario "Query orders by customer ID" from examples/order-management/tests/integration-features/orders/query-orders.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-002-query-orders-by-status.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-002-query-orders-by-status.sdp.md new file mode 100644 index 00000000..12f0d61c --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-002-query-orders-by-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.query-orders.query-orders-by-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.query-orders +--- +# Query orders by status + +## Intent + +- outcome: Executable scenario "Query orders by status" from examples/order-management/tests/integration-features/orders/query-orders.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-003-remove-item-from-draft-order-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-003-remove-item-from-draft-order-and-verify-projection.sdp.md new file mode 100644 index 00000000..93119299 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-003-remove-item-from-draft-order-and-verify-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.query-orders.remove-item-from-draft-order-and-verify-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.query-orders +--- +# Remove item from draft order and verify projection + +## Intent + +- outcome: Executable scenario "Remove item from draft order and verify projection" from examples/order-management/tests/integration-features/orders/query-orders.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-001-submit-order-with-items-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-001-submit-order-with-items-and-verify-projection.sdp.md new file mode 100644 index 00000000..19c3013a --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-001-submit-order-with-items-and-verify-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.submit-order.submit-order-with-items-and-verify-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.submit-order +--- +# Submit order with items and verify projection + +## Intent + +- outcome: Executable scenario "Submit order with items and verify projection" from examples/order-management/tests/integration-features/orders/submit-order.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-002-reject-submitting-empty-order.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-002-reject-submitting-empty-order.sdp.md new file mode 100644 index 00000000..86a735c4 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-002-reject-submitting-empty-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.submit-order.reject-submitting-empty-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.submit-order +--- +# Reject submitting empty order + +## Intent + +- outcome: Executable scenario "Reject submitting empty order" from examples/order-management/tests/integration-features/orders/submit-order.feature diff --git a/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-003-reject-submitting-already-submitted-order.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-003-reject-submitting-already-submitted-order.sdp.md new file mode 100644 index 00000000..aedf4fb8 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-003-reject-submitting-already-submitted-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.orders.submit-order.reject-submitting-already-submitted-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.orders.submit-order +--- +# Reject submitting already submitted order + +## Intent + +- outcome: Executable scenario "Reject submitting already submitted order" from examples/order-management/tests/integration-features/orders/submit-order.feature diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-001-complete-saga-when-stock-is-available-for-single-item-order.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-001-complete-saga-when-stock-is-available-for-single-item-order.sdp.md new file mode 100644 index 00000000..b82d7473 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-001-complete-saga-when-stock-is-available-for-single-item-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment.complete-saga-when-stock-is-available-for-single-item-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment +--- +# Complete saga when stock is available for single item order + +## Intent + +- outcome: Executable scenario "Complete saga when stock is available for single item order" from examples/order-management/tests/integration-features/sagas/order-fulfillment.feature diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-002-complete-saga-when-stock-is-available-for-multi-item-order.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-002-complete-saga-when-stock-is-available-for-multi-item-order.sdp.md new file mode 100644 index 00000000..288df5a1 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-002-complete-saga-when-stock-is-available-for-multi-item-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment.complete-saga-when-stock-is-available-for-multi-item-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment +--- +# Complete saga when stock is available for multi-item order + +## Intent + +- outcome: Executable scenario "Complete saga when stock is available for multi-item order" from examples/order-management/tests/integration-features/sagas/order-fulfillment.feature diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-003-cancel-order-when-insufficient-stock-for-single-item.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-003-cancel-order-when-insufficient-stock-for-single-item.sdp.md new file mode 100644 index 00000000..ad003628 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-003-cancel-order-when-insufficient-stock-for-single-item.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment.cancel-order-when-insufficient-stock-for-single-item +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment +--- +# Cancel order when insufficient stock for single item + +## Intent + +- outcome: Executable scenario "Cancel order when insufficient stock for single item" from examples/order-management/tests/integration-features/sagas/order-fulfillment.feature diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-004-cancel-order-when-one-item-in-multi-item-order-has-insufficient-stock.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-004-cancel-order-when-one-item-in-multi-item-order-has-insufficient-stock.sdp.md new file mode 100644 index 00000000..e1637c65 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-004-cancel-order-when-one-item-in-multi-item-order-has-insufficient-stock.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment.cancel-order-when-one-item-in-multi-item-order-has-insufficient-stock +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment +--- +# Cancel order when one item in multi-item order has insufficient stock + +## Intent + +- outcome: Executable scenario "Cancel order when one item in multi-item order has insufficient stock" from examples/order-management/tests/integration-features/sagas/order-fulfillment.feature diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-005-saga-runs-only-once-per-order.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-005-saga-runs-only-once-per-order.sdp.md new file mode 100644 index 00000000..5a214192 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-005-saga-runs-only-once-per-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment.saga-runs-only-once-per-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment +--- +# Saga runs only once per order + +## Intent + +- outcome: Executable scenario "Saga runs only once per order" from examples/order-management/tests/integration-features/sagas/order-fulfillment.feature diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-006-saga-status-is-completed-after-successful-fulfillment.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-006-saga-status-is-completed-after-successful-fulfillment.sdp.md new file mode 100644 index 00000000..feca56d0 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-006-saga-status-is-completed-after-successful-fulfillment.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment.saga-status-is-completed-after-successful-fulfillment +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment +--- +# Saga status is completed after successful fulfillment + +## Intent + +- outcome: Executable scenario "Saga status is completed after successful fulfillment" from examples/order-management/tests/integration-features/sagas/order-fulfillment.feature diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-007-saga-status-is-completed-after-compensation.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-007-saga-status-is-completed-after-compensation.sdp.md new file mode 100644 index 00000000..e555f0a9 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-007-saga-status-is-completed-after-compensation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment.saga-status-is-completed-after-compensation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment +--- +# Saga status is completed after compensation + +## Intent + +- outcome: Executable scenario "Saga status is completed after compensation" from examples/order-management/tests/integration-features/sagas/order-fulfillment.feature diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-008-saga-has-completed-at-timestamp-after-completion.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-008-saga-has-completed-at-timestamp-after-completion.sdp.md new file mode 100644 index 00000000..e56bab07 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-008-saga-has-completed-at-timestamp-after-completion.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment.saga-has-completed-at-timestamp-after-completion +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment +--- +# Saga has completedAt timestamp after completion + +## Intent + +- outcome: Executable scenario "Saga has completedAt timestamp after completion" from examples/order-management/tests/integration-features/sagas/order-fulfillment.feature diff --git a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-001-get-saga-details-returns-workflow-id-for-completed-saga.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-001-get-saga-details-returns-workflow-id-for-completed-saga.sdp.md new file mode 100644 index 00000000..94547b17 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-001-get-saga-details-returns-workflow-id-for-completed-saga.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.sagas.saga-admin.get-saga-details-returns-workflow-id-for-completed-saga +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.sagas.saga-admin +--- +# Get saga details returns workflow ID for completed saga + +## Intent + +- outcome: Executable scenario "Get saga details returns workflow ID for completed saga" from examples/order-management/tests/integration-features/sagas/saga-admin.feature diff --git a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-002-get-saga-steps-returns-step-history.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-002-get-saga-steps-returns-step-history.sdp.md new file mode 100644 index 00000000..ac638a0d --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-002-get-saga-steps-returns-step-history.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.sagas.saga-admin.get-saga-steps-returns-step-history +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.sagas.saga-admin +--- +# Get saga steps returns step history + +## Intent + +- outcome: Executable scenario "Get saga steps returns step history" from examples/order-management/tests/integration-features/sagas/saga-admin.feature diff --git a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-003-get-saga-steps-returns-null-for-non-existent-saga.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-003-get-saga-steps-returns-null-for-non-existent-saga.sdp.md new file mode 100644 index 00000000..c4c3d4c4 --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-003-get-saga-steps-returns-null-for-non-existent-saga.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.sagas.saga-admin.get-saga-steps-returns-null-for-non-existent-saga +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.sagas.saga-admin +--- +# Get saga steps returns null for non-existent saga + +## Intent + +- outcome: Executable scenario "Get saga steps returns null for non-existent saga" from examples/order-management/tests/integration-features/sagas/saga-admin.feature diff --git a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-004-cancel-completed-saga-returns-invalid-state.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-004-cancel-completed-saga-returns-invalid-state.sdp.md new file mode 100644 index 00000000..039212ad --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-004-cancel-completed-saga-returns-invalid-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.sagas.saga-admin.cancel-completed-saga-returns-invalid-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.sagas.saga-admin +--- +# Cancel completed saga returns invalid_state + +## Intent + +- outcome: Executable scenario "Cancel completed saga returns invalid_state" from examples/order-management/tests/integration-features/sagas/saga-admin.feature diff --git a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-005-cancel-non-existent-saga-returns-not-found.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-005-cancel-non-existent-saga-returns-not-found.sdp.md new file mode 100644 index 00000000..d825075d --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-005-cancel-non-existent-saga-returns-not-found.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.sagas.saga-admin.cancel-non-existent-saga-returns-not-found +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.sagas.saga-admin +--- +# Cancel non-existent saga returns not_found + +## Intent + +- outcome: Executable scenario "Cancel non-existent saga returns not_found" from examples/order-management/tests/integration-features/sagas/saga-admin.feature diff --git a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-006-cleanup-completed-saga-workflow.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-006-cleanup-completed-saga-workflow.sdp.md new file mode 100644 index 00000000..c67d14bc --- /dev/null +++ b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-006-cleanup-completed-saga-workflow.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.tests.integration-features.sagas.saga-admin.cleanup-completed-saga-workflow +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.tests.integration-features.sagas.saga-admin +--- +# Cleanup completed saga workflow + +## Intent + +- outcome: Executable scenario "Cleanup completed saga workflow" from examples/order-management/tests/integration-features/sagas/saga-admin.feature diff --git a/specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-001-all-feature-files-pass-schema-validation.sdp.md b/specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-001-all-feature-files-pass-schema-validation.sdp.md new file mode 100644 index 00000000..31f78f7d --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-001-all-feature-files-pass-schema-validation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-23-process-setup.all-feature-files-pass-schema-validation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.timeline.phase-23-process-setup +--- +# All feature files pass schema validation + +## Intent + +- outcome: Executable scenario "All feature files pass schema validation" from examples/order-management/tests/features/timeline/phase-23-process-setup.feature diff --git a/specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-002-roadmap-md-reflects-planned-phases.sdp.md b/specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-002-roadmap-md-reflects-planned-phases.sdp.md new file mode 100644 index 00000000..d1f97ecf --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-002-roadmap-md-reflects-planned-phases.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-23-process-setup.roadmap-md-reflects-planned-phases +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.timeline.phase-23-process-setup +--- +# ROADMAP.md reflects planned phases + +## Intent + +- outcome: Executable scenario "ROADMAP.md reflects planned phases" from examples/order-management/tests/features/timeline/phase-23-process-setup.feature diff --git a/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-001-historical-deliverables-are-preserved.sdp.md b/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-001-historical-deliverables-are-preserved.sdp.md new file mode 100644 index 00000000..d2416757 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-001-historical-deliverables-are-preserved.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-24-old-roadmap-porting.historical-deliverables-are-preserved +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.timeline.phase-24-old-roadmap-porting +--- +# Historical deliverables are preserved + +## Intent + +- outcome: Executable scenario "Historical deliverables are preserved" from examples/order-management/tests/features/timeline/phase-24-old-roadmap-porting.feature diff --git a/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-002-incomplete-phases-deferred-appropriately.sdp.md b/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-002-incomplete-phases-deferred-appropriately.sdp.md new file mode 100644 index 00000000..dc7272b6 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-002-incomplete-phases-deferred-appropriately.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-24-old-roadmap-porting.incomplete-phases-deferred-appropriately +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.timeline.phase-24-old-roadmap-porting +--- +# Incomplete phases deferred appropriately + +## Intent + +- outcome: Executable scenario "Incomplete phases deferred appropriately" from examples/order-management/tests/features/timeline/phase-24-old-roadmap-porting.feature diff --git a/specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-001-ad-rs-are-accessible-through-generated-docs.sdp.md b/specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-001-ad-rs-are-accessible-through-generated-docs.sdp.md new file mode 100644 index 00000000..f56bbc53 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-001-ad-rs-are-accessible-through-generated-docs.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-25-adr-porting.ad-rs-are-accessible-through-generated-docs +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.timeline.phase-25-adr-porting +--- +# ADRs are accessible through generated docs + +## Intent + +- outcome: Executable scenario "ADRs are accessible through generated docs" from examples/order-management/tests/features/timeline/phase-25-adr-porting.feature diff --git a/specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-002-adr-validity-is-assessed-against-new-roadmap.sdp.md b/specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-002-adr-validity-is-assessed-against-new-roadmap.sdp.md new file mode 100644 index 00000000..5b947030 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-002-adr-validity-is-assessed-against-new-roadmap.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-25-adr-porting.adr-validity-is-assessed-against-new-roadmap +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.timeline.phase-25-adr-porting +--- +# ADR validity is assessed against new roadmap + +## Intent + +- outcome: Executable scenario "ADR validity is assessed against new roadmap" from examples/order-management/tests/features/timeline/phase-25-adr-porting.feature diff --git a/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-001-planning-sessions-have-defined-outputs.sdp.md b/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-001-planning-sessions-have-defined-outputs.sdp.md new file mode 100644 index 00000000..33538292 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-001-planning-sessions-have-defined-outputs.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-26-workflow-configuration.planning-sessions-have-defined-outputs +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.timeline.phase-26-workflow-configuration +--- +# Planning sessions have defined outputs + +## Intent + +- outcome: Executable scenario "Planning sessions have defined outputs" from examples/order-management/tests/features/timeline/phase-26-workflow-configuration.feature diff --git a/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-002-non-code-sessions-are-supported.sdp.md b/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-002-non-code-sessions-are-supported.sdp.md new file mode 100644 index 00000000..e550e4e7 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-002-non-code-sessions-are-supported.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-26-workflow-configuration.non-code-sessions-are-supported +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.timeline.phase-26-workflow-configuration +--- +# Non-code sessions are supported + +## Intent + +- outcome: Executable scenario "Non-code sessions are supported" from examples/order-management/tests/features/timeline/phase-26-workflow-configuration.feature diff --git a/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-003-configuration-inheritance-works.sdp.md b/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-003-configuration-inheritance-works.sdp.md new file mode 100644 index 00000000..5027a0ee --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-003-configuration-inheritance-works.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-26-workflow-configuration.configuration-inheritance-works +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.timeline.phase-26-workflow-configuration +--- +# Configuration inheritance works + +## Intent + +- outcome: Executable scenario "Configuration inheritance works" from examples/order-management/tests/features/timeline/phase-26-workflow-configuration.feature diff --git a/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-001-core-patterns-are-documented-for-roadmap-planning.sdp.md b/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-001-core-patterns-are-documented-for-roadmap-planning.sdp.md new file mode 100644 index 00000000..37dca1ec --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-001-core-patterns-are-documented-for-roadmap-planning.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-27-pattern-annotation-priorities.core-patterns-are-documented-for-roadmap-planning +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.timeline.phase-27-pattern-annotation-priorities +--- +# Core patterns are documented for roadmap planning + +## Intent + +- outcome: Executable scenario "Core patterns are documented for roadmap planning" from examples/order-management/tests/features/timeline/phase-27-pattern-annotation-priorities.feature diff --git a/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-002-progressive-annotation-policy-is-sustainable.sdp.md b/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-002-progressive-annotation-policy-is-sustainable.sdp.md new file mode 100644 index 00000000..e82bc123 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-002-progressive-annotation-policy-is-sustainable.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-27-pattern-annotation-priorities.progressive-annotation-policy-is-sustainable +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.timeline.phase-27-pattern-annotation-priorities +--- +# Progressive annotation policy is sustainable + +## Intent + +- outcome: Executable scenario "Progressive annotation policy is sustainable" from examples/order-management/tests/features/timeline/phase-27-pattern-annotation-priorities.feature diff --git a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-001-claude-md-is-generated-from-modules.sdp.md b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-001-claude-md-is-generated-from-modules.sdp.md new file mode 100644 index 00000000..e8de27fd --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-001-claude-md-is-generated-from-modules.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-28-modular-claude-md.claude-md-is-generated-from-modules +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.timeline.phase-28-modular-claude-md +--- +# CLAUDE.md is generated from modules + +## Intent + +- outcome: Executable scenario "CLAUDE.md is generated from modules" from examples/order-management/tests/features/timeline/phase-28-modular-claude-md.feature diff --git a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-002-variations-produce-different-outputs.sdp.md b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-002-variations-produce-different-outputs.sdp.md new file mode 100644 index 00000000..84768a31 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-002-variations-produce-different-outputs.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-28-modular-claude-md.variations-produce-different-outputs +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.timeline.phase-28-modular-claude-md +--- +# Variations produce different outputs + +## Intent + +- outcome: Executable scenario "Variations produce different outputs" from examples/order-management/tests/features/timeline/phase-28-modular-claude-md.feature diff --git a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-003-pattern-content-is-auto-generated.sdp.md b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-003-pattern-content-is-auto-generated.sdp.md new file mode 100644 index 00000000..b617b22b --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-003-pattern-content-is-auto-generated.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-28-modular-claude-md.pattern-content-is-auto-generated +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.timeline.phase-28-modular-claude-md +--- +# Pattern content is auto-generated + +## Intent + +- outcome: Executable scenario "Pattern content is auto-generated" from examples/order-management/tests/features/timeline/phase-28-modular-claude-md.feature diff --git a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-004-session-templates-are-includable.sdp.md b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-004-session-templates-are-includable.sdp.md new file mode 100644 index 00000000..42f4ded9 --- /dev/null +++ b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-004-session-templates-are-includable.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.order-management.timeline.phase-28-modular-claude-md.session-templates-are-includable +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.order-management.timeline.phase-28-modular-claude-md +--- +# Session templates are includable + +## Intent + +- outcome: Executable scenario "Session templates are includable" from examples/order-management/tests/features/timeline/phase-28-modular-claude-md.feature diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-001-define-command-preserves-literal-command-type.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-001-define-command-preserves-literal-command-type.sdp.md new file mode 100644 index 00000000..bf3afeb4 --- /dev/null +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-001-define-command-preserves-literal-command-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bc-contracts.define-command-preserves-literal-command-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc.bc-contracts +--- +# defineCommand preserves literal commandType + +## Intent + +- outcome: Executable scenario "defineCommand preserves literal commandType" from packages/platform-bc/tests/features/behavior/bc-contracts.feature diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-002-define-command-includes-all-metadata-fields.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-002-define-command-includes-all-metadata-fields.sdp.md new file mode 100644 index 00000000..3a1199be --- /dev/null +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-002-define-command-includes-all-metadata-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bc-contracts.define-command-includes-all-metadata-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc.bc-contracts +--- +# defineCommand includes all metadata fields + +## Intent + +- outcome: Executable scenario "defineCommand includes all metadata fields" from packages/platform-bc/tests/features/behavior/bc-contracts.feature diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-003-define-event-preserves-literal-event-type.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-003-define-event-preserves-literal-event-type.sdp.md new file mode 100644 index 00000000..a6550939 --- /dev/null +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-003-define-event-preserves-literal-event-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bc-contracts.define-event-preserves-literal-event-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc.bc-contracts +--- +# defineEvent preserves literal eventType + +## Intent + +- outcome: Executable scenario "defineEvent preserves literal eventType" from packages/platform-bc/tests/features/behavior/bc-contracts.feature diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-004-define-event-supports-all-event-categories.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-004-define-event-supports-all-event-categories.sdp.md new file mode 100644 index 00000000..1445a306 --- /dev/null +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-004-define-event-supports-all-event-categories.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bc-contracts.define-event-supports-all-event-categories +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc.bc-contracts +--- +# defineEvent supports all event categories + +## Intent + +- outcome: Executable scenario "defineEvent supports all event categories" from packages/platform-bc/tests/features/behavior/bc-contracts.feature diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-005-define-projection-preserves-literal-projection-name.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-005-define-projection-preserves-literal-projection-name.sdp.md new file mode 100644 index 00000000..d2835bbe --- /dev/null +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-005-define-projection-preserves-literal-projection-name.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bc-contracts.define-projection-preserves-literal-projection-name +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc.bc-contracts +--- +# defineProjection preserves literal projectionName + +## Intent + +- outcome: Executable scenario "defineProjection preserves literal projectionName" from packages/platform-bc/tests/features/behavior/bc-contracts.feature diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-006-define-projection-preserves-event-subscriptions-tuple.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-006-define-projection-preserves-event-subscriptions-tuple.sdp.md new file mode 100644 index 00000000..a1bff8bb --- /dev/null +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-006-define-projection-preserves-event-subscriptions-tuple.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bc-contracts.define-projection-preserves-event-subscriptions-tuple +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc.bc-contracts +--- +# defineProjection preserves eventSubscriptions tuple + +## Intent + +- outcome: Executable scenario "defineProjection preserves eventSubscriptions tuple" from packages/platform-bc/tests/features/behavior/bc-contracts.feature diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-007-is-projection-category-validates-category-strings.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-007-is-projection-category-validates-category-strings.sdp.md new file mode 100644 index 00000000..b4361f74 --- /dev/null +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-007-is-projection-category-validates-category-strings.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bc-contracts.is-projection-category-validates-category-strings +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc.bc-contracts +--- +# isProjectionCategory validates category strings + +## Intent + +- outcome: Executable scenario "isProjectionCategory validates category strings" from packages/platform-bc/tests/features/behavior/bc-contracts.feature diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-008-is-logic-projection-returns-true-only-for-logic-category.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-008-is-logic-projection-returns-true-only-for-logic-category.sdp.md new file mode 100644 index 00000000..bc7feb6c --- /dev/null +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-008-is-logic-projection-returns-true-only-for-logic-category.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bc-contracts.is-logic-projection-returns-true-only-for-logic-category +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc.bc-contracts +--- +# isLogicProjection returns true only for logic category + +## Intent + +- outcome: Executable scenario "isLogicProjection returns true only for logic category" from packages/platform-bc/tests/features/behavior/bc-contracts.feature diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-009-is-view-projection-returns-true-only-for-view-category.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-009-is-view-projection-returns-true-only-for-view-category.sdp.md new file mode 100644 index 00000000..4c30b959 --- /dev/null +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-009-is-view-projection-returns-true-only-for-view-category.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bc-contracts.is-view-projection-returns-true-only-for-view-category +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc.bc-contracts +--- +# isViewProjection returns true only for view category + +## Intent + +- outcome: Executable scenario "isViewProjection returns true only for view category" from packages/platform-bc/tests/features/behavior/bc-contracts.feature diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-010-is-client-exposed-returns-true-only-for-view-category.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-010-is-client-exposed-returns-true-only-for-view-category.sdp.md new file mode 100644 index 00000000..0e9d9e59 --- /dev/null +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-010-is-client-exposed-returns-true-only-for-view-category.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bc-contracts.is-client-exposed-returns-true-only-for-view-category +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc.bc-contracts +--- +# isClientExposed returns true only for view category + +## Intent + +- outcome: Executable scenario "isClientExposed returns true only for view category" from packages/platform-bc/tests/features/behavior/bc-contracts.feature diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-011-is-client-exposed-returns-false-for-non-view-categories.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-011-is-client-exposed-returns-false-for-non-view-categories.sdp.md new file mode 100644 index 00000000..86a55fd3 --- /dev/null +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-011-is-client-exposed-returns-false-for-non-view-categories.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bc-contracts.is-client-exposed-returns-false-for-non-view-categories +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc.bc-contracts +--- +# isClientExposed returns false for non-view categories + +## Intent + +- outcome: Executable scenario "isClientExposed returns false for non-view categories" from packages/platform-bc/tests/features/behavior/bc-contracts.feature diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-012-define-process-manager-validates-time-triggered-requires-cron-config.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-012-define-process-manager-validates-time-triggered-requires-cron-config.sdp.md new file mode 100644 index 00000000..5e4e60f4 --- /dev/null +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-012-define-process-manager-validates-time-triggered-requires-cron-config.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bc-contracts.define-process-manager-validates-time-triggered-requires-cron-config +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc.bc-contracts +--- +# defineProcessManager validates time-triggered requires cronConfig + +## Intent + +- outcome: Executable scenario "defineProcessManager validates time-triggered requires cronConfig" from packages/platform-bc/tests/features/behavior/bc-contracts.feature diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-013-define-process-manager-validates-event-triggered-requires-subscriptions.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-013-define-process-manager-validates-event-triggered-requires-subscriptions.sdp.md new file mode 100644 index 00000000..60459036 --- /dev/null +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-013-define-process-manager-validates-event-triggered-requires-subscriptions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bc-contracts.define-process-manager-validates-event-triggered-requires-subscriptions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc.bc-contracts +--- +# defineProcessManager validates event-triggered requires subscriptions + +## Intent + +- outcome: Executable scenario "defineProcessManager validates event-triggered requires subscriptions" from packages/platform-bc/tests/features/behavior/bc-contracts.feature diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-001-direct-table-query-fails-across-component-boundary.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-001-direct-table-query-fails-across-component-boundary.sdp.md new file mode 100644 index 00000000..4f85c96d --- /dev/null +++ b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-001-direct-table-query-fails-across-component-boundary.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bounded-context-foundation-executable-tests.direct-table-query-fails-across-component-boundary +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc.bounded-context-foundation-executable-tests +--- +# Direct table query fails across component boundary + +## Intent + +- outcome: Executable scenario "Direct table query fails across component boundary" from packages/platform-bc/tests/features/behavior/bounded-context-foundation-executable-tests.feature diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-002-component-api-access-succeeds.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-002-component-api-access-succeeds.sdp.md new file mode 100644 index 00000000..f843c3b1 --- /dev/null +++ b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-002-component-api-access-succeeds.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bounded-context-foundation-executable-tests.component-api-access-succeeds +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc.bounded-context-foundation-executable-tests +--- +# Component API access succeeds + +## Intent + +- outcome: Executable scenario "Component API access succeeds" from packages/platform-bc/tests/features/behavior/bounded-context-foundation-executable-tests.feature diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-003-component-handler-writes-commit-atomically-on-success.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-003-component-handler-writes-commit-atomically-on-success.sdp.md new file mode 100644 index 00000000..b4f4ecfc --- /dev/null +++ b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-003-component-handler-writes-commit-atomically-on-success.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bounded-context-foundation-executable-tests.component-handler-writes-commit-atomically-on-success +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc.bounded-context-foundation-executable-tests +--- +# Component handler writes commit atomically on success + +## Intent + +- outcome: Executable scenario "Component handler writes commit atomically on success" from packages/platform-bc/tests/features/behavior/bounded-context-foundation-executable-tests.feature diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-004-caught-component-failure-rolls-back-only-the-component-writes.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-004-caught-component-failure-rolls-back-only-the-component-writes.sdp.md new file mode 100644 index 00000000..66069677 --- /dev/null +++ b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-004-caught-component-failure-rolls-back-only-the-component-writes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bounded-context-foundation-executable-tests.caught-component-failure-rolls-back-only-the-component-writes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc.bounded-context-foundation-executable-tests +--- +# Caught component failure rolls back only the component writes + +## Intent + +- outcome: Executable scenario "Caught component failure rolls back only the component writes" from packages/platform-bc/tests/features/behavior/bounded-context-foundation-executable-tests.feature diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-005-user-id-passed-explicitly-to-component.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-005-user-id-passed-explicitly-to-component.sdp.md new file mode 100644 index 00000000..740bb3e1 --- /dev/null +++ b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-005-user-id-passed-explicitly-to-component.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bounded-context-foundation-executable-tests.user-id-passed-explicitly-to-component +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc.bounded-context-foundation-executable-tests +--- +# User ID passed explicitly to component + +## Intent + +- outcome: Executable scenario "User ID passed explicitly to component" from packages/platform-bc/tests/features/behavior/bounded-context-foundation-executable-tests.feature diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-006-id-conversion-at-boundary.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-006-id-conversion-at-boundary.sdp.md new file mode 100644 index 00000000..975e1798 --- /dev/null +++ b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-006-id-conversion-at-boundary.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bounded-context-foundation-executable-tests.id-conversion-at-boundary +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc.bounded-context-foundation-executable-tests +--- +# ID conversion at boundary + +## Intent + +- outcome: Executable scenario "ID conversion at boundary" from packages/platform-bc/tests/features/behavior/bounded-context-foundation-executable-tests.feature diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-007-contract-provides-type-safety-for-commands.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-007-contract-provides-type-safety-for-commands.sdp.md new file mode 100644 index 00000000..76ca267e --- /dev/null +++ b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-007-contract-provides-type-safety-for-commands.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bc.bounded-context-foundation-executable-tests.contract-provides-type-safety-for-commands +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bc.bounded-context-foundation-executable-tests +--- +# Contract provides type safety for commands + +## Intent + +- outcome: Executable scenario "Contract provides type safety for commands" from packages/platform-bc/tests/features/behavior/bounded-context-foundation-executable-tests.feature diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-001-first-command-execution-is-recorded.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-001-first-command-execution-is-recorded.sdp.md new file mode 100644 index 00000000..552496e4 --- /dev/null +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-001-first-command-execution-is-recorded.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.first-command-execution-is-recorded +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests +--- +# First command execution is recorded + +## Intent + +- outcome: Executable scenario "First command execution is recorded" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-002-duplicate-command-returns-cached-result.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-002-duplicate-command-returns-cached-result.sdp.md new file mode 100644 index 00000000..a64220a4 --- /dev/null +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-002-duplicate-command-returns-cached-result.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.duplicate-command-returns-cached-result +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests +--- +# Duplicate command returns cached result + +## Intent + +- outcome: Executable scenario "Duplicate command returns cached result" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-003-successful-command-transitions-to-executed.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-003-successful-command-transitions-to-executed.sdp.md new file mode 100644 index 00000000..4f34813d --- /dev/null +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-003-successful-command-transitions-to-executed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.successful-command-transitions-to-executed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests +--- +# Successful command transitions to executed + +## Intent + +- outcome: Executable scenario "Successful command transitions to executed" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-004-business-rejection-transitions-to-rejected.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-004-business-rejection-transitions-to-rejected.sdp.md new file mode 100644 index 00000000..ecf0ab48 --- /dev/null +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-004-business-rejection-transitions-to-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.business-rejection-transitions-to-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests +--- +# Business rejection transitions to rejected + +## Intent + +- outcome: Executable scenario "Business rejection transitions to rejected" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-005-unexpected-error-transitions-to-failed.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-005-unexpected-error-transitions-to-failed.sdp.md new file mode 100644 index 00000000..ff94097d --- /dev/null +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-005-unexpected-error-transitions-to-failed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.unexpected-error-transitions-to-failed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests +--- +# Unexpected error transitions to failed + +## Intent + +- outcome: Executable scenario "Unexpected error transitions to failed" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-006-successful-command-runs-all-7-orchestrator-steps.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-006-successful-command-runs-all-7-orchestrator-steps.sdp.md new file mode 100644 index 00000000..002b8473 --- /dev/null +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-006-successful-command-runs-all-7-orchestrator-steps.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.successful-command-runs-all-7-orchestrator-steps +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests +--- +# Successful command runs all 7 orchestrator steps + +## Intent + +- outcome: Executable scenario "Successful command runs all 7 orchestrator steps" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-007-rejected-command-short-circuits-before-event-append.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-007-rejected-command-short-circuits-before-event-append.sdp.md new file mode 100644 index 00000000..ca76ffc2 --- /dev/null +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-007-rejected-command-short-circuits-before-event-append.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.rejected-command-short-circuits-before-event-append +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests +--- +# Rejected command short-circuits before event append + +## Intent + +- outcome: Executable scenario "Rejected command short-circuits before event append" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-008-correlation-id-is-propagated-to-emitted-event-metadata.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-008-correlation-id-is-propagated-to-emitted-event-metadata.sdp.md new file mode 100644 index 00000000..14792be8 --- /dev/null +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-008-correlation-id-is-propagated-to-emitted-event-metadata.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.correlation-id-is-propagated-to-emitted-event-metadata +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests +--- +# Correlation id is propagated to emitted event metadata + +## Intent + +- outcome: Executable scenario "Correlation id is propagated to emitted event metadata" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-009-get-by-correlation-returns-the-events-for-a-command.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-009-get-by-correlation-returns-the-events-for-a-command.sdp.md new file mode 100644 index 00000000..1642ce70 --- /dev/null +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-009-get-by-correlation-returns-the-events-for-a-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.get-by-correlation-returns-the-events-for-a-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests +--- +# getByCorrelation returns the events for a command + +## Intent + +- outcome: Executable scenario "getByCorrelation returns the events for a command" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-010-registered-middleware-run-in-order.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-010-registered-middleware-run-in-order.sdp.md new file mode 100644 index 00000000..f46d48ed --- /dev/null +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-010-registered-middleware-run-in-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.registered-middleware-run-in-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests +--- +# Registered middleware run in order + +## Intent + +- outcome: Executable scenario "Registered middleware run in order" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-011-middleware-failure-halts-the-pipeline.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-011-middleware-failure-halts-the-pipeline.sdp.md new file mode 100644 index 00000000..ff48588c --- /dev/null +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-011-middleware-failure-halts-the-pipeline.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.middleware-failure-halts-the-pipeline +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests +--- +# Middleware failure halts the pipeline + +## Intent + +- outcome: Executable scenario "Middleware failure halts the pipeline" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature diff --git a/specs/behavior/platform-bus/idempotency.examples/s-001-first-command-submission-is-recorded.sdp.md b/specs/behavior/platform-bus/idempotency.examples/s-001-first-command-submission-is-recorded.sdp.md new file mode 100644 index 00000000..43377bbd --- /dev/null +++ b/specs/behavior/platform-bus/idempotency.examples/s-001-first-command-submission-is-recorded.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bus.idempotency.first-command-submission-is-recorded +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bus.idempotency +--- +# First command submission is recorded + +## Intent + +- outcome: Executable scenario "First command submission is recorded" from packages/platform-bus/tests/features/behavior/idempotency.feature diff --git a/specs/behavior/platform-bus/idempotency.examples/s-002-duplicate-command-returns-existing-status-when-completed.sdp.md b/specs/behavior/platform-bus/idempotency.examples/s-002-duplicate-command-returns-existing-status-when-completed.sdp.md new file mode 100644 index 00000000..0fd592d0 --- /dev/null +++ b/specs/behavior/platform-bus/idempotency.examples/s-002-duplicate-command-returns-existing-status-when-completed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bus.idempotency.duplicate-command-returns-existing-status-when-completed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bus.idempotency +--- +# Duplicate command returns existing status when completed + +## Intent + +- outcome: Executable scenario "Duplicate command returns existing status when completed" from packages/platform-bus/tests/features/behavior/idempotency.feature diff --git a/specs/behavior/platform-bus/idempotency.examples/s-003-duplicate-command-during-processing-returns-pending-status.sdp.md b/specs/behavior/platform-bus/idempotency.examples/s-003-duplicate-command-during-processing-returns-pending-status.sdp.md new file mode 100644 index 00000000..6c4cd766 --- /dev/null +++ b/specs/behavior/platform-bus/idempotency.examples/s-003-duplicate-command-during-processing-returns-pending-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bus.idempotency.duplicate-command-during-processing-returns-pending-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bus.idempotency +--- +# Duplicate command during processing returns pending status + +## Intent + +- outcome: Executable scenario "Duplicate command during processing returns pending status" from packages/platform-bus/tests/features/behavior/idempotency.feature diff --git a/specs/behavior/platform-bus/idempotency.examples/s-004-concurrent-duplicate-detection-via-post-insert-verification.sdp.md b/specs/behavior/platform-bus/idempotency.examples/s-004-concurrent-duplicate-detection-via-post-insert-verification.sdp.md new file mode 100644 index 00000000..f952bc22 --- /dev/null +++ b/specs/behavior/platform-bus/idempotency.examples/s-004-concurrent-duplicate-detection-via-post-insert-verification.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-bus.idempotency.concurrent-duplicate-detection-via-post-insert-verification +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-bus.idempotency +--- +# Concurrent duplicate detection via post-insert verification + +## Intent + +- outcome: Executable scenario "Concurrent duplicate detection via post-insert verification" from packages/platform-bus/tests/features/behavior/idempotency.feature diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-001-returns-null-when-checkpoint-position-equals-event-position.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-001-returns-null-when-checkpoint-position-equals-event-position.sdp.md new file mode 100644 index 00000000..90cfc519 --- /dev/null +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-001-returns-null-when-checkpoint-position-equals-event-position.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.action-handler.returns-null-when-checkpoint-position-equals-event-position +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.action-handler +--- +# Returns null when checkpoint position equals event position + +## Intent + +- outcome: Executable scenario "Returns null when checkpoint position equals event position" from packages/platform-core/tests/features/behavior/agent/action-handler.feature diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-002-returns-null-when-checkpoint-position-exceeds-event-position.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-002-returns-null-when-checkpoint-position-exceeds-event-position.sdp.md new file mode 100644 index 00000000..78f4fb1f --- /dev/null +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-002-returns-null-when-checkpoint-position-exceeds-event-position.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.action-handler.returns-null-when-checkpoint-position-exceeds-event-position +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.action-handler +--- +# Returns null when checkpoint position exceeds event position + +## Intent + +- outcome: Executable scenario "Returns null when checkpoint position exceeds event position" from packages/platform-core/tests/features/behavior/agent/action-handler.feature diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-003-returns-null-when-agent-status-is-paused.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-003-returns-null-when-agent-status-is-paused.sdp.md new file mode 100644 index 00000000..175e870e --- /dev/null +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-003-returns-null-when-agent-status-is-paused.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.action-handler.returns-null-when-agent-status-is-paused +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.action-handler +--- +# Returns null when agent status is paused + +## Intent + +- outcome: Executable scenario "Returns null when agent status is paused" from packages/platform-core/tests/features/behavior/agent/action-handler.feature diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-004-returns-null-when-agent-status-is-stopped.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-004-returns-null-when-agent-status-is-stopped.sdp.md new file mode 100644 index 00000000..ca823834 --- /dev/null +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-004-returns-null-when-agent-status-is-stopped.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.action-handler.returns-null-when-agent-status-is-stopped +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.action-handler +--- +# Returns null when agent status is stopped + +## Intent + +- outcome: Executable scenario "Returns null when agent status is stopped" from packages/platform-core/tests/features/behavior/agent/action-handler.feature diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-005-returns-null-when-agent-status-is-error-recovery.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-005-returns-null-when-agent-status-is-error-recovery.sdp.md new file mode 100644 index 00000000..f3c6822f --- /dev/null +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-005-returns-null-when-agent-status-is-error-recovery.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.action-handler.returns-null-when-agent-status-is-error-recovery +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.action-handler +--- +# Returns null when agent status is error_recovery + +## Intent + +- outcome: Executable scenario "Returns null when agent status is error_recovery" from packages/platform-core/tests/features/behavior/agent/action-handler.feature diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-006-processes-normally-when-checkpoint-is-null-first-event.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-006-processes-normally-when-checkpoint-is-null-first-event.sdp.md new file mode 100644 index 00000000..12f33832 --- /dev/null +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-006-processes-normally-when-checkpoint-is-null-first-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.action-handler.processes-normally-when-checkpoint-is-null-first-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.action-handler +--- +# Processes normally when checkpoint is null (first event) + +## Intent + +- outcome: Executable scenario "Processes normally when checkpoint is null (first event)" from packages/platform-core/tests/features/behavior/agent/action-handler.feature diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-007-returns-rule-based-analysis-when-pattern-has-no-analyze-function.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-007-returns-rule-based-analysis-when-pattern-has-no-analyze-function.sdp.md new file mode 100644 index 00000000..e5066821 --- /dev/null +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-007-returns-rule-based-analysis-when-pattern-has-no-analyze-function.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.action-handler.returns-rule-based-analysis-when-pattern-has-no-analyze-function +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.action-handler +--- +# Returns rule-based analysis when pattern has no analyze function + +## Intent + +- outcome: Executable scenario "Returns rule-based analysis when pattern has no analyze function" from packages/platform-core/tests/features/behavior/agent/action-handler.feature diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-008-re-throws-when-pattern-trigger-throws.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-008-re-throws-when-pattern-trigger-throws.sdp.md new file mode 100644 index 00000000..1c038621 --- /dev/null +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-008-re-throws-when-pattern-trigger-throws.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.action-handler.re-throws-when-pattern-trigger-throws +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.action-handler +--- +# Re-throws when pattern trigger throws + +## Intent + +- outcome: Executable scenario "Re-throws when pattern trigger throws" from packages/platform-core/tests/features/behavior/agent/action-handler.feature diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-009-propagates-load-state-errors-for-workpool-retry.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-009-propagates-load-state-errors-for-workpool-retry.sdp.md new file mode 100644 index 00000000..fae99357 --- /dev/null +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-009-propagates-load-state-errors-for-workpool-retry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.action-handler.propagates-load-state-errors-for-workpool-retry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.action-handler +--- +# Propagates loadState errors for Workpool retry + +## Intent + +- outcome: Executable scenario "Propagates loadState errors for Workpool retry" from packages/platform-core/tests/features/behavior/agent/action-handler.feature diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-010-generates-deterministic-decision-id-from-agent-id-and-global-position.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-010-generates-deterministic-decision-id-from-agent-id-and-global-position.sdp.md new file mode 100644 index 00000000..08ce6338 --- /dev/null +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-010-generates-deterministic-decision-id-from-agent-id-and-global-position.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.action-handler.generates-deterministic-decision-id-from-agent-id-and-global-position +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.action-handler +--- +# Generates deterministic decisionId from agentId and globalPosition + +## Intent + +- outcome: Executable scenario "Generates deterministic decisionId from agentId and globalPosition" from packages/platform-core/tests/features/behavior/agent/action-handler.feature diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-011-generates-same-decision-id-for-same-inputs-deterministic.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-011-generates-same-decision-id-for-same-inputs-deterministic.sdp.md new file mode 100644 index 00000000..24103cbc --- /dev/null +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-011-generates-same-decision-id-for-same-inputs-deterministic.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.action-handler.generates-same-decision-id-for-same-inputs-deterministic +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.action-handler +--- +# Generates same decisionId for same inputs (deterministic) + +## Intent + +- outcome: Executable scenario "Generates same decisionId for same inputs (deterministic)" from packages/platform-core/tests/features/behavior/agent/action-handler.feature diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-012-returns-pattern-id-and-rule-based-decision-when-pattern-triggers.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-012-returns-pattern-id-and-rule-based-decision-when-pattern-triggers.sdp.md new file mode 100644 index 00000000..6d92139c --- /dev/null +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-012-returns-pattern-id-and-rule-based-decision-when-pattern-triggers.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.action-handler.returns-pattern-id-and-rule-based-decision-when-pattern-triggers +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.action-handler +--- +# Returns patternId and rule-based decision when pattern triggers + +## Intent + +- outcome: Executable scenario "Returns patternId and rule-based decision when pattern triggers" from packages/platform-core/tests/features/behavior/agent/action-handler.feature diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-013-returns-llm-analysis-method-when-pattern-has-analyze-function.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-013-returns-llm-analysis-method-when-pattern-has-analyze-function.sdp.md new file mode 100644 index 00000000..f50942f6 --- /dev/null +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-013-returns-llm-analysis-method-when-pattern-has-analyze-function.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.action-handler.returns-llm-analysis-method-when-pattern-has-analyze-function +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.action-handler +--- +# Returns llm analysis method when pattern has analyze function + +## Intent + +- outcome: Executable scenario "Returns llm analysis method when pattern has analyze function" from packages/platform-core/tests/features/behavior/agent/action-handler.feature diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-014-returns-no-pattern-id-when-no-pattern-matches.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-014-returns-no-pattern-id-when-no-pattern-matches.sdp.md new file mode 100644 index 00000000..c6ef4a69 --- /dev/null +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-014-returns-no-pattern-id-when-no-pattern-matches.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.action-handler.returns-no-pattern-id-when-no-pattern-matches +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.action-handler +--- +# Returns no patternId when no pattern matches + +## Intent + +- outcome: Executable scenario "Returns no patternId when no pattern matches" from packages/platform-core/tests/features/behavior/agent/action-handler.feature diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-015-does-not-invoke-llm-enrichment-via-runtime.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-015-does-not-invoke-llm-enrichment-via-runtime.sdp.md new file mode 100644 index 00000000..30905193 --- /dev/null +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-015-does-not-invoke-llm-enrichment-via-runtime.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.action-handler.does-not-invoke-llm-enrichment-via-runtime +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.action-handler +--- +# Does not invoke LLM enrichment via runtime + +## Intent + +- outcome: Executable scenario "Does not invoke LLM enrichment via runtime" from packages/platform-core/tests/features/behavior/agent/action-handler.feature diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-016-re-throws-when-pattern-executor-fails.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-016-re-throws-when-pattern-executor-fails.sdp.md new file mode 100644 index 00000000..efe3b529 --- /dev/null +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-016-re-throws-when-pattern-executor-fails.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.action-handler.re-throws-when-pattern-executor-fails +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.action-handler +--- +# Re-throws when pattern executor fails + +## Intent + +- outcome: Executable scenario "Re-throws when pattern executor fails" from packages/platform-core/tests/features/behavior/agent/action-handler.feature diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-001-operation-executes-and-result-is-returned-when-allowed.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-001-operation-executes-and-result-is-returned-when-allowed.sdp.md new file mode 100644 index 00000000..f5b970d9 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-001-operation-executes-and-result-is-returned-when-allowed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-rate-limiter.operation-executes-and-result-is-returned-when-allowed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-rate-limiter +--- +# Operation executes and result is returned when allowed + +## Intent + +- outcome: Executable scenario "Operation executes and result is returned when allowed" from packages/platform-core/tests/features/behavior/agent/agent-rate-limiter.feature diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-002-operation-is-not-executed-when-denied.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-002-operation-is-not-executed-when-denied.sdp.md new file mode 100644 index 00000000..b27d656e --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-002-operation-is-not-executed-when-denied.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-rate-limiter.operation-is-not-executed-when-denied +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-rate-limiter +--- +# Operation is not executed when denied + +## Intent + +- outcome: Executable scenario "Operation is not executed when denied" from packages/platform-core/tests/features/behavior/agent/agent-rate-limiter.feature diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-003-check-rate-limit-receives-agent-scoped-key.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-003-check-rate-limit-receives-agent-scoped-key.sdp.md new file mode 100644 index 00000000..c8a5a1f8 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-003-check-rate-limit-receives-agent-scoped-key.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-rate-limiter.check-rate-limit-receives-agent-scoped-key +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-rate-limiter +--- +# checkRateLimit receives agent-scoped key + +## Intent + +- outcome: Executable scenario "checkRateLimit receives agent-scoped key" from packages/platform-core/tests/features/behavior/agent/agent-rate-limiter.feature diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-004-operation-errors-propagate-to-caller.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-004-operation-errors-propagate-to-caller.sdp.md new file mode 100644 index 00000000..375f196b --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-004-operation-errors-propagate-to-caller.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-rate-limiter.operation-errors-propagate-to-caller +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-rate-limiter +--- +# Operation errors propagate to caller + +## Intent + +- outcome: Executable scenario "Operation errors propagate to caller" from packages/platform-core/tests/features/behavior/agent/agent-rate-limiter.feature diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-005-check-rate-limit-callback-errors-propagate-without-calling-operation.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-005-check-rate-limit-callback-errors-propagate-without-calling-operation.sdp.md new file mode 100644 index 00000000..0c62e1c7 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-005-check-rate-limit-callback-errors-propagate-without-calling-operation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-rate-limiter.check-rate-limit-callback-errors-propagate-without-calling-operation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-rate-limiter +--- +# checkRateLimit callback errors propagate without calling operation + +## Intent + +- outcome: Executable scenario "checkRateLimit callback errors propagate without calling operation" from packages/platform-core/tests/features/behavior/agent/agent-rate-limiter.feature diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-006-warning-is-logged-when-rate-limited.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-006-warning-is-logged-when-rate-limited.sdp.md new file mode 100644 index 00000000..f028d840 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-006-warning-is-logged-when-rate-limited.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-rate-limiter.warning-is-logged-when-rate-limited +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-rate-limiter +--- +# Warning is logged when rate limited + +## Intent + +- outcome: Executable scenario "Warning is logged when rate limited" from packages/platform-core/tests/features/behavior/agent/agent-rate-limiter.feature diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-007-debug-is-logged-when-rate-limit-check-passes.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-007-debug-is-logged-when-rate-limit-check-passes.sdp.md new file mode 100644 index 00000000..a65cdd5e --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-007-debug-is-logged-when-rate-limit-check-passes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-rate-limiter.debug-is-logged-when-rate-limit-check-passes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-rate-limiter +--- +# Debug is logged when rate limit check passes + +## Intent + +- outcome: Executable scenario "Debug is logged when rate limit check passes" from packages/platform-core/tests/features/behavior/agent/agent-rate-limiter.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-001-action-subscription-has-correct-type-and-references.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-001-action-subscription-has-correct-type-and-references.sdp.md new file mode 100644 index 00000000..bea4ec86 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-001-action-subscription-has-correct-type-and-references.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription-action.action-subscription-has-correct-type-and-references +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription-action +--- +# Action subscription has correct type and references + +## Intent + +- outcome: Executable scenario "Action subscription has correct type and references" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-002-object-retry-config-is-passed-through.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-002-object-retry-config-is-passed-through.sdp.md new file mode 100644 index 00000000..48a47e80 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-002-object-retry-config-is-passed-through.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription-action.object-retry-config-is-passed-through +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription-action +--- +# Object retry config is passed through + +## Intent + +- outcome: Executable scenario "Object retry config is passed through" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-003-boolean-retry-config-is-passed-through.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-003-boolean-retry-config-is-passed-through.sdp.md new file mode 100644 index 00000000..04f24934 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-003-boolean-retry-config-is-passed-through.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription-action.boolean-retry-config-is-passed-through +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription-action +--- +# Boolean retry config is passed through + +## Intent + +- outcome: Executable scenario "Boolean retry config is passed through" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-004-retry-field-is-absent-when-not-specified.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-004-retry-field-is-absent-when-not-specified.sdp.md new file mode 100644 index 00000000..e5d79ee8 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-004-retry-field-is-absent-when-not-specified.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription-action.retry-field-is-absent-when-not-specified +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription-action +--- +# Retry field is absent when not specified + +## Intent + +- outcome: Executable scenario "Retry field is absent when not specified" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-005-to-workpool-context-returns-all-required-fields.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-005-to-workpool-context-returns-all-required-fields.sdp.md new file mode 100644 index 00000000..4a7e12f7 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-005-to-workpool-context-returns-all-required-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription-action.to-workpool-context-returns-all-required-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription-action +--- +# toWorkpoolContext returns all required fields + +## Intent + +- outcome: Executable scenario "toWorkpoolContext returns all required fields" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-006-causation-id-equals-the-event-event-id.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-006-causation-id-equals-the-event-event-id.sdp.md new file mode 100644 index 00000000..54e97c23 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-006-causation-id-equals-the-event-event-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription-action.causation-id-equals-the-event-event-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription-action +--- +# causationId equals the event eventId + +## Intent + +- outcome: Executable scenario "causationId equals the event eventId" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-007-subscription-uses-default-priority-of-250.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-007-subscription-uses-default-priority-of-250.sdp.md new file mode 100644 index 00000000..247babdb --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-007-subscription-uses-default-priority-of-250.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription-action.subscription-uses-default-priority-of-250 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription-action +--- +# Subscription uses default priority of 250 + +## Intent + +- outcome: Executable scenario "Subscription uses default priority of 250" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-008-subscription-uses-custom-priority.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-008-subscription-uses-custom-priority.sdp.md new file mode 100644 index 00000000..fba70ffb --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-008-subscription-uses-custom-priority.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription-action.subscription-uses-custom-priority +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription-action +--- +# Subscription uses custom priority + +## Intent + +- outcome: Executable scenario "Subscription uses custom priority" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-009-name-includes-context-when-provided.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-009-name-includes-context-when-provided.sdp.md new file mode 100644 index 00000000..2a0db12d --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-009-name-includes-context-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription-action.name-includes-context-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription-action +--- +# Name includes context when provided + +## Intent + +- outcome: Executable scenario "Name includes context when provided" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-010-name-omits-context-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-010-name-omits-context-when-not-provided.sdp.md new file mode 100644 index 00000000..c0ec6c4b --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-010-name-omits-context-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription-action.name-omits-context-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription-action +--- +# Name omits context when not provided + +## Intent + +- outcome: Executable scenario "Name omits context when not provided" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-011-filter-contains-all-configured-event-types.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-011-filter-contains-all-configured-event-types.sdp.md new file mode 100644 index 00000000..d9d6f5f1 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-011-filter-contains-all-configured-event-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription-action.filter-contains-all-configured-event-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription-action +--- +# Filter contains all configured event types + +## Intent + +- outcome: Executable scenario "Filter contains all configured event types" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-012-to-handler-args-produces-correct-agent-event-handler-args.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-012-to-handler-args-produces-correct-agent-event-handler-args.sdp.md new file mode 100644 index 00000000..e85bcb38 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-012-to-handler-args-produces-correct-agent-event-handler-args.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription-action.to-handler-args-produces-correct-agent-event-handler-args +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription-action +--- +# toHandlerArgs produces correct AgentEventHandlerArgs + +## Intent + +- outcome: Executable scenario "toHandlerArgs produces correct AgentEventHandlerArgs" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-013-get-partition-key-returns-stream-id-based-partition.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-013-get-partition-key-returns-stream-id-based-partition.sdp.md new file mode 100644 index 00000000..bc3c5e55 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-013-get-partition-key-returns-stream-id-based-partition.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription-action.get-partition-key-returns-stream-id-based-partition +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription-action +--- +# getPartitionKey returns streamId-based partition + +## Intent + +- outcome: Executable scenario "getPartitionKey returns streamId-based partition" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-001-subscription-with-context-has-correct-name.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-001-subscription-with-context-has-correct-name.sdp.md new file mode 100644 index 00000000..f61a65a3 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-001-subscription-with-context-has-correct-name.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.subscription-with-context-has-correct-name +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# Subscription with context has correct name + +## Intent + +- outcome: Executable scenario "Subscription with context has correct name" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-002-subscription-without-context-has-correct-name.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-002-subscription-without-context-has-correct-name.sdp.md new file mode 100644 index 00000000..5912188c --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-002-subscription-without-context-has-correct-name.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.subscription-without-context-has-correct-name +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# Subscription without context has correct name + +## Intent + +- outcome: Executable scenario "Subscription without context has correct name" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-003-subscription-uses-default-priority-of-250.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-003-subscription-uses-default-priority-of-250.sdp.md new file mode 100644 index 00000000..7607570d --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-003-subscription-uses-default-priority-of-250.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.subscription-uses-default-priority-of-250 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# Subscription uses default priority of 250 + +## Intent + +- outcome: Executable scenario "Subscription uses default priority of 250" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-004-subscription-uses-custom-priority.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-004-subscription-uses-custom-priority.sdp.md new file mode 100644 index 00000000..9e6206a1 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-004-subscription-uses-custom-priority.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.subscription-uses-custom-priority +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# Subscription uses custom priority + +## Intent + +- outcome: Executable scenario "Subscription uses custom priority" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-005-subscription-filter-contains-correct-event-types.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-005-subscription-filter-contains-correct-event-types.sdp.md new file mode 100644 index 00000000..9001891f --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-005-subscription-filter-contains-correct-event-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.subscription-filter-contains-correct-event-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# Subscription filter contains correct event types + +## Intent + +- outcome: Executable scenario "Subscription filter contains correct event types" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-006-subscription-attaches-the-handler-reference.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-006-subscription-attaches-the-handler-reference.sdp.md new file mode 100644 index 00000000..0c6880e1 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-006-subscription-attaches-the-handler-reference.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.subscription-attaches-the-handler-reference +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# Subscription attaches the handler reference + +## Intent + +- outcome: Executable scenario "Subscription attaches the handler reference" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-007-to-handler-args-produces-correct-agent-event-handler-args.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-007-to-handler-args-produces-correct-agent-event-handler-args.sdp.md new file mode 100644 index 00000000..5cc572e4 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-007-to-handler-args-produces-correct-agent-event-handler-args.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.to-handler-args-produces-correct-agent-event-handler-args +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# toHandlerArgs produces correct AgentEventHandlerArgs + +## Intent + +- outcome: Executable scenario "toHandlerArgs produces correct AgentEventHandlerArgs" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-008-to-handler-args-includes-payload-in-handler-args.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-008-to-handler-args-includes-payload-in-handler-args.sdp.md new file mode 100644 index 00000000..c6b5649c --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-008-to-handler-args-includes-payload-in-handler-args.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.to-handler-args-includes-payload-in-handler-args +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# toHandlerArgs includes payload in handler args + +## Intent + +- outcome: Executable scenario "toHandlerArgs includes payload in handler args" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-009-default-agent-transform-wraps-non-object-payload-in-raw.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-009-default-agent-transform-wraps-non-object-payload-in-raw.sdp.md new file mode 100644 index 00000000..4d6310f1 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-009-default-agent-transform-wraps-non-object-payload-in-raw.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.default-agent-transform-wraps-non-object-payload-in-raw +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# defaultAgentTransform wraps non-object payload in _raw + +## Intent + +- outcome: Executable scenario "defaultAgentTransform wraps non-object payload in _raw" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-010-custom-to-handler-args-transformer-is-used.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-010-custom-to-handler-args-transformer-is-used.sdp.md new file mode 100644 index 00000000..f2e2751e --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-010-custom-to-handler-args-transformer-is-used.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.custom-to-handler-args-transformer-is-used +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# Custom toHandlerArgs transformer is used + +## Intent + +- outcome: Executable scenario "Custom toHandlerArgs transformer is used" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-011-partitions-by-stream-id-by-default.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-011-partitions-by-stream-id-by-default.sdp.md new file mode 100644 index 00000000..c1dcf451 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-011-partitions-by-stream-id-by-default.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.partitions-by-stream-id-by-default +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# Partitions by streamId by default + +## Intent + +- outcome: Executable scenario "Partitions by streamId by default" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-012-custom-partition-key-extractor-is-used.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-012-custom-partition-key-extractor-is-used.sdp.md new file mode 100644 index 00000000..69fb27be --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-012-custom-partition-key-extractor-is-used.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.custom-partition-key-extractor-is-used +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# Custom partition key extractor is used + +## Intent + +- outcome: Executable scenario "Custom partition key extractor is used" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-013-creates-subscriptions-for-multiple-agents.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-013-creates-subscriptions-for-multiple-agents.sdp.md new file mode 100644 index 00000000..a9f23937 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-013-creates-subscriptions-for-multiple-agents.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.creates-subscriptions-for-multiple-agents +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# Creates subscriptions for multiple agents + +## Intent + +- outcome: Executable scenario "Creates subscriptions for multiple agents" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-014-throws-if-handler-is-missing-for-an-agent.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-014-throws-if-handler-is-missing-for-an-agent.sdp.md new file mode 100644 index 00000000..9c18b5c3 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-014-throws-if-handler-is-missing-for-an-agent.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.throws-if-handler-is-missing-for-an-agent +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# Throws if handler is missing for an agent + +## Intent + +- outcome: Executable scenario "Throws if handler is missing for an agent" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-015-applies-common-options-to-all-subscriptions.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-015-applies-common-options-to-all-subscriptions.sdp.md new file mode 100644 index 00000000..961188b0 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-015-applies-common-options-to-all-subscriptions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.applies-common-options-to-all-subscriptions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# Applies common options to all subscriptions + +## Intent + +- outcome: Executable scenario "Applies common options to all subscriptions" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-016-same-agent-id-for-multiple-to-handler-args-calls.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-016-same-agent-id-for-multiple-to-handler-args-calls.sdp.md new file mode 100644 index 00000000..21a1f8b1 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-016-same-agent-id-for-multiple-to-handler-args-calls.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.same-agent-id-for-multiple-to-handler-args-calls +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# Same agentId for multiple toHandlerArgs calls + +## Intent + +- outcome: Executable scenario "Same agentId for multiple toHandlerArgs calls" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-017-same-agent-id-for-to-handler-args-and-get-partition-key.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-017-same-agent-id-for-to-handler-args-and-get-partition-key.sdp.md new file mode 100644 index 00000000..a977350a --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-017-same-agent-id-for-to-handler-args-and-get-partition-key.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.same-agent-id-for-to-handler-args-and-get-partition-key +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# Same agentId for toHandlerArgs and getPartitionKey + +## Intent + +- outcome: Executable scenario "Same agentId for toHandlerArgs and getPartitionKey" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-018-filter-matches-subscribed-types-and-rejects-unsubscribed-types.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-018-filter-matches-subscribed-types-and-rejects-unsubscribed-types.sdp.md new file mode 100644 index 00000000..b433e754 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-018-filter-matches-subscribed-types-and-rejects-unsubscribed-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.filter-matches-subscribed-types-and-rejects-unsubscribed-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# Filter matches subscribed types and rejects unsubscribed types + +## Intent + +- outcome: Executable scenario "Filter matches subscribed types and rejects unsubscribed types" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-019-event-types-array-starts-with-correct-length.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-019-event-types-array-starts-with-correct-length.sdp.md new file mode 100644 index 00000000..ecaa81b9 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-019-event-types-array-starts-with-correct-length.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.event-types-array-starts-with-correct-length +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# Event types array starts with correct length + +## Intent + +- outcome: Executable scenario "Event types array starts with correct length" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-020-transforms-all-published-event-fields-correctly.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-020-transforms-all-published-event-fields-correctly.sdp.md new file mode 100644 index 00000000..14cdf417 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-020-transforms-all-published-event-fields-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.transforms-all-published-event-fields-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# Transforms all PublishedEvent fields correctly + +## Intent + +- outcome: Executable scenario "Transforms all PublishedEvent fields correctly" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-021-handles-null-payload.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-021-handles-null-payload.sdp.md new file mode 100644 index 00000000..d2ad2f1d --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-021-handles-null-payload.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.handles-null-payload +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# Handles null payload + +## Intent + +- outcome: Executable scenario "Handles null payload" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-022-handles-array-payload.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-022-handles-array-payload.sdp.md new file mode 100644 index 00000000..93c36202 --- /dev/null +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-022-handles-array-payload.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.agent-subscription.handles-array-payload +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.agent-subscription +--- +# Handles array payload + +## Intent + +- outcome: Executable scenario "Handles array payload" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-001-all-six-error-codes-are-present.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-001-all-six-error-codes-are-present.sdp.md new file mode 100644 index 00000000..08027856 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-001-all-six-error-codes-are-present.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.all-six-error-codes-are-present +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# All six error codes are present + +## Intent + +- outcome: Executable scenario "All six error codes are present" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-002-approval-statuses-contains-all-four-statuses-in-order.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-002-approval-statuses-contains-all-four-statuses-in-order.sdp.md new file mode 100644 index 00000000..11e5d4df --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-002-approval-statuses-contains-all-four-statuses-in-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.approval-statuses-contains-all-four-statuses-in-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# APPROVAL_STATUSES contains all four statuses in order + +## Intent + +- outcome: Executable scenario "APPROVAL_STATUSES contains all four statuses in order" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-003-approval-statuses-is-a-4-element-array.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-003-approval-statuses-is-a-4-element-array.sdp.md new file mode 100644 index 00000000..645d0215 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-003-approval-statuses-is-a-4-element-array.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.approval-statuses-is-a-4-element-array +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# APPROVAL_STATUSES is a 4-element array + +## Intent + +- outcome: Executable scenario "APPROVAL_STATUSES is a 4-element array" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-004-returns-true-for-valid-status-strings.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-004-returns-true-for-valid-status-strings.sdp.md new file mode 100644 index 00000000..f9aa0ad1 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-004-returns-true-for-valid-status-strings.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-true-for-valid-status-strings +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns true for valid status strings + +## Intent + +- outcome: Executable scenario "Returns true for valid status strings" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-005-returns-false-for-invalid-strings.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-005-returns-false-for-invalid-strings.sdp.md new file mode 100644 index 00000000..1f43c6a0 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-005-returns-false-for-invalid-strings.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-false-for-invalid-strings +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns false for invalid strings + +## Intent + +- outcome: Executable scenario "Returns false for invalid strings" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-006-returns-false-for-non-string-types.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-006-returns-false-for-non-string-types.sdp.md new file mode 100644 index 00000000..49e737e9 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-006-returns-false-for-non-string-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-false-for-non-string-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns false for non-string types + +## Intent + +- outcome: Executable scenario "Returns false for non-string types" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-007-accepts-all-four-valid-statuses.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-007-accepts-all-four-valid-statuses.sdp.md new file mode 100644 index 00000000..09748947 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-007-accepts-all-four-valid-statuses.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.accepts-all-four-valid-statuses +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Accepts all four valid statuses + +## Intent + +- outcome: Executable scenario "Accepts all four valid statuses" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-008-rejects-invalid-status-values.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-008-rejects-invalid-status-values.sdp.md new file mode 100644 index 00000000..e7d79651 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-008-rejects-invalid-status-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.rejects-invalid-status-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Rejects invalid status values + +## Intent + +- outcome: Executable scenario "Rejects invalid status values" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-009-accepts-a-valid-approval-object.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-009-accepts-a-valid-approval-object.sdp.md new file mode 100644 index 00000000..c3ac0f81 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-009-accepts-a-valid-approval-object.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.accepts-a-valid-approval-object +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Accepts a valid approval object + +## Intent + +- outcome: Executable scenario "Accepts a valid approval object" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-010-rejects-approval-with-missing-required-fields.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-010-rejects-approval-with-missing-required-fields.sdp.md new file mode 100644 index 00000000..dbdc795b --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-010-rejects-approval-with-missing-required-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.rejects-approval-with-missing-required-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Rejects approval with missing required fields + +## Intent + +- outcome: Executable scenario "Rejects approval with missing required fields" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-011-rejects-approval-with-confidence-above-1.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-011-rejects-approval-with-confidence-above-1.sdp.md new file mode 100644 index 00000000..a4f1ba70 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-011-rejects-approval-with-confidence-above-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.rejects-approval-with-confidence-above-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Rejects approval with confidence above 1 + +## Intent + +- outcome: Executable scenario "Rejects approval with confidence above 1" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-012-rejects-approval-with-negative-confidence.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-012-rejects-approval-with-negative-confidence.sdp.md new file mode 100644 index 00000000..49b64a6d --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-012-rejects-approval-with-negative-confidence.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.rejects-approval-with-negative-confidence +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Rejects approval with negative confidence + +## Intent + +- outcome: Executable scenario "Rejects approval with negative confidence" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-013-accepts-valid-auth-context-with-user-id-only.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-013-accepts-valid-auth-context-with-user-id-only.sdp.md new file mode 100644 index 00000000..00928d88 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-013-accepts-valid-auth-context-with-user-id-only.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.accepts-valid-auth-context-with-user-id-only +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Accepts valid auth context with userId only + +## Intent + +- outcome: Executable scenario "Accepts valid auth context with userId only" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-014-accepts-auth-context-with-roles.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-014-accepts-auth-context-with-roles.sdp.md new file mode 100644 index 00000000..9f9eaa92 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-014-accepts-auth-context-with-roles.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.accepts-auth-context-with-roles +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Accepts auth context with roles + +## Intent + +- outcome: Executable scenario "Accepts auth context with roles" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-015-accepts-auth-context-with-agent-ids.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-015-accepts-auth-context-with-agent-ids.sdp.md new file mode 100644 index 00000000..022e8bc8 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-015-accepts-auth-context-with-agent-ids.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.accepts-auth-context-with-agent-ids +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Accepts auth context with agentIds + +## Intent + +- outcome: Executable scenario "Accepts auth context with agentIds" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-016-rejects-auth-context-with-empty-user-id.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-016-rejects-auth-context-with-empty-user-id.sdp.md new file mode 100644 index 00000000..b0a96a18 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-016-rejects-auth-context-with-empty-user-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.rejects-auth-context-with-empty-user-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Rejects auth context with empty userId + +## Intent + +- outcome: Executable scenario "Rejects auth context with empty userId" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-017-parses-valid-duration-strings.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-017-parses-valid-duration-strings.sdp.md new file mode 100644 index 00000000..6663ce72 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-017-parses-valid-duration-strings.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.parses-valid-duration-strings +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Parses valid duration strings + +## Intent + +- outcome: Executable scenario "Parses valid duration strings" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-018-returns-null-for-invalid-formats.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-018-returns-null-for-invalid-formats.sdp.md new file mode 100644 index 00000000..ece248b5 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-018-returns-null-for-invalid-formats.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-null-for-invalid-formats +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns null for invalid formats + +## Intent + +- outcome: Executable scenario "Returns null for invalid formats" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-019-returns-null-for-zero-values.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-019-returns-null-for-zero-values.sdp.md new file mode 100644 index 00000000..b8bcbfc2 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-019-returns-null-for-zero-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-null-for-zero-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns null for zero values + +## Intent + +- outcome: Executable scenario "Returns null for zero values" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-020-returns-true-for-valid-timeout-formats.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-020-returns-true-for-valid-timeout-formats.sdp.md new file mode 100644 index 00000000..04975502 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-020-returns-true-for-valid-timeout-formats.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-true-for-valid-timeout-formats +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns true for valid timeout formats + +## Intent + +- outcome: Executable scenario "Returns true for valid timeout formats" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-021-returns-false-for-invalid-timeout-formats.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-021-returns-false-for-invalid-timeout-formats.sdp.md new file mode 100644 index 00000000..09651fdb --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-021-returns-false-for-invalid-timeout-formats.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-false-for-invalid-timeout-formats +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns false for invalid timeout formats + +## Intent + +- outcome: Executable scenario "Returns false for invalid timeout formats" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-022-uses-explicit-timeout-from-config.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-022-uses-explicit-timeout-from-config.sdp.md new file mode 100644 index 00000000..5aa4119b --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-022-uses-explicit-timeout-from-config.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.uses-explicit-timeout-from-config +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Uses explicit timeout from config + +## Intent + +- outcome: Executable scenario "Uses explicit timeout from config" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-023-uses-default-timeout-when-not-specified.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-023-uses-default-timeout-when-not-specified.sdp.md new file mode 100644 index 00000000..89d6b0ef --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-023-uses-default-timeout-when-not-specified.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.uses-default-timeout-when-not-specified +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Uses default timeout when not specified + +## Intent + +- outcome: Executable scenario "Uses default timeout when not specified" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-024-uses-default-timeout-for-invalid-format.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-024-uses-default-timeout-for-invalid-format.sdp.md new file mode 100644 index 00000000..db18a6fd --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-024-uses-default-timeout-for-invalid-format.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.uses-default-timeout-for-invalid-format +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Uses default timeout for invalid format + +## Intent + +- outcome: Executable scenario "Uses default timeout for invalid format" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-025-returns-true-when-confidence-is-below-threshold.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-025-returns-true-when-confidence-is-below-threshold.sdp.md new file mode 100644 index 00000000..e5770ef9 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-025-returns-true-when-confidence-is-below-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-true-when-confidence-is-below-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns true when confidence is below threshold + +## Intent + +- outcome: Executable scenario "Returns true when confidence is below threshold" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-026-returns-true-when-confidence-equals-threshold-inclusive.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-026-returns-true-when-confidence-equals-threshold-inclusive.sdp.md new file mode 100644 index 00000000..9e2e228f --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-026-returns-true-when-confidence-equals-threshold-inclusive.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-true-when-confidence-equals-threshold-inclusive +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns true when confidence equals threshold (inclusive) + +## Intent + +- outcome: Executable scenario "Returns true when confidence equals threshold (inclusive)" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-027-returns-false-when-confidence-is-above-threshold.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-027-returns-false-when-confidence-is-above-threshold.sdp.md new file mode 100644 index 00000000..2924a4d9 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-027-returns-false-when-confidence-is-above-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-false-when-confidence-is-above-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns false when confidence is above threshold + +## Intent + +- outcome: Executable scenario "Returns false when confidence is above threshold" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-028-uses-default-threshold-of-0-9-when-not-specified.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-028-uses-default-threshold-of-0-9-when-not-specified.sdp.md new file mode 100644 index 00000000..49f42719 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-028-uses-default-threshold-of-0-9-when-not-specified.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.uses-default-threshold-of-0-9-when-not-specified +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Uses default threshold of 0.9 when not specified + +## Intent + +- outcome: Executable scenario "Uses default threshold of 0.9 when not specified" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-029-returns-true-for-listed-action-even-with-high-confidence.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-029-returns-true-for-listed-action-even-with-high-confidence.sdp.md new file mode 100644 index 00000000..5f2ddeeb --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-029-returns-true-for-listed-action-even-with-high-confidence.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-true-for-listed-action-even-with-high-confidence +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns true for listed action even with high confidence + +## Intent + +- outcome: Executable scenario "Returns true for listed action even with high confidence" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-030-returns-false-for-unlisted-action-with-high-confidence.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-030-returns-false-for-unlisted-action-with-high-confidence.sdp.md new file mode 100644 index 00000000..d3c008eb --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-030-returns-false-for-unlisted-action-with-high-confidence.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-false-for-unlisted-action-with-high-confidence +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns false for unlisted action with high confidence + +## Intent + +- outcome: Executable scenario "Returns false for unlisted action with high confidence" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-031-returns-false-for-auto-approved-action-with-low-confidence.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-031-returns-false-for-auto-approved-action-with-low-confidence.sdp.md new file mode 100644 index 00000000..79360ac7 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-031-returns-false-for-auto-approved-action-with-low-confidence.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-false-for-auto-approved-action-with-low-confidence +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns false for auto-approved action with low confidence + +## Intent + +- outcome: Executable scenario "Returns false for auto-approved action with low confidence" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-032-auto-approve-takes-precedence-over-low-confidence.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-032-auto-approve-takes-precedence-over-low-confidence.sdp.md new file mode 100644 index 00000000..fb7b8f38 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-032-auto-approve-takes-precedence-over-low-confidence.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.auto-approve-takes-precedence-over-low-confidence +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# autoApprove takes precedence over low confidence + +## Intent + +- outcome: Executable scenario "autoApprove takes precedence over low confidence" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-033-requires-approval-wins-when-action-is-in-both-lists.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-033-requires-approval-wins-when-action-is-in-both-lists.sdp.md new file mode 100644 index 00000000..93d2e38a --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-033-requires-approval-wins-when-action-is-in-both-lists.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.requires-approval-wins-when-action-is-in-both-lists +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# requiresApproval wins when action is in both lists + +## Intent + +- outcome: Executable scenario "requiresApproval wins when action is in both lists" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-034-falls-through-to-confidence-check-with-empty-lists.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-034-falls-through-to-confidence-check-with-empty-lists.sdp.md new file mode 100644 index 00000000..7fd93331 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-034-falls-through-to-confidence-check-with-empty-lists.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.falls-through-to-confidence-check-with-empty-lists +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Falls through to confidence check with empty lists + +## Intent + +- outcome: Executable scenario "Falls through to confidence check with empty lists" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-035-falls-through-to-confidence-check-with-undefined-lists.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-035-falls-through-to-confidence-check-with-undefined-lists.sdp.md new file mode 100644 index 00000000..a4a535e6 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-035-falls-through-to-confidence-check-with-undefined-lists.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.falls-through-to-confidence-check-with-undefined-lists +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Falls through to confidence check with undefined lists + +## Intent + +- outcome: Executable scenario "Falls through to confidence check with undefined lists" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-036-handles-confidence-of-0.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-036-handles-confidence-of-0.sdp.md new file mode 100644 index 00000000..221c535b --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-036-handles-confidence-of-0.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.handles-confidence-of-0 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Handles confidence of 0 + +## Intent + +- outcome: Executable scenario "Handles confidence of 0" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-037-handles-confidence-of-1.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-037-handles-confidence-of-1.sdp.md new file mode 100644 index 00000000..c4593ba2 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-037-handles-confidence-of-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.handles-confidence-of-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Handles confidence of 1 + +## Intent + +- outcome: Executable scenario "Handles confidence of 1" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-038-returns-true-when-agent-id-is-in-auth-context-agent-ids.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-038-returns-true-when-agent-id-is-in-auth-context-agent-ids.sdp.md new file mode 100644 index 00000000..c245444a --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-038-returns-true-when-agent-id-is-in-auth-context-agent-ids.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-true-when-agent-id-is-in-auth-context-agent-ids +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns true when agentId is in authContext agentIds + +## Intent + +- outcome: Executable scenario "Returns true when agentId is in authContext agentIds" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-039-returns-false-when-agent-id-is-not-in-auth-context-agent-ids.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-039-returns-false-when-agent-id-is-not-in-auth-context-agent-ids.sdp.md new file mode 100644 index 00000000..2ffbae95 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-039-returns-false-when-agent-id-is-not-in-auth-context-agent-ids.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-false-when-agent-id-is-not-in-auth-context-agent-ids +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns false when agentId is not in authContext agentIds + +## Intent + +- outcome: Executable scenario "Returns false when agentId is not in authContext agentIds" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-040-returns-false-when-agent-ids-is-undefined.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-040-returns-false-when-agent-ids-is-undefined.sdp.md new file mode 100644 index 00000000..ec965772 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-040-returns-false-when-agent-ids-is-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-false-when-agent-ids-is-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns false when agentIds is undefined + +## Intent + +- outcome: Executable scenario "Returns false when agentIds is undefined" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-041-returns-false-when-agent-ids-is-empty.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-041-returns-false-when-agent-ids-is-empty.sdp.md new file mode 100644 index 00000000..8f691249 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-041-returns-false-when-agent-ids-is-empty.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-false-when-agent-ids-is-empty +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns false when agentIds is empty + +## Intent + +- outcome: Executable scenario "Returns false when agentIds is empty" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-042-returns-true-when-user-has-at-least-one-role.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-042-returns-true-when-user-has-at-least-one-role.sdp.md new file mode 100644 index 00000000..20ac6401 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-042-returns-true-when-user-has-at-least-one-role.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-true-when-user-has-at-least-one-role +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns true when user has at least one role + +## Intent + +- outcome: Executable scenario "Returns true when user has at least one role" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-043-returns-false-when-roles-is-undefined.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-043-returns-false-when-roles-is-undefined.sdp.md new file mode 100644 index 00000000..29761977 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-043-returns-false-when-roles-is-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-false-when-roles-is-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns false when roles is undefined + +## Intent + +- outcome: Executable scenario "Returns false when roles is undefined" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-044-returns-false-when-roles-is-empty.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-044-returns-false-when-roles-is-empty.sdp.md new file mode 100644 index 00000000..041ea109 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-044-returns-false-when-roles-is-empty.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-false-when-roles-is-empty +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns false when roles is empty + +## Intent + +- outcome: Executable scenario "Returns false when roles is empty" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-045-agent-ids-check-fails-even-with-admin-role.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-045-agent-ids-check-fails-even-with-admin-role.sdp.md new file mode 100644 index 00000000..61a28b2f --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-045-agent-ids-check-fails-even-with-admin-role.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.agent-ids-check-fails-even-with-admin-role +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# AgentIds check fails even with admin role + +## Intent + +- outcome: Executable scenario "AgentIds check fails even with admin role" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-046-both-agent-ids-and-roles-pass.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-046-both-agent-ids-and-roles-pass.sdp.md new file mode 100644 index 00000000..c705f1c7 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-046-both-agent-ids-and-roles-pass.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.both-agent-ids-and-roles-pass +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Both agentIds and roles pass + +## Intent + +- outcome: Executable scenario "Both agentIds and roles pass" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-047-generates-id-with-apr-prefix-and-correct-format.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-047-generates-id-with-apr-prefix-and-correct-format.sdp.md new file mode 100644 index 00000000..575217d0 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-047-generates-id-with-apr-prefix-and-correct-format.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.generates-id-with-apr-prefix-and-correct-format +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Generates ID with apr_ prefix and correct format + +## Intent + +- outcome: Executable scenario "Generates ID with apr_ prefix and correct format" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-048-generates-unique-i-ds-over-multiple-calls.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-048-generates-unique-i-ds-over-multiple-calls.sdp.md new file mode 100644 index 00000000..69ba017b --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-048-generates-unique-i-ds-over-multiple-calls.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.generates-unique-i-ds-over-multiple-calls +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Generates unique IDs over multiple calls + +## Intent + +- outcome: Executable scenario "Generates unique IDs over multiple calls" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-049-sets-correct-initial-field-values.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-049-sets-correct-initial-field-values.sdp.md new file mode 100644 index 00000000..723f8678 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-049-sets-correct-initial-field-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.sets-correct-initial-field-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Sets correct initial field values + +## Intent + +- outcome: Executable scenario "Sets correct initial field values" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-050-generates-unique-approval-ids-over-multiple-calls.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-050-generates-unique-approval-ids-over-multiple-calls.sdp.md new file mode 100644 index 00000000..d0ec3bca --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-050-generates-unique-approval-ids-over-multiple-calls.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.generates-unique-approval-ids-over-multiple-calls +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Generates unique approvalIds over multiple calls + +## Intent + +- outcome: Executable scenario "Generates unique approvalIds over multiple calls" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-051-sets-requested-at-to-current-time.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-051-sets-requested-at-to-current-time.sdp.md new file mode 100644 index 00000000..c02fbc1d --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-051-sets-requested-at-to-current-time.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.sets-requested-at-to-current-time +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Sets requestedAt to current time + +## Intent + +- outcome: Executable scenario "Sets requestedAt to current time" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-052-calculates-expires-at-based-on-config-timeout.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-052-calculates-expires-at-based-on-config-timeout.sdp.md new file mode 100644 index 00000000..ee60b839 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-052-calculates-expires-at-based-on-config-timeout.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.calculates-expires-at-based-on-config-timeout +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Calculates expiresAt based on config timeout + +## Intent + +- outcome: Executable scenario "Calculates expiresAt based on config timeout" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-053-does-not-include-optional-fields-initially.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-053-does-not-include-optional-fields-initially.sdp.md new file mode 100644 index 00000000..8246fa3b --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-053-does-not-include-optional-fields-initially.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.does-not-include-optional-fields-initially +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Does not include optional fields initially + +## Intent + +- outcome: Executable scenario "Does not include optional fields initially" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-054-transitions-pending-approval-to-approved.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-054-transitions-pending-approval-to-approved.sdp.md new file mode 100644 index 00000000..771f743a --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-054-transitions-pending-approval-to-approved.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.transitions-pending-approval-to-approved +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Transitions pending approval to approved + +## Intent + +- outcome: Executable scenario "Transitions pending approval to approved" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-055-includes-review-note-when-provided.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-055-includes-review-note-when-provided.sdp.md new file mode 100644 index 00000000..52596211 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-055-includes-review-note-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.includes-review-note-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Includes reviewNote when provided + +## Intent + +- outcome: Executable scenario "Includes reviewNote when provided" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-056-does-not-include-review-note-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-056-does-not-include-review-note-when-not-provided.sdp.md new file mode 100644 index 00000000..bce30f4c --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-056-does-not-include-review-note-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.does-not-include-review-note-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Does not include reviewNote when not provided + +## Intent + +- outcome: Executable scenario "Does not include reviewNote when not provided" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-057-throws-error-for-non-pending-statuses.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-057-throws-error-for-non-pending-statuses.sdp.md new file mode 100644 index 00000000..a0ed2e28 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-057-throws-error-for-non-pending-statuses.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.throws-error-for-non-pending-statuses +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Throws error for non-pending statuses + +## Intent + +- outcome: Executable scenario "Throws error for non-pending statuses" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-058-throws-error-for-expired-pending-approvals.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-058-throws-error-for-expired-pending-approvals.sdp.md new file mode 100644 index 00000000..c7ab2a67 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-058-throws-error-for-expired-pending-approvals.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.throws-error-for-expired-pending-approvals +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Throws error for expired pending approvals + +## Intent + +- outcome: Executable scenario "Throws error for expired pending approvals" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-059-preserves-other-fields-after-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-059-preserves-other-fields-after-approval.sdp.md new file mode 100644 index 00000000..c00bd6d3 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-059-preserves-other-fields-after-approval.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.preserves-other-fields-after-approval +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Preserves other fields after approval + +## Intent + +- outcome: Executable scenario "Preserves other fields after approval" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-060-transitions-pending-approval-to-rejected-with-reason.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-060-transitions-pending-approval-to-rejected-with-reason.sdp.md new file mode 100644 index 00000000..fc7ccf1a --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-060-transitions-pending-approval-to-rejected-with-reason.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.transitions-pending-approval-to-rejected-with-reason +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Transitions pending approval to rejected with reason + +## Intent + +- outcome: Executable scenario "Transitions pending approval to rejected with reason" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-061-sets-reviewed-at-to-current-time-on-rejection.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-061-sets-reviewed-at-to-current-time-on-rejection.sdp.md new file mode 100644 index 00000000..a0e7e409 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-061-sets-reviewed-at-to-current-time-on-rejection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.sets-reviewed-at-to-current-time-on-rejection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Sets reviewedAt to current time on rejection + +## Intent + +- outcome: Executable scenario "Sets reviewedAt to current time on rejection" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-062-throws-error-when-rejecting-non-pending-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-062-throws-error-when-rejecting-non-pending-approval.sdp.md new file mode 100644 index 00000000..bfa780f4 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-062-throws-error-when-rejecting-non-pending-approval.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.throws-error-when-rejecting-non-pending-approval +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Throws error when rejecting non-pending approval + +## Intent + +- outcome: Executable scenario "Throws error when rejecting non-pending approval" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-063-throws-error-when-rejecting-expired-pending-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-063-throws-error-when-rejecting-expired-pending-approval.sdp.md new file mode 100644 index 00000000..00a52670 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-063-throws-error-when-rejecting-expired-pending-approval.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.throws-error-when-rejecting-expired-pending-approval +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Throws error when rejecting expired pending approval + +## Intent + +- outcome: Executable scenario "Throws error when rejecting expired pending approval" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-064-transitions-pending-approval-to-expired.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-064-transitions-pending-approval-to-expired.sdp.md new file mode 100644 index 00000000..778db323 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-064-transitions-pending-approval-to-expired.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.transitions-pending-approval-to-expired +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Transitions pending approval to expired + +## Intent + +- outcome: Executable scenario "Transitions pending approval to expired" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-065-throws-error-when-expiring-non-pending-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-065-throws-error-when-expiring-non-pending-approval.sdp.md new file mode 100644 index 00000000..c5855726 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-065-throws-error-when-expiring-non-pending-approval.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.throws-error-when-expiring-non-pending-approval +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Throws error when expiring non-pending approval + +## Intent + +- outcome: Executable scenario "Throws error when expiring non-pending approval" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-066-preserves-original-fields-after-expiration.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-066-preserves-original-fields-after-expiration.sdp.md new file mode 100644 index 00000000..4510fc9d --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-066-preserves-original-fields-after-expiration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.preserves-original-fields-after-expiration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Preserves original fields after expiration + +## Intent + +- outcome: Executable scenario "Preserves original fields after expiration" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-067-returns-success-for-valid-pending-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-067-returns-success-for-valid-pending-approval.sdp.md new file mode 100644 index 00000000..47e02b45 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-067-returns-success-for-valid-pending-approval.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-success-for-valid-pending-approval +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns success for valid pending approval + +## Intent + +- outcome: Executable scenario "Returns success for valid pending approval" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-068-returns-unauthorized-reviewer-when-not-authorized.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-068-returns-unauthorized-reviewer-when-not-authorized.sdp.md new file mode 100644 index 00000000..47344460 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-068-returns-unauthorized-reviewer-when-not-authorized.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-unauthorized-reviewer-when-not-authorized +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns UNAUTHORIZED_REVIEWER when not authorized + +## Intent + +- outcome: Executable scenario "Returns UNAUTHORIZED_REVIEWER when not authorized" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-069-returns-invalid-status-transition-when-already-processed.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-069-returns-invalid-status-transition-when-already-processed.sdp.md new file mode 100644 index 00000000..088916f0 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-069-returns-invalid-status-transition-when-already-processed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-invalid-status-transition-when-already-processed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns INVALID_STATUS_TRANSITION when already processed + +## Intent + +- outcome: Executable scenario "Returns INVALID_STATUS_TRANSITION when already processed" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-070-returns-approval-expired-when-past-expiration.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-070-returns-approval-expired-when-past-expiration.sdp.md new file mode 100644 index 00000000..8a2acfe2 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-070-returns-approval-expired-when-past-expiration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-approval-expired-when-past-expiration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns APPROVAL_EXPIRED when past expiration + +## Intent + +- outcome: Executable scenario "Returns APPROVAL_EXPIRED when past expiration" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-071-returns-success-for-valid-rejection.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-071-returns-success-for-valid-rejection.sdp.md new file mode 100644 index 00000000..5ad2bddf --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-071-returns-success-for-valid-rejection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-success-for-valid-rejection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns success for valid rejection + +## Intent + +- outcome: Executable scenario "Returns success for valid rejection" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-072-returns-unauthorized-reviewer-on-safe-reject.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-072-returns-unauthorized-reviewer-on-safe-reject.sdp.md new file mode 100644 index 00000000..04d09060 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-072-returns-unauthorized-reviewer-on-safe-reject.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-unauthorized-reviewer-on-safe-reject +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns UNAUTHORIZED_REVIEWER on safe reject + +## Intent + +- outcome: Executable scenario "Returns UNAUTHORIZED_REVIEWER on safe reject" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-073-returns-approval-expired-on-safe-reject.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-073-returns-approval-expired-on-safe-reject.sdp.md new file mode 100644 index 00000000..0a6f9acf --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-073-returns-approval-expired-on-safe-reject.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-approval-expired-on-safe-reject +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns APPROVAL_EXPIRED on safe reject + +## Intent + +- outcome: Executable scenario "Returns APPROVAL_EXPIRED on safe reject" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-074-is-approval-pending-returns-true-only-for-pending.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-074-is-approval-pending-returns-true-only-for-pending.sdp.md new file mode 100644 index 00000000..28845b93 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-074-is-approval-pending-returns-true-only-for-pending.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.is-approval-pending-returns-true-only-for-pending +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# isApprovalPending returns true only for pending + +## Intent + +- outcome: Executable scenario "isApprovalPending returns true only for pending" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-075-is-approval-approved-returns-true-only-for-approved.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-075-is-approval-approved-returns-true-only-for-approved.sdp.md new file mode 100644 index 00000000..ab8a6945 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-075-is-approval-approved-returns-true-only-for-approved.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.is-approval-approved-returns-true-only-for-approved +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# isApprovalApproved returns true only for approved + +## Intent + +- outcome: Executable scenario "isApprovalApproved returns true only for approved" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-076-is-approval-rejected-returns-true-only-for-rejected.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-076-is-approval-rejected-returns-true-only-for-rejected.sdp.md new file mode 100644 index 00000000..eb0b6f63 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-076-is-approval-rejected-returns-true-only-for-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.is-approval-rejected-returns-true-only-for-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# isApprovalRejected returns true only for rejected + +## Intent + +- outcome: Executable scenario "isApprovalRejected returns true only for rejected" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-077-is-approval-expired-detects-expired-status-and-time-based-expiration.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-077-is-approval-expired-detects-expired-status-and-time-based-expiration.sdp.md new file mode 100644 index 00000000..f48d046a --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-077-is-approval-expired-detects-expired-status-and-time-based-expiration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.is-approval-expired-detects-expired-status-and-time-based-expiration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# isApprovalExpired detects expired status and time-based expiration + +## Intent + +- outcome: Executable scenario "isApprovalExpired detects expired status and time-based expiration" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-078-is-approval-actionable-checks-pending-and-not-expired.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-078-is-approval-actionable-checks-pending-and-not-expired.sdp.md new file mode 100644 index 00000000..f281c4c1 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-078-is-approval-actionable-checks-pending-and-not-expired.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.is-approval-actionable-checks-pending-and-not-expired +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# isApprovalActionable checks pending and not expired + +## Intent + +- outcome: Executable scenario "isApprovalActionable checks pending and not expired" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-079-returns-remaining-time-for-pending-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-079-returns-remaining-time-for-pending-approval.sdp.md new file mode 100644 index 00000000..5e6ea449 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-079-returns-remaining-time-for-pending-approval.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-remaining-time-for-pending-approval +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns remaining time for pending approval + +## Intent + +- outcome: Executable scenario "Returns remaining time for pending approval" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-080-returns-0-for-expired-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-080-returns-0-for-expired-approval.sdp.md new file mode 100644 index 00000000..55132c2e --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-080-returns-0-for-expired-approval.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-0-for-expired-approval +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns 0 for expired approval + +## Intent + +- outcome: Executable scenario "Returns 0 for expired approval" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-081-returns-0-for-non-pending-status.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-081-returns-0-for-non-pending-status.sdp.md new file mode 100644 index 00000000..e9756972 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-081-returns-0-for-non-pending-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-0-for-non-pending-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns 0 for non-pending status + +## Intent + +- outcome: Executable scenario "Returns 0 for non-pending status" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-082-formats-hours-and-minutes.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-082-formats-hours-and-minutes.sdp.md new file mode 100644 index 00000000..b6374be5 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-082-formats-hours-and-minutes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.formats-hours-and-minutes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Formats hours and minutes + +## Intent + +- outcome: Executable scenario "Formats hours and minutes" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-083-formats-minutes-only.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-083-formats-minutes-only.sdp.md new file mode 100644 index 00000000..f7ea4dd8 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-083-formats-minutes-only.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.formats-minutes-only +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Formats minutes only + +## Intent + +- outcome: Executable scenario "Formats minutes only" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-084-returns-expired-for-past-expiration.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-084-returns-expired-for-past-expiration.sdp.md new file mode 100644 index 00000000..5df762c0 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-084-returns-expired-for-past-expiration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-expired-for-past-expiration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns expired for past expiration + +## Intent + +- outcome: Executable scenario "Returns expired for past expiration" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-085-returns-true-for-valid-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-085-returns-true-for-valid-approval.sdp.md new file mode 100644 index 00000000..2d2155bc --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-085-returns-true-for-valid-approval.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-true-for-valid-approval +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns true for valid approval + +## Intent + +- outcome: Executable scenario "Returns true for valid approval" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-086-returns-false-for-invalid-inputs.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-086-returns-false-for-invalid-inputs.sdp.md new file mode 100644 index 00000000..bbe37d97 --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-086-returns-false-for-invalid-inputs.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-false-for-invalid-inputs +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns false for invalid inputs + +## Intent + +- outcome: Executable scenario "Returns false for invalid inputs" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/approval.examples/s-087-returns-false-for-invalid-confidence.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-087-returns-false-for-invalid-confidence.sdp.md new file mode 100644 index 00000000..5422661f --- /dev/null +++ b/specs/behavior/platform-core/agent/approval.examples/s-087-returns-false-for-invalid-confidence.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.approval.returns-false-for-invalid-confidence +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.approval +--- +# Returns false for invalid confidence + +## Intent + +- outcome: Executable scenario "Returns false for invalid confidence" from packages/platform-core/tests/features/behavior/agent/approval.feature diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-001-record-pattern-detected-event.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-001-record-pattern-detected-event.sdp.md new file mode 100644 index 00000000..b5a92ce4 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-001-record-pattern-detected-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit-trail.record-pattern-detected-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit-trail +--- +# Record PatternDetected event + +## Intent + +- outcome: Executable scenario "Record PatternDetected event" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-002-audit-includes-triggering-events.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-002-audit-includes-triggering-events.sdp.md new file mode 100644 index 00000000..df74ed5c --- /dev/null +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-002-audit-includes-triggering-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit-trail.audit-includes-triggering-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit-trail +--- +# Audit includes triggering events + +## Intent + +- outcome: Executable scenario "Audit includes triggering events" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-003-audit-includes-execution-mode.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-003-audit-includes-execution-mode.sdp.md new file mode 100644 index 00000000..ef77b88f --- /dev/null +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-003-audit-includes-execution-mode.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit-trail.audit-includes-execution-mode +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit-trail +--- +# Audit includes execution mode + +## Intent + +- outcome: Executable scenario "Audit includes execution mode" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-004-audit-includes-llm-metadata.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-004-audit-includes-llm-metadata.sdp.md new file mode 100644 index 00000000..7bbf4a8e --- /dev/null +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-004-audit-includes-llm-metadata.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit-trail.audit-includes-llm-metadata +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit-trail +--- +# Audit includes LLM metadata + +## Intent + +- outcome: Executable scenario "Audit includes LLM metadata" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-005-audit-llm-failures.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-005-audit-llm-failures.sdp.md new file mode 100644 index 00000000..806b8614 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-005-audit-llm-failures.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit-trail.audit-llm-failures +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit-trail +--- +# Audit LLM failures + +## Intent + +- outcome: Executable scenario "Audit LLM failures" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-006-record-auto-executed-action.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-006-record-auto-executed-action.sdp.md new file mode 100644 index 00000000..3c144cf3 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-006-record-auto-executed-action.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit-trail.record-auto-executed-action +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit-trail +--- +# Record auto-executed action + +## Intent + +- outcome: Executable scenario "Record auto-executed action" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-007-record-approved-action.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-007-record-approved-action.sdp.md new file mode 100644 index 00000000..31ea25fb --- /dev/null +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-007-record-approved-action.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit-trail.record-approved-action +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit-trail +--- +# Record approved action + +## Intent + +- outcome: Executable scenario "Record approved action" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-008-record-rejected-action.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-008-record-rejected-action.sdp.md new file mode 100644 index 00000000..2c5d3410 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-008-record-rejected-action.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit-trail.record-rejected-action +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit-trail +--- +# Record rejected action + +## Intent + +- outcome: Executable scenario "Record rejected action" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-009-record-expired-action.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-009-record-expired-action.sdp.md new file mode 100644 index 00000000..1b2f288d --- /dev/null +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-009-record-expired-action.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit-trail.record-expired-action +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit-trail +--- +# Record expired action + +## Intent + +- outcome: Executable scenario "Record expired action" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-010-query-all-decisions-for-an-agent.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-010-query-all-decisions-for-an-agent.sdp.md new file mode 100644 index 00000000..4d6431f9 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-010-query-all-decisions-for-an-agent.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit-trail.query-all-decisions-for-an-agent +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit-trail +--- +# Query all decisions for an agent + +## Intent + +- outcome: Executable scenario "Query all decisions for an agent" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-011-query-decisions-by-pattern-type.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-011-query-decisions-by-pattern-type.sdp.md new file mode 100644 index 00000000..ccb80b90 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-011-query-decisions-by-pattern-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit-trail.query-decisions-by-pattern-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit-trail +--- +# Query decisions by pattern type + +## Intent + +- outcome: Executable scenario "Query decisions by pattern type" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-012-query-decisions-by-time-range.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-012-query-decisions-by-time-range.sdp.md new file mode 100644 index 00000000..e9c53b5f --- /dev/null +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-012-query-decisions-by-time-range.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit-trail.query-decisions-by-time-range +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit-trail +--- +# Query decisions by time range + +## Intent + +- outcome: Executable scenario "Query decisions by time range" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-013-query-decision-with-full-trace.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-013-query-decision-with-full-trace.sdp.md new file mode 100644 index 00000000..cbba185d --- /dev/null +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-013-query-decision-with-full-trace.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit-trail.query-decision-with-full-trace +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit-trail +--- +# Query decision with full trace + +## Intent + +- outcome: Executable scenario "Query decision with full trace" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-001-contains-all-ds-1-base-event-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-001-contains-all-ds-1-base-event-types.sdp.md new file mode 100644 index 00000000..6e4c712e --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-001-contains-all-ds-1-base-event-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.contains-all-ds-1-base-event-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Contains all DS-1 base event types + +## Intent + +- outcome: Executable scenario "Contains all DS-1 base event types" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-002-contains-all-ds-4-command-routing-event-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-002-contains-all-ds-4-command-routing-event-types.sdp.md new file mode 100644 index 00000000..ce5f5fa7 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-002-contains-all-ds-4-command-routing-event-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.contains-all-ds-4-command-routing-event-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Contains all DS-4 command routing event types + +## Intent + +- outcome: Executable scenario "Contains all DS-4 command routing event types" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-003-contains-all-ds-5-lifecycle-event-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-003-contains-all-ds-5-lifecycle-event-types.sdp.md new file mode 100644 index 00000000..0a22d432 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-003-contains-all-ds-5-lifecycle-event-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.contains-all-ds-5-lifecycle-event-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Contains all DS-5 lifecycle event types + +## Intent + +- outcome: Executable scenario "Contains all DS-5 lifecycle event types" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-004-contains-ds-6-failure-tracking-event-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-004-contains-ds-6-failure-tracking-event-type.sdp.md new file mode 100644 index 00000000..bd8d8223 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-004-contains-ds-6-failure-tracking-event-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.contains-ds-6-failure-tracking-event-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Contains DS-6 failure tracking event type + +## Intent + +- outcome: Executable scenario "Contains DS-6 failure tracking event type" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-005-has-exactly-17-event-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-005-has-exactly-17-event-types.sdp.md new file mode 100644 index 00000000..b5860b53 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-005-has-exactly-17-event-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.has-exactly-17-event-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Has exactly 17 event types + +## Intent + +- outcome: Executable scenario "Has exactly 17 event types" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-006-returns-true-for-all-valid-event-type-strings.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-006-returns-true-for-all-valid-event-type-strings.sdp.md new file mode 100644 index 00000000..c9a7506a --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-006-returns-true-for-all-valid-event-type-strings.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.returns-true-for-all-valid-event-type-strings +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Returns true for all valid event type strings + +## Intent + +- outcome: Executable scenario "Returns true for all valid event type strings" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-007-returns-false-for-invalid-values.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-007-returns-false-for-invalid-values.sdp.md new file mode 100644 index 00000000..3606d83c --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-007-returns-false-for-invalid-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.returns-false-for-invalid-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Returns false for invalid values + +## Intent + +- outcome: Executable scenario "Returns false for invalid values" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-008-returns-false-for-non-string-values.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-008-returns-false-for-non-string-values.sdp.md new file mode 100644 index 00000000..b71bb931 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-008-returns-false-for-non-string-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.returns-false-for-non-string-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Returns false for non-string values + +## Intent + +- outcome: Executable scenario "Returns false for non-string values" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-009-accepts-all-valid-event-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-009-accepts-all-valid-event-types.sdp.md new file mode 100644 index 00000000..1d823355 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-009-accepts-all-valid-event-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.accepts-all-valid-event-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Accepts all valid event types + +## Intent + +- outcome: Executable scenario "Accepts all valid event types" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-010-rejects-invalid-event-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-010-rejects-invalid-event-types.sdp.md new file mode 100644 index 00000000..993adc32 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-010-rejects-invalid-event-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.rejects-invalid-event-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Rejects invalid event types + +## Intent + +- outcome: Executable scenario "Rejects invalid event types" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-011-rejects-non-string-values-via-zod.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-011-rejects-non-string-values-via-zod.sdp.md new file mode 100644 index 00000000..80c38e19 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-011-rejects-non-string-values-via-zod.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.rejects-non-string-values-via-zod +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Rejects non-string values via Zod + +## Intent + +- outcome: Executable scenario "Rejects non-string values via Zod" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-012-accepts-valid-llm-context.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-012-accepts-valid-llm-context.sdp.md new file mode 100644 index 00000000..399268bf --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-012-accepts-valid-llm-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.accepts-valid-llm-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Accepts valid LLM context + +## Intent + +- outcome: Executable scenario "Accepts valid LLM context" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-013-rejects-negative-tokens.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-013-rejects-negative-tokens.sdp.md new file mode 100644 index 00000000..b8776988 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-013-rejects-negative-tokens.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.rejects-negative-tokens +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Rejects negative tokens + +## Intent + +- outcome: Executable scenario "Rejects negative tokens" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-014-rejects-negative-duration.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-014-rejects-negative-duration.sdp.md new file mode 100644 index 00000000..406c2f62 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-014-rejects-negative-duration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.rejects-negative-duration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Rejects negative duration + +## Intent + +- outcome: Executable scenario "Rejects negative duration" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-015-rejects-non-integer-tokens.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-015-rejects-non-integer-tokens.sdp.md new file mode 100644 index 00000000..2f91a4c6 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-015-rejects-non-integer-tokens.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.rejects-non-integer-tokens +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Rejects non-integer tokens + +## Intent + +- outcome: Executable scenario "Rejects non-integer tokens" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-016-accepts-zero-values.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-016-accepts-zero-values.sdp.md new file mode 100644 index 00000000..f04babf1 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-016-accepts-zero-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.accepts-zero-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Accepts zero values + +## Intent + +- outcome: Executable scenario "Accepts zero values" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-017-accepts-valid-action-with-flag-for-review.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-017-accepts-valid-action-with-flag-for-review.sdp.md new file mode 100644 index 00000000..5f17b6b5 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-017-accepts-valid-action-with-flag-for-review.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.accepts-valid-action-with-flag-for-review +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Accepts valid action with flag-for-review + +## Intent + +- outcome: Executable scenario "Accepts valid action with flag-for-review" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-018-accepts-valid-action-with-auto-execute.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-018-accepts-valid-action-with-auto-execute.sdp.md new file mode 100644 index 00000000..e8268f02 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-018-accepts-valid-action-with-auto-execute.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.accepts-valid-action-with-auto-execute +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Accepts valid action with auto-execute + +## Intent + +- outcome: Executable scenario "Accepts valid action with auto-execute" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-019-rejects-action-with-empty-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-019-rejects-action-with-empty-type.sdp.md new file mode 100644 index 00000000..2d5d3963 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-019-rejects-action-with-empty-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.rejects-action-with-empty-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Rejects action with empty type + +## Intent + +- outcome: Executable scenario "Rejects action with empty type" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-020-rejects-action-with-invalid-execution-mode.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-020-rejects-action-with-invalid-execution-mode.sdp.md new file mode 100644 index 00000000..4b494775 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-020-rejects-action-with-invalid-execution-mode.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.rejects-action-with-invalid-execution-mode +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Rejects action with invalid executionMode + +## Intent + +- outcome: Executable scenario "Rejects action with invalid executionMode" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-021-rejects-action-with-extra-fields-in-strict-mode.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-021-rejects-action-with-extra-fields-in-strict-mode.sdp.md new file mode 100644 index 00000000..2d0512d9 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-021-rejects-action-with-extra-fields-in-strict-mode.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.rejects-action-with-extra-fields-in-strict-mode +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Rejects action with extra fields in strict mode + +## Intent + +- outcome: Executable scenario "Rejects action with extra fields in strict mode" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-022-accepts-valid-payload-with-action.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-022-accepts-valid-payload-with-action.sdp.md new file mode 100644 index 00000000..1dfce3b7 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-022-accepts-valid-payload-with-action.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.accepts-valid-payload-with-action +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Accepts valid payload with action + +## Intent + +- outcome: Executable scenario "Accepts valid payload with action" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-023-accepts-payload-with-null-pattern-detected.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-023-accepts-payload-with-null-pattern-detected.sdp.md new file mode 100644 index 00000000..80950532 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-023-accepts-payload-with-null-pattern-detected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.accepts-payload-with-null-pattern-detected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Accepts payload with null patternDetected + +## Intent + +- outcome: Executable scenario "Accepts payload with null patternDetected" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-024-accepts-payload-with-null-action.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-024-accepts-payload-with-null-action.sdp.md new file mode 100644 index 00000000..4d6a07c8 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-024-accepts-payload-with-null-action.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.accepts-payload-with-null-action +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Accepts payload with null action + +## Intent + +- outcome: Executable scenario "Accepts payload with null action" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-025-accepts-payload-with-llm-context.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-025-accepts-payload-with-llm-context.sdp.md new file mode 100644 index 00000000..c1de62de --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-025-accepts-payload-with-llm-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.accepts-payload-with-llm-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Accepts payload with LLM context + +## Intent + +- outcome: Executable scenario "Accepts payload with LLM context" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-026-rejects-payload-with-confidence-below-0.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-026-rejects-payload-with-confidence-below-0.sdp.md new file mode 100644 index 00000000..a32fca75 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-026-rejects-payload-with-confidence-below-0.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.rejects-payload-with-confidence-below-0 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Rejects payload with confidence below 0 + +## Intent + +- outcome: Executable scenario "Rejects payload with confidence below 0" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-027-rejects-payload-with-confidence-above-1.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-027-rejects-payload-with-confidence-above-1.sdp.md new file mode 100644 index 00000000..0ed15562 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-027-rejects-payload-with-confidence-above-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.rejects-payload-with-confidence-above-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Rejects payload with confidence above 1 + +## Intent + +- outcome: Executable scenario "Rejects payload with confidence above 1" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-028-accepts-valid-approval-granted-payload.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-028-accepts-valid-approval-granted-payload.sdp.md new file mode 100644 index 00000000..3fc336a1 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-028-accepts-valid-approval-granted-payload.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.accepts-valid-approval-granted-payload +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Accepts valid approval granted payload + +## Intent + +- outcome: Executable scenario "Accepts valid approval granted payload" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-029-accepts-payload-with-review-note.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-029-accepts-payload-with-review-note.sdp.md new file mode 100644 index 00000000..35a5a0b9 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-029-accepts-payload-with-review-note.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.accepts-payload-with-review-note +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Accepts payload with reviewNote + +## Intent + +- outcome: Executable scenario "Accepts payload with reviewNote" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-030-rejects-payload-with-empty-action-id.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-030-rejects-payload-with-empty-action-id.sdp.md new file mode 100644 index 00000000..35882135 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-030-rejects-payload-with-empty-action-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.rejects-payload-with-empty-action-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Rejects payload with empty actionId + +## Intent + +- outcome: Executable scenario "Rejects payload with empty actionId" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-031-accepts-valid-approval-rejected-payload.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-031-accepts-valid-approval-rejected-payload.sdp.md new file mode 100644 index 00000000..59b877ee --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-031-accepts-valid-approval-rejected-payload.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.accepts-valid-approval-rejected-payload +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Accepts valid approval rejected payload + +## Intent + +- outcome: Executable scenario "Accepts valid approval rejected payload" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-032-allows-empty-rejection-reason-string.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-032-allows-empty-rejection-reason-string.sdp.md new file mode 100644 index 00000000..47ed0750 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-032-allows-empty-rejection-reason-string.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.allows-empty-rejection-reason-string +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Allows empty rejectionReason string + +## Intent + +- outcome: Executable scenario "Allows empty rejectionReason string" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-033-accepts-valid-approval-expired-payload.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-033-accepts-valid-approval-expired-payload.sdp.md new file mode 100644 index 00000000..ffa90dfc --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-033-accepts-valid-approval-expired-payload.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.accepts-valid-approval-expired-payload +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Accepts valid approval expired payload + +## Intent + +- outcome: Executable scenario "Accepts valid approval expired payload" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-034-rejects-payload-with-empty-action-id.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-034-rejects-payload-with-empty-action-id.sdp.md new file mode 100644 index 00000000..9e57812e --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-034-rejects-payload-with-empty-action-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.rejects-payload-with-empty-action-id-2 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Rejects payload with empty actionId + +## Intent + +- outcome: Executable scenario "Rejects payload with empty actionId" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-035-accepts-valid-audit-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-035-accepts-valid-audit-event.sdp.md new file mode 100644 index 00000000..a896c488 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-035-accepts-valid-audit-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.accepts-valid-audit-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Accepts valid audit event + +## Intent + +- outcome: Executable scenario "Accepts valid audit event" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-036-rejects-event-with-empty-agent-id.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-036-rejects-event-with-empty-agent-id.sdp.md new file mode 100644 index 00000000..5361d648 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-036-rejects-event-with-empty-agent-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.rejects-event-with-empty-agent-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Rejects event with empty agentId + +## Intent + +- outcome: Executable scenario "Rejects event with empty agentId" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-037-rejects-event-with-empty-decision-id.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-037-rejects-event-with-empty-decision-id.sdp.md new file mode 100644 index 00000000..f0917116 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-037-rejects-event-with-empty-decision-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.rejects-event-with-empty-decision-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Rejects event with empty decisionId + +## Intent + +- outcome: Executable scenario "Rejects event with empty decisionId" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-038-generates-i-ds-with-dec-prefix.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-038-generates-i-ds-with-dec-prefix.sdp.md new file mode 100644 index 00000000..81876a3f --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-038-generates-i-ds-with-dec-prefix.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.generates-i-ds-with-dec-prefix +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Generates IDs with dec_ prefix + +## Intent + +- outcome: Executable scenario "Generates IDs with dec_ prefix" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-039-generates-i-ds-with-expected-format.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-039-generates-i-ds-with-expected-format.sdp.md new file mode 100644 index 00000000..d7a2ca7b --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-039-generates-i-ds-with-expected-format.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.generates-i-ds-with-expected-format +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Generates IDs with expected format + +## Intent + +- outcome: Executable scenario "Generates IDs with expected format" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-040-generates-unique-i-ds-over-multiple-calls.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-040-generates-unique-i-ds-over-multiple-calls.sdp.md new file mode 100644 index 00000000..14ffcbf2 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-040-generates-unique-i-ds-over-multiple-calls.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.generates-unique-i-ds-over-multiple-calls +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Generates unique IDs over multiple calls + +## Intent + +- outcome: Executable scenario "Generates unique IDs over multiple calls" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-041-uses-a-uui-dv7-payload-in-the-id.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-041-uses-a-uui-dv7-payload-in-the-id.sdp.md new file mode 100644 index 00000000..86c31e83 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-041-uses-a-uui-dv7-payload-in-the-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.uses-a-uui-dv7-payload-in-the-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Uses a UUIDv7 payload in the ID + +## Intent + +- outcome: Executable scenario "Uses a UUIDv7 payload in the ID" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-042-creates-event-with-pattern-detected-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-042-creates-event-with-pattern-detected-type.sdp.md new file mode 100644 index 00000000..b578b683 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-042-creates-event-with-pattern-detected-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.creates-event-with-pattern-detected-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Creates event with PatternDetected type + +## Intent + +- outcome: Executable scenario "Creates event with PatternDetected type" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-043-includes-all-required-fields.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-043-includes-all-required-fields.sdp.md new file mode 100644 index 00000000..45ccf291 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-043-includes-all-required-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.includes-all-required-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Includes all required fields + +## Intent + +- outcome: Executable scenario "Includes all required fields" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-044-includes-llm-context-when-provided.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-044-includes-llm-context-when-provided.sdp.md new file mode 100644 index 00000000..f457ec95 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-044-includes-llm-context-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.includes-llm-context-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Includes LLM context when provided + +## Intent + +- outcome: Executable scenario "Includes LLM context when provided" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-045-does-not-include-llm-context-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-045-does-not-include-llm-context-when-not-provided.sdp.md new file mode 100644 index 00000000..75b6c31d --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-045-does-not-include-llm-context-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.does-not-include-llm-context-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Does not include LLM context when not provided + +## Intent + +- outcome: Executable scenario "Does not include LLM context when not provided" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-046-handles-null-pattern-detected.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-046-handles-null-pattern-detected.sdp.md new file mode 100644 index 00000000..102395e5 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-046-handles-null-pattern-detected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.handles-null-pattern-detected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Handles null patternDetected + +## Intent + +- outcome: Executable scenario "Handles null patternDetected" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-047-handles-null-action.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-047-handles-null-action.sdp.md new file mode 100644 index 00000000..a41979da --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-047-handles-null-action.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.handles-null-action +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Handles null action + +## Intent + +- outcome: Executable scenario "Handles null action" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-048-creates-event-with-approval-granted-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-048-creates-event-with-approval-granted-type.sdp.md new file mode 100644 index 00000000..b7106133 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-048-creates-event-with-approval-granted-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.creates-event-with-approval-granted-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Creates event with ApprovalGranted type + +## Intent + +- outcome: Executable scenario "Creates event with ApprovalGranted type" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-049-includes-all-required-fields-for-approval-granted.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-049-includes-all-required-fields-for-approval-granted.sdp.md new file mode 100644 index 00000000..90c38d71 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-049-includes-all-required-fields-for-approval-granted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.includes-all-required-fields-for-approval-granted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Includes all required fields for approval granted + +## Intent + +- outcome: Executable scenario "Includes all required fields for approval granted" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-050-includes-review-note-when-provided.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-050-includes-review-note-when-provided.sdp.md new file mode 100644 index 00000000..299c4992 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-050-includes-review-note-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.includes-review-note-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Includes reviewNote when provided + +## Intent + +- outcome: Executable scenario "Includes reviewNote when provided" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-051-does-not-include-review-note-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-051-does-not-include-review-note-when-not-provided.sdp.md new file mode 100644 index 00000000..e00a557e --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-051-does-not-include-review-note-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.does-not-include-review-note-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Does not include reviewNote when not provided + +## Intent + +- outcome: Executable scenario "Does not include reviewNote when not provided" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-052-creates-event-with-approval-rejected-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-052-creates-event-with-approval-rejected-type.sdp.md new file mode 100644 index 00000000..9d9e2281 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-052-creates-event-with-approval-rejected-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.creates-event-with-approval-rejected-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Creates event with ApprovalRejected type + +## Intent + +- outcome: Executable scenario "Creates event with ApprovalRejected type" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-053-includes-all-required-fields-for-approval-rejected.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-053-includes-all-required-fields-for-approval-rejected.sdp.md new file mode 100644 index 00000000..6bf3b4b5 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-053-includes-all-required-fields-for-approval-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.includes-all-required-fields-for-approval-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Includes all required fields for approval rejected + +## Intent + +- outcome: Executable scenario "Includes all required fields for approval rejected" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-054-creates-event-with-approval-expired-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-054-creates-event-with-approval-expired-type.sdp.md new file mode 100644 index 00000000..b085d352 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-054-creates-event-with-approval-expired-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.creates-event-with-approval-expired-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Creates event with ApprovalExpired type + +## Intent + +- outcome: Executable scenario "Creates event with ApprovalExpired type" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-055-includes-all-required-fields-for-approval-expired.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-055-includes-all-required-fields-for-approval-expired.sdp.md new file mode 100644 index 00000000..0a2d6a7f --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-055-includes-all-required-fields-for-approval-expired.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.includes-all-required-fields-for-approval-expired +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Includes all required fields for approval expired + +## Intent + +- outcome: Executable scenario "Includes all required fields for approval expired" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-056-creates-event-with-specified-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-056-creates-event-with-specified-type.sdp.md new file mode 100644 index 00000000..152de3f0 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-056-creates-event-with-specified-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.creates-event-with-specified-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Creates event with specified type + +## Intent + +- outcome: Executable scenario "Creates event with specified type" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-057-includes-all-required-fields-for-generic-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-057-includes-all-required-fields-for-generic-event.sdp.md new file mode 100644 index 00000000..e4517841 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-057-includes-all-required-fields-for-generic-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.includes-all-required-fields-for-generic-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Includes all required fields for generic event + +## Intent + +- outcome: Executable scenario "Includes all required fields for generic event" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-058-defaults-payload-to-empty-object-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-058-defaults-payload-to-empty-object-when-not-provided.sdp.md new file mode 100644 index 00000000..5c9de5c3 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-058-defaults-payload-to-empty-object-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.defaults-payload-to-empty-object-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Defaults payload to empty object when not provided + +## Intent + +- outcome: Executable scenario "Defaults payload to empty object when not provided" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-059-works-with-ds-4-command-routing-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-059-works-with-ds-4-command-routing-types.sdp.md new file mode 100644 index 00000000..e7a13ead --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-059-works-with-ds-4-command-routing-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.works-with-ds-4-command-routing-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Works with DS-4 command routing types + +## Intent + +- outcome: Executable scenario "Works with DS-4 command routing types" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-060-works-with-ds-5-lifecycle-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-060-works-with-ds-5-lifecycle-types.sdp.md new file mode 100644 index 00000000..adc44cb4 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-060-works-with-ds-5-lifecycle-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.works-with-ds-5-lifecycle-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Works with DS-5 lifecycle types + +## Intent + +- outcome: Executable scenario "Works with DS-5 lifecycle types" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-061-returns-true-for-pattern-detected-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-061-returns-true-for-pattern-detected-event.sdp.md new file mode 100644 index 00000000..c9c7bd3a --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-061-returns-true-for-pattern-detected-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.returns-true-for-pattern-detected-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Returns true for PatternDetected event + +## Intent + +- outcome: Executable scenario "Returns true for PatternDetected event" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-062-returns-false-for-approval-granted-event-via-is-pattern-detected.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-062-returns-false-for-approval-granted-event-via-is-pattern-detected.sdp.md new file mode 100644 index 00000000..6b50c704 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-062-returns-false-for-approval-granted-event-via-is-pattern-detected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.returns-false-for-approval-granted-event-via-is-pattern-detected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Returns false for ApprovalGranted event via isPatternDetected + +## Intent + +- outcome: Executable scenario "Returns false for ApprovalGranted event via isPatternDetected" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-063-returns-false-for-approval-rejected-event-via-is-pattern-detected.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-063-returns-false-for-approval-rejected-event-via-is-pattern-detected.sdp.md new file mode 100644 index 00000000..8a6a8d34 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-063-returns-false-for-approval-rejected-event-via-is-pattern-detected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.returns-false-for-approval-rejected-event-via-is-pattern-detected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Returns false for ApprovalRejected event via isPatternDetected + +## Intent + +- outcome: Executable scenario "Returns false for ApprovalRejected event via isPatternDetected" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-064-returns-true-for-approval-granted-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-064-returns-true-for-approval-granted-event.sdp.md new file mode 100644 index 00000000..b2993578 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-064-returns-true-for-approval-granted-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.returns-true-for-approval-granted-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Returns true for ApprovalGranted event + +## Intent + +- outcome: Executable scenario "Returns true for ApprovalGranted event" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-065-returns-false-for-pattern-detected-event-via-is-approval-granted.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-065-returns-false-for-pattern-detected-event-via-is-approval-granted.sdp.md new file mode 100644 index 00000000..f69c4440 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-065-returns-false-for-pattern-detected-event-via-is-approval-granted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.returns-false-for-pattern-detected-event-via-is-approval-granted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Returns false for PatternDetected event via isApprovalGranted + +## Intent + +- outcome: Executable scenario "Returns false for PatternDetected event via isApprovalGranted" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-066-returns-false-for-approval-rejected-event-via-is-approval-granted.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-066-returns-false-for-approval-rejected-event-via-is-approval-granted.sdp.md new file mode 100644 index 00000000..45d3e686 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-066-returns-false-for-approval-rejected-event-via-is-approval-granted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.returns-false-for-approval-rejected-event-via-is-approval-granted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Returns false for ApprovalRejected event via isApprovalGranted + +## Intent + +- outcome: Executable scenario "Returns false for ApprovalRejected event via isApprovalGranted" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-067-returns-true-for-approval-rejected-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-067-returns-true-for-approval-rejected-event.sdp.md new file mode 100644 index 00000000..eca8b848 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-067-returns-true-for-approval-rejected-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.returns-true-for-approval-rejected-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Returns true for ApprovalRejected event + +## Intent + +- outcome: Executable scenario "Returns true for ApprovalRejected event" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-068-returns-false-for-approval-granted-event-via-is-approval-rejected.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-068-returns-false-for-approval-granted-event-via-is-approval-rejected.sdp.md new file mode 100644 index 00000000..2af0f782 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-068-returns-false-for-approval-granted-event-via-is-approval-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.returns-false-for-approval-granted-event-via-is-approval-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Returns false for ApprovalGranted event via isApprovalRejected + +## Intent + +- outcome: Executable scenario "Returns false for ApprovalGranted event via isApprovalRejected" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-069-returns-false-for-pattern-detected-event-via-is-approval-rejected.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-069-returns-false-for-pattern-detected-event-via-is-approval-rejected.sdp.md new file mode 100644 index 00000000..76b87b70 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-069-returns-false-for-pattern-detected-event-via-is-approval-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.returns-false-for-pattern-detected-event-via-is-approval-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Returns false for PatternDetected event via isApprovalRejected + +## Intent + +- outcome: Executable scenario "Returns false for PatternDetected event via isApprovalRejected" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-070-returns-true-for-valid-pattern-detected-audit-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-070-returns-true-for-valid-pattern-detected-audit-event.sdp.md new file mode 100644 index 00000000..58443ae9 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-070-returns-true-for-valid-pattern-detected-audit-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.returns-true-for-valid-pattern-detected-audit-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Returns true for valid pattern detected audit event + +## Intent + +- outcome: Executable scenario "Returns true for valid pattern detected audit event" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-071-returns-true-for-valid-approval-granted-audit-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-071-returns-true-for-valid-approval-granted-audit-event.sdp.md new file mode 100644 index 00000000..18f9b9ac --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-071-returns-true-for-valid-approval-granted-audit-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.returns-true-for-valid-approval-granted-audit-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Returns true for valid approval granted audit event + +## Intent + +- outcome: Executable scenario "Returns true for valid approval granted audit event" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-072-returns-true-for-valid-approval-rejected-audit-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-072-returns-true-for-valid-approval-rejected-audit-event.sdp.md new file mode 100644 index 00000000..179f4c7c --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-072-returns-true-for-valid-approval-rejected-audit-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.returns-true-for-valid-approval-rejected-audit-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Returns true for valid approval rejected audit event + +## Intent + +- outcome: Executable scenario "Returns true for valid approval rejected audit event" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-073-returns-true-for-valid-approval-expired-audit-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-073-returns-true-for-valid-approval-expired-audit-event.sdp.md new file mode 100644 index 00000000..209c7c88 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-073-returns-true-for-valid-approval-expired-audit-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.returns-true-for-valid-approval-expired-audit-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Returns true for valid approval expired audit event + +## Intent + +- outcome: Executable scenario "Returns true for valid approval expired audit event" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-074-returns-false-for-null.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-074-returns-false-for-null.sdp.md new file mode 100644 index 00000000..6f863d4e --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-074-returns-false-for-null.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.returns-false-for-null +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Returns false for null + +## Intent + +- outcome: Executable scenario "Returns false for null" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-075-returns-false-for-undefined.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-075-returns-false-for-undefined.sdp.md new file mode 100644 index 00000000..6d368898 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-075-returns-false-for-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.returns-false-for-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Returns false for undefined + +## Intent + +- outcome: Executable scenario "Returns false for undefined" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-076-returns-false-for-empty-object.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-076-returns-false-for-empty-object.sdp.md new file mode 100644 index 00000000..06261734 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-076-returns-false-for-empty-object.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.returns-false-for-empty-object +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Returns false for empty object + +## Intent + +- outcome: Executable scenario "Returns false for empty object" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-077-returns-false-for-invalid-event-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-077-returns-false-for-invalid-event-type.sdp.md new file mode 100644 index 00000000..a17746db --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-077-returns-false-for-invalid-event-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.returns-false-for-invalid-event-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Returns false for invalid event type + +## Intent + +- outcome: Executable scenario "Returns false for invalid event type" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-078-returns-false-for-missing-required-fields.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-078-returns-false-for-missing-required-fields.sdp.md new file mode 100644 index 00000000..d49cc898 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-078-returns-false-for-missing-required-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.returns-false-for-missing-required-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Returns false for missing required fields + +## Intent + +- outcome: Executable scenario "Returns false for missing required fields" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-079-creates-complete-audit-trail-for-approved-action.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-079-creates-complete-audit-trail-for-approved-action.sdp.md new file mode 100644 index 00000000..b54a1190 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-079-creates-complete-audit-trail-for-approved-action.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.creates-complete-audit-trail-for-approved-action +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Creates complete audit trail for approved action + +## Intent + +- outcome: Executable scenario "Creates complete audit trail for approved action" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-080-creates-complete-audit-trail-for-rejected-action.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-080-creates-complete-audit-trail-for-rejected-action.sdp.md new file mode 100644 index 00000000..098297e2 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-080-creates-complete-audit-trail-for-rejected-action.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.creates-complete-audit-trail-for-rejected-action +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Creates complete audit trail for rejected action + +## Intent + +- outcome: Executable scenario "Creates complete audit trail for rejected action" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/audit.examples/s-081-creates-audit-trail-for-expired-action.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-081-creates-audit-trail-for-expired-action.sdp.md new file mode 100644 index 00000000..3ad01599 --- /dev/null +++ b/specs/behavior/platform-core/agent/audit.examples/s-081-creates-audit-trail-for-expired-action.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.audit.creates-audit-trail-for-expired-action +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.audit +--- +# Creates audit trail for expired action + +## Intent + +- outcome: Executable scenario "Creates audit trail for expired action" from packages/platform-core/tests/features/behavior/agent/audit.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-001-returns-true-for-error-recovery-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-001-returns-true-for-error-recovery-status.sdp.md new file mode 100644 index 00000000..83d8e728 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-001-returns-true-for-error-recovery-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.returns-true-for-error-recovery-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Returns true for error_recovery status + +## Intent + +- outcome: Executable scenario "Returns true for error_recovery status" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-002-returns-false-for-active-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-002-returns-false-for-active-status.sdp.md new file mode 100644 index 00000000..8d84e726 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-002-returns-false-for-active-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.returns-false-for-active-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Returns false for active status + +## Intent + +- outcome: Executable scenario "Returns false for active status" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-003-returns-false-for-paused-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-003-returns-false-for-paused-status.sdp.md new file mode 100644 index 00000000..82a55c70 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-003-returns-false-for-paused-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.returns-false-for-paused-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Returns false for paused status + +## Intent + +- outcome: Executable scenario "Returns false for paused status" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-004-returns-false-for-stopped-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-004-returns-false-for-stopped-status.sdp.md new file mode 100644 index 00000000..f0549e1b --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-004-returns-false-for-stopped-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.returns-false-for-stopped-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Returns false for stopped status + +## Intent + +- outcome: Executable scenario "Returns false for stopped status" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-005-returns-base-config-values-when-overrides-are-undefined.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-005-returns-base-config-values-when-overrides-are-undefined.sdp.md new file mode 100644 index 00000000..590a4c9b --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-005-returns-base-config-values-when-overrides-are-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.returns-base-config-values-when-overrides-are-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Returns base config values when overrides are undefined + +## Intent + +- outcome: Executable scenario "Returns base config values when overrides are undefined" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-006-passes-through-base-rate-limits-when-no-overrides.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-006-passes-through-base-rate-limits-when-no-overrides.sdp.md new file mode 100644 index 00000000..96d4c318 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-006-passes-through-base-rate-limits-when-no-overrides.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.passes-through-base-rate-limits-when-no-overrides +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Passes through base rateLimits when no overrides + +## Intent + +- outcome: Executable scenario "Passes through base rateLimits when no overrides" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-007-omits-rate-limits-when-base-has-none-and-no-overrides.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-007-omits-rate-limits-when-base-has-none-and-no-overrides.sdp.md new file mode 100644 index 00000000..72390d57 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-007-omits-rate-limits-when-base-has-none-and-no-overrides.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.omits-rate-limits-when-base-has-none-and-no-overrides +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Omits rateLimits when base has none and no overrides + +## Intent + +- outcome: Executable scenario "Omits rateLimits when base has none and no overrides" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-008-overrides-confidence-threshold-while-preserving-pattern-window-duration.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-008-overrides-confidence-threshold-while-preserving-pattern-window-duration.sdp.md new file mode 100644 index 00000000..ba7584eb --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-008-overrides-confidence-threshold-while-preserving-pattern-window-duration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.overrides-confidence-threshold-while-preserving-pattern-window-duration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Overrides confidenceThreshold while preserving patternWindowDuration + +## Intent + +- outcome: Executable scenario "Overrides confidenceThreshold while preserving patternWindowDuration" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-009-overrides-pattern-window-duration-while-preserving-confidence-threshold.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-009-overrides-pattern-window-duration-while-preserving-confidence-threshold.sdp.md new file mode 100644 index 00000000..983cc912 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-009-overrides-pattern-window-duration-while-preserving-confidence-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.overrides-pattern-window-duration-while-preserving-confidence-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Overrides patternWindowDuration while preserving confidenceThreshold + +## Intent + +- outcome: Executable scenario "Overrides patternWindowDuration while preserving confidenceThreshold" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-010-overrides-rate-limits-max-requests-per-minute-while-preserving-base-cost-b.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-010-overrides-rate-limits-max-requests-per-minute-while-preserving-base-cost-b.sdp.md new file mode 100644 index 00000000..2ef7b9ce --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-010-overrides-rate-limits-max-requests-per-minute-while-preserving-base-cost-b.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.overrides-rate-limits-max-requests-per-minute-while-preserving-base-cost-budget +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Overrides rateLimits.maxRequestsPerMinute while preserving base costBudget + +## Intent + +- outcome: Executable scenario "Overrides rateLimits.maxRequestsPerMinute while preserving base costBudget" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-011-deep-merges-cost-budget-daily-while-preserving-cost-budget-alert-threshold.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-011-deep-merges-cost-budget-daily-while-preserving-cost-budget-alert-threshold.sdp.md new file mode 100644 index 00000000..bce0489a --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-011-deep-merges-cost-budget-daily-while-preserving-cost-budget-alert-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.deep-merges-cost-budget-daily-while-preserving-cost-budget-alert-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Deep-merges costBudget.daily while preserving costBudget.alertThreshold + +## Intent + +- outcome: Executable scenario "Deep-merges costBudget.daily while preserving costBudget.alertThreshold" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-012-deep-merges-cost-budget-alert-threshold-while-preserving-cost-budget-daily.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-012-deep-merges-cost-budget-alert-threshold-while-preserving-cost-budget-daily.sdp.md new file mode 100644 index 00000000..a3e969dd --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-012-deep-merges-cost-budget-alert-threshold-while-preserving-cost-budget-daily.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.deep-merges-cost-budget-alert-threshold-while-preserving-cost-budget-daily +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Deep-merges costBudget.alertThreshold while preserving costBudget.daily + +## Intent + +- outcome: Executable scenario "Deep-merges costBudget.alertThreshold while preserving costBudget.daily" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-013-fully-overrides-all-config-values.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-013-fully-overrides-all-config-values.sdp.md new file mode 100644 index 00000000..2babde9a --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-013-fully-overrides-all-config-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.fully-overrides-all-config-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Fully overrides all config values + +## Intent + +- outcome: Executable scenario "Fully overrides all config values" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-014-adds-rate-limits-via-overrides-when-base-has-none.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-014-adds-rate-limits-via-overrides-when-base-has-none.sdp.md new file mode 100644 index 00000000..8a83d630 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-014-adds-rate-limits-via-overrides-when-base-has-none.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.adds-rate-limits-via-overrides-when-base-has-none +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Adds rateLimits via overrides when base has none + +## Intent + +- outcome: Executable scenario "Adds rateLimits via overrides when base has none" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-015-empty-overrides-object-returns-base-config-values.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-015-empty-overrides-object-returns-base-config-values.sdp.md new file mode 100644 index 00000000..ce8c297a --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-015-empty-overrides-object-returns-base-config-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.empty-overrides-object-returns-base-config-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Empty overrides object returns base config values + +## Intent + +- outcome: Executable scenario "Empty overrides object returns base config values" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-016-applies-config-overrides-to-a-checkpoint-without-existing-overrides.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-016-applies-config-overrides-to-a-checkpoint-without-existing-overrides.sdp.md new file mode 100644 index 00000000..bb5a4392 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-016-applies-config-overrides-to-a-checkpoint-without-existing-overrides.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.applies-config-overrides-to-a-checkpoint-without-existing-overrides +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Applies configOverrides to a checkpoint without existing overrides + +## Intent + +- outcome: Executable scenario "Applies configOverrides to a checkpoint without existing overrides" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-017-merges-new-config-overrides-with-existing-overrides.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-017-merges-new-config-overrides-with-existing-overrides.sdp.md new file mode 100644 index 00000000..c0a897ec --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-017-merges-new-config-overrides-with-existing-overrides.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.merges-new-config-overrides-with-existing-overrides +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Merges new configOverrides with existing overrides + +## Intent + +- outcome: Executable scenario "Merges new configOverrides with existing overrides" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-018-update-overrides-take-precedence-over-existing.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-018-update-overrides-take-precedence-over-existing.sdp.md new file mode 100644 index 00000000..c540df9a --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-018-update-overrides-take-precedence-over-existing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.update-overrides-take-precedence-over-existing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Update overrides take precedence over existing + +## Intent + +- outcome: Executable scenario "Update overrides take precedence over existing" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-019-preserves-existing-config-overrides-when-update-has-no-overrides.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-019-preserves-existing-config-overrides-when-update-has-no-overrides.sdp.md new file mode 100644 index 00000000..e3893d95 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-019-preserves-existing-config-overrides-when-update-has-no-overrides.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.preserves-existing-config-overrides-when-update-has-no-overrides +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Preserves existing configOverrides when update has no overrides + +## Intent + +- outcome: Executable scenario "Preserves existing configOverrides when update has no overrides" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-020-deep-merges-rate-limits-cost-budget-in-checkpoint-overrides.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-020-deep-merges-rate-limits-cost-budget-in-checkpoint-overrides.sdp.md new file mode 100644 index 00000000..3c21e511 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-020-deep-merges-rate-limits-cost-budget-in-checkpoint-overrides.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.deep-merges-rate-limits-cost-budget-in-checkpoint-overrides +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Deep-merges rateLimits.costBudget in checkpoint overrides + +## Intent + +- outcome: Executable scenario "Deep-merges rateLimits.costBudget in checkpoint overrides" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-021-updates-updated-at-timestamp.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-021-updates-updated-at-timestamp.sdp.md new file mode 100644 index 00000000..89c00ded --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-021-updates-updated-at-timestamp.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.updates-updated-at-timestamp +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Updates updatedAt timestamp + +## Intent + +- outcome: Executable scenario "Updates updatedAt timestamp" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-022-increments-events-processed-count.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-022-increments-events-processed-count.sdp.md new file mode 100644 index 00000000..9d6b5fc2 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-022-increments-events-processed-count.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.increments-events-processed-count +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Increments eventsProcessed count + +## Intent + +- outcome: Executable scenario "Increments eventsProcessed count" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-023-preserves-events-processed-when-no-increment-provided.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-023-preserves-events-processed-when-no-increment-provided.sdp.md new file mode 100644 index 00000000..835e6227 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-023-preserves-events-processed-when-no-increment-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.preserves-events-processed-when-no-increment-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Preserves eventsProcessed when no increment provided + +## Intent + +- outcome: Executable scenario "Preserves eventsProcessed when no increment provided" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-024-does-not-add-config-overrides-key-when-neither-existing-nor-update-have-th.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-024-does-not-add-config-overrides-key-when-neither-existing-nor-update-have-th.sdp.md new file mode 100644 index 00000000..06781947 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-024-does-not-add-config-overrides-key-when-neither-existing-nor-update-have-th.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.does-not-add-config-overrides-key-when-neither-existing-nor-update-have-them +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Does not add configOverrides key when neither existing nor update have them + +## Intent + +- outcome: Executable scenario "Does not add configOverrides key when neither existing nor update have them" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-025-creates-checkpoint-with-sentinel-last-processed-position-of-1.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-025-creates-checkpoint-with-sentinel-last-processed-position-of-1.sdp.md new file mode 100644 index 00000000..9820b5f0 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-025-creates-checkpoint-with-sentinel-last-processed-position-of-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.creates-checkpoint-with-sentinel-last-processed-position-of-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Creates checkpoint with sentinel lastProcessedPosition of -1 + +## Intent + +- outcome: Executable scenario "Creates checkpoint with sentinel lastProcessedPosition of -1" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-026-creates-checkpoint-with-active-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-026-creates-checkpoint-with-active-status.sdp.md new file mode 100644 index 00000000..dd048a29 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-026-creates-checkpoint-with-active-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.creates-checkpoint-with-active-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Creates checkpoint with active status + +## Intent + +- outcome: Executable scenario "Creates checkpoint with active status" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-027-creates-checkpoint-with-zero-events-processed.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-027-creates-checkpoint-with-zero-events-processed.sdp.md new file mode 100644 index 00000000..b0c15828 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-027-creates-checkpoint-with-zero-events-processed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.creates-checkpoint-with-zero-events-processed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Creates checkpoint with zero events processed + +## Intent + +- outcome: Executable scenario "Creates checkpoint with zero events processed" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-028-creates-checkpoint-with-empty-last-event-id.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-028-creates-checkpoint-with-empty-last-event-id.sdp.md new file mode 100644 index 00000000..b6c4b4f8 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-028-creates-checkpoint-with-empty-last-event-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.creates-checkpoint-with-empty-last-event-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Creates checkpoint with empty lastEventId + +## Intent + +- outcome: Executable scenario "Creates checkpoint with empty lastEventId" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-029-sets-updated-at-to-current-time.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-029-sets-updated-at-to-current-time.sdp.md new file mode 100644 index 00000000..45e50a40 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-029-sets-updated-at-to-current-time.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.sets-updated-at-to-current-time +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Sets updatedAt to current time + +## Intent + +- outcome: Executable scenario "Sets updatedAt to current time" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-030-preserves-agent-id-and-subscription-id.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-030-preserves-agent-id-and-subscription-id.sdp.md new file mode 100644 index 00000000..854c2c82 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-030-preserves-agent-id-and-subscription-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.preserves-agent-id-and-subscription-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Preserves agentId and subscriptionId + +## Intent + +- outcome: Executable scenario "Preserves agentId and subscriptionId" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-031-does-not-include-config-overrides.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-031-does-not-include-config-overrides.sdp.md new file mode 100644 index 00000000..39665160 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-031-does-not-include-config-overrides.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint-extension.does-not-include-config-overrides +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint-extension +--- +# Does not include configOverrides + +## Intent + +- outcome: Executable scenario "Does not include configOverrides" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-001-contains-all-four-statuses.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-001-contains-all-four-statuses.sdp.md new file mode 100644 index 00000000..6cb71b72 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-001-contains-all-four-statuses.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.contains-all-four-statuses +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Contains all four statuses + +## Intent + +- outcome: Executable scenario "Contains all four statuses" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-002-is-a-readonly-tuple-with-4-elements.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-002-is-a-readonly-tuple-with-4-elements.sdp.md new file mode 100644 index 00000000..a6023bfe --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-002-is-a-readonly-tuple-with-4-elements.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.is-a-readonly-tuple-with-4-elements +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Is a readonly tuple with 4 elements + +## Intent + +- outcome: Executable scenario "Is a readonly tuple with 4 elements" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-003-accepts-all-valid-statuses.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-003-accepts-all-valid-statuses.sdp.md new file mode 100644 index 00000000..9b4b3302 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-003-accepts-all-valid-statuses.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.accepts-all-valid-statuses +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Accepts all valid statuses + +## Intent + +- outcome: Executable scenario "Accepts all valid statuses" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-004-rejects-invalid-statuses.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-004-rejects-invalid-statuses.sdp.md new file mode 100644 index 00000000..e15cef2f --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-004-rejects-invalid-statuses.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.rejects-invalid-statuses +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Rejects invalid statuses + +## Intent + +- outcome: Executable scenario "Rejects invalid statuses" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-005-accepts-a-valid-checkpoint-object.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-005-accepts-a-valid-checkpoint-object.sdp.md new file mode 100644 index 00000000..d157ffc9 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-005-accepts-a-valid-checkpoint-object.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.accepts-a-valid-checkpoint-object +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Accepts a valid checkpoint object + +## Intent + +- outcome: Executable scenario "Accepts a valid checkpoint object" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-006-accepts-checkpoint-with-sentinel-position-1.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-006-accepts-checkpoint-with-sentinel-position-1.sdp.md new file mode 100644 index 00000000..d42f9b51 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-006-accepts-checkpoint-with-sentinel-position-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.accepts-checkpoint-with-sentinel-position-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Accepts checkpoint with sentinel position -1 + +## Intent + +- outcome: Executable scenario "Accepts checkpoint with sentinel position -1" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-007-rejects-checkpoint-with-position-below-1.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-007-rejects-checkpoint-with-position-below-1.sdp.md new file mode 100644 index 00000000..9a5d9764 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-007-rejects-checkpoint-with-position-below-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.rejects-checkpoint-with-position-below-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Rejects checkpoint with position below -1 + +## Intent + +- outcome: Executable scenario "Rejects checkpoint with position below -1" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-008-rejects-checkpoint-with-negative-events-processed.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-008-rejects-checkpoint-with-negative-events-processed.sdp.md new file mode 100644 index 00000000..0e4ea756 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-008-rejects-checkpoint-with-negative-events-processed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.rejects-checkpoint-with-negative-events-processed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Rejects checkpoint with negative eventsProcessed + +## Intent + +- outcome: Executable scenario "Rejects checkpoint with negative eventsProcessed" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-009-rejects-checkpoint-with-empty-agent-id.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-009-rejects-checkpoint-with-empty-agent-id.sdp.md new file mode 100644 index 00000000..4b208192 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-009-rejects-checkpoint-with-empty-agent-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.rejects-checkpoint-with-empty-agent-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Rejects checkpoint with empty agentId + +## Intent + +- outcome: Executable scenario "Rejects checkpoint with empty agentId" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-010-rejects-checkpoint-with-empty-subscription-id.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-010-rejects-checkpoint-with-empty-subscription-id.sdp.md new file mode 100644 index 00000000..dd680207 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-010-rejects-checkpoint-with-empty-subscription-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.rejects-checkpoint-with-empty-subscription-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Rejects checkpoint with empty subscriptionId + +## Intent + +- outcome: Executable scenario "Rejects checkpoint with empty subscriptionId" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-011-rejects-checkpoint-with-missing-required-fields.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-011-rejects-checkpoint-with-missing-required-fields.sdp.md new file mode 100644 index 00000000..54092600 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-011-rejects-checkpoint-with-missing-required-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.rejects-checkpoint-with-missing-required-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Rejects checkpoint with missing required fields + +## Intent + +- outcome: Executable scenario "Rejects checkpoint with missing required fields" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-012-creates-checkpoint-with-correct-agent-id-and-subscription-id.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-012-creates-checkpoint-with-correct-agent-id-and-subscription-id.sdp.md new file mode 100644 index 00000000..ddd7a956 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-012-creates-checkpoint-with-correct-agent-id-and-subscription-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.creates-checkpoint-with-correct-agent-id-and-subscription-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Creates checkpoint with correct agentId and subscriptionId + +## Intent + +- outcome: Executable scenario "Creates checkpoint with correct agentId and subscriptionId" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-013-initializes-position-and-event-tracking-defaults.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-013-initializes-position-and-event-tracking-defaults.sdp.md new file mode 100644 index 00000000..6473221a --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-013-initializes-position-and-event-tracking-defaults.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.initializes-position-and-event-tracking-defaults +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Initializes position and event tracking defaults + +## Intent + +- outcome: Executable scenario "Initializes position and event tracking defaults" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-014-initializes-status-to-active.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-014-initializes-status-to-active.sdp.md new file mode 100644 index 00000000..bf9309ca --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-014-initializes-status-to-active.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.initializes-status-to-active +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Initializes status to active + +## Intent + +- outcome: Executable scenario "Initializes status to active" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-015-sets-updated-at-to-current-time.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-015-sets-updated-at-to-current-time.sdp.md new file mode 100644 index 00000000..8805706e --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-015-sets-updated-at-to-current-time.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.sets-updated-at-to-current-time +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Sets updatedAt to current time + +## Intent + +- outcome: Executable scenario "Sets updatedAt to current time" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-016-creates-a-checkpoint-that-passes-schema-validation.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-016-creates-a-checkpoint-that-passes-schema-validation.sdp.md new file mode 100644 index 00000000..0aba4c3a --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-016-creates-a-checkpoint-that-passes-schema-validation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.creates-a-checkpoint-that-passes-schema-validation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Creates a checkpoint that passes schema validation + +## Intent + +- outcome: Executable scenario "Creates a checkpoint that passes schema validation" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-017-updates-last-processed-position.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-017-updates-last-processed-position.sdp.md new file mode 100644 index 00000000..541292c2 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-017-updates-last-processed-position.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.updates-last-processed-position +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Updates lastProcessedPosition + +## Intent + +- outcome: Executable scenario "Updates lastProcessedPosition" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-018-updates-last-event-id.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-018-updates-last-event-id.sdp.md new file mode 100644 index 00000000..9220fe5b --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-018-updates-last-event-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.updates-last-event-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Updates lastEventId + +## Intent + +- outcome: Executable scenario "Updates lastEventId" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-019-updates-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-019-updates-status.sdp.md new file mode 100644 index 00000000..4e0564de --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-019-updates-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.updates-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Updates status + +## Intent + +- outcome: Executable scenario "Updates status" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-020-increments-events-processed-by-specified-amount.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-020-increments-events-processed-by-specified-amount.sdp.md new file mode 100644 index 00000000..ecf96fb8 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-020-increments-events-processed-by-specified-amount.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.increments-events-processed-by-specified-amount +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Increments eventsProcessed by specified amount + +## Intent + +- outcome: Executable scenario "Increments eventsProcessed by specified amount" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-021-increments-events-processed-by-1-for-single-event.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-021-increments-events-processed-by-1-for-single-event.sdp.md new file mode 100644 index 00000000..00d14ef5 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-021-increments-events-processed-by-1-for-single-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.increments-events-processed-by-1-for-single-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Increments eventsProcessed by 1 for single event + +## Intent + +- outcome: Executable scenario "Increments eventsProcessed by 1 for single event" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-022-does-not-increment-events-processed-when-not-specified.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-022-does-not-increment-events-processed-when-not-specified.sdp.md new file mode 100644 index 00000000..fb119e99 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-022-does-not-increment-events-processed-when-not-specified.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.does-not-increment-events-processed-when-not-specified +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Does not increment eventsProcessed when not specified + +## Intent + +- outcome: Executable scenario "Does not increment eventsProcessed when not specified" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-023-preserves-unchanged-fields.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-023-preserves-unchanged-fields.sdp.md new file mode 100644 index 00000000..d793f937 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-023-preserves-unchanged-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.preserves-unchanged-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Preserves unchanged fields + +## Intent + +- outcome: Executable scenario "Preserves unchanged fields" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-024-updates-updated-at-to-current-time.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-024-updates-updated-at-to-current-time.sdp.md new file mode 100644 index 00000000..5c0d6a83 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-024-updates-updated-at-to-current-time.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.updates-updated-at-to-current-time +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Updates updatedAt to current time + +## Intent + +- outcome: Executable scenario "Updates updatedAt to current time" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-025-applies-multiple-updates-at-once.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-025-applies-multiple-updates-at-once.sdp.md new file mode 100644 index 00000000..5a694790 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-025-applies-multiple-updates-at-once.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.applies-multiple-updates-at-once +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Applies multiple updates at once + +## Intent + +- outcome: Executable scenario "Applies multiple updates at once" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-026-handles-empty-update-by-only-updating-timestamp.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-026-handles-empty-update-by-only-updating-timestamp.sdp.md new file mode 100644 index 00000000..00461bdd --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-026-handles-empty-update-by-only-updating-timestamp.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.handles-empty-update-by-only-updating-timestamp +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Handles empty update by only updating timestamp + +## Intent + +- outcome: Executable scenario "Handles empty update by only updating timestamp" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-027-returns-true-when-event-position-is-greater-than-checkpoint.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-027-returns-true-when-event-position-is-greater-than-checkpoint.sdp.md new file mode 100644 index 00000000..e53c25ab --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-027-returns-true-when-event-position-is-greater-than-checkpoint.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.returns-true-when-event-position-is-greater-than-checkpoint +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Returns true when event position is greater than checkpoint + +## Intent + +- outcome: Executable scenario "Returns true when event position is greater than checkpoint" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-028-returns-false-for-duplicate-event-at-same-position.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-028-returns-false-for-duplicate-event-at-same-position.sdp.md new file mode 100644 index 00000000..96a993e0 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-028-returns-false-for-duplicate-event-at-same-position.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.returns-false-for-duplicate-event-at-same-position +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Returns false for duplicate event at same position + +## Intent + +- outcome: Executable scenario "Returns false for duplicate event at same position" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-029-returns-false-for-already-processed-event.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-029-returns-false-for-already-processed-event.sdp.md new file mode 100644 index 00000000..1c4ea60a --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-029-returns-false-for-already-processed-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.returns-false-for-already-processed-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Returns false for already-processed event + +## Intent + +- outcome: Executable scenario "Returns false for already-processed event" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-030-returns-true-for-position-0-against-sentinel-1-for-a-new-agent.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-030-returns-true-for-position-0-against-sentinel-1-for-a-new-agent.sdp.md new file mode 100644 index 00000000..53a28d16 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-030-returns-true-for-position-0-against-sentinel-1-for-a-new-agent.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.returns-true-for-position-0-against-sentinel-1-for-a-new-agent +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Returns true for position 0 against sentinel -1 for a new agent + +## Intent + +- outcome: Executable scenario "Returns true for position 0 against sentinel -1 for a new agent" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-031-returns-true-for-position-1-against-sentinel-1.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-031-returns-true-for-position-1-against-sentinel-1.sdp.md new file mode 100644 index 00000000..09fc9f00 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-031-returns-true-for-position-1-against-sentinel-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.returns-true-for-position-1-against-sentinel-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Returns true for position 1 against sentinel -1 + +## Intent + +- outcome: Executable scenario "Returns true for position 1 against sentinel -1" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-032-returns-true-for-any-positive-position-against-sentinel-1.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-032-returns-true-for-any-positive-position-against-sentinel-1.sdp.md new file mode 100644 index 00000000..29b34be4 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-032-returns-true-for-any-positive-position-against-sentinel-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.returns-true-for-any-positive-position-against-sentinel-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Returns true for any positive position against sentinel -1 + +## Intent + +- outcome: Executable scenario "Returns true for any positive position against sentinel -1" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-033-returns-true-for-position-1-against-checkpoint-0.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-033-returns-true-for-position-1-against-checkpoint-0.sdp.md new file mode 100644 index 00000000..02c77d15 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-033-returns-true-for-position-1-against-checkpoint-0.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.returns-true-for-position-1-against-checkpoint-0 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Returns true for position 1 against checkpoint 0 + +## Intent + +- outcome: Executable scenario "Returns true for position 1 against checkpoint 0" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-034-returns-false-for-position-0-against-checkpoint-0.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-034-returns-false-for-position-0-against-checkpoint-0.sdp.md new file mode 100644 index 00000000..7d966734 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-034-returns-false-for-position-0-against-checkpoint-0.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.returns-false-for-position-0-against-checkpoint-0 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Returns false for position 0 against checkpoint 0 + +## Intent + +- outcome: Executable scenario "Returns false for position 0 against checkpoint 0" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-035-handles-large-position-values.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-035-handles-large-position-values.sdp.md new file mode 100644 index 00000000..15746da8 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-035-handles-large-position-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.handles-large-position-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Handles large position values + +## Intent + +- outcome: Executable scenario "Handles large position values" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-036-processes-sequential-events-correctly.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-036-processes-sequential-events-correctly.sdp.md new file mode 100644 index 00000000..06d283b8 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-036-processes-sequential-events-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.processes-sequential-events-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Processes sequential events correctly + +## Intent + +- outcome: Executable scenario "Processes sequential events correctly" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-037-handles-gaps-in-event-positions.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-037-handles-gaps-in-event-positions.sdp.md new file mode 100644 index 00000000..90c617c3 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-037-handles-gaps-in-event-positions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.handles-gaps-in-event-positions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Handles gaps in event positions + +## Intent + +- outcome: Executable scenario "Handles gaps in event positions" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-038-is-agent-active-returns-true-only-for-active-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-038-is-agent-active-returns-true-only-for-active-status.sdp.md new file mode 100644 index 00000000..b1c51a0a --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-038-is-agent-active-returns-true-only-for-active-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.is-agent-active-returns-true-only-for-active-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# isAgentActive returns true only for active status + +## Intent + +- outcome: Executable scenario "isAgentActive returns true only for active status" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-039-is-agent-paused-returns-true-only-for-paused-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-039-is-agent-paused-returns-true-only-for-paused-status.sdp.md new file mode 100644 index 00000000..d26c0b21 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-039-is-agent-paused-returns-true-only-for-paused-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.is-agent-paused-returns-true-only-for-paused-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# isAgentPaused returns true only for paused status + +## Intent + +- outcome: Executable scenario "isAgentPaused returns true only for paused status" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-040-is-agent-stopped-returns-true-only-for-stopped-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-040-is-agent-stopped-returns-true-only-for-stopped-status.sdp.md new file mode 100644 index 00000000..a7b842bd --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-040-is-agent-stopped-returns-true-only-for-stopped-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.is-agent-stopped-returns-true-only-for-stopped-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# isAgentStopped returns true only for stopped status + +## Intent + +- outcome: Executable scenario "isAgentStopped returns true only for stopped status" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-041-returns-true-for-a-valid-checkpoint.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-041-returns-true-for-a-valid-checkpoint.sdp.md new file mode 100644 index 00000000..5abfa594 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-041-returns-true-for-a-valid-checkpoint.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.returns-true-for-a-valid-checkpoint +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Returns true for a valid checkpoint + +## Intent + +- outcome: Executable scenario "Returns true for a valid checkpoint" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-042-returns-true-for-checkpoint-with-sentinel-position.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-042-returns-true-for-checkpoint-with-sentinel-position.sdp.md new file mode 100644 index 00000000..d47ff905 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-042-returns-true-for-checkpoint-with-sentinel-position.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.returns-true-for-checkpoint-with-sentinel-position +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Returns true for checkpoint with sentinel position + +## Intent + +- outcome: Executable scenario "Returns true for checkpoint with sentinel position" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-043-returns-false-for-null-undefined-and-empty-object.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-043-returns-false-for-null-undefined-and-empty-object.sdp.md new file mode 100644 index 00000000..6e48a22b --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-043-returns-false-for-null-undefined-and-empty-object.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.returns-false-for-null-undefined-and-empty-object +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Returns false for null, undefined, and empty object + +## Intent + +- outcome: Executable scenario "Returns false for null, undefined, and empty object" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-044-returns-false-for-non-object-values.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-044-returns-false-for-non-object-values.sdp.md new file mode 100644 index 00000000..c836d634 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-044-returns-false-for-non-object-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.returns-false-for-non-object-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Returns false for non-object values + +## Intent + +- outcome: Executable scenario "Returns false for non-object values" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-045-returns-false-for-checkpoint-with-invalid-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-045-returns-false-for-checkpoint-with-invalid-status.sdp.md new file mode 100644 index 00000000..76621f97 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-045-returns-false-for-checkpoint-with-invalid-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.returns-false-for-checkpoint-with-invalid-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Returns false for checkpoint with invalid status + +## Intent + +- outcome: Executable scenario "Returns false for checkpoint with invalid status" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-046-returns-false-for-checkpoint-with-position-below-1.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-046-returns-false-for-checkpoint-with-position-below-1.sdp.md new file mode 100644 index 00000000..751a9ca8 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-046-returns-false-for-checkpoint-with-position-below-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.returns-false-for-checkpoint-with-position-below-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Returns false for checkpoint with position below -1 + +## Intent + +- outcome: Executable scenario "Returns false for checkpoint with position below -1" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-047-returns-false-for-checkpoint-with-negative-events-processed.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-047-returns-false-for-checkpoint-with-negative-events-processed.sdp.md new file mode 100644 index 00000000..6e8a6ab4 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-047-returns-false-for-checkpoint-with-negative-events-processed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.returns-false-for-checkpoint-with-negative-events-processed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Returns false for checkpoint with negative eventsProcessed + +## Intent + +- outcome: Executable scenario "Returns false for checkpoint with negative eventsProcessed" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-048-new-agent-processes-first-events.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-048-new-agent-processes-first-events.sdp.md new file mode 100644 index 00000000..d9c67df2 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-048-new-agent-processes-first-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.new-agent-processes-first-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# New agent processes first events + +## Intent + +- outcome: Executable scenario "New agent processes first events" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-049-agent-pause-and-resume-preserves-position.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-049-agent-pause-and-resume-preserves-position.sdp.md new file mode 100644 index 00000000..84d9cd9d --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-049-agent-pause-and-resume-preserves-position.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.agent-pause-and-resume-preserves-position +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Agent pause and resume preserves position + +## Intent + +- outcome: Executable scenario "Agent pause and resume preserves position" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-050-agent-restart-recovery-skips-already-processed-events.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-050-agent-restart-recovery-skips-already-processed-events.sdp.md new file mode 100644 index 00000000..6931a338 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-050-agent-restart-recovery-skips-already-processed-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.agent-restart-recovery-skips-already-processed-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Agent restart recovery skips already-processed events + +## Intent + +- outcome: Executable scenario "Agent restart recovery skips already-processed events" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-051-duplicate-event-delivery-is-idempotent.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-051-duplicate-event-delivery-is-idempotent.sdp.md new file mode 100644 index 00000000..2aac2528 --- /dev/null +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-051-duplicate-event-delivery-is-idempotent.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.checkpoint.duplicate-event-delivery-is-idempotent +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.checkpoint +--- +# Duplicate event delivery is idempotent + +## Intent + +- outcome: Executable scenario "Duplicate event delivery is idempotent" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-001-routes-command-through-registry-orchestrator-records-audit-and-updates-sta.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-001-routes-command-through-registry-orchestrator-records-audit-and-updates-sta.sdp.md new file mode 100644 index 00000000..fbc74ae8 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-001-routes-command-through-registry-orchestrator-records-audit-and-updates-sta.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-bridge.routes-command-through-registry-orchestrator-records-audit-and-updates-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-bridge +--- +# Routes command through registry, orchestrator, records audit, and updates status + +## Intent + +- outcome: Executable scenario "Routes command through registry, orchestrator, records audit, and updates status" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-002-records-agent-command-routing-failed-audit-and-sets-status-to-failed-for-u.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-002-records-agent-command-routing-failed-audit-and-sets-status-to-failed-for-u.sdp.md new file mode 100644 index 00000000..67ab9940 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-002-records-agent-command-routing-failed-audit-and-sets-status-to-failed-for-u.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-bridge.records-agent-command-routing-failed-audit-and-sets-status-to-failed-for-unknown +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-bridge +--- +# Records AgentCommandRoutingFailed audit and sets status to failed for unknown route + +## Intent + +- outcome: Executable scenario "Records AgentCommandRoutingFailed audit and sets status to failed for unknown route" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-003-records-command-not-registered-error-when-registry-does-not-contain-the-co.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-003-records-command-not-registered-error-when-registry-does-not-contain-the-co.sdp.md new file mode 100644 index 00000000..4da25d61 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-003-records-command-not-registered-error-when-registry-does-not-contain-the-co.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-bridge.records-command-not-registered-error-when-registry-does-not-contain-the-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-bridge +--- +# Records COMMAND_NOT_REGISTERED error when registry does not contain the command + +## Intent + +- outcome: Executable scenario "Records COMMAND_NOT_REGISTERED error when registry does not contain the command" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-004-records-invalid-transform-error-when-to-orchestrator-args-throws.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-004-records-invalid-transform-error-when-to-orchestrator-args-throws.sdp.md new file mode 100644 index 00000000..652cfceb --- /dev/null +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-004-records-invalid-transform-error-when-to-orchestrator-args-throws.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-bridge.records-invalid-transform-error-when-to-orchestrator-args-throws +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-bridge +--- +# Records INVALID_TRANSFORM error when toOrchestratorArgs throws + +## Intent + +- outcome: Executable scenario "Records INVALID_TRANSFORM error when toOrchestratorArgs throws" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-005-records-agent-command-routing-failed-audit-and-sets-status-to-failed-on-or.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-005-records-agent-command-routing-failed-audit-and-sets-status-to-failed-on-or.sdp.md new file mode 100644 index 00000000..a4042155 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-005-records-agent-command-routing-failed-audit-and-sets-status-to-failed-on-or.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-bridge.records-agent-command-routing-failed-audit-and-sets-status-to-failed-on-orchestr +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-bridge +--- +# Records AgentCommandRoutingFailed audit and sets status to failed on orchestrator error + +## Intent + +- outcome: Executable scenario "Records AgentCommandRoutingFailed audit and sets status to failed on orchestrator error" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-006-does-not-throw-when-audit-recording-fails-on-success-path.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-006-does-not-throw-when-audit-recording-fails-on-success-path.sdp.md new file mode 100644 index 00000000..b461e255 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-006-does-not-throw-when-audit-recording-fails-on-success-path.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-bridge.does-not-throw-when-audit-recording-fails-on-success-path +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-bridge +--- +# Does not throw when audit recording fails on success path + +## Intent + +- outcome: Executable scenario "Does not throw when audit recording fails on success path" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-007-does-not-throw-when-update-status-mutation-fails-on-success-path.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-007-does-not-throw-when-update-status-mutation-fails-on-success-path.sdp.md new file mode 100644 index 00000000..51761bd2 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-007-does-not-throw-when-update-status-mutation-fails-on-success-path.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-bridge.does-not-throw-when-update-status-mutation-fails-on-success-path +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-bridge +--- +# Does not throw when updateStatus mutation fails on success path + +## Intent + +- outcome: Executable scenario "Does not throw when updateStatus mutation fails on success path" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-008-skips-status-update-without-error-when-update-status-is-undefined-on-succe.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-008-skips-status-update-without-error-when-update-status-is-undefined-on-succe.sdp.md new file mode 100644 index 00000000..dca75b05 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-008-skips-status-update-without-error-when-update-status-is-undefined-on-succe.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-bridge.skips-status-update-without-error-when-update-status-is-undefined-on-success-pat +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-bridge +--- +# Skips status update without error when updateStatus is undefined on success path + +## Intent + +- outcome: Executable scenario "Skips status update without error when updateStatus is undefined on success path" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-009-skips-status-update-on-routing-failure-when-update-status-is-undefined.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-009-skips-status-update-on-routing-failure-when-update-status-is-undefined.sdp.md new file mode 100644 index 00000000..f683a041 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-009-skips-status-update-on-routing-failure-when-update-status-is-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-bridge.skips-status-update-on-routing-failure-when-update-status-is-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-bridge +--- +# Skips status update on routing failure when updateStatus is undefined + +## Intent + +- outcome: Executable scenario "Skips status update on routing failure when updateStatus is undefined" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-010-includes-pattern-id-in-audit-event-payload-when-present-in-args.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-010-includes-pattern-id-in-audit-event-payload-when-present-in-args.sdp.md new file mode 100644 index 00000000..28335535 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-010-includes-pattern-id-in-audit-event-payload-when-present-in-args.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-bridge.includes-pattern-id-in-audit-event-payload-when-present-in-args +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-bridge +--- +# Includes patternId in audit event payload when present in args + +## Intent + +- outcome: Executable scenario "Includes patternId in audit event payload when present in args" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-011-does-not-include-pattern-id-in-audit-payload-when-absent-from-args.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-011-does-not-include-pattern-id-in-audit-payload-when-absent-from-args.sdp.md new file mode 100644 index 00000000..ca629bf5 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-011-does-not-include-pattern-id-in-audit-payload-when-absent-from-args.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-bridge.does-not-include-pattern-id-in-audit-payload-when-absent-from-args +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-bridge +--- +# Does not include patternId in audit payload when absent from args + +## Intent + +- outcome: Executable scenario "Does not include patternId in audit payload when absent from args" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-001-emit-recommendation-command.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-001-emit-recommendation-command.sdp.md new file mode 100644 index 00000000..764af019 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-001-emit-recommendation-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-emission.emit-recommendation-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-emission +--- +# Emit recommendation command + +## Intent + +- outcome: Executable scenario "Emit recommendation command" from packages/platform-core/tests/features/behavior/agent/command-emission.feature diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-002-command-includes-correlation-id.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-002-command-includes-correlation-id.sdp.md new file mode 100644 index 00000000..893d7d3f --- /dev/null +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-002-command-includes-correlation-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-emission.command-includes-correlation-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-emission +--- +# Command includes correlation ID + +## Intent + +- outcome: Executable scenario "Command includes correlation ID" from packages/platform-core/tests/features/behavior/agent/command-emission.feature diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-003-command-includes-agent-bc-identifier.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-003-command-includes-agent-bc-identifier.sdp.md new file mode 100644 index 00000000..517a6fa6 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-003-command-includes-agent-bc-identifier.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-emission.command-includes-agent-bc-identifier +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-emission +--- +# Command includes agent BC identifier + +## Intent + +- outcome: Executable scenario "Command includes agent BC identifier" from packages/platform-core/tests/features/behavior/agent/command-emission.feature diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-004-command-includes-reason.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-004-command-includes-reason.sdp.md new file mode 100644 index 00000000..47d0a808 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-004-command-includes-reason.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-emission.command-includes-reason +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-emission +--- +# Command includes reason + +## Intent + +- outcome: Executable scenario "Command includes reason" from packages/platform-core/tests/features/behavior/agent/command-emission.feature diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-005-command-includes-confidence.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-005-command-includes-confidence.sdp.md new file mode 100644 index 00000000..77f7d04f --- /dev/null +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-005-command-includes-confidence.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-emission.command-includes-confidence +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-emission +--- +# Command includes confidence + +## Intent + +- outcome: Executable scenario "Command includes confidence" from packages/platform-core/tests/features/behavior/agent/command-emission.feature diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-006-command-includes-triggering-events.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-006-command-includes-triggering-events.sdp.md new file mode 100644 index 00000000..1293ec12 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-006-command-includes-triggering-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-emission.command-includes-triggering-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-emission +--- +# Command includes triggering events + +## Intent + +- outcome: Executable scenario "Command includes triggering events" from packages/platform-core/tests/features/behavior/agent/command-emission.feature diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-007-command-includes-llm-context.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-007-command-includes-llm-context.sdp.md new file mode 100644 index 00000000..301175e7 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-007-command-includes-llm-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-emission.command-includes-llm-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-emission +--- +# Command includes LLM context + +## Intent + +- outcome: Executable scenario "Command includes LLM context" from packages/platform-core/tests/features/behavior/agent/command-emission.feature diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-008-reject-command-without-reason.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-008-reject-command-without-reason.sdp.md new file mode 100644 index 00000000..641f4fbe --- /dev/null +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-008-reject-command-without-reason.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-emission.reject-command-without-reason +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-emission +--- +# Reject command without reason + +## Intent + +- outcome: Executable scenario "Reject command without reason" from packages/platform-core/tests/features/behavior/agent/command-emission.feature diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-009-reject-command-without-confidence.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-009-reject-command-without-confidence.sdp.md new file mode 100644 index 00000000..6ce0ddf5 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-009-reject-command-without-confidence.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-emission.reject-command-without-confidence +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-emission +--- +# Reject command without confidence + +## Intent + +- outcome: Executable scenario "Reject command without confidence" from packages/platform-core/tests/features/behavior/agent/command-emission.feature diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-010-reject-confidence-outside-valid-range.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-010-reject-confidence-outside-valid-range.sdp.md new file mode 100644 index 00000000..90d87511 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-010-reject-confidence-outside-valid-range.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-emission.reject-confidence-outside-valid-range +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-emission +--- +# Reject confidence outside valid range + +## Intent + +- outcome: Executable scenario "Reject confidence outside valid range" from packages/platform-core/tests/features/behavior/agent/command-emission.feature diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-011-llm-rate-limit-is-handled-with-exponential-backoff.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-011-llm-rate-limit-is-handled-with-exponential-backoff.sdp.md new file mode 100644 index 00000000..4594e912 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-011-llm-rate-limit-is-handled-with-exponential-backoff.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-emission.llm-rate-limit-is-handled-with-exponential-backoff +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-emission +--- +# LLM rate limit is handled with exponential backoff + +## Intent + +- outcome: Executable scenario "LLM rate limit is handled with exponential backoff" from packages/platform-core/tests/features/behavior/agent/command-emission.feature diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-012-llm-timeout-falls-back-to-rule-based-emission.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-012-llm-timeout-falls-back-to-rule-based-emission.sdp.md new file mode 100644 index 00000000..bdb31640 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-012-llm-timeout-falls-back-to-rule-based-emission.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-emission.llm-timeout-falls-back-to-rule-based-emission +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-emission +--- +# LLM timeout falls back to rule-based emission + +## Intent + +- outcome: Executable scenario "LLM timeout falls back to rule-based emission" from packages/platform-core/tests/features/behavior/agent/command-emission.feature diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-013-emit-notification-command.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-013-emit-notification-command.sdp.md new file mode 100644 index 00000000..9221b595 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-013-emit-notification-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-emission.emit-notification-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-emission +--- +# Emit notification command + +## Intent + +- outcome: Executable scenario "Emit notification command" from packages/platform-core/tests/features/behavior/agent/command-emission.feature diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-014-emit-action-command.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-014-emit-action-command.sdp.md new file mode 100644 index 00000000..021ac8d7 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-014-emit-action-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-emission.emit-action-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-emission +--- +# Emit action command + +## Intent + +- outcome: Executable scenario "Emit action command" from packages/platform-core/tests/features/behavior/agent/command-emission.feature diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-015-emit-escalation-command.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-015-emit-escalation-command.sdp.md new file mode 100644 index 00000000..e739592c --- /dev/null +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-015-emit-escalation-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-emission.emit-escalation-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-emission +--- +# Emit escalation command + +## Intent + +- outcome: Executable scenario "Emit escalation command" from packages/platform-core/tests/features/behavior/agent/command-emission.feature diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-001-returns-the-route-when-command-type-exists-in-the-map.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-001-returns-the-route-when-command-type-exists-in-the-map.sdp.md new file mode 100644 index 00000000..d94b58e4 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-router.examples/s-001-returns-the-route-when-command-type-exists-in-the-map.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-router.returns-the-route-when-command-type-exists-in-the-map +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-router +--- +# Returns the route when commandType exists in the map + +## Intent + +- outcome: Executable scenario "Returns the route when commandType exists in the map" from packages/platform-core/tests/features/behavior/agent/command-router.feature diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-002-returns-undefined-when-command-type-does-not-exist-in-the-map.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-002-returns-undefined-when-command-type-does-not-exist-in-the-map.sdp.md new file mode 100644 index 00000000..1221d7ec --- /dev/null +++ b/specs/behavior/platform-core/agent/command-router.examples/s-002-returns-undefined-when-command-type-does-not-exist-in-the-map.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-router.returns-undefined-when-command-type-does-not-exist-in-the-map +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-router +--- +# Returns undefined when commandType does not exist in the map + +## Intent + +- outcome: Executable scenario "Returns undefined when commandType does not exist in the map" from packages/platform-core/tests/features/behavior/agent/command-router.feature diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-003-returns-undefined-for-empty-route-map.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-003-returns-undefined-for-empty-route-map.sdp.md new file mode 100644 index 00000000..b683c587 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-router.examples/s-003-returns-undefined-for-empty-route-map.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-router.returns-undefined-for-empty-route-map +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-router +--- +# Returns undefined for empty route map + +## Intent + +- outcome: Executable scenario "Returns undefined for empty route map" from packages/platform-core/tests/features/behavior/agent/command-router.feature diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-004-produces-success-results-for-valid-routes.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-004-produces-success-results-for-valid-routes.sdp.md new file mode 100644 index 00000000..e6a99138 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-router.examples/s-004-produces-success-results-for-valid-routes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-router.produces-success-results-for-valid-routes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-router +--- +# Produces success results for valid routes + +## Intent + +- outcome: Executable scenario "Produces success results for valid routes" from packages/platform-core/tests/features/behavior/agent/command-router.feature diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-005-returns-command-not-registered-error-for-missing-command-type.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-005-returns-command-not-registered-error-for-missing-command-type.sdp.md new file mode 100644 index 00000000..4fdad9c6 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-router.examples/s-005-returns-command-not-registered-error-for-missing-command-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-router.returns-command-not-registered-error-for-missing-command-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-router +--- +# Returns COMMAND_NOT_REGISTERED error for missing commandType + +## Intent + +- outcome: Executable scenario "Returns COMMAND_NOT_REGISTERED error for missing commandType" from packages/platform-core/tests/features/behavior/agent/command-router.feature diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-006-returns-unknown-route-error-for-missing-bounded-context.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-006-returns-unknown-route-error-for-missing-bounded-context.sdp.md new file mode 100644 index 00000000..f1d153ee --- /dev/null +++ b/specs/behavior/platform-core/agent/command-router.examples/s-006-returns-unknown-route-error-for-missing-bounded-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-router.returns-unknown-route-error-for-missing-bounded-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-router +--- +# Returns UNKNOWN_ROUTE error for missing boundedContext + +## Intent + +- outcome: Executable scenario "Returns UNKNOWN_ROUTE error for missing boundedContext" from packages/platform-core/tests/features/behavior/agent/command-router.feature diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-007-returns-invalid-transform-error-for-missing-to-orchestrator-args.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-007-returns-invalid-transform-error-for-missing-to-orchestrator-args.sdp.md new file mode 100644 index 00000000..d97343dc --- /dev/null +++ b/specs/behavior/platform-core/agent/command-router.examples/s-007-returns-invalid-transform-error-for-missing-to-orchestrator-args.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-router.returns-invalid-transform-error-for-missing-to-orchestrator-args +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-router +--- +# Returns INVALID_TRANSFORM error for missing toOrchestratorArgs + +## Intent + +- outcome: Executable scenario "Returns INVALID_TRANSFORM error for missing toOrchestratorArgs" from packages/platform-core/tests/features/behavior/agent/command-router.feature diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-008-returns-empty-array-for-empty-route-map.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-008-returns-empty-array-for-empty-route-map.sdp.md new file mode 100644 index 00000000..5ce8b77b --- /dev/null +++ b/specs/behavior/platform-core/agent/command-router.examples/s-008-returns-empty-array-for-empty-route-map.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-router.returns-empty-array-for-empty-route-map +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-router +--- +# Returns empty array for empty route map + +## Intent + +- outcome: Executable scenario "Returns empty array for empty route map" from packages/platform-core/tests/features/behavior/agent/command-router.feature diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-009-validates-mixed-valid-and-invalid-routes-independently.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-009-validates-mixed-valid-and-invalid-routes-independently.sdp.md new file mode 100644 index 00000000..0eb49048 --- /dev/null +++ b/specs/behavior/platform-core/agent/command-router.examples/s-009-validates-mixed-valid-and-invalid-routes-independently.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-router.validates-mixed-valid-and-invalid-routes-independently +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-router +--- +# Validates mixed valid and invalid routes independently + +## Intent + +- outcome: Executable scenario "Validates mixed valid and invalid routes independently" from packages/platform-core/tests/features/behavior/agent/command-router.feature diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-010-contains-all-expected-error-codes.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-010-contains-all-expected-error-codes.sdp.md new file mode 100644 index 00000000..5c899b4a --- /dev/null +++ b/specs/behavior/platform-core/agent/command-router.examples/s-010-contains-all-expected-error-codes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-router.contains-all-expected-error-codes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-router +--- +# Contains all expected error codes + +## Intent + +- outcome: Executable scenario "Contains all expected error codes" from packages/platform-core/tests/features/behavior/agent/command-router.feature diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-011-has-exactly-4-error-codes.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-011-has-exactly-4-error-codes.sdp.md new file mode 100644 index 00000000..882b7c6f --- /dev/null +++ b/specs/behavior/platform-core/agent/command-router.examples/s-011-has-exactly-4-error-codes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-router.has-exactly-4-error-codes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-router +--- +# Has exactly 4 error codes + +## Intent + +- outcome: Executable scenario "Has exactly 4 error codes" from packages/platform-core/tests/features/behavior/agent/command-router.feature diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-012-values-are-string-constants-matching-their-keys.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-012-values-are-string-constants-matching-their-keys.sdp.md new file mode 100644 index 00000000..92a4638f --- /dev/null +++ b/specs/behavior/platform-core/agent/command-router.examples/s-012-values-are-string-constants-matching-their-keys.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.command-router.values-are-string-constants-matching-their-keys +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.command-router +--- +# Values are string constants matching their keys + +## Intent + +- outcome: Executable scenario "Values are string constants matching their keys" from packages/platform-core/tests/features/behavior/agent/command-router.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-001-contains-all-expected-error-codes.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-001-contains-all-expected-error-codes.sdp.md new file mode 100644 index 00000000..cc5e9f67 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-001-contains-all-expected-error-codes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.contains-all-expected-error-codes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Contains all expected error codes + +## Intent + +- outcome: Executable scenario "Contains all expected error codes" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-002-has-exactly-5-error-codes.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-002-has-exactly-5-error-codes.sdp.md new file mode 100644 index 00000000..ebd927f8 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-002-has-exactly-5-error-codes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.has-exactly-5-error-codes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Has exactly 5 error codes + +## Intent + +- outcome: Executable scenario "Has exactly 5 error codes" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-003-accepts-valid-metadata.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-003-accepts-valid-metadata.sdp.md new file mode 100644 index 00000000..eefade1b --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-003-accepts-valid-metadata.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.accepts-valid-metadata +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Accepts valid metadata + +## Intent + +- outcome: Executable scenario "Accepts valid metadata" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-004-accepts-metadata-with-optional-pattern-id.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-004-accepts-metadata-with-optional-pattern-id.sdp.md new file mode 100644 index 00000000..01b2f43d --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-004-accepts-metadata-with-optional-pattern-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.accepts-metadata-with-optional-pattern-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Accepts metadata with optional patternId + +## Intent + +- outcome: Executable scenario "Accepts metadata with optional patternId" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-005-accepts-metadata-with-optional-analysis.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-005-accepts-metadata-with-optional-analysis.sdp.md new file mode 100644 index 00000000..9c1ed78a --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-005-accepts-metadata-with-optional-analysis.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.accepts-metadata-with-optional-analysis +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Accepts metadata with optional analysis + +## Intent + +- outcome: Executable scenario "Accepts metadata with optional analysis" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-006-rejects-metadata-with-empty-agent-id.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-006-rejects-metadata-with-empty-agent-id.sdp.md new file mode 100644 index 00000000..9cb0e63a --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-006-rejects-metadata-with-empty-agent-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.rejects-metadata-with-empty-agent-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Rejects metadata with empty agentId + +## Intent + +- outcome: Executable scenario "Rejects metadata with empty agentId" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-007-rejects-metadata-with-empty-decision-id.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-007-rejects-metadata-with-empty-decision-id.sdp.md new file mode 100644 index 00000000..b4d1bd3c --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-007-rejects-metadata-with-empty-decision-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.rejects-metadata-with-empty-decision-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Rejects metadata with empty decisionId + +## Intent + +- outcome: Executable scenario "Rejects metadata with empty decisionId" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-008-rejects-metadata-with-confidence-below-0.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-008-rejects-metadata-with-confidence-below-0.sdp.md new file mode 100644 index 00000000..5fb00b1e --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-008-rejects-metadata-with-confidence-below-0.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.rejects-metadata-with-confidence-below-0 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Rejects metadata with confidence below 0 + +## Intent + +- outcome: Executable scenario "Rejects metadata with confidence below 0" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-009-rejects-metadata-with-confidence-above-1.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-009-rejects-metadata-with-confidence-above-1.sdp.md new file mode 100644 index 00000000..4e103593 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-009-rejects-metadata-with-confidence-above-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.rejects-metadata-with-confidence-above-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Rejects metadata with confidence above 1 + +## Intent + +- outcome: Executable scenario "Rejects metadata with confidence above 1" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-010-rejects-metadata-with-empty-reason.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-010-rejects-metadata-with-empty-reason.sdp.md new file mode 100644 index 00000000..c1896017 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-010-rejects-metadata-with-empty-reason.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.rejects-metadata-with-empty-reason +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Rejects metadata with empty reason + +## Intent + +- outcome: Executable scenario "Rejects metadata with empty reason" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-011-rejects-metadata-with-empty-event-ids-array.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-011-rejects-metadata-with-empty-event-ids-array.sdp.md new file mode 100644 index 00000000..8d124e87 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-011-rejects-metadata-with-empty-event-ids-array.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.rejects-metadata-with-empty-event-ids-array +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Rejects metadata with empty eventIds array + +## Intent + +- outcome: Executable scenario "Rejects metadata with empty eventIds array" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-012-accepts-confidence-at-boundaries-0-and-1.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-012-accepts-confidence-at-boundaries-0-and-1.sdp.md new file mode 100644 index 00000000..2e0a5cac --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-012-accepts-confidence-at-boundaries-0-and-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.accepts-confidence-at-boundaries-0-and-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Accepts confidence at boundaries 0 and 1 + +## Intent + +- outcome: Executable scenario "Accepts confidence at boundaries 0 and 1" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-013-accepts-valid-command.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-013-accepts-valid-command.sdp.md new file mode 100644 index 00000000..fff7a430 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-013-accepts-valid-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.accepts-valid-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Accepts valid command + +## Intent + +- outcome: Executable scenario "Accepts valid command" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-014-rejects-command-with-empty-type.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-014-rejects-command-with-empty-type.sdp.md new file mode 100644 index 00000000..385e9679 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-014-rejects-command-with-empty-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.rejects-command-with-empty-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Rejects command with empty type + +## Intent + +- outcome: Executable scenario "Rejects command with empty type" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-015-accepts-command-with-any-payload-type.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-015-accepts-command-with-any-payload-type.sdp.md new file mode 100644 index 00000000..571b9d96 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-015-accepts-command-with-any-payload-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.accepts-command-with-any-payload-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Accepts command with any payload type + +## Intent + +- outcome: Executable scenario "Accepts command with any payload type" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-016-rejects-command-with-invalid-metadata.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-016-rejects-command-with-invalid-metadata.sdp.md new file mode 100644 index 00000000..6fead5a8 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-016-rejects-command-with-invalid-metadata.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.rejects-command-with-invalid-metadata +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Rejects command with invalid metadata + +## Intent + +- outcome: Executable scenario "Rejects command with invalid metadata" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-017-returns-invalid-when-type-is-undefined.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-017-returns-invalid-when-type-is-undefined.sdp.md new file mode 100644 index 00000000..bce16500 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-017-returns-invalid-when-type-is-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-invalid-when-type-is-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns invalid when type is undefined + +## Intent + +- outcome: Executable scenario "Returns invalid when type is undefined" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-018-returns-invalid-when-type-is-empty-string.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-018-returns-invalid-when-type-is-empty-string.sdp.md new file mode 100644 index 00000000..176798ae --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-018-returns-invalid-when-type-is-empty-string.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-invalid-when-type-is-empty-string +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns invalid when type is empty string + +## Intent + +- outcome: Executable scenario "Returns invalid when type is empty string" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-019-returns-invalid-when-type-is-whitespace-only.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-019-returns-invalid-when-type-is-whitespace-only.sdp.md new file mode 100644 index 00000000..61a55ba0 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-019-returns-invalid-when-type-is-whitespace-only.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-invalid-when-type-is-whitespace-only +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns invalid when type is whitespace only + +## Intent + +- outcome: Executable scenario "Returns invalid when type is whitespace only" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-020-returns-invalid-when-confidence-is-undefined.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-020-returns-invalid-when-confidence-is-undefined.sdp.md new file mode 100644 index 00000000..40764764 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-020-returns-invalid-when-confidence-is-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-invalid-when-confidence-is-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns invalid when confidence is undefined + +## Intent + +- outcome: Executable scenario "Returns invalid when confidence is undefined" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-021-returns-invalid-when-confidence-is-below-0.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-021-returns-invalid-when-confidence-is-below-0.sdp.md new file mode 100644 index 00000000..0d8603c2 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-021-returns-invalid-when-confidence-is-below-0.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-invalid-when-confidence-is-below-0 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns invalid when confidence is below 0 + +## Intent + +- outcome: Executable scenario "Returns invalid when confidence is below 0" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-022-returns-invalid-when-confidence-is-above-1.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-022-returns-invalid-when-confidence-is-above-1.sdp.md new file mode 100644 index 00000000..ceb4c674 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-022-returns-invalid-when-confidence-is-above-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-invalid-when-confidence-is-above-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns invalid when confidence is above 1 + +## Intent + +- outcome: Executable scenario "Returns invalid when confidence is above 1" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-023-accepts-confidence-at-boundary-values.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-023-accepts-confidence-at-boundary-values.sdp.md new file mode 100644 index 00000000..7514e82c --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-023-accepts-confidence-at-boundary-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.accepts-confidence-at-boundary-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Accepts confidence at boundary values + +## Intent + +- outcome: Executable scenario "Accepts confidence at boundary values" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-024-returns-invalid-when-reason-is-undefined.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-024-returns-invalid-when-reason-is-undefined.sdp.md new file mode 100644 index 00000000..afa7322d --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-024-returns-invalid-when-reason-is-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-invalid-when-reason-is-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns invalid when reason is undefined + +## Intent + +- outcome: Executable scenario "Returns invalid when reason is undefined" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-025-returns-invalid-when-reason-is-empty-string.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-025-returns-invalid-when-reason-is-empty-string.sdp.md new file mode 100644 index 00000000..ae498ed1 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-025-returns-invalid-when-reason-is-empty-string.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-invalid-when-reason-is-empty-string +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns invalid when reason is empty string + +## Intent + +- outcome: Executable scenario "Returns invalid when reason is empty string" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-026-returns-invalid-when-reason-is-whitespace-only.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-026-returns-invalid-when-reason-is-whitespace-only.sdp.md new file mode 100644 index 00000000..23e050a4 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-026-returns-invalid-when-reason-is-whitespace-only.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-invalid-when-reason-is-whitespace-only +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns invalid when reason is whitespace only + +## Intent + +- outcome: Executable scenario "Returns invalid when reason is whitespace only" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-027-returns-invalid-when-event-ids-is-undefined.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-027-returns-invalid-when-event-ids-is-undefined.sdp.md new file mode 100644 index 00000000..e7596ad0 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-027-returns-invalid-when-event-ids-is-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-invalid-when-event-ids-is-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns invalid when eventIds is undefined + +## Intent + +- outcome: Executable scenario "Returns invalid when eventIds is undefined" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-028-returns-invalid-when-event-ids-is-empty-array.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-028-returns-invalid-when-event-ids-is-empty-array.sdp.md new file mode 100644 index 00000000..1ef1578a --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-028-returns-invalid-when-event-ids-is-empty-array.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-invalid-when-event-ids-is-empty-array +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns invalid when eventIds is empty array + +## Intent + +- outcome: Executable scenario "Returns invalid when eventIds is empty array" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-029-accepts-single-event-id.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-029-accepts-single-event-id.sdp.md new file mode 100644 index 00000000..9a3cd82a --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-029-accepts-single-event-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.accepts-single-event-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Accepts single event ID + +## Intent + +- outcome: Executable scenario "Accepts single event ID" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-030-accepts-multiple-event-i-ds.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-030-accepts-multiple-event-i-ds.sdp.md new file mode 100644 index 00000000..f4878527 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-030-accepts-multiple-event-i-ds.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.accepts-multiple-event-i-ds +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Accepts multiple event IDs + +## Intent + +- outcome: Executable scenario "Accepts multiple event IDs" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-031-returns-valid-for-complete-command-args.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-031-returns-valid-for-complete-command-args.sdp.md new file mode 100644 index 00000000..28e15723 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-031-returns-valid-for-complete-command-args.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-valid-for-complete-command-args +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns valid for complete command args + +## Intent + +- outcome: Executable scenario "Returns valid for complete command args" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-032-creates-command-with-all-required-fields.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-032-creates-command-with-all-required-fields.sdp.md new file mode 100644 index 00000000..c393748b --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-032-creates-command-with-all-required-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.creates-command-with-all-required-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Creates command with all required fields + +## Intent + +- outcome: Executable scenario "Creates command with all required fields" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-033-generates-unique-decision-id.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-033-generates-unique-decision-id.sdp.md new file mode 100644 index 00000000..fe76811e --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-033-generates-unique-decision-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.generates-unique-decision-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Generates unique decisionId + +## Intent + +- outcome: Executable scenario "Generates unique decisionId" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-034-includes-pattern-id-when-provided-in-options.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-034-includes-pattern-id-when-provided-in-options.sdp.md new file mode 100644 index 00000000..c8279b03 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-034-includes-pattern-id-when-provided-in-options.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.includes-pattern-id-when-provided-in-options +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Includes patternId when provided in options + +## Intent + +- outcome: Executable scenario "Includes patternId when provided in options" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-035-does-not-include-pattern-id-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-035-does-not-include-pattern-id-when-not-provided.sdp.md new file mode 100644 index 00000000..cdde86cd --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-035-does-not-include-pattern-id-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.does-not-include-pattern-id-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Does not include patternId when not provided + +## Intent + +- outcome: Executable scenario "Does not include patternId when not provided" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-036-includes-analysis-when-provided-in-options.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-036-includes-analysis-when-provided-in-options.sdp.md new file mode 100644 index 00000000..45b9266e --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-036-includes-analysis-when-provided-in-options.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.includes-analysis-when-provided-in-options +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Includes analysis when provided in options + +## Intent + +- outcome: Executable scenario "Includes analysis when provided in options" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-037-does-not-include-analysis-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-037-does-not-include-analysis-when-not-provided.sdp.md new file mode 100644 index 00000000..af00b6d4 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-037-does-not-include-analysis-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.does-not-include-analysis-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Does not include analysis when not provided + +## Intent + +- outcome: Executable scenario "Does not include analysis when not provided" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-038-includes-both-pattern-id-and-analysis-when-provided.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-038-includes-both-pattern-id-and-analysis-when-provided.sdp.md new file mode 100644 index 00000000..aad27ade --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-038-includes-both-pattern-id-and-analysis-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.includes-both-pattern-id-and-analysis-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Includes both patternId and analysis when provided + +## Intent + +- outcome: Executable scenario "Includes both patternId and analysis when provided" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-039-copies-event-ids-array-without-reference-sharing.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-039-copies-event-ids-array-without-reference-sharing.sdp.md new file mode 100644 index 00000000..bbe93359 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-039-copies-event-ids-array-without-reference-sharing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.copies-event-ids-array-without-reference-sharing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Copies eventIds array without reference sharing + +## Intent + +- outcome: Executable scenario "Copies eventIds array without reference sharing" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-040-throws-error-for-empty-type.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-040-throws-error-for-empty-type.sdp.md new file mode 100644 index 00000000..774ebf06 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-040-throws-error-for-empty-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.throws-error-for-empty-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Throws error for empty type + +## Intent + +- outcome: Executable scenario "Throws error for empty type" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-041-throws-error-for-invalid-confidence.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-041-throws-error-for-invalid-confidence.sdp.md new file mode 100644 index 00000000..db2a9735 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-041-throws-error-for-invalid-confidence.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.throws-error-for-invalid-confidence +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Throws error for invalid confidence + +## Intent + +- outcome: Executable scenario "Throws error for invalid confidence" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-042-throws-error-for-empty-reason.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-042-throws-error-for-empty-reason.sdp.md new file mode 100644 index 00000000..822bb711 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-042-throws-error-for-empty-reason.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.throws-error-for-empty-reason +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Throws error for empty reason + +## Intent + +- outcome: Executable scenario "Throws error for empty reason" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-043-throws-error-for-empty-event-ids.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-043-throws-error-for-empty-event-ids.sdp.md new file mode 100644 index 00000000..0fba5578 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-043-throws-error-for-empty-event-ids.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.throws-error-for-empty-event-ids +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Throws error for empty eventIds + +## Intent + +- outcome: Executable scenario "Throws error for empty eventIds" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-044-includes-error-code-in-thrown-message.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-044-includes-error-code-in-thrown-message.sdp.md new file mode 100644 index 00000000..7f8edb8c --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-044-includes-error-code-in-thrown-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.includes-error-code-in-thrown-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Includes error code in thrown message + +## Intent + +- outcome: Executable scenario "Includes error code in thrown message" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-045-creates-command-from-decision-with-command.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-045-creates-command-from-decision-with-command.sdp.md new file mode 100644 index 00000000..dc535a93 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-045-creates-command-from-decision-with-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.creates-command-from-decision-with-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Creates command from decision with command + +## Intent + +- outcome: Executable scenario "Creates command from decision with command" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-046-returns-null-when-decision-has-no-command.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-046-returns-null-when-decision-has-no-command.sdp.md new file mode 100644 index 00000000..106ed500 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-046-returns-null-when-decision-has-no-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-null-when-decision-has-no-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns null when decision has no command + +## Intent + +- outcome: Executable scenario "Returns null when decision has no command" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-047-includes-pattern-id-when-provided.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-047-includes-pattern-id-when-provided.sdp.md new file mode 100644 index 00000000..fe785ff9 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-047-includes-pattern-id-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.includes-pattern-id-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Includes patternId when provided + +## Intent + +- outcome: Executable scenario "Includes patternId when provided" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-048-includes-analysis-when-provided.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-048-includes-analysis-when-provided.sdp.md new file mode 100644 index 00000000..481b4593 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-048-includes-analysis-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.includes-analysis-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Includes analysis when provided + +## Intent + +- outcome: Executable scenario "Includes analysis when provided" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-049-maps-all-decision-fields-correctly.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-049-maps-all-decision-fields-correctly.sdp.md new file mode 100644 index 00000000..c4d012ea --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-049-maps-all-decision-fields-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.maps-all-decision-fields-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Maps all decision fields correctly + +## Intent + +- outcome: Executable scenario "Maps all decision fields correctly" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-050-returns-true-for-valid-command.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-050-returns-true-for-valid-command.sdp.md new file mode 100644 index 00000000..3dff77cd --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-050-returns-true-for-valid-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-true-for-valid-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns true for valid command + +## Intent + +- outcome: Executable scenario "Returns true for valid command" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-051-returns-true-for-command-with-optional-fields.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-051-returns-true-for-command-with-optional-fields.sdp.md new file mode 100644 index 00000000..bd3dd1a2 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-051-returns-true-for-command-with-optional-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-true-for-command-with-optional-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns true for command with optional fields + +## Intent + +- outcome: Executable scenario "Returns true for command with optional fields" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-052-returns-false-for-non-command-values.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-052-returns-false-for-non-command-values.sdp.md new file mode 100644 index 00000000..f783b668 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-052-returns-false-for-non-command-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-false-for-non-command-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns false for non-command values + +## Intent + +- outcome: Executable scenario "Returns false for non-command values" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-053-returns-true-when-command-has-pattern-id.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-053-returns-true-when-command-has-pattern-id.sdp.md new file mode 100644 index 00000000..eaa5acf1 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-053-returns-true-when-command-has-pattern-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-true-when-command-has-pattern-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns true when command has patternId + +## Intent + +- outcome: Executable scenario "Returns true when command has patternId" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-054-returns-false-when-command-has-no-pattern-id.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-054-returns-false-when-command-has-no-pattern-id.sdp.md new file mode 100644 index 00000000..4994fb3a --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-054-returns-false-when-command-has-no-pattern-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-false-when-command-has-no-pattern-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns false when command has no patternId + +## Intent + +- outcome: Executable scenario "Returns false when command has no patternId" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-055-returns-false-when-pattern-id-is-undefined-explicitly.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-055-returns-false-when-pattern-id-is-undefined-explicitly.sdp.md new file mode 100644 index 00000000..81293597 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-055-returns-false-when-pattern-id-is-undefined-explicitly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-false-when-pattern-id-is-undefined-explicitly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns false when patternId is undefined explicitly + +## Intent + +- outcome: Executable scenario "Returns false when patternId is undefined explicitly" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-056-returns-true-when-command-has-analysis.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-056-returns-true-when-command-has-analysis.sdp.md new file mode 100644 index 00000000..6eabd80a --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-056-returns-true-when-command-has-analysis.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-true-when-command-has-analysis +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns true when command has analysis + +## Intent + +- outcome: Executable scenario "Returns true when command has analysis" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-057-returns-false-when-command-has-no-analysis.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-057-returns-false-when-command-has-no-analysis.sdp.md new file mode 100644 index 00000000..6bce2871 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-057-returns-false-when-command-has-no-analysis.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-false-when-command-has-no-analysis +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns false when command has no analysis + +## Intent + +- outcome: Executable scenario "Returns false when command has no analysis" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-058-returns-false-when-analysis-is-undefined-explicitly.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-058-returns-false-when-analysis-is-undefined-explicitly.sdp.md new file mode 100644 index 00000000..091cbe40 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-058-returns-false-when-analysis-is-undefined-explicitly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-false-when-analysis-is-undefined-explicitly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns false when analysis is undefined explicitly + +## Intent + +- outcome: Executable scenario "Returns false when analysis is undefined explicitly" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-059-returns-true-for-null-analysis.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-059-returns-true-for-null-analysis.sdp.md new file mode 100644 index 00000000..abc8100a --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-059-returns-true-for-null-analysis.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.returns-true-for-null-analysis +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Returns true for null analysis + +## Intent + +- outcome: Executable scenario "Returns true for null analysis" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-060-validates-creates-and-verifies-command.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-060-validates-creates-and-verifies-command.sdp.md new file mode 100644 index 00000000..519b45b6 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-060-validates-creates-and-verifies-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.validates-creates-and-verifies-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Validates, creates, and verifies command + +## Intent + +- outcome: Executable scenario "Validates, creates, and verifies command" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/commands.examples/s-061-creates-command-from-decision-and-verifies.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-061-creates-command-from-decision-and-verifies.sdp.md new file mode 100644 index 00000000..9b864357 --- /dev/null +++ b/specs/behavior/platform-core/agent/commands.examples/s-061-creates-command-from-decision-and-verifies.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.commands.creates-command-from-decision-and-verifies +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.commands +--- +# Creates command from decision and verifies + +## Intent + +- outcome: Executable scenario "Creates command from decision and verifies" from packages/platform-core/tests/features/behavior/agent/commands.feature diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-001-allowed-when-current-spend-plus-estimated-cost-is-under-budget.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-001-allowed-when-current-spend-plus-estimated-cost-is-under-budget.sdp.md new file mode 100644 index 00000000..473cd240 --- /dev/null +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-001-allowed-when-current-spend-plus-estimated-cost-is-under-budget.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.cost-budget.allowed-when-current-spend-plus-estimated-cost-is-under-budget +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.cost-budget +--- +# Allowed when current spend plus estimated cost is under budget + +## Intent + +- outcome: Executable scenario "Allowed when current spend plus estimated cost is under budget" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-002-denied-when-estimated-cost-would-exceed-budget.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-002-denied-when-estimated-cost-would-exceed-budget.sdp.md new file mode 100644 index 00000000..484681c4 --- /dev/null +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-002-denied-when-estimated-cost-would-exceed-budget.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.cost-budget.denied-when-estimated-cost-would-exceed-budget +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.cost-budget +--- +# Denied when estimated cost would exceed budget + +## Intent + +- outcome: Executable scenario "Denied when estimated cost would exceed budget" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-003-denied-when-current-spend-already-equals-budget.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-003-denied-when-current-spend-already-equals-budget.sdp.md new file mode 100644 index 00000000..ff56ffd7 --- /dev/null +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-003-denied-when-current-spend-already-equals-budget.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.cost-budget.denied-when-current-spend-already-equals-budget +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.cost-budget +--- +# Denied when current spend already equals budget + +## Intent + +- outcome: Executable scenario "Denied when current spend already equals budget" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-004-allowed-when-estimated-cost-exactly-reaches-budget.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-004-allowed-when-estimated-cost-exactly-reaches-budget.sdp.md new file mode 100644 index 00000000..4e2b9fe5 --- /dev/null +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-004-allowed-when-estimated-cost-exactly-reaches-budget.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.cost-budget.allowed-when-estimated-cost-exactly-reaches-budget +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.cost-budget +--- +# Allowed when estimated cost exactly reaches budget + +## Intent + +- outcome: Executable scenario "Allowed when estimated cost exactly reaches budget" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-005-sets-at-alert-threshold-when-spend-exceeds-alert-threshold.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-005-sets-at-alert-threshold-when-spend-exceeds-alert-threshold.sdp.md new file mode 100644 index 00000000..90537914 --- /dev/null +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-005-sets-at-alert-threshold-when-spend-exceeds-alert-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.cost-budget.sets-at-alert-threshold-when-spend-exceeds-alert-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.cost-budget +--- +# Sets atAlertThreshold when spend exceeds alert threshold + +## Intent + +- outcome: Executable scenario "Sets atAlertThreshold when spend exceeds alert threshold" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-006-does-not-set-at-alert-threshold-when-below-threshold.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-006-does-not-set-at-alert-threshold-when-below-threshold.sdp.md new file mode 100644 index 00000000..1aa96a74 --- /dev/null +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-006-does-not-set-at-alert-threshold-when-below-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.cost-budget.does-not-set-at-alert-threshold-when-below-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.cost-budget +--- +# Does not set atAlertThreshold when below threshold + +## Intent + +- outcome: Executable scenario "Does not set atAlertThreshold when below threshold" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-007-sets-at-alert-threshold-at-exact-threshold-boundary.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-007-sets-at-alert-threshold-at-exact-threshold-boundary.sdp.md new file mode 100644 index 00000000..60f14c99 --- /dev/null +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-007-sets-at-alert-threshold-at-exact-threshold-boundary.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.cost-budget.sets-at-alert-threshold-at-exact-threshold-boundary +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.cost-budget +--- +# Sets atAlertThreshold at exact threshold boundary + +## Intent + +- outcome: Executable scenario "Sets atAlertThreshold at exact threshold boundary" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-008-simple-multiplication-of-tokens-and-cost-per-token.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-008-simple-multiplication-of-tokens-and-cost-per-token.sdp.md new file mode 100644 index 00000000..d57af6c1 --- /dev/null +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-008-simple-multiplication-of-tokens-and-cost-per-token.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.cost-budget.simple-multiplication-of-tokens-and-cost-per-token +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.cost-budget +--- +# Simple multiplication of tokens and cost per token + +## Intent + +- outcome: Executable scenario "Simple multiplication of tokens and cost per token" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-009-returns-0-for-0-tokens.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-009-returns-0-for-0-tokens.sdp.md new file mode 100644 index 00000000..e22b10a2 --- /dev/null +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-009-returns-0-for-0-tokens.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.cost-budget.returns-0-for-0-tokens +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.cost-budget +--- +# Returns 0 for 0 tokens + +## Intent + +- outcome: Executable scenario "Returns 0 for 0 tokens" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-010-handles-large-token-counts.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-010-handles-large-token-counts.sdp.md new file mode 100644 index 00000000..c9edc7c2 --- /dev/null +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-010-handles-large-token-counts.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.cost-budget.handles-large-token-counts +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.cost-budget +--- +# Handles large token counts + +## Intent + +- outcome: Executable scenario "Handles large token counts" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-011-handles-very-small-cost-per-token.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-011-handles-very-small-cost-per-token.sdp.md new file mode 100644 index 00000000..b8395a38 --- /dev/null +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-011-handles-very-small-cost-per-token.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.cost-budget.handles-very-small-cost-per-token +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.cost-budget +--- +# Handles very small cost per token + +## Intent + +- outcome: Executable scenario "Handles very small cost per token" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-012-claude-model-entry-has-positive-input-and-output-costs-with-output-greater.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-012-claude-model-entry-has-positive-input-and-output-costs-with-output-greater.sdp.md new file mode 100644 index 00000000..b092f382 --- /dev/null +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-012-claude-model-entry-has-positive-input-and-output-costs-with-output-greater.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.cost-budget.claude-model-entry-has-positive-input-and-output-costs-with-output-greater-than +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.cost-budget +--- +# Claude model entry has positive input and output costs with output greater than input + +## Intent + +- outcome: Executable scenario "Claude model entry has positive input and output costs with output greater than input" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-013-gpt-4o-model-entry-has-positive-input-and-output-costs.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-013-gpt-4o-model-entry-has-positive-input-and-output-costs.sdp.md new file mode 100644 index 00000000..9462ccbc --- /dev/null +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-013-gpt-4o-model-entry-has-positive-input-and-output-costs.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.cost-budget.gpt-4o-model-entry-has-positive-input-and-output-costs +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.cost-budget +--- +# GPT-4o model entry has positive input and output costs + +## Intent + +- outcome: Executable scenario "GPT-4o model entry has positive input and output costs" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-014-gpt-4o-mini-model-entry-is-cheaper-than-gpt-4o.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-014-gpt-4o-mini-model-entry-is-cheaper-than-gpt-4o.sdp.md new file mode 100644 index 00000000..56e2a2a6 --- /dev/null +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-014-gpt-4o-mini-model-entry-is-cheaper-than-gpt-4o.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.cost-budget.gpt-4o-mini-model-entry-is-cheaper-than-gpt-4o +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.cost-budget +--- +# GPT-4o-mini model entry is cheaper than GPT-4o + +## Intent + +- outcome: Executable scenario "GPT-4o-mini model entry is cheaper than GPT-4o" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-001-contains-all-expected-error-codes.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-001-contains-all-expected-error-codes.sdp.md new file mode 100644 index 00000000..501768bb --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-001-contains-all-expected-error-codes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.contains-all-expected-error-codes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Contains all expected error codes + +## Intent + +- outcome: Executable scenario "Contains all expected error codes" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-002-has-exactly-3-error-codes.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-002-has-exactly-3-error-codes.sdp.md new file mode 100644 index 00000000..fd6bcdd3 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-002-has-exactly-3-error-codes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.has-exactly-3-error-codes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Has exactly 3 error codes + +## Intent + +- outcome: Executable scenario "Has exactly 3 error codes" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-003-contains-all-three-statuses-in-order.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-003-contains-all-three-statuses-in-order.sdp.md new file mode 100644 index 00000000..7264f3b8 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-003-contains-all-three-statuses-in-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.contains-all-three-statuses-in-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Contains all three statuses in order + +## Intent + +- outcome: Executable scenario "Contains all three statuses in order" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-004-is-a-readonly-tuple-with-3-elements.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-004-is-a-readonly-tuple-with-3-elements.sdp.md new file mode 100644 index 00000000..f4bab616 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-004-is-a-readonly-tuple-with-3-elements.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.is-a-readonly-tuple-with-3-elements +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Is a readonly tuple with 3 elements + +## Intent + +- outcome: Executable scenario "Is a readonly tuple with 3 elements" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-005-type-guard-accepts-valid-statuses.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-005-type-guard-accepts-valid-statuses.sdp.md new file mode 100644 index 00000000..0bebc945 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-005-type-guard-accepts-valid-statuses.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.type-guard-accepts-valid-statuses +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Type guard accepts valid statuses + +## Intent + +- outcome: Executable scenario "Type guard accepts valid statuses" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-006-type-guard-rejects-invalid-values.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-006-type-guard-rejects-invalid-values.sdp.md new file mode 100644 index 00000000..2517b413 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-006-type-guard-rejects-invalid-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.type-guard-rejects-invalid-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Type guard rejects invalid values + +## Intent + +- outcome: Executable scenario "Type guard rejects invalid values" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-007-type-guard-rejects-non-string-types.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-007-type-guard-rejects-non-string-types.sdp.md new file mode 100644 index 00000000..5292be31 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-007-type-guard-rejects-non-string-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.type-guard-rejects-non-string-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Type guard rejects non-string types + +## Intent + +- outcome: Executable scenario "Type guard rejects non-string types" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-008-accepts-all-valid-statuses.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-008-accepts-all-valid-statuses.sdp.md new file mode 100644 index 00000000..88e9e092 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-008-accepts-all-valid-statuses.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.accepts-all-valid-statuses +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Accepts all valid statuses + +## Intent + +- outcome: Executable scenario "Accepts all valid statuses" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-009-rejects-invalid-status-values.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-009-rejects-invalid-status-values.sdp.md new file mode 100644 index 00000000..0df93682 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-009-rejects-invalid-status-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.rejects-invalid-status-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Rejects invalid status values + +## Intent + +- outcome: Executable scenario "Rejects invalid status values" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-010-accepts-valid-context-with-all-fields.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-010-accepts-valid-context-with-all-fields.sdp.md new file mode 100644 index 00000000..67f2aaff --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-010-accepts-valid-context-with-all-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.accepts-valid-context-with-all-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Accepts valid context with all fields + +## Intent + +- outcome: Executable scenario "Accepts valid context with all fields" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-011-accepts-context-with-only-correlation-id.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-011-accepts-context-with-only-correlation-id.sdp.md new file mode 100644 index 00000000..fd5f2526 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-011-accepts-context-with-only-correlation-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.accepts-context-with-only-correlation-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Accepts context with only correlationId + +## Intent + +- outcome: Executable scenario "Accepts context with only correlationId" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-012-accepts-context-with-only-error-code.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-012-accepts-context-with-only-error-code.sdp.md new file mode 100644 index 00000000..f2ac53e1 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-012-accepts-context-with-only-error-code.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.accepts-context-with-only-error-code +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Accepts context with only errorCode + +## Intent + +- outcome: Executable scenario "Accepts context with only errorCode" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-013-accepts-empty-context-object.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-013-accepts-empty-context-object.sdp.md new file mode 100644 index 00000000..5ef4834c --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-013-accepts-empty-context-object.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.accepts-empty-context-object +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Accepts empty context object + +## Intent + +- outcome: Executable scenario "Accepts empty context object" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-014-rejects-context-with-unknown-fields-in-strict-mode.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-014-rejects-context-with-unknown-fields-in-strict-mode.sdp.md new file mode 100644 index 00000000..29e36a8c --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-014-rejects-context-with-unknown-fields-in-strict-mode.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.rejects-context-with-unknown-fields-in-strict-mode +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Rejects context with unknown fields in strict mode + +## Intent + +- outcome: Executable scenario "Rejects context with unknown fields in strict mode" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-015-accepts-valid-dead-letter.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-015-accepts-valid-dead-letter.sdp.md new file mode 100644 index 00000000..29ab6780 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-015-accepts-valid-dead-letter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.accepts-valid-dead-letter +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Accepts valid dead letter + +## Intent + +- outcome: Executable scenario "Accepts valid dead letter" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-016-accepts-dead-letter-with-context.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-016-accepts-dead-letter-with-context.sdp.md new file mode 100644 index 00000000..a216e96d --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-016-accepts-dead-letter-with-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.accepts-dead-letter-with-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Accepts dead letter with context + +## Intent + +- outcome: Executable scenario "Accepts dead letter with context" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-017-rejects-dead-letter-with-empty-agent-id.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-017-rejects-dead-letter-with-empty-agent-id.sdp.md new file mode 100644 index 00000000..0a92df19 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-017-rejects-dead-letter-with-empty-agent-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.rejects-dead-letter-with-empty-agent-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Rejects dead letter with empty agentId + +## Intent + +- outcome: Executable scenario "Rejects dead letter with empty agentId" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-018-rejects-dead-letter-with-empty-subscription-id.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-018-rejects-dead-letter-with-empty-subscription-id.sdp.md new file mode 100644 index 00000000..2d5ecc86 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-018-rejects-dead-letter-with-empty-subscription-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.rejects-dead-letter-with-empty-subscription-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Rejects dead letter with empty subscriptionId + +## Intent + +- outcome: Executable scenario "Rejects dead letter with empty subscriptionId" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-019-rejects-dead-letter-with-empty-event-id.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-019-rejects-dead-letter-with-empty-event-id.sdp.md new file mode 100644 index 00000000..cb5fb7cc --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-019-rejects-dead-letter-with-empty-event-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.rejects-dead-letter-with-empty-event-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Rejects dead letter with empty eventId + +## Intent + +- outcome: Executable scenario "Rejects dead letter with empty eventId" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-020-rejects-dead-letter-with-negative-global-position.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-020-rejects-dead-letter-with-negative-global-position.sdp.md new file mode 100644 index 00000000..9c65c7dc --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-020-rejects-dead-letter-with-negative-global-position.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.rejects-dead-letter-with-negative-global-position +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Rejects dead letter with negative globalPosition + +## Intent + +- outcome: Executable scenario "Rejects dead letter with negative globalPosition" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-021-accepts-dead-letter-with-global-position-of-0.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-021-accepts-dead-letter-with-global-position-of-0.sdp.md new file mode 100644 index 00000000..5fd3bc65 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-021-accepts-dead-letter-with-global-position-of-0.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.accepts-dead-letter-with-global-position-of-0 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Accepts dead letter with globalPosition of 0 + +## Intent + +- outcome: Executable scenario "Accepts dead letter with globalPosition of 0" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-022-rejects-dead-letter-with-non-positive-attempt-count.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-022-rejects-dead-letter-with-non-positive-attempt-count.sdp.md new file mode 100644 index 00000000..e01b0d56 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-022-rejects-dead-letter-with-non-positive-attempt-count.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.rejects-dead-letter-with-non-positive-attempt-count +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Rejects dead letter with non-positive attemptCount + +## Intent + +- outcome: Executable scenario "Rejects dead letter with non-positive attemptCount" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-023-rejects-dead-letter-with-missing-required-fields.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-023-rejects-dead-letter-with-missing-required-fields.sdp.md new file mode 100644 index 00000000..0c548282 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-023-rejects-dead-letter-with-missing-required-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.rejects-dead-letter-with-missing-required-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Rejects dead letter with missing required fields + +## Intent + +- outcome: Executable scenario "Rejects dead letter with missing required fields" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-024-removes-content-after-at-when-followed-by-path-like-content.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-024-removes-content-after-at-when-followed-by-path-like-content.sdp.md new file mode 100644 index 00000000..acce9c24 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-024-removes-content-after-at-when-followed-by-path-like-content.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.removes-content-after-at-when-followed-by-path-like-content +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Removes content after at when followed by path-like content + +## Intent + +- outcome: Executable scenario "Removes content after at when followed by path-like content" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-025-removes-multi-line-stack-traces.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-025-removes-multi-line-stack-traces.sdp.md new file mode 100644 index 00000000..00719157 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-025-removes-multi-line-stack-traces.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.removes-multi-line-stack-traces +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Removes multi-line stack traces + +## Intent + +- outcome: Executable scenario "Removes multi-line stack traces" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-026-preserves-the-error-message-itself.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-026-preserves-the-error-message-itself.sdp.md new file mode 100644 index 00000000..2f20dd12 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-026-preserves-the-error-message-itself.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.preserves-the-error-message-itself +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Preserves the error message itself + +## Intent + +- outcome: Executable scenario "Preserves the error message itself" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-027-removes-type-script-file-paths-with-at-prefix.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-027-removes-type-script-file-paths-with-at-prefix.sdp.md new file mode 100644 index 00000000..6568d6ab --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-027-removes-type-script-file-paths-with-at-prefix.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.removes-type-script-file-paths-with-at-prefix +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Removes TypeScript file paths with at prefix + +## Intent + +- outcome: Executable scenario "Removes TypeScript file paths with at prefix" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-028-replaces-file-paths-without-at-prefix-with-path-marker.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-028-replaces-file-paths-without-at-prefix-with-path-marker.sdp.md new file mode 100644 index 00000000..6655e402 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-028-replaces-file-paths-without-at-prefix-with-path-marker.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.replaces-file-paths-without-at-prefix-with-path-marker +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Replaces file paths without at prefix with path marker + +## Intent + +- outcome: Executable scenario "Replaces file paths without at prefix with path marker" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-029-removes-esm-file-paths-when-preceded-by-at.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-029-removes-esm-file-paths-when-preceded-by-at.sdp.md new file mode 100644 index 00000000..9a68c741 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-029-removes-esm-file-paths-when-preceded-by-at.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.removes-esm-file-paths-when-preceded-by-at +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Removes ESM file paths when preceded by at + +## Intent + +- outcome: Executable scenario "Removes ESM file paths when preceded by at" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-030-replaces-cjs-file-paths-with-path-marker-when-not-preceded-by-at.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-030-replaces-cjs-file-paths-with-path-marker-when-not-preceded-by-at.sdp.md new file mode 100644 index 00000000..575e1e99 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-030-replaces-cjs-file-paths-with-path-marker-when-not-preceded-by-at.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.replaces-cjs-file-paths-with-path-marker-when-not-preceded-by-at +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Replaces CJS file paths with path marker when not preceded by at + +## Intent + +- outcome: Executable scenario "Replaces CJS file paths with path marker when not preceded by at" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-031-removes-paths-with-line-and-column-numbers.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-031-removes-paths-with-line-and-column-numbers.sdp.md new file mode 100644 index 00000000..77e229bd --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-031-removes-paths-with-line-and-column-numbers.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.removes-paths-with-line-and-column-numbers +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Removes paths with line and column numbers + +## Intent + +- outcome: Executable scenario "Removes paths with line and column numbers" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-032-truncates-long-messages-to-500-characters-ending-with-ellipsis.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-032-truncates-long-messages-to-500-characters-ending-with-ellipsis.sdp.md new file mode 100644 index 00000000..5f440522 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-032-truncates-long-messages-to-500-characters-ending-with-ellipsis.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.truncates-long-messages-to-500-characters-ending-with-ellipsis +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Truncates long messages to 500 characters ending with ellipsis + +## Intent + +- outcome: Executable scenario "Truncates long messages to 500 characters ending with ellipsis" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-033-does-not-truncate-messages-under-500-characters.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-033-does-not-truncate-messages-under-500-characters.sdp.md new file mode 100644 index 00000000..cb4e25d3 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-033-does-not-truncate-messages-under-500-characters.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.does-not-truncate-messages-under-500-characters +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Does not truncate messages under 500 characters + +## Intent + +- outcome: Executable scenario "Does not truncate messages under 500 characters" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-034-does-not-truncate-messages-of-exactly-500-characters.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-034-does-not-truncate-messages-of-exactly-500-characters.sdp.md new file mode 100644 index 00000000..49c8eb4a --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-034-does-not-truncate-messages-of-exactly-500-characters.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.does-not-truncate-messages-of-exactly-500-characters +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Does not truncate messages of exactly 500 characters + +## Intent + +- outcome: Executable scenario "Does not truncate messages of exactly 500 characters" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-035-handles-error-objects.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-035-handles-error-objects.sdp.md new file mode 100644 index 00000000..68293d93 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-035-handles-error-objects.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.handles-error-objects +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Handles Error objects + +## Intent + +- outcome: Executable scenario "Handles Error objects" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-036-handles-string-errors.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-036-handles-string-errors.sdp.md new file mode 100644 index 00000000..ea6504df --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-036-handles-string-errors.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.handles-string-errors +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Handles string errors + +## Intent + +- outcome: Executable scenario "Handles string errors" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-037-handles-objects-with-message-property.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-037-handles-objects-with-message-property.sdp.md new file mode 100644 index 00000000..fe4d81c4 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-037-handles-objects-with-message-property.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.handles-objects-with-message-property +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Handles objects with message property + +## Intent + +- outcome: Executable scenario "Handles objects with message property" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-038-handles-unknown-error-types.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-038-handles-unknown-error-types.sdp.md new file mode 100644 index 00000000..eb7f42b3 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-038-handles-unknown-error-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.handles-unknown-error-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Handles unknown error types + +## Intent + +- outcome: Executable scenario "Handles unknown error types" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-039-handles-null.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-039-handles-null.sdp.md new file mode 100644 index 00000000..9482a62c --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-039-handles-null.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.handles-null +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Handles null + +## Intent + +- outcome: Executable scenario "Handles null" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-040-handles-undefined.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-040-handles-undefined.sdp.md new file mode 100644 index 00000000..b6b7e8a9 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-040-handles-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.handles-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Handles undefined + +## Intent + +- outcome: Executable scenario "Handles undefined" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-041-handles-empty-string.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-041-handles-empty-string.sdp.md new file mode 100644 index 00000000..b9aa610d --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-041-handles-empty-string.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.handles-empty-string +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Handles empty string + +## Intent + +- outcome: Executable scenario "Handles empty string" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-042-collapses-multiple-spaces.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-042-collapses-multiple-spaces.sdp.md new file mode 100644 index 00000000..aba66b42 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-042-collapses-multiple-spaces.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.collapses-multiple-spaces +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Collapses multiple spaces + +## Intent + +- outcome: Executable scenario "Collapses multiple spaces" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-043-trims-leading-and-trailing-whitespace.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-043-trims-leading-and-trailing-whitespace.sdp.md new file mode 100644 index 00000000..99400da9 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-043-trims-leading-and-trailing-whitespace.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.trims-leading-and-trailing-whitespace +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Trims leading and trailing whitespace + +## Intent + +- outcome: Executable scenario "Trims leading and trailing whitespace" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-044-handles-newlines.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-044-handles-newlines.sdp.md new file mode 100644 index 00000000..2b7c3c67 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-044-handles-newlines.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.handles-newlines +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Handles newlines + +## Intent + +- outcome: Executable scenario "Handles newlines" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-045-creates-dead-letter-with-required-fields.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-045-creates-dead-letter-with-required-fields.sdp.md new file mode 100644 index 00000000..b9d31156 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-045-creates-dead-letter-with-required-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.creates-dead-letter-with-required-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Creates dead letter with required fields + +## Intent + +- outcome: Executable scenario "Creates dead letter with required fields" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-046-creates-dead-letter-with-pending-status.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-046-creates-dead-letter-with-pending-status.sdp.md new file mode 100644 index 00000000..cffa13d8 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-046-creates-dead-letter-with-pending-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.creates-dead-letter-with-pending-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Creates dead letter with pending status + +## Intent + +- outcome: Executable scenario "Creates dead letter with pending status" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-047-sets-attempt-count-to-1.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-047-sets-attempt-count-to-1.sdp.md new file mode 100644 index 00000000..137902f3 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-047-sets-attempt-count-to-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.sets-attempt-count-to-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Sets attemptCount to 1 + +## Intent + +- outcome: Executable scenario "Sets attemptCount to 1" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-048-sets-failed-at-to-current-time.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-048-sets-failed-at-to-current-time.sdp.md new file mode 100644 index 00000000..45b844de --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-048-sets-failed-at-to-current-time.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.sets-failed-at-to-current-time +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Sets failedAt to current time + +## Intent + +- outcome: Executable scenario "Sets failedAt to current time" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-049-includes-context-when-provided.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-049-includes-context-when-provided.sdp.md new file mode 100644 index 00000000..4e92c839 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-049-includes-context-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.includes-context-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Includes context when provided + +## Intent + +- outcome: Executable scenario "Includes context when provided" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-050-does-not-include-context-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-050-does-not-include-context-when-not-provided.sdp.md new file mode 100644 index 00000000..304856ce --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-050-does-not-include-context-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.does-not-include-context-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Does not include context when not provided + +## Intent + +- outcome: Executable scenario "Does not include context when not provided" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-051-sanitizes-error-objects-removing-stack-like-patterns.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-051-sanitizes-error-objects-removing-stack-like-patterns.sdp.md new file mode 100644 index 00000000..2cf88363 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-051-sanitizes-error-objects-removing-stack-like-patterns.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.sanitizes-error-objects-removing-stack-like-patterns +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Sanitizes Error objects removing stack-like patterns + +## Intent + +- outcome: Executable scenario "Sanitizes Error objects removing stack-like patterns" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-052-sanitizes-string-errors.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-052-sanitizes-string-errors.sdp.md new file mode 100644 index 00000000..fc2f2100 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-052-sanitizes-string-errors.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.sanitizes-string-errors +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Sanitizes string errors + +## Intent + +- outcome: Executable scenario "Sanitizes string errors" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-053-replaces-paths-in-errors-without-at-prefix.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-053-replaces-paths-in-errors-without-at-prefix.sdp.md new file mode 100644 index 00000000..2d694e8f --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-053-replaces-paths-in-errors-without-at-prefix.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.replaces-paths-in-errors-without-at-prefix +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Replaces paths in errors without at prefix + +## Intent + +- outcome: Executable scenario "Replaces paths in errors without at prefix" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-054-replaces-paths-with-line-column-suffix.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-054-replaces-paths-with-line-column-suffix.sdp.md new file mode 100644 index 00000000..2454cb54 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-054-replaces-paths-with-line-column-suffix.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.replaces-paths-with-line-column-suffix +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Replaces paths with line column suffix + +## Intent + +- outcome: Executable scenario "Replaces paths with line column suffix" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-055-sanitizes-unknown-error-types.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-055-sanitizes-unknown-error-types.sdp.md new file mode 100644 index 00000000..939b76ff --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-055-sanitizes-unknown-error-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.sanitizes-unknown-error-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Sanitizes unknown error types + +## Intent + +- outcome: Executable scenario "Sanitizes unknown error types" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-056-increments-attempt-count.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-056-increments-attempt-count.sdp.md new file mode 100644 index 00000000..2b98c08d --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-056-increments-attempt-count.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.increments-attempt-count +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Increments attemptCount + +## Intent + +- outcome: Executable scenario "Increments attemptCount" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-057-updates-error-message.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-057-updates-error-message.sdp.md new file mode 100644 index 00000000..6fafebfa --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-057-updates-error-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.updates-error-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Updates error message + +## Intent + +- outcome: Executable scenario "Updates error message" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-058-sanitizes-new-error-message-with-at-pattern.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-058-sanitizes-new-error-message-with-at-pattern.sdp.md new file mode 100644 index 00000000..696fc716 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-058-sanitizes-new-error-message-with-at-pattern.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.sanitizes-new-error-message-with-at-pattern +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Sanitizes new error message with at pattern + +## Intent + +- outcome: Executable scenario "Sanitizes new error message with at pattern" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-059-sanitizes-new-error-message-with-path-replacement.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-059-sanitizes-new-error-message-with-path-replacement.sdp.md new file mode 100644 index 00000000..237c9802 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-059-sanitizes-new-error-message-with-path-replacement.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.sanitizes-new-error-message-with-path-replacement +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Sanitizes new error message with path replacement + +## Intent + +- outcome: Executable scenario "Sanitizes new error message with path replacement" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-060-updates-failed-at-to-current-time.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-060-updates-failed-at-to-current-time.sdp.md new file mode 100644 index 00000000..8923d7c7 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-060-updates-failed-at-to-current-time.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.updates-failed-at-to-current-time +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Updates failedAt to current time + +## Intent + +- outcome: Executable scenario "Updates failedAt to current time" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-061-preserves-other-fields-during-increment.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-061-preserves-other-fields-during-increment.sdp.md new file mode 100644 index 00000000..6bf7530a --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-061-preserves-other-fields-during-increment.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.preserves-other-fields-during-increment +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Preserves other fields during increment + +## Intent + +- outcome: Executable scenario "Preserves other fields during increment" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-062-handles-multiple-increments.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-062-handles-multiple-increments.sdp.md new file mode 100644 index 00000000..760df7e4 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-062-handles-multiple-increments.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.handles-multiple-increments +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Handles multiple increments + +## Intent + +- outcome: Executable scenario "Handles multiple increments" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-063-transitions-pending-to-replayed.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-063-transitions-pending-to-replayed.sdp.md new file mode 100644 index 00000000..6ccd2375 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-063-transitions-pending-to-replayed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.transitions-pending-to-replayed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Transitions pending to replayed + +## Intent + +- outcome: Executable scenario "Transitions pending to replayed" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-064-preserves-all-other-fields-when-transitioning-to-replayed.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-064-preserves-all-other-fields-when-transitioning-to-replayed.sdp.md new file mode 100644 index 00000000..2a8ed9ac --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-064-preserves-all-other-fields-when-transitioning-to-replayed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.preserves-all-other-fields-when-transitioning-to-replayed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Preserves all other fields when transitioning to replayed + +## Intent + +- outcome: Executable scenario "Preserves all other fields when transitioning to replayed" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-065-throws-when-marking-replayed-dead-letter-as-replayed.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-065-throws-when-marking-replayed-dead-letter-as-replayed.sdp.md new file mode 100644 index 00000000..a23d361b --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-065-throws-when-marking-replayed-dead-letter-as-replayed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.throws-when-marking-replayed-dead-letter-as-replayed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Throws when marking replayed dead letter as replayed + +## Intent + +- outcome: Executable scenario "Throws when marking replayed dead letter as replayed" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-066-throws-when-marking-ignored-dead-letter-as-replayed.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-066-throws-when-marking-ignored-dead-letter-as-replayed.sdp.md new file mode 100644 index 00000000..a3cf3ddb --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-066-throws-when-marking-ignored-dead-letter-as-replayed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.throws-when-marking-ignored-dead-letter-as-replayed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Throws when marking ignored dead letter as replayed + +## Intent + +- outcome: Executable scenario "Throws when marking ignored dead letter as replayed" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-067-transitions-pending-to-ignored.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-067-transitions-pending-to-ignored.sdp.md new file mode 100644 index 00000000..550903e0 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-067-transitions-pending-to-ignored.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.transitions-pending-to-ignored +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Transitions pending to ignored + +## Intent + +- outcome: Executable scenario "Transitions pending to ignored" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-068-preserves-all-other-fields-when-transitioning-to-ignored.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-068-preserves-all-other-fields-when-transitioning-to-ignored.sdp.md new file mode 100644 index 00000000..c5e9168c --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-068-preserves-all-other-fields-when-transitioning-to-ignored.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.preserves-all-other-fields-when-transitioning-to-ignored +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Preserves all other fields when transitioning to ignored + +## Intent + +- outcome: Executable scenario "Preserves all other fields when transitioning to ignored" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-069-throws-when-marking-replayed-dead-letter-as-ignored.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-069-throws-when-marking-replayed-dead-letter-as-ignored.sdp.md new file mode 100644 index 00000000..1b01a31b --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-069-throws-when-marking-replayed-dead-letter-as-ignored.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.throws-when-marking-replayed-dead-letter-as-ignored +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Throws when marking replayed dead letter as ignored + +## Intent + +- outcome: Executable scenario "Throws when marking replayed dead letter as ignored" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-070-throws-when-marking-already-ignored-dead-letter-as-ignored.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-070-throws-when-marking-already-ignored-dead-letter-as-ignored.sdp.md new file mode 100644 index 00000000..217f2142 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-070-throws-when-marking-already-ignored-dead-letter-as-ignored.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.throws-when-marking-already-ignored-dead-letter-as-ignored +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Throws when marking already ignored dead letter as ignored + +## Intent + +- outcome: Executable scenario "Throws when marking already ignored dead letter as ignored" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-071-is-dead-letter-pending-returns-true-only-for-pending.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-071-is-dead-letter-pending-returns-true-only-for-pending.sdp.md new file mode 100644 index 00000000..d7183891 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-071-is-dead-letter-pending-returns-true-only-for-pending.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.is-dead-letter-pending-returns-true-only-for-pending +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# isDeadLetterPending returns true only for pending + +## Intent + +- outcome: Executable scenario "isDeadLetterPending returns true only for pending" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-072-is-dead-letter-replayed-returns-true-only-for-replayed.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-072-is-dead-letter-replayed-returns-true-only-for-replayed.sdp.md new file mode 100644 index 00000000..49f731bd --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-072-is-dead-letter-replayed-returns-true-only-for-replayed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.is-dead-letter-replayed-returns-true-only-for-replayed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# isDeadLetterReplayed returns true only for replayed + +## Intent + +- outcome: Executable scenario "isDeadLetterReplayed returns true only for replayed" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-073-is-dead-letter-ignored-returns-true-only-for-ignored.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-073-is-dead-letter-ignored-returns-true-only-for-ignored.sdp.md new file mode 100644 index 00000000..9ecb103e --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-073-is-dead-letter-ignored-returns-true-only-for-ignored.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.is-dead-letter-ignored-returns-true-only-for-ignored +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# isDeadLetterIgnored returns true only for ignored + +## Intent + +- outcome: Executable scenario "isDeadLetterIgnored returns true only for ignored" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-074-returns-true-for-valid-dead-letter.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-074-returns-true-for-valid-dead-letter.sdp.md new file mode 100644 index 00000000..7ef9aca4 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-074-returns-true-for-valid-dead-letter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.returns-true-for-valid-dead-letter +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Returns true for valid dead letter + +## Intent + +- outcome: Executable scenario "Returns true for valid dead letter" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-075-returns-true-for-dead-letter-with-context.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-075-returns-true-for-dead-letter-with-context.sdp.md new file mode 100644 index 00000000..db127ce1 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-075-returns-true-for-dead-letter-with-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.returns-true-for-dead-letter-with-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Returns true for dead letter with context + +## Intent + +- outcome: Executable scenario "Returns true for dead letter with context" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-076-returns-false-for-null.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-076-returns-false-for-null.sdp.md new file mode 100644 index 00000000..cac18c44 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-076-returns-false-for-null.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.returns-false-for-null +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Returns false for null + +## Intent + +- outcome: Executable scenario "Returns false for null" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-077-returns-false-for-undefined.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-077-returns-false-for-undefined.sdp.md new file mode 100644 index 00000000..2bb87101 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-077-returns-false-for-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.returns-false-for-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Returns false for undefined + +## Intent + +- outcome: Executable scenario "Returns false for undefined" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-078-returns-false-for-empty-object.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-078-returns-false-for-empty-object.sdp.md new file mode 100644 index 00000000..6e92d133 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-078-returns-false-for-empty-object.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.returns-false-for-empty-object +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Returns false for empty object + +## Intent + +- outcome: Executable scenario "Returns false for empty object" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-079-returns-false-for-non-object-types.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-079-returns-false-for-non-object-types.sdp.md new file mode 100644 index 00000000..a061bf41 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-079-returns-false-for-non-object-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.returns-false-for-non-object-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Returns false for non-object types + +## Intent + +- outcome: Executable scenario "Returns false for non-object types" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-080-returns-false-for-dead-letter-with-invalid-status.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-080-returns-false-for-dead-letter-with-invalid-status.sdp.md new file mode 100644 index 00000000..7742e615 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-080-returns-false-for-dead-letter-with-invalid-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.returns-false-for-dead-letter-with-invalid-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Returns false for dead letter with invalid status + +## Intent + +- outcome: Executable scenario "Returns false for dead letter with invalid status" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-081-returns-false-for-dead-letter-with-missing-fields.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-081-returns-false-for-dead-letter-with-missing-fields.sdp.md new file mode 100644 index 00000000..ea3113e8 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-081-returns-false-for-dead-letter-with-missing-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.returns-false-for-dead-letter-with-missing-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Returns false for dead letter with missing fields + +## Intent + +- outcome: Executable scenario "Returns false for dead letter with missing fields" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-082-failed-event-processing-and-replay-lifecycle.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-082-failed-event-processing-and-replay-lifecycle.sdp.md new file mode 100644 index 00000000..ee579000 --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-082-failed-event-processing-and-replay-lifecycle.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.failed-event-processing-and-replay-lifecycle +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Failed event processing and replay lifecycle + +## Intent + +- outcome: Executable scenario "Failed event processing and replay lifecycle" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-083-obsolete-event-being-ignored-lifecycle.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-083-obsolete-event-being-ignored-lifecycle.sdp.md new file mode 100644 index 00000000..f8c00b9e --- /dev/null +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-083-obsolete-event-being-ignored-lifecycle.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.dead-letter.obsolete-event-being-ignored-lifecycle +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.dead-letter +--- +# Obsolete event being ignored lifecycle + +## Intent + +- outcome: Executable scenario "Obsolete event being ignored lifecycle" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-001-subscribe-to-single-event-type.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-001-subscribe-to-single-event-type.sdp.md new file mode 100644 index 00000000..15c69755 --- /dev/null +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-001-subscribe-to-single-event-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.event-subscription.subscribe-to-single-event-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.event-subscription +--- +# Subscribe to single event type + +## Intent + +- outcome: Executable scenario "Subscribe to single event type" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-002-subscribe-to-multiple-event-types.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-002-subscribe-to-multiple-event-types.sdp.md new file mode 100644 index 00000000..cd1b7796 --- /dev/null +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-002-subscribe-to-multiple-event-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.event-subscription.subscribe-to-multiple-event-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.event-subscription +--- +# Subscribe to multiple event types + +## Intent + +- outcome: Executable scenario "Subscribe to multiple event types" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-003-agent-does-not-receive-unsubscribed-events.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-003-agent-does-not-receive-unsubscribed-events.sdp.md new file mode 100644 index 00000000..1feda928 --- /dev/null +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-003-agent-does-not-receive-unsubscribed-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.event-subscription.agent-does-not-receive-unsubscribed-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.event-subscription +--- +# Agent does not receive unsubscribed events + +## Intent + +- outcome: Executable scenario "Agent does not receive unsubscribed events" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-004-filter-by-payload-field.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-004-filter-by-payload-field.sdp.md new file mode 100644 index 00000000..ad235dd2 --- /dev/null +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-004-filter-by-payload-field.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.event-subscription.filter-by-payload-field +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.event-subscription +--- +# Filter by payload field + +## Intent + +- outcome: Executable scenario "Filter by payload field" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-005-filter-by-customer-segment.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-005-filter-by-customer-segment.sdp.md new file mode 100644 index 00000000..b29297eb --- /dev/null +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-005-filter-by-customer-segment.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.event-subscription.filter-by-customer-segment +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.event-subscription +--- +# Filter by customer segment + +## Intent + +- outcome: Executable scenario "Filter by customer segment" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-006-events-delivered-in-publication-order.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-006-events-delivered-in-publication-order.sdp.md new file mode 100644 index 00000000..21edeb48 --- /dev/null +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-006-events-delivered-in-publication-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.event-subscription.events-delivered-in-publication-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.event-subscription +--- +# Events delivered in publication order + +## Intent + +- outcome: Executable scenario "Events delivered in publication order" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-007-events-from-same-stream-maintain-order.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-007-events-from-same-stream-maintain-order.sdp.md new file mode 100644 index 00000000..b93d89f2 --- /dev/null +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-007-events-from-same-stream-maintain-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.event-subscription.events-from-same-stream-maintain-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.event-subscription +--- +# Events from same stream maintain order + +## Intent + +- outcome: Executable scenario "Events from same stream maintain order" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-008-agent-resumes-from-last-processed-position-after-restart.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-008-agent-resumes-from-last-processed-position-after-restart.sdp.md new file mode 100644 index 00000000..cd04adfe --- /dev/null +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-008-agent-resumes-from-last-processed-position-after-restart.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.event-subscription.agent-resumes-from-last-processed-position-after-restart +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.event-subscription +--- +# Agent resumes from last processed position after restart + +## Intent + +- outcome: Executable scenario "Agent resumes from last processed position after restart" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-009-checkpoint-updated-after-successful-analysis.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-009-checkpoint-updated-after-successful-analysis.sdp.md new file mode 100644 index 00000000..a40bf9da --- /dev/null +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-009-checkpoint-updated-after-successful-analysis.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.event-subscription.checkpoint-updated-after-successful-analysis +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.event-subscription +--- +# Checkpoint updated after successful analysis + +## Intent + +- outcome: Executable scenario "Checkpoint updated after successful analysis" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-010-failed-analysis-records-to-dead-letter-without-advancing-checkpoint.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-010-failed-analysis-records-to-dead-letter-without-advancing-checkpoint.sdp.md new file mode 100644 index 00000000..04689576 --- /dev/null +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-010-failed-analysis-records-to-dead-letter-without-advancing-checkpoint.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.event-subscription.failed-analysis-records-to-dead-letter-without-advancing-checkpoint +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.event-subscription +--- +# Failed analysis records to dead letter without advancing checkpoint + +## Intent + +- outcome: Executable scenario "Failed analysis records to dead letter without advancing checkpoint" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-011-checkpoint-persists-agent-subscription-state.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-011-checkpoint-persists-agent-subscription-state.sdp.md new file mode 100644 index 00000000..5fd4affb --- /dev/null +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-011-checkpoint-persists-agent-subscription-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.event-subscription.checkpoint-persists-agent-subscription-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.event-subscription +--- +# Checkpoint persists agent subscription state + +## Intent + +- outcome: Executable scenario "Checkpoint persists agent subscription state" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-012-pause-subscription.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-012-pause-subscription.sdp.md new file mode 100644 index 00000000..64709a35 --- /dev/null +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-012-pause-subscription.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.event-subscription.pause-subscription +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.event-subscription +--- +# Pause subscription + +## Intent + +- outcome: Executable scenario "Pause subscription" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-013-resume-subscription.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-013-resume-subscription.sdp.md new file mode 100644 index 00000000..a802b38d --- /dev/null +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-013-resume-subscription.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.event-subscription.resume-subscription +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.event-subscription +--- +# Resume subscription + +## Intent + +- outcome: Executable scenario "Resume subscription" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-014-unsubscribe-stops-all-event-delivery.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-014-unsubscribe-stops-all-event-delivery.sdp.md new file mode 100644 index 00000000..a9f9294f --- /dev/null +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-014-unsubscribe-stops-all-event-delivery.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.event-subscription.unsubscribe-stops-all-event-delivery +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.event-subscription +--- +# Unsubscribe stops all event delivery + +## Intent + +- outcome: Executable scenario "Unsubscribe stops all event delivery" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-001-execution-mode-based-on-confidence.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-001-execution-mode-based-on-confidence.sdp.md new file mode 100644 index 00000000..7fd37938 --- /dev/null +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-001-execution-mode-based-on-confidence.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.human-in-loop.execution-mode-based-on-confidence +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.human-in-loop +--- +# Execution mode based on confidence + +## Intent + +- outcome: Executable scenario "Execution mode based on confidence" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-002-custom-threshold-per-agent.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-002-custom-threshold-per-agent.sdp.md new file mode 100644 index 00000000..f7c80524 --- /dev/null +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-002-custom-threshold-per-agent.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.human-in-loop.custom-threshold-per-agent +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.human-in-loop +--- +# Custom threshold per agent + +## Intent + +- outcome: Executable scenario "Custom threshold per agent" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-003-requires-approval-action-with-high-confidence.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-003-requires-approval-action-with-high-confidence.sdp.md new file mode 100644 index 00000000..0aebbf2c --- /dev/null +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-003-requires-approval-action-with-high-confidence.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.human-in-loop.requires-approval-action-with-high-confidence +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.human-in-loop +--- +# RequiresApproval action with high confidence + +## Intent + +- outcome: Executable scenario "RequiresApproval action with high confidence" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-004-auto-approve-action-with-low-confidence.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-004-auto-approve-action-with-low-confidence.sdp.md new file mode 100644 index 00000000..551d8e18 --- /dev/null +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-004-auto-approve-action-with-low-confidence.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.human-in-loop.auto-approve-action-with-low-confidence +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.human-in-loop +--- +# AutoApprove action with low confidence + +## Intent + +- outcome: Executable scenario "AutoApprove action with low confidence" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-005-configure-multiple-approval-requirements.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-005-configure-multiple-approval-requirements.sdp.md new file mode 100644 index 00000000..dbd93693 --- /dev/null +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-005-configure-multiple-approval-requirements.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.human-in-loop.configure-multiple-approval-requirements +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.human-in-loop +--- +# Configure multiple approval requirements + +## Intent + +- outcome: Executable scenario "Configure multiple approval requirements" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-006-create-review-task.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-006-create-review-task.sdp.md new file mode 100644 index 00000000..f16cc159 --- /dev/null +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-006-create-review-task.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.human-in-loop.create-review-task +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.human-in-loop +--- +# Create review task + +## Intent + +- outcome: Executable scenario "Create review task" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-007-approve-pending-action.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-007-approve-pending-action.sdp.md new file mode 100644 index 00000000..1acffa24 --- /dev/null +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-007-approve-pending-action.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.human-in-loop.approve-pending-action +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.human-in-loop +--- +# Approve pending action + +## Intent + +- outcome: Executable scenario "Approve pending action" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-008-reject-pending-action.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-008-reject-pending-action.sdp.md new file mode 100644 index 00000000..800a6023 --- /dev/null +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-008-reject-pending-action.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.human-in-loop.reject-pending-action +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.human-in-loop +--- +# Reject pending action + +## Intent + +- outcome: Executable scenario "Reject pending action" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-009-action-expires-after-timeout.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-009-action-expires-after-timeout.sdp.md new file mode 100644 index 00000000..799f5ada --- /dev/null +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-009-action-expires-after-timeout.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.human-in-loop.action-expires-after-timeout +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.human-in-loop +--- +# Action expires after timeout + +## Intent + +- outcome: Executable scenario "Action expires after timeout" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-010-custom-timeout-per-action-type.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-010-custom-timeout-per-action-type.sdp.md new file mode 100644 index 00000000..b98f022e --- /dev/null +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-010-custom-timeout-per-action-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.human-in-loop.custom-timeout-per-action-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.human-in-loop +--- +# Custom timeout per action type + +## Intent + +- outcome: Executable scenario "Custom timeout per action type" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-011-approve-action-near-timeout.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-011-approve-action-near-timeout.sdp.md new file mode 100644 index 00000000..54c32a69 --- /dev/null +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-011-approve-action-near-timeout.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.human-in-loop.approve-action-near-timeout +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.human-in-loop +--- +# Approve action near timeout + +## Intent + +- outcome: Executable scenario "Approve action near timeout" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-001-rejects-empty-string-id.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-001-rejects-empty-string-id.sdp.md new file mode 100644 index 00000000..8007879a --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-001-rejects-empty-string-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.rejects-empty-string-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Rejects empty string id + +## Intent + +- outcome: Executable scenario "Rejects empty string id" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-002-rejects-undefined-id.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-002-rejects-undefined-id.sdp.md new file mode 100644 index 00000000..c010ad57 --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-002-rejects-undefined-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.rejects-undefined-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Rejects undefined id + +## Intent + +- outcome: Executable scenario "Rejects undefined id" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-003-rejects-whitespace-only-id.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-003-rejects-whitespace-only-id.sdp.md new file mode 100644 index 00000000..fca8e1d3 --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-003-rejects-whitespace-only-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.rejects-whitespace-only-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Rejects whitespace-only id + +## Intent + +- outcome: Executable scenario "Rejects whitespace-only id" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-004-rejects-empty-subscriptions-array.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-004-rejects-empty-subscriptions-array.sdp.md new file mode 100644 index 00000000..9284b8bd --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-004-rejects-empty-subscriptions-array.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.rejects-empty-subscriptions-array +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Rejects empty subscriptions array + +## Intent + +- outcome: Executable scenario "Rejects empty subscriptions array" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-005-rejects-undefined-subscriptions.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-005-rejects-undefined-subscriptions.sdp.md new file mode 100644 index 00000000..31656186 --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-005-rejects-undefined-subscriptions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.rejects-undefined-subscriptions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Rejects undefined subscriptions + +## Intent + +- outcome: Executable scenario "Rejects undefined subscriptions" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-006-rejects-negative-threshold.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-006-rejects-negative-threshold.sdp.md new file mode 100644 index 00000000..997f648d --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-006-rejects-negative-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.rejects-negative-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Rejects negative threshold + +## Intent + +- outcome: Executable scenario "Rejects negative threshold" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-007-rejects-threshold-greater-than-1.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-007-rejects-threshold-greater-than-1.sdp.md new file mode 100644 index 00000000..3d697c49 --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-007-rejects-threshold-greater-than-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.rejects-threshold-greater-than-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Rejects threshold greater than 1 + +## Intent + +- outcome: Executable scenario "Rejects threshold greater than 1" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-008-rejects-empty-pattern-window-duration.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-008-rejects-empty-pattern-window-duration.sdp.md new file mode 100644 index 00000000..cf9f68cb --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-008-rejects-empty-pattern-window-duration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.rejects-empty-pattern-window-duration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Rejects empty pattern window duration + +## Intent + +- outcome: Executable scenario "Rejects empty pattern window duration" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-009-rejects-whitespace-only-pattern-window-duration.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-009-rejects-whitespace-only-pattern-window-duration.sdp.md new file mode 100644 index 00000000..3f6c8d74 --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-009-rejects-whitespace-only-pattern-window-duration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.rejects-whitespace-only-pattern-window-duration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Rejects whitespace-only pattern window duration + +## Intent + +- outcome: Executable scenario "Rejects whitespace-only pattern window duration" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-010-rejects-action-in-both-requires-approval-and-auto-approve.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-010-rejects-action-in-both-requires-approval-and-auto-approve.sdp.md new file mode 100644 index 00000000..abb35804 --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-010-rejects-action-in-both-requires-approval-and-auto-approve.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.rejects-action-in-both-requires-approval-and-auto-approve +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Rejects action in both requiresApproval and autoApprove + +## Intent + +- outcome: Executable scenario "Rejects action in both requiresApproval and autoApprove" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-011-rejects-config-with-no-patterns-array.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-011-rejects-config-with-no-patterns-array.sdp.md new file mode 100644 index 00000000..5a70e57f --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-011-rejects-config-with-no-patterns-array.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.rejects-config-with-no-patterns-array +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Rejects config with no patterns array + +## Intent + +- outcome: Executable scenario "Rejects config with no patterns array" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-012-rejects-config-with-empty-patterns-array.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-012-rejects-config-with-empty-patterns-array.sdp.md new file mode 100644 index 00000000..b84f4938 --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-012-rejects-config-with-empty-patterns-array.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.rejects-config-with-empty-patterns-array +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Rejects config with empty patterns array + +## Intent + +- outcome: Executable scenario "Rejects config with empty patterns array" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-013-accepts-valid-config-with-patterns.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-013-accepts-valid-config-with-patterns.sdp.md new file mode 100644 index 00000000..baf5b3aa --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-013-accepts-valid-config-with-patterns.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.accepts-valid-config-with-patterns +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Accepts valid config with patterns + +## Intent + +- outcome: Executable scenario "Accepts valid config with patterns" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-014-accepts-config-without-confidence-threshold.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-014-accepts-config-without-confidence-threshold.sdp.md new file mode 100644 index 00000000..1f2c5b0f --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-014-accepts-config-without-confidence-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.accepts-config-without-confidence-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Accepts config without confidenceThreshold + +## Intent + +- outcome: Executable scenario "Accepts config without confidenceThreshold" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-015-transforms-a-standard-event-correctly.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-015-transforms-a-standard-event-correctly.sdp.md new file mode 100644 index 00000000..ea4c91c4 --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-015-transforms-a-standard-event-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.transforms-a-standard-event-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Transforms a standard event correctly + +## Intent + +- outcome: Executable scenario "Transforms a standard event correctly" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-016-wraps-array-payload-in-raw-wrapper.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-016-wraps-array-payload-in-raw-wrapper.sdp.md new file mode 100644 index 00000000..60af0911 --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-016-wraps-array-payload-in-raw-wrapper.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.wraps-array-payload-in-raw-wrapper +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Wraps array payload in _raw wrapper + +## Intent + +- outcome: Executable scenario "Wraps array payload in _raw wrapper" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-017-wraps-null-payload-in-raw-wrapper.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-017-wraps-null-payload-in-raw-wrapper.sdp.md new file mode 100644 index 00000000..f2c6ddaf --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-017-wraps-null-payload-in-raw-wrapper.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.wraps-null-payload-in-raw-wrapper +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Wraps null payload in _raw wrapper + +## Intent + +- outcome: Executable scenario "Wraps null payload in _raw wrapper" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-018-passes-through-object-payloads-without-wrapping.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-018-passes-through-object-payloads-without-wrapping.sdp.md new file mode 100644 index 00000000..eeebf114 --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-018-passes-through-object-payloads-without-wrapping.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.passes-through-object-payloads-without-wrapping +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Passes through object payloads without wrapping + +## Intent + +- outcome: Executable scenario "Passes through object payloads without wrapping" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-019-uses-correlation-id-from-the-chain-not-from-the-event.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-019-uses-correlation-id-from-the-chain-not-from-the-event.sdp.md new file mode 100644 index 00000000..aa9c4bae --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-019-uses-correlation-id-from-the-chain-not-from-the-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.uses-correlation-id-from-the-chain-not-from-the-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Uses correlationId from the chain not from the event + +## Intent + +- outcome: Executable scenario "Uses correlationId from the chain not from the event" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-020-subscription-id-starts-with-sub-prefix.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-020-subscription-id-starts-with-sub-prefix.sdp.md new file mode 100644 index 00000000..4863de37 --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-020-subscription-id-starts-with-sub-prefix.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.subscription-id-starts-with-sub-prefix +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Subscription ID starts with sub_ prefix + +## Intent + +- outcome: Executable scenario "Subscription ID starts with sub_ prefix" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-021-subscription-id-contains-the-agent-id.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-021-subscription-id-contains-the-agent-id.sdp.md new file mode 100644 index 00000000..740eea7d --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-021-subscription-id-contains-the-agent-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.subscription-id-contains-the-agent-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Subscription ID contains the agentId + +## Intent + +- outcome: Executable scenario "Subscription ID contains the agentId" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-022-subscription-id-contains-a-uuid-segment.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-022-subscription-id-contains-a-uuid-segment.sdp.md new file mode 100644 index 00000000..79255477 --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-022-subscription-id-contains-a-uuid-segment.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.subscription-id-contains-a-uuid-segment +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Subscription ID contains a UUID segment + +## Intent + +- outcome: Executable scenario "Subscription ID contains a UUID segment" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-023-produces-different-i-ds-when-timestamp-differs.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-023-produces-different-i-ds-when-timestamp-differs.sdp.md new file mode 100644 index 00000000..0ab9d642 --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-023-produces-different-i-ds-when-timestamp-differs.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.produces-different-i-ds-when-timestamp-differs +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Produces different IDs when timestamp differs + +## Intent + +- outcome: Executable scenario "Produces different IDs when timestamp differs" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-024-returns-success-with-handle-for-a-valid-config.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-024-returns-success-with-handle-for-a-valid-config.sdp.md new file mode 100644 index 00000000..092a6107 --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-024-returns-success-with-handle-for-a-valid-config.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.returns-success-with-handle-for-a-valid-config +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Returns success with handle for a valid config + +## Intent + +- outcome: Executable scenario "Returns success with handle for a valid config" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-025-returns-error-with-invalid-config-code-for-invalid-config.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-025-returns-error-with-invalid-config-code-for-invalid-config.sdp.md new file mode 100644 index 00000000..197284f8 --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-025-returns-error-with-invalid-config-code-for-invalid-config.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.returns-error-with-invalid-config-code-for-invalid-config +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Returns error with INVALID_CONFIG code for invalid config + +## Intent + +- outcome: Executable scenario "Returns error with INVALID_CONFIG code for invalid config" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-026-uses-existing-checkpoint-when-provided.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-026-uses-existing-checkpoint-when-provided.sdp.md new file mode 100644 index 00000000..81a23fed --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-026-uses-existing-checkpoint-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.uses-existing-checkpoint-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Uses existing checkpoint when provided + +## Intent + +- outcome: Executable scenario "Uses existing checkpoint when provided" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/init.examples/s-027-creates-a-new-checkpoint-when-no-existing-checkpoint-provided.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-027-creates-a-new-checkpoint-when-no-existing-checkpoint-provided.sdp.md new file mode 100644 index 00000000..2a6070b6 --- /dev/null +++ b/specs/behavior/platform-core/agent/init.examples/s-027-creates-a-new-checkpoint-when-no-existing-checkpoint-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.init.creates-a-new-checkpoint-when-no-existing-checkpoint-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.init +--- +# Creates a new checkpoint when no existing checkpoint provided + +## Intent + +- outcome: Executable scenario "Creates a new checkpoint when no existing checkpoint provided" from packages/platform-core/tests/features/behavior/agent/init.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-001-start-agent-command-carries-type-and-required-fields.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-001-start-agent-command-carries-type-and-required-fields.sdp.md new file mode 100644 index 00000000..3fae5685 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-001-start-agent-command-carries-type-and-required-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-commands.start-agent-command-carries-type-and-required-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-commands +--- +# StartAgentCommand carries type and required fields + +## Intent + +- outcome: Executable scenario "StartAgentCommand carries type and required fields" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-002-pause-agent-command-carries-optional-reason-when-provided.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-002-pause-agent-command-carries-optional-reason-when-provided.sdp.md new file mode 100644 index 00000000..2e4c430e --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-002-pause-agent-command-carries-optional-reason-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-commands.pause-agent-command-carries-optional-reason-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-commands +--- +# PauseAgentCommand carries optional reason when provided + +## Intent + +- outcome: Executable scenario "PauseAgentCommand carries optional reason when provided" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-003-pause-agent-command-has-undefined-reason-when-omitted.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-003-pause-agent-command-has-undefined-reason-when-omitted.sdp.md new file mode 100644 index 00000000..86718458 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-003-pause-agent-command-has-undefined-reason-when-omitted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-commands.pause-agent-command-has-undefined-reason-when-omitted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-commands +--- +# PauseAgentCommand has undefined reason when omitted + +## Intent + +- outcome: Executable scenario "PauseAgentCommand has undefined reason when omitted" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-004-resume-agent-command-carries-correct-type.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-004-resume-agent-command-carries-correct-type.sdp.md new file mode 100644 index 00000000..7a315c39 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-004-resume-agent-command-carries-correct-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-commands.resume-agent-command-carries-correct-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-commands +--- +# ResumeAgentCommand carries correct type + +## Intent + +- outcome: Executable scenario "ResumeAgentCommand carries correct type" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-005-stop-agent-command-carries-optional-reason-when-provided.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-005-stop-agent-command-carries-optional-reason-when-provided.sdp.md new file mode 100644 index 00000000..cfdb6779 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-005-stop-agent-command-carries-optional-reason-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-commands.stop-agent-command-carries-optional-reason-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-commands +--- +# StopAgentCommand carries optional reason when provided + +## Intent + +- outcome: Executable scenario "StopAgentCommand carries optional reason when provided" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-006-reconfigure-agent-command-carries-config-overrides-with-nested-fields.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-006-reconfigure-agent-command-carries-config-overrides-with-nested-fields.sdp.md new file mode 100644 index 00000000..27bc7438 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-006-reconfigure-agent-command-carries-config-overrides-with-nested-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-commands.reconfigure-agent-command-carries-config-overrides-with-nested-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-commands +--- +# ReconfigureAgentCommand carries configOverrides with nested fields + +## Intent + +- outcome: Executable scenario "ReconfigureAgentCommand carries configOverrides with nested fields" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-007-discriminated-union-narrows-by-type-field-at-runtime.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-007-discriminated-union-narrows-by-type-field-at-runtime.sdp.md new file mode 100644 index 00000000..484ef1ba --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-007-discriminated-union-narrows-by-type-field-at-runtime.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-commands.discriminated-union-narrows-by-type-field-at-runtime +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-commands +--- +# Discriminated union narrows by type field at runtime + +## Intent + +- outcome: Executable scenario "Discriminated union narrows by type field at runtime" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-008-all-fields-are-optional-in-agent-config-overrides.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-008-all-fields-are-optional-in-agent-config-overrides.sdp.md new file mode 100644 index 00000000..4da9eb3f --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-008-all-fields-are-optional-in-agent-config-overrides.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-commands.all-fields-are-optional-in-agent-config-overrides +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-commands +--- +# All fields are optional in AgentConfigOverrides + +## Intent + +- outcome: Executable scenario "All fields are optional in AgentConfigOverrides" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-009-partial-rate-limits-with-only-max-requests-per-minute.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-009-partial-rate-limits-with-only-max-requests-per-minute.sdp.md new file mode 100644 index 00000000..6e641e8f --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-009-partial-rate-limits-with-only-max-requests-per-minute.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-commands.partial-rate-limits-with-only-max-requests-per-minute +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-commands +--- +# Partial rateLimits with only maxRequestsPerMinute + +## Intent + +- outcome: Executable scenario "Partial rateLimits with only maxRequestsPerMinute" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-010-nested-cost-budget-overrides-with-only-daily.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-010-nested-cost-budget-overrides-with-only-daily.sdp.md new file mode 100644 index 00000000..aec59221 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-010-nested-cost-budget-overrides-with-only-daily.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-commands.nested-cost-budget-overrides-with-only-daily +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-commands +--- +# Nested costBudget overrides with only daily + +## Intent + +- outcome: Executable scenario "Nested costBudget overrides with only daily" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-011-error-codes-contain-expected-values-and-count.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-011-error-codes-contain-expected-values-and-count.sdp.md new file mode 100644 index 00000000..43461da1 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-011-error-codes-contain-expected-values-and-count.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-commands.error-codes-contain-expected-values-and-count +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-commands +--- +# Error codes contain expected values and count + +## Intent + +- outcome: Executable scenario "Error codes contain expected values and count" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-012-success-result-carries-state-transition-fields.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-012-success-result-carries-state-transition-fields.sdp.md new file mode 100644 index 00000000..8014ac23 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-012-success-result-carries-state-transition-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-commands.success-result-carries-state-transition-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-commands +--- +# Success result carries state transition fields + +## Intent + +- outcome: Executable scenario "Success result carries state transition fields" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-013-failure-result-with-error-code-carries-message-and-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-013-failure-result-with-error-code-carries-message-and-state.sdp.md new file mode 100644 index 00000000..af930471 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-013-failure-result-with-error-code-carries-message-and-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-commands.failure-result-with-error-code-carries-message-and-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-commands +--- +# Failure result with error code carries message and state + +## Intent + +- outcome: Executable scenario "Failure result with error code carries message and state" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-014-failure-result-without-current-state-for-agent-not-found.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-014-failure-result-without-current-state-for-agent-not-found.sdp.md new file mode 100644 index 00000000..a8b03ae3 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-014-failure-result-without-current-state-for-agent-not-found.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-commands.failure-result-without-current-state-for-agent-not-found +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-commands +--- +# Failure result without currentState for agent not found + +## Intent + +- outcome: Executable scenario "Failure result without currentState for agent not found" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-015-discriminated-union-narrows-to-success-branch.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-015-discriminated-union-narrows-to-success-branch.sdp.md new file mode 100644 index 00000000..b79fd5e0 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-015-discriminated-union-narrows-to-success-branch.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-commands.discriminated-union-narrows-to-success-branch +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-commands +--- +# Discriminated union narrows to success branch + +## Intent + +- outcome: Executable scenario "Discriminated union narrows to success branch" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-016-discriminated-union-narrows-to-failure-branch.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-016-discriminated-union-narrows-to-failure-branch.sdp.md new file mode 100644 index 00000000..08f9ec63 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-016-discriminated-union-narrows-to-failure-branch.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-commands.discriminated-union-narrows-to-failure-branch +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-commands +--- +# Discriminated union narrows to failure branch + +## Intent + +- outcome: Executable scenario "Discriminated union narrows to failure branch" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-017-all-lifecycle-validators-are-exported.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-017-all-lifecycle-validators-are-exported.sdp.md new file mode 100644 index 00000000..064d9505 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-017-all-lifecycle-validators-are-exported.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-commands.all-lifecycle-validators-are-exported +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-commands +--- +# All lifecycle validators are exported + +## Intent + +- outcome: Executable scenario "All lifecycle validators are exported" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-001-agent-lifecycle-states-contains-all-four-states.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-001-agent-lifecycle-states-contains-all-four-states.sdp.md new file mode 100644 index 00000000..95176849 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-001-agent-lifecycle-states-contains-all-four-states.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm.agent-lifecycle-states-contains-all-four-states +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-fsm +--- +# AGENT_LIFECYCLE_STATES contains all four states + +## Intent + +- outcome: Executable scenario "AGENT_LIFECYCLE_STATES contains all four states" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-002-agent-lifecycle-events-contains-all-seven-events.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-002-agent-lifecycle-events-contains-all-seven-events.sdp.md new file mode 100644 index 00000000..6b829958 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-002-agent-lifecycle-events-contains-all-seven-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm.agent-lifecycle-events-contains-all-seven-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-fsm +--- +# AGENT_LIFECYCLE_EVENTS contains all seven events + +## Intent + +- outcome: Executable scenario "AGENT_LIFECYCLE_EVENTS contains all seven events" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-003-transition-agent-state-returns-correct-target-for-every-valid-transition.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-003-transition-agent-state-returns-correct-target-for-every-valid-transition.sdp.md new file mode 100644 index 00000000..3a3d4aeb --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-003-transition-agent-state-returns-correct-target-for-every-valid-transition.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm.transition-agent-state-returns-correct-target-for-every-valid-transition +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-fsm +--- +# transitionAgentState returns correct target for every valid transition + +## Intent + +- outcome: Executable scenario "transitionAgentState returns correct target for every valid transition" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-004-is-valid-agent-transition-returns-true-for-every-valid-pair.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-004-is-valid-agent-transition-returns-true-for-every-valid-pair.sdp.md new file mode 100644 index 00000000..d8cefabc --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-004-is-valid-agent-transition-returns-true-for-every-valid-pair.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm.is-valid-agent-transition-returns-true-for-every-valid-pair +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-fsm +--- +# isValidAgentTransition returns true for every valid pair + +## Intent + +- outcome: Executable scenario "isValidAgentTransition returns true for every valid pair" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-005-transition-agent-state-returns-null-for-representative-invalid-pairs.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-005-transition-agent-state-returns-null-for-representative-invalid-pairs.sdp.md new file mode 100644 index 00000000..e802f616 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-005-transition-agent-state-returns-null-for-representative-invalid-pairs.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm.transition-agent-state-returns-null-for-representative-invalid-pairs +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-fsm +--- +# transitionAgentState returns null for representative invalid pairs + +## Intent + +- outcome: Executable scenario "transitionAgentState returns null for representative invalid pairs" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-006-exactly-18-invalid-pairs-exist-and-all-return-false.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-006-exactly-18-invalid-pairs-exist-and-all-return-false.sdp.md new file mode 100644 index 00000000..3ce2089c --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-006-exactly-18-invalid-pairs-exist-and-all-return-false.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm.exactly-18-invalid-pairs-exist-and-all-return-false +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-fsm +--- +# Exactly 18 invalid pairs exist and all return false + +## Intent + +- outcome: Executable scenario "Exactly 18 invalid pairs exist and all return false" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-007-exactly-18-invalid-pairs-return-null-from-transition-agent-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-007-exactly-18-invalid-pairs-return-null-from-transition-agent-state.sdp.md new file mode 100644 index 00000000..98bf564d --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-007-exactly-18-invalid-pairs-return-null-from-transition-agent-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm.exactly-18-invalid-pairs-return-null-from-transition-agent-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-fsm +--- +# Exactly 18 invalid pairs return null from transitionAgentState + +## Intent + +- outcome: Executable scenario "Exactly 18 invalid pairs return null from transitionAgentState" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-008-assert-valid-agent-transition-returns-next-state-for-valid-transitions.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-008-assert-valid-agent-transition-returns-next-state-for-valid-transitions.sdp.md new file mode 100644 index 00000000..8ee0b77f --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-008-assert-valid-agent-transition-returns-next-state-for-valid-transitions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm.assert-valid-agent-transition-returns-next-state-for-valid-transitions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-fsm +--- +# assertValidAgentTransition returns next state for valid transitions + +## Intent + +- outcome: Executable scenario "assertValidAgentTransition returns next state for valid transitions" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-009-assert-valid-agent-transition-throws-for-invalid-transition.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-009-assert-valid-agent-transition-throws-for-invalid-transition.sdp.md new file mode 100644 index 00000000..ecb18c77 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-009-assert-valid-agent-transition-throws-for-invalid-transition.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm.assert-valid-agent-transition-throws-for-invalid-transition +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-fsm +--- +# assertValidAgentTransition throws for invalid transition + +## Intent + +- outcome: Executable scenario "assertValidAgentTransition throws for invalid transition" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-010-assert-valid-agent-transition-error-message-includes-details.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-010-assert-valid-agent-transition-error-message-includes-details.sdp.md new file mode 100644 index 00000000..066b66b8 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-010-assert-valid-agent-transition-error-message-includes-details.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm.assert-valid-agent-transition-error-message-includes-details +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-fsm +--- +# assertValidAgentTransition error message includes details + +## Intent + +- outcome: Executable scenario "assertValidAgentTransition error message includes details" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-011-get-valid-agent-events-from-returns-correct-events-for-stopped.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-011-get-valid-agent-events-from-returns-correct-events-for-stopped.sdp.md new file mode 100644 index 00000000..a50ec654 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-011-get-valid-agent-events-from-returns-correct-events-for-stopped.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm.get-valid-agent-events-from-returns-correct-events-for-stopped +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-fsm +--- +# getValidAgentEventsFrom returns correct events for stopped + +## Intent + +- outcome: Executable scenario "getValidAgentEventsFrom returns correct events for stopped" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-012-get-valid-agent-events-from-returns-correct-events-for-active.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-012-get-valid-agent-events-from-returns-correct-events-for-active.sdp.md new file mode 100644 index 00000000..3d789cb8 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-012-get-valid-agent-events-from-returns-correct-events-for-active.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm.get-valid-agent-events-from-returns-correct-events-for-active +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-fsm +--- +# getValidAgentEventsFrom returns correct events for active + +## Intent + +- outcome: Executable scenario "getValidAgentEventsFrom returns correct events for active" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-013-get-valid-agent-events-from-returns-correct-events-for-paused.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-013-get-valid-agent-events-from-returns-correct-events-for-paused.sdp.md new file mode 100644 index 00000000..38b8255e --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-013-get-valid-agent-events-from-returns-correct-events-for-paused.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm.get-valid-agent-events-from-returns-correct-events-for-paused +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-fsm +--- +# getValidAgentEventsFrom returns correct events for paused + +## Intent + +- outcome: Executable scenario "getValidAgentEventsFrom returns correct events for paused" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-014-get-valid-agent-events-from-returns-correct-events-for-error-recovery.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-014-get-valid-agent-events-from-returns-correct-events-for-error-recovery.sdp.md new file mode 100644 index 00000000..af3aff4e --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-014-get-valid-agent-events-from-returns-correct-events-for-error-recovery.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm.get-valid-agent-events-from-returns-correct-events-for-error-recovery +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-fsm +--- +# getValidAgentEventsFrom returns correct events for error_recovery + +## Intent + +- outcome: Executable scenario "getValidAgentEventsFrom returns correct events for error_recovery" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-015-get-all-agent-transitions-returns-exactly-10-transitions.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-015-get-all-agent-transitions-returns-exactly-10-transitions.sdp.md new file mode 100644 index 00000000..eb2990eb --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-015-get-all-agent-transitions-returns-exactly-10-transitions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm.get-all-agent-transitions-returns-exactly-10-transitions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-fsm +--- +# getAllAgentTransitions returns exactly 10 transitions + +## Intent + +- outcome: Executable scenario "getAllAgentTransitions returns exactly 10 transitions" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-016-each-transition-has-from-event-and-to-fields.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-016-each-transition-has-from-event-and-to-fields.sdp.md new file mode 100644 index 00000000..a0d1606d --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-016-each-transition-has-from-event-and-to-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm.each-transition-has-from-event-and-to-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-fsm +--- +# Each transition has from event and to fields + +## Intent + +- outcome: Executable scenario "Each transition has from event and to fields" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-017-get-all-agent-transitions-contains-specific-transitions.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-017-get-all-agent-transitions-contains-specific-transitions.sdp.md new file mode 100644 index 00000000..83940c03 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-017-get-all-agent-transitions-contains-specific-transitions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm.get-all-agent-transitions-contains-specific-transitions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-fsm +--- +# getAllAgentTransitions contains specific transitions + +## Intent + +- outcome: Executable scenario "getAllAgentTransitions contains specific transitions" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-018-get-all-agent-transitions-returns-same-reference-each-call.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-018-get-all-agent-transitions-returns-same-reference-each-call.sdp.md new file mode 100644 index 00000000..33b1ad69 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-018-get-all-agent-transitions-returns-same-reference-each-call.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm.get-all-agent-transitions-returns-same-reference-each-call +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-fsm +--- +# getAllAgentTransitions returns same reference each call + +## Intent + +- outcome: Executable scenario "getAllAgentTransitions returns same reference each call" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-019-is-agent-error-state-returns-correct-classification-for-all-states.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-019-is-agent-error-state-returns-correct-classification-for-all-states.sdp.md new file mode 100644 index 00000000..f54a3273 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-019-is-agent-error-state-returns-correct-classification-for-all-states.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm.is-agent-error-state-returns-correct-classification-for-all-states +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-fsm +--- +# isAgentErrorState returns correct classification for all states + +## Intent + +- outcome: Executable scenario "isAgentErrorState returns correct classification for all states" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-020-is-agent-processing-state-returns-correct-classification-for-all-states.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-020-is-agent-processing-state-returns-correct-classification-for-all-states.sdp.md new file mode 100644 index 00000000..92b4e9cb --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-020-is-agent-processing-state-returns-correct-classification-for-all-states.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm.is-agent-processing-state-returns-correct-classification-for-all-states +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-fsm +--- +# isAgentProcessingState returns correct classification for all states + +## Intent + +- outcome: Executable scenario "isAgentProcessingState returns correct classification for all states" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-021-command-to-event-maps-known-commands-and-returns-null-for-unknown.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-021-command-to-event-maps-known-commands-and-returns-null-for-unknown.sdp.md new file mode 100644 index 00000000..1d695386 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-021-command-to-event-maps-known-commands-and-returns-null-for-unknown.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-fsm.command-to-event-maps-known-commands-and-returns-null-for-unknown +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-fsm +--- +# commandToEvent maps known commands and returns null for unknown + +## Intent + +- outcome: Executable scenario "commandToEvent maps known commands and returns null for unknown" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-001-happy-path-stopped-to-active-with-agent-started-audit.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-001-happy-path-stopped-to-active-with-agent-started-audit.sdp.md new file mode 100644 index 00000000..9a112f38 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-001-happy-path-stopped-to-active-with-agent-started-audit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-handlers.happy-path-stopped-to-active-with-agent-started-audit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-handlers +--- +# Happy path - stopped to active with AgentStarted audit + +## Intent + +- outcome: Executable scenario "Happy path - stopped to active with AgentStarted audit" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-002-rejects-start-from-active-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-002-rejects-start-from-active-state.sdp.md new file mode 100644 index 00000000..c8d440fe --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-002-rejects-start-from-active-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-handlers.rejects-start-from-active-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-handlers +--- +# Rejects START from active state + +## Intent + +- outcome: Executable scenario "Rejects START from active state" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-003-rejects-start-from-paused-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-003-rejects-start-from-paused-state.sdp.md new file mode 100644 index 00000000..8f16d6de --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-003-rejects-start-from-paused-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-handlers.rejects-start-from-paused-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-handlers +--- +# Rejects START from paused state + +## Intent + +- outcome: Executable scenario "Rejects START from paused state" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-004-happy-path-active-to-paused-with-agent-paused-audit-and-reason.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-004-happy-path-active-to-paused-with-agent-paused-audit-and-reason.sdp.md new file mode 100644 index 00000000..34add0df --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-004-happy-path-active-to-paused-with-agent-paused-audit-and-reason.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-handlers.happy-path-active-to-paused-with-agent-paused-audit-and-reason +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-handlers +--- +# Happy path - active to paused with AgentPaused audit and reason + +## Intent + +- outcome: Executable scenario "Happy path - active to paused with AgentPaused audit and reason" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-005-rejects-pause-from-stopped-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-005-rejects-pause-from-stopped-state.sdp.md new file mode 100644 index 00000000..679fd401 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-005-rejects-pause-from-stopped-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-handlers.rejects-pause-from-stopped-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-handlers +--- +# Rejects PAUSE from stopped state + +## Intent + +- outcome: Executable scenario "Rejects PAUSE from stopped state" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-006-happy-path-paused-to-active-with-agent-resumed-audit.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-006-happy-path-paused-to-active-with-agent-resumed-audit.sdp.md new file mode 100644 index 00000000..28b06aa7 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-006-happy-path-paused-to-active-with-agent-resumed-audit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-handlers.happy-path-paused-to-active-with-agent-resumed-audit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-handlers +--- +# Happy path - paused to active with AgentResumed audit + +## Intent + +- outcome: Executable scenario "Happy path - paused to active with AgentResumed audit" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-007-rejects-resume-from-stopped-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-007-rejects-resume-from-stopped-state.sdp.md new file mode 100644 index 00000000..1e1919a8 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-007-rejects-resume-from-stopped-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-handlers.rejects-resume-from-stopped-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-handlers +--- +# Rejects RESUME from stopped state + +## Intent + +- outcome: Executable scenario "Rejects RESUME from stopped state" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-008-happy-path-active-to-stopped-with-agent-stopped-audit.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-008-happy-path-active-to-stopped-with-agent-stopped-audit.sdp.md new file mode 100644 index 00000000..30c4f484 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-008-happy-path-active-to-stopped-with-agent-stopped-audit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-handlers.happy-path-active-to-stopped-with-agent-stopped-audit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-handlers +--- +# Happy path - active to stopped with AgentStopped audit + +## Intent + +- outcome: Executable scenario "Happy path - active to stopped with AgentStopped audit" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-009-happy-path-paused-to-stopped-as-universal-escape-hatch.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-009-happy-path-paused-to-stopped-as-universal-escape-hatch.sdp.md new file mode 100644 index 00000000..4bd6e4b0 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-009-happy-path-paused-to-stopped-as-universal-escape-hatch.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-handlers.happy-path-paused-to-stopped-as-universal-escape-hatch +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-handlers +--- +# Happy path - paused to stopped as universal escape hatch + +## Intent + +- outcome: Executable scenario "Happy path - paused to stopped as universal escape hatch" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-010-happy-path-error-recovery-to-stopped.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-010-happy-path-error-recovery-to-stopped.sdp.md new file mode 100644 index 00000000..49c1d0bd --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-010-happy-path-error-recovery-to-stopped.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-handlers.happy-path-error-recovery-to-stopped +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-handlers +--- +# Happy path - error_recovery to stopped + +## Intent + +- outcome: Executable scenario "Happy path - error_recovery to stopped" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-011-rejects-stop-from-already-stopped-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-011-rejects-stop-from-already-stopped-state.sdp.md new file mode 100644 index 00000000..c8979efa --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-011-rejects-stop-from-already-stopped-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-handlers.rejects-stop-from-already-stopped-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-handlers +--- +# Rejects STOP from already stopped state + +## Intent + +- outcome: Executable scenario "Rejects STOP from already stopped state" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-012-reconfigures-active-agent-with-merged-overrides.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-012-reconfigures-active-agent-with-merged-overrides.sdp.md new file mode 100644 index 00000000..669915e1 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-012-reconfigures-active-agent-with-merged-overrides.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-handlers.reconfigures-active-agent-with-merged-overrides +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-handlers +--- +# Reconfigures active agent with merged overrides + +## Intent + +- outcome: Executable scenario "Reconfigures active agent with merged overrides" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-013-reconfigures-paused-agent-transitioning-to-active.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-013-reconfigures-paused-agent-transitioning-to-active.sdp.md new file mode 100644 index 00000000..d2bd6ba9 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-013-reconfigures-paused-agent-transitioning-to-active.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-handlers.reconfigures-paused-agent-transitioning-to-active +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-handlers +--- +# Reconfigures paused agent transitioning to active + +## Intent + +- outcome: Executable scenario "Reconfigures paused agent transitioning to active" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-014-rejects-reconfigure-from-stopped-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-014-rejects-reconfigure-from-stopped-state.sdp.md new file mode 100644 index 00000000..ae015f7a --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-014-rejects-reconfigure-from-stopped-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-handlers.rejects-reconfigure-from-stopped-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-handlers +--- +# Rejects RECONFIGURE from stopped state + +## Intent + +- outcome: Executable scenario "Rejects RECONFIGURE from stopped state" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-015-handles-first-time-config-overrides-when-checkpoint-has-none.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-015-handles-first-time-config-overrides-when-checkpoint-has-none.sdp.md new file mode 100644 index 00000000..0cd37fe1 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-015-handles-first-time-config-overrides-when-checkpoint-has-none.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-handlers.handles-first-time-config-overrides-when-checkpoint-has-none +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-handlers +--- +# Handles first-time config overrides when checkpoint has none + +## Intent + +- outcome: Executable scenario "Handles first-time config overrides when checkpoint has none" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-016-factory-returns-all-5-handler-functions.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-016-factory-returns-all-5-handler-functions.sdp.md new file mode 100644 index 00000000..67a06015 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-016-factory-returns-all-5-handler-functions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-handlers.factory-returns-all-5-handler-functions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-handlers +--- +# Factory returns all 5 handler functions + +## Intent + +- outcome: Executable scenario "Factory returns all 5 handler functions" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-017-factory-handlers-complete-a-start-pause-stop-round-trip.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-017-factory-handlers-complete-a-start-pause-stop-round-trip.sdp.md new file mode 100644 index 00000000..a94e12d7 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-017-factory-handlers-complete-a-start-pause-stop-round-trip.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-handlers.factory-handlers-complete-a-start-pause-stop-round-trip +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-handlers +--- +# Factory handlers complete a start-pause-stop round trip + +## Intent + +- outcome: Executable scenario "Factory handlers complete a start-pause-stop round trip" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-018-uses-no-op-logger-when-none-provided.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-018-uses-no-op-logger-when-none-provided.sdp.md new file mode 100644 index 00000000..321e4819 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-018-uses-no-op-logger-when-none-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-handlers.uses-no-op-logger-when-none-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-handlers +--- +# Uses no-op logger when none provided + +## Intent + +- outcome: Executable scenario "Uses no-op logger when none provided" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-019-logs-warning-on-invalid-transition.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-019-logs-warning-on-invalid-transition.sdp.md new file mode 100644 index 00000000..27905216 --- /dev/null +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-019-logs-warning-on-invalid-transition.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.lifecycle-handlers.logs-warning-on-invalid-transition +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.lifecycle-handlers +--- +# Logs warning on invalid transition + +## Intent + +- outcome: Executable scenario "Logs warning on invalid transition" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-001-returns-immediately-without-calling-any-mutations.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-001-returns-immediately-without-calling-any-mutations.sdp.md new file mode 100644 index 00000000..fc5f5c1b --- /dev/null +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-001-returns-immediately-without-calling-any-mutations.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.oncomplete-handler.returns-immediately-without-calling-any-mutations +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.oncomplete-handler +--- +# Returns immediately without calling any mutations + +## Intent + +- outcome: Executable scenario "Returns immediately without calling any mutations" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-002-records-dead-letter-and-audit-event-but-does-not-advance-checkpoint.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-002-records-dead-letter-and-audit-event-but-does-not-advance-checkpoint.sdp.md new file mode 100644 index 00000000..a921782a --- /dev/null +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-002-records-dead-letter-and-audit-event-but-does-not-advance-checkpoint.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.oncomplete-handler.records-dead-letter-and-audit-event-but-does-not-advance-checkpoint +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.oncomplete-handler +--- +# Records dead letter and audit event but does not advance checkpoint + +## Intent + +- outcome: Executable scenario "Records dead letter and audit event but does not advance checkpoint" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-003-advances-checkpoint-when-return-value-is-null.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-003-advances-checkpoint-when-return-value-is-null.sdp.md new file mode 100644 index 00000000..1696ae89 --- /dev/null +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-003-advances-checkpoint-when-return-value-is-null.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.oncomplete-handler.advances-checkpoint-when-return-value-is-null +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.oncomplete-handler +--- +# Advances checkpoint when returnValue is null + +## Intent + +- outcome: Executable scenario "Advances checkpoint when returnValue is null" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-004-persists-in-correct-order-when-requires-approval-is-true.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-004-persists-in-correct-order-when-requires-approval-is-true.sdp.md new file mode 100644 index 00000000..b5903acb --- /dev/null +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-004-persists-in-correct-order-when-requires-approval-is-true.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.oncomplete-handler.persists-in-correct-order-when-requires-approval-is-true +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.oncomplete-handler +--- +# Persists in correct order when requiresApproval is true + +## Intent + +- outcome: Executable scenario "Persists in correct order when requiresApproval is true" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-005-updates-checkpoint-with-correct-args.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-005-updates-checkpoint-with-correct-args.sdp.md new file mode 100644 index 00000000..89cd483e --- /dev/null +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-005-updates-checkpoint-with-correct-args.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.oncomplete-handler.updates-checkpoint-with-correct-args +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.oncomplete-handler +--- +# Updates checkpoint with correct args + +## Intent + +- outcome: Executable scenario "Updates checkpoint with correct args" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-006-uses-default-24h-timeout-for-approval-expires-at.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-006-uses-default-24h-timeout-for-approval-expires-at.sdp.md new file mode 100644 index 00000000..7473db74 --- /dev/null +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-006-uses-default-24h-timeout-for-approval-expires-at.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.oncomplete-handler.uses-default-24h-timeout-for-approval-expires-at +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.oncomplete-handler +--- +# Uses default 24h timeout for approval expiresAt + +## Intent + +- outcome: Executable scenario "Uses default 24h timeout for approval expiresAt" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-007-records-command-but-not-approval-when-requires-approval-is-false.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-007-records-command-but-not-approval-when-requires-approval-is-false.sdp.md new file mode 100644 index 00000000..ed99fc1f --- /dev/null +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-007-records-command-but-not-approval-when-requires-approval-is-false.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.oncomplete-handler.records-command-but-not-approval-when-requires-approval-is-false +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.oncomplete-handler +--- +# Records command but not approval when requiresApproval is false + +## Intent + +- outcome: Executable scenario "Records command but not approval when requiresApproval is false" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-008-does-not-create-approval-when-requires-approval-is-true-but-command-is-nul.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-008-does-not-create-approval-when-requires-approval-is-true-but-command-is-nul.sdp.md new file mode 100644 index 00000000..64014c08 --- /dev/null +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-008-does-not-create-approval-when-requires-approval-is-true-but-command-is-nul.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.oncomplete-handler.does-not-create-approval-when-requires-approval-is-true-but-command-is-null +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.oncomplete-handler +--- +# Does not create approval when requiresApproval is true but command is null + +## Intent + +- outcome: Executable scenario "Does not create approval when requiresApproval is true but command is null" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-009-uses-custom-approval-timeout-ms-for-approval-expires-at.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-009-uses-custom-approval-timeout-ms-for-approval-expires-at.sdp.md new file mode 100644 index 00000000..e7212d27 --- /dev/null +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-009-uses-custom-approval-timeout-ms-for-approval-expires-at.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.oncomplete-handler.uses-custom-approval-timeout-ms-for-approval-expires-at +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.oncomplete-handler +--- +# Uses custom approvalTimeoutMs for approval expiresAt + +## Intent + +- outcome: Executable scenario "Uses custom approvalTimeoutMs for approval expiresAt" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-010-records-audit-and-checkpoint-but-skips-command-and-approval.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-010-records-audit-and-checkpoint-but-skips-command-and-approval.sdp.md new file mode 100644 index 00000000..4b266313 --- /dev/null +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-010-records-audit-and-checkpoint-but-skips-command-and-approval.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.oncomplete-handler.records-audit-and-checkpoint-but-skips-command-and-approval +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.oncomplete-handler +--- +# Records audit and checkpoint but skips command and approval + +## Intent + +- outcome: Executable scenario "Records audit and checkpoint but skips command and approval" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-011-skips-when-checkpoint-position-equals-event-position.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-011-skips-when-checkpoint-position-equals-event-position.sdp.md new file mode 100644 index 00000000..ee49cd93 --- /dev/null +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-011-skips-when-checkpoint-position-equals-event-position.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.oncomplete-handler.skips-when-checkpoint-position-equals-event-position +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.oncomplete-handler +--- +# Skips when checkpoint position equals event position + +## Intent + +- outcome: Executable scenario "Skips when checkpoint position equals event position" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-012-catches-checkpoint-error-and-creates-dead-letter-instead-of-throwing.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-012-catches-checkpoint-error-and-creates-dead-letter-instead-of-throwing.sdp.md new file mode 100644 index 00000000..37dfb655 --- /dev/null +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-012-catches-checkpoint-error-and-creates-dead-letter-instead-of-throwing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.oncomplete-handler.catches-checkpoint-error-and-creates-dead-letter-instead-of-throwing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.oncomplete-handler +--- +# Catches checkpoint error and creates dead letter instead of throwing + +## Intent + +- outcome: Executable scenario "Catches checkpoint error and creates dead letter instead of throwing" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-013-dead-letters-and-skips-checkpoint-when-audit-persistence-fails.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-013-dead-letters-and-skips-checkpoint-when-audit-persistence-fails.sdp.md new file mode 100644 index 00000000..3ff24dfe --- /dev/null +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-013-dead-letters-and-skips-checkpoint-when-audit-persistence-fails.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.oncomplete-handler.dead-letters-and-skips-checkpoint-when-audit-persistence-fails +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.oncomplete-handler +--- +# Dead-letters and skips checkpoint when audit persistence fails + +## Intent + +- outcome: Executable scenario "Dead-letters and skips checkpoint when audit persistence fails" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-014-dead-letters-and-skips-checkpoint-when-command-persistence-fails.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-014-dead-letters-and-skips-checkpoint-when-command-persistence-fails.sdp.md new file mode 100644 index 00000000..4692edb8 --- /dev/null +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-014-dead-letters-and-skips-checkpoint-when-command-persistence-fails.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.oncomplete-handler.dead-letters-and-skips-checkpoint-when-command-persistence-fails +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.oncomplete-handler +--- +# Dead-letters and skips checkpoint when command persistence fails + +## Intent + +- outcome: Executable scenario "Dead-letters and skips checkpoint when command persistence fails" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-015-dead-letters-and-skips-checkpoint-when-approval-persistence-fails.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-015-dead-letters-and-skips-checkpoint-when-approval-persistence-fails.sdp.md new file mode 100644 index 00000000..6f7dcec2 --- /dev/null +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-015-dead-letters-and-skips-checkpoint-when-approval-persistence-fails.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.oncomplete-handler.dead-letters-and-skips-checkpoint-when-approval-persistence-fails +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.oncomplete-handler +--- +# Dead-letters and skips checkpoint when approval persistence fails + +## Intent + +- outcome: Executable scenario "Dead-letters and skips checkpoint when approval persistence fails" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-016-success-persistence-calls-include-verification-proofs.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-016-success-persistence-calls-include-verification-proofs.sdp.md new file mode 100644 index 00000000..ecf97313 --- /dev/null +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-016-success-persistence-calls-include-verification-proofs.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.oncomplete-handler.success-persistence-calls-include-verification-proofs +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.oncomplete-handler +--- +# Success persistence calls include verification proofs + +## Intent + +- outcome: Executable scenario "Success persistence calls include verification proofs" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-017-does-not-throw-even-when-dead-letter-recording-also-fails.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-017-does-not-throw-even-when-dead-letter-recording-also-fails.sdp.md new file mode 100644 index 00000000..d8a035fa --- /dev/null +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-017-does-not-throw-even-when-dead-letter-recording-also-fails.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.oncomplete-handler.does-not-throw-even-when-dead-letter-recording-also-fails +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.oncomplete-handler +--- +# Does not throw even when dead letter recording also fails + +## Intent + +- outcome: Executable scenario "Does not throw even when dead letter recording also fails" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-018-does-not-throw-when-failed-result-dead-letter-recording-fails.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-018-does-not-throw-when-failed-result-dead-letter-recording-fails.sdp.md new file mode 100644 index 00000000..d5e37a27 --- /dev/null +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-018-does-not-throw-when-failed-result-dead-letter-recording-fails.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.oncomplete-handler.does-not-throw-when-failed-result-dead-letter-recording-fails +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.oncomplete-handler +--- +# Does not throw when failed result dead letter recording fails + +## Intent + +- outcome: Executable scenario "Does not throw when failed result dead letter recording fails" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-001-define-rule-based-pattern.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-001-define-rule-based-pattern.sdp.md new file mode 100644 index 00000000..5f16746b --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-001-define-rule-based-pattern.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-detection.define-rule-based-pattern +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-detection +--- +# Define rule-based pattern + +## Intent + +- outcome: Executable scenario "Define rule-based pattern" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-002-define-llm-analyzed-pattern.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-002-define-llm-analyzed-pattern.sdp.md new file mode 100644 index 00000000..9c6cba3a --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-002-define-llm-analyzed-pattern.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-detection.define-llm-analyzed-pattern +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-detection +--- +# Define LLM-analyzed pattern + +## Intent + +- outcome: Executable scenario "Define LLM-analyzed pattern" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-003-window-respects-time-boundary.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-003-window-respects-time-boundary.sdp.md new file mode 100644 index 00000000..84307af6 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-003-window-respects-time-boundary.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-detection.window-respects-time-boundary +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-detection +--- +# Window respects time boundary + +## Intent + +- outcome: Executable scenario "Window respects time boundary" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-004-window-respects-event-limit.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-004-window-respects-event-limit.sdp.md new file mode 100644 index 00000000..d177089d --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-004-window-respects-event-limit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-detection.window-respects-event-limit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-detection +--- +# Window respects event limit + +## Intent + +- outcome: Executable scenario "Window respects event limit" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-005-empty-window-returns-no-patterns.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-005-empty-window-returns-no-patterns.sdp.md new file mode 100644 index 00000000..a2c310ec --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-005-empty-window-returns-no-patterns.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-detection.empty-window-returns-no-patterns +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-detection +--- +# Empty window returns no patterns + +## Intent + +- outcome: Executable scenario "Empty window returns no patterns" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-006-pattern-window-loads-events-lazily-for-memory-efficiency.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-006-pattern-window-loads-events-lazily-for-memory-efficiency.sdp.md new file mode 100644 index 00000000..81991a62 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-006-pattern-window-loads-events-lazily-for-memory-efficiency.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-detection.pattern-window-loads-events-lazily-for-memory-efficiency +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-detection +--- +# Pattern window loads events lazily for memory efficiency + +## Intent + +- outcome: Executable scenario "Pattern window loads events lazily for memory efficiency" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-007-detect-churn-risk-from-cancellations.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-007-detect-churn-risk-from-cancellations.sdp.md new file mode 100644 index 00000000..d2f8494e --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-007-detect-churn-risk-from-cancellations.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-detection.detect-churn-risk-from-cancellations +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-detection +--- +# Detect ChurnRisk from cancellations + +## Intent + +- outcome: Executable scenario "Detect ChurnRisk from cancellations" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-008-detect-fraud-risk-from-frequency-anomaly.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-008-detect-fraud-risk-from-frequency-anomaly.sdp.md new file mode 100644 index 00000000..40dfba65 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-008-detect-fraud-risk-from-frequency-anomaly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-detection.detect-fraud-risk-from-frequency-anomaly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-detection +--- +# Detect FraudRisk from frequency anomaly + +## Intent + +- outcome: Executable scenario "Detect FraudRisk from frequency anomaly" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-009-no-pattern-when-threshold-not-met.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-009-no-pattern-when-threshold-not-met.sdp.md new file mode 100644 index 00000000..070407a7 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-009-no-pattern-when-threshold-not-met.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-detection.no-pattern-when-threshold-not-met +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-detection +--- +# No pattern when threshold not met + +## Intent + +- outcome: Executable scenario "No pattern when threshold not met" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-010-llm-analyzes-event-sequence.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-010-llm-analyzes-event-sequence.sdp.md new file mode 100644 index 00000000..7c66218a --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-010-llm-analyzes-event-sequence.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-detection.llm-analyzes-event-sequence +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-detection +--- +# LLM analyzes event sequence + +## Intent + +- outcome: Executable scenario "LLM analyzes event sequence" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-011-llm-response-includes-suggested-action.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-011-llm-response-includes-suggested-action.sdp.md new file mode 100644 index 00000000..b57930d9 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-011-llm-response-includes-suggested-action.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-detection.llm-response-includes-suggested-action +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-detection +--- +# LLM response includes suggested action + +## Intent + +- outcome: Executable scenario "LLM response includes suggested action" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-012-llm-timeout-handled-gracefully.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-012-llm-timeout-handled-gracefully.sdp.md new file mode 100644 index 00000000..aa923652 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-012-llm-timeout-handled-gracefully.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-detection.llm-timeout-handled-gracefully +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-detection +--- +# LLM timeout handled gracefully + +## Intent + +- outcome: Executable scenario "LLM timeout handled gracefully" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-001-returns-null-matched-pattern-and-null-decision-for-empty-patterns-array.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-001-returns-null-matched-pattern-and-null-decision-for-empty-patterns-array.sdp.md new file mode 100644 index 00000000..56b6cd7f --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-001-returns-null-matched-pattern-and-null-decision-for-empty-patterns-array.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.returns-null-matched-pattern-and-null-decision-for-empty-patterns-array +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Returns null matchedPattern and null decision for empty patterns array + +## Intent + +- outcome: Executable scenario "Returns null matchedPattern and null decision for empty patterns array" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-002-returns-rule-based-decision-when-trigger-returns-true-and-no-analyze.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-002-returns-rule-based-decision-when-trigger-returns-true-and-no-analyze.sdp.md new file mode 100644 index 00000000..fd498cc0 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-002-returns-rule-based-decision-when-trigger-returns-true-and-no-analyze.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.returns-rule-based-decision-when-trigger-returns-true-and-no-analyze +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Returns rule-based decision when trigger returns true and no analyze + +## Intent + +- outcome: Executable scenario "Returns rule-based decision when trigger returns true and no analyze" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-003-skips-pattern-when-trigger-returns-false.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-003-skips-pattern-when-trigger-returns-false.sdp.md new file mode 100644 index 00000000..e78f7796 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-003-skips-pattern-when-trigger-returns-false.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.skips-pattern-when-trigger-returns-false +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Skips pattern when trigger returns false + +## Intent + +- outcome: Executable scenario "Skips pattern when trigger returns false" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-004-returns-llm-decision-when-analyze-returns-detected.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-004-returns-llm-decision-when-analyze-returns-detected.sdp.md new file mode 100644 index 00000000..e84c440d --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-004-returns-llm-decision-when-analyze-returns-detected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.returns-llm-decision-when-analyze-returns-detected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Returns llm decision when analyze returns detected + +## Intent + +- outcome: Executable scenario "Returns llm decision when analyze returns detected" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-005-continues-to-next-pattern-when-analyze-returns-not-detected.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-005-continues-to-next-pattern-when-analyze-returns-not-detected.sdp.md new file mode 100644 index 00000000..bb877686 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-005-continues-to-next-pattern-when-analyze-returns-not-detected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.continues-to-next-pattern-when-analyze-returns-not-detected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Continues to next pattern when analyze returns not detected + +## Intent + +- outcome: Executable scenario "Continues to next pattern when analyze returns not detected" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-006-propagates-error-when-analyze-throws.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-006-propagates-error-when-analyze-throws.sdp.md new file mode 100644 index 00000000..c7bc6214 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-006-propagates-error-when-analyze-throws.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.propagates-error-when-analyze-throws +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Propagates error when analyze throws + +## Intent + +- outcome: Executable scenario "Propagates error when analyze throws" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-007-stops-after-first-matching-pattern.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-007-stops-after-first-matching-pattern.sdp.md new file mode 100644 index 00000000..584ab8fa --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-007-stops-after-first-matching-pattern.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.stops-after-first-matching-pattern +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Stops after first matching pattern + +## Intent + +- outcome: Executable scenario "Stops after first matching pattern" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-008-falls-through-to-second-pattern-when-first-trigger-is-false.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-008-falls-through-to-second-pattern-when-first-trigger-is-false.sdp.md new file mode 100644 index 00000000..cd08705f --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-008-falls-through-to-second-pattern-when-first-trigger-is-false.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.falls-through-to-second-pattern-when-first-trigger-is-false +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Falls through to second pattern when first trigger is false + +## Intent + +- outcome: Executable scenario "Falls through to second pattern when first trigger is false" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-009-skips-pattern-when-min-events-is-not-met.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-009-skips-pattern-when-min-events-is-not-met.sdp.md new file mode 100644 index 00000000..83aa8c2b --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-009-skips-pattern-when-min-events-is-not-met.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.skips-pattern-when-min-events-is-not-met +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Skips pattern when minEvents is not met + +## Intent + +- outcome: Executable scenario "Skips pattern when minEvents is not met" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-010-processes-pattern-when-min-events-is-met.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-010-processes-pattern-when-min-events-is-met.sdp.md new file mode 100644 index 00000000..4614fe4f --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-010-processes-pattern-when-min-events-is-met.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.processes-pattern-when-min-events-is-met +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Processes pattern when minEvents is met + +## Intent + +- outcome: Executable scenario "Processes pattern when minEvents is met" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-011-excludes-events-outside-the-pattern-window.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-011-excludes-events-outside-the-pattern-window.sdp.md new file mode 100644 index 00000000..266169e7 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-011-excludes-events-outside-the-pattern-window.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.excludes-events-outside-the-pattern-window +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Excludes events outside the pattern window + +## Intent + +- outcome: Executable scenario "Excludes events outside the pattern window" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-012-returns-no-match-when-all-events-are-outside-the-window.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-012-returns-no-match-when-all-events-are-outside-the-window.sdp.md new file mode 100644 index 00000000..4d84c43f --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-012-returns-no-match-when-all-events-are-outside-the-window.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.returns-no-match-when-all-events-are-outside-the-window +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Returns no match when all events are outside the window + +## Intent + +- outcome: Executable scenario "Returns no match when all events are outside the window" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-013-extracts-command-type-from-analysis-result.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-013-extracts-command-type-from-analysis-result.sdp.md new file mode 100644 index 00000000..a664f9fe --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-013-extracts-command-type-from-analysis-result.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.extracts-command-type-from-analysis-result +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Extracts command type from analysis result + +## Intent + +- outcome: Executable scenario "Extracts command type from analysis result" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-014-returns-null-command-when-no-command-present.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-014-returns-null-command-when-no-command-present.sdp.md new file mode 100644 index 00000000..4afefe54 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-014-returns-null-command-when-no-command-present.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.returns-null-command-when-no-command-present +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Returns null command when no command present + +## Intent + +- outcome: Executable scenario "Returns null command when no command present" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-015-uses-command-payload-when-command-is-present.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-015-uses-command-payload-when-command-is-present.sdp.md new file mode 100644 index 00000000..535b1c8d --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-015-uses-command-payload-when-command-is-present.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.uses-command-payload-when-command-is-present +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Uses command payload when command is present + +## Intent + +- outcome: Executable scenario "Uses command payload when command is present" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-016-uses-result-data-as-payload-when-no-command-present.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-016-uses-result-data-as-payload-when-no-command-present.sdp.md new file mode 100644 index 00000000..c7614e17 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-016-uses-result-data-as-payload-when-no-command-present.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.uses-result-data-as-payload-when-no-command-present +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Uses result data as payload when no command present + +## Intent + +- outcome: Executable scenario "Uses result data as payload when no command present" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-017-requires-approval-when-confidence-is-below-threshold.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-017-requires-approval-when-confidence-is-below-threshold.sdp.md new file mode 100644 index 00000000..57cececf --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-017-requires-approval-when-confidence-is-below-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.requires-approval-when-confidence-is-below-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Requires approval when confidence is below threshold + +## Intent + +- outcome: Executable scenario "Requires approval when confidence is below threshold" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-018-does-not-require-approval-when-confidence-meets-threshold.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-018-does-not-require-approval-when-confidence-meets-threshold.sdp.md new file mode 100644 index 00000000..75ba7970 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-018-does-not-require-approval-when-confidence-meets-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.does-not-require-approval-when-confidence-meets-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Does not require approval when confidence meets threshold + +## Intent + +- outcome: Executable scenario "Does not require approval when confidence meets threshold" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-019-does-not-require-approval-when-confidence-equals-threshold.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-019-does-not-require-approval-when-confidence-equals-threshold.sdp.md new file mode 100644 index 00000000..935a8057 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-019-does-not-require-approval-when-confidence-equals-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.does-not-require-approval-when-confidence-equals-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Does not require approval when confidence equals threshold + +## Intent + +- outcome: Executable scenario "Does not require approval when confidence equals threshold" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-020-always-requires-approval-when-no-command-is-present.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-020-always-requires-approval-when-no-command-is-present.sdp.md new file mode 100644 index 00000000..6f266785 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-020-always-requires-approval-when-no-command-is-present.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.always-requires-approval-when-no-command-is-present +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Always requires approval when no command is present + +## Intent + +- outcome: Executable scenario "Always requires approval when no command is present" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-021-forces-approval-when-command-is-in-requires-approval-list.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-021-forces-approval-when-command-is-in-requires-approval-list.sdp.md new file mode 100644 index 00000000..2f3576e0 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-021-forces-approval-when-command-is-in-requires-approval-list.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.forces-approval-when-command-is-in-requires-approval-list +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Forces approval when command is in requiresApproval list + +## Intent + +- outcome: Executable scenario "Forces approval when command is in requiresApproval list" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-022-skips-approval-when-command-is-in-auto-approve-list.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-022-skips-approval-when-command-is-in-auto-approve-list.sdp.md new file mode 100644 index 00000000..90b929a0 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-022-skips-approval-when-command-is-in-auto-approve-list.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.skips-approval-when-command-is-in-auto-approve-list +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Skips approval when command is in autoApprove list + +## Intent + +- outcome: Executable scenario "Skips approval when command is in autoApprove list" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-023-requires-approval-takes-precedence-over-auto-approve-for-same-command.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-023-requires-approval-takes-precedence-over-auto-approve-for-same-command.sdp.md new file mode 100644 index 00000000..91883254 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-023-requires-approval-takes-precedence-over-auto-approve-for-same-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.requires-approval-takes-precedence-over-auto-approve-for-same-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# requiresApproval takes precedence over autoApprove for same command + +## Intent + +- outcome: Executable scenario "requiresApproval takes precedence over autoApprove for same command" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-024-returns-null-command-for-trigger-only-decision.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-024-returns-null-command-for-trigger-only-decision.sdp.md new file mode 100644 index 00000000..9097e26e --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-024-returns-null-command-for-trigger-only-decision.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.returns-null-command-for-trigger-only-decision +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Returns null command for trigger-only decision + +## Intent + +- outcome: Executable scenario "Returns null command for trigger-only decision" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-025-always-requires-approval-for-trigger-only-decision.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-025-always-requires-approval-for-trigger-only-decision.sdp.md new file mode 100644 index 00000000..f3c7d589 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-025-always-requires-approval-for-trigger-only-decision.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.always-requires-approval-for-trigger-only-decision +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Always requires approval for trigger-only decision + +## Intent + +- outcome: Executable scenario "Always requires approval for trigger-only decision" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-026-includes-pattern-name-in-trigger-decision-reason.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-026-includes-pattern-name-in-trigger-decision-reason.sdp.md new file mode 100644 index 00000000..b1b2f76d --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-026-includes-pattern-name-in-trigger-decision-reason.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.includes-pattern-name-in-trigger-decision-reason +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Includes pattern name in trigger decision reason + +## Intent + +- outcome: Executable scenario "Includes pattern name in trigger decision reason" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-027-includes-event-count-in-trigger-decision-reason.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-027-includes-event-count-in-trigger-decision-reason.sdp.md new file mode 100644 index 00000000..18418f1b --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-027-includes-event-count-in-trigger-decision-reason.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.includes-event-count-in-trigger-decision-reason +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Includes event count in trigger decision reason + +## Intent + +- outcome: Executable scenario "Includes event count in trigger decision reason" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-028-includes-all-event-i-ds-in-triggering-events.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-028-includes-all-event-i-ds-in-triggering-events.sdp.md new file mode 100644 index 00000000..6ebdb5da --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-028-includes-all-event-i-ds-in-triggering-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.includes-all-event-i-ds-in-triggering-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Includes all event IDs in triggeringEvents + +## Intent + +- outcome: Executable scenario "Includes all event IDs in triggeringEvents" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-029-returns-0-6-confidence-for-1-event.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-029-returns-0-6-confidence-for-1-event.sdp.md new file mode 100644 index 00000000..4f809b44 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-029-returns-0-6-confidence-for-1-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.returns-0-6-confidence-for-1-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Returns 0.6 confidence for 1 event + +## Intent + +- outcome: Executable scenario "Returns 0.6 confidence for 1 event" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-030-returns-0-7-confidence-for-2-events.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-030-returns-0-7-confidence-for-2-events.sdp.md new file mode 100644 index 00000000..da64446c --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-030-returns-0-7-confidence-for-2-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.returns-0-7-confidence-for-2-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Returns 0.7 confidence for 2 events + +## Intent + +- outcome: Executable scenario "Returns 0.7 confidence for 2 events" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-031-returns-0-8-confidence-for-3-events.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-031-returns-0-8-confidence-for-3-events.sdp.md new file mode 100644 index 00000000..d4dd56ba --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-031-returns-0-8-confidence-for-3-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.returns-0-8-confidence-for-3-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Returns 0.8 confidence for 3 events + +## Intent + +- outcome: Executable scenario "Returns 0.8 confidence for 3 events" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-032-caps-at-0-85-for-4-events.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-032-caps-at-0-85-for-4-events.sdp.md new file mode 100644 index 00000000..4f848ded --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-032-caps-at-0-85-for-4-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.caps-at-0-85-for-4-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Caps at 0.85 for 4 events + +## Intent + +- outcome: Executable scenario "Caps at 0.85 for 4 events" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-033-caps-at-0-85-for-10-events.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-033-caps-at-0-85-for-10-events.sdp.md new file mode 100644 index 00000000..0ddacb76 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-033-caps-at-0-85-for-10-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.caps-at-0-85-for-10-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Caps at 0.85 for 10 events + +## Intent + +- outcome: Executable scenario "Caps at 0.85 for 10 events" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-034-returns-0-5-for-0-events-edge-case.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-034-returns-0-5-for-0-events-edge-case.sdp.md new file mode 100644 index 00000000..e8d3eb20 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-034-returns-0-5-for-0-events-edge-case.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-executor.returns-0-5-for-0-events-edge-case +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-executor +--- +# Returns 0.5 for 0 events edge case + +## Intent + +- outcome: Executable scenario "Returns 0.5 for 0 events edge case" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-001-error-codes-object-contains-all-expected-codes.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-001-error-codes-object-contains-all-expected-codes.sdp.md new file mode 100644 index 00000000..d2c5a284 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-001-error-codes-object-contains-all-expected-codes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-registry.error-codes-object-contains-all-expected-codes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-registry +--- +# Error codes object contains all expected codes + +## Intent + +- outcome: Executable scenario "Error codes object contains all expected codes" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-002-single-valid-pattern-passes.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-002-single-valid-pattern-passes.sdp.md new file mode 100644 index 00000000..d023e5ba --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-002-single-valid-pattern-passes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-registry.single-valid-pattern-passes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-registry +--- +# Single valid pattern passes + +## Intent + +- outcome: Executable scenario "Single valid pattern passes" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-003-multiple-patterns-with-unique-names-pass.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-003-multiple-patterns-with-unique-names-pass.sdp.md new file mode 100644 index 00000000..ef861442 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-003-multiple-patterns-with-unique-names-pass.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-registry.multiple-patterns-with-unique-names-pass +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-registry +--- +# Multiple patterns with unique names pass + +## Intent + +- outcome: Executable scenario "Multiple patterns with unique names pass" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-004-patterns-with-different-window-configurations-pass.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-004-patterns-with-different-window-configurations-pass.sdp.md new file mode 100644 index 00000000..c25a878b --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-004-patterns-with-different-window-configurations-pass.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-registry.patterns-with-different-window-configurations-pass +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-registry +--- +# Patterns with different window configurations pass + +## Intent + +- outcome: Executable scenario "Patterns with different window configurations pass" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-005-pattern-with-analyze-function-passes.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-005-pattern-with-analyze-function-passes.sdp.md new file mode 100644 index 00000000..e0bdb2ff --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-005-pattern-with-analyze-function-passes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-registry.pattern-with-analyze-function-passes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-registry +--- +# Pattern with analyze function passes + +## Intent + +- outcome: Executable scenario "Pattern with analyze function passes" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-006-empty-array-returns-valid.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-006-empty-array-returns-valid.sdp.md new file mode 100644 index 00000000..00e3b4dd --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-006-empty-array-returns-valid.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-registry.empty-array-returns-valid +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-registry +--- +# Empty array returns valid + +## Intent + +- outcome: Executable scenario "Empty array returns valid" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-007-two-patterns-with-same-name-fail.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-007-two-patterns-with-same-name-fail.sdp.md new file mode 100644 index 00000000..9fabf80d --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-007-two-patterns-with-same-name-fail.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-registry.two-patterns-with-same-name-fail +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-registry +--- +# Two patterns with same name fail + +## Intent + +- outcome: Executable scenario "Two patterns with same name fail" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-008-duplicate-detected-in-middle-of-array.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-008-duplicate-detected-in-middle-of-array.sdp.md new file mode 100644 index 00000000..f2a99859 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-008-duplicate-detected-in-middle-of-array.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-registry.duplicate-detected-in-middle-of-array +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-registry +--- +# Duplicate detected in middle of array + +## Intent + +- outcome: Executable scenario "Duplicate detected in middle of array" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-009-short-circuits-on-first-duplicate-found.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-009-short-circuits-on-first-duplicate-found.sdp.md new file mode 100644 index 00000000..8cd28e70 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-009-short-circuits-on-first-duplicate-found.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-registry.short-circuits-on-first-duplicate-found +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-registry +--- +# Short-circuits on first duplicate found + +## Intent + +- outcome: Executable scenario "Short-circuits on first duplicate found" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-010-empty-name-fails-with-pattern-name-required.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-010-empty-name-fails-with-pattern-name-required.sdp.md new file mode 100644 index 00000000..5d279fc0 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-010-empty-name-fails-with-pattern-name-required.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-registry.empty-name-fails-with-pattern-name-required +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-registry +--- +# Empty name fails with PATTERN_NAME_REQUIRED + +## Intent + +- outcome: Executable scenario "Empty name fails with PATTERN_NAME_REQUIRED" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-011-whitespace-only-name-fails-with-pattern-name-required.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-011-whitespace-only-name-fails-with-pattern-name-required.sdp.md new file mode 100644 index 00000000..f848621c --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-011-whitespace-only-name-fails-with-pattern-name-required.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-registry.whitespace-only-name-fails-with-pattern-name-required +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-registry +--- +# Whitespace-only name fails with PATTERN_NAME_REQUIRED + +## Intent + +- outcome: Executable scenario "Whitespace-only name fails with PATTERN_NAME_REQUIRED" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-012-invalid-pattern-short-circuits-before-duplicate-check.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-012-invalid-pattern-short-circuits-before-duplicate-check.sdp.md new file mode 100644 index 00000000..3d590e73 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-012-invalid-pattern-short-circuits-before-duplicate-check.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-registry.invalid-pattern-short-circuits-before-duplicate-check +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-registry +--- +# Invalid pattern short-circuits before duplicate check + +## Intent + +- outcome: Executable scenario "Invalid pattern short-circuits before duplicate check" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-013-pattern-without-trigger-function-fails.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-013-pattern-without-trigger-function-fails.sdp.md new file mode 100644 index 00000000..2292bc2b --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-013-pattern-without-trigger-function-fails.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-registry.pattern-without-trigger-function-fails +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-registry +--- +# Pattern without trigger function fails + +## Intent + +- outcome: Executable scenario "Pattern without trigger function fails" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-014-pattern-with-non-function-trigger-fails.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-014-pattern-with-non-function-trigger-fails.sdp.md new file mode 100644 index 00000000..86950e80 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-014-pattern-with-non-function-trigger-fails.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-registry.pattern-with-non-function-trigger-fails +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-registry +--- +# Pattern with non-function trigger fails + +## Intent + +- outcome: Executable scenario "Pattern with non-function trigger fails" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-015-pattern-name-required-maps-to-registry-pattern-name-required.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-015-pattern-name-required-maps-to-registry-pattern-name-required.sdp.md new file mode 100644 index 00000000..ee1950b7 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-015-pattern-name-required-maps-to-registry-pattern-name-required.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-registry.pattern-name-required-maps-to-registry-pattern-name-required +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-registry +--- +# PATTERN_NAME_REQUIRED maps to registry PATTERN_NAME_REQUIRED + +## Intent + +- outcome: Executable scenario "PATTERN_NAME_REQUIRED maps to registry PATTERN_NAME_REQUIRED" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-016-trigger-required-maps-to-registry-trigger-required.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-016-trigger-required-maps-to-registry-trigger-required.sdp.md new file mode 100644 index 00000000..f358eb3b --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-016-trigger-required-maps-to-registry-trigger-required.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-registry.trigger-required-maps-to-registry-trigger-required +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-registry +--- +# TRIGGER_REQUIRED maps to registry TRIGGER_REQUIRED + +## Intent + +- outcome: Executable scenario "TRIGGER_REQUIRED maps to registry TRIGGER_REQUIRED" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-017-unknown-pattern-error-codes-map-to-invalid-pattern.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-017-unknown-pattern-error-codes-map-to-invalid-pattern.sdp.md new file mode 100644 index 00000000..2103fbd5 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-017-unknown-pattern-error-codes-map-to-invalid-pattern.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-registry.unknown-pattern-error-codes-map-to-invalid-pattern +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-registry +--- +# Unknown pattern error codes map to INVALID_PATTERN + +## Intent + +- outcome: Executable scenario "Unknown pattern error codes map to INVALID_PATTERN" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-018-accepts-readonly-array-input.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-018-accepts-readonly-array-input.sdp.md new file mode 100644 index 00000000..76d3ea8c --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-018-accepts-readonly-array-input.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-registry.accepts-readonly-array-input +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-registry +--- +# Accepts readonly array input + +## Intent + +- outcome: Executable scenario "Accepts readonly array input" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-019-error-result-has-correct-discriminated-union-shape.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-019-error-result-has-correct-discriminated-union-shape.sdp.md new file mode 100644 index 00000000..a2821d49 --- /dev/null +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-019-error-result-has-correct-discriminated-union-shape.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.pattern-registry.error-result-has-correct-discriminated-union-shape +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.pattern-registry +--- +# Error result has correct discriminated union shape + +## Intent + +- outcome: Executable scenario "Error result has correct discriminated union shape" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-001-error-codes-contain-all-expected-values.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-001-error-codes-contain-all-expected-values.sdp.md new file mode 100644 index 00000000..dae79db5 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-001-error-codes-contain-all-expected-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.error-codes-contain-all-expected-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Error codes contain all expected values + +## Intent + +- outcome: Executable scenario "Error codes contain all expected values" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-002-accepts-valid-window-with-duration-only.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-002-accepts-valid-window-with-duration-only.sdp.md new file mode 100644 index 00000000..7319a3f9 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-002-accepts-valid-window-with-duration-only.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.accepts-valid-window-with-duration-only +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Accepts valid window with duration only + +## Intent + +- outcome: Executable scenario "Accepts valid window with duration only" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-003-accepts-window-with-all-optional-fields.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-003-accepts-window-with-all-optional-fields.sdp.md new file mode 100644 index 00000000..8df7aa21 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-003-accepts-window-with-all-optional-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.accepts-window-with-all-optional-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Accepts window with all optional fields + +## Intent + +- outcome: Executable scenario "Accepts window with all optional fields" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-004-rejects-window-with-empty-duration.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-004-rejects-window-with-empty-duration.sdp.md new file mode 100644 index 00000000..0f6710fe --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-004-rejects-window-with-empty-duration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.rejects-window-with-empty-duration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Rejects window with empty duration + +## Intent + +- outcome: Executable scenario "Rejects window with empty duration" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-005-rejects-window-with-missing-duration.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-005-rejects-window-with-missing-duration.sdp.md new file mode 100644 index 00000000..9061f358 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-005-rejects-window-with-missing-duration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.rejects-window-with-missing-duration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Rejects window with missing duration + +## Intent + +- outcome: Executable scenario "Rejects window with missing duration" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-006-rejects-window-with-non-positive-event-limit.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-006-rejects-window-with-non-positive-event-limit.sdp.md new file mode 100644 index 00000000..4bed69e2 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-006-rejects-window-with-non-positive-event-limit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.rejects-window-with-non-positive-event-limit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Rejects window with non-positive eventLimit + +## Intent + +- outcome: Executable scenario "Rejects window with non-positive eventLimit" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-007-rejects-window-with-negative-event-limit.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-007-rejects-window-with-negative-event-limit.sdp.md new file mode 100644 index 00000000..5f2949c4 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-007-rejects-window-with-negative-event-limit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.rejects-window-with-negative-event-limit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Rejects window with negative eventLimit + +## Intent + +- outcome: Executable scenario "Rejects window with negative eventLimit" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-008-rejects-window-with-non-positive-min-events.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-008-rejects-window-with-non-positive-min-events.sdp.md new file mode 100644 index 00000000..672fbc16 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-008-rejects-window-with-non-positive-min-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.rejects-window-with-non-positive-min-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Rejects window with non-positive minEvents + +## Intent + +- outcome: Executable scenario "Rejects window with non-positive minEvents" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-009-rejects-window-with-non-positive-load-batch-size.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-009-rejects-window-with-non-positive-load-batch-size.sdp.md new file mode 100644 index 00000000..44233b27 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-009-rejects-window-with-non-positive-load-batch-size.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.rejects-window-with-non-positive-load-batch-size +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Rejects window with non-positive loadBatchSize + +## Intent + +- outcome: Executable scenario "Rejects window with non-positive loadBatchSize" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-010-rejects-window-with-non-integer-event-limit.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-010-rejects-window-with-non-integer-event-limit.sdp.md new file mode 100644 index 00000000..395e135f --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-010-rejects-window-with-non-integer-event-limit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.rejects-window-with-non-integer-event-limit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Rejects window with non-integer eventLimit + +## Intent + +- outcome: Executable scenario "Rejects window with non-integer eventLimit" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-011-parses-days-format-correctly.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-011-parses-days-format-correctly.sdp.md new file mode 100644 index 00000000..763a713c --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-011-parses-days-format-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.parses-days-format-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Parses days format correctly + +## Intent + +- outcome: Executable scenario "Parses days format correctly" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-012-parses-hours-format-correctly.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-012-parses-hours-format-correctly.sdp.md new file mode 100644 index 00000000..7bf892e3 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-012-parses-hours-format-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.parses-hours-format-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Parses hours format correctly + +## Intent + +- outcome: Executable scenario "Parses hours format correctly" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-013-parses-minutes-format-correctly.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-013-parses-minutes-format-correctly.sdp.md new file mode 100644 index 00000000..15b2fad5 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-013-parses-minutes-format-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.parses-minutes-format-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Parses minutes format correctly + +## Intent + +- outcome: Executable scenario "Parses minutes format correctly" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-014-handles-uppercase-units.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-014-handles-uppercase-units.sdp.md new file mode 100644 index 00000000..70166754 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-014-handles-uppercase-units.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.handles-uppercase-units +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Handles uppercase units + +## Intent + +- outcome: Executable scenario "Handles uppercase units" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-015-returns-null-for-invalid-formats.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-015-returns-null-for-invalid-formats.sdp.md new file mode 100644 index 00000000..51b64816 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-015-returns-null-for-invalid-formats.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-null-for-invalid-formats +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns null for invalid formats + +## Intent + +- outcome: Executable scenario "Returns null for invalid formats" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-016-trims-leading-and-trailing-whitespace.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-016-trims-leading-and-trailing-whitespace.sdp.md new file mode 100644 index 00000000..c0aea55c --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-016-trims-leading-and-trailing-whitespace.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.trims-leading-and-trailing-whitespace +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Trims leading and trailing whitespace + +## Intent + +- outcome: Executable scenario "Trims leading and trailing whitespace" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-017-returns-true-for-valid-duration-formats.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-017-returns-true-for-valid-duration-formats.sdp.md new file mode 100644 index 00000000..b41901cb --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-017-returns-true-for-valid-duration-formats.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-true-for-valid-duration-formats +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns true for valid duration formats + +## Intent + +- outcome: Executable scenario "Returns true for valid duration formats" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-018-returns-false-for-invalid-duration-formats.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-018-returns-false-for-invalid-duration-formats.sdp.md new file mode 100644 index 00000000..1c0f150f --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-018-returns-false-for-invalid-duration-formats.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-false-for-invalid-duration-formats +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns false for invalid duration formats + +## Intent + +- outcome: Executable scenario "Returns false for invalid duration formats" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-019-returns-invalid-when-name-is-missing.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-019-returns-invalid-when-name-is-missing.sdp.md new file mode 100644 index 00000000..673acc78 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-019-returns-invalid-when-name-is-missing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-name-is-missing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns invalid when name is missing + +## Intent + +- outcome: Executable scenario "Returns invalid when name is missing" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-020-returns-invalid-when-name-is-empty-string.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-020-returns-invalid-when-name-is-empty-string.sdp.md new file mode 100644 index 00000000..84aedff0 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-020-returns-invalid-when-name-is-empty-string.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-name-is-empty-string +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns invalid when name is empty string + +## Intent + +- outcome: Executable scenario "Returns invalid when name is empty string" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-021-returns-invalid-when-name-is-whitespace-only.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-021-returns-invalid-when-name-is-whitespace-only.sdp.md new file mode 100644 index 00000000..68e20875 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-021-returns-invalid-when-name-is-whitespace-only.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-name-is-whitespace-only +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns invalid when name is whitespace only + +## Intent + +- outcome: Executable scenario "Returns invalid when name is whitespace only" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-022-returns-invalid-when-trigger-is-missing.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-022-returns-invalid-when-trigger-is-missing.sdp.md new file mode 100644 index 00000000..4166b5b3 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-022-returns-invalid-when-trigger-is-missing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-trigger-is-missing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns invalid when trigger is missing + +## Intent + +- outcome: Executable scenario "Returns invalid when trigger is missing" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-023-returns-invalid-when-trigger-is-not-a-function.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-023-returns-invalid-when-trigger-is-not-a-function.sdp.md new file mode 100644 index 00000000..23cd0aa7 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-023-returns-invalid-when-trigger-is-not-a-function.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-trigger-is-not-a-function +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns invalid when trigger is not a function + +## Intent + +- outcome: Executable scenario "Returns invalid when trigger is not a function" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-024-returns-invalid-when-duration-format-is-invalid.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-024-returns-invalid-when-duration-format-is-invalid.sdp.md new file mode 100644 index 00000000..e17f900e --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-024-returns-invalid-when-duration-format-is-invalid.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-duration-format-is-invalid +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns invalid when duration format is invalid + +## Intent + +- outcome: Executable scenario "Returns invalid when duration format is invalid" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-025-returns-invalid-when-duration-is-empty.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-025-returns-invalid-when-duration-is-empty.sdp.md new file mode 100644 index 00000000..c9aaf270 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-025-returns-invalid-when-duration-is-empty.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-duration-is-empty +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns invalid when duration is empty + +## Intent + +- outcome: Executable scenario "Returns invalid when duration is empty" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-026-returns-invalid-when-event-limit-is-non-positive.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-026-returns-invalid-when-event-limit-is-non-positive.sdp.md new file mode 100644 index 00000000..7d080c2f --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-026-returns-invalid-when-event-limit-is-non-positive.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-event-limit-is-non-positive +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns invalid when eventLimit is non-positive + +## Intent + +- outcome: Executable scenario "Returns invalid when eventLimit is non-positive" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-027-returns-invalid-when-event-limit-is-negative.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-027-returns-invalid-when-event-limit-is-negative.sdp.md new file mode 100644 index 00000000..2a179cfc --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-027-returns-invalid-when-event-limit-is-negative.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-event-limit-is-negative +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns invalid when eventLimit is negative + +## Intent + +- outcome: Executable scenario "Returns invalid when eventLimit is negative" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-028-returns-invalid-when-event-limit-is-not-an-integer.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-028-returns-invalid-when-event-limit-is-not-an-integer.sdp.md new file mode 100644 index 00000000..fbfec731 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-028-returns-invalid-when-event-limit-is-not-an-integer.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-event-limit-is-not-an-integer +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns invalid when eventLimit is not an integer + +## Intent + +- outcome: Executable scenario "Returns invalid when eventLimit is not an integer" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-029-returns-invalid-when-min-events-is-non-positive.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-029-returns-invalid-when-min-events-is-non-positive.sdp.md new file mode 100644 index 00000000..35847287 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-029-returns-invalid-when-min-events-is-non-positive.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-min-events-is-non-positive +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns invalid when minEvents is non-positive + +## Intent + +- outcome: Executable scenario "Returns invalid when minEvents is non-positive" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-030-returns-invalid-when-load-batch-size-is-non-positive.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-030-returns-invalid-when-load-batch-size-is-non-positive.sdp.md new file mode 100644 index 00000000..45938d61 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-030-returns-invalid-when-load-batch-size-is-non-positive.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-load-batch-size-is-non-positive +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns invalid when loadBatchSize is non-positive + +## Intent + +- outcome: Executable scenario "Returns invalid when loadBatchSize is non-positive" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-031-returns-valid-for-minimal-definition.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-031-returns-valid-for-minimal-definition.sdp.md new file mode 100644 index 00000000..ec620d65 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-031-returns-valid-for-minimal-definition.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-valid-for-minimal-definition +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns valid for minimal definition + +## Intent + +- outcome: Executable scenario "Returns valid for minimal definition" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-032-returns-valid-for-complete-definition.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-032-returns-valid-for-complete-definition.sdp.md new file mode 100644 index 00000000..b930ff7d --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-032-returns-valid-for-complete-definition.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-valid-for-complete-definition +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns valid for complete definition + +## Intent + +- outcome: Executable scenario "Returns valid for complete definition" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-033-returns-valid-for-definition-with-all-window-options.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-033-returns-valid-for-definition-with-all-window-options.sdp.md new file mode 100644 index 00000000..7b782f55 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-033-returns-valid-for-definition-with-all-window-options.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-valid-for-definition-with-all-window-options +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns valid for definition with all window options + +## Intent + +- outcome: Executable scenario "Returns valid for definition with all window options" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-034-returns-the-definition-when-valid.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-034-returns-the-definition-when-valid.sdp.md new file mode 100644 index 00000000..6dfa3f87 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-034-returns-the-definition-when-valid.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-the-definition-when-valid +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns the definition when valid + +## Intent + +- outcome: Executable scenario "Returns the definition when valid" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-035-throws-error-when-name-is-missing.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-035-throws-error-when-name-is-missing.sdp.md new file mode 100644 index 00000000..f717cd79 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-035-throws-error-when-name-is-missing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.throws-error-when-name-is-missing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Throws error when name is missing + +## Intent + +- outcome: Executable scenario "Throws error when name is missing" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-036-throws-error-when-trigger-is-missing.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-036-throws-error-when-trigger-is-missing.sdp.md new file mode 100644 index 00000000..c2afbed0 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-036-throws-error-when-trigger-is-missing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.throws-error-when-trigger-is-missing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Throws error when trigger is missing + +## Intent + +- outcome: Executable scenario "Throws error when trigger is missing" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-037-throws-error-when-duration-is-invalid.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-037-throws-error-when-duration-is-invalid.sdp.md new file mode 100644 index 00000000..d9c1c183 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-037-throws-error-when-duration-is-invalid.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.throws-error-when-duration-is-invalid +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Throws error when duration is invalid + +## Intent + +- outcome: Executable scenario "Throws error when duration is invalid" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-038-includes-error-code-in-thrown-error-message.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-038-includes-error-code-in-thrown-error-message.sdp.md new file mode 100644 index 00000000..3291b2e4 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-038-includes-error-code-in-thrown-error-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.includes-error-code-in-thrown-error-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Includes error code in thrown error message + +## Intent + +- outcome: Executable scenario "Includes error code in thrown error message" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-039-calculates-boundary-for-days.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-039-calculates-boundary-for-days.sdp.md new file mode 100644 index 00000000..e4b8f825 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-039-calculates-boundary-for-days.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.calculates-boundary-for-days +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Calculates boundary for days + +## Intent + +- outcome: Executable scenario "Calculates boundary for days" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-040-calculates-boundary-for-hours.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-040-calculates-boundary-for-hours.sdp.md new file mode 100644 index 00000000..5b49e95e --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-040-calculates-boundary-for-hours.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.calculates-boundary-for-hours +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Calculates boundary for hours + +## Intent + +- outcome: Executable scenario "Calculates boundary for hours" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-041-calculates-boundary-for-minutes.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-041-calculates-boundary-for-minutes.sdp.md new file mode 100644 index 00000000..9c8c393c --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-041-calculates-boundary-for-minutes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.calculates-boundary-for-minutes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Calculates boundary for minutes + +## Intent + +- outcome: Executable scenario "Calculates boundary for minutes" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-042-uses-date-now-when-now-is-not-provided.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-042-uses-date-now-when-now-is-not-provided.sdp.md new file mode 100644 index 00000000..246da1c6 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-042-uses-date-now-when-now-is-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.uses-date-now-when-now-is-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Uses Date.now when now is not provided + +## Intent + +- outcome: Executable scenario "Uses Date.now when now is not provided" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-043-throws-error-for-invalid-duration-format.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-043-throws-error-for-invalid-duration-format.sdp.md new file mode 100644 index 00000000..f06d9fc2 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-043-throws-error-for-invalid-duration-format.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.throws-error-for-invalid-duration-format +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Throws error for invalid duration format + +## Intent + +- outcome: Executable scenario "Throws error for invalid duration format" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-044-includes-events-within-the-window.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-044-includes-events-within-the-window.sdp.md new file mode 100644 index 00000000..23f05710 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-044-includes-events-within-the-window.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.includes-events-within-the-window +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Includes events within the window + +## Intent + +- outcome: Executable scenario "Includes events within the window" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-045-excludes-events-outside-the-window.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-045-excludes-events-outside-the-window.sdp.md new file mode 100644 index 00000000..8896efd7 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-045-excludes-events-outside-the-window.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.excludes-events-outside-the-window +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Excludes events outside the window + +## Intent + +- outcome: Executable scenario "Excludes events outside the window" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-046-includes-events-exactly-at-the-boundary.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-046-includes-events-exactly-at-the-boundary.sdp.md new file mode 100644 index 00000000..c55e78e1 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-046-includes-events-exactly-at-the-boundary.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.includes-events-exactly-at-the-boundary +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Includes events exactly at the boundary + +## Intent + +- outcome: Executable scenario "Includes events exactly at the boundary" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-047-applies-event-limit-and-takes-most-recent.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-047-applies-event-limit-and-takes-most-recent.sdp.md new file mode 100644 index 00000000..524700d7 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-047-applies-event-limit-and-takes-most-recent.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.applies-event-limit-and-takes-most-recent +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Applies event limit and takes most recent + +## Intent + +- outcome: Executable scenario "Applies event limit and takes most recent" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-048-does-not-limit-when-under-event-limit.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-048-does-not-limit-when-under-event-limit.sdp.md new file mode 100644 index 00000000..0f4e45fb --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-048-does-not-limit-when-under-event-limit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.does-not-limit-when-under-event-limit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Does not limit when under event limit + +## Intent + +- outcome: Executable scenario "Does not limit when under event limit" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-049-returns-empty-array-when-no-events-match.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-049-returns-empty-array-when-no-events-match.sdp.md new file mode 100644 index 00000000..5f96858a --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-049-returns-empty-array-when-no-events-match.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-empty-array-when-no-events-match +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns empty array when no events match + +## Intent + +- outcome: Executable scenario "Returns empty array when no events match" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-050-handles-empty-events-array.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-050-handles-empty-events-array.sdp.md new file mode 100644 index 00000000..62398525 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-050-handles-empty-events-array.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.handles-empty-events-array +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Handles empty events array + +## Intent + +- outcome: Executable scenario "Handles empty events array" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-051-returns-true-when-events-count-meets-min-events.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-051-returns-true-when-events-count-meets-min-events.sdp.md new file mode 100644 index 00000000..5d98f22c --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-051-returns-true-when-events-count-meets-min-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-true-when-events-count-meets-min-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns true when events count meets minEvents + +## Intent + +- outcome: Executable scenario "Returns true when events count meets minEvents" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-052-returns-true-when-events-count-exceeds-min-events.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-052-returns-true-when-events-count-exceeds-min-events.sdp.md new file mode 100644 index 00000000..51f7b55a --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-052-returns-true-when-events-count-exceeds-min-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-true-when-events-count-exceeds-min-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns true when events count exceeds minEvents + +## Intent + +- outcome: Executable scenario "Returns true when events count exceeds minEvents" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-053-returns-false-when-events-count-is-below-min-events.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-053-returns-false-when-events-count-is-below-min-events.sdp.md new file mode 100644 index 00000000..72a983bd --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-053-returns-false-when-events-count-is-below-min-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-false-when-events-count-is-below-min-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns false when events count is below minEvents + +## Intent + +- outcome: Executable scenario "Returns false when events count is below minEvents" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-054-defaults-to-min-events-of-1.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-054-defaults-to-min-events-of-1.sdp.md new file mode 100644 index 00000000..9d06b3d6 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-054-defaults-to-min-events-of-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.defaults-to-min-events-of-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Defaults to minEvents of 1 + +## Intent + +- outcome: Executable scenario "Defaults to minEvents of 1" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-055-returns-false-for-empty-events-when-min-events-is-default.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-055-returns-false-for-empty-events-when-min-events-is-default.sdp.md new file mode 100644 index 00000000..ef905cf7 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-055-returns-false-for-empty-events-when-min-events-is-default.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-false-for-empty-events-when-min-events-is-default +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns false for empty events when minEvents is default + +## Intent + +- outcome: Executable scenario "Returns false for empty events when minEvents is default" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-056-returns-true-when-event-count-meets-threshold.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-056-returns-true-when-event-count-meets-threshold.sdp.md new file mode 100644 index 00000000..77f09777 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-056-returns-true-when-event-count-meets-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-true-when-event-count-meets-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns true when event count meets threshold + +## Intent + +- outcome: Executable scenario "Returns true when event count meets threshold" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-057-returns-true-when-event-count-exceeds-threshold.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-057-returns-true-when-event-count-exceeds-threshold.sdp.md new file mode 100644 index 00000000..df53808d --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-057-returns-true-when-event-count-exceeds-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-true-when-event-count-exceeds-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns true when event count exceeds threshold + +## Intent + +- outcome: Executable scenario "Returns true when event count exceeds threshold" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-058-returns-false-when-event-count-is-below-threshold.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-058-returns-false-when-event-count-is-below-threshold.sdp.md new file mode 100644 index 00000000..835d665b --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-058-returns-false-when-event-count-is-below-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-false-when-event-count-is-below-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns false when event count is below threshold + +## Intent + +- outcome: Executable scenario "Returns false when event count is below threshold" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-059-returns-true-when-event-type-is-present.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-059-returns-true-when-event-type-is-present.sdp.md new file mode 100644 index 00000000..785d8afc --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-059-returns-true-when-event-type-is-present.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-true-when-event-type-is-present +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns true when event type is present + +## Intent + +- outcome: Executable scenario "Returns true when event type is present" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-060-returns-false-when-event-type-is-not-present.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-060-returns-false-when-event-type-is-not-present.sdp.md new file mode 100644 index 00000000..da4e0819 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-060-returns-false-when-event-type-is-not-present.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-false-when-event-type-is-not-present +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns false when event type is not present + +## Intent + +- outcome: Executable scenario "Returns false when event type is not present" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-061-returns-true-when-any-of-multiple-event-types-is-present.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-061-returns-true-when-any-of-multiple-event-types-is-present.sdp.md new file mode 100644 index 00000000..3eff9ed8 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-061-returns-true-when-any-of-multiple-event-types-is-present.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-true-when-any-of-multiple-event-types-is-present +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns true when any of multiple event types is present + +## Intent + +- outcome: Executable scenario "Returns true when any of multiple event types is present" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-062-respects-min-count-parameter.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-062-respects-min-count-parameter.sdp.md new file mode 100644 index 00000000..c05ba0df --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-062-respects-min-count-parameter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.respects-min-count-parameter +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Respects minCount parameter + +## Intent + +- outcome: Executable scenario "Respects minCount parameter" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-063-returns-true-when-min-count-is-met.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-063-returns-true-when-min-count-is-met.sdp.md new file mode 100644 index 00000000..d8559e00 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-063-returns-true-when-min-count-is-met.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-true-when-min-count-is-met +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns true when minCount is met + +## Intent + +- outcome: Executable scenario "Returns true when minCount is met" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-064-returns-true-when-minimum-streams-are-present.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-064-returns-true-when-minimum-streams-are-present.sdp.md new file mode 100644 index 00000000..7447dcf6 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-064-returns-true-when-minimum-streams-are-present.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-true-when-minimum-streams-are-present +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns true when minimum streams are present + +## Intent + +- outcome: Executable scenario "Returns true when minimum streams are present" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-065-returns-false-when-below-minimum-streams.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-065-returns-false-when-below-minimum-streams.sdp.md new file mode 100644 index 00000000..498ab113 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-065-returns-false-when-below-minimum-streams.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-false-when-below-minimum-streams +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns false when below minimum streams + +## Intent + +- outcome: Executable scenario "Returns false when below minimum streams" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-066-counts-unique-streams-correctly.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-066-counts-unique-streams-correctly.sdp.md new file mode 100644 index 00000000..3ec4e855 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-066-counts-unique-streams-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.counts-unique-streams-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Counts unique streams correctly + +## Intent + +- outcome: Executable scenario "Counts unique streams correctly" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-067-returns-true-when-all-triggers-match.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-067-returns-true-when-all-triggers-match.sdp.md new file mode 100644 index 00000000..71234555 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-067-returns-true-when-all-triggers-match.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-true-when-all-triggers-match +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns true when ALL triggers match + +## Intent + +- outcome: Executable scenario "Returns true when ALL triggers match" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-068-returns-false-when-any-trigger-does-not-match.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-068-returns-false-when-any-trigger-does-not-match.sdp.md new file mode 100644 index 00000000..c7333be8 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-068-returns-false-when-any-trigger-does-not-match.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-false-when-any-trigger-does-not-match +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns false when ANY trigger does not match + +## Intent + +- outcome: Executable scenario "Returns false when ANY trigger does not match" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-069-returns-false-when-no-triggers-match.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-069-returns-false-when-no-triggers-match.sdp.md new file mode 100644 index 00000000..6ea236a1 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-069-returns-false-when-no-triggers-match.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-false-when-no-triggers-match +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns false when NO triggers match + +## Intent + +- outcome: Executable scenario "Returns false when NO triggers match" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-070-returns-true-for-empty-triggers-array.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-070-returns-true-for-empty-triggers-array.sdp.md new file mode 100644 index 00000000..0857f0f3 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-070-returns-true-for-empty-triggers-array.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-true-for-empty-triggers-array +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns true for empty triggers array + +## Intent + +- outcome: Executable scenario "Returns true for empty triggers array" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-071-passes-events-to-each-trigger.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-071-passes-events-to-each-trigger.sdp.md new file mode 100644 index 00000000..e66159dc --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-071-passes-events-to-each-trigger.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.passes-events-to-each-trigger +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Passes events to each trigger + +## Intent + +- outcome: Executable scenario "Passes events to each trigger" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-072-returns-true-when-any-trigger-matches.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-072-returns-true-when-any-trigger-matches.sdp.md new file mode 100644 index 00000000..09955289 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-072-returns-true-when-any-trigger-matches.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-true-when-any-trigger-matches +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns true when ANY trigger matches + +## Intent + +- outcome: Executable scenario "Returns true when ANY trigger matches" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-073-returns-true-when-all-triggers-match.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-073-returns-true-when-all-triggers-match.sdp.md new file mode 100644 index 00000000..416ad6d4 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-073-returns-true-when-all-triggers-match.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-true-when-all-triggers-match-2 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns true when ALL triggers match + +## Intent + +- outcome: Executable scenario "Returns true when ALL triggers match" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-074-returns-false-when-no-triggers-match.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-074-returns-false-when-no-triggers-match.sdp.md new file mode 100644 index 00000000..8914ee75 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-074-returns-false-when-no-triggers-match.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-false-when-no-triggers-match-2 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns false when NO triggers match + +## Intent + +- outcome: Executable scenario "Returns false when NO triggers match" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-075-returns-false-for-empty-triggers-array.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-075-returns-false-for-empty-triggers-array.sdp.md new file mode 100644 index 00000000..38b6f94d --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-075-returns-false-for-empty-triggers-array.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.returns-false-for-empty-triggers-array +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Returns false for empty triggers array + +## Intent + +- outcome: Executable scenario "Returns false for empty triggers array" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-076-short-circuits-on-first-match.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-076-short-circuits-on-first-match.sdp.md new file mode 100644 index 00000000..43f34985 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-076-short-circuits-on-first-match.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.short-circuits-on-first-match +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Short-circuits on first match + +## Intent + +- outcome: Executable scenario "Short-circuits on first match" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-077-combines-count-threshold-with-event-type-using-all.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-077-combines-count-threshold-with-event-type-using-all.sdp.md new file mode 100644 index 00000000..eee1479b --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-077-combines-count-threshold-with-event-type-using-all.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.combines-count-threshold-with-event-type-using-all +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Combines count threshold with event type using all + +## Intent + +- outcome: Executable scenario "Combines count threshold with event type using all" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-078-fails-all-when-event-type-missing-despite-count-met.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-078-fails-all-when-event-type-missing-despite-count-met.sdp.md new file mode 100644 index 00000000..488cba96 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-078-fails-all-when-event-type-missing-despite-count-met.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.fails-all-when-event-type-missing-despite-count-met +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Fails all when event type missing despite count met + +## Intent + +- outcome: Executable scenario "Fails all when event type missing despite count met" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-079-combines-any-with-count-thresholds-alert-present.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-079-combines-any-with-count-thresholds-alert-present.sdp.md new file mode 100644 index 00000000..47fb0605 --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-079-combines-any-with-count-thresholds-alert-present.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.combines-any-with-count-thresholds-alert-present +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Combines any with count thresholds - alert present + +## Intent + +- outcome: Executable scenario "Combines any with count thresholds - alert present" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-080-combines-any-with-count-thresholds-neither-condition-met.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-080-combines-any-with-count-thresholds-neither-condition-met.sdp.md new file mode 100644 index 00000000..c6c22a4f --- /dev/null +++ b/specs/behavior/platform-core/agent/patterns.examples/s-080-combines-any-with-count-thresholds-neither-condition-met.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.patterns.combines-any-with-count-thresholds-neither-condition-met +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.patterns +--- +# Combines any with count thresholds - neither condition met + +## Intent + +- outcome: Executable scenario "Combines any with count thresholds - neither condition met" from packages/platform-core/tests/features/behavior/agent/patterns.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-001-all-expected-error-codes-are-present-with-correct-values.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-001-all-expected-error-codes-are-present-with-correct-values.sdp.md new file mode 100644 index 00000000..c04f1596 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-001-all-expected-error-codes-are-present-with-correct-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.all-expected-error-codes-are-present-with-correct-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# All expected error codes are present with correct values + +## Intent + +- outcome: Executable scenario "All expected error codes are present with correct values" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-002-error-codes-object-has-exactly-8-entries.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-002-error-codes-object-has-exactly-8-entries.sdp.md new file mode 100644 index 00000000..f1a69802 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-002-error-codes-object-has-exactly-8-entries.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.error-codes-object-has-exactly-8-entries +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Error codes object has exactly 8 entries + +## Intent + +- outcome: Executable scenario "Error codes object has exactly 8 entries" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-003-accepts-valid-cost-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-003-accepts-valid-cost-budget.sdp.md new file mode 100644 index 00000000..4c10d2a0 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-003-accepts-valid-cost-budget.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.accepts-valid-cost-budget +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Accepts valid cost budget + +## Intent + +- outcome: Executable scenario "Accepts valid cost budget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-004-rejects-budget-with-zero-daily.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-004-rejects-budget-with-zero-daily.sdp.md new file mode 100644 index 00000000..9834faa6 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-004-rejects-budget-with-zero-daily.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.rejects-budget-with-zero-daily +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Rejects budget with zero daily + +## Intent + +- outcome: Executable scenario "Rejects budget with zero daily" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-005-rejects-budget-with-negative-daily.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-005-rejects-budget-with-negative-daily.sdp.md new file mode 100644 index 00000000..42664158 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-005-rejects-budget-with-negative-daily.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.rejects-budget-with-negative-daily +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Rejects budget with negative daily + +## Intent + +- outcome: Executable scenario "Rejects budget with negative daily" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-006-rejects-budget-with-alert-threshold-above-1.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-006-rejects-budget-with-alert-threshold-above-1.sdp.md new file mode 100644 index 00000000..dbbb53d3 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-006-rejects-budget-with-alert-threshold-above-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.rejects-budget-with-alert-threshold-above-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Rejects budget with alertThreshold above 1 + +## Intent + +- outcome: Executable scenario "Rejects budget with alertThreshold above 1" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-007-rejects-budget-with-negative-alert-threshold.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-007-rejects-budget-with-negative-alert-threshold.sdp.md new file mode 100644 index 00000000..0dacdb59 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-007-rejects-budget-with-negative-alert-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.rejects-budget-with-negative-alert-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Rejects budget with negative alertThreshold + +## Intent + +- outcome: Executable scenario "Rejects budget with negative alertThreshold" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-008-accepts-alert-threshold-at-boundary-0.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-008-accepts-alert-threshold-at-boundary-0.sdp.md new file mode 100644 index 00000000..4f33621d --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-008-accepts-alert-threshold-at-boundary-0.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.accepts-alert-threshold-at-boundary-0 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Accepts alertThreshold at boundary 0 + +## Intent + +- outcome: Executable scenario "Accepts alertThreshold at boundary 0" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-009-accepts-alert-threshold-at-boundary-1.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-009-accepts-alert-threshold-at-boundary-1.sdp.md new file mode 100644 index 00000000..eed3007d --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-009-accepts-alert-threshold-at-boundary-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.accepts-alert-threshold-at-boundary-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Accepts alertThreshold at boundary 1 + +## Intent + +- outcome: Executable scenario "Accepts alertThreshold at boundary 1" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-010-accepts-valid-config-with-required-fields-only.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-010-accepts-valid-config-with-required-fields-only.sdp.md new file mode 100644 index 00000000..55698a1c --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-010-accepts-valid-config-with-required-fields-only.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.accepts-valid-config-with-required-fields-only +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Accepts valid config with required fields only + +## Intent + +- outcome: Executable scenario "Accepts valid config with required fields only" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-011-accepts-config-with-all-optional-fields.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-011-accepts-config-with-all-optional-fields.sdp.md new file mode 100644 index 00000000..276295cd --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-011-accepts-config-with-all-optional-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.accepts-config-with-all-optional-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Accepts config with all optional fields + +## Intent + +- outcome: Executable scenario "Accepts config with all optional fields" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-012-rejects-config-with-zero-max-requests-per-minute.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-012-rejects-config-with-zero-max-requests-per-minute.sdp.md new file mode 100644 index 00000000..e72dda30 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-012-rejects-config-with-zero-max-requests-per-minute.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.rejects-config-with-zero-max-requests-per-minute +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Rejects config with zero maxRequestsPerMinute + +## Intent + +- outcome: Executable scenario "Rejects config with zero maxRequestsPerMinute" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-013-rejects-config-with-negative-max-requests-per-minute.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-013-rejects-config-with-negative-max-requests-per-minute.sdp.md new file mode 100644 index 00000000..83a5e56a --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-013-rejects-config-with-negative-max-requests-per-minute.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.rejects-config-with-negative-max-requests-per-minute +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Rejects config with negative maxRequestsPerMinute + +## Intent + +- outcome: Executable scenario "Rejects config with negative maxRequestsPerMinute" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-014-rejects-config-with-non-integer-max-requests-per-minute.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-014-rejects-config-with-non-integer-max-requests-per-minute.sdp.md new file mode 100644 index 00000000..076b62e4 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-014-rejects-config-with-non-integer-max-requests-per-minute.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.rejects-config-with-non-integer-max-requests-per-minute +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Rejects config with non-integer maxRequestsPerMinute + +## Intent + +- outcome: Executable scenario "Rejects config with non-integer maxRequestsPerMinute" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-015-rejects-config-with-zero-max-concurrent.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-015-rejects-config-with-zero-max-concurrent.sdp.md new file mode 100644 index 00000000..e4ded31c --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-015-rejects-config-with-zero-max-concurrent.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.rejects-config-with-zero-max-concurrent +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Rejects config with zero maxConcurrent + +## Intent + +- outcome: Executable scenario "Rejects config with zero maxConcurrent" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-016-rejects-config-with-zero-queue-depth.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-016-rejects-config-with-zero-queue-depth.sdp.md new file mode 100644 index 00000000..fadd7ab9 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-016-rejects-config-with-zero-queue-depth.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.rejects-config-with-zero-queue-depth +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Rejects config with zero queueDepth + +## Intent + +- outcome: Executable scenario "Rejects config with zero queueDepth" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-017-returns-invalid-when-max-requests-per-minute-is-undefined.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-017-returns-invalid-when-max-requests-per-minute-is-undefined.sdp.md new file mode 100644 index 00000000..3446fdea --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-017-returns-invalid-when-max-requests-per-minute-is-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-max-requests-per-minute-is-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns invalid when maxRequestsPerMinute is undefined + +## Intent + +- outcome: Executable scenario "Returns invalid when maxRequestsPerMinute is undefined" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-018-returns-invalid-when-max-requests-per-minute-is-zero.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-018-returns-invalid-when-max-requests-per-minute-is-zero.sdp.md new file mode 100644 index 00000000..3e59bd24 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-018-returns-invalid-when-max-requests-per-minute-is-zero.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-max-requests-per-minute-is-zero +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns invalid when maxRequestsPerMinute is zero + +## Intent + +- outcome: Executable scenario "Returns invalid when maxRequestsPerMinute is zero" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-019-returns-invalid-when-max-requests-per-minute-is-negative.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-019-returns-invalid-when-max-requests-per-minute-is-negative.sdp.md new file mode 100644 index 00000000..de52faf9 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-019-returns-invalid-when-max-requests-per-minute-is-negative.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-max-requests-per-minute-is-negative +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns invalid when maxRequestsPerMinute is negative + +## Intent + +- outcome: Executable scenario "Returns invalid when maxRequestsPerMinute is negative" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-020-returns-invalid-when-max-requests-per-minute-is-not-an-integer.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-020-returns-invalid-when-max-requests-per-minute-is-not-an-integer.sdp.md new file mode 100644 index 00000000..e7f27625 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-020-returns-invalid-when-max-requests-per-minute-is-not-an-integer.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-max-requests-per-minute-is-not-an-integer +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns invalid when maxRequestsPerMinute is not an integer + +## Intent + +- outcome: Executable scenario "Returns invalid when maxRequestsPerMinute is not an integer" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-021-returns-valid-for-positive-integer-max-requests-per-minute.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-021-returns-valid-for-positive-integer-max-requests-per-minute.sdp.md new file mode 100644 index 00000000..dbd9c90f --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-021-returns-valid-for-positive-integer-max-requests-per-minute.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-valid-for-positive-integer-max-requests-per-minute +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns valid for positive integer maxRequestsPerMinute + +## Intent + +- outcome: Executable scenario "Returns valid for positive integer maxRequestsPerMinute" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-022-returns-invalid-when-max-concurrent-is-zero.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-022-returns-invalid-when-max-concurrent-is-zero.sdp.md new file mode 100644 index 00000000..af6761ce --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-022-returns-invalid-when-max-concurrent-is-zero.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-max-concurrent-is-zero +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns invalid when maxConcurrent is zero + +## Intent + +- outcome: Executable scenario "Returns invalid when maxConcurrent is zero" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-023-returns-invalid-when-max-concurrent-is-negative.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-023-returns-invalid-when-max-concurrent-is-negative.sdp.md new file mode 100644 index 00000000..85d30ee8 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-023-returns-invalid-when-max-concurrent-is-negative.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-max-concurrent-is-negative +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns invalid when maxConcurrent is negative + +## Intent + +- outcome: Executable scenario "Returns invalid when maxConcurrent is negative" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-024-returns-invalid-when-max-concurrent-is-not-an-integer.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-024-returns-invalid-when-max-concurrent-is-not-an-integer.sdp.md new file mode 100644 index 00000000..af67b42a --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-024-returns-invalid-when-max-concurrent-is-not-an-integer.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-max-concurrent-is-not-an-integer +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns invalid when maxConcurrent is not an integer + +## Intent + +- outcome: Executable scenario "Returns invalid when maxConcurrent is not an integer" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-025-returns-valid-when-max-concurrent-is-undefined.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-025-returns-valid-when-max-concurrent-is-undefined.sdp.md new file mode 100644 index 00000000..f3db9065 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-025-returns-valid-when-max-concurrent-is-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-valid-when-max-concurrent-is-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns valid when maxConcurrent is undefined + +## Intent + +- outcome: Executable scenario "Returns valid when maxConcurrent is undefined" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-026-returns-invalid-when-queue-depth-is-zero.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-026-returns-invalid-when-queue-depth-is-zero.sdp.md new file mode 100644 index 00000000..eda2cbaf --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-026-returns-invalid-when-queue-depth-is-zero.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-queue-depth-is-zero +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns invalid when queueDepth is zero + +## Intent + +- outcome: Executable scenario "Returns invalid when queueDepth is zero" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-027-returns-invalid-when-queue-depth-is-negative.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-027-returns-invalid-when-queue-depth-is-negative.sdp.md new file mode 100644 index 00000000..4536208f --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-027-returns-invalid-when-queue-depth-is-negative.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-queue-depth-is-negative +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns invalid when queueDepth is negative + +## Intent + +- outcome: Executable scenario "Returns invalid when queueDepth is negative" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-028-returns-invalid-when-queue-depth-is-not-an-integer.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-028-returns-invalid-when-queue-depth-is-not-an-integer.sdp.md new file mode 100644 index 00000000..2f3dfe7f --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-028-returns-invalid-when-queue-depth-is-not-an-integer.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-queue-depth-is-not-an-integer +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns invalid when queueDepth is not an integer + +## Intent + +- outcome: Executable scenario "Returns invalid when queueDepth is not an integer" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-029-returns-invalid-when-cost-budget-daily-is-zero.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-029-returns-invalid-when-cost-budget-daily-is-zero.sdp.md new file mode 100644 index 00000000..dc3fc6f3 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-029-returns-invalid-when-cost-budget-daily-is-zero.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-cost-budget-daily-is-zero +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns invalid when costBudget daily is zero + +## Intent + +- outcome: Executable scenario "Returns invalid when costBudget daily is zero" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-030-returns-invalid-when-cost-budget-daily-is-negative.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-030-returns-invalid-when-cost-budget-daily-is-negative.sdp.md new file mode 100644 index 00000000..55937f75 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-030-returns-invalid-when-cost-budget-daily-is-negative.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-cost-budget-daily-is-negative +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns invalid when costBudget daily is negative + +## Intent + +- outcome: Executable scenario "Returns invalid when costBudget daily is negative" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-031-returns-invalid-when-cost-budget-alert-threshold-is-below-0.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-031-returns-invalid-when-cost-budget-alert-threshold-is-below-0.sdp.md new file mode 100644 index 00000000..691adfdf --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-031-returns-invalid-when-cost-budget-alert-threshold-is-below-0.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-cost-budget-alert-threshold-is-below-0 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns invalid when costBudget alertThreshold is below 0 + +## Intent + +- outcome: Executable scenario "Returns invalid when costBudget alertThreshold is below 0" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-032-returns-invalid-when-cost-budget-alert-threshold-is-above-1.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-032-returns-invalid-when-cost-budget-alert-threshold-is-above-1.sdp.md new file mode 100644 index 00000000..cbdbb862 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-032-returns-invalid-when-cost-budget-alert-threshold-is-above-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-cost-budget-alert-threshold-is-above-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns invalid when costBudget alertThreshold is above 1 + +## Intent + +- outcome: Executable scenario "Returns invalid when costBudget alertThreshold is above 1" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-033-returns-valid-when-cost-budget-is-valid.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-033-returns-valid-when-cost-budget-is-valid.sdp.md new file mode 100644 index 00000000..ffc5d3f2 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-033-returns-valid-when-cost-budget-is-valid.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-valid-when-cost-budget-is-valid +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns valid when costBudget is valid + +## Intent + +- outcome: Executable scenario "Returns valid when costBudget is valid" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-034-returns-valid-for-complete-valid-config.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-034-returns-valid-for-complete-valid-config.sdp.md new file mode 100644 index 00000000..75abf215 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-034-returns-valid-for-complete-valid-config.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-valid-for-complete-valid-config +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns valid for complete valid config + +## Intent + +- outcome: Executable scenario "Returns valid for complete valid config" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-035-default-config-has-correct-field-values.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-035-default-config-has-correct-field-values.sdp.md new file mode 100644 index 00000000..6f2fb6b6 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-035-default-config-has-correct-field-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.default-config-has-correct-field-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Default config has correct field values + +## Intent + +- outcome: Executable scenario "Default config has correct field values" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-036-default-config-passes-validation.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-036-default-config-passes-validation.sdp.md new file mode 100644 index 00000000..ec0c2d2e --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-036-default-config-passes-validation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.default-config-passes-validation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Default config passes validation + +## Intent + +- outcome: Executable scenario "Default config passes validation" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-037-creates-config-with-specified-daily-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-037-creates-config-with-specified-daily-budget.sdp.md new file mode 100644 index 00000000..527bf105 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-037-creates-config-with-specified-daily-budget.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.creates-config-with-specified-daily-budget +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Creates config with specified dailyBudget + +## Intent + +- outcome: Executable scenario "Creates config with specified dailyBudget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-038-uses-default-alert-threshold-when-not-specified.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-038-uses-default-alert-threshold-when-not-specified.sdp.md new file mode 100644 index 00000000..e0f6ef0a --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-038-uses-default-alert-threshold-when-not-specified.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.uses-default-alert-threshold-when-not-specified +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Uses default alertThreshold when not specified + +## Intent + +- outcome: Executable scenario "Uses default alertThreshold when not specified" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-039-uses-specified-alert-threshold.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-039-uses-specified-alert-threshold.sdp.md new file mode 100644 index 00000000..315980ee --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-039-uses-specified-alert-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.uses-specified-alert-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Uses specified alertThreshold + +## Intent + +- outcome: Executable scenario "Uses specified alertThreshold" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-040-uses-specified-max-requests-per-minute.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-040-uses-specified-max-requests-per-minute.sdp.md new file mode 100644 index 00000000..0da1344d --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-040-uses-specified-max-requests-per-minute.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.uses-specified-max-requests-per-minute +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Uses specified maxRequestsPerMinute + +## Intent + +- outcome: Executable scenario "Uses specified maxRequestsPerMinute" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-041-uses-default-max-requests-per-minute-when-not-specified.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-041-uses-default-max-requests-per-minute-when-not-specified.sdp.md new file mode 100644 index 00000000..4747f74b --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-041-uses-default-max-requests-per-minute-when-not-specified.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.uses-default-max-requests-per-minute-when-not-specified +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Uses default maxRequestsPerMinute when not specified + +## Intent + +- outcome: Executable scenario "Uses default maxRequestsPerMinute when not specified" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-042-includes-all-optional-fields.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-042-includes-all-optional-fields.sdp.md new file mode 100644 index 00000000..dfa08e57 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-042-includes-all-optional-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.includes-all-optional-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Includes all optional fields + +## Intent + +- outcome: Executable scenario "Includes all optional fields" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-043-creates-error-with-code-and-message.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-043-creates-error-with-code-and-message.sdp.md new file mode 100644 index 00000000..0d5d503c --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-043-creates-error-with-code-and-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.creates-error-with-code-and-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Creates error with code and message + +## Intent + +- outcome: Executable scenario "Creates error with code and message" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-044-creates-error-without-optional-fields-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-044-creates-error-without-optional-fields-when-not-provided.sdp.md new file mode 100644 index 00000000..7e426fe8 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-044-creates-error-without-optional-fields-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.creates-error-without-optional-fields-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Creates error without optional fields when not provided + +## Intent + +- outcome: Executable scenario "Creates error without optional fields when not provided" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-045-creates-error-with-retry-after-ms-when-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-045-creates-error-with-retry-after-ms-when-provided.sdp.md new file mode 100644 index 00000000..37edf0d3 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-045-creates-error-with-retry-after-ms-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.creates-error-with-retry-after-ms-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Creates error with retryAfterMs when provided + +## Intent + +- outcome: Executable scenario "Creates error with retryAfterMs when provided" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-046-creates-error-with-context-when-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-046-creates-error-with-context-when-provided.sdp.md new file mode 100644 index 00000000..dfb5008d --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-046-creates-error-with-context-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.creates-error-with-context-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Creates error with context when provided + +## Intent + +- outcome: Executable scenario "Creates error with context when provided" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-047-creates-error-with-both-retry-after-ms-and-context.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-047-creates-error-with-both-retry-after-ms-and-context.sdp.md new file mode 100644 index 00000000..cf9d3e05 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-047-creates-error-with-both-retry-after-ms-and-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.creates-error-with-both-retry-after-ms-and-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Creates error with both retryAfterMs and context + +## Intent + +- outcome: Executable scenario "Creates error with both retryAfterMs and context" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-048-returns-true-for-valid-rate-limit-error.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-048-returns-true-for-valid-rate-limit-error.sdp.md new file mode 100644 index 00000000..1b811ea1 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-048-returns-true-for-valid-rate-limit-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-true-for-valid-rate-limit-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns true for valid rate limit error + +## Intent + +- outcome: Executable scenario "Returns true for valid rate limit error" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-049-returns-true-for-all-known-error-codes.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-049-returns-true-for-all-known-error-codes.sdp.md new file mode 100644 index 00000000..068cd103 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-049-returns-true-for-all-known-error-codes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-true-for-all-known-error-codes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns true for all known error codes + +## Intent + +- outcome: Executable scenario "Returns true for all known error codes" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-050-returns-false-for-non-error-values.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-050-returns-false-for-non-error-values.sdp.md new file mode 100644 index 00000000..716b4125 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-050-returns-false-for-non-error-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-false-for-non-error-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns false for non-error values + +## Intent + +- outcome: Executable scenario "Returns false for non-error values" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-051-retryable-error-codes.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-051-retryable-error-codes.sdp.md new file mode 100644 index 00000000..9ddcccfd --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-051-retryable-error-codes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.retryable-error-codes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Retryable error codes + +## Intent + +- outcome: Executable scenario "Retryable error codes" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-052-returns-false-for-non-rate-limit-errors.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-052-returns-false-for-non-rate-limit-errors.sdp.md new file mode 100644 index 00000000..a473c72f --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-052-returns-false-for-non-rate-limit-errors.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-false-for-non-rate-limit-errors +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns false for non-rate-limit errors + +## Intent + +- outcome: Executable scenario "Returns false for non-rate-limit errors" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-053-permanent-error-codes.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-053-permanent-error-codes.sdp.md new file mode 100644 index 00000000..9b50f3b1 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-053-permanent-error-codes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.permanent-error-codes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Permanent error codes + +## Intent + +- outcome: Executable scenario "Permanent error codes" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-054-returns-false-for-non-rate-limit-errors.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-054-returns-false-for-non-rate-limit-errors.sdp.md new file mode 100644 index 00000000..35168cbb --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-054-returns-false-for-non-rate-limit-errors.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-false-for-non-rate-limit-errors-2 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns false for non-rate-limit errors + +## Intent + +- outcome: Executable scenario "Returns false for non-rate-limit errors" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-055-exponential-2-n-growth-pattern-with-math-random-mocked-to-0.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-055-exponential-2-n-growth-pattern-with-math-random-mocked-to-0.sdp.md new file mode 100644 index 00000000..29c7a048 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-055-exponential-2-n-growth-pattern-with-math-random-mocked-to-0.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.exponential-2-n-growth-pattern-with-math-random-mocked-to-0 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Exponential 2^n growth pattern with Math.random mocked to 0 + +## Intent + +- outcome: Executable scenario "Exponential 2^n growth pattern with Math.random mocked to 0" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-056-caps-at-default-max-delay-of-60000ms.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-056-caps-at-default-max-delay-of-60000ms.sdp.md new file mode 100644 index 00000000..392e22fc --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-056-caps-at-default-max-delay-of-60000ms.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.caps-at-default-max-delay-of-60000ms +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Caps at default maxDelay of 60000ms + +## Intent + +- outcome: Executable scenario "Caps at default maxDelay of 60000ms" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-057-caps-at-custom-max-delay.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-057-caps-at-custom-max-delay.sdp.md new file mode 100644 index 00000000..0ad6c19d --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-057-caps-at-custom-max-delay.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.caps-at-custom-max-delay +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Caps at custom maxDelay + +## Intent + +- outcome: Executable scenario "Caps at custom maxDelay" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-058-does-not-cap-when-delay-is-below-max.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-058-does-not-cap-when-delay-is-below-max.sdp.md new file mode 100644 index 00000000..9e1888d8 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-058-does-not-cap-when-delay-is-below-max.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.does-not-cap-when-delay-is-below-max +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Does not cap when delay is below max + +## Intent + +- outcome: Executable scenario "Does not cap when delay is below max" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-059-adds-jitter-up-to-25-of-delay.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-059-adds-jitter-up-to-25-of-delay.sdp.md new file mode 100644 index 00000000..3b664336 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-059-adds-jitter-up-to-25-of-delay.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.adds-jitter-up-to-25-of-delay +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Adds jitter up to 25% of delay + +## Intent + +- outcome: Executable scenario "Adds jitter up to 25% of delay" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-060-adds-max-jitter-of-25-when-random-is-1.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-060-adds-max-jitter-of-25-when-random-is-1.sdp.md new file mode 100644 index 00000000..4ae2bb75 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-060-adds-max-jitter-of-25-when-random-is-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.adds-max-jitter-of-25-when-random-is-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Adds max jitter of 25% when random is 1 + +## Intent + +- outcome: Executable scenario "Adds max jitter of 25% when random is 1" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-061-uses-default-base-delay-of-1000ms.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-061-uses-default-base-delay-of-1000ms.sdp.md new file mode 100644 index 00000000..0b6387a8 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-061-uses-default-base-delay-of-1000ms.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.uses-default-base-delay-of-1000ms +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Uses default base delay of 1000ms + +## Intent + +- outcome: Executable scenario "Uses default base delay of 1000ms" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-062-uses-default-max-delay-of-60000ms.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-062-uses-default-max-delay-of-60000ms.sdp.md new file mode 100644 index 00000000..a9c27a75 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-062-uses-default-max-delay-of-60000ms.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.uses-default-max-delay-of-60000ms +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Uses default max delay of 60000ms + +## Intent + +- outcome: Executable scenario "Uses default max delay of 60000ms" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-063-returns-floored-integer.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-063-returns-floored-integer.sdp.md new file mode 100644 index 00000000..cd9a6aa1 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-063-returns-floored-integer.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-floored-integer +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns floored integer + +## Intent + +- outcome: Executable scenario "Returns floored integer" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-064-returns-true-when-total-exceeds-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-064-returns-true-when-total-exceeds-budget.sdp.md new file mode 100644 index 00000000..f5ad933c --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-064-returns-true-when-total-exceeds-budget.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-true-when-total-exceeds-budget +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns true when total exceeds budget + +## Intent + +- outcome: Executable scenario "Returns true when total exceeds budget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-065-returns-false-when-total-is-under-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-065-returns-false-when-total-is-under-budget.sdp.md new file mode 100644 index 00000000..7a821438 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-065-returns-false-when-total-is-under-budget.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-false-when-total-is-under-budget +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns false when total is under budget + +## Intent + +- outcome: Executable scenario "Returns false when total is under budget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-066-returns-false-when-total-equals-budget-exactly.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-066-returns-false-when-total-equals-budget-exactly.sdp.md new file mode 100644 index 00000000..ad020614 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-066-returns-false-when-total-equals-budget-exactly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-false-when-total-equals-budget-exactly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns false when total equals budget exactly + +## Intent + +- outcome: Executable scenario "Returns false when total equals budget exactly" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-067-returns-true-when-current-spend-already-exceeds-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-067-returns-true-when-current-spend-already-exceeds-budget.sdp.md new file mode 100644 index 00000000..aff710e5 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-067-returns-true-when-current-spend-already-exceeds-budget.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-true-when-current-spend-already-exceeds-budget +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns true when current spend already exceeds budget + +## Intent + +- outcome: Executable scenario "Returns true when current spend already exceeds budget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-068-handles-zero-current-spend-under-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-068-handles-zero-current-spend-under-budget.sdp.md new file mode 100644 index 00000000..41366787 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-068-handles-zero-current-spend-under-budget.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.handles-zero-current-spend-under-budget +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Handles zero current spend under budget + +## Intent + +- outcome: Executable scenario "Handles zero current spend under budget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-069-handles-zero-current-spend-over-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-069-handles-zero-current-spend-over-budget.sdp.md new file mode 100644 index 00000000..9dcc2203 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-069-handles-zero-current-spend-over-budget.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.handles-zero-current-spend-over-budget +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Handles zero current spend over budget + +## Intent + +- outcome: Executable scenario "Handles zero current spend over budget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-070-handles-small-decimal-values-under-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-070-handles-small-decimal-values-under-budget.sdp.md new file mode 100644 index 00000000..5bacb595 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-070-handles-small-decimal-values-under-budget.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.handles-small-decimal-values-under-budget +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Handles small decimal values under budget + +## Intent + +- outcome: Executable scenario "Handles small decimal values under budget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-071-handles-small-decimal-values-over-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-071-handles-small-decimal-values-over-budget.sdp.md new file mode 100644 index 00000000..132d585e --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-071-handles-small-decimal-values-over-budget.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.handles-small-decimal-values-over-budget +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Handles small decimal values over budget + +## Intent + +- outcome: Executable scenario "Handles small decimal values over budget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-072-returns-true-when-spend-reaches-threshold-percentage.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-072-returns-true-when-spend-reaches-threshold-percentage.sdp.md new file mode 100644 index 00000000..6791dc34 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-072-returns-true-when-spend-reaches-threshold-percentage.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-true-when-spend-reaches-threshold-percentage +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns true when spend reaches threshold percentage + +## Intent + +- outcome: Executable scenario "Returns true when spend reaches threshold percentage" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-073-returns-true-when-spend-exceeds-threshold.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-073-returns-true-when-spend-exceeds-threshold.sdp.md new file mode 100644 index 00000000..ea6ce4df --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-073-returns-true-when-spend-exceeds-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-true-when-spend-exceeds-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns true when spend exceeds threshold + +## Intent + +- outcome: Executable scenario "Returns true when spend exceeds threshold" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-074-returns-false-when-spend-is-below-threshold.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-074-returns-false-when-spend-is-below-threshold.sdp.md new file mode 100644 index 00000000..8853d24f --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-074-returns-false-when-spend-is-below-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-false-when-spend-is-below-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns false when spend is below threshold + +## Intent + +- outcome: Executable scenario "Returns false when spend is below threshold" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-075-handles-threshold-of-0-always-alert.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-075-handles-threshold-of-0-always-alert.sdp.md new file mode 100644 index 00000000..e5f1b5b2 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-075-handles-threshold-of-0-always-alert.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.handles-threshold-of-0-always-alert +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Handles threshold of 0 - always alert + +## Intent + +- outcome: Executable scenario "Handles threshold of 0 - always alert" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-076-handles-threshold-of-1-below-full-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-076-handles-threshold-of-1-below-full-budget.sdp.md new file mode 100644 index 00000000..dd2b0dcb --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-076-handles-threshold-of-1-below-full-budget.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.handles-threshold-of-1-below-full-budget +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Handles threshold of 1 - below full budget + +## Intent + +- outcome: Executable scenario "Handles threshold of 1 - below full budget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-077-handles-threshold-of-1-at-full-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-077-handles-threshold-of-1-at-full-budget.sdp.md new file mode 100644 index 00000000..b8225a29 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-077-handles-threshold-of-1-at-full-budget.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.handles-threshold-of-1-at-full-budget +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Handles threshold of 1 - at full budget + +## Intent + +- outcome: Executable scenario "Handles threshold of 1 - at full budget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-078-returns-defaults-when-no-config-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-078-returns-defaults-when-no-config-provided.sdp.md new file mode 100644 index 00000000..27bf9011 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-078-returns-defaults-when-no-config-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-defaults-when-no-config-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns defaults when no config provided + +## Intent + +- outcome: Executable scenario "Returns defaults when no config provided" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-079-returns-defaults-when-undefined-config-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-079-returns-defaults-when-undefined-config-provided.sdp.md new file mode 100644 index 00000000..264e1d96 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-079-returns-defaults-when-undefined-config-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.returns-defaults-when-undefined-config-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Returns defaults when undefined config provided + +## Intent + +- outcome: Executable scenario "Returns defaults when undefined config provided" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-080-uses-provided-max-requests-per-minute.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-080-uses-provided-max-requests-per-minute.sdp.md new file mode 100644 index 00000000..e4a4d74c --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-080-uses-provided-max-requests-per-minute.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.uses-provided-max-requests-per-minute +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Uses provided maxRequestsPerMinute + +## Intent + +- outcome: Executable scenario "Uses provided maxRequestsPerMinute" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-081-uses-default-max-concurrent-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-081-uses-default-max-concurrent-when-not-provided.sdp.md new file mode 100644 index 00000000..940b3e12 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-081-uses-default-max-concurrent-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.uses-default-max-concurrent-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Uses default maxConcurrent when not provided + +## Intent + +- outcome: Executable scenario "Uses default maxConcurrent when not provided" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-082-uses-provided-max-concurrent.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-082-uses-provided-max-concurrent.sdp.md new file mode 100644 index 00000000..953e4104 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-082-uses-provided-max-concurrent.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.uses-provided-max-concurrent +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Uses provided maxConcurrent + +## Intent + +- outcome: Executable scenario "Uses provided maxConcurrent" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-083-uses-default-queue-depth-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-083-uses-default-queue-depth-when-not-provided.sdp.md new file mode 100644 index 00000000..10123706 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-083-uses-default-queue-depth-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.uses-default-queue-depth-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Uses default queueDepth when not provided + +## Intent + +- outcome: Executable scenario "Uses default queueDepth when not provided" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-084-uses-provided-queue-depth.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-084-uses-provided-queue-depth.sdp.md new file mode 100644 index 00000000..e5446a9a --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-084-uses-provided-queue-depth.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.uses-provided-queue-depth +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Uses provided queueDepth + +## Intent + +- outcome: Executable scenario "Uses provided queueDepth" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-085-preserves-cost-budget-when-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-085-preserves-cost-budget-when-provided.sdp.md new file mode 100644 index 00000000..8f638c93 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-085-preserves-cost-budget-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.preserves-cost-budget-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Preserves costBudget when provided + +## Intent + +- outcome: Executable scenario "Preserves costBudget when provided" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-086-does-not-include-cost-budget-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-086-does-not-include-cost-budget-when-not-provided.sdp.md new file mode 100644 index 00000000..267bc228 --- /dev/null +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-086-does-not-include-cost-budget-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.rate-limit.does-not-include-cost-budget-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.rate-limit +--- +# Does not include costBudget when not provided + +## Intent + +- outcome: Executable scenario "Does not include costBudget when not provided" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-001-calls-generate-text-and-parses-a-valid-json-response.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-001-calls-generate-text-and-parses-a-valid-json-response.sdp.md new file mode 100644 index 00000000..2fec44f0 --- /dev/null +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-001-calls-generate-text-and-parses-a-valid-json-response.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.thread-adapter.calls-generate-text-and-parses-a-valid-json-response +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.thread-adapter +--- +# Calls generateText and parses a valid JSON response + +## Intent + +- outcome: Executable scenario "Calls generateText and parses a valid JSON response" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-002-handles-non-json-response-with-defaults.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-002-handles-non-json-response-with-defaults.sdp.md new file mode 100644 index 00000000..1e565a35 --- /dev/null +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-002-handles-non-json-response-with-defaults.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.thread-adapter.handles-non-json-response-with-defaults +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.thread-adapter +--- +# Handles non-JSON response with defaults + +## Intent + +- outcome: Executable scenario "Handles non-JSON response with defaults" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-003-handles-malformed-json-gracefully.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-003-handles-malformed-json-gracefully.sdp.md new file mode 100644 index 00000000..bd1bfda5 --- /dev/null +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-003-handles-malformed-json-gracefully.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.thread-adapter.handles-malformed-json-gracefully +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.thread-adapter +--- +# Handles malformed JSON gracefully + +## Intent + +- outcome: Executable scenario "Handles malformed JSON gracefully" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-004-re-throws-generate-text-errors.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-004-re-throws-generate-text-errors.sdp.md new file mode 100644 index 00000000..b3f9725a --- /dev/null +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-004-re-throws-generate-text-errors.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.thread-adapter.re-throws-generate-text-errors +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.thread-adapter +--- +# Re-throws generateText errors + +## Intent + +- outcome: Executable scenario "Re-throws generateText errors" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-005-tracks-timing-in-llm-context.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-005-tracks-timing-in-llm-context.sdp.md new file mode 100644 index 00000000..7c5757d2 --- /dev/null +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-005-tracks-timing-in-llm-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.thread-adapter.tracks-timing-in-llm-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.thread-adapter +--- +# Tracks timing in llmContext + +## Intent + +- outcome: Executable scenario "Tracks timing in llmContext" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-006-includes-thread-id-in-llm-context-when-present.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-006-includes-thread-id-in-llm-context-when-present.sdp.md new file mode 100644 index 00000000..44400eeb --- /dev/null +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-006-includes-thread-id-in-llm-context-when-present.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.thread-adapter.includes-thread-id-in-llm-context-when-present +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.thread-adapter +--- +# Includes threadId in llmContext when present + +## Intent + +- outcome: Executable scenario "Includes threadId in llmContext when present" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-007-omits-thread-id-from-llm-context-when-not-present.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-007-omits-thread-id-from-llm-context-when-not-present.sdp.md new file mode 100644 index 00000000..5a542dee --- /dev/null +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-007-omits-thread-id-from-llm-context-when-not-present.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.thread-adapter.omits-thread-id-from-llm-context-when-not-present +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.thread-adapter +--- +# Omits threadId from llmContext when not present + +## Intent + +- outcome: Executable scenario "Omits threadId from llmContext when not present" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-008-handles-missing-usage-with-zero-tokens.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-008-handles-missing-usage-with-zero-tokens.sdp.md new file mode 100644 index 00000000..1ad196ff --- /dev/null +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-008-handles-missing-usage-with-zero-tokens.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.thread-adapter.handles-missing-usage-with-zero-tokens +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.thread-adapter +--- +# Handles missing usage with zero tokens + +## Intent + +- outcome: Executable scenario "Handles missing usage with zero tokens" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-009-calls-generate-text-and-parses-json-response-for-reason.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-009-calls-generate-text-and-parses-json-response-for-reason.sdp.md new file mode 100644 index 00000000..36e6a4df --- /dev/null +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-009-calls-generate-text-and-parses-json-response-for-reason.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.thread-adapter.calls-generate-text-and-parses-json-response-for-reason +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.thread-adapter +--- +# Calls generateText and parses JSON response for reason + +## Intent + +- outcome: Executable scenario "Calls generateText and parses JSON response for reason" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-010-returns-raw-text-when-response-is-not-json.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-010-returns-raw-text-when-response-is-not-json.sdp.md new file mode 100644 index 00000000..c04c7852 --- /dev/null +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-010-returns-raw-text-when-response-is-not-json.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.thread-adapter.returns-raw-text-when-response-is-not-json +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.thread-adapter +--- +# Returns raw text when response is not JSON + +## Intent + +- outcome: Executable scenario "Returns raw text when response is not JSON" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-011-re-throws-generate-text-errors-from-reason.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-011-re-throws-generate-text-errors-from-reason.sdp.md new file mode 100644 index 00000000..a7375582 --- /dev/null +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-011-re-throws-generate-text-errors-from-reason.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.thread-adapter.re-throws-generate-text-errors-from-reason +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.thread-adapter +--- +# Re-throws generateText errors from reason + +## Intent + +- outcome: Executable scenario "Re-throws generateText errors from reason" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-012-logs-reasoning-start-and-completion.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-012-logs-reasoning-start-and-completion.sdp.md new file mode 100644 index 00000000..dae6a8b0 --- /dev/null +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-012-logs-reasoning-start-and-completion.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.agent.thread-adapter.logs-reasoning-start-and-completion +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.agent.thread-adapter +--- +# Logs reasoning start and completion + +## Intent + +- outcome: Executable scenario "Logs reasoning start and completion" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-001-executes-commands-sequentially-in-atomic-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-001-executes-commands-sequentially-in-atomic-mode.sdp.md new file mode 100644 index 00000000..4924d00f --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-001-executes-commands-sequentially-in-atomic-mode.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.executes-commands-sequentially-in-atomic-mode +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Executes commands sequentially in atomic mode + +## Intent + +- outcome: Executable scenario "Executes commands sequentially in atomic mode" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-002-stops-on-first-failure-and-skips-remaining-in-atomic-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-002-stops-on-first-failure-and-skips-remaining-in-atomic-mode.sdp.md new file mode 100644 index 00000000..36737e0e --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-002-stops-on-first-failure-and-skips-remaining-in-atomic-mode.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.stops-on-first-failure-and-skips-remaining-in-atomic-mode +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Stops on first failure and skips remaining in atomic mode + +## Intent + +- outcome: Executable scenario "Stops on first failure and skips remaining in atomic mode" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-003-rejects-batch-for-cross-aggregate-commands-in-atomic-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-003-rejects-batch-for-cross-aggregate-commands-in-atomic-mode.sdp.md new file mode 100644 index 00000000..648b88d5 --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-003-rejects-batch-for-cross-aggregate-commands-in-atomic-mode.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.rejects-batch-for-cross-aggregate-commands-in-atomic-mode +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Rejects batch for cross-aggregate commands in atomic mode + +## Intent + +- outcome: Executable scenario "Rejects batch for cross-aggregate commands in atomic mode" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-004-uses-shared-correlation-id-in-atomic-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-004-uses-shared-correlation-id-in-atomic-mode.sdp.md new file mode 100644 index 00000000..bff0b6d9 --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-004-uses-shared-correlation-id-in-atomic-mode.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.uses-shared-correlation-id-in-atomic-mode +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Uses shared correlationId in atomic mode + +## Intent + +- outcome: Executable scenario "Uses shared correlationId in atomic mode" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-005-allows-command-level-correlation-id-override-in-atomic-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-005-allows-command-level-correlation-id-override-in-atomic-mode.sdp.md new file mode 100644 index 00000000..2575955f --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-005-allows-command-level-correlation-id-override-in-atomic-mode.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.allows-command-level-correlation-id-override-in-atomic-mode +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Allows command-level correlationId override in atomic mode + +## Intent + +- outcome: Executable scenario "Allows command-level correlationId override in atomic mode" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-006-executes-all-commands-even-with-failures-in-partial-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-006-executes-all-commands-even-with-failures-in-partial-mode.sdp.md new file mode 100644 index 00000000..b8b482ed --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-006-executes-all-commands-even-with-failures-in-partial-mode.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.executes-all-commands-even-with-failures-in-partial-mode +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Executes all commands even with failures in partial mode + +## Intent + +- outcome: Executable scenario "Executes all commands even with failures in partial mode" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-007-returns-success-when-all-commands-succeed-in-partial-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-007-returns-success-when-all-commands-succeed-in-partial-mode.sdp.md new file mode 100644 index 00000000..7cf2fbd1 --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-007-returns-success-when-all-commands-succeed-in-partial-mode.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.returns-success-when-all-commands-succeed-in-partial-mode +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Returns success when all commands succeed in partial mode + +## Intent + +- outcome: Executable scenario "Returns success when all commands succeed in partial mode" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-008-allows-cross-aggregate-commands-in-partial-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-008-allows-cross-aggregate-commands-in-partial-mode.sdp.md new file mode 100644 index 00000000..593ac2e4 --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-008-allows-cross-aggregate-commands-in-partial-mode.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.allows-cross-aggregate-commands-in-partial-mode +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Allows cross-aggregate commands in partial mode + +## Intent + +- outcome: Executable scenario "Allows cross-aggregate commands in partial mode" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-009-respects-max-concurrency-in-partial-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-009-respects-max-concurrency-in-partial-mode.sdp.md new file mode 100644 index 00000000..9980ef1e --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-009-respects-max-concurrency-in-partial-mode.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.respects-max-concurrency-in-partial-mode +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Respects maxConcurrency in partial mode + +## Intent + +- outcome: Executable scenario "Respects maxConcurrency in partial mode" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-010-stops-on-failure-when-continue-on-error-is-false-in-partial-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-010-stops-on-failure-when-continue-on-error-is-false-in-partial-mode.sdp.md new file mode 100644 index 00000000..887f5255 --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-010-stops-on-failure-when-continue-on-error-is-false-in-partial-mode.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.stops-on-failure-when-continue-on-error-is-false-in-partial-mode +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Stops on failure when continueOnError is false in partial mode + +## Intent + +- outcome: Executable scenario "Stops on failure when continueOnError is false in partial mode" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-011-tracks-individual-command-results.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-011-tracks-individual-command-results.sdp.md new file mode 100644 index 00000000..00529b0d --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-011-tracks-individual-command-results.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.tracks-individual-command-results +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Tracks individual command results + +## Intent + +- outcome: Executable scenario "Tracks individual command results" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-012-includes-duration-for-each-command.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-012-includes-duration-for-each-command.sdp.md new file mode 100644 index 00000000..f2af97fc --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-012-includes-duration-for-each-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.includes-duration-for-each-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Includes duration for each command + +## Intent + +- outcome: Executable scenario "Includes duration for each command" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-013-includes-error-message-for-failed-commands.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-013-includes-error-message-for-failed-commands.sdp.md new file mode 100644 index 00000000..1e7ba970 --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-013-includes-error-message-for-failed-commands.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.includes-error-message-for-failed-commands +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Includes error message for failed commands + +## Intent + +- outcome: Executable scenario "Includes error message for failed commands" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-014-calculates-correct-summary-statistics.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-014-calculates-correct-summary-statistics.sdp.md new file mode 100644 index 00000000..42e94c0f --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-014-calculates-correct-summary-statistics.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.calculates-correct-summary-statistics +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Calculates correct summary statistics + +## Intent + +- outcome: Executable scenario "Calculates correct summary statistics" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-015-handles-executor-throwing-errors.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-015-handles-executor-throwing-errors.sdp.md new file mode 100644 index 00000000..7080cfae --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-015-handles-executor-throwing-errors.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.handles-executor-throwing-errors +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Handles executor throwing errors + +## Intent + +- outcome: Executable scenario "Handles executor throwing errors" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-016-handles-empty-batch-gracefully.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-016-handles-empty-batch-gracefully.sdp.md new file mode 100644 index 00000000..c997c40d --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-016-handles-empty-batch-gracefully.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.handles-empty-batch-gracefully +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Handles empty batch gracefully + +## Intent + +- outcome: Executable scenario "Handles empty batch gracefully" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-017-rejects-batch-exceeding-max-command-count-before-execution.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-017-rejects-batch-exceeding-max-command-count-before-execution.sdp.md new file mode 100644 index 00000000..a97b7fe0 --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-017-rejects-batch-exceeding-max-command-count-before-execution.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.rejects-batch-exceeding-max-command-count-before-execution +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Rejects batch exceeding max command count before execution + +## Intent + +- outcome: Executable scenario "Rejects batch exceeding max command count before execution" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-018-accepts-batch-exactly-at-max-command-count.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-018-accepts-batch-exactly-at-max-command-count.sdp.md new file mode 100644 index 00000000..4143d26d --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-018-accepts-batch-exactly-at-max-command-count.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.accepts-batch-exactly-at-max-command-count +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Accepts batch exactly at max command count + +## Intent + +- outcome: Executable scenario "Accepts batch exactly at max command count" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-019-accepts-batch-exactly-at-default-max-command-count.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-019-accepts-batch-exactly-at-default-max-command-count.sdp.md new file mode 100644 index 00000000..9858886f --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-019-accepts-batch-exactly-at-default-max-command-count.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.accepts-batch-exactly-at-default-max-command-count +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Accepts batch exactly at default max command count + +## Intent + +- outcome: Executable scenario "Accepts batch exactly at default max command count" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-020-rejects-batch-exceeding-default-max-command-count-before-execution.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-020-rejects-batch-exceeding-default-max-command-count-before-execution.sdp.md new file mode 100644 index 00000000..5a06c21b --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-020-rejects-batch-exceeding-default-max-command-count-before-execution.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.rejects-batch-exceeding-default-max-command-count-before-execution +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Rejects batch exceeding default max command count before execution + +## Intent + +- outcome: Executable scenario "Rejects batch exceeding default max command count before execution" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-021-rejects-commands-from-wrong-bounded-context.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-021-rejects-commands-from-wrong-bounded-context.sdp.md new file mode 100644 index 00000000..7fa1de9b --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-021-rejects-commands-from-wrong-bounded-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.rejects-commands-from-wrong-bounded-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Rejects commands from wrong bounded context + +## Intent + +- outcome: Executable scenario "Rejects commands from wrong bounded context" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-022-creates-a-batch-executor-instance-via-factory.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-022-creates-a-batch-executor-instance-via-factory.sdp.md new file mode 100644 index 00000000..912b23f9 --- /dev/null +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-022-creates-a-batch-executor-instance-via-factory.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.batch-executor.creates-a-batch-executor-instance-via-factory +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.batch-executor +--- +# Creates a BatchExecutor instance via factory + +## Intent + +- outcome: Executable scenario "Creates a BatchExecutor instance via factory" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-001-rejects-empty-batch.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-001-rejects-empty-batch.sdp.md new file mode 100644 index 00000000..f1f3cc2a --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-001-rejects-empty-batch.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.rejects-empty-batch +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Rejects empty batch + +## Intent + +- outcome: Executable scenario "Rejects empty batch" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-002-accepts-batch-exactly-at-max-size.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-002-accepts-batch-exactly-at-max-size.sdp.md new file mode 100644 index 00000000..d6bf9a29 --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-002-accepts-batch-exactly-at-max-size.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.accepts-batch-exactly-at-max-size +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Accepts batch exactly at max size + +## Intent + +- outcome: Executable scenario "Accepts batch exactly at max size" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-003-rejects-batch-exceeding-max-size.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-003-rejects-batch-exceeding-max-size.sdp.md new file mode 100644 index 00000000..b007eb3b --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-003-rejects-batch-exceeding-max-size.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.rejects-batch-exceeding-max-size +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Rejects batch exceeding max size + +## Intent + +- outcome: Executable scenario "Rejects batch exceeding max size" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-004-accepts-batch-exactly-at-default-max-size.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-004-accepts-batch-exactly-at-default-max-size.sdp.md new file mode 100644 index 00000000..eccb7cfd --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-004-accepts-batch-exactly-at-default-max-size.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.accepts-batch-exactly-at-default-max-size +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Accepts batch exactly at default max size + +## Intent + +- outcome: Executable scenario "Accepts batch exactly at default max size" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-005-rejects-batch-exceeding-default-max-size.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-005-rejects-batch-exceeding-default-max-size.sdp.md new file mode 100644 index 00000000..f4cd4e22 --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-005-rejects-batch-exceeding-default-max-size.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.rejects-batch-exceeding-default-max-size +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Rejects batch exceeding default max size + +## Intent + +- outcome: Executable scenario "Rejects batch exceeding default max size" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-006-accepts-valid-commands-without-registry.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-006-accepts-valid-commands-without-registry.sdp.md new file mode 100644 index 00000000..4730935c --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-006-accepts-valid-commands-without-registry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.accepts-valid-commands-without-registry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Accepts valid commands without registry + +## Intent + +- outcome: Executable scenario "Accepts valid commands without registry" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-007-accepts-commands-in-different-bounded-contexts.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-007-accepts-commands-in-different-bounded-contexts.sdp.md new file mode 100644 index 00000000..8c40fb8c --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-007-accepts-commands-in-different-bounded-contexts.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.accepts-commands-in-different-bounded-contexts +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Accepts commands in different bounded contexts + +## Intent + +- outcome: Executable scenario "Accepts commands in different bounded contexts" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-008-requires-aggregate-id-option.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-008-requires-aggregate-id-option.sdp.md new file mode 100644 index 00000000..ec3a28d0 --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-008-requires-aggregate-id-option.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.requires-aggregate-id-option +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Requires aggregateId option + +## Intent + +- outcome: Executable scenario "Requires aggregateId option" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-009-requires-aggregate-id-field-option.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-009-requires-aggregate-id-field-option.sdp.md new file mode 100644 index 00000000..1312d389 --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-009-requires-aggregate-id-field-option.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.requires-aggregate-id-field-option +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Requires aggregateIdField option + +## Intent + +- outcome: Executable scenario "Requires aggregateIdField option" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-010-accepts-when-all-commands-target-same-aggregate.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-010-accepts-when-all-commands-target-same-aggregate.sdp.md new file mode 100644 index 00000000..9098b730 --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-010-accepts-when-all-commands-target-same-aggregate.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.accepts-when-all-commands-target-same-aggregate +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Accepts when all commands target same aggregate + +## Intent + +- outcome: Executable scenario "Accepts when all commands target same aggregate" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-011-rejects-when-commands-target-different-aggregates.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-011-rejects-when-commands-target-different-aggregates.sdp.md new file mode 100644 index 00000000..b62c2054 --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-011-rejects-when-commands-target-different-aggregates.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.rejects-when-commands-target-different-aggregates +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Rejects when commands target different aggregates + +## Intent + +- outcome: Executable scenario "Rejects when commands target different aggregates" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-012-accepts-commands-targeting-same-aggregate-with-explicit-aggregate-id.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-012-accepts-commands-targeting-same-aggregate-with-explicit-aggregate-id.sdp.md new file mode 100644 index 00000000..3bfd4dd1 --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-012-accepts-commands-targeting-same-aggregate-with-explicit-aggregate-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.accepts-commands-targeting-same-aggregate-with-explicit-aggregate-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Accepts commands targeting same aggregate with explicit aggregateId + +## Intent + +- outcome: Executable scenario "Accepts commands targeting same aggregate with explicit aggregateId" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-013-infers-aggregate-id-from-first-command-when-not-specified.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-013-infers-aggregate-id-from-first-command-when-not-specified.sdp.md new file mode 100644 index 00000000..c96aaa83 --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-013-infers-aggregate-id-from-first-command-when-not-specified.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.infers-aggregate-id-from-first-command-when-not-specified +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Infers aggregate ID from first command when not specified + +## Intent + +- outcome: Executable scenario "Infers aggregate ID from first command when not specified" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-014-rejects-when-commands-target-different-aggregate-instances.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-014-rejects-when-commands-target-different-aggregate-instances.sdp.md new file mode 100644 index 00000000..91fc8946 --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-014-rejects-when-commands-target-different-aggregate-instances.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.rejects-when-commands-target-different-aggregate-instances +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Rejects when commands target different aggregate instances + +## Intent + +- outcome: Executable scenario "Rejects when commands target different aggregate instances" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-015-rejects-when-commands-target-different-aggregate-types.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-015-rejects-when-commands-target-different-aggregate-types.sdp.md new file mode 100644 index 00000000..7e9db226 --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-015-rejects-when-commands-target-different-aggregate-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.rejects-when-commands-target-different-aggregate-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Rejects when commands target different aggregate types + +## Intent + +- outcome: Executable scenario "Rejects when commands target different aggregate types" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-016-rejects-non-aggregate-commands-in-atomic-mode.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-016-rejects-non-aggregate-commands-in-atomic-mode.sdp.md new file mode 100644 index 00000000..700b3d65 --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-016-rejects-non-aggregate-commands-in-atomic-mode.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.rejects-non-aggregate-commands-in-atomic-mode +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Rejects non-aggregate commands in atomic mode + +## Intent + +- outcome: Executable scenario "Rejects non-aggregate commands in atomic mode" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-017-rejects-unregistered-commands.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-017-rejects-unregistered-commands.sdp.md new file mode 100644 index 00000000..40ca15f4 --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-017-rejects-unregistered-commands.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.rejects-unregistered-commands +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Rejects unregistered commands + +## Intent + +- outcome: Executable scenario "Rejects unregistered commands" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-018-accepts-commands-matching-specified-bounded-context.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-018-accepts-commands-matching-specified-bounded-context.sdp.md new file mode 100644 index 00000000..f4c249ea --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-018-accepts-commands-matching-specified-bounded-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.accepts-commands-matching-specified-bounded-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Accepts commands matching specified bounded context + +## Intent + +- outcome: Executable scenario "Accepts commands matching specified bounded context" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-019-rejects-commands-from-wrong-bounded-context.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-019-rejects-commands-from-wrong-bounded-context.sdp.md new file mode 100644 index 00000000..d9a2895a --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-019-rejects-commands-from-wrong-bounded-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.rejects-commands-from-wrong-bounded-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Rejects commands from wrong bounded context + +## Intent + +- outcome: Executable scenario "Rejects commands from wrong bounded context" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-020-extracts-id-from-command-args.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-020-extracts-id-from-command-args.sdp.md new file mode 100644 index 00000000..4040ee45 --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-020-extracts-id-from-command-args.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.extracts-id-from-command-args +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Extracts ID from command args + +## Intent + +- outcome: Executable scenario "Extracts ID from command args" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-021-returns-undefined-for-missing-field.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-021-returns-undefined-for-missing-field.sdp.md new file mode 100644 index 00000000..5ba173ab --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-021-returns-undefined-for-missing-field.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.returns-undefined-for-missing-field +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Returns undefined for missing field + +## Intent + +- outcome: Executable scenario "Returns undefined for missing field" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-022-returns-undefined-for-non-string-value.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-022-returns-undefined-for-non-string-value.sdp.md new file mode 100644 index 00000000..a839b13b --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-022-returns-undefined-for-non-string-value.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.returns-undefined-for-non-string-value +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Returns undefined for non-string value + +## Intent + +- outcome: Executable scenario "Returns undefined for non-string value" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-023-groups-commands-by-aggregate-id.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-023-groups-commands-by-aggregate-id.sdp.md new file mode 100644 index 00000000..7fde9832 --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-023-groups-commands-by-aggregate-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.groups-commands-by-aggregate-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Groups commands by aggregate ID + +## Intent + +- outcome: Executable scenario "Groups commands by aggregate ID" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/batch/validation.examples/s-024-uses-placeholder-for-missing-i-ds.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-024-uses-placeholder-for-missing-i-ds.sdp.md new file mode 100644 index 00000000..cc7a6573 --- /dev/null +++ b/specs/behavior/platform-core/batch/validation.examples/s-024-uses-placeholder-for-missing-i-ds.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.batch.validation.uses-placeholder-for-missing-i-ds +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.batch.validation +--- +# Uses placeholder for missing IDs + +## Intent + +- outcome: Executable scenario "Uses placeholder for missing IDs" from packages/platform-core/tests/features/behavior/batch/validation.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-001-state-at-current-version-is-returned-as-is.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-001-state-at-current-version-is-returned-as-is.sdp.md new file mode 100644 index 00000000..d0e54c9e --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-001-state-at-current-version-is-returned-as-is.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.state-at-current-version-is-returned-as-is +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# State at current version is returned as-is + +## Intent + +- outcome: Executable scenario "State at current version is returned as-is" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-002-state-is-migrated-from-v1-to-v2.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-002-state-is-migrated-from-v1-to-v2.sdp.md new file mode 100644 index 00000000..be33c15f --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-002-state-is-migrated-from-v1-to-v2.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.state-is-migrated-from-v1-to-v2 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# State is migrated from v1 to v2 + +## Intent + +- outcome: Executable scenario "State is migrated from v1 to v2" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-003-state-is-migrated-from-v1-to-v3.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-003-state-is-migrated-from-v1-to-v3.sdp.md new file mode 100644 index 00000000..7a87a8b3 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-003-state-is-migrated-from-v1-to-v3.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.state-is-migrated-from-v1-to-v3 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# State is migrated from v1 to v3 + +## Intent + +- outcome: Executable scenario "State is migrated from v1 to v3" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-004-legacy-state-without-state-version-is-treated-as-version-0.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-004-legacy-state-without-state-version-is-treated-as-version-0.sdp.md new file mode 100644 index 00000000..5b3ff658 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-004-legacy-state-without-state-version-is-treated-as-version-0.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.legacy-state-without-state-version-is-treated-as-version-0 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Legacy state without stateVersion is treated as version 0 + +## Intent + +- outcome: Executable scenario "Legacy state without stateVersion is treated as version 0" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-005-null-input-throws-cms-upcaster-error.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-005-null-input-throws-cms-upcaster-error.sdp.md new file mode 100644 index 00000000..9c37fe83 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-005-null-input-throws-cms-upcaster-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.null-input-throws-cms-upcaster-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Null input throws CMSUpcasterError + +## Intent + +- outcome: Executable scenario "Null input throws CMSUpcasterError" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-006-undefined-input-throws-cms-upcaster-error.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-006-undefined-input-throws-cms-upcaster-error.sdp.md new file mode 100644 index 00000000..c676e6ac --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-006-undefined-input-throws-cms-upcaster-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.undefined-input-throws-cms-upcaster-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Undefined input throws CMSUpcasterError + +## Intent + +- outcome: Executable scenario "Undefined input throws CMSUpcasterError" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-007-incomplete-migration-chain-throws-at-creation-time.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-007-incomplete-migration-chain-throws-at-creation-time.sdp.md new file mode 100644 index 00000000..9ca36517 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-007-incomplete-migration-chain-throws-at-creation-time.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.incomplete-migration-chain-throws-at-creation-time +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Incomplete migration chain throws at creation time + +## Intent + +- outcome: Executable scenario "Incomplete migration chain throws at creation time" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-008-future-state-version-throws-cms-upcaster-error.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-008-future-state-version-throws-cms-upcaster-error.sdp.md new file mode 100644 index 00000000..f0a109bf --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-008-future-state-version-throws-cms-upcaster-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.future-state-version-throws-cms-upcaster-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Future state version throws CMSUpcasterError + +## Intent + +- outcome: Executable scenario "Future state version throws CMSUpcasterError" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-009-migration-function-error-propagates-mid-chain.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-009-migration-function-error-propagates-mid-chain.sdp.md new file mode 100644 index 00000000..04fb848d --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-009-migration-function-error-propagates-mid-chain.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.migration-function-error-propagates-mid-chain +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Migration function error propagates mid-chain + +## Intent + +- outcome: Executable scenario "Migration function error propagates mid-chain" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-010-first-migration-function-error-propagates.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-010-first-migration-function-error-propagates.sdp.md new file mode 100644 index 00000000..e06f5276 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-010-first-migration-function-error-propagates.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.first-migration-function-error-propagates +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# First migration function error propagates + +## Intent + +- outcome: Executable scenario "First migration function error propagates" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-011-state-at-current-version-is-returned-as-is-via-upcast-if-needed.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-011-state-at-current-version-is-returned-as-is-via-upcast-if-needed.sdp.md new file mode 100644 index 00000000..4d8ceca0 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-011-state-at-current-version-is-returned-as-is-via-upcast-if-needed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.state-at-current-version-is-returned-as-is-via-upcast-if-needed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# State at current version is returned as-is via upcastIfNeeded + +## Intent + +- outcome: Executable scenario "State at current version is returned as-is via upcastIfNeeded" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-012-state-is-migrated-via-upcast-if-needed.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-012-state-is-migrated-via-upcast-if-needed.sdp.md new file mode 100644 index 00000000..de10cc3f --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-012-state-is-migrated-via-upcast-if-needed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.state-is-migrated-via-upcast-if-needed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# State is migrated via upcastIfNeeded + +## Intent + +- outcome: Executable scenario "State is migrated via upcastIfNeeded" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-013-validation-passes-when-state-is-valid.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-013-validation-passes-when-state-is-valid.sdp.md new file mode 100644 index 00000000..bc70f7b5 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-013-validation-passes-when-state-is-valid.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.validation-passes-when-state-is-valid +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Validation passes when state is valid + +## Intent + +- outcome: Executable scenario "Validation passes when state is valid" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-014-validation-fails-when-state-is-invalid.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-014-validation-fails-when-state-is-invalid.sdp.md new file mode 100644 index 00000000..8f2d77df --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-014-validation-fails-when-state-is-invalid.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.validation-fails-when-state-is-invalid +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Validation fails when state is invalid + +## Intent + +- outcome: Executable scenario "Validation fails when state is invalid" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-015-future-state-version-throws-cms-upcaster-error-via-upcast-if-needed.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-015-future-state-version-throws-cms-upcaster-error-via-upcast-if-needed.sdp.md new file mode 100644 index 00000000..20d1135a --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-015-future-state-version-throws-cms-upcaster-error-via-upcast-if-needed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.future-state-version-throws-cms-upcaster-error-via-upcast-if-needed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Future state version throws CMSUpcasterError via upcastIfNeeded + +## Intent + +- outcome: Executable scenario "Future state version throws CMSUpcasterError via upcastIfNeeded" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-016-error-has-correct-name.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-016-error-has-correct-name.sdp.md new file mode 100644 index 00000000..e2190345 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-016-error-has-correct-name.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.error-has-correct-name +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Error has correct name + +## Intent + +- outcome: Executable scenario "Error has correct name" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-017-error-has-correct-code.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-017-error-has-correct-code.sdp.md new file mode 100644 index 00000000..5e270d74 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-017-error-has-correct-code.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.error-has-correct-code +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Error has correct code + +## Intent + +- outcome: Executable scenario "Error has correct code" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-018-error-has-correct-message.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-018-error-has-correct-message.sdp.md new file mode 100644 index 00000000..804623b8 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-018-error-has-correct-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.error-has-correct-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Error has correct message + +## Intent + +- outcome: Executable scenario "Error has correct message" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-019-error-stores-context-when-provided.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-019-error-stores-context-when-provided.sdp.md new file mode 100644 index 00000000..22000f8d --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-019-error-stores-context-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.error-stores-context-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Error stores context when provided + +## Intent + +- outcome: Executable scenario "Error stores context when provided" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-020-error-has-undefined-context-when-not-provided.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-020-error-has-undefined-context-when-not-provided.sdp.md new file mode 100644 index 00000000..bd4c503d --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-020-error-has-undefined-context-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.error-has-undefined-context-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Error has undefined context when not provided + +## Intent + +- outcome: Executable scenario "Error has undefined context when not provided" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-021-error-is-instanceof-error.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-021-error-is-instanceof-error.sdp.md new file mode 100644 index 00000000..7e23854a --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-021-error-is-instanceof-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.error-is-instanceof-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Error is instanceof Error + +## Intent + +- outcome: Executable scenario "Error is instanceof Error" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-022-validation-passes-for-current-version-state.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-022-validation-passes-for-current-version-state.sdp.md new file mode 100644 index 00000000..8f1753bf --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-022-validation-passes-for-current-version-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.validation-passes-for-current-version-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Validation passes for current version state + +## Intent + +- outcome: Executable scenario "Validation passes for current version state" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-023-validation-fails-for-current-version-state-with-empty-description.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-023-validation-fails-for-current-version-state-with-empty-description.sdp.md new file mode 100644 index 00000000..c2abc18f --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-023-validation-fails-for-current-version-state-with-empty-description.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.validation-fails-for-current-version-state-with-empty-description +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Validation fails for current version state with empty description + +## Intent + +- outcome: Executable scenario "Validation fails for current version state with empty description" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-024-validation-passes-after-upcasting-from-v1.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-024-validation-passes-after-upcasting-from-v1.sdp.md new file mode 100644 index 00000000..821a8503 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-024-validation-passes-after-upcasting-from-v1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.validation-passes-after-upcasting-from-v1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Validation passes after upcasting from v1 + +## Intent + +- outcome: Executable scenario "Validation passes after upcasting from v1" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-025-validation-fails-after-upcasting-produces-invalid-state.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-025-validation-fails-after-upcasting-produces-invalid-state.sdp.md new file mode 100644 index 00000000..fb61aca1 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-025-validation-fails-after-upcasting-produces-invalid-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.validation-fails-after-upcasting-produces-invalid-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Validation fails after upcasting produces invalid state + +## Intent + +- outcome: Executable scenario "Validation fails after upcasting produces invalid state" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-026-static-default-value-is-added.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-026-static-default-value-is-added.sdp.md new file mode 100644 index 00000000..0ae0b294 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-026-static-default-value-is-added.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.static-default-value-is-added +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Static default value is added + +## Intent + +- outcome: Executable scenario "Static default value is added" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-027-computed-default-value-is-added.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-027-computed-default-value-is-added.sdp.md new file mode 100644 index 00000000..a8516cd0 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-027-computed-default-value-is-added.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.computed-default-value-is-added +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Computed default value is added + +## Intent + +- outcome: Executable scenario "Computed default value is added" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-028-computed-default-accesses-state.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-028-computed-default-accesses-state.sdp.md new file mode 100644 index 00000000..a8c956d8 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-028-computed-default-accesses-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.computed-default-accesses-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Computed default accesses state + +## Intent + +- outcome: Executable scenario "Computed default accesses state" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-029-existing-fields-are-preserved.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-029-existing-fields-are-preserved.sdp.md new file mode 100644 index 00000000..d46863d5 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-029-existing-fields-are-preserved.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.existing-fields-are-preserved +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Existing fields are preserved + +## Intent + +- outcome: Executable scenario "Existing fields are preserved" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-030-field-is-renamed.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-030-field-is-renamed.sdp.md new file mode 100644 index 00000000..c4c12828 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-030-field-is-renamed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.field-is-renamed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Field is renamed + +## Intent + +- outcome: Executable scenario "Field is renamed" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-031-other-fields-are-preserved-when-renaming.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-031-other-fields-are-preserved-when-renaming.sdp.md new file mode 100644 index 00000000..ae0bf008 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-031-other-fields-are-preserved-when-renaming.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.other-fields-are-preserved-when-renaming +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Other fields are preserved when renaming + +## Intent + +- outcome: Executable scenario "Other fields are preserved when renaming" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-032-undefined-value-in-renamed-field-is-handled.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-032-undefined-value-in-renamed-field-is-handled.sdp.md new file mode 100644 index 00000000..a6b80831 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-032-undefined-value-in-renamed-field-is-handled.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.undefined-value-in-renamed-field-is-handled +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Undefined value in renamed field is handled + +## Intent + +- outcome: Executable scenario "Undefined value in renamed field is handled" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-033-specified-field-is-removed.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-033-specified-field-is-removed.sdp.md new file mode 100644 index 00000000..fd8d61c5 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-033-specified-field-is-removed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.specified-field-is-removed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Specified field is removed + +## Intent + +- outcome: Executable scenario "Specified field is removed" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-034-other-fields-are-preserved-when-removing.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-034-other-fields-are-preserved-when-removing.sdp.md new file mode 100644 index 00000000..6f129613 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-034-other-fields-are-preserved-when-removing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.other-fields-are-preserved-when-removing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Other fields are preserved when removing + +## Intent + +- outcome: Executable scenario "Other fields are preserved when removing" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-035-non-existent-field-is-handled-gracefully.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-035-non-existent-field-is-handled-gracefully.sdp.md new file mode 100644 index 00000000..b2ab40bb --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-035-non-existent-field-is-handled-gracefully.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.non-existent-field-is-handled-gracefully +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Non-existent field is handled gracefully + +## Intent + +- outcome: Executable scenario "Non-existent field is handled gracefully" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-036-add-cms-field-migration-works-in-migration-chain.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-036-add-cms-field-migration-works-in-migration-chain.sdp.md new file mode 100644 index 00000000..1af8843f --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-036-add-cms-field-migration-works-in-migration-chain.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.add-cms-field-migration-works-in-migration-chain +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# addCMSFieldMigration works in migration chain + +## Intent + +- outcome: Executable scenario "addCMSFieldMigration works in migration chain" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-037-multiple-helper-migrations-are-chained.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-037-multiple-helper-migrations-are-chained.sdp.md new file mode 100644 index 00000000..17f16c75 --- /dev/null +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-037-multiple-helper-migrations-are-chained.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.cms.upcaster.multiple-helper-migrations-are-chained +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.cms.upcaster +--- +# Multiple helper migrations are chained + +## Intent + +- outcome: Executable scenario "Multiple helper migrations are chained" from packages/platform-core/tests/features/behavior/cms/upcaster.feature diff --git a/specs/behavior/platform-core/commands/categories.examples/s-001-command-categories-has-exactly-four-entries-in-the-correct-order.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-001-command-categories-has-exactly-four-entries-in-the-correct-order.sdp.md new file mode 100644 index 00000000..5a0b6b23 --- /dev/null +++ b/specs/behavior/platform-core/commands/categories.examples/s-001-command-categories-has-exactly-four-entries-in-the-correct-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.categories.command-categories-has-exactly-four-entries-in-the-correct-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.categories +--- +# COMMAND_CATEGORIES has exactly four entries in the correct order + +## Intent + +- outcome: Executable scenario "COMMAND_CATEGORIES has exactly four entries in the correct order" from packages/platform-core/tests/features/behavior/commands/categories.feature diff --git a/specs/behavior/platform-core/commands/categories.examples/s-002-schema-accepts-valid-category-strings.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-002-schema-accepts-valid-category-strings.sdp.md new file mode 100644 index 00000000..28a3a411 --- /dev/null +++ b/specs/behavior/platform-core/commands/categories.examples/s-002-schema-accepts-valid-category-strings.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.categories.schema-accepts-valid-category-strings +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.categories +--- +# Schema accepts valid category strings + +## Intent + +- outcome: Executable scenario "Schema accepts valid category strings" from packages/platform-core/tests/features/behavior/commands/categories.feature diff --git a/specs/behavior/platform-core/commands/categories.examples/s-003-schema-rejects-invalid-category-values.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-003-schema-rejects-invalid-category-values.sdp.md new file mode 100644 index 00000000..f5b7118a --- /dev/null +++ b/specs/behavior/platform-core/commands/categories.examples/s-003-schema-rejects-invalid-category-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.categories.schema-rejects-invalid-category-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.categories +--- +# Schema rejects invalid category values + +## Intent + +- outcome: Executable scenario "Schema rejects invalid category values" from packages/platform-core/tests/features/behavior/commands/categories.feature diff --git a/specs/behavior/platform-core/commands/categories.examples/s-004-default-command-category-is-aggregate.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-004-default-command-category-is-aggregate.sdp.md new file mode 100644 index 00000000..2ee4ed60 --- /dev/null +++ b/specs/behavior/platform-core/commands/categories.examples/s-004-default-command-category-is-aggregate.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.categories.default-command-category-is-aggregate +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.categories +--- +# DEFAULT_COMMAND_CATEGORY is aggregate + +## Intent + +- outcome: Executable scenario "DEFAULT_COMMAND_CATEGORY is aggregate" from packages/platform-core/tests/features/behavior/commands/categories.feature diff --git a/specs/behavior/platform-core/commands/categories.examples/s-005-type-guard-accepts-all-valid-categories.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-005-type-guard-accepts-all-valid-categories.sdp.md new file mode 100644 index 00000000..472d1465 --- /dev/null +++ b/specs/behavior/platform-core/commands/categories.examples/s-005-type-guard-accepts-all-valid-categories.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.categories.type-guard-accepts-all-valid-categories +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.categories +--- +# Type guard accepts all valid categories + +## Intent + +- outcome: Executable scenario "Type guard accepts all valid categories" from packages/platform-core/tests/features/behavior/commands/categories.feature diff --git a/specs/behavior/platform-core/commands/categories.examples/s-006-type-guard-rejects-invalid-values.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-006-type-guard-rejects-invalid-values.sdp.md new file mode 100644 index 00000000..c3f6feb5 --- /dev/null +++ b/specs/behavior/platform-core/commands/categories.examples/s-006-type-guard-rejects-invalid-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.categories.type-guard-rejects-invalid-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.categories +--- +# Type guard rejects invalid values + +## Intent + +- outcome: Executable scenario "Type guard rejects invalid values" from packages/platform-core/tests/features/behavior/commands/categories.feature diff --git a/specs/behavior/platform-core/commands/categories.examples/s-007-valid-categories-are-returned-unchanged.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-007-valid-categories-are-returned-unchanged.sdp.md new file mode 100644 index 00000000..a806db31 --- /dev/null +++ b/specs/behavior/platform-core/commands/categories.examples/s-007-valid-categories-are-returned-unchanged.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.categories.valid-categories-are-returned-unchanged +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.categories +--- +# Valid categories are returned unchanged + +## Intent + +- outcome: Executable scenario "Valid categories are returned unchanged" from packages/platform-core/tests/features/behavior/commands/categories.feature diff --git a/specs/behavior/platform-core/commands/categories.examples/s-008-invalid-values-normalize-to-aggregate.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-008-invalid-values-normalize-to-aggregate.sdp.md new file mode 100644 index 00000000..d9323b45 --- /dev/null +++ b/specs/behavior/platform-core/commands/categories.examples/s-008-invalid-values-normalize-to-aggregate.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.categories.invalid-values-normalize-to-aggregate +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.categories +--- +# Invalid values normalize to aggregate + +## Intent + +- outcome: Executable scenario "Invalid values normalize to aggregate" from packages/platform-core/tests/features/behavior/commands/categories.feature diff --git a/specs/behavior/platform-core/commands/categories.examples/s-009-classification-of-categories-as-aggregate.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-009-classification-of-categories-as-aggregate.sdp.md new file mode 100644 index 00000000..d355fd11 --- /dev/null +++ b/specs/behavior/platform-core/commands/categories.examples/s-009-classification-of-categories-as-aggregate.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.categories.classification-of-categories-as-aggregate +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.categories +--- +# Classification of categories as aggregate + +## Intent + +- outcome: Executable scenario "Classification of categories as aggregate" from packages/platform-core/tests/features/behavior/commands/categories.feature diff --git a/specs/behavior/platform-core/commands/categories.examples/s-010-classification-of-categories-as-process.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-010-classification-of-categories-as-process.sdp.md new file mode 100644 index 00000000..042948b4 --- /dev/null +++ b/specs/behavior/platform-core/commands/categories.examples/s-010-classification-of-categories-as-process.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.categories.classification-of-categories-as-process +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.categories +--- +# Classification of categories as process + +## Intent + +- outcome: Executable scenario "Classification of categories as process" from packages/platform-core/tests/features/behavior/commands/categories.feature diff --git a/specs/behavior/platform-core/commands/categories.examples/s-011-classification-of-categories-as-system.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-011-classification-of-categories-as-system.sdp.md new file mode 100644 index 00000000..58f28506 --- /dev/null +++ b/specs/behavior/platform-core/commands/categories.examples/s-011-classification-of-categories-as-system.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.categories.classification-of-categories-as-system +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.categories +--- +# Classification of categories as system + +## Intent + +- outcome: Executable scenario "Classification of categories as system" from packages/platform-core/tests/features/behavior/commands/categories.feature diff --git a/specs/behavior/platform-core/commands/categories.examples/s-012-classification-of-categories-as-batch.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-012-classification-of-categories-as-batch.sdp.md new file mode 100644 index 00000000..596a48d0 --- /dev/null +++ b/specs/behavior/platform-core/commands/categories.examples/s-012-classification-of-categories-as-batch.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.categories.classification-of-categories-as-batch +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.categories +--- +# Classification of categories as batch + +## Intent + +- outcome: Executable scenario "Classification of categories as batch" from packages/platform-core/tests/features/behavior/commands/categories.feature diff --git a/specs/behavior/platform-core/commands/categories.examples/s-013-schema-accepts-valid-aggregate-targets.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-013-schema-accepts-valid-aggregate-targets.sdp.md new file mode 100644 index 00000000..c6aabc48 --- /dev/null +++ b/specs/behavior/platform-core/commands/categories.examples/s-013-schema-accepts-valid-aggregate-targets.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.categories.schema-accepts-valid-aggregate-targets +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.categories +--- +# Schema accepts valid aggregate targets + +## Intent + +- outcome: Executable scenario "Schema accepts valid aggregate targets" from packages/platform-core/tests/features/behavior/commands/categories.feature diff --git a/specs/behavior/platform-core/commands/categories.examples/s-014-schema-rejects-invalid-aggregate-targets.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-014-schema-rejects-invalid-aggregate-targets.sdp.md new file mode 100644 index 00000000..c5de7915 --- /dev/null +++ b/specs/behavior/platform-core/commands/categories.examples/s-014-schema-rejects-invalid-aggregate-targets.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.categories.schema-rejects-invalid-aggregate-targets +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.categories +--- +# Schema rejects invalid aggregate targets + +## Intent + +- outcome: Executable scenario "Schema rejects invalid aggregate targets" from packages/platform-core/tests/features/behavior/commands/categories.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-001-error-categories-has-exactly-four-entries-with-correct-values.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-001-error-categories-has-exactly-four-entries-with-correct-values.sdp.md new file mode 100644 index 00000000..25f8407d --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-001-error-categories-has-exactly-four-entries-with-correct-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.error-categories-has-exactly-four-entries-with-correct-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# ERROR_CATEGORIES has exactly four entries with correct values + +## Intent + +- outcome: Executable scenario "ERROR_CATEGORIES has exactly four entries with correct values" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-002-error-category-members-have-correct-string-values.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-002-error-category-members-have-correct-string-values.sdp.md new file mode 100644 index 00000000..b9a64680 --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-002-error-category-members-have-correct-string-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.error-category-members-have-correct-string-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# ErrorCategory members have correct string values + +## Intent + +- outcome: Executable scenario "ErrorCategory members have correct string values" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-003-type-guard-accepts-valid-error-categories.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-003-type-guard-accepts-valid-error-categories.sdp.md new file mode 100644 index 00000000..fec49408 --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-003-type-guard-accepts-valid-error-categories.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.type-guard-accepts-valid-error-categories +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# Type guard accepts valid error categories + +## Intent + +- outcome: Executable scenario "Type guard accepts valid error categories" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-004-type-guard-rejects-invalid-values.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-004-type-guard-rejects-invalid-values.sdp.md new file mode 100644 index 00000000..092483c4 --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-004-type-guard-rejects-invalid-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.type-guard-rejects-invalid-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# Type guard rejects invalid values + +## Intent + +- outcome: Executable scenario "Type guard rejects invalid values" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-005-command-error-is-created-with-all-properties.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-005-command-error-is-created-with-all-properties.sdp.md new file mode 100644 index 00000000..ad40419f --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-005-command-error-is-created-with-all-properties.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.command-error-is-created-with-all-properties +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# CommandError is created with all properties + +## Intent + +- outcome: Executable scenario "CommandError is created with all properties" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-006-command-error-is-an-instance-of-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-006-command-error-is-an-instance-of-error.sdp.md new file mode 100644 index 00000000..bd97b7dc --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-006-command-error-is-an-instance-of-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.command-error-is-an-instance-of-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# CommandError is an instance of Error + +## Intent + +- outcome: Executable scenario "CommandError is an instance of Error" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-007-command-error-from-returns-existing-command-error-unchanged.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-007-command-error-from-returns-existing-command-error-unchanged.sdp.md new file mode 100644 index 00000000..fd616bec --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-007-command-error-from-returns-existing-command-error-unchanged.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.command-error-from-returns-existing-command-error-unchanged +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# CommandError.from returns existing CommandError unchanged + +## Intent + +- outcome: Executable scenario "CommandError.from returns existing CommandError unchanged" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-008-command-error-from-wraps-a-regular-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-008-command-error-from-wraps-a-regular-error.sdp.md new file mode 100644 index 00000000..2ea5effa --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-008-command-error-from-wraps-a-regular-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.command-error-from-wraps-a-regular-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# CommandError.from wraps a regular Error + +## Intent + +- outcome: Executable scenario "CommandError.from wraps a regular Error" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-009-command-error-from-wraps-a-string-value.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-009-command-error-from-wraps-a-string-value.sdp.md new file mode 100644 index 00000000..47ce9a4a --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-009-command-error-from-wraps-a-string-value.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.command-error-from-wraps-a-string-value +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# CommandError.from wraps a string value + +## Intent + +- outcome: Executable scenario "CommandError.from wraps a string value" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-010-command-error-from-wraps-an-unknown-value.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-010-command-error-from-wraps-an-unknown-value.sdp.md new file mode 100644 index 00000000..2b59840e --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-010-command-error-from-wraps-an-unknown-value.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.command-error-from-wraps-an-unknown-value +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# CommandError.from wraps an unknown value + +## Intent + +- outcome: Executable scenario "CommandError.from wraps an unknown value" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-011-to-json-serializes-error-with-context.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-011-to-json-serializes-error-with-context.sdp.md new file mode 100644 index 00000000..8f88c92a --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-011-to-json-serializes-error-with-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.to-json-serializes-error-with-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# toJSON serializes error with context + +## Intent + +- outcome: Executable scenario "toJSON serializes error with context" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-012-to-json-handles-undefined-context.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-012-to-json-handles-undefined-context.sdp.md new file mode 100644 index 00000000..13c0e742 --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-012-to-json-handles-undefined-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.to-json-handles-undefined-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# toJSON handles undefined context + +## Intent + +- outcome: Executable scenario "toJSON handles undefined context" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-013-factory-creates-domain-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-013-factory-creates-domain-error.sdp.md new file mode 100644 index 00000000..c975e9a1 --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-013-factory-creates-domain-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.factory-creates-domain-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# Factory creates domain error + +## Intent + +- outcome: Executable scenario "Factory creates domain error" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-014-factory-creates-validation-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-014-factory-creates-validation-error.sdp.md new file mode 100644 index 00000000..76bc390b --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-014-factory-creates-validation-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.factory-creates-validation-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# Factory creates validation error + +## Intent + +- outcome: Executable scenario "Factory creates validation error" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-015-factory-creates-concurrency-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-015-factory-creates-concurrency-error.sdp.md new file mode 100644 index 00000000..98d181c6 --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-015-factory-creates-concurrency-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.factory-creates-concurrency-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# Factory creates concurrency error + +## Intent + +- outcome: Executable scenario "Factory creates concurrency error" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-016-factory-creates-infrastructure-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-016-factory-creates-infrastructure-error.sdp.md new file mode 100644 index 00000000..84f18862 --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-016-factory-creates-infrastructure-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.factory-creates-infrastructure-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# Factory creates infrastructure error + +## Intent + +- outcome: Executable scenario "Factory creates infrastructure error" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-017-factory-creates-not-found-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-017-factory-creates-not-found-error.sdp.md new file mode 100644 index 00000000..900ef409 --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-017-factory-creates-not-found-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.factory-creates-not-found-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# Factory creates not found error + +## Intent + +- outcome: Executable scenario "Factory creates not found error" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-018-factory-creates-already-exists-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-018-factory-creates-already-exists-error.sdp.md new file mode 100644 index 00000000..b19ea972 --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-018-factory-creates-already-exists-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.factory-creates-already-exists-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# Factory creates already exists error + +## Intent + +- outcome: Executable scenario "Factory creates already exists error" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-019-factory-creates-invalid-state-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-019-factory-creates-invalid-state-error.sdp.md new file mode 100644 index 00000000..3f28fdc5 --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-019-factory-creates-invalid-state-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.factory-creates-invalid-state-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# Factory creates invalid state error + +## Intent + +- outcome: Executable scenario "Factory creates invalid state error" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-020-factory-creates-unauthorized-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-020-factory-creates-unauthorized-error.sdp.md new file mode 100644 index 00000000..2ca54184 --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-020-factory-creates-unauthorized-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.factory-creates-unauthorized-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# Factory creates unauthorized error + +## Intent + +- outcome: Executable scenario "Factory creates unauthorized error" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-021-factory-creates-rate-limited-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-021-factory-creates-rate-limited-error.sdp.md new file mode 100644 index 00000000..56dcdf13 --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-021-factory-creates-rate-limited-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.factory-creates-rate-limited-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# Factory creates rate limited error + +## Intent + +- outcome: Executable scenario "Factory creates rate limited error" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-022-returns-true-for-matching-category.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-022-returns-true-for-matching-category.sdp.md new file mode 100644 index 00000000..bdfddcf3 --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-022-returns-true-for-matching-category.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.returns-true-for-matching-category +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# Returns true for matching category + +## Intent + +- outcome: Executable scenario "Returns true for matching category" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-023-returns-false-for-non-matching-category.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-023-returns-false-for-non-matching-category.sdp.md new file mode 100644 index 00000000..27a7e5d9 --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-023-returns-false-for-non-matching-category.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.returns-false-for-non-matching-category +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# Returns false for non-matching category + +## Intent + +- outcome: Executable scenario "Returns false for non-matching category" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-024-returns-false-for-non-command-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-024-returns-false-for-non-command-error.sdp.md new file mode 100644 index 00000000..816d0be8 --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-024-returns-false-for-non-command-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.returns-false-for-non-command-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# Returns false for non-CommandError + +## Intent + +- outcome: Executable scenario "Returns false for non-CommandError" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-025-recoverable-errors-are-identified-correctly.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-025-recoverable-errors-are-identified-correctly.sdp.md new file mode 100644 index 00000000..fb9ab6ca --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-025-recoverable-errors-are-identified-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.recoverable-errors-are-identified-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# Recoverable errors are identified correctly + +## Intent + +- outcome: Executable scenario "Recoverable errors are identified correctly" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-026-non-recoverable-error-gets-delay-of-1.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-026-non-recoverable-error-gets-delay-of-1.sdp.md new file mode 100644 index 00000000..04fdbdae --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-026-non-recoverable-error-gets-delay-of-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.non-recoverable-error-gets-delay-of-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# Non-recoverable error gets delay of -1 + +## Intent + +- outcome: Executable scenario "Non-recoverable error gets delay of -1" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-027-concurrency-error-delays-escalate-then-cap.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-027-concurrency-error-delays-escalate-then-cap.sdp.md new file mode 100644 index 00000000..604c4c17 --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-027-concurrency-error-delays-escalate-then-cap.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.concurrency-error-delays-escalate-then-cap +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# Concurrency error delays escalate then cap + +## Intent + +- outcome: Executable scenario "Concurrency error delays escalate then cap" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-028-infrastructure-error-delays-escalate-then-cap.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-028-infrastructure-error-delays-escalate-then-cap.sdp.md new file mode 100644 index 00000000..034953a7 --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-028-infrastructure-error-delays-escalate-then-cap.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.infrastructure-error-delays-escalate-then-cap +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# Infrastructure error delays escalate then cap + +## Intent + +- outcome: Executable scenario "Infrastructure error delays escalate then cap" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/errors.examples/s-029-unknown-error-gets-infrastructure-style-delay.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-029-unknown-error-gets-infrastructure-style-delay.sdp.md new file mode 100644 index 00000000..92b3a823 --- /dev/null +++ b/specs/behavior/platform-core/commands/errors.examples/s-029-unknown-error-gets-infrastructure-style-delay.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.errors.unknown-error-gets-infrastructure-style-delay +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.errors +--- +# Unknown error gets infrastructure-style delay + +## Intent + +- outcome: Executable scenario "Unknown error gets infrastructure-style delay" from packages/platform-core/tests/features/behavior/commands/errors.feature diff --git a/specs/behavior/platform-core/commands/factories.examples/s-001-schema-assigns-aggregate-category-and-preserves-command-type.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-001-schema-assigns-aggregate-category-and-preserves-command-type.sdp.md new file mode 100644 index 00000000..a05305eb --- /dev/null +++ b/specs/behavior/platform-core/commands/factories.examples/s-001-schema-assigns-aggregate-category-and-preserves-command-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.factories.schema-assigns-aggregate-category-and-preserves-command-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.factories +--- +# Schema assigns aggregate category and preserves command type + +## Intent + +- outcome: Executable scenario "Schema assigns aggregate category and preserves command type" from packages/platform-core/tests/features/behavior/commands/factories.feature diff --git a/specs/behavior/platform-core/commands/factories.examples/s-002-aggregate-target-is-present-on-parsed-command.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-002-aggregate-target-is-present-on-parsed-command.sdp.md new file mode 100644 index 00000000..28d05c4d --- /dev/null +++ b/specs/behavior/platform-core/commands/factories.examples/s-002-aggregate-target-is-present-on-parsed-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.factories.aggregate-target-is-present-on-parsed-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.factories +--- +# Aggregate target is present on parsed command + +## Intent + +- outcome: Executable scenario "Aggregate target is present on parsed command" from packages/platform-core/tests/features/behavior/commands/factories.feature diff --git a/specs/behavior/platform-core/commands/factories.examples/s-003-aggregate-target-is-undefined-when-not-configured.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-003-aggregate-target-is-undefined-when-not-configured.sdp.md new file mode 100644 index 00000000..5d641875 --- /dev/null +++ b/specs/behavior/platform-core/commands/factories.examples/s-003-aggregate-target-is-undefined-when-not-configured.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.factories.aggregate-target-is-undefined-when-not-configured +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.factories +--- +# Aggregate target is undefined when not configured + +## Intent + +- outcome: Executable scenario "Aggregate target is undefined when not configured" from packages/platform-core/tests/features/behavior/commands/factories.feature diff --git a/specs/behavior/platform-core/commands/factories.examples/s-004-schema-rejects-a-mismatched-command-type.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-004-schema-rejects-a-mismatched-command-type.sdp.md new file mode 100644 index 00000000..030ec38b --- /dev/null +++ b/specs/behavior/platform-core/commands/factories.examples/s-004-schema-rejects-a-mismatched-command-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.factories.schema-rejects-a-mismatched-command-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.factories +--- +# Schema rejects a mismatched command type + +## Intent + +- outcome: Executable scenario "Schema rejects a mismatched command type" from packages/platform-core/tests/features/behavior/commands/factories.feature diff --git a/specs/behavior/platform-core/commands/factories.examples/s-005-schema-rejects-commands-missing-required-fields.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-005-schema-rejects-commands-missing-required-fields.sdp.md new file mode 100644 index 00000000..34cd13f2 --- /dev/null +++ b/specs/behavior/platform-core/commands/factories.examples/s-005-schema-rejects-commands-missing-required-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.factories.schema-rejects-commands-missing-required-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.factories +--- +# Schema rejects commands missing required fields + +## Intent + +- outcome: Executable scenario "Schema rejects commands missing required fields" from packages/platform-core/tests/features/behavior/commands/factories.feature diff --git a/specs/behavior/platform-core/commands/factories.examples/s-006-schema-assigns-process-category-and-preserves-command-type.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-006-schema-assigns-process-category-and-preserves-command-type.sdp.md new file mode 100644 index 00000000..ae7c7141 --- /dev/null +++ b/specs/behavior/platform-core/commands/factories.examples/s-006-schema-assigns-process-category-and-preserves-command-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.factories.schema-assigns-process-category-and-preserves-command-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.factories +--- +# Schema assigns process category and preserves command type + +## Intent + +- outcome: Executable scenario "Schema assigns process category and preserves command type" from packages/platform-core/tests/features/behavior/commands/factories.feature diff --git a/specs/behavior/platform-core/commands/factories.examples/s-007-process-type-is-present-on-parsed-command.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-007-process-type-is-present-on-parsed-command.sdp.md new file mode 100644 index 00000000..21f3a728 --- /dev/null +++ b/specs/behavior/platform-core/commands/factories.examples/s-007-process-type-is-present-on-parsed-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.factories.process-type-is-present-on-parsed-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.factories +--- +# Process type is present on parsed command + +## Intent + +- outcome: Executable scenario "Process type is present on parsed command" from packages/platform-core/tests/features/behavior/commands/factories.feature diff --git a/specs/behavior/platform-core/commands/factories.examples/s-008-process-type-is-undefined-when-not-configured.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-008-process-type-is-undefined-when-not-configured.sdp.md new file mode 100644 index 00000000..b7c1c45f --- /dev/null +++ b/specs/behavior/platform-core/commands/factories.examples/s-008-process-type-is-undefined-when-not-configured.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.factories.process-type-is-undefined-when-not-configured +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.factories +--- +# Process type is undefined when not configured + +## Intent + +- outcome: Executable scenario "Process type is undefined when not configured" from packages/platform-core/tests/features/behavior/commands/factories.feature diff --git a/specs/behavior/platform-core/commands/factories.examples/s-009-schema-assigns-system-category-and-preserves-command-type.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-009-schema-assigns-system-category-and-preserves-command-type.sdp.md new file mode 100644 index 00000000..0ba0fe6e --- /dev/null +++ b/specs/behavior/platform-core/commands/factories.examples/s-009-schema-assigns-system-category-and-preserves-command-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.factories.schema-assigns-system-category-and-preserves-command-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.factories +--- +# Schema assigns system category and preserves command type + +## Intent + +- outcome: Executable scenario "Schema assigns system category and preserves command type" from packages/platform-core/tests/features/behavior/commands/factories.feature diff --git a/specs/behavior/platform-core/commands/factories.examples/s-010-requires-idempotency-defaults-to-false.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-010-requires-idempotency-defaults-to-false.sdp.md new file mode 100644 index 00000000..57102cad --- /dev/null +++ b/specs/behavior/platform-core/commands/factories.examples/s-010-requires-idempotency-defaults-to-false.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.factories.requires-idempotency-defaults-to-false +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.factories +--- +# requiresIdempotency defaults to false + +## Intent + +- outcome: Executable scenario "requiresIdempotency defaults to false" from packages/platform-core/tests/features/behavior/commands/factories.feature diff --git a/specs/behavior/platform-core/commands/factories.examples/s-011-requires-idempotency-can-be-set-to-true.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-011-requires-idempotency-can-be-set-to-true.sdp.md new file mode 100644 index 00000000..7633b39d --- /dev/null +++ b/specs/behavior/platform-core/commands/factories.examples/s-011-requires-idempotency-can-be-set-to-true.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.factories.requires-idempotency-can-be-set-to-true +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.factories +--- +# requiresIdempotency can be set to true + +## Intent + +- outcome: Executable scenario "requiresIdempotency can be set to true" from packages/platform-core/tests/features/behavior/commands/factories.feature diff --git a/specs/behavior/platform-core/commands/factories.examples/s-012-schema-assigns-batch-category-with-items.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-012-schema-assigns-batch-category-with-items.sdp.md new file mode 100644 index 00000000..31f36409 --- /dev/null +++ b/specs/behavior/platform-core/commands/factories.examples/s-012-schema-assigns-batch-category-with-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.factories.schema-assigns-batch-category-with-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.factories +--- +# Schema assigns batch category with items + +## Intent + +- outcome: Executable scenario "Schema assigns batch category with items" from packages/platform-core/tests/features/behavior/commands/factories.feature diff --git a/specs/behavior/platform-core/commands/factories.examples/s-013-batch-config-is-present-on-parsed-command.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-013-batch-config-is-present-on-parsed-command.sdp.md new file mode 100644 index 00000000..0003f7e7 --- /dev/null +++ b/specs/behavior/platform-core/commands/factories.examples/s-013-batch-config-is-present-on-parsed-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.factories.batch-config-is-present-on-parsed-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.factories +--- +# Batch config is present on parsed command + +## Intent + +- outcome: Executable scenario "Batch config is present on parsed command" from packages/platform-core/tests/features/behavior/commands/factories.feature diff --git a/specs/behavior/platform-core/commands/factories.examples/s-014-schema-rejects-items-that-fail-item-schema-validation.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-014-schema-rejects-items-that-fail-item-schema-validation.sdp.md new file mode 100644 index 00000000..306aebb3 --- /dev/null +++ b/specs/behavior/platform-core/commands/factories.examples/s-014-schema-rejects-items-that-fail-item-schema-validation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.factories.schema-rejects-items-that-fail-item-schema-validation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.factories +--- +# Schema rejects items that fail item schema validation + +## Intent + +- outcome: Executable scenario "Schema rejects items that fail item schema validation" from packages/platform-core/tests/features/behavior/commands/factories.feature diff --git a/specs/behavior/platform-core/commands/factories.examples/s-015-empty-items-array-is-accepted.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-015-empty-items-array-is-accepted.sdp.md new file mode 100644 index 00000000..083e37d2 --- /dev/null +++ b/specs/behavior/platform-core/commands/factories.examples/s-015-empty-items-array-is-accepted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.factories.empty-items-array-is-accepted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.factories +--- +# Empty items array is accepted + +## Intent + +- outcome: Executable scenario "Empty items array is accepted" from packages/platform-core/tests/features/behavior/commands/factories.feature diff --git a/specs/behavior/platform-core/commands/factories.examples/s-016-category-is-extracted-from-each-factory-schema.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-016-category-is-extracted-from-each-factory-schema.sdp.md new file mode 100644 index 00000000..9cb70be7 --- /dev/null +++ b/specs/behavior/platform-core/commands/factories.examples/s-016-category-is-extracted-from-each-factory-schema.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.factories.category-is-extracted-from-each-factory-schema +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.factories +--- +# Category is extracted from each factory schema + +## Intent + +- outcome: Executable scenario "Category is extracted from each factory schema" from packages/platform-core/tests/features/behavior/commands/factories.feature diff --git a/specs/behavior/platform-core/commands/factories.examples/s-017-non-command-schemas-return-undefined.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-017-non-command-schemas-return-undefined.sdp.md new file mode 100644 index 00000000..46b7c517 --- /dev/null +++ b/specs/behavior/platform-core/commands/factories.examples/s-017-non-command-schemas-return-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.factories.non-command-schemas-return-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.factories +--- +# Non-command schemas return undefined + +## Intent + +- outcome: Executable scenario "Non-command schemas return undefined" from packages/platform-core/tests/features/behavior/commands/factories.feature diff --git a/specs/behavior/platform-core/commands/naming.examples/s-001-command-name-prefixes-includes-all-standard-prefixes.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-001-command-name-prefixes-includes-all-standard-prefixes.sdp.md new file mode 100644 index 00000000..7ce1f000 --- /dev/null +++ b/specs/behavior/platform-core/commands/naming.examples/s-001-command-name-prefixes-includes-all-standard-prefixes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.naming.command-name-prefixes-includes-all-standard-prefixes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.naming +--- +# COMMAND_NAME_PREFIXES includes all standard prefixes + +## Intent + +- outcome: Executable scenario "COMMAND_NAME_PREFIXES includes all standard prefixes" from packages/platform-core/tests/features/behavior/commands/naming.feature diff --git a/specs/behavior/platform-core/commands/naming.examples/s-002-create-pattern-accepts-valid-create-prefixed-names.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-002-create-pattern-accepts-valid-create-prefixed-names.sdp.md new file mode 100644 index 00000000..163b0ed2 --- /dev/null +++ b/specs/behavior/platform-core/commands/naming.examples/s-002-create-pattern-accepts-valid-create-prefixed-names.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.naming.create-pattern-accepts-valid-create-prefixed-names +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.naming +--- +# CREATE pattern accepts valid Create-prefixed names + +## Intent + +- outcome: Executable scenario "CREATE pattern accepts valid Create-prefixed names" from packages/platform-core/tests/features/behavior/commands/naming.feature diff --git a/specs/behavior/platform-core/commands/naming.examples/s-003-add-pattern-accepts-valid-add-prefixed-names.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-003-add-pattern-accepts-valid-add-prefixed-names.sdp.md new file mode 100644 index 00000000..d7895531 --- /dev/null +++ b/specs/behavior/platform-core/commands/naming.examples/s-003-add-pattern-accepts-valid-add-prefixed-names.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.naming.add-pattern-accepts-valid-add-prefixed-names +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.naming +--- +# ADD pattern accepts valid Add-prefixed names + +## Intent + +- outcome: Executable scenario "ADD pattern accepts valid Add-prefixed names" from packages/platform-core/tests/features/behavior/commands/naming.feature diff --git a/specs/behavior/platform-core/commands/naming.examples/s-004-update-pattern-accepts-update-change-and-modify-prefixes.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-004-update-pattern-accepts-update-change-and-modify-prefixes.sdp.md new file mode 100644 index 00000000..a0bc20ce --- /dev/null +++ b/specs/behavior/platform-core/commands/naming.examples/s-004-update-pattern-accepts-update-change-and-modify-prefixes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.naming.update-pattern-accepts-update-change-and-modify-prefixes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.naming +--- +# UPDATE pattern accepts Update, Change, and Modify prefixes + +## Intent + +- outcome: Executable scenario "UPDATE pattern accepts Update, Change, and Modify prefixes" from packages/platform-core/tests/features/behavior/commands/naming.feature diff --git a/specs/behavior/platform-core/commands/naming.examples/s-005-valid-command-names-are-accepted.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-005-valid-command-names-are-accepted.sdp.md new file mode 100644 index 00000000..fa967a94 --- /dev/null +++ b/specs/behavior/platform-core/commands/naming.examples/s-005-valid-command-names-are-accepted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.naming.valid-command-names-are-accepted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.naming +--- +# Valid command names are accepted + +## Intent + +- outcome: Executable scenario "Valid command names are accepted" from packages/platform-core/tests/features/behavior/commands/naming.feature diff --git a/specs/behavior/platform-core/commands/naming.examples/s-006-invalid-command-names-are-rejected.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-006-invalid-command-names-are-rejected.sdp.md new file mode 100644 index 00000000..e29a2996 --- /dev/null +++ b/specs/behavior/platform-core/commands/naming.examples/s-006-invalid-command-names-are-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.naming.invalid-command-names-are-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.naming +--- +# Invalid command names are rejected + +## Intent + +- outcome: Executable scenario "Invalid command names are rejected" from packages/platform-core/tests/features/behavior/commands/naming.feature diff --git a/specs/behavior/platform-core/commands/naming.examples/s-007-valid-names-return-matched-prefix-and-valid-flag.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-007-valid-names-return-matched-prefix-and-valid-flag.sdp.md new file mode 100644 index 00000000..f93ce97c --- /dev/null +++ b/specs/behavior/platform-core/commands/naming.examples/s-007-valid-names-return-matched-prefix-and-valid-flag.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.naming.valid-names-return-matched-prefix-and-valid-flag +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.naming +--- +# Valid names return matched prefix and valid flag + +## Intent + +- outcome: Executable scenario "Valid names return matched prefix and valid flag" from packages/platform-core/tests/features/behavior/commands/naming.feature diff --git a/specs/behavior/platform-core/commands/naming.examples/s-008-invalid-name-returns-suggestions-and-error-message.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-008-invalid-name-returns-suggestions-and-error-message.sdp.md new file mode 100644 index 00000000..cd26e608 --- /dev/null +++ b/specs/behavior/platform-core/commands/naming.examples/s-008-invalid-name-returns-suggestions-and-error-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.naming.invalid-name-returns-suggestions-and-error-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.naming +--- +# Invalid name returns suggestions and error message + +## Intent + +- outcome: Executable scenario "Invalid name returns suggestions and error message" from packages/platform-core/tests/features/behavior/commands/naming.feature diff --git a/specs/behavior/platform-core/commands/naming.examples/s-009-inverted-name-receives-corrected-suggestion.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-009-inverted-name-receives-corrected-suggestion.sdp.md new file mode 100644 index 00000000..a0b0668a --- /dev/null +++ b/specs/behavior/platform-core/commands/naming.examples/s-009-inverted-name-receives-corrected-suggestion.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.naming.inverted-name-receives-corrected-suggestion +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.naming +--- +# Inverted name receives corrected suggestion + +## Intent + +- outcome: Executable scenario "Inverted name receives corrected suggestion" from packages/platform-core/tests/features/behavior/commands/naming.feature diff --git a/specs/behavior/platform-core/commands/naming.examples/s-010-suggestions-are-limited-to-at-most-3.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-010-suggestions-are-limited-to-at-most-3.sdp.md new file mode 100644 index 00000000..baf7bddb --- /dev/null +++ b/specs/behavior/platform-core/commands/naming.examples/s-010-suggestions-are-limited-to-at-most-3.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.naming.suggestions-are-limited-to-at-most-3 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.naming +--- +# Suggestions are limited to at most 3 + +## Intent + +- outcome: Executable scenario "Suggestions are limited to at most 3" from packages/platform-core/tests/features/behavior/commands/naming.feature diff --git a/specs/behavior/platform-core/commands/naming.examples/s-011-known-names-return-their-prefix.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-011-known-names-return-their-prefix.sdp.md new file mode 100644 index 00000000..90cab237 --- /dev/null +++ b/specs/behavior/platform-core/commands/naming.examples/s-011-known-names-return-their-prefix.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.naming.known-names-return-their-prefix +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.naming +--- +# Known names return their prefix + +## Intent + +- outcome: Executable scenario "Known names return their prefix" from packages/platform-core/tests/features/behavior/commands/naming.feature diff --git a/specs/behavior/platform-core/commands/naming.examples/s-012-invalid-or-empty-names-return-undefined.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-012-invalid-or-empty-names-return-undefined.sdp.md new file mode 100644 index 00000000..c844dffc --- /dev/null +++ b/specs/behavior/platform-core/commands/naming.examples/s-012-invalid-or-empty-names-return-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.naming.invalid-or-empty-names-return-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.naming +--- +# Invalid or empty names return undefined + +## Intent + +- outcome: Executable scenario "Invalid or empty names return undefined" from packages/platform-core/tests/features/behavior/commands/naming.feature diff --git a/specs/behavior/platform-core/commands/naming.examples/s-013-various-input-formats-produce-correct-pascal-case-names.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-013-various-input-formats-produce-correct-pascal-case-names.sdp.md new file mode 100644 index 00000000..630cd3c0 --- /dev/null +++ b/specs/behavior/platform-core/commands/naming.examples/s-013-various-input-formats-produce-correct-pascal-case-names.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.commands.naming.various-input-formats-produce-correct-pascal-case-names +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.commands.naming +--- +# Various input formats produce correct PascalCase names + +## Intent + +- outcome: Executable scenario "Various input formats produce correct PascalCase names" from packages/platform-core/tests/features/behavior/commands/naming.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-001-chain-uses-command-id-as-causation-id-and-generates-correlation-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-001-chain-uses-command-id-as-causation-id-and-generates-correlation-id.sdp.md new file mode 100644 index 00000000..79580441 --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-001-chain-uses-command-id-as-causation-id-and-generates-correlation-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.chain-uses-command-id-as-causation-id-and-generates-correlation-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Chain uses commandId as causationId and generates correlationId + +## Intent + +- outcome: Executable scenario "Chain uses commandId as causationId and generates correlationId" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-002-chain-uses-provided-correlation-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-002-chain-uses-provided-correlation-id.sdp.md new file mode 100644 index 00000000..fa92ee08 --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-002-chain-uses-provided-correlation-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.chain-uses-provided-correlation-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Chain uses provided correlationId + +## Intent + +- outcome: Executable scenario "Chain uses provided correlationId" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-003-chain-uses-provided-user-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-003-chain-uses-provided-user-id.sdp.md new file mode 100644 index 00000000..f317bc46 --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-003-chain-uses-provided-user-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.chain-uses-provided-user-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Chain uses provided userId + +## Intent + +- outcome: Executable scenario "Chain uses provided userId" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-004-chain-uses-provided-context.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-004-chain-uses-provided-context.sdp.md new file mode 100644 index 00000000..192b3dee --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-004-chain-uses-provided-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.chain-uses-provided-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Chain uses provided context + +## Intent + +- outcome: Executable scenario "Chain uses provided context" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-005-chain-uses-provided-initiated-at.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-005-chain-uses-provided-initiated-at.sdp.md new file mode 100644 index 00000000..50253c28 --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-005-chain-uses-provided-initiated-at.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.chain-uses-provided-initiated-at +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Chain uses provided initiatedAt + +## Intent + +- outcome: Executable scenario "Chain uses provided initiatedAt" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-006-chain-accepts-all-options-together.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-006-chain-accepts-all-options-together.sdp.md new file mode 100644 index 00000000..0f340eaa --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-006-chain-accepts-all-options-together.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.chain-accepts-all-options-together +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Chain accepts all options together + +## Intent + +- outcome: Executable scenario "Chain accepts all options together" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-007-derived-chain-preserves-correlation-id-and-uses-event-id-as-causation-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-007-derived-chain-preserves-correlation-id-and-uses-event-id-as-causation-id.sdp.md new file mode 100644 index 00000000..27fe6cd5 --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-007-derived-chain-preserves-correlation-id-and-uses-event-id-as-causation-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.derived-chain-preserves-correlation-id-and-uses-event-id-as-causation-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Derived chain preserves correlationId and uses eventId as causationId + +## Intent + +- outcome: Executable scenario "Derived chain preserves correlationId and uses eventId as causationId" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-008-derived-chain-inherits-user-id-from-source.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-008-derived-chain-inherits-user-id-from-source.sdp.md new file mode 100644 index 00000000..a0dd2d0b --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-008-derived-chain-inherits-user-id-from-source.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.derived-chain-inherits-user-id-from-source +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Derived chain inherits userId from source + +## Intent + +- outcome: Executable scenario "Derived chain inherits userId from source" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-009-derived-chain-inherits-context-from-source.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-009-derived-chain-inherits-context-from-source.sdp.md new file mode 100644 index 00000000..d5815fae --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-009-derived-chain-inherits-context-from-source.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.derived-chain-inherits-context-from-source +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Derived chain inherits context from source + +## Intent + +- outcome: Executable scenario "Derived chain inherits context from source" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-010-derived-chain-merges-source-and-option-contexts.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-010-derived-chain-merges-source-and-option-contexts.sdp.md new file mode 100644 index 00000000..6c7b4ef6 --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-010-derived-chain-merges-source-and-option-contexts.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.derived-chain-merges-source-and-option-contexts +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Derived chain merges source and option contexts + +## Intent + +- outcome: Executable scenario "Derived chain merges source and option contexts" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-011-option-context-takes-precedence-over-source-context.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-011-option-context-takes-precedence-over-source-context.sdp.md new file mode 100644 index 00000000..0329461f --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-011-option-context-takes-precedence-over-source-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.option-context-takes-precedence-over-source-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Option context takes precedence over source context + +## Intent + +- outcome: Executable scenario "Option context takes precedence over source context" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-012-source-context-preserved-when-options-have-no-context.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-012-source-context-preserved-when-options-have-no-context.sdp.md new file mode 100644 index 00000000..3a5fddf1 --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-012-source-context-preserved-when-options-have-no-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.source-context-preserved-when-options-have-no-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Source context preserved when options have no context + +## Intent + +- outcome: Executable scenario "Source context preserved when options have no context" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-013-options-context-used-when-source-has-no-context.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-013-options-context-used-when-source-has-no-context.sdp.md new file mode 100644 index 00000000..1e88848d --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-013-options-context-used-when-source-has-no-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.options-context-used-when-source-has-no-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Options context used when source has no context + +## Intent + +- outcome: Executable scenario "Options context used when source has no context" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-014-context-is-undefined-when-neither-source-nor-options-have-context.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-014-context-is-undefined-when-neither-source-nor-options-have-context.sdp.md new file mode 100644 index 00000000..35ea049b --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-014-context-is-undefined-when-neither-source-nor-options-have-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.context-is-undefined-when-neither-source-nor-options-have-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Context is undefined when neither source nor options have context + +## Intent + +- outcome: Executable scenario "Context is undefined when neither source nor options have context" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-015-both-empty-contexts-merge-to-empty-object.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-015-both-empty-contexts-merge-to-empty-object.sdp.md new file mode 100644 index 00000000..e87c38d5 --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-015-both-empty-contexts-merge-to-empty-object.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.both-empty-contexts-merge-to-empty-object +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Both empty contexts merge to empty object + +## Intent + +- outcome: Executable scenario "Both empty contexts merge to empty object" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-016-source-context-preserved-when-options-context-is-empty.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-016-source-context-preserved-when-options-context-is-empty.sdp.md new file mode 100644 index 00000000..3955410f --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-016-source-context-preserved-when-options-context-is-empty.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.source-context-preserved-when-options-context-is-empty +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Source context preserved when options context is empty + +## Intent + +- outcome: Executable scenario "Source context preserved when options context is empty" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-017-options-context-used-when-source-context-is-empty.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-017-options-context-used-when-source-context-is-empty.sdp.md new file mode 100644 index 00000000..85c0916e --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-017-options-context-used-when-source-context-is-empty.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.options-context-used-when-source-context-is-empty +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Options context used when source context is empty + +## Intent + +- outcome: Executable scenario "Options context used when source context is empty" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-018-derived-chain-uses-provided-command-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-018-derived-chain-uses-provided-command-id.sdp.md new file mode 100644 index 00000000..bcbdb1d2 --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-018-derived-chain-uses-provided-command-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.derived-chain-uses-provided-command-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Derived chain uses provided commandId + +## Intent + +- outcome: Executable scenario "Derived chain uses provided commandId" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-019-derived-chain-uses-provided-initiated-at.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-019-derived-chain-uses-provided-initiated-at.sdp.md new file mode 100644 index 00000000..927b001a --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-019-derived-chain-uses-provided-initiated-at.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.derived-chain-uses-provided-initiated-at +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Derived chain uses provided initiatedAt + +## Intent + +- outcome: Executable scenario "Derived chain uses provided initiatedAt" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-020-extracts-correlation-id-and-causation-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-020-extracts-correlation-id-and-causation-id.sdp.md new file mode 100644 index 00000000..48b149dd --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-020-extracts-correlation-id-and-causation-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.extracts-correlation-id-and-causation-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Extracts correlationId and causationId + +## Intent + +- outcome: Executable scenario "Extracts correlationId and causationId" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-021-includes-user-id-when-present.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-021-includes-user-id-when-present.sdp.md new file mode 100644 index 00000000..4493f5fd --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-021-includes-user-id-when-present.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.includes-user-id-when-present +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Includes userId when present + +## Intent + +- outcome: Executable scenario "Includes userId when present" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-022-excludes-user-id-when-undefined.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-022-excludes-user-id-when-undefined.sdp.md new file mode 100644 index 00000000..0a0d228a --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-022-excludes-user-id-when-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.excludes-user-id-when-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Excludes userId when undefined + +## Intent + +- outcome: Executable scenario "Excludes userId when undefined" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-023-merges-additional-metadata.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-023-merges-additional-metadata.sdp.md new file mode 100644 index 00000000..8a3f6ea7 --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-023-merges-additional-metadata.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.merges-additional-metadata +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Merges additional metadata + +## Intent + +- outcome: Executable scenario "Merges additional metadata" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-024-does-not-include-context-initiated-at-or-command-id-from-chain.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-024-does-not-include-context-initiated-at-or-command-id-from-chain.sdp.md new file mode 100644 index 00000000..d2f786c9 --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-024-does-not-include-context-initiated-at-or-command-id-from-chain.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.does-not-include-context-initiated-at-or-command-id-from-chain +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Does not include context, initiatedAt, or commandId from chain + +## Intent + +- outcome: Executable scenario "Does not include context, initiatedAt, or commandId from chain" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-025-returns-true-for-chains-with-same-correlation-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-025-returns-true-for-chains-with-same-correlation-id.sdp.md new file mode 100644 index 00000000..71ce185a --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-025-returns-true-for-chains-with-same-correlation-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.returns-true-for-chains-with-same-correlation-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Returns true for chains with same correlationId + +## Intent + +- outcome: Executable scenario "Returns true for chains with same correlationId" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-026-returns-false-for-chains-with-different-correlation-ids.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-026-returns-false-for-chains-with-different-correlation-ids.sdp.md new file mode 100644 index 00000000..44a8f09b --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-026-returns-false-for-chains-with-different-correlation-ids.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.returns-false-for-chains-with-different-correlation-ids +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Returns false for chains with different correlationIds + +## Intent + +- outcome: Executable scenario "Returns false for chains with different correlationIds" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-027-returns-true-when-child-causation-id-matches-parent-command-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-027-returns-true-when-child-causation-id-matches-parent-command-id.sdp.md new file mode 100644 index 00000000..1de63f0a --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-027-returns-true-when-child-causation-id-matches-parent-command-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.returns-true-when-child-causation-id-matches-parent-command-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Returns true when child causationId matches parent commandId + +## Intent + +- outcome: Executable scenario "Returns true when child causationId matches parent commandId" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-028-returns-false-when-child-causation-id-does-not-match.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-028-returns-false-when-child-causation-id-does-not-match.sdp.md new file mode 100644 index 00000000..72eed607 --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-028-returns-false-when-child-causation-id-does-not-match.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.returns-false-when-child-causation-id-does-not-match +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Returns false when child causationId does not match + +## Intent + +- outcome: Executable scenario "Returns false when child causationId does not match" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-029-returns-true-for-same-chain-where-command-is-its-own-cause.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-029-returns-true-for-same-chain-where-command-is-its-own-cause.sdp.md new file mode 100644 index 00000000..571225ca --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-029-returns-true-for-same-chain-where-command-is-its-own-cause.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.returns-true-for-same-chain-where-command-is-its-own-cause +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Returns true for same chain where command is its own cause + +## Intent + +- outcome: Executable scenario "Returns true for same chain where command is its own cause" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-030-full-request-flow-tracing-from-user-command-through-saga-reaction.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-030-full-request-flow-tracing-from-user-command-through-saga-reaction.sdp.md new file mode 100644 index 00000000..2bbfe13d --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-030-full-request-flow-tracing-from-user-command-through-saga-reaction.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.full-request-flow-tracing-from-user-command-through-saga-reaction +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Full request flow tracing from user command through saga reaction + +## Intent + +- outcome: Executable scenario "Full request flow tracing from user command through saga reaction" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-031-multi-step-saga-preserves-correlation-id-across-three-links.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-031-multi-step-saga-preserves-correlation-id-across-three-links.sdp.md new file mode 100644 index 00000000..734e9a67 --- /dev/null +++ b/specs/behavior/platform-core/correlation/chain.examples/s-031-multi-step-saga-preserves-correlation-id-across-three-links.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.chain.multi-step-saga-preserves-correlation-id-across-three-links +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.chain +--- +# Multi-step saga preserves correlationId across three links + +## Intent + +- outcome: Executable scenario "Multi-step saga preserves correlationId across three links" from packages/platform-core/tests/features/behavior/correlation/chain.feature diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-001-record-a-new-correlation.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-001-record-a-new-correlation.sdp.md new file mode 100644 index 00000000..e29f4698 --- /dev/null +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-001-record-a-new-correlation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.correlation-service.record-a-new-correlation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.correlation-service +--- +# Record a new correlation + +## Intent + +- outcome: Executable scenario "Record a new correlation" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-002-merge-event-i-ds-for-existing-correlation.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-002-merge-event-i-ds-for-existing-correlation.sdp.md new file mode 100644 index 00000000..d89ff636 --- /dev/null +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-002-merge-event-i-ds-for-existing-correlation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.correlation-service.merge-event-i-ds-for-existing-correlation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.correlation-service +--- +# Merge event IDs for existing correlation + +## Intent + +- outcome: Executable scenario "Merge event IDs for existing correlation" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-003-return-null-for-non-existent-command.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-003-return-null-for-non-existent-command.sdp.md new file mode 100644 index 00000000..4c3e0dfd --- /dev/null +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-003-return-null-for-non-existent-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.correlation-service.return-null-for-non-existent-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.correlation-service +--- +# Return null for non-existent command + +## Intent + +- outcome: Executable scenario "Return null for non-existent command" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-004-return-correlation-for-existing-command.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-004-return-correlation-for-existing-command.sdp.md new file mode 100644 index 00000000..5a5155ec --- /dev/null +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-004-return-correlation-for-existing-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.correlation-service.return-correlation-for-existing-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.correlation-service +--- +# Return correlation for existing command + +## Intent + +- outcome: Executable scenario "Return correlation for existing command" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-005-filter-by-bounded-context.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-005-filter-by-bounded-context.sdp.md new file mode 100644 index 00000000..bd91aa7b --- /dev/null +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-005-filter-by-bounded-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.correlation-service.filter-by-bounded-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.correlation-service +--- +# Filter by bounded context + +## Intent + +- outcome: Executable scenario "Filter by bounded context" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-006-throw-when-bounded-context-is-missing.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-006-throw-when-bounded-context-is-missing.sdp.md new file mode 100644 index 00000000..a109cda1 --- /dev/null +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-006-throw-when-bounded-context-is-missing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.correlation-service.throw-when-bounded-context-is-missing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.correlation-service +--- +# Throw when boundedContext is missing + +## Intent + +- outcome: Executable scenario "Throw when boundedContext is missing" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-007-respect-limit-parameter.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-007-respect-limit-parameter.sdp.md new file mode 100644 index 00000000..739eb588 --- /dev/null +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-007-respect-limit-parameter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.correlation-service.respect-limit-parameter +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.correlation-service +--- +# Respect limit parameter + +## Intent + +- outcome: Executable scenario "Respect limit parameter" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-008-return-true-for-command-with-events.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-008-return-true-for-command-with-events.sdp.md new file mode 100644 index 00000000..862d3cb8 --- /dev/null +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-008-return-true-for-command-with-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.correlation-service.return-true-for-command-with-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.correlation-service +--- +# Return true for command with events + +## Intent + +- outcome: Executable scenario "Return true for command with events" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-009-return-false-for-non-existent-command.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-009-return-false-for-non-existent-command.sdp.md new file mode 100644 index 00000000..b58bfb2f --- /dev/null +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-009-return-false-for-non-existent-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.correlation-service.return-false-for-non-existent-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.correlation-service +--- +# Return false for non-existent command + +## Intent + +- outcome: Executable scenario "Return false for non-existent command" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-010-return-event-count-for-existing-command.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-010-return-event-count-for-existing-command.sdp.md new file mode 100644 index 00000000..e10ec2cc --- /dev/null +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-010-return-event-count-for-existing-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.correlation-service.return-event-count-for-existing-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.correlation-service +--- +# Return event count for existing command + +## Intent + +- outcome: Executable scenario "Return event count for existing command" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-011-return-0-for-non-existent-command.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-011-return-0-for-non-existent-command.sdp.md new file mode 100644 index 00000000..0496c639 --- /dev/null +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-011-return-0-for-non-existent-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.correlation-service.return-0-for-non-existent-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.correlation-service +--- +# Return 0 for non-existent command + +## Intent + +- outcome: Executable scenario "Return 0 for non-existent command" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-012-create-a-correlation-service-instance.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-012-create-a-correlation-service-instance.sdp.md new file mode 100644 index 00000000..b74878d2 --- /dev/null +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-012-create-a-correlation-service-instance.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.correlation.correlation-service.create-a-correlation-service-instance +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.correlation.correlation-service +--- +# Create a CorrelationService instance + +## Intent + +- outcome: Executable scenario "Create a CorrelationService instance" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-001-successful-execution-without-scope-operations.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-001-successful-execution-without-scope-operations.sdp.md new file mode 100644 index 00000000..a7d84e1f --- /dev/null +++ b/specs/behavior/platform-core/dcb/execute.examples/s-001-successful-execution-without-scope-operations.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.execute.successful-execution-without-scope-operations +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.execute +--- +# Successful execution without scopeOperations + +## Intent + +- outcome: Executable scenario "Successful execution without scopeOperations" from packages/platform-core/tests/features/behavior/dcb/execute.feature diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-002-successful-execution-includes-schema-version-and-category-in-events.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-002-successful-execution-includes-schema-version-and-category-in-events.sdp.md new file mode 100644 index 00000000..2dafc6af --- /dev/null +++ b/specs/behavior/platform-core/dcb/execute.examples/s-002-successful-execution-includes-schema-version-and-category-in-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.execute.successful-execution-includes-schema-version-and-category-in-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.execute +--- +# Successful execution includes schemaVersion and category in events + +## Intent + +- outcome: Executable scenario "Successful execution includes schemaVersion and category in events" from packages/platform-core/tests/features/behavior/dcb/execute.feature diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-003-rejected-decider-result-returns-rejection.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-003-rejected-decider-result-returns-rejection.sdp.md new file mode 100644 index 00000000..a95a3b64 --- /dev/null +++ b/specs/behavior/platform-core/dcb/execute.examples/s-003-rejected-decider-result-returns-rejection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.execute.rejected-decider-result-returns-rejection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.execute +--- +# Rejected decider result returns rejection + +## Intent + +- outcome: Executable scenario "Rejected decider result returns rejection" from packages/platform-core/tests/features/behavior/dcb/execute.feature diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-004-failed-decider-result-returns-failure-with-event.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-004-failed-decider-result-returns-failure-with-event.sdp.md new file mode 100644 index 00000000..2bfe498b --- /dev/null +++ b/specs/behavior/platform-core/dcb/execute.examples/s-004-failed-decider-result-returns-failure-with-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.execute.failed-decider-result-returns-failure-with-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.execute +--- +# Failed decider result returns failure with event + +## Intent + +- outcome: Executable scenario "Failed decider result returns failure with event" from packages/platform-core/tests/features/behavior/dcb/execute.feature diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-005-occ-pre-check-passes-when-expected-version-matches-scope-version.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-005-occ-pre-check-passes-when-expected-version-matches-scope-version.sdp.md new file mode 100644 index 00000000..e378efd0 --- /dev/null +++ b/specs/behavior/platform-core/dcb/execute.examples/s-005-occ-pre-check-passes-when-expected-version-matches-scope-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.execute.occ-pre-check-passes-when-expected-version-matches-scope-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.execute +--- +# OCC pre-check passes when expectedVersion matches scope version + +## Intent + +- outcome: Executable scenario "OCC pre-check passes when expectedVersion matches scope version" from packages/platform-core/tests/features/behavior/dcb/execute.feature diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-006-occ-pre-check-detects-stale-expected-version.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-006-occ-pre-check-detects-stale-expected-version.sdp.md new file mode 100644 index 00000000..78d346bd --- /dev/null +++ b/specs/behavior/platform-core/dcb/execute.examples/s-006-occ-pre-check-detects-stale-expected-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.execute.occ-pre-check-detects-stale-expected-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.execute +--- +# OCC pre-check detects stale expectedVersion + +## Intent + +- outcome: Executable scenario "OCC pre-check detects stale expectedVersion" from packages/platform-core/tests/features/behavior/dcb/execute.feature diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-007-occ-pre-check-detects-scope-not-found-when-expected-version-0.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-007-occ-pre-check-detects-scope-not-found-when-expected-version-0.sdp.md new file mode 100644 index 00000000..8fbb1396 --- /dev/null +++ b/specs/behavior/platform-core/dcb/execute.examples/s-007-occ-pre-check-detects-scope-not-found-when-expected-version-0.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.execute.occ-pre-check-detects-scope-not-found-when-expected-version-0 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.execute +--- +# OCC pre-check detects scope not found when expectedVersion > 0 + +## Intent + +- outcome: Executable scenario "OCC pre-check detects scope not found when expectedVersion > 0" from packages/platform-core/tests/features/behavior/dcb/execute.feature diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-008-occ-pre-check-allows-new-scope-with-expected-version-0.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-008-occ-pre-check-allows-new-scope-with-expected-version-0.sdp.md new file mode 100644 index 00000000..710f0f66 --- /dev/null +++ b/specs/behavior/platform-core/dcb/execute.examples/s-008-occ-pre-check-allows-new-scope-with-expected-version-0.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.execute.occ-pre-check-allows-new-scope-with-expected-version-0 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.execute +--- +# OCC pre-check allows new scope with expectedVersion 0 + +## Intent + +- outcome: Executable scenario "OCC pre-check allows new scope with expectedVersion 0" from packages/platform-core/tests/features/behavior/dcb/execute.feature diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-009-occ-commit-detects-concurrent-modification.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-009-occ-commit-detects-concurrent-modification.sdp.md new file mode 100644 index 00000000..460473f3 --- /dev/null +++ b/specs/behavior/platform-core/dcb/execute.examples/s-009-occ-commit-detects-concurrent-modification.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.execute.occ-commit-detects-concurrent-modification +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.execute +--- +# OCC commit detects concurrent modification + +## Intent + +- outcome: Executable scenario "OCC commit detects concurrent modification" from packages/platform-core/tests/features/behavior/dcb/execute.feature diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-010-occ-commit-tracks-updated-stream-i-ds.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-010-occ-commit-tracks-updated-stream-i-ds.sdp.md new file mode 100644 index 00000000..c767f987 --- /dev/null +++ b/specs/behavior/platform-core/dcb/execute.examples/s-010-occ-commit-tracks-updated-stream-i-ds.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.execute.occ-commit-tracks-updated-stream-i-ds +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.execute +--- +# OCC commit tracks updated stream IDs + +## Intent + +- outcome: Executable scenario "OCC commit tracks updated stream IDs" from packages/platform-core/tests/features/behavior/dcb/execute.feature diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-011-invalid-scope-key-returns-rejection.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-011-invalid-scope-key-returns-rejection.sdp.md new file mode 100644 index 00000000..f6172d2b --- /dev/null +++ b/specs/behavior/platform-core/dcb/execute.examples/s-011-invalid-scope-key-returns-rejection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.execute.invalid-scope-key-returns-rejection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.execute +--- +# Invalid scope key returns rejection + +## Intent + +- outcome: Executable scenario "Invalid scope key returns rejection" from packages/platform-core/tests/features/behavior/dcb/execute.feature diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-012-missing-entities-returns-rejection.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-012-missing-entities-returns-rejection.sdp.md new file mode 100644 index 00000000..9fa1db49 --- /dev/null +++ b/specs/behavior/platform-core/dcb/execute.examples/s-012-missing-entities-returns-rejection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.execute.missing-entities-returns-rejection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.execute +--- +# Missing entities returns rejection + +## Intent + +- outcome: Executable scenario "Missing entities returns rejection" from packages/platform-core/tests/features/behavior/dcb/execute.feature diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-001-create-valid-scope-key-from-components.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-001-create-valid-scope-key-from-components.sdp.md new file mode 100644 index 00000000..db7a15ac --- /dev/null +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-001-create-valid-scope-key-from-components.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.scope-key.create-valid-scope-key-from-components +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.scope-key +--- +# Create valid scope key from components + +## Intent + +- outcome: Executable scenario "Create valid scope key from components" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-002-scope-id-may-contain-colons-for-composite-identifiers.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-002-scope-id-may-contain-colons-for-composite-identifiers.sdp.md new file mode 100644 index 00000000..fa868c69 --- /dev/null +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-002-scope-id-may-contain-colons-for-composite-identifiers.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.scope-key.scope-id-may-contain-colons-for-composite-identifiers +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.scope-key +--- +# Scope ID may contain colons for composite identifiers + +## Intent + +- outcome: Executable scenario "Scope ID may contain colons for composite identifiers" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-003-create-scope-key-throws-on-invalid-input.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-003-create-scope-key-throws-on-invalid-input.sdp.md new file mode 100644 index 00000000..b497de66 --- /dev/null +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-003-create-scope-key-throws-on-invalid-input.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.scope-key.create-scope-key-throws-on-invalid-input +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.scope-key +--- +# createScopeKey throws on invalid input + +## Intent + +- outcome: Executable scenario "createScopeKey throws on invalid input" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-004-try-create-scope-key-returns-scope-key-for-valid-input.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-004-try-create-scope-key-returns-scope-key-for-valid-input.sdp.md new file mode 100644 index 00000000..2c020bb7 --- /dev/null +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-004-try-create-scope-key-returns-scope-key-for-valid-input.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.scope-key.try-create-scope-key-returns-scope-key-for-valid-input +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.scope-key +--- +# tryCreateScopeKey returns scope key for valid input + +## Intent + +- outcome: Executable scenario "tryCreateScopeKey returns scope key for valid input" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-005-try-create-scope-key-returns-null-for-invalid-input.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-005-try-create-scope-key-returns-null-for-invalid-input.sdp.md new file mode 100644 index 00000000..8baa3529 --- /dev/null +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-005-try-create-scope-key-returns-null-for-invalid-input.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.scope-key.try-create-scope-key-returns-null-for-invalid-input +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.scope-key +--- +# tryCreateScopeKey returns null for invalid input + +## Intent + +- outcome: Executable scenario "tryCreateScopeKey returns null for invalid input" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-006-parse-valid-scope-key-into-components.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-006-parse-valid-scope-key-into-components.sdp.md new file mode 100644 index 00000000..402c983b --- /dev/null +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-006-parse-valid-scope-key-into-components.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.scope-key.parse-valid-scope-key-into-components +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.scope-key +--- +# Parse valid scope key into components + +## Intent + +- outcome: Executable scenario "Parse valid scope key into components" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-007-parse-scope-key-with-composite-scope-id-containing-colons.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-007-parse-scope-key-with-composite-scope-id-containing-colons.sdp.md new file mode 100644 index 00000000..386ddf69 --- /dev/null +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-007-parse-scope-key-with-composite-scope-id-containing-colons.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.scope-key.parse-scope-key-with-composite-scope-id-containing-colons +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.scope-key +--- +# Parse scope key with composite scopeId containing colons + +## Intent + +- outcome: Executable scenario "Parse scope key with composite scopeId containing colons" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-008-parse-scope-key-returns-null-for-invalid-format.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-008-parse-scope-key-returns-null-for-invalid-format.sdp.md new file mode 100644 index 00000000..79d62d80 --- /dev/null +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-008-parse-scope-key-returns-null-for-invalid-format.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.scope-key.parse-scope-key-returns-null-for-invalid-format +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.scope-key +--- +# parseScopeKey returns null for invalid format + +## Intent + +- outcome: Executable scenario "parseScopeKey returns null for invalid format" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-009-validate-scope-key-returns-null-for-valid-scope-key.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-009-validate-scope-key-returns-null-for-valid-scope-key.sdp.md new file mode 100644 index 00000000..fb762159 --- /dev/null +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-009-validate-scope-key-returns-null-for-valid-scope-key.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.scope-key.validate-scope-key-returns-null-for-valid-scope-key +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.scope-key +--- +# validateScopeKey returns null for valid scope key + +## Intent + +- outcome: Executable scenario "validateScopeKey returns null for valid scope key" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-010-validate-scope-key-returns-scope-key-empty-error-for-empty-string.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-010-validate-scope-key-returns-scope-key-empty-error-for-empty-string.sdp.md new file mode 100644 index 00000000..46056b3a --- /dev/null +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-010-validate-scope-key-returns-scope-key-empty-error-for-empty-string.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.scope-key.validate-scope-key-returns-scope-key-empty-error-for-empty-string +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.scope-key +--- +# validateScopeKey returns SCOPE_KEY_EMPTY error for empty string + +## Intent + +- outcome: Executable scenario "validateScopeKey returns SCOPE_KEY_EMPTY error for empty string" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-011-validate-scope-key-returns-error-for-missing-tenant-prefix.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-011-validate-scope-key-returns-error-for-missing-tenant-prefix.sdp.md new file mode 100644 index 00000000..1b65a9c9 --- /dev/null +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-011-validate-scope-key-returns-error-for-missing-tenant-prefix.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.scope-key.validate-scope-key-returns-error-for-missing-tenant-prefix +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.scope-key +--- +# validateScopeKey returns error for missing tenant prefix + +## Intent + +- outcome: Executable scenario "validateScopeKey returns error for missing tenant prefix" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-012-validate-scope-key-returns-error-for-malformed-scope-key.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-012-validate-scope-key-returns-error-for-malformed-scope-key.sdp.md new file mode 100644 index 00000000..7b9ab61a --- /dev/null +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-012-validate-scope-key-returns-error-for-malformed-scope-key.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.scope-key.validate-scope-key-returns-error-for-malformed-scope-key +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.scope-key +--- +# validateScopeKey returns error for malformed scope key + +## Intent + +- outcome: Executable scenario "validateScopeKey returns error for malformed scope key" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-013-is-valid-scope-key-type-guard.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-013-is-valid-scope-key-type-guard.sdp.md new file mode 100644 index 00000000..b804306c --- /dev/null +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-013-is-valid-scope-key-type-guard.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.scope-key.is-valid-scope-key-type-guard +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.scope-key +--- +# isValidScopeKey type guard + +## Intent + +- outcome: Executable scenario "isValidScopeKey type guard" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-014-assert-valid-scope-key-throws-on-invalid-input.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-014-assert-valid-scope-key-throws-on-invalid-input.sdp.md new file mode 100644 index 00000000..a40dbc5b --- /dev/null +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-014-assert-valid-scope-key-throws-on-invalid-input.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.scope-key.assert-valid-scope-key-throws-on-invalid-input +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.scope-key +--- +# assertValidScopeKey throws on invalid input + +## Intent + +- outcome: Executable scenario "assertValidScopeKey throws on invalid input" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-015-assert-valid-scope-key-succeeds-on-valid-input.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-015-assert-valid-scope-key-succeeds-on-valid-input.sdp.md new file mode 100644 index 00000000..b9c3a25e --- /dev/null +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-015-assert-valid-scope-key-succeeds-on-valid-input.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.scope-key.assert-valid-scope-key-succeeds-on-valid-input +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.scope-key +--- +# assertValidScopeKey succeeds on valid input + +## Intent + +- outcome: Executable scenario "assertValidScopeKey succeeds on valid input" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-016-is-scope-tenant-checks-tenant-membership.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-016-is-scope-tenant-checks-tenant-membership.sdp.md new file mode 100644 index 00000000..bd58cb07 --- /dev/null +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-016-is-scope-tenant-checks-tenant-membership.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.scope-key.is-scope-tenant-checks-tenant-membership +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.scope-key +--- +# isScopeTenant checks tenant membership + +## Intent + +- outcome: Executable scenario "isScopeTenant checks tenant membership" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-017-extract-tenant-id-returns-tenant-id-from-scope-key.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-017-extract-tenant-id-returns-tenant-id-from-scope-key.sdp.md new file mode 100644 index 00000000..8a0f1915 --- /dev/null +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-017-extract-tenant-id-returns-tenant-id-from-scope-key.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.scope-key.extract-tenant-id-returns-tenant-id-from-scope-key +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.scope-key +--- +# extractTenantId returns tenant ID from scope key + +## Intent + +- outcome: Executable scenario "extractTenantId returns tenant ID from scope key" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-018-extract-scope-type-returns-scope-type-from-scope-key.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-018-extract-scope-type-returns-scope-type-from-scope-key.sdp.md new file mode 100644 index 00000000..4352b0a4 --- /dev/null +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-018-extract-scope-type-returns-scope-type-from-scope-key.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.scope-key.extract-scope-type-returns-scope-type-from-scope-key +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.scope-key +--- +# extractScopeType returns scope type from scope key + +## Intent + +- outcome: Executable scenario "extractScopeType returns scope type from scope key" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-019-extract-scope-id-returns-scope-id-from-scope-key.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-019-extract-scope-id-returns-scope-id-from-scope-key.sdp.md new file mode 100644 index 00000000..f354da5b --- /dev/null +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-019-extract-scope-id-returns-scope-id-from-scope-key.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.dcb.scope-key.extract-scope-id-returns-scope-id-from-scope-key +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.dcb.scope-key +--- +# extractScopeId returns scope ID from scope key + +## Intent + +- outcome: Executable scenario "extractScopeId returns scope ID from scope key" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-001-handler-calls-load-state-with-correct-entity-id.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-001-handler-calls-load-state-with-correct-entity-id.sdp.md new file mode 100644 index 00000000..2785d18d --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-001-handler-calls-load-state-with-correct-entity-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.handler-calls-load-state-with-correct-entity-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Handler calls loadState with correct entityId + +## Intent + +- outcome: Executable scenario "Handler calls loadState with correct entityId" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-002-handler-calls-decider-with-state-command-input-and-context.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-002-handler-calls-decider-with-state-command-input-and-context.sdp.md new file mode 100644 index 00000000..e2d5c084 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-002-handler-calls-decider-with-state-command-input-and-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.handler-calls-decider-with-state-command-input-and-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Handler calls decider with state, command input, and context + +## Intent + +- outcome: Executable scenario "Handler calls decider with state, command input, and context" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-003-handler-calls-apply-update-with-correct-parameters.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-003-handler-calls-apply-update-with-correct-parameters.sdp.md new file mode 100644 index 00000000..6ca69396 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-003-handler-calls-apply-update-with-correct-parameters.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.handler-calls-apply-update-with-correct-parameters +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Handler calls applyUpdate with correct parameters + +## Intent + +- outcome: Executable scenario "Handler calls applyUpdate with correct parameters" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-004-handler-returns-success-result-with-correct-structure.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-004-handler-returns-success-result-with-correct-structure.sdp.md new file mode 100644 index 00000000..25230903 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-004-handler-returns-success-result-with-correct-structure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.handler-returns-success-result-with-correct-structure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Handler returns success result with correct structure + +## Intent + +- outcome: Executable scenario "Handler returns success result with correct structure" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-005-handler-increments-version-correctly-from-existing-version.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-005-handler-increments-version-correctly-from-existing-version.sdp.md new file mode 100644 index 00000000..99f174e5 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-005-handler-increments-version-correctly-from-existing-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.handler-increments-version-correctly-from-existing-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Handler increments version correctly from existing version + +## Intent + +- outcome: Executable scenario "Handler increments version correctly from existing version" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-006-handler-returns-rejected-result-without-calling-apply-update.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-006-handler-returns-rejected-result-without-calling-apply-update.sdp.md new file mode 100644 index 00000000..c03c5178 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-006-handler-returns-rejected-result-without-calling-apply-update.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.handler-returns-rejected-result-without-calling-apply-update +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Handler returns rejected result without calling applyUpdate + +## Intent + +- outcome: Executable scenario "Handler returns rejected result without calling applyUpdate" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-007-rejected-result-includes-rejection-details.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-007-rejected-result-includes-rejection-details.sdp.md new file mode 100644 index 00000000..c9bed99a --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-007-rejected-result-includes-rejection-details.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.rejected-result-includes-rejection-details +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Rejected result includes rejection details + +## Intent + +- outcome: Executable scenario "Rejected result includes rejection details" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-008-handler-returns-failed-result-without-calling-apply-update.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-008-handler-returns-failed-result-without-calling-apply-update.sdp.md new file mode 100644 index 00000000..9a78168f --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-008-handler-returns-failed-result-without-calling-apply-update.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.handler-returns-failed-result-without-calling-apply-update +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Handler returns failed result without calling applyUpdate + +## Intent + +- outcome: Executable scenario "Handler returns failed result without calling applyUpdate" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-009-failed-result-includes-failure-event-and-details.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-009-failed-result-includes-failure-event-and-details.sdp.md new file mode 100644 index 00000000..6a005d92 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-009-failed-result-includes-failure-event-and-details.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.failed-result-includes-failure-event-and-details +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Failed result includes failure event and details + +## Intent + +- outcome: Executable scenario "Failed result includes failure event and details" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-010-handler-propagates-load-state-errors.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-010-handler-propagates-load-state-errors.sdp.md new file mode 100644 index 00000000..fbbbfd01 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-010-handler-propagates-load-state-errors.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.handler-propagates-load-state-errors +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Handler propagates loadState errors + +## Intent + +- outcome: Executable scenario "Handler propagates loadState errors" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-011-handler-uses-custom-error-handler-when-provided.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-011-handler-uses-custom-error-handler-when-provided.sdp.md new file mode 100644 index 00000000..cbfc8e80 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-011-handler-uses-custom-error-handler-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.handler-uses-custom-error-handler-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Handler uses custom error handler when provided + +## Intent + +- outcome: Executable scenario "Handler uses custom error handler when provided" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-012-handler-rethrows-when-custom-error-handler-returns-nothing.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-012-handler-rethrows-when-custom-error-handler-returns-nothing.sdp.md new file mode 100644 index 00000000..cb0cb8b3 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-012-handler-rethrows-when-custom-error-handler-returns-nothing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.handler-rethrows-when-custom-error-handler-returns-nothing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Handler rethrows when custom error handler returns nothing + +## Intent + +- outcome: Executable scenario "Handler rethrows when custom error handler returns nothing" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-013-handler-logs-debug-on-success.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-013-handler-logs-debug-on-success.sdp.md new file mode 100644 index 00000000..ed7b39c8 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-013-handler-logs-debug-on-success.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.handler-logs-debug-on-success +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Handler logs debug on success + +## Intent + +- outcome: Executable scenario "Handler logs debug on success" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-014-handler-logs-debug-on-rejection.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-014-handler-logs-debug-on-rejection.sdp.md new file mode 100644 index 00000000..455b2acd --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-014-handler-logs-debug-on-rejection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.handler-logs-debug-on-rejection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Handler logs debug on rejection + +## Intent + +- outcome: Executable scenario "Handler logs debug on rejection" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-015-handler-logs-error-on-exception.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-015-handler-logs-error-on-exception.sdp.md new file mode 100644 index 00000000..f65da00b --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-015-handler-logs-error-on-exception.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.handler-logs-error-on-exception +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Handler logs error on exception + +## Intent + +- outcome: Executable scenario "Handler logs error on exception" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-016-handler-generates-unique-event-id-per-invocation.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-016-handler-generates-unique-event-id-per-invocation.sdp.md new file mode 100644 index 00000000..00753308 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-016-handler-generates-unique-event-id-per-invocation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.handler-generates-unique-event-id-per-invocation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Handler generates unique eventId per invocation + +## Intent + +- outcome: Executable scenario "Handler generates unique eventId per invocation" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-017-handler-includes-schema-version-in-event-metadata.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-017-handler-includes-schema-version-in-event-metadata.sdp.md new file mode 100644 index 00000000..5210cdfb --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-017-handler-includes-schema-version-in-event-metadata.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.handler-includes-schema-version-in-event-metadata +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Handler includes schemaVersion in event metadata + +## Intent + +- outcome: Executable scenario "Handler includes schemaVersion in event metadata" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-018-handler-builds-correct-stream-id-from-entity-id.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-018-handler-builds-correct-stream-id-from-entity-id.sdp.md new file mode 100644 index 00000000..74c5486c --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-018-handler-builds-correct-stream-id-from-entity-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.handler-builds-correct-stream-id-from-entity-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Handler builds correct streamId from entityId + +## Intent + +- outcome: Executable scenario "Handler builds correct streamId from entityId" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-019-entity-handler-calls-try-load-state-with-correct-entity-id.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-019-entity-handler-calls-try-load-state-with-correct-entity-id.sdp.md new file mode 100644 index 00000000..f481a2c3 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-019-entity-handler-calls-try-load-state-with-correct-entity-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.entity-handler-calls-try-load-state-with-correct-entity-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Entity handler calls tryLoadState with correct entityId + +## Intent + +- outcome: Executable scenario "Entity handler calls tryLoadState with correct entityId" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-020-entity-handler-calls-decider-with-null-state-when-entity-does-not-exist.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-020-entity-handler-calls-decider-with-null-state-when-entity-does-not-exist.sdp.md new file mode 100644 index 00000000..4c6fbe2f --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-020-entity-handler-calls-decider-with-null-state-when-entity-does-not-exist.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.entity-handler-calls-decider-with-null-state-when-entity-does-not-exist +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Entity handler calls decider with null state when entity does not exist + +## Intent + +- outcome: Executable scenario "Entity handler calls decider with null state when entity does not exist" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-021-entity-handler-calls-insert-for-new-entities.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-021-entity-handler-calls-insert-for-new-entities.sdp.md new file mode 100644 index 00000000..c5ab1fe1 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-021-entity-handler-calls-insert-for-new-entities.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.entity-handler-calls-insert-for-new-entities +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Entity handler calls insert for new entities + +## Intent + +- outcome: Executable scenario "Entity handler calls insert for new entities" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-022-entity-handler-returns-success-with-version-1-for-new-entities.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-022-entity-handler-returns-success-with-version-1-for-new-entities.sdp.md new file mode 100644 index 00000000..d1a8f257 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-022-entity-handler-returns-success-with-version-1-for-new-entities.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.entity-handler-returns-success-with-version-1-for-new-entities +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Entity handler returns success with version 1 for new entities + +## Intent + +- outcome: Executable scenario "Entity handler returns success with version 1 for new entities" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-023-entity-handler-generates-correct-event-metadata-for-new-entities.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-023-entity-handler-generates-correct-event-metadata-for-new-entities.sdp.md new file mode 100644 index 00000000..ad158ded --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-023-entity-handler-generates-correct-event-metadata-for-new-entities.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.entity-handler-generates-correct-event-metadata-for-new-entities +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Entity handler generates correct event metadata for new entities + +## Intent + +- outcome: Executable scenario "Entity handler generates correct event metadata for new entities" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-024-entity-handler-calls-decider-with-existing-state-when-entity-exists.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-024-entity-handler-calls-decider-with-existing-state-when-entity-exists.sdp.md new file mode 100644 index 00000000..0e79e2cc --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-024-entity-handler-calls-decider-with-existing-state-when-entity-exists.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.entity-handler-calls-decider-with-existing-state-when-entity-exists +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Entity handler calls decider with existing state when entity exists + +## Intent + +- outcome: Executable scenario "Entity handler calls decider with existing state when entity exists" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-025-entity-handler-returns-rejection-when-entity-already-exists.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-025-entity-handler-returns-rejection-when-entity-already-exists.sdp.md new file mode 100644 index 00000000..3b936dcf --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-025-entity-handler-returns-rejection-when-entity-already-exists.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.entity-handler-returns-rejection-when-entity-already-exists +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Entity handler returns rejection when entity already exists + +## Intent + +- outcome: Executable scenario "Entity handler returns rejection when entity already exists" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-026-entity-handler-does-not-call-insert-when-entity-already-exists.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-026-entity-handler-does-not-call-insert-when-entity-already-exists.sdp.md new file mode 100644 index 00000000..363ad80b --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-026-entity-handler-does-not-call-insert-when-entity-already-exists.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.entity-handler-does-not-call-insert-when-entity-already-exists +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Entity handler does not call insert when entity already exists + +## Intent + +- outcome: Executable scenario "Entity handler does not call insert when entity already exists" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-027-entity-handler-returns-failed-result-with-version-0-for-non-existent-entit.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-027-entity-handler-returns-failed-result-with-version-0-for-non-existent-entit.sdp.md new file mode 100644 index 00000000..7f80e46e --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-027-entity-handler-returns-failed-result-with-version-0-for-non-existent-entit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.entity-handler-returns-failed-result-with-version-0-for-non-existent-entity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Entity handler returns failed result with version 0 for non-existent entity + +## Intent + +- outcome: Executable scenario "Entity handler returns failed result with version 0 for non-existent entity" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-028-entity-handler-does-not-call-insert-on-business-failure.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-028-entity-handler-does-not-call-insert-on-business-failure.sdp.md new file mode 100644 index 00000000..68bdf37b --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-028-entity-handler-does-not-call-insert-on-business-failure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.entity-handler-does-not-call-insert-on-business-failure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Entity handler does not call insert on business failure + +## Intent + +- outcome: Executable scenario "Entity handler does not call insert on business failure" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-029-entity-handler-propagates-try-load-state-errors.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-029-entity-handler-propagates-try-load-state-errors.sdp.md new file mode 100644 index 00000000..d16d3813 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-029-entity-handler-propagates-try-load-state-errors.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.entity-handler-propagates-try-load-state-errors +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Entity handler propagates tryLoadState errors + +## Intent + +- outcome: Executable scenario "Entity handler propagates tryLoadState errors" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-030-entity-handler-propagates-insert-errors.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-030-entity-handler-propagates-insert-errors.sdp.md new file mode 100644 index 00000000..d13f490e --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-030-entity-handler-propagates-insert-errors.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.entity-handler-propagates-insert-errors +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Entity handler propagates insert errors + +## Intent + +- outcome: Executable scenario "Entity handler propagates insert errors" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-031-entity-handler-uses-custom-error-handler-when-provided.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-031-entity-handler-uses-custom-error-handler-when-provided.sdp.md new file mode 100644 index 00000000..34a29d09 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-031-entity-handler-uses-custom-error-handler-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.entity-handler-uses-custom-error-handler-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Entity handler uses custom error handler when provided + +## Intent + +- outcome: Executable scenario "Entity handler uses custom error handler when provided" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-032-entity-handler-logs-debug-on-entity-creation-success.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-032-entity-handler-logs-debug-on-entity-creation-success.sdp.md new file mode 100644 index 00000000..696ae695 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-032-entity-handler-logs-debug-on-entity-creation-success.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.entity-handler-logs-debug-on-entity-creation-success +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Entity handler logs debug on entity creation success + +## Intent + +- outcome: Executable scenario "Entity handler logs debug on entity creation success" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-033-entity-handler-logs-debug-on-rejection.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-033-entity-handler-logs-debug-on-rejection.sdp.md new file mode 100644 index 00000000..9436821e --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-033-entity-handler-logs-debug-on-rejection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.entity-handler-logs-debug-on-rejection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Entity handler logs debug on rejection + +## Intent + +- outcome: Executable scenario "Entity handler logs debug on rejection" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-034-entity-handler-generates-unique-event-id-for-each-creation.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-034-entity-handler-generates-unique-event-id-for-each-creation.sdp.md new file mode 100644 index 00000000..28017248 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-034-entity-handler-generates-unique-event-id-for-each-creation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.entity-handler-generates-unique-event-id-for-each-creation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Entity handler generates unique eventId for each creation + +## Intent + +- outcome: Executable scenario "Entity handler generates unique eventId for each creation" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-035-entity-handler-includes-schema-version-in-metadata.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-035-entity-handler-includes-schema-version-in-metadata.sdp.md new file mode 100644 index 00000000..df999756 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-035-entity-handler-includes-schema-version-in-metadata.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.entity-handler-includes-schema-version-in-metadata +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Entity handler includes schemaVersion in metadata + +## Intent + +- outcome: Executable scenario "Entity handler includes schemaVersion in metadata" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-036-pre-validate-rejection-short-circuits-handler.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-036-pre-validate-rejection-short-circuits-handler.sdp.md new file mode 100644 index 00000000..0b037e9f --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-036-pre-validate-rejection-short-circuits-handler.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.pre-validate-rejection-short-circuits-handler +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# PreValidate rejection short-circuits handler + +## Intent + +- outcome: Executable scenario "PreValidate rejection short-circuits handler" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-037-pre-validate-returning-undefined-allows-normal-flow.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-037-pre-validate-returning-undefined-allows-normal-flow.sdp.md new file mode 100644 index 00000000..a0d296d9 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-037-pre-validate-returning-undefined-allows-normal-flow.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.pre-validate-returning-undefined-allows-normal-flow +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# PreValidate returning undefined allows normal flow + +## Intent + +- outcome: Executable scenario "PreValidate returning undefined allows normal flow" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-038-pre-validate-receives-correct-arguments.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-038-pre-validate-receives-correct-arguments.sdp.md new file mode 100644 index 00000000..1c7d5c00 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-038-pre-validate-receives-correct-arguments.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.pre-validate-receives-correct-arguments +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# PreValidate receives correct arguments + +## Intent + +- outcome: Executable scenario "PreValidate receives correct arguments" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-039-pre-validate-failure-is-logged.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-039-pre-validate-failure-is-logged.sdp.md new file mode 100644 index 00000000..7e8576b8 --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-039-pre-validate-failure-is-logged.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.pre-validate-failure-is-logged +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# PreValidate failure is logged + +## Intent + +- outcome: Executable scenario "PreValidate failure is logged" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/decider/factory.examples/s-040-handler-works-normally-without-pre-validate-configured.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-040-handler-works-normally-without-pre-validate-configured.sdp.md new file mode 100644 index 00000000..519d22ea --- /dev/null +++ b/specs/behavior/platform-core/decider/factory.examples/s-040-handler-works-normally-without-pre-validate-configured.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.decider.factory.handler-works-normally-without-pre-validate-configured +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.decider.factory +--- +# Handler works normally without preValidate configured + +## Intent + +- outcome: Executable scenario "Handler works normally without preValidate configured" from packages/platform-core/tests/features/behavior/decider/factory.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-001-dcb-succeeds-on-first-attempt.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-001-dcb-succeeds-on-first-attempt.sdp.md new file mode 100644 index 00000000..30c152f9 --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-001-dcb-succeeds-on-first-attempt.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.dcb-succeeds-on-first-attempt +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry +--- +# DCB succeeds on first attempt + +## Intent + +- outcome: Executable scenario "DCB succeeds on first attempt" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-002-rejected-result-passes-through-unchanged.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-002-rejected-result-passes-through-unchanged.sdp.md new file mode 100644 index 00000000..6f3282b6 --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-002-rejected-result-passes-through-unchanged.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.rejected-result-passes-through-unchanged +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry +--- +# Rejected result passes through unchanged + +## Intent + +- outcome: Executable scenario "Rejected result passes through unchanged" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-003-conflict-triggers-retry-with-updated-version.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-003-conflict-triggers-retry-with-updated-version.sdp.md new file mode 100644 index 00000000..8bf9b8d2 --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-003-conflict-triggers-retry-with-updated-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.conflict-triggers-retry-with-updated-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry +--- +# Conflict triggers retry with updated version + +## Intent + +- outcome: Executable scenario "Conflict triggers retry with updated version" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md new file mode 100644 index 00000000..a8bae923 --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.max-retries-exceeded-returns-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry +--- +# Max retries exceeded returns rejected + +## Intent + +- outcome: Executable scenario "Max retries exceeded returns rejected" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-005-scope-aware-scheduling-key-is-preserved.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-005-scope-aware-scheduling-key-is-preserved.sdp.md new file mode 100644 index 00000000..94a289cf --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-005-scope-aware-scheduling-key-is-preserved.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.scope-aware-scheduling-key-is-preserved +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry +--- +# Scope-aware scheduling key is preserved + +## Intent + +- outcome: Executable scenario "Scope-aware scheduling key is preserved" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-006-successful-retry-calls-on-complete-with-result.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-006-successful-retry-calls-on-complete-with-result.sdp.md new file mode 100644 index 00000000..f04cc330 --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-006-successful-retry-calls-on-complete-with-result.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.successful-retry-calls-on-complete-with-result +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry +--- +# Successful retry calls onComplete with result + +## Intent + +- outcome: Executable scenario "Successful retry calls onComplete with result" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-007-version-advances-during-retry-delay.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-007-version-advances-during-retry-delay.sdp.md new file mode 100644 index 00000000..bd636150 --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-007-version-advances-during-retry-delay.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.version-advances-during-retry-delay +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry +--- +# Version advances during retry delay + +## Intent + +- outcome: Executable scenario "Version advances during retry delay" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-008-backoff-increases-exponentially.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-008-backoff-increases-exponentially.sdp.md new file mode 100644 index 00000000..18d91ff2 --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-008-backoff-increases-exponentially.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.backoff-increases-exponentially +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry +--- +# Backoff increases exponentially + +## Intent + +- outcome: Executable scenario "Backoff increases exponentially" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-009-backoff-is-capped-at-maximum.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-009-backoff-is-capped-at-maximum.sdp.md new file mode 100644 index 00000000..ede1b20b --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-009-backoff-is-capped-at-maximum.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.backoff-is-capped-at-maximum +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry +--- +# Backoff is capped at maximum + +## Intent + +- outcome: Executable scenario "Backoff is capped at maximum" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-010-jitter-adds-randomness-to-prevent-thundering-herd.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-010-jitter-adds-randomness-to-prevent-thundering-herd.sdp.md new file mode 100644 index 00000000..da44c689 --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-010-jitter-adds-randomness-to-prevent-thundering-herd.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.jitter-adds-randomness-to-prevent-thundering-herd +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry +--- +# Jitter adds randomness to prevent thundering herd + +## Intent + +- outcome: Executable scenario "Jitter adds randomness to prevent thundering herd" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-011-jitter-function-is-injectable-for-deterministic-tests.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-011-jitter-function-is-injectable-for-deterministic-tests.sdp.md new file mode 100644 index 00000000..aff814e2 --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-011-jitter-function-is-injectable-for-deterministic-tests.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.jitter-function-is-injectable-for-deterministic-tests +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry +--- +# Jitter function is injectable for deterministic tests + +## Intent + +- outcome: Executable scenario "Jitter function is injectable for deterministic tests" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-001-adapter-plugs-into-existing-middleware.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-001-adapter-plugs-into-existing-middleware.sdp.md new file mode 100644 index 00000000..bd0d761a --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-001-adapter-plugs-into-existing-middleware.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.integration-patterns.adapter-plugs-into-existing-middleware +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.integration-patterns +--- +# Adapter plugs into existing middleware + +## Intent + +- outcome: Executable scenario "Adapter plugs into existing middleware" from packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-002-rate-limited-command-returns-standard-rejection.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-002-rate-limited-command-returns-standard-rejection.sdp.md new file mode 100644 index 00000000..1f37a031 --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-002-rate-limited-command-returns-standard-rejection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.integration-patterns.rate-limited-command-returns-standard-rejection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.integration-patterns +--- +# Rate limited command returns standard rejection + +## Intent + +- outcome: Executable scenario "Rate limited command returns standard rejection" from packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-003-dcb-retry-uses-separate-workpool.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-003-dcb-retry-uses-separate-workpool.sdp.md new file mode 100644 index 00000000..c2e5af34 --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-003-dcb-retry-uses-separate-workpool.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.integration-patterns.dcb-retry-uses-separate-workpool +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.integration-patterns +--- +# DCB retry uses separate Workpool + +## Intent + +- outcome: Executable scenario "DCB retry uses separate Workpool" from packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-004-retry-mutation-receives-correct-arguments.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-004-retry-mutation-receives-correct-arguments.sdp.md new file mode 100644 index 00000000..06cbcb14 --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-004-retry-mutation-receives-correct-arguments.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.integration-patterns.retry-mutation-receives-correct-arguments +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.integration-patterns +--- +# Retry mutation receives correct arguments + +## Intent + +- outcome: Executable scenario "Retry mutation receives correct arguments" from packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-005-dcb-retry-with-on-complete-callback-integration.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-005-dcb-retry-with-on-complete-callback-integration.sdp.md new file mode 100644 index 00000000..91432e61 --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-005-dcb-retry-with-on-complete-callback-integration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.integration-patterns.dcb-retry-with-on-complete-callback-integration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.integration-patterns +--- +# DCB retry with onComplete callback integration + +## Intent + +- outcome: Executable scenario "DCB retry with onComplete callback integration" from packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-006-workpool-does-not-retry-dcb-mutations-clarification.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-006-workpool-does-not-retry-dcb-mutations-clarification.sdp.md new file mode 100644 index 00000000..32447441 --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-006-workpool-does-not-retry-dcb-mutations-clarification.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.integration-patterns.workpool-does-not-retry-dcb-mutations-clarification +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.integration-patterns +--- +# Workpool does not retry DCB mutations - clarification + +## Intent + +- outcome: Executable scenario "Workpool does not retry DCB mutations - clarification" from packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-007-rate-limiter-component-creates-tables.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-007-rate-limiter-component-creates-tables.sdp.md new file mode 100644 index 00000000..446ddfe2 --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-007-rate-limiter-component-creates-tables.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.integration-patterns.rate-limiter-component-creates-tables +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.integration-patterns +--- +# Rate limiter component creates tables + +## Intent + +- outcome: Executable scenario "Rate limiter component creates tables" from packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-008-multiple-workpools-can-coexist.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-008-multiple-workpools-can-coexist.sdp.md new file mode 100644 index 00000000..7748c5b5 --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-008-multiple-workpools-can-coexist.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.integration-patterns.multiple-workpools-can-coexist +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.integration-patterns +--- +# Multiple Workpools can coexist + +## Intent + +- outcome: Executable scenario "Multiple Workpools can coexist" from packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-001-adapter-allows-request-within-rate-limit.sdp.md b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-001-adapter-allows-request-within-rate-limit.sdp.md new file mode 100644 index 00000000..823aa4ab --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-001-adapter-allows-request-within-rate-limit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.rate-limit-adapter.adapter-allows-request-within-rate-limit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.rate-limit-adapter +--- +# Adapter allows request within rate limit + +## Intent + +- outcome: Executable scenario "Adapter allows request within rate limit" from packages/platform-core/tests/features/behavior/durable-function-adapters/rate-limit-adapter.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-002-adapter-rejects-request-exceeding-rate-limit.sdp.md b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-002-adapter-rejects-request-exceeding-rate-limit.sdp.md new file mode 100644 index 00000000..ea200a9f --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-002-adapter-rejects-request-exceeding-rate-limit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.rate-limit-adapter.adapter-rejects-request-exceeding-rate-limit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.rate-limit-adapter +--- +# Adapter rejects request exceeding rate limit + +## Intent + +- outcome: Executable scenario "Adapter rejects request exceeding rate limit" from packages/platform-core/tests/features/behavior/durable-function-adapters/rate-limit-adapter.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-003-different-keys-have-independent-limits.sdp.md b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-003-different-keys-have-independent-limits.sdp.md new file mode 100644 index 00000000..8829a9a4 --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-003-different-keys-have-independent-limits.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.rate-limit-adapter.different-keys-have-independent-limits +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.rate-limit-adapter +--- +# Different keys have independent limits + +## Intent + +- outcome: Executable scenario "Different keys have independent limits" from packages/platform-core/tests/features/behavior/durable-function-adapters/rate-limit-adapter.feature diff --git a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md new file mode 100644 index 00000000..15353f58 --- /dev/null +++ b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.durable-function-adapters.rate-limit-adapter.same-user-different-command-types-have-independent-limits +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.durable-function-adapters.rate-limit-adapter +--- +# Same user different command types have independent limits + +## Intent + +- outcome: Executable scenario "Same user different command types have independent limits" from packages/platform-core/tests/features/behavior/durable-function-adapters/rate-limit-adapter.feature diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-001-create-basic-fat-event.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-001-create-basic-fat-event.sdp.md new file mode 100644 index 00000000..06a8a1b2 --- /dev/null +++ b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-001-create-basic-fat-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.fat-event-builder.create-basic-fat-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.fat-event-builder +--- +# Create basic fat event + +## Intent + +- outcome: Executable scenario "Create basic fat event" from packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-002-create-fat-event-with-schema-definition.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-002-create-fat-event-with-schema-definition.sdp.md new file mode 100644 index 00000000..e817795d --- /dev/null +++ b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-002-create-fat-event-with-schema-definition.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.fat-event-builder.create-fat-event-with-schema-definition +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.fat-event-builder +--- +# Create fat event with schema definition + +## Intent + +- outcome: Executable scenario "Create fat event with schema definition" from packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-003-schema-validation-failure.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-003-schema-validation-failure.sdp.md new file mode 100644 index 00000000..f3bffb6b --- /dev/null +++ b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-003-schema-validation-failure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.fat-event-builder.schema-validation-failure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.fat-event-builder +--- +# Schema validation failure + +## Intent + +- outcome: Executable scenario "Schema validation failure" from packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-004-create-fat-event-with-correlation-id.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-004-create-fat-event-with-correlation-id.sdp.md new file mode 100644 index 00000000..0f298e04 --- /dev/null +++ b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-004-create-fat-event-with-correlation-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.fat-event-builder.create-fat-event-with-correlation-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.fat-event-builder +--- +# Create fat event with correlation ID + +## Intent + +- outcome: Executable scenario "Create fat event with correlation ID" from packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-005-embed-selected-entity-fields.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-005-embed-selected-entity-fields.sdp.md new file mode 100644 index 00000000..d1c08352 --- /dev/null +++ b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-005-embed-selected-entity-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.fat-event-builder.embed-selected-entity-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.fat-event-builder +--- +# Embed selected entity fields + +## Intent + +- outcome: Executable scenario "Embed selected entity fields" from packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-006-embed-all-fields.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-006-embed-all-fields.sdp.md new file mode 100644 index 00000000..100a4199 --- /dev/null +++ b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-006-embed-all-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.fat-event-builder.embed-all-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.fat-event-builder +--- +# Embed all fields + +## Intent + +- outcome: Executable scenario "Embed all fields" from packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-007-embed-non-existent-field.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-007-embed-non-existent-field.sdp.md new file mode 100644 index 00000000..2703e148 --- /dev/null +++ b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-007-embed-non-existent-field.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.fat-event-builder.embed-non-existent-field +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.fat-event-builder +--- +# Embed non-existent field + +## Intent + +- outcome: Executable scenario "Embed non-existent field" from packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-008-embed-collection-of-items.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-008-embed-collection-of-items.sdp.md new file mode 100644 index 00000000..bc18843a --- /dev/null +++ b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-008-embed-collection-of-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.fat-event-builder.embed-collection-of-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.fat-event-builder +--- +# Embed collection of items + +## Intent + +- outcome: Executable scenario "Embed collection of items" from packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-009-embed-collection-with-field-selection.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-009-embed-collection-with-field-selection.sdp.md new file mode 100644 index 00000000..9a4361fd --- /dev/null +++ b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-009-embed-collection-with-field-selection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.fat-event-builder.embed-collection-with-field-selection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.fat-event-builder +--- +# Embed collection with field selection + +## Intent + +- outcome: Executable scenario "Embed collection with field selection" from packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-010-embed-empty-collection.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-010-embed-empty-collection.sdp.md new file mode 100644 index 00000000..bb5ecdfe --- /dev/null +++ b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-010-embed-empty-collection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.fat-event-builder.embed-empty-collection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.fat-event-builder +--- +# Embed empty collection + +## Intent + +- outcome: Executable scenario "Embed empty collection" from packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature diff --git a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-001-event-type-for-integration-scenarios.sdp.md b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-001-event-type-for-integration-scenarios.sdp.md new file mode 100644 index 00000000..7a9ccd3f --- /dev/null +++ b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-001-event-type-for-integration-scenarios.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.fat-vs-thin-selection.event-type-for-integration-scenarios +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.fat-vs-thin-selection +--- +# Event type for integration scenarios + +## Intent + +- outcome: Executable scenario "Event type for integration scenarios" from packages/platform-core/tests/features/behavior/ecst/fat-vs-thin-selection.feature diff --git a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-002-inventory-updated-as-thin-event.sdp.md b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-002-inventory-updated-as-thin-event.sdp.md new file mode 100644 index 00000000..889719ec --- /dev/null +++ b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-002-inventory-updated-as-thin-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.fat-vs-thin-selection.inventory-updated-as-thin-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.fat-vs-thin-selection +--- +# InventoryUpdated as thin event + +## Intent + +- outcome: Executable scenario "InventoryUpdated as thin event" from packages/platform-core/tests/features/behavior/ecst/fat-vs-thin-selection.feature diff --git a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-003-order-submitted-as-fat-event.sdp.md b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-003-order-submitted-as-fat-event.sdp.md new file mode 100644 index 00000000..fad47968 --- /dev/null +++ b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-003-order-submitted-as-fat-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.fat-vs-thin-selection.order-submitted-as-fat-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.fat-vs-thin-selection +--- +# OrderSubmitted as fat event + +## Intent + +- outcome: Executable scenario "OrderSubmitted as fat event" from packages/platform-core/tests/features/behavior/ecst/fat-vs-thin-selection.feature diff --git a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-004-published-language-event-is-fat.sdp.md b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-004-published-language-event-is-fat.sdp.md new file mode 100644 index 00000000..f7419d54 --- /dev/null +++ b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-004-published-language-event-is-fat.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.fat-vs-thin-selection.published-language-event-is-fat +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.fat-vs-thin-selection +--- +# Published Language event is fat + +## Intent + +- outcome: Executable scenario "Published Language event is fat" from packages/platform-core/tests/features/behavior/ecst/fat-vs-thin-selection.feature diff --git a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-005-category-suggests-event-type.sdp.md b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-005-category-suggests-event-type.sdp.md new file mode 100644 index 00000000..27025e5d --- /dev/null +++ b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-005-category-suggests-event-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.fat-vs-thin-selection.category-suggests-event-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.fat-vs-thin-selection +--- +# Category suggests event type + +## Intent + +- outcome: Executable scenario "Category suggests event type" from packages/platform-core/tests/features/behavior/ecst/fat-vs-thin-selection.feature diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-001-mark-single-field-for-shredding.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-001-mark-single-field-for-shredding.sdp.md new file mode 100644 index 00000000..9a6140d2 --- /dev/null +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-001-mark-single-field-for-shredding.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.privacy-markers.mark-single-field-for-shredding +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.privacy-markers +--- +# Mark single field for shredding + +## Intent + +- outcome: Executable scenario "Mark single field for shredding" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-002-mark-multiple-fields-for-shredding.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-002-mark-multiple-fields-for-shredding.sdp.md new file mode 100644 index 00000000..9ee30837 --- /dev/null +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-002-mark-multiple-fields-for-shredding.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.privacy-markers.mark-multiple-fields-for-shredding +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.privacy-markers +--- +# Mark multiple fields for shredding + +## Intent + +- outcome: Executable scenario "Mark multiple fields for shredding" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-003-non-pii-fields-are-not-marked.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-003-non-pii-fields-are-not-marked.sdp.md new file mode 100644 index 00000000..488544c3 --- /dev/null +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-003-non-pii-fields-are-not-marked.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.privacy-markers.non-pii-fields-are-not-marked +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.privacy-markers +--- +# Non-PII fields are not marked + +## Intent + +- outcome: Executable scenario "Non-PII fields are not marked" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-004-find-all-shreddable-fields-in-event.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-004-find-all-shreddable-fields-in-event.sdp.md new file mode 100644 index 00000000..77f392ea --- /dev/null +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-004-find-all-shreddable-fields-in-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.privacy-markers.find-all-shreddable-fields-in-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.privacy-markers +--- +# Find all shreddable fields in event + +## Intent + +- outcome: Executable scenario "Find all shreddable fields in event" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-005-no-shreddable-fields-returns-empty.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-005-no-shreddable-fields-returns-empty.sdp.md new file mode 100644 index 00000000..4ee5b1cd --- /dev/null +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-005-no-shreddable-fields-returns-empty.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.privacy-markers.no-shreddable-fields-returns-empty +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.privacy-markers +--- +# No shreddable fields returns empty + +## Intent + +- outcome: Executable scenario "No shreddable fields returns empty" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-006-mark-fields-in-collection-items.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-006-mark-fields-in-collection-items.sdp.md new file mode 100644 index 00000000..c6f40449 --- /dev/null +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-006-mark-fields-in-collection-items.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.privacy-markers.mark-fields-in-collection-items +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.privacy-markers +--- +# Mark fields in collection items + +## Intent + +- outcome: Executable scenario "Mark fields in collection items" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-007-shred-all-marked-fields.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-007-shred-all-marked-fields.sdp.md new file mode 100644 index 00000000..28522430 --- /dev/null +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-007-shred-all-marked-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.privacy-markers.shred-all-marked-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.privacy-markers +--- +# Shred all marked fields + +## Intent + +- outcome: Executable scenario "Shred all marked fields" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-008-non-marked-fields-are-preserved.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-008-non-marked-fields-are-preserved.sdp.md new file mode 100644 index 00000000..96ebff29 --- /dev/null +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-008-non-marked-fields-are-preserved.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.privacy-markers.non-marked-fields-are-preserved +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.privacy-markers +--- +# Non-marked fields are preserved + +## Intent + +- outcome: Executable scenario "Non-marked fields are preserved" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-009-shred-event-returns-audit-trail.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-009-shred-event-returns-audit-trail.sdp.md new file mode 100644 index 00000000..9dd8345a --- /dev/null +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-009-shred-event-returns-audit-trail.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.privacy-markers.shred-event-returns-audit-trail +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.privacy-markers +--- +# Shred event returns audit trail + +## Intent + +- outcome: Executable scenario "Shred event returns audit trail" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-010-check-if-event-has-any-shreddable-fields.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-010-check-if-event-has-any-shreddable-fields.sdp.md new file mode 100644 index 00000000..92250f5b --- /dev/null +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-010-check-if-event-has-any-shreddable-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.privacy-markers.check-if-event-has-any-shreddable-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.privacy-markers +--- +# Check if event has any shreddable fields + +## Intent + +- outcome: Executable scenario "Check if event has any shreddable fields" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-011-check-event-without-shreddable-fields.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-011-check-event-without-shreddable-fields.sdp.md new file mode 100644 index 00000000..2273d2ed --- /dev/null +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-011-check-event-without-shreddable-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.privacy-markers.check-event-without-shreddable-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.privacy-markers +--- +# Check event without shreddable fields + +## Intent + +- outcome: Executable scenario "Check event without shreddable fields" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-012-count-shreddable-fields.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-012-count-shreddable-fields.sdp.md new file mode 100644 index 00000000..0b3a1c55 --- /dev/null +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-012-count-shreddable-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.privacy-markers.count-shreddable-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.privacy-markers +--- +# Count shreddable fields + +## Intent + +- outcome: Executable scenario "Count shreddable fields" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-013-cannot-shred-required-fields.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-013-cannot-shred-required-fields.sdp.md new file mode 100644 index 00000000..b07b96e4 --- /dev/null +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-013-cannot-shred-required-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.privacy-markers.cannot-shred-required-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.privacy-markers +--- +# Cannot shred required fields + +## Intent + +- outcome: Executable scenario "Cannot shred required fields" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-014-non-overlapping-shred-and-required-fields-work.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-014-non-overlapping-shred-and-required-fields-work.sdp.md new file mode 100644 index 00000000..8bc85e5b --- /dev/null +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-014-non-overlapping-shred-and-required-fields-work.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.privacy-markers.non-overlapping-shred-and-required-fields-work +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.privacy-markers +--- +# Non-overlapping shred and required fields work + +## Intent + +- outcome: Executable scenario "Non-overlapping shred and required fields work" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-001-schema-version-is-included-automatically.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-001-schema-version-is-included-automatically.sdp.md new file mode 100644 index 00000000..484611e5 --- /dev/null +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-001-schema-version-is-included-automatically.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.schema-versioning.schema-version-is-included-automatically +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.schema-versioning +--- +# Schema version is included automatically + +## Intent + +- outcome: Executable scenario "Schema version is included automatically" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-002-custom-schema-version-is-used.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-002-custom-schema-version-is-used.sdp.md new file mode 100644 index 00000000..6cff4685 --- /dev/null +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-002-custom-schema-version-is-used.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.schema-versioning.custom-schema-version-is-used +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.schema-versioning +--- +# Custom schema version is used + +## Intent + +- outcome: Executable scenario "Custom schema version is used" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-003-valid-payload-passes-validation.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-003-valid-payload-passes-validation.sdp.md new file mode 100644 index 00000000..3cbfb6cd --- /dev/null +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-003-valid-payload-passes-validation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.schema-versioning.valid-payload-passes-validation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.schema-versioning +--- +# Valid payload passes validation + +## Intent + +- outcome: Executable scenario "Valid payload passes validation" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-004-missing-required-field-fails-validation.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-004-missing-required-field-fails-validation.sdp.md new file mode 100644 index 00000000..dfb08b35 --- /dev/null +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-004-missing-required-field-fails-validation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.schema-versioning.missing-required-field-fails-validation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.schema-versioning +--- +# Missing required field fails validation + +## Intent + +- outcome: Executable scenario "Missing required field fails validation" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-005-wrong-field-type-fails-validation.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-005-wrong-field-type-fails-validation.sdp.md new file mode 100644 index 00000000..12b7dfe2 --- /dev/null +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-005-wrong-field-type-fails-validation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.schema-versioning.wrong-field-type-fails-validation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.schema-versioning +--- +# Wrong field type fails validation + +## Intent + +- outcome: Executable scenario "Wrong field type fails validation" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-006-migrate-v1-event-to-v2-format.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-006-migrate-v1-event-to-v2-format.sdp.md new file mode 100644 index 00000000..b7464b33 --- /dev/null +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-006-migrate-v1-event-to-v2-format.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.schema-versioning.migrate-v1-event-to-v2-format +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.schema-versioning +--- +# Migrate v1 event to v2 format + +## Intent + +- outcome: Executable scenario "Migrate v1 event to v2 format" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-007-no-migration-needed-for-current-version.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-007-no-migration-needed-for-current-version.sdp.md new file mode 100644 index 00000000..83fd034c --- /dev/null +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-007-no-migration-needed-for-current-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.schema-versioning.no-migration-needed-for-current-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.schema-versioning +--- +# No migration needed for current version + +## Intent + +- outcome: Executable scenario "No migration needed for current version" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-008-unknown-source-version-fails-migration.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-008-unknown-source-version-fails-migration.sdp.md new file mode 100644 index 00000000..09b1523f --- /dev/null +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-008-unknown-source-version-fails-migration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.schema-versioning.unknown-source-version-fails-migration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.schema-versioning +--- +# Unknown source version fails migration + +## Intent + +- outcome: Executable scenario "Unknown source version fails migration" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-009-compare-older-version-to-newer-version.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-009-compare-older-version-to-newer-version.sdp.md new file mode 100644 index 00000000..2718108c --- /dev/null +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-009-compare-older-version-to-newer-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.schema-versioning.compare-older-version-to-newer-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.schema-versioning +--- +# Compare older version to newer version + +## Intent + +- outcome: Executable scenario "Compare older version to newer version" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-010-compare-newer-version-to-older-version.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-010-compare-newer-version-to-older-version.sdp.md new file mode 100644 index 00000000..b616600e --- /dev/null +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-010-compare-newer-version-to-older-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.schema-versioning.compare-newer-version-to-older-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.schema-versioning +--- +# Compare newer version to older version + +## Intent + +- outcome: Executable scenario "Compare newer version to older version" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-011-compare-equal-versions.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-011-compare-equal-versions.sdp.md new file mode 100644 index 00000000..6a734797 --- /dev/null +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-011-compare-equal-versions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.schema-versioning.compare-equal-versions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.schema-versioning +--- +# Compare equal versions + +## Intent + +- outcome: Executable scenario "Compare equal versions" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-012-compare-versions-with-different-minor.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-012-compare-versions-with-different-minor.sdp.md new file mode 100644 index 00000000..5aaf3ec1 --- /dev/null +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-012-compare-versions-with-different-minor.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.schema-versioning.compare-versions-with-different-minor +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.schema-versioning +--- +# Compare versions with different minor + +## Intent + +- outcome: Executable scenario "Compare versions with different minor" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-013-invalid-semver-format-is-rejected.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-013-invalid-semver-format-is-rejected.sdp.md new file mode 100644 index 00000000..673067e5 --- /dev/null +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-013-invalid-semver-format-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.schema-versioning.invalid-semver-format-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.schema-versioning +--- +# Invalid semver format is rejected + +## Intent + +- outcome: Executable scenario "Invalid semver format is rejected" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-014-negative-major-version-is-rejected.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-014-negative-major-version-is-rejected.sdp.md new file mode 100644 index 00000000..6eea4ffa --- /dev/null +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-014-negative-major-version-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.schema-versioning.negative-major-version-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.schema-versioning +--- +# Negative major version is rejected + +## Intent + +- outcome: Executable scenario "Negative major version is rejected" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-015-negative-minor-version-is-rejected.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-015-negative-minor-version-is-rejected.sdp.md new file mode 100644 index 00000000..e5caed03 --- /dev/null +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-015-negative-minor-version-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.schema-versioning.negative-minor-version-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.schema-versioning +--- +# Negative minor version is rejected + +## Intent + +- outcome: Executable scenario "Negative minor version is rejected" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-016-event-needs-migration-to-newer-version.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-016-event-needs-migration-to-newer-version.sdp.md new file mode 100644 index 00000000..cdb0f623 --- /dev/null +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-016-event-needs-migration-to-newer-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.schema-versioning.event-needs-migration-to-newer-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.schema-versioning +--- +# Event needs migration to newer version + +## Intent + +- outcome: Executable scenario "Event needs migration to newer version" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-017-event-does-not-need-migration-for-same-version.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-017-event-does-not-need-migration-for-same-version.sdp.md new file mode 100644 index 00000000..8425b5a6 --- /dev/null +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-017-event-does-not-need-migration-for-same-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.schema-versioning.event-does-not-need-migration-for-same-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.schema-versioning +--- +# Event does not need migration for same version + +## Intent + +- outcome: Executable scenario "Event does not need migration for same version" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-018-event-does-not-need-migration-for-older-target.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-018-event-does-not-need-migration-for-older-target.sdp.md new file mode 100644 index 00000000..963f3a1c --- /dev/null +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-018-event-does-not-need-migration-for-older-target.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ecst.schema-versioning.event-does-not-need-migration-for-older-target +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ecst.schema-versioning +--- +# Event does not need migration for older target + +## Intent + +- outcome: Executable scenario "Event does not need migration for older target" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-001-percentage-is-50-when-half-events-processed.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-001-percentage-is-50-when-half-events-processed.sdp.md new file mode 100644 index 00000000..4cd6ab8b --- /dev/null +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-001-percentage-is-50-when-half-events-processed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-replay.replay-progress.percentage-is-50-when-half-events-processed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-replay.replay-progress +--- +# Percentage is 50 when half events processed + +## Intent + +- outcome: Executable scenario "Percentage is 50 when half events processed" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-002-percentage-is-100-when-all-events-processed.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-002-percentage-is-100-when-all-events-processed.sdp.md new file mode 100644 index 00000000..81fcfc63 --- /dev/null +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-002-percentage-is-100-when-all-events-processed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-replay.replay-progress.percentage-is-100-when-all-events-processed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-replay.replay-progress +--- +# Percentage is 100 when all events processed + +## Intent + +- outcome: Executable scenario "Percentage is 100 when all events processed" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-003-percentage-is-100-when-total-events-is-zero.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-003-percentage-is-100-when-total-events-is-zero.sdp.md new file mode 100644 index 00000000..eb2ca582 --- /dev/null +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-003-percentage-is-100-when-total-events-is-zero.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-replay.replay-progress.percentage-is-100-when-total-events-is-zero +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-replay.replay-progress +--- +# Percentage is 100 when total events is zero + +## Intent + +- outcome: Executable scenario "Percentage is 100 when total events is zero" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-004-percentage-has-one-decimal-place-precision.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-004-percentage-has-one-decimal-place-precision.sdp.md new file mode 100644 index 00000000..5412bbbd --- /dev/null +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-004-percentage-has-one-decimal-place-precision.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-replay.replay-progress.percentage-has-one-decimal-place-precision +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-replay.replay-progress +--- +# Percentage has one decimal place precision + +## Intent + +- outcome: Executable scenario "Percentage has one decimal place precision" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-005-remaining-time-estimated-from-throughput.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-005-remaining-time-estimated-from-throughput.sdp.md new file mode 100644 index 00000000..5f843329 --- /dev/null +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-005-remaining-time-estimated-from-throughput.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-replay.replay-progress.remaining-time-estimated-from-throughput +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-replay.replay-progress +--- +# Remaining time estimated from throughput + +## Intent + +- outcome: Executable scenario "Remaining time estimated from throughput" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-006-remaining-time-is-undefined-when-no-events-processed.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-006-remaining-time-is-undefined-when-no-events-processed.sdp.md new file mode 100644 index 00000000..e73ec6e4 --- /dev/null +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-006-remaining-time-is-undefined-when-no-events-processed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-replay.replay-progress.remaining-time-is-undefined-when-no-events-processed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-replay.replay-progress +--- +# Remaining time is undefined when no events processed + +## Intent + +- outcome: Executable scenario "Remaining time is undefined when no events processed" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-007-remaining-time-is-undefined-when-elapsed-time-is-zero.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-007-remaining-time-is-undefined-when-elapsed-time-is-zero.sdp.md new file mode 100644 index 00000000..acefd21d --- /dev/null +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-007-remaining-time-is-undefined-when-elapsed-time-is-zero.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-replay.replay-progress.remaining-time-is-undefined-when-elapsed-time-is-zero +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-replay.replay-progress +--- +# Remaining time is undefined when elapsed time is zero + +## Intent + +- outcome: Executable scenario "Remaining time is undefined when elapsed time is zero" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-008-remaining-time-is-zero-when-all-events-processed.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-008-remaining-time-is-zero-when-all-events-processed.sdp.md new file mode 100644 index 00000000..7a4f0dde --- /dev/null +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-008-remaining-time-is-zero-when-all-events-processed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-replay.replay-progress.remaining-time-is-zero-when-all-events-processed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-replay.replay-progress +--- +# Remaining time is zero when all events processed + +## Intent + +- outcome: Executable scenario "Remaining time is zero when all events processed" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-009-calculate-progress-for-running-replay.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-009-calculate-progress-for-running-replay.sdp.md new file mode 100644 index 00000000..574fe428 --- /dev/null +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-009-calculate-progress-for-running-replay.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-replay.replay-progress.calculate-progress-for-running-replay +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-replay.replay-progress +--- +# Calculate progress for running replay + +## Intent + +- outcome: Executable scenario "Calculate progress for running replay" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-010-calculate-progress-for-completed-replay.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-010-calculate-progress-for-completed-replay.sdp.md new file mode 100644 index 00000000..83117959 --- /dev/null +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-010-calculate-progress-for-completed-replay.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-replay.replay-progress.calculate-progress-for-completed-replay +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-replay.replay-progress +--- +# Calculate progress for completed replay + +## Intent + +- outcome: Executable scenario "Calculate progress for completed replay" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-011-calculate-progress-includes-error-for-failed-replay.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-011-calculate-progress-includes-error-for-failed-replay.sdp.md new file mode 100644 index 00000000..00c9e1bb --- /dev/null +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-011-calculate-progress-includes-error-for-failed-replay.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-replay.replay-progress.calculate-progress-includes-error-for-failed-replay +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-replay.replay-progress +--- +# Calculate progress includes error for failed replay + +## Intent + +- outcome: Executable scenario "Calculate progress includes error for failed replay" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-012-running-status-is-active.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-012-running-status-is-active.sdp.md new file mode 100644 index 00000000..1316cf58 --- /dev/null +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-012-running-status-is-active.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-replay.replay-progress.running-status-is-active +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-replay.replay-progress +--- +# Running status is active + +## Intent + +- outcome: Executable scenario "Running status is active" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-013-paused-status-is-active.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-013-paused-status-is-active.sdp.md new file mode 100644 index 00000000..0507bb61 --- /dev/null +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-013-paused-status-is-active.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-replay.replay-progress.paused-status-is-active +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-replay.replay-progress +--- +# Paused status is active + +## Intent + +- outcome: Executable scenario "Paused status is active" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-014-completed-status-is-not-active.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-014-completed-status-is-not-active.sdp.md new file mode 100644 index 00000000..a7d403ec --- /dev/null +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-014-completed-status-is-not-active.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-replay.replay-progress.completed-status-is-not-active +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-replay.replay-progress +--- +# Completed status is not active + +## Intent + +- outcome: Executable scenario "Completed status is not active" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-015-failed-status-is-not-active.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-015-failed-status-is-not-active.sdp.md new file mode 100644 index 00000000..2203db9d --- /dev/null +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-015-failed-status-is-not-active.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-replay.replay-progress.failed-status-is-not-active +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-replay.replay-progress +--- +# Failed status is not active + +## Intent + +- outcome: Executable scenario "Failed status is not active" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-016-completed-status-is-terminal.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-016-completed-status-is-terminal.sdp.md new file mode 100644 index 00000000..7af39b02 --- /dev/null +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-016-completed-status-is-terminal.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-replay.replay-progress.completed-status-is-terminal +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-replay.replay-progress +--- +# Completed status is terminal + +## Intent + +- outcome: Executable scenario "Completed status is terminal" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-017-failed-status-is-terminal.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-017-failed-status-is-terminal.sdp.md new file mode 100644 index 00000000..3cf90a4a --- /dev/null +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-017-failed-status-is-terminal.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-replay.replay-progress.failed-status-is-terminal +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-replay.replay-progress +--- +# Failed status is terminal + +## Intent + +- outcome: Executable scenario "Failed status is terminal" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-018-cancelled-status-is-terminal.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-018-cancelled-status-is-terminal.sdp.md new file mode 100644 index 00000000..0083f21c --- /dev/null +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-018-cancelled-status-is-terminal.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-replay.replay-progress.cancelled-status-is-terminal +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-replay.replay-progress +--- +# Cancelled status is terminal + +## Intent + +- outcome: Executable scenario "Cancelled status is terminal" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-019-running-status-is-not-terminal.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-019-running-status-is-not-terminal.sdp.md new file mode 100644 index 00000000..72d637f1 --- /dev/null +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-019-running-status-is-not-terminal.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-replay.replay-progress.running-status-is-not-terminal +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-replay.replay-progress +--- +# Running status is not terminal + +## Intent + +- outcome: Executable scenario "Running status is not terminal" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-020-paused-status-is-not-terminal.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-020-paused-status-is-not-terminal.sdp.md new file mode 100644 index 00000000..0a952217 --- /dev/null +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-020-paused-status-is-not-terminal.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-replay.replay-progress.paused-status-is-not-terminal +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-replay.replay-progress +--- +# Paused status is not terminal + +## Intent + +- outcome: Executable scenario "Paused status is not terminal" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-001-create-append-partition-key-generates-correct-format.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-001-create-append-partition-key-generates-correct-format.sdp.md new file mode 100644 index 00000000..c5290a67 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-001-create-append-partition-key-generates-correct-format.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-append.create-append-partition-key-generates-correct-format +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-append +--- +# createAppendPartitionKey generates correct format + +## Intent + +- outcome: Executable scenario "createAppendPartitionKey generates correct format" from packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-002-partition-key-handles-various-stream-types.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-002-partition-key-handles-various-stream-types.sdp.md new file mode 100644 index 00000000..c5b7d61e --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-002-partition-key-handles-various-stream-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-append.partition-key-handles-various-stream-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-append +--- +# Partition key handles various stream types + +## Intent + +- outcome: Executable scenario "Partition key handles various stream types" from packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-003-durable-append-event-enqueues-action-to-workpool.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-003-durable-append-event-enqueues-action-to-workpool.sdp.md new file mode 100644 index 00000000..cc3a06f2 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-003-durable-append-event-enqueues-action-to-workpool.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-append.durable-append-event-enqueues-action-to-workpool +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-append +--- +# durableAppendEvent enqueues action to Workpool + +## Intent + +- outcome: Executable scenario "durableAppendEvent enqueues action to Workpool" from packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-004-durable-append-event-returns-work-id-from-workpool.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-004-durable-append-event-returns-work-id-from-workpool.sdp.md new file mode 100644 index 00000000..6ab678b5 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-004-durable-append-event-returns-work-id-from-workpool.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-append.durable-append-event-returns-work-id-from-workpool +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-append +--- +# durableAppendEvent returns work ID from Workpool + +## Intent + +- outcome: Executable scenario "durableAppendEvent returns work ID from Workpool" from packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-005-durable-append-event-passes-on-complete-to-workpool.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-005-durable-append-event-passes-on-complete-to-workpool.sdp.md new file mode 100644 index 00000000..ff809d8d --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-005-durable-append-event-passes-on-complete-to-workpool.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-append.durable-append-event-passes-on-complete-to-workpool +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-append +--- +# durableAppendEvent passes onComplete to Workpool + +## Intent + +- outcome: Executable scenario "durableAppendEvent passes onComplete to Workpool" from packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-006-durable-append-event-includes-idempotency-key-in-context.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-006-durable-append-event-includes-idempotency-key-in-context.sdp.md new file mode 100644 index 00000000..011d25f3 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-006-durable-append-event-includes-idempotency-key-in-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-append.durable-append-event-includes-idempotency-key-in-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-append +--- +# durableAppendEvent includes idempotencyKey in context + +## Intent + +- outcome: Executable scenario "durableAppendEvent includes idempotencyKey in context" from packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-007-create-durable-append-action-handler-returns-a-function.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-007-create-durable-append-action-handler-returns-a-function.sdp.md new file mode 100644 index 00000000..ec24d69c --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-007-create-durable-append-action-handler-returns-a-function.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-append.create-durable-append-action-handler-returns-a-function +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-append +--- +# createDurableAppendActionHandler returns a function + +## Intent + +- outcome: Executable scenario "createDurableAppendActionHandler returns a function" from packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-008-action-handler-invokes-idempotent-append-event.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-008-action-handler-invokes-idempotent-append-event.sdp.md new file mode 100644 index 00000000..a12ea74f --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-008-action-handler-invokes-idempotent-append-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-append.action-handler-invokes-idempotent-append-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-append +--- +# Action handler invokes idempotentAppendEvent + +## Intent + +- outcome: Executable scenario "Action handler invokes idempotentAppendEvent" from packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-001-partition-key-format-is-event-id-target-context.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-001-partition-key-format-is-event-id-target-context.sdp.md new file mode 100644 index 00000000..d44f7f8b --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-001-partition-key-format-is-event-id-target-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-publication.partition-key-format-is-event-id-target-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-publication +--- +# Partition key format is eventId:targetContext + +## Intent + +- outcome: Executable scenario "Partition key format is eventId:targetContext" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-002-different-events-get-different-partition-keys.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-002-different-events-get-different-partition-keys.sdp.md new file mode 100644 index 00000000..e5e27e2f --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-002-different-events-get-different-partition-keys.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-publication.different-events-get-different-partition-keys +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-publication +--- +# Different events get different partition keys + +## Intent + +- outcome: Executable scenario "Different events get different partition keys" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-003-publishing-event-creates-tracking-records-for-each-target.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-003-publishing-event-creates-tracking-records-for-each-target.sdp.md new file mode 100644 index 00000000..f990e384 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-003-publishing-event-creates-tracking-records-for-each-target.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-publication.publishing-event-creates-tracking-records-for-each-target +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-publication +--- +# Publishing event creates tracking records for each target + +## Intent + +- outcome: Executable scenario "Publishing event creates tracking records for each target" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-004-publishing-event-enqueues-delivery-actions-via-workpool.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-004-publishing-event-enqueues-delivery-actions-via-workpool.sdp.md new file mode 100644 index 00000000..4dbdf541 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-004-publishing-event-enqueues-delivery-actions-via-workpool.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-publication.publishing-event-enqueues-delivery-actions-via-workpool +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-publication +--- +# Publishing event enqueues delivery actions via Workpool + +## Intent + +- outcome: Executable scenario "Publishing event enqueues delivery actions via Workpool" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-005-publish-result-contains-publication-i-ds-for-each-target.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-005-publish-result-contains-publication-i-ds-for-each-target.sdp.md new file mode 100644 index 00000000..0ab6ef44 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-005-publish-result-contains-publication-i-ds-for-each-target.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-publication.publish-result-contains-publication-i-ds-for-each-target +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-publication +--- +# Publish result contains publication IDs for each target + +## Intent + +- outcome: Executable scenario "Publish result contains publication IDs for each target" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-006-correlation-id-is-passed-through-to-tracking-records.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-006-correlation-id-is-passed-through-to-tracking-records.sdp.md new file mode 100644 index 00000000..9348f14e --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-006-correlation-id-is-passed-through-to-tracking-records.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-publication.correlation-id-is-passed-through-to-tracking-records +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-publication +--- +# Correlation ID is passed through to tracking records + +## Intent + +- outcome: Executable scenario "Correlation ID is passed through to tracking records" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-007-get-publication-status-returns-all-target-contexts.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-007-get-publication-status-returns-all-target-contexts.sdp.md new file mode 100644 index 00000000..7700bd39 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-007-get-publication-status-returns-all-target-contexts.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-publication.get-publication-status-returns-all-target-contexts +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-publication +--- +# Get publication status returns all target contexts + +## Intent + +- outcome: Executable scenario "Get publication status returns all target contexts" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-008-get-publication-status-returns-empty-array-for-unknown-event.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-008-get-publication-status-returns-empty-array-for-unknown-event.sdp.md new file mode 100644 index 00000000..6b26c3e8 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-008-get-publication-status-returns-empty-array-for-unknown-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-publication.get-publication-status-returns-empty-array-for-unknown-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-publication +--- +# Get publication status returns empty array for unknown event + +## Intent + +- outcome: Executable scenario "Get publication status returns empty array for unknown event" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-009-retry-publication-re-enqueues-delivery-action.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-009-retry-publication-re-enqueues-delivery-action.sdp.md new file mode 100644 index 00000000..c6124ae5 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-009-retry-publication-re-enqueues-delivery-action.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-publication.retry-publication-re-enqueues-delivery-action +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-publication +--- +# Retry publication re-enqueues delivery action + +## Intent + +- outcome: Executable scenario "Retry publication re-enqueues delivery action" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-010-retry-publication-returns-not-found-for-unknown-publication.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-010-retry-publication-returns-not-found-for-unknown-publication.sdp.md new file mode 100644 index 00000000..5b6cfc02 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-010-retry-publication-returns-not-found-for-unknown-publication.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-publication.retry-publication-returns-not-found-for-unknown-publication +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-publication +--- +# Retry publication returns not_found for unknown publication + +## Intent + +- outcome: Executable scenario "Retry publication returns not_found for unknown publication" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-011-retry-publication-returns-already-delivered-for-delivered-publication.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-011-retry-publication-returns-already-delivered-for-delivered-publication.sdp.md new file mode 100644 index 00000000..9dc802ca --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-011-retry-publication-returns-already-delivered-for-delivered-publication.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-publication.retry-publication-returns-already-delivered-for-delivered-publication +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-publication +--- +# Retry publication returns already_delivered for delivered publication + +## Intent + +- outcome: Executable scenario "Retry publication returns already_delivered for delivered publication" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-012-retry-increments-attempt-count-correctly.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-012-retry-increments-attempt-count-correctly.sdp.md new file mode 100644 index 00000000..0462ca55 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-012-retry-increments-attempt-count-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-publication.retry-increments-attempt-count-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-publication +--- +# Retry increments attempt count correctly + +## Intent + +- outcome: Executable scenario "Retry increments attempt count correctly" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-013-on-complete-updates-status-to-delivered-on-success.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-013-on-complete-updates-status-to-delivered-on-success.sdp.md new file mode 100644 index 00000000..cc6d422a --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-013-on-complete-updates-status-to-delivered-on-success.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-publication.on-complete-updates-status-to-delivered-on-success +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-publication +--- +# onComplete updates status to delivered on success + +## Intent + +- outcome: Executable scenario "onComplete updates status to delivered on success" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-014-on-complete-increments-attempt-count-on-failure.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-014-on-complete-increments-attempt-count-on-failure.sdp.md new file mode 100644 index 00000000..5b28ef49 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-014-on-complete-increments-attempt-count-on-failure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-publication.on-complete-increments-attempt-count-on-failure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-publication +--- +# onComplete increments attemptCount on failure + +## Intent + +- outcome: Executable scenario "onComplete increments attemptCount on failure" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-015-on-complete-creates-dead-letter-after-max-retries.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-015-on-complete-creates-dead-letter-after-max-retries.sdp.md new file mode 100644 index 00000000..9a690897 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-015-on-complete-creates-dead-letter-after-max-retries.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.durable-publication.on-complete-creates-dead-letter-after-max-retries +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.durable-publication +--- +# onComplete creates dead letter after max retries + +## Intent + +- outcome: Executable scenario "onComplete creates dead letter after max retries" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-001-command-idempotency-key-uses-command-type-entity-id-command-id-format.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-001-command-idempotency-key-uses-command-type-entity-id-command-id-format.sdp.md new file mode 100644 index 00000000..4beb7d3a --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-001-command-idempotency-key-uses-command-type-entity-id-command-id-format.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.idempotent-append.command-idempotency-key-uses-command-type-entity-id-command-id-format +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.idempotent-append +--- +# Command idempotency key uses commandType:entityId:commandId format + +## Intent + +- outcome: Executable scenario "Command idempotency key uses commandType:entityId:commandId format" from packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-002-action-idempotency-key-uses-action-type-entity-id-format.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-002-action-idempotency-key-uses-action-type-entity-id-format.sdp.md new file mode 100644 index 00000000..03d0d026 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-002-action-idempotency-key-uses-action-type-entity-id-format.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.idempotent-append.action-idempotency-key-uses-action-type-entity-id-format +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.idempotent-append +--- +# Action idempotency key uses actionType:entityId format + +## Intent + +- outcome: Executable scenario "Action idempotency key uses actionType:entityId format" from packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-003-saga-step-idempotency-key-uses-saga-type-saga-id-step-format.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-003-saga-step-idempotency-key-uses-saga-type-saga-id-step-format.sdp.md new file mode 100644 index 00000000..83fb35d1 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-003-saga-step-idempotency-key-uses-saga-type-saga-id-step-format.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.idempotent-append.saga-step-idempotency-key-uses-saga-type-saga-id-step-format +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.idempotent-append +--- +# Saga step idempotency key uses sagaType:sagaId:step format + +## Intent + +- outcome: Executable scenario "Saga step idempotency key uses sagaType:sagaId:step format" from packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-004-scheduled-job-idempotency-key-uses-job-type-schedule-id-timestamp-format.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-004-scheduled-job-idempotency-key-uses-job-type-schedule-id-timestamp-format.sdp.md new file mode 100644 index 00000000..77cd6564 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-004-scheduled-job-idempotency-key-uses-job-type-schedule-id-timestamp-format.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.idempotent-append.scheduled-job-idempotency-key-uses-job-type-schedule-id-timestamp-format +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.idempotent-append +--- +# Scheduled job idempotency key uses jobType:scheduleId:timestamp format + +## Intent + +- outcome: Executable scenario "Scheduled job idempotency key uses jobType:scheduleId:timestamp format" from packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-005-first-append-with-idempotency-key-succeeds.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-005-first-append-with-idempotency-key-succeeds.sdp.md new file mode 100644 index 00000000..93c6fa64 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-005-first-append-with-idempotency-key-succeeds.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.idempotent-append.first-append-with-idempotency-key-succeeds +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.idempotent-append +--- +# First append with idempotency key succeeds + +## Intent + +- outcome: Executable scenario "First append with idempotency key succeeds" from packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-006-duplicate-append-returns-existing-event.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-006-duplicate-append-returns-existing-event.sdp.md new file mode 100644 index 00000000..4f67f2e3 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-006-duplicate-append-returns-existing-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.idempotent-append.duplicate-append-returns-existing-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.idempotent-append +--- +# Duplicate append returns existing event + +## Intent + +- outcome: Executable scenario "Duplicate append returns existing event" from packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-007-same-key-with-different-payload-is-rejected.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-007-same-key-with-different-payload-is-rejected.sdp.md new file mode 100644 index 00000000..410b8fcd --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-007-same-key-with-different-payload-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.idempotent-append.same-key-with-different-payload-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.idempotent-append +--- +# Same key with different payload is rejected + +## Intent + +- outcome: Executable scenario "Same key with different payload is rejected" from packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-008-different-idempotency-keys-create-separate-events.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-008-different-idempotency-keys-create-separate-events.sdp.md new file mode 100644 index 00000000..a48ab08b --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-008-different-idempotency-keys-create-separate-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.idempotent-append.different-idempotency-keys-create-separate-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.idempotent-append +--- +# Different idempotency keys create separate events + +## Intent + +- outcome: Executable scenario "Different idempotency keys create separate events" from packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-009-occ-conflict-with-duplicate-on-recheck-returns-duplicate.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-009-occ-conflict-with-duplicate-on-recheck-returns-duplicate.sdp.md new file mode 100644 index 00000000..2d7f2314 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-009-occ-conflict-with-duplicate-on-recheck-returns-duplicate.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.idempotent-append.occ-conflict-with-duplicate-on-recheck-returns-duplicate +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.idempotent-append +--- +# OCC conflict with duplicate on recheck returns duplicate + +## Intent + +- outcome: Executable scenario "OCC conflict with duplicate on recheck returns duplicate" from packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-010-true-occ-conflict-throws-error.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-010-true-occ-conflict-throws-error.sdp.md new file mode 100644 index 00000000..14cbfea6 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-010-true-occ-conflict-throws-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.idempotent-append.true-occ-conflict-throws-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.idempotent-append +--- +# True OCC conflict throws error + +## Intent + +- outcome: Executable scenario "True OCC conflict throws error" from packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-001-build-intent-key-generates-correct-format.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-001-build-intent-key-generates-correct-format.sdp.md new file mode 100644 index 00000000..a1828fd9 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-001-build-intent-key-generates-correct-format.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.intent-completion.build-intent-key-generates-correct-format +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.intent-completion +--- +# buildIntentKey generates correct format + +## Intent + +- outcome: Executable scenario "buildIntentKey generates correct format" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-002-intent-key-handles-various-operation-types.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-002-intent-key-handles-various-operation-types.sdp.md new file mode 100644 index 00000000..7ab79dbe --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-002-intent-key-handles-various-operation-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.intent-completion.intent-key-handles-various-operation-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.intent-completion +--- +# Intent key handles various operation types + +## Intent + +- outcome: Executable scenario "Intent key handles various operation types" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-003-record-intent-creates-intent-event-with-correct-type.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-003-record-intent-creates-intent-event-with-correct-type.sdp.md new file mode 100644 index 00000000..c7368d7d --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-003-record-intent-creates-intent-event-with-correct-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.intent-completion.record-intent-creates-intent-event-with-correct-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.intent-completion +--- +# recordIntent creates intent event with correct type + +## Intent + +- outcome: Executable scenario "recordIntent creates intent event with correct type" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-004-record-intent-schedules-timeout-check.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-004-record-intent-schedules-timeout-check.sdp.md new file mode 100644 index 00000000..60644e83 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-004-record-intent-schedules-timeout-check.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.intent-completion.record-intent-schedules-timeout-check +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.intent-completion +--- +# recordIntent schedules timeout check + +## Intent + +- outcome: Executable scenario "recordIntent schedules timeout check" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-005-record-intent-returns-intent-key-and-event-id.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-005-record-intent-returns-intent-key-and-event-id.sdp.md new file mode 100644 index 00000000..cfa3962c --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-005-record-intent-returns-intent-key-and-event-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.intent-completion.record-intent-returns-intent-key-and-event-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.intent-completion +--- +# recordIntent returns intentKey and eventId + +## Intent + +- outcome: Executable scenario "recordIntent returns intentKey and eventId" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-006-record-completion-creates-success-event.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-006-record-completion-creates-success-event.sdp.md new file mode 100644 index 00000000..b3fd415d --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-006-record-completion-creates-success-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.intent-completion.record-completion-creates-success-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.intent-completion +--- +# recordCompletion creates success event + +## Intent + +- outcome: Executable scenario "recordCompletion creates success event" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-007-record-completion-creates-failure-event-with-error.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-007-record-completion-creates-failure-event-with-error.sdp.md new file mode 100644 index 00000000..dc3adda9 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-007-record-completion-creates-failure-event-with-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.intent-completion.record-completion-creates-failure-event-with-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.intent-completion +--- +# recordCompletion creates failure event with error + +## Intent + +- outcome: Executable scenario "recordCompletion creates failure event with error" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-008-record-completion-creates-abandonment-event.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-008-record-completion-creates-abandonment-event.sdp.md new file mode 100644 index 00000000..0edc7326 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-008-record-completion-creates-abandonment-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.intent-completion.record-completion-creates-abandonment-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.intent-completion +--- +# recordCompletion creates abandonment event + +## Intent + +- outcome: Executable scenario "recordCompletion creates abandonment event" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-009-check-intent-timeout-returns-already-resolved-when-completion-exists.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-009-check-intent-timeout-returns-already-resolved-when-completion-exists.sdp.md new file mode 100644 index 00000000..3cacd5fd --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-009-check-intent-timeout-returns-already-resolved-when-completion-exists.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.intent-completion.check-intent-timeout-returns-already-resolved-when-completion-exists +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.intent-completion +--- +# checkIntentTimeout returns already_resolved when completion exists + +## Intent + +- outcome: Executable scenario "checkIntentTimeout returns already_resolved when completion exists" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-010-check-intent-timeout-creates-abandonment-when-no-completion.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-010-check-intent-timeout-creates-abandonment-when-no-completion.sdp.md new file mode 100644 index 00000000..6d9ffc72 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-010-check-intent-timeout-creates-abandonment-when-no-completion.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.intent-completion.check-intent-timeout-creates-abandonment-when-no-completion +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.intent-completion +--- +# checkIntentTimeout creates abandonment when no completion + +## Intent + +- outcome: Executable scenario "checkIntentTimeout creates abandonment when no completion" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-011-check-intent-timeout-is-idempotent.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-011-check-intent-timeout-is-idempotent.sdp.md new file mode 100644 index 00000000..74e5e6d1 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-011-check-intent-timeout-is-idempotent.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.intent-completion.check-intent-timeout-is-idempotent +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.intent-completion +--- +# checkIntentTimeout is idempotent + +## Intent + +- outcome: Executable scenario "checkIntentTimeout is idempotent" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-012-query-orphaned-intents-returns-intents-without-completion.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-012-query-orphaned-intents-returns-intents-without-completion.sdp.md new file mode 100644 index 00000000..c4ca2145 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-012-query-orphaned-intents-returns-intents-without-completion.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.intent-completion.query-orphaned-intents-returns-intents-without-completion +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.intent-completion +--- +# queryOrphanedIntents returns intents without completion + +## Intent + +- outcome: Executable scenario "queryOrphanedIntents returns intents without completion" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-013-query-orphaned-intents-filters-by-operation-type.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-013-query-orphaned-intents-filters-by-operation-type.sdp.md new file mode 100644 index 00000000..a10dc957 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-013-query-orphaned-intents-filters-by-operation-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.intent-completion.query-orphaned-intents-filters-by-operation-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.intent-completion +--- +# queryOrphanedIntents filters by operation type + +## Intent + +- outcome: Executable scenario "queryOrphanedIntents filters by operation type" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature diff --git a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-001-create-outbox-handler-returns-a-callable-function.sdp.md b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-001-create-outbox-handler-returns-a-callable-function.sdp.md new file mode 100644 index 00000000..81376097 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-001-create-outbox-handler-returns-a-callable-function.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.outbox-handler.create-outbox-handler-returns-a-callable-function +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.outbox-handler +--- +# createOutboxHandler returns a callable function + +## Intent + +- outcome: Executable scenario "createOutboxHandler returns a callable function" from packages/platform-core/tests/features/behavior/event-store-durability/outbox-handler.feature diff --git a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-002-outbox-handler-extracts-idempotency-key-from-context.sdp.md b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-002-outbox-handler-extracts-idempotency-key-from-context.sdp.md new file mode 100644 index 00000000..3d701075 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-002-outbox-handler-extracts-idempotency-key-from-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.outbox-handler.outbox-handler-extracts-idempotency-key-from-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.outbox-handler +--- +# Outbox handler extracts idempotency key from context + +## Intent + +- outcome: Executable scenario "Outbox handler extracts idempotency key from context" from packages/platform-core/tests/features/behavior/event-store-durability/outbox-handler.feature diff --git a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-003-outbox-handler-builds-payment-completed-event-from-success-result.sdp.md b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-003-outbox-handler-builds-payment-completed-event-from-success-result.sdp.md new file mode 100644 index 00000000..a0802f1a --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-003-outbox-handler-builds-payment-completed-event-from-success-result.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.outbox-handler.outbox-handler-builds-payment-completed-event-from-success-result +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.outbox-handler +--- +# Outbox handler builds PaymentCompleted event from success result + +## Intent + +- outcome: Executable scenario "Outbox handler builds PaymentCompleted event from success result" from packages/platform-core/tests/features/behavior/event-store-durability/outbox-handler.feature diff --git a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-004-outbox-handler-builds-payment-failed-event-from-failure-result.sdp.md b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-004-outbox-handler-builds-payment-failed-event-from-failure-result.sdp.md new file mode 100644 index 00000000..db80b67e --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-004-outbox-handler-builds-payment-failed-event-from-failure-result.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.outbox-handler.outbox-handler-builds-payment-failed-event-from-failure-result +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.outbox-handler +--- +# Outbox handler builds PaymentFailed event from failure result + +## Intent + +- outcome: Executable scenario "Outbox handler builds PaymentFailed event from failure result" from packages/platform-core/tests/features/behavior/event-store-durability/outbox-handler.feature diff --git a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-005-outbox-handler-calls-idempotent-append-event-internally.sdp.md b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-005-outbox-handler-calls-idempotent-append-event-internally.sdp.md new file mode 100644 index 00000000..4d730c14 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-005-outbox-handler-calls-idempotent-append-event-internally.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.outbox-handler.outbox-handler-calls-idempotent-append-event-internally +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.outbox-handler +--- +# Outbox handler calls idempotentAppendEvent internally + +## Intent + +- outcome: Executable scenario "Outbox handler calls idempotentAppendEvent internally" from packages/platform-core/tests/features/behavior/event-store-durability/outbox-handler.feature diff --git a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-006-outbox-handler-completes-without-error-for-duplicates.sdp.md b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-006-outbox-handler-completes-without-error-for-duplicates.sdp.md new file mode 100644 index 00000000..a204586b --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-006-outbox-handler-completes-without-error-for-duplicates.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.outbox-handler.outbox-handler-completes-without-error-for-duplicates +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.outbox-handler +--- +# Outbox handler completes without error for duplicates + +## Intent + +- outcome: Executable scenario "Outbox handler completes without error for duplicates" from packages/platform-core/tests/features/behavior/event-store-durability/outbox-handler.feature diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-001-successful-processing-creates-no-poison-record.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-001-successful-processing-creates-no-poison-record.sdp.md new file mode 100644 index 00000000..96dc013d --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-001-successful-processing-creates-no-poison-record.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.poison-event.successful-processing-creates-no-poison-record +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.poison-event +--- +# Successful processing creates no poison record + +## Intent + +- outcome: Executable scenario "Successful processing creates no poison record" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-002-first-failure-records-attempt-but-does-not-quarantine.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-002-first-failure-records-attempt-but-does-not-quarantine.sdp.md new file mode 100644 index 00000000..1dd57505 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-002-first-failure-records-attempt-but-does-not-quarantine.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.poison-event.first-failure-records-attempt-but-does-not-quarantine +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.poison-event +--- +# First failure records attempt but does not quarantine + +## Intent + +- outcome: Executable scenario "First failure records attempt but does not quarantine" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-003-event-becomes-quarantined-after-max-retries.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-003-event-becomes-quarantined-after-max-retries.sdp.md new file mode 100644 index 00000000..ae0e2aa0 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-003-event-becomes-quarantined-after-max-retries.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.poison-event.event-becomes-quarantined-after-max-retries +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.poison-event +--- +# Event becomes quarantined after max retries + +## Intent + +- outcome: Executable scenario "Event becomes quarantined after max retries" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-004-quarantined-event-is-silently-skipped.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-004-quarantined-event-is-silently-skipped.sdp.md new file mode 100644 index 00000000..888b4d7f --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-004-quarantined-event-is-silently-skipped.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.poison-event.quarantined-event-is-silently-skipped +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.poison-event +--- +# Quarantined event is silently skipped + +## Intent + +- outcome: Executable scenario "Quarantined event is silently skipped" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-005-on-quarantine-callback-invoked-when-alert-on-quarantine-is-true.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-005-on-quarantine-callback-invoked-when-alert-on-quarantine-is-true.sdp.md new file mode 100644 index 00000000..93f43b61 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-005-on-quarantine-callback-invoked-when-alert-on-quarantine-is-true.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.poison-event.on-quarantine-callback-invoked-when-alert-on-quarantine-is-true +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.poison-event +--- +# onQuarantine callback invoked when alertOnQuarantine is true + +## Intent + +- outcome: Executable scenario "onQuarantine callback invoked when alertOnQuarantine is true" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-006-on-quarantine-not-invoked-when-alert-on-quarantine-is-false.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-006-on-quarantine-not-invoked-when-alert-on-quarantine-is-false.sdp.md new file mode 100644 index 00000000..ad05fe6f --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-006-on-quarantine-not-invoked-when-alert-on-quarantine-is-false.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.poison-event.on-quarantine-not-invoked-when-alert-on-quarantine-is-false +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.poison-event +--- +# onQuarantine NOT invoked when alertOnQuarantine is false + +## Intent + +- outcome: Executable scenario "onQuarantine NOT invoked when alertOnQuarantine is false" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-007-is-event-quarantined-returns-true-for-quarantined-event.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-007-is-event-quarantined-returns-true-for-quarantined-event.sdp.md new file mode 100644 index 00000000..dc214d88 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-007-is-event-quarantined-returns-true-for-quarantined-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.poison-event.is-event-quarantined-returns-true-for-quarantined-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.poison-event +--- +# isEventQuarantined returns true for quarantined event + +## Intent + +- outcome: Executable scenario "isEventQuarantined returns true for quarantined event" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-008-is-event-quarantined-returns-false-for-non-quarantined-event.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-008-is-event-quarantined-returns-false-for-non-quarantined-event.sdp.md new file mode 100644 index 00000000..8f35d2da --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-008-is-event-quarantined-returns-false-for-non-quarantined-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.poison-event.is-event-quarantined-returns-false-for-non-quarantined-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.poison-event +--- +# isEventQuarantined returns false for non-quarantined event + +## Intent + +- outcome: Executable scenario "isEventQuarantined returns false for non-quarantined event" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-009-get-poison-event-record-returns-normalized-record.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-009-get-poison-event-record-returns-normalized-record.sdp.md new file mode 100644 index 00000000..02d8628e --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-009-get-poison-event-record-returns-normalized-record.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.poison-event.get-poison-event-record-returns-normalized-record +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.poison-event +--- +# getPoisonEventRecord returns normalized record + +## Intent + +- outcome: Executable scenario "getPoisonEventRecord returns normalized record" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-010-get-poison-event-record-returns-null-for-non-existent-event.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-010-get-poison-event-record-returns-null-for-non-existent-event.sdp.md new file mode 100644 index 00000000..075e33fa --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-010-get-poison-event-record-returns-null-for-non-existent-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.poison-event.get-poison-event-record-returns-null-for-non-existent-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.poison-event +--- +# getPoisonEventRecord returns null for non-existent event + +## Intent + +- outcome: Executable scenario "getPoisonEventRecord returns null for non-existent event" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-011-unquarantine-event-clears-quarantine-status.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-011-unquarantine-event-clears-quarantine-status.sdp.md new file mode 100644 index 00000000..2fb0bed8 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-011-unquarantine-event-clears-quarantine-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.poison-event.unquarantine-event-clears-quarantine-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.poison-event +--- +# unquarantineEvent clears quarantine status + +## Intent + +- outcome: Executable scenario "unquarantineEvent clears quarantine status" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-012-unquarantine-event-returns-not-found-for-missing-event.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-012-unquarantine-event-returns-not-found-for-missing-event.sdp.md new file mode 100644 index 00000000..29901302 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-012-unquarantine-event-returns-not-found-for-missing-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.poison-event.unquarantine-event-returns-not-found-for-missing-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.poison-event +--- +# unquarantineEvent returns not_found for missing event + +## Intent + +- outcome: Executable scenario "unquarantineEvent returns not_found for missing event" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-013-unquarantine-event-returns-not-quarantined-for-pending-event.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-013-unquarantine-event-returns-not-quarantined-for-pending-event.sdp.md new file mode 100644 index 00000000..9279a291 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-013-unquarantine-event-returns-not-quarantined-for-pending-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.poison-event.unquarantine-event-returns-not-quarantined-for-pending-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.poison-event +--- +# unquarantineEvent returns not_quarantined for pending event + +## Intent + +- outcome: Executable scenario "unquarantineEvent returns not_quarantined for pending event" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-014-list-quarantined-events-returns-quarantined-records.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-014-list-quarantined-events-returns-quarantined-records.sdp.md new file mode 100644 index 00000000..f2632ce8 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-014-list-quarantined-events-returns-quarantined-records.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.poison-event.list-quarantined-events-returns-quarantined-records +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.poison-event +--- +# listQuarantinedEvents returns quarantined records + +## Intent + +- outcome: Executable scenario "listQuarantinedEvents returns quarantined records" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-015-list-quarantined-events-filters-by-projection.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-015-list-quarantined-events-filters-by-projection.sdp.md new file mode 100644 index 00000000..dca64501 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-015-list-quarantined-events-filters-by-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.poison-event.list-quarantined-events-filters-by-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.poison-event +--- +# listQuarantinedEvents filters by projection + +## Intent + +- outcome: Executable scenario "listQuarantinedEvents filters by projection" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-016-get-poison-event-stats-returns-aggregated-statistics.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-016-get-poison-event-stats-returns-aggregated-statistics.sdp.md new file mode 100644 index 00000000..b2a51ee6 --- /dev/null +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-016-get-poison-event-stats-returns-aggregated-statistics.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.event-store-durability.poison-event.get-poison-event-stats-returns-aggregated-statistics +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.event-store-durability.poison-event +--- +# getPoisonEventStats returns aggregated statistics + +## Intent + +- outcome: Executable scenario "getPoisonEventStats returns aggregated statistics" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-001-creates-bus-with-empty-subscriptions.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-001-creates-bus-with-empty-subscriptions.sdp.md new file mode 100644 index 00000000..447591a5 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-001-creates-bus-with-empty-subscriptions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.creates-bus-with-empty-subscriptions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Creates bus with empty subscriptions + +## Intent + +- outcome: Executable scenario "Creates bus with empty subscriptions" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-002-creates-bus-with-subscriptions-sorted-by-priority.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-002-creates-bus-with-subscriptions-sorted-by-priority.sdp.md new file mode 100644 index 00000000..b3ca3c30 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-002-creates-bus-with-subscriptions-sorted-by-priority.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.creates-bus-with-subscriptions-sorted-by-priority +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Creates bus with subscriptions sorted by priority + +## Intent + +- outcome: Executable scenario "Creates bus with subscriptions sorted by priority" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-003-returns-empty-result-when-no-subscriptions-match.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-003-returns-empty-result-when-no-subscriptions-match.sdp.md new file mode 100644 index 00000000..d94967bc --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-003-returns-empty-result-when-no-subscriptions-match.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.returns-empty-result-when-no-subscriptions-match +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Returns empty result when no subscriptions match + +## Intent + +- outcome: Executable scenario "Returns empty result when no subscriptions match" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-004-enqueues-matching-subscriptions-via-workpool.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-004-enqueues-matching-subscriptions-via-workpool.sdp.md new file mode 100644 index 00000000..926895d9 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-004-enqueues-matching-subscriptions-via-workpool.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.enqueues-matching-subscriptions-via-workpool +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Enqueues matching subscriptions via workpool + +## Intent + +- outcome: Executable scenario "Enqueues matching subscriptions via workpool" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-005-enqueues-multiple-matching-subscriptions.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-005-enqueues-multiple-matching-subscriptions.sdp.md new file mode 100644 index 00000000..c091cc9f --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-005-enqueues-multiple-matching-subscriptions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.enqueues-multiple-matching-subscriptions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Enqueues multiple matching subscriptions + +## Intent + +- outcome: Executable scenario "Enqueues multiple matching subscriptions" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-006-passes-transformed-args-to-workpool.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-006-passes-transformed-args-to-workpool.sdp.md new file mode 100644 index 00000000..5c235426 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-006-passes-transformed-args-to-workpool.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.passes-transformed-args-to-workpool +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Passes transformed args to workpool + +## Intent + +- outcome: Executable scenario "Passes transformed args to workpool" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-007-includes-partition-key-in-workpool-context.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-007-includes-partition-key-in-workpool-context.sdp.md new file mode 100644 index 00000000..381ee49c --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-007-includes-partition-key-in-workpool-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.includes-partition-key-in-workpool-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Includes partition key in workpool context + +## Intent + +- outcome: Executable scenario "Includes partition key in workpool context" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-008-uses-subscription-level-on-complete-when-provided.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-008-uses-subscription-level-on-complete-when-provided.sdp.md new file mode 100644 index 00000000..b7508b2a --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-008-uses-subscription-level-on-complete-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.uses-subscription-level-on-complete-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Uses subscription-level onComplete when provided + +## Intent + +- outcome: Executable scenario "Uses subscription-level onComplete when provided" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-009-uses-default-on-complete-from-config-when-subscription-has-none.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-009-uses-default-on-complete-from-config-when-subscription-has-none.sdp.md new file mode 100644 index 00000000..9d52f19a --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-009-uses-default-on-complete-from-config-when-subscription-has-none.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.uses-default-on-complete-from-config-when-subscription-has-none +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Uses default onComplete from config when subscription has none + +## Intent + +- outcome: Executable scenario "Uses default onComplete from config when subscription has none" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-010-does-not-include-on-complete-if-neither-subscription-nor-config-provides-i.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-010-does-not-include-on-complete-if-neither-subscription-nor-config-provides-i.sdp.md new file mode 100644 index 00000000..32550e36 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-010-does-not-include-on-complete-if-neither-subscription-nor-config-provides-i.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.does-not-include-on-complete-if-neither-subscription-nor-config-provides-it +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Does not include onComplete if neither subscription nor config provides it + +## Intent + +- outcome: Executable scenario "Does not include onComplete if neither subscription nor config provides it" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-011-returns-true-for-indexed-event-type-and-false-for-unsubscribed-type.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-011-returns-true-for-indexed-event-type-and-false-for-unsubscribed-type.sdp.md new file mode 100644 index 00000000..fabe92d2 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-011-returns-true-for-indexed-event-type-and-false-for-unsubscribed-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.returns-true-for-indexed-event-type-and-false-for-unsubscribed-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Returns true for indexed event type and false for unsubscribed type + +## Intent + +- outcome: Executable scenario "Returns true for indexed event type and false for unsubscribed type" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-012-returns-true-for-any-event-type-when-wildcard-subscription-exists.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-012-returns-true-for-any-event-type-when-wildcard-subscription-exists.sdp.md new file mode 100644 index 00000000..20155bbf --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-012-returns-true-for-any-event-type-when-wildcard-subscription-exists.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.returns-true-for-any-event-type-when-wildcard-subscription-exists +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Returns true for any event type when wildcard subscription exists + +## Intent + +- outcome: Executable scenario "Returns true for any event type when wildcard subscription exists" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-013-returns-false-when-no-subscriptions-exist.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-013-returns-false-when-no-subscriptions-exist.sdp.md new file mode 100644 index 00000000..56bc3070 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-013-returns-false-when-no-subscriptions-exist.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.returns-false-when-no-subscriptions-exist +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Returns false when no subscriptions exist + +## Intent + +- outcome: Executable scenario "Returns false when no subscriptions exist" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-014-returns-all-subscriptions.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-014-returns-all-subscriptions.sdp.md new file mode 100644 index 00000000..257f06b0 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-014-returns-all-subscriptions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.returns-all-subscriptions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Returns all subscriptions + +## Intent + +- outcome: Executable scenario "Returns all subscriptions" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-015-returns-empty-array-when-no-subscriptions.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-015-returns-empty-array-when-no-subscriptions.sdp.md new file mode 100644 index 00000000..f71a7887 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-015-returns-empty-array-when-no-subscriptions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.returns-empty-array-when-no-subscriptions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Returns empty array when no subscriptions + +## Intent + +- outcome: Executable scenario "Returns empty array when no subscriptions" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-016-returns-subscriptions-matching-event-type-filter.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-016-returns-subscriptions-matching-event-type-filter.sdp.md new file mode 100644 index 00000000..0470948d --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-016-returns-subscriptions-matching-event-type-filter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.returns-subscriptions-matching-event-type-filter +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Returns subscriptions matching event type filter + +## Intent + +- outcome: Executable scenario "Returns subscriptions matching event type filter" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-017-returns-subscriptions-matching-category-filter.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-017-returns-subscriptions-matching-category-filter.sdp.md new file mode 100644 index 00000000..a979f2ce --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-017-returns-subscriptions-matching-category-filter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.returns-subscriptions-matching-category-filter +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Returns subscriptions matching category filter + +## Intent + +- outcome: Executable scenario "Returns subscriptions matching category filter" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-018-publishes-to-subscriptions-in-priority-order.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-018-publishes-to-subscriptions-in-priority-order.sdp.md new file mode 100644 index 00000000..0190910e --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-018-publishes-to-subscriptions-in-priority-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.publishes-to-subscriptions-in-priority-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Publishes to subscriptions in priority order + +## Intent + +- outcome: Executable scenario "Publishes to subscriptions in priority order" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-019-propagates-workpool-errors-when-enqueue-fails.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-019-propagates-workpool-errors-when-enqueue-fails.sdp.md new file mode 100644 index 00000000..89145334 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-019-propagates-workpool-errors-when-enqueue-fails.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.propagates-workpool-errors-when-enqueue-fails +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Propagates workpool errors when enqueue fails + +## Intent + +- outcome: Executable scenario "Propagates workpool errors when enqueue fails" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-020-does-not-enqueue-subsequent-subscriptions-if-earlier-enqueue-fails.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-020-does-not-enqueue-subsequent-subscriptions-if-earlier-enqueue-fails.sdp.md new file mode 100644 index 00000000..800f754e --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-020-does-not-enqueue-subsequent-subscriptions-if-earlier-enqueue-fails.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.does-not-enqueue-subsequent-subscriptions-if-earlier-enqueue-fails +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Does not enqueue subsequent subscriptions if earlier enqueue fails + +## Intent + +- outcome: Executable scenario "Does not enqueue subsequent subscriptions if earlier enqueue fails" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-021-wildcard-subscriptions-match-any-event-type.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-021-wildcard-subscriptions-match-any-event-type.sdp.md new file mode 100644 index 00000000..6db396f6 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-021-wildcard-subscriptions-match-any-event-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.wildcard-subscriptions-match-any-event-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Wildcard subscriptions match any event type + +## Intent + +- outcome: Executable scenario "Wildcard subscriptions match any event type" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-022-wildcard-with-bounded-context-filter-only-matches-that-context.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-022-wildcard-with-bounded-context-filter-only-matches-that-context.sdp.md new file mode 100644 index 00000000..28f30ee6 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-022-wildcard-with-bounded-context-filter-only-matches-that-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.wildcard-with-bounded-context-filter-only-matches-that-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Wildcard with bounded context filter only matches that context + +## Intent + +- outcome: Executable scenario "Wildcard with bounded context filter only matches that context" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-023-creates-event-bus-instance-with-empty-subscriptions.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-023-creates-event-bus-instance-with-empty-subscriptions.sdp.md new file mode 100644 index 00000000..48106f3a --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-023-creates-event-bus-instance-with-empty-subscriptions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.creates-event-bus-instance-with-empty-subscriptions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Creates EventBus instance with empty subscriptions + +## Intent + +- outcome: Executable scenario "Creates EventBus instance with empty subscriptions" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-024-creates-event-bus-with-config.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-024-creates-event-bus-with-config.sdp.md new file mode 100644 index 00000000..1646746f --- /dev/null +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-024-creates-event-bus-with-config.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.convex-event-bus.creates-event-bus-with-config +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.convex-event-bus +--- +# Creates EventBus with config + +## Intent + +- outcome: Executable scenario "Creates EventBus with config" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-001-builder-creates-subscription-with-name-and-handler.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-001-builder-creates-subscription-with-name-and-handler.sdp.md new file mode 100644 index 00000000..a41638bb --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-001-builder-creates-subscription-with-name-and-handler.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.builder-creates-subscription-with-name-and-handler +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# Builder creates subscription with name and handler + +## Intent + +- outcome: Executable scenario "Builder creates subscription with name and handler" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-002-builder-defaults-to-empty-filter.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-002-builder-defaults-to-empty-filter.sdp.md new file mode 100644 index 00000000..013b734f --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-002-builder-defaults-to-empty-filter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.builder-defaults-to-empty-filter +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# Builder defaults to empty filter + +## Intent + +- outcome: Executable scenario "Builder defaults to empty filter" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-003-builder-defaults-to-priority-100.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-003-builder-defaults-to-priority-100.sdp.md new file mode 100644 index 00000000..4a1d2579 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-003-builder-defaults-to-priority-100.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.builder-defaults-to-priority-100 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# Builder defaults to priority 100 + +## Intent + +- outcome: Executable scenario "Builder defaults to priority 100" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-004-builder-defaults-partition-key-to-stream-id.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-004-builder-defaults-partition-key-to-stream-id.sdp.md new file mode 100644 index 00000000..9f5bd088 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-004-builder-defaults-partition-key-to-stream-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.builder-defaults-partition-key-to-stream-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# Builder defaults partition key to streamId + +## Intent + +- outcome: Executable scenario "Builder defaults partition key to streamId" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-005-for-event-types-sets-event-type-filter.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-005-for-event-types-sets-event-type-filter.sdp.md new file mode 100644 index 00000000..ef548601 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-005-for-event-types-sets-event-type-filter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.for-event-types-sets-event-type-filter +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# forEventTypes sets event type filter + +## Intent + +- outcome: Executable scenario "forEventTypes sets event type filter" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-006-for-categories-sets-category-filter.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-006-for-categories-sets-category-filter.sdp.md new file mode 100644 index 00000000..203e5dda --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-006-for-categories-sets-category-filter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.for-categories-sets-category-filter +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# forCategories sets category filter + +## Intent + +- outcome: Executable scenario "forCategories sets category filter" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-007-for-bounded-contexts-sets-bounded-context-filter.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-007-for-bounded-contexts-sets-bounded-context-filter.sdp.md new file mode 100644 index 00000000..50de944e --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-007-for-bounded-contexts-sets-bounded-context-filter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.for-bounded-contexts-sets-bounded-context-filter +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# forBoundedContexts sets bounded context filter + +## Intent + +- outcome: Executable scenario "forBoundedContexts sets bounded context filter" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-008-for-stream-types-sets-stream-type-filter.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-008-for-stream-types-sets-stream-type-filter.sdp.md new file mode 100644 index 00000000..96814c8e --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-008-for-stream-types-sets-stream-type-filter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.for-stream-types-sets-stream-type-filter +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# forStreamTypes sets stream type filter + +## Intent + +- outcome: Executable scenario "forStreamTypes sets stream type filter" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-009-chaining-multiple-filters-composes-them.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-009-chaining-multiple-filters-composes-them.sdp.md new file mode 100644 index 00000000..58e25e21 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-009-chaining-multiple-filters-composes-them.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.chaining-multiple-filters-composes-them +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# Chaining multiple filters composes them + +## Intent + +- outcome: Executable scenario "Chaining multiple filters composes them" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-010-with-on-complete-sets-the-on-complete-handler.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-010-with-on-complete-sets-the-on-complete-handler.sdp.md new file mode 100644 index 00000000..052cf6e5 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-010-with-on-complete-sets-the-on-complete-handler.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.with-on-complete-sets-the-on-complete-handler +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# withOnComplete sets the onComplete handler + +## Intent + +- outcome: Executable scenario "withOnComplete sets the onComplete handler" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-011-with-priority-sets-priority.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-011-with-priority-sets-priority.sdp.md new file mode 100644 index 00000000..5f187d66 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-011-with-priority-sets-priority.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.with-priority-sets-priority +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# withPriority sets priority + +## Intent + +- outcome: Executable scenario "withPriority sets priority" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-012-with-transform-sets-custom-transformer.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-012-with-transform-sets-custom-transformer.sdp.md new file mode 100644 index 00000000..82ef5ae1 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-012-with-transform-sets-custom-transformer.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.with-transform-sets-custom-transformer +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# withTransform sets custom transformer + +## Intent + +- outcome: Executable scenario "withTransform sets custom transformer" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-013-with-partition-key-sets-custom-partition-key-extractor.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-013-with-partition-key-sets-custom-partition-key-extractor.sdp.md new file mode 100644 index 00000000..ab2f01ed --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-013-with-partition-key-sets-custom-partition-key-extractor.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.with-partition-key-sets-custom-partition-key-extractor +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# withPartitionKey sets custom partition key extractor + +## Intent + +- outcome: Executable scenario "withPartitionKey sets custom partition key extractor" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-014-add-adds-a-subscription-to-the-registry.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-014-add-adds-a-subscription-to-the-registry.sdp.md new file mode 100644 index 00000000..a57844ff --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-014-add-adds-a-subscription-to-the-registry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.add-adds-a-subscription-to-the-registry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# add() adds a subscription to the registry + +## Intent + +- outcome: Executable scenario "add() adds a subscription to the registry" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-015-add-supports-chaining.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-015-add-supports-chaining.sdp.md new file mode 100644 index 00000000..f8a5f04a --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-015-add-supports-chaining.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.add-supports-chaining +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# add() supports chaining + +## Intent + +- outcome: Executable scenario "add() supports chaining" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-016-add-throws-on-duplicate-subscription-name.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-016-add-throws-on-duplicate-subscription-name.sdp.md new file mode 100644 index 00000000..a82ca3fe --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-016-add-throws-on-duplicate-subscription-name.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.add-throws-on-duplicate-subscription-name +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# add() throws on duplicate subscription name + +## Intent + +- outcome: Executable scenario "add() throws on duplicate subscription name" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-017-subscribe-returns-builder-that-adds-to-registry-on-build.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-017-subscribe-returns-builder-that-adds-to-registry-on-build.sdp.md new file mode 100644 index 00000000..369493dd --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-017-subscribe-returns-builder-that-adds-to-registry-on-build.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.subscribe-returns-builder-that-adds-to-registry-on-build +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# subscribe() returns builder that adds to registry on build + +## Intent + +- outcome: Executable scenario "subscribe() returns builder that adds to registry on build" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-018-define-subscriptions-returns-configured-subscriptions.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-018-define-subscriptions-returns-configured-subscriptions.sdp.md new file mode 100644 index 00000000..c3a9abba --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-018-define-subscriptions-returns-configured-subscriptions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.define-subscriptions-returns-configured-subscriptions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# defineSubscriptions returns configured subscriptions + +## Intent + +- outcome: Executable scenario "defineSubscriptions returns configured subscriptions" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-019-define-subscriptions-throws-on-duplicate-names-via-subscribe-build.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-019-define-subscriptions-throws-on-duplicate-names-via-subscribe-build.sdp.md new file mode 100644 index 00000000..90a53e1a --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-019-define-subscriptions-throws-on-duplicate-names-via-subscribe-build.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.define-subscriptions-throws-on-duplicate-names-via-subscribe-build +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# defineSubscriptions throws on duplicate names via subscribe().build() + +## Intent + +- outcome: Executable scenario "defineSubscriptions throws on duplicate names via subscribe().build()" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-020-define-subscriptions-throws-on-duplicate-names-via-add.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-020-define-subscriptions-throws-on-duplicate-names-via-add.sdp.md new file mode 100644 index 00000000..53c1988a --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-020-define-subscriptions-throws-on-duplicate-names-via-add.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.define-subscriptions-throws-on-duplicate-names-via-add +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# defineSubscriptions throws on duplicate names via add() + +## Intent + +- outcome: Executable scenario "defineSubscriptions throws on duplicate names via add()" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-021-create-subscription-creates-standalone-builder.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-021-create-subscription-creates-standalone-builder.sdp.md new file mode 100644 index 00000000..5f5b183b --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-021-create-subscription-creates-standalone-builder.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.create-subscription-creates-standalone-builder +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# createSubscription creates standalone builder + +## Intent + +- outcome: Executable scenario "createSubscription creates standalone builder" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-022-empty-filter-matches-any-event.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-022-empty-filter-matches-any-event.sdp.md new file mode 100644 index 00000000..4c6f78ed --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-022-empty-filter-matches-any-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.empty-filter-matches-any-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# Empty filter matches any event + +## Intent + +- outcome: Executable scenario "Empty filter matches any event" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-023-matches-when-event-type-is-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-023-matches-when-event-type-is-in-the-list.sdp.md new file mode 100644 index 00000000..60ff20a1 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-023-matches-when-event-type-is-in-the-list.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.matches-when-event-type-is-in-the-list +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# Matches when event type is in the list + +## Intent + +- outcome: Executable scenario "Matches when event type is in the list" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-024-does-not-match-when-event-type-is-not-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-024-does-not-match-when-event-type-is-not-in-the-list.sdp.md new file mode 100644 index 00000000..436b0a89 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-024-does-not-match-when-event-type-is-not-in-the-list.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.does-not-match-when-event-type-is-not-in-the-list +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# Does not match when event type is not in the list + +## Intent + +- outcome: Executable scenario "Does not match when event type is not in the list" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-025-matches-when-category-is-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-025-matches-when-category-is-in-the-list.sdp.md new file mode 100644 index 00000000..811a8941 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-025-matches-when-category-is-in-the-list.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.matches-when-category-is-in-the-list +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# Matches when category is in the list + +## Intent + +- outcome: Executable scenario "Matches when category is in the list" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-026-does-not-match-when-category-is-not-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-026-does-not-match-when-category-is-not-in-the-list.sdp.md new file mode 100644 index 00000000..f74b9815 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-026-does-not-match-when-category-is-not-in-the-list.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.does-not-match-when-category-is-not-in-the-list +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# Does not match when category is not in the list + +## Intent + +- outcome: Executable scenario "Does not match when category is not in the list" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-027-matches-when-bounded-context-is-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-027-matches-when-bounded-context-is-in-the-list.sdp.md new file mode 100644 index 00000000..84e8eacb --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-027-matches-when-bounded-context-is-in-the-list.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.matches-when-bounded-context-is-in-the-list +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# Matches when bounded context is in the list + +## Intent + +- outcome: Executable scenario "Matches when bounded context is in the list" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-028-does-not-match-when-bounded-context-is-not-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-028-does-not-match-when-bounded-context-is-not-in-the-list.sdp.md new file mode 100644 index 00000000..742d3a18 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-028-does-not-match-when-bounded-context-is-not-in-the-list.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.does-not-match-when-bounded-context-is-not-in-the-list +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# Does not match when bounded context is not in the list + +## Intent + +- outcome: Executable scenario "Does not match when bounded context is not in the list" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-029-matches-when-stream-type-is-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-029-matches-when-stream-type-is-in-the-list.sdp.md new file mode 100644 index 00000000..96f1857b --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-029-matches-when-stream-type-is-in-the-list.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.matches-when-stream-type-is-in-the-list +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# Matches when stream type is in the list + +## Intent + +- outcome: Executable scenario "Matches when stream type is in the list" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-030-does-not-match-when-stream-type-is-not-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-030-does-not-match-when-stream-type-is-not-in-the-list.sdp.md new file mode 100644 index 00000000..6fa17af1 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-030-does-not-match-when-stream-type-is-not-in-the-list.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.does-not-match-when-stream-type-is-not-in-the-list +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# Does not match when stream type is not in the list + +## Intent + +- outcome: Executable scenario "Does not match when stream type is not in the list" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-031-all-filters-matching-returns-true.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-031-all-filters-matching-returns-true.sdp.md new file mode 100644 index 00000000..77c0bd9f --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-031-all-filters-matching-returns-true.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.all-filters-matching-returns-true +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# All filters matching returns true + +## Intent + +- outcome: Executable scenario "All filters matching returns true" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-032-non-matching-event-type-returns-false-with-combined-filters.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-032-non-matching-event-type-returns-false-with-combined-filters.sdp.md new file mode 100644 index 00000000..f1fe7dd3 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-032-non-matching-event-type-returns-false-with-combined-filters.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.non-matching-event-type-returns-false-with-combined-filters +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# Non-matching event type returns false with combined filters + +## Intent + +- outcome: Executable scenario "Non-matching event type returns false with combined filters" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-033-non-matching-category-returns-false-with-combined-filters.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-033-non-matching-category-returns-false-with-combined-filters.sdp.md new file mode 100644 index 00000000..aa3417a8 --- /dev/null +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-033-non-matching-category-returns-false-with-combined-filters.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.eventbus.registry.non-matching-category-returns-false-with-combined-filters +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.eventbus.registry +--- +# Non-matching category returns false with combined filters + +## Intent + +- outcome: Executable scenario "Non-matching category returns false with combined filters" from packages/platform-core/tests/features/behavior/eventbus/registry.feature diff --git a/specs/behavior/platform-core/events/builder.examples/s-001-generates-event-id-with-bounded-context-prefix.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-001-generates-event-id-with-bounded-context-prefix.sdp.md new file mode 100644 index 00000000..f258bdb1 --- /dev/null +++ b/specs/behavior/platform-core/events/builder.examples/s-001-generates-event-id-with-bounded-context-prefix.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.builder.generates-event-id-with-bounded-context-prefix +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.builder +--- +# Generates eventId with bounded context prefix + +## Intent + +- outcome: Executable scenario "Generates eventId with bounded context prefix" from packages/platform-core/tests/features/behavior/events/builder.feature diff --git a/specs/behavior/platform-core/events/builder.examples/s-002-copies-all-core-fields-correctly.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-002-copies-all-core-fields-correctly.sdp.md new file mode 100644 index 00000000..2dfba12d --- /dev/null +++ b/specs/behavior/platform-core/events/builder.examples/s-002-copies-all-core-fields-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.builder.copies-all-core-fields-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.builder +--- +# Copies all core fields correctly + +## Intent + +- outcome: Executable scenario "Copies all core fields correctly" from packages/platform-core/tests/features/behavior/events/builder.feature diff --git a/specs/behavior/platform-core/events/builder.examples/s-003-copies-payload-correctly.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-003-copies-payload-correctly.sdp.md new file mode 100644 index 00000000..aaa2890f --- /dev/null +++ b/specs/behavior/platform-core/events/builder.examples/s-003-copies-payload-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.builder.copies-payload-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.builder +--- +# Copies payload correctly + +## Intent + +- outcome: Executable scenario "Copies payload correctly" from packages/platform-core/tests/features/behavior/events/builder.feature diff --git a/specs/behavior/platform-core/events/builder.examples/s-004-includes-correlation-id-and-causation-id-in-metadata.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-004-includes-correlation-id-and-causation-id-in-metadata.sdp.md new file mode 100644 index 00000000..050452f4 --- /dev/null +++ b/specs/behavior/platform-core/events/builder.examples/s-004-includes-correlation-id-and-causation-id-in-metadata.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.builder.includes-correlation-id-and-causation-id-in-metadata +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.builder +--- +# Includes correlationId and causationId in metadata + +## Intent + +- outcome: Executable scenario "Includes correlationId and causationId in metadata" from packages/platform-core/tests/features/behavior/events/builder.feature diff --git a/specs/behavior/platform-core/events/builder.examples/s-005-generates-different-event-ids-for-different-bounded-contexts.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-005-generates-different-event-ids-for-different-bounded-contexts.sdp.md new file mode 100644 index 00000000..cb9972d5 --- /dev/null +++ b/specs/behavior/platform-core/events/builder.examples/s-005-generates-different-event-ids-for-different-bounded-contexts.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.builder.generates-different-event-ids-for-different-bounded-contexts +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.builder +--- +# Generates different eventIds for different bounded contexts + +## Intent + +- outcome: Executable scenario "Generates different eventIds for different bounded contexts" from packages/platform-core/tests/features/behavior/events/builder.feature diff --git a/specs/behavior/platform-core/events/builder.examples/s-006-returns-complete-new-event-data-structure.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-006-returns-complete-new-event-data-structure.sdp.md new file mode 100644 index 00000000..34e5bf54 --- /dev/null +++ b/specs/behavior/platform-core/events/builder.examples/s-006-returns-complete-new-event-data-structure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.builder.returns-complete-new-event-data-structure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.builder +--- +# Returns complete NewEventData structure + +## Intent + +- outcome: Executable scenario "Returns complete NewEventData structure" from packages/platform-core/tests/features/behavior/events/builder.feature diff --git a/specs/behavior/platform-core/events/builder.examples/s-007-uses-provided-event-id-without-generating-a-new-one.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-007-uses-provided-event-id-without-generating-a-new-one.sdp.md new file mode 100644 index 00000000..71d0cd45 --- /dev/null +++ b/specs/behavior/platform-core/events/builder.examples/s-007-uses-provided-event-id-without-generating-a-new-one.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.builder.uses-provided-event-id-without-generating-a-new-one +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.builder +--- +# Uses provided eventId without generating a new one + +## Intent + +- outcome: Executable scenario "Uses provided eventId without generating a new one" from packages/platform-core/tests/features/behavior/events/builder.feature diff --git a/specs/behavior/platform-core/events/builder.examples/s-008-extracts-bounded-context-from-event-id-when-not-provided.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-008-extracts-bounded-context-from-event-id-when-not-provided.sdp.md new file mode 100644 index 00000000..4abae381 --- /dev/null +++ b/specs/behavior/platform-core/events/builder.examples/s-008-extracts-bounded-context-from-event-id-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.builder.extracts-bounded-context-from-event-id-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.builder +--- +# Extracts boundedContext from eventId when not provided + +## Intent + +- outcome: Executable scenario "Extracts boundedContext from eventId when not provided" from packages/platform-core/tests/features/behavior/events/builder.feature diff --git a/specs/behavior/platform-core/events/builder.examples/s-009-uses-provided-bounded-context-when-explicitly-set.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-009-uses-provided-bounded-context-when-explicitly-set.sdp.md new file mode 100644 index 00000000..b0dd32ea --- /dev/null +++ b/specs/behavior/platform-core/events/builder.examples/s-009-uses-provided-bounded-context-when-explicitly-set.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.builder.uses-provided-bounded-context-when-explicitly-set +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.builder +--- +# Uses provided boundedContext when explicitly set + +## Intent + +- outcome: Executable scenario "Uses provided boundedContext when explicitly set" from packages/platform-core/tests/features/behavior/events/builder.feature diff --git a/specs/behavior/platform-core/events/builder.examples/s-010-uses-full-event-id-as-bounded-context-when-no-underscore-present.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-010-uses-full-event-id-as-bounded-context-when-no-underscore-present.sdp.md new file mode 100644 index 00000000..4eaba46e --- /dev/null +++ b/specs/behavior/platform-core/events/builder.examples/s-010-uses-full-event-id-as-bounded-context-when-no-underscore-present.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.builder.uses-full-event-id-as-bounded-context-when-no-underscore-present +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.builder +--- +# Uses full eventId as boundedContext when no underscore present + +## Intent + +- outcome: Executable scenario "Uses full eventId as boundedContext when no underscore present" from packages/platform-core/tests/features/behavior/events/builder.feature diff --git a/specs/behavior/platform-core/events/builder.examples/s-011-copies-all-other-fields-correctly-with-pre-generated-event-id.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-011-copies-all-other-fields-correctly-with-pre-generated-event-id.sdp.md new file mode 100644 index 00000000..48a34b74 --- /dev/null +++ b/specs/behavior/platform-core/events/builder.examples/s-011-copies-all-other-fields-correctly-with-pre-generated-event-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.builder.copies-all-other-fields-correctly-with-pre-generated-event-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.builder +--- +# Copies all other fields correctly with pre-generated eventId + +## Intent + +- outcome: Executable scenario "Copies all other fields correctly with pre-generated eventId" from packages/platform-core/tests/features/behavior/events/builder.feature diff --git a/specs/behavior/platform-core/events/builder.examples/s-012-handles-event-id-with-multiple-underscores-correctly.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-012-handles-event-id-with-multiple-underscores-correctly.sdp.md new file mode 100644 index 00000000..297aba12 --- /dev/null +++ b/specs/behavior/platform-core/events/builder.examples/s-012-handles-event-id-with-multiple-underscores-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.builder.handles-event-id-with-multiple-underscores-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.builder +--- +# Handles eventId with multiple underscores correctly + +## Intent + +- outcome: Executable scenario "Handles eventId with multiple underscores correctly" from packages/platform-core/tests/features/behavior/events/builder.feature diff --git a/specs/behavior/platform-core/events/builder.examples/s-013-returns-complete-new-event-data-structure-with-pre-generated-event-id.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-013-returns-complete-new-event-data-structure-with-pre-generated-event-id.sdp.md new file mode 100644 index 00000000..27d1dff6 --- /dev/null +++ b/specs/behavior/platform-core/events/builder.examples/s-013-returns-complete-new-event-data-structure-with-pre-generated-event-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.builder.returns-complete-new-event-data-structure-with-pre-generated-event-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.builder +--- +# Returns complete NewEventData structure with pre-generated eventId + +## Intent + +- outcome: Executable scenario "Returns complete NewEventData structure with pre-generated eventId" from packages/platform-core/tests/features/behavior/events/builder.feature diff --git a/specs/behavior/platform-core/events/category.examples/s-001-event-categories-has-exactly-four-entries-in-the-correct-order.sdp.md b/specs/behavior/platform-core/events/category.examples/s-001-event-categories-has-exactly-four-entries-in-the-correct-order.sdp.md new file mode 100644 index 00000000..25323664 --- /dev/null +++ b/specs/behavior/platform-core/events/category.examples/s-001-event-categories-has-exactly-four-entries-in-the-correct-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.category.event-categories-has-exactly-four-entries-in-the-correct-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.category +--- +# EVENT_CATEGORIES has exactly four entries in the correct order + +## Intent + +- outcome: Executable scenario "EVENT_CATEGORIES has exactly four entries in the correct order" from packages/platform-core/tests/features/behavior/events/category.feature diff --git a/specs/behavior/platform-core/events/category.examples/s-002-schema-accepts-valid-category-strings.sdp.md b/specs/behavior/platform-core/events/category.examples/s-002-schema-accepts-valid-category-strings.sdp.md new file mode 100644 index 00000000..2dc4775a --- /dev/null +++ b/specs/behavior/platform-core/events/category.examples/s-002-schema-accepts-valid-category-strings.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.category.schema-accepts-valid-category-strings +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.category +--- +# Schema accepts valid category strings + +## Intent + +- outcome: Executable scenario "Schema accepts valid category strings" from packages/platform-core/tests/features/behavior/events/category.feature diff --git a/specs/behavior/platform-core/events/category.examples/s-003-schema-rejects-invalid-category-values.sdp.md b/specs/behavior/platform-core/events/category.examples/s-003-schema-rejects-invalid-category-values.sdp.md new file mode 100644 index 00000000..57b8499f --- /dev/null +++ b/specs/behavior/platform-core/events/category.examples/s-003-schema-rejects-invalid-category-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.category.schema-rejects-invalid-category-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.category +--- +# Schema rejects invalid category values + +## Intent + +- outcome: Executable scenario "Schema rejects invalid category values" from packages/platform-core/tests/features/behavior/events/category.feature diff --git a/specs/behavior/platform-core/events/category.examples/s-004-default-event-category-is-domain.sdp.md b/specs/behavior/platform-core/events/category.examples/s-004-default-event-category-is-domain.sdp.md new file mode 100644 index 00000000..c0ba2968 --- /dev/null +++ b/specs/behavior/platform-core/events/category.examples/s-004-default-event-category-is-domain.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.category.default-event-category-is-domain +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.category +--- +# DEFAULT_EVENT_CATEGORY is domain + +## Intent + +- outcome: Executable scenario "DEFAULT_EVENT_CATEGORY is domain" from packages/platform-core/tests/features/behavior/events/category.feature diff --git a/specs/behavior/platform-core/events/category.examples/s-005-default-schema-version-is-1.sdp.md b/specs/behavior/platform-core/events/category.examples/s-005-default-schema-version-is-1.sdp.md new file mode 100644 index 00000000..0689ab6b --- /dev/null +++ b/specs/behavior/platform-core/events/category.examples/s-005-default-schema-version-is-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.category.default-schema-version-is-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.category +--- +# DEFAULT_SCHEMA_VERSION is 1 + +## Intent + +- outcome: Executable scenario "DEFAULT_SCHEMA_VERSION is 1" from packages/platform-core/tests/features/behavior/events/category.feature diff --git a/specs/behavior/platform-core/events/category.examples/s-006-type-guard-accepts-all-valid-categories.sdp.md b/specs/behavior/platform-core/events/category.examples/s-006-type-guard-accepts-all-valid-categories.sdp.md new file mode 100644 index 00000000..1624178a --- /dev/null +++ b/specs/behavior/platform-core/events/category.examples/s-006-type-guard-accepts-all-valid-categories.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.category.type-guard-accepts-all-valid-categories +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.category +--- +# Type guard accepts all valid categories + +## Intent + +- outcome: Executable scenario "Type guard accepts all valid categories" from packages/platform-core/tests/features/behavior/events/category.feature diff --git a/specs/behavior/platform-core/events/category.examples/s-007-type-guard-rejects-invalid-values.sdp.md b/specs/behavior/platform-core/events/category.examples/s-007-type-guard-rejects-invalid-values.sdp.md new file mode 100644 index 00000000..0e306758 --- /dev/null +++ b/specs/behavior/platform-core/events/category.examples/s-007-type-guard-rejects-invalid-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.category.type-guard-rejects-invalid-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.category +--- +# Type guard rejects invalid values + +## Intent + +- outcome: Executable scenario "Type guard rejects invalid values" from packages/platform-core/tests/features/behavior/events/category.feature diff --git a/specs/behavior/platform-core/events/category.examples/s-008-valid-categories-are-returned-unchanged.sdp.md b/specs/behavior/platform-core/events/category.examples/s-008-valid-categories-are-returned-unchanged.sdp.md new file mode 100644 index 00000000..e4a25730 --- /dev/null +++ b/specs/behavior/platform-core/events/category.examples/s-008-valid-categories-are-returned-unchanged.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.category.valid-categories-are-returned-unchanged +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.category +--- +# Valid categories are returned unchanged + +## Intent + +- outcome: Executable scenario "Valid categories are returned unchanged" from packages/platform-core/tests/features/behavior/events/category.feature diff --git a/specs/behavior/platform-core/events/category.examples/s-009-invalid-values-normalize-to-domain.sdp.md b/specs/behavior/platform-core/events/category.examples/s-009-invalid-values-normalize-to-domain.sdp.md new file mode 100644 index 00000000..c39d535b --- /dev/null +++ b/specs/behavior/platform-core/events/category.examples/s-009-invalid-values-normalize-to-domain.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.category.invalid-values-normalize-to-domain +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.category +--- +# Invalid values normalize to domain + +## Intent + +- outcome: Executable scenario "Invalid values normalize to domain" from packages/platform-core/tests/features/behavior/events/category.feature diff --git a/specs/behavior/platform-core/events/category.examples/s-010-positive-integers-are-returned-unchanged.sdp.md b/specs/behavior/platform-core/events/category.examples/s-010-positive-integers-are-returned-unchanged.sdp.md new file mode 100644 index 00000000..637a5d87 --- /dev/null +++ b/specs/behavior/platform-core/events/category.examples/s-010-positive-integers-are-returned-unchanged.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.category.positive-integers-are-returned-unchanged +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.category +--- +# Positive integers are returned unchanged + +## Intent + +- outcome: Executable scenario "Positive integers are returned unchanged" from packages/platform-core/tests/features/behavior/events/category.feature diff --git a/specs/behavior/platform-core/events/category.examples/s-011-invalid-values-normalize-to-1.sdp.md b/specs/behavior/platform-core/events/category.examples/s-011-invalid-values-normalize-to-1.sdp.md new file mode 100644 index 00000000..9d953c80 --- /dev/null +++ b/specs/behavior/platform-core/events/category.examples/s-011-invalid-values-normalize-to-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.category.invalid-values-normalize-to-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.category +--- +# Invalid values normalize to 1 + +## Intent + +- outcome: Executable scenario "Invalid values normalize to 1" from packages/platform-core/tests/features/behavior/events/category.feature diff --git a/specs/behavior/platform-core/events/category.examples/s-012-classification-of-categories-as-external-or-internal.sdp.md b/specs/behavior/platform-core/events/category.examples/s-012-classification-of-categories-as-external-or-internal.sdp.md new file mode 100644 index 00000000..4b7719a4 --- /dev/null +++ b/specs/behavior/platform-core/events/category.examples/s-012-classification-of-categories-as-external-or-internal.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.category.classification-of-categories-as-external-or-internal +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.category +--- +# Classification of categories as external or internal + +## Intent + +- outcome: Executable scenario "Classification of categories as external or internal" from packages/platform-core/tests/features/behavior/events/category.feature diff --git a/specs/behavior/platform-core/events/category.examples/s-013-classification-of-categories-as-cross-context.sdp.md b/specs/behavior/platform-core/events/category.examples/s-013-classification-of-categories-as-cross-context.sdp.md new file mode 100644 index 00000000..6550a22f --- /dev/null +++ b/specs/behavior/platform-core/events/category.examples/s-013-classification-of-categories-as-cross-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.category.classification-of-categories-as-cross-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.category +--- +# Classification of categories as cross-context + +## Intent + +- outcome: Executable scenario "Classification of categories as cross-context" from packages/platform-core/tests/features/behavior/events/category.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-001-valid-event-metadata-is-accepted-and-fields-are-preserved.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-001-valid-event-metadata-is-accepted-and-fields-are-preserved.sdp.md new file mode 100644 index 00000000..77a24f31 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-001-valid-event-metadata-is-accepted-and-fields-are-preserved.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.valid-event-metadata-is-accepted-and-fields-are-preserved +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Valid event metadata is accepted and fields are preserved + +## Intent + +- outcome: Executable scenario "Valid event metadata is accepted and fields are preserved" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-002-missing-required-fields-are-rejected.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-002-missing-required-fields-are-rejected.sdp.md new file mode 100644 index 00000000..85d29e29 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-002-missing-required-fields-are-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.missing-required-fields-are-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Missing required fields are rejected + +## Intent + +- outcome: Executable scenario "Missing required fields are rejected" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-003-partial-metadata-with-only-event-id-is-rejected.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-003-partial-metadata-with-only-event-id-is-rejected.sdp.md new file mode 100644 index 00000000..72778ccd --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-003-partial-metadata-with-only-event-id-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.partial-metadata-with-only-event-id-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Partial metadata with only eventId is rejected + +## Intent + +- outcome: Executable scenario "Partial metadata with only eventId is rejected" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-004-optional-causation-id-is-supported.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-004-optional-causation-id-is-supported.sdp.md new file mode 100644 index 00000000..c52004c9 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-004-optional-causation-id-is-supported.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.optional-causation-id-is-supported +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Optional causationId is supported + +## Intent + +- outcome: Executable scenario "Optional causationId is supported" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-005-invalid-version-values-are-rejected.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-005-invalid-version-values-are-rejected.sdp.md new file mode 100644 index 00000000..7dd5b874 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-005-invalid-version-values-are-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.invalid-version-values-are-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Invalid version values are rejected + +## Intent + +- outcome: Executable scenario "Invalid version values are rejected" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-006-zero-global-position-is-accepted.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-006-zero-global-position-is-accepted.sdp.md new file mode 100644 index 00000000..fe21a1a7 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-006-zero-global-position-is-accepted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.zero-global-position-is-accepted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Zero globalPosition is accepted + +## Intent + +- outcome: Executable scenario "Zero globalPosition is accepted" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-007-enhanced-metadata-includes-category-and-schema-version.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-007-enhanced-metadata-includes-category-and-schema-version.sdp.md new file mode 100644 index 00000000..271a058b --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-007-enhanced-metadata-includes-category-and-schema-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.enhanced-metadata-includes-category-and-schema-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Enhanced metadata includes category and schemaVersion + +## Intent + +- outcome: Executable scenario "Enhanced metadata includes category and schemaVersion" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-008-category-defaults-to-domain-when-not-provided.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-008-category-defaults-to-domain-when-not-provided.sdp.md new file mode 100644 index 00000000..b60f0946 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-008-category-defaults-to-domain-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.category-defaults-to-domain-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Category defaults to domain when not provided + +## Intent + +- outcome: Executable scenario "Category defaults to domain when not provided" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-009-schema-version-defaults-to-1-when-not-provided.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-009-schema-version-defaults-to-1-when-not-provided.sdp.md new file mode 100644 index 00000000..4311f2b8 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-009-schema-version-defaults-to-1-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.schema-version-defaults-to-1-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# SchemaVersion defaults to 1 when not provided + +## Intent + +- outcome: Executable scenario "SchemaVersion defaults to 1 when not provided" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-010-all-valid-categories-are-accepted.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-010-all-valid-categories-are-accepted.sdp.md new file mode 100644 index 00000000..703a9456 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-010-all-valid-categories-are-accepted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.all-valid-categories-are-accepted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# All valid categories are accepted + +## Intent + +- outcome: Executable scenario "All valid categories are accepted" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-011-invalid-categories-are-rejected.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-011-invalid-categories-are-rejected.sdp.md new file mode 100644 index 00000000..544c34a9 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-011-invalid-categories-are-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.invalid-categories-are-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Invalid categories are rejected + +## Intent + +- outcome: Executable scenario "Invalid categories are rejected" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-012-schema-accepts-events-with-matching-event-type-and-valid-payload.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-012-schema-accepts-events-with-matching-event-type-and-valid-payload.sdp.md new file mode 100644 index 00000000..0d658e54 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-012-schema-accepts-events-with-matching-event-type-and-valid-payload.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.schema-accepts-events-with-matching-event-type-and-valid-payload +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Schema accepts events with matching eventType and valid payload + +## Intent + +- outcome: Executable scenario "Schema accepts events with matching eventType and valid payload" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-013-schema-rejects-events-with-wrong-event-type.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-013-schema-rejects-events-with-wrong-event-type.sdp.md new file mode 100644 index 00000000..6fc4515d --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-013-schema-rejects-events-with-wrong-event-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.schema-rejects-events-with-wrong-event-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Schema rejects events with wrong eventType + +## Intent + +- outcome: Executable scenario "Schema rejects events with wrong eventType" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-014-schema-validates-payload-constraints.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-014-schema-validates-payload-constraints.sdp.md new file mode 100644 index 00000000..02a089a8 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-014-schema-validates-payload-constraints.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.schema-validates-payload-constraints +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Schema validates payload constraints + +## Intent + +- outcome: Executable scenario "Schema validates payload constraints" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-015-optional-metadata-field-is-supported.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-015-optional-metadata-field-is-supported.sdp.md new file mode 100644 index 00000000..452cf971 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-015-optional-metadata-field-is-supported.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.optional-metadata-field-is-supported +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Optional metadata field is supported + +## Intent + +- outcome: Executable scenario "Optional metadata field is supported" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-016-domain-event-schema-sets-category-to-domain.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-016-domain-event-schema-sets-category-to-domain.sdp.md new file mode 100644 index 00000000..e2d42428 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-016-domain-event-schema-sets-category-to-domain.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.domain-event-schema-sets-category-to-domain +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Domain event schema sets category to domain + +## Intent + +- outcome: Executable scenario "Domain event schema sets category to domain" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-017-category-defaults-to-domain-when-not-in-input.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-017-category-defaults-to-domain-when-not-in-input.sdp.md new file mode 100644 index 00000000..3fa3102b --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-017-category-defaults-to-domain-when-not-in-input.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.category-defaults-to-domain-when-not-in-input +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Category defaults to domain when not in input + +## Intent + +- outcome: Executable scenario "Category defaults to domain when not in input" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-018-schema-version-defaults-to-1-when-not-in-config.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-018-schema-version-defaults-to-1-when-not-in-config.sdp.md new file mode 100644 index 00000000..76bfaf89 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-018-schema-version-defaults-to-1-when-not-in-config.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.schema-version-defaults-to-1-when-not-in-config +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# SchemaVersion defaults to 1 when not in config + +## Intent + +- outcome: Executable scenario "SchemaVersion defaults to 1 when not in config" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-019-custom-schema-version-in-config-is-enforced.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-019-custom-schema-version-in-config-is-enforced.sdp.md new file mode 100644 index 00000000..d453f093 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-019-custom-schema-version-in-config-is-enforced.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.custom-schema-version-in-config-is-enforced +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Custom schemaVersion in config is enforced + +## Intent + +- outcome: Executable scenario "Custom schemaVersion in config is enforced" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-020-wrong-schema-version-is-rejected.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-020-wrong-schema-version-is-rejected.sdp.md new file mode 100644 index 00000000..859f4afd --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-020-wrong-schema-version-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.wrong-schema-version-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Wrong schemaVersion is rejected + +## Intent + +- outcome: Executable scenario "Wrong schemaVersion is rejected" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-021-integration-event-schema-sets-category-to-integration.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-021-integration-event-schema-sets-category-to-integration.sdp.md new file mode 100644 index 00000000..4e16278b --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-021-integration-event-schema-sets-category-to-integration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.integration-event-schema-sets-category-to-integration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Integration event schema sets category to integration + +## Intent + +- outcome: Executable scenario "Integration event schema sets category to integration" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-022-category-defaults-to-integration-when-not-in-input.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-022-category-defaults-to-integration-when-not-in-input.sdp.md new file mode 100644 index 00000000..3142d0fb --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-022-category-defaults-to-integration-when-not-in-input.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.category-defaults-to-integration-when-not-in-input +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Category defaults to integration when not in input + +## Intent + +- outcome: Executable scenario "Category defaults to integration when not in input" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-023-schema-version-defaults-to-1-for-integration-events.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-023-schema-version-defaults-to-1-for-integration-events.sdp.md new file mode 100644 index 00000000..526198a9 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-023-schema-version-defaults-to-1-for-integration-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.schema-version-defaults-to-1-for-integration-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# SchemaVersion defaults to 1 for integration events + +## Intent + +- outcome: Executable scenario "SchemaVersion defaults to 1 for integration events" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-024-trigger-event-schema-sets-category-to-trigger-with-entity-id-payload.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-024-trigger-event-schema-sets-category-to-trigger-with-entity-id-payload.sdp.md new file mode 100644 index 00000000..22be8168 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-024-trigger-event-schema-sets-category-to-trigger-with-entity-id-payload.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.trigger-event-schema-sets-category-to-trigger-with-entity-id-payload +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Trigger event schema sets category to trigger with entity ID payload + +## Intent + +- outcome: Executable scenario "Trigger event schema sets category to trigger with entity ID payload" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-025-trigger-event-rejects-missing-entity-id.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-025-trigger-event-rejects-missing-entity-id.sdp.md new file mode 100644 index 00000000..23248aca --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-025-trigger-event-rejects-missing-entity-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.trigger-event-rejects-missing-entity-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Trigger event rejects missing entity ID + +## Intent + +- outcome: Executable scenario "Trigger event rejects missing entity ID" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-026-category-defaults-to-trigger-when-not-in-input.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-026-category-defaults-to-trigger-when-not-in-input.sdp.md new file mode 100644 index 00000000..286936bd --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-026-category-defaults-to-trigger-when-not-in-input.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.category-defaults-to-trigger-when-not-in-input +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Category defaults to trigger when not in input + +## Intent + +- outcome: Executable scenario "Category defaults to trigger when not in input" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-027-custom-schema-version-for-trigger-events.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-027-custom-schema-version-for-trigger-events.sdp.md new file mode 100644 index 00000000..8eba1c9d --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-027-custom-schema-version-for-trigger-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.custom-schema-version-for-trigger-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Custom schemaVersion for trigger events + +## Intent + +- outcome: Executable scenario "Custom schemaVersion for trigger events" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-028-fat-event-schema-sets-category-to-fat-with-full-payload.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-028-fat-event-schema-sets-category-to-fat-with-full-payload.sdp.md new file mode 100644 index 00000000..54bdc3a9 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-028-fat-event-schema-sets-category-to-fat-with-full-payload.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.fat-event-schema-sets-category-to-fat-with-full-payload +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Fat event schema sets category to fat with full payload + +## Intent + +- outcome: Executable scenario "Fat event schema sets category to fat with full payload" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-029-category-defaults-to-fat-when-not-in-input.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-029-category-defaults-to-fat-when-not-in-input.sdp.md new file mode 100644 index 00000000..b7ccfb4b --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-029-category-defaults-to-fat-when-not-in-input.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.category-defaults-to-fat-when-not-in-input +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Category defaults to fat when not in input + +## Intent + +- outcome: Executable scenario "Category defaults to fat when not in input" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-030-complex-nested-payload-with-valid-positive-value.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-030-complex-nested-payload-with-valid-positive-value.sdp.md new file mode 100644 index 00000000..dd6d821d --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-030-complex-nested-payload-with-valid-positive-value.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.complex-nested-payload-with-valid-positive-value +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Complex nested payload with valid positive value + +## Intent + +- outcome: Executable scenario "Complex nested payload with valid positive value" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-031-complex-nested-payload-rejects-negative-value.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-031-complex-nested-payload-rejects-negative-value.sdp.md new file mode 100644 index 00000000..c10c5f64 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-031-complex-nested-payload-rejects-negative-value.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.complex-nested-payload-rejects-negative-value +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Complex nested payload rejects negative value + +## Intent + +- outcome: Executable scenario "Complex nested payload rejects negative value" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-032-custom-schema-version-for-fat-events.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-032-custom-schema-version-for-fat-events.sdp.md new file mode 100644 index 00000000..539f07da --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-032-custom-schema-version-for-fat-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.custom-schema-version-for-fat-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# Custom schemaVersion for fat events + +## Intent + +- outcome: Executable scenario "Custom schemaVersion for fat events" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-033-domain-event-schema-accepts-any-payload-shape.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-033-domain-event-schema-accepts-any-payload-shape.sdp.md new file mode 100644 index 00000000..14ac1e28 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-033-domain-event-schema-accepts-any-payload-shape.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.domain-event-schema-accepts-any-payload-shape +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# DomainEventSchema accepts any payload shape + +## Intent + +- outcome: Executable scenario "DomainEventSchema accepts any payload shape" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-034-enhanced-domain-event-schema-includes-defaults.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-034-enhanced-domain-event-schema-includes-defaults.sdp.md new file mode 100644 index 00000000..968b172e --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-034-enhanced-domain-event-schema-includes-defaults.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.enhanced-domain-event-schema-includes-defaults +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# EnhancedDomainEventSchema includes defaults + +## Intent + +- outcome: Executable scenario "EnhancedDomainEventSchema includes defaults" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/schemas.examples/s-035-enhanced-domain-event-schema-allows-optional-metadata.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-035-enhanced-domain-event-schema-allows-optional-metadata.sdp.md new file mode 100644 index 00000000..eddc6565 --- /dev/null +++ b/specs/behavior/platform-core/events/schemas.examples/s-035-enhanced-domain-event-schema-allows-optional-metadata.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.schemas.enhanced-domain-event-schema-allows-optional-metadata +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.schemas +--- +# EnhancedDomainEventSchema allows optional metadata + +## Intent + +- outcome: Executable scenario "EnhancedDomainEventSchema allows optional metadata" from packages/platform-core/tests/features/behavior/events/schemas.feature diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-001-event-at-current-version-is-returned-as-is.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-001-event-at-current-version-is-returned-as-is.sdp.md new file mode 100644 index 00000000..451e052a --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.examples/s-001-event-at-current-version-is-returned-as-is.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster.event-at-current-version-is-returned-as-is +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.upcaster +--- +# Event at current version is returned as-is + +## Intent + +- outcome: Executable scenario "Event at current version is returned as-is" from packages/platform-core/tests/features/behavior/events/upcaster.feature diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-002-event-is-migrated-from-v1-to-v2.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-002-event-is-migrated-from-v1-to-v2.sdp.md new file mode 100644 index 00000000..9a9d000a --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.examples/s-002-event-is-migrated-from-v1-to-v2.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster.event-is-migrated-from-v1-to-v2 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.upcaster +--- +# Event is migrated from v1 to v2 + +## Intent + +- outcome: Executable scenario "Event is migrated from v1 to v2" from packages/platform-core/tests/features/behavior/events/upcaster.feature diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-003-event-is-migrated-from-v1-to-v3.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-003-event-is-migrated-from-v1-to-v3.sdp.md new file mode 100644 index 00000000..b9f264f5 --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.examples/s-003-event-is-migrated-from-v1-to-v3.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster.event-is-migrated-from-v1-to-v3 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.upcaster +--- +# Event is migrated from v1 to v3 + +## Intent + +- outcome: Executable scenario "Event is migrated from v1 to v3" from packages/platform-core/tests/features/behavior/events/upcaster.feature diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-004-incomplete-migration-chain-throws-at-creation-time.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-004-incomplete-migration-chain-throws-at-creation-time.sdp.md new file mode 100644 index 00000000..90a0e899 --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.examples/s-004-incomplete-migration-chain-throws-at-creation-time.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster.incomplete-migration-chain-throws-at-creation-time +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.upcaster +--- +# Incomplete migration chain throws at creation time + +## Intent + +- outcome: Executable scenario "Incomplete migration chain throws at creation time" from packages/platform-core/tests/features/behavior/events/upcaster.feature diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-005-future-schema-version-throws-future-version-error.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-005-future-schema-version-throws-future-version-error.sdp.md new file mode 100644 index 00000000..d44c6df3 --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.examples/s-005-future-schema-version-throws-future-version-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster.future-schema-version-throws-future-version-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.upcaster +--- +# Future schema version throws FUTURE_VERSION error + +## Intent + +- outcome: Executable scenario "Future schema version throws FUTURE_VERSION error" from packages/platform-core/tests/features/behavior/events/upcaster.feature diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-006-validation-passes-after-migration.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-006-validation-passes-after-migration.sdp.md new file mode 100644 index 00000000..1afaec2d --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.examples/s-006-validation-passes-after-migration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster.validation-passes-after-migration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.upcaster +--- +# Validation passes after migration + +## Intent + +- outcome: Executable scenario "Validation passes after migration" from packages/platform-core/tests/features/behavior/events/upcaster.feature diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-007-validation-fails-after-migration.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-007-validation-fails-after-migration.sdp.md new file mode 100644 index 00000000..9926fa5b --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.examples/s-007-validation-fails-after-migration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster.validation-fails-after-migration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.upcaster +--- +# Validation fails after migration + +## Intent + +- outcome: Executable scenario "Validation fails after migration" from packages/platform-core/tests/features/behavior/events/upcaster.feature diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-008-registry-reports-registered-and-unregistered-event-types.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-008-registry-reports-registered-and-unregistered-event-types.sdp.md new file mode 100644 index 00000000..d17475ae --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.examples/s-008-registry-reports-registered-and-unregistered-event-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster.registry-reports-registered-and-unregistered-event-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.upcaster +--- +# Registry reports registered and unregistered event types + +## Intent + +- outcome: Executable scenario "Registry reports registered and unregistered event types" from packages/platform-core/tests/features/behavior/events/upcaster.feature diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-009-registry-returns-all-registered-event-types.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-009-registry-returns-all-registered-event-types.sdp.md new file mode 100644 index 00000000..3dccce56 --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.examples/s-009-registry-returns-all-registered-event-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster.registry-returns-all-registered-event-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.upcaster +--- +# Registry returns all registered event types + +## Intent + +- outcome: Executable scenario "Registry returns all registered event types" from packages/platform-core/tests/features/behavior/events/upcaster.feature diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-010-second-registration-overrides-the-first.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-010-second-registration-overrides-the-first.sdp.md new file mode 100644 index 00000000..ba0ee15d --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.examples/s-010-second-registration-overrides-the-first.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster.second-registration-overrides-the-first +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.upcaster +--- +# Second registration overrides the first + +## Intent + +- outcome: Executable scenario "Second registration overrides the first" from packages/platform-core/tests/features/behavior/events/upcaster.feature diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-011-registered-event-type-is-upcasted.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-011-registered-event-type-is-upcasted.sdp.md new file mode 100644 index 00000000..f49ed9c5 --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.examples/s-011-registered-event-type-is-upcasted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster.registered-event-type-is-upcasted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.upcaster +--- +# Registered event type is upcasted + +## Intent + +- outcome: Executable scenario "Registered event type is upcasted" from packages/platform-core/tests/features/behavior/events/upcaster.feature diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-012-unregistered-event-type-is-returned-as-is.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-012-unregistered-event-type-is-returned-as-is.sdp.md new file mode 100644 index 00000000..c866f21d --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.examples/s-012-unregistered-event-type-is-returned-as-is.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster.unregistered-event-type-is-returned-as-is +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.upcaster +--- +# Unregistered event type is returned as-is + +## Intent + +- outcome: Executable scenario "Unregistered event type is returned as-is" from packages/platform-core/tests/features/behavior/events/upcaster.feature diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-013-static-default-value-is-added.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-013-static-default-value-is-added.sdp.md new file mode 100644 index 00000000..2a8c4a6c --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.examples/s-013-static-default-value-is-added.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster.static-default-value-is-added +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.upcaster +--- +# Static default value is added + +## Intent + +- outcome: Executable scenario "Static default value is added" from packages/platform-core/tests/features/behavior/events/upcaster.feature diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-014-computed-default-value-is-added-from-event-timestamp.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-014-computed-default-value-is-added-from-event-timestamp.sdp.md new file mode 100644 index 00000000..109d97f3 --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.examples/s-014-computed-default-value-is-added-from-event-timestamp.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster.computed-default-value-is-added-from-event-timestamp +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.upcaster +--- +# Computed default value is added from event timestamp + +## Intent + +- outcome: Executable scenario "Computed default value is added from event timestamp" from packages/platform-core/tests/features/behavior/events/upcaster.feature diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-015-field-is-renamed-in-the-payload.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-015-field-is-renamed-in-the-payload.sdp.md new file mode 100644 index 00000000..03840454 --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.examples/s-015-field-is-renamed-in-the-payload.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster.field-is-renamed-in-the-payload +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.upcaster +--- +# Field is renamed in the payload + +## Intent + +- outcome: Executable scenario "Field is renamed in the payload" from packages/platform-core/tests/features/behavior/events/upcaster.feature diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-016-error-has-correct-name-code-and-message.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-016-error-has-correct-name-code-and-message.sdp.md new file mode 100644 index 00000000..941380a5 --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.examples/s-016-error-has-correct-name-code-and-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster.error-has-correct-name-code-and-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.upcaster +--- +# Error has correct name, code, and message + +## Intent + +- outcome: Executable scenario "Error has correct name, code, and message" from packages/platform-core/tests/features/behavior/events/upcaster.feature diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-017-error-stores-context-when-provided.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-017-error-stores-context-when-provided.sdp.md new file mode 100644 index 00000000..af1bcac1 --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.examples/s-017-error-stores-context-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster.error-stores-context-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.upcaster +--- +# Error stores context when provided + +## Intent + +- outcome: Executable scenario "Error stores context when provided" from packages/platform-core/tests/features/behavior/events/upcaster.feature diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-018-error-has-undefined-context-when-not-provided.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-018-error-has-undefined-context-when-not-provided.sdp.md new file mode 100644 index 00000000..9e51d2f3 --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.examples/s-018-error-has-undefined-context-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster.error-has-undefined-context-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.upcaster +--- +# Error has undefined context when not provided + +## Intent + +- outcome: Executable scenario "Error has undefined context when not provided" from packages/platform-core/tests/features/behavior/events/upcaster.feature diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-019-error-is-instanceof-error.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-019-error-is-instanceof-error.sdp.md new file mode 100644 index 00000000..72a56591 --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.examples/s-019-error-is-instanceof-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster.error-is-instanceof-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.upcaster +--- +# Error is instanceof Error + +## Intent + +- outcome: Executable scenario "Error is instanceof Error" from packages/platform-core/tests/features/behavior/events/upcaster.feature diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-020-error-preserves-specific-code-values.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-020-error-preserves-specific-code-values.sdp.md new file mode 100644 index 00000000..117569fd --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.examples/s-020-error-preserves-specific-code-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster.error-preserves-specific-code-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.upcaster +--- +# Error preserves specific code values + +## Intent + +- outcome: Executable scenario "Error preserves specific code values" from packages/platform-core/tests/features/behavior/events/upcaster.feature diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-021-error-preserves-custom-message.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-021-error-preserves-custom-message.sdp.md new file mode 100644 index 00000000..09189670 --- /dev/null +++ b/specs/behavior/platform-core/events/upcaster.examples/s-021-error-preserves-custom-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.events.upcaster.error-preserves-custom-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.events.upcaster +--- +# Error preserves custom message + +## Intent + +- outcome: Executable scenario "Error preserves custom message" from packages/platform-core/tests/features/behavior/events/upcaster.feature diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md new file mode 100644 index 00000000..ee3403b1 --- /dev/null +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.fsm.fsm.fsm-is-created-with-correct-initial-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.fsm.fsm +--- +# FSM is created with correct initial state + +## Intent + +- outcome: Executable scenario "FSM is created with correct initial state" from packages/platform-core/tests/features/behavior/fsm/fsm.feature diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-002-fsm-preserves-the-definition.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-002-fsm-preserves-the-definition.sdp.md new file mode 100644 index 00000000..182ca61f --- /dev/null +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-002-fsm-preserves-the-definition.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.fsm.fsm.fsm-preserves-the-definition +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.fsm.fsm +--- +# FSM preserves the definition + +## Intent + +- outcome: Executable scenario "FSM preserves the definition" from packages/platform-core/tests/features/behavior/fsm/fsm.feature diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-003-valid-transitions-return-true.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-003-valid-transitions-return-true.sdp.md new file mode 100644 index 00000000..b00fb225 --- /dev/null +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-003-valid-transitions-return-true.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.fsm.fsm.valid-transitions-return-true +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.fsm.fsm +--- +# Valid transitions return true + +## Intent + +- outcome: Executable scenario "Valid transitions return true" from packages/platform-core/tests/features/behavior/fsm/fsm.feature diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-004-invalid-transitions-return-false.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-004-invalid-transitions-return-false.sdp.md new file mode 100644 index 00000000..c39a7ccb --- /dev/null +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-004-invalid-transitions-return-false.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.fsm.fsm.invalid-transitions-return-false +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.fsm.fsm +--- +# Invalid transitions return false + +## Intent + +- outcome: Executable scenario "Invalid transitions return false" from packages/platform-core/tests/features/behavior/fsm/fsm.feature diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-005-standalone-can-transition-function-works.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-005-standalone-can-transition-function-works.sdp.md new file mode 100644 index 00000000..7b2e3e61 --- /dev/null +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-005-standalone-can-transition-function-works.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.fsm.fsm.standalone-can-transition-function-works +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.fsm.fsm +--- +# Standalone canTransition function works + +## Intent + +- outcome: Executable scenario "Standalone canTransition function works" from packages/platform-core/tests/features/behavior/fsm/fsm.feature diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-006-valid-transitions-do-not-throw.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-006-valid-transitions-do-not-throw.sdp.md new file mode 100644 index 00000000..6c2c9cab --- /dev/null +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-006-valid-transitions-do-not-throw.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.fsm.fsm.valid-transitions-do-not-throw +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.fsm.fsm +--- +# Valid transitions do not throw + +## Intent + +- outcome: Executable scenario "Valid transitions do not throw" from packages/platform-core/tests/features/behavior/fsm/fsm.feature diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-007-invalid-transition-throws-fsm-transition-error.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-007-invalid-transition-throws-fsm-transition-error.sdp.md new file mode 100644 index 00000000..8876be48 --- /dev/null +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-007-invalid-transition-throws-fsm-transition-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.fsm.fsm.invalid-transition-throws-fsm-transition-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.fsm.fsm +--- +# Invalid transition throws FSMTransitionError + +## Intent + +- outcome: Executable scenario "Invalid transition throws FSMTransitionError" from packages/platform-core/tests/features/behavior/fsm/fsm.feature diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-008-fsm-transition-error-includes-transition-details.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-008-fsm-transition-error-includes-transition-details.sdp.md new file mode 100644 index 00000000..c16a104b --- /dev/null +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-008-fsm-transition-error-includes-transition-details.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.fsm.fsm.fsm-transition-error-includes-transition-details +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.fsm.fsm +--- +# FSMTransitionError includes transition details + +## Intent + +- outcome: Executable scenario "FSMTransitionError includes transition details" from packages/platform-core/tests/features/behavior/fsm/fsm.feature diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-009-standalone-assert-transition-function-works.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-009-standalone-assert-transition-function-works.sdp.md new file mode 100644 index 00000000..99a49cd2 --- /dev/null +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-009-standalone-assert-transition-function-works.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.fsm.fsm.standalone-assert-transition-function-works +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.fsm.fsm +--- +# Standalone assertTransition function works + +## Intent + +- outcome: Executable scenario "Standalone assertTransition function works" from packages/platform-core/tests/features/behavior/fsm/fsm.feature diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-010-returns-valid-transitions-for-each-state.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-010-returns-valid-transitions-for-each-state.sdp.md new file mode 100644 index 00000000..b93723c2 --- /dev/null +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-010-returns-valid-transitions-for-each-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.fsm.fsm.returns-valid-transitions-for-each-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.fsm.fsm +--- +# Returns valid transitions for each state + +## Intent + +- outcome: Executable scenario "Returns valid transitions for each state" from packages/platform-core/tests/features/behavior/fsm/fsm.feature diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-011-standalone-valid-transitions-function-works.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-011-standalone-valid-transitions-function-works.sdp.md new file mode 100644 index 00000000..7b7c5aec --- /dev/null +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-011-standalone-valid-transitions-function-works.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.fsm.fsm.standalone-valid-transitions-function-works +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.fsm.fsm +--- +# Standalone validTransitions function works + +## Intent + +- outcome: Executable scenario "Standalone validTransitions function works" from packages/platform-core/tests/features/behavior/fsm/fsm.feature diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-012-terminal-states-are-identified.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-012-terminal-states-are-identified.sdp.md new file mode 100644 index 00000000..291745b0 --- /dev/null +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-012-terminal-states-are-identified.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.fsm.fsm.terminal-states-are-identified +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.fsm.fsm +--- +# Terminal states are identified + +## Intent + +- outcome: Executable scenario "Terminal states are identified" from packages/platform-core/tests/features/behavior/fsm/fsm.feature diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-013-non-terminal-states-are-identified.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-013-non-terminal-states-are-identified.sdp.md new file mode 100644 index 00000000..284d460e --- /dev/null +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-013-non-terminal-states-are-identified.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.fsm.fsm.non-terminal-states-are-identified +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.fsm.fsm +--- +# Non-terminal states are identified + +## Intent + +- outcome: Executable scenario "Non-terminal states are identified" from packages/platform-core/tests/features/behavior/fsm/fsm.feature diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-014-standalone-is-terminal-function-works.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-014-standalone-is-terminal-function-works.sdp.md new file mode 100644 index 00000000..8a8b273e --- /dev/null +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-014-standalone-is-terminal-function-works.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.fsm.fsm.standalone-is-terminal-function-works +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.fsm.fsm +--- +# Standalone isTerminal function works + +## Intent + +- outcome: Executable scenario "Standalone isTerminal function works" from packages/platform-core/tests/features/behavior/fsm/fsm.feature diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-015-valid-states-return-true.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-015-valid-states-return-true.sdp.md new file mode 100644 index 00000000..ca716ad5 --- /dev/null +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-015-valid-states-return-true.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.fsm.fsm.valid-states-return-true +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.fsm.fsm +--- +# Valid states return true + +## Intent + +- outcome: Executable scenario "Valid states return true" from packages/platform-core/tests/features/behavior/fsm/fsm.feature diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-016-invalid-states-return-false.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-016-invalid-states-return-false.sdp.md new file mode 100644 index 00000000..351605a2 --- /dev/null +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-016-invalid-states-return-false.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.fsm.fsm.invalid-states-return-false +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.fsm.fsm +--- +# Invalid states return false + +## Intent + +- outcome: Executable scenario "Invalid states return false" from packages/platform-core/tests/features/behavior/fsm/fsm.feature diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-017-standalone-is-valid-state-function-works.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-017-standalone-is-valid-state-function-works.sdp.md new file mode 100644 index 00000000..5b08cf85 --- /dev/null +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-017-standalone-is-valid-state-function-works.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.fsm.fsm.standalone-is-valid-state-function-works +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.fsm.fsm +--- +# Standalone isValidState function works + +## Intent + +- outcome: Executable scenario "Standalone isValidState function works" from packages/platform-core/tests/features/behavior/fsm/fsm.feature diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-018-error-has-correct-properties.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-018-error-has-correct-properties.sdp.md new file mode 100644 index 00000000..484d48bc --- /dev/null +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-018-error-has-correct-properties.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.fsm.fsm.error-has-correct-properties +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.fsm.fsm +--- +# Error has correct properties + +## Intent + +- outcome: Executable scenario "Error has correct properties" from packages/platform-core/tests/features/behavior/fsm/fsm.feature diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-019-error-handles-terminal-states-in-message.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-019-error-handles-terminal-states-in-message.sdp.md new file mode 100644 index 00000000..610be5b4 --- /dev/null +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-019-error-handles-terminal-states-in-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.fsm.fsm.error-handles-terminal-states-in-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.fsm.fsm +--- +# Error handles terminal states in message + +## Intent + +- outcome: Executable scenario "Error handles terminal states in message" from packages/platform-core/tests/features/behavior/fsm/fsm.feature diff --git a/specs/behavior/platform-core/handlers/result.examples/s-001-success-result-has-correct-structure.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-001-success-result-has-correct-structure.sdp.md new file mode 100644 index 00000000..dda0d36d --- /dev/null +++ b/specs/behavior/platform-core/handlers/result.examples/s-001-success-result-has-correct-structure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.handlers.result.success-result-has-correct-structure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.handlers.result +--- +# Success result has correct structure + +## Intent + +- outcome: Executable scenario "Success result has correct structure" from packages/platform-core/tests/features/behavior/handlers/result.feature diff --git a/specs/behavior/platform-core/handlers/result.examples/s-002-success-result-preserves-typed-data.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-002-success-result-preserves-typed-data.sdp.md new file mode 100644 index 00000000..6d0b655e --- /dev/null +++ b/specs/behavior/platform-core/handlers/result.examples/s-002-success-result-preserves-typed-data.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.handlers.result.success-result-preserves-typed-data +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.handlers.result +--- +# Success result preserves typed data + +## Intent + +- outcome: Executable scenario "Success result preserves typed data" from packages/platform-core/tests/features/behavior/handlers/result.feature diff --git a/specs/behavior/platform-core/handlers/result.examples/s-003-success-result-returns-status-as-literal-type.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-003-success-result-returns-status-as-literal-type.sdp.md new file mode 100644 index 00000000..520365ea --- /dev/null +++ b/specs/behavior/platform-core/handlers/result.examples/s-003-success-result-returns-status-as-literal-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.handlers.result.success-result-returns-status-as-literal-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.handlers.result +--- +# Success result returns status as literal type + +## Intent + +- outcome: Executable scenario "Success result returns status as literal type" from packages/platform-core/tests/features/behavior/handlers/result.feature diff --git a/specs/behavior/platform-core/handlers/result.examples/s-004-rejected-result-has-code-and-reason.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-004-rejected-result-has-code-and-reason.sdp.md new file mode 100644 index 00000000..2aec2438 --- /dev/null +++ b/specs/behavior/platform-core/handlers/result.examples/s-004-rejected-result-has-code-and-reason.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.handlers.result.rejected-result-has-code-and-reason +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.handlers.result +--- +# Rejected result has code and reason + +## Intent + +- outcome: Executable scenario "Rejected result has code and reason" from packages/platform-core/tests/features/behavior/handlers/result.feature diff --git a/specs/behavior/platform-core/handlers/result.examples/s-005-rejected-result-includes-context-when-provided.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-005-rejected-result-includes-context-when-provided.sdp.md new file mode 100644 index 00000000..cd7bb619 --- /dev/null +++ b/specs/behavior/platform-core/handlers/result.examples/s-005-rejected-result-includes-context-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.handlers.result.rejected-result-includes-context-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.handlers.result +--- +# Rejected result includes context when provided + +## Intent + +- outcome: Executable scenario "Rejected result includes context when provided" from packages/platform-core/tests/features/behavior/handlers/result.feature diff --git a/specs/behavior/platform-core/handlers/result.examples/s-006-rejected-result-omits-context-when-not-provided.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-006-rejected-result-omits-context-when-not-provided.sdp.md new file mode 100644 index 00000000..17e2a0b8 --- /dev/null +++ b/specs/behavior/platform-core/handlers/result.examples/s-006-rejected-result-omits-context-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.handlers.result.rejected-result-omits-context-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.handlers.result +--- +# Rejected result omits context when not provided + +## Intent + +- outcome: Executable scenario "Rejected result omits context when not provided" from packages/platform-core/tests/features/behavior/handlers/result.feature diff --git a/specs/behavior/platform-core/handlers/result.examples/s-007-rejected-result-returns-status-as-literal-type.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-007-rejected-result-returns-status-as-literal-type.sdp.md new file mode 100644 index 00000000..917a961a --- /dev/null +++ b/specs/behavior/platform-core/handlers/result.examples/s-007-rejected-result-returns-status-as-literal-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.handlers.result.rejected-result-returns-status-as-literal-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.handlers.result +--- +# Rejected result returns status as literal type + +## Intent + +- outcome: Executable scenario "Rejected result returns status as literal type" from packages/platform-core/tests/features/behavior/handlers/result.feature diff --git a/specs/behavior/platform-core/handlers/result.examples/s-008-failed-result-has-event-data.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-008-failed-result-has-event-data.sdp.md new file mode 100644 index 00000000..8d7d6679 --- /dev/null +++ b/specs/behavior/platform-core/handlers/result.examples/s-008-failed-result-has-event-data.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.handlers.result.failed-result-has-event-data +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.handlers.result +--- +# Failed result has event data + +## Intent + +- outcome: Executable scenario "Failed result has event data" from packages/platform-core/tests/features/behavior/handlers/result.feature diff --git a/specs/behavior/platform-core/handlers/result.examples/s-009-failed-result-includes-expected-version-when-provided.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-009-failed-result-includes-expected-version-when-provided.sdp.md new file mode 100644 index 00000000..97b47267 --- /dev/null +++ b/specs/behavior/platform-core/handlers/result.examples/s-009-failed-result-includes-expected-version-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.handlers.result.failed-result-includes-expected-version-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.handlers.result +--- +# Failed result includes expectedVersion when provided + +## Intent + +- outcome: Executable scenario "Failed result includes expectedVersion when provided" from packages/platform-core/tests/features/behavior/handlers/result.feature diff --git a/specs/behavior/platform-core/handlers/result.examples/s-010-failed-result-includes-context-when-provided.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-010-failed-result-includes-context-when-provided.sdp.md new file mode 100644 index 00000000..96f6fe81 --- /dev/null +++ b/specs/behavior/platform-core/handlers/result.examples/s-010-failed-result-includes-context-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.handlers.result.failed-result-includes-context-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.handlers.result +--- +# Failed result includes context when provided + +## Intent + +- outcome: Executable scenario "Failed result includes context when provided" from packages/platform-core/tests/features/behavior/handlers/result.feature diff --git a/specs/behavior/platform-core/handlers/result.examples/s-011-failed-result-includes-both-expected-version-and-context.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-011-failed-result-includes-both-expected-version-and-context.sdp.md new file mode 100644 index 00000000..5e7fc7e7 --- /dev/null +++ b/specs/behavior/platform-core/handlers/result.examples/s-011-failed-result-includes-both-expected-version-and-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.handlers.result.failed-result-includes-both-expected-version-and-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.handlers.result +--- +# Failed result includes both expectedVersion and context + +## Intent + +- outcome: Executable scenario "Failed result includes both expectedVersion and context" from packages/platform-core/tests/features/behavior/handlers/result.feature diff --git a/specs/behavior/platform-core/handlers/result.examples/s-012-failed-result-omits-optional-properties-when-not-provided.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-012-failed-result-omits-optional-properties-when-not-provided.sdp.md new file mode 100644 index 00000000..5aa2895c --- /dev/null +++ b/specs/behavior/platform-core/handlers/result.examples/s-012-failed-result-omits-optional-properties-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.handlers.result.failed-result-omits-optional-properties-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.handlers.result +--- +# Failed result omits optional properties when not provided + +## Intent + +- outcome: Executable scenario "Failed result omits optional properties when not provided" from packages/platform-core/tests/features/behavior/handlers/result.feature diff --git a/specs/behavior/platform-core/handlers/result.examples/s-013-failed-result-returns-status-as-literal-type.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-013-failed-result-returns-status-as-literal-type.sdp.md new file mode 100644 index 00000000..138a52fd --- /dev/null +++ b/specs/behavior/platform-core/handlers/result.examples/s-013-failed-result-returns-status-as-literal-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.handlers.result.failed-result-returns-status-as-literal-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.handlers.result +--- +# Failed result returns status as literal type + +## Intent + +- outcome: Executable scenario "Failed result returns status as literal type" from packages/platform-core/tests/features/behavior/handlers/result.feature diff --git a/specs/behavior/platform-core/ids/branded.examples/s-001-factory-functions-produce-branded-i-ds-preserving-the-input-value.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-001-factory-functions-produce-branded-i-ds-preserving-the-input-value.sdp.md new file mode 100644 index 00000000..5721d50c --- /dev/null +++ b/specs/behavior/platform-core/ids/branded.examples/s-001-factory-functions-produce-branded-i-ds-preserving-the-input-value.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.branded.factory-functions-produce-branded-i-ds-preserving-the-input-value +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.branded +--- +# Factory functions produce branded IDs preserving the input value + +## Intent + +- outcome: Executable scenario "Factory functions produce branded IDs preserving the input value" from packages/platform-core/tests/features/behavior/ids/branded.feature diff --git a/specs/behavior/platform-core/ids/branded.examples/s-002-branded-i-ds-are-assignable-to-plain-string-variables.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-002-branded-i-ds-are-assignable-to-plain-string-variables.sdp.md new file mode 100644 index 00000000..64b059bb --- /dev/null +++ b/specs/behavior/platform-core/ids/branded.examples/s-002-branded-i-ds-are-assignable-to-plain-string-variables.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.branded.branded-i-ds-are-assignable-to-plain-string-variables +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.branded +--- +# Branded IDs are assignable to plain string variables + +## Intent + +- outcome: Executable scenario "Branded IDs are assignable to plain string variables" from packages/platform-core/tests/features/behavior/ids/branded.feature diff --git a/specs/behavior/platform-core/ids/branded.examples/s-003-branded-i-ds-support-standard-string-methods.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-003-branded-i-ds-support-standard-string-methods.sdp.md new file mode 100644 index 00000000..66d3111a --- /dev/null +++ b/specs/behavior/platform-core/ids/branded.examples/s-003-branded-i-ds-support-standard-string-methods.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.branded.branded-i-ds-support-standard-string-methods +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.branded +--- +# Branded IDs support standard string methods + +## Intent + +- outcome: Executable scenario "Branded IDs support standard string methods" from packages/platform-core/tests/features/behavior/ids/branded.feature diff --git a/specs/behavior/platform-core/ids/branded.examples/s-004-generators-produce-correctly-prefixed-branded-i-ds.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-004-generators-produce-correctly-prefixed-branded-i-ds.sdp.md new file mode 100644 index 00000000..0b3c0e23 --- /dev/null +++ b/specs/behavior/platform-core/ids/branded.examples/s-004-generators-produce-correctly-prefixed-branded-i-ds.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.branded.generators-produce-correctly-prefixed-branded-i-ds +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.branded +--- +# Generators produce correctly prefixed branded IDs + +## Intent + +- outcome: Executable scenario "Generators produce correctly prefixed branded IDs" from packages/platform-core/tests/features/behavior/ids/branded.feature diff --git a/specs/behavior/platform-core/ids/branded.examples/s-005-command-and-correlation-generators-produce-valid-uuid-v7-after-prefix.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-005-command-and-correlation-generators-produce-valid-uuid-v7-after-prefix.sdp.md new file mode 100644 index 00000000..11de3c01 --- /dev/null +++ b/specs/behavior/platform-core/ids/branded.examples/s-005-command-and-correlation-generators-produce-valid-uuid-v7-after-prefix.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.branded.command-and-correlation-generators-produce-valid-uuid-v7-after-prefix +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.branded +--- +# Command and correlation generators produce valid UUID v7 after prefix + +## Intent + +- outcome: Executable scenario "Command and correlation generators produce valid UUID v7 after prefix" from packages/platform-core/tests/features/behavior/ids/branded.feature diff --git a/specs/behavior/platform-core/ids/branded.examples/s-006-is-valid-id-string-returns-true-for-non-empty-strings.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-006-is-valid-id-string-returns-true-for-non-empty-strings.sdp.md new file mode 100644 index 00000000..95ec0292 --- /dev/null +++ b/specs/behavior/platform-core/ids/branded.examples/s-006-is-valid-id-string-returns-true-for-non-empty-strings.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.branded.is-valid-id-string-returns-true-for-non-empty-strings +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.branded +--- +# isValidIdString returns true for non-empty strings + +## Intent + +- outcome: Executable scenario "isValidIdString returns true for non-empty strings" from packages/platform-core/tests/features/behavior/ids/branded.feature diff --git a/specs/behavior/platform-core/ids/branded.examples/s-007-is-valid-id-string-returns-false-for-empty-string.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-007-is-valid-id-string-returns-false-for-empty-string.sdp.md new file mode 100644 index 00000000..fd51d15d --- /dev/null +++ b/specs/behavior/platform-core/ids/branded.examples/s-007-is-valid-id-string-returns-false-for-empty-string.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.branded.is-valid-id-string-returns-false-for-empty-string +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.branded +--- +# isValidIdString returns false for empty string + +## Intent + +- outcome: Executable scenario "isValidIdString returns false for empty string" from packages/platform-core/tests/features/behavior/ids/branded.feature diff --git a/specs/behavior/platform-core/ids/branded.examples/s-008-is-valid-id-string-returns-false-for-non-string-values.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-008-is-valid-id-string-returns-false-for-non-string-values.sdp.md new file mode 100644 index 00000000..3dab2d0f --- /dev/null +++ b/specs/behavior/platform-core/ids/branded.examples/s-008-is-valid-id-string-returns-false-for-non-string-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.branded.is-valid-id-string-returns-false-for-non-string-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.branded +--- +# isValidIdString returns false for non-string values + +## Intent + +- outcome: Executable scenario "isValidIdString returns false for non-string values" from packages/platform-core/tests/features/behavior/ids/branded.feature diff --git a/specs/behavior/platform-core/ids/branded.examples/s-009-is-valid-id-string-narrows-type-for-type-script.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-009-is-valid-id-string-narrows-type-for-type-script.sdp.md new file mode 100644 index 00000000..3654e957 --- /dev/null +++ b/specs/behavior/platform-core/ids/branded.examples/s-009-is-valid-id-string-narrows-type-for-type-script.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.branded.is-valid-id-string-narrows-type-for-type-script +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.branded +--- +# isValidIdString narrows type for TypeScript + +## Intent + +- outcome: Executable scenario "isValidIdString narrows type for TypeScript" from packages/platform-core/tests/features/behavior/ids/branded.feature diff --git a/specs/behavior/platform-core/ids/branded.examples/s-010-n-100-generated-command-ids-are-all-unique.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-010-n-100-generated-command-ids-are-all-unique.sdp.md new file mode 100644 index 00000000..43ca3fd5 --- /dev/null +++ b/specs/behavior/platform-core/ids/branded.examples/s-010-n-100-generated-command-ids-are-all-unique.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.branded.n-100-generated-command-ids-are-all-unique +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.branded +--- +# 100 generated CommandIds are all unique + +## Intent + +- outcome: Executable scenario "100 generated CommandIds are all unique" from packages/platform-core/tests/features/behavior/ids/branded.feature diff --git a/specs/behavior/platform-core/ids/branded.examples/s-011-n-100-generated-correlation-ids-are-all-unique.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-011-n-100-generated-correlation-ids-are-all-unique.sdp.md new file mode 100644 index 00000000..48075062 --- /dev/null +++ b/specs/behavior/platform-core/ids/branded.examples/s-011-n-100-generated-correlation-ids-are-all-unique.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.branded.n-100-generated-correlation-ids-are-all-unique +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.branded +--- +# 100 generated CorrelationIds are all unique + +## Intent + +- outcome: Executable scenario "100 generated CorrelationIds are all unique" from packages/platform-core/tests/features/behavior/ids/branded.feature diff --git a/specs/behavior/platform-core/ids/generator.examples/s-001-generated-id-matches-the-expected-format.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-001-generated-id-matches-the-expected-format.sdp.md new file mode 100644 index 00000000..58aa34f5 --- /dev/null +++ b/specs/behavior/platform-core/ids/generator.examples/s-001-generated-id-matches-the-expected-format.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.generator.generated-id-matches-the-expected-format +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.generator +--- +# Generated ID matches the expected format + +## Intent + +- outcome: Executable scenario "Generated ID matches the expected format" from packages/platform-core/tests/features/behavior/ids/generator.feature diff --git a/specs/behavior/platform-core/ids/generator.examples/s-002-each-call-produces-a-unique-id.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-002-each-call-produces-a-unique-id.sdp.md new file mode 100644 index 00000000..c1e8334d --- /dev/null +++ b/specs/behavior/platform-core/ids/generator.examples/s-002-each-call-produces-a-unique-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.generator.each-call-produces-a-unique-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.generator +--- +# Each call produces a unique ID + +## Intent + +- outcome: Executable scenario "Each call produces a unique ID" from packages/platform-core/tests/features/behavior/ids/generator.feature diff --git a/specs/behavior/platform-core/ids/generator.examples/s-003-generated-id-starts-with-the-provided-context-and-type.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-003-generated-id-starts-with-the-provided-context-and-type.sdp.md new file mode 100644 index 00000000..eb66c9b4 --- /dev/null +++ b/specs/behavior/platform-core/ids/generator.examples/s-003-generated-id-starts-with-the-provided-context-and-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.generator.generated-id-starts-with-the-provided-context-and-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.generator +--- +# Generated ID starts with the provided context and type + +## Intent + +- outcome: Executable scenario "Generated ID starts with the provided context and type" from packages/platform-core/tests/features/behavior/ids/generator.feature diff --git a/specs/behavior/platform-core/ids/generator.examples/s-004-lowercase-alphanumeric-values-are-accepted-for-context-and-type.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-004-lowercase-alphanumeric-values-are-accepted-for-context-and-type.sdp.md new file mode 100644 index 00000000..cc3d953b --- /dev/null +++ b/specs/behavior/platform-core/ids/generator.examples/s-004-lowercase-alphanumeric-values-are-accepted-for-context-and-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.generator.lowercase-alphanumeric-values-are-accepted-for-context-and-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.generator +--- +# Lowercase alphanumeric values are accepted for context and type + +## Intent + +- outcome: Executable scenario "Lowercase alphanumeric values are accepted for context and type" from packages/platform-core/tests/features/behavior/ids/generator.feature diff --git a/specs/behavior/platform-core/ids/generator.examples/s-005-empty-context-or-type-throws-an-error.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-005-empty-context-or-type-throws-an-error.sdp.md new file mode 100644 index 00000000..406760c8 --- /dev/null +++ b/specs/behavior/platform-core/ids/generator.examples/s-005-empty-context-or-type-throws-an-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.generator.empty-context-or-type-throws-an-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.generator +--- +# Empty context or type throws an error + +## Intent + +- outcome: Executable scenario "Empty context or type throws an error" from packages/platform-core/tests/features/behavior/ids/generator.feature diff --git a/specs/behavior/platform-core/ids/generator.examples/s-006-context-with-disallowed-characters-throws-an-error.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-006-context-with-disallowed-characters-throws-an-error.sdp.md new file mode 100644 index 00000000..ef30c7f7 --- /dev/null +++ b/specs/behavior/platform-core/ids/generator.examples/s-006-context-with-disallowed-characters-throws-an-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.generator.context-with-disallowed-characters-throws-an-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.generator +--- +# Context with disallowed characters throws an error + +## Intent + +- outcome: Executable scenario "Context with disallowed characters throws an error" from packages/platform-core/tests/features/behavior/ids/generator.feature diff --git a/specs/behavior/platform-core/ids/generator.examples/s-007-type-with-underscore-throws-an-error.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-007-type-with-underscore-throws-an-error.sdp.md new file mode 100644 index 00000000..6c60563f --- /dev/null +++ b/specs/behavior/platform-core/ids/generator.examples/s-007-type-with-underscore-throws-an-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.generator.type-with-underscore-throws-an-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.generator +--- +# Type with underscore throws an error + +## Intent + +- outcome: Executable scenario "Type with underscore throws an error" from packages/platform-core/tests/features/behavior/ids/generator.feature diff --git a/specs/behavior/platform-core/ids/generator.examples/s-008-a-well-formed-id-is-parsed-into-its-components.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-008-a-well-formed-id-is-parsed-into-its-components.sdp.md new file mode 100644 index 00000000..9a50bbdb --- /dev/null +++ b/specs/behavior/platform-core/ids/generator.examples/s-008-a-well-formed-id-is-parsed-into-its-components.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.generator.a-well-formed-id-is-parsed-into-its-components +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.generator +--- +# A well-formed ID is parsed into its components + +## Intent + +- outcome: Executable scenario "A well-formed ID is parsed into its components" from packages/platform-core/tests/features/behavior/ids/generator.feature diff --git a/specs/behavior/platform-core/ids/generator.examples/s-009-an-id-produced-by-generate-id-is-parseable.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-009-an-id-produced-by-generate-id-is-parseable.sdp.md new file mode 100644 index 00000000..c7efab1f --- /dev/null +++ b/specs/behavior/platform-core/ids/generator.examples/s-009-an-id-produced-by-generate-id-is-parseable.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.generator.an-id-produced-by-generate-id-is-parseable +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.generator +--- +# An ID produced by generateId is parseable + +## Intent + +- outcome: Executable scenario "An ID produced by generateId is parseable" from packages/platform-core/tests/features/behavior/ids/generator.feature diff --git a/specs/behavior/platform-core/ids/generator.examples/s-010-uuid-portion-containing-underscores-is-preserved.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-010-uuid-portion-containing-underscores-is-preserved.sdp.md new file mode 100644 index 00000000..2106c594 --- /dev/null +++ b/specs/behavior/platform-core/ids/generator.examples/s-010-uuid-portion-containing-underscores-is-preserved.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.generator.uuid-portion-containing-underscores-is-preserved +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.generator +--- +# UUID portion containing underscores is preserved + +## Intent + +- outcome: Executable scenario "UUID portion containing underscores is preserved" from packages/platform-core/tests/features/behavior/ids/generator.feature diff --git a/specs/behavior/platform-core/ids/generator.examples/s-011-i-ds-with-fewer-than-three-parts-return-null.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-011-i-ds-with-fewer-than-three-parts-return-null.sdp.md new file mode 100644 index 00000000..5d4093e0 --- /dev/null +++ b/specs/behavior/platform-core/ids/generator.examples/s-011-i-ds-with-fewer-than-three-parts-return-null.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.generator.i-ds-with-fewer-than-three-parts-return-null +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.generator +--- +# IDs with fewer than three parts return null + +## Intent + +- outcome: Executable scenario "IDs with fewer than three parts return null" from packages/platform-core/tests/features/behavior/ids/generator.feature diff --git a/specs/behavior/platform-core/ids/generator.examples/s-012-i-ds-with-empty-context-or-type-return-null.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-012-i-ds-with-empty-context-or-type-return-null.sdp.md new file mode 100644 index 00000000..1b56b4ad --- /dev/null +++ b/specs/behavior/platform-core/ids/generator.examples/s-012-i-ds-with-empty-context-or-type-return-null.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.generator.i-ds-with-empty-context-or-type-return-null +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.generator +--- +# IDs with empty context or type return null + +## Intent + +- outcome: Executable scenario "IDs with empty context or type return null" from packages/platform-core/tests/features/behavior/ids/generator.feature diff --git a/specs/behavior/platform-core/ids/generator.examples/s-013-correlation-id-has-the-expected-format-and-is-unique-per-call.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-013-correlation-id-has-the-expected-format-and-is-unique-per-call.sdp.md new file mode 100644 index 00000000..104424a3 --- /dev/null +++ b/specs/behavior/platform-core/ids/generator.examples/s-013-correlation-id-has-the-expected-format-and-is-unique-per-call.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.generator.correlation-id-has-the-expected-format-and-is-unique-per-call +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.generator +--- +# Correlation ID has the expected format and is unique per call + +## Intent + +- outcome: Executable scenario "Correlation ID has the expected format and is unique per call" from packages/platform-core/tests/features/behavior/ids/generator.feature diff --git a/specs/behavior/platform-core/ids/generator.examples/s-014-command-id-has-the-expected-format-and-is-unique-per-call.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-014-command-id-has-the-expected-format-and-is-unique-per-call.sdp.md new file mode 100644 index 00000000..05c39c5f --- /dev/null +++ b/specs/behavior/platform-core/ids/generator.examples/s-014-command-id-has-the-expected-format-and-is-unique-per-call.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.generator.command-id-has-the-expected-format-and-is-unique-per-call +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.generator +--- +# Command ID has the expected format and is unique per call + +## Intent + +- outcome: Executable scenario "Command ID has the expected format and is unique per call" from packages/platform-core/tests/features/behavior/ids/generator.feature diff --git a/specs/behavior/platform-core/ids/generator.examples/s-015-event-id-has-the-expected-format-and-uses-the-provided-context.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-015-event-id-has-the-expected-format-and-uses-the-provided-context.sdp.md new file mode 100644 index 00000000..4dd7cedc --- /dev/null +++ b/specs/behavior/platform-core/ids/generator.examples/s-015-event-id-has-the-expected-format-and-uses-the-provided-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.generator.event-id-has-the-expected-format-and-uses-the-provided-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.generator +--- +# Event ID has the expected format and uses the provided context + +## Intent + +- outcome: Executable scenario "Event ID has the expected format and uses the provided context" from packages/platform-core/tests/features/behavior/ids/generator.feature diff --git a/specs/behavior/platform-core/ids/generator.examples/s-016-event-i-ds-are-unique-per-call.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-016-event-i-ds-are-unique-per-call.sdp.md new file mode 100644 index 00000000..e6b871fd --- /dev/null +++ b/specs/behavior/platform-core/ids/generator.examples/s-016-event-i-ds-are-unique-per-call.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.generator.event-i-ds-are-unique-per-call +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.generator +--- +# Event IDs are unique per call + +## Intent + +- outcome: Executable scenario "Event IDs are unique per call" from packages/platform-core/tests/features/behavior/ids/generator.feature diff --git a/specs/behavior/platform-core/ids/generator.examples/s-017-empty-context-throws-an-error.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-017-empty-context-throws-an-error.sdp.md new file mode 100644 index 00000000..43f2b97e --- /dev/null +++ b/specs/behavior/platform-core/ids/generator.examples/s-017-empty-context-throws-an-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.generator.empty-context-throws-an-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.generator +--- +# Empty context throws an error + +## Intent + +- outcome: Executable scenario "Empty context throws an error" from packages/platform-core/tests/features/behavior/ids/generator.feature diff --git a/specs/behavior/platform-core/ids/generator.examples/s-018-integration-event-id-has-the-expected-format-and-is-unique-per-call.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-018-integration-event-id-has-the-expected-format-and-is-unique-per-call.sdp.md new file mode 100644 index 00000000..abbf2d46 --- /dev/null +++ b/specs/behavior/platform-core/ids/generator.examples/s-018-integration-event-id-has-the-expected-format-and-is-unique-per-call.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.generator.integration-event-id-has-the-expected-format-and-is-unique-per-call +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.generator +--- +# Integration event ID has the expected format and is unique per call + +## Intent + +- outcome: Executable scenario "Integration event ID has the expected format and is unique per call" from packages/platform-core/tests/features/behavior/ids/generator.feature diff --git a/specs/behavior/platform-core/ids/generator.examples/s-019-uuid-portion-has-version-7-indicator.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-019-uuid-portion-has-version-7-indicator.sdp.md new file mode 100644 index 00000000..e5cd57f9 --- /dev/null +++ b/specs/behavior/platform-core/ids/generator.examples/s-019-uuid-portion-has-version-7-indicator.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.generator.uuid-portion-has-version-7-indicator +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.generator +--- +# UUID portion has version 7 indicator + +## Intent + +- outcome: Executable scenario "UUID portion has version 7 indicator" from packages/platform-core/tests/features/behavior/ids/generator.feature diff --git a/specs/behavior/platform-core/ids/generator.examples/s-020-ten-sequential-i-ds-are-lexicographically-sorted.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-020-ten-sequential-i-ds-are-lexicographically-sorted.sdp.md new file mode 100644 index 00000000..64189369 --- /dev/null +++ b/specs/behavior/platform-core/ids/generator.examples/s-020-ten-sequential-i-ds-are-lexicographically-sorted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.ids.generator.ten-sequential-i-ds-are-lexicographically-sorted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.ids.generator +--- +# Ten sequential IDs are lexicographically sorted + +## Intent + +- outcome: Executable scenario "Ten sequential IDs are lexicographically sorted" from packages/platform-core/tests/features/behavior/ids/generator.feature diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-001-define-acl-for-payment-gateway.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-001-define-acl-for-payment-gateway.sdp.md new file mode 100644 index 00000000..1c0c56a1 --- /dev/null +++ b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-001-define-acl-for-payment-gateway.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.anti-corruption-layer.define-acl-for-payment-gateway +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.anti-corruption-layer +--- +# Define ACL for payment gateway + +## Intent + +- outcome: Executable scenario "Define ACL for payment gateway" from packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-002-acl-translates-field-names.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-002-acl-translates-field-names.sdp.md new file mode 100644 index 00000000..2f89bcb2 --- /dev/null +++ b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-002-acl-translates-field-names.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.anti-corruption-layer.acl-translates-field-names +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.anti-corruption-layer +--- +# ACL translates field names + +## Intent + +- outcome: Executable scenario "ACL translates field names" from packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-003-acl-transforms-field-values.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-003-acl-transforms-field-values.sdp.md new file mode 100644 index 00000000..e5e9d89b --- /dev/null +++ b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-003-acl-transforms-field-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.anti-corruption-layer.acl-transforms-field-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.anti-corruption-layer +--- +# ACL transforms field values + +## Intent + +- outcome: Executable scenario "ACL transforms field values" from packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-004-acl-translates-domain-to-external.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-004-acl-translates-domain-to-external.sdp.md new file mode 100644 index 00000000..0ce8191f --- /dev/null +++ b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-004-acl-translates-domain-to-external.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.anti-corruption-layer.acl-translates-domain-to-external +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.anti-corruption-layer +--- +# ACL translates domain to external + +## Intent + +- outcome: Executable scenario "ACL translates domain to external" from packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-005-round-trip-translation-preserves-data.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-005-round-trip-translation-preserves-data.sdp.md new file mode 100644 index 00000000..127a3b5d --- /dev/null +++ b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-005-round-trip-translation-preserves-data.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.anti-corruption-layer.round-trip-translation-preserves-data +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.anti-corruption-layer +--- +# Round-trip translation preserves data + +## Intent + +- outcome: Executable scenario "Round-trip translation preserves data" from packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-006-missing-required-external-field.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-006-missing-required-external-field.sdp.md new file mode 100644 index 00000000..58b2ab7b --- /dev/null +++ b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-006-missing-required-external-field.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.anti-corruption-layer.missing-required-external-field +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.anti-corruption-layer +--- +# Missing required external field + +## Intent + +- outcome: Executable scenario "Missing required external field" from packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-007-invalid-external-field-type.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-007-invalid-external-field-type.sdp.md new file mode 100644 index 00000000..ba26f245 --- /dev/null +++ b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-007-invalid-external-field-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.anti-corruption-layer.invalid-external-field-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.anti-corruption-layer +--- +# Invalid external field type + +## Intent + +- outcome: Executable scenario "Invalid external field type" from packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-008-unknown-external-status.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-008-unknown-external-status.sdp.md new file mode 100644 index 00000000..15facffa --- /dev/null +++ b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-008-unknown-external-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.anti-corruption-layer.unknown-external-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.anti-corruption-layer +--- +# Unknown external status + +## Intent + +- outcome: Executable scenario "Unknown external status" from packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-009-multiple-payment-gateways-with-different-schemas.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-009-multiple-payment-gateways-with-different-schemas.sdp.md new file mode 100644 index 00000000..72dfb861 --- /dev/null +++ b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-009-multiple-payment-gateways-with-different-schemas.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.anti-corruption-layer.multiple-payment-gateways-with-different-schemas +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.anti-corruption-layer +--- +# Multiple payment gateways with different schemas + +## Intent + +- outcome: Executable scenario "Multiple payment gateways with different schemas" from packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-001-register-upstream-downstream-relationship.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-001-register-upstream-downstream-relationship.sdp.md new file mode 100644 index 00000000..4fc7c5d2 --- /dev/null +++ b/specs/behavior/platform-core/integration/context-map.examples/s-001-register-upstream-downstream-relationship.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.context-map.register-upstream-downstream-relationship +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.context-map +--- +# Register Upstream/Downstream relationship + +## Intent + +- outcome: Executable scenario "Register Upstream/Downstream relationship" from packages/platform-core/tests/features/behavior/integration/context-map.feature diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-002-register-customer-supplier-relationship.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-002-register-customer-supplier-relationship.sdp.md new file mode 100644 index 00000000..7aea13cd --- /dev/null +++ b/specs/behavior/platform-core/integration/context-map.examples/s-002-register-customer-supplier-relationship.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.context-map.register-customer-supplier-relationship +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.context-map +--- +# Register Customer/Supplier relationship + +## Intent + +- outcome: Executable scenario "Register Customer/Supplier relationship" from packages/platform-core/tests/features/behavior/integration/context-map.feature diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-003-register-conformist-relationship.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-003-register-conformist-relationship.sdp.md new file mode 100644 index 00000000..146e0cfc --- /dev/null +++ b/specs/behavior/platform-core/integration/context-map.examples/s-003-register-conformist-relationship.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.context-map.register-conformist-relationship +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.context-map +--- +# Register Conformist relationship + +## Intent + +- outcome: Executable scenario "Register Conformist relationship" from packages/platform-core/tests/features/behavior/integration/context-map.feature diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-004-register-acl-relationship.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-004-register-acl-relationship.sdp.md new file mode 100644 index 00000000..ec4ea282 --- /dev/null +++ b/specs/behavior/platform-core/integration/context-map.examples/s-004-register-acl-relationship.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.context-map.register-acl-relationship +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.context-map +--- +# Register ACL relationship + +## Intent + +- outcome: Executable scenario "Register ACL relationship" from packages/platform-core/tests/features/behavior/integration/context-map.feature diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-005-register-partnership-relationship.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-005-register-partnership-relationship.sdp.md new file mode 100644 index 00000000..fba1afc1 --- /dev/null +++ b/specs/behavior/platform-core/integration/context-map.examples/s-005-register-partnership-relationship.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.context-map.register-partnership-relationship +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.context-map +--- +# Register Partnership relationship + +## Intent + +- outcome: Executable scenario "Register Partnership relationship" from packages/platform-core/tests/features/behavior/integration/context-map.feature diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-006-register-shared-kernel-relationship.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-006-register-shared-kernel-relationship.sdp.md new file mode 100644 index 00000000..bf5619a8 --- /dev/null +++ b/specs/behavior/platform-core/integration/context-map.examples/s-006-register-shared-kernel-relationship.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.context-map.register-shared-kernel-relationship +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.context-map +--- +# Register Shared Kernel relationship + +## Intent + +- outcome: Executable scenario "Register Shared Kernel relationship" from packages/platform-core/tests/features/behavior/integration/context-map.feature diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-007-register-open-host-service-relationship.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-007-register-open-host-service-relationship.sdp.md new file mode 100644 index 00000000..a54414bb --- /dev/null +++ b/specs/behavior/platform-core/integration/context-map.examples/s-007-register-open-host-service-relationship.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.context-map.register-open-host-service-relationship +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.context-map +--- +# Register Open Host Service relationship + +## Intent + +- outcome: Executable scenario "Register Open Host Service relationship" from packages/platform-core/tests/features/behavior/integration/context-map.feature diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-008-query-all-relationships-for-a-bc.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-008-query-all-relationships-for-a-bc.sdp.md new file mode 100644 index 00000000..110544cc --- /dev/null +++ b/specs/behavior/platform-core/integration/context-map.examples/s-008-query-all-relationships-for-a-bc.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.context-map.query-all-relationships-for-a-bc +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.context-map +--- +# Query all relationships for a BC + +## Intent + +- outcome: Executable scenario "Query all relationships for a BC" from packages/platform-core/tests/features/behavior/integration/context-map.feature diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-009-query-upstream-b-cs.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-009-query-upstream-b-cs.sdp.md new file mode 100644 index 00000000..ee01dd93 --- /dev/null +++ b/specs/behavior/platform-core/integration/context-map.examples/s-009-query-upstream-b-cs.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.context-map.query-upstream-b-cs +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.context-map +--- +# Query upstream BCs + +## Intent + +- outcome: Executable scenario "Query upstream BCs" from packages/platform-core/tests/features/behavior/integration/context-map.feature diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-010-query-bc-with-no-relationships.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-010-query-bc-with-no-relationships.sdp.md new file mode 100644 index 00000000..2ef9a340 --- /dev/null +++ b/specs/behavior/platform-core/integration/context-map.examples/s-010-query-bc-with-no-relationships.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.context-map.query-bc-with-no-relationships +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.context-map +--- +# Query BC with no relationships + +## Intent + +- outcome: Executable scenario "Query BC with no relationships" from packages/platform-core/tests/features/behavior/integration/context-map.feature diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-011-duplicate-relationship-is-rejected.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-011-duplicate-relationship-is-rejected.sdp.md new file mode 100644 index 00000000..7de7f848 --- /dev/null +++ b/specs/behavior/platform-core/integration/context-map.examples/s-011-duplicate-relationship-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.context-map.duplicate-relationship-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.context-map +--- +# Duplicate relationship is rejected + +## Intent + +- outcome: Executable scenario "Duplicate relationship is rejected" from packages/platform-core/tests/features/behavior/integration/context-map.feature diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-012-self-referential-relationship-is-rejected.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-012-self-referential-relationship-is-rejected.sdp.md new file mode 100644 index 00000000..b8ffe16b --- /dev/null +++ b/specs/behavior/platform-core/integration/context-map.examples/s-012-self-referential-relationship-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.context-map.self-referential-relationship-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.context-map +--- +# Self-referential relationship is rejected + +## Intent + +- outcome: Executable scenario "Self-referential relationship is rejected" from packages/platform-core/tests/features/behavior/integration/context-map.feature diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-001-generate-sample-from-schema.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-001-generate-sample-from-schema.sdp.md new file mode 100644 index 00000000..0edd8003 --- /dev/null +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-001-generate-sample-from-schema.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.contract-testing.generate-sample-from-schema +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.contract-testing +--- +# Generate sample from schema + +## Intent + +- outcome: Executable scenario "Generate sample from schema" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-002-generate-sample-with-overrides.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-002-generate-sample-with-overrides.sdp.md new file mode 100644 index 00000000..2fc74674 --- /dev/null +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-002-generate-sample-with-overrides.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.contract-testing.generate-sample-with-overrides +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.contract-testing +--- +# Generate sample with overrides + +## Intent + +- outcome: Executable scenario "Generate sample with overrides" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-003-generate-multiple-samples.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-003-generate-multiple-samples.sdp.md new file mode 100644 index 00000000..52696c4b --- /dev/null +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-003-generate-multiple-samples.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.contract-testing.generate-multiple-samples +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.contract-testing +--- +# Generate multiple samples + +## Intent + +- outcome: Executable scenario "Generate multiple samples" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-004-producer-emits-valid-event.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-004-producer-emits-valid-event.sdp.md new file mode 100644 index 00000000..30f9439a --- /dev/null +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-004-producer-emits-valid-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.contract-testing.producer-emits-valid-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.contract-testing +--- +# Producer emits valid event + +## Intent + +- outcome: Executable scenario "Producer emits valid event" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-005-producer-emits-invalid-event.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-005-producer-emits-invalid-event.sdp.md new file mode 100644 index 00000000..efcfbe74 --- /dev/null +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-005-producer-emits-invalid-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.contract-testing.producer-emits-invalid-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.contract-testing +--- +# Producer emits invalid event + +## Intent + +- outcome: Executable scenario "Producer emits invalid event" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-006-producer-emits-wrong-version.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-006-producer-emits-wrong-version.sdp.md new file mode 100644 index 00000000..92078c3b --- /dev/null +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-006-producer-emits-wrong-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.contract-testing.producer-emits-wrong-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.contract-testing +--- +# Producer emits wrong version + +## Intent + +- outcome: Executable scenario "Producer emits wrong version" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-007-consumer-processes-valid-event.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-007-consumer-processes-valid-event.sdp.md new file mode 100644 index 00000000..5acde1ea --- /dev/null +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-007-consumer-processes-valid-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.contract-testing.consumer-processes-valid-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.contract-testing +--- +# Consumer processes valid event + +## Intent + +- outcome: Executable scenario "Consumer processes valid event" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-008-consumer-handles-all-sample-variations.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-008-consumer-handles-all-sample-variations.sdp.md new file mode 100644 index 00000000..5c3eebc9 --- /dev/null +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-008-consumer-handles-all-sample-variations.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.contract-testing.consumer-handles-all-sample-variations +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.contract-testing +--- +# Consumer handles all sample variations + +## Intent + +- outcome: Executable scenario "Consumer handles all sample variations" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-009-consumer-rejects-valid-event.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-009-consumer-rejects-valid-event.sdp.md new file mode 100644 index 00000000..b29a274a --- /dev/null +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-009-consumer-rejects-valid-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.contract-testing.consumer-rejects-valid-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.contract-testing +--- +# Consumer rejects valid event + +## Intent + +- outcome: Executable scenario "Consumer rejects valid event" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-010-compatible-producer-and-consumer.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-010-compatible-producer-and-consumer.sdp.md new file mode 100644 index 00000000..189b9b4c --- /dev/null +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-010-compatible-producer-and-consumer.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.contract-testing.compatible-producer-and-consumer +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.contract-testing +--- +# Compatible producer and consumer + +## Intent + +- outcome: Executable scenario "Compatible producer and consumer" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-011-incompatible-versions-detected.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-011-incompatible-versions-detected.sdp.md new file mode 100644 index 00000000..f75f7bf0 --- /dev/null +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-011-incompatible-versions-detected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.contract-testing.incompatible-versions-detected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.contract-testing +--- +# Incompatible versions detected + +## Intent + +- outcome: Executable scenario "Incompatible versions detected" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-012-compatible-with-downcaster.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-012-compatible-with-downcaster.sdp.md new file mode 100644 index 00000000..259de9bb --- /dev/null +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-012-compatible-with-downcaster.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.contract-testing.compatible-with-downcaster +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.contract-testing +--- +# Compatible with downcaster + +## Intent + +- outcome: Executable scenario "Compatible with downcaster" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-013-contract-violation-is-recorded.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-013-contract-violation-is-recorded.sdp.md new file mode 100644 index 00000000..81a183e4 --- /dev/null +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-013-contract-violation-is-recorded.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.contract-testing.contract-violation-is-recorded +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.contract-testing +--- +# Contract violation is recorded + +## Intent + +- outcome: Executable scenario "Contract violation is recorded" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-014-query-contract-violations.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-014-query-contract-violations.sdp.md new file mode 100644 index 00000000..060df1fe --- /dev/null +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-014-query-contract-violations.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.contract-testing.query-contract-violations +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.contract-testing +--- +# Query contract violations + +## Intent + +- outcome: Executable scenario "Query contract violations" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-015-query-violations-since-timestamp.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-015-query-violations-since-timestamp.sdp.md new file mode 100644 index 00000000..a924a356 --- /dev/null +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-015-query-violations-since-timestamp.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.contract-testing.query-violations-since-timestamp +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.contract-testing +--- +# Query violations since timestamp + +## Intent + +- outcome: Executable scenario "Query violations since timestamp" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-016-no-violations-returns-empty-array.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-016-no-violations-returns-empty-array.sdp.md new file mode 100644 index 00000000..f835c838 --- /dev/null +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-016-no-violations-returns-empty-array.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.contract-testing.no-violations-returns-empty-array +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.contract-testing +--- +# No violations returns empty array + +## Intent + +- outcome: Executable scenario "No violations returns empty array" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-001-upcast-v1-event-to-v2.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-001-upcast-v1-event-to-v2.sdp.md new file mode 100644 index 00000000..c553fbcb --- /dev/null +++ b/specs/behavior/platform-core/integration/event-versioning.examples/s-001-upcast-v1-event-to-v2.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.event-versioning.upcast-v1-event-to-v2 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.event-versioning +--- +# Upcast V1 event to V2 + +## Intent + +- outcome: Executable scenario "Upcast V1 event to V2" from packages/platform-core/tests/features/behavior/integration/event-versioning.feature diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-002-chain-upcasters-for-multiple-versions.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-002-chain-upcasters-for-multiple-versions.sdp.md new file mode 100644 index 00000000..a81c4bca --- /dev/null +++ b/specs/behavior/platform-core/integration/event-versioning.examples/s-002-chain-upcasters-for-multiple-versions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.event-versioning.chain-upcasters-for-multiple-versions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.event-versioning +--- +# Chain upcasters for multiple versions + +## Intent + +- outcome: Executable scenario "Chain upcasters for multiple versions" from packages/platform-core/tests/features/behavior/integration/event-versioning.feature diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-003-upcast-adds-computed-field.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-003-upcast-adds-computed-field.sdp.md new file mode 100644 index 00000000..def725b9 --- /dev/null +++ b/specs/behavior/platform-core/integration/event-versioning.examples/s-003-upcast-adds-computed-field.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.event-versioning.upcast-adds-computed-field +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.event-versioning +--- +# Upcast adds computed field + +## Intent + +- outcome: Executable scenario "Upcast adds computed field" from packages/platform-core/tests/features/behavior/integration/event-versioning.feature diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-004-downcast-v2-event-to-v1.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-004-downcast-v2-event-to-v1.sdp.md new file mode 100644 index 00000000..eebc43bf --- /dev/null +++ b/specs/behavior/platform-core/integration/event-versioning.examples/s-004-downcast-v2-event-to-v1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.event-versioning.downcast-v2-event-to-v1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.event-versioning +--- +# Downcast V2 event to V1 + +## Intent + +- outcome: Executable scenario "Downcast V2 event to V1" from packages/platform-core/tests/features/behavior/integration/event-versioning.feature diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-005-downcast-removes-required-in-new-field.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-005-downcast-removes-required-in-new-field.sdp.md new file mode 100644 index 00000000..ff03528a --- /dev/null +++ b/specs/behavior/platform-core/integration/event-versioning.examples/s-005-downcast-removes-required-in-new-field.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.event-versioning.downcast-removes-required-in-new-field +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.event-versioning +--- +# Downcast removes required-in-new field + +## Intent + +- outcome: Executable scenario "Downcast removes required-in-new field" from packages/platform-core/tests/features/behavior/integration/event-versioning.feature diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-006-register-schema-with-migration.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-006-register-schema-with-migration.sdp.md new file mode 100644 index 00000000..b7719ada --- /dev/null +++ b/specs/behavior/platform-core/integration/event-versioning.examples/s-006-register-schema-with-migration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.event-versioning.register-schema-with-migration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.event-versioning +--- +# Register schema with migration + +## Intent + +- outcome: Executable scenario "Register schema with migration" from packages/platform-core/tests/features/behavior/integration/event-versioning.feature diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-007-missing-migration-path.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-007-missing-migration-path.sdp.md new file mode 100644 index 00000000..6c7d31ba --- /dev/null +++ b/specs/behavior/platform-core/integration/event-versioning.examples/s-007-missing-migration-path.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.event-versioning.missing-migration-path +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.event-versioning +--- +# Missing migration path + +## Intent + +- outcome: Executable scenario "Missing migration path" from packages/platform-core/tests/features/behavior/integration/event-versioning.feature diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-008-breaking-change-without-migration.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-008-breaking-change-without-migration.sdp.md new file mode 100644 index 00000000..2e9fcd1a --- /dev/null +++ b/specs/behavior/platform-core/integration/event-versioning.examples/s-008-breaking-change-without-migration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.event-versioning.breaking-change-without-migration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.event-versioning +--- +# Breaking change without migration + +## Intent + +- outcome: Executable scenario "Breaking change without migration" from packages/platform-core/tests/features/behavior/integration/event-versioning.feature diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-009-detect-version-from-event-metadata.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-009-detect-version-from-event-metadata.sdp.md new file mode 100644 index 00000000..e1299ce8 --- /dev/null +++ b/specs/behavior/platform-core/integration/event-versioning.examples/s-009-detect-version-from-event-metadata.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.event-versioning.detect-version-from-event-metadata +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.event-versioning +--- +# Detect version from event metadata + +## Intent + +- outcome: Executable scenario "Detect version from event metadata" from packages/platform-core/tests/features/behavior/integration/event-versioning.feature diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-010-infer-version-from-payload-shape.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-010-infer-version-from-payload-shape.sdp.md new file mode 100644 index 00000000..19990635 --- /dev/null +++ b/specs/behavior/platform-core/integration/event-versioning.examples/s-010-infer-version-from-payload-shape.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.event-versioning.infer-version-from-payload-shape +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.event-versioning +--- +# Infer version from payload shape + +## Intent + +- outcome: Executable scenario "Infer version from payload shape" from packages/platform-core/tests/features/behavior/integration/event-versioning.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-001-create-publisher-with-empty-routes.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-001-create-publisher-with-empty-routes.sdp.md new file mode 100644 index 00000000..31cae8bf --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-001-create-publisher-with-empty-routes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.create-publisher-with-empty-routes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Create publisher with empty routes + +## Intent + +- outcome: Executable scenario "Create publisher with empty routes" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-002-create-publisher-with-one-route.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-002-create-publisher-with-one-route.sdp.md new file mode 100644 index 00000000..4b3c1fac --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-002-create-publisher-with-one-route.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.create-publisher-with-one-route +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Create publisher with one route + +## Intent + +- outcome: Executable scenario "Create publisher with one route" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-003-reject-duplicate-source-event-type-routes.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-003-reject-duplicate-source-event-type-routes.sdp.md new file mode 100644 index 00000000..42264246 --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-003-reject-duplicate-source-event-type-routes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.reject-duplicate-source-event-type-routes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Reject duplicate sourceEventType routes + +## Intent + +- outcome: Executable scenario "Reject duplicate sourceEventType routes" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-004-check-route-existence-for-registered-and-unregistered-types.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-004-check-route-existence-for-registered-and-unregistered-types.sdp.md new file mode 100644 index 00000000..e1605c4f --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-004-check-route-existence-for-registered-and-unregistered-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.check-route-existence-for-registered-and-unregistered-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Check route existence for registered and unregistered types + +## Intent + +- outcome: Executable scenario "Check route existence for registered and unregistered types" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-005-retrieve-all-registered-routes.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-005-retrieve-all-registered-routes.sdp.md new file mode 100644 index 00000000..76ba6c9f --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-005-retrieve-all-registered-routes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.retrieve-all-registered-routes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Retrieve all registered routes + +## Intent + +- outcome: Executable scenario "Retrieve all registered routes" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-006-return-null-when-no-route-matches.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-006-return-null-when-no-route-matches.sdp.md new file mode 100644 index 00000000..dc03b765 --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-006-return-null-when-no-route-matches.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.return-null-when-no-route-matches +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Return null when no route matches + +## Intent + +- outcome: Executable scenario "Return null when no route matches" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-007-translate-and-publish-a-domain-event.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-007-translate-and-publish-a-domain-event.sdp.md new file mode 100644 index 00000000..26532b9c --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-007-translate-and-publish-a-domain-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.translate-and-publish-a-domain-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Translate and publish a domain event + +## Intent + +- outcome: Executable scenario "Translate and publish a domain event" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-008-enqueue-multiple-handlers.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-008-enqueue-multiple-handlers.sdp.md new file mode 100644 index 00000000..def7f4bb --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-008-enqueue-multiple-handlers.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.enqueue-multiple-handlers +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Enqueue multiple handlers + +## Intent + +- outcome: Executable scenario "Enqueue multiple handlers" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-009-verify-integration-event-metadata-fields.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-009-verify-integration-event-metadata-fields.sdp.md new file mode 100644 index 00000000..073e7fcc --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-009-verify-integration-event-metadata-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.verify-integration-event-metadata-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Verify integration event metadata fields + +## Intent + +- outcome: Executable scenario "Verify integration event metadata fields" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-010-include-user-id-when-present-in-chain.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-010-include-user-id-when-present-in-chain.sdp.md new file mode 100644 index 00000000..45649d3c --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-010-include-user-id-when-present-in-chain.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.include-user-id-when-present-in-chain +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Include userId when present in chain + +## Intent + +- outcome: Executable scenario "Include userId when present in chain" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-011-omit-user-id-when-absent-from-chain.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-011-omit-user-id-when-absent-from-chain.sdp.md new file mode 100644 index 00000000..fd057bfb --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-011-omit-user-id-when-absent-from-chain.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.omit-user-id-when-absent-from-chain +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Omit userId when absent from chain + +## Intent + +- outcome: Executable scenario "Omit userId when absent from chain" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-012-pass-on-complete-handler-to-workpool.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-012-pass-on-complete-handler-to-workpool.sdp.md new file mode 100644 index 00000000..96435325 --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-012-pass-on-complete-handler-to-workpool.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.pass-on-complete-handler-to-workpool +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Pass onComplete handler to workpool + +## Intent + +- outcome: Executable scenario "Pass onComplete handler to workpool" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-013-propagate-translator-error.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-013-propagate-translator-error.sdp.md new file mode 100644 index 00000000..3dfafe56 --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-013-propagate-translator-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.propagate-translator-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Propagate translator error + +## Intent + +- outcome: Executable scenario "Propagate translator error" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-014-verify-workpool-context-fields.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-014-verify-workpool-context-fields.sdp.md new file mode 100644 index 00000000..d2e0f71e --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-014-verify-workpool-context-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.verify-workpool-context-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Verify workpool context fields + +## Intent + +- outcome: Executable scenario "Verify workpool context fields" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-015-build-a-route-with-all-required-fields.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-015-build-a-route-with-all-required-fields.sdp.md new file mode 100644 index 00000000..a4fa265e --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-015-build-a-route-with-all-required-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.build-a-route-with-all-required-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Build a route with all required fields + +## Intent + +- outcome: Executable scenario "Build a route with all required fields" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-016-set-schema-version-via-version-method.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-016-set-schema-version-via-version-method.sdp.md new file mode 100644 index 00000000..d5837e89 --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-016-set-schema-version-via-version-method.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.set-schema-version-via-version-method +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Set schema version via version method + +## Intent + +- outcome: Executable scenario "Set schema version via version method" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-017-pass-multiple-handlers-to-notify.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-017-pass-multiple-handlers-to-notify.sdp.md new file mode 100644 index 00000000..30511ff3 --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-017-pass-multiple-handlers-to-notify.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.pass-multiple-handlers-to-notify +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Pass multiple handlers to notify + +## Intent + +- outcome: Executable scenario "Pass multiple handlers to notify" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-018-translator-function-transforms-source-event.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-018-translator-function-transforms-source-event.sdp.md new file mode 100644 index 00000000..c75f37c5 --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-018-translator-function-transforms-source-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.translator-function-transforms-source-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Translator function transforms source event + +## Intent + +- outcome: Executable scenario "Translator function transforms source event" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-019-reject-missing-source-event-type.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-019-reject-missing-source-event-type.sdp.md new file mode 100644 index 00000000..4b038730 --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-019-reject-missing-source-event-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.reject-missing-source-event-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Reject missing source event type + +## Intent + +- outcome: Executable scenario "Reject missing source event type" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-020-reject-missing-target-event-type.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-020-reject-missing-target-event-type.sdp.md new file mode 100644 index 00000000..b0ed5edd --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-020-reject-missing-target-event-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.reject-missing-target-event-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Reject missing target event type + +## Intent + +- outcome: Executable scenario "Reject missing target event type" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-021-reject-missing-translator.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-021-reject-missing-translator.sdp.md new file mode 100644 index 00000000..ad0966c2 --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-021-reject-missing-translator.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.reject-missing-translator +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Reject missing translator + +## Intent + +- outcome: Executable scenario "Reject missing translator" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-022-reject-missing-handlers.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-022-reject-missing-handlers.sdp.md new file mode 100644 index 00000000..223c7af6 --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-022-reject-missing-handlers.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.reject-missing-handlers +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Reject missing handlers + +## Intent + +- outcome: Executable scenario "Reject missing handlers" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-023-build-route-via-define-integration-route-factory.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-023-build-route-via-define-integration-route-factory.sdp.md new file mode 100644 index 00000000..ad8b2497 --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-023-build-route-via-define-integration-route-factory.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.build-route-via-define-integration-route-factory +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Build route via defineIntegrationRoute factory + +## Intent + +- outcome: Executable scenario "Build route via defineIntegrationRoute factory" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-024-create-publisher-via-factory-function.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-024-create-publisher-via-factory-function.sdp.md new file mode 100644 index 00000000..5079f399 --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-024-create-publisher-via-factory-function.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.create-publisher-via-factory-function +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Create publisher via factory function + +## Intent + +- outcome: Executable scenario "Create publisher via factory function" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-025-verify-integration-route-error-properties.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-025-verify-integration-route-error-properties.sdp.md new file mode 100644 index 00000000..6ea1b6ef --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-025-verify-integration-route-error-properties.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.verify-integration-route-error-properties +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Verify IntegrationRouteError properties + +## Intent + +- outcome: Executable scenario "Verify IntegrationRouteError properties" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-026-verify-integration-route-error-with-context.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-026-verify-integration-route-error-with-context.sdp.md new file mode 100644 index 00000000..96a01624 --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-026-verify-integration-route-error-with-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.verify-integration-route-error-with-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Verify IntegrationRouteError with context + +## Intent + +- outcome: Executable scenario "Verify IntegrationRouteError with context" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-027-verify-integration-route-error-instanceof-chain.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-027-verify-integration-route-error-instanceof-chain.sdp.md new file mode 100644 index 00000000..10d8e39e --- /dev/null +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-027-verify-integration-route-error-instanceof-chain.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.integration-event-publisher.verify-integration-route-error-instanceof-chain +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.integration-event-publisher +--- +# Verify IntegrationRouteError instanceof chain + +## Intent + +- outcome: Executable scenario "Verify IntegrationRouteError instanceof chain" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-001-register-integration-event-schema.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-001-register-integration-event-schema.sdp.md new file mode 100644 index 00000000..bf7b2cfb --- /dev/null +++ b/specs/behavior/platform-core/integration/published-language.examples/s-001-register-integration-event-schema.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.published-language.register-integration-event-schema +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.published-language +--- +# Register integration event schema + +## Intent + +- outcome: Executable scenario "Register integration event schema" from packages/platform-core/tests/features/behavior/integration/published-language.feature diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-002-register-multiple-versions.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-002-register-multiple-versions.sdp.md new file mode 100644 index 00000000..e8f54fe2 --- /dev/null +++ b/specs/behavior/platform-core/integration/published-language.examples/s-002-register-multiple-versions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.published-language.register-multiple-versions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.published-language +--- +# Register multiple versions + +## Intent + +- outcome: Executable scenario "Register multiple versions" from packages/platform-core/tests/features/behavior/integration/published-language.feature diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-003-duplicate-version-is-rejected.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-003-duplicate-version-is-rejected.sdp.md new file mode 100644 index 00000000..5995a9f8 --- /dev/null +++ b/specs/behavior/platform-core/integration/published-language.examples/s-003-duplicate-version-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.published-language.duplicate-version-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.published-language +--- +# Duplicate version is rejected + +## Intent + +- outcome: Executable scenario "Duplicate version is rejected" from packages/platform-core/tests/features/behavior/integration/published-language.feature diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-004-convert-domain-event-to-integration-event.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-004-convert-domain-event-to-integration-event.sdp.md new file mode 100644 index 00000000..5252e452 --- /dev/null +++ b/specs/behavior/platform-core/integration/published-language.examples/s-004-convert-domain-event-to-integration-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.published-language.convert-domain-event-to-integration-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.published-language +--- +# Convert domain event to integration event + +## Intent + +- outcome: Executable scenario "Convert domain event to integration event" from packages/platform-core/tests/features/behavior/integration/published-language.feature diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-005-convert-with-explicit-version.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-005-convert-with-explicit-version.sdp.md new file mode 100644 index 00000000..2f06bf1c --- /dev/null +++ b/specs/behavior/platform-core/integration/published-language.examples/s-005-convert-with-explicit-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.published-language.convert-with-explicit-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.published-language +--- +# Convert with explicit version + +## Intent + +- outcome: Executable scenario "Convert with explicit version" from packages/platform-core/tests/features/behavior/integration/published-language.feature diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-006-unregistered-event-type-fails.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-006-unregistered-event-type-fails.sdp.md new file mode 100644 index 00000000..e170a08d --- /dev/null +++ b/specs/behavior/platform-core/integration/published-language.examples/s-006-unregistered-event-type-fails.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.published-language.unregistered-event-type-fails +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.published-language +--- +# Unregistered event type fails + +## Intent + +- outcome: Executable scenario "Unregistered event type fails" from packages/platform-core/tests/features/behavior/integration/published-language.feature diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-007-invalid-payload-fails-schema-validation.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-007-invalid-payload-fails-schema-validation.sdp.md new file mode 100644 index 00000000..3e290950 --- /dev/null +++ b/specs/behavior/platform-core/integration/published-language.examples/s-007-invalid-payload-fails-schema-validation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.published-language.invalid-payload-fails-schema-validation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.published-language +--- +# Invalid payload fails schema validation + +## Intent + +- outcome: Executable scenario "Invalid payload fails schema validation" from packages/platform-core/tests/features/behavior/integration/published-language.feature diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-008-event-tagging-for-routing-and-dcb.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-008-event-tagging-for-routing-and-dcb.sdp.md new file mode 100644 index 00000000..973de076 --- /dev/null +++ b/specs/behavior/platform-core/integration/published-language.examples/s-008-event-tagging-for-routing-and-dcb.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.published-language.event-tagging-for-routing-and-dcb +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.published-language +--- +# Event tagging for routing and DCB + +## Intent + +- outcome: Executable scenario "Event tagging for routing and DCB" from packages/platform-core/tests/features/behavior/integration/published-language.feature diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-009-multiple-tags-for-routing.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-009-multiple-tags-for-routing.sdp.md new file mode 100644 index 00000000..76b096ce --- /dev/null +++ b/specs/behavior/platform-core/integration/published-language.examples/s-009-multiple-tags-for-routing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.published-language.multiple-tags-for-routing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.published-language +--- +# Multiple tags for routing + +## Intent + +- outcome: Executable scenario "Multiple tags for routing" from packages/platform-core/tests/features/behavior/integration/published-language.feature diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-010-register-schema-with-compatibility-mode.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-010-register-schema-with-compatibility-mode.sdp.md new file mode 100644 index 00000000..fe5fccea --- /dev/null +++ b/specs/behavior/platform-core/integration/published-language.examples/s-010-register-schema-with-compatibility-mode.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.published-language.register-schema-with-compatibility-mode +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.published-language +--- +# Register schema with compatibility mode + +## Intent + +- outcome: Executable scenario "Register schema with compatibility mode" from packages/platform-core/tests/features/behavior/integration/published-language.feature diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-011-query-schema-compatibility-mode.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-011-query-schema-compatibility-mode.sdp.md new file mode 100644 index 00000000..3e0f1af5 --- /dev/null +++ b/specs/behavior/platform-core/integration/published-language.examples/s-011-query-schema-compatibility-mode.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.published-language.query-schema-compatibility-mode +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.published-language +--- +# Query schema compatibility mode + +## Intent + +- outcome: Executable scenario "Query schema compatibility mode" from packages/platform-core/tests/features/behavior/integration/published-language.feature diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-012-list-all-event-types.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-012-list-all-event-types.sdp.md new file mode 100644 index 00000000..c23e2b89 --- /dev/null +++ b/specs/behavior/platform-core/integration/published-language.examples/s-012-list-all-event-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.published-language.list-all-event-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.published-language +--- +# List all event types + +## Intent + +- outcome: Executable scenario "List all event types" from packages/platform-core/tests/features/behavior/integration/published-language.feature diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-013-list-versions-for-event-type.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-013-list-versions-for-event-type.sdp.md new file mode 100644 index 00000000..194ab028 --- /dev/null +++ b/specs/behavior/platform-core/integration/published-language.examples/s-013-list-versions-for-event-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.integration.published-language.list-versions-for-event-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.integration.published-language +--- +# List versions for event type + +## Intent + +- outcome: Executable scenario "List versions for event type" from packages/platform-core/tests/features/behavior/integration/published-language.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-001-set-contains-all-provided-invariants.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-001-set-contains-all-provided-invariants.sdp.md new file mode 100644 index 00000000..4ba06264 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-001-set-contains-all-provided-invariants.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant-set.set-contains-all-provided-invariants +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant-set +--- +# Set contains all provided invariants + +## Intent + +- outcome: Executable scenario "Set contains all provided invariants" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-002-invariants-array-is-immutable-and-a-frozen-copy.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-002-invariants-array-is-immutable-and-a-frozen-copy.sdp.md new file mode 100644 index 00000000..1c198f45 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-002-invariants-array-is-immutable-and-a-frozen-copy.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant-set.invariants-array-is-immutable-and-a-frozen-copy +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant-set +--- +# Invariants array is immutable and a frozen copy + +## Intent + +- outcome: Executable scenario "Invariants array is immutable and a frozen copy" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-003-check-all-returns-true-when-all-invariants-pass.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-003-check-all-returns-true-when-all-invariants-pass.sdp.md new file mode 100644 index 00000000..4ac036f3 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-003-check-all-returns-true-when-all-invariants-pass.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant-set.check-all-returns-true-when-all-invariants-pass +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant-set +--- +# checkAll returns true when all invariants pass + +## Intent + +- outcome: Executable scenario "checkAll returns true when all invariants pass" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-004-check-all-returns-false-when-first-invariant-fails.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-004-check-all-returns-false-when-first-invariant-fails.sdp.md new file mode 100644 index 00000000..3ffd756c --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-004-check-all-returns-false-when-first-invariant-fails.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant-set.check-all-returns-false-when-first-invariant-fails +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant-set +--- +# checkAll returns false when first invariant fails + +## Intent + +- outcome: Executable scenario "checkAll returns false when first invariant fails" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-005-check-all-returns-false-when-second-invariant-fails.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-005-check-all-returns-false-when-second-invariant-fails.sdp.md new file mode 100644 index 00000000..3328b974 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-005-check-all-returns-false-when-second-invariant-fails.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant-set.check-all-returns-false-when-second-invariant-fails +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant-set +--- +# checkAll returns false when second invariant fails + +## Intent + +- outcome: Executable scenario "checkAll returns false when second invariant fails" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-006-check-all-returns-false-when-all-invariants-fail.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-006-check-all-returns-false-when-all-invariants-fail.sdp.md new file mode 100644 index 00000000..f6194ca4 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-006-check-all-returns-false-when-all-invariants-fail.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant-set.check-all-returns-false-when-all-invariants-fail +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant-set +--- +# checkAll returns false when all invariants fail + +## Intent + +- outcome: Executable scenario "checkAll returns false when all invariants fail" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-007-assert-all-does-not-throw-when-all-invariants-pass.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-007-assert-all-does-not-throw-when-all-invariants-pass.sdp.md new file mode 100644 index 00000000..986bf367 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-007-assert-all-does-not-throw-when-all-invariants-pass.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant-set.assert-all-does-not-throw-when-all-invariants-pass +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant-set +--- +# assertAll does not throw when all invariants pass + +## Intent + +- outcome: Executable scenario "assertAll does not throw when all invariants pass" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-008-assert-all-throws-on-first-failure-with-fail-fast.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-008-assert-all-throws-on-first-failure-with-fail-fast.sdp.md new file mode 100644 index 00000000..e6be5e8f --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-008-assert-all-throws-on-first-failure-with-fail-fast.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant-set.assert-all-throws-on-first-failure-with-fail-fast +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant-set +--- +# assertAll throws on first failure with fail-fast + +## Intent + +- outcome: Executable scenario "assertAll throws on first failure with fail-fast" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-009-assert-all-throws-correct-error-class.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-009-assert-all-throws-correct-error-class.sdp.md new file mode 100644 index 00000000..1215fc04 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-009-assert-all-throws-correct-error-class.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant-set.assert-all-throws-correct-error-class +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant-set +--- +# assertAll throws correct error class + +## Intent + +- outcome: Executable scenario "assertAll throws correct error class" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-010-assert-all-throws-error-with-context-when-provided.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-010-assert-all-throws-error-with-context-when-provided.sdp.md new file mode 100644 index 00000000..4f2f5c29 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-010-assert-all-throws-error-with-context-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant-set.assert-all-throws-error-with-context-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant-set +--- +# assertAll throws error with context when provided + +## Intent + +- outcome: Executable scenario "assertAll throws error with context when provided" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-011-validate-all-returns-valid-when-all-invariants-pass.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-011-validate-all-returns-valid-when-all-invariants-pass.sdp.md new file mode 100644 index 00000000..6f8a5517 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-011-validate-all-returns-valid-when-all-invariants-pass.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant-set.validate-all-returns-valid-when-all-invariants-pass +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant-set +--- +# validateAll returns valid when all invariants pass + +## Intent + +- outcome: Executable scenario "validateAll returns valid when all invariants pass" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-012-validate-all-collects-single-violation.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-012-validate-all-collects-single-violation.sdp.md new file mode 100644 index 00000000..98e4dc23 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-012-validate-all-collects-single-violation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant-set.validate-all-collects-single-violation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant-set +--- +# validateAll collects single violation + +## Intent + +- outcome: Executable scenario "validateAll collects single violation" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-013-validate-all-collects-multiple-violations-without-short-circuiting.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-013-validate-all-collects-multiple-violations-without-short-circuiting.sdp.md new file mode 100644 index 00000000..27a7367d --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-013-validate-all-collects-multiple-violations-without-short-circuiting.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant-set.validate-all-collects-multiple-violations-without-short-circuiting +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant-set +--- +# validateAll collects multiple violations without short-circuiting + +## Intent + +- outcome: Executable scenario "validateAll collects multiple violations without short-circuiting" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-014-validate-all-collects-violations-from-non-adjacent-invariants.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-014-validate-all-collects-violations-from-non-adjacent-invariants.sdp.md new file mode 100644 index 00000000..afd3dbc3 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-014-validate-all-collects-violations-from-non-adjacent-invariants.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant-set.validate-all-collects-violations-from-non-adjacent-invariants +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant-set +--- +# validateAll collects violations from non-adjacent invariants + +## Intent + +- outcome: Executable scenario "validateAll collects violations from non-adjacent invariants" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-015-validate-all-omits-context-when-invariant-has-no-context-function.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-015-validate-all-omits-context-when-invariant-has-no-context-function.sdp.md new file mode 100644 index 00000000..4e4056a8 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-015-validate-all-omits-context-when-invariant-has-no-context-function.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant-set.validate-all-omits-context-when-invariant-has-no-context-function +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant-set +--- +# validateAll omits context when invariant has no context function + +## Intent + +- outcome: Executable scenario "validateAll omits context when invariant has no context function" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-016-empty-set-passes-all-operations.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-016-empty-set-passes-all-operations.sdp.md new file mode 100644 index 00000000..1b7a3895 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-016-empty-set-passes-all-operations.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant-set.empty-set-passes-all-operations +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant-set +--- +# Empty set passes all operations + +## Intent + +- outcome: Executable scenario "Empty set passes all operations" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-017-single-invariant-set-passes-all-operations-with-valid-state.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-017-single-invariant-set-passes-all-operations-with-valid-state.sdp.md new file mode 100644 index 00000000..9ac55e47 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-017-single-invariant-set-passes-all-operations-with-valid-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant-set.single-invariant-set-passes-all-operations-with-valid-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant-set +--- +# Single invariant set passes all operations with valid state + +## Intent + +- outcome: Executable scenario "Single invariant set passes all operations with valid state" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-001-invariant-has-correct-name-and-code.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-001-invariant-has-correct-name-and-code.sdp.md new file mode 100644 index 00000000..e24fc3ba --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-001-invariant-has-correct-name-and-code.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant.invariant-has-correct-name-and-code +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant +--- +# Invariant has correct name and code + +## Intent + +- outcome: Executable scenario "Invariant has correct name and code" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-002-check-returns-true-when-state-satisfies-the-predicate.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-002-check-returns-true-when-state-satisfies-the-predicate.sdp.md new file mode 100644 index 00000000..6e893b51 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-002-check-returns-true-when-state-satisfies-the-predicate.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant.check-returns-true-when-state-satisfies-the-predicate +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant +--- +# check returns true when state satisfies the predicate + +## Intent + +- outcome: Executable scenario "check returns true when state satisfies the predicate" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-003-check-returns-false-when-state-violates-the-predicate.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-003-check-returns-false-when-state-violates-the-predicate.sdp.md new file mode 100644 index 00000000..c406d4f8 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-003-check-returns-false-when-state-violates-the-predicate.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant.check-returns-false-when-state-violates-the-predicate +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant +--- +# check returns false when state violates the predicate + +## Intent + +- outcome: Executable scenario "check returns false when state violates the predicate" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-004-assert-does-not-throw-when-state-is-valid.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-004-assert-does-not-throw-when-state-is-valid.sdp.md new file mode 100644 index 00000000..51179f10 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-004-assert-does-not-throw-when-state-is-valid.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant.assert-does-not-throw-when-state-is-valid +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant +--- +# assert does not throw when state is valid + +## Intent + +- outcome: Executable scenario "assert does not throw when state is valid" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-005-assert-throws-invariant-error-when-state-is-invalid.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-005-assert-throws-invariant-error-when-state-is-invalid.sdp.md new file mode 100644 index 00000000..1d6ffd0c --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-005-assert-throws-invariant-error-when-state-is-invalid.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant.assert-throws-invariant-error-when-state-is-invalid +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant +--- +# assert throws InvariantError when state is invalid + +## Intent + +- outcome: Executable scenario "assert throws InvariantError when state is invalid" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-006-assert-error-has-correct-code-for-invalid-state.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-006-assert-error-has-correct-code-for-invalid-state.sdp.md new file mode 100644 index 00000000..cda75f8a --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-006-assert-error-has-correct-code-for-invalid-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant.assert-error-has-correct-code-for-invalid-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant +--- +# assert error has correct code for invalid state + +## Intent + +- outcome: Executable scenario "assert error has correct code for invalid state" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-007-assert-error-has-correct-message-for-invalid-state.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-007-assert-error-has-correct-message-for-invalid-state.sdp.md new file mode 100644 index 00000000..981c9b5e --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-007-assert-error-has-correct-message-for-invalid-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant.assert-error-has-correct-message-for-invalid-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant +--- +# assert error has correct message for invalid state + +## Intent + +- outcome: Executable scenario "assert error has correct message for invalid state" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-008-assert-error-has-correct-context-for-invalid-state.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-008-assert-error-has-correct-context-for-invalid-state.sdp.md new file mode 100644 index 00000000..6b0b5f61 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-008-assert-error-has-correct-context-for-invalid-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant.assert-error-has-correct-context-for-invalid-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant +--- +# assert error has correct context for invalid state + +## Intent + +- outcome: Executable scenario "assert error has correct context for invalid state" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-009-validate-returns-valid-result-for-valid-state.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-009-validate-returns-valid-result-for-valid-state.sdp.md new file mode 100644 index 00000000..e181b8ea --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-009-validate-returns-valid-result-for-valid-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant.validate-returns-valid-result-for-valid-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant +--- +# validate returns valid result for valid state + +## Intent + +- outcome: Executable scenario "validate returns valid result for valid state" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-010-validate-returns-violation-details-for-invalid-state.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-010-validate-returns-violation-details-for-invalid-state.sdp.md new file mode 100644 index 00000000..71f02ca1 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-010-validate-returns-violation-details-for-invalid-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant.validate-returns-violation-details-for-invalid-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant +--- +# validate returns violation details for invalid state + +## Intent + +- outcome: Executable scenario "validate returns violation details for invalid state" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-011-assert-error-has-undefined-context-when-no-context-function.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-011-assert-error-has-undefined-context-when-no-context-function.sdp.md new file mode 100644 index 00000000..29b8f88f --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-011-assert-error-has-undefined-context-when-no-context-function.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant.assert-error-has-undefined-context-when-no-context-function +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant +--- +# assert error has undefined context when no context function + +## Intent + +- outcome: Executable scenario "assert error has undefined context when no context function" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-012-validate-result-has-undefined-context-when-no-context-function.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-012-validate-result-has-undefined-context-when-no-context-function.sdp.md new file mode 100644 index 00000000..fbb8133c --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-012-validate-result-has-undefined-context-when-no-context-function.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant.validate-result-has-undefined-context-when-no-context-function +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant +--- +# validate result has undefined context when no context function + +## Intent + +- outcome: Executable scenario "validate result has undefined context when no context function" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-013-check-uses-parameter-to-find-matching-item.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-013-check-uses-parameter-to-find-matching-item.sdp.md new file mode 100644 index 00000000..6350c3a3 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-013-check-uses-parameter-to-find-matching-item.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant.check-uses-parameter-to-find-matching-item +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant +--- +# check uses parameter to find matching item + +## Intent + +- outcome: Executable scenario "check uses parameter to find matching item" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-014-check-returns-false-when-parameter-does-not-match.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-014-check-returns-false-when-parameter-does-not-match.sdp.md new file mode 100644 index 00000000..b66eb07e --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-014-check-returns-false-when-parameter-does-not-match.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant.check-returns-false-when-parameter-does-not-match +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant +--- +# check returns false when parameter does not match + +## Intent + +- outcome: Executable scenario "check returns false when parameter does not match" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-015-assert-uses-parameter-in-error-message-and-context.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-015-assert-uses-parameter-in-error-message-and-context.sdp.md new file mode 100644 index 00000000..d9441436 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-015-assert-uses-parameter-in-error-message-and-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant.assert-uses-parameter-in-error-message-and-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant +--- +# assert uses parameter in error message and context + +## Intent + +- outcome: Executable scenario "assert uses parameter in error message and context" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-016-validate-uses-parameter-in-result.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-016-validate-uses-parameter-in-result.sdp.md new file mode 100644 index 00000000..0fa750ed --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-016-validate-uses-parameter-in-result.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant.validate-uses-parameter-in-result +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant +--- +# validate uses parameter in result + +## Intent + +- outcome: Executable scenario "validate uses parameter in result" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-017-assert-throws-error-of-the-correct-custom-class.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-017-assert-throws-error-of-the-correct-custom-class.sdp.md new file mode 100644 index 00000000..a294df62 --- /dev/null +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-017-assert-throws-error-of-the-correct-custom-class.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.create-invariant.assert-throws-error-of-the-correct-custom-class +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.create-invariant +--- +# assert throws error of the correct custom class + +## Intent + +- outcome: Executable scenario "assert throws error of the correct custom class" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-001-creating-an-error-with-code-and-message.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-001-creating-an-error-with-code-and-message.sdp.md new file mode 100644 index 00000000..d80ffa52 --- /dev/null +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-001-creating-an-error-with-code-and-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.invariant-error.creating-an-error-with-code-and-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.invariant-error +--- +# Creating an error with code and message + +## Intent + +- outcome: Executable scenario "Creating an error with code and message" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-002-including-context-when-provided.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-002-including-context-when-provided.sdp.md new file mode 100644 index 00000000..ec18c6a7 --- /dev/null +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-002-including-context-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.invariant-error.including-context-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.invariant-error +--- +# Including context when provided + +## Intent + +- outcome: Executable scenario "Including context when provided" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-003-context-is-undefined-when-not-provided.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-003-context-is-undefined-when-not-provided.sdp.md new file mode 100644 index 00000000..6ba9ace8 --- /dev/null +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-003-context-is-undefined-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.invariant-error.context-is-undefined-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.invariant-error +--- +# Context is undefined when not provided + +## Intent + +- outcome: Executable scenario "Context is undefined when not provided" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-004-error-has-proper-stack-trace.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-004-error-has-proper-stack-trace.sdp.md new file mode 100644 index 00000000..67337435 --- /dev/null +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-004-error-has-proper-stack-trace.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.invariant-error.error-has-proper-stack-trace +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.invariant-error +--- +# Error has proper stack trace + +## Intent + +- outcome: Executable scenario "Error has proper stack trace" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-005-creating-a-context-specific-error-class.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-005-creating-a-context-specific-error-class.sdp.md new file mode 100644 index 00000000..562d188d --- /dev/null +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-005-creating-a-context-specific-error-class.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.invariant-error.creating-a-context-specific-error-class +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.invariant-error +--- +# Creating a context-specific error class + +## Intent + +- outcome: Executable scenario "Creating a context-specific error class" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-006-different-contexts-produce-different-classes.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-006-different-contexts-produce-different-classes.sdp.md new file mode 100644 index 00000000..3cb094fd --- /dev/null +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-006-different-contexts-produce-different-classes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.invariant-error.different-contexts-produce-different-classes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.invariant-error +--- +# Different contexts produce different classes + +## Intent + +- outcome: Executable scenario "Different contexts produce different classes" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-007-typed-error-codes-are-supported.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-007-typed-error-codes-are-supported.sdp.md new file mode 100644 index 00000000..df41edb9 --- /dev/null +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-007-typed-error-codes-are-supported.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.invariant-error.typed-error-codes-are-supported +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.invariant-error +--- +# Typed error codes are supported + +## Intent + +- outcome: Executable scenario "Typed error codes are supported" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-008-context-specific-errors-include-context-data.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-008-context-specific-errors-include-context-data.sdp.md new file mode 100644 index 00000000..86136c83 --- /dev/null +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-008-context-specific-errors-include-context-data.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.invariant-error.context-specific-errors-include-context-data +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.invariant-error +--- +# Context-specific errors include context data + +## Intent + +- outcome: Executable scenario "Context-specific errors include context data" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-009-context-specific-class-has-proper-constructor-name.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-009-context-specific-class-has-proper-constructor-name.sdp.md new file mode 100644 index 00000000..2994efc7 --- /dev/null +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-009-context-specific-class-has-proper-constructor-name.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.invariant-error.context-specific-class-has-proper-constructor-name +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.invariant-error +--- +# Context-specific class has proper constructor name + +## Intent + +- outcome: Executable scenario "Context-specific class has proper constructor name" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-010-returns-true-for-invariant-error-instances.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-010-returns-true-for-invariant-error-instances.sdp.md new file mode 100644 index 00000000..c1bc6677 --- /dev/null +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-010-returns-true-for-invariant-error-instances.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.invariant-error.returns-true-for-invariant-error-instances +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.invariant-error +--- +# Returns true for InvariantError instances + +## Intent + +- outcome: Executable scenario "Returns true for InvariantError instances" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-011-returns-true-for-context-specific-error-instances.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-011-returns-true-for-context-specific-error-instances.sdp.md new file mode 100644 index 00000000..e8731154 --- /dev/null +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-011-returns-true-for-context-specific-error-instances.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.invariant-error.returns-true-for-context-specific-error-instances +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.invariant-error +--- +# Returns true for context-specific error instances + +## Intent + +- outcome: Executable scenario "Returns true for context-specific error instances" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-012-returns-false-for-regular-error-instances.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-012-returns-false-for-regular-error-instances.sdp.md new file mode 100644 index 00000000..e5a37c5a --- /dev/null +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-012-returns-false-for-regular-error-instances.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.invariant-error.returns-false-for-regular-error-instances +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.invariant-error +--- +# Returns false for regular Error instances + +## Intent + +- outcome: Executable scenario "Returns false for regular Error instances" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-013-returns-false-for-non-error-values.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-013-returns-false-for-non-error-values.sdp.md new file mode 100644 index 00000000..2307103d --- /dev/null +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-013-returns-false-for-non-error-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.invariant-error.returns-false-for-non-error-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.invariant-error +--- +# Returns false for non-error values + +## Intent + +- outcome: Executable scenario "Returns false for non-error values" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-014-returns-true-when-error-has-the-specified-code.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-014-returns-true-when-error-has-the-specified-code.sdp.md new file mode 100644 index 00000000..39b0ad93 --- /dev/null +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-014-returns-true-when-error-has-the-specified-code.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.invariant-error.returns-true-when-error-has-the-specified-code +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.invariant-error +--- +# Returns true when error has the specified code + +## Intent + +- outcome: Executable scenario "Returns true when error has the specified code" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-015-returns-false-when-error-has-a-different-code.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-015-returns-false-when-error-has-a-different-code.sdp.md new file mode 100644 index 00000000..18e6b58a --- /dev/null +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-015-returns-false-when-error-has-a-different-code.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.invariant-error.returns-false-when-error-has-a-different-code +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.invariant-error +--- +# Returns false when error has a different code + +## Intent + +- outcome: Executable scenario "Returns false when error has a different code" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-016-returns-false-for-non-invariant-error-values.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-016-returns-false-for-non-invariant-error-values.sdp.md new file mode 100644 index 00000000..2ff9ff32 --- /dev/null +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-016-returns-false-for-non-invariant-error-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.invariant-error.returns-false-for-non-invariant-error-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.invariant-error +--- +# Returns false for non-InvariantError values + +## Intent + +- outcome: Executable scenario "Returns false for non-InvariantError values" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-017-works-with-context-specific-errors.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-017-works-with-context-specific-errors.sdp.md new file mode 100644 index 00000000..db9c2a70 --- /dev/null +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-017-works-with-context-specific-errors.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.invariants.invariant-error.works-with-context-specific-errors +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.invariants.invariant-error +--- +# Works with context-specific errors + +## Intent + +- outcome: Executable scenario "Works with context-specific errors" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature diff --git a/specs/behavior/platform-core/logging/commands.examples/s-001-command-start-is-logged-at-info-level.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-001-command-start-is-logged-at-info-level.sdp.md new file mode 100644 index 00000000..ff7ab324 --- /dev/null +++ b/specs/behavior/platform-core/logging/commands.examples/s-001-command-start-is-logged-at-info-level.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.commands.command-start-is-logged-at-info-level +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.commands +--- +# Command start is logged at INFO level + +## Intent + +- outcome: Executable scenario "Command start is logged at INFO level" from packages/platform-core/tests/features/behavior/logging/commands.feature diff --git a/specs/behavior/platform-core/logging/commands.examples/s-002-entity-specific-fields-are-included-in-start-log-data.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-002-entity-specific-fields-are-included-in-start-log-data.sdp.md new file mode 100644 index 00000000..64db861d --- /dev/null +++ b/specs/behavior/platform-core/logging/commands.examples/s-002-entity-specific-fields-are-included-in-start-log-data.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.commands.entity-specific-fields-are-included-in-start-log-data +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.commands +--- +# Entity-specific fields are included in start log data + +## Intent + +- outcome: Executable scenario "Entity-specific fields are included in start log data" from packages/platform-core/tests/features/behavior/logging/commands.feature diff --git a/specs/behavior/platform-core/logging/commands.examples/s-003-command-success-is-logged-at-info-level-with-result.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-003-command-success-is-logged-at-info-level-with-result.sdp.md new file mode 100644 index 00000000..d73d46bd --- /dev/null +++ b/specs/behavior/platform-core/logging/commands.examples/s-003-command-success-is-logged-at-info-level-with-result.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.commands.command-success-is-logged-at-info-level-with-result +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.commands +--- +# Command success is logged at INFO level with result + +## Intent + +- outcome: Executable scenario "Command success is logged at INFO level with result" from packages/platform-core/tests/features/behavior/logging/commands.feature diff --git a/specs/behavior/platform-core/logging/commands.examples/s-004-context-fields-are-preserved-alongside-result-fields.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-004-context-fields-are-preserved-alongside-result-fields.sdp.md new file mode 100644 index 00000000..963750e6 --- /dev/null +++ b/specs/behavior/platform-core/logging/commands.examples/s-004-context-fields-are-preserved-alongside-result-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.commands.context-fields-are-preserved-alongside-result-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.commands +--- +# Context fields are preserved alongside result fields + +## Intent + +- outcome: Executable scenario "Context fields are preserved alongside result fields" from packages/platform-core/tests/features/behavior/logging/commands.feature diff --git a/specs/behavior/platform-core/logging/commands.examples/s-005-command-rejection-is-logged-at-warn-level.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-005-command-rejection-is-logged-at-warn-level.sdp.md new file mode 100644 index 00000000..0cddca4a --- /dev/null +++ b/specs/behavior/platform-core/logging/commands.examples/s-005-command-rejection-is-logged-at-warn-level.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.commands.command-rejection-is-logged-at-warn-level +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.commands +--- +# Command rejection is logged at WARN level + +## Intent + +- outcome: Executable scenario "Command rejection is logged at WARN level" from packages/platform-core/tests/features/behavior/logging/commands.feature diff --git a/specs/behavior/platform-core/logging/commands.examples/s-006-rejection-uses-prefixed-field-names-not-raw-code-message.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-006-rejection-uses-prefixed-field-names-not-raw-code-message.sdp.md new file mode 100644 index 00000000..4ea3b810 --- /dev/null +++ b/specs/behavior/platform-core/logging/commands.examples/s-006-rejection-uses-prefixed-field-names-not-raw-code-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.commands.rejection-uses-prefixed-field-names-not-raw-code-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.commands +--- +# Rejection uses prefixed field names not raw code/message + +## Intent + +- outcome: Executable scenario "Rejection uses prefixed field names not raw code/message" from packages/platform-core/tests/features/behavior/logging/commands.feature diff --git a/specs/behavior/platform-core/logging/commands.examples/s-007-business-failure-is-logged-at-warn-level.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-007-business-failure-is-logged-at-warn-level.sdp.md new file mode 100644 index 00000000..d8310e6d --- /dev/null +++ b/specs/behavior/platform-core/logging/commands.examples/s-007-business-failure-is-logged-at-warn-level.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.commands.business-failure-is-logged-at-warn-level +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.commands +--- +# Business failure is logged at WARN level + +## Intent + +- outcome: Executable scenario "Business failure is logged at WARN level" from packages/platform-core/tests/features/behavior/logging/commands.feature diff --git a/specs/behavior/platform-core/logging/commands.examples/s-008-business-failure-uses-failure-reason-not-reason.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-008-business-failure-uses-failure-reason-not-reason.sdp.md new file mode 100644 index 00000000..2e03e3bc --- /dev/null +++ b/specs/behavior/platform-core/logging/commands.examples/s-008-business-failure-uses-failure-reason-not-reason.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.commands.business-failure-uses-failure-reason-not-reason +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.commands +--- +# Business failure uses failureReason not reason + +## Intent + +- outcome: Executable scenario "Business failure uses failureReason not reason" from packages/platform-core/tests/features/behavior/logging/commands.feature diff --git a/specs/behavior/platform-core/logging/commands.examples/s-009-error-object-is-logged-at-error-level-with-message-and-stack.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-009-error-object-is-logged-at-error-level-with-message-and-stack.sdp.md new file mode 100644 index 00000000..2ed60957 --- /dev/null +++ b/specs/behavior/platform-core/logging/commands.examples/s-009-error-object-is-logged-at-error-level-with-message-and-stack.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.commands.error-object-is-logged-at-error-level-with-message-and-stack +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.commands +--- +# Error object is logged at ERROR level with message and stack + +## Intent + +- outcome: Executable scenario "Error object is logged at ERROR level with message and stack" from packages/platform-core/tests/features/behavior/logging/commands.feature diff --git a/specs/behavior/platform-core/logging/commands.examples/s-010-string-error-is-logged-directly.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-010-string-error-is-logged-directly.sdp.md new file mode 100644 index 00000000..eb36fdc2 --- /dev/null +++ b/specs/behavior/platform-core/logging/commands.examples/s-010-string-error-is-logged-directly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.commands.string-error-is-logged-directly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.commands +--- +# String error is logged directly + +## Intent + +- outcome: Executable scenario "String error is logged directly" from packages/platform-core/tests/features/behavior/logging/commands.feature diff --git a/specs/behavior/platform-core/logging/commands.examples/s-011-non-string-non-error-values-are-stringified.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-011-non-string-non-error-values-are-stringified.sdp.md new file mode 100644 index 00000000..36306498 --- /dev/null +++ b/specs/behavior/platform-core/logging/commands.examples/s-011-non-string-non-error-values-are-stringified.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.commands.non-string-non-error-values-are-stringified +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.commands +--- +# Non-string non-Error values are stringified + +## Intent + +- outcome: Executable scenario "Non-string non-Error values are stringified" from packages/platform-core/tests/features/behavior/logging/commands.feature diff --git a/specs/behavior/platform-core/logging/commands.examples/s-012-null-error-is-stringified.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-012-null-error-is-stringified.sdp.md new file mode 100644 index 00000000..e22da551 --- /dev/null +++ b/specs/behavior/platform-core/logging/commands.examples/s-012-null-error-is-stringified.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.commands.null-error-is-stringified +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.commands +--- +# Null error is stringified + +## Intent + +- outcome: Executable scenario "Null error is stringified" from packages/platform-core/tests/features/behavior/logging/commands.feature diff --git a/specs/behavior/platform-core/logging/commands.examples/s-013-undefined-error-is-stringified.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-013-undefined-error-is-stringified.sdp.md new file mode 100644 index 00000000..2324f994 --- /dev/null +++ b/specs/behavior/platform-core/logging/commands.examples/s-013-undefined-error-is-stringified.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.commands.undefined-error-is-stringified +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.commands +--- +# Undefined error is stringified + +## Intent + +- outcome: Executable scenario "Undefined error is stringified" from packages/platform-core/tests/features/behavior/logging/commands.feature diff --git a/specs/behavior/platform-core/logging/commands.examples/s-014-stack-trace-is-preserved-for-debugging.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-014-stack-trace-is-preserved-for-debugging.sdp.md new file mode 100644 index 00000000..4facf890 --- /dev/null +++ b/specs/behavior/platform-core/logging/commands.examples/s-014-stack-trace-is-preserved-for-debugging.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.commands.stack-trace-is-preserved-for-debugging +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.commands +--- +# Stack trace is preserved for debugging + +## Intent + +- outcome: Executable scenario "Stack trace is preserved for debugging" from packages/platform-core/tests/features/behavior/logging/commands.feature diff --git a/specs/behavior/platform-core/logging/commands.examples/s-015-full-success-lifecycle-produces-start-and-success-logs.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-015-full-success-lifecycle-produces-start-and-success-logs.sdp.md new file mode 100644 index 00000000..38653055 --- /dev/null +++ b/specs/behavior/platform-core/logging/commands.examples/s-015-full-success-lifecycle-produces-start-and-success-logs.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.commands.full-success-lifecycle-produces-start-and-success-logs +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.commands +--- +# Full success lifecycle produces start and success logs + +## Intent + +- outcome: Executable scenario "Full success lifecycle produces start and success logs" from packages/platform-core/tests/features/behavior/logging/commands.feature diff --git a/specs/behavior/platform-core/logging/commands.examples/s-016-rejection-lifecycle-produces-info-and-warn-logs.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-016-rejection-lifecycle-produces-info-and-warn-logs.sdp.md new file mode 100644 index 00000000..bee0cafd --- /dev/null +++ b/specs/behavior/platform-core/logging/commands.examples/s-016-rejection-lifecycle-produces-info-and-warn-logs.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.commands.rejection-lifecycle-produces-info-and-warn-logs +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.commands +--- +# Rejection lifecycle produces INFO and WARN logs + +## Intent + +- outcome: Executable scenario "Rejection lifecycle produces INFO and WARN logs" from packages/platform-core/tests/features/behavior/logging/commands.feature diff --git a/specs/behavior/platform-core/logging/commands.examples/s-017-error-lifecycle-produces-info-and-error-logs.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-017-error-lifecycle-produces-info-and-error-logs.sdp.md new file mode 100644 index 00000000..e5782f1b --- /dev/null +++ b/specs/behavior/platform-core/logging/commands.examples/s-017-error-lifecycle-produces-info-and-error-logs.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.commands.error-lifecycle-produces-info-and-error-logs +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.commands +--- +# Error lifecycle produces INFO and ERROR logs + +## Intent + +- outcome: Executable scenario "Error lifecycle produces INFO and ERROR logs" from packages/platform-core/tests/features/behavior/logging/commands.feature diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-001-messages-are-prefixed-with-scope.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-001-messages-are-prefixed-with-scope.sdp.md new file mode 100644 index 00000000..5577a54c --- /dev/null +++ b/specs/behavior/platform-core/logging/scoped.examples/s-001-messages-are-prefixed-with-scope.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.scoped.messages-are-prefixed-with-scope +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.scoped +--- +# Messages are prefixed with scope + +## Intent + +- outcome: Executable scenario "Messages are prefixed with scope" from packages/platform-core/tests/features/behavior/logging/scoped.feature diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-002-data-object-is-appended-as-json.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-002-data-object-is-appended-as-json.sdp.md new file mode 100644 index 00000000..3d55ad76 --- /dev/null +++ b/specs/behavior/platform-core/logging/scoped.examples/s-002-data-object-is-appended-as-json.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.scoped.data-object-is-appended-as-json +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.scoped +--- +# Data object is appended as JSON + +## Intent + +- outcome: Executable scenario "Data object is appended as JSON" from packages/platform-core/tests/features/behavior/logging/scoped.feature diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-003-empty-data-object-is-omitted-from-output.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-003-empty-data-object-is-omitted-from-output.sdp.md new file mode 100644 index 00000000..fbfe6225 --- /dev/null +++ b/specs/behavior/platform-core/logging/scoped.examples/s-003-empty-data-object-is-omitted-from-output.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.scoped.empty-data-object-is-omitted-from-output +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.scoped +--- +# Empty data object is omitted from output + +## Intent + +- outcome: Executable scenario "Empty data object is omitted from output" from packages/platform-core/tests/features/behavior/logging/scoped.feature diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-004-debug-level-allows-debug-messages.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-004-debug-level-allows-debug-messages.sdp.md new file mode 100644 index 00000000..5e9cfcae --- /dev/null +++ b/specs/behavior/platform-core/logging/scoped.examples/s-004-debug-level-allows-debug-messages.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.scoped.debug-level-allows-debug-messages +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.scoped +--- +# DEBUG level allows debug messages + +## Intent + +- outcome: Executable scenario "DEBUG level allows debug messages" from packages/platform-core/tests/features/behavior/logging/scoped.feature diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-005-info-level-suppresses-debug-messages.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-005-info-level-suppresses-debug-messages.sdp.md new file mode 100644 index 00000000..8bc2e92d --- /dev/null +++ b/specs/behavior/platform-core/logging/scoped.examples/s-005-info-level-suppresses-debug-messages.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.scoped.info-level-suppresses-debug-messages +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.scoped +--- +# INFO level suppresses debug messages + +## Intent + +- outcome: Executable scenario "INFO level suppresses debug messages" from packages/platform-core/tests/features/behavior/logging/scoped.feature diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-006-info-level-allows-info-messages.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-006-info-level-allows-info-messages.sdp.md new file mode 100644 index 00000000..063545e5 --- /dev/null +++ b/specs/behavior/platform-core/logging/scoped.examples/s-006-info-level-allows-info-messages.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.scoped.info-level-allows-info-messages +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.scoped +--- +# INFO level allows info messages + +## Intent + +- outcome: Executable scenario "INFO level allows info messages" from packages/platform-core/tests/features/behavior/logging/scoped.feature diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-007-info-level-allows-warn-messages.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-007-info-level-allows-warn-messages.sdp.md new file mode 100644 index 00000000..02fc628a --- /dev/null +++ b/specs/behavior/platform-core/logging/scoped.examples/s-007-info-level-allows-warn-messages.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.scoped.info-level-allows-warn-messages +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.scoped +--- +# INFO level allows warn messages + +## Intent + +- outcome: Executable scenario "INFO level allows warn messages" from packages/platform-core/tests/features/behavior/logging/scoped.feature diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-008-error-level-allows-error-messages.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-008-error-level-allows-error-messages.sdp.md new file mode 100644 index 00000000..317efd8e --- /dev/null +++ b/specs/behavior/platform-core/logging/scoped.examples/s-008-error-level-allows-error-messages.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.scoped.error-level-allows-error-messages +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.scoped +--- +# ERROR level allows error messages + +## Intent + +- outcome: Executable scenario "ERROR level allows error messages" from packages/platform-core/tests/features/behavior/logging/scoped.feature diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-009-default-level-is-info-when-not-specified.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-009-default-level-is-info-when-not-specified.sdp.md new file mode 100644 index 00000000..90fb30c7 --- /dev/null +++ b/specs/behavior/platform-core/logging/scoped.examples/s-009-default-level-is-info-when-not-specified.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.scoped.default-level-is-info-when-not-specified +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.scoped +--- +# Default level is INFO when not specified + +## Intent + +- outcome: Executable scenario "Default level is INFO when not specified" from packages/platform-core/tests/features/behavior/logging/scoped.feature diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-010-each-log-level-uses-its-corresponding-console-method.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-010-each-log-level-uses-its-corresponding-console-method.sdp.md new file mode 100644 index 00000000..ea183326 --- /dev/null +++ b/specs/behavior/platform-core/logging/scoped.examples/s-010-each-log-level-uses-its-corresponding-console-method.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.scoped.each-log-level-uses-its-corresponding-console-method +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.scoped +--- +# Each log level uses its corresponding console method + +## Intent + +- outcome: Executable scenario "Each log level uses its corresponding console method" from packages/platform-core/tests/features/behavior/logging/scoped.feature diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-011-report-level-outputs-structured-json-via-console-log.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-011-report-level-outputs-structured-json-via-console-log.sdp.md new file mode 100644 index 00000000..ef53e94e --- /dev/null +++ b/specs/behavior/platform-core/logging/scoped.examples/s-011-report-level-outputs-structured-json-via-console-log.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.scoped.report-level-outputs-structured-json-via-console-log +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.scoped +--- +# Report level outputs structured JSON via console.log + +## Intent + +- outcome: Executable scenario "Report level outputs structured JSON via console.log" from packages/platform-core/tests/features/behavior/logging/scoped.feature diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-012-timing-start-uses-console-time.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-012-timing-start-uses-console-time.sdp.md new file mode 100644 index 00000000..43941c06 --- /dev/null +++ b/specs/behavior/platform-core/logging/scoped.examples/s-012-timing-start-uses-console-time.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.scoped.timing-start-uses-console-time +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.scoped +--- +# Timing start uses console.time + +## Intent + +- outcome: Executable scenario "Timing start uses console.time" from packages/platform-core/tests/features/behavior/logging/scoped.feature diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-013-timing-end-uses-console-time-end.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-013-timing-end-uses-console-time-end.sdp.md new file mode 100644 index 00000000..758500b4 --- /dev/null +++ b/specs/behavior/platform-core/logging/scoped.examples/s-013-timing-end-uses-console-time-end.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.scoped.timing-end-uses-console-time-end +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.scoped +--- +# Timing end uses console.timeEnd + +## Intent + +- outcome: Executable scenario "Timing end uses console.timeEnd" from packages/platform-core/tests/features/behavior/logging/scoped.feature diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-014-regular-trace-without-timing-uses-console-debug.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-014-regular-trace-without-timing-uses-console-debug.sdp.md new file mode 100644 index 00000000..17fdee11 --- /dev/null +++ b/specs/behavior/platform-core/logging/scoped.examples/s-014-regular-trace-without-timing-uses-console-debug.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.scoped.regular-trace-without-timing-uses-console-debug +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.scoped +--- +# Regular trace without timing uses console.debug + +## Intent + +- outcome: Executable scenario "Regular trace without timing uses console.debug" from packages/platform-core/tests/features/behavior/logging/scoped.feature diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-015-no-op-logger-does-not-call-any-console-methods.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-015-no-op-logger-does-not-call-any-console-methods.sdp.md new file mode 100644 index 00000000..ca18b0d9 --- /dev/null +++ b/specs/behavior/platform-core/logging/scoped.examples/s-015-no-op-logger-does-not-call-any-console-methods.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.scoped.no-op-logger-does-not-call-any-console-methods +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.scoped +--- +# No-op logger does not call any console methods + +## Intent + +- outcome: Executable scenario "No-op logger does not call any console methods" from packages/platform-core/tests/features/behavior/logging/scoped.feature diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-016-no-op-logger-implements-the-full-logger-interface.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-016-no-op-logger-implements-the-full-logger-interface.sdp.md new file mode 100644 index 00000000..c56c57be --- /dev/null +++ b/specs/behavior/platform-core/logging/scoped.examples/s-016-no-op-logger-implements-the-full-logger-interface.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.scoped.no-op-logger-implements-the-full-logger-interface +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.scoped +--- +# No-op logger implements the full Logger interface + +## Intent + +- outcome: Executable scenario "No-op logger implements the full Logger interface" from packages/platform-core/tests/features/behavior/logging/scoped.feature diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-017-child-logger-prefixes-with-combined-scope.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-017-child-logger-prefixes-with-combined-scope.sdp.md new file mode 100644 index 00000000..11c324e4 --- /dev/null +++ b/specs/behavior/platform-core/logging/scoped.examples/s-017-child-logger-prefixes-with-combined-scope.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.scoped.child-logger-prefixes-with-combined-scope +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.scoped +--- +# Child logger prefixes with combined scope + +## Intent + +- outcome: Executable scenario "Child logger prefixes with combined scope" from packages/platform-core/tests/features/behavior/logging/scoped.feature diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-018-child-logger-respects-provided-log-level.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-018-child-logger-respects-provided-log-level.sdp.md new file mode 100644 index 00000000..41b3ffa2 --- /dev/null +++ b/specs/behavior/platform-core/logging/scoped.examples/s-018-child-logger-respects-provided-log-level.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.scoped.child-logger-respects-provided-log-level +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.scoped +--- +# Child logger respects provided log level + +## Intent + +- outcome: Executable scenario "Child logger respects provided log level" from packages/platform-core/tests/features/behavior/logging/scoped.feature diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-019-child-logger-defaults-to-info-level.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-019-child-logger-defaults-to-info-level.sdp.md new file mode 100644 index 00000000..de8f9d02 --- /dev/null +++ b/specs/behavior/platform-core/logging/scoped.examples/s-019-child-logger-defaults-to-info-level.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.scoped.child-logger-defaults-to-info-level +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.scoped +--- +# Child logger defaults to INFO level + +## Intent + +- outcome: Executable scenario "Child logger defaults to INFO level" from packages/platform-core/tests/features/behavior/logging/scoped.feature diff --git a/specs/behavior/platform-core/logging/testing.examples/s-001-all-six-log-method-calls-are-captured.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-001-all-six-log-method-calls-are-captured.sdp.md new file mode 100644 index 00000000..08ceb84e --- /dev/null +++ b/specs/behavior/platform-core/logging/testing.examples/s-001-all-six-log-method-calls-are-captured.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.testing.all-six-log-method-calls-are-captured +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.testing +--- +# All six log method calls are captured + +## Intent + +- outcome: Executable scenario "All six log method calls are captured" from packages/platform-core/tests/features/behavior/logging/testing.feature diff --git a/specs/behavior/platform-core/logging/testing.examples/s-002-each-call-records-the-correct-log-level.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-002-each-call-records-the-correct-log-level.sdp.md new file mode 100644 index 00000000..aa61be65 --- /dev/null +++ b/specs/behavior/platform-core/logging/testing.examples/s-002-each-call-records-the-correct-log-level.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.testing.each-call-records-the-correct-log-level +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.testing +--- +# Each call records the correct log level + +## Intent + +- outcome: Executable scenario "Each call records the correct log level" from packages/platform-core/tests/features/behavior/logging/testing.feature diff --git a/specs/behavior/platform-core/logging/testing.examples/s-003-message-text-is-captured-correctly.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-003-message-text-is-captured-correctly.sdp.md new file mode 100644 index 00000000..1459af7a --- /dev/null +++ b/specs/behavior/platform-core/logging/testing.examples/s-003-message-text-is-captured-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.testing.message-text-is-captured-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.testing +--- +# Message text is captured correctly + +## Intent + +- outcome: Executable scenario "Message text is captured correctly" from packages/platform-core/tests/features/behavior/logging/testing.feature diff --git a/specs/behavior/platform-core/logging/testing.examples/s-004-structured-data-is-captured-correctly.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-004-structured-data-is-captured-correctly.sdp.md new file mode 100644 index 00000000..ab44650c --- /dev/null +++ b/specs/behavior/platform-core/logging/testing.examples/s-004-structured-data-is-captured-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.testing.structured-data-is-captured-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.testing +--- +# Structured data is captured correctly + +## Intent + +- outcome: Executable scenario "Structured data is captured correctly" from packages/platform-core/tests/features/behavior/logging/testing.feature diff --git a/specs/behavior/platform-core/logging/testing.examples/s-005-data-is-undefined-when-not-provided.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-005-data-is-undefined-when-not-provided.sdp.md new file mode 100644 index 00000000..dcf16427 --- /dev/null +++ b/specs/behavior/platform-core/logging/testing.examples/s-005-data-is-undefined-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.testing.data-is-undefined-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.testing +--- +# Data is undefined when not provided + +## Intent + +- outcome: Executable scenario "Data is undefined when not provided" from packages/platform-core/tests/features/behavior/logging/testing.feature diff --git a/specs/behavior/platform-core/logging/testing.examples/s-006-timestamp-is-captured-within-bounds.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-006-timestamp-is-captured-within-bounds.sdp.md new file mode 100644 index 00000000..5501eb31 --- /dev/null +++ b/specs/behavior/platform-core/logging/testing.examples/s-006-timestamp-is-captured-within-bounds.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.testing.timestamp-is-captured-within-bounds +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.testing +--- +# Timestamp is captured within bounds + +## Intent + +- outcome: Executable scenario "Timestamp is captured within bounds" from packages/platform-core/tests/features/behavior/logging/testing.feature diff --git a/specs/behavior/platform-core/logging/testing.examples/s-007-clearing-resets-calls-to-empty.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-007-clearing-resets-calls-to-empty.sdp.md new file mode 100644 index 00000000..e1f2527b --- /dev/null +++ b/specs/behavior/platform-core/logging/testing.examples/s-007-clearing-resets-calls-to-empty.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.testing.clearing-resets-calls-to-empty +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.testing +--- +# Clearing resets calls to empty + +## Intent + +- outcome: Executable scenario "Clearing resets calls to empty" from packages/platform-core/tests/features/behavior/logging/testing.feature diff --git a/specs/behavior/platform-core/logging/testing.examples/s-008-calls-are-filtered-by-level-correctly.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-008-calls-are-filtered-by-level-correctly.sdp.md new file mode 100644 index 00000000..f159888c --- /dev/null +++ b/specs/behavior/platform-core/logging/testing.examples/s-008-calls-are-filtered-by-level-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.testing.calls-are-filtered-by-level-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.testing +--- +# Calls are filtered by level correctly + +## Intent + +- outcome: Executable scenario "Calls are filtered by level correctly" from packages/platform-core/tests/features/behavior/logging/testing.feature diff --git a/specs/behavior/platform-core/logging/testing.examples/s-009-partial-and-exact-message-matching.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-009-partial-and-exact-message-matching.sdp.md new file mode 100644 index 00000000..34232f7b --- /dev/null +++ b/specs/behavior/platform-core/logging/testing.examples/s-009-partial-and-exact-message-matching.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.testing.partial-and-exact-message-matching +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.testing +--- +# Partial and exact message matching + +## Intent + +- outcome: Executable scenario "Partial and exact message matching" from packages/platform-core/tests/features/behavior/logging/testing.feature diff --git a/specs/behavior/platform-core/logging/testing.examples/s-010-exact-message-match-works.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-010-exact-message-match-works.sdp.md new file mode 100644 index 00000000..894c5ea1 --- /dev/null +++ b/specs/behavior/platform-core/logging/testing.examples/s-010-exact-message-match-works.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.testing.exact-message-match-works +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.testing +--- +# Exact message match works + +## Intent + +- outcome: Executable scenario "Exact message match works" from packages/platform-core/tests/features/behavior/logging/testing.feature diff --git a/specs/behavior/platform-core/logging/testing.examples/s-011-level-and-message-must-both-match.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-011-level-and-message-must-both-match.sdp.md new file mode 100644 index 00000000..8ac965e6 --- /dev/null +++ b/specs/behavior/platform-core/logging/testing.examples/s-011-level-and-message-must-both-match.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.testing.level-and-message-must-both-match +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.testing +--- +# Level and message must both match + +## Intent + +- outcome: Executable scenario "Level and message must both match" from packages/platform-core/tests/features/behavior/logging/testing.feature diff --git a/specs/behavior/platform-core/logging/testing.examples/s-012-returns-the-last-call-at-a-given-level.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-012-returns-the-last-call-at-a-given-level.sdp.md new file mode 100644 index 00000000..cf76900b --- /dev/null +++ b/specs/behavior/platform-core/logging/testing.examples/s-012-returns-the-last-call-at-a-given-level.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.testing.returns-the-last-call-at-a-given-level +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.testing +--- +# Returns the last call at a given level + +## Intent + +- outcome: Executable scenario "Returns the last call at a given level" from packages/platform-core/tests/features/behavior/logging/testing.feature diff --git a/specs/behavior/platform-core/logging/testing.examples/s-013-returns-undefined-when-no-calls-at-level.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-013-returns-undefined-when-no-calls-at-level.sdp.md new file mode 100644 index 00000000..3abaf7fe --- /dev/null +++ b/specs/behavior/platform-core/logging/testing.examples/s-013-returns-undefined-when-no-calls-at-level.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.testing.returns-undefined-when-no-calls-at-level +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.testing +--- +# Returns undefined when no calls at level + +## Intent + +- outcome: Executable scenario "Returns undefined when no calls at level" from packages/platform-core/tests/features/behavior/logging/testing.feature diff --git a/specs/behavior/platform-core/logging/testing.examples/s-014-multiple-accesses-return-equal-arrays.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-014-multiple-accesses-return-equal-arrays.sdp.md new file mode 100644 index 00000000..3856e343 --- /dev/null +++ b/specs/behavior/platform-core/logging/testing.examples/s-014-multiple-accesses-return-equal-arrays.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.testing.multiple-accesses-return-equal-arrays +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.testing +--- +# Multiple accesses return equal arrays + +## Intent + +- outcome: Executable scenario "Multiple accesses return equal arrays" from packages/platform-core/tests/features/behavior/logging/testing.feature diff --git a/specs/behavior/platform-core/logging/testing.examples/s-015-info-minimum-captures-info-report-warn-error-only.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-015-info-minimum-captures-info-report-warn-error-only.sdp.md new file mode 100644 index 00000000..18845955 --- /dev/null +++ b/specs/behavior/platform-core/logging/testing.examples/s-015-info-minimum-captures-info-report-warn-error-only.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.testing.info-minimum-captures-info-report-warn-error-only +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.testing +--- +# INFO minimum captures INFO, REPORT, WARN, ERROR only + +## Intent + +- outcome: Executable scenario "INFO minimum captures INFO, REPORT, WARN, ERROR only" from packages/platform-core/tests/features/behavior/logging/testing.feature diff --git a/specs/behavior/platform-core/logging/testing.examples/s-016-debug-minimum-captures-all-6-levels.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-016-debug-minimum-captures-all-6-levels.sdp.md new file mode 100644 index 00000000..72b0edef --- /dev/null +++ b/specs/behavior/platform-core/logging/testing.examples/s-016-debug-minimum-captures-all-6-levels.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.testing.debug-minimum-captures-all-6-levels +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.testing +--- +# DEBUG minimum captures all 6 levels + +## Intent + +- outcome: Executable scenario "DEBUG minimum captures all 6 levels" from packages/platform-core/tests/features/behavior/logging/testing.feature diff --git a/specs/behavior/platform-core/logging/testing.examples/s-017-error-minimum-captures-only-error.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-017-error-minimum-captures-only-error.sdp.md new file mode 100644 index 00000000..828e4add --- /dev/null +++ b/specs/behavior/platform-core/logging/testing.examples/s-017-error-minimum-captures-only-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.testing.error-minimum-captures-only-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.testing +--- +# ERROR minimum captures only ERROR + +## Intent + +- outcome: Executable scenario "ERROR minimum captures only ERROR" from packages/platform-core/tests/features/behavior/logging/testing.feature diff --git a/specs/behavior/platform-core/logging/testing.examples/s-018-warn-minimum-captures-warn-and-error.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-018-warn-minimum-captures-warn-and-error.sdp.md new file mode 100644 index 00000000..af788d57 --- /dev/null +++ b/specs/behavior/platform-core/logging/testing.examples/s-018-warn-minimum-captures-warn-and-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.testing.warn-minimum-captures-warn-and-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.testing +--- +# WARN minimum captures WARN and ERROR + +## Intent + +- outcome: Executable scenario "WARN minimum captures WARN and ERROR" from packages/platform-core/tests/features/behavior/logging/testing.feature diff --git a/specs/behavior/platform-core/logging/testing.examples/s-019-clear-resets-filtered-calls.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-019-clear-resets-filtered-calls.sdp.md new file mode 100644 index 00000000..5ec2926d --- /dev/null +++ b/specs/behavior/platform-core/logging/testing.examples/s-019-clear-resets-filtered-calls.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.testing.clear-resets-filtered-calls +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.testing +--- +# Clear resets filtered calls + +## Intent + +- outcome: Executable scenario "Clear resets filtered calls" from packages/platform-core/tests/features/behavior/logging/testing.feature diff --git a/specs/behavior/platform-core/logging/testing.examples/s-020-has-logged-message-only-searches-filtered-calls.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-020-has-logged-message-only-searches-filtered-calls.sdp.md new file mode 100644 index 00000000..4eeb5f96 --- /dev/null +++ b/specs/behavior/platform-core/logging/testing.examples/s-020-has-logged-message-only-searches-filtered-calls.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.testing.has-logged-message-only-searches-filtered-calls +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.testing +--- +# hasLoggedMessage only searches filtered calls + +## Intent + +- outcome: Executable scenario "hasLoggedMessage only searches filtered calls" from packages/platform-core/tests/features/behavior/logging/testing.feature diff --git a/specs/behavior/platform-core/logging/types.examples/s-001-priority-values-increase-from-debug-to-error.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-001-priority-values-increase-from-debug-to-error.sdp.md new file mode 100644 index 00000000..c80306aa --- /dev/null +++ b/specs/behavior/platform-core/logging/types.examples/s-001-priority-values-increase-from-debug-to-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.types.priority-values-increase-from-debug-to-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.types +--- +# Priority values increase from DEBUG to ERROR + +## Intent + +- outcome: Executable scenario "Priority values increase from DEBUG to ERROR" from packages/platform-core/tests/features/behavior/logging/types.feature diff --git a/specs/behavior/platform-core/logging/types.examples/s-002-all-6-log-levels-are-defined-as-numbers.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-002-all-6-log-levels-are-defined-as-numbers.sdp.md new file mode 100644 index 00000000..72d717fa --- /dev/null +++ b/specs/behavior/platform-core/logging/types.examples/s-002-all-6-log-levels-are-defined-as-numbers.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.types.all-6-log-levels-are-defined-as-numbers +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.types +--- +# All 6 log levels are defined as numbers + +## Intent + +- outcome: Executable scenario "All 6 log levels are defined as numbers" from packages/platform-core/tests/features/behavior/logging/types.feature diff --git a/specs/behavior/platform-core/logging/types.examples/s-003-default-log-level-is-info.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-003-default-log-level-is-info.sdp.md new file mode 100644 index 00000000..376577a6 --- /dev/null +++ b/specs/behavior/platform-core/logging/types.examples/s-003-default-log-level-is-info.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.types.default-log-level-is-info +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.types +--- +# Default log level is INFO + +## Intent + +- outcome: Executable scenario "Default log level is INFO" from packages/platform-core/tests/features/behavior/logging/types.feature diff --git a/specs/behavior/platform-core/logging/types.examples/s-004-messages-at-or-above-info-level-pass-the-filter.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-004-messages-at-or-above-info-level-pass-the-filter.sdp.md new file mode 100644 index 00000000..90c73556 --- /dev/null +++ b/specs/behavior/platform-core/logging/types.examples/s-004-messages-at-or-above-info-level-pass-the-filter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.types.messages-at-or-above-info-level-pass-the-filter +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.types +--- +# Messages at or above INFO level pass the filter + +## Intent + +- outcome: Executable scenario "Messages at or above INFO level pass the filter" from packages/platform-core/tests/features/behavior/logging/types.feature diff --git a/specs/behavior/platform-core/logging/types.examples/s-005-messages-below-info-level-are-filtered-out.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-005-messages-below-info-level-are-filtered-out.sdp.md new file mode 100644 index 00000000..43ee6fae --- /dev/null +++ b/specs/behavior/platform-core/logging/types.examples/s-005-messages-below-info-level-are-filtered-out.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.types.messages-below-info-level-are-filtered-out +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.types +--- +# Messages below INFO level are filtered out + +## Intent + +- outcome: Executable scenario "Messages below INFO level are filtered out" from packages/platform-core/tests/features/behavior/logging/types.feature diff --git a/specs/behavior/platform-core/logging/types.examples/s-006-debug-configured-level-allows-all-messages.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-006-debug-configured-level-allows-all-messages.sdp.md new file mode 100644 index 00000000..923bf438 --- /dev/null +++ b/specs/behavior/platform-core/logging/types.examples/s-006-debug-configured-level-allows-all-messages.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.types.debug-configured-level-allows-all-messages +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.types +--- +# DEBUG configured level allows all messages + +## Intent + +- outcome: Executable scenario "DEBUG configured level allows all messages" from packages/platform-core/tests/features/behavior/logging/types.feature diff --git a/specs/behavior/platform-core/logging/types.examples/s-007-error-configured-level-only-allows-error.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-007-error-configured-level-only-allows-error.sdp.md new file mode 100644 index 00000000..9cb49f5f --- /dev/null +++ b/specs/behavior/platform-core/logging/types.examples/s-007-error-configured-level-only-allows-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.types.error-configured-level-only-allows-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.types +--- +# ERROR configured level only allows ERROR + +## Intent + +- outcome: Executable scenario "ERROR configured level only allows ERROR" from packages/platform-core/tests/features/behavior/logging/types.feature diff --git a/specs/behavior/platform-core/logging/types.examples/s-008-warn-configured-level-allows-warn-and-error-only.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-008-warn-configured-level-allows-warn-and-error-only.sdp.md new file mode 100644 index 00000000..59f527a4 --- /dev/null +++ b/specs/behavior/platform-core/logging/types.examples/s-008-warn-configured-level-allows-warn-and-error-only.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.logging.types.warn-configured-level-allows-warn-and-error-only +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.logging.types +--- +# WARN configured level allows WARN and ERROR only + +## Intent + +- outcome: Executable scenario "WARN configured level allows WARN and ERROR only" from packages/platform-core/tests/features/behavior/logging/types.feature diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-001-adding-middleware-increases-size-and-returns-pipeline-for-chaining.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-001-adding-middleware-increases-size-and-returns-pipeline-for-chaining.sdp.md new file mode 100644 index 00000000..5b5ba8eb --- /dev/null +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-001-adding-middleware-increases-size-and-returns-pipeline-for-chaining.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middleware-pipeline.adding-middleware-increases-size-and-returns-pipeline-for-chaining +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middleware-pipeline +--- +# Adding middleware increases size and returns pipeline for chaining + +## Intent + +- outcome: Executable scenario "Adding middleware increases size and returns pipeline for chaining" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-002-removing-an-existing-middleware-returns-true-and-decreases-size.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-002-removing-an-existing-middleware-returns-true-and-decreases-size.sdp.md new file mode 100644 index 00000000..07e3cef2 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-002-removing-an-existing-middleware-returns-true-and-decreases-size.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middleware-pipeline.removing-an-existing-middleware-returns-true-and-decreases-size +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middleware-pipeline +--- +# Removing an existing middleware returns true and decreases size + +## Intent + +- outcome: Executable scenario "Removing an existing middleware returns true and decreases size" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-003-removing-a-non-existent-middleware-returns-false.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-003-removing-a-non-existent-middleware-returns-false.sdp.md new file mode 100644 index 00000000..12e2a5e5 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-003-removing-a-non-existent-middleware-returns-false.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middleware-pipeline.removing-a-non-existent-middleware-returns-false +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middleware-pipeline +--- +# Removing a non-existent middleware returns false + +## Intent + +- outcome: Executable scenario "Removing a non-existent middleware returns false" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-004-has-returns-true-for-existing-middleware.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-004-has-returns-true-for-existing-middleware.sdp.md new file mode 100644 index 00000000..de5f1a1c --- /dev/null +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-004-has-returns-true-for-existing-middleware.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middleware-pipeline.has-returns-true-for-existing-middleware +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middleware-pipeline +--- +# has returns true for existing middleware + +## Intent + +- outcome: Executable scenario "has returns true for existing middleware" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-005-has-returns-false-for-non-existent-middleware.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-005-has-returns-false-for-non-existent-middleware.sdp.md new file mode 100644 index 00000000..e31fe54c --- /dev/null +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-005-has-returns-false-for-non-existent-middleware.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middleware-pipeline.has-returns-false-for-non-existent-middleware +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middleware-pipeline +--- +# has returns false for non-existent middleware + +## Intent + +- outcome: Executable scenario "has returns false for non-existent middleware" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-006-names-are-returned-sorted-by-order.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-006-names-are-returned-sorted-by-order.sdp.md new file mode 100644 index 00000000..2bcda8d3 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-006-names-are-returned-sorted-by-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middleware-pipeline.names-are-returned-sorted-by-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middleware-pipeline +--- +# Names are returned sorted by order + +## Intent + +- outcome: Executable scenario "Names are returned sorted by order" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-007-handler-executes-directly-with-empty-pipeline.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-007-handler-executes-directly-with-empty-pipeline.sdp.md new file mode 100644 index 00000000..f0db5923 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-007-handler-executes-directly-with-empty-pipeline.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middleware-pipeline.handler-executes-directly-with-empty-pipeline +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middleware-pipeline +--- +# Handler executes directly with empty pipeline + +## Intent + +- outcome: Executable scenario "Handler executes directly with empty pipeline" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-008-before-hooks-run-in-order-10-then-20.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-008-before-hooks-run-in-order-10-then-20.sdp.md new file mode 100644 index 00000000..a821e26b --- /dev/null +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-008-before-hooks-run-in-order-10-then-20.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middleware-pipeline.before-hooks-run-in-order-10-then-20 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middleware-pipeline +--- +# Before hooks run in order 10 then 20 + +## Intent + +- outcome: Executable scenario "Before hooks run in order 10 then 20" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-009-after-hooks-run-in-order-20-then-10.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-009-after-hooks-run-in-order-20-then-10.sdp.md new file mode 100644 index 00000000..b989ad17 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-009-after-hooks-run-in-order-20-then-10.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middleware-pipeline.after-hooks-run-in-order-20-then-10 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middleware-pipeline +--- +# After hooks run in order 20 then 10 + +## Intent + +- outcome: Executable scenario "After hooks run in order 20 then 10" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-010-short-circuit-prevents-subsequent-middleware-execution.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-010-short-circuit-prevents-subsequent-middleware-execution.sdp.md new file mode 100644 index 00000000..eef2b1cb --- /dev/null +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-010-short-circuit-prevents-subsequent-middleware-execution.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middleware-pipeline.short-circuit-prevents-subsequent-middleware-execution +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middleware-pipeline +--- +# Short-circuit prevents subsequent middleware execution + +## Intent + +- outcome: Executable scenario "Short-circuit prevents subsequent middleware execution" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-011-enricher-middleware-passes-custom-context-to-subsequent-middleware.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-011-enricher-middleware-passes-custom-context-to-subsequent-middleware.sdp.md new file mode 100644 index 00000000..e7878493 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-011-enricher-middleware-passes-custom-context-to-subsequent-middleware.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middleware-pipeline.enricher-middleware-passes-custom-context-to-subsequent-middleware +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middleware-pipeline +--- +# Enricher middleware passes custom context to subsequent middleware + +## Intent + +- outcome: Executable scenario "Enricher middleware passes custom context to subsequent middleware" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-012-throwing-before-hook-produces-middleware-error.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-012-throwing-before-hook-produces-middleware-error.sdp.md new file mode 100644 index 00000000..bf760ea8 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-012-throwing-before-hook-produces-middleware-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middleware-pipeline.throwing-before-hook-produces-middleware-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middleware-pipeline +--- +# Throwing before hook produces middleware error + +## Intent + +- outcome: Executable scenario "Throwing before hook produces middleware error" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-013-throwing-handler-produces-handler-error.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-013-throwing-handler-produces-handler-error.sdp.md new file mode 100644 index 00000000..afe9068f --- /dev/null +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-013-throwing-handler-produces-handler-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middleware-pipeline.throwing-handler-produces-handler-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middleware-pipeline +--- +# Throwing handler produces handler error + +## Intent + +- outcome: Executable scenario "Throwing handler produces handler error" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-014-failing-after-hook-does-not-prevent-other-after-hooks.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-014-failing-after-hook-does-not-prevent-other-after-hooks.sdp.md new file mode 100644 index 00000000..13a52244 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-014-failing-after-hook-does-not-prevent-other-after-hooks.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middleware-pipeline.failing-after-hook-does-not-prevent-other-after-hooks +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middleware-pipeline +--- +# Failing after hook does not prevent other after hooks + +## Intent + +- outcome: Executable scenario "Failing after hook does not prevent other after hooks" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-015-only-pre-short-circuit-middleware-after-hooks-run.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-015-only-pre-short-circuit-middleware-after-hooks-run.sdp.md new file mode 100644 index 00000000..158906d0 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-015-only-pre-short-circuit-middleware-after-hooks-run.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middleware-pipeline.only-pre-short-circuit-middleware-after-hooks-run +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middleware-pipeline +--- +# Only pre-short-circuit middleware after hooks run + +## Intent + +- outcome: Executable scenario "Only pre-short-circuit middleware after hooks run" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-016-clear-empties-the-pipeline.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-016-clear-empties-the-pipeline.sdp.md new file mode 100644 index 00000000..707399d0 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-016-clear-empties-the-pipeline.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middleware-pipeline.clear-empties-the-pipeline +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middleware-pipeline +--- +# Clear empties the pipeline + +## Intent + +- outcome: Executable scenario "Clear empties the pipeline" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-017-clone-has-same-middlewares-but-is-independent.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-017-clone-has-same-middlewares-but-is-independent.sdp.md new file mode 100644 index 00000000..d6a448d0 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-017-clone-has-same-middlewares-but-is-independent.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middleware-pipeline.clone-has-same-middlewares-but-is-independent +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middleware-pipeline +--- +# Clone has same middlewares but is independent + +## Intent + +- outcome: Executable scenario "Clone has same middlewares but is independent" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-018-factory-creates-pipeline-without-options.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-018-factory-creates-pipeline-without-options.sdp.md new file mode 100644 index 00000000..ad77af6f --- /dev/null +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-018-factory-creates-pipeline-without-options.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middleware-pipeline.factory-creates-pipeline-without-options +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middleware-pipeline +--- +# Factory creates pipeline without options + +## Intent + +- outcome: Executable scenario "Factory creates pipeline without options" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-019-factory-creates-pipeline-with-debug-option.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-019-factory-creates-pipeline-with-debug-option.sdp.md new file mode 100644 index 00000000..eec5f6b5 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-019-factory-creates-pipeline-with-debug-option.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middleware-pipeline.factory-creates-pipeline-with-debug-option +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middleware-pipeline +--- +# Factory creates pipeline with debug option + +## Intent + +- outcome: Executable scenario "Factory creates pipeline with debug option" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-001-structure-validation-has-correct-order.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-001-structure-validation-has-correct-order.sdp.md new file mode 100644 index 00000000..8363ba7a --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-001-structure-validation-has-correct-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.structure-validation-has-correct-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Structure validation has correct order + +## Intent + +- outcome: Executable scenario "Structure validation has correct order" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-002-valid-payload-passes-structure-validation.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-002-valid-payload-passes-structure-validation.sdp.md new file mode 100644 index 00000000..36b095d3 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-002-valid-payload-passes-structure-validation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.valid-payload-passes-structure-validation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Valid payload passes structure validation + +## Intent + +- outcome: Executable scenario "Valid payload passes structure validation" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-003-invalid-payload-is-rejected-by-structure-validation.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-003-invalid-payload-is-rejected-by-structure-validation.sdp.md new file mode 100644 index 00000000..b99fadbc --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-003-invalid-payload-is-rejected-by-structure-validation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.invalid-payload-is-rejected-by-structure-validation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Invalid payload is rejected by structure validation + +## Intent + +- outcome: Executable scenario "Invalid payload is rejected by structure validation" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-004-unregistered-command-skips-structure-validation.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-004-unregistered-command-skips-structure-validation.sdp.md new file mode 100644 index 00000000..ca1ce20d --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-004-unregistered-command-skips-structure-validation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.unregistered-command-skips-structure-validation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Unregistered command skips structure validation + +## Intent + +- outcome: Executable scenario "Unregistered command skips structure validation" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-005-registry-validation-validates-against-registry-schema.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-005-registry-validation-validates-against-registry-schema.sdp.md new file mode 100644 index 00000000..94c6f2d3 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-005-registry-validation-validates-against-registry-schema.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.registry-validation-validates-against-registry-schema +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Registry validation validates against registry schema + +## Intent + +- outcome: Executable scenario "Registry validation validates against registry schema" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-006-registry-validation-skips-unregistered-commands.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-006-registry-validation-skips-unregistered-commands.sdp.md new file mode 100644 index 00000000..2e22f190 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-006-registry-validation-skips-unregistered-commands.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.registry-validation-skips-unregistered-commands +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Registry validation skips unregistered commands + +## Intent + +- outcome: Executable scenario "Registry validation skips unregistered commands" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-007-domain-validation-has-correct-order.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-007-domain-validation-has-correct-order.sdp.md new file mode 100644 index 00000000..ded825a2 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-007-domain-validation-has-correct-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.domain-validation-has-correct-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Domain validation has correct order + +## Intent + +- outcome: Executable scenario "Domain validation has correct order" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-008-domain-validation-passes-when-validator-returns-undefined.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-008-domain-validation-passes-when-validator-returns-undefined.sdp.md new file mode 100644 index 00000000..6ea982cc --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-008-domain-validation-passes-when-validator-returns-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.domain-validation-passes-when-validator-returns-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Domain validation passes when validator returns undefined + +## Intent + +- outcome: Executable scenario "Domain validation passes when validator returns undefined" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-009-domain-validation-rejects-when-validator-returns-error-message.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-009-domain-validation-rejects-when-validator-returns-error-message.sdp.md new file mode 100644 index 00000000..ba3db8fe --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-009-domain-validation-rejects-when-validator-returns-error-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.domain-validation-rejects-when-validator-returns-error-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Domain validation rejects when validator returns error message + +## Intent + +- outcome: Executable scenario "Domain validation rejects when validator returns error message" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-010-domain-validation-skips-commands-without-validators.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-010-domain-validation-skips-commands-without-validators.sdp.md new file mode 100644 index 00000000..22a51182 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-010-domain-validation-skips-commands-without-validators.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.domain-validation-skips-commands-without-validators +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Domain validation skips commands without validators + +## Intent + +- outcome: Executable scenario "Domain validation skips commands without validators" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-011-combined-validators-return-first-error.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-011-combined-validators-return-first-error.sdp.md new file mode 100644 index 00000000..df5cff98 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-011-combined-validators-return-first-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.combined-validators-return-first-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Combined validators return first error + +## Intent + +- outcome: Executable scenario "Combined validators return first error" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-012-combined-validators-return-undefined-when-all-pass.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-012-combined-validators-return-undefined-when-all-pass.sdp.md new file mode 100644 index 00000000..3847d95a --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-012-combined-validators-return-undefined-when-all-pass.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.combined-validators-return-undefined-when-all-pass +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Combined validators return undefined when all pass + +## Intent + +- outcome: Executable scenario "Combined validators return undefined when all pass" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-013-required-string-validates-non-empty-strings.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-013-required-string-validates-non-empty-strings.sdp.md new file mode 100644 index 00000000..bc48359c --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-013-required-string-validates-non-empty-strings.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.required-string-validates-non-empty-strings +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# requiredString validates non-empty strings + +## Intent + +- outcome: Executable scenario "requiredString validates non-empty strings" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-014-positive-number-validates-positive-numbers.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-014-positive-number-validates-positive-numbers.sdp.md new file mode 100644 index 00000000..3cb92e6a --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-014-positive-number-validates-positive-numbers.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.positive-number-validates-positive-numbers +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# positiveNumber validates positive numbers + +## Intent + +- outcome: Executable scenario "positiveNumber validates positive numbers" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-015-number-range-validates-within-range.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-015-number-range-validates-within-range.sdp.md new file mode 100644 index 00000000..8c810153 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-015-number-range-validates-within-range.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.number-range-validates-within-range +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# numberRange validates within range + +## Intent + +- outcome: Executable scenario "numberRange validates within range" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-016-starts-with-prefix-validates-prefix.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-016-starts-with-prefix-validates-prefix.sdp.md new file mode 100644 index 00000000..3f2361f2 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-016-starts-with-prefix-validates-prefix.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.starts-with-prefix-validates-prefix +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# startsWithPrefix validates prefix + +## Intent + +- outcome: Executable scenario "startsWithPrefix validates prefix" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-017-authorization-has-correct-order.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-017-authorization-has-correct-order.sdp.md new file mode 100644 index 00000000..918a161c --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-017-authorization-has-correct-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.authorization-has-correct-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Authorization has correct order + +## Intent + +- outcome: Executable scenario "Authorization has correct order" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-018-authorization-allows-when-checker-returns-allowed-true.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-018-authorization-allows-when-checker-returns-allowed-true.sdp.md new file mode 100644 index 00000000..7792f622 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-018-authorization-allows-when-checker-returns-allowed-true.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.authorization-allows-when-checker-returns-allowed-true +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Authorization allows when checker returns allowed true + +## Intent + +- outcome: Executable scenario "Authorization allows when checker returns allowed true" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-019-authorization-rejects-when-checker-returns-allowed-false.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-019-authorization-rejects-when-checker-returns-allowed-false.sdp.md new file mode 100644 index 00000000..b0650dc9 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-019-authorization-rejects-when-checker-returns-allowed-false.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.authorization-rejects-when-checker-returns-allowed-false +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Authorization rejects when checker returns allowed false + +## Intent + +- outcome: Executable scenario "Authorization rejects when checker returns allowed false" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-020-authorization-skips-configured-commands.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-020-authorization-skips-configured-commands.sdp.md new file mode 100644 index 00000000..4e2a6213 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-020-authorization-skips-configured-commands.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.authorization-skips-configured-commands +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Authorization skips configured commands + +## Intent + +- outcome: Executable scenario "Authorization skips configured commands" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-021-role-based-checker-allows-user-with-required-role.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-021-role-based-checker-allows-user-with-required-role.sdp.md new file mode 100644 index 00000000..43bcc983 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-021-role-based-checker-allows-user-with-required-role.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.role-based-checker-allows-user-with-required-role +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Role-based checker allows user with required role + +## Intent + +- outcome: Executable scenario "Role-based checker allows user with required role" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-022-role-based-checker-rejects-user-without-required-role.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-022-role-based-checker-rejects-user-without-required-role.sdp.md new file mode 100644 index 00000000..52622b1e --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-022-role-based-checker-rejects-user-without-required-role.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.role-based-checker-rejects-user-without-required-role +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Role-based checker rejects user without required role + +## Intent + +- outcome: Executable scenario "Role-based checker rejects user without required role" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-023-role-based-checker-requires-authentication.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-023-role-based-checker-requires-authentication.sdp.md new file mode 100644 index 00000000..a69894b1 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-023-role-based-checker-requires-authentication.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.role-based-checker-requires-authentication +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Role-based checker requires authentication + +## Intent + +- outcome: Executable scenario "Role-based checker requires authentication" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-024-role-based-checker-allows-when-no-roles-specified.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-024-role-based-checker-allows-when-no-roles-specified.sdp.md new file mode 100644 index 00000000..eb358ef7 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-024-role-based-checker-allows-when-no-roles-specified.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.role-based-checker-allows-when-no-roles-specified +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Role-based checker allows when no roles specified + +## Intent + +- outcome: Executable scenario "Role-based checker allows when no roles specified" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-025-logging-has-correct-order.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-025-logging-has-correct-order.sdp.md new file mode 100644 index 00000000..5af8f028 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-025-logging-has-correct-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.logging-has-correct-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Logging has correct order + +## Intent + +- outcome: Executable scenario "Logging has correct order" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-026-logging-middleware-logs-before-and-after-execution.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-026-logging-middleware-logs-before-and-after-execution.sdp.md new file mode 100644 index 00000000..9988ed52 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-026-logging-middleware-logs-before-and-after-execution.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.logging-middleware-logs-before-and-after-execution +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Logging middleware logs before and after execution + +## Intent + +- outcome: Executable scenario "Logging middleware logs before and after execution" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-027-logging-middleware-logs-errors-for-failed-commands.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-027-logging-middleware-logs-errors-for-failed-commands.sdp.md new file mode 100644 index 00000000..0fd72bac --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-027-logging-middleware-logs-errors-for-failed-commands.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.logging-middleware-logs-errors-for-failed-commands +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Logging middleware logs errors for failed commands + +## Intent + +- outcome: Executable scenario "Logging middleware logs errors for failed commands" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-028-no-op-logger-does-not-throw-on-any-level.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-028-no-op-logger-does-not-throw-on-any-level.sdp.md new file mode 100644 index 00000000..78f404f6 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-028-no-op-logger-does-not-throw-on-any-level.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.no-op-logger-does-not-throw-on-any-level +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# NoOp logger does not throw on any level + +## Intent + +- outcome: Executable scenario "NoOp logger does not throw on any level" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-029-json-logger-outputs-correctly-formatted-logs.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-029-json-logger-outputs-correctly-formatted-logs.sdp.md new file mode 100644 index 00000000..71b54d49 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-029-json-logger-outputs-correctly-formatted-logs.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.json-logger-outputs-correctly-formatted-logs +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# JSON logger outputs correctly formatted logs + +## Intent + +- outcome: Executable scenario "JSON logger outputs correctly formatted logs" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-030-json-logger-includes-timestamp-when-configured.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-030-json-logger-includes-timestamp-when-configured.sdp.md new file mode 100644 index 00000000..fa5d0309 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-030-json-logger-includes-timestamp-when-configured.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.json-logger-includes-timestamp-when-configured +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# JSON logger includes timestamp when configured + +## Intent + +- outcome: Executable scenario "JSON logger includes timestamp when configured" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-031-rate-limit-has-correct-order.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-031-rate-limit-has-correct-order.sdp.md new file mode 100644 index 00000000..de5b665d --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-031-rate-limit-has-correct-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.rate-limit-has-correct-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Rate limit has correct order + +## Intent + +- outcome: Executable scenario "Rate limit has correct order" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-032-rate-limit-allows-when-not-exceeded.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-032-rate-limit-allows-when-not-exceeded.sdp.md new file mode 100644 index 00000000..7a4002d0 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-032-rate-limit-allows-when-not-exceeded.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.rate-limit-allows-when-not-exceeded +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Rate limit allows when not exceeded + +## Intent + +- outcome: Executable scenario "Rate limit allows when not exceeded" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-033-rate-limit-rejects-when-exceeded.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-033-rate-limit-rejects-when-exceeded.sdp.md new file mode 100644 index 00000000..9283bd92 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-033-rate-limit-rejects-when-exceeded.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.rate-limit-rejects-when-exceeded +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Rate limit rejects when exceeded + +## Intent + +- outcome: Executable scenario "Rate limit rejects when exceeded" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-034-rate-limit-skips-configured-commands.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-034-rate-limit-skips-configured-commands.sdp.md new file mode 100644 index 00000000..ef3460a9 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-034-rate-limit-skips-configured-commands.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.rate-limit-skips-configured-commands +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# Rate limit skips configured commands + +## Intent + +- outcome: Executable scenario "Rate limit skips configured commands" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-035-by-user-id-generates-correct-key.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-035-by-user-id-generates-correct-key.sdp.md new file mode 100644 index 00000000..2508455c --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-035-by-user-id-generates-correct-key.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.by-user-id-generates-correct-key +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# byUserId generates correct key + +## Intent + +- outcome: Executable scenario "byUserId generates correct key" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-036-by-user-id-handles-anonymous-users.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-036-by-user-id-handles-anonymous-users.sdp.md new file mode 100644 index 00000000..9913c1c1 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-036-by-user-id-handles-anonymous-users.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.by-user-id-handles-anonymous-users +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# byUserId handles anonymous users + +## Intent + +- outcome: Executable scenario "byUserId handles anonymous users" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-037-by-command-type-generates-correct-key.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-037-by-command-type-generates-correct-key.sdp.md new file mode 100644 index 00000000..ec428743 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-037-by-command-type-generates-correct-key.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.by-command-type-generates-correct-key +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# byCommandType generates correct key + +## Intent + +- outcome: Executable scenario "byCommandType generates correct key" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-038-by-user-and-command-generates-composite-key.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-038-by-user-and-command-generates-composite-key.sdp.md new file mode 100644 index 00000000..c73bebc9 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-038-by-user-and-command-generates-composite-key.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.by-user-and-command-generates-composite-key +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# byUserAndCommand generates composite key + +## Intent + +- outcome: Executable scenario "byUserAndCommand generates composite key" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-039-all-middleware-orders-follow-correct-sequence.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-039-all-middleware-orders-follow-correct-sequence.sdp.md new file mode 100644 index 00000000..891f7461 --- /dev/null +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-039-all-middleware-orders-follow-correct-sequence.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.middleware.middlewares.all-middleware-orders-follow-correct-sequence +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.middleware.middlewares +--- +# All middleware orders follow correct sequence + +## Intent + +- outcome: Executable scenario "All middleware orders follow correct sequence" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-001-operation-executes-normally-and-returns-result.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-001-operation-executes-normally-and-returns-result.sdp.md new file mode 100644 index 00000000..1cba9364 --- /dev/null +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-001-operation-executes-normally-and-returns-result.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.monitoring.circuit-breaker.operation-executes-normally-and-returns-result +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.monitoring.circuit-breaker +--- +# Operation executes normally and returns result + +## Intent + +- outcome: Executable scenario "Operation executes normally and returns result" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-002-circuit-remains-closed-after-a-single-failure.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-002-circuit-remains-closed-after-a-single-failure.sdp.md new file mode 100644 index 00000000..c83e1f69 --- /dev/null +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-002-circuit-remains-closed-after-a-single-failure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.monitoring.circuit-breaker.circuit-remains-closed-after-a-single-failure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.monitoring.circuit-breaker +--- +# Circuit remains closed after a single failure + +## Intent + +- outcome: Executable scenario "Circuit remains closed after a single failure" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-003-circuit-opens-after-default-failure-threshold-of-5-failures.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-003-circuit-opens-after-default-failure-threshold-of-5-failures.sdp.md new file mode 100644 index 00000000..63fb6708 --- /dev/null +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-003-circuit-opens-after-default-failure-threshold-of-5-failures.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.monitoring.circuit-breaker.circuit-opens-after-default-failure-threshold-of-5-failures +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.monitoring.circuit-breaker +--- +# Circuit opens after default failure threshold of 5 failures + +## Intent + +- outcome: Executable scenario "Circuit opens after default failure threshold of 5 failures" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-004-circuit-transitions-to-half-open-after-timeout.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-004-circuit-transitions-to-half-open-after-timeout.sdp.md new file mode 100644 index 00000000..4bbd2726 --- /dev/null +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-004-circuit-transitions-to-half-open-after-timeout.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.monitoring.circuit-breaker.circuit-transitions-to-half-open-after-timeout +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.monitoring.circuit-breaker +--- +# Circuit transitions to half-open after timeout + +## Intent + +- outcome: Executable scenario "Circuit transitions to half-open after timeout" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-005-circuit-closes-on-success-in-half-open-state.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-005-circuit-closes-on-success-in-half-open-state.sdp.md new file mode 100644 index 00000000..cba4ba09 --- /dev/null +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-005-circuit-closes-on-success-in-half-open-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.monitoring.circuit-breaker.circuit-closes-on-success-in-half-open-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.monitoring.circuit-breaker +--- +# Circuit closes on success in half-open state + +## Intent + +- outcome: Executable scenario "Circuit closes on success in half-open state" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-006-circuit-re-opens-on-failure-in-half-open-state.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-006-circuit-re-opens-on-failure-in-half-open-state.sdp.md new file mode 100644 index 00000000..cb2074bb --- /dev/null +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-006-circuit-re-opens-on-failure-in-half-open-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.monitoring.circuit-breaker.circuit-re-opens-on-failure-in-half-open-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.monitoring.circuit-breaker +--- +# Circuit re-opens on failure in half-open state + +## Intent + +- outcome: Executable scenario "Circuit re-opens on failure in half-open state" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-007-requires-3-consecutive-successes-in-half-open-to-close-circuit.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-007-requires-3-consecutive-successes-in-half-open-to-close-circuit.sdp.md new file mode 100644 index 00000000..99c0b866 --- /dev/null +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-007-requires-3-consecutive-successes-in-half-open-to-close-circuit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.monitoring.circuit-breaker.requires-3-consecutive-successes-in-half-open-to-close-circuit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.monitoring.circuit-breaker +--- +# Requires 3 consecutive successes in half-open to close circuit + +## Intent + +- outcome: Executable scenario "Requires 3 consecutive successes in half-open to close circuit" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-008-returns-closed-for-unknown-circuit.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-008-returns-closed-for-unknown-circuit.sdp.md new file mode 100644 index 00000000..34948849 --- /dev/null +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-008-returns-closed-for-unknown-circuit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.monitoring.circuit-breaker.returns-closed-for-unknown-circuit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.monitoring.circuit-breaker +--- +# Returns closed for unknown circuit + +## Intent + +- outcome: Executable scenario "Returns closed for unknown circuit" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-009-reflects-current-state-after-a-successful-operation.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-009-reflects-current-state-after-a-successful-operation.sdp.md new file mode 100644 index 00000000..479c76b5 --- /dev/null +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-009-reflects-current-state-after-a-successful-operation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.monitoring.circuit-breaker.reflects-current-state-after-a-successful-operation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.monitoring.circuit-breaker +--- +# Reflects current state after a successful operation + +## Intent + +- outcome: Executable scenario "Reflects current state after a successful operation" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-010-reset-clears-an-open-circuit-back-to-closed.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-010-reset-clears-an-open-circuit-back-to-closed.sdp.md new file mode 100644 index 00000000..a0920eb2 --- /dev/null +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-010-reset-clears-an-open-circuit-back-to-closed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.monitoring.circuit-breaker.reset-clears-an-open-circuit-back-to-closed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.monitoring.circuit-breaker +--- +# Reset clears an open circuit back to closed + +## Intent + +- outcome: Executable scenario "Reset clears an open circuit back to closed" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-011-respects-custom-failure-threshold.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-011-respects-custom-failure-threshold.sdp.md new file mode 100644 index 00000000..6a11126f --- /dev/null +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-011-respects-custom-failure-threshold.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.monitoring.circuit-breaker.respects-custom-failure-threshold +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.monitoring.circuit-breaker +--- +# Respects custom failureThreshold + +## Intent + +- outcome: Executable scenario "Respects custom failureThreshold" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-012-respects-custom-timeout.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-012-respects-custom-timeout.sdp.md new file mode 100644 index 00000000..c761a68b --- /dev/null +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-012-respects-custom-timeout.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.monitoring.circuit-breaker.respects-custom-timeout +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.monitoring.circuit-breaker +--- +# Respects custom timeout + +## Intent + +- outcome: Executable scenario "Respects custom timeout" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-013-failure-count-resets-on-success-in-closed-state.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-013-failure-count-resets-on-success-in-closed-state.sdp.md new file mode 100644 index 00000000..07730857 --- /dev/null +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-013-failure-count-resets-on-success-in-closed-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.monitoring.circuit-breaker.failure-count-resets-on-success-in-closed-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.monitoring.circuit-breaker +--- +# Failure count resets on success in closed state + +## Intent + +- outcome: Executable scenario "Failure count resets on success in closed state" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature diff --git a/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-001-wraps-partition-key-in-structured-field-for-primary-projection.sdp.md b/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-001-wraps-partition-key-in-structured-field-for-primary-projection.sdp.md new file mode 100644 index 00000000..4265a0fc --- /dev/null +++ b/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-001-wraps-partition-key-in-structured-field-for-primary-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.orchestration.command-orchestrator.wraps-partition-key-in-structured-field-for-primary-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.orchestration.command-orchestrator +--- +# Wraps partition key in structured field for primary projection + +## Intent + +- outcome: Executable scenario "Wraps partition key in structured field for primary projection" from packages/platform-core/tests/features/behavior/orchestration/command-orchestrator.feature diff --git a/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-002-wraps-partition-key-in-structured-field-for-secondary-projections.sdp.md b/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-002-wraps-partition-key-in-structured-field-for-secondary-projections.sdp.md new file mode 100644 index 00000000..2dd0cdc6 --- /dev/null +++ b/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-002-wraps-partition-key-in-structured-field-for-secondary-projections.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.orchestration.command-orchestrator.wraps-partition-key-in-structured-field-for-secondary-projections +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.orchestration.command-orchestrator +--- +# Wraps partition key in structured field for secondary projections + +## Intent + +- outcome: Executable scenario "Wraps partition key in structured field for secondary projections" from packages/platform-core/tests/features/behavior/orchestration/command-orchestrator.feature diff --git a/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-003-wraps-partition-key-in-structured-field-for-failed-projection.sdp.md b/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-003-wraps-partition-key-in-structured-field-for-failed-projection.sdp.md new file mode 100644 index 00000000..80bc6618 --- /dev/null +++ b/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-003-wraps-partition-key-in-structured-field-for-failed-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.orchestration.command-orchestrator.wraps-partition-key-in-structured-field-for-failed-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.orchestration.command-orchestrator +--- +# Wraps partition key in structured field for failed projection + +## Intent + +- outcome: Executable scenario "Wraps partition key in structured field for failed projection" from packages/platform-core/tests/features/behavior/orchestration/command-orchestrator.feature diff --git a/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-004-routes-saga-work-to-saga-pool-only.sdp.md b/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-004-routes-saga-work-to-saga-pool-only.sdp.md new file mode 100644 index 00000000..50a2b7d9 --- /dev/null +++ b/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-004-routes-saga-work-to-saga-pool-only.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.orchestration.command-orchestrator.routes-saga-work-to-saga-pool-only +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.orchestration.command-orchestrator +--- +# Routes saga work to sagaPool only + +## Intent + +- outcome: Executable scenario "Routes saga work to sagaPool only" from packages/platform-core/tests/features/behavior/orchestration/command-orchestrator.feature diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-001-successful-cross-context-coordination.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-001-successful-cross-context-coordination.sdp.md new file mode 100644 index 00000000..ac78345f --- /dev/null +++ b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-001-successful-cross-context-coordination.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests.successful-cross-context-coordination +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests +--- +# Successful cross-context coordination + +## Intent + +- outcome: Executable scenario "Successful cross-context coordination" from packages/platform-core/tests/features/behavior/orchestration/saga-orchestration-executable-tests.feature diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-002-compensation-on-step-failure.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-002-compensation-on-step-failure.sdp.md new file mode 100644 index 00000000..2113f292 --- /dev/null +++ b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-002-compensation-on-step-failure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests.compensation-on-step-failure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests +--- +# Compensation on step failure + +## Intent + +- outcome: Executable scenario "Compensation on step failure" from packages/platform-core/tests/features/behavior/orchestration/saga-orchestration-executable-tests.feature diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-003-workflow-resumes-from-the-last-completed-step-after-restart.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-003-workflow-resumes-from-the-last-completed-step-after-restart.sdp.md new file mode 100644 index 00000000..75d979e9 --- /dev/null +++ b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-003-workflow-resumes-from-the-last-completed-step-after-restart.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests.workflow-resumes-from-the-last-completed-step-after-restart +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests +--- +# Workflow resumes from the last completed step after restart + +## Intent + +- outcome: Executable scenario "Workflow resumes from the last completed step after restart" from packages/platform-core/tests/features/behavior/orchestration/saga-orchestration-executable-tests.feature diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-004-compensation-executes-in-reverse-order-of-completed-steps.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-004-compensation-executes-in-reverse-order-of-completed-steps.sdp.md new file mode 100644 index 00000000..0caa59a3 --- /dev/null +++ b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-004-compensation-executes-in-reverse-order-of-completed-steps.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests.compensation-executes-in-reverse-order-of-completed-steps +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests +--- +# Compensation executes in reverse order of completed steps + +## Intent + +- outcome: Executable scenario "Compensation executes in reverse order of completed steps" from packages/platform-core/tests/features/behavior/orchestration/saga-orchestration-executable-tests.feature diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-005-first-trigger-starts-saga.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-005-first-trigger-starts-saga.sdp.md new file mode 100644 index 00000000..fd59c5cf --- /dev/null +++ b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-005-first-trigger-starts-saga.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests.first-trigger-starts-saga +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests +--- +# First trigger starts saga + +## Intent + +- outcome: Executable scenario "First trigger starts saga" from packages/platform-core/tests/features/behavior/orchestration/saga-orchestration-executable-tests.feature diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-006-duplicate-trigger-returns-existing-saga.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-006-duplicate-trigger-returns-existing-saga.sdp.md new file mode 100644 index 00000000..8e6895a3 --- /dev/null +++ b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-006-duplicate-trigger-returns-existing-saga.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests.duplicate-trigger-returns-existing-saga +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests +--- +# Duplicate trigger returns existing saga + +## Intent + +- outcome: Executable scenario "Duplicate trigger returns existing saga" from packages/platform-core/tests/features/behavior/orchestration/saga-orchestration-executable-tests.feature diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-007-on-complete-updates-saga-status-after-workflow-finishes.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-007-on-complete-updates-saga-status-after-workflow-finishes.sdp.md new file mode 100644 index 00000000..58840095 --- /dev/null +++ b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-007-on-complete-updates-saga-status-after-workflow-finishes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests.on-complete-updates-saga-status-after-workflow-finishes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests +--- +# onComplete updates saga status after workflow finishes + +## Intent + +- outcome: Executable scenario "onComplete updates saga status after workflow finishes" from packages/platform-core/tests/features/behavior/orchestration/saga-orchestration-executable-tests.feature diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-001-executor-exposes-pm-name-and-event-subscriptions.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-001-executor-exposes-pm-name-and-event-subscriptions.sdp.md new file mode 100644 index 00000000..ce5145e6 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-001-executor-exposes-pm-name-and-event-subscriptions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.executor.executor-exposes-pm-name-and-event-subscriptions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.executor +--- +# Executor exposes pmName and eventSubscriptions + +## Intent + +- outcome: Executable scenario "Executor exposes pmName and eventSubscriptions" from packages/platform-core/tests/features/behavior/processManager/executor.feature diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-002-handles-returns-true-for-subscribed-and-false-for-unsubscribed-events.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-002-handles-returns-true-for-subscribed-and-false-for-unsubscribed-events.sdp.md new file mode 100644 index 00000000..866ab0a9 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-002-handles-returns-true-for-subscribed-and-false-for-unsubscribed-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.executor.handles-returns-true-for-subscribed-and-false-for-unsubscribed-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.executor +--- +# handles() returns true for subscribed and false for unsubscribed events + +## Intent + +- outcome: Executable scenario "handles() returns true for subscribed and false for unsubscribed events" from packages/platform-core/tests/features/behavior/processManager/executor.feature diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-003-processes-event-and-emits-commands.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-003-processes-event-and-emits-commands.sdp.md new file mode 100644 index 00000000..b959f436 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-003-processes-event-and-emits-commands.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.executor.processes-event-and-emits-commands +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.executor +--- +# Processes event and emits commands + +## Intent + +- outcome: Executable scenario "Processes event and emits commands" from packages/platform-core/tests/features/behavior/processManager/executor.feature diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-004-skips-unsubscribed-event-with-not-subscribed-reason.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-004-skips-unsubscribed-event-with-not-subscribed-reason.sdp.md new file mode 100644 index 00000000..d6dc1980 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-004-skips-unsubscribed-event-with-not-subscribed-reason.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.executor.skips-unsubscribed-event-with-not-subscribed-reason +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.executor +--- +# Skips unsubscribed event with not_subscribed reason + +## Intent + +- outcome: Executable scenario "Skips unsubscribed event with not_subscribed reason" from packages/platform-core/tests/features/behavior/processManager/executor.feature diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-005-passes-custom-state-to-handler.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-005-passes-custom-state-to-handler.sdp.md new file mode 100644 index 00000000..cd215054 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-005-passes-custom-state-to-handler.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.executor.passes-custom-state-to-handler +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.executor +--- +# Passes custom state to handler + +## Intent + +- outcome: Executable scenario "Passes custom state to handler" from packages/platform-core/tests/features/behavior/processManager/executor.feature diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-006-uses-stream-id-as-default-instance-id.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-006-uses-stream-id-as-default-instance-id.sdp.md new file mode 100644 index 00000000..9ea49825 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-006-uses-stream-id-as-default-instance-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.executor.uses-stream-id-as-default-instance-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.executor +--- +# Uses streamId as default instance ID + +## Intent + +- outcome: Executable scenario "Uses streamId as default instance ID" from packages/platform-core/tests/features/behavior/processManager/executor.feature diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-007-uses-custom-instance-id-resolver.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-007-uses-custom-instance-id-resolver.sdp.md new file mode 100644 index 00000000..ea4fa918 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-007-uses-custom-instance-id-resolver.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.executor.uses-custom-instance-id-resolver +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.executor +--- +# Uses custom instance ID resolver + +## Intent + +- outcome: Executable scenario "Uses custom instance ID resolver" from packages/platform-core/tests/features/behavior/processManager/executor.feature diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-008-returns-failed-status-when-handler-throws.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-008-returns-failed-status-when-handler-throws.sdp.md new file mode 100644 index 00000000..0169c264 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-008-returns-failed-status-when-handler-throws.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.executor.returns-failed-status-when-handler-throws +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.executor +--- +# Returns failed status when handler throws + +## Intent + +- outcome: Executable scenario "Returns failed status when handler throws" from packages/platform-core/tests/features/behavior/processManager/executor.feature diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-009-returns-failed-status-when-command-emitter-throws.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-009-returns-failed-status-when-command-emitter-throws.sdp.md new file mode 100644 index 00000000..f0b53381 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-009-returns-failed-status-when-command-emitter-throws.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.executor.returns-failed-status-when-command-emitter-throws +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.executor +--- +# Returns failed status when command emitter throws + +## Intent + +- outcome: Executable scenario "Returns failed status when command emitter throws" from packages/platform-core/tests/features/behavior/processManager/executor.feature diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-010-returns-all-pm-names.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-010-returns-all-pm-names.sdp.md new file mode 100644 index 00000000..4134dd4b --- /dev/null +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-010-returns-all-pm-names.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.executor.returns-all-pm-names +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.executor +--- +# Returns all PM names + +## Intent + +- outcome: Executable scenario "Returns all PM names" from packages/platform-core/tests/features/behavior/processManager/executor.feature diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-011-finds-executors-by-event-type.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-011-finds-executors-by-event-type.sdp.md new file mode 100644 index 00000000..f91b3f48 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-011-finds-executors-by-event-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.executor.finds-executors-by-event-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.executor +--- +# Finds executors by event type + +## Intent + +- outcome: Executable scenario "Finds executors by event type" from packages/platform-core/tests/features/behavior/processManager/executor.feature diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-012-processes-event-through-all-matching-executors.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-012-processes-event-through-all-matching-executors.sdp.md new file mode 100644 index 00000000..b621dd35 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-012-processes-event-through-all-matching-executors.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.executor.processes-event-through-all-matching-executors +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.executor +--- +# Processes event through all matching executors + +## Intent + +- outcome: Executable scenario "Processes event through all matching executors" from packages/platform-core/tests/features/behavior/processManager/executor.feature diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-013-returns-empty-array-for-unsubscribed-event.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-013-returns-empty-array-for-unsubscribed-event.sdp.md new file mode 100644 index 00000000..5f792f53 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-013-returns-empty-array-for-unsubscribed-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.executor.returns-empty-array-for-unsubscribed-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.executor +--- +# Returns empty array for unsubscribed event + +## Intent + +- outcome: Executable scenario "Returns empty array for unsubscribed event" from packages/platform-core/tests/features/behavior/processManager/executor.feature diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-014-processes-single-matching-executor.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-014-processes-single-matching-executor.sdp.md new file mode 100644 index 00000000..e8b6a4e1 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-014-processes-single-matching-executor.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.executor.processes-single-matching-executor +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.executor +--- +# Processes single matching executor + +## Intent + +- outcome: Executable scenario "Processes single matching executor" from packages/platform-core/tests/features/behavior/processManager/executor.feature diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-015-isolates-exceptions-so-other-executors-still-run.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-015-isolates-exceptions-so-other-executors-still-run.sdp.md new file mode 100644 index 00000000..287288cf --- /dev/null +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-015-isolates-exceptions-so-other-executors-still-run.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.executor.isolates-exceptions-so-other-executors-still-run +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.executor +--- +# Isolates exceptions so other executors still run + +## Intent + +- outcome: Executable scenario "Isolates exceptions so other executors still run" from packages/platform-core/tests/features/behavior/processManager/executor.feature diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-016-handles-empty-executors-array.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-016-handles-empty-executors-array.sdp.md new file mode 100644 index 00000000..9d074521 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-016-handles-empty-executors-array.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.executor.handles-empty-executors-array +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.executor +--- +# Handles empty executors array + +## Intent + +- outcome: Executable scenario "Handles empty executors array" from packages/platform-core/tests/features/behavior/processManager/executor.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-001-idle-state-allows-start.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-001-idle-state-allows-start.sdp.md new file mode 100644 index 00000000..f8ac6e37 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-001-idle-state-allows-start.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.idle-state-allows-start +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Idle state allows START + +## Intent + +- outcome: Executable scenario "Idle state allows START" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-002-idle-state-rejects-invalid-events.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-002-idle-state-rejects-invalid-events.sdp.md new file mode 100644 index 00000000..2d832231 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-002-idle-state-rejects-invalid-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.idle-state-rejects-invalid-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Idle state rejects invalid events + +## Intent + +- outcome: Executable scenario "Idle state rejects invalid events" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-003-processing-state-allows-success-and-fail.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-003-processing-state-allows-success-and-fail.sdp.md new file mode 100644 index 00000000..0c031db1 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-003-processing-state-allows-success-and-fail.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.processing-state-allows-success-and-fail +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Processing state allows SUCCESS and FAIL + +## Intent + +- outcome: Executable scenario "Processing state allows SUCCESS and FAIL" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-004-processing-state-rejects-invalid-events.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-004-processing-state-rejects-invalid-events.sdp.md new file mode 100644 index 00000000..29fbdfe0 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-004-processing-state-rejects-invalid-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.processing-state-rejects-invalid-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Processing state rejects invalid events + +## Intent + +- outcome: Executable scenario "Processing state rejects invalid events" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-005-completed-state-allows-reset.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-005-completed-state-allows-reset.sdp.md new file mode 100644 index 00000000..90257a02 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-005-completed-state-allows-reset.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.completed-state-allows-reset +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Completed state allows RESET + +## Intent + +- outcome: Executable scenario "Completed state allows RESET" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-006-completed-state-rejects-invalid-events.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-006-completed-state-rejects-invalid-events.sdp.md new file mode 100644 index 00000000..8c07ba0b --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-006-completed-state-rejects-invalid-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.completed-state-rejects-invalid-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Completed state rejects invalid events + +## Intent + +- outcome: Executable scenario "Completed state rejects invalid events" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-007-failed-state-allows-retry-and-reset.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-007-failed-state-allows-retry-and-reset.sdp.md new file mode 100644 index 00000000..33565ad0 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-007-failed-state-allows-retry-and-reset.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.failed-state-allows-retry-and-reset +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Failed state allows RETRY and RESET + +## Intent + +- outcome: Executable scenario "Failed state allows RETRY and RESET" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-008-failed-state-rejects-invalid-events.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-008-failed-state-rejects-invalid-events.sdp.md new file mode 100644 index 00000000..391a3a26 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-008-failed-state-rejects-invalid-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.failed-state-rejects-invalid-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Failed state rejects invalid events + +## Intent + +- outcome: Executable scenario "Failed state rejects invalid events" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-009-valid-transitions-return-correct-target-state.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-009-valid-transitions-return-correct-target-state.sdp.md new file mode 100644 index 00000000..d9b34aa5 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-009-valid-transitions-return-correct-target-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.valid-transitions-return-correct-target-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Valid transitions return correct target state + +## Intent + +- outcome: Executable scenario "Valid transitions return correct target state" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md new file mode 100644 index 00000000..ac1ee418 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.invalid-transitions-return-null +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Invalid transitions return null + +## Intent + +- outcome: Executable scenario "Invalid transitions return null" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-011-idle-state-has-exactly-one-valid-event.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-011-idle-state-has-exactly-one-valid-event.sdp.md new file mode 100644 index 00000000..ed93da1a --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-011-idle-state-has-exactly-one-valid-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.idle-state-has-exactly-one-valid-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Idle state has exactly one valid event + +## Intent + +- outcome: Executable scenario "Idle state has exactly one valid event" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-012-processing-state-has-exactly-two-valid-events.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-012-processing-state-has-exactly-two-valid-events.sdp.md new file mode 100644 index 00000000..46a14ab6 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-012-processing-state-has-exactly-two-valid-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.processing-state-has-exactly-two-valid-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Processing state has exactly two valid events + +## Intent + +- outcome: Executable scenario "Processing state has exactly two valid events" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-013-completed-state-has-exactly-one-valid-event.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-013-completed-state-has-exactly-one-valid-event.sdp.md new file mode 100644 index 00000000..5a17d32c --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-013-completed-state-has-exactly-one-valid-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.completed-state-has-exactly-one-valid-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Completed state has exactly one valid event + +## Intent + +- outcome: Executable scenario "Completed state has exactly one valid event" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-014-failed-state-has-exactly-two-valid-events.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-014-failed-state-has-exactly-two-valid-events.sdp.md new file mode 100644 index 00000000..ecee5529 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-014-failed-state-has-exactly-two-valid-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.failed-state-has-exactly-two-valid-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Failed state has exactly two valid events + +## Intent + +- outcome: Executable scenario "Failed state has exactly two valid events" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-015-returns-exactly-6-transitions-with-correct-properties.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-015-returns-exactly-6-transitions-with-correct-properties.sdp.md new file mode 100644 index 00000000..4e3dbb8c --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-015-returns-exactly-6-transitions-with-correct-properties.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.returns-exactly-6-transitions-with-correct-properties +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Returns exactly 6 transitions with correct properties + +## Intent + +- outcome: Executable scenario "Returns exactly 6 transitions with correct properties" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-016-all-expected-transitions-are-present.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-016-all-expected-transitions-are-present.sdp.md new file mode 100644 index 00000000..72b64c48 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-016-all-expected-transitions-are-present.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.all-expected-transitions-are-present +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# All expected transitions are present + +## Intent + +- outcome: Executable scenario "All expected transitions are present" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-017-returns-same-array-reference-on-repeated-calls.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-017-returns-same-array-reference-on-repeated-calls.sdp.md new file mode 100644 index 00000000..0113aa38 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-017-returns-same-array-reference-on-repeated-calls.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.returns-same-array-reference-on-repeated-calls +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Returns same array reference on repeated calls + +## Intent + +- outcome: Executable scenario "Returns same array reference on repeated calls" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-018-valid-transition-returns-new-state.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-018-valid-transition-returns-new-state.sdp.md new file mode 100644 index 00000000..27d900f4 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-018-valid-transition-returns-new-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.valid-transition-returns-new-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Valid transition returns new state + +## Intent + +- outcome: Executable scenario "Valid transition returns new state" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-019-invalid-transition-throws-with-pm-name-and-instance-id.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-019-invalid-transition-throws-with-pm-name-and-instance-id.sdp.md new file mode 100644 index 00000000..ff7cb5fc --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-019-invalid-transition-throws-with-pm-name-and-instance-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.invalid-transition-throws-with-pm-name-and-instance-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Invalid transition throws with PM name and instance ID + +## Intent + +- outcome: Executable scenario "Invalid transition throws with PM name and instance ID" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-020-completed-is-terminal.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-020-completed-is-terminal.sdp.md new file mode 100644 index 00000000..cf2d08b6 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-020-completed-is-terminal.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.completed-is-terminal +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Completed is terminal + +## Intent + +- outcome: Executable scenario "Completed is terminal" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-021-non-terminal-states-return-false.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-021-non-terminal-states-return-false.sdp.md new file mode 100644 index 00000000..df685678 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-021-non-terminal-states-return-false.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.non-terminal-states-return-false +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Non-terminal states return false + +## Intent + +- outcome: Executable scenario "Non-terminal states return false" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-022-failed-is-an-error-state.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-022-failed-is-an-error-state.sdp.md new file mode 100644 index 00000000..fffc2b8d --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-022-failed-is-an-error-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.failed-is-an-error-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Failed is an error state + +## Intent + +- outcome: Executable scenario "Failed is an error state" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-023-non-error-states-return-false.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-023-non-error-states-return-false.sdp.md new file mode 100644 index 00000000..fe8abee3 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-023-non-error-states-return-false.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.non-error-states-return-false +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Non-error states return false + +## Intent + +- outcome: Executable scenario "Non-error states return false" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-024-all-non-terminal-states-have-at-least-one-valid-event.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-024-all-non-terminal-states-have-at-least-one-valid-event.sdp.md new file mode 100644 index 00000000..ce248b45 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-024-all-non-terminal-states-have-at-least-one-valid-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.all-non-terminal-states-have-at-least-one-valid-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# All non-terminal states have at least one valid event + +## Intent + +- outcome: Executable scenario "All non-terminal states have at least one valid event" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-025-critical-reachability-paths-exist.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-025-critical-reachability-paths-exist.sdp.md new file mode 100644 index 00000000..5de81fa2 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-025-critical-reachability-paths-exist.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.critical-reachability-paths-exist +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Critical reachability paths exist + +## Intent + +- outcome: Executable scenario "Critical reachability paths exist" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-026-happy-path-idle-to-processing-to-completed.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-026-happy-path-idle-to-processing-to-completed.sdp.md new file mode 100644 index 00000000..360ebc94 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-026-happy-path-idle-to-processing-to-completed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.happy-path-idle-to-processing-to-completed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Happy path - idle to processing to completed + +## Intent + +- outcome: Executable scenario "Happy path - idle to processing to completed" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-027-failure-path-idle-to-processing-to-failed.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-027-failure-path-idle-to-processing-to-failed.sdp.md new file mode 100644 index 00000000..c1917cb4 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-027-failure-path-idle-to-processing-to-failed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.failure-path-idle-to-processing-to-failed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Failure path - idle to processing to failed + +## Intent + +- outcome: Executable scenario "Failure path - idle to processing to failed" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-028-retry-workflow-idle-to-processing-to-failed-to-processing-to-completed.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-028-retry-workflow-idle-to-processing-to-failed-to-processing-to-completed.sdp.md new file mode 100644 index 00000000..7e1dabe6 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-028-retry-workflow-idle-to-processing-to-failed-to-processing-to-completed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.retry-workflow-idle-to-processing-to-failed-to-processing-to-completed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Retry workflow - idle to processing to failed to processing to completed + +## Intent + +- outcome: Executable scenario "Retry workflow - idle to processing to failed to processing to completed" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-029-time-triggered-pm-workflow-idle-to-processing-to-completed-to-idle.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-029-time-triggered-pm-workflow-idle-to-processing-to-completed-to-idle.sdp.md new file mode 100644 index 00000000..3710e56d --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-029-time-triggered-pm-workflow-idle-to-processing-to-completed-to-idle.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.time-triggered-pm-workflow-idle-to-processing-to-completed-to-idle +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Time-triggered PM workflow - idle to processing to completed to idle + +## Intent + +- outcome: Executable scenario "Time-triggered PM workflow - idle to processing to completed to idle" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-030-failed-reset-workflow-idle-to-processing-to-failed-to-idle.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-030-failed-reset-workflow-idle-to-processing-to-failed-to-idle.sdp.md new file mode 100644 index 00000000..6f0411f5 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-030-failed-reset-workflow-idle-to-processing-to-failed-to-idle.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.lifecycle.failed-reset-workflow-idle-to-processing-to-failed-to-idle +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.lifecycle +--- +# Failed reset workflow - idle to processing to failed to idle + +## Intent + +- outcome: Executable scenario "Failed reset workflow - idle to processing to failed to idle" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-001-register-a-single-process-manager.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-001-register-a-single-process-manager.sdp.md new file mode 100644 index 00000000..429b85aa --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-001-register-a-single-process-manager.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.register-a-single-process-manager +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Register a single process manager + +## Intent + +- outcome: Executable scenario "Register a single process manager" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-002-register-multiple-process-managers.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-002-register-multiple-process-managers.sdp.md new file mode 100644 index 00000000..4e4126ca --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-002-register-multiple-process-managers.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.register-multiple-process-managers +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Register multiple process managers + +## Intent + +- outcome: Executable scenario "Register multiple process managers" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-003-duplicate-registration-throws-an-error.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-003-duplicate-registration-throws-an-error.sdp.md new file mode 100644 index 00000000..088a6a58 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-003-duplicate-registration-throws-an-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.duplicate-registration-throws-an-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Duplicate registration throws an error + +## Intent + +- outcome: Executable scenario "Duplicate registration throws an error" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-004-get-returns-pm-by-name.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-004-get-returns-pm-by-name.sdp.md new file mode 100644 index 00000000..f03be2f2 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-004-get-returns-pm-by-name.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.get-returns-pm-by-name +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Get returns PM by name + +## Intent + +- outcome: Executable scenario "Get returns PM by name" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-005-get-returns-undefined-for-unknown-pm.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-005-get-returns-undefined-for-unknown-pm.sdp.md new file mode 100644 index 00000000..b7940185 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-005-get-returns-undefined-for-unknown-pm.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.get-returns-undefined-for-unknown-pm +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Get returns undefined for unknown PM + +## Intent + +- outcome: Executable scenario "Get returns undefined for unknown PM" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-006-has-returns-true-for-registered-pm.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-006-has-returns-true-for-registered-pm.sdp.md new file mode 100644 index 00000000..91473ca1 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-006-has-returns-true-for-registered-pm.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.has-returns-true-for-registered-pm +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Has returns true for registered PM + +## Intent + +- outcome: Executable scenario "Has returns true for registered PM" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-007-has-returns-false-for-unregistered-pm.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-007-has-returns-false-for-unregistered-pm.sdp.md new file mode 100644 index 00000000..9df61975 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-007-has-returns-false-for-unregistered-pm.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.has-returns-false-for-unregistered-pm +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Has returns false for unregistered PM + +## Intent + +- outcome: Executable scenario "Has returns false for unregistered PM" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md new file mode 100644 index 00000000..742f93aa --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.list-returns-empty-array-for-empty-registry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# List returns empty array for empty registry + +## Intent + +- outcome: Executable scenario "List returns empty array for empty registry" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-009-list-returns-all-registered-p-ms.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-009-list-returns-all-registered-p-ms.sdp.md new file mode 100644 index 00000000..be83e1ae --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-009-list-returns-all-registered-p-ms.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.list-returns-all-registered-p-ms +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# List returns all registered PMs + +## Intent + +- outcome: Executable scenario "List returns all registered PMs" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md new file mode 100644 index 00000000..92ca1025 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.size-is-0-for-empty-registry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Size is 0 for empty registry + +## Intent + +- outcome: Executable scenario "Size is 0 for empty registry" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-011-size-reflects-registration-count.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-011-size-reflects-registration-count.sdp.md new file mode 100644 index 00000000..fe893d30 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-011-size-reflects-registration-count.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.size-reflects-registration-count +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Size reflects registration count + +## Intent + +- outcome: Executable scenario "Size reflects registration count" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-012-returns-pm-subscribed-to-a-specific-event.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-012-returns-pm-subscribed-to-a-specific-event.sdp.md new file mode 100644 index 00000000..80181055 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-012-returns-pm-subscribed-to-a-specific-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.returns-pm-subscribed-to-a-specific-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Returns PM subscribed to a specific event + +## Intent + +- outcome: Executable scenario "Returns PM subscribed to a specific event" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-013-returns-pm-for-shared-event-across-hybrid-pm.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-013-returns-pm-for-shared-event-across-hybrid-pm.sdp.md new file mode 100644 index 00000000..7b59ac19 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-013-returns-pm-for-shared-event-across-hybrid-pm.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.returns-pm-for-shared-event-across-hybrid-pm +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Returns PM for shared event across hybrid PM + +## Intent + +- outcome: Executable scenario "Returns PM for shared event across hybrid PM" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-014-returns-empty-for-unknown-event-type.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-014-returns-empty-for-unknown-event-type.sdp.md new file mode 100644 index 00000000..fd6d3304 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-014-returns-empty-for-unknown-event-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.returns-empty-for-unknown-event-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Returns empty for unknown event type + +## Intent + +- outcome: Executable scenario "Returns empty for unknown event type" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-015-returns-empty-for-event-matching-no-subscriptions.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-015-returns-empty-for-event-matching-no-subscriptions.sdp.md new file mode 100644 index 00000000..0909d0e7 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-015-returns-empty-for-event-matching-no-subscriptions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.returns-empty-for-event-matching-no-subscriptions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Returns empty for event matching no subscriptions + +## Intent + +- outcome: Executable scenario "Returns empty for event matching no subscriptions" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-016-returns-empty-array-for-empty-registry.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-016-returns-empty-array-for-empty-registry.sdp.md new file mode 100644 index 00000000..81b7be86 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-016-returns-empty-array-for-empty-registry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.returns-empty-array-for-empty-registry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Returns empty array for empty registry + +## Intent + +- outcome: Executable scenario "Returns empty array for empty registry" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-017-returns-unique-sorted-event-types.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-017-returns-unique-sorted-event-types.sdp.md new file mode 100644 index 00000000..cb7ad57e --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-017-returns-unique-sorted-event-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.returns-unique-sorted-event-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Returns unique sorted event types + +## Intent + +- outcome: Executable scenario "Returns unique sorted event types" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-018-returns-empty-array-for-empty-registry-for-commands.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-018-returns-empty-array-for-empty-registry-for-commands.sdp.md new file mode 100644 index 00000000..ace25de9 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-018-returns-empty-array-for-empty-registry-for-commands.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.returns-empty-array-for-empty-registry-for-commands +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Returns empty array for empty registry for commands + +## Intent + +- outcome: Executable scenario "Returns empty array for empty registry for commands" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-019-returns-unique-sorted-command-types.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-019-returns-unique-sorted-command-types.sdp.md new file mode 100644 index 00000000..42e866df --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-019-returns-unique-sorted-command-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.returns-unique-sorted-command-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Returns unique sorted command types + +## Intent + +- outcome: Executable scenario "Returns unique sorted command types" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-020-filters-by-orders-context.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-020-filters-by-orders-context.sdp.md new file mode 100644 index 00000000..bbff1df3 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-020-filters-by-orders-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.filters-by-orders-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Filters by orders context + +## Intent + +- outcome: Executable scenario "Filters by orders context" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-021-filters-by-inventory-context.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-021-filters-by-inventory-context.sdp.md new file mode 100644 index 00000000..9309bbc6 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-021-filters-by-inventory-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.filters-by-inventory-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Filters by inventory context + +## Intent + +- outcome: Executable scenario "Filters by inventory context" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-022-returns-empty-for-unknown-context.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-022-returns-empty-for-unknown-context.sdp.md new file mode 100644 index 00000000..38ae3ceb --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-022-returns-empty-for-unknown-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.returns-empty-for-unknown-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Returns empty for unknown context + +## Intent + +- outcome: Executable scenario "Returns empty for unknown context" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-023-filters-by-event-trigger-type.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-023-filters-by-event-trigger-type.sdp.md new file mode 100644 index 00000000..4c21d173 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-023-filters-by-event-trigger-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.filters-by-event-trigger-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Filters by event trigger type + +## Intent + +- outcome: Executable scenario "Filters by event trigger type" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-024-filters-by-time-trigger-type.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-024-filters-by-time-trigger-type.sdp.md new file mode 100644 index 00000000..372cad58 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-024-filters-by-time-trigger-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.filters-by-time-trigger-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Filters by time trigger type + +## Intent + +- outcome: Executable scenario "Filters by time trigger type" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-025-filters-by-hybrid-trigger-type.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-025-filters-by-hybrid-trigger-type.sdp.md new file mode 100644 index 00000000..b4b5ebfd --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-025-filters-by-hybrid-trigger-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.filters-by-hybrid-trigger-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Filters by hybrid trigger type + +## Intent + +- outcome: Executable scenario "Filters by hybrid trigger type" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-026-returns-time-and-hybrid-triggered-p-ms.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-026-returns-time-and-hybrid-triggered-p-ms.sdp.md new file mode 100644 index 00000000..7eae98d7 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-026-returns-time-and-hybrid-triggered-p-ms.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.returns-time-and-hybrid-triggered-p-ms +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Returns time and hybrid triggered PMs + +## Intent + +- outcome: Executable scenario "Returns time and hybrid triggered PMs" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-027-excludes-event-only-triggered-p-ms.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-027-excludes-event-only-triggered-p-ms.sdp.md new file mode 100644 index 00000000..ef1e94a5 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-027-excludes-event-only-triggered-p-ms.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.excludes-event-only-triggered-p-ms +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Excludes event-only triggered PMs + +## Intent + +- outcome: Executable scenario "Excludes event-only triggered PMs" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-028-all-time-triggered-p-ms-have-cron-config.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-028-all-time-triggered-p-ms-have-cron-config.sdp.md new file mode 100644 index 00000000..06a24013 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-028-all-time-triggered-p-ms-have-cron-config.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.all-time-triggered-p-ms-have-cron-config +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# All time-triggered PMs have cronConfig + +## Intent + +- outcome: Executable scenario "All time-triggered PMs have cronConfig" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-029-find-all-handlers-for-order-shipped-event.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-029-find-all-handlers-for-order-shipped-event.sdp.md new file mode 100644 index 00000000..c4acf5cd --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-029-find-all-handlers-for-order-shipped-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.find-all-handlers-for-order-shipped-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Find all handlers for OrderShipped event + +## Intent + +- outcome: Executable scenario "Find all handlers for OrderShipped event" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-030-get-all-time-triggered-p-ms-for-cron-scheduling.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-030-get-all-time-triggered-p-ms-for-cron-scheduling.sdp.md new file mode 100644 index 00000000..3e43b99d --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-030-get-all-time-triggered-p-ms-for-cron-scheduling.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.get-all-time-triggered-p-ms-for-cron-scheduling +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Get all time-triggered PMs for cron scheduling + +## Intent + +- outcome: Executable scenario "Get all time-triggered PMs for cron scheduling" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-031-pm-with-empty-subscriptions-and-commands-is-handled-correctly.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-031-pm-with-empty-subscriptions-and-commands-is-handled-correctly.sdp.md new file mode 100644 index 00000000..34d3a3d0 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-031-pm-with-empty-subscriptions-and-commands-is-handled-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.pm-with-empty-subscriptions-and-commands-is-handled-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# PM with empty subscriptions and commands is handled correctly + +## Intent + +- outcome: Executable scenario "PM with empty subscriptions and commands is handled correctly" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-032-mixed-p-ms-where-some-have-empty-arrays.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-032-mixed-p-ms-where-some-have-empty-arrays.sdp.md new file mode 100644 index 00000000..a4610f3e --- /dev/null +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-032-mixed-p-ms-where-some-have-empty-arrays.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.registry.mixed-p-ms-where-some-have-empty-arrays +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.registry +--- +# Mixed PMs where some have empty arrays + +## Intent + +- outcome: Executable scenario "Mixed PMs where some have empty arrays" from packages/platform-core/tests/features/behavior/processManager/registry.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-001-no-correlation-strategy-uses-stream-id.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-001-no-correlation-strategy-uses-stream-id.sdp.md new file mode 100644 index 00000000..4c5fcb71 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-001-no-correlation-strategy-uses-stream-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.no-correlation-strategy-uses-stream-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# No correlation strategy uses streamId + +## Intent + +- outcome: Executable scenario "No correlation strategy uses streamId" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-002-correlation-property-is-extracted-from-payload.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-002-correlation-property-is-extracted-from-payload.sdp.md new file mode 100644 index 00000000..9fb606a6 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-002-correlation-property-is-extracted-from-payload.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.correlation-property-is-extracted-from-payload +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Correlation property is extracted from payload + +## Intent + +- outcome: Executable scenario "Correlation property is extracted from payload" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-003-falls-back-to-stream-id-when-correlation-property-not-in-payload.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-003-falls-back-to-stream-id-when-correlation-property-not-in-payload.sdp.md new file mode 100644 index 00000000..6bc3d9bd --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-003-falls-back-to-stream-id-when-correlation-property-not-in-payload.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.falls-back-to-stream-id-when-correlation-property-not-in-payload +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Falls back to streamId when correlation property not in payload + +## Intent + +- outcome: Executable scenario "Falls back to streamId when correlation property not in payload" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-004-falls-back-to-stream-id-when-correlation-property-is-not-a-string.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-004-falls-back-to-stream-id-when-correlation-property-is-not-a-string.sdp.md new file mode 100644 index 00000000..bee04d42 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-004-falls-back-to-stream-id-when-correlation-property-is-not-a-string.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.falls-back-to-stream-id-when-correlation-property-is-not-a-string +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Falls back to streamId when correlation property is not a string + +## Intent + +- outcome: Executable scenario "Falls back to streamId when correlation property is not a string" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-005-falls-back-to-stream-id-when-correlation-property-is-null.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-005-falls-back-to-stream-id-when-correlation-property-is-null.sdp.md new file mode 100644 index 00000000..43629814 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-005-falls-back-to-stream-id-when-correlation-property-is-null.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.falls-back-to-stream-id-when-correlation-property-is-null +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Falls back to streamId when correlation property is null + +## Intent + +- outcome: Executable scenario "Falls back to streamId when correlation property is null" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-006-falls-back-to-stream-id-when-correlation-property-is-undefined.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-006-falls-back-to-stream-id-when-correlation-property-is-undefined.sdp.md new file mode 100644 index 00000000..9aa74e88 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-006-falls-back-to-stream-id-when-correlation-property-is-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.falls-back-to-stream-id-when-correlation-property-is-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Falls back to streamId when correlation property is undefined + +## Intent + +- outcome: Executable scenario "Falls back to streamId when correlation property is undefined" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-007-empty-string-correlation-property-value-is-used-as-is.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-007-empty-string-correlation-property-value-is-used-as-is.sdp.md new file mode 100644 index 00000000..8035a8cb --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-007-empty-string-correlation-property-value-is-used-as-is.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.empty-string-correlation-property-value-is-used-as-is +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Empty string correlation property value is used as-is + +## Intent + +- outcome: Executable scenario "Empty string correlation property value is used as-is" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-008-whitespace-only-correlation-property-value-is-used-as-is.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-008-whitespace-only-correlation-property-value-is-used-as-is.sdp.md new file mode 100644 index 00000000..9cf07103 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-008-whitespace-only-correlation-property-value-is-used-as-is.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.whitespace-only-correlation-property-value-is-used-as-is +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Whitespace-only correlation property value is used as-is + +## Intent + +- outcome: Executable scenario "Whitespace-only correlation property value is used as-is" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-009-order-id-correlation-strategy-extracts-correctly.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-009-order-id-correlation-strategy-extracts-correctly.sdp.md new file mode 100644 index 00000000..789d0e8f --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-009-order-id-correlation-strategy-extracts-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.order-id-correlation-strategy-extracts-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# orderId correlation strategy extracts correctly + +## Intent + +- outcome: Executable scenario "orderId correlation strategy extracts correctly" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-010-subscription-name-without-context.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-010-subscription-name-without-context.sdp.md new file mode 100644 index 00000000..e7bdab8e --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-010-subscription-name-without-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.subscription-name-without-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Subscription name without context + +## Intent + +- outcome: Executable scenario "Subscription name without context" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-011-subscription-name-with-context.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-011-subscription-name-with-context.sdp.md new file mode 100644 index 00000000..302fb5dd --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-011-subscription-name-with-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.subscription-name-with-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Subscription name with context + +## Intent + +- outcome: Executable scenario "Subscription name with context" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-012-default-priority-is-200.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-012-default-priority-is-200.sdp.md new file mode 100644 index 00000000..0b49fca7 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-012-default-priority-is-200.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.default-priority-is-200 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Default priority is 200 + +## Intent + +- outcome: Executable scenario "Default priority is 200" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-013-custom-priority-overrides-default.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-013-custom-priority-overrides-default.sdp.md new file mode 100644 index 00000000..aedbf12c --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-013-custom-priority-overrides-default.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.custom-priority-overrides-default +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Custom priority overrides default + +## Intent + +- outcome: Executable scenario "Custom priority overrides default" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-014-filters-by-event-types-from-pm-definition.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-014-filters-by-event-types-from-pm-definition.sdp.md new file mode 100644 index 00000000..541157fc --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-014-filters-by-event-types-from-pm-definition.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.filters-by-event-types-from-pm-definition +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Filters by event types from PM definition + +## Intent + +- outcome: Executable scenario "Filters by event types from PM definition" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-015-creates-mutable-copy-of-event-types.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-015-creates-mutable-copy-of-event-types.sdp.md new file mode 100644 index 00000000..fef37656 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-015-creates-mutable-copy-of-event-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.creates-mutable-copy-of-event-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Creates mutable copy of event types + +## Intent + +- outcome: Executable scenario "Creates mutable copy of event types" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-016-default-to-handler-args-produces-correct-output.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-016-default-to-handler-args-produces-correct-output.sdp.md new file mode 100644 index 00000000..c158a81e --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-016-default-to-handler-args-produces-correct-output.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.default-to-handler-args-produces-correct-output +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Default toHandlerArgs produces correct output + +## Intent + +- outcome: Executable scenario "Default toHandlerArgs produces correct output" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-017-instance-id-from-correlation-strategy.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-017-instance-id-from-correlation-strategy.sdp.md new file mode 100644 index 00000000..30603765 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-017-instance-id-from-correlation-strategy.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.instance-id-from-correlation-strategy +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# instanceId from correlation strategy + +## Intent + +- outcome: Executable scenario "instanceId from correlation strategy" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-018-custom-to-handler-args-transformer-is-used.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-018-custom-to-handler-args-transformer-is-used.sdp.md new file mode 100644 index 00000000..15c970ec --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-018-custom-to-handler-args-transformer-is-used.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.custom-to-handler-args-transformer-is-used +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Custom toHandlerArgs transformer is used + +## Intent + +- outcome: Executable scenario "Custom toHandlerArgs transformer is used" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-019-default-partition-by-instance-id.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-019-default-partition-by-instance-id.sdp.md new file mode 100644 index 00000000..2b41312e --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-019-default-partition-by-instance-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.default-partition-by-instance-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Default partition by instanceId + +## Intent + +- outcome: Executable scenario "Default partition by instanceId" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-020-correlation-strategy-affects-partition-key.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-020-correlation-strategy-affects-partition-key.sdp.md new file mode 100644 index 00000000..37163593 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-020-correlation-strategy-affects-partition-key.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.correlation-strategy-affects-partition-key +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Correlation strategy affects partition key + +## Intent + +- outcome: Executable scenario "Correlation strategy affects partition key" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-021-custom-get-partition-key-is-used.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-021-custom-get-partition-key-is-used.sdp.md new file mode 100644 index 00000000..dd8eb0c0 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-021-custom-get-partition-key-is-used.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.custom-get-partition-key-is-used +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Custom getPartitionKey is used + +## Intent + +- outcome: Executable scenario "Custom getPartitionKey is used" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-022-handler-reference-is-passed-through.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-022-handler-reference-is-passed-through.sdp.md new file mode 100644 index 00000000..9aeb1726 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-022-handler-reference-is-passed-through.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.handler-reference-is-passed-through +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Handler reference is passed through + +## Intent + +- outcome: Executable scenario "Handler reference is passed through" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-023-bulk-creation-produces-correct-subscription-names.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-023-bulk-creation-produces-correct-subscription-names.sdp.md new file mode 100644 index 00000000..57aefde9 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-023-bulk-creation-produces-correct-subscription-names.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.bulk-creation-produces-correct-subscription-names +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Bulk creation produces correct subscription names + +## Intent + +- outcome: Executable scenario "Bulk creation produces correct subscription names" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-024-missing-handler-throws-error.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-024-missing-handler-throws-error.sdp.md new file mode 100644 index 00000000..2044f2b7 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-024-missing-handler-throws-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.missing-handler-throws-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Missing handler throws error + +## Intent + +- outcome: Executable scenario "Missing handler throws error" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-025-common-priority-applies-to-all-subscriptions.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-025-common-priority-applies-to-all-subscriptions.sdp.md new file mode 100644 index 00000000..da918d3a --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-025-common-priority-applies-to-all-subscriptions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.common-priority-applies-to-all-subscriptions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Common priority applies to all subscriptions + +## Intent + +- outcome: Executable scenario "Common priority applies to all subscriptions" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-026-each-subscription-has-correct-event-filter.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-026-each-subscription-has-correct-event-filter.sdp.md new file mode 100644 index 00000000..22a3873e --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-026-each-subscription-has-correct-event-filter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.each-subscription-has-correct-event-filter +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Each subscription has correct event filter + +## Intent + +- outcome: Executable scenario "Each subscription has correct event filter" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-027-empty-definitions-produces-empty-subscriptions.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-027-empty-definitions-produces-empty-subscriptions.sdp.md new file mode 100644 index 00000000..45c907f3 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-027-empty-definitions-produces-empty-subscriptions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.empty-definitions-produces-empty-subscriptions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Empty definitions produces empty subscriptions + +## Intent + +- outcome: Executable scenario "Empty definitions produces empty subscriptions" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-028-handlers-match-their-definitions.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-028-handlers-match-their-definitions.sdp.md new file mode 100644 index 00000000..92856930 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-028-handlers-match-their-definitions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.handlers-match-their-definitions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Handlers match their definitions + +## Intent + +- outcome: Executable scenario "Handlers match their definitions" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-029-default-priority-constant-is-200.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-029-default-priority-constant-is-200.sdp.md new file mode 100644 index 00000000..a65fdb62 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-029-default-priority-constant-is-200.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.default-priority-constant-is-200 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Default priority constant is 200 + +## Intent + +- outcome: Executable scenario "Default priority constant is 200" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-030-priority-is-after-projections-and-before-sagas.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-030-priority-is-after-projections-and-before-sagas.sdp.md new file mode 100644 index 00000000..5aabe2dc --- /dev/null +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-030-priority-is-after-projections-and-before-sagas.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.subscription.priority-is-after-projections-and-before-sagas +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.subscription +--- +# Priority is after projections and before sagas + +## Intent + +- outcome: Executable scenario "Priority is after projections and before sagas" from packages/platform-core/tests/features/behavior/processManager/subscription.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-001-all-valid-pm-statuses-are-accepted.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-001-all-valid-pm-statuses-are-accepted.sdp.md new file mode 100644 index 00000000..2f7e4cc9 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-001-all-valid-pm-statuses-are-accepted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.all-valid-pm-statuses-are-accepted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# All valid PM statuses are accepted + +## Intent + +- outcome: Executable scenario "All valid PM statuses are accepted" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-002-every-entry-in-process-manager-statuses-passes-the-guard.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-002-every-entry-in-process-manager-statuses-passes-the-guard.sdp.md new file mode 100644 index 00000000..8702173d --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-002-every-entry-in-process-manager-statuses-passes-the-guard.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.every-entry-in-process-manager-statuses-passes-the-guard +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# Every entry in PROCESS_MANAGER_STATUSES passes the guard + +## Intent + +- outcome: Executable scenario "Every entry in PROCESS_MANAGER_STATUSES passes the guard" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-003-invalid-status-strings-are-rejected.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-003-invalid-status-strings-are-rejected.sdp.md new file mode 100644 index 00000000..478dd7e3 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-003-invalid-status-strings-are-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.invalid-status-strings-are-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# Invalid status strings are rejected + +## Intent + +- outcome: Executable scenario "Invalid status strings are rejected" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-004-non-string-values-are-rejected-by-is-process-manager-status.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-004-non-string-values-are-rejected-by-is-process-manager-status.sdp.md new file mode 100644 index 00000000..e201575a --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-004-non-string-values-are-rejected-by-is-process-manager-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.non-string-values-are-rejected-by-is-process-manager-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# Non-string values are rejected by isProcessManagerStatus + +## Intent + +- outcome: Executable scenario "Non-string values are rejected by isProcessManagerStatus" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-005-arrays-containing-valid-statuses-are-rejected-by-is-process-manager-status.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-005-arrays-containing-valid-statuses-are-rejected-by-is-process-manager-status.sdp.md new file mode 100644 index 00000000..4030c0f8 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-005-arrays-containing-valid-statuses-are-rejected-by-is-process-manager-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.arrays-containing-valid-statuses-are-rejected-by-is-process-manager-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# Arrays containing valid statuses are rejected by isProcessManagerStatus + +## Intent + +- outcome: Executable scenario "Arrays containing valid statuses are rejected by isProcessManagerStatus" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-006-is-process-manager-status-is-case-sensitive.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-006-is-process-manager-status-is-case-sensitive.sdp.md new file mode 100644 index 00000000..a3031cdd --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-006-is-process-manager-status-is-case-sensitive.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.is-process-manager-status-is-case-sensitive +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# isProcessManagerStatus is case-sensitive + +## Intent + +- outcome: Executable scenario "isProcessManagerStatus is case-sensitive" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-007-type-narrowing-works-in-conditionals.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-007-type-narrowing-works-in-conditionals.sdp.md new file mode 100644 index 00000000..bf3b17b5 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-007-type-narrowing-works-in-conditionals.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.type-narrowing-works-in-conditionals +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# Type narrowing works in conditionals + +## Intent + +- outcome: Executable scenario "Type narrowing works in conditionals" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-008-type-guard-works-as-array-filter-predicate.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-008-type-guard-works-as-array-filter-predicate.sdp.md new file mode 100644 index 00000000..c887d6a9 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-008-type-guard-works-as-array-filter-predicate.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.type-guard-works-as-array-filter-predicate +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# Type guard works as array filter predicate + +## Intent + +- outcome: Executable scenario "Type guard works as array filter predicate" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-009-process-manager-statuses-contains-exactly-4-statuses-in-order.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-009-process-manager-statuses-contains-exactly-4-statuses-in-order.sdp.md new file mode 100644 index 00000000..d0fdd566 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-009-process-manager-statuses-contains-exactly-4-statuses-in-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.process-manager-statuses-contains-exactly-4-statuses-in-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# PROCESS_MANAGER_STATUSES contains exactly 4 statuses in order + +## Intent + +- outcome: Executable scenario "PROCESS_MANAGER_STATUSES contains exactly 4 statuses in order" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-010-process-manager-statuses-is-a-readonly-array-with-correct-bounds.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-010-process-manager-statuses-is-a-readonly-array-with-correct-bounds.sdp.md new file mode 100644 index 00000000..13b094e4 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-010-process-manager-statuses-is-a-readonly-array-with-correct-bounds.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.process-manager-statuses-is-a-readonly-array-with-correct-bounds +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# PROCESS_MANAGER_STATUSES is a readonly array with correct bounds + +## Intent + +- outcome: Executable scenario "PROCESS_MANAGER_STATUSES is a readonly array with correct bounds" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-011-process-manager-statuses-contains-all-lifecycle-states.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-011-process-manager-statuses-contains-all-lifecycle-states.sdp.md new file mode 100644 index 00000000..c779765d --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-011-process-manager-statuses-contains-all-lifecycle-states.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.process-manager-statuses-contains-all-lifecycle-states +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# PROCESS_MANAGER_STATUSES contains all lifecycle states + +## Intent + +- outcome: Executable scenario "PROCESS_MANAGER_STATUSES contains all lifecycle states" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-012-process-manager-statuses-is-in-logical-lifecycle-order.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-012-process-manager-statuses-is-in-logical-lifecycle-order.sdp.md new file mode 100644 index 00000000..552bec3b --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-012-process-manager-statuses-is-in-logical-lifecycle-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.process-manager-statuses-is-in-logical-lifecycle-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# PROCESS_MANAGER_STATUSES is in logical lifecycle order + +## Intent + +- outcome: Executable scenario "PROCESS_MANAGER_STATUSES is in logical lifecycle order" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-013-all-valid-dead-letter-statuses-are-accepted.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-013-all-valid-dead-letter-statuses-are-accepted.sdp.md new file mode 100644 index 00000000..03e5de24 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-013-all-valid-dead-letter-statuses-are-accepted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.all-valid-dead-letter-statuses-are-accepted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# All valid dead letter statuses are accepted + +## Intent + +- outcome: Executable scenario "All valid dead letter statuses are accepted" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-014-every-entry-in-dead-letter-statuses-passes-the-guard.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-014-every-entry-in-dead-letter-statuses-passes-the-guard.sdp.md new file mode 100644 index 00000000..250cbfa4 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-014-every-entry-in-dead-letter-statuses-passes-the-guard.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.every-entry-in-dead-letter-statuses-passes-the-guard +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# Every entry in DEAD_LETTER_STATUSES passes the guard + +## Intent + +- outcome: Executable scenario "Every entry in DEAD_LETTER_STATUSES passes the guard" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-015-invalid-status-strings-are-rejected-by-is-dead-letter-status.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-015-invalid-status-strings-are-rejected-by-is-dead-letter-status.sdp.md new file mode 100644 index 00000000..184355f7 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-015-invalid-status-strings-are-rejected-by-is-dead-letter-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.invalid-status-strings-are-rejected-by-is-dead-letter-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# Invalid status strings are rejected by isDeadLetterStatus + +## Intent + +- outcome: Executable scenario "Invalid status strings are rejected by isDeadLetterStatus" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-016-pm-statuses-are-rejected-by-is-dead-letter-status.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-016-pm-statuses-are-rejected-by-is-dead-letter-status.sdp.md new file mode 100644 index 00000000..93d2c87d --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-016-pm-statuses-are-rejected-by-is-dead-letter-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.pm-statuses-are-rejected-by-is-dead-letter-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# PM statuses are rejected by isDeadLetterStatus + +## Intent + +- outcome: Executable scenario "PM statuses are rejected by isDeadLetterStatus" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-017-non-string-values-are-rejected-by-is-dead-letter-status.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-017-non-string-values-are-rejected-by-is-dead-letter-status.sdp.md new file mode 100644 index 00000000..ab6e0ad3 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-017-non-string-values-are-rejected-by-is-dead-letter-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.non-string-values-are-rejected-by-is-dead-letter-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# Non-string values are rejected by isDeadLetterStatus + +## Intent + +- outcome: Executable scenario "Non-string values are rejected by isDeadLetterStatus" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-018-arrays-containing-valid-dl-statuses-are-rejected.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-018-arrays-containing-valid-dl-statuses-are-rejected.sdp.md new file mode 100644 index 00000000..29d637d5 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-018-arrays-containing-valid-dl-statuses-are-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.arrays-containing-valid-dl-statuses-are-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# Arrays containing valid DL statuses are rejected + +## Intent + +- outcome: Executable scenario "Arrays containing valid DL statuses are rejected" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-019-is-dead-letter-status-is-case-sensitive.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-019-is-dead-letter-status-is-case-sensitive.sdp.md new file mode 100644 index 00000000..d2ab5443 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-019-is-dead-letter-status-is-case-sensitive.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.is-dead-letter-status-is-case-sensitive +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# isDeadLetterStatus is case-sensitive + +## Intent + +- outcome: Executable scenario "isDeadLetterStatus is case-sensitive" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-020-dl-type-narrowing-works-in-conditionals.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-020-dl-type-narrowing-works-in-conditionals.sdp.md new file mode 100644 index 00000000..b567a5c1 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-020-dl-type-narrowing-works-in-conditionals.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.dl-type-narrowing-works-in-conditionals +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# DL type narrowing works in conditionals + +## Intent + +- outcome: Executable scenario "DL type narrowing works in conditionals" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-021-dl-type-guard-works-as-array-filter-predicate.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-021-dl-type-guard-works-as-array-filter-predicate.sdp.md new file mode 100644 index 00000000..24cde1b9 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-021-dl-type-guard-works-as-array-filter-predicate.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.dl-type-guard-works-as-array-filter-predicate +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# DL type guard works as array filter predicate + +## Intent + +- outcome: Executable scenario "DL type guard works as array filter predicate" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-022-dead-letter-statuses-contains-exactly-3-statuses-in-order.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-022-dead-letter-statuses-contains-exactly-3-statuses-in-order.sdp.md new file mode 100644 index 00000000..3feba699 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-022-dead-letter-statuses-contains-exactly-3-statuses-in-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.dead-letter-statuses-contains-exactly-3-statuses-in-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# DEAD_LETTER_STATUSES contains exactly 3 statuses in order + +## Intent + +- outcome: Executable scenario "DEAD_LETTER_STATUSES contains exactly 3 statuses in order" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-023-dead-letter-statuses-is-a-readonly-array-with-correct-bounds.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-023-dead-letter-statuses-is-a-readonly-array-with-correct-bounds.sdp.md new file mode 100644 index 00000000..b8c1c7e5 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-023-dead-letter-statuses-is-a-readonly-array-with-correct-bounds.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.dead-letter-statuses-is-a-readonly-array-with-correct-bounds +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# DEAD_LETTER_STATUSES is a readonly array with correct bounds + +## Intent + +- outcome: Executable scenario "DEAD_LETTER_STATUSES is a readonly array with correct bounds" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-024-dead-letter-statuses-contains-all-dead-letter-states.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-024-dead-letter-statuses-contains-all-dead-letter-states.sdp.md new file mode 100644 index 00000000..e766b7c3 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-024-dead-letter-statuses-contains-all-dead-letter-states.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.dead-letter-statuses-contains-all-dead-letter-states +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# DEAD_LETTER_STATUSES contains all dead letter states + +## Intent + +- outcome: Executable scenario "DEAD_LETTER_STATUSES contains all dead letter states" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-025-dead-letter-statuses-is-in-logical-workflow-order.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-025-dead-letter-statuses-is-in-logical-workflow-order.sdp.md new file mode 100644 index 00000000..5387db84 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-025-dead-letter-statuses-is-in-logical-workflow-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.dead-letter-statuses-is-in-logical-workflow-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# DEAD_LETTER_STATUSES is in logical workflow order + +## Intent + +- outcome: Executable scenario "DEAD_LETTER_STATUSES is in logical workflow order" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-026-full-dead-letter-with-all-fields-has-correct-structure.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-026-full-dead-letter-with-all-fields-has-correct-structure.sdp.md new file mode 100644 index 00000000..11c19dc4 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-026-full-dead-letter-with-all-fields-has-correct-structure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.full-dead-letter-with-all-fields-has-correct-structure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# Full dead letter with all fields has correct structure + +## Intent + +- outcome: Executable scenario "Full dead letter with all fields has correct structure" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-027-dead-letter-with-only-required-fields-has-undefined-optionals.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-027-dead-letter-with-only-required-fields-has-undefined-optionals.sdp.md new file mode 100644 index 00000000..cbaf4fd2 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-027-dead-letter-with-only-required-fields-has-undefined-optionals.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.dead-letter-with-only-required-fields-has-undefined-optionals +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# Dead letter with only required fields has undefined optionals + +## Intent + +- outcome: Executable scenario "Dead letter with only required fields has undefined optionals" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-028-dead-letter-supports-each-status-individually.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-028-dead-letter-supports-each-status-individually.sdp.md new file mode 100644 index 00000000..f06aed0e --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-028-dead-letter-supports-each-status-individually.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.dead-letter-supports-each-status-individually +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# Dead letter supports each status individually + +## Intent + +- outcome: Executable scenario "Dead letter supports each status individually" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-029-failed-command-captures-command-type-and-complex-payload.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-029-failed-command-captures-command-type-and-complex-payload.sdp.md new file mode 100644 index 00000000..0c0de9af --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-029-failed-command-captures-command-type-and-complex-payload.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.failed-command-captures-command-type-and-complex-payload +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# failedCommand captures command type and complex payload + +## Intent + +- outcome: Executable scenario "failedCommand captures command type and complex payload" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-030-failed-command-allows-empty-payload.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-030-failed-command-allows-empty-payload.sdp.md new file mode 100644 index 00000000..ad638876 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-030-failed-command-allows-empty-payload.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.failed-command-allows-empty-payload +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# failedCommand allows empty payload + +## Intent + +- outcome: Executable scenario "failedCommand allows empty payload" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-031-dead-letter-handles-high-attempt-count.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-031-dead-letter-handles-high-attempt-count.sdp.md new file mode 100644 index 00000000..58c02a17 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-031-dead-letter-handles-high-attempt-count.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.dead-letter-handles-high-attempt-count +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# Dead letter handles high attempt count + +## Intent + +- outcome: Executable scenario "Dead letter handles high attempt count" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-032-dead-letter-handles-long-error-messages.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-032-dead-letter-handles-long-error-messages.sdp.md new file mode 100644 index 00000000..391431e1 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-032-dead-letter-handles-long-error-messages.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.dead-letter-handles-long-error-messages +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# Dead letter handles long error messages + +## Intent + +- outcome: Executable scenario "Dead letter handles long error messages" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-033-dead-letter-handles-complex-context-objects.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-033-dead-letter-handles-complex-context-objects.sdp.md new file mode 100644 index 00000000..c74d9fb2 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/types.examples/s-033-dead-letter-handles-complex-context-objects.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.types.dead-letter-handles-complex-context-objects +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.types +--- +# Dead letter handles complex context objects + +## Intent + +- outcome: Executable scenario "Dead letter handles complex context objects" from packages/platform-core/tests/features/behavior/processManager/types.feature diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-001-process-event-when-no-pm-state-exists.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-001-process-event-when-no-pm-state-exists.sdp.md new file mode 100644 index 00000000..6bfdbad0 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-001-process-event-when-no-pm-state-exists.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.process-event-when-no-pm-state-exists +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint +--- +# Process event when no PM state exists + +## Intent + +- outcome: Executable scenario "Process event when no PM state exists" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md new file mode 100644 index 00000000..32647a6c --- /dev/null +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.process-event-when-global-position-exceeds-checkpoint +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint +--- +# Process event when globalPosition exceeds checkpoint + +## Intent + +- outcome: Executable scenario "Process event when globalPosition exceeds checkpoint" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-003-pm-state-is-updated-after-processing.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-003-pm-state-is-updated-after-processing.sdp.md new file mode 100644 index 00000000..37699bac --- /dev/null +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-003-pm-state-is-updated-after-processing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.pm-state-is-updated-after-processing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint +--- +# PM state is updated after processing + +## Intent + +- outcome: Executable scenario "PM state is updated after processing" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md new file mode 100644 index 00000000..e713893e --- /dev/null +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.skip-event-when-global-position-equals-checkpoint +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint +--- +# Skip event when globalPosition equals checkpoint + +## Intent + +- outcome: Executable scenario "Skip event when globalPosition equals checkpoint" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md new file mode 100644 index 00000000..bcd62ad9 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.skip-event-when-global-position-is-less-than-checkpoint +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint +--- +# Skip event when globalPosition is less than checkpoint + +## Intent + +- outcome: Executable scenario "Skip event when globalPosition is less than checkpoint" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-006-skip-event-when-pm-is-in-completed-state.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-006-skip-event-when-pm-is-in-completed-state.sdp.md new file mode 100644 index 00000000..a97c3876 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-006-skip-event-when-pm-is-in-completed-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.skip-event-when-pm-is-in-completed-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint +--- +# Skip event when PM is in completed state + +## Intent + +- outcome: Executable scenario "Skip event when PM is in completed state" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-007-separate-instances-are-processed-independently.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-007-separate-instances-are-processed-independently.sdp.md new file mode 100644 index 00000000..e2e22d17 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-007-separate-instances-are-processed-independently.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.separate-instances-are-processed-independently +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint +--- +# Separate instances are processed independently + +## Intent + +- outcome: Executable scenario "Separate instances are processed independently" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-008-retry-succeeds-after-emit-commands-failure.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-008-retry-succeeds-after-emit-commands-failure.sdp.md new file mode 100644 index 00000000..3dbc97e9 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-008-retry-succeeds-after-emit-commands-failure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.retry-succeeds-after-emit-commands-failure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint +--- +# Retry succeeds after emitCommands failure + +## Intent + +- outcome: Executable scenario "Retry succeeds after emitCommands failure" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-009-retry-succeeds-when-pm-is-stuck-in-processing-state.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-009-retry-succeeds-when-pm-is-stuck-in-processing-state.sdp.md new file mode 100644 index 00000000..e8247c53 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-009-retry-succeeds-when-pm-is-stuck-in-processing-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.retry-succeeds-when-pm-is-stuck-in-processing-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint +--- +# Retry succeeds when PM is stuck in processing state + +## Intent + +- outcome: Executable scenario "Retry succeeds when PM is stuck in processing state" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-010-reject-negative-global-position.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-010-reject-negative-global-position.sdp.md new file mode 100644 index 00000000..bd6919ca --- /dev/null +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-010-reject-negative-global-position.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.reject-negative-global-position +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint +--- +# Reject negative globalPosition + +## Intent + +- outcome: Executable scenario "Reject negative globalPosition" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-011-global-position-zero-is-treated-as-already-processed.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-011-global-position-zero-is-treated-as-already-processed.sdp.md new file mode 100644 index 00000000..5130daaf --- /dev/null +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-011-global-position-zero-is-treated-as-already-processed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.global-position-zero-is-treated-as-already-processed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint +--- +# GlobalPosition zero is treated as already processed + +## Intent + +- outcome: Executable scenario "GlobalPosition zero is treated as already processed" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-012-first-real-event-after-initialization-is-processed.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-012-first-real-event-after-initialization-is-processed.sdp.md new file mode 100644 index 00000000..f4b33d99 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-012-first-real-event-after-initialization-is-processed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.first-real-event-after-initialization-is-processed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint +--- +# First real event after initialization is processed + +## Intent + +- outcome: Executable scenario "First real event after initialization is processed" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-013-dead-letter-recorded-when-process-throws.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-013-dead-letter-recorded-when-process-throws.sdp.md new file mode 100644 index 00000000..81bf09ca --- /dev/null +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-013-dead-letter-recorded-when-process-throws.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.dead-letter-recorded-when-process-throws +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint +--- +# Dead letter recorded when process throws + +## Intent + +- outcome: Executable scenario "Dead letter recorded when process throws" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-014-dead-letter-recorded-when-emit-commands-throws.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-014-dead-letter-recorded-when-emit-commands-throws.sdp.md new file mode 100644 index 00000000..8674a163 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-014-dead-letter-recorded-when-emit-commands-throws.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.dead-letter-recorded-when-emit-commands-throws +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint +--- +# Dead letter recorded when emitCommands throws + +## Intent + +- outcome: Executable scenario "Dead letter recorded when emitCommands throws" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-015-commands-failed-counter-is-incremented-on-failure.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-015-commands-failed-counter-is-incremented-on-failure.sdp.md new file mode 100644 index 00000000..86379739 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-015-commands-failed-counter-is-incremented-on-failure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.commands-failed-counter-is-incremented-on-failure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint +--- +# commandsFailed counter is incremented on failure + +## Intent + +- outcome: Executable scenario "commandsFailed counter is incremented on failure" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-016-commands-emitted-counter-tracks-multiple-commands.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-016-commands-emitted-counter-tracks-multiple-commands.sdp.md new file mode 100644 index 00000000..845c3da1 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-016-commands-emitted-counter-tracks-multiple-commands.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.commands-emitted-counter-tracks-multiple-commands +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint +--- +# commandsEmitted counter tracks multiple commands + +## Intent + +- outcome: Executable scenario "commandsEmitted counter tracks multiple commands" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-017-result-contains-emitted-command-types.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-017-result-contains-emitted-command-types.sdp.md new file mode 100644 index 00000000..acaa6fb0 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-017-result-contains-emitted-command-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.result-contains-emitted-command-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint +--- +# Result contains emitted command types + +## Intent + +- outcome: Executable scenario "Result contains emitted command types" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-018-empty-command-list-produces-no-op-processed-result.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-018-empty-command-list-produces-no-op-processed-result.sdp.md new file mode 100644 index 00000000..ba3c33bd --- /dev/null +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-018-empty-command-list-produces-no-op-processed-result.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.empty-command-list-produces-no-op-processed-result +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint +--- +# Empty command list produces no-op processed result + +## Intent + +- outcome: Executable scenario "Empty command list produces no-op processed result" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-019-helper-processes-event-and-updates-state.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-019-helper-processes-event-and-updates-state.sdp.md new file mode 100644 index 00000000..7b047186 --- /dev/null +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-019-helper-processes-event-and-updates-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.helper-processes-event-and-updates-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint +--- +# Helper processes event and updates state + +## Intent + +- outcome: Executable scenario "Helper processes event and updates state" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-020-helper-maintains-pm-idempotency-semantics.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-020-helper-maintains-pm-idempotency-semantics.sdp.md new file mode 100644 index 00000000..3fbfb1ae --- /dev/null +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-020-helper-maintains-pm-idempotency-semantics.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.helper-maintains-pm-idempotency-semantics +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint +--- +# Helper maintains PM idempotency semantics + +## Intent + +- outcome: Executable scenario "Helper maintains PM idempotency semantics" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature diff --git a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-001-projection-rebuild-re-processes-events.sdp.md b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-001-projection-rebuild-re-processes-events.sdp.md new file mode 100644 index 00000000..c2e06caa --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-001-projection-rebuild-re-processes-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.admin-tooling.projection-rebuild-re-processes-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.admin-tooling +--- +# Projection rebuild re-processes events + +## Intent + +- outcome: Executable scenario "Projection rebuild re-processes events" from packages/platform-core/tests/features/behavior/production-hardening/admin-tooling.feature diff --git a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-002-dead-letter-retry-re-enqueues-event.sdp.md b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-002-dead-letter-retry-re-enqueues-event.sdp.md new file mode 100644 index 00000000..f12ea264 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-002-dead-letter-retry-re-enqueues-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.admin-tooling.dead-letter-retry-re-enqueues-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.admin-tooling +--- +# Dead letter retry re-enqueues event + +## Intent + +- outcome: Executable scenario "Dead letter retry re-enqueues event" from packages/platform-core/tests/features/behavior/production-hardening/admin-tooling.feature diff --git a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-003-event-flow-trace-returns-full-history.sdp.md b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-003-event-flow-trace-returns-full-history.sdp.md new file mode 100644 index 00000000..eef4b7e7 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-003-event-flow-trace-returns-full-history.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.admin-tooling.event-flow-trace-returns-full-history +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.admin-tooling +--- +# Event flow trace returns full history + +## Intent + +- outcome: Executable scenario "Event flow trace returns full history" from packages/platform-core/tests/features/behavior/production-hardening/admin-tooling.feature diff --git a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-004-rebuild-status-shows-progress.sdp.md b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-004-rebuild-status-shows-progress.sdp.md new file mode 100644 index 00000000..ed8888f1 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-004-rebuild-status-shows-progress.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.admin-tooling.rebuild-status-shows-progress +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.admin-tooling +--- +# Rebuild status shows progress + +## Intent + +- outcome: Executable scenario "Rebuild status shows progress" from packages/platform-core/tests/features/behavior/production-hardening/admin-tooling.feature diff --git a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-005-bulk-dead-letter-retry-processes-all-pending.sdp.md b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-005-bulk-dead-letter-retry-processes-all-pending.sdp.md new file mode 100644 index 00000000..3fbc4bff --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-005-bulk-dead-letter-retry-processes-all-pending.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.admin-tooling.bulk-dead-letter-retry-processes-all-pending +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.admin-tooling +--- +# Bulk dead letter retry processes all pending + +## Intent + +- outcome: Executable scenario "Bulk dead letter retry processes all pending" from packages/platform-core/tests/features/behavior/production-hardening/admin-tooling.feature diff --git a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-006-system-diagnostics-returns-comprehensive-state.sdp.md b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-006-system-diagnostics-returns-comprehensive-state.sdp.md new file mode 100644 index 00000000..757c2402 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-006-system-diagnostics-returns-comprehensive-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.admin-tooling.system-diagnostics-returns-comprehensive-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.admin-tooling +--- +# System diagnostics returns comprehensive state + +## Intent + +- outcome: Executable scenario "System diagnostics returns comprehensive state" from packages/platform-core/tests/features/behavior/production-hardening/admin-tooling.feature diff --git a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-001-circuit-opens-after-repeated-failures.sdp.md b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-001-circuit-opens-after-repeated-failures.sdp.md new file mode 100644 index 00000000..01829ebe --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-001-circuit-opens-after-repeated-failures.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.circuit-breakers.circuit-opens-after-repeated-failures +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.circuit-breakers +--- +# Circuit opens after repeated failures + +## Intent + +- outcome: Executable scenario "Circuit opens after repeated failures" from packages/platform-core/tests/features/behavior/production-hardening/circuit-breakers.feature diff --git a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-002-circuit-transitions-to-half-open-after-timeout.sdp.md b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-002-circuit-transitions-to-half-open-after-timeout.sdp.md new file mode 100644 index 00000000..e13d07c9 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-002-circuit-transitions-to-half-open-after-timeout.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.circuit-breakers.circuit-transitions-to-half-open-after-timeout +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.circuit-breakers +--- +# Circuit transitions to half-open after timeout + +## Intent + +- outcome: Executable scenario "Circuit transitions to half-open after timeout" from packages/platform-core/tests/features/behavior/production-hardening/circuit-breakers.feature diff --git a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-003-successful-half-open-request-closes-circuit.sdp.md b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-003-successful-half-open-request-closes-circuit.sdp.md new file mode 100644 index 00000000..9b4713b8 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-003-successful-half-open-request-closes-circuit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.circuit-breakers.successful-half-open-request-closes-circuit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.circuit-breakers +--- +# Successful half-open request closes circuit + +## Intent + +- outcome: Executable scenario "Successful half-open request closes circuit" from packages/platform-core/tests/features/behavior/production-hardening/circuit-breakers.feature diff --git a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-004-failed-half-open-request-reopens-circuit.sdp.md b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-004-failed-half-open-request-reopens-circuit.sdp.md new file mode 100644 index 00000000..9827493d --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-004-failed-half-open-request-reopens-circuit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.circuit-breakers.failed-half-open-request-reopens-circuit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.circuit-breakers +--- +# Failed half-open request reopens circuit + +## Intent + +- outcome: Executable scenario "Failed half-open request reopens circuit" from packages/platform-core/tests/features/behavior/production-hardening/circuit-breakers.feature diff --git a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-005-circuit-state-persists-across-function-invocations.sdp.md b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-005-circuit-state-persists-across-function-invocations.sdp.md new file mode 100644 index 00000000..77fee2a7 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-005-circuit-state-persists-across-function-invocations.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.circuit-breakers.circuit-state-persists-across-function-invocations +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.circuit-breakers +--- +# Circuit state persists across function invocations + +## Intent + +- outcome: Executable scenario "Circuit state persists across function invocations" from packages/platform-core/tests/features/behavior/production-hardening/circuit-breakers.feature diff --git a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-006-multiple-circuit-breakers-operate-independently.sdp.md b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-006-multiple-circuit-breakers-operate-independently.sdp.md new file mode 100644 index 00000000..65f92490 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-006-multiple-circuit-breakers-operate-independently.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.circuit-breakers.multiple-circuit-breakers-operate-independently +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.circuit-breakers +--- +# Multiple circuit breakers operate independently + +## Intent + +- outcome: Executable scenario "Multiple circuit breakers operate independently" from packages/platform-core/tests/features/behavior/production-hardening/circuit-breakers.feature diff --git a/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-001-trace-spans-command-to-projection-flow.sdp.md b/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-001-trace-spans-command-to-projection-flow.sdp.md new file mode 100644 index 00000000..b264fdfd --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-001-trace-spans-command-to-projection-flow.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.distributed-tracing.trace-spans-command-to-projection-flow +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.distributed-tracing +--- +# Trace spans command-to-projection flow + +## Intent + +- outcome: Executable scenario "Trace spans command-to-projection flow" from packages/platform-core/tests/features/behavior/production-hardening/distributed-tracing.feature diff --git a/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-002-missing-trace-context-uses-default.sdp.md b/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-002-missing-trace-context-uses-default.sdp.md new file mode 100644 index 00000000..461c1540 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-002-missing-trace-context-uses-default.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.distributed-tracing.missing-trace-context-uses-default +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.distributed-tracing +--- +# Missing trace context uses default + +## Intent + +- outcome: Executable scenario "Missing trace context uses default" from packages/platform-core/tests/features/behavior/production-hardening/distributed-tracing.feature diff --git a/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-003-trace-context-is-preserved-in-event-metadata.sdp.md b/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-003-trace-context-is-preserved-in-event-metadata.sdp.md new file mode 100644 index 00000000..92523534 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-003-trace-context-is-preserved-in-event-metadata.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.distributed-tracing.trace-context-is-preserved-in-event-metadata +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.distributed-tracing +--- +# Trace context is preserved in event metadata + +## Intent + +- outcome: Executable scenario "Trace context is preserved in event metadata" from packages/platform-core/tests/features/behavior/production-hardening/distributed-tracing.feature diff --git a/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-004-multiple-projections-share-same-trace.sdp.md b/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-004-multiple-projections-share-same-trace.sdp.md new file mode 100644 index 00000000..3b6f685f --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-004-multiple-projections-share-same-trace.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.distributed-tracing.multiple-projections-share-same-trace +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.distributed-tracing +--- +# Multiple projections share same trace + +## Intent + +- outcome: Executable scenario "Multiple projections share same trace" from packages/platform-core/tests/features/behavior/production-hardening/distributed-tracing.feature diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-001-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-001-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md new file mode 100644 index 00000000..d9f79dce --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-001-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.durable-function-integration.circuit-breaker-uses-action-retrier-for-half-open-probe +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.durable-function-integration +--- +# Circuit breaker uses action retrier for half-open probe + +## Intent + +- outcome: Executable scenario "Circuit breaker uses action retrier for half-open probe" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-002-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-002-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md new file mode 100644 index 00000000..0777e383 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-002-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.durable-function-integration.failed-half-open-probe-reopens-circuit-via-action-retrier +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.durable-function-integration +--- +# Failed half-open probe reopens circuit via action retrier + +## Intent + +- outcome: Executable scenario "Failed half-open probe reopens circuit via action retrier" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-003-closed-circuit-uses-action-retrier-with-configured-retries.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-003-closed-circuit-uses-action-retrier-with-configured-retries.sdp.md new file mode 100644 index 00000000..9af3148e --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-003-closed-circuit-uses-action-retrier-with-configured-retries.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.durable-function-integration.closed-circuit-uses-action-retrier-with-configured-retries +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.durable-function-integration +--- +# Closed circuit uses action retrier with configured retries + +## Intent + +- outcome: Executable scenario "Closed circuit uses action retrier with configured retries" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-004-dcb-conflict-triggers-workpool-based-retry.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-004-dcb-conflict-triggers-workpool-based-retry.sdp.md new file mode 100644 index 00000000..780e982d --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-004-dcb-conflict-triggers-workpool-based-retry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.durable-function-integration.dcb-conflict-triggers-workpool-based-retry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.durable-function-integration +--- +# DCB conflict triggers Workpool-based retry + +## Intent + +- outcome: Executable scenario "DCB conflict triggers Workpool-based retry" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-005-dcb-retry-respects-exponential-backoff-with-jitter.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-005-dcb-retry-respects-exponential-backoff-with-jitter.sdp.md new file mode 100644 index 00000000..968cccd0 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-005-dcb-retry-respects-exponential-backoff-with-jitter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.durable-function-integration.dcb-retry-respects-exponential-backoff-with-jitter +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.durable-function-integration +--- +# DCB retry respects exponential backoff with jitter + +## Intent + +- outcome: Executable scenario "DCB retry respects exponential backoff with jitter" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-006-dcb-retry-uses-latest-version-after-conflict.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-006-dcb-retry-uses-latest-version-after-conflict.sdp.md new file mode 100644 index 00000000..6d1eacd8 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-006-dcb-retry-uses-latest-version-after-conflict.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.durable-function-integration.dcb-retry-uses-latest-version-after-conflict +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.durable-function-integration +--- +# DCB retry uses latest version after conflict + +## Intent + +- outcome: Executable scenario "DCB retry uses latest version after conflict" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-007-dcb-retry-partition-key-prevents-concurrent-retries.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-007-dcb-retry-partition-key-prevents-concurrent-retries.sdp.md new file mode 100644 index 00000000..b8e53615 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-007-dcb-retry-partition-key-prevents-concurrent-retries.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.durable-function-integration.dcb-retry-partition-key-prevents-concurrent-retries +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.durable-function-integration +--- +# DCB retry partition key prevents concurrent retries + +## Intent + +- outcome: Executable scenario "DCB retry partition key prevents concurrent retries" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-008-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-008-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md new file mode 100644 index 00000000..0ab9b47b --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-008-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.durable-function-integration.dead-letter-retry-uses-action-retrier-for-external-calls +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.durable-function-integration +--- +# Dead letter retry uses action retrier for external calls + +## Intent + +- outcome: Executable scenario "Dead letter retry uses action retrier for external calls" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-009-failed-dlq-retry-returns-to-pending-status.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-009-failed-dlq-retry-returns-to-pending-status.sdp.md new file mode 100644 index 00000000..7a168627 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-009-failed-dlq-retry-returns-to-pending-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.durable-function-integration.failed-dlq-retry-returns-to-pending-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.durable-function-integration +--- +# Failed DLQ retry returns to pending status + +## Intent + +- outcome: Executable scenario "Failed DLQ retry returns to pending status" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-010-successful-dlq-retry-marks-item-resolved.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-010-successful-dlq-retry-marks-item-resolved.sdp.md new file mode 100644 index 00000000..a0ad5163 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-010-successful-dlq-retry-marks-item-resolved.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.durable-function-integration.successful-dlq-retry-marks-item-resolved +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.durable-function-integration +--- +# Successful DLQ retry marks item resolved + +## Intent + +- outcome: Executable scenario "Successful DLQ retry marks item resolved" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-011-dlq-retry-tracks-retry-count.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-011-dlq-retry-tracks-retry-count.sdp.md new file mode 100644 index 00000000..e2060d8c --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-011-dlq-retry-tracks-retry-count.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.durable-function-integration.dlq-retry-tracks-retry-count +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.durable-function-integration +--- +# DLQ retry tracks retry count + +## Intent + +- outcome: Executable scenario "DLQ retry tracks retry count" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature diff --git a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-001-readiness-probe-checks-dependencies.sdp.md b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-001-readiness-probe-checks-dependencies.sdp.md new file mode 100644 index 00000000..55cd3dd8 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-001-readiness-probe-checks-dependencies.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.health-endpoints.readiness-probe-checks-dependencies +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.health-endpoints +--- +# Readiness probe checks dependencies + +## Intent + +- outcome: Executable scenario "Readiness probe checks dependencies" from packages/platform-core/tests/features/behavior/production-hardening/health-endpoints.feature diff --git a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-002-unhealthy-dependency-fails-readiness.sdp.md b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-002-unhealthy-dependency-fails-readiness.sdp.md new file mode 100644 index 00000000..b537da3e --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-002-unhealthy-dependency-fails-readiness.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.health-endpoints.unhealthy-dependency-fails-readiness +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.health-endpoints +--- +# Unhealthy dependency fails readiness + +## Intent + +- outcome: Executable scenario "Unhealthy dependency fails readiness" from packages/platform-core/tests/features/behavior/production-hardening/health-endpoints.feature diff --git a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-003-liveness-probe-always-succeeds.sdp.md b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-003-liveness-probe-always-succeeds.sdp.md new file mode 100644 index 00000000..21c7acbb --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-003-liveness-probe-always-succeeds.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.health-endpoints.liveness-probe-always-succeeds +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.health-endpoints +--- +# Liveness probe always succeeds + +## Intent + +- outcome: Executable scenario "Liveness probe always succeeds" from packages/platform-core/tests/features/behavior/production-hardening/health-endpoints.feature diff --git a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-004-projection-lag-threshold-determines-health.sdp.md b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-004-projection-lag-threshold-determines-health.sdp.md new file mode 100644 index 00000000..75cd57d3 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-004-projection-lag-threshold-determines-health.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.health-endpoints.projection-lag-threshold-determines-health +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.health-endpoints +--- +# Projection lag threshold determines health + +## Intent + +- outcome: Executable scenario "Projection lag threshold determines health" from packages/platform-core/tests/features/behavior/production-hardening/health-endpoints.feature diff --git a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-005-health-response-includes-all-component-statuses.sdp.md b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-005-health-response-includes-all-component-statuses.sdp.md new file mode 100644 index 00000000..01429d14 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-005-health-response-includes-all-component-statuses.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.health-endpoints.health-response-includes-all-component-statuses +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.health-endpoints +--- +# Health response includes all component statuses + +## Intent + +- outcome: Executable scenario "Health response includes all component statuses" from packages/platform-core/tests/features/behavior/production-hardening/health-endpoints.feature diff --git a/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-001-projection-lag-is-tracked.sdp.md b/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-001-projection-lag-is-tracked.sdp.md new file mode 100644 index 00000000..5f85ff10 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-001-projection-lag-is-tracked.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.metrics-collection.projection-lag-is-tracked +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.metrics-collection +--- +# Projection lag is tracked + +## Intent + +- outcome: Executable scenario "Projection lag is tracked" from packages/platform-core/tests/features/behavior/production-hardening/metrics-collection.feature diff --git a/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-002-metrics-collection-handles-missing-checkpoints.sdp.md b/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-002-metrics-collection-handles-missing-checkpoints.sdp.md new file mode 100644 index 00000000..55ef8388 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-002-metrics-collection-handles-missing-checkpoints.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.metrics-collection.metrics-collection-handles-missing-checkpoints +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.metrics-collection +--- +# Metrics collection handles missing checkpoints + +## Intent + +- outcome: Executable scenario "Metrics collection handles missing checkpoints" from packages/platform-core/tests/features/behavior/production-hardening/metrics-collection.feature diff --git a/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-003-event-throughput-is-calculated.sdp.md b/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-003-event-throughput-is-calculated.sdp.md new file mode 100644 index 00000000..af30a99d --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-003-event-throughput-is-calculated.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.metrics-collection.event-throughput-is-calculated +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.metrics-collection +--- +# Event throughput is calculated + +## Intent + +- outcome: Executable scenario "Event throughput is calculated" from packages/platform-core/tests/features/behavior/production-hardening/metrics-collection.feature diff --git a/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-004-dead-letter-queue-size-is-tracked.sdp.md b/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-004-dead-letter-queue-size-is-tracked.sdp.md new file mode 100644 index 00000000..f63a2b97 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-004-dead-letter-queue-size-is-tracked.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.metrics-collection.dead-letter-queue-size-is-tracked +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.metrics-collection +--- +# Dead letter queue size is tracked + +## Intent + +- outcome: Executable scenario "Dead letter queue size is tracked" from packages/platform-core/tests/features/behavior/production-hardening/metrics-collection.feature diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-001-requests-within-rate-limit-succeed.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-001-requests-within-rate-limit-succeed.sdp.md new file mode 100644 index 00000000..9e44c33f --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-001-requests-within-rate-limit-succeed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.rate-limiting.requests-within-rate-limit-succeed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.rate-limiting +--- +# Requests within rate limit succeed + +## Intent + +- outcome: Executable scenario "Requests within rate limit succeed" from packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-002-requests-exceeding-rate-limit-are-rejected.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-002-requests-exceeding-rate-limit-are-rejected.sdp.md new file mode 100644 index 00000000..e4042907 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-002-requests-exceeding-rate-limit-are-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.rate-limiting.requests-exceeding-rate-limit-are-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.rate-limiting +--- +# Requests exceeding rate limit are rejected + +## Intent + +- outcome: Executable scenario "Requests exceeding rate limit are rejected" from packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-003-token-bucket-refills-over-time.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-003-token-bucket-refills-over-time.sdp.md new file mode 100644 index 00000000..c028051e --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-003-token-bucket-refills-over-time.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.rate-limiting.token-bucket-refills-over-time +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.rate-limiting +--- +# Token bucket refills over time + +## Intent + +- outcome: Executable scenario "Token bucket refills over time" from packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-004-rate-limit-key-isolation-by-user.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-004-rate-limit-key-isolation-by-user.sdp.md new file mode 100644 index 00000000..d36e6a58 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-004-rate-limit-key-isolation-by-user.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.rate-limiting.rate-limit-key-isolation-by-user +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.rate-limiting +--- +# Rate limit key isolation by user + +## Intent + +- outcome: Executable scenario "Rate limit key isolation by user" from packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-005-admin-rebuild-respects-hourly-limit.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-005-admin-rebuild-respects-hourly-limit.sdp.md new file mode 100644 index 00000000..ddcbe30e --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-005-admin-rebuild-respects-hourly-limit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.rate-limiting.admin-rebuild-respects-hourly-limit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.rate-limiting +--- +# Admin rebuild respects hourly limit + +## Intent + +- outcome: Executable scenario "Admin rebuild respects hourly limit" from packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-006-admin-rebuild-blocked-when-limit-exceeded.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-006-admin-rebuild-blocked-when-limit-exceeded.sdp.md new file mode 100644 index 00000000..be167c37 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-006-admin-rebuild-blocked-when-limit-exceeded.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.rate-limiting.admin-rebuild-blocked-when-limit-exceeded +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.rate-limiting +--- +# Admin rebuild blocked when limit exceeded + +## Intent + +- outcome: Executable scenario "Admin rebuild blocked when limit exceeded" from packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-007-adapter-converts-component-response-to-rate-limit-result.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-007-adapter-converts-component-response-to-rate-limit-result.sdp.md new file mode 100644 index 00000000..5498c1f0 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-007-adapter-converts-component-response-to-rate-limit-result.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.rate-limiting.adapter-converts-component-response-to-rate-limit-result +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.rate-limiting +--- +# Adapter converts component response to RateLimitResult + +## Intent + +- outcome: Executable scenario "Adapter converts component response to RateLimitResult" from packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-008-adapter-handles-component-errors-gracefully.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-008-adapter-handles-component-errors-gracefully.sdp.md new file mode 100644 index 00000000..610803d1 --- /dev/null +++ b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-008-adapter-handles-component-errors-gracefully.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.production-hardening.rate-limiting.adapter-handles-component-errors-gracefully +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.production-hardening.rate-limiting +--- +# Adapter handles component errors gracefully + +## Intent + +- outcome: Executable scenario "Adapter handles component errors gracefully" from packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature diff --git a/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-001-projection-categories-tuple-contains-all-valid-categories.sdp.md b/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-001-projection-categories-tuple-contains-all-valid-categories.sdp.md new file mode 100644 index 00000000..0dc2210d --- /dev/null +++ b/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-001-projection-categories-tuple-contains-all-valid-categories.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projection-categories.category-definitions.projection-categories-tuple-contains-all-valid-categories +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projection-categories.category-definitions +--- +# PROJECTION_CATEGORIES tuple contains all valid categories + +## Intent + +- outcome: Executable scenario "PROJECTION_CATEGORIES tuple contains all valid categories" from packages/platform-core/tests/features/behavior/projection-categories/category-definitions.feature diff --git a/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-002-is-projection-category-validates-category-strings.sdp.md b/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-002-is-projection-category-validates-category-strings.sdp.md new file mode 100644 index 00000000..d9b2b89c --- /dev/null +++ b/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-002-is-projection-category-validates-category-strings.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projection-categories.category-definitions.is-projection-category-validates-category-strings +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projection-categories.category-definitions +--- +# isProjectionCategory validates category strings + +## Intent + +- outcome: Executable scenario "isProjectionCategory validates category strings" from packages/platform-core/tests/features/behavior/projection-categories/category-definitions.feature diff --git a/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-003-category-helper-functions-identify-correct-categories.sdp.md b/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-003-category-helper-functions-identify-correct-categories.sdp.md new file mode 100644 index 00000000..0de94aad --- /dev/null +++ b/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-003-category-helper-functions-identify-correct-categories.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projection-categories.category-definitions.category-helper-functions-identify-correct-categories +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projection-categories.category-definitions +--- +# Category helper functions identify correct categories + +## Intent + +- outcome: Executable scenario "Category helper functions identify correct categories" from packages/platform-core/tests/features/behavior/projection-categories/category-definitions.feature diff --git a/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-004-is-client-exposed-returns-correct-exposure-status.sdp.md b/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-004-is-client-exposed-returns-correct-exposure-status.sdp.md new file mode 100644 index 00000000..c72cea1e --- /dev/null +++ b/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-004-is-client-exposed-returns-correct-exposure-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projection-categories.category-definitions.is-client-exposed-returns-correct-exposure-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projection-categories.category-definitions +--- +# isClientExposed returns correct exposure status + +## Intent + +- outcome: Executable scenario "isClientExposed returns correct exposure status" from packages/platform-core/tests/features/behavior/projection-categories/category-definitions.feature diff --git a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-001-missing-category-returns-category-required-error.sdp.md b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-001-missing-category-returns-category-required-error.sdp.md new file mode 100644 index 00000000..cf80c68b --- /dev/null +++ b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-001-missing-category-returns-category-required-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projection-categories.explicit-declaration.missing-category-returns-category-required-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projection-categories.explicit-declaration +--- +# Missing category returns CATEGORY_REQUIRED error + +## Intent + +- outcome: Executable scenario "Missing category returns CATEGORY_REQUIRED error" from packages/platform-core/tests/features/behavior/projection-categories/explicit-declaration.feature diff --git a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-002-null-category-returns-category-required-error.sdp.md b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-002-null-category-returns-category-required-error.sdp.md new file mode 100644 index 00000000..6aa788d7 --- /dev/null +++ b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-002-null-category-returns-category-required-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projection-categories.explicit-declaration.null-category-returns-category-required-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projection-categories.explicit-declaration +--- +# Null category returns CATEGORY_REQUIRED error + +## Intent + +- outcome: Executable scenario "Null category returns CATEGORY_REQUIRED error" from packages/platform-core/tests/features/behavior/projection-categories/explicit-declaration.feature diff --git a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-003-valid-category-passes-validation.sdp.md b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-003-valid-category-passes-validation.sdp.md new file mode 100644 index 00000000..d001ac22 --- /dev/null +++ b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-003-valid-category-passes-validation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projection-categories.explicit-declaration.valid-category-passes-validation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projection-categories.explicit-declaration +--- +# Valid category passes validation + +## Intent + +- outcome: Executable scenario "Valid category passes validation" from packages/platform-core/tests/features/behavior/projection-categories/explicit-declaration.feature diff --git a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-004-assert-valid-category-returns-category-on-valid-input.sdp.md b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-004-assert-valid-category-returns-category-on-valid-input.sdp.md new file mode 100644 index 00000000..f67d2d49 --- /dev/null +++ b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-004-assert-valid-category-returns-category-on-valid-input.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projection-categories.explicit-declaration.assert-valid-category-returns-category-on-valid-input +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projection-categories.explicit-declaration +--- +# assertValidCategory returns category on valid input + +## Intent + +- outcome: Executable scenario "assertValidCategory returns category on valid input" from packages/platform-core/tests/features/behavior/projection-categories/explicit-declaration.feature diff --git a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-005-invalid-category-returns-invalid-category-error.sdp.md b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-005-invalid-category-returns-invalid-category-error.sdp.md new file mode 100644 index 00000000..f6ffe614 --- /dev/null +++ b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-005-invalid-category-returns-invalid-category-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projection-categories.explicit-declaration.invalid-category-returns-invalid-category-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projection-categories.explicit-declaration +--- +# Invalid category returns INVALID_CATEGORY error + +## Intent + +- outcome: Executable scenario "Invalid category returns INVALID_CATEGORY error" from packages/platform-core/tests/features/behavior/projection-categories/explicit-declaration.feature diff --git a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-006-assert-valid-category-throws-on-invalid-input.sdp.md b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-006-assert-valid-category-throws-on-invalid-input.sdp.md new file mode 100644 index 00000000..7ae2e29f --- /dev/null +++ b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-006-assert-valid-category-throws-on-invalid-input.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projection-categories.explicit-declaration.assert-valid-category-throws-on-invalid-input +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projection-categories.explicit-declaration +--- +# assertValidCategory throws on invalid input + +## Intent + +- outcome: Executable scenario "assertValidCategory throws on invalid input" from packages/platform-core/tests/features/behavior/projection-categories/explicit-declaration.feature diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-001-get-by-category-returns-all-view-projections.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-001-get-by-category-returns-all-view-projections.sdp.md new file mode 100644 index 00000000..905cf32f --- /dev/null +++ b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-001-get-by-category-returns-all-view-projections.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projection-categories.registry-lookup.get-by-category-returns-all-view-projections +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projection-categories.registry-lookup +--- +# getByCategory returns all view projections + +## Intent + +- outcome: Executable scenario "getByCategory returns all view projections" from packages/platform-core/tests/features/behavior/projection-categories/registry-lookup.feature diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-002-get-by-category-returns-all-logic-projections.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-002-get-by-category-returns-all-logic-projections.sdp.md new file mode 100644 index 00000000..f0907d2b --- /dev/null +++ b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-002-get-by-category-returns-all-logic-projections.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projection-categories.registry-lookup.get-by-category-returns-all-logic-projections +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projection-categories.registry-lookup +--- +# getByCategory returns all logic projections + +## Intent + +- outcome: Executable scenario "getByCategory returns all logic projections" from packages/platform-core/tests/features/behavior/projection-categories/registry-lookup.feature diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-003-get-by-category-returns-all-reporting-projections.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-003-get-by-category-returns-all-reporting-projections.sdp.md new file mode 100644 index 00000000..25396cc8 --- /dev/null +++ b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-003-get-by-category-returns-all-reporting-projections.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projection-categories.registry-lookup.get-by-category-returns-all-reporting-projections +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projection-categories.registry-lookup +--- +# getByCategory returns all reporting projections + +## Intent + +- outcome: Executable scenario "getByCategory returns all reporting projections" from packages/platform-core/tests/features/behavior/projection-categories/registry-lookup.feature diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-004-get-by-category-returns-all-integration-projections.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-004-get-by-category-returns-all-integration-projections.sdp.md new file mode 100644 index 00000000..171e46ae --- /dev/null +++ b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-004-get-by-category-returns-all-integration-projections.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projection-categories.registry-lookup.get-by-category-returns-all-integration-projections +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projection-categories.registry-lookup +--- +# getByCategory returns all integration projections + +## Intent + +- outcome: Executable scenario "getByCategory returns all integration projections" from packages/platform-core/tests/features/behavior/projection-categories/registry-lookup.feature diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-005-get-by-category-returns-empty-array-for-category-with-no-projections.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-005-get-by-category-returns-empty-array-for-category-with-no-projections.sdp.md new file mode 100644 index 00000000..5bfd7fc8 --- /dev/null +++ b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-005-get-by-category-returns-empty-array-for-category-with-no-projections.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projection-categories.registry-lookup.get-by-category-returns-empty-array-for-category-with-no-projections +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projection-categories.registry-lookup +--- +# getByCategory returns empty array for category with no projections + +## Intent + +- outcome: Executable scenario "getByCategory returns empty array for category with no projections" from packages/platform-core/tests/features/behavior/projection-categories/registry-lookup.feature diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-006-target-view-projections-for-reactive-layer.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-006-target-view-projections-for-reactive-layer.sdp.md new file mode 100644 index 00000000..8888882f --- /dev/null +++ b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-006-target-view-projections-for-reactive-layer.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projection-categories.registry-lookup.target-view-projections-for-reactive-layer +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projection-categories.registry-lookup +--- +# Target view projections for reactive layer + +## Intent + +- outcome: Executable scenario "Target view projections for reactive layer" from packages/platform-core/tests/features/behavior/projection-categories/registry-lookup.feature diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-007-target-integration-projections-for-event-bus-routing.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-007-target-integration-projections-for-event-bus-routing.sdp.md new file mode 100644 index 00000000..f51babf4 --- /dev/null +++ b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-007-target-integration-projections-for-event-bus-routing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projection-categories.registry-lookup.target-integration-projections-for-event-bus-routing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projection-categories.registry-lookup +--- +# Target integration projections for EventBus routing + +## Intent + +- outcome: Executable scenario "Target integration projections for EventBus routing" from packages/platform-core/tests/features/behavior/projection-categories/registry-lookup.feature diff --git a/specs/behavior/platform-core/projections/categories.examples/s-001-projection-category-schema-accepts-all-valid-categories.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-001-projection-category-schema-accepts-all-valid-categories.sdp.md new file mode 100644 index 00000000..0dd34562 --- /dev/null +++ b/specs/behavior/platform-core/projections/categories.examples/s-001-projection-category-schema-accepts-all-valid-categories.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.categories.projection-category-schema-accepts-all-valid-categories +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.categories +--- +# ProjectionCategorySchema accepts all valid categories + +## Intent + +- outcome: Executable scenario "ProjectionCategorySchema accepts all valid categories" from packages/platform-core/tests/features/behavior/projections/categories.feature diff --git a/specs/behavior/platform-core/projections/categories.examples/s-002-projection-category-schema-rejects-invalid-values.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-002-projection-category-schema-rejects-invalid-values.sdp.md new file mode 100644 index 00000000..35d2dbba --- /dev/null +++ b/specs/behavior/platform-core/projections/categories.examples/s-002-projection-category-schema-rejects-invalid-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.categories.projection-category-schema-rejects-invalid-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.categories +--- +# ProjectionCategorySchema rejects invalid values + +## Intent + +- outcome: Executable scenario "ProjectionCategorySchema rejects invalid values" from packages/platform-core/tests/features/behavior/projections/categories.feature diff --git a/specs/behavior/platform-core/projections/categories.examples/s-003-projection-category-schema-rejects-non-string-types.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-003-projection-category-schema-rejects-non-string-types.sdp.md new file mode 100644 index 00000000..1de00f31 --- /dev/null +++ b/specs/behavior/platform-core/projections/categories.examples/s-003-projection-category-schema-rejects-non-string-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.categories.projection-category-schema-rejects-non-string-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.categories +--- +# ProjectionCategorySchema rejects non-string types + +## Intent + +- outcome: Executable scenario "ProjectionCategorySchema rejects non-string types" from packages/platform-core/tests/features/behavior/projections/categories.feature diff --git a/specs/behavior/platform-core/projections/categories.examples/s-004-is-projection-category-rejects-objects.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-004-is-projection-category-rejects-objects.sdp.md new file mode 100644 index 00000000..24f2d992 --- /dev/null +++ b/specs/behavior/platform-core/projections/categories.examples/s-004-is-projection-category-rejects-objects.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.categories.is-projection-category-rejects-objects +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.categories +--- +# isProjectionCategory rejects objects + +## Intent + +- outcome: Executable scenario "isProjectionCategory rejects objects" from packages/platform-core/tests/features/behavior/projections/categories.feature diff --git a/specs/behavior/platform-core/projections/categories.examples/s-005-is-projection-category-rejects-arrays.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-005-is-projection-category-rejects-arrays.sdp.md new file mode 100644 index 00000000..534249df --- /dev/null +++ b/specs/behavior/platform-core/projections/categories.examples/s-005-is-projection-category-rejects-arrays.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.categories.is-projection-category-rejects-arrays +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.categories +--- +# isProjectionCategory rejects arrays + +## Intent + +- outcome: Executable scenario "isProjectionCategory rejects arrays" from packages/platform-core/tests/features/behavior/projections/categories.feature diff --git a/specs/behavior/platform-core/projections/categories.examples/s-006-is-projection-category-rejects-booleans.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-006-is-projection-category-rejects-booleans.sdp.md new file mode 100644 index 00000000..20d6c564 --- /dev/null +++ b/specs/behavior/platform-core/projections/categories.examples/s-006-is-projection-category-rejects-booleans.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.categories.is-projection-category-rejects-booleans +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.categories +--- +# isProjectionCategory rejects booleans + +## Intent + +- outcome: Executable scenario "isProjectionCategory rejects booleans" from packages/platform-core/tests/features/behavior/projections/categories.feature diff --git a/specs/behavior/platform-core/projections/categories.examples/s-007-is-projection-category-rejects-whitespace-padded-strings.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-007-is-projection-category-rejects-whitespace-padded-strings.sdp.md new file mode 100644 index 00000000..48495a7d --- /dev/null +++ b/specs/behavior/platform-core/projections/categories.examples/s-007-is-projection-category-rejects-whitespace-padded-strings.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.categories.is-projection-category-rejects-whitespace-padded-strings +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.categories +--- +# isProjectionCategory rejects whitespace-padded strings + +## Intent + +- outcome: Executable scenario "isProjectionCategory rejects whitespace-padded strings" from packages/platform-core/tests/features/behavior/projections/categories.feature diff --git a/specs/behavior/platform-core/projections/categories.examples/s-008-projection-validation-errors-has-expected-error-codes.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-008-projection-validation-errors-has-expected-error-codes.sdp.md new file mode 100644 index 00000000..4907cc06 --- /dev/null +++ b/specs/behavior/platform-core/projections/categories.examples/s-008-projection-validation-errors-has-expected-error-codes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.categories.projection-validation-errors-has-expected-error-codes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.categories +--- +# PROJECTION_VALIDATION_ERRORS has expected error codes + +## Intent + +- outcome: Executable scenario "PROJECTION_VALIDATION_ERRORS has expected error codes" from packages/platform-core/tests/features/behavior/projections/categories.feature diff --git a/specs/behavior/platform-core/projections/categories.examples/s-009-validate-projection-category-rejects-non-string-types.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-009-validate-projection-category-rejects-non-string-types.sdp.md new file mode 100644 index 00000000..2041e5e8 --- /dev/null +++ b/specs/behavior/platform-core/projections/categories.examples/s-009-validate-projection-category-rejects-non-string-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.categories.validate-projection-category-rejects-non-string-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.categories +--- +# validateProjectionCategory rejects non-string types + +## Intent + +- outcome: Executable scenario "validateProjectionCategory rejects non-string types" from packages/platform-core/tests/features/behavior/projections/categories.feature diff --git a/specs/behavior/platform-core/projections/categories.examples/s-010-assert-valid-category-throws-category-required-for-undefined.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-010-assert-valid-category-throws-category-required-for-undefined.sdp.md new file mode 100644 index 00000000..c067df2d --- /dev/null +++ b/specs/behavior/platform-core/projections/categories.examples/s-010-assert-valid-category-throws-category-required-for-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.categories.assert-valid-category-throws-category-required-for-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.categories +--- +# assertValidCategory throws CATEGORY_REQUIRED for undefined + +## Intent + +- outcome: Executable scenario "assertValidCategory throws CATEGORY_REQUIRED for undefined" from packages/platform-core/tests/features/behavior/projections/categories.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-001-allowed-transitions-from-active-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-001-allowed-transitions-from-active-state.sdp.md new file mode 100644 index 00000000..57b294ed --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-001-allowed-transitions-from-active-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.allowed-transitions-from-active-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Allowed transitions from active state + +## Intent + +- outcome: Executable scenario "Allowed transitions from active state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-002-rejected-transitions-from-active-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-002-rejected-transitions-from-active-state.sdp.md new file mode 100644 index 00000000..4402f0da --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-002-rejected-transitions-from-active-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.rejected-transitions-from-active-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Rejected transitions from active state + +## Intent + +- outcome: Executable scenario "Rejected transitions from active state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-003-allowed-transitions-from-rebuilding-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-003-allowed-transitions-from-rebuilding-state.sdp.md new file mode 100644 index 00000000..0e019a1e --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-003-allowed-transitions-from-rebuilding-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.allowed-transitions-from-rebuilding-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Allowed transitions from rebuilding state + +## Intent + +- outcome: Executable scenario "Allowed transitions from rebuilding state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-004-rejected-transitions-from-rebuilding-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-004-rejected-transitions-from-rebuilding-state.sdp.md new file mode 100644 index 00000000..8f2ea64b --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-004-rejected-transitions-from-rebuilding-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.rejected-transitions-from-rebuilding-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Rejected transitions from rebuilding state + +## Intent + +- outcome: Executable scenario "Rejected transitions from rebuilding state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-005-allowed-transitions-from-paused-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-005-allowed-transitions-from-paused-state.sdp.md new file mode 100644 index 00000000..82317fb6 --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-005-allowed-transitions-from-paused-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.allowed-transitions-from-paused-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Allowed transitions from paused state + +## Intent + +- outcome: Executable scenario "Allowed transitions from paused state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-006-rejected-transitions-from-paused-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-006-rejected-transitions-from-paused-state.sdp.md new file mode 100644 index 00000000..9efa6b97 --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-006-rejected-transitions-from-paused-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.rejected-transitions-from-paused-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Rejected transitions from paused state + +## Intent + +- outcome: Executable scenario "Rejected transitions from paused state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-007-allowed-transitions-from-error-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-007-allowed-transitions-from-error-state.sdp.md new file mode 100644 index 00000000..0ab3b669 --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-007-allowed-transitions-from-error-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.allowed-transitions-from-error-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Allowed transitions from error state + +## Intent + +- outcome: Executable scenario "Allowed transitions from error state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-008-rejected-transitions-from-error-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-008-rejected-transitions-from-error-state.sdp.md new file mode 100644 index 00000000..0436fd5a --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-008-rejected-transitions-from-error-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.rejected-transitions-from-error-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Rejected transitions from error state + +## Intent + +- outcome: Executable scenario "Rejected transitions from error state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-009-valid-transitions-produce-correct-target-states.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-009-valid-transitions-produce-correct-target-states.sdp.md new file mode 100644 index 00000000..b868af6e --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-009-valid-transitions-produce-correct-target-states.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.valid-transitions-produce-correct-target-states +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Valid transitions produce correct target states + +## Intent + +- outcome: Executable scenario "Valid transitions produce correct target states" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md new file mode 100644 index 00000000..c3b4a8d0 --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.invalid-transitions-return-null +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Invalid transitions return null + +## Intent + +- outcome: Executable scenario "Invalid transitions return null" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-011-valid-events-from-active-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-011-valid-events-from-active-state.sdp.md new file mode 100644 index 00000000..a7380293 --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-011-valid-events-from-active-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.valid-events-from-active-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Valid events from active state + +## Intent + +- outcome: Executable scenario "Valid events from active state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-012-valid-events-from-rebuilding-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-012-valid-events-from-rebuilding-state.sdp.md new file mode 100644 index 00000000..04166090 --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-012-valid-events-from-rebuilding-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.valid-events-from-rebuilding-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Valid events from rebuilding state + +## Intent + +- outcome: Executable scenario "Valid events from rebuilding state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-013-valid-events-from-paused-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-013-valid-events-from-paused-state.sdp.md new file mode 100644 index 00000000..9031f7fa --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-013-valid-events-from-paused-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.valid-events-from-paused-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Valid events from paused state + +## Intent + +- outcome: Executable scenario "Valid events from paused state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-014-valid-events-from-error-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-014-valid-events-from-error-state.sdp.md new file mode 100644 index 00000000..7e4e084e --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-014-valid-events-from-error-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.valid-events-from-error-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Valid events from error state + +## Intent + +- outcome: Executable scenario "Valid events from error state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-015-returns-all-10-valid-transitions-with-correct-structure.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-015-returns-all-10-valid-transitions-with-correct-structure.sdp.md new file mode 100644 index 00000000..9486eb89 --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-015-returns-all-10-valid-transitions-with-correct-structure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.returns-all-10-valid-transitions-with-correct-structure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Returns all 10 valid transitions with correct structure + +## Intent + +- outcome: Executable scenario "Returns all 10 valid transitions with correct structure" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-016-all-expected-transitions-are-included.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-016-all-expected-transitions-are-included.sdp.md new file mode 100644 index 00000000..2bbe4b7a --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-016-all-expected-transitions-are-included.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.all-expected-transitions-are-included +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# All expected transitions are included + +## Intent + +- outcome: Executable scenario "All expected transitions are included" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-017-returns-same-array-reference-memoized.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-017-returns-same-array-reference-memoized.sdp.md new file mode 100644 index 00000000..83d9861f --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-017-returns-same-array-reference-memoized.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.returns-same-array-reference-memoized +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Returns same array reference (memoized) + +## Intent + +- outcome: Executable scenario "Returns same array reference (memoized)" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-018-returns-new-state-for-valid-transition.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-018-returns-new-state-for-valid-transition.sdp.md new file mode 100644 index 00000000..0ab711e4 --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-018-returns-new-state-for-valid-transition.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.returns-new-state-for-valid-transition +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Returns new state for valid transition + +## Intent + +- outcome: Executable scenario "Returns new state for valid transition" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-019-throws-for-invalid-transition-with-projection-name.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-019-throws-for-invalid-transition-with-projection-name.sdp.md new file mode 100644 index 00000000..3968ccc7 --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-019-throws-for-invalid-transition-with-projection-name.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.throws-for-invalid-transition-with-projection-name +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Throws for invalid transition with projection name + +## Intent + +- outcome: Executable scenario "Throws for invalid transition with projection name" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-020-all-states-are-reachable-from-at-least-one-other-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-020-all-states-are-reachable-from-at-least-one-other-state.sdp.md new file mode 100644 index 00000000..f796f394 --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-020-all-states-are-reachable-from-at-least-one-other-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.all-states-are-reachable-from-at-least-one-other-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# All states are reachable from at least one other state + +## Intent + +- outcome: Executable scenario "All states are reachable from at least one other state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-021-all-states-have-at-least-one-outgoing-transition.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-021-all-states-have-at-least-one-outgoing-transition.sdp.md new file mode 100644 index 00000000..d460f341 --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-021-all-states-have-at-least-one-outgoing-transition.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.all-states-have-at-least-one-outgoing-transition +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# All states have at least one outgoing transition + +## Intent + +- outcome: Executable scenario "All states have at least one outgoing transition" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-022-recovery-path-exists-from-error-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-022-recovery-path-exists-from-error-to-active.sdp.md new file mode 100644 index 00000000..76876b29 --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-022-recovery-path-exists-from-error-to-active.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.recovery-path-exists-from-error-to-active +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Recovery path exists from error to active + +## Intent + +- outcome: Executable scenario "Recovery path exists from error to active" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-023-error-path-exists-from-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-023-error-path-exists-from-active.sdp.md new file mode 100644 index 00000000..9238f4ee --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-023-error-path-exists-from-active.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.error-path-exists-from-active +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Error path exists from active + +## Intent + +- outcome: Executable scenario "Error path exists from active" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-024-rebuild-retry-path-exists-from-error.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-024-rebuild-retry-path-exists-from-error.sdp.md new file mode 100644 index 00000000..8bf86822 --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-024-rebuild-retry-path-exists-from-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.rebuild-retry-path-exists-from-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Rebuild retry path exists from error + +## Intent + +- outcome: Executable scenario "Rebuild retry path exists from error" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-025-normal-processing-active-state-allows-fail-event.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-025-normal-processing-active-state-allows-fail-event.sdp.md new file mode 100644 index 00000000..33e62e4b --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-025-normal-processing-active-state-allows-fail-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.normal-processing-active-state-allows-fail-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Normal processing — active state allows FAIL event + +## Intent + +- outcome: Executable scenario "Normal processing — active state allows FAIL event" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-026-rebuild-workflow-active-to-rebuilding-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-026-rebuild-workflow-active-to-rebuilding-to-active.sdp.md new file mode 100644 index 00000000..a2252536 --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-026-rebuild-workflow-active-to-rebuilding-to-active.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.rebuild-workflow-active-to-rebuilding-to-active +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Rebuild workflow — active to rebuilding to active + +## Intent + +- outcome: Executable scenario "Rebuild workflow — active to rebuilding to active" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-027-error-recovery-workflow-active-to-error-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-027-error-recovery-workflow-active-to-error-to-active.sdp.md new file mode 100644 index 00000000..ff9781a8 --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-027-error-recovery-workflow-active-to-error-to-active.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.error-recovery-workflow-active-to-error-to-active +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Error recovery workflow — active to error to active + +## Intent + +- outcome: Executable scenario "Error recovery workflow — active to error to active" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-028-error-rebuild-workflow-active-to-error-to-rebuilding-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-028-error-rebuild-workflow-active-to-error-to-rebuilding-to-active.sdp.md new file mode 100644 index 00000000..37fa38e9 --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-028-error-rebuild-workflow-active-to-error-to-rebuilding-to-active.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.error-rebuild-workflow-active-to-error-to-rebuilding-to-active +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Error rebuild workflow — active to error to rebuilding to active + +## Intent + +- outcome: Executable scenario "Error rebuild workflow — active to error to rebuilding to active" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-029-pause-and-resume-workflow-active-to-paused-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-029-pause-and-resume-workflow-active-to-paused-to-active.sdp.md new file mode 100644 index 00000000..b26e7e2e --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-029-pause-and-resume-workflow-active-to-paused-to-active.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.pause-and-resume-workflow-active-to-paused-to-active +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Pause and resume workflow — active to paused to active + +## Intent + +- outcome: Executable scenario "Pause and resume workflow — active to paused to active" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-030-rebuild-failure-workflow-active-to-rebuilding-to-error-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-030-rebuild-failure-workflow-active-to-rebuilding-to-error-to-active.sdp.md new file mode 100644 index 00000000..92687f7a --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-030-rebuild-failure-workflow-active-to-rebuilding-to-error-to-active.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.rebuild-failure-workflow-active-to-rebuilding-to-error-to-active +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Rebuild failure workflow — active to rebuilding to error to active + +## Intent + +- outcome: Executable scenario "Rebuild failure workflow — active to rebuilding to error to active" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-031-paused-rebuild-workflow-active-to-paused-to-rebuilding-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-031-paused-rebuild-workflow-active-to-paused-to-rebuilding-to-active.sdp.md new file mode 100644 index 00000000..f8dac940 --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-031-paused-rebuild-workflow-active-to-paused-to-rebuilding-to-active.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.paused-rebuild-workflow-active-to-paused-to-rebuilding-to-active +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Paused rebuild workflow — active to paused to rebuilding to active + +## Intent + +- outcome: Executable scenario "Paused rebuild workflow — active to paused to rebuilding to active" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-032-paused-error-workflow-active-to-paused-to-error-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-032-paused-error-workflow-active-to-paused-to-error-to-active.sdp.md new file mode 100644 index 00000000..de15895d --- /dev/null +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-032-paused-error-workflow-active-to-paused-to-error-to-active.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.lifecycle.paused-error-workflow-active-to-paused-to-error-to-active +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.lifecycle +--- +# Paused error workflow — active to paused to error to active + +## Intent + +- outcome: Executable scenario "Paused error workflow — active to paused to error to active" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-001-register-a-single-projection.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-001-register-a-single-projection.sdp.md new file mode 100644 index 00000000..78cd7041 --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-001-register-a-single-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.register-a-single-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# Register a single projection + +## Intent + +- outcome: Executable scenario "Register a single projection" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-002-register-multiple-projections.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-002-register-multiple-projections.sdp.md new file mode 100644 index 00000000..53c2f878 --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-002-register-multiple-projections.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.register-multiple-projections +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# Register multiple projections + +## Intent + +- outcome: Executable scenario "Register multiple projections" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-003-duplicate-projection-name-throws-error.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-003-duplicate-projection-name-throws-error.sdp.md new file mode 100644 index 00000000..96dab727 --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-003-duplicate-projection-name-throws-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.duplicate-projection-name-throws-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# Duplicate projection name throws error + +## Intent + +- outcome: Executable scenario "Duplicate projection name throws error" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-004-get-returns-projection-by-name.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-004-get-returns-projection-by-name.sdp.md new file mode 100644 index 00000000..1eba382e --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-004-get-returns-projection-by-name.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.get-returns-projection-by-name +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# Get returns projection by name + +## Intent + +- outcome: Executable scenario "Get returns projection by name" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-005-get-returns-undefined-for-unknown-projection.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-005-get-returns-undefined-for-unknown-projection.sdp.md new file mode 100644 index 00000000..54d7b89b --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-005-get-returns-undefined-for-unknown-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.get-returns-undefined-for-unknown-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# Get returns undefined for unknown projection + +## Intent + +- outcome: Executable scenario "Get returns undefined for unknown projection" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-006-has-returns-true-for-registered-projection.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-006-has-returns-true-for-registered-projection.sdp.md new file mode 100644 index 00000000..cd162c67 --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-006-has-returns-true-for-registered-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.has-returns-true-for-registered-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# Has returns true for registered projection + +## Intent + +- outcome: Executable scenario "Has returns true for registered projection" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-007-has-returns-false-for-unregistered-projection.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-007-has-returns-false-for-unregistered-projection.sdp.md new file mode 100644 index 00000000..25a865c7 --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-007-has-returns-false-for-unregistered-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.has-returns-false-for-unregistered-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# Has returns false for unregistered projection + +## Intent + +- outcome: Executable scenario "Has returns false for unregistered projection" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md new file mode 100644 index 00000000..b56c3fcc --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.list-returns-empty-array-for-empty-registry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# List returns empty array for empty registry + +## Intent + +- outcome: Executable scenario "List returns empty array for empty registry" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-009-list-returns-all-registered-projections.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-009-list-returns-all-registered-projections.sdp.md new file mode 100644 index 00000000..59c47cb6 --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-009-list-returns-all-registered-projections.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.list-returns-all-registered-projections +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# List returns all registered projections + +## Intent + +- outcome: Executable scenario "List returns all registered projections" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md new file mode 100644 index 00000000..4ff2d7ce --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.size-is-0-for-empty-registry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# Size is 0 for empty registry + +## Intent + +- outcome: Executable scenario "Size is 0 for empty registry" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-011-size-reflects-registration-count.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-011-size-reflects-registration-count.sdp.md new file mode 100644 index 00000000..47b687dc --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-011-size-reflects-registration-count.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.size-reflects-registration-count +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# Size reflects registration count + +## Intent + +- outcome: Executable scenario "Size reflects registration count" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-012-get-by-event-type-returns-multiple-matching-projections.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-012-get-by-event-type-returns-multiple-matching-projections.sdp.md new file mode 100644 index 00000000..dc0b2423 --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-012-get-by-event-type-returns-multiple-matching-projections.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.get-by-event-type-returns-multiple-matching-projections +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# GetByEventType returns multiple matching projections + +## Intent + +- outcome: Executable scenario "GetByEventType returns multiple matching projections" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-013-get-by-event-type-returns-single-context-specific-projection.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-013-get-by-event-type-returns-single-context-specific-projection.sdp.md new file mode 100644 index 00000000..7e0dc696 --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-013-get-by-event-type-returns-single-context-specific-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.get-by-event-type-returns-single-context-specific-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# GetByEventType returns single context-specific projection + +## Intent + +- outcome: Executable scenario "GetByEventType returns single context-specific projection" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-014-get-by-event-type-returns-empty-for-unknown-event.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-014-get-by-event-type-returns-empty-for-unknown-event.sdp.md new file mode 100644 index 00000000..1521d33b --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-014-get-by-event-type-returns-empty-for-unknown-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.get-by-event-type-returns-empty-for-unknown-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# GetByEventType returns empty for unknown event + +## Intent + +- outcome: Executable scenario "GetByEventType returns empty for unknown event" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-015-get-all-event-types-returns-empty-for-empty-registry.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-015-get-all-event-types-returns-empty-for-empty-registry.sdp.md new file mode 100644 index 00000000..0d1a3991 --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-015-get-all-event-types-returns-empty-for-empty-registry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.get-all-event-types-returns-empty-for-empty-registry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# GetAllEventTypes returns empty for empty registry + +## Intent + +- outcome: Executable scenario "GetAllEventTypes returns empty for empty registry" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-016-get-all-event-types-returns-sorted-unique-event-types.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-016-get-all-event-types-returns-sorted-unique-event-types.sdp.md new file mode 100644 index 00000000..e10e593a --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-016-get-all-event-types-returns-sorted-unique-event-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.get-all-event-types-returns-sorted-unique-event-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# GetAllEventTypes returns sorted unique event types + +## Intent + +- outcome: Executable scenario "GetAllEventTypes returns sorted unique event types" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-017-get-by-context-filters-by-orders-context.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-017-get-by-context-filters-by-orders-context.sdp.md new file mode 100644 index 00000000..f80e593b --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-017-get-by-context-filters-by-orders-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.get-by-context-filters-by-orders-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# GetByContext filters by orders context + +## Intent + +- outcome: Executable scenario "GetByContext filters by orders context" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-018-get-by-context-filters-by-inventory-context.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-018-get-by-context-filters-by-inventory-context.sdp.md new file mode 100644 index 00000000..d92603f6 --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-018-get-by-context-filters-by-inventory-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.get-by-context-filters-by-inventory-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# GetByContext filters by inventory context + +## Intent + +- outcome: Executable scenario "GetByContext filters by inventory context" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-019-get-by-context-filters-by-cross-context.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-019-get-by-context-filters-by-cross-context.sdp.md new file mode 100644 index 00000000..0434f092 --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-019-get-by-context-filters-by-cross-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.get-by-context-filters-by-cross-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# GetByContext filters by cross-context + +## Intent + +- outcome: Executable scenario "GetByContext filters by cross-context" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-020-get-by-context-returns-empty-for-unknown-context.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-020-get-by-context-returns-empty-for-unknown-context.sdp.md new file mode 100644 index 00000000..d1cda6aa --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-020-get-by-context-returns-empty-for-unknown-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.get-by-context-returns-empty-for-unknown-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# GetByContext returns empty for unknown context + +## Intent + +- outcome: Executable scenario "GetByContext returns empty for unknown context" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-021-get-rebuild-order-returns-empty-for-empty-registry.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-021-get-rebuild-order-returns-empty-for-empty-registry.sdp.md new file mode 100644 index 00000000..c12cf9e3 --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-021-get-rebuild-order-returns-empty-for-empty-registry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.get-rebuild-order-returns-empty-for-empty-registry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# GetRebuildOrder returns empty for empty registry + +## Intent + +- outcome: Executable scenario "GetRebuildOrder returns empty for empty registry" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-022-get-rebuild-order-places-primary-before-cross-context.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-022-get-rebuild-order-places-primary-before-cross-context.sdp.md new file mode 100644 index 00000000..548f8ced --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-022-get-rebuild-order-places-primary-before-cross-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.get-rebuild-order-places-primary-before-cross-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# GetRebuildOrder places primary before cross-context + +## Intent + +- outcome: Executable scenario "GetRebuildOrder places primary before cross-context" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-023-get-by-category-returns-view-projections.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-023-get-by-category-returns-view-projections.sdp.md new file mode 100644 index 00000000..3580fe14 --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-023-get-by-category-returns-view-projections.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.get-by-category-returns-view-projections +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# GetByCategory returns view projections + +## Intent + +- outcome: Executable scenario "GetByCategory returns view projections" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-024-get-by-category-returns-logic-projections.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-024-get-by-category-returns-logic-projections.sdp.md new file mode 100644 index 00000000..631be229 --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-024-get-by-category-returns-logic-projections.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.get-by-category-returns-logic-projections +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# GetByCategory returns logic projections + +## Intent + +- outcome: Executable scenario "GetByCategory returns logic projections" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-025-get-by-category-returns-reporting-projections.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-025-get-by-category-returns-reporting-projections.sdp.md new file mode 100644 index 00000000..3d9f4031 --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-025-get-by-category-returns-reporting-projections.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.get-by-category-returns-reporting-projections +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# GetByCategory returns reporting projections + +## Intent + +- outcome: Executable scenario "GetByCategory returns reporting projections" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-026-get-by-category-returns-integration-projections.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-026-get-by-category-returns-integration-projections.sdp.md new file mode 100644 index 00000000..1c90e2a1 --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-026-get-by-category-returns-integration-projections.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.get-by-category-returns-integration-projections +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# GetByCategory returns integration projections + +## Intent + +- outcome: Executable scenario "GetByCategory returns integration projections" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-027-get-by-category-returns-empty-when-no-projections-match.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-027-get-by-category-returns-empty-when-no-projections-match.sdp.md new file mode 100644 index 00000000..c8eed1ff --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-027-get-by-category-returns-empty-when-no-projections-match.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.get-by-category-returns-empty-when-no-projections-match +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# GetByCategory returns empty when no projections match + +## Intent + +- outcome: Executable scenario "GetByCategory returns empty when no projections match" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-028-get-by-category-verifies-all-results-have-requested-category.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-028-get-by-category-verifies-all-results-have-requested-category.sdp.md new file mode 100644 index 00000000..ac35e073 --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-028-get-by-category-verifies-all-results-have-requested-category.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.get-by-category-verifies-all-results-have-requested-category +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# GetByCategory verifies all results have requested category + +## Intent + +- outcome: Executable scenario "GetByCategory verifies all results have requested category" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-029-get-by-category-works-regardless-of-registration-order.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-029-get-by-category-works-regardless-of-registration-order.sdp.md new file mode 100644 index 00000000..34ffc5b2 --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-029-get-by-category-works-regardless-of-registration-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.get-by-category-works-regardless-of-registration-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# GetByCategory works regardless of registration order + +## Intent + +- outcome: Executable scenario "GetByCategory works regardless of registration order" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/registry.examples/s-030-category-index-is-maintained-incrementally.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-030-category-index-is-maintained-incrementally.sdp.md new file mode 100644 index 00000000..780ce78c --- /dev/null +++ b/specs/behavior/platform-core/projections/registry.examples/s-030-category-index-is-maintained-incrementally.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.registry.category-index-is-maintained-incrementally +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.registry +--- +# Category index is maintained incrementally + +## Intent + +- outcome: Executable scenario "Category index is maintained incrementally" from packages/platform-core/tests/features/behavior/projections/registry.feature diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-001-process-event-when-no-checkpoint-exists.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-001-process-event-when-no-checkpoint-exists.sdp.md new file mode 100644 index 00000000..884a2b9f --- /dev/null +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-001-process-event-when-no-checkpoint-exists.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.with-checkpoint.process-event-when-no-checkpoint-exists +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.with-checkpoint +--- +# Process event when no checkpoint exists + +## Intent + +- outcome: Executable scenario "Process event when no checkpoint exists" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md new file mode 100644 index 00000000..ceb327e3 --- /dev/null +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.with-checkpoint.process-event-when-global-position-exceeds-checkpoint +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.with-checkpoint +--- +# Process event when globalPosition exceeds checkpoint + +## Intent + +- outcome: Executable scenario "Process event when globalPosition exceeds checkpoint" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-003-checkpoint-is-updated-after-processing.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-003-checkpoint-is-updated-after-processing.sdp.md new file mode 100644 index 00000000..6061337f --- /dev/null +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-003-checkpoint-is-updated-after-processing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.with-checkpoint.checkpoint-is-updated-after-processing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.with-checkpoint +--- +# Checkpoint is updated after processing + +## Intent + +- outcome: Executable scenario "Checkpoint is updated after processing" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md new file mode 100644 index 00000000..c61ba6ba --- /dev/null +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.with-checkpoint.skip-event-when-global-position-equals-checkpoint +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.with-checkpoint +--- +# Skip event when globalPosition equals checkpoint + +## Intent + +- outcome: Executable scenario "Skip event when globalPosition equals checkpoint" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md new file mode 100644 index 00000000..1f7ebaaa --- /dev/null +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.with-checkpoint.skip-event-when-global-position-is-less-than-checkpoint +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.with-checkpoint +--- +# Skip event when globalPosition is less than checkpoint + +## Intent + +- outcome: Executable scenario "Skip event when globalPosition is less than checkpoint" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-006-separate-checkpoints-per-partition.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-006-separate-checkpoints-per-partition.sdp.md new file mode 100644 index 00000000..ae568bf0 --- /dev/null +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-006-separate-checkpoints-per-partition.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.with-checkpoint.separate-checkpoints-per-partition +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.with-checkpoint +--- +# Separate checkpoints per partition + +## Intent + +- outcome: Executable scenario "Separate checkpoints per partition" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-007-same-position-in-different-partitions-does-not-cause-skip.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-007-same-position-in-different-partitions-does-not-cause-skip.sdp.md new file mode 100644 index 00000000..711aa78f --- /dev/null +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-007-same-position-in-different-partitions-does-not-cause-skip.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.with-checkpoint.same-position-in-different-partitions-does-not-cause-skip +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.with-checkpoint +--- +# Same position in different partitions does not cause skip + +## Intent + +- outcome: Executable scenario "Same position in different partitions does not cause skip" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-008-checkpoint-not-updated-when-process-throws.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-008-checkpoint-not-updated-when-process-throws.sdp.md new file mode 100644 index 00000000..1325d0fa --- /dev/null +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-008-checkpoint-not-updated-when-process-throws.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.with-checkpoint.checkpoint-not-updated-when-process-throws +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.with-checkpoint +--- +# Checkpoint not updated when process throws + +## Intent + +- outcome: Executable scenario "Checkpoint not updated when process throws" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-009-retry-succeeds-after-process-failure.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-009-retry-succeeds-after-process-failure.sdp.md new file mode 100644 index 00000000..33842dec --- /dev/null +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-009-retry-succeeds-after-process-failure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.with-checkpoint.retry-succeeds-after-process-failure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.with-checkpoint +--- +# Retry succeeds after process failure + +## Intent + +- outcome: Executable scenario "Retry succeeds after process failure" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-010-all-checkpoint-fields-stored-correctly.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-010-all-checkpoint-fields-stored-correctly.sdp.md new file mode 100644 index 00000000..39977b31 --- /dev/null +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-010-all-checkpoint-fields-stored-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.with-checkpoint.all-checkpoint-fields-stored-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.with-checkpoint +--- +# All checkpoint fields stored correctly + +## Intent + +- outcome: Executable scenario "All checkpoint fields stored correctly" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-011-helper-processes-and-stores-checkpoint.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-011-helper-processes-and-stores-checkpoint.sdp.md new file mode 100644 index 00000000..080bab22 --- /dev/null +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-011-helper-processes-and-stores-checkpoint.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.with-checkpoint.helper-processes-and-stores-checkpoint +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.with-checkpoint +--- +# Helper processes and stores checkpoint + +## Intent + +- outcome: Executable scenario "Helper processes and stores checkpoint" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-012-helper-maintains-checkpoint-semantics-across-calls.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-012-helper-maintains-checkpoint-semantics-across-calls.sdp.md new file mode 100644 index 00000000..74e21e0e --- /dev/null +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-012-helper-maintains-checkpoint-semantics-across-calls.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.with-checkpoint.helper-maintains-checkpoint-semantics-across-calls +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.with-checkpoint +--- +# Helper maintains checkpoint semantics across calls + +## Intent + +- outcome: Executable scenario "Helper maintains checkpoint semantics across calls" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-013-should-process-event-position-comparisons.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-013-should-process-event-position-comparisons.sdp.md new file mode 100644 index 00000000..82d60eb0 --- /dev/null +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-013-should-process-event-position-comparisons.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.with-checkpoint.should-process-event-position-comparisons +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.with-checkpoint +--- +# shouldProcessEvent position comparisons + +## Intent + +- outcome: Executable scenario "shouldProcessEvent position comparisons" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-014-initial-checkpoint-has-sentinel-values.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-014-initial-checkpoint-has-sentinel-values.sdp.md new file mode 100644 index 00000000..d30f06aa --- /dev/null +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-014-initial-checkpoint-has-sentinel-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.with-checkpoint.initial-checkpoint-has-sentinel-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.with-checkpoint +--- +# Initial checkpoint has sentinel values + +## Intent + +- outcome: Executable scenario "Initial checkpoint has sentinel values" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-015-each-initial-checkpoint-gets-a-unique-updated-at.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-015-each-initial-checkpoint-gets-a-unique-updated-at.sdp.md new file mode 100644 index 00000000..223206bd --- /dev/null +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-015-each-initial-checkpoint-gets-a-unique-updated-at.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.projections.with-checkpoint.each-initial-checkpoint-gets-a-unique-updated-at +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.projections.with-checkpoint +--- +# Each initial checkpoint gets a unique updatedAt + +## Intent + +- outcome: Executable scenario "Each initial checkpoint gets a unique updatedAt" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature diff --git a/specs/behavior/platform-core/queries/factory.examples/s-001-single-result-query-descriptor-has-correct-result-type-and-config.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-001-single-result-query-descriptor-has-correct-result-type-and-config.sdp.md new file mode 100644 index 00000000..e8a1164e --- /dev/null +++ b/specs/behavior/platform-core/queries/factory.examples/s-001-single-result-query-descriptor-has-correct-result-type-and-config.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.factory.single-result-query-descriptor-has-correct-result-type-and-config +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.factory +--- +# Single result query descriptor has correct result type and config + +## Intent + +- outcome: Executable scenario "Single result query descriptor has correct result type and config" from packages/platform-core/tests/features/behavior/queries/factory.feature diff --git a/specs/behavior/platform-core/queries/factory.examples/s-002-list-result-query-descriptor-has-correct-result-type.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-002-list-result-query-descriptor-has-correct-result-type.sdp.md new file mode 100644 index 00000000..1593e8cf --- /dev/null +++ b/specs/behavior/platform-core/queries/factory.examples/s-002-list-result-query-descriptor-has-correct-result-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.factory.list-result-query-descriptor-has-correct-result-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.factory +--- +# List result query descriptor has correct result type + +## Intent + +- outcome: Executable scenario "List result query descriptor has correct result type" from packages/platform-core/tests/features/behavior/queries/factory.feature diff --git a/specs/behavior/platform-core/queries/factory.examples/s-003-count-result-query-descriptor-has-correct-result-type.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-003-count-result-query-descriptor-has-correct-result-type.sdp.md new file mode 100644 index 00000000..d582ccb7 --- /dev/null +++ b/specs/behavior/platform-core/queries/factory.examples/s-003-count-result-query-descriptor-has-correct-result-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.factory.count-result-query-descriptor-has-correct-result-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.factory +--- +# Count result query descriptor has correct result type + +## Intent + +- outcome: Executable scenario "Count result query descriptor has correct result type" from packages/platform-core/tests/features/behavior/queries/factory.feature diff --git a/specs/behavior/platform-core/queries/factory.examples/s-004-paginated-query-descriptor-uses-default-page-sizes.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-004-paginated-query-descriptor-uses-default-page-sizes.sdp.md new file mode 100644 index 00000000..f162ce20 --- /dev/null +++ b/specs/behavior/platform-core/queries/factory.examples/s-004-paginated-query-descriptor-uses-default-page-sizes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.factory.paginated-query-descriptor-uses-default-page-sizes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.factory +--- +# Paginated query descriptor uses default page sizes + +## Intent + +- outcome: Executable scenario "Paginated query descriptor uses default page sizes" from packages/platform-core/tests/features/behavior/queries/factory.feature diff --git a/specs/behavior/platform-core/queries/factory.examples/s-005-paginated-query-descriptor-uses-custom-page-sizes.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-005-paginated-query-descriptor-uses-custom-page-sizes.sdp.md new file mode 100644 index 00000000..bdb9ce1b --- /dev/null +++ b/specs/behavior/platform-core/queries/factory.examples/s-005-paginated-query-descriptor-uses-custom-page-sizes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.factory.paginated-query-descriptor-uses-custom-page-sizes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.factory +--- +# Paginated query descriptor uses custom page sizes + +## Intent + +- outcome: Executable scenario "Paginated query descriptor uses custom page sizes" from packages/platform-core/tests/features/behavior/queries/factory.feature diff --git a/specs/behavior/platform-core/queries/factory.examples/s-006-config-receives-default-pagination-values.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-006-config-receives-default-pagination-values.sdp.md new file mode 100644 index 00000000..7342db50 --- /dev/null +++ b/specs/behavior/platform-core/queries/factory.examples/s-006-config-receives-default-pagination-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.factory.config-receives-default-pagination-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.factory +--- +# Config receives default pagination values + +## Intent + +- outcome: Executable scenario "Config receives default pagination values" from packages/platform-core/tests/features/behavior/queries/factory.feature diff --git a/specs/behavior/platform-core/queries/factory.examples/s-007-empty-registry-has-correct-context-and-projection.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-007-empty-registry-has-correct-context-and-projection.sdp.md new file mode 100644 index 00000000..298a13f8 --- /dev/null +++ b/specs/behavior/platform-core/queries/factory.examples/s-007-empty-registry-has-correct-context-and-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.factory.empty-registry-has-correct-context-and-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.factory +--- +# Empty registry has correct context and projection + +## Intent + +- outcome: Executable scenario "Empty registry has correct context and projection" from packages/platform-core/tests/features/behavior/queries/factory.feature diff --git a/specs/behavior/platform-core/queries/factory.examples/s-008-registry-with-multiple-queries-provides-keyed-access.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-008-registry-with-multiple-queries-provides-keyed-access.sdp.md new file mode 100644 index 00000000..c108d698 --- /dev/null +++ b/specs/behavior/platform-core/queries/factory.examples/s-008-registry-with-multiple-queries-provides-keyed-access.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.factory.registry-with-multiple-queries-provides-keyed-access +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.factory +--- +# Registry with multiple queries provides keyed access + +## Intent + +- outcome: Executable scenario "Registry with multiple queries provides keyed access" from packages/platform-core/tests/features/behavior/queries/factory.feature diff --git a/specs/behavior/platform-core/queries/factory.examples/s-009-type-safe-access-to-registered-query-descriptor.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-009-type-safe-access-to-registered-query-descriptor.sdp.md new file mode 100644 index 00000000..cd014cb7 --- /dev/null +++ b/specs/behavior/platform-core/queries/factory.examples/s-009-type-safe-access-to-registered-query-descriptor.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.factory.type-safe-access-to-registered-query-descriptor +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.factory +--- +# Type-safe access to registered query descriptor + +## Intent + +- outcome: Executable scenario "Type-safe access to registered query descriptor" from packages/platform-core/tests/features/behavior/queries/factory.feature diff --git a/specs/behavior/platform-core/queries/factory.examples/s-010-no-options-returns-descriptor-defaults.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-010-no-options-returns-descriptor-defaults.sdp.md new file mode 100644 index 00000000..ab4c9af0 --- /dev/null +++ b/specs/behavior/platform-core/queries/factory.examples/s-010-no-options-returns-descriptor-defaults.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.factory.no-options-returns-descriptor-defaults +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.factory +--- +# No options returns descriptor defaults + +## Intent + +- outcome: Executable scenario "No options returns descriptor defaults" from packages/platform-core/tests/features/behavior/queries/factory.feature diff --git a/specs/behavior/platform-core/queries/factory.examples/s-011-provided-page-size-within-limits-is-used.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-011-provided-page-size-within-limits-is-used.sdp.md new file mode 100644 index 00000000..cc5a69f4 --- /dev/null +++ b/specs/behavior/platform-core/queries/factory.examples/s-011-provided-page-size-within-limits-is-used.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.factory.provided-page-size-within-limits-is-used +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.factory +--- +# Provided page size within limits is used + +## Intent + +- outcome: Executable scenario "Provided page size within limits is used" from packages/platform-core/tests/features/behavior/queries/factory.feature diff --git a/specs/behavior/platform-core/queries/factory.examples/s-012-page-size-exceeding-max-is-clamped.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-012-page-size-exceeding-max-is-clamped.sdp.md new file mode 100644 index 00000000..f2a4c0fb --- /dev/null +++ b/specs/behavior/platform-core/queries/factory.examples/s-012-page-size-exceeding-max-is-clamped.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.factory.page-size-exceeding-max-is-clamped +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.factory +--- +# Page size exceeding max is clamped + +## Intent + +- outcome: Executable scenario "Page size exceeding max is clamped" from packages/platform-core/tests/features/behavior/queries/factory.feature diff --git a/specs/behavior/platform-core/queries/factory.examples/s-013-zero-and-negative-page-sizes-are-clamped-to-1.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-013-zero-and-negative-page-sizes-are-clamped-to-1.sdp.md new file mode 100644 index 00000000..43508565 --- /dev/null +++ b/specs/behavior/platform-core/queries/factory.examples/s-013-zero-and-negative-page-sizes-are-clamped-to-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.factory.zero-and-negative-page-sizes-are-clamped-to-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.factory +--- +# Zero and negative page sizes are clamped to 1 + +## Intent + +- outcome: Executable scenario "Zero and negative page sizes are clamped to 1" from packages/platform-core/tests/features/behavior/queries/factory.feature diff --git a/specs/behavior/platform-core/queries/factory.examples/s-014-cursor-is-passed-through-to-options.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-014-cursor-is-passed-through-to-options.sdp.md new file mode 100644 index 00000000..a765095f --- /dev/null +++ b/specs/behavior/platform-core/queries/factory.examples/s-014-cursor-is-passed-through-to-options.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.factory.cursor-is-passed-through-to-options +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.factory +--- +# Cursor is passed through to options + +## Intent + +- outcome: Executable scenario "Cursor is passed through to options" from packages/platform-core/tests/features/behavior/queries/factory.feature diff --git a/specs/behavior/platform-core/queries/factory.examples/s-015-cursor-is-undefined-when-not-provided.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-015-cursor-is-undefined-when-not-provided.sdp.md new file mode 100644 index 00000000..e71751ea --- /dev/null +++ b/specs/behavior/platform-core/queries/factory.examples/s-015-cursor-is-undefined-when-not-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.factory.cursor-is-undefined-when-not-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.factory +--- +# Cursor is undefined when not provided + +## Intent + +- outcome: Executable scenario "Cursor is undefined when not provided" from packages/platform-core/tests/features/behavior/queries/factory.feature diff --git a/specs/behavior/platform-core/queries/factory.examples/s-016-read-model-and-paginated-descriptors-preserve-result-types.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-016-read-model-and-paginated-descriptors-preserve-result-types.sdp.md new file mode 100644 index 00000000..493684fb --- /dev/null +++ b/specs/behavior/platform-core/queries/factory.examples/s-016-read-model-and-paginated-descriptors-preserve-result-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.factory.read-model-and-paginated-descriptors-preserve-result-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.factory +--- +# Read model and paginated descriptors preserve result types + +## Intent + +- outcome: Executable scenario "Read model and paginated descriptors preserve result types" from packages/platform-core/tests/features/behavior/queries/factory.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-001-pagination-constants-have-expected-values.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-001-pagination-constants-have-expected-values.sdp.md new file mode 100644 index 00000000..40c35d05 --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-001-pagination-constants-have-expected-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.pagination-constants-have-expected-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Pagination constants have expected values + +## Intent + +- outcome: Executable scenario "Pagination constants have expected values" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-002-returns-defaults-when-no-options-provided.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-002-returns-defaults-when-no-options-provided.sdp.md new file mode 100644 index 00000000..9519b070 --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-002-returns-defaults-when-no-options-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.returns-defaults-when-no-options-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Returns defaults when no options provided + +## Intent + +- outcome: Executable scenario "Returns defaults when no options provided" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-003-uses-provided-page-size-within-limits.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-003-uses-provided-page-size-within-limits.sdp.md new file mode 100644 index 00000000..915c109b --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-003-uses-provided-page-size-within-limits.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.uses-provided-page-size-within-limits +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Uses provided page size within limits + +## Intent + +- outcome: Executable scenario "Uses provided page size within limits" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-004-caps-page-size-at-max.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-004-caps-page-size-at-max.sdp.md new file mode 100644 index 00000000..334f49e7 --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-004-caps-page-size-at-max.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.caps-page-size-at-max +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Caps page size at max + +## Intent + +- outcome: Executable scenario "Caps page size at max" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-005-enforces-minimum-page-size-of-1-for-boundary-values.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-005-enforces-minimum-page-size-of-1-for-boundary-values.sdp.md new file mode 100644 index 00000000..d39cb0c5 --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-005-enforces-minimum-page-size-of-1-for-boundary-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.enforces-minimum-page-size-of-1-for-boundary-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Enforces minimum page size of 1 for boundary values + +## Intent + +- outcome: Executable scenario "Enforces minimum page size of 1 for boundary values" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-006-passes-through-cursor.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-006-passes-through-cursor.sdp.md new file mode 100644 index 00000000..70904176 --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-006-passes-through-cursor.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.passes-through-cursor +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Passes through cursor + +## Intent + +- outcome: Executable scenario "Passes through cursor" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-007-works-with-custom-config-values.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-007-works-with-custom-config-values.sdp.md new file mode 100644 index 00000000..a3f1ae64 --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-007-works-with-custom-config-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.works-with-custom-config-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Works with custom config values + +## Intent + +- outcome: Executable scenario "Works with custom config values" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-008-rounds-floating-point-page-sizes-down.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-008-rounds-floating-point-page-sizes-down.sdp.md new file mode 100644 index 00000000..04753c60 --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-008-rounds-floating-point-page-sizes-down.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.rounds-floating-point-page-sizes-down +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Rounds floating-point page sizes down + +## Intent + +- outcome: Executable scenario "Rounds floating-point page sizes down" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-009-creates-an-empty-page-with-correct-structure.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-009-creates-an-empty-page-with-correct-structure.sdp.md new file mode 100644 index 00000000..10f74c6d --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-009-creates-an-empty-page-with-correct-structure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.creates-an-empty-page-with-correct-structure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Creates an empty page with correct structure + +## Intent + +- outcome: Executable scenario "Creates an empty page with correct structure" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-010-preserves-type-information-with-empty-array.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-010-preserves-type-information-with-empty-array.sdp.md new file mode 100644 index 00000000..fd144d22 --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-010-preserves-type-information-with-empty-array.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.preserves-type-information-with-empty-array +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Preserves type information with empty array + +## Intent + +- outcome: Executable scenario "Preserves type information with empty array" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-011-creates-a-page-with-items-and-cursor.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-011-creates-a-page-with-items-and-cursor.sdp.md new file mode 100644 index 00000000..e6cf983d --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-011-creates-a-page-with-items-and-cursor.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.creates-a-page-with-items-and-cursor +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Creates a page with items and cursor + +## Intent + +- outcome: Executable scenario "Creates a page with items and cursor" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-012-creates-a-done-page-when-cursor-is-null.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-012-creates-a-done-page-when-cursor-is-null.sdp.md new file mode 100644 index 00000000..36bd6048 --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-012-creates-a-done-page-when-cursor-is-null.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.creates-a-done-page-when-cursor-is-null +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Creates a done page when cursor is null + +## Intent + +- outcome: Executable scenario "Creates a done page when cursor is null" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-013-handles-empty-items-array-with-null-cursor.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-013-handles-empty-items-array-with-null-cursor.sdp.md new file mode 100644 index 00000000..1b9ec712 --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-013-handles-empty-items-array-with-null-cursor.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.handles-empty-items-array-with-null-cursor +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Handles empty items array with null cursor + +## Intent + +- outcome: Executable scenario "Handles empty items array with null cursor" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-014-encodes-and-decodes-simple-position-data.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-014-encodes-and-decodes-simple-position-data.sdp.md new file mode 100644 index 00000000..d9588d61 --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-014-encodes-and-decodes-simple-position-data.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.encodes-and-decodes-simple-position-data +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Encodes and decodes simple position data + +## Intent + +- outcome: Executable scenario "Encodes and decodes simple position data" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-015-encodes-and-decodes-complex-position-data.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-015-encodes-and-decodes-complex-position-data.sdp.md new file mode 100644 index 00000000..4b7c8925 --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-015-encodes-and-decodes-complex-position-data.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.encodes-and-decodes-complex-position-data +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Encodes and decodes complex position data + +## Intent + +- outcome: Executable scenario "Encodes and decodes complex position data" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-016-produces-base64-encoded-string.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-016-produces-base64-encoded-string.sdp.md new file mode 100644 index 00000000..74550a3b --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-016-produces-base64-encoded-string.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.produces-base64-encoded-string +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Produces base64-encoded string + +## Intent + +- outcome: Executable scenario "Produces base64-encoded string" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-017-round-trips-various-data-shapes.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-017-round-trips-various-data-shapes.sdp.md new file mode 100644 index 00000000..64023dba --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-017-round-trips-various-data-shapes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.round-trips-various-data-shapes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Round-trips various data shapes + +## Intent + +- outcome: Executable scenario "Round-trips various data shapes" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-018-returns-null-for-invalid-cursor-inputs.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-018-returns-null-for-invalid-cursor-inputs.sdp.md new file mode 100644 index 00000000..d1da232d --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-018-returns-null-for-invalid-cursor-inputs.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.returns-null-for-invalid-cursor-inputs +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Returns null for invalid cursor inputs + +## Intent + +- outcome: Executable scenario "Returns null for invalid cursor inputs" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-019-returns-null-for-base64-with-invalid-characters-in-middle-or-end.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-019-returns-null-for-base64-with-invalid-characters-in-middle-or-end.sdp.md new file mode 100644 index 00000000..4097c123 --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-019-returns-null-for-base64-with-invalid-characters-in-middle-or-end.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.returns-null-for-base64-with-invalid-characters-in-middle-or-end +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Returns null for base64 with invalid characters in middle or end + +## Intent + +- outcome: Executable scenario "Returns null for base64 with invalid characters in middle or end" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-020-returns-null-for-truncated-utf-8-sequences.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-020-returns-null-for-truncated-utf-8-sequences.sdp.md new file mode 100644 index 00000000..4b309a5a --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-020-returns-null-for-truncated-utf-8-sequences.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.returns-null-for-truncated-utf-8-sequences +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Returns null for truncated UTF-8 sequences + +## Intent + +- outcome: Executable scenario "Returns null for truncated UTF-8 sequences" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-021-returns-true-for-valid-page-sizes.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-021-returns-true-for-valid-page-sizes.sdp.md new file mode 100644 index 00000000..0cac41ad --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-021-returns-true-for-valid-page-sizes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.returns-true-for-valid-page-sizes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Returns true for valid page sizes + +## Intent + +- outcome: Executable scenario "Returns true for valid page sizes" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-022-returns-false-for-invalid-page-sizes.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-022-returns-false-for-invalid-page-sizes.sdp.md new file mode 100644 index 00000000..133c713f --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-022-returns-false-for-invalid-page-sizes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.returns-false-for-invalid-page-sizes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Returns false for invalid page sizes + +## Intent + +- outcome: Executable scenario "Returns false for invalid page sizes" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-023-respects-custom-max-page-size.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-023-respects-custom-max-page-size.sdp.md new file mode 100644 index 00000000..b7376c9e --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-023-respects-custom-max-page-size.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.respects-custom-max-page-size +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Respects custom max page size + +## Intent + +- outcome: Executable scenario "Respects custom max page size" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-024-returns-requested-size-when-valid.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-024-returns-requested-size-when-valid.sdp.md new file mode 100644 index 00000000..b01e3b12 --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-024-returns-requested-size-when-valid.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.returns-requested-size-when-valid +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Returns requested size when valid + +## Intent + +- outcome: Executable scenario "Returns requested size when valid" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-025-returns-default-when-not-specified.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-025-returns-default-when-not-specified.sdp.md new file mode 100644 index 00000000..c85bf48c --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-025-returns-default-when-not-specified.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.returns-default-when-not-specified +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Returns default when not specified + +## Intent + +- outcome: Executable scenario "Returns default when not specified" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-026-caps-at-max-and-enforces-minimum.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-026-caps-at-max-and-enforces-minimum.sdp.md new file mode 100644 index 00000000..18027dfa --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-026-caps-at-max-and-enforces-minimum.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.caps-at-max-and-enforces-minimum +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Caps at max and enforces minimum + +## Intent + +- outcome: Executable scenario "Caps at max and enforces minimum" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-027-uses-custom-default-and-max-sizes.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-027-uses-custom-default-and-max-sizes.sdp.md new file mode 100644 index 00000000..28444902 --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-027-uses-custom-default-and-max-sizes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.uses-custom-default-and-max-sizes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Uses custom default and max sizes + +## Intent + +- outcome: Executable scenario "Uses custom default and max sizes" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-028-rounds-floating-point-sizes-down.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-028-rounds-floating-point-sizes-down.sdp.md new file mode 100644 index 00000000..9d7add0e --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-028-rounds-floating-point-sizes-down.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.rounds-floating-point-sizes-down +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Rounds floating-point sizes down + +## Intent + +- outcome: Executable scenario "Rounds floating-point sizes down" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-029-simulates-complete-pagination-flow.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-029-simulates-complete-pagination-flow.sdp.md new file mode 100644 index 00000000..34a0a22d --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-029-simulates-complete-pagination-flow.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.simulates-complete-pagination-flow +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Simulates complete pagination flow + +## Intent + +- outcome: Executable scenario "Simulates complete pagination flow" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-030-handles-empty-result-set.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-030-handles-empty-result-set.sdp.md new file mode 100644 index 00000000..27ac31b1 --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-030-handles-empty-result-set.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.handles-empty-result-set +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Handles empty result set + +## Intent + +- outcome: Executable scenario "Handles empty result set" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-031-handles-exact-page-size-match-with-continuation.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-031-handles-exact-page-size-match-with-continuation.sdp.md new file mode 100644 index 00000000..016a68aa --- /dev/null +++ b/specs/behavior/platform-core/queries/pagination.examples/s-031-handles-exact-page-size-match-with-continuation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.queries.pagination.handles-exact-page-size-match-with-continuation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.queries.pagination +--- +# Handles exact page size match with continuation + +## Intent + +- outcome: Executable scenario "Handles exact page size match with continuation" from packages/platform-core/tests/features/behavior/queries/pagination.feature diff --git a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-001-conflicting-optimistic-update-is-rolled-back.sdp.md b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-001-conflicting-optimistic-update-is-rolled-back.sdp.md new file mode 100644 index 00000000..1d2ff423 --- /dev/null +++ b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-001-conflicting-optimistic-update-is-rolled-back.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reactive-projections.conflict-detection.conflicting-optimistic-update-is-rolled-back +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reactive-projections.conflict-detection +--- +# Conflicting optimistic update is rolled back + +## Intent + +- outcome: Executable scenario "Conflicting optimistic update is rolled back" from packages/platform-core/tests/features/behavior/reactive-projections/conflict-detection.feature diff --git a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-002-conflict-detection-handles-network-partition.sdp.md b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-002-conflict-detection-handles-network-partition.sdp.md new file mode 100644 index 00000000..1278d04b --- /dev/null +++ b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-002-conflict-detection-handles-network-partition.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reactive-projections.conflict-detection.conflict-detection-handles-network-partition +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reactive-projections.conflict-detection +--- +# Conflict detection handles network partition + +## Intent + +- outcome: Executable scenario "Conflict detection handles network partition" from packages/platform-core/tests/features/behavior/reactive-projections/conflict-detection.feature diff --git a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-003-no-conflict-when-optimistic-is-ahead-of-durable.sdp.md b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-003-no-conflict-when-optimistic-is-ahead-of-durable.sdp.md new file mode 100644 index 00000000..2281399f --- /dev/null +++ b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-003-no-conflict-when-optimistic-is-ahead-of-durable.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reactive-projections.conflict-detection.no-conflict-when-optimistic-is-ahead-of-durable +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reactive-projections.conflict-detection +--- +# No conflict when optimistic is ahead of durable + +## Intent + +- outcome: Executable scenario "No conflict when optimistic is ahead of durable" from packages/platform-core/tests/features/behavior/reactive-projections/conflict-detection.feature diff --git a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-004-rollback-triggers-ui-notification.sdp.md b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-004-rollback-triggers-ui-notification.sdp.md new file mode 100644 index 00000000..f2b56712 --- /dev/null +++ b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-004-rollback-triggers-ui-notification.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reactive-projections.conflict-detection.rollback-triggers-ui-notification +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reactive-projections.conflict-detection +--- +# Rollback triggers UI notification + +## Intent + +- outcome: Executable scenario "Rollback triggers UI notification" from packages/platform-core/tests/features/behavior/reactive-projections/conflict-detection.feature diff --git a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-005-partial-clearing-preserves-unconfirmed-events.sdp.md b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-005-partial-clearing-preserves-unconfirmed-events.sdp.md new file mode 100644 index 00000000..4aaf7c1c --- /dev/null +++ b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-005-partial-clearing-preserves-unconfirmed-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reactive-projections.conflict-detection.partial-clearing-preserves-unconfirmed-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reactive-projections.conflict-detection +--- +# Partial clearing preserves unconfirmed events + +## Intent + +- outcome: Executable scenario "Partial clearing preserves unconfirmed events" from packages/platform-core/tests/features/behavior/reactive-projections/conflict-detection.feature diff --git a/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-001-client-receives-instant-update-then-durable-confirmation.sdp.md b/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-001-client-receives-instant-update-then-durable-confirmation.sdp.md new file mode 100644 index 00000000..359b32b7 --- /dev/null +++ b/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-001-client-receives-instant-update-then-durable-confirmation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reactive-projections.hybrid-model.client-receives-instant-update-then-durable-confirmation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reactive-projections.hybrid-model +--- +# Client receives instant update then durable confirmation + +## Intent + +- outcome: Executable scenario "Client receives instant update then durable confirmation" from packages/platform-core/tests/features/behavior/reactive-projections/hybrid-model.feature diff --git a/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-002-optimistic-update-works-during-workpool-backlog.sdp.md b/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-002-optimistic-update-works-during-workpool-backlog.sdp.md new file mode 100644 index 00000000..b4934167 --- /dev/null +++ b/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-002-optimistic-update-works-during-workpool-backlog.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reactive-projections.hybrid-model.optimistic-update-works-during-workpool-backlog +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reactive-projections.hybrid-model +--- +# Optimistic update works during Workpool backlog + +## Intent + +- outcome: Executable scenario "Optimistic update works during Workpool backlog" from packages/platform-core/tests/features/behavior/reactive-projections/hybrid-model.feature diff --git a/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-003-durable-state-takes-precedence-after-convergence.sdp.md b/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-003-durable-state-takes-precedence-after-convergence.sdp.md new file mode 100644 index 00000000..f2eabc02 --- /dev/null +++ b/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-003-durable-state-takes-precedence-after-convergence.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reactive-projections.hybrid-model.durable-state-takes-precedence-after-convergence +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reactive-projections.hybrid-model +--- +# Durable state takes precedence after convergence + +## Intent + +- outcome: Executable scenario "Durable state takes precedence after convergence" from packages/platform-core/tests/features/behavior/reactive-projections/hybrid-model.feature diff --git a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-001-category-determines-reactive-eligibility.sdp.md b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-001-category-determines-reactive-eligibility.sdp.md new file mode 100644 index 00000000..4e3c8745 --- /dev/null +++ b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-001-category-determines-reactive-eligibility.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reactive-projections.reactive-eligibility.category-determines-reactive-eligibility +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reactive-projections.reactive-eligibility +--- +# Category determines reactive eligibility + +## Intent + +- outcome: Executable scenario "Category determines reactive eligibility" from packages/platform-core/tests/features/behavior/reactive-projections/reactive-eligibility.feature diff --git a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-002-non-view-projection-rejects-reactive-subscription.sdp.md b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-002-non-view-projection-rejects-reactive-subscription.sdp.md new file mode 100644 index 00000000..953eebb6 --- /dev/null +++ b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-002-non-view-projection-rejects-reactive-subscription.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reactive-projections.reactive-eligibility.non-view-projection-rejects-reactive-subscription +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reactive-projections.reactive-eligibility +--- +# Non-view projection rejects reactive subscription + +## Intent + +- outcome: Executable scenario "Non-view projection rejects reactive subscription" from packages/platform-core/tests/features/behavior/reactive-projections/reactive-eligibility.feature diff --git a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-003-view-projection-enables-full-reactive-functionality.sdp.md b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-003-view-projection-enables-full-reactive-functionality.sdp.md new file mode 100644 index 00000000..542a2e3b --- /dev/null +++ b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-003-view-projection-enables-full-reactive-functionality.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reactive-projections.reactive-eligibility.view-projection-enables-full-reactive-functionality +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reactive-projections.reactive-eligibility +--- +# View projection enables full reactive functionality + +## Intent + +- outcome: Executable scenario "View projection enables full reactive functionality" from packages/platform-core/tests/features/behavior/reactive-projections/reactive-eligibility.feature diff --git a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-004-initial-reactive-result-represents-loading-state.sdp.md b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-004-initial-reactive-result-represents-loading-state.sdp.md new file mode 100644 index 00000000..726e02f5 --- /dev/null +++ b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-004-initial-reactive-result-represents-loading-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reactive-projections.reactive-eligibility.initial-reactive-result-represents-loading-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reactive-projections.reactive-eligibility +--- +# Initial reactive result represents loading state + +## Intent + +- outcome: Executable scenario "Initial reactive result represents loading state" from packages/platform-core/tests/features/behavior/reactive-projections/reactive-eligibility.feature diff --git a/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-001-evolve-produces-identical-results-on-client-and-server.sdp.md b/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-001-evolve-produces-identical-results-on-client-and-server.sdp.md new file mode 100644 index 00000000..f56a3f26 --- /dev/null +++ b/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-001-evolve-produces-identical-results-on-client-and-server.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reactive-projections.shared-evolve.evolve-produces-identical-results-on-client-and-server +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reactive-projections.shared-evolve +--- +# Evolve produces identical results on client and server + +## Intent + +- outcome: Executable scenario "Evolve produces identical results on client and server" from packages/platform-core/tests/features/behavior/reactive-projections/shared-evolve.feature diff --git a/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-002-evolve-handles-unknown-event-types-gracefully.sdp.md b/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-002-evolve-handles-unknown-event-types-gracefully.sdp.md new file mode 100644 index 00000000..81df1611 --- /dev/null +++ b/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-002-evolve-handles-unknown-event-types-gracefully.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reactive-projections.shared-evolve.evolve-handles-unknown-event-types-gracefully +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reactive-projections.shared-evolve +--- +# Evolve handles unknown event types gracefully + +## Intent + +- outcome: Executable scenario "Evolve handles unknown event types gracefully" from packages/platform-core/tests/features/behavior/reactive-projections/shared-evolve.feature diff --git a/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-003-multiple-events-evolve-in-sequence.sdp.md b/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-003-multiple-events-evolve-in-sequence.sdp.md new file mode 100644 index 00000000..0941c39a --- /dev/null +++ b/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-003-multiple-events-evolve-in-sequence.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reactive-projections.shared-evolve.multiple-events-evolve-in-sequence +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reactive-projections.shared-evolve +--- +# Multiple events evolve in sequence + +## Intent + +- outcome: Executable scenario "Multiple events evolve in sequence" from packages/platform-core/tests/features/behavior/reactive-projections/shared-evolve.feature diff --git a/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-004-evolve-error-includes-event-context.sdp.md b/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-004-evolve-error-includes-event-context.sdp.md new file mode 100644 index 00000000..37815101 --- /dev/null +++ b/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-004-evolve-error-includes-event-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reactive-projections.shared-evolve.evolve-error-includes-event-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reactive-projections.shared-evolve +--- +# Evolve error includes event context + +## Intent + +- outcome: Executable scenario "Evolve error includes event context" from packages/platform-core/tests/features/behavior/reactive-projections/shared-evolve.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-001-get-instance-returns-the-same-instance-on-multiple-calls.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-001-get-instance-returns-the-same-instance-on-multiple-calls.sdp.md new file mode 100644 index 00000000..a98852f5 --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-001-get-instance-returns-the-same-instance-on-multiple-calls.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.get-instance-returns-the-same-instance-on-multiple-calls +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# getInstance returns the same instance on multiple calls + +## Intent + +- outcome: Executable scenario "getInstance returns the same instance on multiple calls" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-002-reset-creates-a-new-instance.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-002-reset-creates-a-new-instance.sdp.md new file mode 100644 index 00000000..798fad84 --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-002-reset-creates-a-new-instance.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.reset-creates-a-new-instance +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# Reset creates a new instance + +## Intent + +- outcome: Executable scenario "Reset creates a new instance" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-003-register-a-command-successfully.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-003-register-a-command-successfully.sdp.md new file mode 100644 index 00000000..a1f39def --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-003-register-a-command-successfully.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.register-a-command-successfully +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# Register a command successfully + +## Intent + +- outcome: Executable scenario "Register a command successfully" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-004-duplicate-registration-throws-an-error.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-004-duplicate-registration-throws-an-error.sdp.md new file mode 100644 index 00000000..1794e809 --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-004-duplicate-registration-throws-an-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.duplicate-registration-throws-an-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# Duplicate registration throws an error + +## Intent + +- outcome: Executable scenario "Duplicate registration throws an error" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-005-different-command-types-can-be-registered.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-005-different-command-types-can-be-registered.sdp.md new file mode 100644 index 00000000..4fc6afc5 --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-005-different-command-types-can-be-registered.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.different-command-types-can-be-registered +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# Different command types can be registered + +## Intent + +- outcome: Executable scenario "Different command types can be registered" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-006-unregister-removes-a-registered-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-006-unregister-removes-a-registered-command.sdp.md new file mode 100644 index 00000000..708804dd --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-006-unregister-removes-a-registered-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.unregister-removes-a-registered-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# Unregister removes a registered command + +## Intent + +- outcome: Executable scenario "Unregister removes a registered command" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-007-unregister-returns-false-for-non-existent-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-007-unregister-returns-false-for-non-existent-command.sdp.md new file mode 100644 index 00000000..7a7e8a82 --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-007-unregister-returns-false-for-non-existent-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.unregister-returns-false-for-non-existent-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# Unregister returns false for non-existent command + +## Intent + +- outcome: Executable scenario "Unregister returns false for non-existent command" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-008-get-config-returns-config-for-a-registered-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-008-get-config-returns-config-for-a-registered-command.sdp.md new file mode 100644 index 00000000..b074a54b --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-008-get-config-returns-config-for-a-registered-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.get-config-returns-config-for-a-registered-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# getConfig returns config for a registered command + +## Intent + +- outcome: Executable scenario "getConfig returns config for a registered command" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-009-get-config-returns-undefined-for-a-non-existent-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-009-get-config-returns-undefined-for-a-non-existent-command.sdp.md new file mode 100644 index 00000000..e9dc1d28 --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-009-get-config-returns-undefined-for-a-non-existent-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.get-config-returns-undefined-for-a-non-existent-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# getConfig returns undefined for a non-existent command + +## Intent + +- outcome: Executable scenario "getConfig returns undefined for a non-existent command" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-010-get-registration-returns-full-registration-for-a-registered-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-010-get-registration-returns-full-registration-for-a-registered-command.sdp.md new file mode 100644 index 00000000..03203d2f --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-010-get-registration-returns-full-registration-for-a-registered-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.get-registration-returns-full-registration-for-a-registered-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# getRegistration returns full registration for a registered command + +## Intent + +- outcome: Executable scenario "getRegistration returns full registration for a registered command" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-011-get-registration-returns-undefined-for-a-non-existent-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-011-get-registration-returns-undefined-for-a-non-existent-command.sdp.md new file mode 100644 index 00000000..8735ad02 --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-011-get-registration-returns-undefined-for-a-non-existent-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.get-registration-returns-undefined-for-a-non-existent-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# getRegistration returns undefined for a non-existent command + +## Intent + +- outcome: Executable scenario "getRegistration returns undefined for a non-existent command" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-012-has-returns-true-for-a-registered-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-012-has-returns-true-for-a-registered-command.sdp.md new file mode 100644 index 00000000..28b63a74 --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-012-has-returns-true-for-a-registered-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.has-returns-true-for-a-registered-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# has returns true for a registered command + +## Intent + +- outcome: Executable scenario "has returns true for a registered command" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-013-has-returns-false-for-a-non-existent-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-013-has-returns-false-for-a-non-existent-command.sdp.md new file mode 100644 index 00000000..1fe7ab80 --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-013-has-returns-false-for-a-non-existent-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.has-returns-false-for-a-non-existent-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# has returns false for a non-existent command + +## Intent + +- outcome: Executable scenario "has returns false for a non-existent command" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-014-validate-returns-valid-for-correct-payload.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-014-validate-returns-valid-for-correct-payload.sdp.md new file mode 100644 index 00000000..62a0558a --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-014-validate-returns-valid-for-correct-payload.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.validate-returns-valid-for-correct-payload +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# Validate returns valid for correct payload + +## Intent + +- outcome: Executable scenario "Validate returns valid for correct payload" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-015-validate-returns-invalid-for-incorrect-payload.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-015-validate-returns-invalid-for-incorrect-payload.sdp.md new file mode 100644 index 00000000..df43604b --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-015-validate-returns-invalid-for-incorrect-payload.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.validate-returns-invalid-for-incorrect-payload +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# Validate returns invalid for incorrect payload + +## Intent + +- outcome: Executable scenario "Validate returns invalid for incorrect payload" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-016-validate-returns-unknown-command-for-non-existent-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-016-validate-returns-unknown-command-for-non-existent-command.sdp.md new file mode 100644 index 00000000..e8bee177 --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-016-validate-returns-unknown-command-for-non-existent-command.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.validate-returns-unknown-command-for-non-existent-command +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# Validate returns UNKNOWN_COMMAND for non-existent command + +## Intent + +- outcome: Executable scenario "Validate returns UNKNOWN_COMMAND for non-existent command" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-017-list-returns-empty-array-when-no-commands-are-registered.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-017-list-returns-empty-array-when-no-commands-are-registered.sdp.md new file mode 100644 index 00000000..52c11984 --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-017-list-returns-empty-array-when-no-commands-are-registered.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.list-returns-empty-array-when-no-commands-are-registered +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# list returns empty array when no commands are registered + +## Intent + +- outcome: Executable scenario "list returns empty array when no commands are registered" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-018-list-returns-all-registered-commands.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-018-list-returns-all-registered-commands.sdp.md new file mode 100644 index 00000000..2e820e34 --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-018-list-returns-all-registered-commands.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.list-returns-all-registered-commands +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# list returns all registered commands + +## Intent + +- outcome: Executable scenario "list returns all registered commands" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-019-list-returns-command-info-objects-with-correct-shape.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-019-list-returns-command-info-objects-with-correct-shape.sdp.md new file mode 100644 index 00000000..9d7b698c --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-019-list-returns-command-info-objects-with-correct-shape.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.list-returns-command-info-objects-with-correct-shape +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# list returns CommandInfo objects with correct shape + +## Intent + +- outcome: Executable scenario "list returns CommandInfo objects with correct shape" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-020-filter-commands-by-category.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-020-filter-commands-by-category.sdp.md new file mode 100644 index 00000000..2240a163 --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-020-filter-commands-by-category.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.filter-commands-by-category +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# Filter commands by category + +## Intent + +- outcome: Executable scenario "Filter commands by category" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-021-filter-commands-by-bounded-context.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-021-filter-commands-by-bounded-context.sdp.md new file mode 100644 index 00000000..e6c67686 --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-021-filter-commands-by-bounded-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.filter-commands-by-bounded-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# Filter commands by bounded context + +## Intent + +- outcome: Executable scenario "Filter commands by bounded context" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-022-filter-commands-by-tag.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-022-filter-commands-by-tag.sdp.md new file mode 100644 index 00000000..c45c1709 --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-022-filter-commands-by-tag.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.filter-commands-by-tag +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# Filter commands by tag + +## Intent + +- outcome: Executable scenario "Filter commands by tag" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-023-group-commands-by-bounded-context.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-023-group-commands-by-bounded-context.sdp.md new file mode 100644 index 00000000..f1486d3f --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-023-group-commands-by-bounded-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.group-commands-by-bounded-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# Group commands by bounded context + +## Intent + +- outcome: Executable scenario "Group commands by bounded context" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-024-group-by-context-returns-empty-map-when-no-commands.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-024-group-by-context-returns-empty-map-when-no-commands.sdp.md new file mode 100644 index 00000000..1d803e65 --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-024-group-by-context-returns-empty-map-when-no-commands.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.group-by-context-returns-empty-map-when-no-commands +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# groupByContext returns empty map when no commands + +## Intent + +- outcome: Executable scenario "groupByContext returns empty map when no commands" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-025-size-reflects-registered-command-count.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-025-size-reflects-registered-command-count.sdp.md new file mode 100644 index 00000000..38538b04 --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-025-size-reflects-registered-command-count.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.size-reflects-registered-command-count +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# Size reflects registered command count + +## Intent + +- outcome: Executable scenario "Size reflects registered command count" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-026-clear-removes-all-registrations.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-026-clear-removes-all-registrations.sdp.md new file mode 100644 index 00000000..4b60d68a --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-026-clear-removes-all-registrations.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.clear-removes-all-registrations +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# Clear removes all registrations + +## Intent + +- outcome: Executable scenario "Clear removes all registrations" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-027-global-registry-is-a-functional-registry-instance.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-027-global-registry-is-a-functional-registry-instance.sdp.md new file mode 100644 index 00000000..310a1dd7 --- /dev/null +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-027-global-registry-is-a-functional-registry-instance.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.command-registry.global-registry-is-a-functional-registry-instance +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.command-registry +--- +# globalRegistry is a functional registry instance + +## Intent + +- outcome: Executable scenario "globalRegistry is a functional registry instance" from packages/platform-core/tests/features/behavior/registry/command-registry.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-001-config-has-correct-command-type-bounded-context-and-projection-name.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-001-config-has-correct-command-type-bounded-context-and-projection-name.sdp.md new file mode 100644 index 00000000..970b70d3 --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-001-config-has-correct-command-type-bounded-context-and-projection-name.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.config-has-correct-command-type-bounded-context-and-projection-name +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# Config has correct commandType, boundedContext, and projection name + +## Intent + +- outcome: Executable scenario "Config has correct commandType, boundedContext, and projection name" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-002-to-handler-args-merges-original-args-with-command-id-and-correlation-id.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-002-to-handler-args-merges-original-args-with-command-id-and-correlation-id.sdp.md new file mode 100644 index 00000000..728b4278 --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-002-to-handler-args-merges-original-args-with-command-id-and-correlation-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.to-handler-args-merges-original-args-with-command-id-and-correlation-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# toHandlerArgs merges original args with commandId and correlationId + +## Intent + +- outcome: Executable scenario "toHandlerArgs merges original args with commandId and correlationId" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-003-default-partition-key-uses-aggregate-id-field.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-003-default-partition-key-uses-aggregate-id-field.sdp.md new file mode 100644 index 00000000..0ce7e14b --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-003-default-partition-key-uses-aggregate-id-field.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.default-partition-key-uses-aggregate-id-field +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# Default partition key uses aggregateIdField + +## Intent + +- outcome: Executable scenario "Default partition key uses aggregateIdField" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-004-custom-partition-key-overrides-the-default.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-004-custom-partition-key-overrides-the-default.sdp.md new file mode 100644 index 00000000..c98cf14b --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-004-custom-partition-key-overrides-the-default.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.custom-partition-key-overrides-the-default +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# Custom partition key overrides the default + +## Intent + +- outcome: Executable scenario "Custom partition key overrides the default" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-005-metadata-reflects-aggregate-category-and-custom-options.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-005-metadata-reflects-aggregate-category-and-custom-options.sdp.md new file mode 100644 index 00000000..2bb87324 --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-005-metadata-reflects-aggregate-category-and-custom-options.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.metadata-reflects-aggregate-category-and-custom-options +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# Metadata reflects aggregate category and custom options + +## Intent + +- outcome: Executable scenario "Metadata reflects aggregate category and custom options" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-006-command-is-auto-registered-by-default.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-006-command-is-auto-registered-by-default.sdp.md new file mode 100644 index 00000000..c58c29ff --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-006-command-is-auto-registered-by-default.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.command-is-auto-registered-by-default +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# Command is auto-registered by default + +## Intent + +- outcome: Executable scenario "Command is auto-registered by default" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-007-command-is-not-registered-when-auto-register-is-false.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-007-command-is-not-registered-when-auto-register-is-false.sdp.md new file mode 100644 index 00000000..9e37881e --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-007-command-is-not-registered-when-auto-register-is-false.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.command-is-not-registered-when-auto-register-is-false +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# Command is not registered when autoRegister is false + +## Intent + +- outcome: Executable scenario "Command is not registered when autoRegister is false" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-008-secondary-projections-are-included-in-config.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-008-secondary-projections-are-included-in-config.sdp.md new file mode 100644 index 00000000..d1a840b1 --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-008-secondary-projections-are-included-in-config.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.secondary-projections-are-included-in-config +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# Secondary projections are included in config + +## Intent + +- outcome: Executable scenario "Secondary projections are included in config" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-009-saga-route-is-included-in-config.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-009-saga-route-is-included-in-config.sdp.md new file mode 100644 index 00000000..4a780660 --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-009-saga-route-is-included-in-config.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.saga-route-is-included-in-config +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# Saga route is included in config + +## Intent + +- outcome: Executable scenario "Saga route is included in config" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-010-saga-route-on-complete-is-preserved.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-010-saga-route-on-complete-is-preserved.sdp.md new file mode 100644 index 00000000..1c42759c --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-010-saga-route-on-complete-is-preserved.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.saga-route-on-complete-is-preserved +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# sagaRoute.onComplete is preserved + +## Intent + +- outcome: Executable scenario "sagaRoute.onComplete is preserved" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-011-failed-projection-is-included-in-config.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-011-failed-projection-is-included-in-config.sdp.md new file mode 100644 index 00000000..869675bc --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-011-failed-projection-is-included-in-config.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.failed-projection-is-included-in-config +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# Failed projection is included in config + +## Intent + +- outcome: Executable scenario "Failed projection is included in config" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-012-schema-version-defaults-to-1.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-012-schema-version-defaults-to-1.sdp.md new file mode 100644 index 00000000..82dbb7a4 --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-012-schema-version-defaults-to-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.schema-version-defaults-to-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# SchemaVersion defaults to 1 + +## Intent + +- outcome: Executable scenario "SchemaVersion defaults to 1" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-013-process-command-has-correct-category-and-target.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-013-process-command-has-correct-category-and-target.sdp.md new file mode 100644 index 00000000..38168cc5 --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-013-process-command-has-correct-category-and-target.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.process-command-has-correct-category-and-target +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# Process command has correct category and target + +## Intent + +- outcome: Executable scenario "Process command has correct category and target" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-014-partition-key-uses-process-id-field.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-014-partition-key-uses-process-id-field.sdp.md new file mode 100644 index 00000000..42a7eec6 --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-014-partition-key-uses-process-id-field.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.partition-key-uses-process-id-field +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# Partition key uses processIdField + +## Intent + +- outcome: Executable scenario "Partition key uses processIdField" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-015-process-command-auto-registers-with-category-and-target-info.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-015-process-command-auto-registers-with-category-and-target-info.sdp.md new file mode 100644 index 00000000..b5756ad6 --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-015-process-command-auto-registers-with-category-and-target-info.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.process-command-auto-registers-with-category-and-target-info +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# Process command auto-registers with category and target info + +## Intent + +- outcome: Executable scenario "Process command auto-registers with category and target info" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-016-system-command-has-correct-category-subsystem-and-description.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-016-system-command-has-correct-category-subsystem-and-description.sdp.md new file mode 100644 index 00000000..7d1bdde4 --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-016-system-command-has-correct-category-subsystem-and-description.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.system-command-has-correct-category-subsystem-and-description +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# System command has correct category, subsystem, and description + +## Intent + +- outcome: Executable scenario "System command has correct category, subsystem, and description" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-017-system-to-handler-args-merges-args-with-command-id-and-correlation-id.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-017-system-to-handler-args-merges-args-with-command-id-and-correlation-id.sdp.md new file mode 100644 index 00000000..b2200276 --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-017-system-to-handler-args-merges-args-with-command-id-and-correlation-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.system-to-handler-args-merges-args-with-command-id-and-correlation-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# System toHandlerArgs merges args with commandId and correlationId + +## Intent + +- outcome: Executable scenario "System toHandlerArgs merges args with commandId and correlationId" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-018-system-command-without-projection-has-no-projection-property.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-018-system-command-without-projection-has-no-projection-property.sdp.md new file mode 100644 index 00000000..42af5b5c --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-018-system-command-without-projection-has-no-projection-property.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.system-command-without-projection-has-no-projection-property +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# System command without projection has no projection property + +## Intent + +- outcome: Executable scenario "System command without projection has no projection property" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-019-system-command-with-projection-includes-it-in-config.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-019-system-command-with-projection-includes-it-in-config.sdp.md new file mode 100644 index 00000000..cce1f0aa --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-019-system-command-with-projection-includes-it-in-config.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.system-command-with-projection-includes-it-in-config +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# System command with projection includes it in config + +## Intent + +- outcome: Executable scenario "System command with projection includes it in config" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-020-system-partition-key-defaults-to-system-command-type.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-020-system-partition-key-defaults-to-system-command-type.sdp.md new file mode 100644 index 00000000..d391d4a9 --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-020-system-partition-key-defaults-to-system-command-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.system-partition-key-defaults-to-system-command-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# System partition key defaults to system/commandType + +## Intent + +- outcome: Executable scenario "System partition key defaults to system/commandType" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-021-system-command-without-projection-is-not-registered-even-with-auto-registe.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-021-system-command-without-projection-is-not-registered-even-with-auto-registe.sdp.md new file mode 100644 index 00000000..5ab87e41 --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-021-system-command-without-projection-is-not-registered-even-with-auto-registe.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.system-command-without-projection-is-not-registered-even-with-auto-register-true +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# System command without projection is not registered even with autoRegister true + +## Intent + +- outcome: Executable scenario "System command without projection is not registered even with autoRegister true" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-022-system-schema-version-defaults-to-1.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-022-system-schema-version-defaults-to-1.sdp.md new file mode 100644 index 00000000..f6c09adb --- /dev/null +++ b/specs/behavior/platform-core/registry/define-command.examples/s-022-system-schema-version-defaults-to-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.registry.define-command.system-schema-version-defaults-to-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.registry.define-command +--- +# System schemaVersion defaults to 1 + +## Intent + +- outcome: Executable scenario "System schemaVersion defaults to 1" from packages/platform-core/tests/features/behavior/registry/define-command.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-001-load-and-upcast-cms-by-entity-id.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-001-load-and-upcast-cms-by-entity-id.sdp.md new file mode 100644 index 00000000..ada88588 --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-001-load-and-upcast-cms-by-entity-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.load-and-upcast-cms-by-entity-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# Load and upcast CMS by entity ID + +## Intent + +- outcome: Executable scenario "Load and upcast CMS by entity ID" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-002-load-throws-not-found-error-for-missing-entity.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-002-load-throws-not-found-error-for-missing-entity.sdp.md new file mode 100644 index 00000000..436a1bcc --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-002-load-throws-not-found-error-for-missing-entity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.load-throws-not-found-error-for-missing-entity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# Load throws NotFoundError for missing entity + +## Intent + +- outcome: Executable scenario "Load throws NotFoundError for missing entity" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-003-load-returns-upcast-metadata.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-003-load-returns-upcast-metadata.sdp.md new file mode 100644 index 00000000..5f8d9717 --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-003-load-returns-upcast-metadata.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.load-returns-upcast-metadata +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# Load returns upcast metadata + +## Intent + +- outcome: Executable scenario "Load returns upcast metadata" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-004-load-propagates-upcast-errors.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-004-load-propagates-upcast-errors.sdp.md new file mode 100644 index 00000000..90b53354 --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-004-load-propagates-upcast-errors.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.load-propagates-upcast-errors +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# Load propagates upcast errors + +## Intent + +- outcome: Executable scenario "Load propagates upcast errors" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-005-try-load-returns-cms-when-entity-exists.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-005-try-load-returns-cms-when-entity-exists.sdp.md new file mode 100644 index 00000000..7f0f859f --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-005-try-load-returns-cms-when-entity-exists.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.try-load-returns-cms-when-entity-exists +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# tryLoad returns CMS when entity exists + +## Intent + +- outcome: Executable scenario "tryLoad returns CMS when entity exists" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-006-try-load-returns-null-when-entity-does-not-exist.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-006-try-load-returns-null-when-entity-does-not-exist.sdp.md new file mode 100644 index 00000000..b8c99833 --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-006-try-load-returns-null-when-entity-does-not-exist.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.try-load-returns-null-when-entity-does-not-exist +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# tryLoad returns null when entity does not exist + +## Intent + +- outcome: Executable scenario "tryLoad returns null when entity does not exist" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-007-try-load-resolves-to-null-without-throwing.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-007-try-load-resolves-to-null-without-throwing.sdp.md new file mode 100644 index 00000000..a50b7668 --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-007-try-load-resolves-to-null-without-throwing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.try-load-resolves-to-null-without-throwing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# tryLoad resolves to null without throwing + +## Intent + +- outcome: Executable scenario "tryLoad resolves to null without throwing" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-008-try-load-propagates-upcast-errors.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-008-try-load-propagates-upcast-errors.sdp.md new file mode 100644 index 00000000..e68ee432 --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-008-try-load-propagates-upcast-errors.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.try-load-propagates-upcast-errors +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# tryLoad propagates upcast errors + +## Intent + +- outcome: Executable scenario "tryLoad propagates upcast errors" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-009-exists-returns-true-when-entity-exists.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-009-exists-returns-true-when-entity-exists.sdp.md new file mode 100644 index 00000000..2e5388b0 --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-009-exists-returns-true-when-entity-exists.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.exists-returns-true-when-entity-exists +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# exists returns true when entity exists + +## Intent + +- outcome: Executable scenario "exists returns true when entity exists" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-010-exists-returns-false-when-entity-does-not-exist.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-010-exists-returns-false-when-entity-does-not-exist.sdp.md new file mode 100644 index 00000000..3e8baa7c --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-010-exists-returns-false-when-entity-does-not-exist.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.exists-returns-false-when-entity-does-not-exist +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# exists returns false when entity does not exist + +## Intent + +- outcome: Executable scenario "exists returns false when entity does not exist" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-011-exists-does-not-call-upcast-function.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-011-exists-does-not-call-upcast-function.sdp.md new file mode 100644 index 00000000..d80b54d0 --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-011-exists-does-not-call-upcast-function.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.exists-does-not-call-upcast-function +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# exists does not call upcast function + +## Intent + +- outcome: Executable scenario "exists does not call upcast function" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-012-load-many-loads-multiple-entities-in-parallel.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-012-load-many-loads-multiple-entities-in-parallel.sdp.md new file mode 100644 index 00000000..33ed9456 --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-012-load-many-loads-multiple-entities-in-parallel.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.load-many-loads-multiple-entities-in-parallel +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# loadMany loads multiple entities in parallel + +## Intent + +- outcome: Executable scenario "loadMany loads multiple entities in parallel" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-013-load-many-returns-null-for-missing-entities.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-013-load-many-returns-null-for-missing-entities.sdp.md new file mode 100644 index 00000000..c1683e30 --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-013-load-many-returns-null-for-missing-entities.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.load-many-returns-null-for-missing-entities +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# loadMany returns null for missing entities + +## Intent + +- outcome: Executable scenario "loadMany returns null for missing entities" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-014-load-many-returns-empty-array-for-empty-input.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-014-load-many-returns-empty-array-for-empty-input.sdp.md new file mode 100644 index 00000000..97f5605f --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-014-load-many-returns-empty-array-for-empty-input.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.load-many-returns-empty-array-for-empty-input +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# loadMany returns empty array for empty input + +## Intent + +- outcome: Executable scenario "loadMany returns empty array for empty input" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-015-load-many-upcasts-all-loaded-entities.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-015-load-many-upcasts-all-loaded-entities.sdp.md new file mode 100644 index 00000000..3c6bfdb9 --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-015-load-many-upcasts-all-loaded-entities.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.load-many-upcasts-all-loaded-entities +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# loadMany upcasts all loaded entities + +## Intent + +- outcome: Executable scenario "loadMany upcasts all loaded entities" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-016-load-many-preserves-order-of-input-i-ds.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-016-load-many-preserves-order-of-input-i-ds.sdp.md new file mode 100644 index 00000000..8be16496 --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-016-load-many-preserves-order-of-input-i-ds.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.load-many-preserves-order-of-input-i-ds +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# loadMany preserves order of input IDs + +## Intent + +- outcome: Executable scenario "loadMany preserves order of input IDs" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-017-load-many-propagates-upcast-errors-for-any-entity.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-017-load-many-propagates-upcast-errors-for-any-entity.sdp.md new file mode 100644 index 00000000..5feb5208 --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-017-load-many-propagates-upcast-errors-for-any-entity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.load-many-propagates-upcast-errors-for-any-entity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# loadMany propagates upcast errors for any entity + +## Intent + +- outcome: Executable scenario "loadMany propagates upcast errors for any entity" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-018-insert-creates-cms-record-and-returns-document-id.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-018-insert-creates-cms-record-and-returns-document-id.sdp.md new file mode 100644 index 00000000..190f0868 --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-018-insert-creates-cms-record-and-returns-document-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.insert-creates-cms-record-and-returns-document-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# insert creates CMS record and returns document ID + +## Intent + +- outcome: Executable scenario "insert creates CMS record and returns document ID" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-019-update-patches-cms-when-version-matches.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-019-update-patches-cms-when-version-matches.sdp.md new file mode 100644 index 00000000..b2181eab --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-019-update-patches-cms-when-version-matches.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.update-patches-cms-when-version-matches +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# update patches CMS when version matches + +## Intent + +- outcome: Executable scenario "update patches CMS when version matches" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-020-update-throws-not-found-error-for-missing-document.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-020-update-throws-not-found-error-for-missing-document.sdp.md new file mode 100644 index 00000000..6603b336 --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-020-update-throws-not-found-error-for-missing-document.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.update-throws-not-found-error-for-missing-document +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# update throws NotFoundError for missing document + +## Intent + +- outcome: Executable scenario "update throws NotFoundError for missing document" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-021-update-throws-version-conflict-error-on-version-mismatch.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-021-update-throws-version-conflict-error-on-version-mismatch.sdp.md new file mode 100644 index 00000000..d1cba84b --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-021-update-throws-version-conflict-error-on-version-mismatch.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.update-throws-version-conflict-error-on-version-mismatch +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# update throws VersionConflictError on version mismatch + +## Intent + +- outcome: Executable scenario "update throws VersionConflictError on version mismatch" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-022-not-found-error-has-correct-properties.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-022-not-found-error-has-correct-properties.sdp.md new file mode 100644 index 00000000..1e549665 --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-022-not-found-error-has-correct-properties.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.not-found-error-has-correct-properties +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# NotFoundError has correct properties + +## Intent + +- outcome: Executable scenario "NotFoundError has correct properties" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-023-not-found-error-is-instanceof-error.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-023-not-found-error-is-instanceof-error.sdp.md new file mode 100644 index 00000000..c2cf1db7 --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-023-not-found-error-is-instanceof-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.not-found-error-is-instanceof-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# NotFoundError is instanceof Error + +## Intent + +- outcome: Executable scenario "NotFoundError is instanceof Error" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-024-is-not-found-error-type-guard-returns-true-for-not-found-error.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-024-is-not-found-error-type-guard-returns-true-for-not-found-error.sdp.md new file mode 100644 index 00000000..a8c155dd --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-024-is-not-found-error-type-guard-returns-true-for-not-found-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.is-not-found-error-type-guard-returns-true-for-not-found-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# isNotFoundError type guard returns true for NotFoundError + +## Intent + +- outcome: Executable scenario "isNotFoundError type guard returns true for NotFoundError" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-025-is-not-found-error-type-guard-returns-false-for-non-not-found-error-values.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-025-is-not-found-error-type-guard-returns-false-for-non-not-found-error-values.sdp.md new file mode 100644 index 00000000..237c1803 --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-025-is-not-found-error-type-guard-returns-false-for-non-not-found-error-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.is-not-found-error-type-guard-returns-false-for-non-not-found-error-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# isNotFoundError type guard returns false for non-NotFoundError values + +## Intent + +- outcome: Executable scenario "isNotFoundError type guard returns false for non-NotFoundError values" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-026-version-conflict-error-has-correct-properties.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-026-version-conflict-error-has-correct-properties.sdp.md new file mode 100644 index 00000000..8f039fdc --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-026-version-conflict-error-has-correct-properties.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.version-conflict-error-has-correct-properties +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# VersionConflictError has correct properties + +## Intent + +- outcome: Executable scenario "VersionConflictError has correct properties" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-027-version-conflict-error-is-instanceof-error.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-027-version-conflict-error-is-instanceof-error.sdp.md new file mode 100644 index 00000000..dfa68891 --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-027-version-conflict-error-is-instanceof-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.version-conflict-error-is-instanceof-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# VersionConflictError is instanceof Error + +## Intent + +- outcome: Executable scenario "VersionConflictError is instanceof Error" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-028-is-version-conflict-error-type-guard-returns-true-for-version-conflict-err.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-028-is-version-conflict-error-type-guard-returns-true-for-version-conflict-err.sdp.md new file mode 100644 index 00000000..0477ea8a --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-028-is-version-conflict-error-type-guard-returns-true-for-version-conflict-err.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.is-version-conflict-error-type-guard-returns-true-for-version-conflict-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# isVersionConflictError type guard returns true for VersionConflictError + +## Intent + +- outcome: Executable scenario "isVersionConflictError type guard returns true for VersionConflictError" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-029-is-version-conflict-error-type-guard-returns-false-for-other-errors.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-029-is-version-conflict-error-type-guard-returns-false-for-other-errors.sdp.md new file mode 100644 index 00000000..7c47445d --- /dev/null +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-029-is-version-conflict-error-type-guard-returns-false-for-other-errors.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.repository.cms-repository.is-version-conflict-error-type-guard-returns-false-for-other-errors +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.repository.cms-repository +--- +# isVersionConflictError type guard returns false for other errors + +## Intent + +- outcome: Executable scenario "isVersionConflictError type guard returns false for other errors" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-001-confirm-reservation-with-entity-id.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-001-confirm-reservation-with-entity-id.sdp.md new file mode 100644 index 00000000..25b0ecc1 --- /dev/null +++ b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-001-confirm-reservation-with-entity-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.confirm-operation.confirm-reservation-with-entity-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.confirm-operation +--- +# Confirm reservation with entity ID + +## Intent + +- outcome: Executable scenario "Confirm reservation with entity ID" from packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-002-confirmed-reservation-is-permanent.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-002-confirmed-reservation-is-permanent.sdp.md new file mode 100644 index 00000000..277b09b5 --- /dev/null +++ b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-002-confirmed-reservation-is-permanent.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.confirm-operation.confirmed-reservation-is-permanent +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.confirm-operation +--- +# Confirmed reservation is permanent + +## Intent + +- outcome: Executable scenario "Confirmed reservation is permanent" from packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-003-cannot-confirm-expired-reservation.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-003-cannot-confirm-expired-reservation.sdp.md new file mode 100644 index 00000000..ca563a0a --- /dev/null +++ b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-003-cannot-confirm-expired-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.confirm-operation.cannot-confirm-expired-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.confirm-operation +--- +# Cannot confirm expired reservation + +## Intent + +- outcome: Executable scenario "Cannot confirm expired reservation" from packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-004-cannot-confirm-already-confirmed-reservation.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-004-cannot-confirm-already-confirmed-reservation.sdp.md new file mode 100644 index 00000000..1dc03d57 --- /dev/null +++ b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-004-cannot-confirm-already-confirmed-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.confirm-operation.cannot-confirm-already-confirmed-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.confirm-operation +--- +# Cannot confirm already confirmed reservation + +## Intent + +- outcome: Executable scenario "Cannot confirm already confirmed reservation" from packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-005-cannot-confirm-non-existent-reservation.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-005-cannot-confirm-non-existent-reservation.sdp.md new file mode 100644 index 00000000..c8271a04 --- /dev/null +++ b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-005-cannot-confirm-non-existent-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.confirm-operation.cannot-confirm-non-existent-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.confirm-operation +--- +# Cannot confirm non-existent reservation + +## Intent + +- outcome: Executable scenario "Cannot confirm non-existent reservation" from packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-006-cannot-confirm-released-reservation.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-006-cannot-confirm-released-reservation.sdp.md new file mode 100644 index 00000000..0e356d4a --- /dev/null +++ b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-006-cannot-confirm-released-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.confirm-operation.cannot-confirm-released-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.confirm-operation +--- +# Cannot confirm released reservation + +## Intent + +- outcome: Executable scenario "Cannot confirm released reservation" from packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-007-entity-id-is-required.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-007-entity-id-is-required.sdp.md new file mode 100644 index 00000000..3797edab --- /dev/null +++ b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-007-entity-id-is-required.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.confirm-operation.entity-id-is-required +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.confirm-operation +--- +# Entity ID is required + +## Intent + +- outcome: Executable scenario "Entity ID is required" from packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-008-entity-id-can-be-any-string-identifier.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-008-entity-id-can-be-any-string-identifier.sdp.md new file mode 100644 index 00000000..b141d82d --- /dev/null +++ b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-008-entity-id-can-be-any-string-identifier.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.confirm-operation.entity-id-can-be-any-string-identifier +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.confirm-operation +--- +# Entity ID can be any string identifier + +## Intent + +- outcome: Executable scenario "Entity ID can be any string identifier" from packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-001-release-active-reservation.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-001-release-active-reservation.sdp.md new file mode 100644 index 00000000..fb6b97d0 --- /dev/null +++ b/specs/behavior/platform-core/reservation/release-operation.examples/s-001-release-active-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.release-operation.release-active-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.release-operation +--- +# Release active reservation + +## Intent + +- outcome: Executable scenario "Release active reservation" from packages/platform-core/tests/features/behavior/reservation/release-operation.feature diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-002-released-value-can-be-immediately-reserved.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-002-released-value-can-be-immediately-reserved.sdp.md new file mode 100644 index 00000000..eba9b1bf --- /dev/null +++ b/specs/behavior/platform-core/reservation/release-operation.examples/s-002-released-value-can-be-immediately-reserved.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.release-operation.released-value-can-be-immediately-reserved +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.release-operation +--- +# Released value can be immediately reserved + +## Intent + +- outcome: Executable scenario "Released value can be immediately reserved" from packages/platform-core/tests/features/behavior/reservation/release-operation.feature diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-003-cannot-release-confirmed-reservation.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-003-cannot-release-confirmed-reservation.sdp.md new file mode 100644 index 00000000..d4e3a9d3 --- /dev/null +++ b/specs/behavior/platform-core/reservation/release-operation.examples/s-003-cannot-release-confirmed-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.release-operation.cannot-release-confirmed-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.release-operation +--- +# Cannot release confirmed reservation + +## Intent + +- outcome: Executable scenario "Cannot release confirmed reservation" from packages/platform-core/tests/features/behavior/reservation/release-operation.feature diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-004-cannot-release-already-released-reservation.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-004-cannot-release-already-released-reservation.sdp.md new file mode 100644 index 00000000..ae1351c1 --- /dev/null +++ b/specs/behavior/platform-core/reservation/release-operation.examples/s-004-cannot-release-already-released-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.release-operation.cannot-release-already-released-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.release-operation +--- +# Cannot release already released reservation + +## Intent + +- outcome: Executable scenario "Cannot release already released reservation" from packages/platform-core/tests/features/behavior/reservation/release-operation.feature diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-005-cannot-release-expired-reservation.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-005-cannot-release-expired-reservation.sdp.md new file mode 100644 index 00000000..4b801f3e --- /dev/null +++ b/specs/behavior/platform-core/reservation/release-operation.examples/s-005-cannot-release-expired-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.release-operation.cannot-release-expired-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.release-operation +--- +# Cannot release expired reservation + +## Intent + +- outcome: Executable scenario "Cannot release expired reservation" from packages/platform-core/tests/features/behavior/reservation/release-operation.feature diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-006-cannot-release-non-existent-reservation.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-006-cannot-release-non-existent-reservation.sdp.md new file mode 100644 index 00000000..5538d5e5 --- /dev/null +++ b/specs/behavior/platform-core/reservation/release-operation.examples/s-006-cannot-release-non-existent-reservation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.release-operation.cannot-release-non-existent-reservation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.release-operation +--- +# Cannot release non-existent reservation + +## Intent + +- outcome: Executable scenario "Cannot release non-existent reservation" from packages/platform-core/tests/features/behavior/reservation/release-operation.feature diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-007-expired-reservations-are-marked-by-cron.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-007-expired-reservations-are-marked-by-cron.sdp.md new file mode 100644 index 00000000..c691c8de --- /dev/null +++ b/specs/behavior/platform-core/reservation/release-operation.examples/s-007-expired-reservations-are-marked-by-cron.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.release-operation.expired-reservations-are-marked-by-cron +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.release-operation +--- +# Expired reservations are marked by cron + +## Intent + +- outcome: Executable scenario "Expired reservations are marked by cron" from packages/platform-core/tests/features/behavior/reservation/release-operation.feature diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-008-cron-does-not-affect-active-reservations.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-008-cron-does-not-affect-active-reservations.sdp.md new file mode 100644 index 00000000..e8943209 --- /dev/null +++ b/specs/behavior/platform-core/reservation/release-operation.examples/s-008-cron-does-not-affect-active-reservations.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.release-operation.cron-does-not-affect-active-reservations +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.release-operation +--- +# Cron does not affect active reservations + +## Intent + +- outcome: Executable scenario "Cron does not affect active reservations" from packages/platform-core/tests/features/behavior/reservation/release-operation.feature diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-009-cron-does-not-affect-confirmed-reservations.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-009-cron-does-not-affect-confirmed-reservations.sdp.md new file mode 100644 index 00000000..097fbc90 --- /dev/null +++ b/specs/behavior/platform-core/reservation/release-operation.examples/s-009-cron-does-not-affect-confirmed-reservations.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.release-operation.cron-does-not-affect-confirmed-reservations +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.release-operation +--- +# Cron does not affect confirmed reservations + +## Intent + +- outcome: Executable scenario "Cron does not affect confirmed reservations" from packages/platform-core/tests/features/behavior/reservation/release-operation.feature diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-001-email-reservation-key-format.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-001-email-reservation-key-format.sdp.md new file mode 100644 index 00000000..6aa17970 --- /dev/null +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-001-email-reservation-key-format.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reservation-key.email-reservation-key-format +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reservation-key +--- +# Email reservation key format + +## Intent + +- outcome: Executable scenario "Email reservation key format" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-002-username-reservation-key-format.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-002-username-reservation-key-format.sdp.md new file mode 100644 index 00000000..c1ac3b89 --- /dev/null +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-002-username-reservation-key-format.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reservation-key.username-reservation-key-format +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reservation-key +--- +# Username reservation key format + +## Intent + +- outcome: Executable scenario "Username reservation key format" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-003-custom-type-reservation-key-format.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-003-custom-type-reservation-key-format.sdp.md new file mode 100644 index 00000000..9086381d --- /dev/null +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-003-custom-type-reservation-key-format.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reservation-key.custom-type-reservation-key-format +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reservation-key +--- +# Custom type reservation key format + +## Intent + +- outcome: Executable scenario "Custom type reservation key format" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-004-same-value-different-types.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-004-same-value-different-types.sdp.md new file mode 100644 index 00000000..45717e86 --- /dev/null +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-004-same-value-different-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reservation-key.same-value-different-types +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reservation-key +--- +# Same value different types + +## Intent + +- outcome: Executable scenario "Same value different types" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-005-independent-type-uniqueness.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-005-independent-type-uniqueness.sdp.md new file mode 100644 index 00000000..9cc2e403 --- /dev/null +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-005-independent-type-uniqueness.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reservation-key.independent-type-uniqueness +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reservation-key +--- +# Independent type uniqueness + +## Intent + +- outcome: Executable scenario "Independent type uniqueness" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-006-type-is-required.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-006-type-is-required.sdp.md new file mode 100644 index 00000000..874c1e98 --- /dev/null +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-006-type-is-required.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reservation-key.type-is-required +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reservation-key +--- +# Type is required + +## Intent + +- outcome: Executable scenario "Type is required" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-007-value-is-required.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-007-value-is-required.sdp.md new file mode 100644 index 00000000..c4cc202f --- /dev/null +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-007-value-is-required.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reservation-key.value-is-required +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reservation-key +--- +# Value is required + +## Intent + +- outcome: Executable scenario "Value is required" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-008-empty-type-is-invalid.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-008-empty-type-is-invalid.sdp.md new file mode 100644 index 00000000..33996eac --- /dev/null +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-008-empty-type-is-invalid.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reservation-key.empty-type-is-invalid +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reservation-key +--- +# Empty type is invalid + +## Intent + +- outcome: Executable scenario "Empty type is invalid" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-009-empty-value-is-invalid.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-009-empty-value-is-invalid.sdp.md new file mode 100644 index 00000000..6e18ec1a --- /dev/null +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-009-empty-value-is-invalid.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reservation-key.empty-value-is-invalid +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reservation-key +--- +# Empty value is invalid + +## Intent + +- outcome: Executable scenario "Empty value is invalid" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-010-find-reservation-by-key.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-010-find-reservation-by-key.sdp.md new file mode 100644 index 00000000..36cc9997 --- /dev/null +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-010-find-reservation-by-key.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reservation-key.find-reservation-by-key +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reservation-key +--- +# Find reservation by key + +## Intent + +- outcome: Executable scenario "Find reservation by key" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-011-find-reservation-by-type-and-value.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-011-find-reservation-by-type-and-value.sdp.md new file mode 100644 index 00000000..5ecc94e4 --- /dev/null +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-011-find-reservation-by-type-and-value.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reservation-key.find-reservation-by-type-and-value +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reservation-key +--- +# Find reservation by type and value + +## Intent + +- outcome: Executable scenario "Find reservation by type and value" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-012-non-existent-key-returns-null.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-012-non-existent-key-returns-null.sdp.md new file mode 100644 index 00000000..7c90cf44 --- /dev/null +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-012-non-existent-key-returns-null.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reservation-key.non-existent-key-returns-null +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reservation-key +--- +# Non-existent key returns null + +## Intent + +- outcome: Executable scenario "Non-existent key returns null" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-013-type-containing-colon-is-rejected.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-013-type-containing-colon-is-rejected.sdp.md new file mode 100644 index 00000000..a09f1e2b --- /dev/null +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-013-type-containing-colon-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reservation-key.type-containing-colon-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reservation-key +--- +# Type containing colon is rejected + +## Intent + +- outcome: Executable scenario "Type containing colon is rejected" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-014-value-can-contain-colon-url-with-port.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-014-value-can-contain-colon-url-with-port.sdp.md new file mode 100644 index 00000000..667ab07f --- /dev/null +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-014-value-can-contain-colon-url-with-port.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reservation-key.value-can-contain-colon-url-with-port +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reservation-key +--- +# Value can contain colon (URL with port) + +## Intent + +- outcome: Executable scenario "Value can contain colon (URL with port)" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-001-reserve-an-email-address.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-001-reserve-an-email-address.sdp.md new file mode 100644 index 00000000..1f023fb6 --- /dev/null +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-001-reserve-an-email-address.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reserve-operation.reserve-an-email-address +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reserve-operation +--- +# Reserve an email address + +## Intent + +- outcome: Executable scenario "Reserve an email address" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-002-reserve-with-correlation-id.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-002-reserve-with-correlation-id.sdp.md new file mode 100644 index 00000000..698644d6 --- /dev/null +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-002-reserve-with-correlation-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reserve-operation.reserve-with-correlation-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reserve-operation +--- +# Reserve with correlation ID + +## Intent + +- outcome: Executable scenario "Reserve with correlation ID" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-003-first-reservation-wins.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-003-first-reservation-wins.sdp.md new file mode 100644 index 00000000..40443366 --- /dev/null +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-003-first-reservation-wins.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reserve-operation.first-reservation-wins +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reserve-operation +--- +# First reservation wins + +## Intent + +- outcome: Executable scenario "First reservation wins" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-004-reserved-value-cannot-be-re-reserved.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-004-reserved-value-cannot-be-re-reserved.sdp.md new file mode 100644 index 00000000..d7d99383 --- /dev/null +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-004-reserved-value-cannot-be-re-reserved.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reserve-operation.reserved-value-cannot-be-re-reserved +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reserve-operation +--- +# Reserved value cannot be re-reserved + +## Intent + +- outcome: Executable scenario "Reserved value cannot be re-reserved" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-005-different-ttl-values.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-005-different-ttl-values.sdp.md new file mode 100644 index 00000000..9fbb4a8e --- /dev/null +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-005-different-ttl-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reserve-operation.different-ttl-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reserve-operation +--- +# Different TTL values + +## Intent + +- outcome: Executable scenario "Different TTL values" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-006-ttl-must-be-positive.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-006-ttl-must-be-positive.sdp.md new file mode 100644 index 00000000..4f383814 --- /dev/null +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-006-ttl-must-be-positive.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reserve-operation.ttl-must-be-positive +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reserve-operation +--- +# TTL must be positive + +## Intent + +- outcome: Executable scenario "TTL must be positive" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-007-ttl-has-maximum-limit.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-007-ttl-has-maximum-limit.sdp.md new file mode 100644 index 00000000..59313c38 --- /dev/null +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-007-ttl-has-maximum-limit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reserve-operation.ttl-has-maximum-limit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reserve-operation +--- +# TTL has maximum limit + +## Intent + +- outcome: Executable scenario "TTL has maximum limit" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-008-negative-ttl-is-rejected.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-008-negative-ttl-is-rejected.sdp.md new file mode 100644 index 00000000..a9ebc60a --- /dev/null +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-008-negative-ttl-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reserve-operation.negative-ttl-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reserve-operation +--- +# Negative TTL is rejected + +## Intent + +- outcome: Executable scenario "Negative TTL is rejected" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-009-ttl-at-minimum-boundary-succeeds.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-009-ttl-at-minimum-boundary-succeeds.sdp.md new file mode 100644 index 00000000..8677eb61 --- /dev/null +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-009-ttl-at-minimum-boundary-succeeds.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reserve-operation.ttl-at-minimum-boundary-succeeds +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reserve-operation +--- +# TTL at minimum boundary succeeds + +## Intent + +- outcome: Executable scenario "TTL at minimum boundary succeeds" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-010-ttl-just-below-minimum-is-rejected.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-010-ttl-just-below-minimum-is-rejected.sdp.md new file mode 100644 index 00000000..fee001b9 --- /dev/null +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-010-ttl-just-below-minimum-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reserve-operation.ttl-just-below-minimum-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reserve-operation +--- +# TTL just below minimum is rejected + +## Intent + +- outcome: Executable scenario "TTL just below minimum is rejected" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-011-na-n-ttl-is-rejected.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-011-na-n-ttl-is-rejected.sdp.md new file mode 100644 index 00000000..75579ab1 --- /dev/null +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-011-na-n-ttl-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reserve-operation.na-n-ttl-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reserve-operation +--- +# NaN TTL is rejected + +## Intent + +- outcome: Executable scenario "NaN TTL is rejected" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-012-infinity-ttl-is-rejected.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-012-infinity-ttl-is-rejected.sdp.md new file mode 100644 index 00000000..c9c1b487 --- /dev/null +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-012-infinity-ttl-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reserve-operation.infinity-ttl-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reserve-operation +--- +# Infinity TTL is rejected + +## Intent + +- outcome: Executable scenario "Infinity TTL is rejected" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-013-whitespace-only-type-is-invalid.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-013-whitespace-only-type-is-invalid.sdp.md new file mode 100644 index 00000000..94107795 --- /dev/null +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-013-whitespace-only-type-is-invalid.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reserve-operation.whitespace-only-type-is-invalid +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reserve-operation +--- +# Whitespace-only type is invalid + +## Intent + +- outcome: Executable scenario "Whitespace-only type is invalid" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-014-whitespace-only-value-is-invalid.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-014-whitespace-only-value-is-invalid.sdp.md new file mode 100644 index 00000000..059c0b6b --- /dev/null +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-014-whitespace-only-value-is-invalid.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.reservation.reserve-operation.whitespace-only-value-is-invalid +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.reservation.reserve-operation +--- +# Whitespace-only value is invalid + +## Intent + +- outcome: Executable scenario "Whitespace-only value is invalid" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-001-complete-metadata-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-001-complete-metadata-is-accepted.sdp.md new file mode 100644 index 00000000..c13f8a37 --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-001-complete-metadata-is-accepted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.complete-metadata-is-accepted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Complete metadata is accepted + +## Intent + +- outcome: Executable scenario "Complete metadata is accepted" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-002-metadata-with-optional-user-id-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-002-metadata-with-optional-user-id-is-accepted.sdp.md new file mode 100644 index 00000000..3a2f5b34 --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-002-metadata-with-optional-user-id-is-accepted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.metadata-with-optional-user-id-is-accepted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Metadata with optional userId is accepted + +## Intent + +- outcome: Executable scenario "Metadata with optional userId is accepted" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-003-metadata-with-invalid-timestamps-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-003-metadata-with-invalid-timestamps-is-rejected.sdp.md new file mode 100644 index 00000000..567f5d59 --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-003-metadata-with-invalid-timestamps-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.metadata-with-invalid-timestamps-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Metadata with invalid timestamps is rejected + +## Intent + +- outcome: Executable scenario "Metadata with invalid timestamps is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-004-metadata-missing-required-fields-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-004-metadata-missing-required-fields-is-rejected.sdp.md new file mode 100644 index 00000000..2c0dc316 --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-004-metadata-missing-required-fields-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.metadata-missing-required-fields-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Metadata missing required fields is rejected + +## Intent + +- outcome: Executable scenario "Metadata missing required fields is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-005-complete-command-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-005-complete-command-is-accepted.sdp.md new file mode 100644 index 00000000..0a272c29 --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-005-complete-command-is-accepted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.complete-command-is-accepted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Complete command is accepted + +## Intent + +- outcome: Executable scenario "Complete command is accepted" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-006-command-with-optional-payload-fields-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-006-command-with-optional-payload-fields-is-accepted.sdp.md new file mode 100644 index 00000000..b707e5ce --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-006-command-with-optional-payload-fields-is-accepted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.command-with-optional-payload-fields-is-accepted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Command with optional payload fields is accepted + +## Intent + +- outcome: Executable scenario "Command with optional payload fields is accepted" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-007-command-with-wrong-command-type-literal-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-007-command-with-wrong-command-type-literal-is-rejected.sdp.md new file mode 100644 index 00000000..97550651 --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-007-command-with-wrong-command-type-literal-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.command-with-wrong-command-type-literal-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Command with wrong commandType literal is rejected + +## Intent + +- outcome: Executable scenario "Command with wrong commandType literal is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-008-command-with-invalid-payload-type-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-008-command-with-invalid-payload-type-is-rejected.sdp.md new file mode 100644 index 00000000..0fec028b --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-008-command-with-invalid-payload-type-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.command-with-invalid-payload-type-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Command with invalid payload type is rejected + +## Intent + +- outcome: Executable scenario "Command with invalid payload type is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-009-command-with-missing-required-payload-field-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-009-command-with-missing-required-payload-field-is-rejected.sdp.md new file mode 100644 index 00000000..0c493ad4 --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-009-command-with-missing-required-payload-field-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.command-with-missing-required-payload-field-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Command with missing required payload field is rejected + +## Intent + +- outcome: Executable scenario "Command with missing required payload field is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-010-command-missing-target-context-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-010-command-missing-target-context-is-rejected.sdp.md new file mode 100644 index 00000000..290f5e69 --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-010-command-missing-target-context-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.command-missing-target-context-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Command missing targetContext is rejected + +## Intent + +- outcome: Executable scenario "Command missing targetContext is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-011-schema-provides-type-inference-for-command-type-literal.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-011-schema-provides-type-inference-for-command-type-literal.sdp.md new file mode 100644 index 00000000..819f7ab7 --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-011-schema-provides-type-inference-for-command-type-literal.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.schema-provides-type-inference-for-command-type-literal +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Schema provides type inference for commandType literal + +## Intent + +- outcome: Executable scenario "Schema provides type inference for commandType literal" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-012-success-with-version-and-data-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-012-success-with-version-and-data-is-accepted.sdp.md new file mode 100644 index 00000000..db97d663 --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-012-success-with-version-and-data-is-accepted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.success-with-version-and-data-is-accepted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Success with version and data is accepted + +## Intent + +- outcome: Executable scenario "Success with version and data is accepted" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-013-success-with-undefined-data-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-013-success-with-undefined-data-is-accepted.sdp.md new file mode 100644 index 00000000..47305a0c --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-013-success-with-undefined-data-is-accepted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.success-with-undefined-data-is-accepted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Success with undefined data is accepted + +## Intent + +- outcome: Executable scenario "Success with undefined data is accepted" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-014-success-without-version-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-014-success-without-version-is-rejected.sdp.md new file mode 100644 index 00000000..641aaa9b --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-014-success-without-version-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.success-without-version-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Success without version is rejected + +## Intent + +- outcome: Executable scenario "Success without version is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-015-rejected-with-code-and-reason-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-015-rejected-with-code-and-reason-is-accepted.sdp.md new file mode 100644 index 00000000..95f766b1 --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-015-rejected-with-code-and-reason-is-accepted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.rejected-with-code-and-reason-is-accepted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Rejected with code and reason is accepted + +## Intent + +- outcome: Executable scenario "Rejected with code and reason is accepted" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-016-rejected-with-optional-context-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-016-rejected-with-optional-context-is-accepted.sdp.md new file mode 100644 index 00000000..c6090b38 --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-016-rejected-with-optional-context-is-accepted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.rejected-with-optional-context-is-accepted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Rejected with optional context is accepted + +## Intent + +- outcome: Executable scenario "Rejected with optional context is accepted" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-017-rejected-without-reason-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-017-rejected-without-reason-is-rejected.sdp.md new file mode 100644 index 00000000..8418454e --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-017-rejected-without-reason-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.rejected-without-reason-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Rejected without reason is rejected + +## Intent + +- outcome: Executable scenario "Rejected without reason is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-018-conflict-with-concurrent-modification-code-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-018-conflict-with-concurrent-modification-code-is-accepted.sdp.md new file mode 100644 index 00000000..3c473eb0 --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-018-conflict-with-concurrent-modification-code-is-accepted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.conflict-with-concurrent-modification-code-is-accepted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Conflict with CONCURRENT_MODIFICATION code is accepted + +## Intent + +- outcome: Executable scenario "Conflict with CONCURRENT_MODIFICATION code is accepted" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-019-conflict-with-wrong-code-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-019-conflict-with-wrong-code-is-rejected.sdp.md new file mode 100644 index 00000000..d9b820e5 --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-019-conflict-with-wrong-code-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.conflict-with-wrong-code-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Conflict with wrong code is rejected + +## Intent + +- outcome: Executable scenario "Conflict with wrong code is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-020-conflict-without-current-version-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-020-conflict-without-current-version-is-rejected.sdp.md new file mode 100644 index 00000000..97e0247c --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-020-conflict-without-current-version-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.conflict-without-current-version-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Conflict without currentVersion is rejected + +## Intent + +- outcome: Executable scenario "Conflict without currentVersion is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-021-error-with-message-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-021-error-with-message-is-accepted.sdp.md new file mode 100644 index 00000000..70507b25 --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-021-error-with-message-is-accepted.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.error-with-message-is-accepted +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Error with message is accepted + +## Intent + +- outcome: Executable scenario "Error with message is accepted" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-022-error-without-message-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-022-error-without-message-is-rejected.sdp.md new file mode 100644 index 00000000..632147bb --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-022-error-without-message-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.error-without-message-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Error without message is rejected + +## Intent + +- outcome: Executable scenario "Error without message is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-023-union-discriminates-success-and-preserves-version.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-023-union-discriminates-success-and-preserves-version.sdp.md new file mode 100644 index 00000000..c9ad7e43 --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-023-union-discriminates-success-and-preserves-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.union-discriminates-success-and-preserves-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Union discriminates success and preserves version + +## Intent + +- outcome: Executable scenario "Union discriminates success and preserves version" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-024-union-discriminates-rejected-and-preserves-code-and-reason.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-024-union-discriminates-rejected-and-preserves-code-and-reason.sdp.md new file mode 100644 index 00000000..e8fe2335 --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-024-union-discriminates-rejected-and-preserves-code-and-reason.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.union-discriminates-rejected-and-preserves-code-and-reason +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Union discriminates rejected and preserves code and reason + +## Intent + +- outcome: Executable scenario "Union discriminates rejected and preserves code and reason" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-025-union-discriminates-conflict-and-preserves-current-version.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-025-union-discriminates-conflict-and-preserves-current-version.sdp.md new file mode 100644 index 00000000..c6a52007 --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-025-union-discriminates-conflict-and-preserves-current-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.union-discriminates-conflict-and-preserves-current-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Union discriminates conflict and preserves currentVersion + +## Intent + +- outcome: Executable scenario "Union discriminates conflict and preserves currentVersion" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-026-union-discriminates-error-and-preserves-message.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-026-union-discriminates-error-and-preserves-message.sdp.md new file mode 100644 index 00000000..05b9a73b --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-026-union-discriminates-error-and-preserves-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.union-discriminates-error-and-preserves-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Union discriminates error and preserves message + +## Intent + +- outcome: Executable scenario "Union discriminates error and preserves message" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-027-union-rejects-unknown-status.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-027-union-rejects-unknown-status.sdp.md new file mode 100644 index 00000000..2f6fb07b --- /dev/null +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-027-union-rejects-unknown-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.schemas.command-schemas.union-rejects-unknown-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.schemas.command-schemas +--- +# Union rejects unknown status + +## Intent + +- outcome: Executable scenario "Union rejects unknown status" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature diff --git a/specs/behavior/platform-core/testing/guards.examples/s-001-allow-execution-when-convex-test-mode-is-true.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-001-allow-execution-when-convex-test-mode-is-true.sdp.md new file mode 100644 index 00000000..8aba6ff5 --- /dev/null +++ b/specs/behavior/platform-core/testing/guards.examples/s-001-allow-execution-when-convex-test-mode-is-true.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.guards.allow-execution-when-convex-test-mode-is-true +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.guards +--- +# Allow execution when __CONVEX_TEST_MODE__ is true + +## Intent + +- outcome: Executable scenario "Allow execution when __CONVEX_TEST_MODE__ is true" from packages/platform-core/tests/features/behavior/testing/guards.feature diff --git a/specs/behavior/platform-core/testing/guards.examples/s-002-allow-execution-when-is-test-env-is-set.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-002-allow-execution-when-is-test-env-is-set.sdp.md new file mode 100644 index 00000000..04d6d1f7 --- /dev/null +++ b/specs/behavior/platform-core/testing/guards.examples/s-002-allow-execution-when-is-test-env-is-set.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.guards.allow-execution-when-is-test-env-is-set +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.guards +--- +# Allow execution when IS_TEST env is set + +## Intent + +- outcome: Executable scenario "Allow execution when IS_TEST env is set" from packages/platform-core/tests/features/behavior/testing/guards.feature diff --git a/specs/behavior/platform-core/testing/guards.examples/s-003-allow-execution-on-self-hosted-runtime-without-explicit-test-signal.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-003-allow-execution-on-self-hosted-runtime-without-explicit-test-signal.sdp.md new file mode 100644 index 00000000..5b2fc95d --- /dev/null +++ b/specs/behavior/platform-core/testing/guards.examples/s-003-allow-execution-on-self-hosted-runtime-without-explicit-test-signal.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.guards.allow-execution-on-self-hosted-runtime-without-explicit-test-signal +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.guards +--- +# Allow execution on self-hosted runtime without explicit test signal + +## Intent + +- outcome: Executable scenario "Allow execution on self-hosted runtime without explicit test signal" from packages/platform-core/tests/features/behavior/testing/guards.feature diff --git a/specs/behavior/platform-core/testing/guards.examples/s-004-block-execution-in-cloud-production.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-004-block-execution-in-cloud-production.sdp.md new file mode 100644 index 00000000..6119dc4f --- /dev/null +++ b/specs/behavior/platform-core/testing/guards.examples/s-004-block-execution-in-cloud-production.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.guards.block-execution-in-cloud-production +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.guards +--- +# Block execution in cloud production + +## Intent + +- outcome: Executable scenario "Block execution in cloud production" from packages/platform-core/tests/features/behavior/testing/guards.feature diff --git a/specs/behavior/platform-core/testing/guards.examples/s-005-is-test-environment-returns-true-in-test-mode.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-005-is-test-environment-returns-true-in-test-mode.sdp.md new file mode 100644 index 00000000..abb89aa6 --- /dev/null +++ b/specs/behavior/platform-core/testing/guards.examples/s-005-is-test-environment-returns-true-in-test-mode.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.guards.is-test-environment-returns-true-in-test-mode +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.guards +--- +# isTestEnvironment returns true in test mode + +## Intent + +- outcome: Executable scenario "isTestEnvironment returns true in test mode" from packages/platform-core/tests/features/behavior/testing/guards.feature diff --git a/specs/behavior/platform-core/testing/guards.examples/s-006-is-test-environment-returns-true-with-is-test-env.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-006-is-test-environment-returns-true-with-is-test-env.sdp.md new file mode 100644 index 00000000..2ddfa42d --- /dev/null +++ b/specs/behavior/platform-core/testing/guards.examples/s-006-is-test-environment-returns-true-with-is-test-env.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.guards.is-test-environment-returns-true-with-is-test-env +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.guards +--- +# isTestEnvironment returns true with IS_TEST env + +## Intent + +- outcome: Executable scenario "isTestEnvironment returns true with IS_TEST env" from packages/platform-core/tests/features/behavior/testing/guards.feature diff --git a/specs/behavior/platform-core/testing/guards.examples/s-007-is-test-environment-returns-false-in-production.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-007-is-test-environment-returns-false-in-production.sdp.md new file mode 100644 index 00000000..256eef7a --- /dev/null +++ b/specs/behavior/platform-core/testing/guards.examples/s-007-is-test-environment-returns-false-in-production.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.guards.is-test-environment-returns-false-in-production +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.guards +--- +# isTestEnvironment returns false in production + +## Intent + +- outcome: Executable scenario "isTestEnvironment returns false in production" from packages/platform-core/tests/features/behavior/testing/guards.feature diff --git a/specs/behavior/platform-core/testing/guards.examples/s-008-is-test-environment-is-a-safe-boolean-check.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-008-is-test-environment-is-a-safe-boolean-check.sdp.md new file mode 100644 index 00000000..c511282d --- /dev/null +++ b/specs/behavior/platform-core/testing/guards.examples/s-008-is-test-environment-is-a-safe-boolean-check.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.guards.is-test-environment-is-a-safe-boolean-check +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.guards +--- +# isTestEnvironment is a safe boolean check + +## Intent + +- outcome: Executable scenario "isTestEnvironment is a safe boolean check" from packages/platform-core/tests/features/behavior/testing/guards.feature diff --git a/specs/behavior/platform-core/testing/integration-isolation.examples/s-001-fresh-state-after-docker-restart.sdp.md b/specs/behavior/platform-core/testing/integration-isolation.examples/s-001-fresh-state-after-docker-restart.sdp.md new file mode 100644 index 00000000..fcc21878 --- /dev/null +++ b/specs/behavior/platform-core/testing/integration-isolation.examples/s-001-fresh-state-after-docker-restart.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.integration-isolation.fresh-state-after-docker-restart +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.integration-isolation +--- +# Fresh state after Docker restart + +## Intent + +- outcome: Executable scenario "Fresh state after Docker restart" from packages/platform-core/tests/features/behavior/testing/integration-isolation.feature diff --git a/specs/behavior/platform-core/testing/integration-isolation.examples/s-002-detect-state-pollution-without-restart.sdp.md b/specs/behavior/platform-core/testing/integration-isolation.examples/s-002-detect-state-pollution-without-restart.sdp.md new file mode 100644 index 00000000..b2f7c414 --- /dev/null +++ b/specs/behavior/platform-core/testing/integration-isolation.examples/s-002-detect-state-pollution-without-restart.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.integration-isolation.detect-state-pollution-without-restart +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.integration-isolation +--- +# Detect state pollution without restart + +## Intent + +- outcome: Executable scenario "Detect state pollution without restart" from packages/platform-core/tests/features/behavior/testing/integration-isolation.feature diff --git a/specs/behavior/platform-core/testing/integration-isolation.examples/s-003-unique-namespace-per-test.sdp.md b/specs/behavior/platform-core/testing/integration-isolation.examples/s-003-unique-namespace-per-test.sdp.md new file mode 100644 index 00000000..7b64cb0b --- /dev/null +++ b/specs/behavior/platform-core/testing/integration-isolation.examples/s-003-unique-namespace-per-test.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.integration-isolation.unique-namespace-per-test +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.integration-isolation +--- +# Unique namespace per test + +## Intent + +- outcome: Executable scenario "Unique namespace per test" from packages/platform-core/tests/features/behavior/testing/integration-isolation.feature diff --git a/specs/behavior/platform-core/testing/integration-isolation.examples/s-004-namespace-applied-to-correlation-i-ds.sdp.md b/specs/behavior/platform-core/testing/integration-isolation.examples/s-004-namespace-applied-to-correlation-i-ds.sdp.md new file mode 100644 index 00000000..14485a2e --- /dev/null +++ b/specs/behavior/platform-core/testing/integration-isolation.examples/s-004-namespace-applied-to-correlation-i-ds.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.integration-isolation.namespace-applied-to-correlation-i-ds +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.integration-isolation +--- +# Namespace applied to correlation IDs + +## Intent + +- outcome: Executable scenario "Namespace applied to correlation IDs" from packages/platform-core/tests/features/behavior/testing/integration-isolation.feature diff --git a/specs/behavior/platform-core/testing/integration-isolation.examples/s-005-workpool-jobs-from-previous-test-don-t-interfere.sdp.md b/specs/behavior/platform-core/testing/integration-isolation.examples/s-005-workpool-jobs-from-previous-test-don-t-interfere.sdp.md new file mode 100644 index 00000000..f0d3744d --- /dev/null +++ b/specs/behavior/platform-core/testing/integration-isolation.examples/s-005-workpool-jobs-from-previous-test-don-t-interfere.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.integration-isolation.workpool-jobs-from-previous-test-don-t-interfere +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.integration-isolation +--- +# Workpool jobs from previous test don't interfere + +## Intent + +- outcome: Executable scenario "Workpool jobs from previous test don't interfere" from packages/platform-core/tests/features/behavior/testing/integration-isolation.feature diff --git a/specs/behavior/platform-core/testing/integration-isolation.examples/s-006-scheduled-functions-use-test-specific-context.sdp.md b/specs/behavior/platform-core/testing/integration-isolation.examples/s-006-scheduled-functions-use-test-specific-context.sdp.md new file mode 100644 index 00000000..5440172a --- /dev/null +++ b/specs/behavior/platform-core/testing/integration-isolation.examples/s-006-scheduled-functions-use-test-specific-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.integration-isolation.scheduled-functions-use-test-specific-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.integration-isolation +--- +# Scheduled functions use test-specific context + +## Intent + +- outcome: Executable scenario "Scheduled functions use test-specific context" from packages/platform-core/tests/features/behavior/testing/integration-isolation.feature diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-001-package-has-feature-directory-platform-core.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-001-package-has-feature-directory-platform-core.sdp.md new file mode 100644 index 00000000..54a20c0d --- /dev/null +++ b/specs/behavior/platform-core/testing/platform-coverage.examples/s-001-package-has-feature-directory-platform-core.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.platform-coverage.package-has-feature-directory-platform-core +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.platform-coverage +--- +# Package has feature directory - platform-core + +## Intent + +- outcome: Executable scenario "Package has feature directory - platform-core" from packages/platform-core/tests/features/behavior/testing/platform-coverage.feature diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-002-package-has-feature-directory-platform-decider.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-002-package-has-feature-directory-platform-decider.sdp.md new file mode 100644 index 00000000..9b557a48 --- /dev/null +++ b/specs/behavior/platform-core/testing/platform-coverage.examples/s-002-package-has-feature-directory-platform-decider.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.platform-coverage.package-has-feature-directory-platform-decider +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.platform-coverage +--- +# Package has feature directory - platform-decider + +## Intent + +- outcome: Executable scenario "Package has feature directory - platform-decider" from packages/platform-core/tests/features/behavior/testing/platform-coverage.feature diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-003-package-has-feature-directory-platform-fsm.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-003-package-has-feature-directory-platform-fsm.sdp.md new file mode 100644 index 00000000..c0a66f1c --- /dev/null +++ b/specs/behavior/platform-core/testing/platform-coverage.examples/s-003-package-has-feature-directory-platform-fsm.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.platform-coverage.package-has-feature-directory-platform-fsm +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.platform-coverage +--- +# Package has feature directory - platform-fsm + +## Intent + +- outcome: Executable scenario "Package has feature directory - platform-fsm" from packages/platform-core/tests/features/behavior/testing/platform-coverage.feature diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-004-package-has-feature-directory-platform-store.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-004-package-has-feature-directory-platform-store.sdp.md new file mode 100644 index 00000000..bfeeeab8 --- /dev/null +++ b/specs/behavior/platform-core/testing/platform-coverage.examples/s-004-package-has-feature-directory-platform-store.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.platform-coverage.package-has-feature-directory-platform-store +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.platform-coverage +--- +# Package has feature directory - platform-store + +## Intent + +- outcome: Executable scenario "Package has feature directory - platform-store" from packages/platform-core/tests/features/behavior/testing/platform-coverage.feature diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-005-package-has-feature-directory-platform-bus.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-005-package-has-feature-directory-platform-bus.sdp.md new file mode 100644 index 00000000..e19a05cd --- /dev/null +++ b/specs/behavior/platform-core/testing/platform-coverage.examples/s-005-package-has-feature-directory-platform-bus.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.platform-coverage.package-has-feature-directory-platform-bus +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.platform-coverage +--- +# Package has feature directory - platform-bus + +## Intent + +- outcome: Executable scenario "Package has feature directory - platform-bus" from packages/platform-core/tests/features/behavior/testing/platform-coverage.feature diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-006-package-has-feature-directory-platform-bc.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-006-package-has-feature-directory-platform-bc.sdp.md new file mode 100644 index 00000000..bb219141 --- /dev/null +++ b/specs/behavior/platform-core/testing/platform-coverage.examples/s-006-package-has-feature-directory-platform-bc.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.platform-coverage.package-has-feature-directory-platform-bc +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.platform-coverage +--- +# Package has feature directory - platform-bc + +## Intent + +- outcome: Executable scenario "Package has feature directory - platform-bc" from packages/platform-core/tests/features/behavior/testing/platform-coverage.feature diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-007-exported-function-has-feature-coverage.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-007-exported-function-has-feature-coverage.sdp.md new file mode 100644 index 00000000..3af0fad9 --- /dev/null +++ b/specs/behavior/platform-core/testing/platform-coverage.examples/s-007-exported-function-has-feature-coverage.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.platform-coverage.exported-function-has-feature-coverage +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.platform-coverage +--- +# Exported function has feature coverage + +## Intent + +- outcome: Executable scenario "Exported function has feature coverage" from packages/platform-core/tests/features/behavior/testing/platform-coverage.feature diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-008-missing-coverage-is-detected.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-008-missing-coverage-is-detected.sdp.md new file mode 100644 index 00000000..9fd88a65 --- /dev/null +++ b/specs/behavior/platform-core/testing/platform-coverage.examples/s-008-missing-coverage-is-detected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.platform-coverage.missing-coverage-is-detected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.platform-coverage +--- +# Missing coverage is detected + +## Intent + +- outcome: Executable scenario "Missing coverage is detected" from packages/platform-core/tests/features/behavior/testing/platform-coverage.feature diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-009-step-definitions-follow-naming-convention.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-009-step-definitions-follow-naming-convention.sdp.md new file mode 100644 index 00000000..4d61a215 --- /dev/null +++ b/specs/behavior/platform-core/testing/platform-coverage.examples/s-009-step-definitions-follow-naming-convention.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.platform-coverage.step-definitions-follow-naming-convention +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.platform-coverage +--- +# Step definitions follow naming convention + +## Intent + +- outcome: Executable scenario "Step definitions follow naming convention" from packages/platform-core/tests/features/behavior/testing/platform-coverage.feature diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-010-step-file-matches-feature-file.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-010-step-file-matches-feature-file.sdp.md new file mode 100644 index 00000000..e38f67fe --- /dev/null +++ b/specs/behavior/platform-core/testing/platform-coverage.examples/s-010-step-file-matches-feature-file.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.platform-coverage.step-file-matches-feature-file +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.platform-coverage +--- +# Step file matches feature file + +## Intent + +- outcome: Executable scenario "Step file matches feature file" from packages/platform-core/tests/features/behavior/testing/platform-coverage.feature diff --git a/specs/behavior/platform-core/testing/polling.examples/s-001-sleep-for-specified-duration.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-001-sleep-for-specified-duration.sdp.md new file mode 100644 index 00000000..348ed361 --- /dev/null +++ b/specs/behavior/platform-core/testing/polling.examples/s-001-sleep-for-specified-duration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.polling.sleep-for-specified-duration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.polling +--- +# Sleep for specified duration + +## Intent + +- outcome: Executable scenario "Sleep for specified duration" from packages/platform-core/tests/features/behavior/testing/polling.feature diff --git a/specs/behavior/platform-core/testing/polling.examples/s-002-sleep-returns-a-promise.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-002-sleep-returns-a-promise.sdp.md new file mode 100644 index 00000000..b79f785e --- /dev/null +++ b/specs/behavior/platform-core/testing/polling.examples/s-002-sleep-returns-a-promise.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.polling.sleep-returns-a-promise +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.polling +--- +# Sleep returns a promise + +## Intent + +- outcome: Executable scenario "Sleep returns a promise" from packages/platform-core/tests/features/behavior/testing/polling.feature diff --git a/specs/behavior/platform-core/testing/polling.examples/s-003-wait-until-returns-truthy-result-immediately.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-003-wait-until-returns-truthy-result-immediately.sdp.md new file mode 100644 index 00000000..865f2dcc --- /dev/null +++ b/specs/behavior/platform-core/testing/polling.examples/s-003-wait-until-returns-truthy-result-immediately.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.polling.wait-until-returns-truthy-result-immediately +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.polling +--- +# waitUntil returns truthy result immediately + +## Intent + +- outcome: Executable scenario "waitUntil returns truthy result immediately" from packages/platform-core/tests/features/behavior/testing/polling.feature diff --git a/specs/behavior/platform-core/testing/polling.examples/s-004-wait-until-polls-until-condition-is-met.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-004-wait-until-polls-until-condition-is-met.sdp.md new file mode 100644 index 00000000..8bfb2b11 --- /dev/null +++ b/specs/behavior/platform-core/testing/polling.examples/s-004-wait-until-polls-until-condition-is-met.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.polling.wait-until-polls-until-condition-is-met +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.polling +--- +# waitUntil polls until condition is met + +## Intent + +- outcome: Executable scenario "waitUntil polls until condition is met" from packages/platform-core/tests/features/behavior/testing/polling.feature diff --git a/specs/behavior/platform-core/testing/polling.examples/s-005-wait-until-throws-on-timeout.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-005-wait-until-throws-on-timeout.sdp.md new file mode 100644 index 00000000..a0c17513 --- /dev/null +++ b/specs/behavior/platform-core/testing/polling.examples/s-005-wait-until-throws-on-timeout.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.polling.wait-until-throws-on-timeout +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.polling +--- +# waitUntil throws on timeout + +## Intent + +- outcome: Executable scenario "waitUntil throws on timeout" from packages/platform-core/tests/features/behavior/testing/polling.feature diff --git a/specs/behavior/platform-core/testing/polling.examples/s-006-wait-until-uses-custom-timeout-message.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-006-wait-until-uses-custom-timeout-message.sdp.md new file mode 100644 index 00000000..e1804f85 --- /dev/null +++ b/specs/behavior/platform-core/testing/polling.examples/s-006-wait-until-uses-custom-timeout-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.polling.wait-until-uses-custom-timeout-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.polling +--- +# waitUntil uses custom timeout message + +## Intent + +- outcome: Executable scenario "waitUntil uses custom timeout message" from packages/platform-core/tests/features/behavior/testing/polling.feature diff --git a/specs/behavior/platform-core/testing/polling.examples/s-007-wait-until-respects-poll-interval-ms.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-007-wait-until-respects-poll-interval-ms.sdp.md new file mode 100644 index 00000000..fb565fdd --- /dev/null +++ b/specs/behavior/platform-core/testing/polling.examples/s-007-wait-until-respects-poll-interval-ms.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.polling.wait-until-respects-poll-interval-ms +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.polling +--- +# waitUntil respects pollIntervalMs + +## Intent + +- outcome: Executable scenario "waitUntil respects pollIntervalMs" from packages/platform-core/tests/features/behavior/testing/polling.feature diff --git a/specs/behavior/platform-core/testing/polling.examples/s-008-wait-for-resolves-when-predicate-returns-true.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-008-wait-for-resolves-when-predicate-returns-true.sdp.md new file mode 100644 index 00000000..e905e348 --- /dev/null +++ b/specs/behavior/platform-core/testing/polling.examples/s-008-wait-for-resolves-when-predicate-returns-true.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.polling.wait-for-resolves-when-predicate-returns-true +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.polling +--- +# waitFor resolves when predicate returns true + +## Intent + +- outcome: Executable scenario "waitFor resolves when predicate returns true" from packages/platform-core/tests/features/behavior/testing/polling.feature diff --git a/specs/behavior/platform-core/testing/polling.examples/s-009-wait-for-throws-on-timeout.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-009-wait-for-throws-on-timeout.sdp.md new file mode 100644 index 00000000..546bbea6 --- /dev/null +++ b/specs/behavior/platform-core/testing/polling.examples/s-009-wait-for-throws-on-timeout.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.polling.wait-for-throws-on-timeout +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.polling +--- +# waitFor throws on timeout + +## Intent + +- outcome: Executable scenario "waitFor throws on timeout" from packages/platform-core/tests/features/behavior/testing/polling.feature diff --git a/specs/behavior/platform-core/testing/polling.examples/s-010-default-timeout-is-30-seconds.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-010-default-timeout-is-30-seconds.sdp.md new file mode 100644 index 00000000..f0e7754f --- /dev/null +++ b/specs/behavior/platform-core/testing/polling.examples/s-010-default-timeout-is-30-seconds.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.polling.default-timeout-is-30-seconds +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.polling +--- +# Default timeout is 30 seconds + +## Intent + +- outcome: Executable scenario "Default timeout is 30 seconds" from packages/platform-core/tests/features/behavior/testing/polling.feature diff --git a/specs/behavior/platform-core/testing/polling.examples/s-011-default-poll-interval-is-100ms.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-011-default-poll-interval-is-100ms.sdp.md new file mode 100644 index 00000000..c5088713 --- /dev/null +++ b/specs/behavior/platform-core/testing/polling.examples/s-011-default-poll-interval-is-100ms.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.polling.default-poll-interval-is-100ms +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.polling +--- +# Default poll interval is 100ms + +## Intent + +- outcome: Executable scenario "Default poll interval is 100ms" from packages/platform-core/tests/features/behavior/testing/polling.feature diff --git a/specs/behavior/platform-core/testing/world.examples/s-001-create-base-unit-test-world.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-001-create-base-unit-test-world.sdp.md new file mode 100644 index 00000000..9d2b3b6d --- /dev/null +++ b/specs/behavior/platform-core/testing/world.examples/s-001-create-base-unit-test-world.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.world.create-base-unit-test-world +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.world +--- +# Create base unit test world + +## Intent + +- outcome: Executable scenario "Create base unit test world" from packages/platform-core/tests/features/behavior/testing/world.feature diff --git a/specs/behavior/platform-core/testing/world.examples/s-002-unit-test-world-supports-scenario-context.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-002-unit-test-world-supports-scenario-context.sdp.md new file mode 100644 index 00000000..ac2dac37 --- /dev/null +++ b/specs/behavior/platform-core/testing/world.examples/s-002-unit-test-world-supports-scenario-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.world.unit-test-world-supports-scenario-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.world +--- +# Unit test world supports scenario context + +## Intent + +- outcome: Executable scenario "Unit test world supports scenario context" from packages/platform-core/tests/features/behavior/testing/world.feature diff --git a/specs/behavior/platform-core/testing/world.examples/s-003-unit-test-world-tracks-last-result.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-003-unit-test-world-tracks-last-result.sdp.md new file mode 100644 index 00000000..cbd13e5a --- /dev/null +++ b/specs/behavior/platform-core/testing/world.examples/s-003-unit-test-world-tracks-last-result.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.world.unit-test-world-tracks-last-result +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.world +--- +# Unit test world tracks last result + +## Intent + +- outcome: Executable scenario "Unit test world tracks last result" from packages/platform-core/tests/features/behavior/testing/world.feature diff --git a/specs/behavior/platform-core/testing/world.examples/s-004-unit-test-world-tracks-last-error.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-004-unit-test-world-tracks-last-error.sdp.md new file mode 100644 index 00000000..0e6c1913 --- /dev/null +++ b/specs/behavior/platform-core/testing/world.examples/s-004-unit-test-world-tracks-last-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.world.unit-test-world-tracks-last-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.world +--- +# Unit test world tracks last error + +## Intent + +- outcome: Executable scenario "Unit test world tracks last error" from packages/platform-core/tests/features/behavior/testing/world.feature diff --git a/specs/behavior/platform-core/testing/world.examples/s-005-create-base-integration-test-world.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-005-create-base-integration-test-world.sdp.md new file mode 100644 index 00000000..983a2797 --- /dev/null +++ b/specs/behavior/platform-core/testing/world.examples/s-005-create-base-integration-test-world.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.world.create-base-integration-test-world +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.world +--- +# Create base integration test world + +## Intent + +- outcome: Executable scenario "Create base integration test world" from packages/platform-core/tests/features/behavior/testing/world.feature diff --git a/specs/behavior/platform-core/testing/world.examples/s-006-integration-test-world-uses-custom-backend-url.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-006-integration-test-world-uses-custom-backend-url.sdp.md new file mode 100644 index 00000000..951adbd7 --- /dev/null +++ b/specs/behavior/platform-core/testing/world.examples/s-006-integration-test-world-uses-custom-backend-url.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.world.integration-test-world-uses-custom-backend-url +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.world +--- +# Integration test world uses custom backend URL + +## Intent + +- outcome: Executable scenario "Integration test world uses custom backend URL" from packages/platform-core/tests/features/behavior/testing/world.feature diff --git a/specs/behavior/platform-core/testing/world.examples/s-007-integration-test-world-defaults-to-localhost.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-007-integration-test-world-defaults-to-localhost.sdp.md new file mode 100644 index 00000000..67d2f3bb --- /dev/null +++ b/specs/behavior/platform-core/testing/world.examples/s-007-integration-test-world-defaults-to-localhost.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.world.integration-test-world-defaults-to-localhost +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.world +--- +# Integration test world defaults to localhost + +## Intent + +- outcome: Executable scenario "Integration test world defaults to localhost" from packages/platform-core/tests/features/behavior/testing/world.feature diff --git a/specs/behavior/platform-core/testing/world.examples/s-008-reset-world-state-clears-all-fields.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-008-reset-world-state-clears-all-fields.sdp.md new file mode 100644 index 00000000..ee3760d6 --- /dev/null +++ b/specs/behavior/platform-core/testing/world.examples/s-008-reset-world-state-clears-all-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.world.reset-world-state-clears-all-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.world +--- +# Reset world state clears all fields + +## Intent + +- outcome: Executable scenario "Reset world state clears all fields" from packages/platform-core/tests/features/behavior/testing/world.feature diff --git a/specs/behavior/platform-core/testing/world.examples/s-009-reset-preserves-test-backend-reference.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-009-reset-preserves-test-backend-reference.sdp.md new file mode 100644 index 00000000..12788f32 --- /dev/null +++ b/specs/behavior/platform-core/testing/world.examples/s-009-reset-preserves-test-backend-reference.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.testing.world.reset-preserves-test-backend-reference +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.testing.world +--- +# Reset preserves test backend reference + +## Intent + +- outcome: Executable scenario "Reset preserves test backend reference" from packages/platform-core/tests/features/behavior/testing/world.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-001-single-entity-projections-recommend-entity-strategy.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-001-single-entity-projections-recommend-entity-strategy.sdp.md new file mode 100644 index 00000000..0cf085a4 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-001-single-entity-projections-recommend-entity-strategy.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.single-entity-projections-recommend-entity-strategy +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier +--- +# Single entity projections recommend entity strategy + +## Intent + +- outcome: Executable scenario "Single entity projections recommend entity strategy" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-002-single-entity-projections-return-simple-complexity.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-002-single-entity-projections-return-simple-complexity.sdp.md new file mode 100644 index 00000000..971a1c8f --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-002-single-entity-projections-return-simple-complexity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.single-entity-projections-return-simple-complexity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier +--- +# Single entity projections return simple complexity + +## Intent + +- outcome: Executable scenario "Single entity projections return simple complexity" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-003-single-entity-projections-include-rationale-about-stream-id.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-003-single-entity-projections-include-rationale-about-stream-id.sdp.md new file mode 100644 index 00000000..b3da6d4f --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-003-single-entity-projections-include-rationale-about-stream-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.single-entity-projections-include-rationale-about-stream-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier +--- +# Single entity projections include rationale about streamId + +## Intent + +- outcome: Executable scenario "Single entity projections include rationale about streamId" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-004-classification-defaults-to-entity-when-all-flags-are-false.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-004-classification-defaults-to-entity-when-all-flags-are-false.sdp.md new file mode 100644 index 00000000..e3754a5d --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-004-classification-defaults-to-entity-when-all-flags-are-false.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.classification-defaults-to-entity-when-all-flags-are-false +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier +--- +# Classification defaults to entity when all flags are false + +## Intent + +- outcome: Executable scenario "Classification defaults to entity when all flags are false" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-005-global-rollup-projections-recommend-global-strategy.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-005-global-rollup-projections-recommend-global-strategy.sdp.md new file mode 100644 index 00000000..72330f2f --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-005-global-rollup-projections-recommend-global-strategy.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.global-rollup-projections-recommend-global-strategy +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier +--- +# Global rollup projections recommend global strategy + +## Intent + +- outcome: Executable scenario "Global rollup projections recommend global strategy" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-006-global-rollup-projections-return-complex-complexity.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-006-global-rollup-projections-return-complex-complexity.sdp.md new file mode 100644 index 00000000..9c90218b --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-006-global-rollup-projections-return-complex-complexity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.global-rollup-projections-return-complex-complexity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier +--- +# Global rollup projections return complex complexity + +## Intent + +- outcome: Executable scenario "Global rollup projections return complex complexity" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-007-global-rollup-projections-include-rationale-about-occ-conflicts.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-007-global-rollup-projections-include-rationale-about-occ-conflicts.sdp.md new file mode 100644 index 00000000..5165aa37 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-007-global-rollup-projections-include-rationale-about-occ-conflicts.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.global-rollup-projections-include-rationale-about-occ-conflicts +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier +--- +# Global rollup projections include rationale about OCC conflicts + +## Intent + +- outcome: Executable scenario "Global rollup projections include rationale about OCC conflicts" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-008-global-strategy-prioritizes-over-other-flags.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-008-global-strategy-prioritizes-over-other-flags.sdp.md new file mode 100644 index 00000000..636f2824 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-008-global-strategy-prioritizes-over-other-flags.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.global-strategy-prioritizes-over-other-flags +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier +--- +# Global strategy prioritizes over other flags + +## Intent + +- outcome: Executable scenario "Global strategy prioritizes over other flags" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-009-cross-context-projections-recommend-saga-strategy.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-009-cross-context-projections-recommend-saga-strategy.sdp.md new file mode 100644 index 00000000..6a34a844 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-009-cross-context-projections-recommend-saga-strategy.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.cross-context-projections-recommend-saga-strategy +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier +--- +# Cross-context projections recommend saga strategy + +## Intent + +- outcome: Executable scenario "Cross-context projections recommend saga strategy" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-010-cross-context-projections-return-complex-complexity.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-010-cross-context-projections-return-complex-complexity.sdp.md new file mode 100644 index 00000000..2c20b323 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-010-cross-context-projections-return-complex-complexity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.cross-context-projections-return-complex-complexity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier +--- +# Cross-context projections return complex complexity + +## Intent + +- outcome: Executable scenario "Cross-context projections return complex complexity" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-011-cross-context-projections-include-rationale-about-correlation-id.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-011-cross-context-projections-include-rationale-about-correlation-id.sdp.md new file mode 100644 index 00000000..7a60fb70 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-011-cross-context-projections-include-rationale-about-correlation-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.cross-context-projections-include-rationale-about-correlation-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier +--- +# Cross-context projections include rationale about correlationId + +## Intent + +- outcome: Executable scenario "Cross-context projections include rationale about correlationId" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-012-saga-strategy-prioritizes-over-customer-and-entity.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-012-saga-strategy-prioritizes-over-customer-and-entity.sdp.md new file mode 100644 index 00000000..6a4aa2cb --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-012-saga-strategy-prioritizes-over-customer-and-entity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.saga-strategy-prioritizes-over-customer-and-entity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier +--- +# Saga strategy prioritizes over customer and entity + +## Intent + +- outcome: Executable scenario "Saga strategy prioritizes over customer and entity" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-013-customer-scoped-projections-recommend-customer-strategy.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-013-customer-scoped-projections-recommend-customer-strategy.sdp.md new file mode 100644 index 00000000..64d626dc --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-013-customer-scoped-projections-recommend-customer-strategy.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.customer-scoped-projections-recommend-customer-strategy +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier +--- +# Customer-scoped projections recommend customer strategy + +## Intent + +- outcome: Executable scenario "Customer-scoped projections recommend customer strategy" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-014-customer-scoped-projections-return-moderate-complexity.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-014-customer-scoped-projections-return-moderate-complexity.sdp.md new file mode 100644 index 00000000..87b6252b --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-014-customer-scoped-projections-return-moderate-complexity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.customer-scoped-projections-return-moderate-complexity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier +--- +# Customer-scoped projections return moderate complexity + +## Intent + +- outcome: Executable scenario "Customer-scoped projections return moderate complexity" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-015-customer-scoped-projections-include-rationale-about-customer-id.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-015-customer-scoped-projections-include-rationale-about-customer-id.sdp.md new file mode 100644 index 00000000..5a678497 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-015-customer-scoped-projections-include-rationale-about-customer-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.customer-scoped-projections-include-rationale-about-customer-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier +--- +# Customer-scoped projections include rationale about customerId + +## Intent + +- outcome: Executable scenario "Customer-scoped projections include rationale about customerId" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-016-customer-strategy-prioritizes-over-entity.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-016-customer-strategy-prioritizes-over-entity.sdp.md new file mode 100644 index 00000000..143efe5f --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-016-customer-strategy-prioritizes-over-entity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.customer-strategy-prioritizes-over-entity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier +--- +# Customer strategy prioritizes over entity + +## Intent + +- outcome: Executable scenario "Customer strategy prioritizes over entity" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-017-decision-tree-follows-priority-global-saga-customer-entity.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-017-decision-tree-follows-priority-global-saga-customer-entity.sdp.md new file mode 100644 index 00000000..eb04a9a3 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-017-decision-tree-follows-priority-global-saga-customer-entity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.decision-tree-follows-priority-global-saga-customer-entity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier +--- +# Decision tree follows priority global > saga > customer > entity + +## Intent + +- outcome: Executable scenario "Decision tree follows priority global > saga > customer > entity" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-018-strategy-parallelism-values.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-018-strategy-parallelism-values.sdp.md new file mode 100644 index 00000000..f4a35145 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-018-strategy-parallelism-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.strategy-parallelism-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier +--- +# Strategy parallelism values + +## Intent + +- outcome: Executable scenario "Strategy parallelism values" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-019-get-recommended-parallelism-by-strategy.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-019-get-recommended-parallelism-by-strategy.sdp.md new file mode 100644 index 00000000..52ef0500 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-019-get-recommended-parallelism-by-strategy.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.get-recommended-parallelism-by-strategy +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier +--- +# Get recommended parallelism by strategy + +## Intent + +- outcome: Executable scenario "Get recommended parallelism by strategy" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-001-global-partition-key-has-name-global.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-001-global-partition-key-has-name-global.sdp.md new file mode 100644 index 00000000..b2197385 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-001-global-partition-key-has-name-global.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.global-partition-key-has-name-global +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# GLOBAL_PARTITION_KEY has name 'global' + +## Intent + +- outcome: Executable scenario "GLOBAL_PARTITION_KEY has name 'global'" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-002-global-partition-key-has-value-global.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-002-global-partition-key-has-value-global.sdp.md new file mode 100644 index 00000000..10703d3c --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-002-global-partition-key-has-value-global.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.global-partition-key-has-value-global +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# GLOBAL_PARTITION_KEY has value 'global' + +## Intent + +- outcome: Executable scenario "GLOBAL_PARTITION_KEY has value 'global'" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-003-entity-partition-key-uses-stream-type-stream-id-format.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-003-entity-partition-key-uses-stream-type-stream-id-format.sdp.md new file mode 100644 index 00000000..5a8126a0 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-003-entity-partition-key-uses-stream-type-stream-id-format.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.entity-partition-key-uses-stream-type-stream-id-format +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# Entity partition key uses streamType:streamId format + +## Intent + +- outcome: Executable scenario "Entity partition key uses streamType:streamId format" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-004-entity-partition-key-prioritizes-stream-id-over-other-id-fields.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-004-entity-partition-key-prioritizes-stream-id-over-other-id-fields.sdp.md new file mode 100644 index 00000000..1153c43c --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-004-entity-partition-key-prioritizes-stream-id-over-other-id-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.entity-partition-key-prioritizes-stream-id-over-other-id-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# Entity partition key prioritizes streamId over other ID fields + +## Intent + +- outcome: Executable scenario "Entity partition key prioritizes streamId over other ID fields" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-005-entity-partition-key-falls-back-to-alternate-id-fields.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-005-entity-partition-key-falls-back-to-alternate-id-fields.sdp.md new file mode 100644 index 00000000..a2a4dbcc --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-005-entity-partition-key-falls-back-to-alternate-id-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.entity-partition-key-falls-back-to-alternate-id-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# Entity partition key falls back to alternate ID fields + +## Intent + +- outcome: Executable scenario "Entity partition key falls back to alternate ID fields" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-006-entity-partition-key-throws-when-no-id-field-provided.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-006-entity-partition-key-throws-when-no-id-field-provided.sdp.md new file mode 100644 index 00000000..efd80c46 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-006-entity-partition-key-throws-when-no-id-field-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.entity-partition-key-throws-when-no-id-field-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# Entity partition key throws when no ID field provided + +## Intent + +- outcome: Executable scenario "Entity partition key throws when no ID field provided" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-007-entity-partition-key-includes-available-keys-in-error-message.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-007-entity-partition-key-includes-available-keys-in-error-message.sdp.md new file mode 100644 index 00000000..7e3bca9d --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-007-entity-partition-key-includes-available-keys-in-error-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.entity-partition-key-includes-available-keys-in-error-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# Entity partition key includes available keys in error message + +## Intent + +- outcome: Executable scenario "Entity partition key includes available keys in error message" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-008-entity-partition-key-uses-provided-stream-type-in-value.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-008-entity-partition-key-uses-provided-stream-type-in-value.sdp.md new file mode 100644 index 00000000..753255b2 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-008-entity-partition-key-uses-provided-stream-type-in-value.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.entity-partition-key-uses-provided-stream-type-in-value +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# Entity partition key uses provided streamType in value + +## Intent + +- outcome: Executable scenario "Entity partition key uses provided streamType in value" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-009-customer-partition-key-returns-customer-id.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-009-customer-partition-key-returns-customer-id.sdp.md new file mode 100644 index 00000000..16b29939 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-009-customer-partition-key-returns-customer-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.customer-partition-key-returns-customer-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# Customer partition key returns customerId + +## Intent + +- outcome: Executable scenario "Customer partition key returns customerId" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-010-customer-partition-key-ignores-additional-fields.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-010-customer-partition-key-ignores-additional-fields.sdp.md new file mode 100644 index 00000000..2b0e3aed --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-010-customer-partition-key-ignores-additional-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.customer-partition-key-ignores-additional-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# Customer partition key ignores additional fields + +## Intent + +- outcome: Executable scenario "Customer partition key ignores additional fields" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-011-customer-partition-key-throws-when-customer-id-is-undefined.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-011-customer-partition-key-throws-when-customer-id-is-undefined.sdp.md new file mode 100644 index 00000000..b2bc68a5 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-011-customer-partition-key-throws-when-customer-id-is-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.customer-partition-key-throws-when-customer-id-is-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# Customer partition key throws when customerId is undefined + +## Intent + +- outcome: Executable scenario "Customer partition key throws when customerId is undefined" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-012-customer-partition-key-throws-when-customer-id-is-missing.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-012-customer-partition-key-throws-when-customer-id-is-missing.sdp.md new file mode 100644 index 00000000..aa8b0631 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-012-customer-partition-key-throws-when-customer-id-is-missing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.customer-partition-key-throws-when-customer-id-is-missing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# Customer partition key throws when customerId is missing + +## Intent + +- outcome: Executable scenario "Customer partition key throws when customerId is missing" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-013-customer-partition-key-throws-when-customer-id-is-empty-string.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-013-customer-partition-key-throws-when-customer-id-is-empty-string.sdp.md new file mode 100644 index 00000000..77e67e3b --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-013-customer-partition-key-throws-when-customer-id-is-empty-string.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.customer-partition-key-throws-when-customer-id-is-empty-string +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# Customer partition key throws when customerId is empty string + +## Intent + +- outcome: Executable scenario "Customer partition key throws when customerId is empty string" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-014-saga-partition-key-returns-correlation-id.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-014-saga-partition-key-returns-correlation-id.sdp.md new file mode 100644 index 00000000..6096f8d4 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-014-saga-partition-key-returns-correlation-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.saga-partition-key-returns-correlation-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# Saga partition key returns correlationId + +## Intent + +- outcome: Executable scenario "Saga partition key returns correlationId" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-015-saga-partition-key-ignores-additional-fields.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-015-saga-partition-key-ignores-additional-fields.sdp.md new file mode 100644 index 00000000..03de4ca1 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-015-saga-partition-key-ignores-additional-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.saga-partition-key-ignores-additional-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# Saga partition key ignores additional fields + +## Intent + +- outcome: Executable scenario "Saga partition key ignores additional fields" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-016-saga-partition-key-throws-when-correlation-id-is-undefined.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-016-saga-partition-key-throws-when-correlation-id-is-undefined.sdp.md new file mode 100644 index 00000000..79dfcb0d --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-016-saga-partition-key-throws-when-correlation-id-is-undefined.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.saga-partition-key-throws-when-correlation-id-is-undefined +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# Saga partition key throws when correlationId is undefined + +## Intent + +- outcome: Executable scenario "Saga partition key throws when correlationId is undefined" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-017-saga-partition-key-throws-when-correlation-id-is-missing.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-017-saga-partition-key-throws-when-correlation-id-is-missing.sdp.md new file mode 100644 index 00000000..68cd89e3 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-017-saga-partition-key-throws-when-correlation-id-is-missing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.saga-partition-key-throws-when-correlation-id-is-missing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# Saga partition key throws when correlationId is missing + +## Intent + +- outcome: Executable scenario "Saga partition key throws when correlationId is missing" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-018-saga-partition-key-throws-when-correlation-id-is-empty-string.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-018-saga-partition-key-throws-when-correlation-id-is-empty-string.sdp.md new file mode 100644 index 00000000..0554c733 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-018-saga-partition-key-throws-when-correlation-id-is-empty-string.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.saga-partition-key-throws-when-correlation-id-is-empty-string +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# Saga partition key throws when correlationId is empty string + +## Intent + +- outcome: Executable scenario "Saga partition key throws when correlationId is empty string" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-019-global-partition-key-returns-global-partition-key.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-019-global-partition-key-returns-global-partition-key.sdp.md new file mode 100644 index 00000000..6c377ab8 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-019-global-partition-key-returns-global-partition-key.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.global-partition-key-returns-global-partition-key +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# Global partition key returns GLOBAL_PARTITION_KEY + +## Intent + +- outcome: Executable scenario "Global partition key returns GLOBAL_PARTITION_KEY" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-020-global-partition-key-ignores-any-arguments.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-020-global-partition-key-ignores-any-arguments.sdp.md new file mode 100644 index 00000000..ff2b86f8 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-020-global-partition-key-ignores-any-arguments.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.global-partition-key-ignores-any-arguments +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# Global partition key ignores any arguments + +## Intent + +- outcome: Executable scenario "Global partition key ignores any arguments" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-021-global-partition-key-returns-same-reference-on-multiple-calls.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-021-global-partition-key-returns-same-reference-on-multiple-calls.sdp.md new file mode 100644 index 00000000..4554f15f --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-021-global-partition-key-returns-same-reference-on-multiple-calls.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.global-partition-key-returns-same-reference-on-multiple-calls +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# Global partition key returns same reference on multiple calls + +## Intent + +- outcome: Executable scenario "Global partition key returns same reference on multiple calls" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-022-dcb-partition-key-has-name-dcb.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-022-dcb-partition-key-has-name-dcb.sdp.md new file mode 100644 index 00000000..b0106fa3 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-022-dcb-partition-key-has-name-dcb.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.dcb-partition-key-has-name-dcb +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# DCB partition key has name 'dcb' + +## Intent + +- outcome: Executable scenario "DCB partition key has name 'dcb'" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-023-dcb-partition-key-uses-scope-key-as-value.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-023-dcb-partition-key-uses-scope-key-as-value.sdp.md new file mode 100644 index 00000000..ad65b328 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-023-dcb-partition-key-uses-scope-key-as-value.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.dcb-partition-key-uses-scope-key-as-value +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# DCB partition key uses scope key as value + +## Intent + +- outcome: Executable scenario "DCB partition key uses scope key as value" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-024-dcb-partition-key-handles-various-scope-key-formats.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-024-dcb-partition-key-handles-various-scope-key-formats.sdp.md new file mode 100644 index 00000000..029fb775 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-024-dcb-partition-key-handles-various-scope-key-formats.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.dcb-partition-key-handles-various-scope-key-formats +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers +--- +# DCB partition key handles various scope key formats + +## Intent + +- outcome: Executable scenario "DCB partition key handles various scope key formats" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-001-valid-result-for-config-with-get-partition-key.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-001-valid-result-for-config-with-get-partition-key.sdp.md new file mode 100644 index 00000000..4d5fa551 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-001-valid-result-for-config-with-get-partition-key.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.valid-result-for-config-with-get-partition-key +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Valid result for config with getPartitionKey + +## Intent + +- outcome: Executable scenario "Valid result for config with getPartitionKey" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-002-valid-result-for-inline-partition-key-function.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-002-valid-result-for-inline-partition-key-function.sdp.md new file mode 100644 index 00000000..ea96c160 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-002-valid-result-for-inline-partition-key-function.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.valid-result-for-inline-partition-key-function +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Valid result for inline partition key function + +## Intent + +- outcome: Executable scenario "Valid result for inline partition key function" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-003-validates-secondary-projections-with-get-partition-key.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-003-validates-secondary-projections-with-get-partition-key.sdp.md new file mode 100644 index 00000000..4e44283e --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-003-validates-secondary-projections-with-get-partition-key.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.validates-secondary-projections-with-get-partition-key +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Validates secondary projections with getPartitionKey + +## Intent + +- outcome: Executable scenario "Validates secondary projections with getPartitionKey" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-004-validates-failed-projection-with-get-partition-key.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-004-validates-failed-projection-with-get-partition-key.sdp.md new file mode 100644 index 00000000..2ab5bdcd --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-004-validates-failed-projection-with-get-partition-key.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.validates-failed-projection-with-get-partition-key +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Validates failed projection with getPartitionKey + +## Intent + +- outcome: Executable scenario "Validates failed projection with getPartitionKey" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-005-returns-missing-partition-key-error-for-missing-get-partition-key.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-005-returns-missing-partition-key-error-for-missing-get-partition-key.sdp.md new file mode 100644 index 00000000..1f3c99bb --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-005-returns-missing-partition-key-error-for-missing-get-partition-key.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.returns-missing-partition-key-error-for-missing-get-partition-key +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Returns MISSING_PARTITION_KEY error for missing getPartitionKey + +## Intent + +- outcome: Executable scenario "Returns MISSING_PARTITION_KEY error for missing getPartitionKey" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-006-includes-projection-name-in-error.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-006-includes-projection-name-in-error.sdp.md new file mode 100644 index 00000000..41ece9c2 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-006-includes-projection-name-in-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.includes-projection-name-in-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Includes projection name in error + +## Intent + +- outcome: Executable scenario "Includes projection name in error" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-007-includes-config-path-in-error.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-007-includes-config-path-in-error.sdp.md new file mode 100644 index 00000000..d6c6185c --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-007-includes-config-path-in-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.includes-config-path-in-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Includes config path in error + +## Intent + +- outcome: Executable scenario "Includes config path in error" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-008-suggests-helper-functions-in-error-message.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-008-suggests-helper-functions-in-error-message.sdp.md new file mode 100644 index 00000000..2463269f --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-008-suggests-helper-functions-in-error-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.suggests-helper-functions-in-error-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Suggests helper functions in error message + +## Intent + +- outcome: Executable scenario "Suggests helper functions in error message" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-009-returns-invalid-partition-key-shape-when-returning-null.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-009-returns-invalid-partition-key-shape-when-returning-null.sdp.md new file mode 100644 index 00000000..2d800dc1 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-009-returns-invalid-partition-key-shape-when-returning-null.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.returns-invalid-partition-key-shape-when-returning-null +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Returns INVALID_PARTITION_KEY_SHAPE when returning null + +## Intent + +- outcome: Executable scenario "Returns INVALID_PARTITION_KEY_SHAPE when returning null" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-010-returns-invalid-partition-key-shape-when-returning-wrong-type.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-010-returns-invalid-partition-key-shape-when-returning-wrong-type.sdp.md new file mode 100644 index 00000000..d60c098f --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-010-returns-invalid-partition-key-shape-when-returning-wrong-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.returns-invalid-partition-key-shape-when-returning-wrong-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Returns INVALID_PARTITION_KEY_SHAPE when returning wrong type + +## Intent + +- outcome: Executable scenario "Returns INVALID_PARTITION_KEY_SHAPE when returning wrong type" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-011-returns-invalid-partition-key-shape-when-missing-name.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-011-returns-invalid-partition-key-shape-when-missing-name.sdp.md new file mode 100644 index 00000000..58f13d16 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-011-returns-invalid-partition-key-shape-when-missing-name.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.returns-invalid-partition-key-shape-when-missing-name +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Returns INVALID_PARTITION_KEY_SHAPE when missing name + +## Intent + +- outcome: Executable scenario "Returns INVALID_PARTITION_KEY_SHAPE when missing name" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-012-returns-invalid-partition-key-shape-when-missing-value.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-012-returns-invalid-partition-key-shape-when-missing-value.sdp.md new file mode 100644 index 00000000..2c301bb9 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-012-returns-invalid-partition-key-shape-when-missing-value.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.returns-invalid-partition-key-shape-when-missing-value +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Returns INVALID_PARTITION_KEY_SHAPE when missing value + +## Intent + +- outcome: Executable scenario "Returns INVALID_PARTITION_KEY_SHAPE when missing value" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-013-returns-invalid-partition-key-shape-when-value-is-number.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-013-returns-invalid-partition-key-shape-when-value-is-number.sdp.md new file mode 100644 index 00000000..753b8b19 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-013-returns-invalid-partition-key-shape-when-value-is-number.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.returns-invalid-partition-key-shape-when-value-is-number +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Returns INVALID_PARTITION_KEY_SHAPE when value is number + +## Intent + +- outcome: Executable scenario "Returns INVALID_PARTITION_KEY_SHAPE when value is number" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-014-returns-empty-partition-value-for-empty-string.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-014-returns-empty-partition-value-for-empty-string.sdp.md new file mode 100644 index 00000000..8c7771b6 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-014-returns-empty-partition-value-for-empty-string.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.returns-empty-partition-value-for-empty-string +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Returns EMPTY_PARTITION_VALUE for empty string + +## Intent + +- outcome: Executable scenario "Returns EMPTY_PARTITION_VALUE for empty string" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-015-returns-empty-partition-value-for-whitespace-only-string.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-015-returns-empty-partition-value-for-whitespace-only-string.sdp.md new file mode 100644 index 00000000..19beadcd --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-015-returns-empty-partition-value-for-whitespace-only-string.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.returns-empty-partition-value-for-whitespace-only-string +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Returns EMPTY_PARTITION_VALUE for whitespace-only string + +## Intent + +- outcome: Executable scenario "Returns EMPTY_PARTITION_VALUE for whitespace-only string" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-016-collects-errors-from-all-projections.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-016-collects-errors-from-all-projections.sdp.md new file mode 100644 index 00000000..1d5e0255 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-016-collects-errors-from-all-projections.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.collects-errors-from-all-projections +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Collects errors from all projections + +## Intent + +- outcome: Executable scenario "Collects errors from all projections" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-017-reports-correct-config-paths-for-secondary-projections.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-017-reports-correct-config-paths-for-secondary-projections.sdp.md new file mode 100644 index 00000000..cee64125 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-017-reports-correct-config-paths-for-secondary-projections.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.reports-correct-config-paths-for-secondary-projections +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Reports correct config paths for secondary projections + +## Intent + +- outcome: Executable scenario "Reports correct config paths for secondary projections" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-018-reports-correct-config-path-for-failed-projection.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-018-reports-correct-config-path-for-failed-projection.sdp.md new file mode 100644 index 00000000..f506f923 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-018-reports-correct-config-path-for-failed-projection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.reports-correct-config-path-for-failed-projection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Reports correct config path for failed projection + +## Intent + +- outcome: Executable scenario "Reports correct config path for failed projection" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-019-does-not-throw-for-valid-configs-array.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-019-does-not-throw-for-valid-configs-array.sdp.md new file mode 100644 index 00000000..f9800948 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-019-does-not-throw-for-valid-configs-array.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.does-not-throw-for-valid-configs-array +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Does not throw for valid configs array + +## Intent + +- outcome: Executable scenario "Does not throw for valid configs array" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-020-does-not-throw-for-empty-array.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-020-does-not-throw-for-empty-array.sdp.md new file mode 100644 index 00000000..84d89016 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-020-does-not-throw-for-empty-array.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.does-not-throw-for-empty-array +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Does not throw for empty array + +## Intent + +- outcome: Executable scenario "Does not throw for empty array" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-021-throws-on-first-invalid-config.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-021-throws-on-first-invalid-config.sdp.md new file mode 100644 index 00000000..e2ca5056 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-021-throws-on-first-invalid-config.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.throws-on-first-invalid-config +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Throws on first invalid config + +## Intent + +- outcome: Executable scenario "Throws on first invalid config" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-022-includes-all-errors-in-thrown-message.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-022-includes-all-errors-in-thrown-message.sdp.md new file mode 100644 index 00000000..a0901407 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-022-includes-all-errors-in-thrown-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.includes-all-errors-in-thrown-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Includes all errors in thrown message + +## Intent + +- outcome: Executable scenario "Includes all errors in thrown message" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-023-includes-error-codes-in-thrown-message.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-023-includes-error-codes-in-thrown-message.sdp.md new file mode 100644 index 00000000..6778ed63 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-023-includes-error-codes-in-thrown-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.includes-error-codes-in-thrown-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Includes error codes in thrown message + +## Intent + +- outcome: Executable scenario "Includes error codes in thrown message" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-024-includes-config-path-in-thrown-message.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-024-includes-config-path-in-thrown-message.sdp.md new file mode 100644 index 00000000..7c64fd23 --- /dev/null +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-024-includes-config-path-in-thrown-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-core.workpool-partitioning.partition-validation.includes-config-path-in-thrown-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-core.workpool-partitioning.partition-validation +--- +# Includes config path in thrown message + +## Intent + +- outcome: Executable scenario "Includes config path in thrown message" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-001-success-creates-output-with-correct-status.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-001-success-creates-output-with-correct-status.sdp.md new file mode 100644 index 00000000..a7836f73 --- /dev/null +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-001-success-creates-output-with-correct-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-decider.decider-outputs.success-creates-output-with-correct-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-decider.decider-outputs +--- +# success() creates output with correct status + +## Intent + +- outcome: Executable scenario "success() creates output with correct status" from packages/platform-decider/tests/features/behavior/decider-outputs.feature diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-002-success-includes-all-required-properties.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-002-success-includes-all-required-properties.sdp.md new file mode 100644 index 00000000..949538ae --- /dev/null +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-002-success-includes-all-required-properties.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-decider.decider-outputs.success-includes-all-required-properties +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-decider.decider-outputs +--- +# success() includes all required properties + +## Intent + +- outcome: Executable scenario "success() includes all required properties" from packages/platform-decider/tests/features/behavior/decider-outputs.feature diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-003-rejected-creates-output-with-code-and-message.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-003-rejected-creates-output-with-code-and-message.sdp.md new file mode 100644 index 00000000..9c01f32f --- /dev/null +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-003-rejected-creates-output-with-code-and-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-decider.decider-outputs.rejected-creates-output-with-code-and-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-decider.decider-outputs +--- +# rejected() creates output with code and message + +## Intent + +- outcome: Executable scenario "rejected() creates output with code and message" from packages/platform-decider/tests/features/behavior/decider-outputs.feature diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-004-rejected-includes-context-when-provided.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-004-rejected-includes-context-when-provided.sdp.md new file mode 100644 index 00000000..dead3d6e --- /dev/null +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-004-rejected-includes-context-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-decider.decider-outputs.rejected-includes-context-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-decider.decider-outputs +--- +# rejected() includes context when provided + +## Intent + +- outcome: Executable scenario "rejected() includes context when provided" from packages/platform-decider/tests/features/behavior/decider-outputs.feature diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-005-failed-creates-output-with-reason-and-event.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-005-failed-creates-output-with-reason-and-event.sdp.md new file mode 100644 index 00000000..34ff4c82 --- /dev/null +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-005-failed-creates-output-with-reason-and-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-decider.decider-outputs.failed-creates-output-with-reason-and-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-decider.decider-outputs +--- +# failed() creates output with reason and event + +## Intent + +- outcome: Executable scenario "failed() creates output with reason and event" from packages/platform-decider/tests/features/behavior/decider-outputs.feature diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-006-failed-includes-context-when-provided.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-006-failed-includes-context-when-provided.sdp.md new file mode 100644 index 00000000..c5bbca49 --- /dev/null +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-006-failed-includes-context-when-provided.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-decider.decider-outputs.failed-includes-context-when-provided +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-decider.decider-outputs +--- +# failed() includes context when provided + +## Intent + +- outcome: Executable scenario "failed() includes context when provided" from packages/platform-decider/tests/features/behavior/decider-outputs.feature diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-007-is-success-returns-true-for-success-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-007-is-success-returns-true-for-success-output.sdp.md new file mode 100644 index 00000000..aa2991aa --- /dev/null +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-007-is-success-returns-true-for-success-output.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-decider.decider-outputs.is-success-returns-true-for-success-output +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-decider.decider-outputs +--- +# isSuccess() returns true for success output + +## Intent + +- outcome: Executable scenario "isSuccess() returns true for success output" from packages/platform-decider/tests/features/behavior/decider-outputs.feature diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-008-is-success-returns-false-for-rejected-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-008-is-success-returns-false-for-rejected-output.sdp.md new file mode 100644 index 00000000..9c5681e1 --- /dev/null +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-008-is-success-returns-false-for-rejected-output.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-decider.decider-outputs.is-success-returns-false-for-rejected-output +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-decider.decider-outputs +--- +# isSuccess() returns false for rejected output + +## Intent + +- outcome: Executable scenario "isSuccess() returns false for rejected output" from packages/platform-decider/tests/features/behavior/decider-outputs.feature diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-009-is-success-returns-false-for-failed-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-009-is-success-returns-false-for-failed-output.sdp.md new file mode 100644 index 00000000..ac477ea7 --- /dev/null +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-009-is-success-returns-false-for-failed-output.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-decider.decider-outputs.is-success-returns-false-for-failed-output +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-decider.decider-outputs +--- +# isSuccess() returns false for failed output + +## Intent + +- outcome: Executable scenario "isSuccess() returns false for failed output" from packages/platform-decider/tests/features/behavior/decider-outputs.feature diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-010-is-success-enables-type-narrowing.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-010-is-success-enables-type-narrowing.sdp.md new file mode 100644 index 00000000..6c7b0aa5 --- /dev/null +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-010-is-success-enables-type-narrowing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-decider.decider-outputs.is-success-enables-type-narrowing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-decider.decider-outputs +--- +# isSuccess() enables type narrowing + +## Intent + +- outcome: Executable scenario "isSuccess() enables type narrowing" from packages/platform-decider/tests/features/behavior/decider-outputs.feature diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-011-is-rejected-returns-true-for-rejected-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-011-is-rejected-returns-true-for-rejected-output.sdp.md new file mode 100644 index 00000000..c18ec1f1 --- /dev/null +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-011-is-rejected-returns-true-for-rejected-output.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-decider.decider-outputs.is-rejected-returns-true-for-rejected-output +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-decider.decider-outputs +--- +# isRejected() returns true for rejected output + +## Intent + +- outcome: Executable scenario "isRejected() returns true for rejected output" from packages/platform-decider/tests/features/behavior/decider-outputs.feature diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-012-is-rejected-returns-false-for-success-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-012-is-rejected-returns-false-for-success-output.sdp.md new file mode 100644 index 00000000..a1eed64d --- /dev/null +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-012-is-rejected-returns-false-for-success-output.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-decider.decider-outputs.is-rejected-returns-false-for-success-output +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-decider.decider-outputs +--- +# isRejected() returns false for success output + +## Intent + +- outcome: Executable scenario "isRejected() returns false for success output" from packages/platform-decider/tests/features/behavior/decider-outputs.feature diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-013-is-rejected-returns-false-for-failed-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-013-is-rejected-returns-false-for-failed-output.sdp.md new file mode 100644 index 00000000..f11ead43 --- /dev/null +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-013-is-rejected-returns-false-for-failed-output.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-decider.decider-outputs.is-rejected-returns-false-for-failed-output +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-decider.decider-outputs +--- +# isRejected() returns false for failed output + +## Intent + +- outcome: Executable scenario "isRejected() returns false for failed output" from packages/platform-decider/tests/features/behavior/decider-outputs.feature diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-014-is-rejected-enables-type-narrowing.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-014-is-rejected-enables-type-narrowing.sdp.md new file mode 100644 index 00000000..a13a48da --- /dev/null +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-014-is-rejected-enables-type-narrowing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-decider.decider-outputs.is-rejected-enables-type-narrowing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-decider.decider-outputs +--- +# isRejected() enables type narrowing + +## Intent + +- outcome: Executable scenario "isRejected() enables type narrowing" from packages/platform-decider/tests/features/behavior/decider-outputs.feature diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-015-is-failed-returns-true-for-failed-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-015-is-failed-returns-true-for-failed-output.sdp.md new file mode 100644 index 00000000..53c881a8 --- /dev/null +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-015-is-failed-returns-true-for-failed-output.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-decider.decider-outputs.is-failed-returns-true-for-failed-output +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-decider.decider-outputs +--- +# isFailed() returns true for failed output + +## Intent + +- outcome: Executable scenario "isFailed() returns true for failed output" from packages/platform-decider/tests/features/behavior/decider-outputs.feature diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-016-is-failed-returns-false-for-success-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-016-is-failed-returns-false-for-success-output.sdp.md new file mode 100644 index 00000000..852c951c --- /dev/null +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-016-is-failed-returns-false-for-success-output.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-decider.decider-outputs.is-failed-returns-false-for-success-output +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-decider.decider-outputs +--- +# isFailed() returns false for success output + +## Intent + +- outcome: Executable scenario "isFailed() returns false for success output" from packages/platform-decider/tests/features/behavior/decider-outputs.feature diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-017-is-failed-returns-false-for-rejected-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-017-is-failed-returns-false-for-rejected-output.sdp.md new file mode 100644 index 00000000..42cb445c --- /dev/null +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-017-is-failed-returns-false-for-rejected-output.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-decider.decider-outputs.is-failed-returns-false-for-rejected-output +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-decider.decider-outputs +--- +# isFailed() returns false for rejected output + +## Intent + +- outcome: Executable scenario "isFailed() returns false for rejected output" from packages/platform-decider/tests/features/behavior/decider-outputs.feature diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-018-is-failed-enables-type-narrowing.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-018-is-failed-enables-type-narrowing.sdp.md new file mode 100644 index 00000000..68258071 --- /dev/null +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-018-is-failed-enables-type-narrowing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-decider.decider-outputs.is-failed-enables-type-narrowing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-decider.decider-outputs +--- +# isFailed() enables type narrowing + +## Intent + +- outcome: Executable scenario "isFailed() enables type narrowing" from packages/platform-decider/tests/features/behavior/decider-outputs.feature diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-019-type-guards-are-mutually-exclusive.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-019-type-guards-are-mutually-exclusive.sdp.md new file mode 100644 index 00000000..ff5ea189 --- /dev/null +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-019-type-guards-are-mutually-exclusive.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-decider.decider-outputs.type-guards-are-mutually-exclusive +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-decider.decider-outputs +--- +# Type guards are mutually exclusive + +## Intent + +- outcome: Executable scenario "Type guards are mutually exclusive" from packages/platform-decider/tests/features/behavior/decider-outputs.feature diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md new file mode 100644 index 00000000..796c6205 --- /dev/null +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-fsm.fsm-transitions.fsm-is-created-with-correct-initial-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-fsm.fsm-transitions +--- +# FSM is created with correct initial state + +## Intent + +- outcome: Executable scenario "FSM is created with correct initial state" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-002-valid-transitions-are-allowed.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-002-valid-transitions-are-allowed.sdp.md new file mode 100644 index 00000000..32fe3264 --- /dev/null +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-002-valid-transitions-are-allowed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-fsm.fsm-transitions.valid-transitions-are-allowed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-fsm.fsm-transitions +--- +# Valid transitions are allowed + +## Intent + +- outcome: Executable scenario "Valid transitions are allowed" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-003-assert-transition-does-not-throw-for-valid-transitions.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-003-assert-transition-does-not-throw-for-valid-transitions.sdp.md new file mode 100644 index 00000000..4bf0ae6e --- /dev/null +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-003-assert-transition-does-not-throw-for-valid-transitions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-fsm.fsm-transitions.assert-transition-does-not-throw-for-valid-transitions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-fsm.fsm-transitions +--- +# assertTransition does not throw for valid transitions + +## Intent + +- outcome: Executable scenario "assertTransition does not throw for valid transitions" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-004-invalid-transitions-are-detected.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-004-invalid-transitions-are-detected.sdp.md new file mode 100644 index 00000000..fd1ef669 --- /dev/null +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-004-invalid-transitions-are-detected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-fsm.fsm-transitions.invalid-transitions-are-detected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-fsm.fsm-transitions +--- +# Invalid transitions are detected + +## Intent + +- outcome: Executable scenario "Invalid transitions are detected" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-005-assert-transition-throws-fsm-transition-error-for-invalid-transitions.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-005-assert-transition-throws-fsm-transition-error-for-invalid-transitions.sdp.md new file mode 100644 index 00000000..32195910 --- /dev/null +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-005-assert-transition-throws-fsm-transition-error-for-invalid-transitions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-fsm.fsm-transitions.assert-transition-throws-fsm-transition-error-for-invalid-transitions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-fsm.fsm-transitions +--- +# assertTransition throws FSMTransitionError for invalid transitions + +## Intent + +- outcome: Executable scenario "assertTransition throws FSMTransitionError for invalid transitions" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-006-terminal-states-are-correctly-identified.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-006-terminal-states-are-correctly-identified.sdp.md new file mode 100644 index 00000000..b88e86a6 --- /dev/null +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-006-terminal-states-are-correctly-identified.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-fsm.fsm-transitions.terminal-states-are-correctly-identified +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-fsm.fsm-transitions +--- +# Terminal states are correctly identified + +## Intent + +- outcome: Executable scenario "Terminal states are correctly identified" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-007-terminal-state-error-message-indicates-no-valid-transitions.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-007-terminal-state-error-message-indicates-no-valid-transitions.sdp.md new file mode 100644 index 00000000..f1f42c57 --- /dev/null +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-007-terminal-state-error-message-indicates-no-valid-transitions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-fsm.fsm-transitions.terminal-state-error-message-indicates-no-valid-transitions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-fsm.fsm-transitions +--- +# Terminal state error message indicates no valid transitions + +## Intent + +- outcome: Executable scenario "Terminal state error message indicates no valid transitions" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-008-state-validity-is-correctly-checked.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-008-state-validity-is-correctly-checked.sdp.md new file mode 100644 index 00000000..aca9e166 --- /dev/null +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-008-state-validity-is-correctly-checked.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-fsm.fsm-transitions.state-validity-is-correctly-checked +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-fsm.fsm-transitions +--- +# State validity is correctly checked + +## Intent + +- outcome: Executable scenario "State validity is correctly checked" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-009-valid-transitions-can-be-queried-for-any-state.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-009-valid-transitions-can-be-queried-for-any-state.sdp.md new file mode 100644 index 00000000..3bc02fac --- /dev/null +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-009-valid-transitions-can-be-queried-for-any-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-fsm.fsm-transitions.valid-transitions-can-be-queried-for-any-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-fsm.fsm-transitions +--- +# Valid transitions can be queried for any state + +## Intent + +- outcome: Executable scenario "Valid transitions can be queried for any state" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-010-standalone-functions-work-identically-to-fsm-methods.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-010-standalone-functions-work-identically-to-fsm-methods.sdp.md new file mode 100644 index 00000000..5c389969 --- /dev/null +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-010-standalone-functions-work-identically-to-fsm-methods.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-fsm.fsm-transitions.standalone-functions-work-identically-to-fsm-methods +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-fsm.fsm-transitions +--- +# Standalone functions work identically to FSM methods + +## Intent + +- outcome: Executable scenario "Standalone functions work identically to FSM methods" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-011-standalone-assert-transition-throws-same-errors.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-011-standalone-assert-transition-throws-same-errors.sdp.md new file mode 100644 index 00000000..5db99f1b --- /dev/null +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-011-standalone-assert-transition-throws-same-errors.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-fsm.fsm-transitions.standalone-assert-transition-throws-same-errors +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-fsm.fsm-transitions +--- +# Standalone assertTransition throws same errors + +## Intent + +- outcome: Executable scenario "Standalone assertTransition throws same errors" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-001-event-store-client-exposes-no-event-update-api.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-001-event-store-client-exposes-no-event-update-api.sdp.md new file mode 100644 index 00000000..04de96e5 --- /dev/null +++ b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-001-event-store-client-exposes-no-event-update-api.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-store.event-store-foundation-executable-tests.event-store-client-exposes-no-event-update-api +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-store.event-store-foundation-executable-tests +--- +# Event Store client exposes no event-update API + +## Intent + +- outcome: Executable scenario "Event Store client exposes no event-update API" from packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-002-event-store-client-exposes-no-event-delete-api.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-002-event-store-client-exposes-no-event-delete-api.sdp.md new file mode 100644 index 00000000..95956330 --- /dev/null +++ b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-002-event-store-client-exposes-no-event-delete-api.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-store.event-store-foundation-executable-tests.event-store-client-exposes-no-event-delete-api +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-store.event-store-foundation-executable-tests +--- +# Event Store client exposes no event-delete API + +## Intent + +- outcome: Executable scenario "Event Store client exposes no event-delete API" from packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-003-first-append-to-a-new-stream-produces-version-1.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-003-first-append-to-a-new-stream-produces-version-1.sdp.md new file mode 100644 index 00000000..119b6bf2 --- /dev/null +++ b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-003-first-append-to-a-new-stream-produces-version-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-store.event-store-foundation-executable-tests.first-append-to-a-new-stream-produces-version-1 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-store.event-store-foundation-executable-tests +--- +# First append to a new stream produces version 1 + +## Intent + +- outcome: Executable scenario "First append to a new stream produces version 1" from packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-004-subsequent-appends-increment-the-stream-version-monotonically.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-004-subsequent-appends-increment-the-stream-version-monotonically.sdp.md new file mode 100644 index 00000000..8c88d188 --- /dev/null +++ b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-004-subsequent-appends-increment-the-stream-version-monotonically.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-store.event-store-foundation-executable-tests.subsequent-appends-increment-the-stream-version-monotonically +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-store.event-store-foundation-executable-tests +--- +# Subsequent appends increment the stream version monotonically + +## Intent + +- outcome: Executable scenario "Subsequent appends increment the stream version monotonically" from packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-005-global-position-is-unique-across-two-streams.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-005-global-position-is-unique-across-two-streams.sdp.md new file mode 100644 index 00000000..c03d51ae --- /dev/null +++ b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-005-global-position-is-unique-across-two-streams.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-store.event-store-foundation-executable-tests.global-position-is-unique-across-two-streams +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-store.event-store-foundation-executable-tests +--- +# globalPosition is unique across two streams + +## Intent + +- outcome: Executable scenario "globalPosition is unique across two streams" from packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-006-global-position-increases-monotonically-within-a-stream.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-006-global-position-increases-monotonically-within-a-stream.sdp.md new file mode 100644 index 00000000..e3b9b3b3 --- /dev/null +++ b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-006-global-position-increases-monotonically-within-a-stream.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-store.event-store-foundation-executable-tests.global-position-increases-monotonically-within-a-stream +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-store.event-store-foundation-executable-tests +--- +# globalPosition increases monotonically within a stream + +## Intent + +- outcome: Executable scenario "globalPosition increases monotonically within a stream" from packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-007-successful-append-with-matching-version.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-007-successful-append-with-matching-version.sdp.md new file mode 100644 index 00000000..073c2218 --- /dev/null +++ b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-007-successful-append-with-matching-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-store.event-store-foundation-executable-tests.successful-append-with-matching-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-store.event-store-foundation-executable-tests +--- +# Successful append with matching version + +## Intent + +- outcome: Executable scenario "Successful append with matching version" from packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-008-conflict-on-version-mismatch.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-008-conflict-on-version-mismatch.sdp.md new file mode 100644 index 00000000..e1a10f9b --- /dev/null +++ b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-008-conflict-on-version-mismatch.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-store.event-store-foundation-executable-tests.conflict-on-version-mismatch +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-store.event-store-foundation-executable-tests +--- +# Conflict on version mismatch + +## Intent + +- outcome: Executable scenario "Conflict on version mismatch" from packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-009-projection-resumes-from-checkpoint.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-009-projection-resumes-from-checkpoint.sdp.md new file mode 100644 index 00000000..814d1e52 --- /dev/null +++ b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-009-projection-resumes-from-checkpoint.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-store.event-store-foundation-executable-tests.projection-resumes-from-checkpoint +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-store.event-store-foundation-executable-tests +--- +# Projection resumes from checkpoint + +## Intent + +- outcome: Executable scenario "Projection resumes from checkpoint" from packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature diff --git a/specs/behavior/platform-store/event-store-types.examples/s-001-event-category-supports-all-taxonomy-values.sdp.md b/specs/behavior/platform-store/event-store-types.examples/s-001-event-category-supports-all-taxonomy-values.sdp.md new file mode 100644 index 00000000..917f4fa6 --- /dev/null +++ b/specs/behavior/platform-store/event-store-types.examples/s-001-event-category-supports-all-taxonomy-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-store.event-store-types.event-category-supports-all-taxonomy-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-store.event-store-types +--- +# EventCategory supports all taxonomy values + +## Intent + +- outcome: Executable scenario "EventCategory supports all taxonomy values" from packages/platform-store/tests/features/behavior/event-store-types.feature diff --git a/specs/behavior/platform-store/event-store-types.examples/s-002-event-input-requires-core-event-fields.sdp.md b/specs/behavior/platform-store/event-store-types.examples/s-002-event-input-requires-core-event-fields.sdp.md new file mode 100644 index 00000000..d13fc3f0 --- /dev/null +++ b/specs/behavior/platform-store/event-store-types.examples/s-002-event-input-requires-core-event-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-store.event-store-types.event-input-requires-core-event-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-store.event-store-types +--- +# EventInput requires core event fields + +## Intent + +- outcome: Executable scenario "EventInput requires core event fields" from packages/platform-store/tests/features/behavior/event-store-types.feature diff --git a/specs/behavior/platform-store/event-store-types.examples/s-003-event-input-supports-optional-category-and-schema-version.sdp.md b/specs/behavior/platform-store/event-store-types.examples/s-003-event-input-supports-optional-category-and-schema-version.sdp.md new file mode 100644 index 00000000..0407dea8 --- /dev/null +++ b/specs/behavior/platform-store/event-store-types.examples/s-003-event-input-supports-optional-category-and-schema-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-store.event-store-types.event-input-supports-optional-category-and-schema-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-store.event-store-types +--- +# EventInput supports optional category and schemaVersion + +## Intent + +- outcome: Executable scenario "EventInput supports optional category and schemaVersion" from packages/platform-store/tests/features/behavior/event-store-types.feature diff --git a/specs/behavior/platform-store/event-store-types.examples/s-004-event-input-supports-metadata-with-correlation-tracking.sdp.md b/specs/behavior/platform-store/event-store-types.examples/s-004-event-input-supports-metadata-with-correlation-tracking.sdp.md new file mode 100644 index 00000000..8137655d --- /dev/null +++ b/specs/behavior/platform-store/event-store-types.examples/s-004-event-input-supports-metadata-with-correlation-tracking.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-store.event-store-types.event-input-supports-metadata-with-correlation-tracking +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-store.event-store-types +--- +# EventInput supports metadata with correlation tracking + +## Intent + +- outcome: Executable scenario "EventInput supports metadata with correlation tracking" from packages/platform-store/tests/features/behavior/event-store-types.feature diff --git a/specs/behavior/platform-store/event-store-types.examples/s-005-stored-event-includes-all-required-storage-fields.sdp.md b/specs/behavior/platform-store/event-store-types.examples/s-005-stored-event-includes-all-required-storage-fields.sdp.md new file mode 100644 index 00000000..1441c48d --- /dev/null +++ b/specs/behavior/platform-store/event-store-types.examples/s-005-stored-event-includes-all-required-storage-fields.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-store.event-store-types.stored-event-includes-all-required-storage-fields +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-store.event-store-types +--- +# StoredEvent includes all required storage fields + +## Intent + +- outcome: Executable scenario "StoredEvent includes all required storage fields" from packages/platform-store/tests/features/behavior/event-store-types.feature diff --git a/specs/behavior/platform-store/event-store-types.examples/s-006-append-result-success-includes-event-positions.sdp.md b/specs/behavior/platform-store/event-store-types.examples/s-006-append-result-success-includes-event-positions.sdp.md new file mode 100644 index 00000000..6117d6a8 --- /dev/null +++ b/specs/behavior/platform-store/event-store-types.examples/s-006-append-result-success-includes-event-positions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-store.event-store-types.append-result-success-includes-event-positions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-store.event-store-types +--- +# AppendResult success includes event positions + +## Intent + +- outcome: Executable scenario "AppendResult success includes event positions" from packages/platform-store/tests/features/behavior/event-store-types.feature diff --git a/specs/behavior/platform-store/event-store-types.examples/s-007-append-result-conflict-includes-current-version.sdp.md b/specs/behavior/platform-store/event-store-types.examples/s-007-append-result-conflict-includes-current-version.sdp.md new file mode 100644 index 00000000..5c48ba25 --- /dev/null +++ b/specs/behavior/platform-store/event-store-types.examples/s-007-append-result-conflict-includes-current-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:behavior.platform-store.event-store-types.append-result-conflict-includes-current-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:behavior.platform-store.event-store-types +--- +# AppendResult conflict includes current version + +## Intent + +- outcome: Executable scenario "AppendResult conflict includes current version" from packages/platform-store/tests/features/behavior/event-store-types.feature diff --git a/specs/unimplemented.pack.sdp.md b/specs/unimplemented.pack.sdp.md new file mode 100644 index 00000000..5e5e31ea --- /dev/null +++ b/specs/unimplemented.pack.sdp.md @@ -0,0 +1,156 @@ +--- +id: pack:unimplemented +specs: + - spec:unimplemented.admin-tooling-consolidation.admin-api-documentation + - spec:unimplemented.admin-tooling-consolidation.admin-authorization-wrapper + - spec:unimplemented.admin-tooling-consolidation.create-admin-directory + - spec:unimplemented.admin-tooling-consolidation.durable-function-run-queries + - spec:unimplemented.admin-tooling-consolidation.event-flow-trace-query + - spec:unimplemented.admin-tooling-consolidation.projection-admin-endpoints + - spec:unimplemented.admin-tooling-consolidation.refactored-dlq-endpoints + - spec:unimplemented.admin-tooling-consolidation.system-state-snapshot-query + - spec:unimplemented.agent-admin-frontend.action-feedback-toasts + - spec:unimplemented.agent-admin-frontend.agent-admin-page-page-object + - spec:unimplemented.agent-admin-frontend.auth-integration-documentation + - spec:unimplemented.agent-admin-frontend.dashboard-update-for-multi-agent + - spec:unimplemented.agent-admin-frontend.dead-letter-management-section-in-monitoring + - spec:unimplemented.agent-admin-frontend.decision-history-tab + - spec:unimplemented.agent-admin-frontend.e2-e-step-definitions + - spec:unimplemented.agent-admin-frontend.high-value-action-handler + - spec:unimplemented.agent-admin-frontend.high-value-agent-config + - spec:unimplemented.agent-admin-frontend.high-value-command-route + - spec:unimplemented.agent-admin-frontend.high-value-event-bus-subscription + - spec:unimplemented.agent-admin-frontend.high-value-integration-test-real-llm + - spec:unimplemented.agent-admin-frontend.high-value-on-complete-handler + - spec:unimplemented.agent-admin-frontend.high-value-pattern-definition + - spec:unimplemented.agent-admin-frontend.tag-unimplemented-agent-e2e-scenarios-skip + - spec:unimplemented.agent-admin-frontend.toast-notification-integration-sonner + - spec:unimplemented.agent-admin-frontend.use-dead-letter-actions-hook + - spec:unimplemented.agent-admin-frontend.use-dead-letters-hook + - spec:unimplemented.agent-admin-frontend.use-decision-history-hook-with-filters + - spec:unimplemented.agent-bc-component-isolation.agent-component-definition + - spec:unimplemented.agent-bc-component-isolation.agent-component-schema + - spec:unimplemented.agent-bc-component-isolation.approval-public-api + - spec:unimplemented.agent-bc-component-isolation.audit-public-api + - spec:unimplemented.agent-bc-component-isolation.checkpoint-public-api + - spec:unimplemented.agent-bc-component-isolation.command-public-api + - spec:unimplemented.agent-bc-component-isolation.cross-component-query-pattern + - spec:unimplemented.agent-bc-component-isolation.dead-letter-public-api + - spec:unimplemented.agent-llm-integration.action-mutation-integration-test + - spec:unimplemented.agent-llm-integration.agent-action-handler-factory + - spec:unimplemented.agent-llm-integration.agent-workpool-configuration + - spec:unimplemented.agent-llm-integration.circuit-breaker-for-llm + - spec:unimplemented.agent-llm-integration.convex-dev-agent-thread-adapter + - spec:unimplemented.agent-llm-integration.cost-budget-tracking + - spec:unimplemented.agent-llm-integration.llm-integrated-on-complete-handler + - spec:unimplemented.agent-llm-integration.on-complete-in-create-agent-subscription-options + - spec:unimplemented.agent-llm-integration.rate-limiter-integration + - spec:unimplemented.backlog + - spec:unimplemented.circuit-breaker-pattern.check-half-open-scheduled-mutation + - spec:unimplemented.circuit-breaker-pattern.circuit-breaker-metrics + - spec:unimplemented.circuit-breaker-pattern.circuit-breaker-state-machine-pure + - spec:unimplemented.circuit-breaker-pattern.circuit-breaker-types + - spec:unimplemented.circuit-breaker-pattern.circuit-breakers-table-schema + - spec:unimplemented.circuit-breaker-pattern.load-circuit-state-query + - spec:unimplemented.circuit-breaker-pattern.on-circuit-probe-complete-handler + - spec:unimplemented.circuit-breaker-pattern.record-failure-mutation + - spec:unimplemented.circuit-breaker-pattern.record-success-mutation + - spec:unimplemented.circuit-breaker-pattern.with-circuit-breaker-wrapper + - spec:unimplemented.component-boundary-authentication-convention.canonical-verification-proof-contract + - spec:unimplemented.component-boundary-authentication-convention.component-boundary-auth-integration-suite + - spec:unimplemented.component-boundary-authentication-convention.contract-status-tagging-for-system-only-exceptions + - spec:unimplemented.component-boundary-authentication-convention.identity-bearing-mutation-migration + - spec:unimplemented.component-boundary-authentication-convention.pdr-014-placeholder + - spec:unimplemented.component-boundary-authentication-convention.verify-actor-helper + - spec:unimplemented.current.phase-100-codec-driven-reference-generation + - spec:unimplemented.current.phase-100-themed-decision-architecture + - spec:unimplemented.current.phase-15-projection-categories-executable-tests + - spec:unimplemented.current.phase-22-agent-as-bounded-context + - spec:unimplemented.current.phase-22-agent-as-bounded-context-ai-driven-event-reactors + - spec:unimplemented.current.phase-22-agent-churn-risk-completion + - spec:unimplemented.current.phase-22-confirmed-order-cancellation + - spec:unimplemented.deterministic-id-hashing.conflict-error-handling + - spec:unimplemented.deterministic-id-hashing.deterministic-stream-id-function + - spec:unimplemented.deterministic-id-hashing.hash-algorithm-selection + - spec:unimplemented.deterministic-id-hashing.pattern-documentation + - spec:unimplemented.event-correctness-migration.append-to-stream-idempotency-migration + - spec:unimplemented.event-correctness-migration.canonical-pm-transition-map-parity + - spec:unimplemented.event-correctness-migration.event-correctness-integration-suite + - spec:unimplemented.event-correctness-migration.global-position-consumer-inventory + - spec:unimplemented.event-correctness-migration.global-position-representation-migration-and-compat-reader + - spec:unimplemented.event-correctness-migration.pdr-015-placeholder + - spec:unimplemented.event-correctness-migration.pdr-018-placeholder + - spec:unimplemented.health-observability.check-liveness-query + - spec:unimplemented.health-observability.check-readiness-query + - spec:unimplemented.health-observability.health-check-types + - spec:unimplemented.health-observability.http-router-with-health-routes + - spec:unimplemented.health-observability.metrics-collector + - spec:unimplemented.health-observability.metrics-types + - spec:unimplemented.health-observability.projection-lag-calculator + - spec:unimplemented.health-observability.system-health-aggregator + - spec:unimplemented.health-observability.workpool-depth-query + - spec:unimplemented.integration-patterns-21a.acl-builder-enhancement + - spec:unimplemented.integration-patterns-21a.context-map-documentation + - spec:unimplemented.integration-patterns-21a.context-map-registry + - spec:unimplemented.integration-patterns-21a.integration-event-metadata-extension + - spec:unimplemented.integration-patterns-21a.published-language-registry + - spec:unimplemented.integration-patterns-21a.to-published-language-converter + - spec:unimplemented.integration-patterns-21b.compatibility-verification + - spec:unimplemented.integration-patterns-21b.consumer-contract-tests + - spec:unimplemented.integration-patterns-21b.contract-sample-generation + - spec:unimplemented.integration-patterns-21b.contract-violation-detection + - spec:unimplemented.integration-patterns-21b.downcaster-implementation + - spec:unimplemented.integration-patterns-21b.migration-path-validation + - spec:unimplemented.integration-patterns-21b.producer-contract-tests + - spec:unimplemented.integration-patterns-21b.upcaster-implementation + - spec:unimplemented.production-hardening.admin-diagnostics + - spec:unimplemented.production-hardening.admin-dlq-endpoints + - spec:unimplemented.production-hardening.admin-projection-endpoints + - spec:unimplemented.production-hardening.circuit-breaker-implementation + - spec:unimplemented.production-hardening.circuit-breaker-retrier-integration + - spec:unimplemented.production-hardening.contract-violation-types + - spec:unimplemented.production-hardening.dlq-action-retrier-pattern + - spec:unimplemented.production-hardening.durable-function-decision-guide + - spec:unimplemented.production-hardening.durable-function-run-diagnostics + - spec:unimplemented.production-hardening.grafana-dashboard-templates + - spec:unimplemented.production-hardening.health-check-queries + - spec:unimplemented.production-hardening.health-http-router + - spec:unimplemented.production-hardening.metrics-collection-types + - spec:unimplemented.production-hardening.metrics-collector + - spec:unimplemented.production-hardening.runbook-documentation + - spec:unimplemented.remaining.phase-100-themed-decision-architecture + - spec:unimplemented.remaining.phase-18-production-hardening + - spec:unimplemented.remaining.phase-18-workpool-partitioning-strategy + - spec:unimplemented.remaining.phase-20-reservation-pattern + - spec:unimplemented.remaining.phase-21-integration-patterns-21b + - spec:unimplemented.remaining.phase-22-agent-as-bounded-context + - spec:unimplemented.remaining.phase-22-agent-as-bounded-context-ai-driven-event-reactors + - spec:unimplemented.remaining.phase-22-agent-churn-risk-completion + - spec:unimplemented.remaining.phase-22-confirmed-order-cancellation + - spec:unimplemented.test-content-blocks.demo-item-1 + - spec:unimplemented.themed-decision-architecture.add-adr-theme-tag-to-registry + - spec:unimplemented.themed-decision-architecture.adr-migration-scripts + - spec:unimplemented.themed-decision-architecture.dependency-graph-generator + - spec:unimplemented.themed-decision-architecture.review-and-port-33-active-ad-rs + - spec:unimplemented.themed-decision-architecture.theme-grouped-decision-generator + - spec:unimplemented.tranche-0-readiness-harness-and-dependency-hardening.bus-backend-integration-harness + - spec:unimplemented.tranche-0-readiness-harness-and-dependency-hardening.dependency-delta-memo + - spec:unimplemented.tranche-0-readiness-harness-and-dependency-hardening.store-backend-integration-harness + - spec:unimplemented.tranche-0-readiness-harness-and-dependency-hardening.strict-ts-and-es-lint-hardening + - spec:unimplemented.tranche-0-readiness-harness-and-dependency-hardening.typecheck-and-vitest-config-alignment + - spec:unimplemented.tranche-0-release-ci-and-docs-process-guardrails.contract-status-convention-and-linting + - spec:unimplemented.tranche-0-release-ci-and-docs-process-guardrails.convex-es-rename-guard + - spec:unimplemented.tranche-0-release-ci-and-docs-process-guardrails.dependency-scanning-in-ci + - spec:unimplemented.tranche-0-release-ci-and-docs-process-guardrails.docs-process-validation-workflow + - spec:unimplemented.tranche-0-release-ci-and-docs-process-guardrails.release-automation-aligned-to-architect-releases + - spec:unimplemented.tranche-1-supporting-security-and-contract-sweep.approval-expiration-ordering-fix + - spec:unimplemented.tranche-1-supporting-security-and-contract-sweep.correlation-id-required-at-validator-boundary + - spec:unimplemented.tranche-1-supporting-security-and-contract-sweep.ensure-test-environment-fail-closed + - spec:unimplemented.tranche-1-supporting-security-and-contract-sweep.full-length-uui-dv7-helper-centralization + - spec:unimplemented.tranche-1-supporting-security-and-contract-sweep.lifecycle-stubs-throw-or-are-removed + - spec:unimplemented.tranche-1-supporting-security-and-contract-sweep.platform-store-dependency-decision-guardrails + - spec:unimplemented.tranche-1-supporting-security-and-contract-sweep.reviewer-authorization-default-deny-migration +--- +# Unimplemented + +Non-implemented architect deliverables, remaining-work items, and in-flight docs-living rows. diff --git a/specs/unimplemented/_epic.sdp.md b/specs/unimplemented/_epic.sdp.md new file mode 100644 index 00000000..09af8e7b --- /dev/null +++ b/specs/unimplemented/_epic.sdp.md @@ -0,0 +1,12 @@ +--- +id: spec:unimplemented.backlog +kind: behavior +altitude: epic +readiness: idea +relations: {} +--- +# Unimplemented delivery backlog + +## Intent + +- outcome: Hold non-implemented architect deliverables and remaining-work items until they are authored to a higher readiness rung. diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-001-admin-directory-is-created-with-correct-structure.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-001-admin-directory-is-created-with-correct-structure.sdp.md new file mode 100644 index 00000000..d0d7ee6f --- /dev/null +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-001-admin-directory-is-created-with-correct-structure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.admin-tooling-consolidation.admin-directory-is-created-with-correct-structure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.admin-tooling-consolidation +--- +# Admin directory is created with correct structure + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Admin directory is created with correct structure" from architect/specs/platform/admin-tooling-consolidation.feature diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-002-backward-compatibility-for-dlq-imports.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-002-backward-compatibility-for-dlq-imports.sdp.md new file mode 100644 index 00000000..5b6ba545 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-002-backward-compatibility-for-dlq-imports.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.admin-tooling-consolidation.backward-compatibility-for-dlq-imports +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.admin-tooling-consolidation +--- +# Backward compatibility for DLQ imports + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Backward compatibility for DLQ imports" from architect/specs/platform/admin-tooling-consolidation.feature diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-003-get-dead-letter-statistics.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-003-get-dead-letter-statistics.sdp.md new file mode 100644 index 00000000..13dc024b --- /dev/null +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-003-get-dead-letter-statistics.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.admin-tooling-consolidation.get-dead-letter-statistics +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.admin-tooling-consolidation +--- +# Get dead letter statistics + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Get dead letter statistics" from architect/specs/platform/admin-tooling-consolidation.feature diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-004-bulk-retry-pending-dead-letters.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-004-bulk-retry-pending-dead-letters.sdp.md new file mode 100644 index 00000000..015358ab --- /dev/null +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-004-bulk-retry-pending-dead-letters.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.admin-tooling-consolidation.bulk-retry-pending-dead-letters +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.admin-tooling-consolidation +--- +# Bulk retry pending dead letters + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Bulk retry pending dead letters" from architect/specs/platform/admin-tooling-consolidation.feature diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-005-trace-complete-event-flow.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-005-trace-complete-event-flow.sdp.md new file mode 100644 index 00000000..65e52bcd --- /dev/null +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-005-trace-complete-event-flow.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.admin-tooling-consolidation.trace-complete-event-flow +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.admin-tooling-consolidation +--- +# Trace complete event flow + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Trace complete event flow" from architect/specs/platform/admin-tooling-consolidation.feature diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-006-trace-shows-failure-point.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-006-trace-shows-failure-point.sdp.md new file mode 100644 index 00000000..05ac7345 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-006-trace-shows-failure-point.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.admin-tooling-consolidation.trace-shows-failure-point +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.admin-tooling-consolidation +--- +# Trace shows failure point + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Trace shows failure point" from architect/specs/platform/admin-tooling-consolidation.feature diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-007-system-state-provides-complete-overview.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-007-system-state-provides-complete-overview.sdp.md new file mode 100644 index 00000000..ebd0531d --- /dev/null +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-007-system-state-provides-complete-overview.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.admin-tooling-consolidation.system-state-provides-complete-overview +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.admin-tooling-consolidation +--- +# System state provides complete overview + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "System state provides complete overview" from architect/specs/platform/admin-tooling-consolidation.feature diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-008-query-workpool-item-status.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-008-query-workpool-item-status.sdp.md new file mode 100644 index 00000000..157b126c --- /dev/null +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-008-query-workpool-item-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.admin-tooling-consolidation.query-workpool-item-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.admin-tooling-consolidation +--- +# Query Workpool item status + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Query Workpool item status" from architect/specs/platform/admin-tooling-consolidation.feature diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-009-query-workflow-execution-with-steps.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-009-query-workflow-execution-with-steps.sdp.md new file mode 100644 index 00000000..1d9aeac9 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-009-query-workflow-execution-with-steps.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.admin-tooling-consolidation.query-workflow-execution-with-steps +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.admin-tooling-consolidation +--- +# Query Workflow execution with steps + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Query Workflow execution with steps" from architect/specs/platform/admin-tooling-consolidation.feature diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-010-query-non-existent-durable-function.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-010-query-non-existent-durable-function.sdp.md new file mode 100644 index 00000000..8a608b84 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-010-query-non-existent-durable-function.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.admin-tooling-consolidation.query-non-existent-durable-function +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.admin-tooling-consolidation +--- +# Query non-existent durable function + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Query non-existent durable function" from architect/specs/platform/admin-tooling-consolidation.feature diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-011-unauthenticated-request-is-rejected.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-011-unauthenticated-request-is-rejected.sdp.md new file mode 100644 index 00000000..3a621916 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-011-unauthenticated-request-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.admin-tooling-consolidation.unauthenticated-request-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.admin-tooling-consolidation +--- +# Unauthenticated request is rejected + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Unauthenticated request is rejected" from architect/specs/platform/admin-tooling-consolidation.feature diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-012-non-admin-user-is-rejected.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-012-non-admin-user-is-rejected.sdp.md new file mode 100644 index 00000000..4891adde --- /dev/null +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-012-non-admin-user-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.admin-tooling-consolidation.non-admin-user-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.admin-tooling-consolidation +--- +# Non-admin user is rejected + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Non-admin user is rejected" from architect/specs/platform/admin-tooling-consolidation.feature diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-013-admin-action-is-logged.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-013-admin-action-is-logged.sdp.md new file mode 100644 index 00000000..52963658 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-013-admin-action-is-logged.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.admin-tooling-consolidation.admin-action-is-logged +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.admin-tooling-consolidation +--- +# Admin action is logged + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Admin action is logged" from architect/specs/platform/admin-tooling-consolidation.feature diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-001-dead-letter-list-displays-failed-events-from-both-agents.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-001-dead-letter-list-displays-failed-events-from-both-agents.sdp.md new file mode 100644 index 00000000..ba24388e --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-001-dead-letter-list-displays-failed-events-from-both-agents.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-admin-frontend.dead-letter-list-displays-failed-events-from-both-agents +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Dead letter list displays failed events from both agents + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Dead letter list displays failed events from both agents" from architect/specs/example-app/agent-admin-frontend.feature diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-002-replay-action-triggers-backend-mutation-with-toast-feedback.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-002-replay-action-triggers-backend-mutation-with-toast-feedback.sdp.md new file mode 100644 index 00000000..cb9a968d --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-002-replay-action-triggers-backend-mutation-with-toast-feedback.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-admin-frontend.replay-action-triggers-backend-mutation-with-toast-feedback +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Replay action triggers backend mutation with toast feedback + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Replay action triggers backend mutation with toast feedback" from architect/specs/example-app/agent-admin-frontend.feature diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-003-ignore-action-with-reason-provides-confirmation.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-003-ignore-action-with-reason-provides-confirmation.sdp.md new file mode 100644 index 00000000..5b859ad9 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-003-ignore-action-with-reason-provides-confirmation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-admin-frontend.ignore-action-with-reason-provides-confirmation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Ignore action with reason provides confirmation + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Ignore action with reason provides confirmation" from architect/specs/example-app/agent-admin-frontend.feature diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-004-replay-failure-shows-error-toast.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-004-replay-failure-shows-error-toast.sdp.md new file mode 100644 index 00000000..3c514cb0 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-004-replay-failure-shows-error-toast.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-admin-frontend.replay-failure-shows-error-toast +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Replay failure shows error toast + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Replay failure shows error toast" from architect/specs/example-app/agent-admin-frontend.feature diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-005-filter-dead-letters-by-agent.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-005-filter-dead-letters-by-agent.sdp.md new file mode 100644 index 00000000..af82137e --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-005-filter-dead-letters-by-agent.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-admin-frontend.filter-dead-letters-by-agent +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Filter dead letters by agent + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Filter dead letters by agent" from architect/specs/example-app/agent-admin-frontend.feature diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-006-view-decision-history-with-decisions-from-both-agents.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-006-view-decision-history-with-decisions-from-both-agents.sdp.md new file mode 100644 index 00000000..2802b40a --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-006-view-decision-history-with-decisions-from-both-agents.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-admin-frontend.view-decision-history-with-decisions-from-both-agents +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# View decision history with decisions from both agents + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "View decision history with decisions from both agents" from architect/specs/example-app/agent-admin-frontend.feature diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-007-filter-decision-history-by-agent.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-007-filter-decision-history-by-agent.sdp.md new file mode 100644 index 00000000..457ca9ee --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-007-filter-decision-history-by-agent.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-admin-frontend.filter-decision-history-by-agent +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Filter decision history by agent + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Filter decision history by agent" from architect/specs/example-app/agent-admin-frontend.feature diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-008-filter-decision-history-by-action-type.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-008-filter-decision-history-by-action-type.sdp.md new file mode 100644 index 00000000..dc74d3e1 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-008-filter-decision-history-by-action-type.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-admin-frontend.filter-decision-history-by-action-type +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Filter decision history by action type + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Filter decision history by action type" from architect/specs/example-app/agent-admin-frontend.feature diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-009-view-decision-detail-with-full-reasoning.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-009-view-decision-detail-with-full-reasoning.sdp.md new file mode 100644 index 00000000..b8b79bb5 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-009-view-decision-detail-with-full-reasoning.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-admin-frontend.view-decision-detail-with-full-reasoning +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# View decision detail with full reasoning + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "View decision detail with full reasoning" from architect/specs/example-app/agent-admin-frontend.feature diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-010-empty-decision-history-shows-guidance-message.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-010-empty-decision-history-shows-guidance-message.sdp.md new file mode 100644 index 00000000..fc35a067 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-010-empty-decision-history-shows-guidance-message.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-admin-frontend.empty-decision-history-shows-guidance-message +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Empty decision history shows guidance message + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Empty decision history shows guidance message" from architect/specs/example-app/agent-admin-frontend.feature diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-011-approve-action-shows-success-toast.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-011-approve-action-shows-success-toast.sdp.md new file mode 100644 index 00000000..a3a864f5 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-011-approve-action-shows-success-toast.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-admin-frontend.approve-action-shows-success-toast +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Approve action shows success toast + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Approve action shows success toast" from architect/specs/example-app/agent-admin-frontend.feature diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-012-reject-action-shows-success-toast.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-012-reject-action-shows-success-toast.sdp.md new file mode 100644 index 00000000..a48789e0 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-012-reject-action-shows-success-toast.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-admin-frontend.reject-action-shows-success-toast +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Reject action shows success toast + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Reject action shows success toast" from architect/specs/example-app/agent-admin-frontend.feature diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-013-error-action-shows-descriptive-error-toast.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-013-error-action-shows-descriptive-error-toast.sdp.md new file mode 100644 index 00000000..27e08297 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-013-error-action-shows-descriptive-error-toast.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-admin-frontend.error-action-shows-descriptive-error-toast +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Error action shows descriptive error toast + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Error action shows descriptive error toast" from architect/specs/example-app/agent-admin-frontend.feature diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-014-multiple-rapid-actions-show-stacked-toasts.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-014-multiple-rapid-actions-show-stacked-toasts.sdp.md new file mode 100644 index 00000000..257c4cea --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-014-multiple-rapid-actions-show-stacked-toasts.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-admin-frontend.multiple-rapid-actions-show-stacked-toasts +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Multiple rapid actions show stacked toasts + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Multiple rapid actions show stacked toasts" from architect/specs/example-app/agent-admin-frontend.feature diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-015-high-value-order-detected-and-surfaces-as-vip-approval.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-015-high-value-order-detected-and-surfaces-as-vip-approval.sdp.md new file mode 100644 index 00000000..4eafe1da --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-015-high-value-order-detected-and-surfaces-as-vip-approval.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-admin-frontend.high-value-order-detected-and-surfaces-as-vip-approval +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# High-value order detected and surfaces as VIP approval + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "High-value order detected and surfaces as VIP approval" from architect/specs/example-app/agent-admin-frontend.feature diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-016-low-value-order-does-not-trigger-agent.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-016-low-value-order-does-not-trigger-agent.sdp.md new file mode 100644 index 00000000..2c31464b --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-016-low-value-order-does-not-trigger-agent.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-admin-frontend.low-value-order-does-not-trigger-agent +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Low-value order does not trigger agent + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Low-value order does not trigger agent" from architect/specs/example-app/agent-admin-frontend.feature diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-017-admin-approves-vip-flag-for-high-value-order.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-017-admin-approves-vip-flag-for-high-value-order.sdp.md new file mode 100644 index 00000000..c608cbb1 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-017-admin-approves-vip-flag-for-high-value-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-admin-frontend.admin-approves-vip-flag-for-high-value-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Admin approves VIP flag for high-value order + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Admin approves VIP flag for high-value order" from architect/specs/example-app/agent-admin-frontend.feature diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-018-both-agents-trigger-from-same-customer-activity.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-018-both-agents-trigger-from-same-customer-activity.sdp.md new file mode 100644 index 00000000..1f93eb90 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-018-both-agents-trigger-from-same-customer-activity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-admin-frontend.both-agents-trigger-from-same-customer-activity +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Both agents trigger from same customer activity + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Both agents trigger from same customer activity" from architect/specs/example-app/agent-admin-frontend.feature diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-019-dashboard-shows-both-active-agents.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-019-dashboard-shows-both-active-agents.sdp.md new file mode 100644 index 00000000..0cca734b --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-019-dashboard-shows-both-active-agents.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-admin-frontend.dashboard-shows-both-active-agents +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Dashboard shows both active agents + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Dashboard shows both active agents" from architect/specs/example-app/agent-admin-frontend.feature diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-020-pending-approvals-count-includes-both-agents.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-020-pending-approvals-count-includes-both-agents.sdp.md new file mode 100644 index 00000000..002da331 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-020-pending-approvals-count-includes-both-agents.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-admin-frontend.pending-approvals-count-includes-both-agents +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Pending approvals count includes both agents + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Pending approvals count includes both agents" from architect/specs/example-app/agent-admin-frontend.feature diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-021-one-agent-stopped-one-active.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-021-one-agent-stopped-one-active.sdp.md new file mode 100644 index 00000000..28beb2ec --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-021-one-agent-stopped-one-active.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-admin-frontend.one-agent-stopped-one-active +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# One agent stopped, one active + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "One agent stopped, one active" from architect/specs/example-app/agent-admin-frontend.feature diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-001-agent-component-registers-with-isolated-schema.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-001-agent-component-registers-with-isolated-schema.sdp.md new file mode 100644 index 00000000..af2e574c --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-001-agent-component-registers-with-isolated-schema.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-bc-component-isolation.agent-component-registers-with-isolated-schema +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-bc-component-isolation +--- +# Agent component registers with isolated schema + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Agent component registers with isolated schema" from architect/specs/platform/agent-bc-component-isolation.feature diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-002-component-api-provides-full-crud-for-checkpoints.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-002-component-api-provides-full-crud-for-checkpoints.sdp.md new file mode 100644 index 00000000..4bc9388b --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-002-component-api-provides-full-crud-for-checkpoints.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-bc-component-isolation.component-api-provides-full-crud-for-checkpoints +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-bc-component-isolation +--- +# Component API provides full CRUD for checkpoints + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Component API provides full CRUD for checkpoints" from architect/specs/platform/agent-bc-component-isolation.feature diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-003-direct-table-access-is-not-possible-from-parent.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-003-direct-table-access-is-not-possible-from-parent.sdp.md new file mode 100644 index 00000000..675f5f24 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-003-direct-table-access-is-not-possible-from-parent.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-bc-component-isolation.direct-table-access-is-not-possible-from-parent +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-bc-component-isolation +--- +# Direct table access is not possible from parent + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Direct table access is not possible from parent" from architect/specs/platform/agent-bc-component-isolation.feature diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-004-component-sub-transactions-provide-isolation.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-004-component-sub-transactions-provide-isolation.sdp.md new file mode 100644 index 00000000..5ba733e3 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-004-component-sub-transactions-provide-isolation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-bc-component-isolation.component-sub-transactions-provide-isolation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-bc-component-isolation +--- +# Component sub-transactions provide isolation + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Component sub-transactions provide isolation" from architect/specs/platform/agent-bc-component-isolation.feature diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-005-agent-handler-receives-projection-data-as-argument.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-005-agent-handler-receives-projection-data-as-argument.sdp.md new file mode 100644 index 00000000..2ff190ee --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-005-agent-handler-receives-projection-data-as-argument.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-bc-component-isolation.agent-handler-receives-projection-data-as-argument +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-bc-component-isolation +--- +# Agent handler receives projection data as argument + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Agent handler receives projection data as argument" from architect/specs/platform/agent-bc-component-isolation.feature diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-006-missing-projection-data-returns-empty-result.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-006-missing-projection-data-returns-empty-result.sdp.md new file mode 100644 index 00000000..86afb446 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-006-missing-projection-data-returns-empty-result.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-bc-component-isolation.missing-projection-data-returns-empty-result +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-bc-component-isolation +--- +# Missing projection data returns empty result + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Missing projection data returns empty result" from architect/specs/platform/agent-bc-component-isolation.feature diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-007-agent-handler-cannot-directly-access-app-level-projection-tables.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-007-agent-handler-cannot-directly-access-app-level-projection-tables.sdp.md new file mode 100644 index 00000000..a1bb5126 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-007-agent-handler-cannot-directly-access-app-level-projection-tables.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-bc-component-isolation.agent-handler-cannot-directly-access-app-level-projection-tables +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-bc-component-isolation +--- +# Agent handler cannot directly access app-level projection tables + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Agent handler cannot directly access app-level projection tables" from architect/specs/platform/agent-bc-component-isolation.feature diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-008-app-level-queries-can-access-agent-data-via-component-api.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-008-app-level-queries-can-access-agent-data-via-component-api.sdp.md new file mode 100644 index 00000000..439f735b --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-008-app-level-queries-can-access-agent-data-via-component-api.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-bc-component-isolation.app-level-queries-can-access-agent-data-via-component-api +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-bc-component-isolation +--- +# App-level queries can access agent data via component API + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "App-level queries can access agent data via component API" from architect/specs/platform/agent-bc-component-isolation.feature diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-001-agent-command-routes-through-command-orchestrator-to-handler.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-001-agent-command-routes-through-command-orchestrator-to-handler.sdp.md new file mode 100644 index 00000000..6251da3a --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-001-agent-command-routes-through-command-orchestrator-to-handler.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-command-infrastructure.agent-command-routes-through-command-orchestrator-to-handler +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-command-infrastructure +--- +# Agent command routes through CommandOrchestrator to handler + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Agent command routes through CommandOrchestrator to handler" from architect/specs/platform/agent-command-infrastructure.feature diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-002-unknown-command-type-is-rejected-with-validation-error.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-002-unknown-command-type-is-rejected-with-validation-error.sdp.md new file mode 100644 index 00000000..a7491bb2 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-002-unknown-command-type-is-rejected-with-validation-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-command-infrastructure.unknown-command-type-is-rejected-with-validation-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-command-infrastructure +--- +# Unknown command type is rejected with validation error + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Unknown command type is rejected with validation error" from architect/specs/platform/agent-command-infrastructure.feature diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-003-command-idempotency-prevents-duplicate-processing.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-003-command-idempotency-prevents-duplicate-processing.sdp.md new file mode 100644 index 00000000..7beaa3a0 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-003-command-idempotency-prevents-duplicate-processing.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-command-infrastructure.command-idempotency-prevents-duplicate-processing +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-command-infrastructure +--- +# Command idempotency prevents duplicate processing + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Command idempotency prevents duplicate processing" from architect/specs/platform/agent-command-infrastructure.feature diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-004-pause-agent-transitions-active-agent-to-paused.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-004-pause-agent-transitions-active-agent-to-paused.sdp.md new file mode 100644 index 00000000..4a365531 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-004-pause-agent-transitions-active-agent-to-paused.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-command-infrastructure.pause-agent-transitions-active-agent-to-paused +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-command-infrastructure +--- +# PauseAgent transitions active agent to paused + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "PauseAgent transitions active agent to paused" from architect/specs/platform/agent-command-infrastructure.feature diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-005-resume-agent-resumes-from-checkpoint-position.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-005-resume-agent-resumes-from-checkpoint-position.sdp.md new file mode 100644 index 00000000..139a927a --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-005-resume-agent-resumes-from-checkpoint-position.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-command-infrastructure.resume-agent-resumes-from-checkpoint-position +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-command-infrastructure +--- +# ResumeAgent resumes from checkpoint position + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "ResumeAgent resumes from checkpoint position" from architect/specs/platform/agent-command-infrastructure.feature diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-006-invalid-lifecycle-transition-is-rejected.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-006-invalid-lifecycle-transition-is-rejected.sdp.md new file mode 100644 index 00000000..0d756fad --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-006-invalid-lifecycle-transition-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-command-infrastructure.invalid-lifecycle-transition-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-command-infrastructure +--- +# Invalid lifecycle transition is rejected + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Invalid lifecycle transition is rejected" from architect/specs/platform/agent-command-infrastructure.feature diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-007-reconfigure-agent-updates-configuration-without-losing-state.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-007-reconfigure-agent-updates-configuration-without-losing-state.sdp.md new file mode 100644 index 00000000..42d315d5 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-007-reconfigure-agent-updates-configuration-without-losing-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-command-infrastructure.reconfigure-agent-updates-configuration-without-losing-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-command-infrastructure +--- +# ReconfigureAgent updates configuration without losing state + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "ReconfigureAgent updates configuration without losing state" from architect/specs/platform/agent-command-infrastructure.feature diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-008-agent-config-references-patterns-from-registry.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-008-agent-config-references-patterns-from-registry.sdp.md new file mode 100644 index 00000000..ca0e8b0b --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-008-agent-config-references-patterns-from-registry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-command-infrastructure.agent-config-references-patterns-from-registry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-command-infrastructure +--- +# Agent config references patterns from registry + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Agent config references patterns from registry" from architect/specs/platform/agent-command-infrastructure.feature diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-009-handler-uses-pattern-trigger-for-cheap-detection.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-009-handler-uses-pattern-trigger-for-cheap-detection.sdp.md new file mode 100644 index 00000000..642b4e11 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-009-handler-uses-pattern-trigger-for-cheap-detection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-command-infrastructure.handler-uses-pattern-trigger-for-cheap-detection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-command-infrastructure +--- +# Handler uses pattern trigger for cheap detection + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Handler uses pattern trigger for cheap detection" from architect/specs/platform/agent-command-infrastructure.feature diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-010-handler-uses-pattern-analyze-for-llm-analysis.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-010-handler-uses-pattern-analyze-for-llm-analysis.sdp.md new file mode 100644 index 00000000..11608c4b --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-010-handler-uses-pattern-analyze-for-llm-analysis.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-command-infrastructure.handler-uses-pattern-analyze-for-llm-analysis +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-command-infrastructure +--- +# Handler uses pattern analyze for LLM analysis + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Handler uses pattern analyze for LLM analysis" from architect/specs/platform/agent-command-infrastructure.feature diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-011-unknown-pattern-name-in-config-fails-validation.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-011-unknown-pattern-name-in-config-fails-validation.sdp.md new file mode 100644 index 00000000..20c5066c --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-011-unknown-pattern-name-in-config-fails-validation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-command-infrastructure.unknown-pattern-name-in-config-fails-validation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-command-infrastructure +--- +# Unknown pattern name in config fails validation + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Unknown pattern name in config fails validation" from architect/specs/platform/agent-command-infrastructure.feature diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-001-agent-action-handler-calls-llm-and-returns-decision.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-001-agent-action-handler-calls-llm-and-returns-decision.sdp.md new file mode 100644 index 00000000..77a89213 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-001-agent-action-handler-calls-llm-and-returns-decision.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-llm-integration.agent-action-handler-calls-llm-and-returns-decision +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-llm-integration +--- +# Agent action handler calls LLM and returns decision + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Agent action handler calls LLM and returns decision" from architect/specs/platform/agent-llm-integration.feature diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-002-on-complete-mutation-persists-decision-atomically.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-002-on-complete-mutation-persists-decision-atomically.sdp.md new file mode 100644 index 00000000..02718872 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-002-on-complete-mutation-persists-decision-atomically.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-llm-integration.on-complete-mutation-persists-decision-atomically +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-llm-integration +--- +# onComplete mutation persists decision atomically + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "onComplete mutation persists decision atomically" from architect/specs/platform/agent-llm-integration.feature diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-003-action-handler-rejects-invalid-agent-configuration.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-003-action-handler-rejects-invalid-agent-configuration.sdp.md new file mode 100644 index 00000000..3f0c050e --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-003-action-handler-rejects-invalid-agent-configuration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-llm-integration.action-handler-rejects-invalid-agent-configuration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-llm-integration +--- +# Action handler rejects invalid agent configuration + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Action handler rejects invalid agent configuration" from architect/specs/platform/agent-llm-integration.feature diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-004-llm-unavailable-propagates-error-through-retries-to-dead-letter.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-004-llm-unavailable-propagates-error-through-retries-to-dead-letter.sdp.md new file mode 100644 index 00000000..5304ec55 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-004-llm-unavailable-propagates-error-through-retries-to-dead-letter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-llm-integration.llm-unavailable-propagates-error-through-retries-to-dead-letter +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-llm-integration +--- +# LLM unavailable propagates error through retries to dead letter + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "LLM unavailable propagates error through retries to dead letter" from architect/specs/platform/agent-llm-integration.feature diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-005-action-failure-triggers-dead-letter-via-on-complete.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-005-action-failure-triggers-dead-letter-via-on-complete.sdp.md new file mode 100644 index 00000000..f2910efa --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-005-action-failure-triggers-dead-letter-via-on-complete.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-llm-integration.action-failure-triggers-dead-letter-via-on-complete +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-llm-integration +--- +# Action failure triggers dead letter via onComplete + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Action failure triggers dead letter via onComplete" from architect/specs/platform/agent-llm-integration.feature diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-006-rate-limiter-allows-llm-call-within-limits.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-006-rate-limiter-allows-llm-call-within-limits.sdp.md new file mode 100644 index 00000000..f38fd7bc --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-006-rate-limiter-allows-llm-call-within-limits.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-llm-integration.rate-limiter-allows-llm-call-within-limits +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-llm-integration +--- +# Rate limiter allows LLM call within limits + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Rate limiter allows LLM call within limits" from architect/specs/platform/agent-llm-integration.feature diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-007-rate-limiter-blocks-llm-call-when-exceeded.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-007-rate-limiter-blocks-llm-call-when-exceeded.sdp.md new file mode 100644 index 00000000..d83250ea --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-007-rate-limiter-blocks-llm-call-when-exceeded.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-llm-integration.rate-limiter-blocks-llm-call-when-exceeded +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-llm-integration +--- +# Rate limiter blocks LLM call when exceeded + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Rate limiter blocks LLM call when exceeded" from architect/specs/platform/agent-llm-integration.feature diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-008-cost-budget-exceeded-pauses-agent.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-008-cost-budget-exceeded-pauses-agent.sdp.md new file mode 100644 index 00000000..1ca8985a --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-008-cost-budget-exceeded-pauses-agent.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-llm-integration.cost-budget-exceeded-pauses-agent +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-llm-integration +--- +# Cost budget exceeded pauses agent + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Cost budget exceeded pauses agent" from architect/specs/platform/agent-llm-integration.feature diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-009-queue-overflow-triggers-dead-letter.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-009-queue-overflow-triggers-dead-letter.sdp.md new file mode 100644 index 00000000..1c077266 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-009-queue-overflow-triggers-dead-letter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-llm-integration.queue-overflow-triggers-dead-letter +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-llm-integration +--- +# Queue overflow triggers dead letter + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Queue overflow triggers dead letter" from architect/specs/platform/agent-llm-integration.feature diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-010-agent-subscription-with-on-complete-receives-completion-callbacks.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-010-agent-subscription-with-on-complete-receives-completion-callbacks.sdp.md new file mode 100644 index 00000000..50b84eb7 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-010-agent-subscription-with-on-complete-receives-completion-callbacks.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-llm-integration.agent-subscription-with-on-complete-receives-completion-callbacks +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-llm-integration +--- +# Agent subscription with onComplete receives completion callbacks + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Agent subscription with onComplete receives completion callbacks" from architect/specs/platform/agent-llm-integration.feature diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-011-failed-agent-jobs-create-dead-letters-via-on-complete.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-011-failed-agent-jobs-create-dead-letters-via-on-complete.sdp.md new file mode 100644 index 00000000..1952bba5 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-011-failed-agent-jobs-create-dead-letters-via-on-complete.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-llm-integration.failed-agent-jobs-create-dead-letters-via-on-complete +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-llm-integration +--- +# Failed agent jobs create dead letters via onComplete + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Failed agent jobs create dead letters via onComplete" from architect/specs/platform/agent-llm-integration.feature diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-012-agent-subscription-without-on-complete-uses-global-default.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-012-agent-subscription-without-on-complete-uses-global-default.sdp.md new file mode 100644 index 00000000..18a79a53 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-012-agent-subscription-without-on-complete-uses-global-default.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.agent-llm-integration.agent-subscription-without-on-complete-uses-global-default +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-llm-integration +--- +# Agent subscription without onComplete uses global default + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Agent subscription without onComplete uses global default" from architect/specs/platform/agent-llm-integration.feature diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-001-circuit-remains-closed-on-success.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-001-circuit-remains-closed-on-success.sdp.md new file mode 100644 index 00000000..830a2f1d --- /dev/null +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-001-circuit-remains-closed-on-success.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.circuit-breaker-pattern.circuit-remains-closed-on-success +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# Circuit remains closed on success + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Circuit remains closed on success" from architect/specs/platform/circuit-breaker-pattern.feature diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-002-circuit-opens-after-threshold-failures.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-002-circuit-opens-after-threshold-failures.sdp.md new file mode 100644 index 00000000..98e47a68 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-002-circuit-opens-after-threshold-failures.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.circuit-breaker-pattern.circuit-opens-after-threshold-failures +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# Circuit opens after threshold failures + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Circuit opens after threshold failures" from architect/specs/platform/circuit-breaker-pattern.feature diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-003-circuit-transitions-to-half-open-after-timeout.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-003-circuit-transitions-to-half-open-after-timeout.sdp.md new file mode 100644 index 00000000..2d258f53 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-003-circuit-transitions-to-half-open-after-timeout.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.circuit-breaker-pattern.circuit-transitions-to-half-open-after-timeout +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# Circuit transitions to half-open after timeout + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Circuit transitions to half-open after timeout" from architect/specs/platform/circuit-breaker-pattern.feature diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-004-successful-probe-closes-circuit.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-004-successful-probe-closes-circuit.sdp.md new file mode 100644 index 00000000..f260bf18 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-004-successful-probe-closes-circuit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.circuit-breaker-pattern.successful-probe-closes-circuit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# Successful probe closes circuit + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Successful probe closes circuit" from architect/specs/platform/circuit-breaker-pattern.feature diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-005-failed-probe-reopens-circuit.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-005-failed-probe-reopens-circuit.sdp.md new file mode 100644 index 00000000..6c42faf8 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-005-failed-probe-reopens-circuit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.circuit-breaker-pattern.failed-probe-reopens-circuit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# Failed probe reopens circuit + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Failed probe reopens circuit" from architect/specs/platform/circuit-breaker-pattern.feature diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-006-circuit-state-persists-across-function-calls.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-006-circuit-state-persists-across-function-calls.sdp.md new file mode 100644 index 00000000..d6b8fae5 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-006-circuit-state-persists-across-function-calls.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.circuit-breaker-pattern.circuit-state-persists-across-function-calls +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# Circuit state persists across function calls + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Circuit state persists across function calls" from architect/specs/platform/circuit-breaker-pattern.feature diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-007-non-existent-circuit-defaults-to-closed.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-007-non-existent-circuit-defaults-to-closed.sdp.md new file mode 100644 index 00000000..0189fc84 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-007-non-existent-circuit-defaults-to-closed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.circuit-breaker-pattern.non-existent-circuit-defaults-to-closed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# Non-existent circuit defaults to closed + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Non-existent circuit defaults to closed" from architect/specs/platform/circuit-breaker-pattern.feature diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-008-timeout-transitions-open-to-half-open.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-008-timeout-transitions-open-to-half-open.sdp.md new file mode 100644 index 00000000..6556f71d --- /dev/null +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-008-timeout-transitions-open-to-half-open.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.circuit-breaker-pattern.timeout-transitions-open-to-half-open +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# Timeout transitions open to half-open + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Timeout transitions open to half-open" from architect/specs/platform/circuit-breaker-pattern.feature diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-009-stale-timeout-is-ignored.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-009-stale-timeout-is-ignored.sdp.md new file mode 100644 index 00000000..50886d00 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-009-stale-timeout-is-ignored.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.circuit-breaker-pattern.stale-timeout-is-ignored +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# Stale timeout is ignored + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Stale timeout is ignored" from architect/specs/platform/circuit-breaker-pattern.feature diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-010-half-open-probe-closes-circuit-on-success.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-010-half-open-probe-closes-circuit-on-success.sdp.md new file mode 100644 index 00000000..ff215a49 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-010-half-open-probe-closes-circuit-on-success.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.circuit-breaker-pattern.half-open-probe-closes-circuit-on-success +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# Half-open probe closes circuit on success + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Half-open probe closes circuit on success" from architect/specs/platform/circuit-breaker-pattern.feature diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-011-half-open-probe-reopens-circuit-on-failure.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-011-half-open-probe-reopens-circuit-on-failure.sdp.md new file mode 100644 index 00000000..3ae8f964 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-011-half-open-probe-reopens-circuit-on-failure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.circuit-breaker-pattern.half-open-probe-reopens-circuit-on-failure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# Half-open probe reopens circuit on failure + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Half-open probe reopens circuit on failure" from architect/specs/platform/circuit-breaker-pattern.feature diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-012-open-circuit-returns-fast-failure.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-012-open-circuit-returns-fast-failure.sdp.md new file mode 100644 index 00000000..c2d51773 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-012-open-circuit-returns-fast-failure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.circuit-breaker-pattern.open-circuit-returns-fast-failure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# Open circuit returns fast failure + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Open circuit returns fast failure" from architect/specs/platform/circuit-breaker-pattern.feature diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-013-payment-circuit-opens-after-3-failures.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-013-payment-circuit-opens-after-3-failures.sdp.md new file mode 100644 index 00000000..a7f9cbe7 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-013-payment-circuit-opens-after-3-failures.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.circuit-breaker-pattern.payment-circuit-opens-after-3-failures +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# Payment circuit opens after 3 failures + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Payment circuit opens after 3 failures" from architect/specs/platform/circuit-breaker-pattern.feature diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-014-email-circuit-tolerates-more-failures.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-014-email-circuit-tolerates-more-failures.sdp.md new file mode 100644 index 00000000..93a4974e --- /dev/null +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-014-email-circuit-tolerates-more-failures.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.circuit-breaker-pattern.email-circuit-tolerates-more-failures +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# Email circuit tolerates more failures + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Email circuit tolerates more failures" from architect/specs/platform/circuit-breaker-pattern.feature diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-015-different-services-have-independent-circuits.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-015-different-services-have-independent-circuits.sdp.md new file mode 100644 index 00000000..ed90f4ac --- /dev/null +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-015-different-services-have-independent-circuits.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.circuit-breaker-pattern.different-services-have-independent-circuits +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# Different services have independent circuits + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Different services have independent circuits" from architect/specs/platform/circuit-breaker-pattern.feature diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-001-generate-process-guard-reference-at-standard-detail-level.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-001-generate-process-guard-reference-at-standard-detail-level.sdp.md new file mode 100644 index 00000000..f54fafd6 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-001-generate-process-guard-reference-at-standard-detail-level.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.codec-driven-reference-generation.generate-process-guard-reference-at-standard-detail-level +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.codec-driven-reference-generation +--- +# Generate process guard reference at standard detail level + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Generate process guard reference at standard detail level" from architect/specs/codec-driven-reference-generation.feature diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-002-generate-process-guard-reference-at-summary-detail-level.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-002-generate-process-guard-reference-at-summary-detail-level.sdp.md new file mode 100644 index 00000000..81e5dfbf --- /dev/null +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-002-generate-process-guard-reference-at-summary-detail-level.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.codec-driven-reference-generation.generate-process-guard-reference-at-summary-detail-level +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.codec-driven-reference-generation +--- +# Generate process guard reference at summary detail level + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Generate process guard reference at summary detail level" from architect/specs/codec-driven-reference-generation.feature diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-003-extract-conventions-by-tag-value.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-003-extract-conventions-by-tag-value.sdp.md new file mode 100644 index 00000000..f4736ee0 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-003-extract-conventions-by-tag-value.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.codec-driven-reference-generation.extract-conventions-by-tag-value +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.codec-driven-reference-generation +--- +# Extract conventions by tag value + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Extract conventions by tag value" from architect/specs/codec-driven-reference-generation.feature diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-004-convention-content-preserves-rule-block-structure.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-004-convention-content-preserves-rule-block-structure.sdp.md new file mode 100644 index 00000000..ed6614ed --- /dev/null +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-004-convention-content-preserves-rule-block-structure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.codec-driven-reference-generation.convention-content-preserves-rule-block-structure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.codec-driven-reference-generation +--- +# Convention content preserves Rule block structure + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Convention content preserves Rule block structure" from architect/specs/codec-driven-reference-generation.feature diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-005-no-conventions-found-for-requested-tag-values.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-005-no-conventions-found-for-requested-tag-values.sdp.md new file mode 100644 index 00000000..a498fa32 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-005-no-conventions-found-for-requested-tag-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.codec-driven-reference-generation.no-conventions-found-for-requested-tag-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.codec-driven-reference-generation +--- +# No conventions found for requested tag values + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "No conventions found for requested tag values" from architect/specs/codec-driven-reference-generation.feature diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-006-no-shape-sources-match-any-pattern-file-paths.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-006-no-shape-sources-match-any-pattern-file-paths.sdp.md new file mode 100644 index 00000000..61b8e23e --- /dev/null +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-006-no-shape-sources-match-any-pattern-file-paths.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.codec-driven-reference-generation.no-shape-sources-match-any-pattern-file-paths +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.codec-driven-reference-generation +--- +# No shape sources match any pattern file paths + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "No shape sources match any pattern file paths" from architect/specs/codec-driven-reference-generation.feature diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-007-convention-tag-matches-multiple-decision-records.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-007-convention-tag-matches-multiple-decision-records.sdp.md new file mode 100644 index 00000000..95549837 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-007-convention-tag-matches-multiple-decision-records.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.codec-driven-reference-generation.convention-tag-matches-multiple-decision-records +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.codec-driven-reference-generation +--- +# Convention tag matches multiple decision records + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Convention tag matches multiple decision records" from architect/specs/codec-driven-reference-generation.feature diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-008-dual-output-generation.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-008-dual-output-generation.sdp.md new file mode 100644 index 00000000..62fe3f40 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-008-dual-output-generation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.codec-driven-reference-generation.dual-output-generation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.codec-driven-reference-generation +--- +# Dual output generation + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Dual output generation" from architect/specs/codec-driven-reference-generation.feature diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-009-summary-compaction-quality.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-009-summary-compaction-quality.sdp.md new file mode 100644 index 00000000..db16796c --- /dev/null +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-009-summary-compaction-quality.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.codec-driven-reference-generation.summary-compaction-quality +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.codec-driven-reference-generation +--- +# Summary compaction quality + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Summary compaction quality" from architect/specs/codec-driven-reference-generation.feature diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-010-reference-generators-appear-in-available-generators-list.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-010-reference-generators-appear-in-available-generators-list.sdp.md new file mode 100644 index 00000000..33364d00 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-010-reference-generators-appear-in-available-generators-list.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.codec-driven-reference-generation.reference-generators-appear-in-available-generators-list +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.codec-driven-reference-generation +--- +# Reference generators appear in available generators list + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Reference generators appear in available generators list" from architect/specs/codec-driven-reference-generation.feature diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-011-cli-invocation-generates-reference-docs.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-011-cli-invocation-generates-reference-docs.sdp.md new file mode 100644 index 00000000..7509ab9b --- /dev/null +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-011-cli-invocation-generates-reference-docs.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.codec-driven-reference-generation.cli-invocation-generates-reference-docs +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.codec-driven-reference-generation +--- +# CLI invocation generates reference docs + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "CLI invocation generates reference docs" from architect/specs/codec-driven-reference-generation.feature diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-012-convention-tag-is-registered-in-taxonomy.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-012-convention-tag-is-registered-in-taxonomy.sdp.md new file mode 100644 index 00000000..2a4ebe17 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-012-convention-tag-is-registered-in-taxonomy.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.codec-driven-reference-generation.convention-tag-is-registered-in-taxonomy +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.codec-driven-reference-generation +--- +# Convention tag is registered in taxonomy + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Convention tag is registered in taxonomy" from architect/specs/codec-driven-reference-generation.feature diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-013-recipe-rule-block-content-preserved-in-decision-record.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-013-recipe-rule-block-content-preserved-in-decision-record.sdp.md new file mode 100644 index 00000000..4696e2a1 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-013-recipe-rule-block-content-preserved-in-decision-record.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.codec-driven-reference-generation.recipe-rule-block-content-preserved-in-decision-record +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.codec-driven-reference-generation +--- +# Recipe Rule block content preserved in decision record + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Recipe Rule block content preserved in decision record" from architect/specs/codec-driven-reference-generation.feature diff --git a/specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-001-auth-remediation-is-not-split-by-mutation-family.sdp.md b/specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-001-auth-remediation-is-not-split-by-mutation-family.sdp.md new file mode 100644 index 00000000..8bd03675 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-001-auth-remediation-is-not-split-by-mutation-family.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.component-boundary-authentication-convention.auth-remediation-is-not-split-by-mutation-family +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.component-boundary-authentication-convention +--- +# Auth remediation is not split by mutation family + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Auth remediation is not split by mutation family" from architect/specs/platform/component-boundary-authentication-convention.feature diff --git a/specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-by-default.sdp.md b/specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-by-default.sdp.md new file mode 100644 index 00000000..de472ee2 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-by-default.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.component-boundary-authentication-convention.missing-or-forged-proof-is-rejected-by-default +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.component-boundary-authentication-convention +--- +# Missing or forged proof is rejected by default + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Missing or forged proof is rejected by default" from architect/specs/platform/component-boundary-authentication-convention.feature diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-001-cancel-a-confirmed-order.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-001-cancel-a-confirmed-order.sdp.md new file mode 100644 index 00000000..edd1869b --- /dev/null +++ b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-001-cancel-a-confirmed-order.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.confirmed-order-cancellation.cancel-a-confirmed-order +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.confirmed-order-cancellation +--- +# Cancel a confirmed order + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Cancel a confirmed order" from architect/specs/platform/confirmed-order-cancellation.feature diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-002-cannot-cancel-already-cancelled-order-unchanged-behavior.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-002-cannot-cancel-already-cancelled-order-unchanged-behavior.sdp.md new file mode 100644 index 00000000..7fa02e4b --- /dev/null +++ b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-002-cannot-cancel-already-cancelled-order-unchanged-behavior.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.confirmed-order-cancellation.cannot-cancel-already-cancelled-order-unchanged-behavior +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.confirmed-order-cancellation +--- +# Cannot cancel already cancelled order (unchanged behavior) + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Cannot cancel already cancelled order (unchanged behavior)" from architect/specs/platform/confirmed-order-cancellation.feature diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-003-order-cancelled-evolves-confirmed-state-to-cancelled.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-003-order-cancelled-evolves-confirmed-state-to-cancelled.sdp.md new file mode 100644 index 00000000..988a6b75 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-003-order-cancelled-evolves-confirmed-state-to-cancelled.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.confirmed-order-cancellation.order-cancelled-evolves-confirmed-state-to-cancelled +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.confirmed-order-cancellation +--- +# OrderCancelled evolves confirmed state to cancelled + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "OrderCancelled evolves confirmed state to cancelled" from architect/specs/platform/confirmed-order-cancellation.feature diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-004-reservation-is-released-after-confirmed-order-cancellation.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-004-reservation-is-released-after-confirmed-order-cancellation.sdp.md new file mode 100644 index 00000000..522a4b4d --- /dev/null +++ b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-004-reservation-is-released-after-confirmed-order-cancellation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.confirmed-order-cancellation.reservation-is-released-after-confirmed-order-cancellation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.confirmed-order-cancellation +--- +# Reservation is released after confirmed order cancellation + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Reservation is released after confirmed order cancellation" from architect/specs/platform/confirmed-order-cancellation.feature diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-005-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-005-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md new file mode 100644 index 00000000..1fec22f1 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-005-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.confirmed-order-cancellation.cancelling-draft-order-does-not-trigger-reservation-release +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.confirmed-order-cancellation +--- +# Cancelling draft order does not trigger reservation release + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Cancelling draft order does not trigger reservation release" from architect/specs/platform/confirmed-order-cancellation.feature diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-006-cancelling-submitted-order-with-pending-reservation-releases-it.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-006-cancelling-submitted-order-with-pending-reservation-releases-it.sdp.md new file mode 100644 index 00000000..a6fe6f38 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-006-cancelling-submitted-order-with-pending-reservation-releases-it.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.confirmed-order-cancellation.cancelling-submitted-order-with-pending-reservation-releases-it +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.confirmed-order-cancellation +--- +# Cancelling submitted order with pending reservation releases it + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Cancelling submitted order with pending reservation releases it" from architect/specs/platform/confirmed-order-cancellation.feature diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-007-pm-is-idempotent-for-duplicate-order-cancelled-events.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-007-pm-is-idempotent-for-duplicate-order-cancelled-events.sdp.md new file mode 100644 index 00000000..ac82624e --- /dev/null +++ b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-007-pm-is-idempotent-for-duplicate-order-cancelled-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.confirmed-order-cancellation.pm-is-idempotent-for-duplicate-order-cancelled-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.confirmed-order-cancellation +--- +# PM is idempotent for duplicate OrderCancelled events + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "PM is idempotent for duplicate OrderCancelled events" from architect/specs/platform/confirmed-order-cancellation.feature diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-008-three-cancellations-trigger-churn-risk-agent.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-008-three-cancellations-trigger-churn-risk-agent.sdp.md new file mode 100644 index 00000000..55f43312 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-008-three-cancellations-trigger-churn-risk-agent.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.confirmed-order-cancellation.three-cancellations-trigger-churn-risk-agent +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.confirmed-order-cancellation +--- +# Three cancellations trigger churn risk agent + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Three cancellations trigger churn risk agent" from architect/specs/platform/confirmed-order-cancellation.feature diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-001-same-email-produces-same-stream-id.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-001-same-email-produces-same-stream-id.sdp.md new file mode 100644 index 00000000..5aadfe7f --- /dev/null +++ b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-001-same-email-produces-same-stream-id.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.deterministic-id-hashing.same-email-produces-same-stream-id +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.deterministic-id-hashing +--- +# Same email produces same stream ID + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Same email produces same stream ID" from architect/specs/platform/deterministic-id-hashing.feature diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-002-composite-key-produces-consistent-hash.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-002-composite-key-produces-consistent-hash.sdp.md new file mode 100644 index 00000000..292b966b --- /dev/null +++ b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-002-composite-key-produces-consistent-hash.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.deterministic-id-hashing.composite-key-produces-consistent-hash +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.deterministic-id-hashing +--- +# Composite key produces consistent hash + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Composite key produces consistent hash" from architect/specs/platform/deterministic-id-hashing.feature diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-003-different-emails-produce-different-stream-i-ds.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-003-different-emails-produce-different-stream-i-ds.sdp.md new file mode 100644 index 00000000..af4a03d7 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-003-different-emails-produce-different-stream-i-ds.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.deterministic-id-hashing.different-emails-produce-different-stream-i-ds +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.deterministic-id-hashing +--- +# Different emails produce different stream IDs + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Different emails produce different stream IDs" from architect/specs/platform/deterministic-id-hashing.feature diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-004-first-create-succeeds.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-004-first-create-succeeds.sdp.md new file mode 100644 index 00000000..9aeb5d11 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-004-first-create-succeeds.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.deterministic-id-hashing.first-create-succeeds +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.deterministic-id-hashing +--- +# First create succeeds + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "First create succeeds" from architect/specs/platform/deterministic-id-hashing.feature diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-005-second-create-fails-with-conflict.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-005-second-create-fails-with-conflict.sdp.md new file mode 100644 index 00000000..3b72801b --- /dev/null +++ b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-005-second-create-fails-with-conflict.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.deterministic-id-hashing.second-create-fails-with-conflict +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.deterministic-id-hashing +--- +# Second create fails with conflict + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Second create fails with conflict" from architect/specs/platform/deterministic-id-hashing.feature diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-006-concurrent-creates-exactly-one-succeeds.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-006-concurrent-creates-exactly-one-succeeds.sdp.md new file mode 100644 index 00000000..6ccbad24 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-006-concurrent-creates-exactly-one-succeeds.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.deterministic-id-hashing.concurrent-creates-exactly-one-succeeds +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.deterministic-id-hashing +--- +# Concurrent creates - exactly one succeeds + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Concurrent creates - exactly one succeeds" from architect/specs/platform/deterministic-id-hashing.feature diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-007-hash-output-is-url-safe.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-007-hash-output-is-url-safe.sdp.md new file mode 100644 index 00000000..6b31ffef --- /dev/null +++ b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-007-hash-output-is-url-safe.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.deterministic-id-hashing.hash-output-is-url-safe +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.deterministic-id-hashing +--- +# Hash output is URL-safe + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Hash output is URL-safe" from architect/specs/platform/deterministic-id-hashing.feature diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-008-hash-is-not-reversible.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-008-hash-is-not-reversible.sdp.md new file mode 100644 index 00000000..8365b173 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-008-hash-is-not-reversible.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.deterministic-id-hashing.hash-is-not-reversible +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.deterministic-id-hashing +--- +# Hash is not reversible + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Hash is not reversible" from architect/specs/platform/deterministic-id-hashing.feature diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-009-pattern-selection-by-use-case.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-009-pattern-selection-by-use-case.sdp.md new file mode 100644 index 00000000..c436f20d --- /dev/null +++ b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-009-pattern-selection-by-use-case.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.deterministic-id-hashing.pattern-selection-by-use-case +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.deterministic-id-hashing +--- +# Pattern selection by use case + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Pattern selection by use case" from architect/specs/platform/deterministic-id-hashing.feature diff --git a/specs/unimplemented/architect-scenarios/epic-process-enhancements/s-001-specs-can-evolve-independently-of-phases.sdp.md b/specs/unimplemented/architect-scenarios/epic-process-enhancements/s-001-specs-can-evolve-independently-of-phases.sdp.md new file mode 100644 index 00000000..b887177e --- /dev/null +++ b/specs/unimplemented/architect-scenarios/epic-process-enhancements/s-001-specs-can-evolve-independently-of-phases.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.epic-process-enhancements.specs-can-evolve-independently-of-phases +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.epic-process-enhancements +--- +# Specs can evolve independently of phases + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Specs can evolve independently of phases" from architect/specs/epic-process-enhancements.feature diff --git a/specs/unimplemented/architect-scenarios/epic-process-enhancements/s-002-type-script-phase-files-link-specs-to-releases.sdp.md b/specs/unimplemented/architect-scenarios/epic-process-enhancements/s-002-type-script-phase-files-link-specs-to-releases.sdp.md new file mode 100644 index 00000000..fe1be132 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/epic-process-enhancements/s-002-type-script-phase-files-link-specs-to-releases.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.epic-process-enhancements.type-script-phase-files-link-specs-to-releases +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.epic-process-enhancements +--- +# TypeScript phase files link specs to releases + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "TypeScript phase files link specs to releases" from architect/specs/epic-process-enhancements.feature diff --git a/specs/unimplemented/architect-scenarios/event-correctness-migration/s-001-event-correctness-packet-starts-from-decisions-and-inventory.sdp.md b/specs/unimplemented/architect-scenarios/event-correctness-migration/s-001-event-correctness-packet-starts-from-decisions-and-inventory.sdp.md new file mode 100644 index 00000000..f3a95813 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/event-correctness-migration/s-001-event-correctness-packet-starts-from-decisions-and-inventory.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.event-correctness-migration.event-correctness-packet-starts-from-decisions-and-inventory +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.event-correctness-migration +--- +# Event correctness packet starts from decisions and inventory + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Event correctness packet starts from decisions and inventory" from architect/specs/platform/event-correctness-migration.feature diff --git a/specs/unimplemented/architect-scenarios/event-correctness-migration/s-002-old-and-new-checkpoint-formats-are-handled-explicitly.sdp.md b/specs/unimplemented/architect-scenarios/event-correctness-migration/s-002-old-and-new-checkpoint-formats-are-handled-explicitly.sdp.md new file mode 100644 index 00000000..7830e640 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/event-correctness-migration/s-002-old-and-new-checkpoint-formats-are-handled-explicitly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.event-correctness-migration.old-and-new-checkpoint-formats-are-handled-explicitly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.event-correctness-migration +--- +# Old and new checkpoint formats are handled explicitly + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Old and new checkpoint formats are handled explicitly" from architect/specs/platform/event-correctness-migration.feature diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-001-readiness-probe-returns-healthy-when-all-components-ok.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-001-readiness-probe-returns-healthy-when-all-components-ok.sdp.md new file mode 100644 index 00000000..8911c1a3 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/health-observability/s-001-readiness-probe-returns-healthy-when-all-components-ok.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.health-observability.readiness-probe-returns-healthy-when-all-components-ok +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# Readiness probe returns healthy when all components OK + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Readiness probe returns healthy when all components OK" from architect/specs/platform/health-observability.feature diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-002-readiness-probe-returns-unhealthy-on-projection-lag.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-002-readiness-probe-returns-unhealthy-on-projection-lag.sdp.md new file mode 100644 index 00000000..850f3836 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/health-observability/s-002-readiness-probe-returns-unhealthy-on-projection-lag.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.health-observability.readiness-probe-returns-unhealthy-on-projection-lag +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# Readiness probe returns unhealthy on projection lag + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Readiness probe returns unhealthy on projection lag" from architect/specs/platform/health-observability.feature diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-003-liveness-probe-always-returns-alive.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-003-liveness-probe-always-returns-alive.sdp.md new file mode 100644 index 00000000..0f3ec0cd --- /dev/null +++ b/specs/unimplemented/architect-scenarios/health-observability/s-003-liveness-probe-always-returns-alive.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.health-observability.liveness-probe-always-returns-alive +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# Liveness probe always returns alive + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Liveness probe always returns alive" from architect/specs/platform/health-observability.feature diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-004-workpool-backlog-fails-readiness.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-004-workpool-backlog-fails-readiness.sdp.md new file mode 100644 index 00000000..91b45517 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/health-observability/s-004-workpool-backlog-fails-readiness.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.health-observability.workpool-backlog-fails-readiness +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# Workpool backlog fails readiness + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Workpool backlog fails readiness" from architect/specs/platform/health-observability.feature diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-005-normal-queue-depth-passes-readiness.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-005-normal-queue-depth-passes-readiness.sdp.md new file mode 100644 index 00000000..e0e3372e --- /dev/null +++ b/specs/unimplemented/architect-scenarios/health-observability/s-005-normal-queue-depth-passes-readiness.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.health-observability.normal-queue-depth-passes-readiness +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# Normal queue depth passes readiness + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Normal queue depth passes readiness" from architect/specs/platform/health-observability.feature diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-006-projection-lag-is-calculated-correctly.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-006-projection-lag-is-calculated-correctly.sdp.md new file mode 100644 index 00000000..3d7203dd --- /dev/null +++ b/specs/unimplemented/architect-scenarios/health-observability/s-006-projection-lag-is-calculated-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.health-observability.projection-lag-is-calculated-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# Projection lag is calculated correctly + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Projection lag is calculated correctly" from architect/specs/platform/health-observability.feature diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-007-missing-checkpoint-treated-as-maximum-lag.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-007-missing-checkpoint-treated-as-maximum-lag.sdp.md new file mode 100644 index 00000000..f744ee79 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/health-observability/s-007-missing-checkpoint-treated-as-maximum-lag.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.health-observability.missing-checkpoint-treated-as-maximum-lag +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# Missing checkpoint treated as maximum lag + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Missing checkpoint treated as maximum lag" from architect/specs/platform/health-observability.feature diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-008-zero-lag-is-healthy.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-008-zero-lag-is-healthy.sdp.md new file mode 100644 index 00000000..347f4819 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/health-observability/s-008-zero-lag-is-healthy.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.health-observability.zero-lag-is-healthy +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# Zero lag is healthy + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Zero lag is healthy" from architect/specs/platform/health-observability.feature diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-009-metrics-collection-gathers-all-dimensions.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-009-metrics-collection-gathers-all-dimensions.sdp.md new file mode 100644 index 00000000..55ea9892 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/health-observability/s-009-metrics-collection-gathers-all-dimensions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.health-observability.metrics-collection-gathers-all-dimensions +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# Metrics collection gathers all dimensions + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Metrics collection gathers all dimensions" from architect/specs/platform/health-observability.feature diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-010-metrics-emitted-as-json-for-log-streams.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-010-metrics-emitted-as-json-for-log-streams.sdp.md new file mode 100644 index 00000000..82bfd67c --- /dev/null +++ b/specs/unimplemented/architect-scenarios/health-observability/s-010-metrics-emitted-as-json-for-log-streams.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.health-observability.metrics-emitted-as-json-for-log-streams +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# Metrics emitted as JSON for Log Streams + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Metrics emitted as JSON for Log Streams" from architect/specs/platform/health-observability.feature diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-011-metrics-collection-handles-empty-state.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-011-metrics-collection-handles-empty-state.sdp.md new file mode 100644 index 00000000..acde1bf2 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/health-observability/s-011-metrics-collection-handles-empty-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.health-observability.metrics-collection-handles-empty-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# Metrics collection handles empty state + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Metrics collection handles empty state" from architect/specs/platform/health-observability.feature diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-012-all-components-healthy-yields-healthy-system.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-012-all-components-healthy-yields-healthy-system.sdp.md new file mode 100644 index 00000000..48afa1d8 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/health-observability/s-012-all-components-healthy-yields-healthy-system.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.health-observability.all-components-healthy-yields-healthy-system +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# All components healthy yields healthy system + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "All components healthy yields healthy system" from architect/specs/platform/health-observability.feature diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-013-single-unhealthy-component-makes-system-unhealthy.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-013-single-unhealthy-component-makes-system-unhealthy.sdp.md new file mode 100644 index 00000000..df1b232d --- /dev/null +++ b/specs/unimplemented/architect-scenarios/health-observability/s-013-single-unhealthy-component-makes-system-unhealthy.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.health-observability.single-unhealthy-component-makes-system-unhealthy +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# Single unhealthy component makes system unhealthy + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Single unhealthy component makes system unhealthy" from architect/specs/platform/health-observability.feature diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-014-degraded-component-yields-degraded-system.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-014-degraded-component-yields-degraded-system.sdp.md new file mode 100644 index 00000000..c689630a --- /dev/null +++ b/specs/unimplemented/architect-scenarios/health-observability/s-014-degraded-component-yields-degraded-system.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.health-observability.degraded-component-yields-degraded-system +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# Degraded component yields degraded system + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Degraded component yields degraded system" from architect/specs/platform/health-observability.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-001-context-map-shows-bc-topology.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-001-context-map-shows-bc-topology.sdp.md new file mode 100644 index 00000000..11fae569 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-001-context-map-shows-bc-topology.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21a.context-map-shows-bc-topology +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# Context Map shows BC topology + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Context Map shows BC topology" from architect/specs/platform/integration-patterns-21a.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-002-register-partnership-relationship.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-002-register-partnership-relationship.sdp.md new file mode 100644 index 00000000..41e67c33 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-002-register-partnership-relationship.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21a.register-partnership-relationship +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# Register Partnership relationship + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Register Partnership relationship" from architect/specs/platform/integration-patterns-21a.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-003-register-shared-kernel-relationship.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-003-register-shared-kernel-relationship.sdp.md new file mode 100644 index 00000000..a28b17a7 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-003-register-shared-kernel-relationship.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21a.register-shared-kernel-relationship +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# Register Shared Kernel relationship + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Register Shared Kernel relationship" from architect/specs/platform/integration-patterns-21a.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-004-register-open-host-service-relationship.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-004-register-open-host-service-relationship.sdp.md new file mode 100644 index 00000000..00c96678 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-004-register-open-host-service-relationship.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21a.register-open-host-service-relationship +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# Register Open Host Service relationship + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Register Open Host Service relationship" from architect/specs/platform/integration-patterns-21a.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-005-duplicate-relationship-is-rejected.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-005-duplicate-relationship-is-rejected.sdp.md new file mode 100644 index 00000000..b6d62a2b --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-005-duplicate-relationship-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21a.duplicate-relationship-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# Duplicate relationship is rejected + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Duplicate relationship is rejected" from architect/specs/platform/integration-patterns-21a.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-006-self-referential-relationship-is-rejected.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-006-self-referential-relationship-is-rejected.sdp.md new file mode 100644 index 00000000..67790a6d --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-006-self-referential-relationship-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21a.self-referential-relationship-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# Self-referential relationship is rejected + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Self-referential relationship is rejected" from architect/specs/platform/integration-patterns-21a.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-007-integration-event-uses-published-language.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-007-integration-event-uses-published-language.sdp.md new file mode 100644 index 00000000..8eac4cd1 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-007-integration-event-uses-published-language.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21a.integration-event-uses-published-language +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# Integration event uses Published Language + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Integration event uses Published Language" from architect/specs/platform/integration-patterns-21a.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-008-event-tagging-for-routing-and-dcb.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-008-event-tagging-for-routing-and-dcb.sdp.md new file mode 100644 index 00000000..da4f5b8a --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-008-event-tagging-for-routing-and-dcb.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21a.event-tagging-for-routing-and-dcb +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# Event tagging for routing and DCB + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Event tagging for routing and DCB" from architect/specs/platform/integration-patterns-21a.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-009-schema-compatibility-mode-is-enforced.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-009-schema-compatibility-mode-is-enforced.sdp.md new file mode 100644 index 00000000..f5020138 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-009-schema-compatibility-mode-is-enforced.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21a.schema-compatibility-mode-is-enforced +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# Schema compatibility mode is enforced + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Schema compatibility mode is enforced" from architect/specs/platform/integration-patterns-21a.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-010-register-schema-with-compatibility-mode.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-010-register-schema-with-compatibility-mode.sdp.md new file mode 100644 index 00000000..9816623a --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-010-register-schema-with-compatibility-mode.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21a.register-schema-with-compatibility-mode +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# Register schema with compatibility mode + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Register schema with compatibility mode" from architect/specs/platform/integration-patterns-21a.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-011-unregistered-event-type-fails-conversion.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-011-unregistered-event-type-fails-conversion.sdp.md new file mode 100644 index 00000000..b9d846a8 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-011-unregistered-event-type-fails-conversion.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21a.unregistered-event-type-fails-conversion +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# Unregistered event type fails conversion + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Unregistered event type fails conversion" from architect/specs/platform/integration-patterns-21a.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-012-invalid-payload-fails-schema-validation.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-012-invalid-payload-fails-schema-validation.sdp.md new file mode 100644 index 00000000..988cb12a --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-012-invalid-payload-fails-schema-validation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21a.invalid-payload-fails-schema-validation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# Invalid payload fails schema validation + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Invalid payload fails schema validation" from architect/specs/platform/integration-patterns-21a.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-013-acl-translates-external-system-response.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-013-acl-translates-external-system-response.sdp.md new file mode 100644 index 00000000..155d7ace --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-013-acl-translates-external-system-response.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21a.acl-translates-external-system-response +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# ACL translates external system response + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "ACL translates external system response" from architect/specs/platform/integration-patterns-21a.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-014-acl-handles-bidirectional-translation.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-014-acl-handles-bidirectional-translation.sdp.md new file mode 100644 index 00000000..002063a8 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-014-acl-handles-bidirectional-translation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21a.acl-handles-bidirectional-translation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# ACL handles bidirectional translation + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "ACL handles bidirectional translation" from architect/specs/platform/integration-patterns-21a.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-015-acl-validates-external-input.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-015-acl-validates-external-input.sdp.md new file mode 100644 index 00000000..6452107b --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-015-acl-validates-external-input.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21a.acl-validates-external-input +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# ACL validates external input + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "ACL validates external input" from architect/specs/platform/integration-patterns-21a.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-016-acl-rejects-unmapped-values.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-016-acl-rejects-unmapped-values.sdp.md new file mode 100644 index 00000000..a24c2bd5 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-016-acl-rejects-unmapped-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21a.acl-rejects-unmapped-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# ACL rejects unmapped values + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "ACL rejects unmapped values" from architect/specs/platform/integration-patterns-21a.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-001-v1-consumer-receives-v2-event.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-001-v1-consumer-receives-v2-event.sdp.md new file mode 100644 index 00000000..d481cec1 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-001-v1-consumer-receives-v2-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21b.v1-consumer-receives-v2-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# V1 consumer receives V2 event + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "V1 consumer receives V2 event" from architect/specs/platform/integration-patterns-21b.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-002-upcast-historical-events.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-002-upcast-historical-events.sdp.md new file mode 100644 index 00000000..2ad17e5a --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-002-upcast-historical-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21b.upcast-historical-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Upcast historical events + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Upcast historical events" from architect/specs/platform/integration-patterns-21b.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-003-chain-upcasters-for-multi-version-migration.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-003-chain-upcasters-for-multi-version-migration.sdp.md new file mode 100644 index 00000000..0aed7653 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-003-chain-upcasters-for-multi-version-migration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21b.chain-upcasters-for-multi-version-migration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Chain upcasters for multi-version migration + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Chain upcasters for multi-version migration" from architect/specs/platform/integration-patterns-21b.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-004-upcast-adds-computed-field.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-004-upcast-adds-computed-field.sdp.md new file mode 100644 index 00000000..9bc5e500 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-004-upcast-adds-computed-field.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21b.upcast-adds-computed-field +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Upcast adds computed field + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Upcast adds computed field" from architect/specs/platform/integration-patterns-21b.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-005-incompatible-schema-change-is-rejected.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-005-incompatible-schema-change-is-rejected.sdp.md new file mode 100644 index 00000000..7f060178 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-005-incompatible-schema-change-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21b.incompatible-schema-change-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Incompatible schema change is rejected + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Incompatible schema change is rejected" from architect/specs/platform/integration-patterns-21b.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-006-breaking-change-without-migration.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-006-breaking-change-without-migration.sdp.md new file mode 100644 index 00000000..bb200d73 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-006-breaking-change-without-migration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21b.breaking-change-without-migration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Breaking change without migration + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Breaking change without migration" from architect/specs/platform/integration-patterns-21b.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-007-contract-test-validates-schema-compatibility.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-007-contract-test-validates-schema-compatibility.sdp.md new file mode 100644 index 00000000..fbfb94fd --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-007-contract-test-validates-schema-compatibility.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21b.contract-test-validates-schema-compatibility +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Contract test validates schema compatibility + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Contract test validates schema compatibility" from architect/specs/platform/integration-patterns-21b.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-008-contract-sample-generation.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-008-contract-sample-generation.sdp.md new file mode 100644 index 00000000..236f1c4d --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-008-contract-sample-generation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21b.contract-sample-generation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Contract sample generation + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Contract sample generation" from architect/specs/platform/integration-patterns-21b.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-009-generate-multiple-unique-samples.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-009-generate-multiple-unique-samples.sdp.md new file mode 100644 index 00000000..ffbf7445 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-009-generate-multiple-unique-samples.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21b.generate-multiple-unique-samples +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Generate multiple unique samples + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Generate multiple unique samples" from architect/specs/platform/integration-patterns-21b.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-010-producer-contract-test-utility.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-010-producer-contract-test-utility.sdp.md new file mode 100644 index 00000000..8635430c --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-010-producer-contract-test-utility.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21b.producer-contract-test-utility +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Producer contract test utility + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Producer contract test utility" from architect/specs/platform/integration-patterns-21b.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-011-consumer-contract-test-utility.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-011-consumer-contract-test-utility.sdp.md new file mode 100644 index 00000000..dc1317ce --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-011-consumer-contract-test-utility.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21b.consumer-contract-test-utility +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Consumer contract test utility + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Consumer contract test utility" from architect/specs/platform/integration-patterns-21b.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-012-compatible-producer-and-consumer-verified.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-012-compatible-producer-and-consumer-verified.sdp.md new file mode 100644 index 00000000..d3f25bd9 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-012-compatible-producer-and-consumer-verified.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21b.compatible-producer-and-consumer-verified +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Compatible producer and consumer verified + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Compatible producer and consumer verified" from architect/specs/platform/integration-patterns-21b.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-013-compatible-with-downcaster.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-013-compatible-with-downcaster.sdp.md new file mode 100644 index 00000000..c904ca13 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-013-compatible-with-downcaster.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21b.compatible-with-downcaster +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Compatible with downcaster + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Compatible with downcaster" from architect/specs/platform/integration-patterns-21b.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-014-detect-producer-consumer-mismatch.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-014-detect-producer-consumer-mismatch.sdp.md new file mode 100644 index 00000000..5eda6da4 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-014-detect-producer-consumer-mismatch.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21b.detect-producer-consumer-mismatch +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Detect producer-consumer mismatch + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Detect producer-consumer mismatch" from architect/specs/platform/integration-patterns-21b.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-015-contract-violation-is-recorded.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-015-contract-violation-is-recorded.sdp.md new file mode 100644 index 00000000..844b01c6 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-015-contract-violation-is-recorded.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21b.contract-violation-is-recorded +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Contract violation is recorded + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Contract violation is recorded" from architect/specs/platform/integration-patterns-21b.feature diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-016-contract-violations-are-queryable.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-016-contract-violations-are-queryable.sdp.md new file mode 100644 index 00000000..283aebe6 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-016-contract-violations-are-queryable.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.integration-patterns-21b.contract-violations-are-queryable +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Contract violations are queryable + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Contract violations are queryable" from architect/specs/platform/integration-patterns-21b.feature diff --git a/specs/unimplemented/architect-scenarios/package-architecture/s-001-platform-fsm-has-no-dependencies.sdp.md b/specs/unimplemented/architect-scenarios/package-architecture/s-001-platform-fsm-has-no-dependencies.sdp.md new file mode 100644 index 00000000..6be7b567 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/package-architecture/s-001-platform-fsm-has-no-dependencies.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.package-architecture.platform-fsm-has-no-dependencies +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.package-architecture +--- +# platform-fsm has no dependencies + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "platform-fsm has no dependencies" from architect/specs/platform/package-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/package-architecture/s-002-platform-decider-depends-only-on-platform-fsm.sdp.md b/specs/unimplemented/architect-scenarios/package-architecture/s-002-platform-decider-depends-only-on-platform-fsm.sdp.md new file mode 100644 index 00000000..5a24d03f --- /dev/null +++ b/specs/unimplemented/architect-scenarios/package-architecture/s-002-platform-decider-depends-only-on-platform-fsm.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.package-architecture.platform-decider-depends-only-on-platform-fsm +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.package-architecture +--- +# platform-decider depends only on platform-fsm + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "platform-decider depends only on platform-fsm" from architect/specs/platform/package-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/package-architecture/s-003-decider-package-is-independently-usable.sdp.md b/specs/unimplemented/architect-scenarios/package-architecture/s-003-decider-package-is-independently-usable.sdp.md new file mode 100644 index 00000000..272329bd --- /dev/null +++ b/specs/unimplemented/architect-scenarios/package-architecture/s-003-decider-package-is-independently-usable.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.package-architecture.decider-package-is-independently-usable +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.package-architecture +--- +# Decider package is independently usable + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Decider package is independently usable" from architect/specs/platform/package-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/package-architecture/s-004-packages-are-independently-publishable.sdp.md b/specs/unimplemented/architect-scenarios/package-architecture/s-004-packages-are-independently-publishable.sdp.md new file mode 100644 index 00000000..571cda0d --- /dev/null +++ b/specs/unimplemented/architect-scenarios/package-architecture/s-004-packages-are-independently-publishable.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.package-architecture.packages-are-independently-publishable +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.package-architecture +--- +# Packages are independently publishable + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Packages are independently publishable" from architect/specs/platform/package-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/package-architecture/s-005-framework-tests-live-in-framework-packages.sdp.md b/specs/unimplemented/architect-scenarios/package-architecture/s-005-framework-tests-live-in-framework-packages.sdp.md new file mode 100644 index 00000000..e63eba81 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/package-architecture/s-005-framework-tests-live-in-framework-packages.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.package-architecture.framework-tests-live-in-framework-packages +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.package-architecture +--- +# Framework tests live in framework packages + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Framework tests live in framework packages" from architect/specs/platform/package-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/package-architecture/s-006-existing-imports-continue-to-work.sdp.md b/specs/unimplemented/architect-scenarios/package-architecture/s-006-existing-imports-continue-to-work.sdp.md new file mode 100644 index 00000000..369ca71a --- /dev/null +++ b/specs/unimplemented/architect-scenarios/package-architecture/s-006-existing-imports-continue-to-work.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.package-architecture.existing-imports-continue-to-work +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.package-architecture +--- +# Existing imports continue to work + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Existing imports continue to work" from architect/specs/platform/package-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/package-architecture/s-007-platform-namespace-avoids-conflicts.sdp.md b/specs/unimplemented/architect-scenarios/package-architecture/s-007-platform-namespace-avoids-conflicts.sdp.md new file mode 100644 index 00000000..23968707 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/package-architecture/s-007-platform-namespace-avoids-conflicts.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.package-architecture.platform-namespace-avoids-conflicts +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.package-architecture +--- +# Platform namespace avoids conflicts + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Platform namespace avoids conflicts" from architect/specs/platform/package-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-001-pd-rs-appear-in-generated-decisions-md.sdp.md b/specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-001-pd-rs-appear-in-generated-decisions-md.sdp.md new file mode 100644 index 00000000..70ef14ec --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-001-pd-rs-appear-in-generated-decisions-md.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-001-process-decisions-folder.pd-rs-appear-in-generated-decisions-md +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-001-process-decisions-folder +--- +# PDRs appear in generated DECISIONS.md + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "PDRs appear in generated DECISIONS.md" from architect/decisions/pdr-001-process-decisions-folder.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-002-pdr-numbering-is-independent-from-package-ad-rs.sdp.md b/specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-002-pdr-numbering-is-independent-from-package-ad-rs.sdp.md new file mode 100644 index 00000000..fce066aa --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-002-pdr-numbering-is-independent-from-package-ad-rs.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-001-process-decisions-folder.pdr-numbering-is-independent-from-package-ad-rs +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-001-process-decisions-folder +--- +# PDR numbering is independent from package ADRs + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "PDR numbering is independent from package ADRs" from architect/decisions/pdr-001-process-decisions-folder.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-001-minimal-release-file-structure.sdp.md b/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-001-minimal-release-file-structure.sdp.md new file mode 100644 index 00000000..a5659d70 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-001-minimal-release-file-structure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-002-release-management-architecture.minimal-release-file-structure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-002-release-management-architecture +--- +# Minimal release file structure + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Minimal release file structure" from architect/decisions/pdr-002-release-management-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-002-pdr-tagged-with-release-version.sdp.md b/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-002-pdr-tagged-with-release-version.sdp.md new file mode 100644 index 00000000..fe91d9dd --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-002-pdr-tagged-with-release-version.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-002-release-management-architecture.pdr-tagged-with-release-version +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-002-release-management-architecture +--- +# PDR tagged with release version + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "PDR tagged with release version" from architect/decisions/pdr-002-release-management-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-003-changelog-generation-from-scattered-tags.sdp.md b/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-003-changelog-generation-from-scattered-tags.sdp.md new file mode 100644 index 00000000..e1fce995 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-003-changelog-generation-from-scattered-tags.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-002-release-management-architecture.changelog-generation-from-scattered-tags +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-002-release-management-architecture +--- +# Changelog generation from scattered tags + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Changelog generation from scattered tags" from architect/decisions/pdr-002-release-management-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-001-specs-and-type-script-phase-files-are-separate.sdp.md b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-001-specs-and-type-script-phase-files-are-separate.sdp.md new file mode 100644 index 00000000..d4a61a40 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-001-specs-and-type-script-phase-files-are-separate.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-003-behavior-feature-file-structure.specs-and-type-script-phase-files-are-separate +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-003-behavior-feature-file-structure +--- +# Specs and TypeScript phase files are separate + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Specs and TypeScript phase files are separate" from architect/decisions/pdr-003-behavior-feature-file-structure.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-002-spec-files-use-semantic-tags-only.sdp.md b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-002-spec-files-use-semantic-tags-only.sdp.md new file mode 100644 index 00000000..f35de2be --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-002-spec-files-use-semantic-tags-only.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-003-behavior-feature-file-structure.spec-files-use-semantic-tags-only +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-003-behavior-feature-file-structure +--- +# Spec files use semantic tags only + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Spec files use semantic tags only" from architect/decisions/pdr-003-behavior-feature-file-structure.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-003-type-script-phase-files-centralize-release-information.sdp.md b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-003-type-script-phase-files-centralize-release-information.sdp.md new file mode 100644 index 00000000..522818ac --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-003-type-script-phase-files-centralize-release-information.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-003-behavior-feature-file-structure.type-script-phase-files-centralize-release-information +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-003-behavior-feature-file-structure +--- +# TypeScript phase files centralize release information + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "TypeScript phase files centralize release information" from architect/decisions/pdr-003-behavior-feature-file-structure.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-004-specs-can-evolve-independently-of-phases.sdp.md b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-004-specs-can-evolve-independently-of-phases.sdp.md new file mode 100644 index 00000000..800314fb --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-004-specs-can-evolve-independently-of-phases.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-003-behavior-feature-file-structure.specs-can-evolve-independently-of-phases +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-003-behavior-feature-file-structure +--- +# Specs can evolve independently of phases + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Specs can evolve independently of phases" from architect/decisions/pdr-003-behavior-feature-file-structure.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-005-no-release-references-in-spec-data-tables.sdp.md b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-005-no-release-references-in-spec-data-tables.sdp.md new file mode 100644 index 00000000..8ce8257e --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-005-no-release-references-in-spec-data-tables.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-003-behavior-feature-file-structure.no-release-references-in-spec-data-tables +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-003-behavior-feature-file-structure +--- +# No release references in spec DataTables + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "No release references in spec DataTables" from architect/decisions/pdr-003-behavior-feature-file-structure.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-006-type-script-phase-files-support-process-metadata.sdp.md b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-006-type-script-phase-files-support-process-metadata.sdp.md new file mode 100644 index 00000000..eea8cbd1 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-006-type-script-phase-files-support-process-metadata.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-003-behavior-feature-file-structure.type-script-phase-files-support-process-metadata +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-003-behavior-feature-file-structure +--- +# TypeScript phase files support process metadata + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "TypeScript phase files support process metadata" from architect/decisions/pdr-003-behavior-feature-file-structure.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-007-type-script-phase-files-support-dependency-tracking.sdp.md b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-007-type-script-phase-files-support-dependency-tracking.sdp.md new file mode 100644 index 00000000..54e70bfb --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-007-type-script-phase-files-support-dependency-tracking.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-003-behavior-feature-file-structure.type-script-phase-files-support-dependency-tracking +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-003-behavior-feature-file-structure +--- +# TypeScript phase files support dependency tracking + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "TypeScript phase files support dependency tracking" from architect/decisions/pdr-003-behavior-feature-file-structure.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-001-all-metadata-uses-architect-prefix.sdp.md b/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-001-all-metadata-uses-architect-prefix.sdp.md new file mode 100644 index 00000000..a6a1fab4 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-001-all-metadata-uses-architect-prefix.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-004-unified-tag-prefix-architecture.all-metadata-uses-architect-prefix +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-004-unified-tag-prefix-architecture +--- +# All metadata uses @architect-* prefix + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "All metadata uses @architect-* prefix" from architect/decisions/pdr-004-unified-tag-prefix-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-002-bdd-tags-remain-unprefixed.sdp.md b/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-002-bdd-tags-remain-unprefixed.sdp.md new file mode 100644 index 00000000..239ad203 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-002-bdd-tags-remain-unprefixed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-004-unified-tag-prefix-architecture.bdd-tags-remain-unprefixed +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-004-unified-tag-prefix-architecture +--- +# BDD tags remain unprefixed + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "BDD tags remain unprefixed" from architect/decisions/pdr-004-unified-tag-prefix-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-003-scanner-accepts-deprecated-prefix-during-migration.sdp.md b/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-003-scanner-accepts-deprecated-prefix-during-migration.sdp.md new file mode 100644 index 00000000..ad98cd90 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-003-scanner-accepts-deprecated-prefix-during-migration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-004-unified-tag-prefix-architecture.scanner-accepts-deprecated-prefix-during-migration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-004-unified-tag-prefix-architecture +--- +# Scanner accepts deprecated prefix during migration + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Scanner accepts deprecated prefix during migration" from architect/decisions/pdr-004-unified-tag-prefix-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-001-compiler-enforces-taxonomy-values.sdp.md b/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-001-compiler-enforces-taxonomy-values.sdp.md new file mode 100644 index 00000000..59d918e9 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-001-compiler-enforces-taxonomy-values.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-006-typescript-sourced-taxonomy.compiler-enforces-taxonomy-values +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-006-typescript-sourced-taxonomy +--- +# Compiler enforces taxonomy values + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Compiler enforces taxonomy values" from architect/decisions/pdr-006-typescript-sourced-taxonomy.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-002-zod-schemas-derive-from-type-script-constants.sdp.md b/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-002-zod-schemas-derive-from-type-script-constants.sdp.md new file mode 100644 index 00000000..1d96a841 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-002-zod-schemas-derive-from-type-script-constants.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-006-typescript-sourced-taxonomy.zod-schemas-derive-from-type-script-constants +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-006-typescript-sourced-taxonomy +--- +# Zod schemas derive from TypeScript constants + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Zod schemas derive from TypeScript constants" from architect/decisions/pdr-006-typescript-sourced-taxonomy.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-003-registry-builder-creates-valid-tag-registry.sdp.md b/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-003-registry-builder-creates-valid-tag-registry.sdp.md new file mode 100644 index 00000000..84c46c10 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-003-registry-builder-creates-valid-tag-registry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-006-typescript-sourced-taxonomy.registry-builder-creates-valid-tag-registry +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-006-typescript-sourced-taxonomy +--- +# Registry builder creates valid TagRegistry + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Registry builder creates valid TagRegistry" from architect/decisions/pdr-006-typescript-sourced-taxonomy.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-004-type-inference-from-constants.sdp.md b/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-004-type-inference-from-constants.sdp.md new file mode 100644 index 00000000..e5908f7a --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-004-type-inference-from-constants.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-006-typescript-sourced-taxonomy.type-inference-from-constants +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-006-typescript-sourced-taxonomy +--- +# Type inference from constants + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Type inference from constants" from architect/decisions/pdr-006-typescript-sourced-taxonomy.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-001-roadmap-spec-structure.sdp.md b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-001-roadmap-spec-structure.sdp.md new file mode 100644 index 00000000..e6da8ed9 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-001-roadmap-spec-structure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-007-two-tier-spec-architecture.roadmap-spec-structure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-007-two-tier-spec-architecture +--- +# Roadmap spec structure + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Roadmap spec structure" from architect/decisions/pdr-007-two-tier-spec-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-002-package-spec-structure.sdp.md b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-002-package-spec-structure.sdp.md new file mode 100644 index 00000000..b05bcc6a --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-002-package-spec-structure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-007-two-tier-spec-architecture.package-spec-structure +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-007-two-tier-spec-architecture +--- +# Package spec structure + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Package spec structure" from architect/decisions/pdr-007-two-tier-spec-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-003-linking-roadmap-to-package-specs.sdp.md b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-003-linking-roadmap-to-package-specs.sdp.md new file mode 100644 index 00000000..85f2fbd4 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-003-linking-roadmap-to-package-specs.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-007-two-tier-spec-architecture.linking-roadmap-to-package-specs +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-007-two-tier-spec-architecture +--- +# Linking roadmap to package specs + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Linking roadmap to package specs" from architect/decisions/pdr-007-two-tier-spec-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-004-completed-pattern-roadmap-spec.sdp.md b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-004-completed-pattern-roadmap-spec.sdp.md new file mode 100644 index 00000000..dae77d20 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-004-completed-pattern-roadmap-spec.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-007-two-tier-spec-architecture.completed-pattern-roadmap-spec +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-007-two-tier-spec-architecture +--- +# Completed pattern roadmap spec + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Completed pattern roadmap spec" from architect/decisions/pdr-007-two-tier-spec-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-005-active-pattern-with-acceptance-criteria.sdp.md b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-005-active-pattern-with-acceptance-criteria.sdp.md new file mode 100644 index 00000000..22bf47fc --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-005-active-pattern-with-acceptance-criteria.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-007-two-tier-spec-architecture.active-pattern-with-acceptance-criteria +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-007-two-tier-spec-architecture +--- +# Active pattern with acceptance criteria + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Active pattern with acceptance criteria" from architect/decisions/pdr-007-two-tier-spec-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-001-evaluating-a-platform-demonstration-change.sdp.md b/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-001-evaluating-a-platform-demonstration-change.sdp.md new file mode 100644 index 00000000..7df5cc4a --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-001-evaluating-a-platform-demonstration-change.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-008-example-app-purpose.evaluating-a-platform-demonstration-change +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-008-example-app-purpose +--- +# Evaluating a platform demonstration change + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Evaluating a platform demonstration change" from architect/decisions/pdr-008-example-app-purpose.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-002-evaluating-a-business-feature-change.sdp.md b/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-002-evaluating-a-business-feature-change.sdp.md new file mode 100644 index 00000000..443557bb --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-002-evaluating-a-business-feature-change.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-008-example-app-purpose.evaluating-a-business-feature-change +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-008-example-app-purpose +--- +# Evaluating a business feature change + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Evaluating a business feature change" from architect/decisions/pdr-008-example-app-purpose.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-003-evaluating-an-uncertain-change.sdp.md b/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-003-evaluating-an-uncertain-change.sdp.md new file mode 100644 index 00000000..b7b21e7d --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-003-evaluating-an-uncertain-change.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-008-example-app-purpose.evaluating-an-uncertain-change +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-008-example-app-purpose +--- +# Evaluating an uncertain change + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Evaluating an uncertain change" from architect/decisions/pdr-008-example-app-purpose.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-001-design-session-produces-decision-specs-not-documents.sdp.md b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-001-design-session-produces-decision-specs-not-documents.sdp.md new file mode 100644 index 00000000..09367b5b --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-001-design-session-produces-decision-specs-not-documents.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-009-design-session-methodology.design-session-produces-decision-specs-not-documents +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-009-design-session-methodology +--- +# Design session produces decision specs not documents + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Design session produces decision specs not documents" from architect/decisions/pdr-009-design-session-methodology.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-002-design-session-produces-code-stubs.sdp.md b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-002-design-session-produces-code-stubs.sdp.md new file mode 100644 index 00000000..15cafdac --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-002-design-session-produces-code-stubs.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-009-design-session-methodology.design-session-produces-code-stubs +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-009-design-session-methodology +--- +# Design session produces code stubs + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Design session produces code stubs" from architect/decisions/pdr-009-design-session-methodology.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-003-stub-file-has-target-annotation.sdp.md b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-003-stub-file-has-target-annotation.sdp.md new file mode 100644 index 00000000..a0ab1351 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-003-stub-file-has-target-annotation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-009-design-session-methodology.stub-file-has-target-annotation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-009-design-session-methodology +--- +# Stub file has target annotation + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Stub file has target annotation" from architect/decisions/pdr-009-design-session-methodology.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-004-stubs-use-pattern-based-folder-naming.sdp.md b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-004-stubs-use-pattern-based-folder-naming.sdp.md new file mode 100644 index 00000000..ff7eb366 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-004-stubs-use-pattern-based-folder-naming.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-009-design-session-methodology.stubs-use-pattern-based-folder-naming +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-009-design-session-methodology +--- +# Stubs use pattern-based folder naming + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Stubs use pattern-based folder naming" from architect/decisions/pdr-009-design-session-methodology.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-005-design-session-decision-uses-design-category.sdp.md b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-005-design-session-decision-uses-design-category.sdp.md new file mode 100644 index 00000000..e18bcbed --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-005-design-session-decision-uses-design-category.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-009-design-session-methodology.design-session-decision-uses-design-category +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-009-design-session-methodology +--- +# Design-session decision uses design category + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Design-session decision uses design category" from architect/decisions/pdr-009-design-session-methodology.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-001-agent-handler-receives-projection-data-as-argument.sdp.md b/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-001-agent-handler-receives-projection-data-as-argument.sdp.md new file mode 100644 index 00000000..0ebd12cb --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-001-agent-handler-receives-projection-data-as-argument.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-010-cross-component-argument-injection.agent-handler-receives-projection-data-as-argument +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-010-cross-component-argument-injection +--- +# Agent handler receives projection data as argument + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Agent handler receives projection data as argument" from architect/decisions/pdr-010-cross-component-argument-injection.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-002-missing-external-data-is-handled-gracefully.sdp.md b/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-002-missing-external-data-is-handled-gracefully.sdp.md new file mode 100644 index 00000000..0a2939f4 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-002-missing-external-data-is-handled-gracefully.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-010-cross-component-argument-injection.missing-external-data-is-handled-gracefully +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-010-cross-component-argument-injection +--- +# Missing external data is handled gracefully + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Missing external data is handled gracefully" from architect/decisions/pdr-010-cross-component-argument-injection.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-003-injected-data-interface-is-extensible.sdp.md b/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-003-injected-data-interface-is-extensible.sdp.md new file mode 100644 index 00000000..f1776b93 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-003-injected-data-interface-is-extensible.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-010-cross-component-argument-injection.injected-data-interface-is-extensible +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-010-cross-component-argument-injection +--- +# InjectedData interface is extensible + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "InjectedData interface is extensible" from architect/decisions/pdr-010-cross-component-argument-injection.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-001-action-handler-performs-analysis-without-persistence.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-001-action-handler-performs-analysis-without-persistence.sdp.md new file mode 100644 index 00000000..e4c7c305 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-001-action-handler-performs-analysis-without-persistence.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-011-agent-action-handler-architecture.action-handler-performs-analysis-without-persistence +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-011-agent-action-handler-architecture +--- +# Action handler performs analysis without persistence + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Action handler performs analysis without persistence" from architect/decisions/pdr-011-agent-action-handler-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-002-on-complete-mutation-persists-decision-atomically.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-002-on-complete-mutation-persists-decision-atomically.sdp.md new file mode 100644 index 00000000..ecdfaf98 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-002-on-complete-mutation-persists-decision-atomically.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-011-agent-action-handler-architecture.on-complete-mutation-persists-decision-atomically +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-011-agent-action-handler-architecture +--- +# onComplete mutation persists decision atomically + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "onComplete mutation persists decision atomically" from architect/decisions/pdr-011-agent-action-handler-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-003-llm-unavailable-falls-back-to-rule-based-analysis.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-003-llm-unavailable-falls-back-to-rule-based-analysis.sdp.md new file mode 100644 index 00000000..3c9a470b --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-003-llm-unavailable-falls-back-to-rule-based-analysis.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-011-agent-action-handler-architecture.llm-unavailable-falls-back-to-rule-based-analysis +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-011-agent-action-handler-architecture +--- +# LLM unavailable falls back to rule-based analysis + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "LLM unavailable falls back to rule-based analysis" from architect/decisions/pdr-011-agent-action-handler-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-004-action-failure-triggers-dead-letter-via-on-complete.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-004-action-failure-triggers-dead-letter-via-on-complete.sdp.md new file mode 100644 index 00000000..b6839928 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-004-action-failure-triggers-dead-letter-via-on-complete.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-011-agent-action-handler-architecture.action-failure-triggers-dead-letter-via-on-complete +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-011-agent-action-handler-architecture +--- +# Action failure triggers dead letter via onComplete + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Action failure triggers dead letter via onComplete" from architect/decisions/pdr-011-agent-action-handler-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-005-null-decision-advances-checkpoint-without-side-effects.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-005-null-decision-advances-checkpoint-without-side-effects.sdp.md new file mode 100644 index 00000000..d13c1711 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-005-null-decision-advances-checkpoint-without-side-effects.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-011-agent-action-handler-architecture.null-decision-advances-checkpoint-without-side-effects +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-011-agent-action-handler-architecture +--- +# Null decision advances checkpoint without side effects + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Null decision advances checkpoint without side effects" from architect/decisions/pdr-011-agent-action-handler-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-006-event-bus-dispatches-action-subscription-via-enqueue-action.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-006-event-bus-dispatches-action-subscription-via-enqueue-action.sdp.md new file mode 100644 index 00000000..ff44fd6f --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-006-event-bus-dispatches-action-subscription-via-enqueue-action.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-011-agent-action-handler-architecture.event-bus-dispatches-action-subscription-via-enqueue-action +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-011-agent-action-handler-architecture +--- +# EventBus dispatches action subscription via enqueueAction + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "EventBus dispatches action subscription via enqueueAction" from architect/decisions/pdr-011-agent-action-handler-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-007-existing-mutation-subscriptions-remain-unchanged.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-007-existing-mutation-subscriptions-remain-unchanged.sdp.md new file mode 100644 index 00000000..de2ca6c8 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-007-existing-mutation-subscriptions-remain-unchanged.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-011-agent-action-handler-architecture.existing-mutation-subscriptions-remain-unchanged +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-011-agent-action-handler-architecture +--- +# Existing mutation subscriptions remain unchanged + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Existing mutation subscriptions remain unchanged" from architect/decisions/pdr-011-agent-action-handler-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-008-action-subscription-requires-on-complete-at-the-type-level.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-008-action-subscription-requires-on-complete-at-the-type-level.sdp.md new file mode 100644 index 00000000..7d8aed28 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-008-action-subscription-requires-on-complete-at-the-type-level.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-011-agent-action-handler-architecture.action-subscription-requires-on-complete-at-the-type-level +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-011-agent-action-handler-architecture +--- +# ActionSubscription requires onComplete at the type level + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "ActionSubscription requires onComplete at the type level" from architect/decisions/pdr-011-agent-action-handler-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-009-sequential-events-process-correctly.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-009-sequential-events-process-correctly.sdp.md new file mode 100644 index 00000000..92976d79 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-009-sequential-events-process-correctly.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-011-agent-action-handler-architecture.sequential-events-process-correctly +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-011-agent-action-handler-architecture +--- +# Sequential events process correctly + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Sequential events process correctly" from architect/decisions/pdr-011-agent-action-handler-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-010-concurrent-actions-for-same-entity-are-serialized-at-on-complete.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-010-concurrent-actions-for-same-entity-are-serialized-at-on-complete.sdp.md new file mode 100644 index 00000000..35a547af --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-010-concurrent-actions-for-same-entity-are-serialized-at-on-complete.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-011-agent-action-handler-architecture.concurrent-actions-for-same-entity-are-serialized-at-on-complete +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-011-agent-action-handler-architecture +--- +# Concurrent actions for same entity are serialized at onComplete + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Concurrent actions for same entity are serialized at onComplete" from architect/decisions/pdr-011-agent-action-handler-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-011-already-processed-event-is-skipped-in-action.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-011-already-processed-event-is-skipped-in-action.sdp.md new file mode 100644 index 00000000..d3feef96 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-011-already-processed-event-is-skipped-in-action.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-011-agent-action-handler-architecture.already-processed-event-is-skipped-in-action +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-011-agent-action-handler-architecture +--- +# Already-processed event is skipped in action + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Already-processed event is skipped in action" from architect/decisions/pdr-011-agent-action-handler-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-012-partial-on-complete-failure-replays-safely.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-012-partial-on-complete-failure-replays-safely.sdp.md new file mode 100644 index 00000000..0146c3a3 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-012-partial-on-complete-failure-replays-safely.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-011-agent-action-handler-architecture.partial-on-complete-failure-replays-safely +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-011-agent-action-handler-architecture +--- +# Partial onComplete failure replays safely + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Partial onComplete failure replays safely" from architect/decisions/pdr-011-agent-action-handler-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-013-event-bus-uses-subscription-specific-pool-when-available.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-013-event-bus-uses-subscription-specific-pool-when-available.sdp.md new file mode 100644 index 00000000..40f6a429 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-013-event-bus-uses-subscription-specific-pool-when-available.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-011-agent-action-handler-architecture.event-bus-uses-subscription-specific-pool-when-available +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-011-agent-action-handler-architecture +--- +# EventBus uses subscription-specific pool when available + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "EventBus uses subscription-specific pool when available" from architect/decisions/pdr-011-agent-action-handler-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-001-command-routes-through-orchestrator-to-domain-handler.sdp.md b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-001-command-routes-through-orchestrator-to-domain-handler.sdp.md new file mode 100644 index 00000000..87bacb9e --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-001-command-routes-through-orchestrator-to-domain-handler.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-012-agent-command-routing.command-routes-through-orchestrator-to-domain-handler +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-012-agent-command-routing +--- +# Command routes through orchestrator to domain handler + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Command routes through orchestrator to domain handler" from architect/decisions/pdr-012-agent-command-routing.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-002-unknown-command-type-fails-with-routing-error.sdp.md b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-002-unknown-command-type-fails-with-routing-error.sdp.md new file mode 100644 index 00000000..48515962 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-002-unknown-command-type-fails-with-routing-error.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-012-agent-command-routing.unknown-command-type-fails-with-routing-error +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-012-agent-command-routing +--- +# Unknown command type fails with routing error + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Unknown command type fails with routing error" from architect/decisions/pdr-012-agent-command-routing.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-003-duplicate-command-rejected-by-command-orchestrator-idempotency.sdp.md b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-003-duplicate-command-rejected-by-command-orchestrator-idempotency.sdp.md new file mode 100644 index 00000000..dbaaa9eb --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-003-duplicate-command-rejected-by-command-orchestrator-idempotency.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-012-agent-command-routing.duplicate-command-rejected-by-command-orchestrator-idempotency +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-012-agent-command-routing +--- +# Duplicate command rejected by CommandOrchestrator idempotency + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Duplicate command rejected by CommandOrchestrator idempotency" from architect/decisions/pdr-012-agent-command-routing.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-004-handler-uses-trigger-for-cheap-detection-before-llm.sdp.md b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-004-handler-uses-trigger-for-cheap-detection-before-llm.sdp.md new file mode 100644 index 00000000..51437821 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-004-handler-uses-trigger-for-cheap-detection-before-llm.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-012-agent-command-routing.handler-uses-trigger-for-cheap-detection-before-llm +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-012-agent-command-routing +--- +# Handler uses trigger for cheap detection before LLM + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Handler uses trigger for cheap detection before LLM" from architect/decisions/pdr-012-agent-command-routing.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-005-handler-uses-analyze-for-llm-powered-detection.sdp.md b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-005-handler-uses-analyze-for-llm-powered-detection.sdp.md new file mode 100644 index 00000000..e17df40f --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-005-handler-uses-analyze-for-llm-powered-detection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-012-agent-command-routing.handler-uses-analyze-for-llm-powered-detection +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-012-agent-command-routing +--- +# Handler uses analyze for LLM-powered detection + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Handler uses analyze for LLM-powered detection" from architect/decisions/pdr-012-agent-command-routing.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-001-invalid-lifecycle-transition-is-rejected.sdp.md b/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-001-invalid-lifecycle-transition-is-rejected.sdp.md new file mode 100644 index 00000000..b775e825 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-001-invalid-lifecycle-transition-is-rejected.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-013-agent-lifecycle-fsm.invalid-lifecycle-transition-is-rejected +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-013-agent-lifecycle-fsm +--- +# Invalid lifecycle transition is rejected + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Invalid lifecycle transition is rejected" from architect/decisions/pdr-013-agent-lifecycle-fsm.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-002-stop-agent-works-from-any-non-stopped-state.sdp.md b/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-002-stop-agent-works-from-any-non-stopped-state.sdp.md new file mode 100644 index 00000000..2bb016f3 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-002-stop-agent-works-from-any-non-stopped-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-013-agent-lifecycle-fsm.stop-agent-works-from-any-non-stopped-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-013-agent-lifecycle-fsm +--- +# StopAgent works from any non-stopped state + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "StopAgent works from any non-stopped state" from architect/decisions/pdr-013-agent-lifecycle-fsm.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-003-pause-agent-transitions-active-agent-to-paused.sdp.md b/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-003-pause-agent-transitions-active-agent-to-paused.sdp.md new file mode 100644 index 00000000..83b90728 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-003-pause-agent-transitions-active-agent-to-paused.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-013-agent-lifecycle-fsm.pause-agent-transitions-active-agent-to-paused +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-013-agent-lifecycle-fsm +--- +# PauseAgent transitions active agent to paused + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "PauseAgent transitions active agent to paused" from architect/decisions/pdr-013-agent-lifecycle-fsm.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-004-resume-agent-resumes-from-checkpoint-position.sdp.md b/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-004-resume-agent-resumes-from-checkpoint-position.sdp.md new file mode 100644 index 00000000..2037af65 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-004-resume-agent-resumes-from-checkpoint-position.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-013-agent-lifecycle-fsm.resume-agent-resumes-from-checkpoint-position +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-013-agent-lifecycle-fsm +--- +# ResumeAgent resumes from checkpoint position + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "ResumeAgent resumes from checkpoint position" from architect/decisions/pdr-013-agent-lifecycle-fsm.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-005-reconfigure-agent-updates-configuration-without-losing-state.sdp.md b/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-005-reconfigure-agent-updates-configuration-without-losing-state.sdp.md new file mode 100644 index 00000000..00d0e543 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-005-reconfigure-agent-updates-configuration-without-losing-state.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-013-agent-lifecycle-fsm.reconfigure-agent-updates-configuration-without-losing-state +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-013-agent-lifecycle-fsm +--- +# ReconfigureAgent updates configuration without losing state + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "ReconfigureAgent updates configuration without losing state" from architect/decisions/pdr-013-agent-lifecycle-fsm.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-001-valid-proof-allows-a-legitimate-component-boundary-action.sdp.md b/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-001-valid-proof-allows-a-legitimate-component-boundary-action.sdp.md new file mode 100644 index 00000000..11c869a4 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-001-valid-proof-allows-a-legitimate-component-boundary-action.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-014-component-boundary-authentication-convention.valid-proof-allows-a-legitimate-component-boundary-action +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-014-component-boundary-authentication-convention +--- +# Valid proof allows a legitimate component-boundary action + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Valid proof allows a legitimate component-boundary action" from architect/decisions/pdr-014-component-boundary-authentication-convention.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-before-any-write.sdp.md b/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-before-any-write.sdp.md new file mode 100644 index 00000000..586a58d0 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-before-any-write.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-014-component-boundary-authentication-convention.missing-or-forged-proof-is-rejected-before-any-write +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-014-component-boundary-authentication-convention +--- +# Missing or forged proof is rejected before any write + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Missing or forged proof is rejected before any write" from architect/decisions/pdr-014-component-boundary-authentication-convention.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-003-targeted-mutation-family-migrates-in-one-packet.sdp.md b/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-003-targeted-mutation-family-migrates-in-one-packet.sdp.md new file mode 100644 index 00000000..d3f7d7e7 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-003-targeted-mutation-family-migrates-in-one-packet.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-014-component-boundary-authentication-convention.targeted-mutation-family-migrates-in-one-packet +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-014-component-boundary-authentication-convention +--- +# Targeted mutation family migrates in one packet + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Targeted mutation family migrates in one packet" from architect/decisions/pdr-014-component-boundary-authentication-convention.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-001-sequential-appends-remain-strictly-monotonic-at-real-timestamps.sdp.md b/specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-001-sequential-appends-remain-strictly-monotonic-at-real-timestamps.sdp.md new file mode 100644 index 00000000..05a4cfa7 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-001-sequential-appends-remain-strictly-monotonic-at-real-timestamps.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-015-global-position-numeric-representation.sequential-appends-remain-strictly-monotonic-at-real-timestamps +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-015-global-position-numeric-representation +--- +# Sequential appends remain strictly monotonic at real timestamps + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Sequential appends remain strictly monotonic at real timestamps" from architect/decisions/pdr-015-global-position-numeric-representation.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-002-legacy-numeric-checkpoints-are-read-safely-by-the-new-code.sdp.md b/specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-002-legacy-numeric-checkpoints-are-read-safely-by-the-new-code.sdp.md new file mode 100644 index 00000000..77b0f0ff --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-002-legacy-numeric-checkpoints-are-read-safely-by-the-new-code.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-015-global-position-numeric-representation.legacy-numeric-checkpoints-are-read-safely-by-the-new-code +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-015-global-position-numeric-representation +--- +# Legacy numeric checkpoints are read safely by the new code + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Legacy numeric checkpoints are read safely by the new code" from architect/decisions/pdr-015-global-position-numeric-representation.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-001-secondary-fanout-and-saga-routing-no-longer-share-the-primary-projection-p.sdp.md b/specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-001-secondary-fanout-and-saga-routing-no-longer-share-the-primary-projection-p.sdp.md new file mode 100644 index 00000000..a2287913 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-001-secondary-fanout-and-saga-routing-no-longer-share-the-primary-projection-p.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-016-projection-pool-split-named-pools-per-concern.secondary-fanout-and-saga-routing-no-longer-share-the-primary-projection-pool +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-016-projection-pool-split-named-pools-per-concern +--- +# Secondary fanout and saga routing no longer share the primary projection pool + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Secondary fanout and saga routing no longer share the primary projection pool" from architect/decisions/pdr-016-projection-pool-split-named-pools-per-concern.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-002-the-pool-split-does-not-claim-nonexistent-workpool-ordering-behavior.sdp.md b/specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-002-the-pool-split-does-not-claim-nonexistent-workpool-ordering-behavior.sdp.md new file mode 100644 index 00000000..04ac9435 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-002-the-pool-split-does-not-claim-nonexistent-workpool-ordering-behavior.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-016-projection-pool-split-named-pools-per-concern.the-pool-split-does-not-claim-nonexistent-workpool-ordering-behavior +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-016-projection-pool-split-named-pools-per-concern +--- +# The pool split does not claim nonexistent Workpool ordering behavior + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "The pool split does not claim nonexistent Workpool ordering behavior" from architect/decisions/pdr-016-projection-pool-split-named-pools-per-concern.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-001-tranche-3-gate-chooses-the-low-blast-radius-path.sdp.md b/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-001-tranche-3-gate-chooses-the-low-blast-radius-path.sdp.md new file mode 100644 index 00000000..58a9f2d5 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-001-tranche-3-gate-chooses-the-low-blast-radius-path.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-017-tranche-3-platform-architecture-gate.tranche-3-gate-chooses-the-low-blast-radius-path +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-017-tranche-3-platform-architecture-gate +--- +# Tranche-3 gate chooses the low-blast-radius path + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Tranche-3 gate chooses the low-blast-radius path" from architect/decisions/pdr-017-tranche-3-platform-architecture-gate.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-002-optional-package-splits-are-not-silently-started.sdp.md b/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-002-optional-package-splits-are-not-silently-started.sdp.md new file mode 100644 index 00000000..60efc4da --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-002-optional-package-splits-are-not-silently-started.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-017-tranche-3-platform-architecture-gate.optional-package-splits-are-not-silently-started +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-017-tranche-3-platform-architecture-gate +--- +# Optional package splits are not silently started + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Optional package splits are not silently started" from architect/decisions/pdr-017-tranche-3-platform-architecture-gate.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-003-shared-contracts-package-centralizes-the-non-split-contract-surfaces.sdp.md b/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-003-shared-contracts-package-centralizes-the-non-split-contract-surfaces.sdp.md new file mode 100644 index 00000000..d930f24f --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-003-shared-contracts-package-centralizes-the-non-split-contract-surfaces.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-017-tranche-3-platform-architecture-gate.shared-contracts-package-centralizes-the-non-split-contract-surfaces +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-017-tranche-3-platform-architecture-gate +--- +# Shared contracts package centralizes the non-split contract surfaces + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Shared contracts package centralizes the non-split contract surfaces" from architect/decisions/pdr-017-tranche-3-platform-architecture-gate.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-004-layering-command-enforces-the-tranche-3-non-split-boundary-rules.sdp.md b/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-004-layering-command-enforces-the-tranche-3-non-split-boundary-rules.sdp.md new file mode 100644 index 00000000..d6be9dde --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-004-layering-command-enforces-the-tranche-3-non-split-boundary-rules.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-017-tranche-3-platform-architecture-gate.layering-command-enforces-the-tranche-3-non-split-boundary-rules +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-017-tranche-3-platform-architecture-gate +--- +# Layering command enforces the tranche-3 non-split boundary rules + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Layering command enforces the tranche-3 non-split boundary rules" from architect/decisions/pdr-017-tranche-3-platform-architecture-gate.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-001-same-key-plus-same-payload-returns-the-original-append-result.sdp.md b/specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-001-same-key-plus-same-payload-returns-the-original-append-result.sdp.md new file mode 100644 index 00000000..d8e5ef40 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-001-same-key-plus-same-payload-returns-the-original-append-result.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-018-idempotency-enforcement-for-append-to-stream.same-key-plus-same-payload-returns-the-original-append-result +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-018-idempotency-enforcement-for-append-to-stream +--- +# Same key plus same payload returns the original append result + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Same key plus same payload returns the original append result" from architect/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-002-same-key-plus-different-payload-is-rejected-and-audited.sdp.md b/specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-002-same-key-plus-different-payload-is-rejected-and-audited.sdp.md new file mode 100644 index 00000000..1cb2a23c --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-002-same-key-plus-different-payload-is-rejected-and-audited.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-018-idempotency-enforcement-for-append-to-stream.same-key-plus-different-payload-is-rejected-and-audited +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-018-idempotency-enforcement-for-append-to-stream +--- +# Same key plus different payload is rejected and audited + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Same key plus different payload is rejected and audited" from architect/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-001-payload-below-the-configured-cap-passes-the-component-boundary.sdp.md b/specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-001-payload-below-the-configured-cap-passes-the-component-boundary.sdp.md new file mode 100644 index 00000000..bf17fa36 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-001-payload-below-the-configured-cap-passes-the-component-boundary.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-019-v-any-vs-v-unknown-boundary-policy.payload-below-the-configured-cap-passes-the-component-boundary +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-019-v-any-vs-v-unknown-boundary-policy +--- +# Payload below the configured cap passes the component boundary + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Payload below the configured cap passes the component boundary" from architect/decisions/pdr-019-v-any-vs-v-unknown-boundary-policy.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-002-oversized-payload-is-rejected-before-persistence.sdp.md b/specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-002-oversized-payload-is-rejected-before-persistence.sdp.md new file mode 100644 index 00000000..deb93476 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-002-oversized-payload-is-rejected-before-persistence.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-019-v-any-vs-v-unknown-boundary-policy.oversized-payload-is-rejected-before-persistence +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-019-v-any-vs-v-unknown-boundary-policy +--- +# Oversized payload is rejected before persistence + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Oversized payload is rejected before persistence" from architect/decisions/pdr-019-v-any-vs-v-unknown-boundary-policy.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-001-event-type-catch-up-uses-the-replacement-compound-index.sdp.md b/specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-001-event-type-catch-up-uses-the-replacement-compound-index.sdp.md new file mode 100644 index 00000000..20bc0ed4 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-001-event-type-catch-up-uses-the-replacement-compound-index.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-020-events-table-index-policy.event-type-catch-up-uses-the-replacement-compound-index +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-020-events-table-index-policy +--- +# Event-type catch-up uses the replacement compound index + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Event-type catch-up uses the replacement compound index" from architect/decisions/pdr-020-events-table-index-policy.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-002-removed-indexes-stay-absent-after-the-audit-driven-cleanup.sdp.md b/specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-002-removed-indexes-stay-absent-after-the-audit-driven-cleanup.sdp.md new file mode 100644 index 00000000..e113c7e0 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-002-removed-indexes-stay-absent-after-the-audit-driven-cleanup.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-020-events-table-index-policy.removed-indexes-stay-absent-after-the-audit-driven-cleanup +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-020-events-table-index-policy +--- +# Removed indexes stay absent after the audit-driven cleanup + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Removed indexes stay absent after the audit-driven cleanup" from architect/decisions/pdr-020-events-table-index-policy.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-001-ac4-is-closed-by-a-constrained-dependency-decision-rather-than-a-package-r.sdp.md b/specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-001-ac4-is-closed-by-a-constrained-dependency-decision-rather-than-a-package-r.sdp.md new file mode 100644 index 00000000..8a12b906 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-001-ac4-is-closed-by-a-constrained-dependency-decision-rather-than-a-package-r.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-021-platform-store-runtime-dependency-on-platform-core.ac4-is-closed-by-a-constrained-dependency-decision-rather-than-a-package-rewrite +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-021-platform-store-runtime-dependency-on-platform-core +--- +# AC4 is closed by a constrained dependency decision rather than a package rewrite + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "AC4 is closed by a constrained dependency decision rather than a package rewrite" from architect/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-002-the-constrained-dependency-does-not-reopen-the-deferred-platform-core-spli.sdp.md b/specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-002-the-constrained-dependency-does-not-reopen-the-deferred-platform-core-spli.sdp.md new file mode 100644 index 00000000..e64894c6 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-002-the-constrained-dependency-does-not-reopen-the-deferred-platform-core-spli.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-021-platform-store-runtime-dependency-on-platform-core.the-constrained-dependency-does-not-reopen-the-deferred-platform-core-split +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-021-platform-store-runtime-dependency-on-platform-core +--- +# The constrained dependency does not reopen the deferred platform-core split + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "The constrained dependency does not reopen the deferred platform-core split" from architect/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-001-bare-names-remain-canonical-across-roadmap-and-decision-sources.sdp.md b/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-001-bare-names-remain-canonical-across-roadmap-and-decision-sources.sdp.md new file mode 100644 index 00000000..431bf059 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-001-bare-names-remain-canonical-across-roadmap-and-decision-sources.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-022-value-transfer-doctrine-adoption.bare-names-remain-canonical-across-roadmap-and-decision-sources +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-022-value-transfer-doctrine-adoption +--- +# Bare names remain canonical across roadmap and decision sources + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Bare names remain canonical across roadmap and decision sources" from architect/decisions/pdr-022-value-transfer-doctrine-adoption.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-002-executable-tests-names-identify-carrier-artifacts-only.sdp.md b/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-002-executable-tests-names-identify-carrier-artifacts-only.sdp.md new file mode 100644 index 00000000..0706d1c4 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-002-executable-tests-names-identify-carrier-artifacts-only.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-022-value-transfer-doctrine-adoption.executable-tests-names-identify-carrier-artifacts-only +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-022-value-transfer-doctrine-adoption +--- +# ExecutableTests names identify carrier artifacts only + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "ExecutableTests names identify carrier artifacts only" from architect/decisions/pdr-022-value-transfer-doctrine-adoption.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-003-architect-implements-carries-the-continuity-edge.sdp.md b/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-003-architect-implements-carries-the-continuity-edge.sdp.md new file mode 100644 index 00000000..487df722 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-003-architect-implements-carries-the-continuity-edge.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-022-value-transfer-doctrine-adoption.architect-implements-carries-the-continuity-edge +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-022-value-transfer-doctrine-adoption +--- +# `@architect-implements` carries the continuity edge + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "`@architect-implements` carries the continuity edge" from architect/decisions/pdr-022-value-transfer-doctrine-adoption.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-001-selective-rollback-restores-one-semantic-pattern-without-undoing-the-whole.sdp.md b/specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-001-selective-rollback-restores-one-semantic-pattern-without-undoing-the-whole.sdp.md new file mode 100644 index 00000000..643ae77d --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-001-selective-rollback-restores-one-semantic-pattern-without-undoing-the-whole.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-023-bulk-doctrine-rollback-and-recovery.selective-rollback-restores-one-semantic-pattern-without-undoing-the-whole-packe +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-023-bulk-doctrine-rollback-and-recovery +--- +# Selective rollback restores one semantic pattern without undoing the whole packet + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Selective rollback restores one semantic pattern without undoing the whole packet" from architect/decisions/pdr-023-bulk-doctrine-rollback-and-recovery.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-002-whole-packet-rollback-keeps-enforcement-in-the-normal-ci-lanes.sdp.md b/specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-002-whole-packet-rollback-keeps-enforcement-in-the-normal-ci-lanes.sdp.md new file mode 100644 index 00000000..7933ed48 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-002-whole-packet-rollback-keeps-enforcement-in-the-normal-ci-lanes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:decisions.pdr-023-bulk-doctrine-rollback-and-recovery.whole-packet-rollback-keeps-enforcement-in-the-normal-ci-lanes +kind: example +altitude: story +readiness: idea +relations: + refines: spec:decisions.pdr-023-bulk-doctrine-rollback-and-recovery +--- +# Whole-packet rollback keeps enforcement in the normal CI lanes + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Whole-packet rollback keeps enforcement in the normal CI lanes" from architect/decisions/pdr-023-bulk-doctrine-rollback-and-recovery.feature diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-001-projection-lag-is-tracked.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-001-projection-lag-is-tracked.sdp.md new file mode 100644 index 00000000..b33c096b --- /dev/null +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-001-projection-lag-is-tracked.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.production-hardening.projection-lag-is-tracked +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Projection lag is tracked + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Projection lag is tracked" from architect/specs/platform/production-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-002-metrics-collection-handles-missing-checkpoints.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-002-metrics-collection-handles-missing-checkpoints.sdp.md new file mode 100644 index 00000000..97a04a72 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-002-metrics-collection-handles-missing-checkpoints.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.production-hardening.metrics-collection-handles-missing-checkpoints +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Metrics collection handles missing checkpoints + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Metrics collection handles missing checkpoints" from architect/specs/platform/production-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-003-trace-spans-command-to-projection-flow.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-003-trace-spans-command-to-projection-flow.sdp.md new file mode 100644 index 00000000..bc5122eb --- /dev/null +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-003-trace-spans-command-to-projection-flow.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.production-hardening.trace-spans-command-to-projection-flow +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Trace spans command-to-projection flow + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Trace spans command-to-projection flow" from architect/specs/platform/production-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-004-missing-trace-context-uses-default.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-004-missing-trace-context-uses-default.sdp.md new file mode 100644 index 00000000..7632de77 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-004-missing-trace-context-uses-default.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.production-hardening.missing-trace-context-uses-default +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Missing trace context uses default + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Missing trace context uses default" from architect/specs/platform/production-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-005-readiness-probe-checks-dependencies.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-005-readiness-probe-checks-dependencies.sdp.md new file mode 100644 index 00000000..a3f5fb8d --- /dev/null +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-005-readiness-probe-checks-dependencies.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.production-hardening.readiness-probe-checks-dependencies +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Readiness probe checks dependencies + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Readiness probe checks dependencies" from architect/specs/platform/production-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-006-unhealthy-dependency-fails-readiness.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-006-unhealthy-dependency-fails-readiness.sdp.md new file mode 100644 index 00000000..451895dd --- /dev/null +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-006-unhealthy-dependency-fails-readiness.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.production-hardening.unhealthy-dependency-fails-readiness +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Unhealthy dependency fails readiness + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Unhealthy dependency fails readiness" from architect/specs/platform/production-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-007-liveness-probe-always-succeeds.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-007-liveness-probe-always-succeeds.sdp.md new file mode 100644 index 00000000..b9e0ff51 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-007-liveness-probe-always-succeeds.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.production-hardening.liveness-probe-always-succeeds +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Liveness probe always succeeds + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Liveness probe always succeeds" from architect/specs/platform/production-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-008-workpool-backlog-fails-readiness.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-008-workpool-backlog-fails-readiness.sdp.md new file mode 100644 index 00000000..bf43d258 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-008-workpool-backlog-fails-readiness.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.production-hardening.workpool-backlog-fails-readiness +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Workpool backlog fails readiness + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Workpool backlog fails readiness" from architect/specs/platform/production-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-009-circuit-opens-after-repeated-failures.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-009-circuit-opens-after-repeated-failures.sdp.md new file mode 100644 index 00000000..b009419b --- /dev/null +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-009-circuit-opens-after-repeated-failures.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.production-hardening.circuit-opens-after-repeated-failures +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Circuit opens after repeated failures + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Circuit opens after repeated failures" from architect/specs/platform/production-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-010-circuit-transitions-to-half-open-after-timeout.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-010-circuit-transitions-to-half-open-after-timeout.sdp.md new file mode 100644 index 00000000..c0e46e37 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-010-circuit-transitions-to-half-open-after-timeout.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.production-hardening.circuit-transitions-to-half-open-after-timeout +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Circuit transitions to half-open after timeout + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Circuit transitions to half-open after timeout" from architect/specs/platform/production-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-011-successful-half-open-request-closes-circuit.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-011-successful-half-open-request-closes-circuit.sdp.md new file mode 100644 index 00000000..3f994ea6 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-011-successful-half-open-request-closes-circuit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.production-hardening.successful-half-open-request-closes-circuit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Successful half-open request closes circuit + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Successful half-open request closes circuit" from architect/specs/platform/production-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-012-failed-half-open-request-reopens-circuit.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-012-failed-half-open-request-reopens-circuit.sdp.md new file mode 100644 index 00000000..d43cf757 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-012-failed-half-open-request-reopens-circuit.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.production-hardening.failed-half-open-request-reopens-circuit +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Failed half-open request reopens circuit + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Failed half-open request reopens circuit" from architect/specs/platform/production-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-013-projection-rebuild-re-processes-events.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-013-projection-rebuild-re-processes-events.sdp.md new file mode 100644 index 00000000..742eef73 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-013-projection-rebuild-re-processes-events.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.production-hardening.projection-rebuild-re-processes-events +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Projection rebuild re-processes events + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Projection rebuild re-processes events" from architect/specs/platform/production-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-014-dead-letter-retry-re-enqueues-event.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-014-dead-letter-retry-re-enqueues-event.sdp.md new file mode 100644 index 00000000..220492c2 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-014-dead-letter-retry-re-enqueues-event.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.production-hardening.dead-letter-retry-re-enqueues-event +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Dead letter retry re-enqueues event + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Dead letter retry re-enqueues event" from architect/specs/platform/production-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-015-event-flow-trace-returns-full-history.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-015-event-flow-trace-returns-full-history.sdp.md new file mode 100644 index 00000000..c9ec6558 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-015-event-flow-trace-returns-full-history.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.production-hardening.event-flow-trace-returns-full-history +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Event flow trace returns full history + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Event flow trace returns full history" from architect/specs/platform/production-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-016-durable-function-run-diagnostics.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-016-durable-function-run-diagnostics.sdp.md new file mode 100644 index 00000000..c72b6f52 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-016-durable-function-run-diagnostics.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.production-hardening.durable-function-run-diagnostics +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Durable function run diagnostics + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Durable function run diagnostics" from architect/specs/platform/production-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-017-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-017-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md new file mode 100644 index 00000000..347b3cbd --- /dev/null +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-017-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.production-hardening.circuit-breaker-uses-action-retrier-for-half-open-probe +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Circuit breaker uses action retrier for half-open probe + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Circuit breaker uses action retrier for half-open probe" from architect/specs/platform/production-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-018-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-018-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md new file mode 100644 index 00000000..54a3b361 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-018-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.production-hardening.failed-half-open-probe-reopens-circuit-via-action-retrier +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Failed half-open probe reopens circuit via action retrier + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Failed half-open probe reopens circuit via action retrier" from architect/specs/platform/production-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-019-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-019-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md new file mode 100644 index 00000000..d788b326 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-019-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.production-hardening.dead-letter-retry-uses-action-retrier-for-external-calls +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Dead letter retry uses action retrier for external calls + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Dead letter retry uses action retrier for external calls" from architect/specs/platform/production-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-020-failed-dlq-retry-returns-to-pending-status.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-020-failed-dlq-retry-returns-to-pending-status.sdp.md new file mode 100644 index 00000000..c6131da9 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-020-failed-dlq-retry-returns-to-pending-status.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.production-hardening.failed-dlq-retry-returns-to-pending-status +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Failed DLQ retry returns to pending status + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Failed DLQ retry returns to pending status" from architect/specs/platform/production-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-021-durable-function-calls-propagate-trace-context.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-021-durable-function-calls-propagate-trace-context.sdp.md new file mode 100644 index 00000000..c5972e00 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-021-durable-function-calls-propagate-trace-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.production-hardening.durable-function-calls-propagate-trace-context +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Durable function calls propagate trace context + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Durable function calls propagate trace context" from architect/specs/platform/production-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/test-content-blocks/s-001-scenario-with-doc-string-for-rich-content.sdp.md b/specs/unimplemented/architect-scenarios/test-content-blocks/s-001-scenario-with-doc-string-for-rich-content.sdp.md new file mode 100644 index 00000000..0e24be19 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/test-content-blocks/s-001-scenario-with-doc-string-for-rich-content.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.test-content-blocks.scenario-with-doc-string-for-rich-content +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.test-content-blocks +--- +# Scenario with DocString for rich content + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Scenario with DocString for rich content" from architect/specs/test-content-blocks.feature diff --git a/specs/unimplemented/architect-scenarios/test-content-blocks/s-002-scenario-with-data-table-for-structured-data.sdp.md b/specs/unimplemented/architect-scenarios/test-content-blocks/s-002-scenario-with-data-table-for-structured-data.sdp.md new file mode 100644 index 00000000..67bb25c9 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/test-content-blocks/s-002-scenario-with-data-table-for-structured-data.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.test-content-blocks.scenario-with-data-table-for-structured-data +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.test-content-blocks +--- +# Scenario with DataTable for structured data + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Scenario with DataTable for structured data" from architect/specs/test-content-blocks.feature diff --git a/specs/unimplemented/architect-scenarios/test-content-blocks/s-003-simple-scenario-under-second-rule.sdp.md b/specs/unimplemented/architect-scenarios/test-content-blocks/s-003-simple-scenario-under-second-rule.sdp.md new file mode 100644 index 00000000..37d71dfc --- /dev/null +++ b/specs/unimplemented/architect-scenarios/test-content-blocks/s-003-simple-scenario-under-second-rule.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.test-content-blocks.simple-scenario-under-second-rule +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.test-content-blocks +--- +# Simple scenario under second rule + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Simple scenario under second rule" from architect/specs/test-content-blocks.feature diff --git a/specs/unimplemented/architect-scenarios/test-content-blocks/s-004-scenario-with-examples-table.sdp.md b/specs/unimplemented/architect-scenarios/test-content-blocks/s-004-scenario-with-examples-table.sdp.md new file mode 100644 index 00000000..fc7ab965 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/test-content-blocks/s-004-scenario-with-examples-table.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.test-content-blocks.scenario-with-examples-table +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.test-content-blocks +--- +# Scenario with examples table + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Scenario with examples table" from architect/specs/test-content-blocks.feature diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-001-generate-themed-decision-document.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-001-generate-themed-decision-document.sdp.md new file mode 100644 index 00000000..6148104a --- /dev/null +++ b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-001-generate-themed-decision-document.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.themed-decision-architecture.generate-themed-decision-document +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.themed-decision-architecture +--- +# Generate themed decision document + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Generate themed decision document" from architect/specs/themed-decision-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-002-theme-tag-in-decision-file.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-002-theme-tag-in-decision-file.sdp.md new file mode 100644 index 00000000..8464cb79 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-002-theme-tag-in-decision-file.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.themed-decision-architecture.theme-tag-in-decision-file +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.themed-decision-architecture +--- +# Theme tag in decision file + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Theme tag in decision file" from architect/specs/themed-decision-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-003-adr-with-dependency-declaration.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-003-adr-with-dependency-declaration.sdp.md new file mode 100644 index 00000000..3b43fc5c --- /dev/null +++ b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-003-adr-with-dependency-declaration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.themed-decision-architecture.adr-with-dependency-declaration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.themed-decision-architecture +--- +# ADR with dependency declaration + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "ADR with dependency declaration" from architect/specs/themed-decision-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-004-generate-dependency-graph.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-004-generate-dependency-graph.sdp.md new file mode 100644 index 00000000..fa370c53 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-004-generate-dependency-graph.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.themed-decision-architecture.generate-dependency-graph +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.themed-decision-architecture +--- +# Generate dependency graph + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Generate dependency graph" from architect/specs/themed-decision-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-005-layer-information-in-generated-docs.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-005-layer-information-in-generated-docs.sdp.md new file mode 100644 index 00000000..19079c4d --- /dev/null +++ b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-005-layer-information-in-generated-docs.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.themed-decision-architecture.layer-information-in-generated-docs +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.themed-decision-architecture +--- +# Layer information in generated docs + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Layer information in generated docs" from architect/specs/themed-decision-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-006-port-adr-from-old-format-to-feature-file.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-006-port-adr-from-old-format-to-feature-file.sdp.md new file mode 100644 index 00000000..3ea877ad --- /dev/null +++ b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-006-port-adr-from-old-format-to-feature-file.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.themed-decision-architecture.port-adr-from-old-format-to-feature-file +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.themed-decision-architecture +--- +# Port ADR from old format to feature file + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Port ADR from old format to feature file" from architect/specs/themed-decision-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-007-review-for-validity-during-migration.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-007-review-for-validity-during-migration.sdp.md new file mode 100644 index 00000000..becac5f6 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-007-review-for-validity-during-migration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.themed-decision-architecture.review-for-validity-during-migration +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.themed-decision-architecture +--- +# Review for validity during migration + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Review for validity during migration" from architect/specs/themed-decision-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-008-generate-all-decision-artifacts.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-008-generate-all-decision-artifacts.sdp.md new file mode 100644 index 00000000..20e2fdcd --- /dev/null +++ b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-008-generate-all-decision-artifacts.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.themed-decision-architecture.generate-all-decision-artifacts +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.themed-decision-architecture +--- +# Generate all decision artifacts + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Generate all decision artifacts" from architect/specs/themed-decision-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-001-store-and-bus-readiness-harnesses-exist-before-tranche-1-implementation.sdp.md b/specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-001-store-and-bus-readiness-harnesses-exist-before-tranche-1-implementation.sdp.md new file mode 100644 index 00000000..6a9815f3 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-001-store-and-bus-readiness-harnesses-exist-before-tranche-1-implementation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.tranche-0-readiness-harness-and-dependency-hardening.store-and-bus-readiness-harnesses-exist-before-tranche-1-implementation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-0-readiness-harness-and-dependency-hardening +--- +# Store and bus readiness harnesses exist before tranche 1 implementation + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Store and bus readiness harnesses exist before tranche 1 implementation" from architect/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-002-readiness-validation-remains-machine-verifiable.sdp.md b/specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-002-readiness-validation-remains-machine-verifiable.sdp.md new file mode 100644 index 00000000..00d73fd6 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-002-readiness-validation-remains-machine-verifiable.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.tranche-0-readiness-harness-and-dependency-hardening.readiness-validation-remains-machine-verifiable +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-0-readiness-harness-and-dependency-hardening +--- +# Readiness validation remains machine-verifiable + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Readiness validation remains machine-verifiable" from architect/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.feature diff --git a/specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-001-release-governance-points-to-pdr-002.sdp.md b/specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-001-release-governance-points-to-pdr-002.sdp.md new file mode 100644 index 00000000..25cb6141 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-001-release-governance-points-to-pdr-002.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.tranche-0-release-ci-and-docs-process-guardrails.release-governance-points-to-pdr-002 +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-0-release-ci-and-docs-process-guardrails +--- +# Release governance points to PDR-002 + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Release governance points to PDR-002" from architect/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.feature diff --git a/specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-002-docs-only-changes-still-run-architect-guard-and-docs-generation.sdp.md b/specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-002-docs-only-changes-still-run-architect-guard-and-docs-generation.sdp.md new file mode 100644 index 00000000..e567fcce --- /dev/null +++ b/specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-002-docs-only-changes-still-run-architect-guard-and-docs-generation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.tranche-0-release-ci-and-docs-process-guardrails.docs-only-changes-still-run-architect-guard-and-docs-generation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-0-release-ci-and-docs-process-guardrails +--- +# Docs-only changes still run architect guard and docs generation + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Docs-only changes still run architect guard and docs generation" from architect/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.feature diff --git a/specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-001-supporting-cleanup-does-not-bypass-the-auth-keystone.sdp.md b/specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-001-supporting-cleanup-does-not-bypass-the-auth-keystone.sdp.md new file mode 100644 index 00000000..a0ddb926 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-001-supporting-cleanup-does-not-bypass-the-auth-keystone.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.tranche-1-supporting-security-and-contract-sweep.supporting-cleanup-does-not-bypass-the-auth-keystone +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-1-supporting-security-and-contract-sweep +--- +# Supporting cleanup does not bypass the auth keystone + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Supporting cleanup does not bypass the auth keystone" from architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature diff --git a/specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-002-supporting-contract-gaps-fail-closed-after-remediation.sdp.md b/specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-002-supporting-contract-gaps-fail-closed-after-remediation.sdp.md new file mode 100644 index 00000000..5024d466 --- /dev/null +++ b/specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-002-supporting-contract-gaps-fail-closed-after-remediation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:platform.tranche-1-supporting-security-and-contract-sweep.supporting-contract-gaps-fail-closed-after-remediation +kind: example +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-1-supporting-security-and-contract-sweep +--- +# Supporting contract gaps fail closed after remediation + +## Intent + +- outcome: Architect scenario (not an SDP test carrier) "Supporting contract gaps fail closed after remediation" from architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature diff --git a/specs/unimplemented/current/phase-100-codec-driven-reference-generation.sdp.md b/specs/unimplemented/current/phase-100-codec-driven-reference-generation.sdp.md new file mode 100644 index 00000000..4215c799 --- /dev/null +++ b/specs/unimplemented/current/phase-100-codec-driven-reference-generation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.current.phase-100-codec-driven-reference-generation +kind: behavior +altitude: feature +readiness: idea +relations: + refines: spec:unimplemented.backlog +--- +# CodecDrivenReferenceGeneration + +## Intent + +- outcome: Non-implemented or in-flight work captured from docs-living/current/phase-100-codec-driven-reference-generation.md. diff --git a/specs/unimplemented/current/phase-100-themed-decision-architecture.sdp.md b/specs/unimplemented/current/phase-100-themed-decision-architecture.sdp.md new file mode 100644 index 00000000..b5e59cda --- /dev/null +++ b/specs/unimplemented/current/phase-100-themed-decision-architecture.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.current.phase-100-themed-decision-architecture +kind: behavior +altitude: feature +readiness: idea +relations: + refines: spec:unimplemented.backlog +--- +# ThemedDecisionArchitecture + +## Intent + +- outcome: Non-implemented or in-flight work captured from docs-living/current/phase-100-themed-decision-architecture.md. diff --git a/specs/unimplemented/current/phase-15-projection-categories-executable-tests.sdp.md b/specs/unimplemented/current/phase-15-projection-categories-executable-tests.sdp.md new file mode 100644 index 00000000..7716906a --- /dev/null +++ b/specs/unimplemented/current/phase-15-projection-categories-executable-tests.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.current.phase-15-projection-categories-executable-tests +kind: behavior +altitude: feature +readiness: idea +relations: + refines: spec:unimplemented.backlog +--- +# ProjectionCategoriesExecutableTests + +## Intent + +- outcome: Non-implemented or in-flight work captured from docs-living/current/phase-15-projection-categories-executable-tests.md. diff --git a/specs/unimplemented/current/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md b/specs/unimplemented/current/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md new file mode 100644 index 00000000..111db6de --- /dev/null +++ b/specs/unimplemented/current/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.current.phase-22-agent-as-bounded-context-ai-driven-event-reactors +kind: behavior +altitude: feature +readiness: idea +relations: + refines: spec:unimplemented.backlog +--- +# Agent as Bounded Context - AI-Driven Event Reactors + +## Intent + +- outcome: Non-implemented or in-flight work captured from docs-living/current/phase-22-agent-as-bounded-context-ai-driven-event-reactors.md. diff --git a/specs/unimplemented/current/phase-22-agent-as-bounded-context.sdp.md b/specs/unimplemented/current/phase-22-agent-as-bounded-context.sdp.md new file mode 100644 index 00000000..8fb8d255 --- /dev/null +++ b/specs/unimplemented/current/phase-22-agent-as-bounded-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.current.phase-22-agent-as-bounded-context +kind: behavior +altitude: feature +readiness: idea +relations: + refines: spec:unimplemented.backlog +--- +# AgentAsBoundedContext + +## Intent + +- outcome: Non-implemented or in-flight work captured from docs-living/current/phase-22-agent-as-bounded-context.md. diff --git a/specs/unimplemented/current/phase-22-agent-churn-risk-completion.sdp.md b/specs/unimplemented/current/phase-22-agent-churn-risk-completion.sdp.md new file mode 100644 index 00000000..8872b7f2 --- /dev/null +++ b/specs/unimplemented/current/phase-22-agent-churn-risk-completion.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.current.phase-22-agent-churn-risk-completion +kind: behavior +altitude: feature +readiness: idea +relations: + refines: spec:unimplemented.backlog +--- +# AgentChurnRiskCompletion + +## Intent + +- outcome: Non-implemented or in-flight work captured from docs-living/current/phase-22-agent-churn-risk-completion.md. diff --git a/specs/unimplemented/current/phase-22-confirmed-order-cancellation.sdp.md b/specs/unimplemented/current/phase-22-confirmed-order-cancellation.sdp.md new file mode 100644 index 00000000..a70675e5 --- /dev/null +++ b/specs/unimplemented/current/phase-22-confirmed-order-cancellation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.current.phase-22-confirmed-order-cancellation +kind: behavior +altitude: feature +readiness: idea +relations: + refines: spec:unimplemented.backlog +--- +# ConfirmedOrderCancellation + +## Intent + +- outcome: Non-implemented or in-flight work captured from docs-living/current/phase-22-confirmed-order-cancellation.md. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-001-create-admin-directory.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-001-create-admin-directory.sdp.md new file mode 100644 index 00000000..a2b9051f --- /dev/null +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-001-create-admin-directory.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.admin-tooling-consolidation.create-admin-directory +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.admin-tooling-consolidation +--- +# Create admin/ directory + +## Intent + +- outcome: Unimplemented deliverable "Create admin/ directory" from architect/specs/platform/admin-tooling-consolidation.feature at examples/order-management/convex/admin/. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-002-projection-admin-endpoints.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-002-projection-admin-endpoints.sdp.md new file mode 100644 index 00000000..6468b62b --- /dev/null +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-002-projection-admin-endpoints.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.admin-tooling-consolidation.projection-admin-endpoints +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.admin-tooling-consolidation +--- +# Projection admin endpoints + +## Intent + +- outcome: Unimplemented deliverable "Projection admin endpoints" from architect/specs/platform/admin-tooling-consolidation.feature at examples/order-management/convex/admin/projections.ts. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-003-refactored-dlq-endpoints.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-003-refactored-dlq-endpoints.sdp.md new file mode 100644 index 00000000..fbec8489 --- /dev/null +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-003-refactored-dlq-endpoints.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.admin-tooling-consolidation.refactored-dlq-endpoints +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.admin-tooling-consolidation +--- +# Refactored DLQ endpoints + +## Intent + +- outcome: Unimplemented deliverable "Refactored DLQ endpoints" from architect/specs/platform/admin-tooling-consolidation.feature at examples/order-management/convex/admin/deadLetters.ts. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-004-event-flow-trace-query.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-004-event-flow-trace-query.sdp.md new file mode 100644 index 00000000..f42624d1 --- /dev/null +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-004-event-flow-trace-query.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.admin-tooling-consolidation.event-flow-trace-query +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.admin-tooling-consolidation +--- +# Event flow trace query + +## Intent + +- outcome: Unimplemented deliverable "Event flow trace query" from architect/specs/platform/admin-tooling-consolidation.feature at examples/order-management/convex/admin/diagnostics.ts. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-005-system-state-snapshot-query.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-005-system-state-snapshot-query.sdp.md new file mode 100644 index 00000000..79d3e744 --- /dev/null +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-005-system-state-snapshot-query.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.admin-tooling-consolidation.system-state-snapshot-query +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.admin-tooling-consolidation +--- +# System state snapshot query + +## Intent + +- outcome: Unimplemented deliverable "System state snapshot query" from architect/specs/platform/admin-tooling-consolidation.feature at examples/order-management/convex/admin/diagnostics.ts. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-006-durable-function-run-queries.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-006-durable-function-run-queries.sdp.md new file mode 100644 index 00000000..e33e1f68 --- /dev/null +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-006-durable-function-run-queries.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.admin-tooling-consolidation.durable-function-run-queries +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.admin-tooling-consolidation +--- +# Durable function run queries + +## Intent + +- outcome: Unimplemented deliverable "Durable function run queries" from architect/specs/platform/admin-tooling-consolidation.feature at examples/order-management/convex/admin/durableFunctions.ts. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-007-admin-authorization-wrapper.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-007-admin-authorization-wrapper.sdp.md new file mode 100644 index 00000000..1ef2339b --- /dev/null +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-007-admin-authorization-wrapper.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.admin-tooling-consolidation.admin-authorization-wrapper +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.admin-tooling-consolidation +--- +# Admin authorization wrapper + +## Intent + +- outcome: Unimplemented deliverable "Admin authorization wrapper" from architect/specs/platform/admin-tooling-consolidation.feature at examples/order-management/convex/admin/_auth.ts. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-008-admin-api-documentation.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-008-admin-api-documentation.sdp.md new file mode 100644 index 00000000..ce9c8019 --- /dev/null +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-008-admin-api-documentation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.admin-tooling-consolidation.admin-api-documentation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.admin-tooling-consolidation +--- +# Admin API documentation + +## Intent + +- outcome: Unimplemented deliverable "Admin API documentation" from architect/specs/platform/admin-tooling-consolidation.feature at docs/operations/ADMIN-API.md. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-001-high-value-agent-config.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-001-high-value-agent-config.sdp.md new file mode 100644 index 00000000..4ef1060a --- /dev/null +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-001-high-value-agent-config.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-admin-frontend.high-value-agent-config +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# High-value agent config + +## Intent + +- outcome: Unimplemented deliverable "High-value agent config" from architect/specs/example-app/agent-admin-frontend.feature at order-management/convex/contexts/agent/high-value/_config.ts. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-002-high-value-pattern-definition.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-002-high-value-pattern-definition.sdp.md new file mode 100644 index 00000000..c529bfda --- /dev/null +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-002-high-value-pattern-definition.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-admin-frontend.high-value-pattern-definition +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# High-value pattern definition + +## Intent + +- outcome: Unimplemented deliverable "High-value pattern definition" from architect/specs/example-app/agent-admin-frontend.feature at order-management/convex/contexts/agent/high-value/_patterns/highValueOrder.ts. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-003-high-value-action-handler.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-003-high-value-action-handler.sdp.md new file mode 100644 index 00000000..0d38da80 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-003-high-value-action-handler.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-admin-frontend.high-value-action-handler +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# High-value action handler + +## Intent + +- outcome: Unimplemented deliverable "High-value action handler" from architect/specs/example-app/agent-admin-frontend.feature at order-management/convex/contexts/agent/high-value/handlers/analyzeEvent.ts. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-004-high-value-on-complete-handler.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-004-high-value-on-complete-handler.sdp.md new file mode 100644 index 00000000..b3a877d9 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-004-high-value-on-complete-handler.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-admin-frontend.high-value-on-complete-handler +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# High-value onComplete handler + +## Intent + +- outcome: Unimplemented deliverable "High-value onComplete handler" from architect/specs/example-app/agent-admin-frontend.feature at order-management/convex/contexts/agent/high-value/handlers/onComplete.ts. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-005-high-value-command-route.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-005-high-value-command-route.sdp.md new file mode 100644 index 00000000..f42d8a15 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-005-high-value-command-route.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-admin-frontend.high-value-command-route +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# High-value command route + +## Intent + +- outcome: Unimplemented deliverable "High-value command route" from architect/specs/example-app/agent-admin-frontend.feature at order-management/convex/contexts/agent/high-value/handlers/routeCommand.ts. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-006-high-value-event-bus-subscription.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-006-high-value-event-bus-subscription.sdp.md new file mode 100644 index 00000000..b30f05e1 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-006-high-value-event-bus-subscription.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-admin-frontend.high-value-event-bus-subscription +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# High-value EventBus subscription + +## Intent + +- outcome: Unimplemented deliverable "High-value EventBus subscription" from architect/specs/example-app/agent-admin-frontend.feature at order-management/convex/eventSubscriptions.ts. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-007-high-value-integration-test-real-llm.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-007-high-value-integration-test-real-llm.sdp.md new file mode 100644 index 00000000..4df73b7d --- /dev/null +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-007-high-value-integration-test-real-llm.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-admin-frontend.high-value-integration-test-real-llm +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# High-value integration test (real LLM) + +## Intent + +- outcome: Unimplemented deliverable "High-value integration test (real LLM)" from architect/specs/example-app/agent-admin-frontend.feature at order-management/tests/integration/agent/high-value-order.integration.test.ts. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-008-dead-letter-management-section-in-monitoring.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-008-dead-letter-management-section-in-monitoring.sdp.md new file mode 100644 index 00000000..60342a47 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-008-dead-letter-management-section-in-monitoring.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-admin-frontend.dead-letter-management-section-in-monitoring +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Dead letter management section in Monitoring + +## Intent + +- outcome: Unimplemented deliverable "Dead letter management section in Monitoring" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/app/admin/agents.tsx (Monitoring tab extension). diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-009-use-dead-letters-hook.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-009-use-dead-letters-hook.sdp.md new file mode 100644 index 00000000..44168929 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-009-use-dead-letters-hook.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-admin-frontend.use-dead-letters-hook +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# useDeadLetters hook + +## Intent + +- outcome: Unimplemented deliverable "useDeadLetters hook" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/hooks/use-dead-letters.ts. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-010-use-dead-letter-actions-hook.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-010-use-dead-letter-actions-hook.sdp.md new file mode 100644 index 00000000..97397ba1 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-010-use-dead-letter-actions-hook.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-admin-frontend.use-dead-letter-actions-hook +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# useDeadLetterActions hook + +## Intent + +- outcome: Unimplemented deliverable "useDeadLetterActions hook" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/hooks/use-dead-letter-actions.ts. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-011-decision-history-tab.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-011-decision-history-tab.sdp.md new file mode 100644 index 00000000..bad374e4 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-011-decision-history-tab.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-admin-frontend.decision-history-tab +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Decision history tab + +## Intent + +- outcome: Unimplemented deliverable "Decision history tab" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/app/admin/agents.tsx (new tab). diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-012-use-decision-history-hook-with-filters.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-012-use-decision-history-hook-with-filters.sdp.md new file mode 100644 index 00000000..db30fa71 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-012-use-decision-history-hook-with-filters.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-admin-frontend.use-decision-history-hook-with-filters +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# useDecisionHistory hook with filters + +## Intent + +- outcome: Unimplemented deliverable "useDecisionHistory hook with filters" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/hooks/use-decision-history.ts. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-013-toast-notification-integration-sonner.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-013-toast-notification-integration-sonner.sdp.md new file mode 100644 index 00000000..f3ebfdf3 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-013-toast-notification-integration-sonner.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-admin-frontend.toast-notification-integration-sonner +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Toast notification integration (Sonner) + +## Intent + +- outcome: Unimplemented deliverable "Toast notification integration (Sonner)" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/components/toast-provider.tsx. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-014-action-feedback-toasts.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-014-action-feedback-toasts.sdp.md new file mode 100644 index 00000000..307ad81f --- /dev/null +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-014-action-feedback-toasts.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-admin-frontend.action-feedback-toasts +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Action feedback toasts + +## Intent + +- outcome: Unimplemented deliverable "Action feedback toasts" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/hooks/use-approval-actions.ts (enhance). diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-015-dashboard-update-for-multi-agent.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-015-dashboard-update-for-multi-agent.sdp.md new file mode 100644 index 00000000..98e6477c --- /dev/null +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-015-dashboard-update-for-multi-agent.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-admin-frontend.dashboard-update-for-multi-agent +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Dashboard update for multi-agent + +## Intent + +- outcome: Unimplemented deliverable "Dashboard update for multi-agent" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/app/admin/agents.tsx. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-016-e2-e-step-definitions.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-016-e2-e-step-definitions.sdp.md new file mode 100644 index 00000000..b4ff2b70 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-016-e2-e-step-definitions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-admin-frontend.e2-e-step-definitions +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# E2E step definitions + +## Intent + +- outcome: Unimplemented deliverable "E2E step definitions" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/tests/e2e/steps/agent.steps.ts. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-017-agent-admin-page-page-object.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-017-agent-admin-page-page-object.sdp.md new file mode 100644 index 00000000..477aec6a --- /dev/null +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-017-agent-admin-page-page-object.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-admin-frontend.agent-admin-page-page-object +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# AgentAdminPage page object + +## Intent + +- outcome: Unimplemented deliverable "AgentAdminPage page object" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/tests/e2e/support/pages/AgentAdminPage.ts. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-018-tag-unimplemented-agent-e2e-scenarios-skip.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-018-tag-unimplemented-agent-e2e-scenarios-skip.sdp.md new file mode 100644 index 00000000..a923e377 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-018-tag-unimplemented-agent-e2e-scenarios-skip.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-admin-frontend.tag-unimplemented-agent-e2e-scenarios-skip +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Tag unimplemented agent e2e scenarios @skip + +## Intent + +- outcome: Unimplemented deliverable "Tag unimplemented agent e2e scenarios @skip" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/tests/e2e/features/admin/agent-approvals.feature. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-019-auth-integration-documentation.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-019-auth-integration-documentation.sdp.md new file mode 100644 index 00000000..cf20757e --- /dev/null +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-019-auth-integration-documentation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-admin-frontend.auth-integration-documentation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-admin-frontend +--- +# Auth integration documentation + +## Intent + +- outcome: Unimplemented deliverable "Auth integration documentation" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/hooks/use-reviewer-id.ts (JSDoc). diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-001-agent-component-definition.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-001-agent-component-definition.sdp.md new file mode 100644 index 00000000..7857f84e --- /dev/null +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-001-agent-component-definition.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-bc-component-isolation.agent-component-definition +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-bc-component-isolation +--- +# Agent component definition + +## Intent + +- outcome: Unimplemented deliverable "Agent component definition" from architect/specs/platform/agent-bc-component-isolation.feature at @libar-dev/platform-core/src/agent/component/convex.config.ts. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-002-agent-component-schema.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-002-agent-component-schema.sdp.md new file mode 100644 index 00000000..c5f96d8d --- /dev/null +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-002-agent-component-schema.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-bc-component-isolation.agent-component-schema +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-bc-component-isolation +--- +# Agent component schema + +## Intent + +- outcome: Unimplemented deliverable "Agent component schema" from architect/specs/platform/agent-bc-component-isolation.feature at @libar-dev/platform-core/src/agent/component/schema.ts. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-003-checkpoint-public-api.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-003-checkpoint-public-api.sdp.md new file mode 100644 index 00000000..ab3f8203 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-003-checkpoint-public-api.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-bc-component-isolation.checkpoint-public-api +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-bc-component-isolation +--- +# Checkpoint public API + +## Intent + +- outcome: Unimplemented deliverable "Checkpoint public API" from architect/specs/platform/agent-bc-component-isolation.feature at @libar-dev/platform-core/src/agent/component/checkpoints.ts. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-004-audit-public-api.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-004-audit-public-api.sdp.md new file mode 100644 index 00000000..7c7c4de0 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-004-audit-public-api.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-bc-component-isolation.audit-public-api +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-bc-component-isolation +--- +# Audit public API + +## Intent + +- outcome: Unimplemented deliverable "Audit public API" from architect/specs/platform/agent-bc-component-isolation.feature at @libar-dev/platform-core/src/agent/component/audit.ts. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-005-dead-letter-public-api.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-005-dead-letter-public-api.sdp.md new file mode 100644 index 00000000..69e0d5f1 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-005-dead-letter-public-api.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-bc-component-isolation.dead-letter-public-api +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-bc-component-isolation +--- +# Dead letter public API + +## Intent + +- outcome: Unimplemented deliverable "Dead letter public API" from architect/specs/platform/agent-bc-component-isolation.feature at @libar-dev/platform-core/src/agent/component/deadLetters.ts. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-006-command-public-api.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-006-command-public-api.sdp.md new file mode 100644 index 00000000..51f60892 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-006-command-public-api.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-bc-component-isolation.command-public-api +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-bc-component-isolation +--- +# Command public API + +## Intent + +- outcome: Unimplemented deliverable "Command public API" from architect/specs/platform/agent-bc-component-isolation.feature at @libar-dev/platform-core/src/agent/component/commands.ts. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-007-approval-public-api.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-007-approval-public-api.sdp.md new file mode 100644 index 00000000..f6e7f072 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-007-approval-public-api.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-bc-component-isolation.approval-public-api +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-bc-component-isolation +--- +# Approval public API + +## Intent + +- outcome: Unimplemented deliverable "Approval public API" from architect/specs/platform/agent-bc-component-isolation.feature at @libar-dev/platform-core/src/agent/component/approvals.ts. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-008-cross-component-query-pattern.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-008-cross-component-query-pattern.sdp.md new file mode 100644 index 00000000..d74e0ad9 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-008-cross-component-query-pattern.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-bc-component-isolation.cross-component-query-pattern +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-bc-component-isolation +--- +# Cross-component query pattern + +## Intent + +- outcome: Unimplemented deliverable "Cross-component query pattern" from architect/specs/platform/agent-bc-component-isolation.feature at @libar-dev/platform-core/src/agent/cross-bc-query.ts. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-001-agent-action-handler-factory.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-001-agent-action-handler-factory.sdp.md new file mode 100644 index 00000000..583764a7 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-001-agent-action-handler-factory.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-llm-integration.agent-action-handler-factory +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-llm-integration +--- +# Agent action handler factory + +## Intent + +- outcome: Unimplemented deliverable "Agent action handler factory" from architect/specs/platform/agent-llm-integration.feature at @libar-dev/platform-core/src/agent/action-handler.ts. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-002-llm-integrated-on-complete-handler.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-002-llm-integrated-on-complete-handler.sdp.md new file mode 100644 index 00000000..cc15d0d7 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-002-llm-integrated-on-complete-handler.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-llm-integration.llm-integrated-on-complete-handler +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-llm-integration +--- +# LLM-integrated onComplete handler + +## Intent + +- outcome: Unimplemented deliverable "LLM-integrated onComplete handler" from architect/specs/platform/agent-llm-integration.feature at @libar-dev/platform-core/src/agent/oncomplete-handler.ts. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-003-rate-limiter-integration.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-003-rate-limiter-integration.sdp.md new file mode 100644 index 00000000..f7e06af3 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-003-rate-limiter-integration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-llm-integration.rate-limiter-integration +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-llm-integration +--- +# Rate limiter integration + +## Intent + +- outcome: Unimplemented deliverable "Rate limiter integration" from architect/specs/platform/agent-llm-integration.feature at @libar-dev/platform-core/src/agent/rate-limiter.ts. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-004-cost-budget-tracking.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-004-cost-budget-tracking.sdp.md new file mode 100644 index 00000000..153780d2 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-004-cost-budget-tracking.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-llm-integration.cost-budget-tracking +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-llm-integration +--- +# Cost budget tracking + +## Intent + +- outcome: Unimplemented deliverable "Cost budget tracking" from architect/specs/platform/agent-llm-integration.feature at @libar-dev/platform-core/src/agent/cost-budget.ts. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-005-convex-dev-agent-thread-adapter.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-005-convex-dev-agent-thread-adapter.sdp.md new file mode 100644 index 00000000..15a892c3 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-005-convex-dev-agent-thread-adapter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-llm-integration.convex-dev-agent-thread-adapter +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-llm-integration +--- +# @convex-dev/agent thread adapter + +## Intent + +- outcome: Unimplemented deliverable "@convex-dev/agent thread adapter" from architect/specs/platform/agent-llm-integration.feature at @libar-dev/platform-core/src/agent/thread-adapter.ts. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-006-on-complete-in-create-agent-subscription-options.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-006-on-complete-in-create-agent-subscription-options.sdp.md new file mode 100644 index 00000000..ba09e18e --- /dev/null +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-006-on-complete-in-create-agent-subscription-options.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-llm-integration.on-complete-in-create-agent-subscription-options +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-llm-integration +--- +# onComplete in CreateAgentSubscriptionOptions + +## Intent + +- outcome: Unimplemented deliverable "onComplete in CreateAgentSubscriptionOptions" from architect/specs/platform/agent-llm-integration.feature at @libar-dev/platform-bus/src/agent-subscription.ts. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-007-circuit-breaker-for-llm.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-007-circuit-breaker-for-llm.sdp.md new file mode 100644 index 00000000..8a598f44 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-007-circuit-breaker-for-llm.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-llm-integration.circuit-breaker-for-llm +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-llm-integration +--- +# Circuit breaker for LLM + +## Intent + +- outcome: Unimplemented deliverable "Circuit breaker for LLM" from architect/specs/platform/agent-llm-integration.feature at @libar-dev/platform-core/src/agent/circuit-breaker.ts. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-008-agent-workpool-configuration.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-008-agent-workpool-configuration.sdp.md new file mode 100644 index 00000000..bbe42b0a --- /dev/null +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-008-agent-workpool-configuration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-llm-integration.agent-workpool-configuration +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-llm-integration +--- +# Agent workpool configuration + +## Intent + +- outcome: Unimplemented deliverable "Agent workpool configuration" from architect/specs/platform/agent-llm-integration.feature at examples/order-management/convex/convex.config.ts. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-009-action-mutation-integration-test.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-009-action-mutation-integration-test.sdp.md new file mode 100644 index 00000000..d0615fc4 --- /dev/null +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-009-action-mutation-integration-test.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.agent-llm-integration.action-mutation-integration-test +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.agent-llm-integration +--- +# Action/mutation integration test + +## Intent + +- outcome: Unimplemented deliverable "Action/mutation integration test" from architect/specs/platform/agent-llm-integration.feature at platform-core/tests/integration/agent/action-split.test.ts. diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-001-circuit-breaker-state-machine-pure.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-001-circuit-breaker-state-machine-pure.sdp.md new file mode 100644 index 00000000..210f3e0c --- /dev/null +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-001-circuit-breaker-state-machine-pure.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.circuit-breaker-pattern.circuit-breaker-state-machine-pure +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# Circuit breaker state machine (pure) + +## Intent + +- outcome: Unimplemented deliverable "Circuit breaker state machine (pure)" from architect/specs/platform/circuit-breaker-pattern.feature at @libar-dev/platform-core/src/monitoring/circuit-breaker/stateMachine.ts. diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-002-circuit-breaker-types.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-002-circuit-breaker-types.sdp.md new file mode 100644 index 00000000..5c9e2d29 --- /dev/null +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-002-circuit-breaker-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.circuit-breaker-pattern.circuit-breaker-types +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# Circuit breaker types + +## Intent + +- outcome: Unimplemented deliverable "Circuit breaker types" from architect/specs/platform/circuit-breaker-pattern.feature at @libar-dev/platform-core/src/monitoring/circuit-breaker/types.ts. diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-003-circuit-breakers-table-schema.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-003-circuit-breakers-table-schema.sdp.md new file mode 100644 index 00000000..f9718e63 --- /dev/null +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-003-circuit-breakers-table-schema.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.circuit-breaker-pattern.circuit-breakers-table-schema +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# circuitBreakers table schema + +## Intent + +- outcome: Unimplemented deliverable "circuitBreakers table schema" from architect/specs/platform/circuit-breaker-pattern.feature at examples/order-management/convex/schema.ts. diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-004-with-circuit-breaker-wrapper.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-004-with-circuit-breaker-wrapper.sdp.md new file mode 100644 index 00000000..10775a7d --- /dev/null +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-004-with-circuit-breaker-wrapper.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.circuit-breaker-pattern.with-circuit-breaker-wrapper +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# withCircuitBreaker wrapper + +## Intent + +- outcome: Unimplemented deliverable "withCircuitBreaker wrapper" from architect/specs/platform/circuit-breaker-pattern.feature at @libar-dev/platform-core/src/monitoring/circuit-breaker/withCircuitBreaker.ts. diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-005-load-circuit-state-query.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-005-load-circuit-state-query.sdp.md new file mode 100644 index 00000000..05dad513 --- /dev/null +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-005-load-circuit-state-query.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.circuit-breaker-pattern.load-circuit-state-query +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# loadCircuitState query + +## Intent + +- outcome: Unimplemented deliverable "loadCircuitState query" from architect/specs/platform/circuit-breaker-pattern.feature at examples/order-management/convex/monitoring/circuitBreakers.ts. diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-006-record-success-mutation.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-006-record-success-mutation.sdp.md new file mode 100644 index 00000000..481e7629 --- /dev/null +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-006-record-success-mutation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.circuit-breaker-pattern.record-success-mutation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# recordSuccess mutation + +## Intent + +- outcome: Unimplemented deliverable "recordSuccess mutation" from architect/specs/platform/circuit-breaker-pattern.feature at examples/order-management/convex/monitoring/circuitBreakers.ts. diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-007-record-failure-mutation.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-007-record-failure-mutation.sdp.md new file mode 100644 index 00000000..a6ac7051 --- /dev/null +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-007-record-failure-mutation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.circuit-breaker-pattern.record-failure-mutation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# recordFailure mutation + +## Intent + +- outcome: Unimplemented deliverable "recordFailure mutation" from architect/specs/platform/circuit-breaker-pattern.feature at examples/order-management/convex/monitoring/circuitBreakers.ts. diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-008-check-half-open-scheduled-mutation.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-008-check-half-open-scheduled-mutation.sdp.md new file mode 100644 index 00000000..a87ddf74 --- /dev/null +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-008-check-half-open-scheduled-mutation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.circuit-breaker-pattern.check-half-open-scheduled-mutation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# checkHalfOpen scheduled mutation + +## Intent + +- outcome: Unimplemented deliverable "checkHalfOpen scheduled mutation" from architect/specs/platform/circuit-breaker-pattern.feature at examples/order-management/convex/monitoring/circuitBreakers.ts. diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-009-on-circuit-probe-complete-handler.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-009-on-circuit-probe-complete-handler.sdp.md new file mode 100644 index 00000000..d9852535 --- /dev/null +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-009-on-circuit-probe-complete-handler.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.circuit-breaker-pattern.on-circuit-probe-complete-handler +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# onCircuitProbeComplete handler + +## Intent + +- outcome: Unimplemented deliverable "onCircuitProbeComplete handler" from architect/specs/platform/circuit-breaker-pattern.feature at examples/order-management/convex/monitoring/circuitBreakers.ts. diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-010-circuit-breaker-metrics.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-010-circuit-breaker-metrics.sdp.md new file mode 100644 index 00000000..5e27c00e --- /dev/null +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-010-circuit-breaker-metrics.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.circuit-breaker-pattern.circuit-breaker-metrics +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.circuit-breaker-pattern +--- +# Circuit breaker metrics + +## Intent + +- outcome: Unimplemented deliverable "Circuit breaker metrics" from architect/specs/platform/circuit-breaker-pattern.feature at examples/order-management/convex/monitoring/circuitBreakers.ts. diff --git a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-001-pdr-014-placeholder.sdp.md b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-001-pdr-014-placeholder.sdp.md new file mode 100644 index 00000000..3751897e --- /dev/null +++ b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-001-pdr-014-placeholder.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.component-boundary-authentication-convention.pdr-014-placeholder +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.component-boundary-authentication-convention +--- +# PDR-014 placeholder + +## Intent + +- outcome: Unimplemented deliverable "PDR-014 placeholder" from architect/specs/platform/component-boundary-authentication-convention.feature at libar-platform/architect/decisions/pdr-014-component-boundary-authentication-convention.feature. diff --git a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-002-canonical-verification-proof-contract.sdp.md b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-002-canonical-verification-proof-contract.sdp.md new file mode 100644 index 00000000..ceecc2cc --- /dev/null +++ b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-002-canonical-verification-proof-contract.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.component-boundary-authentication-convention.canonical-verification-proof-contract +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.component-boundary-authentication-convention +--- +# Canonical verificationProof contract + +## Intent + +- outcome: Unimplemented deliverable "Canonical verificationProof contract" from architect/specs/platform/component-boundary-authentication-convention.feature at PDR-014 and platform-core security surfaces. diff --git a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-003-verify-actor-helper.sdp.md b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-003-verify-actor-helper.sdp.md new file mode 100644 index 00000000..f512199a --- /dev/null +++ b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-003-verify-actor-helper.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.component-boundary-authentication-convention.verify-actor-helper +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.component-boundary-authentication-convention +--- +# verifyActor helper + +## Intent + +- outcome: Unimplemented deliverable "verifyActor helper" from architect/specs/platform/component-boundary-authentication-convention.feature at libar-platform/packages/platform-core/. diff --git a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-004-identity-bearing-mutation-migration.sdp.md b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-004-identity-bearing-mutation-migration.sdp.md new file mode 100644 index 00000000..2ffe3ba6 --- /dev/null +++ b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-004-identity-bearing-mutation-migration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.component-boundary-authentication-convention.identity-bearing-mutation-migration +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.component-boundary-authentication-convention +--- +# Identity-bearing mutation migration + +## Intent + +- outcome: Unimplemented deliverable "Identity-bearing mutation migration" from architect/specs/platform/component-boundary-authentication-convention.feature at approve, reject, audit.record, agentCommands.record, appendToStream. diff --git a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-005-contract-status-tagging-for-system-only-exceptions.sdp.md b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-005-contract-status-tagging-for-system-only-exceptions.sdp.md new file mode 100644 index 00000000..614544a2 --- /dev/null +++ b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-005-contract-status-tagging-for-system-only-exceptions.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.component-boundary-authentication-convention.contract-status-tagging-for-system-only-exceptions +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.component-boundary-authentication-convention +--- +# Contract-status tagging for system-only exceptions + +## Intent + +- outcome: Unimplemented deliverable "Contract-status tagging for system-only exceptions" from architect/specs/platform/component-boundary-authentication-convention.feature at mutated component surfaces. diff --git a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-006-component-boundary-auth-integration-suite.sdp.md b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-006-component-boundary-auth-integration-suite.sdp.md new file mode 100644 index 00000000..efcce202 --- /dev/null +++ b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-006-component-boundary-auth-integration-suite.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.component-boundary-authentication-convention.component-boundary-auth-integration-suite +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.component-boundary-authentication-convention +--- +# Component-boundary auth integration suite + +## Intent + +- outcome: Unimplemented deliverable "Component-boundary auth integration suite" from architect/specs/platform/component-boundary-authentication-convention.feature at libar-platform/packages/platform-core/tests/integration/security/component-boundary-auth.integration.test.ts. diff --git a/specs/unimplemented/deliverables/deterministic-id-hashing/d-001-deterministic-stream-id-function.sdp.md b/specs/unimplemented/deliverables/deterministic-id-hashing/d-001-deterministic-stream-id-function.sdp.md new file mode 100644 index 00000000..ed600fda --- /dev/null +++ b/specs/unimplemented/deliverables/deterministic-id-hashing/d-001-deterministic-stream-id-function.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.deterministic-id-hashing.deterministic-stream-id-function +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.deterministic-id-hashing +--- +# deterministicStreamId() function + +## Intent + +- outcome: Unimplemented deliverable "deterministicStreamId() function" from architect/specs/platform/deterministic-id-hashing.feature at @libar-dev/platform-core/src/uniqueness/deterministic-id.ts. diff --git a/specs/unimplemented/deliverables/deterministic-id-hashing/d-002-hash-algorithm-selection.sdp.md b/specs/unimplemented/deliverables/deterministic-id-hashing/d-002-hash-algorithm-selection.sdp.md new file mode 100644 index 00000000..8aa640ae --- /dev/null +++ b/specs/unimplemented/deliverables/deterministic-id-hashing/d-002-hash-algorithm-selection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.deterministic-id-hashing.hash-algorithm-selection +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.deterministic-id-hashing +--- +# Hash algorithm selection + +## Intent + +- outcome: Unimplemented deliverable "Hash algorithm selection" from architect/specs/platform/deterministic-id-hashing.feature at @libar-dev/platform-core/src/uniqueness/hash.ts. diff --git a/specs/unimplemented/deliverables/deterministic-id-hashing/d-003-conflict-error-handling.sdp.md b/specs/unimplemented/deliverables/deterministic-id-hashing/d-003-conflict-error-handling.sdp.md new file mode 100644 index 00000000..5f6a527d --- /dev/null +++ b/specs/unimplemented/deliverables/deterministic-id-hashing/d-003-conflict-error-handling.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.deterministic-id-hashing.conflict-error-handling +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.deterministic-id-hashing +--- +# Conflict error handling + +## Intent + +- outcome: Unimplemented deliverable "Conflict error handling" from architect/specs/platform/deterministic-id-hashing.feature at @libar-dev/platform-core/src/uniqueness/errors.ts. diff --git a/specs/unimplemented/deliverables/deterministic-id-hashing/d-004-pattern-documentation.sdp.md b/specs/unimplemented/deliverables/deterministic-id-hashing/d-004-pattern-documentation.sdp.md new file mode 100644 index 00000000..6240b0de --- /dev/null +++ b/specs/unimplemented/deliverables/deterministic-id-hashing/d-004-pattern-documentation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.deterministic-id-hashing.pattern-documentation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.deterministic-id-hashing +--- +# Pattern documentation + +## Intent + +- outcome: Unimplemented deliverable "Pattern documentation" from architect/specs/platform/deterministic-id-hashing.feature at docs/architecture/UNIQUENESS-PATTERNS.md. diff --git a/specs/unimplemented/deliverables/event-correctness-migration/d-001-global-position-consumer-inventory.sdp.md b/specs/unimplemented/deliverables/event-correctness-migration/d-001-global-position-consumer-inventory.sdp.md new file mode 100644 index 00000000..c9ebbf61 --- /dev/null +++ b/specs/unimplemented/deliverables/event-correctness-migration/d-001-global-position-consumer-inventory.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.event-correctness-migration.global-position-consumer-inventory +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.event-correctness-migration +--- +# globalPosition consumer inventory + +## Intent + +- outcome: Unimplemented deliverable "globalPosition consumer inventory" from architect/specs/platform/event-correctness-migration.feature at packet artifacts and implementation notes. diff --git a/specs/unimplemented/deliverables/event-correctness-migration/d-002-pdr-018-placeholder.sdp.md b/specs/unimplemented/deliverables/event-correctness-migration/d-002-pdr-018-placeholder.sdp.md new file mode 100644 index 00000000..5a59ba7a --- /dev/null +++ b/specs/unimplemented/deliverables/event-correctness-migration/d-002-pdr-018-placeholder.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.event-correctness-migration.pdr-018-placeholder +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.event-correctness-migration +--- +# PDR-018 placeholder + +## Intent + +- outcome: Unimplemented deliverable "PDR-018 placeholder" from architect/specs/platform/event-correctness-migration.feature at libar-platform/architect/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.feature. diff --git a/specs/unimplemented/deliverables/event-correctness-migration/d-003-pdr-015-placeholder.sdp.md b/specs/unimplemented/deliverables/event-correctness-migration/d-003-pdr-015-placeholder.sdp.md new file mode 100644 index 00000000..50019b30 --- /dev/null +++ b/specs/unimplemented/deliverables/event-correctness-migration/d-003-pdr-015-placeholder.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.event-correctness-migration.pdr-015-placeholder +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.event-correctness-migration +--- +# PDR-015 placeholder + +## Intent + +- outcome: Unimplemented deliverable "PDR-015 placeholder" from architect/specs/platform/event-correctness-migration.feature at libar-platform/architect/decisions/pdr-015-global-position-numeric-representation.feature. diff --git a/specs/unimplemented/deliverables/event-correctness-migration/d-004-append-to-stream-idempotency-migration.sdp.md b/specs/unimplemented/deliverables/event-correctness-migration/d-004-append-to-stream-idempotency-migration.sdp.md new file mode 100644 index 00000000..5df9d14d --- /dev/null +++ b/specs/unimplemented/deliverables/event-correctness-migration/d-004-append-to-stream-idempotency-migration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.event-correctness-migration.append-to-stream-idempotency-migration +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.event-correctness-migration +--- +# appendToStream idempotency migration + +## Intent + +- outcome: Unimplemented deliverable "appendToStream idempotency migration" from architect/specs/platform/event-correctness-migration.feature at libar-platform/packages/platform-core/ and platform-store/. diff --git a/specs/unimplemented/deliverables/event-correctness-migration/d-005-global-position-representation-migration-and-compat-reader.sdp.md b/specs/unimplemented/deliverables/event-correctness-migration/d-005-global-position-representation-migration-and-compat-reader.sdp.md new file mode 100644 index 00000000..1a76d408 --- /dev/null +++ b/specs/unimplemented/deliverables/event-correctness-migration/d-005-global-position-representation-migration-and-compat-reader.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.event-correctness-migration.global-position-representation-migration-and-compat-reader +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.event-correctness-migration +--- +# globalPosition representation migration and compat reader + +## Intent + +- outcome: Unimplemented deliverable "globalPosition representation migration and compat reader" from architect/specs/platform/event-correctness-migration.feature at libar-platform/packages/platform-store/ and downstream consumers. diff --git a/specs/unimplemented/deliverables/event-correctness-migration/d-006-canonical-pm-transition-map-parity.sdp.md b/specs/unimplemented/deliverables/event-correctness-migration/d-006-canonical-pm-transition-map-parity.sdp.md new file mode 100644 index 00000000..a9f60051 --- /dev/null +++ b/specs/unimplemented/deliverables/event-correctness-migration/d-006-canonical-pm-transition-map-parity.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.event-correctness-migration.canonical-pm-transition-map-parity +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.event-correctness-migration +--- +# Canonical PM transition map parity + +## Intent + +- outcome: Unimplemented deliverable "Canonical PM transition map parity" from architect/specs/platform/event-correctness-migration.feature at processManager/lifecycle.ts and parity tests. diff --git a/specs/unimplemented/deliverables/event-correctness-migration/d-007-event-correctness-integration-suite.sdp.md b/specs/unimplemented/deliverables/event-correctness-migration/d-007-event-correctness-integration-suite.sdp.md new file mode 100644 index 00000000..a656f4d0 --- /dev/null +++ b/specs/unimplemented/deliverables/event-correctness-migration/d-007-event-correctness-integration-suite.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.event-correctness-migration.event-correctness-integration-suite +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.event-correctness-migration +--- +# Event correctness integration suite + +## Intent + +- outcome: Unimplemented deliverable "Event correctness integration suite" from architect/specs/platform/event-correctness-migration.feature at libar-platform/packages/platform-store/tests/integration/event-correctness.integration.test.ts. diff --git a/specs/unimplemented/deliverables/health-observability/d-001-health-check-types.sdp.md b/specs/unimplemented/deliverables/health-observability/d-001-health-check-types.sdp.md new file mode 100644 index 00000000..46e573ee --- /dev/null +++ b/specs/unimplemented/deliverables/health-observability/d-001-health-check-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.health-observability.health-check-types +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# Health check types + +## Intent + +- outcome: Unimplemented deliverable "Health check types" from architect/specs/platform/health-observability.feature at @libar-dev/platform-core/src/monitoring/health/types.ts. diff --git a/specs/unimplemented/deliverables/health-observability/d-002-check-readiness-query.sdp.md b/specs/unimplemented/deliverables/health-observability/d-002-check-readiness-query.sdp.md new file mode 100644 index 00000000..d6659424 --- /dev/null +++ b/specs/unimplemented/deliverables/health-observability/d-002-check-readiness-query.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.health-observability.check-readiness-query +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# checkReadiness query + +## Intent + +- outcome: Unimplemented deliverable "checkReadiness query" from architect/specs/platform/health-observability.feature at examples/order-management/convex/health.ts. diff --git a/specs/unimplemented/deliverables/health-observability/d-003-check-liveness-query.sdp.md b/specs/unimplemented/deliverables/health-observability/d-003-check-liveness-query.sdp.md new file mode 100644 index 00000000..66265516 --- /dev/null +++ b/specs/unimplemented/deliverables/health-observability/d-003-check-liveness-query.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.health-observability.check-liveness-query +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# checkLiveness query + +## Intent + +- outcome: Unimplemented deliverable "checkLiveness query" from architect/specs/platform/health-observability.feature at examples/order-management/convex/health.ts. diff --git a/specs/unimplemented/deliverables/health-observability/d-004-http-router-with-health-routes.sdp.md b/specs/unimplemented/deliverables/health-observability/d-004-http-router-with-health-routes.sdp.md new file mode 100644 index 00000000..b5508739 --- /dev/null +++ b/specs/unimplemented/deliverables/health-observability/d-004-http-router-with-health-routes.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.health-observability.http-router-with-health-routes +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# HTTP router with /health/* routes + +## Intent + +- outcome: Unimplemented deliverable "HTTP router with /health/* routes" from architect/specs/platform/health-observability.feature at examples/order-management/convex/http.ts. diff --git a/specs/unimplemented/deliverables/health-observability/d-005-metrics-types.sdp.md b/specs/unimplemented/deliverables/health-observability/d-005-metrics-types.sdp.md new file mode 100644 index 00000000..4591fb71 --- /dev/null +++ b/specs/unimplemented/deliverables/health-observability/d-005-metrics-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.health-observability.metrics-types +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# Metrics types + +## Intent + +- outcome: Unimplemented deliverable "Metrics types" from architect/specs/platform/health-observability.feature at @libar-dev/platform-core/src/monitoring/metrics/types.ts. diff --git a/specs/unimplemented/deliverables/health-observability/d-006-metrics-collector.sdp.md b/specs/unimplemented/deliverables/health-observability/d-006-metrics-collector.sdp.md new file mode 100644 index 00000000..92d34508 --- /dev/null +++ b/specs/unimplemented/deliverables/health-observability/d-006-metrics-collector.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.health-observability.metrics-collector +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# MetricsCollector + +## Intent + +- outcome: Unimplemented deliverable "MetricsCollector" from architect/specs/platform/health-observability.feature at @libar-dev/platform-core/src/monitoring/metrics/collector.ts. diff --git a/specs/unimplemented/deliverables/health-observability/d-007-projection-lag-calculator.sdp.md b/specs/unimplemented/deliverables/health-observability/d-007-projection-lag-calculator.sdp.md new file mode 100644 index 00000000..ea1fd7bc --- /dev/null +++ b/specs/unimplemented/deliverables/health-observability/d-007-projection-lag-calculator.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.health-observability.projection-lag-calculator +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# Projection lag calculator + +## Intent + +- outcome: Unimplemented deliverable "Projection lag calculator" from architect/specs/platform/health-observability.feature at @libar-dev/platform-core/src/monitoring/metrics/projectionLag.ts. diff --git a/specs/unimplemented/deliverables/health-observability/d-008-workpool-depth-query.sdp.md b/specs/unimplemented/deliverables/health-observability/d-008-workpool-depth-query.sdp.md new file mode 100644 index 00000000..46a4b95b --- /dev/null +++ b/specs/unimplemented/deliverables/health-observability/d-008-workpool-depth-query.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.health-observability.workpool-depth-query +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# Workpool depth query + +## Intent + +- outcome: Unimplemented deliverable "Workpool depth query" from architect/specs/platform/health-observability.feature at examples/order-management/convex/health.ts. diff --git a/specs/unimplemented/deliverables/health-observability/d-009-system-health-aggregator.sdp.md b/specs/unimplemented/deliverables/health-observability/d-009-system-health-aggregator.sdp.md new file mode 100644 index 00000000..e6a70f3d --- /dev/null +++ b/specs/unimplemented/deliverables/health-observability/d-009-system-health-aggregator.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.health-observability.system-health-aggregator +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.health-observability +--- +# System health aggregator + +## Intent + +- outcome: Unimplemented deliverable "System health aggregator" from architect/specs/platform/health-observability.feature at @libar-dev/platform-core/src/monitoring/health/aggregator.ts. diff --git a/specs/unimplemented/deliverables/integration-patterns-21a/d-001-context-map-registry.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21a/d-001-context-map-registry.sdp.md new file mode 100644 index 00000000..c1eccdde --- /dev/null +++ b/specs/unimplemented/deliverables/integration-patterns-21a/d-001-context-map-registry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.integration-patterns-21a.context-map-registry +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# Context Map registry + +## Intent + +- outcome: Unimplemented deliverable "Context Map registry" from architect/specs/platform/integration-patterns-21a.feature at @libar-dev/platform-core/src/integration/context-map.ts. diff --git a/specs/unimplemented/deliverables/integration-patterns-21a/d-002-context-map-documentation.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21a/d-002-context-map-documentation.sdp.md new file mode 100644 index 00000000..4390d888 --- /dev/null +++ b/specs/unimplemented/deliverables/integration-patterns-21a/d-002-context-map-documentation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.integration-patterns-21a.context-map-documentation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# Context Map documentation + +## Intent + +- outcome: Unimplemented deliverable "Context Map documentation" from architect/specs/platform/integration-patterns-21a.feature at docs/architecture/CONTEXT-MAP.md. diff --git a/specs/unimplemented/deliverables/integration-patterns-21a/d-003-published-language-registry.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21a/d-003-published-language-registry.sdp.md new file mode 100644 index 00000000..f5022aef --- /dev/null +++ b/specs/unimplemented/deliverables/integration-patterns-21a/d-003-published-language-registry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.integration-patterns-21a.published-language-registry +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# Published Language registry + +## Intent + +- outcome: Unimplemented deliverable "Published Language registry" from architect/specs/platform/integration-patterns-21a.feature at @libar-dev/platform-core/src/integration/published-language.ts. diff --git a/specs/unimplemented/deliverables/integration-patterns-21a/d-004-to-published-language-converter.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21a/d-004-to-published-language-converter.sdp.md new file mode 100644 index 00000000..35593745 --- /dev/null +++ b/specs/unimplemented/deliverables/integration-patterns-21a/d-004-to-published-language-converter.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.integration-patterns-21a.to-published-language-converter +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# toPublishedLanguage() converter + +## Intent + +- outcome: Unimplemented deliverable "toPublishedLanguage() converter" from architect/specs/platform/integration-patterns-21a.feature at @libar-dev/platform-core/src/integration/converter.ts. diff --git a/specs/unimplemented/deliverables/integration-patterns-21a/d-005-acl-builder-enhancement.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21a/d-005-acl-builder-enhancement.sdp.md new file mode 100644 index 00000000..e091f132 --- /dev/null +++ b/specs/unimplemented/deliverables/integration-patterns-21a/d-005-acl-builder-enhancement.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.integration-patterns-21a.acl-builder-enhancement +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# ACL builder enhancement + +## Intent + +- outcome: Unimplemented deliverable "ACL builder enhancement" from architect/specs/platform/integration-patterns-21a.feature at @libar-dev/platform-core/src/integration/acl.ts. diff --git a/specs/unimplemented/deliverables/integration-patterns-21a/d-006-integration-event-metadata-extension.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21a/d-006-integration-event-metadata-extension.sdp.md new file mode 100644 index 00000000..f55f8100 --- /dev/null +++ b/specs/unimplemented/deliverables/integration-patterns-21a/d-006-integration-event-metadata-extension.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.integration-patterns-21a.integration-event-metadata-extension +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21a +--- +# IntegrationEventMetadata extension + +## Intent + +- outcome: Unimplemented deliverable "IntegrationEventMetadata extension" from architect/specs/platform/integration-patterns-21a.feature at @libar-dev/platform-core/src/integration/types.ts. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-001-upcaster-implementation.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-001-upcaster-implementation.sdp.md new file mode 100644 index 00000000..0fa1cc54 --- /dev/null +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-001-upcaster-implementation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.integration-patterns-21b.upcaster-implementation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Upcaster implementation + +## Intent + +- outcome: Unimplemented deliverable "Upcaster implementation" from architect/specs/platform/integration-patterns-21b.feature at @libar-dev/platform-core/src/integration/versioning.ts. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-002-downcaster-implementation.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-002-downcaster-implementation.sdp.md new file mode 100644 index 00000000..ae047b64 --- /dev/null +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-002-downcaster-implementation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.integration-patterns-21b.downcaster-implementation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Downcaster implementation + +## Intent + +- outcome: Unimplemented deliverable "Downcaster implementation" from architect/specs/platform/integration-patterns-21b.feature at @libar-dev/platform-core/src/integration/versioning.ts. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-003-migration-path-validation.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-003-migration-path-validation.sdp.md new file mode 100644 index 00000000..01354171 --- /dev/null +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-003-migration-path-validation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.integration-patterns-21b.migration-path-validation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Migration path validation + +## Intent + +- outcome: Unimplemented deliverable "Migration path validation" from architect/specs/platform/integration-patterns-21b.feature at @libar-dev/platform-core/src/integration/versioning.ts. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-004-contract-sample-generation.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-004-contract-sample-generation.sdp.md new file mode 100644 index 00000000..eb823c8e --- /dev/null +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-004-contract-sample-generation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.integration-patterns-21b.contract-sample-generation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Contract sample generation + +## Intent + +- outcome: Unimplemented deliverable "Contract sample generation" from architect/specs/platform/integration-patterns-21b.feature at @libar-dev/platform-core/src/integration/testing/samples.ts. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-005-producer-contract-tests.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-005-producer-contract-tests.sdp.md new file mode 100644 index 00000000..30b91763 --- /dev/null +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-005-producer-contract-tests.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.integration-patterns-21b.producer-contract-tests +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Producer contract tests + +## Intent + +- outcome: Unimplemented deliverable "Producer contract tests" from architect/specs/platform/integration-patterns-21b.feature at @libar-dev/platform-core/src/integration/testing/producer.ts. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-006-consumer-contract-tests.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-006-consumer-contract-tests.sdp.md new file mode 100644 index 00000000..31d3faa2 --- /dev/null +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-006-consumer-contract-tests.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.integration-patterns-21b.consumer-contract-tests +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Consumer contract tests + +## Intent + +- outcome: Unimplemented deliverable "Consumer contract tests" from architect/specs/platform/integration-patterns-21b.feature at @libar-dev/platform-core/src/integration/testing/consumer.ts. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-007-compatibility-verification.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-007-compatibility-verification.sdp.md new file mode 100644 index 00000000..2d1f48c8 --- /dev/null +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-007-compatibility-verification.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.integration-patterns-21b.compatibility-verification +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Compatibility verification + +## Intent + +- outcome: Unimplemented deliverable "Compatibility verification" from architect/specs/platform/integration-patterns-21b.feature at @libar-dev/platform-core/src/integration/testing/compatibility.ts. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-008-contract-violation-detection.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-008-contract-violation-detection.sdp.md new file mode 100644 index 00000000..f26bab5f --- /dev/null +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-008-contract-violation-detection.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.integration-patterns-21b.contract-violation-detection +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.integration-patterns-21b +--- +# Contract violation detection + +## Intent + +- outcome: Unimplemented deliverable "Contract violation detection" from architect/specs/platform/integration-patterns-21b.feature at @libar-dev/platform-core/src/integration/testing/violations.ts. diff --git a/specs/unimplemented/deliverables/production-hardening/d-001-metrics-collection-types.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-001-metrics-collection-types.sdp.md new file mode 100644 index 00000000..a7bf613a --- /dev/null +++ b/specs/unimplemented/deliverables/production-hardening/d-001-metrics-collection-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.production-hardening.metrics-collection-types +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Metrics collection types + +## Intent + +- outcome: Unimplemented deliverable "Metrics collection types" from architect/specs/platform/production-hardening.feature at @libar-dev/platform-core/src/monitoring/metrics.ts. diff --git a/specs/unimplemented/deliverables/production-hardening/d-002-metrics-collector.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-002-metrics-collector.sdp.md new file mode 100644 index 00000000..0bc99da0 --- /dev/null +++ b/specs/unimplemented/deliverables/production-hardening/d-002-metrics-collector.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.production-hardening.metrics-collector +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Metrics collector + +## Intent + +- outcome: Unimplemented deliverable "Metrics collector" from architect/specs/platform/production-hardening.feature at @libar-dev/platform-core/src/monitoring/collector.ts. diff --git a/specs/unimplemented/deliverables/production-hardening/d-003-health-check-queries.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-003-health-check-queries.sdp.md new file mode 100644 index 00000000..c825e2e6 --- /dev/null +++ b/specs/unimplemented/deliverables/production-hardening/d-003-health-check-queries.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.production-hardening.health-check-queries +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Health check queries + +## Intent + +- outcome: Unimplemented deliverable "Health check queries" from architect/specs/platform/production-hardening.feature at examples/order-management/convex/health.ts. diff --git a/specs/unimplemented/deliverables/production-hardening/d-004-health-http-router.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-004-health-http-router.sdp.md new file mode 100644 index 00000000..c3163fca --- /dev/null +++ b/specs/unimplemented/deliverables/production-hardening/d-004-health-http-router.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.production-hardening.health-http-router +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Health HTTP router + +## Intent + +- outcome: Unimplemented deliverable "Health HTTP router" from architect/specs/platform/production-hardening.feature at examples/order-management/convex/http.ts. diff --git a/specs/unimplemented/deliverables/production-hardening/d-005-circuit-breaker-implementation.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-005-circuit-breaker-implementation.sdp.md new file mode 100644 index 00000000..c291044b --- /dev/null +++ b/specs/unimplemented/deliverables/production-hardening/d-005-circuit-breaker-implementation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.production-hardening.circuit-breaker-implementation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Circuit breaker implementation + +## Intent + +- outcome: Unimplemented deliverable "Circuit breaker implementation" from architect/specs/platform/production-hardening.feature at @libar-dev/platform-core/src/monitoring/circuit-breaker.ts. diff --git a/specs/unimplemented/deliverables/production-hardening/d-006-admin-projection-endpoints.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-006-admin-projection-endpoints.sdp.md new file mode 100644 index 00000000..efff0400 --- /dev/null +++ b/specs/unimplemented/deliverables/production-hardening/d-006-admin-projection-endpoints.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.production-hardening.admin-projection-endpoints +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Admin projection endpoints + +## Intent + +- outcome: Unimplemented deliverable "Admin projection endpoints" from architect/specs/platform/production-hardening.feature at examples/order-management/convex/admin/projections.ts. diff --git a/specs/unimplemented/deliverables/production-hardening/d-007-admin-dlq-endpoints.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-007-admin-dlq-endpoints.sdp.md new file mode 100644 index 00000000..f568da2c --- /dev/null +++ b/specs/unimplemented/deliverables/production-hardening/d-007-admin-dlq-endpoints.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.production-hardening.admin-dlq-endpoints +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Admin DLQ endpoints + +## Intent + +- outcome: Unimplemented deliverable "Admin DLQ endpoints" from architect/specs/platform/production-hardening.feature at examples/order-management/convex/admin/deadLetters.ts. diff --git a/specs/unimplemented/deliverables/production-hardening/d-008-admin-diagnostics.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-008-admin-diagnostics.sdp.md new file mode 100644 index 00000000..69260c22 --- /dev/null +++ b/specs/unimplemented/deliverables/production-hardening/d-008-admin-diagnostics.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.production-hardening.admin-diagnostics +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Admin diagnostics + +## Intent + +- outcome: Unimplemented deliverable "Admin diagnostics" from architect/specs/platform/production-hardening.feature at examples/order-management/convex/admin/diagnostics.ts. diff --git a/specs/unimplemented/deliverables/production-hardening/d-009-durable-function-run-diagnostics.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-009-durable-function-run-diagnostics.sdp.md new file mode 100644 index 00000000..444afa0e --- /dev/null +++ b/specs/unimplemented/deliverables/production-hardening/d-009-durable-function-run-diagnostics.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.production-hardening.durable-function-run-diagnostics +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Durable function run diagnostics + +## Intent + +- outcome: Unimplemented deliverable "Durable function run diagnostics" from architect/specs/platform/production-hardening.feature at examples/order-management/convex/admin/durableFunctions.ts. diff --git a/specs/unimplemented/deliverables/production-hardening/d-010-contract-violation-types.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-010-contract-violation-types.sdp.md new file mode 100644 index 00000000..b3873946 --- /dev/null +++ b/specs/unimplemented/deliverables/production-hardening/d-010-contract-violation-types.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.production-hardening.contract-violation-types +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Contract violation types + +## Intent + +- outcome: Unimplemented deliverable "Contract violation types" from architect/specs/platform/production-hardening.feature at @libar-dev/platform-core/src/monitoring/contracts.ts. diff --git a/specs/unimplemented/deliverables/production-hardening/d-011-grafana-dashboard-templates.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-011-grafana-dashboard-templates.sdp.md new file mode 100644 index 00000000..c4dfab17 --- /dev/null +++ b/specs/unimplemented/deliverables/production-hardening/d-011-grafana-dashboard-templates.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.production-hardening.grafana-dashboard-templates +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Grafana dashboard templates + +## Intent + +- outcome: Unimplemented deliverable "Grafana dashboard templates" from architect/specs/platform/production-hardening.feature at infrastructure/grafana/. diff --git a/specs/unimplemented/deliverables/production-hardening/d-012-runbook-documentation.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-012-runbook-documentation.sdp.md new file mode 100644 index 00000000..1fbb8dc1 --- /dev/null +++ b/specs/unimplemented/deliverables/production-hardening/d-012-runbook-documentation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.production-hardening.runbook-documentation +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Runbook documentation + +## Intent + +- outcome: Unimplemented deliverable "Runbook documentation" from architect/specs/platform/production-hardening.feature at docs/operations/RUNBOOK.md. diff --git a/specs/unimplemented/deliverables/production-hardening/d-013-circuit-breaker-retrier-integration.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-013-circuit-breaker-retrier-integration.sdp.md new file mode 100644 index 00000000..ca9fb7b2 --- /dev/null +++ b/specs/unimplemented/deliverables/production-hardening/d-013-circuit-breaker-retrier-integration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.production-hardening.circuit-breaker-retrier-integration +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Circuit breaker retrier integration + +## Intent + +- outcome: Unimplemented deliverable "Circuit breaker retrier integration" from architect/specs/platform/production-hardening.feature at @libar-dev/platform-core/src/monitoring/withCircuitBreaker.ts. diff --git a/specs/unimplemented/deliverables/production-hardening/d-014-dlq-action-retrier-pattern.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-014-dlq-action-retrier-pattern.sdp.md new file mode 100644 index 00000000..b52b4bb2 --- /dev/null +++ b/specs/unimplemented/deliverables/production-hardening/d-014-dlq-action-retrier-pattern.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.production-hardening.dlq-action-retrier-pattern +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# DLQ action retrier pattern + +## Intent + +- outcome: Unimplemented deliverable "DLQ action retrier pattern" from architect/specs/platform/production-hardening.feature at examples/order-management/convex/admin/dlqRetrier.ts. diff --git a/specs/unimplemented/deliverables/production-hardening/d-015-durable-function-decision-guide.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-015-durable-function-decision-guide.sdp.md new file mode 100644 index 00000000..320386c9 --- /dev/null +++ b/specs/unimplemented/deliverables/production-hardening/d-015-durable-function-decision-guide.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.production-hardening.durable-function-decision-guide +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.production-hardening +--- +# Durable function decision guide + +## Intent + +- outcome: Unimplemented deliverable "Durable function decision guide" from architect/specs/platform/production-hardening.feature at docs/architecture/DURABLE-FUNCTION-SELECTION.md. diff --git a/specs/unimplemented/deliverables/test-content-blocks/d-001-demo-item-1.sdp.md b/specs/unimplemented/deliverables/test-content-blocks/d-001-demo-item-1.sdp.md new file mode 100644 index 00000000..a48b1cfd --- /dev/null +++ b/specs/unimplemented/deliverables/test-content-blocks/d-001-demo-item-1.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.test-content-blocks.demo-item-1 +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.test-content-blocks +--- +# Demo item 1 + +## Intent + +- outcome: Unimplemented deliverable "Demo item 1" from architect/specs/test-content-blocks.feature at No. diff --git a/specs/unimplemented/deliverables/themed-decision-architecture/d-001-add-adr-theme-tag-to-registry.sdp.md b/specs/unimplemented/deliverables/themed-decision-architecture/d-001-add-adr-theme-tag-to-registry.sdp.md new file mode 100644 index 00000000..7333db50 --- /dev/null +++ b/specs/unimplemented/deliverables/themed-decision-architecture/d-001-add-adr-theme-tag-to-registry.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.themed-decision-architecture.add-adr-theme-tag-to-registry +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.themed-decision-architecture +--- +# Add `adr-theme` tag to registry + +## Intent + +- outcome: Unimplemented deliverable "Add `adr-theme` tag to registry" from architect/specs/themed-decision-architecture.feature at No. diff --git a/specs/unimplemented/deliverables/themed-decision-architecture/d-002-theme-grouped-decision-generator.sdp.md b/specs/unimplemented/deliverables/themed-decision-architecture/d-002-theme-grouped-decision-generator.sdp.md new file mode 100644 index 00000000..c1a0701d --- /dev/null +++ b/specs/unimplemented/deliverables/themed-decision-architecture/d-002-theme-grouped-decision-generator.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.themed-decision-architecture.theme-grouped-decision-generator +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.themed-decision-architecture +--- +# Theme-grouped decision generator + +## Intent + +- outcome: Unimplemented deliverable "Theme-grouped decision generator" from architect/specs/themed-decision-architecture.feature at No. diff --git a/specs/unimplemented/deliverables/themed-decision-architecture/d-003-dependency-graph-generator.sdp.md b/specs/unimplemented/deliverables/themed-decision-architecture/d-003-dependency-graph-generator.sdp.md new file mode 100644 index 00000000..d562af5e --- /dev/null +++ b/specs/unimplemented/deliverables/themed-decision-architecture/d-003-dependency-graph-generator.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.themed-decision-architecture.dependency-graph-generator +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.themed-decision-architecture +--- +# Dependency graph generator + +## Intent + +- outcome: Unimplemented deliverable "Dependency graph generator" from architect/specs/themed-decision-architecture.feature at No. diff --git a/specs/unimplemented/deliverables/themed-decision-architecture/d-004-adr-migration-scripts.sdp.md b/specs/unimplemented/deliverables/themed-decision-architecture/d-004-adr-migration-scripts.sdp.md new file mode 100644 index 00000000..1eda65cd --- /dev/null +++ b/specs/unimplemented/deliverables/themed-decision-architecture/d-004-adr-migration-scripts.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.themed-decision-architecture.adr-migration-scripts +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.themed-decision-architecture +--- +# ADR migration scripts + +## Intent + +- outcome: Unimplemented deliverable "ADR migration scripts" from architect/specs/themed-decision-architecture.feature at No. diff --git a/specs/unimplemented/deliverables/themed-decision-architecture/d-005-review-and-port-33-active-ad-rs.sdp.md b/specs/unimplemented/deliverables/themed-decision-architecture/d-005-review-and-port-33-active-ad-rs.sdp.md new file mode 100644 index 00000000..41e474c7 --- /dev/null +++ b/specs/unimplemented/deliverables/themed-decision-architecture/d-005-review-and-port-33-active-ad-rs.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.themed-decision-architecture.review-and-port-33-active-ad-rs +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.themed-decision-architecture +--- +# Review and port 33 active ADRs + +## Intent + +- outcome: Unimplemented deliverable "Review and port 33 active ADRs" from architect/specs/themed-decision-architecture.feature at No. diff --git a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-001-dependency-delta-memo.sdp.md b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-001-dependency-delta-memo.sdp.md new file mode 100644 index 00000000..6b56c431 --- /dev/null +++ b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-001-dependency-delta-memo.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.tranche-0-readiness-harness-and-dependency-hardening.dependency-delta-memo +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-0-readiness-harness-and-dependency-hardening +--- +# Dependency delta memo + +## Intent + +- outcome: Unimplemented deliverable "Dependency delta memo" from architect/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.feature at .full-review/04a-dependency-delta.md. diff --git a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-002-store-backend-integration-harness.sdp.md b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-002-store-backend-integration-harness.sdp.md new file mode 100644 index 00000000..4148e486 --- /dev/null +++ b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-002-store-backend-integration-harness.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.tranche-0-readiness-harness-and-dependency-hardening.store-backend-integration-harness +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-0-readiness-harness-and-dependency-hardening +--- +# Store backend integration harness + +## Intent + +- outcome: Unimplemented deliverable "Store backend integration harness" from architect/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.feature at libar-platform/packages/platform-store/tests/integration/store-harness.integration.test.ts. diff --git a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-003-bus-backend-integration-harness.sdp.md b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-003-bus-backend-integration-harness.sdp.md new file mode 100644 index 00000000..5f7f0648 --- /dev/null +++ b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-003-bus-backend-integration-harness.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.tranche-0-readiness-harness-and-dependency-hardening.bus-backend-integration-harness +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-0-readiness-harness-and-dependency-hardening +--- +# Bus backend integration harness + +## Intent + +- outcome: Unimplemented deliverable "Bus backend integration harness" from architect/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.feature at libar-platform/packages/platform-bus/tests/integration/command-bus-harness.integration.test.ts. diff --git a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-004-typecheck-and-vitest-config-alignment.sdp.md b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-004-typecheck-and-vitest-config-alignment.sdp.md new file mode 100644 index 00000000..9d0cbbbd --- /dev/null +++ b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-004-typecheck-and-vitest-config-alignment.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.tranche-0-readiness-harness-and-dependency-hardening.typecheck-and-vitest-config-alignment +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-0-readiness-harness-and-dependency-hardening +--- +# Typecheck and Vitest config alignment + +## Intent + +- outcome: Unimplemented deliverable "Typecheck and Vitest config alignment" from architect/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.feature at libar-platform/packages/platform-*/package.json. diff --git a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-005-strict-ts-and-es-lint-hardening.sdp.md b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-005-strict-ts-and-es-lint-hardening.sdp.md new file mode 100644 index 00000000..d7992039 --- /dev/null +++ b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-005-strict-ts-and-es-lint-hardening.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.tranche-0-readiness-harness-and-dependency-hardening.strict-ts-and-es-lint-hardening +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-0-readiness-harness-and-dependency-hardening +--- +# Strict TS and ESLint hardening + +## Intent + +- outcome: Unimplemented deliverable "Strict TS and ESLint hardening" from architect/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.feature at libar-platform/packages/platform-*/. diff --git a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-001-release-automation-aligned-to-architect-releases.sdp.md b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-001-release-automation-aligned-to-architect-releases.sdp.md new file mode 100644 index 00000000..ae7704d3 --- /dev/null +++ b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-001-release-automation-aligned-to-architect-releases.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.tranche-0-release-ci-and-docs-process-guardrails.release-automation-aligned-to-architect-releases +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-0-release-ci-and-docs-process-guardrails +--- +# Release automation aligned to architect releases + +## Intent + +- outcome: Unimplemented deliverable "Release automation aligned to architect releases" from architect/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.feature at .github/ and package manifests. diff --git a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-002-dependency-scanning-in-ci.sdp.md b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-002-dependency-scanning-in-ci.sdp.md new file mode 100644 index 00000000..32938b7b --- /dev/null +++ b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-002-dependency-scanning-in-ci.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.tranche-0-release-ci-and-docs-process-guardrails.dependency-scanning-in-ci +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-0-release-ci-and-docs-process-guardrails +--- +# Dependency scanning in CI + +## Intent + +- outcome: Unimplemented deliverable "Dependency scanning in CI" from architect/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.feature at .github/. diff --git a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-003-contract-status-convention-and-linting.sdp.md b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-003-contract-status-convention-and-linting.sdp.md new file mode 100644 index 00000000..127b10ac --- /dev/null +++ b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-003-contract-status-convention-and-linting.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.tranche-0-release-ci-and-docs-process-guardrails.contract-status-convention-and-linting +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-0-release-ci-and-docs-process-guardrails +--- +# Contract-status convention and linting + +## Intent + +- outcome: Unimplemented deliverable "Contract-status convention and linting" from architect/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.feature at libar-platform/architect/ and lint config. diff --git a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-004-convex-es-rename-guard.sdp.md b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-004-convex-es-rename-guard.sdp.md new file mode 100644 index 00000000..faf15803 --- /dev/null +++ b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-004-convex-es-rename-guard.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.tranche-0-release-ci-and-docs-process-guardrails.convex-es-rename-guard +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-0-release-ci-and-docs-process-guardrails +--- +# @convex-es rename guard + +## Intent + +- outcome: Unimplemented deliverable "@convex-es rename guard" from architect/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.feature at lint config and docs checks. diff --git a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-005-docs-process-validation-workflow.sdp.md b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-005-docs-process-validation-workflow.sdp.md new file mode 100644 index 00000000..b9ce2957 --- /dev/null +++ b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-005-docs-process-validation-workflow.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.tranche-0-release-ci-and-docs-process-guardrails.docs-process-validation-workflow +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-0-release-ci-and-docs-process-guardrails +--- +# Docs/process validation workflow + +## Intent + +- outcome: Unimplemented deliverable "Docs/process validation workflow" from architect/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.feature at .github/workflows/docs-process-validation.yml. diff --git a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-001-ensure-test-environment-fail-closed.sdp.md b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-001-ensure-test-environment-fail-closed.sdp.md new file mode 100644 index 00000000..5f3328e7 --- /dev/null +++ b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-001-ensure-test-environment-fail-closed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.tranche-1-supporting-security-and-contract-sweep.ensure-test-environment-fail-closed +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-1-supporting-security-and-contract-sweep +--- +# ensureTestEnvironment fail-closed + +## Intent + +- outcome: Unimplemented deliverable "ensureTestEnvironment fail-closed" from architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature at libar-platform/packages/platform-core/. diff --git a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-002-correlation-id-required-at-validator-boundary.sdp.md b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-002-correlation-id-required-at-validator-boundary.sdp.md new file mode 100644 index 00000000..ae1543e3 --- /dev/null +++ b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-002-correlation-id-required-at-validator-boundary.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.tranche-1-supporting-security-and-contract-sweep.correlation-id-required-at-validator-boundary +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-1-supporting-security-and-contract-sweep +--- +# correlationId required at validator boundary + +## Intent + +- outcome: Unimplemented deliverable "correlationId required at validator boundary" from architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature at appendToStream validators and callers. diff --git a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-003-full-length-uui-dv7-helper-centralization.sdp.md b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-003-full-length-uui-dv7-helper-centralization.sdp.md new file mode 100644 index 00000000..dd580f82 --- /dev/null +++ b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-003-full-length-uui-dv7-helper-centralization.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.tranche-1-supporting-security-and-contract-sweep.full-length-uui-dv7-helper-centralization +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-1-supporting-security-and-contract-sweep +--- +# Full-length UUIDv7 helper centralization + +## Intent + +- outcome: Unimplemented deliverable "Full-length UUIDv7 helper centralization" from architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature at ids/generator.ts and callers. diff --git a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-004-reviewer-authorization-default-deny-migration.sdp.md b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-004-reviewer-authorization-default-deny-migration.sdp.md new file mode 100644 index 00000000..fccbbce4 --- /dev/null +++ b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-004-reviewer-authorization-default-deny-migration.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.tranche-1-supporting-security-and-contract-sweep.reviewer-authorization-default-deny-migration +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-1-supporting-security-and-contract-sweep +--- +# Reviewer authorization default-deny migration + +## Intent + +- outcome: Unimplemented deliverable "Reviewer authorization default-deny migration" from architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature at authorization middleware and call sites. diff --git a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-005-approval-expiration-ordering-fix.sdp.md b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-005-approval-expiration-ordering-fix.sdp.md new file mode 100644 index 00000000..06e3f8b1 --- /dev/null +++ b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-005-approval-expiration-ordering-fix.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.tranche-1-supporting-security-and-contract-sweep.approval-expiration-ordering-fix +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-1-supporting-security-and-contract-sweep +--- +# Approval expiration ordering fix + +## Intent + +- outcome: Unimplemented deliverable "Approval expiration ordering fix" from architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature at approveAction and rejectAction surfaces. diff --git a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-006-lifecycle-stubs-throw-or-are-removed.sdp.md b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-006-lifecycle-stubs-throw-or-are-removed.sdp.md new file mode 100644 index 00000000..89fe3cb2 --- /dev/null +++ b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-006-lifecycle-stubs-throw-or-are-removed.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.tranche-1-supporting-security-and-contract-sweep.lifecycle-stubs-throw-or-are-removed +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-1-supporting-security-and-contract-sweep +--- +# Lifecycle stubs throw or are removed + +## Intent + +- outcome: Unimplemented deliverable "Lifecycle stubs throw or are removed" from architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature at public lifecycle surfaces. diff --git a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-007-platform-store-dependency-decision-guardrails.sdp.md b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-007-platform-store-dependency-decision-guardrails.sdp.md new file mode 100644 index 00000000..61c13f23 --- /dev/null +++ b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-007-platform-store-dependency-decision-guardrails.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.tranche-1-supporting-security-and-contract-sweep.platform-store-dependency-decision-guardrails +kind: behavior +altitude: story +readiness: idea +relations: + refines: spec:platform.tranche-1-supporting-security-and-contract-sweep +--- +# platform-store dependency decision + guardrails + +## Intent + +- outcome: Unimplemented deliverable "platform-store dependency decision + guardrails" from architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature at libar-platform/architect/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.feature and libar-platform/architect/remediation/REMEDIATION_PLAN.md. diff --git a/specs/unimplemented/remaining/phase-100-themed-decision-architecture.sdp.md b/specs/unimplemented/remaining/phase-100-themed-decision-architecture.sdp.md new file mode 100644 index 00000000..dd74a5da --- /dev/null +++ b/specs/unimplemented/remaining/phase-100-themed-decision-architecture.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.remaining.phase-100-themed-decision-architecture +kind: behavior +altitude: feature +readiness: idea +relations: + refines: spec:unimplemented.backlog +--- +# ThemedDecisionArchitecture - Remaining Work + +## Intent + +- outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-100-themed-decision-architecture.md. diff --git a/specs/unimplemented/remaining/phase-18-production-hardening.sdp.md b/specs/unimplemented/remaining/phase-18-production-hardening.sdp.md new file mode 100644 index 00000000..563dba45 --- /dev/null +++ b/specs/unimplemented/remaining/phase-18-production-hardening.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.remaining.phase-18-production-hardening +kind: behavior +altitude: feature +readiness: idea +relations: + refines: spec:unimplemented.backlog +--- +# ProductionHardening - Remaining Work + +## Intent + +- outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-18-production-hardening.md. diff --git a/specs/unimplemented/remaining/phase-18-workpool-partitioning-strategy.sdp.md b/specs/unimplemented/remaining/phase-18-workpool-partitioning-strategy.sdp.md new file mode 100644 index 00000000..47632ed6 --- /dev/null +++ b/specs/unimplemented/remaining/phase-18-workpool-partitioning-strategy.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.remaining.phase-18-workpool-partitioning-strategy +kind: behavior +altitude: feature +readiness: idea +relations: + refines: spec:unimplemented.backlog +--- +# WorkpoolPartitioningStrategy - Remaining Work + +## Intent + +- outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-18-workpool-partitioning-strategy.md. diff --git a/specs/unimplemented/remaining/phase-20-reservation-pattern.sdp.md b/specs/unimplemented/remaining/phase-20-reservation-pattern.sdp.md new file mode 100644 index 00000000..8e2af170 --- /dev/null +++ b/specs/unimplemented/remaining/phase-20-reservation-pattern.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.remaining.phase-20-reservation-pattern +kind: behavior +altitude: feature +readiness: idea +relations: + refines: spec:unimplemented.backlog +--- +# ReservationPattern - Remaining Work + +## Intent + +- outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-20-reservation-pattern.md. diff --git a/specs/unimplemented/remaining/phase-21-integration-patterns-21b.sdp.md b/specs/unimplemented/remaining/phase-21-integration-patterns-21b.sdp.md new file mode 100644 index 00000000..73907621 --- /dev/null +++ b/specs/unimplemented/remaining/phase-21-integration-patterns-21b.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.remaining.phase-21-integration-patterns-21b +kind: behavior +altitude: feature +readiness: idea +relations: + refines: spec:unimplemented.backlog +--- +# IntegrationPatterns21b - Remaining Work + +## Intent + +- outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-21-integration-patterns-21b.md. diff --git a/specs/unimplemented/remaining/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md b/specs/unimplemented/remaining/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md new file mode 100644 index 00000000..d76849ed --- /dev/null +++ b/specs/unimplemented/remaining/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.remaining.phase-22-agent-as-bounded-context-ai-driven-event-reactors +kind: behavior +altitude: feature +readiness: idea +relations: + refines: spec:unimplemented.backlog +--- +# Agent as Bounded Context - AI-Driven Event Reactors - Remaining Work + +## Intent + +- outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-22-agent-as-bounded-context-ai-driven-event-reactors.md. diff --git a/specs/unimplemented/remaining/phase-22-agent-as-bounded-context.sdp.md b/specs/unimplemented/remaining/phase-22-agent-as-bounded-context.sdp.md new file mode 100644 index 00000000..37f629e6 --- /dev/null +++ b/specs/unimplemented/remaining/phase-22-agent-as-bounded-context.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.remaining.phase-22-agent-as-bounded-context +kind: behavior +altitude: feature +readiness: idea +relations: + refines: spec:unimplemented.backlog +--- +# AgentAsBoundedContext - Remaining Work + +## Intent + +- outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-22-agent-as-bounded-context.md. diff --git a/specs/unimplemented/remaining/phase-22-agent-churn-risk-completion.sdp.md b/specs/unimplemented/remaining/phase-22-agent-churn-risk-completion.sdp.md new file mode 100644 index 00000000..8942f312 --- /dev/null +++ b/specs/unimplemented/remaining/phase-22-agent-churn-risk-completion.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.remaining.phase-22-agent-churn-risk-completion +kind: behavior +altitude: feature +readiness: idea +relations: + refines: spec:unimplemented.backlog +--- +# AgentChurnRiskCompletion - Remaining Work + +## Intent + +- outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-22-agent-churn-risk-completion.md. diff --git a/specs/unimplemented/remaining/phase-22-confirmed-order-cancellation.sdp.md b/specs/unimplemented/remaining/phase-22-confirmed-order-cancellation.sdp.md new file mode 100644 index 00000000..1e0468e4 --- /dev/null +++ b/specs/unimplemented/remaining/phase-22-confirmed-order-cancellation.sdp.md @@ -0,0 +1,13 @@ +--- +id: spec:unimplemented.remaining.phase-22-confirmed-order-cancellation +kind: behavior +altitude: feature +readiness: idea +relations: + refines: spec:unimplemented.backlog +--- +# ConfirmedOrderCancellation - Remaining Work + +## Intent + +- outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-22-confirmed-order-cancellation.md. diff --git a/test/sdp-migration-guard.test.ts b/test/sdp-migration-guard.test.ts index e3ae9b31..70a4c4e1 100644 --- a/test/sdp-migration-guard.test.ts +++ b/test/sdp-migration-guard.test.ts @@ -69,7 +69,14 @@ describe("SDP migration guard", () => { expect(packs.length).toBeGreaterThan(0); const specs = carriers.filter((f) => f.endsWith(".sdp.md") && !f.endsWith(".pack.sdp.md")); - expect(specs.length).toBeGreaterThanOrEqual(200); + // Hundreds of executable scenarios plus unimplemented backlog Specs. + expect(specs.length).toBeGreaterThanOrEqual(3000); + + const examplesDirHit = walkFiles(join(ROOT, "specs", "behavior")).some((f) => + f.includes(".examples") && f.endsWith(".sdp.md"), + ); + expect(examplesDirHit).toBe(true); + expect(existsSync(join(ROOT, "specs", "unimplemented"))).toBe(true); const bindings = join(specsRoot, "platform", "sdp-bindings.ts"); expect(existsSync(bindings)).toBe(true); From 921b906d4978f152709497c73a2411fd5dc0afc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darko=20Miji=C4=87?= Date: Thu, 20 Aug 2026 00:06:46 +0200 Subject: [PATCH 4/6] fill migrated Specs with executable GWT and unimplemented intent Rewrite example Specs with Given/When/Then from the Cucumber scenarios (including Background), and enrich architect/unimplemented Specs with problem, rules, decision, and remaining-work prose instead of titles only. --- scripts/rewrite-spec-content.py | 408 ++++++++++++++++++ .../s-001-add-stock-successfully.sdp.md | 13 +- .../s-002-add-stock-with-reason.sdp.md | 10 +- ...add-stock-without-selecting-product.sdp.md | 11 +- .../s-004-cannot-add-zero-quantity.sdp.md | 11 +- ...5-cannot-add-stock-without-quantity.sdp.md | 9 +- .../behavior/frontend/admin/add-stock.sdp.md | 5 +- ...ts-dashboard-with-pending-approvals.sdp.md | 12 +- ...dashboard-with-no-pending-approvals.sdp.md | 11 +- ...e-to-approval-detail-from-dashboard.sdp.md | 11 +- ...pproval-list-with-pending-approvals.sdp.md | 14 +- .../s-005-filter-approvals-by-status.sdp.md | 11 +- ...approval-card-to-navigate-to-detail.sdp.md | 10 +- .../s-007-view-pending-approval-detail.sdp.md | 17 +- ...-008-view-already-approved-approval.sdp.md | 14 +- ...-009-view-already-rejected-approval.sdp.md | 12 +- .../s-010-view-expired-approval.sdp.md | 12 +- ...-conveyed-via-text-label-wcag-1-4-1.sdp.md | 11 +- ...12-approve-pending-action-with-note.sdp.md | 13 +- ...013-reject-pending-action-with-note.sdp.md | 11 +- .../s-014-approve-without-note.sdp.md | 11 +- .../s-015-error-during-approve-action.sdp.md | 13 +- ...016-cannot-act-on-expired-approvals.sdp.md | 11 +- ...iew-active-agents-in-monitoring-tab.sdp.md | 15 +- ...s-018-view-agent-checkpoint-details.sdp.md | 12 +- .../s-019-no-active-agents.sdp.md | 10 +- .../s-020-view-agent-decision-history.sdp.md | 14 +- ...view-decision-detail-with-reasoning.sdp.md | 12 +- .../s-022-empty-decision-history.sdp.md | 11 +- ...stomers-approaching-churn-threshold.sdp.md | 13 +- ...24-customer-risk-progress-indicator.sdp.md | 11 +- ...-no-customers-approaching-threshold.sdp.md | 11 +- ...o-low-stock-restock-approval-detail.sdp.md | 13 +- ...alert-approval-with-product-context.sdp.md | 17 +- ...pprove-low-stock-restock-suggestion.sdp.md | 12 +- ...reject-low-stock-restock-suggestion.sdp.md | 11 +- ...ue-order-vip-review-approval-detail.sdp.md | 13 +- ...e-order-approval-with-order-context.sdp.md | 17 +- ...ove-vip-review-for-high-value-order.sdp.md | 12 +- .../s-033-reject-vip-review-flag.sdp.md | 11 +- ...lidation-suggestion-approval-detail.sdp.md | 13 +- ...solidation-approval-with-order-list.sdp.md | 18 +- ...rove-order-consolidation-suggestion.sdp.md | 12 +- ...ject-order-consolidation-suggestion.sdp.md | 11 +- ...sion-history-filtered-by-agent-type.sdp.md | 11 +- ...low-stock-agent-decision-in-history.sdp.md | 12 +- ...lue-order-agent-decision-in-history.sdp.md | 12 +- ...olidation-agent-decision-in-history.sdp.md | 12 +- ...cts-approaching-low-stock-threshold.sdp.md | 13 +- ...-043-stock-level-progress-indicator.sdp.md | 11 +- ...pproval-card-is-keyboard-accessible.sdp.md | 12 +- ...der-announces-action-status-changes.sdp.md | 11 +- ...el-conveyed-via-text-not-just-color.sdp.md | 11 +- .../s-047-focus-trap-in-action-buttons.sdp.md | 12 +- .../s-048-handle-approval-not-found.sdp.md | 11 +- ...dle-network-error-loading-approvals.sdp.md | 12 +- .../s-050-route-level-error-boundary.sdp.md | 11 +- .../frontend/admin/agent-approvals.sdp.md | 3 +- .../s-001-create-product-successfully.sdp.md | 13 +- ...002-validation-errors-on-empty-form.sdp.md | 11 +- .../s-003-invalid-sku-format.sdp.md | 11 +- .../s-004-invalid-price-zero-value.sdp.md | 10 +- ...s-005-invalid-price-exceeds-maximum.sdp.md | 8 +- .../frontend/admin/create-product.sdp.md | 5 +- .../s-001-view-dashboard-stats.sdp.md | 10 +- .../s-002-show-low-stock-warning.sdp.md | 8 +- ...ck-action-navigates-to-create-order.sdp.md | 8 +- .../frontend/dashboard/dashboard.sdp.md | 3 +- ...duct-creation-to-order-confirmation.sdp.md | 18 +- ...nsufficient-stock-saga-compensation.sdp.md | 13 +- .../s-003-order-with-multiple-items.sdp.md | 18 +- ...ly-when-one-product-lacks-stock-dcb.sdp.md | 16 +- ...rigger-journey-churn-risk-detection.sdp.md | 26 +- ...r-journey-low-stock-alert-detection.sdp.md | 21 +- ...-journey-high-value-order-detection.sdp.md | 20 +- ...rney-order-consolidation-suggestion.sdp.md | 23 +- .../e2e-journeys/full-order-journey.sdp.md | 2 +- ...reate-and-submit-order-successfully.sdp.md | 13 +- .../s-002-cannot-submit-empty-cart.sdp.md | 11 +- .../s-003-update-quantity-in-cart.sdp.md | 10 +- .../s-004-remove-item-from-cart.sdp.md | 8 +- .../frontend/orders/create-order.sdp.md | 5 +- .../s-001-view-confirmed-order.sdp.md | 9 +- .../s-002-view-cancelled-order.sdp.md | 9 +- ...tus-updates-via-reactive-projection.sdp.md | 14 +- .../s-004-cancel-a-submitted-order.sdp.md | 13 +- ...pears-only-for-cancellable-statuses.sdp.md | 12 +- ...og-prevents-accidental-cancellation.sdp.md | 15 +- .../frontend/orders/order-detail.sdp.md | 2 +- .../s-001-view-all-orders.sdp.md | 9 +- .../s-002-navigate-to-create-order.sdp.md | 8 +- .../frontend/orders/view-orders.sdp.md | 2 +- ...001-view-products-with-stock-levels.sdp.md | 11 +- .../s-002-loading-state.sdp.md | 9 +- .../frontend/products/browse-products.sdp.md | 2 +- .../s-001-no-dead-letter-on-success.sdp.md | 9 +- .../s-002-no-dead-letter-on-canceled.sdp.md | 8 +- ...-003-creates-dead-letter-on-failure.sdp.md | 9 +- ...s-attempt-count-on-repeated-failure.sdp.md | 10 +- ...pdate-dead-letter-in-terminal-state.sdp.md | 10 +- ...cron-expires-approval-after-timeout.sdp.md | 9 +- ...expired-approval-cannot-be-approved.sdp.md | 8 +- ...tes-outreach-record-and-emits-event.sdp.md | 10 +- .../order-management/agent/on-complete.sdp.md | 12 +- ...1-decide-to-add-item-to-draft-order.sdp.md | 12 +- ...add-item-when-order-is-not-in-draft.sdp.md | 10 +- ...ject-add-item-with-invalid-quantity.sdp.md | 10 +- ...umulate-items-and-recalculate-total.sdp.md | 11 +- .../deciders/add-order-item-decider.sdp.md | 2 +- ...-001-decide-to-add-stock-to-product.sdp.md | 12 +- .../s-002-add-stock-with-reason.sdp.md | 10 +- ...reject-add-stock-with-zero-quantity.sdp.md | 10 +- ...ct-add-stock-with-negative-quantity.sdp.md | 10 +- .../deciders/add-stock-decider.sdp.md | 2 +- ...-001-decide-to-cancel-a-draft-order.sdp.md | 12 +- ...-decide-to-cancel-a-submitted-order.sdp.md | 11 +- ...-decide-to-cancel-a-confirmed-order.sdp.md | 12 +- ...-cancel-for-already-cancelled-order.sdp.md | 10 +- .../deciders/cancel-order-decider.sdp.md | 2 +- ...decide-to-confirm-a-submitted-order.sdp.md | 12 +- ...t-confirm-for-order-in-draft-status.sdp.md | 10 +- ...confirm-for-already-confirmed-order.sdp.md | 10 +- ...-reject-confirm-for-cancelled-order.sdp.md | 10 +- .../deciders/confirm-order-decider.sdp.md | 2 +- ...de-to-confirm-a-pending-reservation.sdp.md | 11 +- ...en-reservation-is-already-confirmed.sdp.md | 10 +- ...onfirm-when-reservation-is-released.sdp.md | 10 +- ...confirm-when-reservation-is-expired.sdp.md | 10 +- ...tion-has-passed-its-expiration-time.sdp.md | 10 +- .../confirm-reservation-decider.sdp.md | 2 +- ...create-a-new-order-when-none-exists.sdp.md | 11 +- ...ct-create-when-order-already-exists.sdp.md | 10 +- .../deciders/create-order-decider.sdp.md | 2 +- ...eate-a-new-product-when-none-exists.sdp.md | 11 +- ...-create-when-product-already-exists.sdp.md | 10 +- ...ject-create-with-empty-product-name.sdp.md | 10 +- .../s-004-reject-create-with-empty-sku.sdp.md | 10 +- ...s-005-reject-create-with-zero-price.sdp.md | 10 +- ...6-reject-create-with-negative-price.sdp.md | 10 +- .../deciders/create-product-decider.sdp.md | 2 +- ...ding-reservation-that-has-timed-out.sdp.md | 11 +- ...n-reservation-has-not-timed-out-yet.sdp.md | 10 +- ...en-reservation-is-already-confirmed.sdp.md | 10 +- ...hen-reservation-is-already-released.sdp.md | 10 +- ...when-reservation-is-already-expired.sdp.md | 10 +- .../expire-reservation-decider.sdp.md | 2 +- ...ll-state-with-product-created-event.sdp.md | 15 +- ...entory-state-with-stock-added-event.sdp.md | 10 +- ...03-evolve-inventory-from-zero-stock.sdp.md | 9 +- ...ory-state-with-stock-reserved-event.sdp.md | 10 +- ...ate-when-product-not-in-reservation.sdp.md | 10 +- ...-reservation-failed-event-no-change.sdp.md | 10 +- .../deciders/inventory-evolve.sdp.md | 2 +- ...eated-evolves-null-to-initial-state.sdp.md | 13 +- ...m-added-appends-item-to-empty-order.sdp.md | 11 +- ...ded-accumulates-with-existing-items.sdp.md | 10 +- ...oved-removes-item-and-updates-total.sdp.md | 10 +- ...bmitted-changes-status-to-submitted.sdp.md | 9 +- ...nfirmed-changes-status-to-confirmed.sdp.md | 9 +- ...nges-status-from-draft-to-cancelled.sdp.md | 9 +- ...-status-from-submitted-to-cancelled.sdp.md | 9 +- ...-status-from-confirmed-to-cancelled.sdp.md | 9 +- .../deciders/order-evolve.sdp.md | 2 +- ...de-to-release-a-pending-reservation.sdp.md | 12 +- ...-to-release-a-confirmed-reservation.sdp.md | 11 +- ...hen-reservation-is-already-released.sdp.md | 10 +- ...release-when-reservation-is-expired.sdp.md | 10 +- .../release-reservation-decider.sdp.md | 2 +- ...move-existing-item-from-draft-order.sdp.md | 12 +- ...ove-item-when-order-is-not-in-draft.sdp.md | 10 +- ...ect-remove-when-item-does-not-exist.sdp.md | 10 +- .../deciders/remove-order-item-decider.sdp.md | 2 +- ...on-state-with-reservation-confirmed.sdp.md | 10 +- ...servation-with-reservation-released.sdp.md | 9 +- ...servation-with-reservation-released.sdp.md | 9 +- ...eservation-with-reservation-expired.sdp.md | 9 +- .../deciders/reservation-evolve.sdp.md | 2 +- ...oducts-have-sufficient-availability.sdp.md | 12 +- ...-one-product-has-insufficient-stock.sdp.md | 11 +- ...rvation-when-product-does-not-exist.sdp.md | 10 +- ...reject-reservation-with-empty-items.sdp.md | 10 +- .../deciders/reserve-stock-decider.sdp.md | 2 +- ...de-to-submit-draft-order-with-items.sdp.md | 12 +- ...ubmit-for-order-not-in-draft-status.sdp.md | 10 +- ...ject-submit-for-order-with-no-items.sdp.md | 10 +- .../deciders/submit-order-decider.sdp.md | 2 +- ...fully-add-stock-to-existing-product.sdp.md | 11 +- ...tock-to-product-with-existing-stock.sdp.md | 9 +- ...t-add-stock-to-non-existent-product.sdp.md | 9 +- ...-is-idempotent-with-same-command-id.sdp.md | 9 +- .../inventory/add-stock.sdp.md | 3 +- ...ssfully-confirm-pending-reservation.sdp.md | 10 +- ...ot-confirm-non-existent-reservation.sdp.md | 9 +- ...nfirm-already-confirmed-reservation.sdp.md | 9 +- ...-is-idempotent-with-same-command-id.sdp.md | 9 +- .../inventory/confirm-reservation.sdp.md | 2 +- ...1-successfully-create-a-new-product.sdp.md | 9 +- ...not-create-product-with-existing-id.sdp.md | 9 +- ...-is-idempotent-with-same-command-id.sdp.md | 8 +- .../inventory/create-product.sdp.md | 3 +- ...s-001-sum-of-available-and-reserved.sdp.md | 9 +- ...nly-available-when-reserved-is-zero.sdp.md | 9 +- ...nly-reserved-when-available-is-zero.sdp.md | 9 +- .../s-004-both-quantities-are-zero.sdp.md | 9 +- ...5-cms-fields-match-input-parameters.sdp.md | 8 +- ...ial-quantities-and-version-are-zero.sdp.md | 9 +- ...-timestamps-are-set-to-current-time.sdp.md | 10 +- ...08-current-version-cms-is-unchanged.sdp.md | 10 +- ...9-missing-state-version-is-upgraded.sdp.md | 11 +- .../s-010-version-0-is-upgraded.sdp.md | 10 +- ...-fields-are-preserved-during-upcast.sdp.md | 9 +- .../s-012-future-version-throws-error.sdp.md | 9 +- .../inventory/inventory-domain.sdp.md | 10 +- .../s-001-passes-for-a-valid-product.sdp.md | 8 +- ...ot-found-for-null-product-reference.sdp.md | 8 +- ...und-for-undefined-product-reference.sdp.md | 8 +- ...4-passes-for-null-product-reference.sdp.md | 8 +- ...ses-for-undefined-product-reference.sdp.md | 8 +- ...already-exists-for-existing-product.sdp.md | 9 +- .../s-007-passes-for-standard-sku.sdp.md | 8 +- ...ses-for-sku-with-special-characters.sdp.md | 8 +- ...09-throws-invalid-sku-for-empty-sku.sdp.md | 8 +- ...invalid-sku-for-whitespace-only-sku.sdp.md | 8 +- ...11-passes-for-standard-product-name.sdp.md | 8 +- ...asses-for-product-name-with-numbers.sdp.md | 8 +- ...product-name-for-empty-product-name.sdp.md | 8 +- ...me-for-whitespace-only-product-name.sdp.md | 8 +- ...-015-passes-for-positive-integer-10.sdp.md | 8 +- ...s-016-passes-for-positive-integer-1.sdp.md | 8 +- ...17-throws-invalid-quantity-for-zero.sdp.md | 8 +- ...nvalid-quantity-for-negative-number.sdp.md | 9 +- ...ws-invalid-quantity-for-non-integer.sdp.md | 8 +- ...des-context-string-in-error-message.sdp.md | 8 +- .../inventory/product-invariants.sdp.md | 11 +- ...ssfully-release-pending-reservation.sdp.md | 10 +- ...-reservation-for-order-cancellation.sdp.md | 9 +- ...-is-idempotent-with-same-command-id.sdp.md | 9 +- .../inventory/release-reservation.sdp.md | 2 +- ...item-reservation-returns-count-of-1.sdp.md | 8 +- ...s-reservation-returns-correct-count.sdp.md | 8 +- ...tems-reservation-returns-count-of-0.sdp.md | 8 +- ...items-returns-sum-of-all-quantities.sdp.md | 8 +- ...05-single-item-returns-its-quantity.sdp.md | 8 +- .../s-006-empty-items-returns-0.sdp.md | 8 +- ...correct-reservation-id-and-order-id.sdp.md | 8 +- ...8-initializes-items-array-correctly.sdp.md | 9 +- .../s-009-sets-status-to-pending.sdp.md | 8 +- ...10-sets-expires-at-with-default-ttl.sdp.md | 9 +- .../s-011-supports-custom-ttl.sdp.md | 9 +- .../s-012-initializes-version-to-0.sdp.md | 8 +- ...tializes-with-current-state-version.sdp.md | 8 +- ...and-updated-at-to-current-timestamp.sdp.md | 10 +- ...se-when-reservation-has-not-expired.sdp.md | 8 +- ...s-true-when-reservation-has-expired.sdp.md | 8 +- ...n-is-confirmed-regardless-of-expiry.sdp.md | 8 +- ...on-is-released-regardless-of-expiry.sdp.md | 8 +- ...les-exact-expiry-boundary-correctly.sdp.md | 10 +- ...cms-when-already-at-current-version.sdp.md | 9 +- ...ng-state-version-to-current-version.sdp.md | 9 +- ...22-throws-error-for-future-versions.sdp.md | 8 +- ...-preserves-all-fields-during-upcast.sdp.md | 9 +- .../inventory/reservation-domain.sdp.md | 11 +- ...s-not-throw-when-reservation-exists.sdp.md | 8 +- ...-not-found-when-reservation-is-null.sdp.md | 8 +- ...found-when-reservation-is-undefined.sdp.md | 8 +- ...-not-throw-when-reservation-is-null.sdp.md | 8 +- ...throw-when-reservation-is-undefined.sdp.md | 8 +- ...eady-exists-when-reservation-exists.sdp.md | 9 +- ...s-not-throw-when-items-has-one-item.sdp.md | 8 +- ...throw-when-items-has-multiple-items.sdp.md | 8 +- ...servation-when-items-array-is-empty.sdp.md | 8 +- ...hrow-for-valid-item-with-quantity-5.sdp.md | 8 +- ...-not-throw-for-item-with-quantity-1.sdp.md | 8 +- ...-invalid-quantity-for-zero-quantity.sdp.md | 8 +- ...alid-quantity-for-negative-quantity.sdp.md | 8 +- ...d-quantity-for-non-integer-quantity.sdp.md | 8 +- ...servation-item-for-empty-product-id.sdp.md | 8 +- ...oes-not-throw-for-valid-items-array.sdp.md | 8 +- ...s-empty-reservation-for-empty-array.sdp.md | 8 +- ...-when-one-item-has-invalid-quantity.sdp.md | 8 +- .../s-019-has-correct-name-property.sdp.md | 8 +- .../s-020-has-correct-code-property.sdp.md | 8 +- .../s-021-has-correct-message-property.sdp.md | 8 +- .../s-022-has-correct-context-property.sdp.md | 9 +- .../s-023-can-have-undefined-context.sdp.md | 8 +- .../s-024-is-instance-of-error.sdp.md | 8 +- ...eck-returns-true-for-pending-status.sdp.md | 8 +- ...urns-false-for-non-pending-statuses.sdp.md | 8 +- ...ng-assert-passes-for-pending-status.sdp.md | 8 +- ...servation-not-pending-for-confirmed.sdp.md | 10 +- ...eservation-not-pending-for-released.sdp.md | 8 +- ...-validate-returns-valid-for-pending.sdp.md | 8 +- ...lidate-returns-invalid-for-released.sdp.md | 9 +- ...true-for-pending-with-future-expiry.sdp.md | 8 +- ...true-for-confirmed-with-past-expiry.sdp.md | 8 +- ...-true-for-released-with-past-expiry.sdp.md | 8 +- ...-false-for-pending-with-past-expiry.sdp.md | 8 +- ...sses-for-pending-with-future-expiry.sdp.md | 8 +- ...sses-for-confirmed-with-past-expiry.sdp.md | 8 +- ...eservation-expired-for-pending-with.sdp.md | 10 +- ...s-valid-for-pending-with-future-exp.sdp.md | 8 +- ...s-invalid-for-pending-with-past-exp.sdp.md | 8 +- ...s-true-for-pending-with-past-expiry.sdp.md | 8 +- ...turns-true-for-non-pending-statuses.sdp.md | 8 +- ...alse-for-pending-with-future-expiry.sdp.md | 8 +- ...passes-for-pending-with-past-expiry.sdp.md | 8 +- ...-for-confirmed-regardless-of-expiry.sdp.md | 8 +- ...reservation-not-expired-for-pending.sdp.md | 11 +- ...turns-valid-for-expired-reservation.sdp.md | 8 +- ...s-invalid-for-pending-with-future-e.sdp.md | 10 +- ...ll-returns-true-for-pending-and-not.sdp.md | 8 +- ...l-returns-false-for-confirmed-and-n.sdp.md | 8 +- ...l-returns-false-for-pending-and-exp.sdp.md | 8 +- ...ll-passes-for-pending-and-not-expir.sdp.md | 8 +- ...ll-throws-reservation-not-pending-f.sdp.md | 8 +- ...ll-throws-reservation-expired-for-p.sdp.md | 8 +- ...e-all-returns-valid-for-pending-and.sdp.md | 8 +- ...-all-returns-single-violation-for-c.sdp.md | 9 +- ...e-all-returns-violation-for-pending.sdp.md | 9 +- ...-returns-true-for-pending-and-expir.sdp.md | 8 +- ...-returns-false-for-confirmed-and-ex.sdp.md | 8 +- ...l-returns-false-for-pending-and-not.sdp.md | 8 +- ...-all-passes-for-pending-and-expired.sdp.md | 8 +- ...l-throws-reservation-not-pending-fo.sdp.md | 8 +- ...l-throws-reservation-not-expired-fo.sdp.md | 8 +- ...all-returns-valid-for-pending-and-e.sdp.md | 8 +- ...all-returns-single-violation-for-re.sdp.md | 9 +- ...all-returns-single-violation-for-pe.sdp.md | 9 +- .../inventory/reservation-invariants.sdp.md | 17 +- ...uccessfully-reserve-available-stock.sdp.md | 9 +- ...2-reserve-multiple-items-atomically.sdp.md | 10 +- ...ation-fails-when-insufficient-stock.sdp.md | 9 +- ...-item-reservation-is-all-or-nothing.sdp.md | 10 +- ...cannot-reserve-non-existent-product.sdp.md | 9 +- ...-is-idempotent-with-same-command-id.sdp.md | 9 +- .../inventory/reserve-stock.sdp.md | 2 +- ...001-passes-when-stock-is-sufficient.sdp.md | 8 +- ...requesting-exact-available-quantity.sdp.md | 8 +- ...ient-stock-when-stock-is-not-enough.sdp.md | 11 +- ...sufficient-stock-when-stock-is-zero.sdp.md | 8 +- ...-available-when-stock-is-sufficient.sdp.md | 8 +- ...ilable-when-requesting-exact-amount.sdp.md | 8 +- ...-deficit-when-stock-is-insufficient.sdp.md | 9 +- ...urns-correct-deficit-for-zero-stock.sdp.md | 9 +- .../inventory/stock-invariants.sdp.md | 8 +- ...der-uses-dcb-for-atomic-reservation.sdp.md | 13 +- ...-product-rejects-entire-reservation.sdp.md | 13 +- ...es-concurrent-reservation-conflicts.sdp.md | 13 +- ...duplicate-product-i-ds-are-rejected.sdp.md | 11 +- .../dcb-multi-product-reservation.sdp.md | 7 +- ...ubmitted-includes-customer-snapshot.sdp.md | 12 +- ...ent-does-not-block-order-submission.sdp.md | 12 +- ...omer-snapshot-is-immutable-in-event.sdp.md | 11 +- ...ng-customer-data-handled-gracefully.sdp.md | 12 +- ...e-upcasted-to-v2-with-null-customer.sdp.md | 11 +- ...events-are-not-modified-by-upcaster.sdp.md | 12 +- .../fat-events-order-submitted.sdp.md | 7 +- ...r-detail-view-shows-instant-updates.sdp.md | 12 +- ...rapid-updates-are-applied-correctly.sdp.md | 12 +- ...istic-update-rolls-back-on-conflict.sdp.md | 12 +- ...-event-stream-is-handled-gracefully.sdp.md | 11 +- .../reactive-order-detail.sdp.md | 7 +- ...eference-implementation-designation.sdp.md | 10 +- ...demonstrated-patterns-are-cataloged.sdp.md | 9 +- .../s-003-pattern-links-are-valid.sdp.md | 10 +- ...004-architecture-diagram-is-present.sdp.md | 11 +- .../reference-documentation.sdp.md | 7 +- ...dd-single-item-to-empty-draft-order.sdp.md | 12 +- ...2-add-multiple-items-to-draft-order.sdp.md | 12 +- ...cannot-add-items-to-submitted-order.sdp.md | 9 +- ...cannot-add-items-to-cancelled-order.sdp.md | 9 +- ...-cannot-add-item-with-zero-quantity.sdp.md | 9 +- ...not-add-item-with-negative-quantity.sdp.md | 9 +- ...cannot-add-item-with-negative-price.sdp.md | 9 +- .../order-management/orders/add-items.sdp.md | 3 +- .../s-001-cancel-draft-order.sdp.md | 10 +- .../s-002-cancel-submitted-order.sdp.md | 10 +- ...nnot-cancel-already-cancelled-order.sdp.md | 9 +- .../s-004-cancel-confirmed-order.sdp.md | 10 +- ...05-cannot-cancel-non-existent-order.sdp.md | 9 +- ...-is-idempotent-with-same-command-id.sdp.md | 9 +- .../orders/cancel-order.sdp.md | 3 +- ...cessfully-confirm-a-submitted-order.sdp.md | 10 +- .../s-002-cannot-confirm-a-draft-order.sdp.md | 10 +- ...-confirm-an-already-confirmed-order.sdp.md | 9 +- ...04-cannot-confirm-a-cancelled-order.sdp.md | 9 +- ...cannot-confirm-a-non-existent-order.sdp.md | 9 +- ...-is-idempotent-with-same-command-id.sdp.md | 9 +- .../orders/confirm-order.sdp.md | 3 +- ...001-successfully-create-a-new-order.sdp.md | 9 +- ...annot-create-order-with-existing-id.sdp.md | 9 +- ...-is-idempotent-with-same-command-id.sdp.md | 8 +- .../orders/create-order.sdp.md | 3 +- ...-001-empty-items-array-returns-zero.sdp.md | 8 +- .../s-002-single-item-total.sdp.md | 8 +- .../s-003-multiple-items-total.sdp.md | 8 +- ...antity-results-in-zero-contribution.sdp.md | 8 +- ...-price-results-in-zero-contribution.sdp.md | 8 +- ...ecimal-prices-are-handled-correctly.sdp.md | 8 +- ...e-provided-order-id-and-customer-id.sdp.md | 8 +- ...8-cms-initializes-with-draft-status.sdp.md | 8 +- ...-initializes-with-empty-items-array.sdp.md | 8 +- ...-initializes-with-zero-total-amount.sdp.md | 8 +- ...-011-cms-initializes-with-version-0.sdp.md | 8 +- ...tializes-with-current-state-version.sdp.md | 8 +- ...and-updated-at-to-current-timestamp.sdp.md | 10 +- ...rrent-version-is-returned-unchanged.sdp.md | 9 +- ...h-missing-state-version-is-upgraded.sdp.md | 9 +- ...ms-with-state-version-0-is-upgraded.sdp.md | 12 +- ...-fields-are-preserved-during-upcast.sdp.md | 10 +- .../orders/order-domain.sdp.md | 9 +- ...rns-true-for-draft-order-with-items.sdp.md | 8 +- ...alse-for-non-draft-order-with-items.sdp.md | 8 +- ...false-for-draft-order-without-items.sdp.md | 8 +- ...ow-for-valid-draft-order-with-items.sdp.md | 8 +- ...draft-for-submitted-order-fail-fast.sdp.md | 8 +- ...items-for-draft-order-with-no-items.sdp.md | 8 +- ...d-result-for-draft-order-with-items.sdp.md | 8 +- ...s-for-submitted-order-with-no-items.sdp.md | 9 +- ...ue-for-draft-order-under-item-limit.sdp.md | 8 +- ...l-returns-false-for-non-draft-order.sdp.md | 8 +- ...lse-for-draft-order-at-max-capacity.sdp.md | 8 +- ...w-for-valid-draft-order-under-limit.sdp.md | 8 +- ...draft-for-submitted-order-fail-fast.sdp.md | 8 +- ...xceeded-for-draft-order-at-capacity.sdp.md | 8 +- ...-result-for-draft-order-under-limit.sdp.md | 8 +- ...ons-for-submitted-order-at-capacity.sdp.md | 9 +- ...l-returns-expected-for-status-order.sdp.md | 10 +- ...-all-does-not-throw-for-draft-order.sdp.md | 8 +- ...-does-not-throw-for-submitted-order.sdp.md | 8 +- ...ready-confirmed-for-confirmed-order.sdp.md | 8 +- ...ready-cancelled-for-cancelled-order.sdp.md | 8 +- ...eturns-valid-result-for-draft-order.sdp.md | 8 +- ...ingle-violation-for-confirmed-order.sdp.md | 9 +- ...ingle-violation-for-cancelled-order.sdp.md | 9 +- .../orders/order-invariant-sets.sdp.md | 9 +- .../s-001-passes-for-a-valid-order.sdp.md | 8 +- ...-not-found-for-null-order-reference.sdp.md | 8 +- ...found-for-undefined-order-reference.sdp.md | 8 +- ...004-passes-for-null-order-reference.sdp.md | 8 +- ...asses-for-undefined-order-reference.sdp.md | 8 +- ...r-already-exists-for-existing-order.sdp.md | 9 +- ...-check-returns-true-for-draft-order.sdp.md | 8 +- ...k-returns-false-for-submitted-order.sdp.md | 8 +- ...s-009-assert-passes-for-draft-order.sdp.md | 8 +- ...not-in-draft-for-non-draft-statuses.sdp.md | 9 +- ...ck-returns-true-for-submitted-order.sdp.md | 8 +- ...check-returns-false-for-draft-order.sdp.md | 8 +- ...3-assert-passes-for-submitted-order.sdp.md | 8 +- ...ubmitted-for-non-submitted-statuses.sdp.md | 8 +- ...-check-returns-true-for-draft-order.sdp.md | 8 +- ...ck-returns-true-for-submitted-order.sdp.md | 8 +- ...k-returns-false-for-cancelled-order.sdp.md | 8 +- ...asses-for-draft-order-not-cancelled.sdp.md | 8 +- ...s-for-confirmed-order-not-cancelled.sdp.md | 8 +- ...ready-cancelled-for-cancelled-order.sdp.md | 9 +- ...-true-for-draft-order-not-confirmed.sdp.md | 8 +- ...e-for-submitted-order-not-confirmed.sdp.md | 8 +- ...k-returns-false-for-confirmed-order.sdp.md | 8 +- ...asses-for-draft-order-not-confirmed.sdp.md | 8 +- ...s-for-cancelled-order-not-confirmed.sdp.md | 8 +- ...ready-confirmed-for-confirmed-order.sdp.md | 9 +- ...k-returns-true-when-order-has-items.sdp.md | 8 +- ...turns-false-when-order-has-no-items.sdp.md | 8 +- ...-assert-passes-when-order-has-items.sdp.md | 8 +- ...asses-when-order-has-multiple-items.sdp.md | 8 +- ...-order-has-no-items-for-empty-order.sdp.md | 9 +- ...-true-when-order-has-room-for-items.sdp.md | 8 +- ...false-when-order-is-at-max-capacity.sdp.md | 8 +- ...asses-when-order-has-room-for-items.sdp.md | 8 +- ...hen-order-is-one-under-max-capacity.sdp.md | 8 +- ...-max-items-exceeded-at-max-capacity.sdp.md | 9 +- ...37-passes-when-item-exists-in-order.sdp.md | 8 +- ...038-passes-when-item-is-one-of-many.sdp.md | 8 +- ...-not-found-when-item-does-not-exist.sdp.md | 10 +- ...not-found-when-items-array-is-empty.sdp.md | 8 +- .../s-041-passes-for-valid-item.sdp.md | 8 +- ...-passes-for-item-with-decimal-price.sdp.md | 8 +- ...-for-item-with-zero-price-free-item.sdp.md | 8 +- ...alid-quantity-for-negative-quantity.sdp.md | 8 +- ...-invalid-quantity-for-zero-quantity.sdp.md | 8 +- ...d-quantity-for-non-integer-quantity.sdp.md | 8 +- ...ws-invalid-price-for-negative-price.sdp.md | 8 +- ...alid-item-data-for-empty-product-id.sdp.md | 8 +- ...id-item-data-for-empty-product-name.sdp.md | 8 +- ...050-error-has-correct-name-property.sdp.md | 8 +- ...051-error-has-correct-code-property.sdp.md | 8 +- ...-error-has-correct-message-property.sdp.md | 8 +- ...-error-has-correct-context-property.sdp.md | 8 +- ...54-error-can-have-undefined-context.sdp.md | 8 +- ...s-055-error-is-an-instance-of-error.sdp.md | 8 +- .../orders/order-invariants.sdp.md | 17 +- ...rom-draft-order-with-multiple-items.sdp.md | 12 +- ...2-remove-last-item-from-draft-order.sdp.md | 12 +- ...ot-remove-item-from-submitted-order.sdp.md | 10 +- ...ot-remove-item-from-cancelled-order.sdp.md | 10 +- ...ot-remove-item-from-confirmed-order.sdp.md | 10 +- ...006-cannot-remove-non-existent-item.sdp.md | 10 +- ...-is-idempotent-with-same-command-id.sdp.md | 12 +- .../orders/remove-order-item.sdp.md | 3 +- ...uccessfully-submit-order-with-items.sdp.md | 12 +- .../s-002-cannot-submit-empty-order.sdp.md | 11 +- .../orders/submit-order.sdp.md | 3 +- ...c-projection-for-command-validation.sdp.md | 10 +- ...ne-a-view-projection-for-ui-queries.sdp.md | 10 +- ...-reporting-projection-for-analytics.sdp.md | 10 +- ...n-projection-for-cross-context-sync.sdp.md | 10 +- ...s-005-query-projections-by-category.sdp.md | 9 +- ...-006-query-all-reactive-projections.sdp.md | 9 +- ...nt-client-query-on-logic-projection.sdp.md | 9 +- ...ion-is-not-optimized-for-reactivity.sdp.md | 10 +- ...ng-projection-to-categorized-system.sdp.md | 10 +- .../roadmap/projection-categories.sdp.md | 2 +- ...urns-zero-counts-for-empty-database.sdp.md | 8 +- ...02-counts-sagas-by-status-correctly.sdp.md | 9 +- .../s-003-filters-by-saga-type.sdp.md | 10 +- ...rns-empty-array-when-no-sagas-exist.sdp.md | 8 +- ...-running-sagas-older-than-threshold.sdp.md | 12 +- .../s-006-respects-custom-threshold.sdp.md | 10 +- ...ns-empty-array-when-no-failed-sagas.sdp.md | 9 +- .../s-008-returns-only-failed-sagas.sdp.md | 10 +- .../s-009-respects-limit-parameter.sdp.md | 9 +- ...-valid-source-status-saga-as-failed.sdp.md | 9 +- ...nvalid-source-status-saga-as-failed.sdp.md | 10 +- ...rns-not-found-for-non-existent-saga.sdp.md | 8 +- ...-marking-failed-saga-as-compensated.sdp.md | 9 +- ...king-non-failed-saga-as-compensated.sdp.md | 10 +- .../s-015-allows-retrying-failed-saga.sdp.md | 9 +- ...16-rejects-retrying-non-failed-saga.sdp.md | 10 +- .../order-management/sagas/admin.sdp.md | 12 +- ...parse-vertical-data-table-to-object.sdp.md | 9 +- ...a-table-preserves-all-string-values.sdp.md | 10 +- ...003-parse-integer-value-from-string.sdp.md | 8 +- ...s-004-parse-float-value-from-string.sdp.md | 8 +- ...-005-parse-boolean-true-from-string.sdp.md | 8 +- ...006-parse-boolean-false-from-string.sdp.md | 8 +- ...-parse-invalid-integer-throws-error.sdp.md | 8 +- ...equired-field-succeeds-when-present.sdp.md | 9 +- ...ired-field-throws-for-missing-field.sdp.md | 10 +- ...al-field-returns-value-when-present.sdp.md | 9 +- ...field-returns-undefined-for-missing.sdp.md | 9 +- ...t-optional-field-with-default-value.sdp.md | 9 +- .../data-table-parsing.sdp.md | 3 +- .../s-001-assert-decision-success.sdp.md | 9 +- ...n-success-fails-for-rejected-result.sdp.md | 11 +- ...3-extract-success-event-from-result.sdp.md | 10 +- ...04-extract-success-data-from-result.sdp.md | 9 +- ...05-extract-state-update-from-result.sdp.md | 10 +- .../s-006-assert-event-type-matches.sdp.md | 9 +- ...ert-event-type-fails-for-wrong-type.sdp.md | 10 +- .../s-008-assert-event-payload-field.sdp.md | 9 +- .../s-009-assert-state-update-field.sdp.md | 9 +- .../s-010-assert-decision-rejected.sdp.md | 9 +- ...s-011-assert-rejection-code-matches.sdp.md | 9 +- ...rejection-code-fails-for-wrong-code.sdp.md | 10 +- ...ert-rejection-message-contains-text.sdp.md | 9 +- .../s-014-assert-decision-failed.sdp.md | 9 +- ...s-015-assert-failure-reason-matches.sdp.md | 9 +- .../decider-assertions.sdp.md | 3 +- .../s-001-assert-valid-transition.sdp.md | 9 +- ...002-assert-invalid-transition-fails.sdp.md | 10 +- ...03-assert-transition-is-not-allowed.sdp.md | 9 +- ...ansition-fails-for-valid-transition.sdp.md | 10 +- .../s-005-assert-terminal-state.sdp.md | 9 +- ...rminal-state-fails-for-non-terminal.sdp.md | 10 +- .../s-007-assert-non-terminal-state.sdp.md | 9 +- .../s-008-assert-initial-state.sdp.md | 9 +- .../s-009-assert-valid-state.sdp.md | 9 +- .../s-010-assert-invalid-state-fails.sdp.md | 9 +- .../s-011-get-all-valid-transitions.sdp.md | 13 +- .../s-012-get-all-states.sdp.md | 9 +- .../s-013-get-terminal-states.sdp.md | 9 +- .../s-014-get-non-terminal-states.sdp.md | 10 +- ...sert-valid-transitions-from-a-state.sdp.md | 9 +- .../fsm-assertions.sdp.md | 3 +- .../s-001-generate-unique-test-run-id.sdp.md | 9 +- ...-run-id-is-stable-within-a-test-run.sdp.md | 9 +- ...entity-i-ds-with-test-run-namespace.sdp.md | 11 +- ...ustom-prefix-for-specific-isolation.sdp.md | 8 +- ...ation-prevents-cross-test-pollution.sdp.md | 10 +- .../test-isolation.sdp.md | 3 +- ...mmand-records-intent-and-completion.sdp.md | 13 +- ...nt-record-captures-command-metadata.sdp.md | 12 +- ...ess-rejection-records-failed-intent.sdp.md | 12 +- ...nical-failure-records-failed-intent.sdp.md | 11 +- ...tent-statistics-show-correct-counts.sdp.md | 11 +- .../durability/durable-commands.sdp.md | 9 +- ...tes-records-for-each-target-context.sdp.md | 11 +- ...tion-records-contain-event-metadata.sdp.md | 10 +- ...sh-result-contains-publication-i-ds.sdp.md | 13 +- ...-004-query-publications-by-event-id.sdp.md | 13 +- ...ery-returns-empty-for-unknown-event.sdp.md | 13 +- .../s-006-query-publications-by-status.sdp.md | 12 +- .../s-007-stats-show-counts-by-status.sdp.md | 12 +- ...s-for-different-events-are-isolated.sdp.md | 10 +- .../durability/durable-publication.sdp.md | 4 +- ...ate-a-running-checkpoint-for-replay.sdp.md | 10 +- .../s-002-update-checkpoint-progress.sdp.md | 10 +- ...play-for-already-running-projection.sdp.md | 9 +- ...s-004-query-checkpoint-by-replay-id.sdp.md | 9 +- .../s-005-list-checkpoints-by-status.sdp.md | 9 +- .../durability/event-replay.sdp.md | 9 +- ...ith-unique-idempotency-key-succeeds.sdp.md | 10 +- ...potency-keys-create-separate-events.sdp.md | 10 +- ...e-idempotency-key-returns-duplicate.sdp.md | 10 +- ...-with-different-payload-is-rejected.sdp.md | 10 +- ...ent-streams-creates-separate-events.sdp.md | 11 +- .../durability/idempotent-append.sdp.md | 4 +- ...ing-timeout-is-flagged-as-abandoned.sdp.md | 12 +- ...ntent-within-timeout-is-not-flagged.sdp.md | 11 +- ...d-intent-is-not-flagged-even-if-old.sdp.md | 10 +- ...d-intent-is-not-flagged-even-if-old.sdp.md | 10 +- ...abandoned-intents-for-investigation.sdp.md | 11 +- ...r-marks-pending-intent-as-abandoned.sdp.md | 11 +- ...handler-no-ops-for-completed-intent.sdp.md | 11 +- .../durability/orphan-detection.sdp.md | 10 +- ...ilure-creates-pending-poison-record.sdp.md | 11 +- ...nd-failure-increments-attempt-count.sdp.md | 12 +- ...-event-quarantined-after-3-failures.sdp.md | 11 +- ...4-quarantine-captures-error-details.sdp.md | 11 +- ...d-event-bypasses-handler-completely.sdp.md | 10 +- ...nquarantine-resets-status-for-retry.sdp.md | 10 +- ...tined-event-returns-not-quarantined.sdp.md | 10 +- ...rantined-event-counts-by-projection.sdp.md | 10 +- .../durability/poison-event.sdp.md | 4 +- ...operation-succeeds-on-first-attempt.sdp.md | 12 +- ...ted-result-passes-through-unchanged.sdp.md | 11 +- ...retry-metadata-with-updated-version.sdp.md | 12 +- ...x-retries-exceeded-returns-rejected.sdp.md | 10 +- ...e-conflict-rolls-back-state-updates.sdp.md | 14 +- ...006-backoff-increases-exponentially.sdp.md | 9 +- .../s-007-backoff-is-capped-at-maximum.sdp.md | 9 +- ...etries-use-consistent-partition-key.sdp.md | 10 +- .../durable-adapters/dcb-retry.sdp.md | 10 +- ...-normal-requests-pass-rate-limiting.sdp.md | 14 +- ...xhausted-rate-limit-rejects-request.sdp.md | 14 +- ...erent-users-have-independent-limits.sdp.md | 13 +- ...mmand-types-have-independent-limits.sdp.md | 14 +- ...-command-returns-standard-rejection.sdp.md | 14 +- ...check-commands-bypass-rate-limiting.sdp.md | 14 +- ...me-rate-limit-uses-sharded-counting.sdp.md | 13 +- .../durable-adapters/rate-limiting.sdp.md | 11 +- ...fully-add-stock-to-existing-product.sdp.md | 11 +- ...dding-stock-to-non-existent-product.sdp.md | 8 +- ...-is-idempotent-with-same-command-id.sdp.md | 9 +- .../inventory/add-stock.sdp.md | 3 +- .../s-001-confirm-pending-reservation.sdp.md | 12 +- ...rming-already-confirmed-reservation.sdp.md | 10 +- ...confirming-non-existent-reservation.sdp.md | 8 +- .../inventory/confirm-reservation.sdp.md | 2 +- ...a-new-product-and-verify-projection.sdp.md | 11 +- .../s-002-reject-duplicate-product-id.sdp.md | 9 +- .../s-003-reject-duplicate-sku.sdp.md | 9 +- ...-is-idempotent-with-same-command-id.sdp.md | 8 +- .../inventory/create-product.sdp.md | 3 +- ...-list-products-returns-all-products.sdp.md | 12 +- ...-get-stock-availability-for-product.sdp.md | 9 +- ...eck-availability-for-multiple-items.sdp.md | 10 +- .../s-004-get-reservation-by-order-id.sdp.md | 11 +- .../inventory/query-inventory.sdp.md | 3 +- .../s-001-release-pending-reservation.sdp.md | 13 +- ...t-releasing-non-pending-reservation.sdp.md | 10 +- .../inventory/release-reservation.sdp.md | 2 +- ...xpire-pending-reservations-past-ttl.sdp.md | 13 +- .../s-002-skip-confirmed-reservations.sdp.md | 11 +- ...3-skip-reservations-not-yet-expired.sdp.md | 11 +- ...expiration-of-multiple-reservations.sdp.md | 17 +- .../inventory/reservation-expiration.sdp.md | 2 +- .../s-001-reserve-stock-successfully.sdp.md | 12 +- ...02-reserve-stock-for-multiple-items.sdp.md | 13 +- ...-003-reject-when-insufficient-stock.sdp.md | 10 +- ...ing-reservation-when-one-item-fails.sdp.md | 12 +- ...005-reject-for-non-existent-product.sdp.md | 8 +- ...ailed-status-when-reservation-fails.sdp.md | 10 +- ...007-idempotent-with-same-command-id.sdp.md | 11 +- .../inventory/reserve-stock.sdp.md | 2 +- ...o-draft-order-and-verify-projection.sdp.md | 12 +- ...ject-adding-item-to-submitted-order.sdp.md | 9 +- .../orders/add-order-item.sdp.md | 3 +- ...dd-multiple-items-to-order-in-batch.sdp.md | 13 +- ...2-batch-respects-order-of-execution.sdp.md | 12 +- ...ops-on-first-failure-in-atomic-mode.sdp.md | 11 +- .../orders/batch-operations.sdp.md | 3 +- ...l-draft-order-and-verify-projection.sdp.md | 11 +- ...bmitted-order-and-verify-projection.sdp.md | 11 +- ...-cancelling-already-cancelled-order.sdp.md | 9 +- ...nfirmed-order-and-verify-projection.sdp.md | 11 +- ...d-when-confirmed-order-is-cancelled.sdp.md | 18 +- ...oes-not-trigger-reservation-release.sdp.md | 12 +- ...completion-releases-pending-reserva.sdp.md | 17 +- ...ady-released-reservation-gracefully.sdp.md | 17 +- ...reservation-when-order-is-cancelled.sdp.md | 18 +- .../orders/cancel-order.sdp.md | 3 +- ...e-a-new-order-and-verify-projection.sdp.md | 11 +- .../s-002-reject-duplicate-order-id.sdp.md | 9 +- ...-is-idempotent-with-same-command-id.sdp.md | 8 +- .../orders/create-order.sdp.md | 3 +- .../s-001-query-orders-by-customer-id.sdp.md | 10 +- .../s-002-query-orders-by-status.sdp.md | 11 +- ...m-draft-order-and-verify-projection.sdp.md | 12 +- .../orders/query-orders.sdp.md | 3 +- ...er-with-items-and-verify-projection.sdp.md | 12 +- ...s-002-reject-submitting-empty-order.sdp.md | 9 +- ...-submitting-already-submitted-order.sdp.md | 9 +- .../orders/submit-order.sdp.md | 3 +- ...-is-available-for-single-item-order.sdp.md | 15 +- ...k-is-available-for-multi-item-order.sdp.md | 14 +- ...-insufficient-stock-for-single-item.sdp.md | 14 +- ...i-item-order-has-insufficient-stock.sdp.md | 15 +- ...s-005-saga-runs-only-once-per-order.sdp.md | 14 +- ...pleted-after-successful-fulfillment.sdp.md | 13 +- ...tus-is-completed-after-compensation.sdp.md | 12 +- ...leted-at-timestamp-after-completion.sdp.md | 13 +- .../sagas/order-fulfillment.sdp.md | 3 +- ...urns-workflow-id-for-completed-saga.sdp.md | 14 +- ...get-saga-steps-returns-step-history.sdp.md | 14 +- ...-returns-null-for-non-existent-saga.sdp.md | 8 +- ...ompleted-saga-returns-invalid-state.sdp.md | 12 +- ...non-existent-saga-returns-not-found.sdp.md | 8 +- ...006-cleanup-completed-saga-workflow.sdp.md | 12 +- .../sagas/saga-admin.sdp.md | 3 +- .../timeline/phase-00-initialization.sdp.md | 2 +- .../phase-01-core-infrastructure.sdp.md | 2 +- .../phase-02-event-store-orchestration.sdp.md | 2 +- .../timeline/phase-03-command-bus.sdp.md | 2 +- .../timeline/phase-04-orders-bc.sdp.md | 2 +- .../timeline/phase-05-inventory-bc.sdp.md | 2 +- .../phase-06-cross-context-integration.sdp.md | 2 +- .../phase-07-projection-engine.sdp.md | 2 +- .../phase-08-documentation-polish.sdp.md | 2 +- .../timeline/phase-09-event-system.sdp.md | 2 +- .../timeline/phase-10-command-system.sdp.md | 2 +- .../timeline/phase-11-bc-formalization.sdp.md | 2 +- .../phase-12-repository-read-model.sdp.md | 2 +- .../timeline/phase-13-process-manager.sdp.md | 2 +- .../phase-14-decider-formalization.sdp.md | 2 +- .../phase-15-projection-categories.sdp.md | 2 +- .../timeline/phase-16-dcb.sdp.md | 2 +- .../phase-17-reactive-projections.sdp.md | 2 +- .../phase-18-production-hardening.sdp.md | 2 +- .../phase-19-testing-infrastructure.sdp.md | 2 +- .../phase-20-service-independence.sdp.md | 2 +- .../phase-21-integration-patterns.sdp.md | 2 +- .../timeline/phase-22-agent-as-bc.sdp.md | 2 +- ...eature-files-pass-schema-validation.sdp.md | 10 +- ...-roadmap-md-reflects-planned-phases.sdp.md | 11 +- .../timeline/phase-23-process-setup.sdp.md | 4 +- ...storical-deliverables-are-preserved.sdp.md | 11 +- ...plete-phases-deferred-appropriately.sdp.md | 11 +- .../phase-24-old-roadmap-porting.sdp.md | 4 +- ...e-accessible-through-generated-docs.sdp.md | 11 +- ...ity-is-assessed-against-new-roadmap.sdp.md | 10 +- .../timeline/phase-25-adr-porting.sdp.md | 4 +- ...nning-sessions-have-defined-outputs.sdp.md | 10 +- ...002-non-code-sessions-are-supported.sdp.md | 10 +- ...003-configuration-inheritance-works.sdp.md | 11 +- .../phase-26-workflow-configuration.sdp.md | 4 +- ...are-documented-for-roadmap-planning.sdp.md | 10 +- ...ve-annotation-policy-is-sustainable.sdp.md | 10 +- ...se-27-pattern-annotation-priorities.sdp.md | 4 +- ...claude-md-is-generated-from-modules.sdp.md | 12 +- ...ariations-produce-different-outputs.sdp.md | 10 +- ...3-pattern-content-is-auto-generated.sdp.md | 10 +- ...04-session-templates-are-includable.sdp.md | 10 +- .../phase-28-modular-claude-md.sdp.md | 4 +- ...mand-preserves-literal-command-type.sdp.md | 9 +- ...ommand-includes-all-metadata-fields.sdp.md | 9 +- ...-event-preserves-literal-event-type.sdp.md | 9 +- ...event-supports-all-event-categories.sdp.md | 8 +- ...n-preserves-literal-projection-name.sdp.md | 9 +- ...preserves-event-subscriptions-tuple.sdp.md | 8 +- ...category-validates-category-strings.sdp.md | 8 +- ...eturns-true-only-for-logic-category.sdp.md | 8 +- ...returns-true-only-for-view-category.sdp.md | 8 +- ...returns-true-only-for-view-category.sdp.md | 8 +- ...turns-false-for-non-view-categories.sdp.md | 8 +- ...time-triggered-requires-cron-config.sdp.md | 8 +- ...nt-triggered-requires-subscriptions.sdp.md | 8 +- .../behavior/platform-bc/bc-contracts.sdp.md | 2 +- ...ery-fails-across-component-boundary.sdp.md | 9 +- ...s-002-component-api-access-succeeds.sdp.md | 9 +- ...writes-commit-atomically-on-success.sdp.md | 9 +- ...olls-back-only-the-component-writes.sdp.md | 10 +- ...r-id-passed-explicitly-to-component.sdp.md | 10 +- .../s-006-id-conversion-at-boundary.sdp.md | 10 +- ...t-provides-type-safety-for-commands.sdp.md | 10 +- ...context-foundation-executable-tests.sdp.md | 10 +- ...first-command-execution-is-recorded.sdp.md | 11 +- ...icate-command-returns-cached-result.sdp.md | 11 +- ...ful-command-transitions-to-executed.sdp.md | 11 +- ...s-rejection-transitions-to-rejected.sdp.md | 11 +- ...xpected-error-transitions-to-failed.sdp.md | 11 +- ...mmand-runs-all-7-orchestrator-steps.sdp.md | 15 +- ...-short-circuits-before-event-append.sdp.md | 11 +- ...ropagated-to-emitted-event-metadata.sdp.md | 10 +- ...on-returns-the-events-for-a-command.sdp.md | 10 +- ...-registered-middleware-run-in-order.sdp.md | 10 +- ...ddleware-failure-halts-the-pipeline.sdp.md | 11 +- ...and-bus-foundation-executable-tests.sdp.md | 10 +- ...irst-command-submission-is-recorded.sdp.md | 13 +- ...urns-existing-status-when-completed.sdp.md | 11 +- ...g-processing-returns-pending-status.sdp.md | 11 +- ...ection-via-post-insert-verification.sdp.md | 11 +- .../behavior/platform-bus/idempotency.sdp.md | 2 +- ...oint-position-equals-event-position.sdp.md | 9 +- ...int-position-exceeds-event-position.sdp.md | 9 +- ...ns-null-when-agent-status-is-paused.sdp.md | 9 +- ...s-null-when-agent-status-is-stopped.sdp.md | 9 +- ...when-agent-status-is-error-recovery.sdp.md | 9 +- ...when-checkpoint-is-null-first-event.sdp.md | 11 +- ...hen-pattern-has-no-analyze-function.sdp.md | 11 +- ...-throws-when-pattern-trigger-throws.sdp.md | 9 +- ...oad-state-errors-for-workpool-retry.sdp.md | 9 +- ...d-from-agent-id-and-global-position.sdp.md | 10 +- ...on-id-for-same-inputs-deterministic.sdp.md | 9 +- ...ased-decision-when-pattern-triggers.sdp.md | 12 +- ...d-when-pattern-has-analyze-function.sdp.md | 12 +- ...-pattern-id-when-no-pattern-matches.sdp.md | 11 +- ...t-invoke-llm-enrichment-via-runtime.sdp.md | 11 +- ...-throws-when-pattern-executor-fails.sdp.md | 9 +- .../platform-core/agent/action-handler.sdp.md | 11 +- ...and-result-is-returned-when-allowed.sdp.md | 11 +- ...eration-is-not-executed-when-denied.sdp.md | 11 +- ...ate-limit-receives-agent-scoped-key.sdp.md | 8 +- ...peration-errors-propagate-to-caller.sdp.md | 9 +- ...propagate-without-calling-operation.sdp.md | 10 +- ...warning-is-logged-when-rate-limited.sdp.md | 8 +- ...logged-when-rate-limit-check-passes.sdp.md | 8 +- .../agent/agent-rate-limiter.sdp.md | 10 +- ...ion-has-correct-type-and-references.sdp.md | 9 +- ...ject-retry-config-is-passed-through.sdp.md | 9 +- ...lean-retry-config-is-passed-through.sdp.md | 9 +- ...-field-is-absent-when-not-specified.sdp.md | 9 +- ...context-returns-all-required-fields.sdp.md | 11 +- ...sation-id-equals-the-event-event-id.sdp.md | 11 +- ...iption-uses-default-priority-of-250.sdp.md | 9 +- ...8-subscription-uses-custom-priority.sdp.md | 9 +- ...name-includes-context-when-provided.sdp.md | 9 +- ...ame-omits-context-when-not-provided.sdp.md | 9 +- ...contains-all-configured-event-types.sdp.md | 10 +- ...es-correct-agent-event-handler-args.sdp.md | 11 +- ...y-returns-stream-id-based-partition.sdp.md | 11 +- .../agent/agent-subscription-action.sdp.md | 13 +- ...ption-with-context-has-correct-name.sdp.md | 9 +- ...on-without-context-has-correct-name.sdp.md | 9 +- ...iption-uses-default-priority-of-250.sdp.md | 9 +- ...4-subscription-uses-custom-priority.sdp.md | 9 +- ...filter-contains-correct-event-types.sdp.md | 10 +- ...tion-attaches-the-handler-reference.sdp.md | 9 +- ...es-correct-agent-event-handler-args.sdp.md | 11 +- ...gs-includes-payload-in-handler-args.sdp.md | 12 +- ...orm-wraps-non-object-payload-in-raw.sdp.md | 10 +- ...to-handler-args-transformer-is-used.sdp.md | 11 +- ...-partitions-by-stream-id-by-default.sdp.md | 11 +- ...tom-partition-key-extractor-is-used.sdp.md | 11 +- ...s-subscriptions-for-multiple-agents.sdp.md | 11 +- ...-if-handler-is-missing-for-an-agent.sdp.md | 10 +- ...common-options-to-all-subscriptions.sdp.md | 10 +- ...-for-multiple-to-handler-args-calls.sdp.md | 11 +- ...-handler-args-and-get-partition-key.sdp.md | 11 +- ...ypes-and-rejects-unsubscribed-types.sdp.md | 10 +- ...es-array-starts-with-correct-length.sdp.md | 9 +- ...ll-published-event-fields-correctly.sdp.md | 10 +- .../s-021-handles-null-payload.sdp.md | 10 +- .../s-022-handles-array-payload.sdp.md | 10 +- .../agent/agent-subscription.sdp.md | 12 +- ...001-all-six-error-codes-are-present.sdp.md | 8 +- ...contains-all-four-statuses-in-order.sdp.md | 8 +- ...roval-statuses-is-a-4-element-array.sdp.md | 8 +- ...turns-true-for-valid-status-strings.sdp.md | 8 +- ...5-returns-false-for-invalid-strings.sdp.md | 8 +- ...-returns-false-for-non-string-types.sdp.md | 8 +- ...007-accepts-all-four-valid-statuses.sdp.md | 8 +- ...s-008-rejects-invalid-status-values.sdp.md | 8 +- ...009-accepts-a-valid-approval-object.sdp.md | 9 +- ...proval-with-missing-required-fields.sdp.md | 8 +- ...ts-approval-with-confidence-above-1.sdp.md | 9 +- ...s-approval-with-negative-confidence.sdp.md | 9 +- ...alid-auth-context-with-user-id-only.sdp.md | 8 +- ...014-accepts-auth-context-with-roles.sdp.md | 8 +- ...accepts-auth-context-with-agent-ids.sdp.md | 8 +- ...cts-auth-context-with-empty-user-id.sdp.md | 8 +- ...s-017-parses-valid-duration-strings.sdp.md | 8 +- ...18-returns-null-for-invalid-formats.sdp.md | 8 +- .../s-019-returns-null-for-zero-values.sdp.md | 8 +- ...urns-true-for-valid-timeout-formats.sdp.md | 8 +- ...s-false-for-invalid-timeout-formats.sdp.md | 8 +- ...2-uses-explicit-timeout-from-config.sdp.md | 9 +- ...-default-timeout-when-not-specified.sdp.md | 9 +- ...-default-timeout-for-invalid-format.sdp.md | 9 +- ...-when-confidence-is-below-threshold.sdp.md | 9 +- ...nfidence-equals-threshold-inclusive.sdp.md | 9 +- ...-when-confidence-is-above-threshold.sdp.md | 9 +- ...threshold-of-0-9-when-not-specified.sdp.md | 10 +- ...ed-action-even-with-high-confidence.sdp.md | 10 +- ...nlisted-action-with-high-confidence.sdp.md | 9 +- ...approved-action-with-low-confidence.sdp.md | 10 +- ...akes-precedence-over-low-confidence.sdp.md | 9 +- ...l-wins-when-action-is-in-both-lists.sdp.md | 9 +- ...o-confidence-check-with-empty-lists.sdp.md | 10 +- ...nfidence-check-with-undefined-lists.sdp.md | 9 +- .../s-036-handles-confidence-of-0.sdp.md | 9 +- .../s-037-handles-confidence-of-1.sdp.md | 9 +- ...ent-id-is-in-auth-context-agent-ids.sdp.md | 10 +- ...id-is-not-in-auth-context-agent-ids.sdp.md | 10 +- ...s-false-when-agent-ids-is-undefined.sdp.md | 10 +- ...turns-false-when-agent-ids-is-empty.sdp.md | 10 +- ...rue-when-user-has-at-least-one-role.sdp.md | 10 +- ...turns-false-when-roles-is-undefined.sdp.md | 10 +- ...4-returns-false-when-roles-is-empty.sdp.md | 10 +- ...ds-check-fails-even-with-admin-role.sdp.md | 10 +- ...s-046-both-agent-ids-and-roles-pass.sdp.md | 10 +- ...-with-apr-prefix-and-correct-format.sdp.md | 10 +- ...tes-unique-i-ds-over-multiple-calls.sdp.md | 8 +- ...9-sets-correct-initial-field-values.sdp.md | 9 +- ...ue-approval-ids-over-multiple-calls.sdp.md | 8 +- ...1-sets-requested-at-to-current-time.sdp.md | 9 +- ...-expires-at-based-on-config-timeout.sdp.md | 9 +- ...t-include-optional-fields-initially.sdp.md | 9 +- ...itions-pending-approval-to-approved.sdp.md | 12 +- ...-includes-review-note-when-provided.sdp.md | 10 +- ...clude-review-note-when-not-provided.sdp.md | 10 +- ...rows-error-for-non-pending-statuses.sdp.md | 8 +- ...error-for-expired-pending-approvals.sdp.md | 9 +- ...eserves-other-fields-after-approval.sdp.md | 10 +- ...ng-approval-to-rejected-with-reason.sdp.md | 12 +- ...wed-at-to-current-time-on-rejection.sdp.md | 10 +- ...when-rejecting-non-pending-approval.sdp.md | 8 +- ...-rejecting-expired-pending-approval.sdp.md | 9 +- ...sitions-pending-approval-to-expired.sdp.md | 10 +- ...-when-expiring-non-pending-approval.sdp.md | 8 +- ...es-original-fields-after-expiration.sdp.md | 10 +- ...-success-for-valid-pending-approval.sdp.md | 12 +- ...orized-reviewer-when-not-authorized.sdp.md | 11 +- ...s-transition-when-already-processed.sdp.md | 11 +- ...proval-expired-when-past-expiration.sdp.md | 12 +- ...returns-success-for-valid-rejection.sdp.md | 12 +- ...nauthorized-reviewer-on-safe-reject.sdp.md | 11 +- ...rns-approval-expired-on-safe-reject.sdp.md | 12 +- ...nding-returns-true-only-for-pending.sdp.md | 9 +- ...oved-returns-true-only-for-approved.sdp.md | 9 +- ...cted-returns-true-only-for-rejected.sdp.md | 9 +- ...ed-status-and-time-based-expiration.sdp.md | 11 +- ...able-checks-pending-and-not-expired.sdp.md | 10 +- ...remaining-time-for-pending-approval.sdp.md | 8 +- ...-080-returns-0-for-expired-approval.sdp.md | 8 +- ...81-returns-0-for-non-pending-status.sdp.md | 8 +- .../s-082-formats-hours-and-minutes.sdp.md | 8 +- .../s-083-formats-minutes-only.sdp.md | 8 +- ...returns-expired-for-past-expiration.sdp.md | 8 +- ...085-returns-true-for-valid-approval.sdp.md | 9 +- ...86-returns-false-for-invalid-inputs.sdp.md | 8 +- ...eturns-false-for-invalid-confidence.sdp.md | 8 +- .../platform-core/agent/approval.sdp.md | 33 +- ...s-001-record-pattern-detected-event.sdp.md | 11 +- ...02-audit-includes-triggering-events.sdp.md | 10 +- ...s-003-audit-includes-execution-mode.sdp.md | 11 +- .../s-004-audit-includes-llm-metadata.sdp.md | 10 +- .../s-005-audit-llm-failures.sdp.md | 11 +- .../s-006-record-auto-executed-action.sdp.md | 11 +- .../s-007-record-approved-action.sdp.md | 11 +- .../s-008-record-rejected-action.sdp.md | 11 +- .../s-009-record-expired-action.sdp.md | 11 +- ...10-query-all-decisions-for-an-agent.sdp.md | 10 +- ...011-query-decisions-by-pattern-type.sdp.md | 10 +- ...s-012-query-decisions-by-time-range.sdp.md | 10 +- ...-013-query-decision-with-full-trace.sdp.md | 10 +- .../platform-core/agent/audit-trail.sdp.md | 10 +- ...-contains-all-ds-1-base-event-types.sdp.md | 8 +- ...ll-ds-4-command-routing-event-types.sdp.md | 8 +- ...ains-all-ds-5-lifecycle-event-types.sdp.md | 8 +- ...ns-ds-6-failure-tracking-event-type.sdp.md | 8 +- .../s-005-has-exactly-17-event-types.sdp.md | 8 +- ...ue-for-all-valid-event-type-strings.sdp.md | 8 +- ...07-returns-false-for-invalid-values.sdp.md | 8 +- ...returns-false-for-non-string-values.sdp.md | 8 +- ...s-009-accepts-all-valid-event-types.sdp.md | 8 +- .../s-010-rejects-invalid-event-types.sdp.md | 8 +- ...1-rejects-non-string-values-via-zod.sdp.md | 8 +- .../s-012-accepts-valid-llm-context.sdp.md | 9 +- .../s-013-rejects-negative-tokens.sdp.md | 9 +- .../s-014-rejects-negative-duration.sdp.md | 9 +- .../s-015-rejects-non-integer-tokens.sdp.md | 9 +- .../s-016-accepts-zero-values.sdp.md | 9 +- ...s-valid-action-with-flag-for-review.sdp.md | 9 +- ...epts-valid-action-with-auto-execute.sdp.md | 9 +- ...-019-rejects-action-with-empty-type.sdp.md | 9 +- ...-action-with-invalid-execution-mode.sdp.md | 9 +- ...on-with-extra-fields-in-strict-mode.sdp.md | 9 +- ...2-accepts-valid-payload-with-action.sdp.md | 9 +- ...-payload-with-null-pattern-detected.sdp.md | 9 +- ...24-accepts-payload-with-null-action.sdp.md | 9 +- ...25-accepts-payload-with-llm-context.sdp.md | 9 +- ...cts-payload-with-confidence-below-0.sdp.md | 9 +- ...cts-payload-with-confidence-above-1.sdp.md | 9 +- ...epts-valid-approval-granted-payload.sdp.md | 9 +- ...29-accepts-payload-with-review-note.sdp.md | 9 +- ...ejects-payload-with-empty-action-id.sdp.md | 9 +- ...pts-valid-approval-rejected-payload.sdp.md | 9 +- ...llows-empty-rejection-reason-string.sdp.md | 9 +- ...epts-valid-approval-expired-payload.sdp.md | 9 +- ...ejects-payload-with-empty-action-id.sdp.md | 9 +- .../s-035-accepts-valid-audit-event.sdp.md | 9 +- ...6-rejects-event-with-empty-agent-id.sdp.md | 9 +- ...ejects-event-with-empty-decision-id.sdp.md | 9 +- ...-038-generates-i-ds-with-dec-prefix.sdp.md | 8 +- ...generates-i-ds-with-expected-format.sdp.md | 10 +- ...tes-unique-i-ds-over-multiple-calls.sdp.md | 8 +- ...41-uses-a-uui-dv7-payload-in-the-id.sdp.md | 8 +- ...es-event-with-pattern-detected-type.sdp.md | 8 +- .../s-043-includes-all-required-fields.sdp.md | 15 +- ...-includes-llm-context-when-provided.sdp.md | 11 +- ...clude-llm-context-when-not-provided.sdp.md | 8 +- ...s-046-handles-null-pattern-detected.sdp.md | 8 +- .../s-047-handles-null-action.sdp.md | 8 +- ...es-event-with-approval-granted-type.sdp.md | 8 +- ...equired-fields-for-approval-granted.sdp.md | 13 +- ...-includes-review-note-when-provided.sdp.md | 8 +- ...clude-review-note-when-not-provided.sdp.md | 8 +- ...s-event-with-approval-rejected-type.sdp.md | 8 +- ...quired-fields-for-approval-rejected.sdp.md | 13 +- ...es-event-with-approval-expired-type.sdp.md | 8 +- ...equired-fields-for-approval-expired.sdp.md | 13 +- ...6-creates-event-with-specified-type.sdp.md | 8 +- ...l-required-fields-for-generic-event.sdp.md | 10 +- ...d-to-empty-object-when-not-provided.sdp.md | 8 +- ...rks-with-ds-4-command-routing-types.sdp.md | 8 +- ...060-works-with-ds-5-lifecycle-types.sdp.md | 8 +- ...rns-true-for-pattern-detected-event.sdp.md | 8 +- ...anted-event-via-is-pattern-detected.sdp.md | 8 +- ...ected-event-via-is-pattern-detected.sdp.md | 8 +- ...rns-true-for-approval-granted-event.sdp.md | 8 +- ...ected-event-via-is-approval-granted.sdp.md | 8 +- ...ected-event-via-is-approval-granted.sdp.md | 8 +- ...ns-true-for-approval-rejected-event.sdp.md | 8 +- ...nted-event-via-is-approval-rejected.sdp.md | 8 +- ...cted-event-via-is-approval-rejected.sdp.md | 8 +- ...-valid-pattern-detected-audit-event.sdp.md | 8 +- ...-valid-approval-granted-audit-event.sdp.md | 8 +- ...valid-approval-rejected-audit-event.sdp.md | 8 +- ...-valid-approval-expired-audit-event.sdp.md | 8 +- .../s-074-returns-false-for-null.sdp.md | 8 +- .../s-075-returns-false-for-undefined.sdp.md | 8 +- ...-076-returns-false-for-empty-object.sdp.md | 8 +- ...eturns-false-for-invalid-event-type.sdp.md | 8 +- ...s-false-for-missing-required-fields.sdp.md | 8 +- ...ete-audit-trail-for-approved-action.sdp.md | 12 +- ...ete-audit-trail-for-rejected-action.sdp.md | 10 +- ...ates-audit-trail-for-expired-action.sdp.md | 10 +- .../behavior/platform-core/agent/audit.sdp.md | 26 +- ...urns-true-for-error-recovery-status.sdp.md | 8 +- ...002-returns-false-for-active-status.sdp.md | 8 +- ...003-returns-false-for-paused-status.sdp.md | 8 +- ...04-returns-false-for-stopped-status.sdp.md | 8 +- ...values-when-overrides-are-undefined.sdp.md | 9 +- ...-base-rate-limits-when-no-overrides.sdp.md | 8 +- ...when-base-has-none-and-no-overrides.sdp.md | 8 +- ...-preserving-pattern-window-duration.sdp.md | 9 +- ...ile-preserving-confidence-threshold.sdp.md | 9 +- ...minute-while-preserving-base-cost-b.sdp.md | 8 +- ...serving-cost-budget-alert-threshold.sdp.md | 8 +- ...-while-preserving-cost-budget-daily.sdp.md | 8 +- ...3-fully-overrides-all-config-values.sdp.md | 8 +- ...ts-via-overrides-when-base-has-none.sdp.md | 8 +- ...s-object-returns-base-config-values.sdp.md | 10 +- ...eckpoint-without-existing-overrides.sdp.md | 8 +- ...g-overrides-with-existing-overrides.sdp.md | 8 +- ...rides-take-precedence-over-existing.sdp.md | 8 +- ...rrides-when-update-has-no-overrides.sdp.md | 9 +- ...cost-budget-in-checkpoint-overrides.sdp.md | 8 +- .../s-021-updates-updated-at-timestamp.sdp.md | 8 +- ...2-increments-events-processed-count.sdp.md | 8 +- ...rocessed-when-no-increment-provided.sdp.md | 8 +- ...neither-existing-nor-update-have-th.sdp.md | 8 +- ...ntinel-last-processed-position-of-1.sdp.md | 8 +- ...eates-checkpoint-with-active-status.sdp.md | 8 +- ...eckpoint-with-zero-events-processed.sdp.md | 8 +- ...checkpoint-with-empty-last-event-id.sdp.md | 8 +- ...029-sets-updated-at-to-current-time.sdp.md | 8 +- ...serves-agent-id-and-subscription-id.sdp.md | 8 +- ...1-does-not-include-config-overrides.sdp.md | 8 +- .../agent/checkpoint-extension.sdp.md | 13 +- .../s-001-contains-all-four-statuses.sdp.md | 8 +- ...is-a-readonly-tuple-with-4-elements.sdp.md | 9 +- .../s-003-accepts-all-valid-statuses.sdp.md | 8 +- .../s-004-rejects-invalid-statuses.sdp.md | 8 +- ...5-accepts-a-valid-checkpoint-object.sdp.md | 9 +- ...checkpoint-with-sentinel-position-1.sdp.md | 9 +- ...ts-checkpoint-with-position-below-1.sdp.md | 9 +- ...oint-with-negative-events-processed.sdp.md | 9 +- ...ects-checkpoint-with-empty-agent-id.sdp.md | 9 +- ...eckpoint-with-empty-subscription-id.sdp.md | 9 +- ...kpoint-with-missing-required-fields.sdp.md | 9 +- ...orrect-agent-id-and-subscription-id.sdp.md | 8 +- ...osition-and-event-tracking-defaults.sdp.md | 9 +- .../s-014-initializes-status-to-active.sdp.md | 8 +- ...015-sets-updated-at-to-current-time.sdp.md | 8 +- ...point-that-passes-schema-validation.sdp.md | 8 +- ...017-updates-last-processed-position.sdp.md | 9 +- .../s-018-updates-last-event-id.sdp.md | 9 +- .../s-019-updates-status.sdp.md | 9 +- ...vents-processed-by-specified-amount.sdp.md | 9 +- ...nts-processed-by-1-for-single-event.sdp.md | 9 +- ...events-processed-when-not-specified.sdp.md | 9 +- .../s-023-preserves-unchanged-fields.sdp.md | 9 +- ...-updates-updated-at-to-current-time.sdp.md | 10 +- ...25-applies-multiple-updates-at-once.sdp.md | 10 +- ...y-update-by-only-updating-timestamp.sdp.md | 9 +- ...position-is-greater-than-checkpoint.sdp.md | 8 +- ...or-duplicate-event-at-same-position.sdp.md | 8 +- ...s-false-for-already-processed-event.sdp.md | 8 +- ...-against-sentinel-1-for-a-new-agent.sdp.md | 8 +- ...e-for-position-1-against-sentinel-1.sdp.md | 8 +- ...ositive-position-against-sentinel-1.sdp.md | 8 +- ...for-position-1-against-checkpoint-0.sdp.md | 8 +- ...for-position-0-against-checkpoint-0.sdp.md | 8 +- ...s-035-handles-large-position-values.sdp.md | 9 +- ...ocesses-sequential-events-correctly.sdp.md | 8 +- ...037-handles-gaps-in-event-positions.sdp.md | 9 +- ...returns-true-only-for-active-status.sdp.md | 8 +- ...returns-true-only-for-paused-status.sdp.md | 8 +- ...eturns-true-only-for-stopped-status.sdp.md | 8 +- ...returns-true-for-a-valid-checkpoint.sdp.md | 9 +- ...r-checkpoint-with-sentinel-position.sdp.md | 9 +- ...for-null-undefined-and-empty-object.sdp.md | 8 +- ...returns-false-for-non-object-values.sdp.md | 8 +- ...-for-checkpoint-with-invalid-status.sdp.md | 9 +- ...or-checkpoint-with-position-below-1.sdp.md | 9 +- ...oint-with-negative-events-processed.sdp.md | 9 +- ...48-new-agent-processes-first-events.sdp.md | 14 +- ...pause-and-resume-preserves-position.sdp.md | 13 +- ...very-skips-already-processed-events.sdp.md | 11 +- ...licate-event-delivery-is-idempotent.sdp.md | 11 +- .../platform-core/agent/checkpoint.sdp.md | 14 +- ...rator-records-audit-and-updates-sta.sdp.md | 14 +- ...dit-and-sets-status-to-failed-for-u.sdp.md | 15 +- ...en-registry-does-not-contain-the-co.sdp.md | 16 +- ...or-when-to-orchestrator-args-throws.sdp.md | 17 +- ...dit-and-sets-status-to-failed-on-or.sdp.md | 15 +- ...dit-recording-fails-on-success-path.sdp.md | 16 +- ...atus-mutation-fails-on-success-path.sdp.md | 15 +- ...update-status-is-undefined-on-succe.sdp.md | 15 +- ...ure-when-update-status-is-undefined.sdp.md | 14 +- ...-event-payload-when-present-in-args.sdp.md | 12 +- ...audit-payload-when-absent-from-args.sdp.md | 12 +- .../platform-core/agent/command-bridge.sdp.md | 14 +- .../s-001-emit-recommendation-command.sdp.md | 11 +- ...002-command-includes-correlation-id.sdp.md | 10 +- ...ommand-includes-agent-bc-identifier.sdp.md | 10 +- .../s-004-command-includes-reason.sdp.md | 10 +- .../s-005-command-includes-confidence.sdp.md | 10 +- ...-command-includes-triggering-events.sdp.md | 10 +- .../s-007-command-includes-llm-context.sdp.md | 10 +- ...s-008-reject-command-without-reason.sdp.md | 10 +- ...9-reject-command-without-confidence.sdp.md | 10 +- ...ject-confidence-outside-valid-range.sdp.md | 11 +- ...is-handled-with-exponential-backoff.sdp.md | 13 +- ...t-falls-back-to-rule-based-emission.sdp.md | 12 +- .../s-013-emit-notification-command.sdp.md | 10 +- .../s-014-emit-action-command.sdp.md | 10 +- .../s-015-emit-escalation-command.sdp.md | 10 +- .../agent/command-emission.sdp.md | 11 +- ...when-command-type-exists-in-the-map.sdp.md | 10 +- ...mand-type-does-not-exist-in-the-map.sdp.md | 8 +- ...turns-undefined-for-empty-route-map.sdp.md | 8 +- ...es-success-results-for-valid-routes.sdp.md | 10 +- ...ered-error-for-missing-command-type.sdp.md | 11 +- ...e-error-for-missing-bounded-context.sdp.md | 11 +- ...or-for-missing-to-orchestrator-args.sdp.md | 11 +- ...rns-empty-array-for-empty-route-map.sdp.md | 8 +- ...id-and-invalid-routes-independently.sdp.md | 10 +- ...0-contains-all-expected-error-codes.sdp.md | 8 +- .../s-011-has-exactly-4-error-codes.sdp.md | 8 +- ...tring-constants-matching-their-keys.sdp.md | 8 +- .../platform-core/agent/command-router.sdp.md | 8 +- ...1-contains-all-expected-error-codes.sdp.md | 8 +- .../s-002-has-exactly-5-error-codes.sdp.md | 8 +- .../s-003-accepts-valid-metadata.sdp.md | 8 +- ...s-metadata-with-optional-pattern-id.sdp.md | 8 +- ...pts-metadata-with-optional-analysis.sdp.md | 8 +- ...ejects-metadata-with-empty-agent-id.sdp.md | 8 +- ...cts-metadata-with-empty-decision-id.sdp.md | 8 +- ...ts-metadata-with-confidence-below-0.sdp.md | 8 +- ...ts-metadata-with-confidence-above-1.sdp.md | 8 +- ...-rejects-metadata-with-empty-reason.sdp.md | 8 +- ...metadata-with-empty-event-ids-array.sdp.md | 8 +- ...ts-confidence-at-boundaries-0-and-1.sdp.md | 9 +- .../s-013-accepts-valid-command.sdp.md | 8 +- ...014-rejects-command-with-empty-type.sdp.md | 8 +- ...cepts-command-with-any-payload-type.sdp.md | 8 +- ...jects-command-with-invalid-metadata.sdp.md | 8 +- ...urns-invalid-when-type-is-undefined.sdp.md | 9 +- ...s-invalid-when-type-is-empty-string.sdp.md | 8 +- ...nvalid-when-type-is-whitespace-only.sdp.md | 8 +- ...nvalid-when-confidence-is-undefined.sdp.md | 9 +- ...-invalid-when-confidence-is-below-0.sdp.md | 9 +- ...-invalid-when-confidence-is-above-1.sdp.md | 8 +- ...cepts-confidence-at-boundary-values.sdp.md | 8 +- ...ns-invalid-when-reason-is-undefined.sdp.md | 8 +- ...invalid-when-reason-is-empty-string.sdp.md | 8 +- ...alid-when-reason-is-whitespace-only.sdp.md | 8 +- ...invalid-when-event-ids-is-undefined.sdp.md | 9 +- ...valid-when-event-ids-is-empty-array.sdp.md | 8 +- .../s-029-accepts-single-event-id.sdp.md | 8 +- .../s-030-accepts-multiple-event-i-ds.sdp.md | 8 +- ...rns-valid-for-complete-command-args.sdp.md | 8 +- ...es-command-with-all-required-fields.sdp.md | 8 +- .../s-033-generates-unique-decision-id.sdp.md | 8 +- ...pattern-id-when-provided-in-options.sdp.md | 8 +- ...nclude-pattern-id-when-not-provided.sdp.md | 8 +- ...s-analysis-when-provided-in-options.sdp.md | 8 +- ...-include-analysis-when-not-provided.sdp.md | 8 +- ...ttern-id-and-analysis-when-provided.sdp.md | 9 +- ...ids-array-without-reference-sharing.sdp.md | 8 +- .../s-040-throws-error-for-empty-type.sdp.md | 8 +- ...throws-error-for-invalid-confidence.sdp.md | 8 +- ...s-042-throws-error-for-empty-reason.sdp.md | 8 +- ...43-throws-error-for-empty-event-ids.sdp.md | 8 +- ...cludes-error-code-in-thrown-message.sdp.md | 8 +- ...-command-from-decision-with-command.sdp.md | 8 +- ...s-null-when-decision-has-no-command.sdp.md | 8 +- ...7-includes-pattern-id-when-provided.sdp.md | 8 +- ...048-includes-analysis-when-provided.sdp.md | 8 +- ...-maps-all-decision-fields-correctly.sdp.md | 8 +- ...-050-returns-true-for-valid-command.sdp.md | 8 +- ...ue-for-command-with-optional-fields.sdp.md | 8 +- ...eturns-false-for-non-command-values.sdp.md | 8 +- ...ns-true-when-command-has-pattern-id.sdp.md | 8 +- ...alse-when-command-has-no-pattern-id.sdp.md | 8 +- ...-pattern-id-is-undefined-explicitly.sdp.md | 8 +- ...urns-true-when-command-has-analysis.sdp.md | 8 +- ...-false-when-command-has-no-analysis.sdp.md | 8 +- ...en-analysis-is-undefined-explicitly.sdp.md | 8 +- ...-059-returns-true-for-null-analysis.sdp.md | 8 +- ...idates-creates-and-verifies-command.sdp.md | 8 +- ...-command-from-decision-and-verifies.sdp.md | 8 +- .../platform-core/agent/commands.sdp.md | 15 +- ...plus-estimated-cost-is-under-budget.sdp.md | 9 +- ...-estimated-cost-would-exceed-budget.sdp.md | 9 +- ...current-spend-already-equals-budget.sdp.md | 8 +- ...timated-cost-exactly-reaches-budget.sdp.md | 9 +- ...-when-spend-exceeds-alert-threshold.sdp.md | 9 +- ...lert-threshold-when-below-threshold.sdp.md | 9 +- ...reshold-at-exact-threshold-boundary.sdp.md | 9 +- ...cation-of-tokens-and-cost-per-token.sdp.md | 8 +- .../s-009-returns-0-for-0-tokens.sdp.md | 8 +- .../s-010-handles-large-token-counts.sdp.md | 8 +- ...1-handles-very-small-cost-per-token.sdp.md | 8 +- ...nd-output-costs-with-output-greater.sdp.md | 11 +- ...has-positive-input-and-output-costs.sdp.md | 10 +- ...-model-entry-is-cheaper-than-gpt-4o.sdp.md | 11 +- .../platform-core/agent/cost-budget.sdp.md | 9 +- ...1-contains-all-expected-error-codes.sdp.md | 8 +- .../s-002-has-exactly-3-error-codes.sdp.md | 8 +- ...ontains-all-three-statuses-in-order.sdp.md | 8 +- ...is-a-readonly-tuple-with-3-elements.sdp.md | 8 +- ...5-type-guard-accepts-valid-statuses.sdp.md | 8 +- ...6-type-guard-rejects-invalid-values.sdp.md | 8 +- ...type-guard-rejects-non-string-types.sdp.md | 8 +- .../s-008-accepts-all-valid-statuses.sdp.md | 8 +- ...s-009-rejects-invalid-status-values.sdp.md | 8 +- ...cepts-valid-context-with-all-fields.sdp.md | 9 +- ...ts-context-with-only-correlation-id.sdp.md | 9 +- ...ccepts-context-with-only-error-code.sdp.md | 9 +- .../s-013-accepts-empty-context-object.sdp.md | 9 +- ...-with-unknown-fields-in-strict-mode.sdp.md | 9 +- .../s-015-accepts-valid-dead-letter.sdp.md | 9 +- ...16-accepts-dead-letter-with-context.sdp.md | 9 +- ...cts-dead-letter-with-empty-agent-id.sdp.md | 9 +- ...d-letter-with-empty-subscription-id.sdp.md | 9 +- ...cts-dead-letter-with-empty-event-id.sdp.md | 9 +- ...etter-with-negative-global-position.sdp.md | 9 +- ...ad-letter-with-global-position-of-0.sdp.md | 9 +- ...ter-with-non-positive-attempt-count.sdp.md | 9 +- ...letter-with-missing-required-fields.sdp.md | 9 +- ...-when-followed-by-path-like-content.sdp.md | 9 +- ...025-removes-multi-line-stack-traces.sdp.md | 9 +- ...-preserves-the-error-message-itself.sdp.md | 8 +- ...pe-script-file-paths-with-at-prefix.sdp.md | 8 +- ...-without-at-prefix-with-path-marker.sdp.md | 8 +- ...-esm-file-paths-when-preceded-by-at.sdp.md | 8 +- ...path-marker-when-not-preceded-by-at.sdp.md | 8 +- ...-paths-with-line-and-column-numbers.sdp.md | 8 +- ...500-characters-ending-with-ellipsis.sdp.md | 9 +- ...ncate-messages-under-500-characters.sdp.md | 9 +- ...-messages-of-exactly-500-characters.sdp.md | 9 +- .../s-035-handles-error-objects.sdp.md | 8 +- .../s-036-handles-string-errors.sdp.md | 8 +- ...ndles-objects-with-message-property.sdp.md | 8 +- .../s-038-handles-unknown-error-types.sdp.md | 8 +- .../s-039-handles-null.sdp.md | 8 +- .../s-040-handles-undefined.sdp.md | 8 +- .../s-041-handles-empty-string.sdp.md | 8 +- .../s-042-collapses-multiple-spaces.sdp.md | 8 +- ...ims-leading-and-trailing-whitespace.sdp.md | 8 +- .../s-044-handles-newlines.sdp.md | 8 +- ...es-dead-letter-with-required-fields.sdp.md | 9 +- ...tes-dead-letter-with-pending-status.sdp.md | 9 +- .../s-047-sets-attempt-count-to-1.sdp.md | 9 +- ...-048-sets-failed-at-to-current-time.sdp.md | 9 +- ...-049-includes-context-when-provided.sdp.md | 9 +- ...t-include-context-when-not-provided.sdp.md | 9 +- ...bjects-removing-stack-like-patterns.sdp.md | 10 +- .../s-052-sanitizes-string-errors.sdp.md | 9 +- ...s-paths-in-errors-without-at-prefix.sdp.md | 9 +- ...laces-paths-with-line-column-suffix.sdp.md | 9 +- ...s-055-sanitizes-unknown-error-types.sdp.md | 9 +- .../s-056-increments-attempt-count.sdp.md | 10 +- .../s-057-updates-error-message.sdp.md | 10 +- ...s-new-error-message-with-at-pattern.sdp.md | 10 +- ...error-message-with-path-replacement.sdp.md | 10 +- ...0-updates-failed-at-to-current-time.sdp.md | 11 +- ...erves-other-fields-during-increment.sdp.md | 10 +- .../s-062-handles-multiple-increments.sdp.md | 11 +- ...063-transitions-pending-to-replayed.sdp.md | 9 +- ...elds-when-transitioning-to-replayed.sdp.md | 9 +- ...ng-replayed-dead-letter-as-replayed.sdp.md | 9 +- ...ing-ignored-dead-letter-as-replayed.sdp.md | 9 +- ...-067-transitions-pending-to-ignored.sdp.md | 9 +- ...ields-when-transitioning-to-ignored.sdp.md | 9 +- ...ing-replayed-dead-letter-as-ignored.sdp.md | 9 +- ...eady-ignored-dead-letter-as-ignored.sdp.md | 9 +- ...nding-returns-true-only-for-pending.sdp.md | 11 +- ...ayed-returns-true-only-for-replayed.sdp.md | 11 +- ...nored-returns-true-only-for-ignored.sdp.md | 11 +- ...-returns-true-for-valid-dead-letter.sdp.md | 9 +- ...s-true-for-dead-letter-with-context.sdp.md | 9 +- .../s-076-returns-false-for-null.sdp.md | 8 +- .../s-077-returns-false-for-undefined.sdp.md | 8 +- ...-078-returns-false-for-empty-object.sdp.md | 8 +- ...-returns-false-for-non-object-types.sdp.md | 8 +- ...for-dead-letter-with-invalid-status.sdp.md | 9 +- ...for-dead-letter-with-missing-fields.sdp.md | 9 +- ...ent-processing-and-replay-lifecycle.sdp.md | 18 +- ...olete-event-being-ignored-lifecycle.sdp.md | 12 +- .../platform-core/agent/dead-letter.sdp.md | 22 +- ...-001-subscribe-to-single-event-type.sdp.md | 11 +- ...2-subscribe-to-multiple-event-types.sdp.md | 10 +- ...oes-not-receive-unsubscribed-events.sdp.md | 10 +- .../s-004-filter-by-payload-field.sdp.md | 10 +- .../s-005-filter-by-customer-segment.sdp.md | 10 +- ...ents-delivered-in-publication-order.sdp.md | 10 +- ...nts-from-same-stream-maintain-order.sdp.md | 10 +- ...st-processed-position-after-restart.sdp.md | 13 +- ...t-updated-after-successful-analysis.sdp.md | 13 +- ...letter-without-advancing-checkpoint.sdp.md | 13 +- ...t-persists-agent-subscription-state.sdp.md | 11 +- .../s-012-pause-subscription.sdp.md | 10 +- .../s-013-resume-subscription.sdp.md | 10 +- ...nsubscribe-stops-all-event-delivery.sdp.md | 10 +- .../agent/event-subscription.sdp.md | 11 +- ...-execution-mode-based-on-confidence.sdp.md | 11 +- .../s-002-custom-threshold-per-agent.sdp.md | 12 +- ...pproval-action-with-high-confidence.sdp.md | 11 +- ...-approve-action-with-low-confidence.sdp.md | 11 +- ...gure-multiple-approval-requirements.sdp.md | 10 +- .../s-006-create-review-task.sdp.md | 12 +- .../s-007-approve-pending-action.sdp.md | 11 +- .../s-008-reject-pending-action.sdp.md | 12 +- .../s-009-action-expires-after-timeout.sdp.md | 12 +- ...-010-custom-timeout-per-action-type.sdp.md | 11 +- .../s-011-approve-action-near-timeout.sdp.md | 12 +- .../platform-core/agent/human-in-loop.sdp.md | 10 +- .../s-001-rejects-empty-string-id.sdp.md | 8 +- .../s-002-rejects-undefined-id.sdp.md | 8 +- .../s-003-rejects-whitespace-only-id.sdp.md | 8 +- ...4-rejects-empty-subscriptions-array.sdp.md | 8 +- ...005-rejects-undefined-subscriptions.sdp.md | 8 +- .../s-006-rejects-negative-threshold.sdp.md | 8 +- ...07-rejects-threshold-greater-than-1.sdp.md | 8 +- ...jects-empty-pattern-window-duration.sdp.md | 8 +- ...espace-only-pattern-window-duration.sdp.md | 8 +- ...-requires-approval-and-auto-approve.sdp.md | 9 +- ...jects-config-with-no-patterns-array.sdp.md | 8 +- ...ts-config-with-empty-patterns-array.sdp.md | 8 +- ...-accepts-valid-config-with-patterns.sdp.md | 8 +- ...config-without-confidence-threshold.sdp.md | 8 +- ...ansforms-a-standard-event-correctly.sdp.md | 9 +- ...-wraps-array-payload-in-raw-wrapper.sdp.md | 8 +- ...7-wraps-null-payload-in-raw-wrapper.sdp.md | 8 +- ...gh-object-payloads-without-wrapping.sdp.md | 8 +- ...d-from-the-chain-not-from-the-event.sdp.md | 8 +- ...scription-id-starts-with-sub-prefix.sdp.md | 8 +- ...bscription-id-contains-the-agent-id.sdp.md | 8 +- ...cription-id-contains-a-uuid-segment.sdp.md | 8 +- ...fferent-i-ds-when-timestamp-differs.sdp.md | 8 +- ...cess-with-handle-for-a-valid-config.sdp.md | 10 +- ...alid-config-code-for-invalid-config.sdp.md | 9 +- ...s-existing-checkpoint-when-provided.sdp.md | 12 +- ...hen-no-existing-checkpoint-provided.sdp.md | 13 +- .../behavior/platform-core/agent/init.sdp.md | 18 +- ...nd-carries-type-and-required-fields.sdp.md | 8 +- ...rries-optional-reason-when-provided.sdp.md | 9 +- ...d-has-undefined-reason-when-omitted.sdp.md | 8 +- ...-agent-command-carries-correct-type.sdp.md | 8 +- ...rries-optional-reason-when-provided.sdp.md | 9 +- ...config-overrides-with-nested-fields.sdp.md | 9 +- ...on-narrows-by-type-field-at-runtime.sdp.md | 9 +- ...-optional-in-agent-config-overrides.sdp.md | 8 +- ...s-with-only-max-requests-per-minute.sdp.md | 10 +- ...st-budget-overrides-with-only-daily.sdp.md | 9 +- ...s-contain-expected-values-and-count.sdp.md | 9 +- ...ult-carries-state-transition-fields.sdp.md | 8 +- ...rror-code-carries-message-and-state.sdp.md | 10 +- ...t-current-state-for-agent-not-found.sdp.md | 8 +- ...ted-union-narrows-to-success-branch.sdp.md | 8 +- ...ted-union-narrows-to-failure-branch.sdp.md | 8 +- ...l-lifecycle-validators-are-exported.sdp.md | 8 +- .../agent/lifecycle-commands.sdp.md | 10 +- ...cle-states-contains-all-four-states.sdp.md | 9 +- ...le-events-contains-all-seven-events.sdp.md | 9 +- ...t-target-for-every-valid-transition.sdp.md | 8 +- ...n-returns-true-for-every-valid-pair.sdp.md | 8 +- ...ll-for-representative-invalid-pairs.sdp.md | 8 +- ...id-pairs-exist-and-all-return-false.sdp.md | 9 +- ...rn-null-from-transition-agent-state.sdp.md | 9 +- ...ns-next-state-for-valid-transitions.sdp.md | 8 +- ...ition-throws-for-invalid-transition.sdp.md | 8 +- ...tion-error-message-includes-details.sdp.md | 8 +- ...-returns-correct-events-for-stopped.sdp.md | 8 +- ...m-returns-correct-events-for-active.sdp.md | 8 +- ...m-returns-correct-events-for-paused.sdp.md | 8 +- ...s-correct-events-for-error-recovery.sdp.md | 8 +- ...ions-returns-exactly-10-transitions.sdp.md | 8 +- ...sition-has-from-event-and-to-fields.sdp.md | 8 +- ...tions-contains-specific-transitions.sdp.md | 8 +- ...ns-returns-same-reference-each-call.sdp.md | 8 +- ...rrect-classification-for-all-states.sdp.md | 8 +- ...rrect-classification-for-all-states.sdp.md | 8 +- ...mmands-and-returns-null-for-unknown.sdp.md | 8 +- .../platform-core/agent/lifecycle-fsm.sdp.md | 18 +- ...-to-active-with-agent-started-audit.sdp.md | 13 +- ...002-rejects-start-from-active-state.sdp.md | 12 +- ...003-rejects-start-from-paused-state.sdp.md | 10 +- ...-with-agent-paused-audit-and-reason.sdp.md | 12 +- ...05-rejects-pause-from-stopped-state.sdp.md | 11 +- ...-to-active-with-agent-resumed-audit.sdp.md | 12 +- ...7-rejects-resume-from-stopped-state.sdp.md | 11 +- ...to-stopped-with-agent-stopped-audit.sdp.md | 12 +- ...o-stopped-as-universal-escape-hatch.sdp.md | 10 +- ...appy-path-error-recovery-to-stopped.sdp.md | 9 +- ...cts-stop-from-already-stopped-state.sdp.md | 11 +- ...-active-agent-with-merged-overrides.sdp.md | 12 +- ...aused-agent-transitioning-to-active.sdp.md | 11 +- ...ects-reconfigure-from-stopped-state.sdp.md | 11 +- ...-overrides-when-checkpoint-has-none.sdp.md | 11 +- ...ory-returns-all-5-handler-functions.sdp.md | 8 +- ...plete-a-start-pause-stop-round-trip.sdp.md | 8 +- ...ses-no-op-logger-when-none-provided.sdp.md | 9 +- ...-logs-warning-on-invalid-transition.sdp.md | 10 +- .../agent/lifecycle-handlers.sdp.md | 12 +- ...ately-without-calling-any-mutations.sdp.md | 10 +- ...ent-but-does-not-advance-checkpoint.sdp.md | 13 +- ...heckpoint-when-return-value-is-null.sdp.md | 14 +- ...rder-when-requires-approval-is-true.sdp.md | 10 +- ...pdates-checkpoint-with-correct-args.sdp.md | 10 +- ...24h-timeout-for-approval-expires-at.sdp.md | 10 +- ...val-when-requires-approval-is-false.sdp.md | 11 +- ...approval-is-true-but-command-is-nul.sdp.md | 12 +- ...-timeout-ms-for-approval-expires-at.sdp.md | 10 +- ...oint-but-skips-command-and-approval.sdp.md | 13 +- ...oint-position-equals-event-position.sdp.md | 15 +- ...tes-dead-letter-instead-of-throwing.sdp.md | 13 +- ...kpoint-when-audit-persistence-fails.sdp.md | 18 +- ...oint-when-command-persistence-fails.sdp.md | 16 +- ...int-when-approval-persistence-fails.sdp.md | 17 +- ...e-calls-include-verification-proofs.sdp.md | 12 +- ...en-dead-letter-recording-also-fails.sdp.md | 14 +- ...-result-dead-letter-recording-fails.sdp.md | 12 +- .../agent/oncomplete-handler.sdp.md | 12 +- .../s-001-define-rule-based-pattern.sdp.md | 12 +- .../s-002-define-llm-analyzed-pattern.sdp.md | 11 +- ...s-003-window-respects-time-boundary.sdp.md | 11 +- .../s-004-window-respects-event-limit.sdp.md | 11 +- ...05-empty-window-returns-no-patterns.sdp.md | 11 +- ...events-lazily-for-memory-efficiency.sdp.md | 13 +- ...etect-churn-risk-from-cancellations.sdp.md | 11 +- ...t-fraud-risk-from-frequency-anomaly.sdp.md | 12 +- ...9-no-pattern-when-threshold-not-met.sdp.md | 10 +- .../s-010-llm-analyzes-event-sequence.sdp.md | 12 +- ...-response-includes-suggested-action.sdp.md | 11 +- ...-012-llm-timeout-handled-gracefully.sdp.md | 11 +- .../agent/pattern-detection.sdp.md | 10 +- ...l-decision-for-empty-patterns-array.sdp.md | 11 +- ...trigger-returns-true-and-no-analyze.sdp.md | 14 +- ...-pattern-when-trigger-returns-false.sdp.md | 11 +- ...ision-when-analyze-returns-detected.sdp.md | 15 +- ...n-when-analyze-returns-not-detected.sdp.md | 12 +- ...ropagates-error-when-analyze-throws.sdp.md | 10 +- ...-stops-after-first-matching-pattern.sdp.md | 12 +- ...pattern-when-first-trigger-is-false.sdp.md | 12 +- ...-pattern-when-min-events-is-not-met.sdp.md | 12 +- ...sses-pattern-when-min-events-is-met.sdp.md | 10 +- ...s-events-outside-the-pattern-window.sdp.md | 12 +- ...n-all-events-are-outside-the-window.sdp.md | 11 +- ...s-command-type-from-analysis-result.sdp.md | 13 +- ...ull-command-when-no-command-present.sdp.md | 9 +- ...and-payload-when-command-is-present.sdp.md | 9 +- ...-as-payload-when-no-command-present.sdp.md | 9 +- ...-when-confidence-is-below-threshold.sdp.md | 9 +- ...val-when-confidence-meets-threshold.sdp.md | 9 +- ...al-when-confidence-equals-threshold.sdp.md | 9 +- ...approval-when-no-command-is-present.sdp.md | 9 +- ...ommand-is-in-requires-approval-list.sdp.md | 9 +- ...hen-command-is-in-auto-approve-list.sdp.md | 9 +- ...-over-auto-approve-for-same-command.sdp.md | 9 +- ...l-command-for-trigger-only-decision.sdp.md | 11 +- ...-approval-for-trigger-only-decision.sdp.md | 10 +- ...ern-name-in-trigger-decision-reason.sdp.md | 10 +- ...nt-count-in-trigger-decision-reason.sdp.md | 10 +- ...all-event-i-ds-in-triggering-events.sdp.md | 10 +- ...-returns-0-6-confidence-for-1-event.sdp.md | 10 +- ...returns-0-7-confidence-for-2-events.sdp.md | 10 +- ...returns-0-8-confidence-for-3-events.sdp.md | 10 +- .../s-032-caps-at-0-85-for-4-events.sdp.md | 10 +- .../s-033-caps-at-0-85-for-10-events.sdp.md | 10 +- ...-returns-0-5-for-0-events-edge-case.sdp.md | 10 +- .../agent/pattern-executor.sdp.md | 18 +- ...-object-contains-all-expected-codes.sdp.md | 9 +- .../s-002-single-valid-pattern-passes.sdp.md | 8 +- ...ple-patterns-with-unique-names-pass.sdp.md | 8 +- ...ifferent-window-configurations-pass.sdp.md | 9 +- ...attern-with-analyze-function-passes.sdp.md | 8 +- .../s-006-empty-array-returns-valid.sdp.md | 8 +- ...07-two-patterns-with-same-name-fail.sdp.md | 9 +- ...plicate-detected-in-middle-of-array.sdp.md | 9 +- ...t-circuits-on-first-duplicate-found.sdp.md | 9 +- ...me-fails-with-pattern-name-required.sdp.md | 8 +- ...me-fails-with-pattern-name-required.sdp.md | 8 +- ...ort-circuits-before-duplicate-check.sdp.md | 8 +- ...tern-without-trigger-function-fails.sdp.md | 8 +- ...ern-with-non-function-trigger-fails.sdp.md | 8 +- ...s-to-registry-pattern-name-required.sdp.md | 8 +- ...d-maps-to-registry-trigger-required.sdp.md | 8 +- ...-error-codes-map-to-invalid-pattern.sdp.md | 8 +- .../s-018-accepts-readonly-array-input.sdp.md | 8 +- ...s-correct-discriminated-union-shape.sdp.md | 9 +- .../agent/pattern-registry.sdp.md | 13 +- ...r-codes-contain-all-expected-values.sdp.md | 9 +- ...pts-valid-window-with-duration-only.sdp.md | 8 +- ...pts-window-with-all-optional-fields.sdp.md | 8 +- ...-rejects-window-with-empty-duration.sdp.md | 8 +- ...ejects-window-with-missing-duration.sdp.md | 8 +- ...indow-with-non-positive-event-limit.sdp.md | 8 +- ...ts-window-with-negative-event-limit.sdp.md | 8 +- ...window-with-non-positive-min-events.sdp.md | 8 +- ...w-with-non-positive-load-batch-size.sdp.md | 8 +- ...window-with-non-integer-event-limit.sdp.md | 8 +- .../s-011-parses-days-format-correctly.sdp.md | 8 +- ...s-012-parses-hours-format-correctly.sdp.md | 8 +- ...013-parses-minutes-format-correctly.sdp.md | 8 +- .../s-014-handles-uppercase-units.sdp.md | 8 +- ...15-returns-null-for-invalid-formats.sdp.md | 8 +- ...ims-leading-and-trailing-whitespace.sdp.md | 8 +- ...rns-true-for-valid-duration-formats.sdp.md | 8 +- ...-false-for-invalid-duration-formats.sdp.md | 8 +- ...eturns-invalid-when-name-is-missing.sdp.md | 8 +- ...s-invalid-when-name-is-empty-string.sdp.md | 8 +- ...nvalid-when-name-is-whitespace-only.sdp.md | 8 +- ...rns-invalid-when-trigger-is-missing.sdp.md | 8 +- ...alid-when-trigger-is-not-a-function.sdp.md | 8 +- ...lid-when-duration-format-is-invalid.sdp.md | 8 +- ...urns-invalid-when-duration-is-empty.sdp.md | 8 +- ...id-when-event-limit-is-non-positive.sdp.md | 8 +- ...nvalid-when-event-limit-is-negative.sdp.md | 8 +- ...-when-event-limit-is-not-an-integer.sdp.md | 8 +- ...lid-when-min-events-is-non-positive.sdp.md | 8 +- ...hen-load-batch-size-is-non-positive.sdp.md | 8 +- ...eturns-valid-for-minimal-definition.sdp.md | 8 +- ...turns-valid-for-complete-definition.sdp.md | 8 +- ...-definition-with-all-window-options.sdp.md | 8 +- ...4-returns-the-definition-when-valid.sdp.md | 8 +- ...5-throws-error-when-name-is-missing.sdp.md | 8 +- ...hrows-error-when-trigger-is-missing.sdp.md | 8 +- ...rows-error-when-duration-is-invalid.sdp.md | 8 +- ...-error-code-in-thrown-error-message.sdp.md | 8 +- .../s-039-calculates-boundary-for-days.sdp.md | 8 +- ...s-040-calculates-boundary-for-hours.sdp.md | 8 +- ...041-calculates-boundary-for-minutes.sdp.md | 8 +- ...s-date-now-when-now-is-not-provided.sdp.md | 8 +- ...s-error-for-invalid-duration-format.sdp.md | 8 +- ...4-includes-events-within-the-window.sdp.md | 9 +- ...-excludes-events-outside-the-window.sdp.md | 9 +- ...udes-events-exactly-at-the-boundary.sdp.md | 9 +- ...s-event-limit-and-takes-most-recent.sdp.md | 9 +- ...es-not-limit-when-under-event-limit.sdp.md | 9 +- ...ns-empty-array-when-no-events-match.sdp.md | 9 +- .../s-050-handles-empty-events-array.sdp.md | 8 +- ...-when-events-count-meets-min-events.sdp.md | 8 +- ...hen-events-count-exceeds-min-events.sdp.md | 8 +- ...en-events-count-is-below-min-events.sdp.md | 8 +- .../s-054-defaults-to-min-events-of-1.sdp.md | 8 +- ...y-events-when-min-events-is-default.sdp.md | 8 +- ...ue-when-event-count-meets-threshold.sdp.md | 8 +- ...-when-event-count-exceeds-threshold.sdp.md | 8 +- ...when-event-count-is-below-threshold.sdp.md | 8 +- ...rns-true-when-event-type-is-present.sdp.md | 9 +- ...alse-when-event-type-is-not-present.sdp.md | 9 +- ...-of-multiple-event-types-is-present.sdp.md | 9 +- .../s-062-respects-min-count-parameter.sdp.md | 9 +- ...-returns-true-when-min-count-is-met.sdp.md | 9 +- ...ue-when-minimum-streams-are-present.sdp.md | 9 +- ...ns-false-when-below-minimum-streams.sdp.md | 9 +- ...066-counts-unique-streams-correctly.sdp.md | 9 +- ...eturns-true-when-all-triggers-match.sdp.md | 8 +- ...lse-when-any-trigger-does-not-match.sdp.md | 8 +- ...eturns-false-when-no-triggers-match.sdp.md | 8 +- ...turns-true-for-empty-triggers-array.sdp.md | 8 +- ...s-071-passes-events-to-each-trigger.sdp.md | 8 +- ...turns-true-when-any-trigger-matches.sdp.md | 8 +- ...eturns-true-when-all-triggers-match.sdp.md | 8 +- ...eturns-false-when-no-triggers-match.sdp.md | 8 +- ...urns-false-for-empty-triggers-array.sdp.md | 8 +- ...s-076-short-circuits-on-first-match.sdp.md | 8 +- ...threshold-with-event-type-using-all.sdp.md | 9 +- ...vent-type-missing-despite-count-met.sdp.md | 9 +- ...with-count-thresholds-alert-present.sdp.md | 9 +- ...nt-thresholds-neither-condition-met.sdp.md | 9 +- .../platform-core/agent/patterns.sdp.md | 20 +- ...des-are-present-with-correct-values.sdp.md | 8 +- ...-codes-object-has-exactly-8-entries.sdp.md | 8 +- .../s-003-accepts-valid-cost-budget.sdp.md | 8 +- ...-004-rejects-budget-with-zero-daily.sdp.md | 8 +- ...-rejects-budget-with-negative-daily.sdp.md | 8 +- ...budget-with-alert-threshold-above-1.sdp.md | 8 +- ...udget-with-negative-alert-threshold.sdp.md | 8 +- ...cepts-alert-threshold-at-boundary-0.sdp.md | 8 +- ...cepts-alert-threshold-at-boundary-1.sdp.md | 8 +- ...id-config-with-required-fields-only.sdp.md | 8 +- ...pts-config-with-all-optional-fields.sdp.md | 8 +- ...g-with-zero-max-requests-per-minute.sdp.md | 8 +- ...th-negative-max-requests-per-minute.sdp.md | 8 +- ...non-integer-max-requests-per-minute.sdp.md | 8 +- ...cts-config-with-zero-max-concurrent.sdp.md | 8 +- ...ejects-config-with-zero-queue-depth.sdp.md | 8 +- ...ax-requests-per-minute-is-undefined.sdp.md | 10 +- ...hen-max-requests-per-minute-is-zero.sdp.md | 8 +- ...max-requests-per-minute-is-negative.sdp.md | 8 +- ...quests-per-minute-is-not-an-integer.sdp.md | 8 +- ...ive-integer-max-requests-per-minute.sdp.md | 8 +- ...invalid-when-max-concurrent-is-zero.sdp.md | 9 +- ...lid-when-max-concurrent-is-negative.sdp.md | 8 +- ...en-max-concurrent-is-not-an-integer.sdp.md | 8 +- ...id-when-max-concurrent-is-undefined.sdp.md | 8 +- ...ns-invalid-when-queue-depth-is-zero.sdp.md | 9 +- ...nvalid-when-queue-depth-is-negative.sdp.md | 8 +- ...-when-queue-depth-is-not-an-integer.sdp.md | 8 +- ...alid-when-cost-budget-daily-is-zero.sdp.md | 9 +- ...-when-cost-budget-daily-is-negative.sdp.md | 8 +- ...t-budget-alert-threshold-is-below-0.sdp.md | 9 +- ...t-budget-alert-threshold-is-above-1.sdp.md | 8 +- ...rns-valid-when-cost-budget-is-valid.sdp.md | 8 +- ...rns-valid-for-complete-valid-config.sdp.md | 8 +- ...ult-config-has-correct-field-values.sdp.md | 11 +- ...36-default-config-passes-validation.sdp.md | 8 +- ...-config-with-specified-daily-budget.sdp.md | 8 +- ...-alert-threshold-when-not-specified.sdp.md | 8 +- ...-039-uses-specified-alert-threshold.sdp.md | 8 +- ...s-specified-max-requests-per-minute.sdp.md | 8 +- ...uests-per-minute-when-not-specified.sdp.md | 8 +- .../s-042-includes-all-optional-fields.sdp.md | 8 +- ...creates-error-with-code-and-message.sdp.md | 9 +- ...t-optional-fields-when-not-provided.sdp.md | 9 +- ...r-with-retry-after-ms-when-provided.sdp.md | 8 +- ...es-error-with-context-when-provided.sdp.md | 8 +- ...ith-both-retry-after-ms-and-context.sdp.md | 9 +- ...rns-true-for-valid-rate-limit-error.sdp.md | 8 +- ...urns-true-for-all-known-error-codes.sdp.md | 8 +- ...-returns-false-for-non-error-values.sdp.md | 8 +- .../s-051-retryable-error-codes.sdp.md | 8 +- ...rns-false-for-non-rate-limit-errors.sdp.md | 8 +- .../s-053-permanent-error-codes.sdp.md | 8 +- ...rns-false-for-non-rate-limit-errors.sdp.md | 8 +- ...attern-with-math-random-mocked-to-0.sdp.md | 8 +- ...aps-at-default-max-delay-of-60000ms.sdp.md | 8 +- .../s-057-caps-at-custom-max-delay.sdp.md | 8 +- ...oes-not-cap-when-delay-is-below-max.sdp.md | 8 +- ...s-059-adds-jitter-up-to-25-of-delay.sdp.md | 8 +- ...s-max-jitter-of-25-when-random-is-1.sdp.md | 8 +- ...1-uses-default-base-delay-of-1000ms.sdp.md | 8 +- ...2-uses-default-max-delay-of-60000ms.sdp.md | 8 +- .../s-063-returns-floored-integer.sdp.md | 8 +- ...urns-true-when-total-exceeds-budget.sdp.md | 8 +- ...ns-false-when-total-is-under-budget.sdp.md | 8 +- ...se-when-total-equals-budget-exactly.sdp.md | 8 +- ...urrent-spend-already-exceeds-budget.sdp.md | 8 +- ...les-zero-current-spend-under-budget.sdp.md | 8 +- ...dles-zero-current-spend-over-budget.sdp.md | 8 +- ...s-small-decimal-values-under-budget.sdp.md | 8 +- ...es-small-decimal-values-over-budget.sdp.md | 8 +- ...-spend-reaches-threshold-percentage.sdp.md | 8 +- ...s-true-when-spend-exceeds-threshold.sdp.md | 8 +- ...false-when-spend-is-below-threshold.sdp.md | 8 +- ...handles-threshold-of-0-always-alert.sdp.md | 8 +- ...es-threshold-of-1-below-full-budget.sdp.md | 8 +- ...ndles-threshold-of-1-at-full-budget.sdp.md | 8 +- ...ns-defaults-when-no-config-provided.sdp.md | 8 +- ...ults-when-undefined-config-provided.sdp.md | 8 +- ...es-provided-max-requests-per-minute.sdp.md | 8 +- ...lt-max-concurrent-when-not-provided.sdp.md | 8 +- .../s-082-uses-provided-max-concurrent.sdp.md | 8 +- ...fault-queue-depth-when-not-provided.sdp.md | 8 +- .../s-084-uses-provided-queue-depth.sdp.md | 8 +- ...preserves-cost-budget-when-provided.sdp.md | 8 +- ...clude-cost-budget-when-not-provided.sdp.md | 8 +- .../platform-core/agent/rate-limit.sdp.md | 19 +- ...xt-and-parses-a-valid-json-response.sdp.md | 10 +- ...les-non-json-response-with-defaults.sdp.md | 8 +- ...3-handles-malformed-json-gracefully.sdp.md | 8 +- ...-004-re-throws-generate-text-errors.sdp.md | 8 +- .../s-005-tracks-timing-in-llm-context.sdp.md | 8 +- ...read-id-in-llm-context-when-present.sdp.md | 8 +- ...d-from-llm-context-when-not-present.sdp.md | 8 +- ...dles-missing-usage-with-zero-tokens.sdp.md | 8 +- ...and-parses-json-response-for-reason.sdp.md | 8 +- ...-raw-text-when-response-is-not-json.sdp.md | 8 +- ...ws-generate-text-errors-from-reason.sdp.md | 8 +- ...logs-reasoning-start-and-completion.sdp.md | 9 +- .../platform-core/agent/thread-adapter.sdp.md | 15 +- ...ommands-sequentially-in-atomic-mode.sdp.md | 12 +- ...-and-skips-remaining-in-atomic-mode.sdp.md | 12 +- ...s-aggregate-commands-in-atomic-mode.sdp.md | 12 +- ...hared-correlation-id-in-atomic-mode.sdp.md | 11 +- ...relation-id-override-in-atomic-mode.sdp.md | 11 +- ...-even-with-failures-in-partial-mode.sdp.md | 12 +- ...ll-commands-succeed-in-partial-mode.sdp.md | 11 +- ...-aggregate-commands-in-partial-mode.sdp.md | 11 +- ...cts-max-concurrency-in-partial-mode.sdp.md | 11 +- ...e-on-error-is-false-in-partial-mode.sdp.md | 11 +- ...1-tracks-individual-command-results.sdp.md | 12 +- ...-includes-duration-for-each-command.sdp.md | 10 +- ...s-error-message-for-failed-commands.sdp.md | 10 +- ...lculates-correct-summary-statistics.sdp.md | 11 +- ...15-handles-executor-throwing-errors.sdp.md | 12 +- ...-016-handles-empty-batch-gracefully.sdp.md | 10 +- ...-max-command-count-before-execution.sdp.md | 12 +- ...-batch-exactly-at-max-command-count.sdp.md | 11 +- ...xactly-at-default-max-command-count.sdp.md | 11 +- ...-max-command-count-before-execution.sdp.md | 12 +- ...commands-from-wrong-bounded-context.sdp.md | 12 +- ...batch-executor-instance-via-factory.sdp.md | 8 +- .../platform-core/batch/batch-executor.sdp.md | 12 +- .../s-001-rejects-empty-batch.sdp.md | 8 +- ...2-accepts-batch-exactly-at-max-size.sdp.md | 8 +- ...03-rejects-batch-exceeding-max-size.sdp.md | 8 +- ...s-batch-exactly-at-default-max-size.sdp.md | 8 +- ...ts-batch-exceeding-default-max-size.sdp.md | 8 +- ...pts-valid-commands-without-registry.sdp.md | 8 +- ...mands-in-different-bounded-contexts.sdp.md | 9 +- .../s-008-requires-aggregate-id-option.sdp.md | 8 +- ...-requires-aggregate-id-field-option.sdp.md | 8 +- ...-all-commands-target-same-aggregate.sdp.md | 8 +- ...ommands-target-different-aggregates.sdp.md | 8 +- ...ggregate-with-explicit-aggregate-id.sdp.md | 9 +- ...om-first-command-when-not-specified.sdp.md | 9 +- ...arget-different-aggregate-instances.sdp.md | 9 +- ...ds-target-different-aggregate-types.sdp.md | 9 +- ...n-aggregate-commands-in-atomic-mode.sdp.md | 9 +- ...s-017-rejects-unregistered-commands.sdp.md | 9 +- ...-matching-specified-bounded-context.sdp.md | 9 +- ...commands-from-wrong-bounded-context.sdp.md | 9 +- ...s-020-extracts-id-from-command-args.sdp.md | 8 +- ...returns-undefined-for-missing-field.sdp.md | 8 +- ...urns-undefined-for-non-string-value.sdp.md | 8 +- ...023-groups-commands-by-aggregate-id.sdp.md | 10 +- ...4-uses-placeholder-for-missing-i-ds.sdp.md | 10 +- .../platform-core/batch/validation.sdp.md | 13 +- ...t-current-version-is-returned-as-is.sdp.md | 12 +- ...002-state-is-migrated-from-v1-to-v2.sdp.md | 13 +- ...003-state-is-migrated-from-v1-to-v3.sdp.md | 14 +- ...ate-version-is-treated-as-version-0.sdp.md | 12 +- ...ull-input-throws-cms-upcaster-error.sdp.md | 12 +- ...ned-input-throws-cms-upcaster-error.sdp.md | 12 +- ...ation-chain-throws-at-creation-time.sdp.md | 8 +- ...e-version-throws-cms-upcaster-error.sdp.md | 11 +- ...function-error-propagates-mid-chain.sdp.md | 10 +- ...migration-function-error-propagates.sdp.md | 10 +- ...returned-as-is-via-upcast-if-needed.sdp.md | 11 +- ...te-is-migrated-via-upcast-if-needed.sdp.md | 12 +- ...lidation-passes-when-state-is-valid.sdp.md | 10 +- ...idation-fails-when-state-is-invalid.sdp.md | 10 +- ...upcaster-error-via-upcast-if-needed.sdp.md | 13 +- .../s-016-error-has-correct-name.sdp.md | 9 +- .../s-017-error-has-correct-code.sdp.md | 9 +- .../s-018-error-has-correct-message.sdp.md | 9 +- ...-error-stores-context-when-provided.sdp.md | 9 +- ...undefined-context-when-not-provided.sdp.md | 9 +- .../s-021-error-is-instanceof-error.sdp.md | 9 +- ...on-passes-for-current-version-state.sdp.md | 11 +- ...ersion-state-with-empty-description.sdp.md | 11 +- ...tion-passes-after-upcasting-from-v1.sdp.md | 11 +- ...er-upcasting-produces-invalid-state.sdp.md | 11 +- ...s-026-static-default-value-is-added.sdp.md | 12 +- ...027-computed-default-value-is-added.sdp.md | 11 +- ...028-computed-default-accesses-state.sdp.md | 10 +- ...s-029-existing-fields-are-preserved.sdp.md | 12 +- .../s-030-field-is-renamed.sdp.md | 13 +- ...-fields-are-preserved-when-renaming.sdp.md | 12 +- ...d-value-in-renamed-field-is-handled.sdp.md | 11 +- .../s-033-specified-field-is-removed.sdp.md | 12 +- ...-fields-are-preserved-when-removing.sdp.md | 13 +- ...xistent-field-is-handled-gracefully.sdp.md | 11 +- ...-migration-works-in-migration-chain.sdp.md | 12 +- ...tiple-helper-migrations-are-chained.sdp.md | 15 +- .../platform-core/cms/upcaster.sdp.md | 21 +- ...y-four-entries-in-the-correct-order.sdp.md | 9 +- ...hema-accepts-valid-category-strings.sdp.md | 8 +- ...ema-rejects-invalid-category-values.sdp.md | 8 +- ...fault-command-category-is-aggregate.sdp.md | 8 +- ...-guard-accepts-all-valid-categories.sdp.md | 8 +- ...6-type-guard-rejects-invalid-values.sdp.md | 8 +- ...d-categories-are-returned-unchanged.sdp.md | 8 +- ...valid-values-normalize-to-aggregate.sdp.md | 8 +- ...fication-of-categories-as-aggregate.sdp.md | 8 +- ...sification-of-categories-as-process.sdp.md | 8 +- ...ssification-of-categories-as-system.sdp.md | 8 +- ...assification-of-categories-as-batch.sdp.md | 8 +- ...ema-accepts-valid-aggregate-targets.sdp.md | 8 +- ...a-rejects-invalid-aggregate-targets.sdp.md | 8 +- .../platform-core/commands/categories.sdp.md | 16 +- ...ly-four-entries-with-correct-values.sdp.md | 9 +- ...-members-have-correct-string-values.sdp.md | 8 +- ...uard-accepts-valid-error-categories.sdp.md | 8 +- ...4-type-guard-rejects-invalid-values.sdp.md | 8 +- ...rror-is-created-with-all-properties.sdp.md | 9 +- ...mmand-error-is-an-instance-of-error.sdp.md | 8 +- ...ns-existing-command-error-unchanged.sdp.md | 8 +- ...nd-error-from-wraps-a-regular-error.sdp.md | 9 +- ...and-error-from-wraps-a-string-value.sdp.md | 8 +- ...d-error-from-wraps-an-unknown-value.sdp.md | 8 +- ...-json-serializes-error-with-context.sdp.md | 9 +- ...2-to-json-handles-undefined-context.sdp.md | 8 +- .../s-013-factory-creates-domain-error.sdp.md | 8 +- ...14-factory-creates-validation-error.sdp.md | 8 +- ...5-factory-creates-concurrency-error.sdp.md | 8 +- ...actory-creates-infrastructure-error.sdp.md | 8 +- ...017-factory-creates-not-found-error.sdp.md | 9 +- ...actory-creates-already-exists-error.sdp.md | 8 +- ...factory-creates-invalid-state-error.sdp.md | 9 +- ...-factory-creates-unauthorized-error.sdp.md | 8 +- ...-factory-creates-rate-limited-error.sdp.md | 8 +- ...-returns-true-for-matching-category.sdp.md | 8 +- ...rns-false-for-non-matching-category.sdp.md | 8 +- ...returns-false-for-non-command-error.sdp.md | 8 +- ...ble-errors-are-identified-correctly.sdp.md | 10 +- ...n-recoverable-error-gets-delay-of-1.sdp.md | 8 +- ...ency-error-delays-escalate-then-cap.sdp.md | 8 +- ...ture-error-delays-escalate-then-cap.sdp.md | 8 +- ...ror-gets-infrastructure-style-delay.sdp.md | 8 +- .../platform-core/commands/errors.sdp.md | 29 +- ...category-and-preserves-command-type.sdp.md | 9 +- ...target-is-present-on-parsed-command.sdp.md | 8 +- ...et-is-undefined-when-not-configured.sdp.md | 8 +- ...a-rejects-a-mismatched-command-type.sdp.md | 8 +- ...ts-commands-missing-required-fields.sdp.md | 8 +- ...category-and-preserves-command-type.sdp.md | 9 +- ...s-type-is-present-on-parsed-command.sdp.md | 8 +- ...pe-is-undefined-when-not-configured.sdp.md | 8 +- ...category-and-preserves-command-type.sdp.md | 9 +- ...uires-idempotency-defaults-to-false.sdp.md | 8 +- ...ires-idempotency-can-be-set-to-true.sdp.md | 8 +- ...a-assigns-batch-category-with-items.sdp.md | 9 +- ...config-is-present-on-parsed-command.sdp.md | 8 +- ...ms-that-fail-item-schema-validation.sdp.md | 8 +- ...s-015-empty-items-array-is-accepted.sdp.md | 8 +- ...-extracted-from-each-factory-schema.sdp.md | 8 +- ...on-command-schemas-return-undefined.sdp.md | 8 +- .../platform-core/commands/factories.sdp.md | 23 +- ...ixes-includes-all-standard-prefixes.sdp.md | 8 +- ...accepts-valid-create-prefixed-names.sdp.md | 8 +- ...rn-accepts-valid-add-prefixed-names.sdp.md | 8 +- ...s-update-change-and-modify-prefixes.sdp.md | 8 +- ...05-valid-command-names-are-accepted.sdp.md | 8 +- ...-invalid-command-names-are-rejected.sdp.md | 8 +- ...eturn-matched-prefix-and-valid-flag.sdp.md | 9 +- ...turns-suggestions-and-error-message.sdp.md | 10 +- ...-name-receives-corrected-suggestion.sdp.md | 8 +- ...uggestions-are-limited-to-at-most-3.sdp.md | 8 +- ...011-known-names-return-their-prefix.sdp.md | 8 +- ...lid-or-empty-names-return-undefined.sdp.md | 8 +- ...s-produce-correct-pascal-case-names.sdp.md | 8 +- .../platform-core/commands/naming.sdp.md | 15 +- ...ion-id-and-generates-correlation-id.sdp.md | 12 +- ...-chain-uses-provided-correlation-id.sdp.md | 9 +- .../s-003-chain-uses-provided-user-id.sdp.md | 9 +- .../s-004-chain-uses-provided-context.sdp.md | 9 +- ...05-chain-uses-provided-initiated-at.sdp.md | 8 +- ...-chain-accepts-all-options-together.sdp.md | 9 +- ...d-and-uses-event-id-as-causation-id.sdp.md | 11 +- ...-chain-inherits-user-id-from-source.sdp.md | 10 +- ...-chain-inherits-context-from-source.sdp.md | 10 +- ...n-merges-source-and-option-contexts.sdp.md | 10 +- ...akes-precedence-over-source-context.sdp.md | 10 +- ...served-when-options-have-no-context.sdp.md | 10 +- ...ext-used-when-source-has-no-context.sdp.md | 10 +- ...her-source-nor-options-have-context.sdp.md | 10 +- ...mpty-contexts-merge-to-empty-object.sdp.md | 10 +- ...erved-when-options-context-is-empty.sdp.md | 10 +- ...t-used-when-source-context-is-empty.sdp.md | 10 +- ...ived-chain-uses-provided-command-id.sdp.md | 10 +- ...ed-chain-uses-provided-initiated-at.sdp.md | 10 +- ...cts-correlation-id-and-causation-id.sdp.md | 9 +- ...s-021-includes-user-id-when-present.sdp.md | 9 +- ...022-excludes-user-id-when-undefined.sdp.md | 9 +- .../s-023-merges-additional-metadata.sdp.md | 10 +- ...itiated-at-or-command-id-from-chain.sdp.md | 9 +- ...for-chains-with-same-correlation-id.sdp.md | 10 +- ...ains-with-different-correlation-ids.sdp.md | 10 +- ...sation-id-matches-parent-command-id.sdp.md | 10 +- ...n-child-causation-id-does-not-match.sdp.md | 10 +- ...hain-where-command-is-its-own-cause.sdp.md | 9 +- ...-user-command-through-saga-reaction.sdp.md | 16 +- ...s-correlation-id-across-three-links.sdp.md | 12 +- .../platform-core/correlation/chain.sdp.md | 15 +- .../s-001-record-a-new-correlation.sdp.md | 9 +- ...event-i-ds-for-existing-correlation.sdp.md | 8 +- ...eturn-null-for-non-existent-command.sdp.md | 8 +- ...rn-correlation-for-existing-command.sdp.md | 9 +- .../s-005-filter-by-bounded-context.sdp.md | 8 +- ...row-when-bounded-context-is-missing.sdp.md | 8 +- .../s-007-respect-limit-parameter.sdp.md | 8 +- ...return-true-for-command-with-events.sdp.md | 8 +- ...turn-false-for-non-existent-command.sdp.md | 8 +- ...rn-event-count-for-existing-command.sdp.md | 8 +- ...1-return-0-for-non-existent-command.sdp.md | 8 +- ...eate-a-correlation-service-instance.sdp.md | 8 +- .../correlation/correlation-service.sdp.md | 18 +- ...-execution-without-scope-operations.sdp.md | 14 +- ...hema-version-and-category-in-events.sdp.md | 15 +- ...ed-decider-result-returns-rejection.sdp.md | 13 +- ...r-result-returns-failure-with-event.sdp.md | 13 +- ...ected-version-matches-scope-version.sdp.md | 14 +- ...heck-detects-stale-expected-version.sdp.md | 13 +- ...e-not-found-when-expected-version-0.sdp.md | 15 +- ...s-new-scope-with-expected-version-0.sdp.md | 14 +- ...mit-detects-concurrent-modification.sdp.md | 15 +- ...c-commit-tracks-updated-stream-i-ds.sdp.md | 14 +- ...invalid-scope-key-returns-rejection.sdp.md | 12 +- ...-missing-entities-returns-rejection.sdp.md | 13 +- .../behavior/platform-core/dcb/execute.sdp.md | 3 +- ...ate-valid-scope-key-from-components.sdp.md | 10 +- ...in-colons-for-composite-identifiers.sdp.md | 9 +- ...e-scope-key-throws-on-invalid-input.sdp.md | 9 +- ...y-returns-scope-key-for-valid-input.sdp.md | 9 +- ...-key-returns-null-for-invalid-input.sdp.md | 9 +- ...rse-valid-scope-key-into-components.sdp.md | 9 +- ...omposite-scope-id-containing-colons.sdp.md | 9 +- ...key-returns-null-for-invalid-format.sdp.md | 9 +- ...ey-returns-null-for-valid-scope-key.sdp.md | 9 +- ...pe-key-empty-error-for-empty-string.sdp.md | 10 +- ...rns-error-for-missing-tenant-prefix.sdp.md | 10 +- ...turns-error-for-malformed-scope-key.sdp.md | 9 +- ...s-013-is-valid-scope-key-type-guard.sdp.md | 9 +- ...d-scope-key-throws-on-invalid-input.sdp.md | 9 +- ...d-scope-key-succeeds-on-valid-input.sdp.md | 9 +- ...ope-tenant-checks-tenant-membership.sdp.md | 10 +- ...id-returns-tenant-id-from-scope-key.sdp.md | 10 +- ...e-returns-scope-type-from-scope-key.sdp.md | 10 +- ...-id-returns-scope-id-from-scope-key.sdp.md | 10 +- .../platform-core/dcb/scope-key.sdp.md | 3 +- ...s-load-state-with-correct-entity-id.sdp.md | 9 +- ...ith-state-command-input-and-context.sdp.md | 11 +- ...pply-update-with-correct-parameters.sdp.md | 9 +- ...ccess-result-with-correct-structure.sdp.md | 10 +- ...ion-correctly-from-existing-version.sdp.md | 10 +- ...result-without-calling-apply-update.sdp.md | 10 +- ...d-result-includes-rejection-details.sdp.md | 10 +- ...result-without-calling-apply-update.sdp.md | 10 +- ...-includes-failure-event-and-details.sdp.md | 10 +- ...andler-propagates-load-state-errors.sdp.md | 9 +- ...-custom-error-handler-when-provided.sdp.md | 11 +- ...ustom-error-handler-returns-nothing.sdp.md | 9 +- ...s-013-handler-logs-debug-on-success.sdp.md | 9 +- ...014-handler-logs-debug-on-rejection.sdp.md | 9 +- ...015-handler-logs-error-on-exception.sdp.md | 9 +- ...ates-unique-event-id-per-invocation.sdp.md | 9 +- ...es-schema-version-in-event-metadata.sdp.md | 9 +- ...ds-correct-stream-id-from-entity-id.sdp.md | 9 +- ...y-load-state-with-correct-entity-id.sdp.md | 9 +- ...ll-state-when-entity-does-not-exist.sdp.md | 11 +- ...ndler-calls-insert-for-new-entities.sdp.md | 9 +- ...ess-with-version-1-for-new-entities.sdp.md | 10 +- ...ect-event-metadata-for-new-entities.sdp.md | 9 +- ...h-existing-state-when-entity-exists.sdp.md | 10 +- ...ejection-when-entity-already-exists.sdp.md | 10 +- ...l-insert-when-entity-already-exists.sdp.md | 9 +- ...th-version-0-for-non-existent-entit.sdp.md | 11 +- ...not-call-insert-on-business-failure.sdp.md | 9 +- ...er-propagates-try-load-state-errors.sdp.md | 9 +- ...ty-handler-propagates-insert-errors.sdp.md | 10 +- ...-custom-error-handler-when-provided.sdp.md | 11 +- ...gs-debug-on-entity-creation-success.sdp.md | 9 +- ...ity-handler-logs-debug-on-rejection.sdp.md | 9 +- ...s-unique-event-id-for-each-creation.sdp.md | 9 +- ...includes-schema-version-in-metadata.sdp.md | 9 +- ...te-rejection-short-circuits-handler.sdp.md | 12 +- ...urning-undefined-allows-normal-flow.sdp.md | 12 +- ...validate-receives-correct-arguments.sdp.md | 9 +- ...-039-pre-validate-failure-is-logged.sdp.md | 8 +- ...lly-without-pre-validate-configured.sdp.md | 10 +- .../platform-core/decider/factory.sdp.md | 18 +- ...s-001-dcb-succeeds-on-first-attempt.sdp.md | 12 +- ...ted-result-passes-through-unchanged.sdp.md | 10 +- ...triggers-retry-with-updated-version.sdp.md | 12 +- ...x-retries-exceeded-returns-rejected.sdp.md | 11 +- ...e-aware-scheduling-key-is-preserved.sdp.md | 9 +- ...retry-calls-on-complete-with-result.sdp.md | 11 +- ...version-advances-during-retry-delay.sdp.md | 12 +- ...008-backoff-increases-exponentially.sdp.md | 9 +- .../s-009-backoff-is-capped-at-maximum.sdp.md | 9 +- ...ndomness-to-prevent-thundering-herd.sdp.md | 9 +- ...-injectable-for-deterministic-tests.sdp.md | 9 +- .../dcb-conflict-retry.sdp.md | 9 +- ...pter-plugs-into-existing-middleware.sdp.md | 11 +- ...-command-returns-standard-rejection.sdp.md | 11 +- ...03-dcb-retry-uses-separate-workpool.sdp.md | 11 +- ...mutation-receives-correct-arguments.sdp.md | 11 +- ...th-on-complete-callback-integration.sdp.md | 11 +- ...t-retry-dcb-mutations-clarification.sdp.md | 11 +- ...te-limiter-component-creates-tables.sdp.md | 10 +- ...-008-multiple-workpools-can-coexist.sdp.md | 11 +- .../integration-patterns.sdp.md | 9 +- ...er-allows-request-within-rate-limit.sdp.md | 10 +- ...ejects-request-exceeding-rate-limit.sdp.md | 10 +- ...ferent-keys-have-independent-limits.sdp.md | 9 +- ...mmand-types-have-independent-limits.sdp.md | 9 +- .../rate-limit-adapter.sdp.md | 8 +- .../s-001-create-basic-fat-event.sdp.md | 16 +- ...te-fat-event-with-schema-definition.sdp.md | 12 +- .../s-003-schema-validation-failure.sdp.md | 13 +- ...reate-fat-event-with-correlation-id.sdp.md | 13 +- .../s-005-embed-selected-entity-fields.sdp.md | 12 +- .../s-006-embed-all-fields.sdp.md | 11 +- .../s-007-embed-non-existent-field.sdp.md | 11 +- .../s-008-embed-collection-of-items.sdp.md | 12 +- ...bed-collection-with-field-selection.sdp.md | 12 +- .../s-010-embed-empty-collection.sdp.md | 11 +- .../ecst/fat-event-builder.sdp.md | 9 +- ...vent-type-for-integration-scenarios.sdp.md | 11 +- ...002-inventory-updated-as-thin-event.sdp.md | 11 +- .../s-003-order-submitted-as-fat-event.sdp.md | 12 +- ...004-published-language-event-is-fat.sdp.md | 12 +- .../s-005-category-suggests-event-type.sdp.md | 10 +- .../ecst/fat-vs-thin-selection.sdp.md | 10 +- ...001-mark-single-field-for-shredding.sdp.md | 11 +- ...-mark-multiple-fields-for-shredding.sdp.md | 10 +- ...s-003-non-pii-fields-are-not-marked.sdp.md | 10 +- ...find-all-shreddable-fields-in-event.sdp.md | 11 +- ...-no-shreddable-fields-returns-empty.sdp.md | 10 +- ...006-mark-fields-in-collection-items.sdp.md | 11 +- .../s-007-shred-all-marked-fields.sdp.md | 13 +- ...008-non-marked-fields-are-preserved.sdp.md | 11 +- ...009-shred-event-returns-audit-trail.sdp.md | 13 +- ...-if-event-has-any-shreddable-fields.sdp.md | 10 +- ...eck-event-without-shreddable-fields.sdp.md | 10 +- .../s-012-count-shreddable-fields.sdp.md | 10 +- .../s-013-cannot-shred-required-fields.sdp.md | 10 +- ...ping-shred-and-required-fields-work.sdp.md | 11 +- .../platform-core/ecst/privacy-markers.sdp.md | 12 +- ...a-version-is-included-automatically.sdp.md | 11 +- ...s-002-custom-schema-version-is-used.sdp.md | 10 +- ...003-valid-payload-passes-validation.sdp.md | 11 +- ...ing-required-field-fails-validation.sdp.md | 12 +- ...5-wrong-field-type-fails-validation.sdp.md | 12 +- ...s-006-migrate-v1-event-to-v2-format.sdp.md | 13 +- ...igration-needed-for-current-version.sdp.md | 11 +- ...nown-source-version-fails-migration.sdp.md | 11 +- ...pare-older-version-to-newer-version.sdp.md | 10 +- ...pare-newer-version-to-older-version.sdp.md | 10 +- .../s-011-compare-equal-versions.sdp.md | 10 +- ...mpare-versions-with-different-minor.sdp.md | 10 +- ...3-invalid-semver-format-is-rejected.sdp.md | 10 +- ...-negative-major-version-is-rejected.sdp.md | 10 +- ...-negative-minor-version-is-rejected.sdp.md | 10 +- ...nt-needs-migration-to-newer-version.sdp.md | 11 +- ...not-need-migration-for-same-version.sdp.md | 11 +- ...not-need-migration-for-older-target.sdp.md | 11 +- .../ecst/schema-versioning.sdp.md | 11 +- ...ge-is-50-when-half-events-processed.sdp.md | 8 +- ...ge-is-100-when-all-events-processed.sdp.md | 8 +- ...ge-is-100-when-total-events-is-zero.sdp.md | 8 +- ...age-has-one-decimal-place-precision.sdp.md | 8 +- ...ning-time-estimated-from-throughput.sdp.md | 8 +- ...-undefined-when-no-events-processed.sdp.md | 8 +- ...undefined-when-elapsed-time-is-zero.sdp.md | 8 +- ...e-is-zero-when-all-events-processed.sdp.md | 8 +- ...lculate-progress-for-running-replay.sdp.md | 11 +- ...ulate-progress-for-completed-replay.sdp.md | 10 +- ...ss-includes-error-for-failed-replay.sdp.md | 9 +- .../s-012-running-status-is-active.sdp.md | 8 +- .../s-013-paused-status-is-active.sdp.md | 8 +- ...-014-completed-status-is-not-active.sdp.md | 8 +- .../s-015-failed-status-is-not-active.sdp.md | 8 +- .../s-016-completed-status-is-terminal.sdp.md | 8 +- .../s-017-failed-status-is-terminal.sdp.md | 8 +- .../s-018-cancelled-status-is-terminal.sdp.md | 8 +- ...-019-running-status-is-not-terminal.sdp.md | 8 +- ...s-020-paused-status-is-not-terminal.sdp.md | 8 +- .../event-replay/replay-progress.sdp.md | 2 +- ...tition-key-generates-correct-format.sdp.md | 9 +- ...on-key-handles-various-stream-types.sdp.md | 8 +- ...d-event-enqueues-action-to-workpool.sdp.md | 10 +- ...event-returns-work-id-from-workpool.sdp.md | 8 +- ...vent-passes-on-complete-to-workpool.sdp.md | 8 +- ...includes-idempotency-key-in-context.sdp.md | 8 +- ...d-action-handler-returns-a-function.sdp.md | 8 +- ...ler-invokes-idempotent-append-event.sdp.md | 8 +- .../durable-append.sdp.md | 2 +- ...y-format-is-event-id-target-context.sdp.md | 9 +- ...events-get-different-partition-keys.sdp.md | 8 +- ...es-tracking-records-for-each-target.sdp.md | 11 +- ...ueues-delivery-actions-via-workpool.sdp.md | 11 +- ...ns-publication-i-ds-for-each-target.sdp.md | 12 +- ...-passed-through-to-tracking-records.sdp.md | 10 +- ...-status-returns-all-target-contexts.sdp.md | 10 +- ...turns-empty-array-for-unknown-event.sdp.md | 8 +- ...ication-re-enqueues-delivery-action.sdp.md | 11 +- ...s-not-found-for-unknown-publication.sdp.md | 8 +- ...delivered-for-delivered-publication.sdp.md | 9 +- ...-increments-attempt-count-correctly.sdp.md | 9 +- ...ates-status-to-delivered-on-success.sdp.md | 10 +- ...increments-attempt-count-on-failure.sdp.md | 10 +- ...eates-dead-letter-after-max-retries.sdp.md | 10 +- .../durable-publication.sdp.md | 2 +- ...nd-type-entity-id-command-id-format.sdp.md | 8 +- ...y-uses-action-type-entity-id-format.sdp.md | 8 +- ...-uses-saga-type-saga-id-step-format.sdp.md | 8 +- ...b-type-schedule-id-timestamp-format.sdp.md | 8 +- ...ppend-with-idempotency-key-succeeds.sdp.md | 9 +- ...icate-append-returns-existing-event.sdp.md | 9 +- ...-with-different-payload-is-rejected.sdp.md | 9 +- ...potency-keys-create-separate-events.sdp.md | 8 +- ...licate-on-recheck-returns-duplicate.sdp.md | 8 +- ...-010-true-occ-conflict-throws-error.sdp.md | 8 +- .../idempotent-append.sdp.md | 2 +- ...intent-key-generates-correct-format.sdp.md | 8 +- ...key-handles-various-operation-types.sdp.md | 8 +- ...ates-intent-event-with-correct-type.sdp.md | 9 +- ...cord-intent-schedules-timeout-check.sdp.md | 8 +- ...ent-returns-intent-key-and-event-id.sdp.md | 8 +- ...rd-completion-creates-success-event.sdp.md | 8 +- ...on-creates-failure-event-with-error.sdp.md | 9 +- ...ompletion-creates-abandonment-event.sdp.md | 8 +- ...ady-resolved-when-completion-exists.sdp.md | 9 +- ...ates-abandonment-when-no-completion.sdp.md | 9 +- ...-check-intent-timeout-is-idempotent.sdp.md | 8 +- ...-returns-intents-without-completion.sdp.md | 9 +- ...d-intents-filters-by-operation-type.sdp.md | 8 +- .../intent-completion.sdp.md | 2 +- ...handler-returns-a-callable-function.sdp.md | 8 +- ...tracts-idempotency-key-from-context.sdp.md | 8 +- ...completed-event-from-success-result.sdp.md | 9 +- ...nt-failed-event-from-failure-result.sdp.md | 9 +- ...-idempotent-append-event-internally.sdp.md | 9 +- ...pletes-without-error-for-duplicates.sdp.md | 8 +- .../outbox-handler.sdp.md | 2 +- ...processing-creates-no-poison-record.sdp.md | 9 +- ...rds-attempt-but-does-not-quarantine.sdp.md | 10 +- ...comes-quarantined-after-max-retries.sdp.md | 9 +- ...arantined-event-is-silently-skipped.sdp.md | 9 +- ...ed-when-alert-on-quarantine-is-true.sdp.md | 8 +- ...d-when-alert-on-quarantine-is-false.sdp.md | 8 +- ...-returns-true-for-quarantined-event.sdp.md | 8 +- ...rns-false-for-non-quarantined-event.sdp.md | 8 +- ...nt-record-returns-normalized-record.sdp.md | 8 +- ...returns-null-for-non-existent-event.sdp.md | 8 +- ...tine-event-clears-quarantine-status.sdp.md | 9 +- ...returns-not-found-for-missing-event.sdp.md | 8 +- ...s-not-quarantined-for-pending-event.sdp.md | 8 +- ...-events-returns-quarantined-records.sdp.md | 8 +- ...ntined-events-filters-by-projection.sdp.md | 8 +- ...stats-returns-aggregated-statistics.sdp.md | 9 +- .../poison-event.sdp.md | 2 +- ...reates-bus-with-empty-subscriptions.sdp.md | 9 +- ...th-subscriptions-sorted-by-priority.sdp.md | 9 +- ...-result-when-no-subscriptions-match.sdp.md | 12 +- ...matching-subscriptions-via-workpool.sdp.md | 12 +- ...ues-multiple-matching-subscriptions.sdp.md | 11 +- ...passes-transformed-args-to-workpool.sdp.md | 9 +- ...s-partition-key-in-workpool-context.sdp.md | 13 +- ...ion-level-on-complete-when-provided.sdp.md | 9 +- ...m-config-when-subscription-has-none.sdp.md | 9 +- ...-subscription-nor-config-provides-i.sdp.md | 9 +- ...ype-and-false-for-unsubscribed-type.sdp.md | 10 +- ...e-when-wildcard-subscription-exists.sdp.md | 10 +- ...s-false-when-no-subscriptions-exist.sdp.md | 9 +- .../s-014-returns-all-subscriptions.sdp.md | 10 +- ...s-empty-array-when-no-subscriptions.sdp.md | 9 +- ...riptions-matching-event-type-filter.sdp.md | 9 +- ...scriptions-matching-category-filter.sdp.md | 9 +- ...-to-subscriptions-in-priority-order.sdp.md | 9 +- ...-workpool-errors-when-enqueue-fails.sdp.md | 9 +- ...scriptions-if-earlier-enqueue-fails.sdp.md | 10 +- ...-subscriptions-match-any-event-type.sdp.md | 9 +- ...xt-filter-only-matches-that-context.sdp.md | 9 +- ...s-instance-with-empty-subscriptions.sdp.md | 9 +- ...s-024-creates-event-bus-with-config.sdp.md | 8 +- .../eventbus/convex-event-bus.sdp.md | 17 +- ...-subscription-with-name-and-handler.sdp.md | 8 +- ...02-builder-defaults-to-empty-filter.sdp.md | 8 +- ...03-builder-defaults-to-priority-100.sdp.md | 8 +- ...defaults-partition-key-to-stream-id.sdp.md | 8 +- ...-event-types-sets-event-type-filter.sdp.md | 8 +- ...for-categories-sets-category-filter.sdp.md | 8 +- ...ontexts-sets-bounded-context-filter.sdp.md | 8 +- ...tream-types-sets-stream-type-filter.sdp.md | 8 +- ...ning-multiple-filters-composes-them.sdp.md | 8 +- ...mplete-sets-the-on-complete-handler.sdp.md | 8 +- .../s-011-with-priority-sets-priority.sdp.md | 8 +- ...h-transform-sets-custom-transformer.sdp.md | 8 +- ...sets-custom-partition-key-extractor.sdp.md | 8 +- ...adds-a-subscription-to-the-registry.sdp.md | 8 +- .../s-015-add-supports-chaining.sdp.md | 8 +- ...rows-on-duplicate-subscription-name.sdp.md | 8 +- ...lder-that-adds-to-registry-on-build.sdp.md | 8 +- ...ns-returns-configured-subscriptions.sdp.md | 8 +- ...duplicate-names-via-subscribe-build.sdp.md | 8 +- ...s-throws-on-duplicate-names-via-add.sdp.md | 8 +- ...cription-creates-standalone-builder.sdp.md | 8 +- ...-022-empty-filter-matches-any-event.sdp.md | 9 +- ...ches-when-event-type-is-in-the-list.sdp.md | 9 +- ...-when-event-type-is-not-in-the-list.sdp.md | 8 +- ...atches-when-category-is-in-the-list.sdp.md | 9 +- ...ch-when-category-is-not-in-the-list.sdp.md | 8 +- ...when-bounded-context-is-in-the-list.sdp.md | 8 +- ...-bounded-context-is-not-in-the-list.sdp.md | 8 +- ...hes-when-stream-type-is-in-the-list.sdp.md | 8 +- ...when-stream-type-is-not-in-the-list.sdp.md | 8 +- ...1-all-filters-matching-returns-true.sdp.md | 8 +- ...returns-false-with-combined-filters.sdp.md | 8 +- ...returns-false-with-combined-filters.sdp.md | 8 +- .../platform-core/eventbus/registry.sdp.md | 18 +- ...vent-id-with-bounded-context-prefix.sdp.md | 8 +- ...02-copies-all-core-fields-correctly.sdp.md | 8 +- .../s-003-copies-payload-correctly.sdp.md | 8 +- ...ion-id-and-causation-id-in-metadata.sdp.md | 8 +- ...-ids-for-different-bounded-contexts.sdp.md | 8 +- ...s-complete-new-event-data-structure.sdp.md | 9 +- ...ent-id-without-generating-a-new-one.sdp.md | 8 +- ...ext-from-event-id-when-not-provided.sdp.md | 8 +- ...bounded-context-when-explicitly-set.sdp.md | 8 +- ...-context-when-no-underscore-present.sdp.md | 8 +- ...rrectly-with-pre-generated-event-id.sdp.md | 8 +- ...with-multiple-underscores-correctly.sdp.md | 8 +- ...ructure-with-pre-generated-event-id.sdp.md | 9 +- .../platform-core/events/builder.sdp.md | 8 +- ...y-four-entries-in-the-correct-order.sdp.md | 9 +- ...hema-accepts-valid-category-strings.sdp.md | 8 +- ...ema-rejects-invalid-category-values.sdp.md | 8 +- ...04-default-event-category-is-domain.sdp.md | 8 +- .../s-005-default-schema-version-is-1.sdp.md | 8 +- ...-guard-accepts-all-valid-categories.sdp.md | 8 +- ...7-type-guard-rejects-invalid-values.sdp.md | 8 +- ...d-categories-are-returned-unchanged.sdp.md | 8 +- ...-invalid-values-normalize-to-domain.sdp.md | 8 +- ...ive-integers-are-returned-unchanged.sdp.md | 8 +- ...s-011-invalid-values-normalize-to-1.sdp.md | 8 +- ...-categories-as-external-or-internal.sdp.md | 8 +- ...tion-of-categories-as-cross-context.sdp.md | 8 +- .../platform-core/events/category.sdp.md | 14 +- ...s-accepted-and-fields-are-preserved.sdp.md | 8 +- ...issing-required-fields-are-rejected.sdp.md | 8 +- ...data-with-only-event-id-is-rejected.sdp.md | 8 +- ...-optional-causation-id-is-supported.sdp.md | 9 +- ...invalid-version-values-are-rejected.sdp.md | 8 +- ...06-zero-global-position-is-accepted.sdp.md | 8 +- ...ncludes-category-and-schema-version.sdp.md | 9 +- ...efaults-to-domain-when-not-provided.sdp.md | 8 +- ...ion-defaults-to-1-when-not-provided.sdp.md | 8 +- ...0-all-valid-categories-are-accepted.sdp.md | 8 +- ...011-invalid-categories-are-rejected.sdp.md | 8 +- ...tching-event-type-and-valid-payload.sdp.md | 10 +- ...ejects-events-with-wrong-event-type.sdp.md | 8 +- ...chema-validates-payload-constraints.sdp.md | 8 +- ...ptional-metadata-field-is-supported.sdp.md | 9 +- ...vent-schema-sets-category-to-domain.sdp.md | 11 +- ...efaults-to-domain-when-not-in-input.sdp.md | 8 +- ...on-defaults-to-1-when-not-in-config.sdp.md | 8 +- ...chema-version-in-config-is-enforced.sdp.md | 8 +- ...20-wrong-schema-version-is-rejected.sdp.md | 8 +- ...schema-sets-category-to-integration.sdp.md | 10 +- ...ts-to-integration-when-not-in-input.sdp.md | 8 +- ...efaults-to-1-for-integration-events.sdp.md | 8 +- ...y-to-trigger-with-entity-id-payload.sdp.md | 10 +- ...ger-event-rejects-missing-entity-id.sdp.md | 9 +- ...faults-to-trigger-when-not-in-input.sdp.md | 8 +- ...m-schema-version-for-trigger-events.sdp.md | 8 +- ...s-category-to-fat-with-full-payload.sdp.md | 12 +- ...y-defaults-to-fat-when-not-in-input.sdp.md | 8 +- ...d-payload-with-valid-positive-value.sdp.md | 8 +- ...sted-payload-rejects-negative-value.sdp.md | 8 +- ...ustom-schema-version-for-fat-events.sdp.md | 8 +- ...nt-schema-accepts-any-payload-shape.sdp.md | 8 +- ...main-event-schema-includes-defaults.sdp.md | 10 +- ...ent-schema-allows-optional-metadata.sdp.md | 8 +- .../platform-core/events/schemas.sdp.md | 14 +- ...t-current-version-is-returned-as-is.sdp.md | 12 +- ...002-event-is-migrated-from-v1-to-v2.sdp.md | 12 +- ...003-event-is-migrated-from-v1-to-v3.sdp.md | 13 +- ...ation-chain-throws-at-creation-time.sdp.md | 8 +- ...version-throws-future-version-error.sdp.md | 10 +- ...6-validation-passes-after-migration.sdp.md | 10 +- ...07-validation-fails-after-migration.sdp.md | 10 +- ...stered-and-unregistered-event-types.sdp.md | 9 +- ...-returns-all-registered-event-types.sdp.md | 9 +- ...nd-registration-overrides-the-first.sdp.md | 12 +- ...1-registered-event-type-is-upcasted.sdp.md | 10 +- ...stered-event-type-is-returned-as-is.sdp.md | 11 +- ...s-013-static-default-value-is-added.sdp.md | 10 +- ...value-is-added-from-event-timestamp.sdp.md | 10 +- ...015-field-is-renamed-in-the-payload.sdp.md | 11 +- ...r-has-correct-name-code-and-message.sdp.md | 9 +- ...-error-stores-context-when-provided.sdp.md | 8 +- ...undefined-context-when-not-provided.sdp.md | 8 +- .../s-019-error-is-instanceof-error.sdp.md | 8 +- ...rror-preserves-specific-code-values.sdp.md | 8 +- ...-021-error-preserves-custom-message.sdp.md | 8 +- .../platform-core/events/upcaster.sdp.md | 17 +- ...-created-with-correct-initial-state.sdp.md | 8 +- .../s-002-fsm-preserves-the-definition.sdp.md | 9 +- ...s-003-valid-transitions-return-true.sdp.md | 8 +- ...04-invalid-transitions-return-false.sdp.md | 8 +- ...alone-can-transition-function-works.sdp.md | 9 +- ...-006-valid-transitions-do-not-throw.sdp.md | 8 +- ...nsition-throws-fsm-transition-error.sdp.md | 8 +- ...n-error-includes-transition-details.sdp.md | 10 +- ...ne-assert-transition-function-works.sdp.md | 9 +- ...ns-valid-transitions-for-each-state.sdp.md | 8 +- ...ne-valid-transitions-function-works.sdp.md | 8 +- ...-012-terminal-states-are-identified.sdp.md | 8 +- ...-non-terminal-states-are-identified.sdp.md | 8 +- ...andalone-is-terminal-function-works.sdp.md | 9 +- .../s-015-valid-states-return-true.sdp.md | 8 +- .../s-016-invalid-states-return-false.sdp.md | 8 +- ...alone-is-valid-state-function-works.sdp.md | 9 +- .../s-018-error-has-correct-properties.sdp.md | 13 +- ...-handles-terminal-states-in-message.sdp.md | 8 +- specs/behavior/platform-core/fsm/fsm.sdp.md | 13 +- ...uccess-result-has-correct-structure.sdp.md | 11 +- ...success-result-preserves-typed-data.sdp.md | 9 +- ...sult-returns-status-as-literal-type.sdp.md | 9 +- ...rejected-result-has-code-and-reason.sdp.md | 8 +- ...sult-includes-context-when-provided.sdp.md | 11 +- ...ult-omits-context-when-not-provided.sdp.md | 8 +- ...sult-returns-status-as-literal-type.sdp.md | 8 +- .../s-008-failed-result-has-event-data.sdp.md | 9 +- ...udes-expected-version-when-provided.sdp.md | 9 +- ...sult-includes-context-when-provided.sdp.md | 8 +- ...s-both-expected-version-and-context.sdp.md | 9 +- ...tional-properties-when-not-provided.sdp.md | 9 +- ...sult-returns-status-as-literal-type.sdp.md | 8 +- .../platform-core/handlers/result.sdp.md | 8 +- ...ded-i-ds-preserving-the-input-value.sdp.md | 9 +- ...ssignable-to-plain-string-variables.sdp.md | 8 +- ...-ds-support-standard-string-methods.sdp.md | 10 +- ...uce-correctly-prefixed-branded-i-ds.sdp.md | 8 +- ...-produce-valid-uuid-v7-after-prefix.sdp.md | 9 +- ...-returns-true-for-non-empty-strings.sdp.md | 8 +- ...ring-returns-false-for-empty-string.sdp.md | 8 +- ...returns-false-for-non-string-values.sdp.md | 8 +- ...string-narrows-type-for-type-script.sdp.md | 8 +- ...enerated-command-ids-are-all-unique.sdp.md | 8 +- ...ated-correlation-ids-are-all-unique.sdp.md | 8 +- .../behavior/platform-core/ids/branded.sdp.md | 11 +- ...ated-id-matches-the-expected-format.sdp.md | 8 +- ...-002-each-call-produces-a-unique-id.sdp.md | 8 +- ...-with-the-provided-context-and-type.sdp.md | 8 +- ...s-are-accepted-for-context-and-type.sdp.md | 8 +- ...pty-context-or-type-throws-an-error.sdp.md | 8 +- ...sallowed-characters-throws-an-error.sdp.md | 8 +- ...ype-with-underscore-throws-an-error.sdp.md | 8 +- ...ed-id-is-parsed-into-its-components.sdp.md | 8 +- ...roduced-by-generate-id-is-parseable.sdp.md | 10 +- ...containing-underscores-is-preserved.sdp.md | 8 +- ...-fewer-than-three-parts-return-null.sdp.md | 8 +- ...h-empty-context-or-type-return-null.sdp.md | 8 +- ...ected-format-and-is-unique-per-call.sdp.md | 9 +- ...ected-format-and-is-unique-per-call.sdp.md | 9 +- ...ormat-and-uses-the-provided-context.sdp.md | 9 +- ...-016-event-i-ds-are-unique-per-call.sdp.md | 8 +- ...s-017-empty-context-throws-an-error.sdp.md | 8 +- ...ected-format-and-is-unique-per-call.sdp.md | 9 +- ...uid-portion-has-version-7-indicator.sdp.md | 8 +- ...l-i-ds-are-lexicographically-sorted.sdp.md | 8 +- .../platform-core/ids/generator.sdp.md | 15 +- ...-001-define-acl-for-payment-gateway.sdp.md | 11 +- .../s-002-acl-translates-field-names.sdp.md | 11 +- .../s-003-acl-transforms-field-values.sdp.md | 11 +- ...4-acl-translates-domain-to-external.sdp.md | 11 +- ...und-trip-translation-preserves-data.sdp.md | 10 +- ...006-missing-required-external-field.sdp.md | 11 +- .../s-007-invalid-external-field-type.sdp.md | 11 +- .../s-008-unknown-external-status.sdp.md | 11 +- ...ent-gateways-with-different-schemas.sdp.md | 11 +- .../integration/anti-corruption-layer.sdp.md | 10 +- ...er-upstream-downstream-relationship.sdp.md | 12 +- ...ster-customer-supplier-relationship.sdp.md | 12 +- ...03-register-conformist-relationship.sdp.md | 10 +- .../s-004-register-acl-relationship.sdp.md | 10 +- ...5-register-partnership-relationship.sdp.md | 11 +- ...register-shared-kernel-relationship.sdp.md | 11 +- ...ster-open-host-service-relationship.sdp.md | 11 +- ...08-query-all-relationships-for-a-bc.sdp.md | 11 +- .../s-009-query-upstream-b-cs.sdp.md | 10 +- ...-010-query-bc-with-no-relationships.sdp.md | 10 +- ...-duplicate-relationship-is-rejected.sdp.md | 10 +- ...eferential-relationship-is-rejected.sdp.md | 9 +- .../integration/context-map.sdp.md | 9 +- .../s-001-generate-sample-from-schema.sdp.md | 11 +- ...-002-generate-sample-with-overrides.sdp.md | 11 +- .../s-003-generate-multiple-samples.sdp.md | 11 +- .../s-004-producer-emits-valid-event.sdp.md | 10 +- .../s-005-producer-emits-invalid-event.sdp.md | 11 +- .../s-006-producer-emits-wrong-version.sdp.md | 10 +- ...-007-consumer-processes-valid-event.sdp.md | 10 +- ...sumer-handles-all-sample-variations.sdp.md | 10 +- .../s-009-consumer-rejects-valid-event.sdp.md | 10 +- ...10-compatible-producer-and-consumer.sdp.md | 11 +- ...-011-incompatible-versions-detected.sdp.md | 13 +- .../s-012-compatible-with-downcaster.sdp.md | 12 +- ...-013-contract-violation-is-recorded.sdp.md | 13 +- .../s-014-query-contract-violations.sdp.md | 11 +- ...15-query-violations-since-timestamp.sdp.md | 10 +- ...6-no-violations-returns-empty-array.sdp.md | 10 +- .../integration/contract-testing.sdp.md | 11 +- .../s-001-upcast-v1-event-to-v2.sdp.md | 11 +- ...ain-upcasters-for-multiple-versions.sdp.md | 11 +- .../s-003-upcast-adds-computed-field.sdp.md | 11 +- .../s-004-downcast-v2-event-to-v1.sdp.md | 11 +- ...ncast-removes-required-in-new-field.sdp.md | 12 +- ...-006-register-schema-with-migration.sdp.md | 10 +- .../s-007-missing-migration-path.sdp.md | 11 +- ...8-breaking-change-without-migration.sdp.md | 11 +- ...-detect-version-from-event-metadata.sdp.md | 10 +- ...10-infer-version-from-payload-shape.sdp.md | 11 +- .../integration/event-versioning.sdp.md | 10 +- ...-create-publisher-with-empty-routes.sdp.md | 9 +- ...002-create-publisher-with-one-route.sdp.md | 10 +- ...-duplicate-source-event-type-routes.sdp.md | 11 +- ...r-registered-and-unregistered-types.sdp.md | 12 +- ...-005-retrieve-all-registered-routes.sdp.md | 11 +- ...6-return-null-when-no-route-matches.sdp.md | 12 +- ...ranslate-and-publish-a-domain-event.sdp.md | 13 +- .../s-008-enqueue-multiple-handlers.sdp.md | 12 +- ...y-integration-event-metadata-fields.sdp.md | 12 +- ...clude-user-id-when-present-in-chain.sdp.md | 11 +- ...omit-user-id-when-absent-from-chain.sdp.md | 11 +- ...ass-on-complete-handler-to-workpool.sdp.md | 12 +- .../s-013-propagate-translator-error.sdp.md | 12 +- ...-014-verify-workpool-context-fields.sdp.md | 11 +- ...ld-a-route-with-all-required-fields.sdp.md | 11 +- ...t-schema-version-via-version-method.sdp.md | 8 +- ...17-pass-multiple-handlers-to-notify.sdp.md | 8 +- ...or-function-transforms-source-event.sdp.md | 8 +- ...19-reject-missing-source-event-type.sdp.md | 8 +- ...20-reject-missing-target-event-type.sdp.md | 8 +- .../s-021-reject-missing-translator.sdp.md | 8 +- .../s-022-reject-missing-handlers.sdp.md | 8 +- ...ia-define-integration-route-factory.sdp.md | 9 +- ...eate-publisher-via-factory-function.sdp.md | 10 +- ...-integration-route-error-properties.sdp.md | 9 +- ...ntegration-route-error-with-context.sdp.md | 8 +- ...ration-route-error-instanceof-chain.sdp.md | 9 +- .../integration-event-publisher.sdp.md | 26 +- ...1-register-integration-event-schema.sdp.md | 12 +- .../s-002-register-multiple-versions.sdp.md | 11 +- ...s-003-duplicate-version-is-rejected.sdp.md | 10 +- ...t-domain-event-to-integration-event.sdp.md | 14 +- ...s-005-convert-with-explicit-version.sdp.md | 10 +- ...s-006-unregistered-event-type-fails.sdp.md | 10 +- ...lid-payload-fails-schema-validation.sdp.md | 11 +- ...8-event-tagging-for-routing-and-dcb.sdp.md | 12 +- .../s-009-multiple-tags-for-routing.sdp.md | 10 +- ...ster-schema-with-compatibility-mode.sdp.md | 11 +- ...011-query-schema-compatibility-mode.sdp.md | 10 +- .../s-012-list-all-event-types.sdp.md | 10 +- .../s-013-list-versions-for-event-type.sdp.md | 10 +- .../integration/published-language.sdp.md | 9 +- ...et-contains-all-provided-invariants.sdp.md | 8 +- ...rray-is-immutable-and-a-frozen-copy.sdp.md | 9 +- ...turns-true-when-all-invariants-pass.sdp.md | 8 +- ...ns-false-when-first-invariant-fails.sdp.md | 8 +- ...s-false-when-second-invariant-fails.sdp.md | 8 +- ...urns-false-when-all-invariants-fail.sdp.md | 8 +- ...-not-throw-when-all-invariants-pass.sdp.md | 8 +- ...ows-on-first-failure-with-fail-fast.sdp.md | 8 +- ...sert-all-throws-correct-error-class.sdp.md | 8 +- ...ws-error-with-context-when-provided.sdp.md | 8 +- ...urns-valid-when-all-invariants-pass.sdp.md | 8 +- ...idate-all-collects-single-violation.sdp.md | 9 +- ...violations-without-short-circuiting.sdp.md | 9 +- ...ations-from-non-adjacent-invariants.sdp.md | 9 +- ...n-invariant-has-no-context-function.sdp.md | 9 +- ...016-empty-set-passes-all-operations.sdp.md | 10 +- ...ses-all-operations-with-valid-state.sdp.md | 10 +- .../invariants/create-invariant-set.sdp.md | 12 +- ...invariant-has-correct-name-and-code.sdp.md | 8 +- ...-when-state-satisfies-the-predicate.sdp.md | 8 +- ...e-when-state-violates-the-predicate.sdp.md | 8 +- ...-does-not-throw-when-state-is-valid.sdp.md | 8 +- ...variant-error-when-state-is-invalid.sdp.md | 8 +- ...-has-correct-code-for-invalid-state.sdp.md | 8 +- ...s-correct-message-for-invalid-state.sdp.md | 8 +- ...s-correct-context-for-invalid-state.sdp.md | 8 +- ...eturns-valid-result-for-valid-state.sdp.md | 8 +- ...violation-details-for-invalid-state.sdp.md | 8 +- ...ed-context-when-no-context-function.sdp.md | 8 +- ...ed-context-when-no-context-function.sdp.md | 8 +- ...ses-parameter-to-find-matching-item.sdp.md | 9 +- ...false-when-parameter-does-not-match.sdp.md | 9 +- ...ameter-in-error-message-and-context.sdp.md | 10 +- ...6-validate-uses-parameter-in-result.sdp.md | 9 +- ...s-error-of-the-correct-custom-class.sdp.md | 10 +- .../invariants/create-invariant.sdp.md | 12 +- ...ting-an-error-with-code-and-message.sdp.md | 10 +- ...002-including-context-when-provided.sdp.md | 8 +- ...text-is-undefined-when-not-provided.sdp.md | 8 +- .../s-004-error-has-proper-stack-trace.sdp.md | 9 +- ...ting-a-context-specific-error-class.sdp.md | 9 +- ...-contexts-produce-different-classes.sdp.md | 11 +- ...007-typed-error-codes-are-supported.sdp.md | 8 +- ...pecific-errors-include-context-data.sdp.md | 8 +- ...c-class-has-proper-constructor-name.sdp.md | 8 +- ...-true-for-invariant-error-instances.sdp.md | 8 +- ...or-context-specific-error-instances.sdp.md | 8 +- ...s-false-for-regular-error-instances.sdp.md | 8 +- ...-returns-false-for-non-error-values.sdp.md | 8 +- ...e-when-error-has-the-specified-code.sdp.md | 8 +- ...lse-when-error-has-a-different-code.sdp.md | 8 +- ...alse-for-non-invariant-error-values.sdp.md | 8 +- ...-works-with-context-specific-errors.sdp.md | 9 +- .../invariants/invariant-error.sdp.md | 10 +- ...mmand-start-is-logged-at-info-level.sdp.md | 9 +- ...elds-are-included-in-start-log-data.sdp.md | 8 +- ...is-logged-at-info-level-with-result.sdp.md | 8 +- ...e-preserved-alongside-result-fields.sdp.md | 8 +- ...d-rejection-is-logged-at-warn-level.sdp.md | 8 +- ...ed-field-names-not-raw-code-message.sdp.md | 9 +- ...ess-failure-is-logged-at-warn-level.sdp.md | 8 +- ...lure-uses-failure-reason-not-reason.sdp.md | 9 +- ...-error-level-with-message-and-stack.sdp.md | 10 +- ...010-string-error-is-logged-directly.sdp.md | 9 +- ...ng-non-error-values-are-stringified.sdp.md | 8 +- .../s-012-null-error-is-stringified.sdp.md | 8 +- ...-013-undefined-error-is-stringified.sdp.md | 8 +- ...ck-trace-is-preserved-for-debugging.sdp.md | 8 +- ...cle-produces-start-and-success-logs.sdp.md | 8 +- ...fecycle-produces-info-and-warn-logs.sdp.md | 9 +- ...ecycle-produces-info-and-error-logs.sdp.md | 9 +- .../platform-core/logging/commands.sdp.md | 12 +- ...01-messages-are-prefixed-with-scope.sdp.md | 8 +- ...002-data-object-is-appended-as-json.sdp.md | 8 +- ...-data-object-is-omitted-from-output.sdp.md | 8 +- ...4-debug-level-allows-debug-messages.sdp.md | 8 +- ...nfo-level-suppresses-debug-messages.sdp.md | 8 +- ...006-info-level-allows-info-messages.sdp.md | 8 +- ...007-info-level-allows-warn-messages.sdp.md | 8 +- ...8-error-level-allows-error-messages.sdp.md | 8 +- ...lt-level-is-info-when-not-specified.sdp.md | 9 +- ...es-its-corresponding-console-method.sdp.md | 8 +- ...uts-structured-json-via-console-log.sdp.md | 8 +- ...-012-timing-start-uses-console-time.sdp.md | 8 +- ...13-timing-end-uses-console-time-end.sdp.md | 8 +- ...e-without-timing-uses-console-debug.sdp.md | 10 +- ...r-does-not-call-any-console-methods.sdp.md | 8 +- ...mplements-the-full-logger-interface.sdp.md | 8 +- ...logger-prefixes-with-combined-scope.sdp.md | 8 +- ...-logger-respects-provided-log-level.sdp.md | 9 +- ...child-logger-defaults-to-info-level.sdp.md | 9 +- .../platform-core/logging/scoped.sdp.md | 12 +- ...l-six-log-method-calls-are-captured.sdp.md | 8 +- ...-call-records-the-correct-log-level.sdp.md | 8 +- ...-message-text-is-captured-correctly.sdp.md | 8 +- ...ructured-data-is-captured-correctly.sdp.md | 8 +- ...data-is-undefined-when-not-provided.sdp.md | 8 +- ...timestamp-is-captured-within-bounds.sdp.md | 8 +- ...-007-clearing-resets-calls-to-empty.sdp.md | 8 +- ...lls-are-filtered-by-level-correctly.sdp.md | 8 +- ...-partial-and-exact-message-matching.sdp.md | 8 +- .../s-010-exact-message-match-works.sdp.md | 8 +- ...1-level-and-message-must-both-match.sdp.md | 8 +- ...urns-the-last-call-at-a-given-level.sdp.md | 8 +- ...ns-undefined-when-no-calls-at-level.sdp.md | 8 +- ...ltiple-accesses-return-equal-arrays.sdp.md | 8 +- ...aptures-info-report-warn-error-only.sdp.md | 9 +- ...debug-minimum-captures-all-6-levels.sdp.md | 8 +- ...7-error-minimum-captures-only-error.sdp.md | 9 +- ...arn-minimum-captures-warn-and-error.sdp.md | 9 +- .../s-019-clear-resets-filtered-calls.sdp.md | 8 +- ...essage-only-searches-filtered-calls.sdp.md | 8 +- .../platform-core/logging/testing.sdp.md | 15 +- ...values-increase-from-debug-to-error.sdp.md | 8 +- ...6-log-levels-are-defined-as-numbers.sdp.md | 8 +- .../s-003-default-log-level-is-info.sdp.md | 8 +- ...or-above-info-level-pass-the-filter.sdp.md | 8 +- ...s-below-info-level-are-filtered-out.sdp.md | 8 +- ...onfigured-level-allows-all-messages.sdp.md | 8 +- ...-configured-level-only-allows-error.sdp.md | 9 +- ...ed-level-allows-warn-and-error-only.sdp.md | 9 +- .../platform-core/logging/types.sdp.md | 9 +- ...e-and-returns-pipeline-for-chaining.sdp.md | 10 +- ...are-returns-true-and-decreases-size.sdp.md | 11 +- ...n-existent-middleware-returns-false.sdp.md | 8 +- ...eturns-true-for-existing-middleware.sdp.md | 9 +- ...s-false-for-non-existent-middleware.sdp.md | 8 +- ...-names-are-returned-sorted-by-order.sdp.md | 11 +- ...ecutes-directly-with-empty-pipeline.sdp.md | 8 +- ...efore-hooks-run-in-order-10-then-20.sdp.md | 10 +- ...after-hooks-run-in-order-20-then-10.sdp.md | 10 +- ...nts-subsequent-middleware-execution.sdp.md | 11 +- ...om-context-to-subsequent-middleware.sdp.md | 10 +- ...fore-hook-produces-middleware-error.sdp.md | 11 +- ...wing-handler-produces-handler-error.sdp.md | 10 +- ...-does-not-prevent-other-after-hooks.sdp.md | 11 +- ...-circuit-middleware-after-hooks-run.sdp.md | 11 +- .../s-016-clear-empties-the-pipeline.sdp.md | 10 +- ...same-middlewares-but-is-independent.sdp.md | 13 +- ...ry-creates-pipeline-without-options.sdp.md | 8 +- ...-creates-pipeline-with-debug-option.sdp.md | 8 +- .../middleware/middleware-pipeline.sdp.md | 21 +- ...ucture-validation-has-correct-order.sdp.md | 8 +- ...payload-passes-structure-validation.sdp.md | 8 +- ...is-rejected-by-structure-validation.sdp.md | 9 +- ...-command-skips-structure-validation.sdp.md | 8 +- ...n-validates-against-registry-schema.sdp.md | 8 +- ...idation-skips-unregistered-commands.sdp.md | 8 +- ...domain-validation-has-correct-order.sdp.md | 8 +- ...es-when-validator-returns-undefined.sdp.md | 8 +- ...hen-validator-returns-error-message.sdp.md | 10 +- ...n-skips-commands-without-validators.sdp.md | 8 +- ...bined-validators-return-first-error.sdp.md | 8 +- ...tors-return-undefined-when-all-pass.sdp.md | 8 +- ...-string-validates-non-empty-strings.sdp.md | 8 +- ...e-number-validates-positive-numbers.sdp.md | 8 +- ...number-range-validates-within-range.sdp.md | 8 +- ...starts-with-prefix-validates-prefix.sdp.md | 8 +- ...017-authorization-has-correct-order.sdp.md | 8 +- ...s-when-checker-returns-allowed-true.sdp.md | 8 +- ...-when-checker-returns-allowed-false.sdp.md | 11 +- ...orization-skips-configured-commands.sdp.md | 9 +- ...cker-allows-user-with-required-role.sdp.md | 8 +- ...-rejects-user-without-required-role.sdp.md | 8 +- ...sed-checker-requires-authentication.sdp.md | 9 +- ...cker-allows-when-no-roles-specified.sdp.md | 8 +- .../s-025-logging-has-correct-order.sdp.md | 8 +- ...are-logs-before-and-after-execution.sdp.md | 9 +- ...are-logs-errors-for-failed-commands.sdp.md | 8 +- ...-logger-does-not-throw-on-any-level.sdp.md | 8 +- ...er-outputs-correctly-formatted-logs.sdp.md | 8 +- ...-includes-timestamp-when-configured.sdp.md | 8 +- .../s-031-rate-limit-has-correct-order.sdp.md | 8 +- ...rate-limit-allows-when-not-exceeded.sdp.md | 8 +- ...33-rate-limit-rejects-when-exceeded.sdp.md | 10 +- ...ate-limit-skips-configured-commands.sdp.md | 9 +- ...35-by-user-id-generates-correct-key.sdp.md | 8 +- ...-by-user-id-handles-anonymous-users.sdp.md | 8 +- ...-command-type-generates-correct-key.sdp.md | 8 +- ...and-command-generates-composite-key.sdp.md | 8 +- ...ware-orders-follow-correct-sequence.sdp.md | 8 +- .../middleware/middlewares.sdp.md | 18 +- ...xecutes-normally-and-returns-result.sdp.md | 10 +- ...mains-closed-after-a-single-failure.sdp.md | 9 +- ...ult-failure-threshold-of-5-failures.sdp.md | 9 +- ...nsitions-to-half-open-after-timeout.sdp.md | 9 +- ...loses-on-success-in-half-open-state.sdp.md | 9 +- ...opens-on-failure-in-half-open-state.sdp.md | 9 +- ...esses-in-half-open-to-close-circuit.sdp.md | 9 +- ...-returns-closed-for-unknown-circuit.sdp.md | 8 +- ...-state-after-a-successful-operation.sdp.md | 8 +- ...ears-an-open-circuit-back-to-closed.sdp.md | 9 +- ...1-respects-custom-failure-threshold.sdp.md | 8 +- .../s-012-respects-custom-timeout.sdp.md | 9 +- ...t-resets-on-success-in-closed-state.sdp.md | 8 +- .../monitoring/circuit-breaker.sdp.md | 16 +- ...ctured-field-for-primary-projection.sdp.md | 12 +- ...red-field-for-secondary-projections.sdp.md | 14 +- ...uctured-field-for-failed-projection.sdp.md | 12 +- ...-routes-saga-work-to-saga-pool-only.sdp.md | 11 +- .../orchestration/command-orchestrator.sdp.md | 9 +- ...ccessful-cross-context-coordination.sdp.md | 11 +- .../s-002-compensation-on-step-failure.sdp.md | 11 +- ...e-last-completed-step-after-restart.sdp.md | 9 +- ...in-reverse-order-of-completed-steps.sdp.md | 9 +- .../s-005-first-trigger-starts-saga.sdp.md | 11 +- ...icate-trigger-returns-existing-saga.sdp.md | 11 +- ...saga-status-after-workflow-finishes.sdp.md | 9 +- ...saga-orchestration-executable-tests.sdp.md | 10 +- ...ses-pm-name-and-event-subscriptions.sdp.md | 9 +- ...d-and-false-for-unsubscribed-events.sdp.md | 8 +- ...-processes-event-and-emits-commands.sdp.md | 11 +- ...ed-event-with-not-subscribed-reason.sdp.md | 10 +- ...-005-passes-custom-state-to-handler.sdp.md | 9 +- ...es-stream-id-as-default-instance-id.sdp.md | 8 +- ...07-uses-custom-instance-id-resolver.sdp.md | 8 +- ...s-failed-status-when-handler-throws.sdp.md | 10 +- ...-status-when-command-emitter-throws.sdp.md | 9 +- .../s-010-returns-all-pm-names.sdp.md | 8 +- ...s-011-finds-executors-by-event-type.sdp.md | 8 +- ...vent-through-all-matching-executors.sdp.md | 11 +- ...-empty-array-for-unsubscribed-event.sdp.md | 9 +- ...-processes-single-matching-executor.sdp.md | 10 +- ...ptions-so-other-executors-still-run.sdp.md | 13 +- ...s-016-handles-empty-executors-array.sdp.md | 10 +- .../process-manager/executor.sdp.md | 20 +- .../s-001-idle-state-allows-start.sdp.md | 8 +- ...2-idle-state-rejects-invalid-events.sdp.md | 8 +- ...ssing-state-allows-success-and-fail.sdp.md | 8 +- ...essing-state-rejects-invalid-events.sdp.md | 8 +- .../s-005-completed-state-allows-reset.sdp.md | 8 +- ...pleted-state-rejects-invalid-events.sdp.md | 8 +- ...failed-state-allows-retry-and-reset.sdp.md | 8 +- ...failed-state-rejects-invalid-events.sdp.md | 8 +- ...sitions-return-correct-target-state.sdp.md | 8 +- ...010-invalid-transitions-return-null.sdp.md | 8 +- ...e-state-has-exactly-one-valid-event.sdp.md | 9 +- ...-state-has-exactly-two-valid-events.sdp.md | 9 +- ...d-state-has-exactly-one-valid-event.sdp.md | 9 +- ...-state-has-exactly-two-valid-events.sdp.md | 9 +- ...transitions-with-correct-properties.sdp.md | 9 +- ...ll-expected-transitions-are-present.sdp.md | 8 +- ...e-array-reference-on-repeated-calls.sdp.md | 8 +- ...-valid-transition-returns-new-state.sdp.md | 8 +- ...throws-with-pm-name-and-instance-id.sdp.md | 8 +- .../s-020-completed-is-terminal.sdp.md | 8 +- ...21-non-terminal-states-return-false.sdp.md | 8 +- .../s-022-failed-is-an-error-state.sdp.md | 8 +- ...s-023-non-error-states-return-false.sdp.md | 8 +- ...tates-have-at-least-one-valid-event.sdp.md | 8 +- ...5-critical-reachability-paths-exist.sdp.md | 8 +- ...ath-idle-to-processing-to-completed.sdp.md | 8 +- ...e-path-idle-to-processing-to-failed.sdp.md | 8 +- ...o-failed-to-processing-to-completed.sdp.md | 8 +- ...-to-processing-to-completed-to-idle.sdp.md | 8 +- ...dle-to-processing-to-failed-to-idle.sdp.md | 8 +- .../process-manager/lifecycle.sdp.md | 18 +- ...1-register-a-single-process-manager.sdp.md | 9 +- ...-register-multiple-process-managers.sdp.md | 8 +- ...licate-registration-throws-an-error.sdp.md | 8 +- .../s-004-get-returns-pm-by-name.sdp.md | 9 +- ...et-returns-undefined-for-unknown-pm.sdp.md | 8 +- ...-has-returns-true-for-registered-pm.sdp.md | 8 +- ...s-returns-false-for-unregistered-pm.sdp.md | 8 +- ...urns-empty-array-for-empty-registry.sdp.md | 8 +- ...09-list-returns-all-registered-p-ms.sdp.md | 11 +- .../s-010-size-is-0-for-empty-registry.sdp.md | 8 +- ...11-size-reflects-registration-count.sdp.md | 8 +- ...s-pm-subscribed-to-a-specific-event.sdp.md | 9 +- ...m-for-shared-event-across-hybrid-pm.sdp.md | 9 +- ...eturns-empty-for-unknown-event-type.sdp.md | 8 +- ...for-event-matching-no-subscriptions.sdp.md | 8 +- ...urns-empty-array-for-empty-registry.sdp.md | 8 +- ...7-returns-unique-sorted-event-types.sdp.md | 9 +- ...ray-for-empty-registry-for-commands.sdp.md | 8 +- ...returns-unique-sorted-command-types.sdp.md | 9 +- .../s-020-filters-by-orders-context.sdp.md | 9 +- .../s-021-filters-by-inventory-context.sdp.md | 9 +- ...2-returns-empty-for-unknown-context.sdp.md | 8 +- ...s-023-filters-by-event-trigger-type.sdp.md | 9 +- .../s-024-filters-by-time-trigger-type.sdp.md | 9 +- ...-025-filters-by-hybrid-trigger-type.sdp.md | 9 +- ...urns-time-and-hybrid-triggered-p-ms.sdp.md | 11 +- ...-excludes-event-only-triggered-p-ms.sdp.md | 10 +- ...ime-triggered-p-ms-have-cron-config.sdp.md | 10 +- ...ll-handlers-for-order-shipped-event.sdp.md | 9 +- ...-triggered-p-ms-for-cron-scheduling.sdp.md | 12 +- ...s-and-commands-is-handled-correctly.sdp.md | 14 +- ...d-p-ms-where-some-have-empty-arrays.sdp.md | 9 +- .../process-manager/registry.sdp.md | 20 +- ...correlation-strategy-uses-stream-id.sdp.md | 8 +- ...-property-is-extracted-from-payload.sdp.md | 8 +- ...correlation-property-not-in-payload.sdp.md | 8 +- ...orrelation-property-is-not-a-string.sdp.md | 8 +- ...d-when-correlation-property-is-null.sdp.md | 8 +- ...n-correlation-property-is-undefined.sdp.md | 8 +- ...lation-property-value-is-used-as-is.sdp.md | 8 +- ...lation-property-value-is-used-as-is.sdp.md | 8 +- ...elation-strategy-extracts-correctly.sdp.md | 8 +- ...0-subscription-name-without-context.sdp.md | 8 +- ...-011-subscription-name-with-context.sdp.md | 8 +- .../s-012-default-priority-is-200.sdp.md | 9 +- ...3-custom-priority-overrides-default.sdp.md | 8 +- ...s-by-event-types-from-pm-definition.sdp.md | 8 +- ...creates-mutable-copy-of-event-types.sdp.md | 8 +- ...andler-args-produces-correct-output.sdp.md | 11 +- ...stance-id-from-correlation-strategy.sdp.md | 10 +- ...to-handler-args-transformer-is-used.sdp.md | 11 +- ...19-default-partition-by-instance-id.sdp.md | 10 +- ...tion-strategy-affects-partition-key.sdp.md | 10 +- ...21-custom-get-partition-key-is-used.sdp.md | 11 +- ...handler-reference-is-passed-through.sdp.md | 8 +- ...produces-correct-subscription-names.sdp.md | 9 +- .../s-024-missing-handler-throws-error.sdp.md | 8 +- ...iority-applies-to-all-subscriptions.sdp.md | 8 +- ...bscription-has-correct-event-filter.sdp.md | 9 +- ...itions-produces-empty-subscriptions.sdp.md | 8 +- ...28-handlers-match-their-definitions.sdp.md | 9 +- ...29-default-priority-constant-is-200.sdp.md | 8 +- ...-after-projections-and-before-sagas.sdp.md | 9 +- .../process-manager/subscription.sdp.md | 28 +- ...-all-valid-pm-statuses-are-accepted.sdp.md | 8 +- ...s-manager-statuses-passes-the-guard.sdp.md | 8 +- ...invalid-status-strings-are-rejected.sdp.md | 8 +- ...jected-by-is-process-manager-status.sdp.md | 8 +- ...jected-by-is-process-manager-status.sdp.md | 8 +- ...ss-manager-status-is-case-sensitive.sdp.md | 8 +- ...ype-narrowing-works-in-conditionals.sdp.md | 8 +- ...ard-works-as-array-filter-predicate.sdp.md | 8 +- ...ontains-exactly-4-statuses-in-order.sdp.md | 8 +- ...-readonly-array-with-correct-bounds.sdp.md | 9 +- ...tuses-contains-all-lifecycle-states.sdp.md | 8 +- ...tuses-is-in-logical-lifecycle-order.sdp.md | 8 +- ...d-dead-letter-statuses-are-accepted.sdp.md | 8 +- ...ad-letter-statuses-passes-the-guard.sdp.md | 8 +- ...e-rejected-by-is-dead-letter-status.sdp.md | 8 +- ...e-rejected-by-is-dead-letter-status.sdp.md | 8 +- ...e-rejected-by-is-dead-letter-status.sdp.md | 8 +- ...ning-valid-dl-statuses-are-rejected.sdp.md | 8 +- ...ead-letter-status-is-case-sensitive.sdp.md | 8 +- ...ype-narrowing-works-in-conditionals.sdp.md | 8 +- ...ard-works-as-array-filter-predicate.sdp.md | 8 +- ...ontains-exactly-3-statuses-in-order.sdp.md | 8 +- ...-readonly-array-with-correct-bounds.sdp.md | 9 +- ...ses-contains-all-dead-letter-states.sdp.md | 8 +- ...atuses-is-in-logical-workflow-order.sdp.md | 8 +- ...th-all-fields-has-correct-structure.sdp.md | 17 +- ...ired-fields-has-undefined-optionals.sdp.md | 10 +- ...r-supports-each-status-individually.sdp.md | 8 +- ...es-command-type-and-complex-payload.sdp.md | 11 +- ...failed-command-allows-empty-payload.sdp.md | 8 +- ...d-letter-handles-high-attempt-count.sdp.md | 8 +- ...-letter-handles-long-error-messages.sdp.md | 8 +- ...ter-handles-complex-context-objects.sdp.md | 10 +- .../process-manager/types.sdp.md | 18 +- ...ocess-event-when-no-pm-state-exists.sdp.md | 12 +- ...-global-position-exceeds-checkpoint.sdp.md | 9 +- ...m-state-is-updated-after-processing.sdp.md | 8 +- ...n-global-position-equals-checkpoint.sdp.md | 11 +- ...al-position-is-less-than-checkpoint.sdp.md | 10 +- ...event-when-pm-is-in-completed-state.sdp.md | 10 +- ...stances-are-processed-independently.sdp.md | 10 +- ...ucceeds-after-emit-commands-failure.sdp.md | 13 +- ...hen-pm-is-stuck-in-processing-state.sdp.md | 10 +- ...010-reject-negative-global-position.sdp.md | 12 +- ...ero-is-treated-as-already-processed.sdp.md | 9 +- ...t-after-initialization-is-processed.sdp.md | 9 +- ...letter-recorded-when-process-throws.sdp.md | 12 +- ...-recorded-when-emit-commands-throws.sdp.md | 10 +- ...d-counter-is-incremented-on-failure.sdp.md | 8 +- ...ed-counter-tracks-multiple-commands.sdp.md | 8 +- ...sult-contains-emitted-command-types.sdp.md | 9 +- ...ist-produces-no-op-processed-result.sdp.md | 10 +- ...r-processes-event-and-updates-state.sdp.md | 10 +- ...-maintains-pm-idempotency-semantics.sdp.md | 10 +- .../process-manager/with-pm-checkpoint.sdp.md | 14 +- ...jection-rebuild-re-processes-events.sdp.md | 12 +- ...dead-letter-retry-re-enqueues-event.sdp.md | 11 +- ...ent-flow-trace-returns-full-history.sdp.md | 11 +- ...s-004-rebuild-status-shows-progress.sdp.md | 12 +- ...-letter-retry-processes-all-pending.sdp.md | 11 +- ...nostics-returns-comprehensive-state.sdp.md | 13 +- .../production-hardening/admin-tooling.sdp.md | 7 +- ...rcuit-opens-after-repeated-failures.sdp.md | 11 +- ...nsitions-to-half-open-after-timeout.sdp.md | 11 +- ...ul-half-open-request-closes-circuit.sdp.md | 11 +- ...d-half-open-request-reopens-circuit.sdp.md | 11 +- ...ersists-across-function-invocations.sdp.md | 11 +- ...cuit-breakers-operate-independently.sdp.md | 12 +- .../circuit-breakers.sdp.md | 7 +- ...ce-spans-command-to-projection-flow.sdp.md | 11 +- ...-missing-trace-context-uses-default.sdp.md | 11 +- ...text-is-preserved-in-event-metadata.sdp.md | 11 +- ...ltiple-projections-share-same-trace.sdp.md | 10 +- .../distributed-tracing.sdp.md | 7 +- ...-action-retrier-for-half-open-probe.sdp.md | 12 +- ...-reopens-circuit-via-action-retrier.sdp.md | 12 +- ...ion-retrier-with-configured-retries.sdp.md | 13 +- ...flict-triggers-workpool-based-retry.sdp.md | 14 +- ...cts-exponential-backoff-with-jitter.sdp.md | 13 +- ...-uses-latest-version-after-conflict.sdp.md | 12 +- ...ion-key-prevents-concurrent-retries.sdp.md | 12 +- ...s-action-retrier-for-external-calls.sdp.md | 13 +- ...dlq-retry-returns-to-pending-status.sdp.md | 13 +- ...ssful-dlq-retry-marks-item-resolved.sdp.md | 12 +- .../s-011-dlq-retry-tracks-retry-count.sdp.md | 12 +- .../durable-function-integration.sdp.md | 7 +- ...readiness-probe-checks-dependencies.sdp.md | 11 +- ...nhealthy-dependency-fails-readiness.sdp.md | 11 +- ...-003-liveness-probe-always-succeeds.sdp.md | 11 +- ...ion-lag-threshold-determines-health.sdp.md | 11 +- ...nse-includes-all-component-statuses.sdp.md | 12 +- .../health-endpoints.sdp.md | 7 +- .../s-001-projection-lag-is-tracked.sdp.md | 12 +- ...lection-handles-missing-checkpoints.sdp.md | 11 +- ...-003-event-throughput-is-calculated.sdp.md | 10 +- ...4-dead-letter-queue-size-is-tracked.sdp.md | 11 +- .../metrics-collection.sdp.md | 7 +- ...-requests-within-rate-limit-succeed.sdp.md | 12 +- ...s-exceeding-rate-limit-are-rejected.sdp.md | 12 +- ...-003-token-bucket-refills-over-time.sdp.md | 11 +- ...04-rate-limit-key-isolation-by-user.sdp.md | 12 +- ...admin-rebuild-respects-hourly-limit.sdp.md | 12 +- ...rebuild-blocked-when-limit-exceeded.sdp.md | 12 +- ...onent-response-to-rate-limit-result.sdp.md | 11 +- ...handles-component-errors-gracefully.sdp.md | 11 +- .../production-hardening/rate-limiting.sdp.md | 9 +- ...tuple-contains-all-valid-categories.sdp.md | 9 +- ...category-validates-category-strings.sdp.md | 8 +- ...nctions-identify-correct-categories.sdp.md | 12 +- ...sed-returns-correct-exposure-status.sdp.md | 9 +- .../category-definitions.sdp.md | 3 +- ...ory-returns-category-required-error.sdp.md | 12 +- ...ory-returns-category-required-error.sdp.md | 11 +- ...03-valid-category-passes-validation.sdp.md | 10 +- ...ory-returns-category-on-valid-input.sdp.md | 10 +- ...gory-returns-invalid-category-error.sdp.md | 12 +- ...id-category-throws-on-invalid-input.sdp.md | 10 +- .../explicit-declaration.sdp.md | 3 +- ...tegory-returns-all-view-projections.sdp.md | 10 +- ...egory-returns-all-logic-projections.sdp.md | 9 +- ...y-returns-all-reporting-projections.sdp.md | 9 +- ...returns-all-integration-projections.sdp.md | 9 +- ...ay-for-category-with-no-projections.sdp.md | 9 +- ...view-projections-for-reactive-layer.sdp.md | 9 +- ...n-projections-for-event-bus-routing.sdp.md | 9 +- .../registry-lookup.sdp.md | 3 +- ...schema-accepts-all-valid-categories.sdp.md | 8 +- ...egory-schema-rejects-invalid-values.sdp.md | 8 +- ...ory-schema-rejects-non-string-types.sdp.md | 9 +- ...projection-category-rejects-objects.sdp.md | 8 +- ...-projection-category-rejects-arrays.sdp.md | 8 +- ...rojection-category-rejects-booleans.sdp.md | 8 +- ...y-rejects-whitespace-padded-strings.sdp.md | 8 +- ...ion-errors-has-expected-error-codes.sdp.md | 9 +- ...n-category-rejects-non-string-types.sdp.md | 8 +- ...ows-category-required-for-undefined.sdp.md | 8 +- .../projections/categories.sdp.md | 10 +- ...lowed-transitions-from-active-state.sdp.md | 8 +- ...ected-transitions-from-active-state.sdp.md | 8 +- ...d-transitions-from-rebuilding-state.sdp.md | 8 +- ...d-transitions-from-rebuilding-state.sdp.md | 8 +- ...lowed-transitions-from-paused-state.sdp.md | 8 +- ...ected-transitions-from-paused-state.sdp.md | 8 +- ...llowed-transitions-from-error-state.sdp.md | 8 +- ...jected-transitions-from-error-state.sdp.md | 8 +- ...tions-produce-correct-target-states.sdp.md | 8 +- ...010-invalid-transitions-return-null.sdp.md | 8 +- ...-011-valid-events-from-active-state.sdp.md | 9 +- ...-valid-events-from-rebuilding-state.sdp.md | 9 +- ...-013-valid-events-from-paused-state.sdp.md | 9 +- ...s-014-valid-events-from-error-state.sdp.md | 9 +- ...-transitions-with-correct-structure.sdp.md | 9 +- ...l-expected-transitions-are-included.sdp.md | 8 +- ...turns-same-array-reference-memoized.sdp.md | 8 +- ...urns-new-state-for-valid-transition.sdp.md | 8 +- ...lid-transition-with-projection-name.sdp.md | 8 +- ...hable-from-at-least-one-other-state.sdp.md | 8 +- ...ve-at-least-one-outgoing-transition.sdp.md | 8 +- ...ry-path-exists-from-error-to-active.sdp.md | 8 +- ...s-023-error-path-exists-from-active.sdp.md | 8 +- ...ebuild-retry-path-exists-from-error.sdp.md | 8 +- ...sing-active-state-allows-fail-event.sdp.md | 8 +- ...flow-active-to-rebuilding-to-active.sdp.md | 9 +- ...-workflow-active-to-error-to-active.sdp.md | 9 +- ...ve-to-error-to-rebuilding-to-active.sdp.md | 10 +- ...workflow-active-to-paused-to-active.sdp.md | 9 +- ...ve-to-rebuilding-to-error-to-active.sdp.md | 10 +- ...e-to-paused-to-rebuilding-to-active.sdp.md | 10 +- ...active-to-paused-to-error-to-active.sdp.md | 10 +- .../projections/lifecycle.sdp.md | 13 +- .../s-001-register-a-single-projection.sdp.md | 9 +- ...s-002-register-multiple-projections.sdp.md | 8 +- ...licate-projection-name-throws-error.sdp.md | 8 +- ...-004-get-returns-projection-by-name.sdp.md | 9 +- ...ns-undefined-for-unknown-projection.sdp.md | 8 +- ...urns-true-for-registered-projection.sdp.md | 8 +- ...s-false-for-unregistered-projection.sdp.md | 8 +- ...urns-empty-array-for-empty-registry.sdp.md | 8 +- ...-returns-all-registered-projections.sdp.md | 9 +- .../s-010-size-is-0-for-empty-registry.sdp.md | 8 +- ...11-size-reflects-registration-count.sdp.md | 8 +- ...turns-multiple-matching-projections.sdp.md | 9 +- ...-single-context-specific-projection.sdp.md | 9 +- ...ype-returns-empty-for-unknown-event.sdp.md | 8 +- ...es-returns-empty-for-empty-registry.sdp.md | 8 +- ...s-returns-sorted-unique-event-types.sdp.md | 10 +- ...y-context-filters-by-orders-context.sdp.md | 9 +- ...ontext-filters-by-inventory-context.sdp.md | 9 +- ...by-context-filters-by-cross-context.sdp.md | 9 +- ...t-returns-empty-for-unknown-context.sdp.md | 8 +- ...er-returns-empty-for-empty-registry.sdp.md | 8 +- ...places-primary-before-cross-context.sdp.md | 10 +- ...y-category-returns-view-projections.sdp.md | 9 +- ...-category-returns-logic-projections.sdp.md | 9 +- ...egory-returns-reporting-projections.sdp.md | 9 +- ...ory-returns-integration-projections.sdp.md | 9 +- ...rns-empty-when-no-projections-match.sdp.md | 8 +- ...all-results-have-requested-category.sdp.md | 8 +- ...ks-regardless-of-registration-order.sdp.md | 9 +- ...y-index-is-maintained-incrementally.sdp.md | 10 +- .../platform-core/projections/registry.sdp.md | 15 +- ...ess-event-when-no-checkpoint-exists.sdp.md | 11 +- ...-global-position-exceeds-checkpoint.sdp.md | 9 +- ...ckpoint-is-updated-after-processing.sdp.md | 9 +- ...n-global-position-equals-checkpoint.sdp.md | 10 +- ...al-position-is-less-than-checkpoint.sdp.md | 9 +- ...-separate-checkpoints-per-partition.sdp.md | 11 +- ...rent-partitions-does-not-cause-skip.sdp.md | 9 +- ...int-not-updated-when-process-throws.sdp.md | 10 +- ...etry-succeeds-after-process-failure.sdp.md | 11 +- ...-checkpoint-fields-stored-correctly.sdp.md | 8 +- ...per-processes-and-stores-checkpoint.sdp.md | 10 +- ...s-checkpoint-semantics-across-calls.sdp.md | 9 +- ...-process-event-position-comparisons.sdp.md | 8 +- ...tial-checkpoint-has-sentinel-values.sdp.md | 9 +- ...checkpoint-gets-a-unique-updated-at.sdp.md | 8 +- .../projections/with-checkpoint.sdp.md | 13 +- ...-has-correct-result-type-and-config.sdp.md | 9 +- ...-descriptor-has-correct-result-type.sdp.md | 9 +- ...-descriptor-has-correct-result-type.sdp.md | 9 +- ...-descriptor-uses-default-page-sizes.sdp.md | 11 +- ...y-descriptor-uses-custom-page-sizes.sdp.md | 8 +- ...-receives-default-pagination-values.sdp.md | 8 +- ...-has-correct-context-and-projection.sdp.md | 10 +- ...tiple-queries-provides-keyed-access.sdp.md | 9 +- ...cess-to-registered-query-descriptor.sdp.md | 8 +- ...options-returns-descriptor-defaults.sdp.md | 9 +- ...ded-page-size-within-limits-is-used.sdp.md | 8 +- ...-page-size-exceeding-max-is-clamped.sdp.md | 8 +- ...egative-page-sizes-are-clamped-to-1.sdp.md | 8 +- ...cursor-is-passed-through-to-options.sdp.md | 8 +- ...rsor-is-undefined-when-not-provided.sdp.md | 8 +- ...d-descriptors-preserve-result-types.sdp.md | 10 +- .../platform-core/queries/factory.sdp.md | 20 +- ...tion-constants-have-expected-values.sdp.md | 8 +- ...s-defaults-when-no-options-provided.sdp.md | 9 +- ...es-provided-page-size-within-limits.sdp.md | 8 +- .../s-004-caps-page-size-at-max.sdp.md | 8 +- ...-page-size-of-1-for-boundary-values.sdp.md | 8 +- .../s-006-passes-through-cursor.sdp.md | 8 +- ...007-works-with-custom-config-values.sdp.md | 8 +- ...unds-floating-point-page-sizes-down.sdp.md | 8 +- ...n-empty-page-with-correct-structure.sdp.md | 10 +- ...s-type-information-with-empty-array.sdp.md | 8 +- ...reates-a-page-with-items-and-cursor.sdp.md | 10 +- ...tes-a-done-page-when-cursor-is-null.sdp.md | 10 +- ...-empty-items-array-with-null-cursor.sdp.md | 9 +- ...es-and-decodes-simple-position-data.sdp.md | 8 +- ...s-and-decodes-complex-position-data.sdp.md | 8 +- ...-016-produces-base64-encoded-string.sdp.md | 8 +- ...017-round-trips-various-data-shapes.sdp.md | 8 +- ...urns-null-for-invalid-cursor-inputs.sdp.md | 8 +- ...invalid-characters-in-middle-or-end.sdp.md | 8 +- ...-null-for-truncated-utf-8-sequences.sdp.md | 8 +- ...1-returns-true-for-valid-page-sizes.sdp.md | 8 +- ...eturns-false-for-invalid-page-sizes.sdp.md | 8 +- ...s-023-respects-custom-max-page-size.sdp.md | 9 +- ...4-returns-requested-size-when-valid.sdp.md | 8 +- ...-returns-default-when-not-specified.sdp.md | 8 +- ...26-caps-at-max-and-enforces-minimum.sdp.md | 8 +- ...7-uses-custom-default-and-max-sizes.sdp.md | 8 +- ...28-rounds-floating-point-sizes-down.sdp.md | 8 +- ...-simulates-complete-pagination-flow.sdp.md | 11 +- .../s-030-handles-empty-result-set.sdp.md | 9 +- ...t-page-size-match-with-continuation.sdp.md | 9 +- .../platform-core/queries/pagination.sdp.md | 15 +- ...ng-optimistic-update-is-rolled-back.sdp.md | 12 +- ...detection-handles-network-partition.sdp.md | 11 +- ...when-optimistic-is-ahead-of-durable.sdp.md | 12 +- ...4-rollback-triggers-ui-notification.sdp.md | 11 +- ...earing-preserves-unconfirmed-events.sdp.md | 10 +- .../conflict-detection.sdp.md | 3 +- ...nt-update-then-durable-confirmation.sdp.md | 12 +- ...pdate-works-during-workpool-backlog.sdp.md | 12 +- ...-takes-precedence-after-convergence.sdp.md | 12 +- .../reactive-projections/hybrid-model.sdp.md | 3 +- ...ory-determines-reactive-eligibility.sdp.md | 10 +- ...ction-rejects-reactive-subscription.sdp.md | 11 +- ...enables-full-reactive-functionality.sdp.md | 12 +- ...ive-result-represents-loading-state.sdp.md | 14 +- .../reactive-eligibility.sdp.md | 3 +- ...ntical-results-on-client-and-server.sdp.md | 10 +- ...dles-unknown-event-types-gracefully.sdp.md | 11 +- ...-multiple-events-evolve-in-sequence.sdp.md | 11 +- ...evolve-error-includes-event-context.sdp.md | 12 +- .../reactive-projections/shared-evolve.sdp.md | 3 +- ...the-same-instance-on-multiple-calls.sdp.md | 8 +- .../s-002-reset-creates-a-new-instance.sdp.md | 8 +- ...003-register-a-command-successfully.sdp.md | 8 +- ...licate-registration-throws-an-error.sdp.md | 9 +- ...ent-command-types-can-be-registered.sdp.md | 8 +- ...gister-removes-a-registered-command.sdp.md | 10 +- ...urns-false-for-non-existent-command.sdp.md | 8 +- ...rns-config-for-a-registered-command.sdp.md | 9 +- ...ndefined-for-a-non-existent-command.sdp.md | 8 +- ...gistration-for-a-registered-command.sdp.md | 9 +- ...ndefined-for-a-non-existent-command.sdp.md | 8 +- ...turns-true-for-a-registered-command.sdp.md | 9 +- ...ns-false-for-a-non-existent-command.sdp.md | 8 +- ...e-returns-valid-for-correct-payload.sdp.md | 9 +- ...turns-invalid-for-incorrect-payload.sdp.md | 9 +- ...wn-command-for-non-existent-command.sdp.md | 8 +- ...ray-when-no-commands-are-registered.sdp.md | 8 +- ...ist-returns-all-registered-commands.sdp.md | 9 +- ...and-info-objects-with-correct-shape.sdp.md | 9 +- .../s-020-filter-commands-by-category.sdp.md | 9 +- ...-filter-commands-by-bounded-context.sdp.md | 10 +- .../s-022-filter-commands-by-tag.sdp.md | 11 +- ...3-group-commands-by-bounded-context.sdp.md | 11 +- ...-returns-empty-map-when-no-commands.sdp.md | 8 +- ...e-reflects-registered-command-count.sdp.md | 9 +- ...026-clear-removes-all-registrations.sdp.md | 9 +- ...y-is-a-functional-registry-instance.sdp.md | 9 +- .../registry/command-registry.sdp.md | 21 +- ...bounded-context-and-projection-name.sdp.md | 10 +- ...-with-command-id-and-correlation-id.sdp.md | 9 +- ...rtition-key-uses-aggregate-id-field.sdp.md | 9 +- ...partition-key-overrides-the-default.sdp.md | 9 +- ...gregate-category-and-custom-options.sdp.md | 12 +- ...mmand-is-auto-registered-by-default.sdp.md | 8 +- ...istered-when-auto-register-is-false.sdp.md | 8 +- ...-projections-are-included-in-config.sdp.md | 9 +- ...09-saga-route-is-included-in-config.sdp.md | 9 +- ...saga-route-on-complete-is-preserved.sdp.md | 8 +- ...ed-projection-is-included-in-config.sdp.md | 9 +- .../s-012-schema-version-defaults-to-1.sdp.md | 8 +- ...and-has-correct-category-and-target.sdp.md | 10 +- ...partition-key-uses-process-id-field.sdp.md | 9 +- ...sters-with-category-and-target-info.sdp.md | 9 +- ...-category-subsystem-and-description.sdp.md | 10 +- ...-with-command-id-and-correlation-id.sdp.md | 9 +- ...ojection-has-no-projection-property.sdp.md | 9 +- ...th-projection-includes-it-in-config.sdp.md | 8 +- ...key-defaults-to-system-command-type.sdp.md | 9 +- ...t-registered-even-with-auto-registe.sdp.md | 9 +- ...system-schema-version-defaults-to-1.sdp.md | 8 +- .../registry/define-command.sdp.md | 27 +- ...01-load-and-upcast-cms-by-entity-id.sdp.md | 10 +- ...-not-found-error-for-missing-entity.sdp.md | 8 +- .../s-003-load-returns-upcast-metadata.sdp.md | 10 +- ...s-004-load-propagates-upcast-errors.sdp.md | 9 +- ...load-returns-cms-when-entity-exists.sdp.md | 9 +- ...rns-null-when-entity-does-not-exist.sdp.md | 8 +- ...d-resolves-to-null-without-throwing.sdp.md | 8 +- ...8-try-load-propagates-upcast-errors.sdp.md | 9 +- ...sts-returns-true-when-entity-exists.sdp.md | 9 +- ...ns-false-when-entity-does-not-exist.sdp.md | 8 +- ...xists-does-not-call-upcast-function.sdp.md | 8 +- ...loads-multiple-entities-in-parallel.sdp.md | 9 +- ...y-returns-null-for-missing-entities.sdp.md | 11 +- ...returns-empty-array-for-empty-input.sdp.md | 9 +- ...ad-many-upcasts-all-loaded-entities.sdp.md | 8 +- ...-many-preserves-order-of-input-i-ds.sdp.md | 8 +- ...agates-upcast-errors-for-any-entity.sdp.md | 9 +- ...-cms-record-and-returns-document-id.sdp.md | 9 +- ...te-patches-cms-when-version-matches.sdp.md | 8 +- ...ot-found-error-for-missing-document.sdp.md | 8 +- ...-conflict-error-on-version-mismatch.sdp.md | 8 +- ...-found-error-has-correct-properties.sdp.md | 8 +- ...not-found-error-is-instanceof-error.sdp.md | 8 +- ...rd-returns-true-for-not-found-error.sdp.md | 8 +- ...alse-for-non-not-found-error-values.sdp.md | 8 +- ...nflict-error-has-correct-properties.sdp.md | 8 +- ...-conflict-error-is-instanceof-error.sdp.md | 8 +- ...turns-true-for-version-conflict-err.sdp.md | 8 +- ...uard-returns-false-for-other-errors.sdp.md | 8 +- .../repository/cms-repository.sdp.md | 13 +- ...-confirm-reservation-with-entity-id.sdp.md | 13 +- ...-confirmed-reservation-is-permanent.sdp.md | 11 +- ...-cannot-confirm-expired-reservation.sdp.md | 10 +- ...nfirm-already-confirmed-reservation.sdp.md | 10 +- ...ot-confirm-non-existent-reservation.sdp.md | 9 +- ...cannot-confirm-released-reservation.sdp.md | 10 +- .../s-007-entity-id-is-required.sdp.md | 10 +- ...ity-id-can-be-any-string-identifier.sdp.md | 11 +- .../reservation/confirm-operation.sdp.md | 9 +- .../s-001-release-active-reservation.sdp.md | 12 +- ...d-value-can-be-immediately-reserved.sdp.md | 10 +- ...annot-release-confirmed-reservation.sdp.md | 10 +- ...elease-already-released-reservation.sdp.md | 10 +- ...-cannot-release-expired-reservation.sdp.md | 10 +- ...ot-release-non-existent-reservation.sdp.md | 9 +- ...red-reservations-are-marked-by-cron.sdp.md | 11 +- ...does-not-affect-active-reservations.sdp.md | 10 +- ...s-not-affect-confirmed-reservations.sdp.md | 10 +- .../reservation/release-operation.sdp.md | 9 +- .../s-001-email-reservation-key-format.sdp.md | 8 +- ...002-username-reservation-key-format.sdp.md | 8 +- ...-custom-type-reservation-key-format.sdp.md | 8 +- .../s-004-same-value-different-types.sdp.md | 10 +- .../s-005-independent-type-uniqueness.sdp.md | 10 +- .../s-006-type-is-required.sdp.md | 8 +- .../s-007-value-is-required.sdp.md | 8 +- .../s-008-empty-type-is-invalid.sdp.md | 8 +- .../s-009-empty-value-is-invalid.sdp.md | 8 +- .../s-010-find-reservation-by-key.sdp.md | 9 +- ...-find-reservation-by-type-and-value.sdp.md | 9 +- ...s-012-non-existent-key-returns-null.sdp.md | 8 +- ...3-type-containing-colon-is-rejected.sdp.md | 8 +- ...lue-can-contain-colon-url-with-port.sdp.md | 9 +- .../reservation/reservation-key.sdp.md | 11 +- .../s-001-reserve-an-email-address.sdp.md | 13 +- .../s-002-reserve-with-correlation-id.sdp.md | 11 +- .../s-003-first-reservation-wins.sdp.md | 11 +- ...eserved-value-cannot-be-re-reserved.sdp.md | 11 +- .../s-005-different-ttl-values.sdp.md | 10 +- .../s-006-ttl-must-be-positive.sdp.md | 9 +- .../s-007-ttl-has-maximum-limit.sdp.md | 10 +- .../s-008-negative-ttl-is-rejected.sdp.md | 9 +- ...09-ttl-at-minimum-boundary-succeeds.sdp.md | 9 +- ...-ttl-just-below-minimum-is-rejected.sdp.md | 9 +- .../s-011-na-n-ttl-is-rejected.sdp.md | 9 +- .../s-012-infinity-ttl-is-rejected.sdp.md | 9 +- ...013-whitespace-only-type-is-invalid.sdp.md | 9 +- ...14-whitespace-only-value-is-invalid.sdp.md | 9 +- .../reservation/reserve-operation.sdp.md | 11 +- ...s-001-complete-metadata-is-accepted.sdp.md | 8 +- ...a-with-optional-user-id-is-accepted.sdp.md | 8 +- ...with-invalid-timestamps-is-rejected.sdp.md | 8 +- ...missing-required-fields-is-rejected.sdp.md | 8 +- .../s-005-complete-command-is-accepted.sdp.md | 8 +- ...optional-payload-fields-is-accepted.sdp.md | 8 +- ...ng-command-type-literal-is-rejected.sdp.md | 8 +- ...th-invalid-payload-type-is-rejected.sdp.md | 8 +- ...-required-payload-field-is-rejected.sdp.md | 8 +- ...-missing-target-context-is-rejected.sdp.md | 8 +- ...-inference-for-command-type-literal.sdp.md | 8 +- ...s-with-version-and-data-is-accepted.sdp.md | 8 +- ...ess-with-undefined-data-is-accepted.sdp.md | 8 +- ...success-without-version-is-rejected.sdp.md | 8 +- ...ed-with-code-and-reason-is-accepted.sdp.md | 8 +- ...d-with-optional-context-is-accepted.sdp.md | 8 +- ...rejected-without-reason-is-rejected.sdp.md | 8 +- ...rrent-modification-code-is-accepted.sdp.md | 8 +- ...onflict-with-wrong-code-is-rejected.sdp.md | 8 +- ...without-current-version-is-rejected.sdp.md | 8 +- ...-021-error-with-message-is-accepted.sdp.md | 8 +- ...2-error-without-message-is-rejected.sdp.md | 8 +- ...nates-success-and-preserves-version.sdp.md | 9 +- ...ected-and-preserves-code-and-reason.sdp.md | 9 +- ...flict-and-preserves-current-version.sdp.md | 9 +- ...minates-error-and-preserves-message.sdp.md | 9 +- .../s-027-union-rejects-unknown-status.sdp.md | 8 +- .../schemas/command-schemas.sdp.md | 12 +- ...ution-when-convex-test-mode-is-true.sdp.md | 10 +- ...w-execution-when-is-test-env-is-set.sdp.md | 10 +- ...untime-without-explicit-test-signal.sdp.md | 13 +- ...block-execution-in-cloud-production.sdp.md | 13 +- ...vironment-returns-true-in-test-mode.sdp.md | 10 +- ...nment-returns-true-with-is-test-env.sdp.md | 10 +- ...ronment-returns-false-in-production.sdp.md | 11 +- ...environment-is-a-safe-boolean-check.sdp.md | 10 +- .../platform-core/testing/guards.sdp.md | 3 +- ...01-fresh-state-after-docker-restart.sdp.md | 12 +- ...ect-state-pollution-without-restart.sdp.md | 12 +- .../s-003-unique-namespace-per-test.sdp.md | 13 +- ...mespace-applied-to-correlation-i-ds.sdp.md | 11 +- ...-from-previous-test-don-t-interfere.sdp.md | 12 +- ...functions-use-test-specific-context.sdp.md | 11 +- .../testing/integration-isolation.sdp.md | 9 +- ...has-feature-directory-platform-core.sdp.md | 11 +- ...-feature-directory-platform-decider.sdp.md | 11 +- ...-has-feature-directory-platform-fsm.sdp.md | 11 +- ...as-feature-directory-platform-store.sdp.md | 11 +- ...-has-feature-directory-platform-bus.sdp.md | 11 +- ...e-has-feature-directory-platform-bc.sdp.md | 11 +- ...orted-function-has-feature-coverage.sdp.md | 11 +- .../s-008-missing-coverage-is-detected.sdp.md | 11 +- ...efinitions-follow-naming-convention.sdp.md | 12 +- ...-010-step-file-matches-feature-file.sdp.md | 10 +- .../testing/platform-coverage.sdp.md | 9 +- .../s-001-sleep-for-specified-duration.sdp.md | 10 +- .../s-002-sleep-returns-a-promise.sdp.md | 10 +- ...l-returns-truthy-result-immediately.sdp.md | 11 +- ...-until-polls-until-condition-is-met.sdp.md | 11 +- .../s-005-wait-until-throws-on-timeout.sdp.md | 10 +- ...t-until-uses-custom-timeout-message.sdp.md | 10 +- ...ait-until-respects-poll-interval-ms.sdp.md | 10 +- ...esolves-when-predicate-returns-true.sdp.md | 11 +- .../s-009-wait-for-throws-on-timeout.sdp.md | 10 +- ...s-010-default-timeout-is-30-seconds.sdp.md | 9 +- ...-011-default-poll-interval-is-100ms.sdp.md | 9 +- .../platform-core/testing/polling.sdp.md | 3 +- .../s-001-create-base-unit-test-world.sdp.md | 14 +- ...est-world-supports-scenario-context.sdp.md | 10 +- ...-unit-test-world-tracks-last-result.sdp.md | 10 +- ...4-unit-test-world-tracks-last-error.sdp.md | 10 +- ...-create-base-integration-test-world.sdp.md | 12 +- ...-test-world-uses-custom-backend-url.sdp.md | 10 +- ...on-test-world-defaults-to-localhost.sdp.md | 11 +- ...reset-world-state-clears-all-fields.sdp.md | 12 +- ...et-preserves-test-backend-reference.sdp.md | 10 +- .../platform-core/testing/world.sdp.md | 3 +- ...ojections-recommend-entity-strategy.sdp.md | 9 +- ...rojections-return-simple-complexity.sdp.md | 9 +- ...s-include-rationale-about-stream-id.sdp.md | 10 +- ...-to-entity-when-all-flags-are-false.sdp.md | 9 +- ...ojections-recommend-global-strategy.sdp.md | 9 +- ...ojections-return-complex-complexity.sdp.md | 9 +- ...clude-rationale-about-occ-conflicts.sdp.md | 9 +- ...rategy-prioritizes-over-other-flags.sdp.md | 9 +- ...projections-recommend-saga-strategy.sdp.md | 9 +- ...ojections-return-complex-complexity.sdp.md | 9 +- ...lude-rationale-about-correlation-id.sdp.md | 10 +- ...rioritizes-over-customer-and-entity.sdp.md | 9 +- ...ections-recommend-customer-strategy.sdp.md | 9 +- ...jections-return-moderate-complexity.sdp.md | 9 +- ...include-rationale-about-customer-id.sdp.md | 10 +- ...er-strategy-prioritizes-over-entity.sdp.md | 9 +- ...riority-global-saga-customer-entity.sdp.md | 17 +- .../s-018-strategy-parallelism-values.sdp.md | 8 +- ...recommended-parallelism-by-strategy.sdp.md | 8 +- .../complexity-classifier.sdp.md | 3 +- ...lobal-partition-key-has-name-global.sdp.md | 8 +- ...obal-partition-key-has-value-global.sdp.md | 8 +- ...y-uses-stream-type-stream-id-format.sdp.md | 8 +- ...izes-stream-id-over-other-id-fields.sdp.md | 8 +- ...y-falls-back-to-alternate-id-fields.sdp.md | 8 +- ...ey-throws-when-no-id-field-provided.sdp.md | 8 +- ...des-available-keys-in-error-message.sdp.md | 8 +- ...-uses-provided-stream-type-in-value.sdp.md | 8 +- ...r-partition-key-returns-customer-id.sdp.md | 8 +- ...ition-key-ignores-additional-fields.sdp.md | 8 +- ...hrows-when-customer-id-is-undefined.sdp.md | 8 +- ...-throws-when-customer-id-is-missing.sdp.md | 8 +- ...ws-when-customer-id-is-empty-string.sdp.md | 8 +- ...artition-key-returns-correlation-id.sdp.md | 8 +- ...ition-key-ignores-additional-fields.sdp.md | 8 +- ...ws-when-correlation-id-is-undefined.sdp.md | 8 +- ...rows-when-correlation-id-is-missing.sdp.md | 8 +- ...when-correlation-id-is-empty-string.sdp.md | 8 +- ...on-key-returns-global-partition-key.sdp.md | 8 +- ...partition-key-ignores-any-arguments.sdp.md | 8 +- ...ns-same-reference-on-multiple-calls.sdp.md | 8 +- ...-022-dcb-partition-key-has-name-dcb.sdp.md | 8 +- ...rtition-key-uses-scope-key-as-value.sdp.md | 8 +- ...y-handles-various-scope-key-formats.sdp.md | 8 +- .../partition-key-helpers.sdp.md | 3 +- ...t-for-config-with-get-partition-key.sdp.md | 10 +- ...t-for-inline-partition-key-function.sdp.md | 9 +- ...-projections-with-get-partition-key.sdp.md | 10 +- ...d-projection-with-get-partition-key.sdp.md | 10 +- ...error-for-missing-get-partition-key.sdp.md | 11 +- ...6-includes-projection-name-in-error.sdp.md | 9 +- ...s-007-includes-config-path-in-error.sdp.md | 9 +- ...s-helper-functions-in-error-message.sdp.md | 12 +- ...ition-key-shape-when-returning-null.sdp.md | 10 +- ...key-shape-when-returning-wrong-type.sdp.md | 10 +- ...rtition-key-shape-when-missing-name.sdp.md | 10 +- ...tition-key-shape-when-missing-value.sdp.md | 10 +- ...tion-key-shape-when-value-is-number.sdp.md | 10 +- ...ty-partition-value-for-empty-string.sdp.md | 10 +- ...on-value-for-whitespace-only-string.sdp.md | 10 +- ...ollects-errors-from-all-projections.sdp.md | 9 +- ...fig-paths-for-secondary-projections.sdp.md | 11 +- ...t-config-path-for-failed-projection.sdp.md | 10 +- ...s-not-throw-for-valid-configs-array.sdp.md | 9 +- ...-020-does-not-throw-for-empty-array.sdp.md | 9 +- ...-021-throws-on-first-invalid-config.sdp.md | 9 +- ...cludes-all-errors-in-thrown-message.sdp.md | 9 +- ...ludes-error-codes-in-thrown-message.sdp.md | 9 +- ...ludes-config-path-in-thrown-message.sdp.md | 9 +- .../partition-validation.sdp.md | 3 +- ...-creates-output-with-correct-status.sdp.md | 14 +- ...ss-includes-all-required-properties.sdp.md | 10 +- ...reates-output-with-code-and-message.sdp.md | 13 +- ...cted-includes-context-when-provided.sdp.md | 11 +- ...reates-output-with-reason-and-event.sdp.md | 14 +- ...iled-includes-context-when-provided.sdp.md | 11 +- ...ess-returns-true-for-success-output.sdp.md | 11 +- ...s-returns-false-for-rejected-output.sdp.md | 11 +- ...ess-returns-false-for-failed-output.sdp.md | 11 +- ...0-is-success-enables-type-narrowing.sdp.md | 11 +- ...ed-returns-true-for-rejected-output.sdp.md | 11 +- ...ed-returns-false-for-success-output.sdp.md | 11 +- ...ted-returns-false-for-failed-output.sdp.md | 11 +- ...-is-rejected-enables-type-narrowing.sdp.md | 11 +- ...iled-returns-true-for-failed-output.sdp.md | 11 +- ...ed-returns-false-for-success-output.sdp.md | 11 +- ...d-returns-false-for-rejected-output.sdp.md | 11 +- ...18-is-failed-enables-type-narrowing.sdp.md | 11 +- ...-type-guards-are-mutually-exclusive.sdp.md | 11 +- .../platform-decider/decider-outputs.sdp.md | 2 +- ...-created-with-correct-initial-state.sdp.md | 11 +- ...s-002-valid-transitions-are-allowed.sdp.md | 10 +- ...oes-not-throw-for-valid-transitions.sdp.md | 10 +- ...04-invalid-transitions-are-detected.sdp.md | 10 +- ...ition-error-for-invalid-transitions.sdp.md | 14 +- ...nal-states-are-correctly-identified.sdp.md | 10 +- ...sage-indicates-no-valid-transitions.sdp.md | 12 +- ...state-validity-is-correctly-checked.sdp.md | 10 +- ...itions-can-be-queried-for-any-state.sdp.md | 10 +- ...ons-work-identically-to-fsm-methods.sdp.md | 11 +- ...ssert-transition-throws-same-errors.sdp.md | 11 +- .../platform-fsm/fsm-transitions.sdp.md | 2 +- ...-client-exposes-no-event-update-api.sdp.md | 9 +- ...-client-exposes-no-event-delete-api.sdp.md | 9 +- ...-to-a-new-stream-produces-version-1.sdp.md | 9 +- ...nt-the-stream-version-monotonically.sdp.md | 9 +- ...sition-is-unique-across-two-streams.sdp.md | 10 +- ...eases-monotonically-within-a-stream.sdp.md | 9 +- ...essful-append-with-matching-version.sdp.md | 11 +- .../s-008-conflict-on-version-mismatch.sdp.md | 10 +- ...-projection-resumes-from-checkpoint.sdp.md | 10 +- ...t-store-foundation-executable-tests.sdp.md | 10 +- ...tegory-supports-all-taxonomy-values.sdp.md | 8 +- ...nt-input-requires-core-event-fields.sdp.md | 11 +- ...ptional-category-and-schema-version.sdp.md | 10 +- ...-metadata-with-correlation-tracking.sdp.md | 11 +- ...ncludes-all-required-storage-fields.sdp.md | 12 +- ...lt-success-includes-event-positions.sdp.md | 11 +- ...t-conflict-includes-current-version.sdp.md | 10 +- .../platform-store/event-store-types.sdp.md | 2 +- .../codec-driven-reference-generation.sdp.md | 16 +- .../pdr-001-process-decisions-folder.sdp.md | 6 +- ...002-release-management-architecture.sdp.md | 6 +- ...003-behavior-feature-file-structure.sdp.md | 6 +- ...004-unified-tag-prefix-architecture.sdp.md | 6 +- specs/decisions/pdr-005-mvp-workflow.sdp.md | 6 +- ...pdr-006-typescript-sourced-taxonomy.sdp.md | 6 +- .../pdr-007-two-tier-spec-architecture.sdp.md | 6 +- .../pdr-008-example-app-purpose.sdp.md | 6 +- .../pdr-009-design-session-methodology.sdp.md | 6 +- ...-cross-component-argument-injection.sdp.md | 6 +- ...1-agent-action-handler-architecture.sdp.md | 6 +- .../pdr-012-agent-command-routing.sdp.md | 6 +- .../pdr-013-agent-lifecycle-fsm.sdp.md | 6 +- ...-boundary-authentication-convention.sdp.md | 6 +- ...bal-position-numeric-representation.sdp.md | 6 +- ...-pool-split-named-pools-per-concern.sdp.md | 6 +- ...ranche-3-platform-architecture-gate.sdp.md | 6 +- ...cy-enforcement-for-append-to-stream.sdp.md | 6 +- ...-v-any-vs-v-unknown-boundary-policy.sdp.md | 6 +- .../pdr-020-events-table-index-policy.sdp.md | 6 +- ...runtime-dependency-on-platform-core.sdp.md | 6 +- ...22-value-transfer-doctrine-adoption.sdp.md | 6 +- ...bulk-doctrine-rollback-and-recovery.sdp.md | 6 +- specs/epic-process-enhancements.sdp.md | 6 +- specs/example-app/agent-admin-frontend.sdp.md | 14 +- .../admin-tooling-consolidation.sdp.md | 13 +- .../agent-bc-component-isolation.sdp.md | 6 +- .../agent-command-infrastructure.sdp.md | 12 +- specs/platform/agent-llm-integration.sdp.md | 11 +- specs/platform/circuit-breaker-pattern.sdp.md | 11 +- ...-boundary-authentication-convention.sdp.md | 11 +- .../confirmed-order-cancellation.sdp.md | 11 +- .../platform/deterministic-id-hashing.sdp.md | 13 +- .../event-correctness-migration.sdp.md | 11 +- specs/platform/health-observability.sdp.md | 11 +- .../platform/integration-patterns-21a.sdp.md | 12 +- .../platform/integration-patterns-21b.sdp.md | 11 +- specs/platform/package-architecture.sdp.md | 14 +- ...context-foundation-executable-tests.sdp.md | 12 +- specs/platform/patterns/cms-repository.sdp.md | 15 +- ...and-bus-foundation-executable-tests.sdp.md | 12 +- .../patterns/command-orchestrator.sdp.md | 11 +- .../platform/patterns/command-registry.sdp.md | 21 +- .../patterns/data-table-parsing.sdp.md | 5 +- .../dcb-multi-product-reservation.sdp.md | 9 +- .../patterns/decider-assertions.sdp.md | 5 +- .../platform/patterns/decider-outputs.sdp.md | 4 +- ...t-store-foundation-executable-tests.sdp.md | 12 +- specs/platform/patterns/fsm-assertions.sdp.md | 5 +- .../platform/patterns/fsm-transitions.sdp.md | 4 +- .../patterns/middleware-pipeline.sdp.md | 23 +- .../patterns/projection-categories.sdp.md | 4 +- ...saga-orchestration-executable-tests.sdp.md | 12 +- specs/platform/patterns/test-isolation.sdp.md | 5 +- specs/platform/production-hardening.sdp.md | 12 +- ...ss-harness-and-dependency-hardening.sdp.md | 11 +- ...ease-ci-and-docs-process-guardrails.sdp.md | 11 +- ...porting-security-and-contract-sweep.sdp.md | 11 +- specs/releases/v0.1.0.sdp.md | 6 +- specs/releases/v0.2.0.sdp.md | 6 +- specs/releases/v0.3.0.sdp.md | 6 +- specs/releases/vNEXT.sdp.md | 6 +- specs/test-content-blocks.sdp.md | 4 +- specs/themed-decision-architecture.sdp.md | 12 +- ...y-is-created-with-correct-structure.sdp.md | 11 +- ...kward-compatibility-for-dlq-imports.sdp.md | 10 +- .../s-003-get-dead-letter-statistics.sdp.md | 17 +- ...004-bulk-retry-pending-dead-letters.sdp.md | 13 +- .../s-005-trace-complete-event-flow.sdp.md | 12 +- .../s-006-trace-shows-failure-point.sdp.md | 13 +- ...em-state-provides-complete-overview.sdp.md | 12 +- .../s-008-query-workpool-item-status.sdp.md | 11 +- ...query-workflow-execution-with-steps.sdp.md | 11 +- ...query-non-existent-durable-function.sdp.md | 12 +- ...unauthenticated-request-is-rejected.sdp.md | 9 +- .../s-012-non-admin-user-is-rejected.sdp.md | 9 +- .../s-013-admin-action-is-logged.sdp.md | 10 +- ...lays-failed-events-from-both-agents.sdp.md | 12 +- ...ackend-mutation-with-toast-feedback.sdp.md | 12 +- ...n-with-reason-provides-confirmation.sdp.md | 11 +- ...04-replay-failure-shows-error-toast.sdp.md | 11 +- .../s-005-filter-dead-letters-by-agent.sdp.md | 9 +- ...ory-with-decisions-from-both-agents.sdp.md | 11 +- ...07-filter-decision-history-by-agent.sdp.md | 10 +- ...ter-decision-history-by-action-type.sdp.md | 9 +- ...decision-detail-with-full-reasoning.sdp.md | 12 +- ...sion-history-shows-guidance-message.sdp.md | 10 +- ...-approve-action-shows-success-toast.sdp.md | 11 +- ...2-reject-action-shows-success-toast.sdp.md | 10 +- ...ction-shows-descriptive-error-toast.sdp.md | 11 +- ...e-rapid-actions-show-stacked-toasts.sdp.md | 11 +- ...tected-and-surfaces-as-vip-approval.sdp.md | 13 +- ...-value-order-does-not-trigger-agent.sdp.md | 11 +- ...roves-vip-flag-for-high-value-order.sdp.md | 12 +- ...trigger-from-same-customer-activity.sdp.md | 13 +- ...-dashboard-shows-both-active-agents.sdp.md | 12 +- ...pprovals-count-includes-both-agents.sdp.md | 11 +- .../s-021-one-agent-stopped-one-active.sdp.md | 12 +- ...nent-registers-with-isolated-schema.sdp.md | 10 +- ...-provides-full-crud-for-checkpoints.sdp.md | 10 +- ...-access-is-not-possible-from-parent.sdp.md | 9 +- ...-sub-transactions-provide-isolation.sdp.md | 9 +- ...eceives-projection-data-as-argument.sdp.md | 9 +- ...rojection-data-returns-empty-result.sdp.md | 10 +- ...-access-app-level-projection-tables.sdp.md | 9 +- ...access-agent-data-via-component-api.sdp.md | 9 +- ...ugh-command-orchestrator-to-handler.sdp.md | 11 +- ...e-is-rejected-with-validation-error.sdp.md | 11 +- ...tency-prevents-duplicate-processing.sdp.md | 11 +- ...-transitions-active-agent-to-paused.sdp.md | 12 +- ...nt-resumes-from-checkpoint-position.sdp.md | 12 +- ...id-lifecycle-transition-is-rejected.sdp.md | 11 +- ...-configuration-without-losing-state.sdp.md | 11 +- ...g-references-patterns-from-registry.sdp.md | 10 +- ...pattern-trigger-for-cheap-detection.sdp.md | 11 +- ...es-pattern-analyze-for-llm-analysis.sdp.md | 11 +- ...ern-name-in-config-fails-validation.sdp.md | 10 +- ...dler-calls-llm-and-returns-decision.sdp.md | 12 +- ...tation-persists-decision-atomically.sdp.md | 11 +- ...rejects-invalid-agent-configuration.sdp.md | 10 +- ...rror-through-retries-to-dead-letter.sdp.md | 11 +- ...riggers-dead-letter-via-on-complete.sdp.md | 10 +- ...miter-allows-llm-call-within-limits.sdp.md | 10 +- ...miter-blocks-llm-call-when-exceeded.sdp.md | 11 +- ...8-cost-budget-exceeded-pauses-agent.sdp.md | 11 +- ...queue-overflow-triggers-dead-letter.sdp.md | 10 +- ...plete-receives-completion-callbacks.sdp.md | 10 +- ...create-dead-letters-via-on-complete.sdp.md | 10 +- ...out-on-complete-uses-global-default.sdp.md | 9 +- ...1-circuit-remains-closed-on-success.sdp.md | 12 +- ...cuit-opens-after-threshold-failures.sdp.md | 14 +- ...nsitions-to-half-open-after-timeout.sdp.md | 11 +- ...004-successful-probe-closes-circuit.sdp.md | 12 +- .../s-005-failed-probe-reopens-circuit.sdp.md | 13 +- ...tate-persists-across-function-calls.sdp.md | 9 +- ...existent-circuit-defaults-to-closed.sdp.md | 10 +- ...meout-transitions-open-to-half-open.sdp.md | 10 +- .../s-009-stale-timeout-is-ignored.sdp.md | 12 +- ...pen-probe-closes-circuit-on-success.sdp.md | 10 +- ...en-probe-reopens-circuit-on-failure.sdp.md | 10 +- ...2-open-circuit-returns-fast-failure.sdp.md | 11 +- ...ment-circuit-opens-after-3-failures.sdp.md | 9 +- ...ail-circuit-tolerates-more-failures.sdp.md | 10 +- ...-services-have-independent-circuits.sdp.md | 11 +- ...-reference-at-standard-detail-level.sdp.md | 12 +- ...d-reference-at-summary-detail-level.sdp.md | 12 +- ...03-extract-conventions-by-tag-value.sdp.md | 11 +- ...tent-preserves-rule-block-structure.sdp.md | 10 +- ...ions-found-for-requested-tag-values.sdp.md | 10 +- ...ources-match-any-pattern-file-paths.sdp.md | 10 +- ...g-matches-multiple-decision-records.sdp.md | 10 +- .../s-008-dual-output-generation.sdp.md | 10 +- .../s-009-summary-compaction-quality.sdp.md | 12 +- ...appear-in-available-generators-list.sdp.md | 11 +- ...invocation-generates-reference-docs.sdp.md | 9 +- ...ntion-tag-is-registered-in-taxonomy.sdp.md | 10 +- ...ontent-preserved-in-decision-record.sdp.md | 11 +- ...ion-is-not-split-by-mutation-family.sdp.md | 10 +- ...forged-proof-is-rejected-by-default.sdp.md | 9 +- .../s-001-cancel-a-confirmed-order.sdp.md | 10 +- ...-cancelled-order-unchanged-behavior.sdp.md | 9 +- ...volves-confirmed-state-to-cancelled.sdp.md | 9 +- ...-after-confirmed-order-cancellation.sdp.md | 12 +- ...oes-not-trigger-reservation-release.sdp.md | 9 +- ...ith-pending-reservation-releases-it.sdp.md | 9 +- ...or-duplicate-order-cancelled-events.sdp.md | 8 +- ...cellations-trigger-churn-risk-agent.sdp.md | 10 +- ...-same-email-produces-same-stream-id.sdp.md | 11 +- ...posite-key-produces-consistent-hash.sdp.md | 11 +- ...mails-produce-different-stream-i-ds.sdp.md | 9 +- .../s-004-first-create-succeeds.sdp.md | 10 +- ...5-second-create-fails-with-conflict.sdp.md | 10 +- ...urrent-creates-exactly-one-succeeds.sdp.md | 10 +- .../s-007-hash-output-is-url-safe.sdp.md | 10 +- .../s-008-hash-is-not-reversible.sdp.md | 10 +- ...s-009-pattern-selection-by-use-case.sdp.md | 11 +- ...-can-evolve-independently-of-phases.sdp.md | 10 +- ...-phase-files-link-specs-to-releases.sdp.md | 11 +- ...starts-from-decisions-and-inventory.sdp.md | 10 +- ...oint-formats-are-handled-explicitly.sdp.md | 10 +- ...urns-healthy-when-all-components-ok.sdp.md | 15 +- ...returns-unhealthy-on-projection-lag.sdp.md | 12 +- ...liveness-probe-always-returns-alive.sdp.md | 16 +- ...04-workpool-backlog-fails-readiness.sdp.md | 14 +- ...normal-queue-depth-passes-readiness.sdp.md | 14 +- ...jection-lag-is-calculated-correctly.sdp.md | 10 +- ...g-checkpoint-treated-as-maximum-lag.sdp.md | 10 +- .../s-008-zero-lag-is-healthy.sdp.md | 10 +- ...s-collection-gathers-all-dimensions.sdp.md | 11 +- ...ics-emitted-as-json-for-log-streams.sdp.md | 10 +- ...rics-collection-handles-empty-state.sdp.md | 11 +- ...nents-healthy-yields-healthy-system.sdp.md | 14 +- ...hy-component-makes-system-unhealthy.sdp.md | 12 +- ...ed-component-yields-degraded-system.sdp.md | 12 +- ...s-001-context-map-shows-bc-topology.sdp.md | 10 +- ...2-register-partnership-relationship.sdp.md | 10 +- ...register-shared-kernel-relationship.sdp.md | 10 +- ...ster-open-host-service-relationship.sdp.md | 10 +- ...-duplicate-relationship-is-rejected.sdp.md | 9 +- ...eferential-relationship-is-rejected.sdp.md | 9 +- ...ation-event-uses-published-language.sdp.md | 11 +- ...8-event-tagging-for-routing-and-dcb.sdp.md | 11 +- ...hema-compatibility-mode-is-enforced.sdp.md | 10 +- ...ster-schema-with-compatibility-mode.sdp.md | 10 +- ...istered-event-type-fails-conversion.sdp.md | 9 +- ...lid-payload-fails-schema-validation.sdp.md | 10 +- ...translates-external-system-response.sdp.md | 9 +- ...l-handles-bidirectional-translation.sdp.md | 9 +- .../s-015-acl-validates-external-input.sdp.md | 9 +- .../s-016-acl-rejects-unmapped-values.sdp.md | 9 +- ...s-001-v1-consumer-receives-v2-event.sdp.md | 11 +- .../s-002-upcast-historical-events.sdp.md | 10 +- ...casters-for-multi-version-migration.sdp.md | 10 +- .../s-004-upcast-adds-computed-field.sdp.md | 10 +- ...ompatible-schema-change-is-rejected.sdp.md | 10 +- ...6-breaking-change-without-migration.sdp.md | 10 +- ...test-validates-schema-compatibility.sdp.md | 10 +- .../s-008-contract-sample-generation.sdp.md | 10 +- ...09-generate-multiple-unique-samples.sdp.md | 10 +- ...-010-producer-contract-test-utility.sdp.md | 9 +- ...-011-consumer-contract-test-utility.sdp.md | 9 +- ...ible-producer-and-consumer-verified.sdp.md | 10 +- .../s-013-compatible-with-downcaster.sdp.md | 11 +- ...4-detect-producer-consumer-mismatch.sdp.md | 12 +- ...-015-contract-violation-is-recorded.sdp.md | 11 +- ...6-contract-violations-are-queryable.sdp.md | 10 +- ...01-platform-fsm-has-no-dependencies.sdp.md | 11 +- ...ecider-depends-only-on-platform-fsm.sdp.md | 10 +- ...der-package-is-independently-usable.sdp.md | 11 +- ...kages-are-independently-publishable.sdp.md | 10 +- ...rk-tests-live-in-framework-packages.sdp.md | 11 +- ...6-existing-imports-continue-to-work.sdp.md | 10 +- ...platform-namespace-avoids-conflicts.sdp.md | 10 +- ...rs-appear-in-generated-decisions-md.sdp.md | 11 +- ...g-is-independent-from-package-ad-rs.sdp.md | 11 +- ...-001-minimal-release-file-structure.sdp.md | 11 +- ...002-pdr-tagged-with-release-version.sdp.md | 10 +- ...elog-generation-from-scattered-tags.sdp.md | 10 +- ...ype-script-phase-files-are-separate.sdp.md | 12 +- ...2-spec-files-use-semantic-tags-only.sdp.md | 12 +- ...iles-centralize-release-information.sdp.md | 12 +- ...-can-evolve-independently-of-phases.sdp.md | 10 +- ...ease-references-in-spec-data-tables.sdp.md | 10 +- ...hase-files-support-process-metadata.sdp.md | 13 +- ...e-files-support-dependency-tracking.sdp.md | 11 +- ...-all-metadata-uses-architect-prefix.sdp.md | 10 +- .../s-002-bdd-tags-remain-unprefixed.sdp.md | 10 +- ...-deprecated-prefix-during-migration.sdp.md | 10 +- ...1-compiler-enforces-taxonomy-values.sdp.md | 9 +- ...s-derive-from-type-script-constants.sdp.md | 9 +- ...-builder-creates-valid-tag-registry.sdp.md | 9 +- ...s-004-type-inference-from-constants.sdp.md | 9 +- .../s-001-roadmap-spec-structure.sdp.md | 13 +- .../s-002-package-spec-structure.sdp.md | 13 +- ...03-linking-roadmap-to-package-specs.sdp.md | 12 +- ...-004-completed-pattern-roadmap-spec.sdp.md | 12 +- ...ve-pattern-with-acceptance-criteria.sdp.md | 11 +- ...ing-a-platform-demonstration-change.sdp.md | 9 +- ...valuating-a-business-feature-change.sdp.md | 9 +- ...-003-evaluating-an-uncertain-change.sdp.md | 9 +- ...oduces-decision-specs-not-documents.sdp.md | 10 +- ...-design-session-produces-code-stubs.sdp.md | 11 +- ...003-stub-file-has-target-annotation.sdp.md | 11 +- ...ubs-use-pattern-based-folder-naming.sdp.md | 9 +- ...ssion-decision-uses-design-category.sdp.md | 9 +- ...eceives-projection-data-as-argument.sdp.md | 12 +- ...external-data-is-handled-gracefully.sdp.md | 11 +- ...jected-data-interface-is-extensible.sdp.md | 10 +- ...rforms-analysis-without-persistence.sdp.md | 13 +- ...e-falls-back-to-rule-based-analysis.sdp.md | 11 +- ...riggers-dead-letter-via-on-complete.sdp.md | 11 +- ...ces-checkpoint-without-side-effects.sdp.md | 11 +- ...tion-subscriptions-remain-unchanged.sdp.md | 10 +- ...sequential-events-process-correctly.sdp.md | 10 +- ...ntity-are-serialized-at-on-complete.sdp.md | 13 +- ...rocessed-event-is-skipped-in-action.sdp.md | 11 +- ...iption-specific-pool-when-available.sdp.md | 11 +- ...ough-orchestrator-to-domain-handler.sdp.md | 15 +- ...mmand-type-fails-with-routing-error.sdp.md | 11 +- ...by-command-orchestrator-idempotency.sdp.md | 11 +- ...gger-for-cheap-detection-before-llm.sdp.md | 11 +- ...s-analyze-for-llm-powered-detection.sdp.md | 14 +- ...id-lifecycle-transition-is-rejected.sdp.md | 13 +- ...-configuration-without-losing-state.sdp.md | 11 +- ...egitimate-component-boundary-action.sdp.md | 11 +- ...-proof-is-rejected-before-any-write.sdp.md | 10 +- ...ation-family-migrates-in-one-packet.sdp.md | 10 +- ...rictly-monotonic-at-real-timestamps.sdp.md | 10 +- ...nts-are-read-safely-by-the-new-code.sdp.md | 10 +- ...nger-share-the-primary-projection-p.sdp.md | 11 +- ...existent-workpool-ordering-behavior.sdp.md | 10 +- ...e-chooses-the-low-blast-radius-path.sdp.md | 11 +- ...age-splits-are-not-silently-started.sdp.md | 10 +- ...zes-the-non-split-contract-surfaces.sdp.md | 10 +- ...-tranche-3-non-split-boundary-rules.sdp.md | 11 +- ...-returns-the-original-append-result.sdp.md | 11 +- ...ent-payload-is-rejected-and-audited.sdp.md | 11 +- ...d-cap-passes-the-component-boundary.sdp.md | 11 +- ...load-is-rejected-before-persistence.sdp.md | 11 +- ...uses-the-replacement-compound-index.sdp.md | 10 +- ...sent-after-the-audit-driven-cleanup.sdp.md | 10 +- ...cy-decision-rather-than-a-package-r.sdp.md | 10 +- ...pen-the-deferred-platform-core-spli.sdp.md | 11 +- ...across-roadmap-and-decision-sources.sdp.md | 10 +- ...mes-identify-carrier-artifacts-only.sdp.md | 10 +- ...lements-carries-the-continuity-edge.sdp.md | 10 +- ...c-pattern-without-undoing-the-whole.sdp.md | 11 +- ...-enforcement-in-the-normal-ci-lanes.sdp.md | 11 +- .../s-001-projection-lag-is-tracked.sdp.md | 11 +- ...lection-handles-missing-checkpoints.sdp.md | 10 +- ...ce-spans-command-to-projection-flow.sdp.md | 10 +- ...-missing-trace-context-uses-default.sdp.md | 10 +- ...readiness-probe-checks-dependencies.sdp.md | 9 +- ...nhealthy-dependency-fails-readiness.sdp.md | 9 +- ...-007-liveness-probe-always-succeeds.sdp.md | 9 +- ...08-workpool-backlog-fails-readiness.sdp.md | 12 +- ...rcuit-opens-after-repeated-failures.sdp.md | 9 +- ...nsitions-to-half-open-after-timeout.sdp.md | 9 +- ...ul-half-open-request-closes-circuit.sdp.md | 9 +- ...d-half-open-request-reopens-circuit.sdp.md | 9 +- ...jection-rebuild-re-processes-events.sdp.md | 10 +- ...dead-letter-retry-re-enqueues-event.sdp.md | 9 +- ...ent-flow-trace-returns-full-history.sdp.md | 9 +- ...16-durable-function-run-diagnostics.sdp.md | 10 +- ...-action-retrier-for-half-open-probe.sdp.md | 9 +- ...-reopens-circuit-via-action-retrier.sdp.md | 9 +- ...s-action-retrier-for-external-calls.sdp.md | 10 +- ...dlq-retry-returns-to-pending-status.sdp.md | 10 +- ...ction-calls-propagate-trace-context.sdp.md | 10 +- ...io-with-doc-string-for-rich-content.sdp.md | 9 +- ...3-simple-scenario-under-second-rule.sdp.md | 8 +- .../s-004-scenario-with-examples-table.sdp.md | 8 +- ...1-generate-themed-decision-document.sdp.md | 11 +- .../s-002-theme-tag-in-decision-file.sdp.md | 10 +- ...003-adr-with-dependency-declaration.sdp.md | 9 +- .../s-004-generate-dependency-graph.sdp.md | 10 +- ...layer-information-in-generated-docs.sdp.md | 10 +- ...adr-from-old-format-to-feature-file.sdp.md | 12 +- ...eview-for-validity-during-migration.sdp.md | 12 +- ...008-generate-all-decision-artifacts.sdp.md | 9 +- ...ist-before-tranche-1-implementation.sdp.md | 10 +- ...lidation-remains-machine-verifiable.sdp.md | 10 +- ...elease-governance-points-to-pdr-002.sdp.md | 10 +- ...architect-guard-and-docs-generation.sdp.md | 10 +- ...p-does-not-bypass-the-auth-keystone.sdp.md | 10 +- ...-gaps-fail-closed-after-remediation.sdp.md | 10 +- ...0-codec-driven-reference-generation.sdp.md | 2 + ...se-100-themed-decision-architecture.sdp.md | 2 + ...jection-categories-executable-tests.sdp.md | 2 + ...ed-context-ai-driven-event-reactors.sdp.md | 2 + .../phase-22-agent-as-bounded-context.sdp.md | 2 + ...hase-22-agent-churn-risk-completion.sdp.md | 2 + ...ase-22-confirmed-order-cancellation.sdp.md | 2 + .../d-001-create-admin-directory.sdp.md | 3 +- .../d-002-projection-admin-endpoints.sdp.md | 3 +- .../d-003-refactored-dlq-endpoints.sdp.md | 3 +- .../d-004-event-flow-trace-query.sdp.md | 3 +- .../d-005-system-state-snapshot-query.sdp.md | 3 +- .../d-006-durable-function-run-queries.sdp.md | 3 +- .../d-007-admin-authorization-wrapper.sdp.md | 3 +- .../d-008-admin-api-documentation.sdp.md | 3 +- .../d-001-high-value-agent-config.sdp.md | 3 +- ...d-002-high-value-pattern-definition.sdp.md | 3 +- .../d-003-high-value-action-handler.sdp.md | 3 +- ...-004-high-value-on-complete-handler.sdp.md | 3 +- .../d-005-high-value-command-route.sdp.md | 3 +- ...6-high-value-event-bus-subscription.sdp.md | 3 +- ...igh-value-integration-test-real-llm.sdp.md | 3 +- ...er-management-section-in-monitoring.sdp.md | 3 +- .../d-009-use-dead-letters-hook.sdp.md | 3 +- .../d-010-use-dead-letter-actions-hook.sdp.md | 3 +- .../d-011-decision-history-tab.sdp.md | 3 +- ...-decision-history-hook-with-filters.sdp.md | 3 +- ...ast-notification-integration-sonner.sdp.md | 3 +- .../d-014-action-feedback-toasts.sdp.md | 3 +- ...15-dashboard-update-for-multi-agent.sdp.md | 3 +- .../d-016-e2-e-step-definitions.sdp.md | 3 +- .../d-017-agent-admin-page-page-object.sdp.md | 3 +- ...mplemented-agent-e2e-scenarios-skip.sdp.md | 3 +- ...-019-auth-integration-documentation.sdp.md | 3 +- .../d-001-agent-component-definition.sdp.md | 3 +- .../d-002-agent-component-schema.sdp.md | 3 +- .../d-003-checkpoint-public-api.sdp.md | 3 +- .../d-004-audit-public-api.sdp.md | 3 +- .../d-005-dead-letter-public-api.sdp.md | 3 +- .../d-006-command-public-api.sdp.md | 3 +- .../d-007-approval-public-api.sdp.md | 3 +- ...d-008-cross-component-query-pattern.sdp.md | 3 +- .../d-001-agent-action-handler-factory.sdp.md | 3 +- ...-llm-integrated-on-complete-handler.sdp.md | 3 +- .../d-003-rate-limiter-integration.sdp.md | 3 +- .../d-004-cost-budget-tracking.sdp.md | 3 +- ...005-convex-dev-agent-thread-adapter.sdp.md | 3 +- ...n-create-agent-subscription-options.sdp.md | 3 +- .../d-007-circuit-breaker-for-llm.sdp.md | 3 +- .../d-008-agent-workpool-configuration.sdp.md | 3 +- ...09-action-mutation-integration-test.sdp.md | 3 +- ...-circuit-breaker-state-machine-pure.sdp.md | 3 +- .../d-002-circuit-breaker-types.sdp.md | 3 +- ...d-003-circuit-breakers-table-schema.sdp.md | 3 +- .../d-004-with-circuit-breaker-wrapper.sdp.md | 3 +- .../d-005-load-circuit-state-query.sdp.md | 3 +- .../d-006-record-success-mutation.sdp.md | 3 +- .../d-007-record-failure-mutation.sdp.md | 3 +- ...-check-half-open-scheduled-mutation.sdp.md | 3 +- ...9-on-circuit-probe-complete-handler.sdp.md | 3 +- .../d-010-circuit-breaker-metrics.sdp.md | 3 +- .../d-001-pdr-014-placeholder.sdp.md | 3 +- ...nonical-verification-proof-contract.sdp.md | 3 +- .../d-003-verify-actor-helper.sdp.md | 3 +- ...identity-bearing-mutation-migration.sdp.md | 3 +- ...-tagging-for-system-only-exceptions.sdp.md | 3 +- ...ent-boundary-auth-integration-suite.sdp.md | 3 +- ...01-deterministic-stream-id-function.sdp.md | 3 +- .../d-002-hash-algorithm-selection.sdp.md | 3 +- .../d-003-conflict-error-handling.sdp.md | 3 +- .../d-004-pattern-documentation.sdp.md | 3 +- ...-global-position-consumer-inventory.sdp.md | 3 +- .../d-002-pdr-018-placeholder.sdp.md | 3 +- .../d-003-pdr-015-placeholder.sdp.md | 3 +- ...end-to-stream-idempotency-migration.sdp.md | 3 +- ...ntation-migration-and-compat-reader.sdp.md | 3 +- ...-canonical-pm-transition-map-parity.sdp.md | 3 +- ...event-correctness-integration-suite.sdp.md | 3 +- .../d-001-health-check-types.sdp.md | 3 +- .../d-002-check-readiness-query.sdp.md | 3 +- .../d-003-check-liveness-query.sdp.md | 3 +- ...-004-http-router-with-health-routes.sdp.md | 3 +- .../d-005-metrics-types.sdp.md | 3 +- .../d-006-metrics-collector.sdp.md | 3 +- .../d-007-projection-lag-calculator.sdp.md | 3 +- .../d-008-workpool-depth-query.sdp.md | 3 +- .../d-009-system-health-aggregator.sdp.md | 3 +- .../d-001-context-map-registry.sdp.md | 3 +- .../d-002-context-map-documentation.sdp.md | 3 +- .../d-003-published-language-registry.sdp.md | 3 +- ...004-to-published-language-converter.sdp.md | 3 +- .../d-005-acl-builder-enhancement.sdp.md | 3 +- ...ntegration-event-metadata-extension.sdp.md | 3 +- .../d-001-upcaster-implementation.sdp.md | 3 +- .../d-002-downcaster-implementation.sdp.md | 3 +- .../d-003-migration-path-validation.sdp.md | 3 +- .../d-004-contract-sample-generation.sdp.md | 3 +- .../d-005-producer-contract-tests.sdp.md | 3 +- .../d-006-consumer-contract-tests.sdp.md | 3 +- .../d-007-compatibility-verification.sdp.md | 3 +- .../d-008-contract-violation-detection.sdp.md | 3 +- .../d-001-metrics-collection-types.sdp.md | 3 +- .../d-002-metrics-collector.sdp.md | 3 +- .../d-003-health-check-queries.sdp.md | 3 +- .../d-004-health-http-router.sdp.md | 3 +- ...-005-circuit-breaker-implementation.sdp.md | 3 +- .../d-006-admin-projection-endpoints.sdp.md | 3 +- .../d-007-admin-dlq-endpoints.sdp.md | 3 +- .../d-008-admin-diagnostics.sdp.md | 3 +- ...09-durable-function-run-diagnostics.sdp.md | 3 +- .../d-010-contract-violation-types.sdp.md | 3 +- .../d-011-grafana-dashboard-templates.sdp.md | 3 +- .../d-012-runbook-documentation.sdp.md | 3 +- ...circuit-breaker-retrier-integration.sdp.md | 3 +- .../d-014-dlq-action-retrier-pattern.sdp.md | 3 +- ...015-durable-function-decision-guide.sdp.md | 3 +- .../d-001-demo-item-1.sdp.md | 2 +- ...d-001-add-adr-theme-tag-to-registry.sdp.md | 2 +- ...02-theme-grouped-decision-generator.sdp.md | 2 +- .../d-003-dependency-graph-generator.sdp.md | 2 +- .../d-004-adr-migration-scripts.sdp.md | 2 +- ...005-review-and-port-33-active-ad-rs.sdp.md | 2 +- .../d-001-dependency-delta-memo.sdp.md | 3 +- ...2-store-backend-integration-harness.sdp.md | 3 +- ...003-bus-backend-integration-harness.sdp.md | 3 +- ...pecheck-and-vitest-config-alignment.sdp.md | 3 +- ...005-strict-ts-and-es-lint-hardening.sdp.md | 3 +- ...ation-aligned-to-architect-releases.sdp.md | 3 +- .../d-002-dependency-scanning-in-ci.sdp.md | 3 +- ...tract-status-convention-and-linting.sdp.md | 3 +- .../d-004-convex-es-rename-guard.sdp.md | 3 +- ...05-docs-process-validation-workflow.sdp.md | 3 +- ...ensure-test-environment-fail-closed.sdp.md | 3 +- ...n-id-required-at-validator-boundary.sdp.md | 3 +- ...ength-uui-dv7-helper-centralization.sdp.md | 3 +- ...uthorization-default-deny-migration.sdp.md | 3 +- ...05-approval-expiration-ordering-fix.sdp.md | 3 +- ...ifecycle-stubs-throw-or-are-removed.sdp.md | 3 +- ...tore-dependency-decision-guardrails.sdp.md | 3 +- ...se-100-themed-decision-architecture.sdp.md | 2 + .../phase-18-production-hardening.sdp.md | 2 + ...e-18-workpool-partitioning-strategy.sdp.md | 2 + .../phase-20-reservation-pattern.sdp.md | 2 + .../phase-21-integration-patterns-21b.sdp.md | 2 + ...ed-context-ai-driven-event-reactors.sdp.md | 2 + .../phase-22-agent-as-bounded-context.sdp.md | 2 + ...hase-22-agent-churn-risk-completion.sdp.md | 2 + ...ase-22-confirmed-order-cancellation.sdp.md | 2 + test/sdp-migration-guard.test.ts | 8 +- 3908 files changed, 32083 insertions(+), 4063 deletions(-) create mode 100644 scripts/rewrite-spec-content.py diff --git a/scripts/rewrite-spec-content.py b/scripts/rewrite-spec-content.py new file mode 100644 index 00000000..9777c56a --- /dev/null +++ b/scripts/rewrite-spec-content.py @@ -0,0 +1,408 @@ +#!/usr/bin/env python3 +"""Fill migrated SDP Specs with actual Gherkin/architect content (not title-only stubs).""" +from __future__ import annotations + +import re +from pathlib import Path + +ROOT = Path("/home/darkomijic/dev-libar/libar-platform") +SPECS = ROOT / "specs" +SKIP = {"node_modules", "dist", "generated", ".git"} + + +def walk_features() -> list[Path]: + out = [] + for p in ROOT.rglob("*.feature"): + if any(s in p.parts for s in SKIP): + continue + out.append(p) + return sorted(out) + + +def sanitize_prose(text: str, limit: int = 700) -> str: + text = re.sub(r"<[^>\n]+>", " ", text) + text = text.replace("|", " / ").replace("`", "'").replace("<", "(").replace(">", ")") + text = re.sub(r"\s+", " ", text).strip() + if len(text) > limit: + text = text[: limit - 1].rstrip() + "…" + return text + + +def sanitize_step(text: str) -> str: + text = re.sub(r"<[^>\n]+>", "value", text) + text = text.replace("|", " ").replace("`", "'") + text = re.sub(r"\s+", " ", text).strip() + if not text: + text = "the fixture holds" + if len(text) > 240: + text = text[:239].rstrip() + "…" + return text + + +def parse_feature(path: Path) -> dict: + lines = path.read_text(errors="ignore").splitlines() + title = "" + header: list[str] = [] + rules: list[str] = [] + background: list[tuple[str, str]] = [] + scenarios: list[dict] = [] + mode = "header" + current: dict | None = None + pending_step: tuple[str, str] | None = None + in_table = False + in_doc = False + doc_buf: list[str] = [] + + def flush_doc(): + nonlocal pending_step, in_doc, doc_buf + if pending_step and doc_buf: + extra = sanitize_step(" ".join(doc_buf)[:200]) + pending_step = (pending_step[0], pending_step[1] + " " + extra) + in_doc = False + doc_buf = [] + + def attach_step(kw: str, text: str): + nonlocal pending_step + pending_step = (kw, sanitize_step(text)) + if mode == "background": + background.append(pending_step) + elif current is not None: + current["steps"].append(pending_step) + + i = 0 + while i < len(lines): + raw = lines[i] + stripped = raw.strip() + i += 1 + if in_doc: + if stripped in ('"""', "'''"): + flush_doc() + else: + doc_buf.append(stripped) + continue + if stripped in ('"""', "'''"): + in_doc = True + doc_buf = [] + continue + if stripped.startswith("|"): + in_table = True + continue + if in_table and not stripped.startswith("|"): + in_table = False + if not stripped or stripped.startswith("#") or stripped.startswith("@"): + continue + if stripped.startswith("Feature:"): + title = stripped[len("Feature:") :].strip() + mode = "header" + continue + if stripped.startswith("Background:"): + mode = "background" + current = None + continue + if stripped.startswith("Rule:"): + rules.append(sanitize_prose(stripped[len("Rule:") :].strip(), 240)) + mode = "rule" + current = None + continue + m_sc = re.match(r"Scenario(?: Outline)?:\s*(.*)$", stripped) + if m_sc: + current = {"title": (m_sc.group(1) or "").strip(), "steps": []} + scenarios.append(current) + mode = "scenario" + continue + m_st = re.match(r"^(Given|When|Then|And|But)\s+(.*)$", stripped) + if m_st: + kw = m_st.group(1) + if kw == "But": + kw = "And" + attach_step(kw, m_st.group(2)) + continue + if mode == "header" and title: + header.append(stripped) + + as_a = next((h for h in header if re.match(r"^As an?\b", h, re.I)), "") + i_want = next((h for h in header if re.match(r"^I want\b", h, re.I)), "") + so_that = next((h for h in header if re.match(r"^So that\b", h, re.I)), "") + problem = "" + solution = "" + blob = " ".join(header) + pm = re.search(r"\*\*Problem:?\*\*\s*(.+?)(?=\*\*[A-Z]|\Z)", blob) + sm = re.search(r"\*\*Solution:?\*\*\s*(.+?)(?=\*\*[A-Z]|\Z)", blob) + if pm: + problem = sanitize_prose(pm.group(1), 500) + if sm: + solution = sanitize_prose(sm.group(1), 500) + outcome = "" + if i_want and so_that: + outcome = sanitize_prose( + f"{i_want[len('I want'):].strip()} so that {so_that[len('So that'):].strip()}", + 500, + ) + elif so_that: + outcome = sanitize_prose(so_that[len("So that") :].strip(), 500) + elif i_want: + outcome = sanitize_prose(i_want[len("I want") :].strip(), 500) + elif problem: + outcome = problem + else: + outcome = sanitize_prose(title or path.stem, 400) + return { + "title": title or path.stem, + "actor": sanitize_prose(as_a[len("As ") :].strip() if as_a.lower().startswith("as ") else as_a, 200) + if as_a + else "", + "outcome": outcome, + "problem": problem, + "solution": solution, + "rules": [r for r in rules if r], + "background": background, + "scenarios": scenarios, + "rel": str(path.relative_to(ROOT)).replace("\\", "/"), + } + + +def to_gwt(background: list[tuple[str, str]], steps: list[tuple[str, str]]) -> list[str]: + given: list[str] = [] + when: list[str] = [] + then: list[str] = [] + phase = None + for kw, text in background + steps: + if kw in ("Given", "When", "Then"): + phase = kw + elif kw == "And" and phase is None: + phase = "Given" + if phase == "Given": + given.append(text) + elif phase == "When": + when.append(text) + else: + then.append(text) + if not given: + given = ["the feature fixture is in place"] + if not when: + when = ["the scenario runs"] + if len(when) > 1: + when = [sanitize_step(" and ".join(when))] + if not then: + then = ["the expected outcome holds"] + lines = [f"Given {given[0]}"] + for g in given[1:]: + lines.append(f"And {g}") + lines.append(f"When {when[0]}") + lines.append(f"Then {then[0]}") + for t in then[1:]: + lines.append(f"And {t}") + return lines + + +def yaml_escape_title(title: str) -> str: + title = title.replace('"', "'") + title = re.sub(r"<[^>\n]+>", "value", title) + title = title.replace("<", "(").replace(">", ")") + return title.strip() or "Untitled scenario" + + +def write(path: Path, body: str) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(body if body.endswith("\n") else body + "\n") + + +def load_id_maps(): + carrier_to_file: dict[str, Path] = {} + stem_to_file: dict[str, Path] = {} + id_of: dict[Path, str] = {} + for p in SPECS.rglob("*.sdp.md"): + if p.name.endswith(".pack.sdp.md"): + continue + text = p.read_text() + m = re.search(r"^id:\s*(\S+)", text, re.M) + if not m: + continue + id_of[p] = m.group(1) + c = re.search(r"test carrier:\s*([^)\n]+)", text) + if c: + carrier_to_file[c.group(1).strip()] = p + stem_to_file[spec_stem(p)] = p + return carrier_to_file, stem_to_file, id_of + + +def spec_stem(path: Path) -> str: + name = path.name + if name.endswith(".sdp.md"): + return name[: -len(".sdp.md")] + return path.stem + + +def parent_examples_dir(parent: Path) -> Path: + return parent.parent / (spec_stem(parent) + ".examples") + + +def kebab(name: str) -> str: + s = re.sub(r"([a-z0-9])([A-Z])", r"\1-\2", name) + s = s.replace("_", "-").lower() + s = re.sub(r"[^a-z0-9-]+", "-", s) + return re.sub(r"-+", "-", s).strip("-") + + +carrier_to_file, stem_to_file, id_of = load_id_maps() + +rewritten_parents = 0 +rewritten_examples = 0 +rewritten_unimpl = 0 +missing_parent = 0 +gwt_examples = 0 + + +def rewrite_parent(parent: Path, feat: dict, kind: str) -> None: + global rewritten_parents + sid = id_of.get(parent) + if not sid: + return + # keep existing frontmatter kind/altitude/readiness/relations + old = parent.read_text() + fm = re.match(r"^---\n(.*?)\n---\n", old, re.S) + if not fm: + return + front = fm.group(1) + # force kind if missing + intent_lines = [f"- outcome: {feat['outcome']}"] + if feat["actor"]: + intent_lines.insert(0, f"- actor: {feat['actor']}") + if feat["problem"]: + intent_lines.append(f"- problem: {feat['problem']}") + if feat["solution"]: + intent_lines.append(f"- value: {feat['solution']}") + body = f"---\n{front}\n---\n# {yaml_escape_title(feat['title'])}\n\n## Intent\n\n" + body += "\n".join(intent_lines) + "\n" + if feat["rules"] and "kind: decision" not in front and "kind: example" not in front: + body += "\n## Behavior\n\n" + for rule in feat["rules"][:40]: + body += f"- rule: {rule}\n" + if "kind: decision" in front: + ruling = feat["solution"] or feat["outcome"] + body += "\n## Decision\n\n" + body += f"- ruling: {ruling}\n" + write(parent, body) + rewritten_parents += 1 + + +def rewrite_examples(parent: Path, feat: dict) -> None: + global rewritten_examples, gwt_examples + dest = parent_examples_dir(parent) + if not dest.is_dir(): + # architect scenarios live under unimplemented/architect-scenarios/ + alt = SPECS / "unimplemented" / "architect-scenarios" / kebab(Path(feat["rel"]).stem) + dest = alt if alt.is_dir() else dest + files = sorted(dest.glob("s-*.sdp.md")) if dest.is_dir() else [] + for idx, scenario in enumerate(feat["scenarios"]): + target = None + seq = f"s-{idx + 1:03d}-" + for f in files: + if f.name.startswith(seq): + target = f + break + if target is None: + continue + old = target.read_text() + fm = re.match(r"^---\n(.*?)\n---\n", old, re.S) + if not fm: + continue + front = fm.group(1) + title = yaml_escape_title(scenario["title"] or f"scenario {idx + 1}") + gwt = to_gwt(feat["background"], scenario["steps"]) + outcome = sanitize_prose(f"Executable scenario: {title}", 400) + body = ( + f"---\n{front}\n---\n# {title}\n\n## Intent\n\n" + f"- outcome: {outcome}\n\n" + "```gwt\n" + "\n".join(gwt) + "\n```\n" + ) + write(target, body) + rewritten_examples += 1 + gwt_examples += 1 + + +for path in walk_features(): + feat = parse_feature(path) + rel = feat["rel"] + parent = carrier_to_file.get(rel) + if parent is None: + stem = kebab(path.stem) + parent = stem_to_file.get(stem) or stem_to_file.get(path.stem) + if parent is None: + missing_parent += 1 + continue + kind = "behavior" + rewrite_parent(parent, feat, kind) + rewrite_examples(parent, feat) + +# Unimplemented remaining/current: copy sanitized prose into Intent description +for folder in ("remaining", "current"): + src_dir = ROOT / "docs-living" / folder + dest_dir = SPECS / "unimplemented" / folder + if not dest_dir.is_dir(): + continue + for dest in dest_dir.glob("*.sdp.md"): + src = src_dir / (spec_stem(dest) + ".md") + if not src.exists(): + continue + raw = src.read_text(errors="ignore") + # drop tables + raw = re.sub(r"(?m)^\s*\|.*$", " ", raw) + raw = re.sub(r"[#*`]", " ", raw) + prose = sanitize_prose(raw, 800) + old = dest.read_text() + fm = re.match(r"^---\n(.*?)\n---\n", old, re.S) + if not fm: + continue + title_m = re.search(r"^#\s+(.+)$", old, re.M) + title = title_m.group(1) if title_m else dest.stem + outcome_m = re.search(r"^- outcome:\s+(.+)$", old, re.M) + outcome = outcome_m.group(1) if outcome_m else prose[:300] + body = ( + f"---\n{fm.group(1)}\n---\n# {yaml_escape_title(title)}\n\n## Intent\n\n" + f"{prose}\n\n- outcome: {sanitize_prose(outcome, 400)}\n" + ) + write(dest, body) + rewritten_unimpl += 1 + +# Unimplemented deliverables: attach parent problem/solution as problem/value +parent_by_id = {sid: p for p, sid in id_of.items()} +for dest in (SPECS / "unimplemented" / "deliverables").rglob("*.sdp.md"): + old = dest.read_text() + fm = re.match(r"^---\n(.*?)\n---\n", old, re.S) + if not fm: + continue + ref = re.search(r"refines:\s*(\S+)", fm.group(1)) + title_m = re.search(r"^#\s+(.+)$", old, re.M) + title = title_m.group(1) if title_m else dest.stem + loc_m = re.search(r" at ([^.\n]+)", old) + loc = loc_m.group(1).strip() if loc_m else "" + problem = "" + if ref and ref.group(1) in {id_of[p] for p in id_of}: + parent_path = next((p for p, sid in id_of.items() if sid == ref.group(1)), None) + if parent_path and parent_path.exists(): + pt = parent_path.read_text() + pm = re.search(r"^- problem:\s+(.+)$", pt, re.M) + if pm: + problem = pm.group(1) + outcome = sanitize_prose( + f"Unimplemented deliverable: {title}" + (f" at {loc}" if loc else ""), + 400, + ) + lines = [f"- outcome: {outcome}"] + if problem: + lines.append(f"- problem: {sanitize_prose(problem, 400)}") + body = f"---\n{fm.group(1)}\n---\n# {yaml_escape_title(title)}\n\n## Intent\n\n" + "\n".join(lines) + "\n" + write(dest, body) + rewritten_unimpl += 1 + +print( + { + "rewritten_parents": rewritten_parents, + "rewritten_examples": rewritten_examples, + "gwt_examples": gwt_examples, + "rewritten_unimpl": rewritten_unimpl, + "missing_parent": missing_parent, + "features": len(walk_features()), + } +) diff --git a/specs/behavior/frontend/admin/add-stock.examples/s-001-add-stock-successfully.sdp.md b/specs/behavior/frontend/admin/add-stock.examples/s-001-add-stock-successfully.sdp.md index 78d67e93..0320bf99 100644 --- a/specs/behavior/frontend/admin/add-stock.examples/s-001-add-stock-successfully.sdp.md +++ b/specs/behavior/frontend/admin/add-stock.examples/s-001-add-stock-successfully.sdp.md @@ -6,8 +6,17 @@ readiness: idea relations: refines: spec:behavior.frontend.admin.add-stock --- -# Add stock successfully +# Successfully add stock to existing product ## Intent -- outcome: Executable scenario "Add stock successfully" from apps/frontend/tests/e2e/features/admin/add-stock.feature +- outcome: Executable scenario: Successfully add stock to existing product + +```gwt +Given the backend is running and clean +And a product "prod-stock-01" exists with 0 stock +When I add stock to product "prod-stock-01": +Then the command should succeed +And I wait for projections to process +And the product "prod-stock-01" should have 50 available stock +``` diff --git a/specs/behavior/frontend/admin/add-stock.examples/s-002-add-stock-with-reason.sdp.md b/specs/behavior/frontend/admin/add-stock.examples/s-002-add-stock-with-reason.sdp.md index 3b717126..c8174653 100644 --- a/specs/behavior/frontend/admin/add-stock.examples/s-002-add-stock-with-reason.sdp.md +++ b/specs/behavior/frontend/admin/add-stock.examples/s-002-add-stock-with-reason.sdp.md @@ -6,8 +6,14 @@ readiness: idea relations: refines: spec:behavior.frontend.admin.add-stock --- -# Add stock with reason +# Reject adding stock to non-existent product ## Intent -- outcome: Executable scenario "Add stock with reason" from apps/frontend/tests/e2e/features/admin/add-stock.feature +- outcome: Executable scenario: Reject adding stock to non-existent product + +```gwt +Given the backend is running and clean +When I add stock to product "prod-nonexistent": +Then the command should be rejected with code "PRODUCT_NOT_FOUND" +``` diff --git a/specs/behavior/frontend/admin/add-stock.examples/s-003-cannot-add-stock-without-selecting-product.sdp.md b/specs/behavior/frontend/admin/add-stock.examples/s-003-cannot-add-stock-without-selecting-product.sdp.md index a4a25ced..b8dd0181 100644 --- a/specs/behavior/frontend/admin/add-stock.examples/s-003-cannot-add-stock-without-selecting-product.sdp.md +++ b/specs/behavior/frontend/admin/add-stock.examples/s-003-cannot-add-stock-without-selecting-product.sdp.md @@ -6,8 +6,15 @@ readiness: idea relations: refines: spec:behavior.frontend.admin.add-stock --- -# Cannot add stock without selecting product +# AddStock is idempotent with same commandId ## Intent -- outcome: Executable scenario "Cannot add stock without selecting product" from apps/frontend/tests/e2e/features/admin/add-stock.feature +- outcome: Executable scenario: AddStock is idempotent with same commandId + +```gwt +Given the backend is running and clean +And a product "prod-stock-02" exists with 10 stock +When I add stock with commandId "cmd-stock-idem-01" to product "prod-stock-02": and I repeat adding stock with commandId "cmd-stock-idem-01" to product "prod-stock-02": +Then the second command should return duplicate status +``` diff --git a/specs/behavior/frontend/admin/add-stock.examples/s-004-cannot-add-zero-quantity.sdp.md b/specs/behavior/frontend/admin/add-stock.examples/s-004-cannot-add-zero-quantity.sdp.md index 58953e3e..89110aa0 100644 --- a/specs/behavior/frontend/admin/add-stock.examples/s-004-cannot-add-zero-quantity.sdp.md +++ b/specs/behavior/frontend/admin/add-stock.examples/s-004-cannot-add-zero-quantity.sdp.md @@ -6,8 +6,15 @@ readiness: idea relations: refines: spec:behavior.frontend.admin.add-stock --- -# Cannot add zero quantity +# AddStock is idempotent with same commandId ## Intent -- outcome: Executable scenario "Cannot add zero quantity" from apps/frontend/tests/e2e/features/admin/add-stock.feature +- outcome: Executable scenario: AddStock is idempotent with same commandId + +```gwt +Given the system is ready +And a product "prod_stock_003" exists with stock +When I send an AddStock command twice with the same commandId for product "prod_stock_003" +Then the second command should return duplicate status +``` diff --git a/specs/behavior/frontend/admin/add-stock.examples/s-005-cannot-add-stock-without-quantity.sdp.md b/specs/behavior/frontend/admin/add-stock.examples/s-005-cannot-add-stock-without-quantity.sdp.md index ebbf835e..acb0c28f 100644 --- a/specs/behavior/frontend/admin/add-stock.examples/s-005-cannot-add-stock-without-quantity.sdp.md +++ b/specs/behavior/frontend/admin/add-stock.examples/s-005-cannot-add-stock-without-quantity.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cannot add stock without quantity" from apps/frontend/tests/e2e/features/admin/add-stock.feature +- outcome: Executable scenario: Cannot add stock without quantity + +```gwt +Given a product "Stock Test Widget" with SKU "STW-001" exists +And I am on the admin products page +When I switch to the "Add Stock" tab and I select the product "Stock Test Widget" and I click "Add Stock" +Then I should see validation error "Quantity is required" +``` diff --git a/specs/behavior/frontend/admin/add-stock.sdp.md b/specs/behavior/frontend/admin/add-stock.sdp.md index 5d55738e..07192ce0 100644 --- a/specs/behavior/frontend/admin/add-stock.sdp.md +++ b/specs/behavior/frontend/admin/add-stock.sdp.md @@ -6,8 +6,9 @@ readiness: idea relations: refines: spec:behavior.frontend --- -# Add Stock (Admin) +# Add Stock (Integration) ## Intent -- outcome: to add stock to existing products so that products are available for customers to order (test carrier: apps/frontend/tests/e2e/features/admin/add-stock.feature) +- actor: an inventory manager +- outcome: to add stock to existing products so that products are available for sale diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-001-view-agents-dashboard-with-pending-approvals.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-001-view-agents-dashboard-with-pending-approvals.sdp.md index cec8f281..77b8d874 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-001-view-agents-dashboard-with-pending-approvals.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-001-view-agents-dashboard-with-pending-approvals.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "View agents dashboard with pending approvals" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: View agents dashboard with pending approvals + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there are pending agent approvals in the system +When I view the agents dashboard +Then I should see the pending approvals count +And I should see the active agents count +And I should see the total events processed count +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-002-view-agents-dashboard-with-no-pending-approvals.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-002-view-agents-dashboard-with-no-pending-approvals.sdp.md index 70758b35..6ad6ac49 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-002-view-agents-dashboard-with-no-pending-approvals.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-002-view-agents-dashboard-with-no-pending-approvals.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "View agents dashboard with no pending approvals" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: View agents dashboard with no pending approvals + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there are no pending approvals +When I view the agents dashboard +Then I should see the pending approvals count as "0" +And the "Pending Approvals" tab should not show a badge +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-003-navigate-to-approval-detail-from-dashboard.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-003-navigate-to-approval-detail-from-dashboard.sdp.md index 2b951b34..67276459 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-003-navigate-to-approval-detail-from-dashboard.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-003-navigate-to-approval-detail-from-dashboard.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Navigate to approval detail from dashboard" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Navigate to approval detail from dashboard + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is a pending approval "SuggestCustomerOutreach" from "churn-risk-agent" +When I click on the approval card +Then I should be navigated to the approval detail page +And I should see the action type "SuggestCustomerOutreach" +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-004-view-approval-list-with-pending-approvals.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-004-view-approval-list-with-pending-approvals.sdp.md index 24a93b1f..87fcbbc3 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-004-view-approval-list-with-pending-approvals.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-004-view-approval-list-with-pending-approvals.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "View approval list with pending approvals" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: View approval list with pending approvals + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there are multiple pending approvals +When I view the "Pending Approvals" tab +Then I should see approval cards in a grid layout +And each card should display the action type +And each card should display the agent ID +And each card should display the confidence level with text label +And each card should display the expiration time +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-005-filter-approvals-by-status.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-005-filter-approvals-by-status.sdp.md index 2b281cc6..d3c6c496 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-005-filter-approvals-by-status.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-005-filter-approvals-by-status.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Filter approvals by status" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Filter approvals by status + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there are approvals with mixed statuses +When I filter approvals by "approved" status +Then I should only see approvals with "Approved" status badge +And the count should match the filter +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-006-click-approval-card-to-navigate-to-detail.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-006-click-approval-card-to-navigate-to-detail.sdp.md index a2c2d6ab..3b716eeb 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-006-click-approval-card-to-navigate-to-detail.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-006-click-approval-card-to-navigate-to-detail.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Click approval card to navigate to detail" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Click approval card to navigate to detail + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is a pending approval +When I click on an approval card +Then I should be navigated to "/admin/agents/approvals/{approvalId}" +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-007-view-pending-approval-detail.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-007-view-pending-approval-detail.sdp.md index a8a9ee85..8805bf46 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-007-view-pending-approval-detail.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-007-view-pending-approval-detail.sdp.md @@ -10,4 +10,19 @@ relations: ## Intent -- outcome: Executable scenario "View pending approval detail" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: View pending approval detail + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is a pending approval with confidence 0.75 +When I view the approval detail +Then I should see the action type +And I should see the agent ID +And I should see the confidence badge showing "Medium: 75%" +And I should see the reason/analysis text +And I should see the action payload in JSON format +And I should see the triggering event IDs +And I should see the creation time +And I should see the expiration countdown +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-008-view-already-approved-approval.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-008-view-already-approved-approval.sdp.md index 69a89b01..0afe5bae 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-008-view-already-approved-approval.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-008-view-already-approved-approval.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "View already approved approval" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: View already approved approval + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is an approved approval with reviewer "admin-001" +When I view the approval detail +Then I should see the "Approved" status badge +And I should see the reviewer ID "admin-001" +And I should see the review timestamp +And I should see the review note if present +And I should not see the action panel +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-009-view-already-rejected-approval.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-009-view-already-rejected-approval.sdp.md index 4424cf99..20ae1f57 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-009-view-already-rejected-approval.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-009-view-already-rejected-approval.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "View already rejected approval" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: View already rejected approval + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is a rejected approval +When I view the approval detail +Then I should see the "Rejected" status badge +And I should see the reviewer information +And I should not see the action panel +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-010-view-expired-approval.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-010-view-expired-approval.sdp.md index 3421c4c6..c93db51f 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-010-view-expired-approval.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-010-view-expired-approval.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "View expired approval" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: View expired approval + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is an expired approval +When I view the approval detail +Then I should see the "Expired" status badge +And I should not see the action panel +And I should see a visual indicator that no action can be taken +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-011-confidence-conveyed-via-text-label-wcag-1-4-1.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-011-confidence-conveyed-via-text-label-wcag-1-4-1.sdp.md index f9fbfd7c..5cf6ea49 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-011-confidence-conveyed-via-text-label-wcag-1-4-1.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-011-confidence-conveyed-via-text-label-wcag-1-4-1.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Confidence conveyed via text label (WCAG 1.4.1)" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Confidence conveyed via text label (WCAG 1.4.1) + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is a pending approval with confidence 0.55 +When I view the approval detail +Then the confidence badge should show "Low: 55%" +And the confidence level should be conveyed through text, not color alone +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-012-approve-pending-action-with-note.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-012-approve-pending-action-with-note.sdp.md index 8fd7803a..631e4c6f 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-012-approve-pending-action-with-note.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-012-approve-pending-action-with-note.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Approve pending action with note" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Approve pending action with note + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is a pending approval that I can act on +When I enter a review note "Verified customer history, proceeding with outreach" and I click "Approve" +Then I should see the button text change to "Approving..." +And both action buttons should be disabled +And I should be redirected to the approvals list +And I should see a success indication +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-013-reject-pending-action-with-note.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-013-reject-pending-action-with-note.sdp.md index c4b9e704..1f5eea57 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-013-reject-pending-action-with-note.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-013-reject-pending-action-with-note.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Reject pending action with note" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Reject pending action with note + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is a pending approval that I can act on +When I enter a review note "False positive - customer already retained" and I click "Reject" +Then I should see the button text change to "Rejecting..." +And I should be redirected to the approvals list +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-014-approve-without-note.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-014-approve-without-note.sdp.md index 9c1d1696..52185bd9 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-014-approve-without-note.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-014-approve-without-note.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Approve without note" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Approve without note + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is a pending approval +When I click "Approve" without entering a note +Then the action should still succeed +And the review note should be empty in the audit record +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-015-error-during-approve-action.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-015-error-during-approve-action.sdp.md index 3b77eaff..836f2048 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-015-error-during-approve-action.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-015-error-during-approve-action.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Error during approve action" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Error during approve action + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is a pending approval +And the backend will return an error +When I click "Approve" +Then I should see an error alert +And the alert should have role="alert" for screen reader announcement +And the buttons should become enabled again +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-016-cannot-act-on-expired-approvals.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-016-cannot-act-on-expired-approvals.sdp.md index c790916a..282f0a3d 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-016-cannot-act-on-expired-approvals.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-016-cannot-act-on-expired-approvals.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Cannot act on expired approvals" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Cannot act on expired approvals + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is an approval that just expired +When I view the approval detail +Then I should not see the "Take Action" panel +And I should see the "Expired" status +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-017-view-active-agents-in-monitoring-tab.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-017-view-active-agents-in-monitoring-tab.sdp.md index de8191bf..a4dd812f 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-017-view-active-agents-in-monitoring-tab.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-017-view-active-agents-in-monitoring-tab.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: Executable scenario "View active agents in monitoring tab" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: View active agents in monitoring tab + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there are active agents processing events +When I click the "Monitoring" tab +Then I should see agent checkpoint cards +And each card should display the agent ID +And each card should display events processed count +And each card should display last processed position +And each card should display status badge +And each card should display last updated time +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-018-view-agent-checkpoint-details.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-018-view-agent-checkpoint-details.sdp.md index a9cf3f04..a6751aa7 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-018-view-agent-checkpoint-details.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-018-view-agent-checkpoint-details.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "View agent checkpoint details" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: View agent checkpoint details + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is an agent "churn-risk-agent" with 1247 events processed +When I view the monitoring tab +Then I should see "churn-risk-agent" card +And the events processed should show "1,247" +And the status should show "Active" +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-019-no-active-agents.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-019-no-active-agents.sdp.md index 20b32215..24122344 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-019-no-active-agents.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-019-no-active-agents.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "No active agents" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: No active agents + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there are no agent checkpoints +When I view the monitoring tab +Then I should see an empty state message +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-020-view-agent-decision-history.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-020-view-agent-decision-history.sdp.md index 1eb4c53f..db856928 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-020-view-agent-decision-history.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-020-view-agent-decision-history.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "View agent decision history" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: View agent decision history + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And the agent has made decisions in the past +When I click the "Decision History" tab +Then I should see a list of past agent decisions +And each decision should display the event type +And each decision should display the timestamp +And each decision should display the confidence level +And each decision should display the action taken +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-021-view-decision-detail-with-reasoning.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-021-view-decision-detail-with-reasoning.sdp.md index 4d20d5f1..65a8bf18 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-021-view-decision-detail-with-reasoning.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-021-view-decision-detail-with-reasoning.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "View decision detail with reasoning" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: View decision detail with reasoning + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And the agent has made a decision with ID "dec_123" +When I click on the decision in the history list +Then I should see the full reasoning text +And I should see the triggering event IDs +And I should see whether approval was required +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-022-empty-decision-history.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-022-empty-decision-history.sdp.md index 804b97a8..387ee8f0 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-022-empty-decision-history.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-022-empty-decision-history.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Empty decision history" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Empty decision history + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And the agent has not made any decisions yet +When I view the "Decision History" tab +Then I should see an empty state message +And the message should explain what will appear here +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-023-view-customers-approaching-churn-threshold.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-023-view-customers-approaching-churn-threshold.sdp.md index ddadf6c6..38b739be 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-023-view-customers-approaching-churn-threshold.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-023-view-customers-approaching-churn-threshold.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "View customers approaching churn threshold" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: View customers approaching churn threshold + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And customers exist with the following cancellation counts: +When I view the "Risk Preview" section +Then I should see customers ordered by proximity to threshold +And I should see "cust_alice" with progress "2/3" +And I should see "cust_bob" with progress "1/3" +And I should not see "cust_charlie" (no cancellations) +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-024-customer-risk-progress-indicator.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-024-customer-risk-progress-indicator.sdp.md index 590dc431..23a03cd1 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-024-customer-risk-progress-indicator.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-024-customer-risk-progress-indicator.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Customer risk progress indicator" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Customer risk progress indicator + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And customer "cust_at_risk" has 2 of 3 cancellations +When I view the risk preview +Then the progress bar for "cust_at_risk" should show approximately 66% +And the progress should be accessible (not color-only per WCAG 1.4.1) +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-025-no-customers-approaching-threshold.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-025-no-customers-approaching-threshold.sdp.md index f97b21a3..8b132deb 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-025-no-customers-approaching-threshold.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-025-no-customers-approaching-threshold.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "No customers approaching threshold" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: No customers approaching threshold + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And no customers have any cancellations +When I view the risk preview +Then I should see a message indicating no customers are at risk +And the message should explain what will appear here +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-026-navigate-to-low-stock-restock-approval-detail.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-026-navigate-to-low-stock-restock-approval-detail.sdp.md index 56d04447..2260c595 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-026-navigate-to-low-stock-restock-approval-detail.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-026-navigate-to-low-stock-restock-approval-detail.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Navigate to low stock restock approval detail" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Navigate to low stock restock approval detail + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is a pending approval "SuggestRestock" from "low-stock-alert-agent" +When I click on the approval card +Then I should be navigated to the approval detail page +And I should see the action type "SuggestRestock" +And I should see the product ID in the payload +And I should see the recommended restock quantity +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-027-view-low-stock-alert-approval-with-product-context.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-027-view-low-stock-alert-approval-with-product-context.sdp.md index 990b5be9..25936e6f 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-027-view-low-stock-alert-approval-with-product-context.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-027-view-low-stock-alert-approval-with-product-context.sdp.md @@ -10,4 +10,19 @@ relations: ## Intent -- outcome: Executable scenario "View low stock alert approval with product context" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: View low stock alert approval with product context + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is a pending approval "SuggestRestock" with confidence 0.85 +When I view the approval detail +Then I should see the action type "SuggestRestock" +And I should see the agent ID "low-stock-alert-agent" +And I should see the confidence badge showing "High: 85%" +And I should see the reason explaining low stock detected +And the payload should include "productId" +And the payload should include "currentQuantity" +And the payload should include "recommendedQuantity" +And the payload should include "threshold" +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-028-approve-low-stock-restock-suggestion.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-028-approve-low-stock-restock-suggestion.sdp.md index 9aafcad2..b4e9906e 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-028-approve-low-stock-restock-suggestion.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-028-approve-low-stock-restock-suggestion.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Approve low stock restock suggestion" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Approve low stock restock suggestion + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is a pending approval "SuggestRestock" that I can act on +When I enter a review note "Approved - ordering 50 units from supplier" and I click "Approve" +Then I should see the button text change to "Approving..." +And I should be redirected to the approvals list +And I should see a success indication +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-029-reject-low-stock-restock-suggestion.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-029-reject-low-stock-restock-suggestion.sdp.md index 37146105..5764d073 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-029-reject-low-stock-restock-suggestion.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-029-reject-low-stock-restock-suggestion.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Reject low stock restock suggestion" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Reject low stock restock suggestion + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is a pending approval "SuggestRestock" that I can act on +When I enter a review note "Product being discontinued - no restock needed" and I click "Reject" +Then I should see the button text change to "Rejecting..." +And I should be redirected to the approvals list +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-030-navigate-to-high-value-order-vip-review-approval-detail.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-030-navigate-to-high-value-order-vip-review-approval-detail.sdp.md index 243dcaee..17159162 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-030-navigate-to-high-value-order-vip-review-approval-detail.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-030-navigate-to-high-value-order-vip-review-approval-detail.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Navigate to high-value order VIP review approval detail" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Navigate to high-value order VIP review approval detail + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is a pending approval "FlagForVIPReview" from "high-value-order-agent" +When I click on the approval card +Then I should be navigated to the approval detail page +And I should see the action type "FlagForVIPReview" +And I should see the order ID in the payload +And I should see the order total amount +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-031-view-high-value-order-approval-with-order-context.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-031-view-high-value-order-approval-with-order-context.sdp.md index a89a5494..7b3c5215 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-031-view-high-value-order-approval-with-order-context.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-031-view-high-value-order-approval-with-order-context.sdp.md @@ -10,4 +10,19 @@ relations: ## Intent -- outcome: Executable scenario "View high-value order approval with order context" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: View high-value order approval with order context + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is a pending approval "FlagForVIPReview" with confidence 0.95 +When I view the approval detail +Then I should see the action type "FlagForVIPReview" +And I should see the agent ID "high-value-order-agent" +And I should see the confidence badge showing "High: 95%" +And I should see the reason explaining high-value order detected +And the payload should include "orderId" +And the payload should include "customerId" +And the payload should include "totalAmount" +And the payload should include "threshold" +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-032-approve-vip-review-for-high-value-order.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-032-approve-vip-review-for-high-value-order.sdp.md index 85db0a33..d0ab5625 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-032-approve-vip-review-for-high-value-order.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-032-approve-vip-review-for-high-value-order.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Approve VIP review for high-value order" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Approve VIP review for high-value order + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is a pending approval "FlagForVIPReview" that I can act on +When I enter a review note "VIP customer - expediting order processing" and I click "Approve" +Then I should see the button text change to "Approving..." +And I should be redirected to the approvals list +And I should see a success indication +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-033-reject-vip-review-flag.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-033-reject-vip-review-flag.sdp.md index 3b117c73..7262c90b 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-033-reject-vip-review-flag.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-033-reject-vip-review-flag.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Reject VIP review flag" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Reject VIP review flag + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is a pending approval "FlagForVIPReview" that I can act on +When I enter a review note "Standard processing sufficient - not a VIP account" and I click "Reject" +Then I should see the button text change to "Rejecting..." +And I should be redirected to the approvals list +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-034-navigate-to-order-consolidation-suggestion-approval-detail.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-034-navigate-to-order-consolidation-suggestion-approval-detail.sdp.md index 8217d822..1745fa57 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-034-navigate-to-order-consolidation-suggestion-approval-detail.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-034-navigate-to-order-consolidation-suggestion-approval-detail.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Navigate to order consolidation suggestion approval detail" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Navigate to order consolidation suggestion approval detail + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is a pending approval "SuggestOrderConsolidation" from "order-consolidation-agent" +When I click on the approval card +Then I should be navigated to the approval detail page +And I should see the action type "SuggestOrderConsolidation" +And I should see the customer ID in the payload +And I should see the list of order IDs to consolidate +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-035-view-order-consolidation-approval-with-order-list.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-035-view-order-consolidation-approval-with-order-list.sdp.md index cd945caf..2d910a62 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-035-view-order-consolidation-approval-with-order-list.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-035-view-order-consolidation-approval-with-order-list.sdp.md @@ -10,4 +10,20 @@ relations: ## Intent -- outcome: Executable scenario "View order consolidation approval with order list" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: View order consolidation approval with order list + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is a pending approval "SuggestOrderConsolidation" with confidence 0.80 +When I view the approval detail +Then I should see the action type "SuggestOrderConsolidation" +And I should see the agent ID "order-consolidation-agent" +And I should see the confidence badge showing "High: 80%" +And I should see the reason explaining multiple recent orders detected +And the payload should include "customerId" +And the payload should include "orderIds" +And the payload should include "orderCount" +And the payload should include "windowHours" +And the payload should include "potentialSavings" +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-036-approve-order-consolidation-suggestion.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-036-approve-order-consolidation-suggestion.sdp.md index d8e931c9..ed79e093 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-036-approve-order-consolidation-suggestion.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-036-approve-order-consolidation-suggestion.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Approve order consolidation suggestion" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Approve order consolidation suggestion + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is a pending approval "SuggestOrderConsolidation" that I can act on +When I enter a review note "Customer contacted - consolidating orders for single shipment" and I click "Approve" +Then I should see the button text change to "Approving..." +And I should be redirected to the approvals list +And I should see a success indication +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-037-reject-order-consolidation-suggestion.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-037-reject-order-consolidation-suggestion.sdp.md index f6e3bbd3..3aba0618 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-037-reject-order-consolidation-suggestion.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-037-reject-order-consolidation-suggestion.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Reject order consolidation suggestion" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Reject order consolidation suggestion + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there is a pending approval "SuggestOrderConsolidation" that I can act on +When I enter a review note "Customer requested separate deliveries to different addresses" and I click "Reject" +Then I should see the button text change to "Rejecting..." +And I should be redirected to the approvals list +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-038-view-decision-history-filtered-by-agent-type.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-038-view-decision-history-filtered-by-agent-type.sdp.md index e3c590e0..ba096914 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-038-view-decision-history-filtered-by-agent-type.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-038-view-decision-history-filtered-by-agent-type.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "View decision history filtered by agent type" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: View decision history filtered by agent type + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And decisions exist from multiple agents: +When I click the "Decision History" tab +Then I should see decisions from all agent types +And I should be able to filter by agent ID +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-039-view-low-stock-agent-decision-in-history.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-039-view-low-stock-agent-decision-in-history.sdp.md index f9a80778..d9235a4a 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-039-view-low-stock-agent-decision-in-history.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-039-view-low-stock-agent-decision-in-history.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "View low stock agent decision in history" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: View low stock agent decision in history + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And the "low-stock-alert-agent" has made a decision +When I click the "Decision History" tab and I click on the "SuggestRestock" decision +Then I should see the full reasoning text +And I should see the product ID that triggered the alert +And I should see whether approval was required +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-040-view-high-value-order-agent-decision-in-history.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-040-view-high-value-order-agent-decision-in-history.sdp.md index 2e5c0899..22a962ea 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-040-view-high-value-order-agent-decision-in-history.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-040-view-high-value-order-agent-decision-in-history.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "View high-value order agent decision in history" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: View high-value order agent decision in history + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And the "high-value-order-agent" has made a decision +When I click the "Decision History" tab and I click on the "FlagForVIPReview" decision +Then I should see the full reasoning text +And I should see the order total that triggered the flag +And I should see whether approval was required +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-041-view-order-consolidation-agent-decision-in-history.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-041-view-order-consolidation-agent-decision-in-history.sdp.md index 19d94e20..f0dbbba0 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-041-view-order-consolidation-agent-decision-in-history.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-041-view-order-consolidation-agent-decision-in-history.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "View order consolidation agent decision in history" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: View order consolidation agent decision in history + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And the "order-consolidation-agent" has made a decision +When I click the "Decision History" tab and I click on the "SuggestOrderConsolidation" decision +Then I should see the full reasoning text +And I should see the number of orders in the consolidation window +And I should see whether approval was required +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-042-view-products-approaching-low-stock-threshold.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-042-view-products-approaching-low-stock-threshold.sdp.md index 9310a207..4462c589 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-042-view-products-approaching-low-stock-threshold.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-042-view-products-approaching-low-stock-threshold.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "View products approaching low stock threshold" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: View products approaching low stock threshold + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And products exist with the following stock levels: +When I view the "Stock Preview" section +Then I should see products ordered by proximity to threshold +And I should see "prod_widget" with status "Critical (3/5)" +And I should see "prod_gadget" with status "Warning (8/5)" +And I should not see "prod_gizmo" (well above threshold) +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-043-stock-level-progress-indicator.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-043-stock-level-progress-indicator.sdp.md index 357941b6..a851e5de 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-043-stock-level-progress-indicator.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-043-stock-level-progress-indicator.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Stock level progress indicator" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Stock level progress indicator + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And product "prod_at_risk" has 2 of 5 stock threshold +When I view the stock preview +Then the progress bar for "prod_at_risk" should show critical level +And the progress should be accessible (not color-only per WCAG 1.4.1) +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-044-approval-card-is-keyboard-accessible.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-044-approval-card-is-keyboard-accessible.sdp.md index b5bbdd3a..428c9099 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-044-approval-card-is-keyboard-accessible.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-044-approval-card-is-keyboard-accessible.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Approval card is keyboard accessible" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Approval card is keyboard accessible + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there are pending approvals +When I focus on an approval card using Tab key +Then the card should have visible focus indicator +And I should be able to activate it with Enter key +And I should be able to activate it with Space key +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-045-screen-reader-announces-action-status-changes.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-045-screen-reader-announces-action-status-changes.sdp.md index dddc996a..6d7ae4de 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-045-screen-reader-announces-action-status-changes.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-045-screen-reader-announces-action-status-changes.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Screen reader announces action status changes" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Screen reader announces action status changes + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And I am on an approval detail page +When I click "Approve" +Then the screen reader should announce "Approving action..." +And when the action completes, appropriate feedback should be provided +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-046-confidence-level-conveyed-via-text-not-just-color.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-046-confidence-level-conveyed-via-text-not-just-color.sdp.md index 05c98270..1497a3b8 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-046-confidence-level-conveyed-via-text-not-just-color.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-046-confidence-level-conveyed-via-text-not-just-color.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Confidence level conveyed via text not just color" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Confidence level conveyed via text not just color + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And there are approvals with different confidence levels +When I view the approval cards +Then each confidence badge should include text "High", "Medium", or "Low" +And the text should be readable without relying on color perception +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-047-focus-trap-in-action-buttons.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-047-focus-trap-in-action-buttons.sdp.md index 3e750d81..6720c76b 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-047-focus-trap-in-action-buttons.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-047-focus-trap-in-action-buttons.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Focus trap in action buttons" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Focus trap in action buttons + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And I am on an approval detail page with action panel +When I Tab through the page +Then focus should move through the review note textarea +And focus should move to the Reject button +And focus should move to the Approve button +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-048-handle-approval-not-found.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-048-handle-approval-not-found.sdp.md index 5271cf81..09046e9b 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-048-handle-approval-not-found.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-048-handle-approval-not-found.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Handle approval not found" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Handle approval not found + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And I navigate to an approval that does not exist +When the page loads +Then I should see "Approval not found" message +And I should see a link to go back to the approvals list +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-049-handle-network-error-loading-approvals.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-049-handle-network-error-loading-approvals.sdp.md index 0594b8fb..af3c90c8 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-049-handle-network-error-loading-approvals.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-049-handle-network-error-loading-approvals.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Handle network error loading approvals" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Handle network error loading approvals + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And the backend is temporarily unavailable +When I try to load the approvals list and I click "Retry" and the backend recovers +Then I should see an error message +And I should see a "Retry" button +And the approvals should load successfully +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-050-route-level-error-boundary.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-050-route-level-error-boundary.sdp.md index 52cc707e..595270cb 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-050-route-level-error-boundary.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-050-route-level-error-boundary.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Route-level error boundary" from apps/frontend/tests/e2e/features/admin/agent-approvals.feature +- outcome: Executable scenario: Route-level error boundary + +```gwt +Given I am logged in as an admin +And I am on the agents admin page +And the approval detail page encounters an unexpected error +When the error is caught by the error boundary +Then I should see a user-friendly error message +And I should see a way to navigate back or retry +``` diff --git a/specs/behavior/frontend/admin/agent-approvals.sdp.md b/specs/behavior/frontend/admin/agent-approvals.sdp.md index 884cf76d..bf166d1a 100644 --- a/specs/behavior/frontend/admin/agent-approvals.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: to review and act on AI agent recommendations so that automated actions require human oversight before execution (test carrier: apps/frontend/tests/e2e/features/admin/agent-approvals.feature) +- actor: an admin user +- outcome: to review and act on AI agent recommendations so that automated actions require human oversight before execution diff --git a/specs/behavior/frontend/admin/create-product.examples/s-001-create-product-successfully.sdp.md b/specs/behavior/frontend/admin/create-product.examples/s-001-create-product-successfully.sdp.md index 4d2e93a8..18f6ecfa 100644 --- a/specs/behavior/frontend/admin/create-product.examples/s-001-create-product-successfully.sdp.md +++ b/specs/behavior/frontend/admin/create-product.examples/s-001-create-product-successfully.sdp.md @@ -6,8 +6,17 @@ readiness: idea relations: refines: spec:behavior.frontend.admin.create-product --- -# Create product successfully +# Successfully create a new product and verify projection ## Intent -- outcome: Executable scenario "Create product successfully" from apps/frontend/tests/e2e/features/admin/create-product.feature +- outcome: Executable scenario: Successfully create a new product and verify projection + +```gwt +Given the backend is running and clean +When I create a product with: +Then the command should succeed +And I wait for projections to process +And the product "prod-int-01" should exist with name "Test Widget" +And the product "prod-int-01" should have 0 available stock +``` diff --git a/specs/behavior/frontend/admin/create-product.examples/s-002-validation-errors-on-empty-form.sdp.md b/specs/behavior/frontend/admin/create-product.examples/s-002-validation-errors-on-empty-form.sdp.md index 7db1d9cf..e55389c7 100644 --- a/specs/behavior/frontend/admin/create-product.examples/s-002-validation-errors-on-empty-form.sdp.md +++ b/specs/behavior/frontend/admin/create-product.examples/s-002-validation-errors-on-empty-form.sdp.md @@ -6,8 +6,15 @@ readiness: idea relations: refines: spec:behavior.frontend.admin.create-product --- -# Validation errors on empty form +# Reject duplicate product ID ## Intent -- outcome: Executable scenario "Validation errors on empty form" from apps/frontend/tests/e2e/features/admin/create-product.feature +- outcome: Executable scenario: Reject duplicate product ID + +```gwt +Given the backend is running and clean +And a product "prod-int-02" exists +When I create a product with: +Then the command should be rejected with code "PRODUCT_ALREADY_EXISTS" +``` diff --git a/specs/behavior/frontend/admin/create-product.examples/s-003-invalid-sku-format.sdp.md b/specs/behavior/frontend/admin/create-product.examples/s-003-invalid-sku-format.sdp.md index bf06bec3..705043c6 100644 --- a/specs/behavior/frontend/admin/create-product.examples/s-003-invalid-sku-format.sdp.md +++ b/specs/behavior/frontend/admin/create-product.examples/s-003-invalid-sku-format.sdp.md @@ -6,8 +6,15 @@ readiness: idea relations: refines: spec:behavior.frontend.admin.create-product --- -# Invalid SKU format +# Reject duplicate SKU ## Intent -- outcome: Executable scenario "Invalid SKU format" from apps/frontend/tests/e2e/features/admin/create-product.feature +- outcome: Executable scenario: Reject duplicate SKU + +```gwt +Given the backend is running and clean +And a product with SKU "SKU-DUP-001" exists +When I create a product with: +Then the command should be rejected with code "SKU_ALREADY_EXISTS" +``` diff --git a/specs/behavior/frontend/admin/create-product.examples/s-004-invalid-price-zero-value.sdp.md b/specs/behavior/frontend/admin/create-product.examples/s-004-invalid-price-zero-value.sdp.md index 983e8482..c1c81621 100644 --- a/specs/behavior/frontend/admin/create-product.examples/s-004-invalid-price-zero-value.sdp.md +++ b/specs/behavior/frontend/admin/create-product.examples/s-004-invalid-price-zero-value.sdp.md @@ -6,8 +6,14 @@ readiness: idea relations: refines: spec:behavior.frontend.admin.create-product --- -# Invalid price - zero value +# CreateProduct is idempotent with same commandId ## Intent -- outcome: Executable scenario "Invalid price - zero value" from apps/frontend/tests/e2e/features/admin/create-product.feature +- outcome: Executable scenario: CreateProduct is idempotent with same commandId + +```gwt +Given the backend is running and clean +When I create a product with commandId "cmd-prod-idem-01": and I repeat creating a product with commandId "cmd-prod-idem-01": +Then the second command should return duplicate status +``` diff --git a/specs/behavior/frontend/admin/create-product.examples/s-005-invalid-price-exceeds-maximum.sdp.md b/specs/behavior/frontend/admin/create-product.examples/s-005-invalid-price-exceeds-maximum.sdp.md index dd3f9e6e..5dfd6c7f 100644 --- a/specs/behavior/frontend/admin/create-product.examples/s-005-invalid-price-exceeds-maximum.sdp.md +++ b/specs/behavior/frontend/admin/create-product.examples/s-005-invalid-price-exceeds-maximum.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Invalid price - exceeds maximum" from apps/frontend/tests/e2e/features/admin/create-product.feature +- outcome: Executable scenario: Invalid price - exceeds maximum + +```gwt +Given I am on the admin products page +When I fill in the product name "Expensive Product" and I fill in the SKU "EXP-001" and I fill in the price "100000" and I click "Create Product" +Then I should see validation error "Unit price cannot exceed $99,999.99" +``` diff --git a/specs/behavior/frontend/admin/create-product.sdp.md b/specs/behavior/frontend/admin/create-product.sdp.md index 07e5287f..1e6f9440 100644 --- a/specs/behavior/frontend/admin/create-product.sdp.md +++ b/specs/behavior/frontend/admin/create-product.sdp.md @@ -6,8 +6,9 @@ readiness: idea relations: refines: spec:behavior.frontend --- -# Create Product (Admin) +# Create Product (Integration) ## Intent -- outcome: to create new products in the system so that customers can order them (test carrier: apps/frontend/tests/e2e/features/admin/create-product.feature) +- actor: an inventory manager +- outcome: to create new products in the catalog so that they can be sold and tracked diff --git a/specs/behavior/frontend/dashboard/dashboard.examples/s-001-view-dashboard-stats.sdp.md b/specs/behavior/frontend/dashboard/dashboard.examples/s-001-view-dashboard-stats.sdp.md index 49a1b07e..1f0c8836 100644 --- a/specs/behavior/frontend/dashboard/dashboard.examples/s-001-view-dashboard-stats.sdp.md +++ b/specs/behavior/frontend/dashboard/dashboard.examples/s-001-view-dashboard-stats.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "View dashboard stats" from apps/frontend/tests/e2e/features/dashboard/dashboard.feature +- outcome: Executable scenario: View dashboard stats + +```gwt +Given products and orders exist in the system +When I navigate to the dashboard +Then I should see the product count +And I should see the order count +And I should see the pending orders count +``` diff --git a/specs/behavior/frontend/dashboard/dashboard.examples/s-002-show-low-stock-warning.sdp.md b/specs/behavior/frontend/dashboard/dashboard.examples/s-002-show-low-stock-warning.sdp.md index e314f77a..7e9a9de1 100644 --- a/specs/behavior/frontend/dashboard/dashboard.examples/s-002-show-low-stock-warning.sdp.md +++ b/specs/behavior/frontend/dashboard/dashboard.examples/s-002-show-low-stock-warning.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Show low stock warning" from apps/frontend/tests/e2e/features/dashboard/dashboard.feature +- outcome: Executable scenario: Show low stock warning + +```gwt +Given a product with low stock exists +When I navigate to the dashboard +Then I should see the low stock warning +``` diff --git a/specs/behavior/frontend/dashboard/dashboard.examples/s-003-quick-action-navigates-to-create-order.sdp.md b/specs/behavior/frontend/dashboard/dashboard.examples/s-003-quick-action-navigates-to-create-order.sdp.md index 6fc03fe8..85624292 100644 --- a/specs/behavior/frontend/dashboard/dashboard.examples/s-003-quick-action-navigates-to-create-order.sdp.md +++ b/specs/behavior/frontend/dashboard/dashboard.examples/s-003-quick-action-navigates-to-create-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Quick action navigates to create order" from apps/frontend/tests/e2e/features/dashboard/dashboard.feature +- outcome: Executable scenario: Quick action navigates to create order + +```gwt +Given the feature fixture is in place +When I am on the dashboard and I click the "New Order" quick action +Then I should be on the create order page +``` diff --git a/specs/behavior/frontend/dashboard/dashboard.sdp.md b/specs/behavior/frontend/dashboard/dashboard.sdp.md index 77f25b04..b82eafb8 100644 --- a/specs/behavior/frontend/dashboard/dashboard.sdp.md +++ b/specs/behavior/frontend/dashboard/dashboard.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: As a user I want to see system overview (test carrier: apps/frontend/tests/e2e/features/dashboard/dashboard.feature) +- actor: a user I want to see system overview +- outcome: Dashboard diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-001-complete-flow-product-creation-to-order-confirmation.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-001-complete-flow-product-creation-to-order-confirmation.sdp.md index f3148ef5..f3424fcc 100644 --- a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-001-complete-flow-product-creation-to-order-confirmation.sdp.md +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-001-complete-flow-product-creation-to-order-confirmation.sdp.md @@ -10,4 +10,20 @@ relations: ## Intent -- outcome: Executable scenario "Complete flow - Product creation to order confirmation" from apps/frontend/tests/e2e/features/e2e-journeys/full-order-journey.feature +- outcome: Executable scenario: Complete flow - Product creation to order confirmation + +```gwt +Given I am on the admin products page +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Journey Widget" and I enter quantity 100 and I click "Add Stock" and I navigate to the products page and I navigate to th… +Then I should see a success message containing "created successfully" +And I should see a success message containing "Stock added successfully" +And eventually I should see "Journey Widget" in the product list +And the product "Journey Widget" should show "100" units in stock +And the cart should show 5 items +And the cart total should be "$499.95" +And I should be redirected to the order detail page +And the order status should be "submitted" +And eventually the order status should be "confirmed" +And eventually the reservation status should be "Stock Reserved" +And eventually the product "Journey Widget" should show "95" units in stock +``` diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-002-order-fails-due-to-insufficient-stock-saga-compensation.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-002-order-fails-due-to-insufficient-stock-saga-compensation.sdp.md index 7116c741..bb47eb62 100644 --- a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-002-order-fails-due-to-insufficient-stock-saga-compensation.sdp.md +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-002-order-fails-due-to-insufficient-stock-saga-compensation.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Order fails due to insufficient stock - Saga compensation" from apps/frontend/tests/e2e/features/e2e-journeys/full-order-journey.feature +- outcome: Executable scenario: Order fails due to insufficient stock - Saga compensation + +```gwt +Given I am on the admin products page +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Limited Item" and I enter quantity 3 and I click "Add Stock" and I navigate to the create order page and I add "Limited I… +Then I should see a success message containing "created successfully" +And I should see a success message containing "Stock added successfully" +And I should be redirected to the order detail page +And eventually the order status should be "cancelled" +And eventually the reservation status should be "Reservation Failed" +And the product "Limited Item" should show "3" units in stock +``` diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-003-order-with-multiple-items.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-003-order-with-multiple-items.sdp.md index d0f310e3..92c350ff 100644 --- a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-003-order-with-multiple-items.sdp.md +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-003-order-with-multiple-items.sdp.md @@ -10,4 +10,20 @@ relations: ## Intent -- outcome: Executable scenario "Order with multiple items" from apps/frontend/tests/e2e/features/e2e-journeys/full-order-journey.feature +- outcome: Executable scenario: Order with multiple items + +```gwt +Given I am on the admin products page +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Product A" and I enter quantity 50 and I click "Add Stock" and I switch to the "Create Product" tab and I fill in product… +Then I should see a success message containing "created successfully" +And I should see a success message containing "Stock added" +And I should see a success message containing "created successfully" +And I should see a success message containing "Stock added" +And eventually the product "Product B" should show "30" units in Current Inventory +And the cart should show 5 items +And the cart total should be "$155.00" +And I should be redirected to the order detail page +And eventually the order status should be "confirmed" +And eventually the product "Product A" should show "48" units in stock +And the product "Product B" should show "27" units in stock +``` diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-004-multi-product-order-rejected-atomically-when-one-product-lacks-stock-dcb.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-004-multi-product-order-rejected-atomically-when-one-product-lacks-stock-dcb.sdp.md index 4693aec7..6df9a5b7 100644 --- a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-004-multi-product-order-rejected-atomically-when-one-product-lacks-stock-dcb.sdp.md +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-004-multi-product-order-rejected-atomically-when-one-product-lacks-stock-dcb.sdp.md @@ -10,4 +10,18 @@ relations: ## Intent -- outcome: Executable scenario "Multi-product order rejected atomically when one product lacks stock (DCB)" from apps/frontend/tests/e2e/features/e2e-journeys/full-order-journey.feature +- outcome: Executable scenario: Multi-product order rejected atomically when one product lacks stock (DCB) + +```gwt +Given I am on the admin products page +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "DCB Product High" and I enter quantity 100 and I click "Add Stock" and I switch to the "Create Product" tab and I fill in… +Then I should see a success message containing "created successfully" +And I should see a success message containing "Stock added" +And I should see a success message containing "created successfully" +And I should see a success message containing "Stock added" +And eventually the product "DCB Product Low" should show "5" units in Current Inventory +And I should be redirected to the order detail page +And eventually the order status should be "cancelled" +And the product "DCB Product High" should show "100" units in stock +And the product "DCB Product Low" should show "5" units in stock +``` diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-005-full-agent-trigger-journey-churn-risk-detection.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-005-full-agent-trigger-journey-churn-risk-detection.sdp.md index 76788942..a3118b71 100644 --- a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-005-full-agent-trigger-journey-churn-risk-detection.sdp.md +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-005-full-agent-trigger-journey-churn-risk-detection.sdp.md @@ -10,4 +10,28 @@ relations: ## Intent -- outcome: Executable scenario "Full agent trigger journey - Churn risk detection" from apps/frontend/tests/e2e/features/e2e-journeys/full-order-journey.feature +- outcome: Executable scenario: Full agent trigger journey - Churn risk detection + +```gwt +Given I am on the admin products page +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Agent Test Widget" and I enter quantity 100 and I click "Add Stock" and I navigate to the create order page and I add "Ag… +Then I should see a success message containing "created successfully" +And I should see a success message containing "Stock added" +And I should be redirected to the order detail page +And eventually the order status should be "confirmed" +And eventually the order status should be "cancelled" +And I should be redirected to the order detail page +And eventually the order status should be "confirmed" +And eventually the order status should be "cancelled" +And I should be redirected to the order detail page +And eventually the order status should be "confirmed" +And eventually the order status should be "cancelled" +And eventually I should see a pending approval +And the approval should be for "SuggestCustomerOutreach" +And the confidence should be displayed +And I should see a success indication +And I should be redirected to the approvals list +And I should see the approved decision in the history +And the decision should show action "SuggestCustomerOutreach" +And the decision should show status "approved" +``` diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-006-full-agent-trigger-journey-low-stock-alert-detection.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-006-full-agent-trigger-journey-low-stock-alert-detection.sdp.md index caa1f729..ecebfacf 100644 --- a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-006-full-agent-trigger-journey-low-stock-alert-detection.sdp.md +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-006-full-agent-trigger-journey-low-stock-alert-detection.sdp.md @@ -10,4 +10,23 @@ relations: ## Intent -- outcome: Executable scenario "Full agent trigger journey - Low stock alert detection" from apps/frontend/tests/e2e/features/e2e-journeys/full-order-journey.feature +- outcome: Executable scenario: Full agent trigger journey - Low stock alert detection + +```gwt +Given I am on the admin products page +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Low Stock Test Item" and I enter quantity 10 and I click "Add Stock" and I navigate to the create order page and I add "L… +Then I should see a success message containing "created successfully" +And I should see a success message containing "Stock added" +And I should be redirected to the order detail page +And eventually the order status should be "confirmed" +And I should be redirected to the order detail page +And eventually the order status should be "confirmed" +And eventually I should see a pending approval +And the approval should be for "SuggestRestock" +And the confidence should be displayed +And I should see a success indication +And I should be redirected to the approvals list +And I should see the approved decision in the history +And the decision should show action "SuggestRestock" +And the decision should show status "approved" +``` diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-007-full-agent-trigger-journey-high-value-order-detection.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-007-full-agent-trigger-journey-high-value-order-detection.sdp.md index 6a104277..5abf8e26 100644 --- a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-007-full-agent-trigger-journey-high-value-order-detection.sdp.md +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-007-full-agent-trigger-journey-high-value-order-detection.sdp.md @@ -10,4 +10,22 @@ relations: ## Intent -- outcome: Executable scenario "Full agent trigger journey - High-value order detection" from apps/frontend/tests/e2e/features/e2e-journeys/full-order-journey.feature +- outcome: Executable scenario: Full agent trigger journey - High-value order detection + +```gwt +Given I am on the admin products page +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Premium VIP Widget" and I enter quantity 50 and I click "Add Stock" and I navigate to the create order page and I add "Pr… +Then I should see a success message containing "created successfully" +And I should see a success message containing "Stock added" +And the cart total should be "$600.00" +And I should be redirected to the order detail page +And eventually the order status should be "confirmed" +And eventually I should see a pending approval +And the approval should be for "FlagForVIPReview" +And the confidence should be displayed +And I should see a success indication +And I should be redirected to the approvals list +And I should see the approved decision in the history +And the decision should show action "FlagForVIPReview" +And the decision should show status "approved" +``` diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-008-full-agent-trigger-journey-order-consolidation-suggestion.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-008-full-agent-trigger-journey-order-consolidation-suggestion.sdp.md index 52fa1858..1d8bde64 100644 --- a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-008-full-agent-trigger-journey-order-consolidation-suggestion.sdp.md +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-008-full-agent-trigger-journey-order-consolidation-suggestion.sdp.md @@ -10,4 +10,25 @@ relations: ## Intent -- outcome: Executable scenario "Full agent trigger journey - Order consolidation suggestion" from apps/frontend/tests/e2e/features/e2e-journeys/full-order-journey.feature +- outcome: Executable scenario: Full agent trigger journey - Order consolidation suggestion + +```gwt +Given I am on the admin products page +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Consolidation Widget" and I enter quantity 100 and I click "Add Stock" and I navigate to the create order page and I add… +Then I should see a success message containing "created successfully" +And I should see a success message containing "Stock added" +And I should be redirected to the order detail page +And eventually the order status should be "confirmed" +And I should be redirected to the order detail page +And eventually the order status should be "confirmed" +And I should be redirected to the order detail page +And eventually the order status should be "confirmed" +And eventually I should see a pending approval +And the approval should be for "SuggestOrderConsolidation" +And the confidence should be displayed +And I should see a success indication +And I should be redirected to the approvals list +And I should see the approved decision in the history +And the decision should show action "SuggestOrderConsolidation" +And the decision should show status "approved" +``` diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.sdp.md index 73546aa6..b3ba5af3 100644 --- a/specs/behavior/frontend/e2e-journeys/full-order-journey.sdp.md +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Complete end-to-end flow from product creation to order confirmation. This is the CRITICAL test that validates the entire DDD/ES/CQRS architecture including commands, events, projections, and sagas working together. (test carrier: apps/frontend/tests/e2e/features/e2e-journeys/full-order-journey.feature) +- outcome: Full Order Journey diff --git a/specs/behavior/frontend/orders/create-order.examples/s-001-create-and-submit-order-successfully.sdp.md b/specs/behavior/frontend/orders/create-order.examples/s-001-create-and-submit-order-successfully.sdp.md index d45254a4..f0c9bdc4 100644 --- a/specs/behavior/frontend/orders/create-order.examples/s-001-create-and-submit-order-successfully.sdp.md +++ b/specs/behavior/frontend/orders/create-order.examples/s-001-create-and-submit-order-successfully.sdp.md @@ -6,8 +6,17 @@ readiness: idea relations: refines: spec:behavior.frontend.orders.create-order --- -# Create and submit order successfully +# Successfully create a new order and verify projection ## Intent -- outcome: Executable scenario "Create and submit order successfully" from apps/frontend/tests/e2e/features/orders/create-order.feature +- outcome: Executable scenario: Successfully create a new order and verify projection + +```gwt +Given the backend is running and clean +When I create an order with: +Then the command should succeed +And I wait for projections to process +And the order "ord-int-01" should exist with status "draft" +And the order "ord-int-01" should have 0 items +``` diff --git a/specs/behavior/frontend/orders/create-order.examples/s-002-cannot-submit-empty-cart.sdp.md b/specs/behavior/frontend/orders/create-order.examples/s-002-cannot-submit-empty-cart.sdp.md index b6e637c0..c3f7f84e 100644 --- a/specs/behavior/frontend/orders/create-order.examples/s-002-cannot-submit-empty-cart.sdp.md +++ b/specs/behavior/frontend/orders/create-order.examples/s-002-cannot-submit-empty-cart.sdp.md @@ -6,8 +6,15 @@ readiness: idea relations: refines: spec:behavior.frontend.orders.create-order --- -# Cannot submit empty cart +# Reject duplicate order ID ## Intent -- outcome: Executable scenario "Cannot submit empty cart" from apps/frontend/tests/e2e/features/orders/create-order.feature +- outcome: Executable scenario: Reject duplicate order ID + +```gwt +Given the backend is running and clean +And an order "ord-int-02" exists +When I create an order with: +Then the command should be rejected with code "ORDER_ALREADY_EXISTS" +``` diff --git a/specs/behavior/frontend/orders/create-order.examples/s-003-update-quantity-in-cart.sdp.md b/specs/behavior/frontend/orders/create-order.examples/s-003-update-quantity-in-cart.sdp.md index ede77238..9a31927e 100644 --- a/specs/behavior/frontend/orders/create-order.examples/s-003-update-quantity-in-cart.sdp.md +++ b/specs/behavior/frontend/orders/create-order.examples/s-003-update-quantity-in-cart.sdp.md @@ -6,8 +6,14 @@ readiness: idea relations: refines: spec:behavior.frontend.orders.create-order --- -# Update quantity in cart +# CreateOrder is idempotent with same commandId ## Intent -- outcome: Executable scenario "Update quantity in cart" from apps/frontend/tests/e2e/features/orders/create-order.feature +- outcome: Executable scenario: CreateOrder is idempotent with same commandId + +```gwt +Given the backend is running and clean +When I create an order with commandId "cmd-idem-01": and I repeat creating an order with commandId "cmd-idem-01": +Then the second command should return duplicate status +``` diff --git a/specs/behavior/frontend/orders/create-order.examples/s-004-remove-item-from-cart.sdp.md b/specs/behavior/frontend/orders/create-order.examples/s-004-remove-item-from-cart.sdp.md index cd2dd28b..6926fe89 100644 --- a/specs/behavior/frontend/orders/create-order.examples/s-004-remove-item-from-cart.sdp.md +++ b/specs/behavior/frontend/orders/create-order.examples/s-004-remove-item-from-cart.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Remove item from cart" from apps/frontend/tests/e2e/features/orders/create-order.feature +- outcome: Executable scenario: Remove item from cart + +```gwt +Given products exist with stock +When I add two products to cart and I remove one product +Then only one product should remain +``` diff --git a/specs/behavior/frontend/orders/create-order.sdp.md b/specs/behavior/frontend/orders/create-order.sdp.md index 3b211abf..57a11e4e 100644 --- a/specs/behavior/frontend/orders/create-order.sdp.md +++ b/specs/behavior/frontend/orders/create-order.sdp.md @@ -6,8 +6,9 @@ readiness: idea relations: refines: spec:behavior.frontend --- -# Create Order +# Create Order (Integration) ## Intent -- outcome: Capture executable behavior formerly carried in this Gherkin feature. (test carrier: apps/frontend/tests/e2e/features/orders/create-order.feature) +- actor: a customer +- outcome: to create new orders so that I can purchase products diff --git a/specs/behavior/frontend/orders/order-detail.examples/s-001-view-confirmed-order.sdp.md b/specs/behavior/frontend/orders/order-detail.examples/s-001-view-confirmed-order.sdp.md index 438c5347..0c4898d9 100644 --- a/specs/behavior/frontend/orders/order-detail.examples/s-001-view-confirmed-order.sdp.md +++ b/specs/behavior/frontend/orders/order-detail.examples/s-001-view-confirmed-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "View confirmed order" from apps/frontend/tests/e2e/features/orders/order-detail.feature +- outcome: Executable scenario: View confirmed order + +```gwt +Given a confirmed order exists +When I navigate to that order +Then I should see status "confirmed" +And I should see "Stock Reserved" badge +``` diff --git a/specs/behavior/frontend/orders/order-detail.examples/s-002-view-cancelled-order.sdp.md b/specs/behavior/frontend/orders/order-detail.examples/s-002-view-cancelled-order.sdp.md index 5a414afa..31bd8775 100644 --- a/specs/behavior/frontend/orders/order-detail.examples/s-002-view-cancelled-order.sdp.md +++ b/specs/behavior/frontend/orders/order-detail.examples/s-002-view-cancelled-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "View cancelled order" from apps/frontend/tests/e2e/features/orders/order-detail.feature +- outcome: Executable scenario: View cancelled order + +```gwt +Given a cancelled order exists +When I navigate to that order +Then I should see status "cancelled" +And I should see the cancellation reason +``` diff --git a/specs/behavior/frontend/orders/order-detail.examples/s-003-order-detail-shows-instant-status-updates-via-reactive-projection.sdp.md b/specs/behavior/frontend/orders/order-detail.examples/s-003-order-detail-shows-instant-status-updates-via-reactive-projection.sdp.md index 3a62b078..55afa334 100644 --- a/specs/behavior/frontend/orders/order-detail.examples/s-003-order-detail-shows-instant-status-updates-via-reactive-projection.sdp.md +++ b/specs/behavior/frontend/orders/order-detail.examples/s-003-order-detail-shows-instant-status-updates-via-reactive-projection.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "Order detail shows instant status updates via reactive projection" from apps/frontend/tests/e2e/features/orders/order-detail.feature +- outcome: Executable scenario: Order detail shows instant status updates via reactive projection + +```gwt +Given I am on the admin products page +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Reactive Widget" and I enter quantity 50 and I click "Add Stock" and I navigate to the create order page and I add "React… +Then I should see a success message containing "created successfully" +And I should see a success message containing "Stock added" +And I should be redirected to the order detail page +And the order status should be "submitted" +And eventually the order status should be "confirmed" +And eventually the reservation status should be "Stock Reserved" +And eventually the product "Reactive Widget" should show "48" units in stock +``` diff --git a/specs/behavior/frontend/orders/order-detail.examples/s-004-cancel-a-submitted-order.sdp.md b/specs/behavior/frontend/orders/order-detail.examples/s-004-cancel-a-submitted-order.sdp.md index 950997d8..00672676 100644 --- a/specs/behavior/frontend/orders/order-detail.examples/s-004-cancel-a-submitted-order.sdp.md +++ b/specs/behavior/frontend/orders/order-detail.examples/s-004-cancel-a-submitted-order.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Cancel a submitted order" from apps/frontend/tests/e2e/features/orders/order-detail.feature +- outcome: Executable scenario: Cancel a submitted order + +```gwt +Given I am on the admin products page +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Cancel Widget" and I enter quantity 20 and I click "Add Stock" and I navigate to the create order page and I add "Cancel… +Then I should see a success message containing "created successfully" +And I should see a success message containing "Stock added" +And I should be redirected to the order detail page +And eventually the order status should be "confirmed" +And eventually the order status should be "cancelled" +And I should see the cancellation banner +``` diff --git a/specs/behavior/frontend/orders/order-detail.examples/s-005-cancel-button-appears-only-for-cancellable-statuses.sdp.md b/specs/behavior/frontend/orders/order-detail.examples/s-005-cancel-button-appears-only-for-cancellable-statuses.sdp.md index 0e6aaa16..aebd9998 100644 --- a/specs/behavior/frontend/orders/order-detail.examples/s-005-cancel-button-appears-only-for-cancellable-statuses.sdp.md +++ b/specs/behavior/frontend/orders/order-detail.examples/s-005-cancel-button-appears-only-for-cancellable-statuses.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Cancel button appears only for cancellable statuses" from apps/frontend/tests/e2e/features/orders/order-detail.feature +- outcome: Executable scenario: Cancel button appears only for cancellable statuses + +```gwt +Given a confirmed order exists +And a cancelled order exists +When I navigate to that order and I navigate to that order +Then I should see status "confirmed" +And I should not see the "Cancel Order" button +And I should see status "cancelled" +And I should not see the "Cancel Order" button +``` diff --git a/specs/behavior/frontend/orders/order-detail.examples/s-006-cancel-confirmation-dialog-prevents-accidental-cancellation.sdp.md b/specs/behavior/frontend/orders/order-detail.examples/s-006-cancel-confirmation-dialog-prevents-accidental-cancellation.sdp.md index c800179d..8463cbc1 100644 --- a/specs/behavior/frontend/orders/order-detail.examples/s-006-cancel-confirmation-dialog-prevents-accidental-cancellation.sdp.md +++ b/specs/behavior/frontend/orders/order-detail.examples/s-006-cancel-confirmation-dialog-prevents-accidental-cancellation.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: Executable scenario "Cancel confirmation dialog prevents accidental cancellation" from apps/frontend/tests/e2e/features/orders/order-detail.feature +- outcome: Executable scenario: Cancel confirmation dialog prevents accidental cancellation + +```gwt +Given I am on the admin products page +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Dialog Widget" and I enter quantity 10 and I click "Add Stock" and I navigate to the create order page and I add "Dialog… +Then I should see a success message containing "created successfully" +And I should see a success message containing "Stock added" +And I should be redirected to the order detail page +And eventually the order status should be "confirmed" +And I should see a confirmation dialog +And the dialog should warn that cancellation cannot be undone +And the dialog should close +And the order status should still be "confirmed" +``` diff --git a/specs/behavior/frontend/orders/order-detail.sdp.md b/specs/behavior/frontend/orders/order-detail.sdp.md index 53911f5d..cfefde64 100644 --- a/specs/behavior/frontend/orders/order-detail.sdp.md +++ b/specs/behavior/frontend/orders/order-detail.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Capture executable behavior formerly carried in this Gherkin feature. (test carrier: apps/frontend/tests/e2e/features/orders/order-detail.feature) +- outcome: Order Detail diff --git a/specs/behavior/frontend/orders/view-orders.examples/s-001-view-all-orders.sdp.md b/specs/behavior/frontend/orders/view-orders.examples/s-001-view-all-orders.sdp.md index bbc7c819..7a30568a 100644 --- a/specs/behavior/frontend/orders/view-orders.examples/s-001-view-all-orders.sdp.md +++ b/specs/behavior/frontend/orders/view-orders.examples/s-001-view-all-orders.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "View all orders" from apps/frontend/tests/e2e/features/orders/view-orders.feature +- outcome: Executable scenario: View all orders + +```gwt +Given orders exist with different statuses +When I navigate to the orders page +Then I should see all orders +And each order should show its status badge +``` diff --git a/specs/behavior/frontend/orders/view-orders.examples/s-002-navigate-to-create-order.sdp.md b/specs/behavior/frontend/orders/view-orders.examples/s-002-navigate-to-create-order.sdp.md index 4dbd3d57..f8bf7425 100644 --- a/specs/behavior/frontend/orders/view-orders.examples/s-002-navigate-to-create-order.sdp.md +++ b/specs/behavior/frontend/orders/view-orders.examples/s-002-navigate-to-create-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Navigate to create order" from apps/frontend/tests/e2e/features/orders/view-orders.feature +- outcome: Executable scenario: Navigate to create order + +```gwt +Given the feature fixture is in place +When I am on the orders page and I click "New Order" +Then I should be on the create order page +``` diff --git a/specs/behavior/frontend/orders/view-orders.sdp.md b/specs/behavior/frontend/orders/view-orders.sdp.md index 4c02feb8..0be0a36a 100644 --- a/specs/behavior/frontend/orders/view-orders.sdp.md +++ b/specs/behavior/frontend/orders/view-orders.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Capture executable behavior formerly carried in this Gherkin feature. (test carrier: apps/frontend/tests/e2e/features/orders/view-orders.feature) +- outcome: View Orders List diff --git a/specs/behavior/frontend/products/browse-products.examples/s-001-view-products-with-stock-levels.sdp.md b/specs/behavior/frontend/products/browse-products.examples/s-001-view-products-with-stock-levels.sdp.md index 9373a98e..836923c4 100644 --- a/specs/behavior/frontend/products/browse-products.examples/s-001-view-products-with-stock-levels.sdp.md +++ b/specs/behavior/frontend/products/browse-products.examples/s-001-view-products-with-stock-levels.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "View products with stock levels" from apps/frontend/tests/e2e/features/products/browse-products.feature +- outcome: Executable scenario: View products with stock levels + +```gwt +Given products exist with various stock levels +When I navigate to the products page +Then I should see products with their stock badges +And in-stock products should show green badge +And low-stock products should show yellow badge +And out-of-stock products should show red badge +``` diff --git a/specs/behavior/frontend/products/browse-products.examples/s-002-loading-state.sdp.md b/specs/behavior/frontend/products/browse-products.examples/s-002-loading-state.sdp.md index 42be6127..8c45d55b 100644 --- a/specs/behavior/frontend/products/browse-products.examples/s-002-loading-state.sdp.md +++ b/specs/behavior/frontend/products/browse-products.examples/s-002-loading-state.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Loading state" from apps/frontend/tests/e2e/features/products/browse-products.feature +- outcome: Executable scenario: Loading state + +```gwt +Given the feature fixture is in place +When I navigate to the products page +Then I should see loading skeletons +And eventually products should appear +``` diff --git a/specs/behavior/frontend/products/browse-products.sdp.md b/specs/behavior/frontend/products/browse-products.sdp.md index c4565a22..276c9d58 100644 --- a/specs/behavior/frontend/products/browse-products.sdp.md +++ b/specs/behavior/frontend/products/browse-products.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Capture executable behavior formerly carried in this Gherkin feature. (test carrier: apps/frontend/tests/e2e/features/products/browse-products.feature) +- outcome: Browse Product Catalog diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-001-no-dead-letter-on-success.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-001-no-dead-letter-on-success.sdp.md index 6d84fb6d..ab3dbc04 100644 --- a/specs/behavior/order-management/agent/on-complete.examples/s-001-no-dead-letter-on-success.sdp.md +++ b/specs/behavior/order-management/agent/on-complete.examples/s-001-no-dead-letter-on-success.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "No dead letter on success" from examples/order-management/tests/features/behavior/agent/on-complete.feature +- outcome: Executable scenario: No dead letter on success + +```gwt +Given a fresh unit test context +When the onComplete handler receives a success result +Then the dead letter count should be 0 +And the checkpoint should advance to the event global position +``` diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-002-no-dead-letter-on-canceled.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-002-no-dead-letter-on-canceled.sdp.md index 9eed0095..3752a0cd 100644 --- a/specs/behavior/order-management/agent/on-complete.examples/s-002-no-dead-letter-on-canceled.sdp.md +++ b/specs/behavior/order-management/agent/on-complete.examples/s-002-no-dead-letter-on-canceled.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "No dead letter on canceled" from examples/order-management/tests/features/behavior/agent/on-complete.feature +- outcome: Executable scenario: No dead letter on canceled + +```gwt +Given a fresh unit test context +When the onComplete handler receives a canceled result +Then the dead letter count should be 0 +``` diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-003-creates-dead-letter-on-failure.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-003-creates-dead-letter-on-failure.sdp.md index 2ecf03be..ab42fb54 100644 --- a/specs/behavior/order-management/agent/on-complete.examples/s-003-creates-dead-letter-on-failure.sdp.md +++ b/specs/behavior/order-management/agent/on-complete.examples/s-003-creates-dead-letter-on-failure.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Creates dead letter on failure" from examples/order-management/tests/features/behavior/agent/on-complete.feature +- outcome: Executable scenario: Creates dead letter on failure + +```gwt +Given a fresh unit test context +When the onComplete handler receives a failed result with error "Test error" +Then the dead letter count should be 1 +And the dead letter for the event should have: +``` diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-004-increments-attempt-count-on-repeated-failure.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-004-increments-attempt-count-on-repeated-failure.sdp.md index e6c0e42c..28d1b0d9 100644 --- a/specs/behavior/order-management/agent/on-complete.examples/s-004-increments-attempt-count-on-repeated-failure.sdp.md +++ b/specs/behavior/order-management/agent/on-complete.examples/s-004-increments-attempt-count-on-repeated-failure.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Increments attemptCount on repeated failure" from examples/order-management/tests/features/behavior/agent/on-complete.feature +- outcome: Executable scenario: Increments attemptCount on repeated failure + +```gwt +Given a fresh unit test context +And a first failure with error "First error" +When the onComplete handler receives a failed result with error "Second error" +Then the dead letter count should be 1 +And the dead letter for the event should have: +``` diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-005-does-not-update-dead-letter-in-terminal-state.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-005-does-not-update-dead-letter-in-terminal-state.sdp.md index 8670770a..437bbcaa 100644 --- a/specs/behavior/order-management/agent/on-complete.examples/s-005-does-not-update-dead-letter-in-terminal-state.sdp.md +++ b/specs/behavior/order-management/agent/on-complete.examples/s-005-does-not-update-dead-letter-in-terminal-state.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Does not update dead letter in terminal state" from examples/order-management/tests/features/behavior/agent/on-complete.feature +- outcome: Executable scenario: Does not update dead letter in terminal state + +```gwt +Given a fresh unit test context +And a first failure with error "Original error" +And the dead letter is marked as ignored with reason "Test ignore" +When the onComplete handler receives a failed result with error "Should not overwrite" +Then the dead letter for the event should have: +``` diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-006-cron-expires-approval-after-timeout.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-006-cron-expires-approval-after-timeout.sdp.md index 18aff0ba..310904e3 100644 --- a/specs/behavior/order-management/agent/on-complete.examples/s-006-cron-expires-approval-after-timeout.sdp.md +++ b/specs/behavior/order-management/agent/on-complete.examples/s-006-cron-expires-approval-after-timeout.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cron expires approval after timeout" from examples/order-management/tests/features/behavior/agent/on-complete.feature +- outcome: Executable scenario: Cron expires approval after timeout + +```gwt +Given a fresh unit test context +When the onComplete handler records a pending approval for customer "cust_expired" and approval expiration runs after the timeout elapses +Then the pending approval should have: +And an "ApprovalExpired" audit event should exist for the pending approval +``` diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-007-expired-approval-cannot-be-approved.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-007-expired-approval-cannot-be-approved.sdp.md index 7ec9c7d6..519ceaed 100644 --- a/specs/behavior/order-management/agent/on-complete.examples/s-007-expired-approval-cannot-be-approved.sdp.md +++ b/specs/behavior/order-management/agent/on-complete.examples/s-007-expired-approval-cannot-be-approved.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Expired approval cannot be approved" from examples/order-management/tests/features/behavior/agent/on-complete.feature +- outcome: Executable scenario: Expired approval cannot be approved + +```gwt +Given a fresh unit test context +When the onComplete handler records a pending approval for customer "cust_expired_review" and approval expiration runs after the timeout elapses and reviewer "reviewer_late" attempts to approve the expired action +Then the approval action should fail with error "INVALID_STATUS_TRANSITION" +``` diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-008-suggest-customer-outreach-creates-outreach-record-and-emits-event.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-008-suggest-customer-outreach-creates-outreach-record-and-emits-event.sdp.md index f1505b26..012d4531 100644 --- a/specs/behavior/order-management/agent/on-complete.examples/s-008-suggest-customer-outreach-creates-outreach-record-and-emits-event.sdp.md +++ b/specs/behavior/order-management/agent/on-complete.examples/s-008-suggest-customer-outreach-creates-outreach-record-and-emits-event.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "SuggestCustomerOutreach creates outreach record and emits event" from examples/order-management/tests/features/behavior/agent/on-complete.feature +- outcome: Executable scenario: SuggestCustomerOutreach creates outreach record and emits event + +```gwt +Given a fresh unit test context +When the onComplete handler auto-executes a SuggestCustomerOutreach command for customer "cust_outreach_123" and scheduled command routing completes +Then the recorded command should have: +And the outreach task should have: +And an "OutreachCreated" event should be emitted for the outreach task +``` diff --git a/specs/behavior/order-management/agent/on-complete.sdp.md b/specs/behavior/order-management/agent/on-complete.sdp.md index ab642ca1..6ef7722c 100644 --- a/specs/behavior/order-management/agent/on-complete.sdp.md +++ b/specs/behavior/order-management/agent/on-complete.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: agent failures to create dead letters for retry so that no events are silently lost during processing (test carrier: examples/order-management/tests/features/behavior/agent/on-complete.feature) +- actor: a system operator +- outcome: agent failures to create dead letters for retry so that no events are silently lost during processing + +## Behavior + +- rule: Successful and canceled results do not create dead letters +- rule: Failed results create dead letters with error details +- rule: Repeated failures increment attempt count +- rule: Terminal dead letters are not updated +- rule: Approvals expire after configured timeout +- rule: Emitted commands create real domain records diff --git a/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-001-decide-to-add-item-to-draft-order.sdp.md b/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-001-decide-to-add-item-to-draft-order.sdp.md index 6fb2c2cf..967da085 100644 --- a/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-001-decide-to-add-item-to-draft-order.sdp.md +++ b/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-001-decide-to-add-item-to-draft-order.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Decide to add item to draft order" from examples/order-management/tests/features/behavior/deciders/add-order-item.decider.feature +- outcome: Executable scenario: Decide to add item to draft order + +```gwt +Given a decider context +And an order state: +When I decide to add item: +Then the decision should be "success" +And the event type should be "OrderItemAdded" +And the data should have itemCount 1 +And the data should have totalAmount "20.0" +``` diff --git a/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-002-reject-add-item-when-order-is-not-in-draft.sdp.md b/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-002-reject-add-item-when-order-is-not-in-draft.sdp.md index 7cc6312a..ebe41b03 100644 --- a/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-002-reject-add-item-when-order-is-not-in-draft.sdp.md +++ b/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-002-reject-add-item-when-order-is-not-in-draft.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject add item when order is not in draft" from examples/order-management/tests/features/behavior/deciders/add-order-item.decider.feature +- outcome: Executable scenario: Reject add item when order is not in draft + +```gwt +Given a decider context +And an order state: +When I decide to add any item +Then the decision should be "rejected" +And the rejection code should be "ORDER_NOT_IN_DRAFT" +``` diff --git a/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-003-reject-add-item-with-invalid-quantity.sdp.md b/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-003-reject-add-item-with-invalid-quantity.sdp.md index fda8448e..8f26febe 100644 --- a/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-003-reject-add-item-with-invalid-quantity.sdp.md +++ b/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-003-reject-add-item-with-invalid-quantity.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject add item with invalid quantity" from examples/order-management/tests/features/behavior/deciders/add-order-item.decider.feature +- outcome: Executable scenario: Reject add item with invalid quantity + +```gwt +Given a decider context +And an order state: +When I decide to add item with negative quantity: +Then the decision should be "rejected" +And the rejection code should be "INVALID_ORDER_ITEM" +``` diff --git a/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-004-accumulate-items-and-recalculate-total.sdp.md b/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-004-accumulate-items-and-recalculate-total.sdp.md index a9ff0127..97331a86 100644 --- a/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-004-accumulate-items-and-recalculate-total.sdp.md +++ b/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-004-accumulate-items-and-recalculate-total.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Accumulate items and recalculate total" from examples/order-management/tests/features/behavior/deciders/add-order-item.decider.feature +- outcome: Executable scenario: Accumulate items and recalculate total + +```gwt +Given a decider context +And an order state with existing items: +When I decide to add item: +Then the decision should be "success" +And the data should have itemCount 2 +And the data should have totalAmount "40.0" +``` diff --git a/specs/behavior/order-management/deciders/add-order-item-decider.sdp.md b/specs/behavior/order-management/deciders/add-order-item-decider.sdp.md index 7d08a9b3..1a44f7b3 100644 --- a/specs/behavior/order-management/deciders/add-order-item-decider.sdp.md +++ b/specs/behavior/order-management/deciders/add-order-item-decider.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Pure domain logic for adding an item to an order. The AddOrderItem decider validates that: - Order must be in draft status - Item quantity must be positive (test carrier: examples/order-management/tests/features/behavior/deciders/add-order-item.decider.feature) +- outcome: Add Order Item Decider diff --git a/specs/behavior/order-management/deciders/add-stock-decider.examples/s-001-decide-to-add-stock-to-product.sdp.md b/specs/behavior/order-management/deciders/add-stock-decider.examples/s-001-decide-to-add-stock-to-product.sdp.md index d436c2de..699470a1 100644 --- a/specs/behavior/order-management/deciders/add-stock-decider.examples/s-001-decide-to-add-stock-to-product.sdp.md +++ b/specs/behavior/order-management/deciders/add-stock-decider.examples/s-001-decide-to-add-stock-to-product.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Decide to add stock to product" from examples/order-management/tests/features/behavior/deciders/add-stock.decider.feature +- outcome: Executable scenario: Decide to add stock to product + +```gwt +Given a decider context +And an inventory state: +When I decide to add stock with quantity 25 +Then the decision should be "success" +And the event type should be "StockAdded" +And the data should have newAvailableQuantity 75 +And the data should have quantity 25 +``` diff --git a/specs/behavior/order-management/deciders/add-stock-decider.examples/s-002-add-stock-with-reason.sdp.md b/specs/behavior/order-management/deciders/add-stock-decider.examples/s-002-add-stock-with-reason.sdp.md index 75563818..a9b03210 100644 --- a/specs/behavior/order-management/deciders/add-stock-decider.examples/s-002-add-stock-with-reason.sdp.md +++ b/specs/behavior/order-management/deciders/add-stock-decider.examples/s-002-add-stock-with-reason.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Add stock with reason" from examples/order-management/tests/features/behavior/deciders/add-stock.decider.feature +- outcome: Executable scenario: Add stock with reason + +```gwt +Given a decider context +And an inventory state: +When I decide to add stock with quantity 50 and reason "Restocking from supplier" +Then the decision should be "success" +And the event payload should have reason "Restocking from supplier" +``` diff --git a/specs/behavior/order-management/deciders/add-stock-decider.examples/s-003-reject-add-stock-with-zero-quantity.sdp.md b/specs/behavior/order-management/deciders/add-stock-decider.examples/s-003-reject-add-stock-with-zero-quantity.sdp.md index ea864ca1..87facea3 100644 --- a/specs/behavior/order-management/deciders/add-stock-decider.examples/s-003-reject-add-stock-with-zero-quantity.sdp.md +++ b/specs/behavior/order-management/deciders/add-stock-decider.examples/s-003-reject-add-stock-with-zero-quantity.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject add stock with zero quantity" from examples/order-management/tests/features/behavior/deciders/add-stock.decider.feature +- outcome: Executable scenario: Reject add stock with zero quantity + +```gwt +Given a decider context +And an inventory state: +When I decide to add stock with quantity 0 +Then the decision should be "rejected" +And the rejection code should be "INVALID_QUANTITY" +``` diff --git a/specs/behavior/order-management/deciders/add-stock-decider.examples/s-004-reject-add-stock-with-negative-quantity.sdp.md b/specs/behavior/order-management/deciders/add-stock-decider.examples/s-004-reject-add-stock-with-negative-quantity.sdp.md index a35db8a9..986e12f5 100644 --- a/specs/behavior/order-management/deciders/add-stock-decider.examples/s-004-reject-add-stock-with-negative-quantity.sdp.md +++ b/specs/behavior/order-management/deciders/add-stock-decider.examples/s-004-reject-add-stock-with-negative-quantity.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject add stock with negative quantity" from examples/order-management/tests/features/behavior/deciders/add-stock.decider.feature +- outcome: Executable scenario: Reject add stock with negative quantity + +```gwt +Given a decider context +And an inventory state: +When I decide to add stock with quantity -10 +Then the decision should be "rejected" +And the rejection code should be "INVALID_QUANTITY" +``` diff --git a/specs/behavior/order-management/deciders/add-stock-decider.sdp.md b/specs/behavior/order-management/deciders/add-stock-decider.sdp.md index 700342f3..26638c85 100644 --- a/specs/behavior/order-management/deciders/add-stock-decider.sdp.md +++ b/specs/behavior/order-management/deciders/add-stock-decider.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Pure domain logic for adding stock to an existing product. The AddStock decider validates that: - Quantity must be positive On success, it emits StockAdded and increases availableQuantity. (test carrier: examples/order-management/tests/features/behavior/deciders/add-stock.decider.feature) +- outcome: Add Stock Decider diff --git a/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-001-decide-to-cancel-a-draft-order.sdp.md b/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-001-decide-to-cancel-a-draft-order.sdp.md index f1a0edea..452c05a8 100644 --- a/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-001-decide-to-cancel-a-draft-order.sdp.md +++ b/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-001-decide-to-cancel-a-draft-order.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Decide to cancel a draft order" from examples/order-management/tests/features/behavior/deciders/cancel-order.decider.feature +- outcome: Executable scenario: Decide to cancel a draft order + +```gwt +Given a decider context +And an order state: +When I decide to cancel the order with reason "Customer changed mind" +Then the decision should be "success" +And the event type should be "OrderCancelled" +And the state update should set status to "cancelled" +And the data should contain reason "Customer changed mind" +``` diff --git a/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-002-decide-to-cancel-a-submitted-order.sdp.md b/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-002-decide-to-cancel-a-submitted-order.sdp.md index 6a688ebe..4b88318b 100644 --- a/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-002-decide-to-cancel-a-submitted-order.sdp.md +++ b/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-002-decide-to-cancel-a-submitted-order.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Decide to cancel a submitted order" from examples/order-management/tests/features/behavior/deciders/cancel-order.decider.feature +- outcome: Executable scenario: Decide to cancel a submitted order + +```gwt +Given a decider context +And an order state: +When I decide to cancel the order with reason "Out of stock" +Then the decision should be "success" +And the event type should be "OrderCancelled" +And the state update should set status to "cancelled" +``` diff --git a/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-003-decide-to-cancel-a-confirmed-order.sdp.md b/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-003-decide-to-cancel-a-confirmed-order.sdp.md index 5e9ddca6..6f14f5b1 100644 --- a/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-003-decide-to-cancel-a-confirmed-order.sdp.md +++ b/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-003-decide-to-cancel-a-confirmed-order.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Decide to cancel a confirmed order" from examples/order-management/tests/features/behavior/deciders/cancel-order.decider.feature +- outcome: Executable scenario: Decide to cancel a confirmed order + +```gwt +Given a decider context +And an order state: +When I decide to cancel the order with reason "Changed mind after confirmation" +Then the decision should be "success" +And the event type should be "OrderCancelled" +And the state update should set status to "cancelled" +And the data should contain reason "Changed mind after confirmation" +``` diff --git a/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-004-reject-cancel-for-already-cancelled-order.sdp.md b/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-004-reject-cancel-for-already-cancelled-order.sdp.md index 54866a56..b5cd652d 100644 --- a/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-004-reject-cancel-for-already-cancelled-order.sdp.md +++ b/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-004-reject-cancel-for-already-cancelled-order.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject cancel for already cancelled order" from examples/order-management/tests/features/behavior/deciders/cancel-order.decider.feature +- outcome: Executable scenario: Reject cancel for already cancelled order + +```gwt +Given a decider context +And an order state: +When I decide to cancel the order with reason "Double cancel" +Then the decision should be "rejected" +And the rejection code should be "ORDER_ALREADY_CANCELLED" +``` diff --git a/specs/behavior/order-management/deciders/cancel-order-decider.sdp.md b/specs/behavior/order-management/deciders/cancel-order-decider.sdp.md index f31ea1cd..94962ac8 100644 --- a/specs/behavior/order-management/deciders/cancel-order-decider.sdp.md +++ b/specs/behavior/order-management/deciders/cancel-order-decider.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Pure domain logic for cancelling an order. The CancelOrder decider validates that: - Order must be in draft, submitted, or confirmed status - Already cancelled orders cannot be cancelled (test carrier: examples/order-management/tests/features/behavior/deciders/cancel-order.decider.feature) +- outcome: Cancel Order Decider diff --git a/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-001-decide-to-confirm-a-submitted-order.sdp.md b/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-001-decide-to-confirm-a-submitted-order.sdp.md index f64efd49..294fe897 100644 --- a/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-001-decide-to-confirm-a-submitted-order.sdp.md +++ b/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-001-decide-to-confirm-a-submitted-order.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Decide to confirm a submitted order" from examples/order-management/tests/features/behavior/deciders/confirm-order.decider.feature +- outcome: Executable scenario: Decide to confirm a submitted order + +```gwt +Given a decider context with timestamp 1704067200000 +And an order state: +When I decide to confirm the order +Then the decision should be "success" +And the event type should be "OrderConfirmed" +And the event payload should contain "confirmedAt" with value 1704067200000 +And the state update should set status to "confirmed" +``` diff --git a/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-002-reject-confirm-for-order-in-draft-status.sdp.md b/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-002-reject-confirm-for-order-in-draft-status.sdp.md index 12b59007..87c3f37e 100644 --- a/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-002-reject-confirm-for-order-in-draft-status.sdp.md +++ b/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-002-reject-confirm-for-order-in-draft-status.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject confirm for order in draft status" from examples/order-management/tests/features/behavior/deciders/confirm-order.decider.feature +- outcome: Executable scenario: Reject confirm for order in draft status + +```gwt +Given a decider context with timestamp 1704067200000 +And an order state: +When I decide to confirm the order +Then the decision should be "rejected" +And the rejection code should be "ORDER_NOT_SUBMITTED" +``` diff --git a/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-003-reject-confirm-for-already-confirmed-order.sdp.md b/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-003-reject-confirm-for-already-confirmed-order.sdp.md index 45b11a5d..fec9c94e 100644 --- a/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-003-reject-confirm-for-already-confirmed-order.sdp.md +++ b/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-003-reject-confirm-for-already-confirmed-order.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject confirm for already confirmed order" from examples/order-management/tests/features/behavior/deciders/confirm-order.decider.feature +- outcome: Executable scenario: Reject confirm for already confirmed order + +```gwt +Given a decider context with timestamp 1704067200000 +And an order state: +When I decide to confirm the order +Then the decision should be "rejected" +And the rejection code should be "ORDER_NOT_SUBMITTED" +``` diff --git a/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-004-reject-confirm-for-cancelled-order.sdp.md b/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-004-reject-confirm-for-cancelled-order.sdp.md index 23ca71d8..5451c489 100644 --- a/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-004-reject-confirm-for-cancelled-order.sdp.md +++ b/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-004-reject-confirm-for-cancelled-order.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject confirm for cancelled order" from examples/order-management/tests/features/behavior/deciders/confirm-order.decider.feature +- outcome: Executable scenario: Reject confirm for cancelled order + +```gwt +Given a decider context with timestamp 1704067200000 +And an order state: +When I decide to confirm the order +Then the decision should be "rejected" +And the rejection code should be "ORDER_NOT_SUBMITTED" +``` diff --git a/specs/behavior/order-management/deciders/confirm-order-decider.sdp.md b/specs/behavior/order-management/deciders/confirm-order-decider.sdp.md index 49fbfdf6..9c4778af 100644 --- a/specs/behavior/order-management/deciders/confirm-order-decider.sdp.md +++ b/specs/behavior/order-management/deciders/confirm-order-decider.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Pure domain logic for confirming an order. The ConfirmOrder decider validates that: - Order must be in submitted status On success, it emits OrderConfirmed and transitions to confirmed status. (test carrier: examples/order-management/tests/features/behavior/deciders/confirm-order.decider.feature) +- outcome: Confirm Order Decider diff --git a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-001-decide-to-confirm-a-pending-reservation.sdp.md b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-001-decide-to-confirm-a-pending-reservation.sdp.md index ee3ff17c..cd4b1b8c 100644 --- a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-001-decide-to-confirm-a-pending-reservation.sdp.md +++ b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-001-decide-to-confirm-a-pending-reservation.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Decide to confirm a pending reservation" from examples/order-management/tests/features/behavior/deciders/confirm-reservation.decider.feature +- outcome: Executable scenario: Decide to confirm a pending reservation + +```gwt +Given a decider context +And a reservation state: +When I decide to confirm the reservation +Then the decision should be "success" +And the event type should be "ReservationConfirmed" +And the state update should have status "confirmed" +``` diff --git a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-002-reject-confirm-when-reservation-is-already-confirmed.sdp.md b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-002-reject-confirm-when-reservation-is-already-confirmed.sdp.md index 8edce893..a838dac4 100644 --- a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-002-reject-confirm-when-reservation-is-already-confirmed.sdp.md +++ b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-002-reject-confirm-when-reservation-is-already-confirmed.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject confirm when reservation is already confirmed" from examples/order-management/tests/features/behavior/deciders/confirm-reservation.decider.feature +- outcome: Executable scenario: Reject confirm when reservation is already confirmed + +```gwt +Given a decider context +And a reservation state: +When I decide to confirm the reservation +Then the decision should be "rejected" +And the rejection code should be "RESERVATION_NOT_PENDING" +``` diff --git a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-003-reject-confirm-when-reservation-is-released.sdp.md b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-003-reject-confirm-when-reservation-is-released.sdp.md index b70294f4..de7feee7 100644 --- a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-003-reject-confirm-when-reservation-is-released.sdp.md +++ b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-003-reject-confirm-when-reservation-is-released.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject confirm when reservation is released" from examples/order-management/tests/features/behavior/deciders/confirm-reservation.decider.feature +- outcome: Executable scenario: Reject confirm when reservation is released + +```gwt +Given a decider context +And a reservation state: +When I decide to confirm the reservation +Then the decision should be "rejected" +And the rejection code should be "RESERVATION_NOT_PENDING" +``` diff --git a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-004-reject-confirm-when-reservation-is-expired.sdp.md b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-004-reject-confirm-when-reservation-is-expired.sdp.md index f9a30488..ed5a4fc6 100644 --- a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-004-reject-confirm-when-reservation-is-expired.sdp.md +++ b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-004-reject-confirm-when-reservation-is-expired.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject confirm when reservation is expired" from examples/order-management/tests/features/behavior/deciders/confirm-reservation.decider.feature +- outcome: Executable scenario: Reject confirm when reservation is expired + +```gwt +Given a decider context +And a reservation state: +When I decide to confirm the reservation +Then the decision should be "rejected" +And the rejection code should be "RESERVATION_NOT_PENDING" +``` diff --git a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-005-reject-confirm-when-reservation-has-passed-its-expiration-time.sdp.md b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-005-reject-confirm-when-reservation-has-passed-its-expiration-time.sdp.md index 844d2313..474d916d 100644 --- a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-005-reject-confirm-when-reservation-has-passed-its-expiration-time.sdp.md +++ b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-005-reject-confirm-when-reservation-has-passed-its-expiration-time.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject confirm when reservation has passed its expiration time" from examples/order-management/tests/features/behavior/deciders/confirm-reservation.decider.feature +- outcome: Executable scenario: Reject confirm when reservation has passed its expiration time + +```gwt +Given a decider context +And a reservation state: +When I decide to confirm the reservation +Then the decision should be "rejected" +And the rejection code should be "RESERVATION_EXPIRED" +``` diff --git a/specs/behavior/order-management/deciders/confirm-reservation-decider.sdp.md b/specs/behavior/order-management/deciders/confirm-reservation-decider.sdp.md index 9213e46c..372f3ab1 100644 --- a/specs/behavior/order-management/deciders/confirm-reservation-decider.sdp.md +++ b/specs/behavior/order-management/deciders/confirm-reservation-decider.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Pure domain logic for confirming a pending reservation. The ConfirmReservation decider validates that: - Reservation must be in pending status (FSM transition) - Reservation must not be expired (test carrier: examples/order-management/tests/features/behavior/deciders/confirm-reservation.decider.feature) +- outcome: Confirm Reservation Decider diff --git a/specs/behavior/order-management/deciders/create-order-decider.examples/s-001-decide-to-create-a-new-order-when-none-exists.sdp.md b/specs/behavior/order-management/deciders/create-order-decider.examples/s-001-decide-to-create-a-new-order-when-none-exists.sdp.md index da83a8f6..b8ff6706 100644 --- a/specs/behavior/order-management/deciders/create-order-decider.examples/s-001-decide-to-create-a-new-order-when-none-exists.sdp.md +++ b/specs/behavior/order-management/deciders/create-order-decider.examples/s-001-decide-to-create-a-new-order-when-none-exists.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Decide to create a new order when none exists" from examples/order-management/tests/features/behavior/deciders/create-order.decider.feature +- outcome: Executable scenario: Decide to create a new order when none exists + +```gwt +Given a decider context +And no existing order state +When I decide to create order with orderId "ord_new_001" and customerId "cust_001" +Then the decision should be "success" +And the event type should be "OrderCreated" +And the data should contain orderId "ord_new_001" +``` diff --git a/specs/behavior/order-management/deciders/create-order-decider.examples/s-002-reject-create-when-order-already-exists.sdp.md b/specs/behavior/order-management/deciders/create-order-decider.examples/s-002-reject-create-when-order-already-exists.sdp.md index b46ba7a9..e0bf6e04 100644 --- a/specs/behavior/order-management/deciders/create-order-decider.examples/s-002-reject-create-when-order-already-exists.sdp.md +++ b/specs/behavior/order-management/deciders/create-order-decider.examples/s-002-reject-create-when-order-already-exists.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject create when order already exists" from examples/order-management/tests/features/behavior/deciders/create-order.decider.feature +- outcome: Executable scenario: Reject create when order already exists + +```gwt +Given a decider context +And an existing order state with orderId "ord_existing" +When I decide to create order with orderId "ord_existing" and customerId "cust_002" +Then the decision should be "rejected" +And the rejection code should be "ORDER_ALREADY_EXISTS" +``` diff --git a/specs/behavior/order-management/deciders/create-order-decider.sdp.md b/specs/behavior/order-management/deciders/create-order-decider.sdp.md index 69ce3952..6794b3d7 100644 --- a/specs/behavior/order-management/deciders/create-order-decider.sdp.md +++ b/specs/behavior/order-management/deciders/create-order-decider.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Pure domain logic for creating a new order. The CreateOrder decider validates that: - No order with the same ID already exists On success, it emits OrderCreated with draft status. (test carrier: examples/order-management/tests/features/behavior/deciders/create-order.decider.feature) +- outcome: Create Order Decider diff --git a/specs/behavior/order-management/deciders/create-product-decider.examples/s-001-decide-to-create-a-new-product-when-none-exists.sdp.md b/specs/behavior/order-management/deciders/create-product-decider.examples/s-001-decide-to-create-a-new-product-when-none-exists.sdp.md index 1333b622..5b964bc0 100644 --- a/specs/behavior/order-management/deciders/create-product-decider.examples/s-001-decide-to-create-a-new-product-when-none-exists.sdp.md +++ b/specs/behavior/order-management/deciders/create-product-decider.examples/s-001-decide-to-create-a-new-product-when-none-exists.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Decide to create a new product when none exists" from examples/order-management/tests/features/behavior/deciders/create-product.decider.feature +- outcome: Executable scenario: Decide to create a new product when none exists + +```gwt +Given a decider context +And no existing inventory state +When I decide to create product with: +Then the decision should be "success" +And the event type should be "ProductCreated" +And the data should contain productId "prod_new_001" +``` diff --git a/specs/behavior/order-management/deciders/create-product-decider.examples/s-002-reject-create-when-product-already-exists.sdp.md b/specs/behavior/order-management/deciders/create-product-decider.examples/s-002-reject-create-when-product-already-exists.sdp.md index d5490027..b4788d79 100644 --- a/specs/behavior/order-management/deciders/create-product-decider.examples/s-002-reject-create-when-product-already-exists.sdp.md +++ b/specs/behavior/order-management/deciders/create-product-decider.examples/s-002-reject-create-when-product-already-exists.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject create when product already exists" from examples/order-management/tests/features/behavior/deciders/create-product.decider.feature +- outcome: Executable scenario: Reject create when product already exists + +```gwt +Given a decider context +And an existing inventory state with productId "prod_existing" +When I decide to create product with: +Then the decision should be "rejected" +And the rejection code should be "PRODUCT_ALREADY_EXISTS" +``` diff --git a/specs/behavior/order-management/deciders/create-product-decider.examples/s-003-reject-create-with-empty-product-name.sdp.md b/specs/behavior/order-management/deciders/create-product-decider.examples/s-003-reject-create-with-empty-product-name.sdp.md index eb91f777..3bd2ef64 100644 --- a/specs/behavior/order-management/deciders/create-product-decider.examples/s-003-reject-create-with-empty-product-name.sdp.md +++ b/specs/behavior/order-management/deciders/create-product-decider.examples/s-003-reject-create-with-empty-product-name.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject create with empty product name" from examples/order-management/tests/features/behavior/deciders/create-product.decider.feature +- outcome: Executable scenario: Reject create with empty product name + +```gwt +Given a decider context +And no existing inventory state +When I decide to create product with: +Then the decision should be "rejected" +And the rejection code should be "INVALID_PRODUCT_NAME" +``` diff --git a/specs/behavior/order-management/deciders/create-product-decider.examples/s-004-reject-create-with-empty-sku.sdp.md b/specs/behavior/order-management/deciders/create-product-decider.examples/s-004-reject-create-with-empty-sku.sdp.md index 9a917c84..6fc2ba82 100644 --- a/specs/behavior/order-management/deciders/create-product-decider.examples/s-004-reject-create-with-empty-sku.sdp.md +++ b/specs/behavior/order-management/deciders/create-product-decider.examples/s-004-reject-create-with-empty-sku.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject create with empty SKU" from examples/order-management/tests/features/behavior/deciders/create-product.decider.feature +- outcome: Executable scenario: Reject create with empty SKU + +```gwt +Given a decider context +And no existing inventory state +When I decide to create product with: +Then the decision should be "rejected" +And the rejection code should be "INVALID_SKU" +``` diff --git a/specs/behavior/order-management/deciders/create-product-decider.examples/s-005-reject-create-with-zero-price.sdp.md b/specs/behavior/order-management/deciders/create-product-decider.examples/s-005-reject-create-with-zero-price.sdp.md index 989667f0..3ed1eb41 100644 --- a/specs/behavior/order-management/deciders/create-product-decider.examples/s-005-reject-create-with-zero-price.sdp.md +++ b/specs/behavior/order-management/deciders/create-product-decider.examples/s-005-reject-create-with-zero-price.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject create with zero price" from examples/order-management/tests/features/behavior/deciders/create-product.decider.feature +- outcome: Executable scenario: Reject create with zero price + +```gwt +Given a decider context +And no existing inventory state +When I decide to create product with: +Then the decision should be "rejected" +And the rejection code should be "INVALID_UNIT_PRICE" +``` diff --git a/specs/behavior/order-management/deciders/create-product-decider.examples/s-006-reject-create-with-negative-price.sdp.md b/specs/behavior/order-management/deciders/create-product-decider.examples/s-006-reject-create-with-negative-price.sdp.md index fea40f6f..de39f266 100644 --- a/specs/behavior/order-management/deciders/create-product-decider.examples/s-006-reject-create-with-negative-price.sdp.md +++ b/specs/behavior/order-management/deciders/create-product-decider.examples/s-006-reject-create-with-negative-price.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject create with negative price" from examples/order-management/tests/features/behavior/deciders/create-product.decider.feature +- outcome: Executable scenario: Reject create with negative price + +```gwt +Given a decider context +And no existing inventory state +When I decide to create product with: +Then the decision should be "rejected" +And the rejection code should be "INVALID_UNIT_PRICE" +``` diff --git a/specs/behavior/order-management/deciders/create-product-decider.sdp.md b/specs/behavior/order-management/deciders/create-product-decider.sdp.md index 8175b42d..595eee7c 100644 --- a/specs/behavior/order-management/deciders/create-product-decider.sdp.md +++ b/specs/behavior/order-management/deciders/create-product-decider.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Pure domain logic for creating a new product. The CreateProduct decider validates that: - No product with the same ID already exists - Product name is not empty (test carrier: examples/order-management/tests/features/behavior/deciders/create-product.decider.feature) +- outcome: Create Product Decider diff --git a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-001-decide-to-expire-a-pending-reservation-that-has-timed-out.sdp.md b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-001-decide-to-expire-a-pending-reservation-that-has-timed-out.sdp.md index 6e1112c0..67e4693e 100644 --- a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-001-decide-to-expire-a-pending-reservation-that-has-timed-out.sdp.md +++ b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-001-decide-to-expire-a-pending-reservation-that-has-timed-out.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Decide to expire a pending reservation that has timed out" from examples/order-management/tests/features/behavior/deciders/expire-reservation.decider.feature +- outcome: Executable scenario: Decide to expire a pending reservation that has timed out + +```gwt +Given a decider context +And a reservation state: +When I decide to expire the reservation +Then the decision should be "success" +And the event type should be "ReservationExpired" +And the state update should have status "expired" +``` diff --git a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-002-reject-expire-when-reservation-has-not-timed-out-yet.sdp.md b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-002-reject-expire-when-reservation-has-not-timed-out-yet.sdp.md index 2f959b8e..07a7c767 100644 --- a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-002-reject-expire-when-reservation-has-not-timed-out-yet.sdp.md +++ b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-002-reject-expire-when-reservation-has-not-timed-out-yet.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject expire when reservation has not timed out yet" from examples/order-management/tests/features/behavior/deciders/expire-reservation.decider.feature +- outcome: Executable scenario: Reject expire when reservation has not timed out yet + +```gwt +Given a decider context +And a reservation state: +When I decide to expire the reservation +Then the decision should be "rejected" +And the rejection code should be "RESERVATION_NOT_EXPIRED" +``` diff --git a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-003-reject-expire-when-reservation-is-already-confirmed.sdp.md b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-003-reject-expire-when-reservation-is-already-confirmed.sdp.md index db0aacf1..2809dfcb 100644 --- a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-003-reject-expire-when-reservation-is-already-confirmed.sdp.md +++ b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-003-reject-expire-when-reservation-is-already-confirmed.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject expire when reservation is already confirmed" from examples/order-management/tests/features/behavior/deciders/expire-reservation.decider.feature +- outcome: Executable scenario: Reject expire when reservation is already confirmed + +```gwt +Given a decider context +And a reservation state: +When I decide to expire the reservation +Then the decision should be "rejected" +And the rejection code should be "RESERVATION_NOT_PENDING" +``` diff --git a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-004-reject-expire-when-reservation-is-already-released.sdp.md b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-004-reject-expire-when-reservation-is-already-released.sdp.md index 000f4d92..541ceaca 100644 --- a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-004-reject-expire-when-reservation-is-already-released.sdp.md +++ b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-004-reject-expire-when-reservation-is-already-released.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject expire when reservation is already released" from examples/order-management/tests/features/behavior/deciders/expire-reservation.decider.feature +- outcome: Executable scenario: Reject expire when reservation is already released + +```gwt +Given a decider context +And a reservation state: +When I decide to expire the reservation +Then the decision should be "rejected" +And the rejection code should be "RESERVATION_NOT_PENDING" +``` diff --git a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-005-reject-expire-when-reservation-is-already-expired.sdp.md b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-005-reject-expire-when-reservation-is-already-expired.sdp.md index f5b5854e..8b8504a0 100644 --- a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-005-reject-expire-when-reservation-is-already-expired.sdp.md +++ b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-005-reject-expire-when-reservation-is-already-expired.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject expire when reservation is already expired" from examples/order-management/tests/features/behavior/deciders/expire-reservation.decider.feature +- outcome: Executable scenario: Reject expire when reservation is already expired + +```gwt +Given a decider context +And a reservation state: +When I decide to expire the reservation +Then the decision should be "rejected" +And the rejection code should be "RESERVATION_NOT_PENDING" +``` diff --git a/specs/behavior/order-management/deciders/expire-reservation-decider.sdp.md b/specs/behavior/order-management/deciders/expire-reservation-decider.sdp.md index b2a1c60d..3be31f6a 100644 --- a/specs/behavior/order-management/deciders/expire-reservation-decider.sdp.md +++ b/specs/behavior/order-management/deciders/expire-reservation-decider.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Pure domain logic for expiring a timed-out reservation. The ExpireReservation decider validates that: - Reservation must be in pending status (only pending can expire) - Reservation expiration time must have passed (test carrier: examples/order-management/tests/features/behavior/deciders/expire-reservation.decider.feature) +- outcome: Expire Reservation Decider diff --git a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-001-evolve-null-state-with-product-created-event.sdp.md b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-001-evolve-null-state-with-product-created-event.sdp.md index 093703b1..f357fc2f 100644 --- a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-001-evolve-null-state-with-product-created-event.sdp.md +++ b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-001-evolve-null-state-with-product-created-event.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: Executable scenario "Evolve null state with ProductCreated event" from examples/order-management/tests/features/behavior/deciders/inventory-evolve.feature +- outcome: Executable scenario: Evolve null state with ProductCreated event + +```gwt +Given a decider context +And no existing inventory state +When I evolve with ProductCreated event: +Then the evolved state should have productId "prod_001" +And the evolved state should have productName "Test Widget" +And the evolved state should have sku "SKU-001" +And the evolved state should have unitPrice "29.99" +And the evolved state should have availableQuantity 0 +And the evolved state should have reservedQuantity 0 +And the evolved state should have version 1 +``` diff --git a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-002-evolve-inventory-state-with-stock-added-event.sdp.md b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-002-evolve-inventory-state-with-stock-added-event.sdp.md index b6e232e0..84bad5ff 100644 --- a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-002-evolve-inventory-state-with-stock-added-event.sdp.md +++ b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-002-evolve-inventory-state-with-stock-added-event.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Evolve inventory state with StockAdded event" from examples/order-management/tests/features/behavior/deciders/inventory-evolve.feature +- outcome: Executable scenario: Evolve inventory state with StockAdded event + +```gwt +Given a decider context +And an inventory state: +When I evolve with StockAdded event with quantity 25 +Then the evolved state should have availableQuantity 75 +And the evolved state should have reservedQuantity 10 +``` diff --git a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-003-evolve-inventory-from-zero-stock.sdp.md b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-003-evolve-inventory-from-zero-stock.sdp.md index 683d5082..1e7bb277 100644 --- a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-003-evolve-inventory-from-zero-stock.sdp.md +++ b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-003-evolve-inventory-from-zero-stock.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Evolve inventory from zero stock" from examples/order-management/tests/features/behavior/deciders/inventory-evolve.feature +- outcome: Executable scenario: Evolve inventory from zero stock + +```gwt +Given a decider context +And an inventory state: +When I evolve with StockAdded event with quantity 100 +Then the evolved state should have availableQuantity 100 +``` diff --git a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-004-evolve-inventory-state-with-stock-reserved-event.sdp.md b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-004-evolve-inventory-state-with-stock-reserved-event.sdp.md index 65339702..24e9837c 100644 --- a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-004-evolve-inventory-state-with-stock-reserved-event.sdp.md +++ b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-004-evolve-inventory-state-with-stock-reserved-event.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Evolve inventory state with StockReserved event" from examples/order-management/tests/features/behavior/deciders/inventory-evolve.feature +- outcome: Executable scenario: Evolve inventory state with StockReserved event + +```gwt +Given a decider context +And an inventory state: +When I evolve with StockReserved event for productId "prod_001" with quantity 25 +Then the evolved state should have availableQuantity 75 +And the evolved state should have reservedQuantity 25 +``` diff --git a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-005-evolve-inventory-state-when-product-not-in-reservation.sdp.md b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-005-evolve-inventory-state-when-product-not-in-reservation.sdp.md index 0a0ac984..2b036301 100644 --- a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-005-evolve-inventory-state-when-product-not-in-reservation.sdp.md +++ b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-005-evolve-inventory-state-when-product-not-in-reservation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Evolve inventory state when product not in reservation" from examples/order-management/tests/features/behavior/deciders/inventory-evolve.feature +- outcome: Executable scenario: Evolve inventory state when product not in reservation + +```gwt +Given a decider context +And an inventory state: +When I evolve with StockReserved event for productId "prod_001" with quantity 25 +Then the evolved state should have availableQuantity 50 +And the evolved state should have reservedQuantity 10 +``` diff --git a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-006-evolve-inventory-state-with-reservation-failed-event-no-change.sdp.md b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-006-evolve-inventory-state-with-reservation-failed-event-no-change.sdp.md index 7a992944..f4756983 100644 --- a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-006-evolve-inventory-state-with-reservation-failed-event-no-change.sdp.md +++ b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-006-evolve-inventory-state-with-reservation-failed-event-no-change.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Evolve inventory state with ReservationFailed event (no change)" from examples/order-management/tests/features/behavior/deciders/inventory-evolve.feature +- outcome: Executable scenario: Evolve inventory state with ReservationFailed event (no change) + +```gwt +Given a decider context +And an inventory state: +When I evolve with ReservationFailed event +Then the evolved state should have availableQuantity 100 +And the evolved state should have reservedQuantity 0 +``` diff --git a/specs/behavior/order-management/deciders/inventory-evolve.sdp.md b/specs/behavior/order-management/deciders/inventory-evolve.sdp.md index 6804d2bd..420e7ed8 100644 --- a/specs/behavior/order-management/deciders/inventory-evolve.sdp.md +++ b/specs/behavior/order-management/deciders/inventory-evolve.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Pure state transition functions for inventory events. These evolve functions apply events to produce new state, enabling deterministic event replay and projection rebuilding. (test carrier: examples/order-management/tests/features/behavior/deciders/inventory-evolve.feature) +- outcome: Inventory Evolve Functions diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-001-order-created-evolves-null-to-initial-state.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-001-order-created-evolves-null-to-initial-state.sdp.md index 305221cd..4f958757 100644 --- a/specs/behavior/order-management/deciders/order-evolve.examples/s-001-order-created-evolves-null-to-initial-state.sdp.md +++ b/specs/behavior/order-management/deciders/order-evolve.examples/s-001-order-created-evolves-null-to-initial-state.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "OrderCreated evolves null to initial state" from examples/order-management/tests/features/behavior/deciders/order-evolve.feature +- outcome: Executable scenario: OrderCreated evolves null to initial state + +```gwt +Given the evolve functions are available +And no prior order state +When OrderCreated event is applied: +Then state should have orderId "ord_001" +And state should have customerId "cust_001" +And state should have status "draft" +And state should have empty items +And state should have totalAmount 0 +``` diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-002-order-item-added-appends-item-to-empty-order.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-002-order-item-added-appends-item-to-empty-order.sdp.md index a9edcc98..4fb6a1e2 100644 --- a/specs/behavior/order-management/deciders/order-evolve.examples/s-002-order-item-added-appends-item-to-empty-order.sdp.md +++ b/specs/behavior/order-management/deciders/order-evolve.examples/s-002-order-item-added-appends-item-to-empty-order.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "OrderItemAdded appends item to empty order" from examples/order-management/tests/features/behavior/deciders/order-evolve.feature +- outcome: Executable scenario: OrderItemAdded appends item to empty order + +```gwt +Given the evolve functions are available +And an order state with: +When OrderItemAdded event is applied: +Then state should have 1 items +And state should have totalAmount "50.00" +And state should have item with productId "prod_001" +``` diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-003-order-item-added-accumulates-with-existing-items.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-003-order-item-added-accumulates-with-existing-items.sdp.md index 706c249f..96b6c1a9 100644 --- a/specs/behavior/order-management/deciders/order-evolve.examples/s-003-order-item-added-accumulates-with-existing-items.sdp.md +++ b/specs/behavior/order-management/deciders/order-evolve.examples/s-003-order-item-added-accumulates-with-existing-items.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "OrderItemAdded accumulates with existing items" from examples/order-management/tests/features/behavior/deciders/order-evolve.feature +- outcome: Executable scenario: OrderItemAdded accumulates with existing items + +```gwt +Given the evolve functions are available +And an order state with: +When OrderItemAdded event is applied: +Then state should have 2 items +And state should have totalAmount "50.00" +``` diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-004-order-item-removed-removes-item-and-updates-total.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-004-order-item-removed-removes-item-and-updates-total.sdp.md index 886f2a13..34d8a72e 100644 --- a/specs/behavior/order-management/deciders/order-evolve.examples/s-004-order-item-removed-removes-item-and-updates-total.sdp.md +++ b/specs/behavior/order-management/deciders/order-evolve.examples/s-004-order-item-removed-removes-item-and-updates-total.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "OrderItemRemoved removes item and updates total" from examples/order-management/tests/features/behavior/deciders/order-evolve.feature +- outcome: Executable scenario: OrderItemRemoved removes item and updates total + +```gwt +Given the evolve functions are available +And an order state with item: +When OrderItemRemoved event is applied: +Then state should have 0 items +And state should have totalAmount 0 +``` diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-005-order-submitted-changes-status-to-submitted.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-005-order-submitted-changes-status-to-submitted.sdp.md index fcd96b87..775fbc22 100644 --- a/specs/behavior/order-management/deciders/order-evolve.examples/s-005-order-submitted-changes-status-to-submitted.sdp.md +++ b/specs/behavior/order-management/deciders/order-evolve.examples/s-005-order-submitted-changes-status-to-submitted.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "OrderSubmitted changes status to submitted" from examples/order-management/tests/features/behavior/deciders/order-evolve.feature +- outcome: Executable scenario: OrderSubmitted changes status to submitted + +```gwt +Given the evolve functions are available +And an order state with: +When OrderSubmitted event is applied +Then state should have status "submitted" +``` diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-006-order-confirmed-changes-status-to-confirmed.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-006-order-confirmed-changes-status-to-confirmed.sdp.md index 15ecc1bc..86e14088 100644 --- a/specs/behavior/order-management/deciders/order-evolve.examples/s-006-order-confirmed-changes-status-to-confirmed.sdp.md +++ b/specs/behavior/order-management/deciders/order-evolve.examples/s-006-order-confirmed-changes-status-to-confirmed.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "OrderConfirmed changes status to confirmed" from examples/order-management/tests/features/behavior/deciders/order-evolve.feature +- outcome: Executable scenario: OrderConfirmed changes status to confirmed + +```gwt +Given the evolve functions are available +And an order state with: +When OrderConfirmed event is applied +Then state should have status "confirmed" +``` diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-007-order-cancelled-changes-status-from-draft-to-cancelled.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-007-order-cancelled-changes-status-from-draft-to-cancelled.sdp.md index acc7b08c..ef0b44b8 100644 --- a/specs/behavior/order-management/deciders/order-evolve.examples/s-007-order-cancelled-changes-status-from-draft-to-cancelled.sdp.md +++ b/specs/behavior/order-management/deciders/order-evolve.examples/s-007-order-cancelled-changes-status-from-draft-to-cancelled.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "OrderCancelled changes status from draft to cancelled" from examples/order-management/tests/features/behavior/deciders/order-evolve.feature +- outcome: Executable scenario: OrderCancelled changes status from draft to cancelled + +```gwt +Given the evolve functions are available +And an order state with: +When OrderCancelled event is applied +Then state should have status "cancelled" +``` diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-008-order-cancelled-changes-status-from-submitted-to-cancelled.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-008-order-cancelled-changes-status-from-submitted-to-cancelled.sdp.md index 0c9ee6ce..49104c66 100644 --- a/specs/behavior/order-management/deciders/order-evolve.examples/s-008-order-cancelled-changes-status-from-submitted-to-cancelled.sdp.md +++ b/specs/behavior/order-management/deciders/order-evolve.examples/s-008-order-cancelled-changes-status-from-submitted-to-cancelled.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "OrderCancelled changes status from submitted to cancelled" from examples/order-management/tests/features/behavior/deciders/order-evolve.feature +- outcome: Executable scenario: OrderCancelled changes status from submitted to cancelled + +```gwt +Given the evolve functions are available +And an order state with: +When OrderCancelled event is applied +Then state should have status "cancelled" +``` diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-009-order-cancelled-changes-status-from-confirmed-to-cancelled.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-009-order-cancelled-changes-status-from-confirmed-to-cancelled.sdp.md index f85e1463..d7ae6215 100644 --- a/specs/behavior/order-management/deciders/order-evolve.examples/s-009-order-cancelled-changes-status-from-confirmed-to-cancelled.sdp.md +++ b/specs/behavior/order-management/deciders/order-evolve.examples/s-009-order-cancelled-changes-status-from-confirmed-to-cancelled.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "OrderCancelled changes status from confirmed to cancelled" from examples/order-management/tests/features/behavior/deciders/order-evolve.feature +- outcome: Executable scenario: OrderCancelled changes status from confirmed to cancelled + +```gwt +Given the evolve functions are available +And an order state with: +When OrderCancelled event is applied +Then state should have status "cancelled" +``` diff --git a/specs/behavior/order-management/deciders/order-evolve.sdp.md b/specs/behavior/order-management/deciders/order-evolve.sdp.md index 167ebcaf..e80ffb84 100644 --- a/specs/behavior/order-management/deciders/order-evolve.sdp.md +++ b/specs/behavior/order-management/deciders/order-evolve.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Pure evolve functions that apply events to produce new state. These functions are the second half of the Decider pattern: - decide(state, command) -> event (tested in *.decider.feature) - evolve(state, event) -> new state (tested here) (test carrier: examples/order-management/tests/features/behavior/deciders/order-evolve.feature) +- outcome: Order State Evolution diff --git a/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-001-decide-to-release-a-pending-reservation.sdp.md b/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-001-decide-to-release-a-pending-reservation.sdp.md index b96d4555..3a10ee69 100644 --- a/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-001-decide-to-release-a-pending-reservation.sdp.md +++ b/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-001-decide-to-release-a-pending-reservation.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Decide to release a pending reservation" from examples/order-management/tests/features/behavior/deciders/release-reservation.decider.feature +- outcome: Executable scenario: Decide to release a pending reservation + +```gwt +Given a decider context +And a reservation state: +When I decide to release the reservation with reason "Order cancelled" +Then the decision should be "success" +And the event type should be "ReservationReleased" +And the event payload should have reason "Order cancelled" +And the state update should have status "released" +``` diff --git a/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-002-decide-to-release-a-confirmed-reservation.sdp.md b/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-002-decide-to-release-a-confirmed-reservation.sdp.md index bbeefdb6..b4c0bd7f 100644 --- a/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-002-decide-to-release-a-confirmed-reservation.sdp.md +++ b/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-002-decide-to-release-a-confirmed-reservation.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Decide to release a confirmed reservation" from examples/order-management/tests/features/behavior/deciders/release-reservation.decider.feature +- outcome: Executable scenario: Decide to release a confirmed reservation + +```gwt +Given a decider context +And a reservation state: +When I decide to release the reservation with reason "Order cancelled after confirmation" +Then the decision should be "success" +And the event type should be "ReservationReleased" +And the state update should have status "released" +``` diff --git a/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-003-reject-release-when-reservation-is-already-released.sdp.md b/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-003-reject-release-when-reservation-is-already-released.sdp.md index a8be331d..0f28f3c0 100644 --- a/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-003-reject-release-when-reservation-is-already-released.sdp.md +++ b/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-003-reject-release-when-reservation-is-already-released.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject release when reservation is already released" from examples/order-management/tests/features/behavior/deciders/release-reservation.decider.feature +- outcome: Executable scenario: Reject release when reservation is already released + +```gwt +Given a decider context +And a reservation state: +When I decide to release the reservation with reason "Duplicate release" +Then the decision should be "rejected" +And the rejection code should be "RESERVATION_NOT_PENDING" +``` diff --git a/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-004-reject-release-when-reservation-is-expired.sdp.md b/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-004-reject-release-when-reservation-is-expired.sdp.md index e44be146..5c93fd96 100644 --- a/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-004-reject-release-when-reservation-is-expired.sdp.md +++ b/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-004-reject-release-when-reservation-is-expired.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject release when reservation is expired" from examples/order-management/tests/features/behavior/deciders/release-reservation.decider.feature +- outcome: Executable scenario: Reject release when reservation is expired + +```gwt +Given a decider context +And a reservation state: +When I decide to release the reservation with reason "Too late" +Then the decision should be "rejected" +And the rejection code should be "RESERVATION_NOT_PENDING" +``` diff --git a/specs/behavior/order-management/deciders/release-reservation-decider.sdp.md b/specs/behavior/order-management/deciders/release-reservation-decider.sdp.md index ba9a45ad..62b5db20 100644 --- a/specs/behavior/order-management/deciders/release-reservation-decider.sdp.md +++ b/specs/behavior/order-management/deciders/release-reservation-decider.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Pure domain logic for releasing a reservation. The ReleaseReservation decider validates that: - Reservation must be in pending or confirmed status (FSM allows release from both) On success, it emits ReservationReleased and updates status to "released". (test carrier: examples/order-management/tests/features/behavior/deciders/release-reservation.decider.feature) +- outcome: Release Reservation Decider diff --git a/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-001-decide-to-remove-existing-item-from-draft-order.sdp.md b/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-001-decide-to-remove-existing-item-from-draft-order.sdp.md index 268345d6..dfa9a2e4 100644 --- a/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-001-decide-to-remove-existing-item-from-draft-order.sdp.md +++ b/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-001-decide-to-remove-existing-item-from-draft-order.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Decide to remove existing item from draft order" from examples/order-management/tests/features/behavior/deciders/remove-order-item.decider.feature +- outcome: Executable scenario: Decide to remove existing item from draft order + +```gwt +Given a decider context +And an order state with item: +When I decide to remove item with productId "prod_001" +Then the decision should be "success" +And the event type should be "OrderItemRemoved" +And the data should have itemCount 0 +And the data should have totalAmount "0.0" +``` diff --git a/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-002-reject-remove-item-when-order-is-not-in-draft.sdp.md b/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-002-reject-remove-item-when-order-is-not-in-draft.sdp.md index 826255a9..34ae3933 100644 --- a/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-002-reject-remove-item-when-order-is-not-in-draft.sdp.md +++ b/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-002-reject-remove-item-when-order-is-not-in-draft.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject remove item when order is not in draft" from examples/order-management/tests/features/behavior/deciders/remove-order-item.decider.feature +- outcome: Executable scenario: Reject remove item when order is not in draft + +```gwt +Given a decider context +And an order state: +When I decide to remove item with productId "prod_001" +Then the decision should be "rejected" +And the rejection code should be "ORDER_NOT_IN_DRAFT" +``` diff --git a/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-003-reject-remove-when-item-does-not-exist.sdp.md b/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-003-reject-remove-when-item-does-not-exist.sdp.md index c13b0a19..65da7aa7 100644 --- a/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-003-reject-remove-when-item-does-not-exist.sdp.md +++ b/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-003-reject-remove-when-item-does-not-exist.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject remove when item does not exist" from examples/order-management/tests/features/behavior/deciders/remove-order-item.decider.feature +- outcome: Executable scenario: Reject remove when item does not exist + +```gwt +Given a decider context +And an order state: +When I decide to remove item with productId "nonexistent" +Then the decision should be "rejected" +And the rejection code should be "ITEM_NOT_FOUND" +``` diff --git a/specs/behavior/order-management/deciders/remove-order-item-decider.sdp.md b/specs/behavior/order-management/deciders/remove-order-item-decider.sdp.md index 3b0d2be3..cf1ef91e 100644 --- a/specs/behavior/order-management/deciders/remove-order-item-decider.sdp.md +++ b/specs/behavior/order-management/deciders/remove-order-item-decider.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Pure domain logic for removing an item from an order. The RemoveOrderItem decider validates that: - Order must be in draft status - Item with the given productId must exist in the order (test carrier: examples/order-management/tests/features/behavior/deciders/remove-order-item.decider.feature) +- outcome: Remove Order Item Decider diff --git a/specs/behavior/order-management/deciders/reservation-evolve.examples/s-001-evolve-reservation-state-with-reservation-confirmed.sdp.md b/specs/behavior/order-management/deciders/reservation-evolve.examples/s-001-evolve-reservation-state-with-reservation-confirmed.sdp.md index 7662e87d..995bde65 100644 --- a/specs/behavior/order-management/deciders/reservation-evolve.examples/s-001-evolve-reservation-state-with-reservation-confirmed.sdp.md +++ b/specs/behavior/order-management/deciders/reservation-evolve.examples/s-001-evolve-reservation-state-with-reservation-confirmed.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Evolve reservation state with ReservationConfirmed" from examples/order-management/tests/features/behavior/deciders/reservation-evolve.feature +- outcome: Executable scenario: Evolve reservation state with ReservationConfirmed + +```gwt +Given a decider context +And a reservation state: +When I evolve with ReservationConfirmed event +Then the evolved reservation should have status "confirmed" +And the evolved reservation should have reservationId "res_001" +``` diff --git a/specs/behavior/order-management/deciders/reservation-evolve.examples/s-002-evolve-pending-reservation-with-reservation-released.sdp.md b/specs/behavior/order-management/deciders/reservation-evolve.examples/s-002-evolve-pending-reservation-with-reservation-released.sdp.md index da802d03..065671aa 100644 --- a/specs/behavior/order-management/deciders/reservation-evolve.examples/s-002-evolve-pending-reservation-with-reservation-released.sdp.md +++ b/specs/behavior/order-management/deciders/reservation-evolve.examples/s-002-evolve-pending-reservation-with-reservation-released.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Evolve pending reservation with ReservationReleased" from examples/order-management/tests/features/behavior/deciders/reservation-evolve.feature +- outcome: Executable scenario: Evolve pending reservation with ReservationReleased + +```gwt +Given a decider context +And a reservation state: +When I evolve with ReservationReleased event +Then the evolved reservation should have status "released" +``` diff --git a/specs/behavior/order-management/deciders/reservation-evolve.examples/s-003-evolve-confirmed-reservation-with-reservation-released.sdp.md b/specs/behavior/order-management/deciders/reservation-evolve.examples/s-003-evolve-confirmed-reservation-with-reservation-released.sdp.md index aaeb1b12..f11de991 100644 --- a/specs/behavior/order-management/deciders/reservation-evolve.examples/s-003-evolve-confirmed-reservation-with-reservation-released.sdp.md +++ b/specs/behavior/order-management/deciders/reservation-evolve.examples/s-003-evolve-confirmed-reservation-with-reservation-released.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Evolve confirmed reservation with ReservationReleased" from examples/order-management/tests/features/behavior/deciders/reservation-evolve.feature +- outcome: Executable scenario: Evolve confirmed reservation with ReservationReleased + +```gwt +Given a decider context +And a reservation state: +When I evolve with ReservationReleased event +Then the evolved reservation should have status "released" +``` diff --git a/specs/behavior/order-management/deciders/reservation-evolve.examples/s-004-evolve-pending-reservation-with-reservation-expired.sdp.md b/specs/behavior/order-management/deciders/reservation-evolve.examples/s-004-evolve-pending-reservation-with-reservation-expired.sdp.md index a2e16b15..a43d47b1 100644 --- a/specs/behavior/order-management/deciders/reservation-evolve.examples/s-004-evolve-pending-reservation-with-reservation-expired.sdp.md +++ b/specs/behavior/order-management/deciders/reservation-evolve.examples/s-004-evolve-pending-reservation-with-reservation-expired.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Evolve pending reservation with ReservationExpired" from examples/order-management/tests/features/behavior/deciders/reservation-evolve.feature +- outcome: Executable scenario: Evolve pending reservation with ReservationExpired + +```gwt +Given a decider context +And a reservation state: +When I evolve with ReservationExpired event +Then the evolved reservation should have status "expired" +``` diff --git a/specs/behavior/order-management/deciders/reservation-evolve.sdp.md b/specs/behavior/order-management/deciders/reservation-evolve.sdp.md index 2b96b9d4..9d67640c 100644 --- a/specs/behavior/order-management/deciders/reservation-evolve.sdp.md +++ b/specs/behavior/order-management/deciders/reservation-evolve.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Pure state transition functions for reservation events. These evolve functions apply events to produce new state, enabling deterministic event replay and projection rebuilding. (test carrier: examples/order-management/tests/features/behavior/deciders/reservation-evolve.feature) +- outcome: Reservation Evolve Functions diff --git a/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-001-decide-to-reserve-stock-when-all-products-have-sufficient-availability.sdp.md b/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-001-decide-to-reserve-stock-when-all-products-have-sufficient-availability.sdp.md index 2a3b6bd9..957d050e 100644 --- a/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-001-decide-to-reserve-stock-when-all-products-have-sufficient-availability.sdp.md +++ b/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-001-decide-to-reserve-stock-when-all-products-have-sufficient-availability.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Decide to reserve stock when all products have sufficient availability" from examples/order-management/tests/features/behavior/deciders/reserve-stock.decider.feature +- outcome: Executable scenario: Decide to reserve stock when all products have sufficient availability + +```gwt +Given a decider context +And products with available stock: +When I decide to reserve stock for order "ord_001" with items: +Then the decision should be "success" +And the event type should be "StockReserved" +And the data should have orderId "ord_001" +And the data should have itemCount 2 +``` diff --git a/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-002-fail-reservation-when-one-product-has-insufficient-stock.sdp.md b/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-002-fail-reservation-when-one-product-has-insufficient-stock.sdp.md index dca69fae..11f3fc04 100644 --- a/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-002-fail-reservation-when-one-product-has-insufficient-stock.sdp.md +++ b/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-002-fail-reservation-when-one-product-has-insufficient-stock.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Fail reservation when one product has insufficient stock" from examples/order-management/tests/features/behavior/deciders/reserve-stock.decider.feature +- outcome: Executable scenario: Fail reservation when one product has insufficient stock + +```gwt +Given a decider context +And products with available stock: +When I decide to reserve stock for order "ord_002" with items: +Then the decision should be "failed" +And the failure reason should contain "INSUFFICIENT_STOCK" +And the failure event type should be "ReservationFailed" +``` diff --git a/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-003-fail-reservation-when-product-does-not-exist.sdp.md b/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-003-fail-reservation-when-product-does-not-exist.sdp.md index babef856..3aaca10d 100644 --- a/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-003-fail-reservation-when-product-does-not-exist.sdp.md +++ b/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-003-fail-reservation-when-product-does-not-exist.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Fail reservation when product does not exist" from examples/order-management/tests/features/behavior/deciders/reserve-stock.decider.feature +- outcome: Executable scenario: Fail reservation when product does not exist + +```gwt +Given a decider context +And products with available stock: +When I decide to reserve stock for order "ord_003" with items: +Then the decision should be "failed" +And the failure reason should contain "INSUFFICIENT_STOCK" +``` diff --git a/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-004-reject-reservation-with-empty-items.sdp.md b/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-004-reject-reservation-with-empty-items.sdp.md index 9ef53bd3..81c36b93 100644 --- a/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-004-reject-reservation-with-empty-items.sdp.md +++ b/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-004-reject-reservation-with-empty-items.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject reservation with empty items" from examples/order-management/tests/features/behavior/deciders/reserve-stock.decider.feature +- outcome: Executable scenario: Reject reservation with empty items + +```gwt +Given a decider context +And products with available stock: +When I decide to reserve stock for order "ord_004" with empty items +Then the decision should be "rejected" +And the rejection code should be "EMPTY_RESERVATION" +``` diff --git a/specs/behavior/order-management/deciders/reserve-stock-decider.sdp.md b/specs/behavior/order-management/deciders/reserve-stock-decider.sdp.md index ecf3fd8c..0be6be05 100644 --- a/specs/behavior/order-management/deciders/reserve-stock-decider.sdp.md +++ b/specs/behavior/order-management/deciders/reserve-stock-decider.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Pure domain logic for reserving stock for an order. The ReserveStock decider validates that: - Items array must not be empty - All products must have sufficient available stock (test carrier: examples/order-management/tests/features/behavior/deciders/reserve-stock.decider.feature) +- outcome: Reserve Stock Decider diff --git a/specs/behavior/order-management/deciders/submit-order-decider.examples/s-001-decide-to-submit-draft-order-with-items.sdp.md b/specs/behavior/order-management/deciders/submit-order-decider.examples/s-001-decide-to-submit-draft-order-with-items.sdp.md index d6c48f06..5973b4c2 100644 --- a/specs/behavior/order-management/deciders/submit-order-decider.examples/s-001-decide-to-submit-draft-order-with-items.sdp.md +++ b/specs/behavior/order-management/deciders/submit-order-decider.examples/s-001-decide-to-submit-draft-order-with-items.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Decide to submit draft order with items" from examples/order-management/tests/features/behavior/deciders/submit-order.decider.feature +- outcome: Executable scenario: Decide to submit draft order with items + +```gwt +Given a decider context with timestamp 1704067200000 +And an order state: +When I decide to submit the order +Then the decision should be "success" +And the event type should be "OrderSubmitted" +And the event payload should contain "submittedAt" with value 1704067200000 +And the state update should set status to "submitted" +``` diff --git a/specs/behavior/order-management/deciders/submit-order-decider.examples/s-002-reject-submit-for-order-not-in-draft-status.sdp.md b/specs/behavior/order-management/deciders/submit-order-decider.examples/s-002-reject-submit-for-order-not-in-draft-status.sdp.md index afd3e0bf..333a7419 100644 --- a/specs/behavior/order-management/deciders/submit-order-decider.examples/s-002-reject-submit-for-order-not-in-draft-status.sdp.md +++ b/specs/behavior/order-management/deciders/submit-order-decider.examples/s-002-reject-submit-for-order-not-in-draft-status.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject submit for order not in draft status" from examples/order-management/tests/features/behavior/deciders/submit-order.decider.feature +- outcome: Executable scenario: Reject submit for order not in draft status + +```gwt +Given a decider context with timestamp 1704067200000 +And an order state: +When I decide to submit the order +Then the decision should be "rejected" +And the rejection code should be "ORDER_NOT_IN_DRAFT" +``` diff --git a/specs/behavior/order-management/deciders/submit-order-decider.examples/s-003-reject-submit-for-order-with-no-items.sdp.md b/specs/behavior/order-management/deciders/submit-order-decider.examples/s-003-reject-submit-for-order-with-no-items.sdp.md index 9be4e08c..63b3b496 100644 --- a/specs/behavior/order-management/deciders/submit-order-decider.examples/s-003-reject-submit-for-order-with-no-items.sdp.md +++ b/specs/behavior/order-management/deciders/submit-order-decider.examples/s-003-reject-submit-for-order-with-no-items.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject submit for order with no items" from examples/order-management/tests/features/behavior/deciders/submit-order.decider.feature +- outcome: Executable scenario: Reject submit for order with no items + +```gwt +Given a decider context with timestamp 1704067200000 +And an order state: +When I decide to submit the order +Then the decision should be "rejected" +And the rejection code should be "ORDER_HAS_NO_ITEMS" +``` diff --git a/specs/behavior/order-management/deciders/submit-order-decider.sdp.md b/specs/behavior/order-management/deciders/submit-order-decider.sdp.md index c4693ab8..cb2d1a80 100644 --- a/specs/behavior/order-management/deciders/submit-order-decider.sdp.md +++ b/specs/behavior/order-management/deciders/submit-order-decider.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Pure domain logic for submitting an order. The SubmitOrder decider validates that: - Order must be in draft status - Order must have at least one item (test carrier: examples/order-management/tests/features/behavior/deciders/submit-order.decider.feature) +- outcome: Submit Order Decider diff --git a/specs/behavior/order-management/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md b/specs/behavior/order-management/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md index 450ec303..b13b92bb 100644 --- a/specs/behavior/order-management/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md +++ b/specs/behavior/order-management/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Successfully add stock to existing product" from examples/order-management/tests/features/behavior/inventory/add-stock.feature +- outcome: Executable scenario: Successfully add stock to existing product + +```gwt +Given the backend is running and clean +And a product "prod-stock-01" exists with 0 stock +When I add stock to product "prod-stock-01": +Then the command should succeed +And I wait for projections to process +And the product "prod-stock-01" should have 50 available stock +``` diff --git a/specs/behavior/order-management/inventory/add-stock.examples/s-002-add-stock-to-product-with-existing-stock.sdp.md b/specs/behavior/order-management/inventory/add-stock.examples/s-002-add-stock-to-product-with-existing-stock.sdp.md index 335c1f59..5058fbfe 100644 --- a/specs/behavior/order-management/inventory/add-stock.examples/s-002-add-stock-to-product-with-existing-stock.sdp.md +++ b/specs/behavior/order-management/inventory/add-stock.examples/s-002-add-stock-to-product-with-existing-stock.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Add stock to product with existing stock" from examples/order-management/tests/features/behavior/inventory/add-stock.feature +- outcome: Executable scenario: Add stock to product with existing stock + +```gwt +Given the system is ready +And a product "prod_stock_002" exists with stock +When I send an AddStock command with: +Then the command should succeed +``` diff --git a/specs/behavior/order-management/inventory/add-stock.examples/s-003-cannot-add-stock-to-non-existent-product.sdp.md b/specs/behavior/order-management/inventory/add-stock.examples/s-003-cannot-add-stock-to-non-existent-product.sdp.md index 9ded9921..f083f510 100644 --- a/specs/behavior/order-management/inventory/add-stock.examples/s-003-cannot-add-stock-to-non-existent-product.sdp.md +++ b/specs/behavior/order-management/inventory/add-stock.examples/s-003-cannot-add-stock-to-non-existent-product.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cannot add stock to non-existent product" from examples/order-management/tests/features/behavior/inventory/add-stock.feature +- outcome: Executable scenario: Cannot add stock to non-existent product + +```gwt +Given the system is ready +And no product exists with ID "prod_nonexistent" +When I send an AddStock command with: +Then the command should be rejected with code "PRODUCT_NOT_FOUND" +``` diff --git a/specs/behavior/order-management/inventory/add-stock.examples/s-004-add-stock-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/inventory/add-stock.examples/s-004-add-stock-is-idempotent-with-same-command-id.sdp.md index e0f63702..9498b3dc 100644 --- a/specs/behavior/order-management/inventory/add-stock.examples/s-004-add-stock-is-idempotent-with-same-command-id.sdp.md +++ b/specs/behavior/order-management/inventory/add-stock.examples/s-004-add-stock-is-idempotent-with-same-command-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "AddStock is idempotent with same commandId" from examples/order-management/tests/features/behavior/inventory/add-stock.feature +- outcome: Executable scenario: AddStock is idempotent with same commandId + +```gwt +Given the backend is running and clean +And a product "prod-stock-02" exists with 10 stock +When I add stock with commandId "cmd-stock-idem-01" to product "prod-stock-02": and I repeat adding stock with commandId "cmd-stock-idem-01" to product "prod-stock-02": +Then the second command should return duplicate status +``` diff --git a/specs/behavior/order-management/inventory/add-stock.sdp.md b/specs/behavior/order-management/inventory/add-stock.sdp.md index 6e26fb9f..d03d0436 100644 --- a/specs/behavior/order-management/inventory/add-stock.sdp.md +++ b/specs/behavior/order-management/inventory/add-stock.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: to add stock to existing products so that products are available for sale (test carrier: examples/order-management/tests/features/behavior/inventory/add-stock.feature) +- actor: an inventory manager +- outcome: to add stock to existing products so that products are available for sale diff --git a/specs/behavior/order-management/inventory/confirm-reservation.examples/s-001-successfully-confirm-pending-reservation.sdp.md b/specs/behavior/order-management/inventory/confirm-reservation.examples/s-001-successfully-confirm-pending-reservation.sdp.md index d8b391be..368ad6f5 100644 --- a/specs/behavior/order-management/inventory/confirm-reservation.examples/s-001-successfully-confirm-pending-reservation.sdp.md +++ b/specs/behavior/order-management/inventory/confirm-reservation.examples/s-001-successfully-confirm-pending-reservation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Successfully confirm pending reservation" from examples/order-management/tests/features/behavior/inventory/confirm-reservation.feature +- outcome: Executable scenario: Successfully confirm pending reservation + +```gwt +Given the system is ready +And a product "prod_confirm_001" exists with 50 available and 10 reserved stock +And a pending reservation "res_confirm_001" exists for order "ord_confirm_001" +When I send a ConfirmReservation command for "res_confirm_001" +Then the command should succeed +``` diff --git a/specs/behavior/order-management/inventory/confirm-reservation.examples/s-002-cannot-confirm-non-existent-reservation.sdp.md b/specs/behavior/order-management/inventory/confirm-reservation.examples/s-002-cannot-confirm-non-existent-reservation.sdp.md index 3f85f64c..385ccad9 100644 --- a/specs/behavior/order-management/inventory/confirm-reservation.examples/s-002-cannot-confirm-non-existent-reservation.sdp.md +++ b/specs/behavior/order-management/inventory/confirm-reservation.examples/s-002-cannot-confirm-non-existent-reservation.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cannot confirm non-existent reservation" from examples/order-management/tests/features/behavior/inventory/confirm-reservation.feature +- outcome: Executable scenario: Cannot confirm non-existent reservation + +```gwt +Given the system is ready +And no reservation exists with ID "res_ghost" +When I send a ConfirmReservation command for "res_ghost" +Then the command should be rejected with code "RESERVATION_NOT_FOUND" +``` diff --git a/specs/behavior/order-management/inventory/confirm-reservation.examples/s-003-cannot-confirm-already-confirmed-reservation.sdp.md b/specs/behavior/order-management/inventory/confirm-reservation.examples/s-003-cannot-confirm-already-confirmed-reservation.sdp.md index 3be07fa4..dc632538 100644 --- a/specs/behavior/order-management/inventory/confirm-reservation.examples/s-003-cannot-confirm-already-confirmed-reservation.sdp.md +++ b/specs/behavior/order-management/inventory/confirm-reservation.examples/s-003-cannot-confirm-already-confirmed-reservation.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cannot confirm already confirmed reservation" from examples/order-management/tests/features/behavior/inventory/confirm-reservation.feature +- outcome: Executable scenario: Cannot confirm already confirmed reservation + +```gwt +Given the system is ready +And a confirmed reservation "res_confirm_002" exists for order "ord_confirm_002" +When I send a ConfirmReservation command for "res_confirm_002" +Then the command should be rejected with code "RESERVATION_NOT_PENDING" +``` diff --git a/specs/behavior/order-management/inventory/confirm-reservation.examples/s-004-confirm-reservation-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/inventory/confirm-reservation.examples/s-004-confirm-reservation-is-idempotent-with-same-command-id.sdp.md index 6725545d..8115540e 100644 --- a/specs/behavior/order-management/inventory/confirm-reservation.examples/s-004-confirm-reservation-is-idempotent-with-same-command-id.sdp.md +++ b/specs/behavior/order-management/inventory/confirm-reservation.examples/s-004-confirm-reservation-is-idempotent-with-same-command-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "ConfirmReservation is idempotent with same commandId" from examples/order-management/tests/features/behavior/inventory/confirm-reservation.feature +- outcome: Executable scenario: ConfirmReservation is idempotent with same commandId + +```gwt +Given the system is ready +And a pending reservation "res_confirm_003" exists for order "ord_confirm_003" +When I send a ConfirmReservation command twice with the same commandId for "res_confirm_003" +Then the second command should return duplicate status +``` diff --git a/specs/behavior/order-management/inventory/confirm-reservation.sdp.md b/specs/behavior/order-management/inventory/confirm-reservation.sdp.md index 7f4aa31c..e3e81ab1 100644 --- a/specs/behavior/order-management/inventory/confirm-reservation.sdp.md +++ b/specs/behavior/order-management/inventory/confirm-reservation.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: to confirm stock reservations so that reserved stock is permanently allocated to orders (test carrier: examples/order-management/tests/features/behavior/inventory/confirm-reservation.feature) +- outcome: to confirm stock reservations so that reserved stock is permanently allocated to orders diff --git a/specs/behavior/order-management/inventory/create-product.examples/s-001-successfully-create-a-new-product.sdp.md b/specs/behavior/order-management/inventory/create-product.examples/s-001-successfully-create-a-new-product.sdp.md index de38e25b..abd05510 100644 --- a/specs/behavior/order-management/inventory/create-product.examples/s-001-successfully-create-a-new-product.sdp.md +++ b/specs/behavior/order-management/inventory/create-product.examples/s-001-successfully-create-a-new-product.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Successfully create a new product" from examples/order-management/tests/features/behavior/inventory/create-product.feature +- outcome: Executable scenario: Successfully create a new product + +```gwt +Given the system is ready +And no product exists with ID "prod_test_001" +When I send a CreateProduct command with: +Then the command should succeed +``` diff --git a/specs/behavior/order-management/inventory/create-product.examples/s-002-cannot-create-product-with-existing-id.sdp.md b/specs/behavior/order-management/inventory/create-product.examples/s-002-cannot-create-product-with-existing-id.sdp.md index 65d9e799..54b11f46 100644 --- a/specs/behavior/order-management/inventory/create-product.examples/s-002-cannot-create-product-with-existing-id.sdp.md +++ b/specs/behavior/order-management/inventory/create-product.examples/s-002-cannot-create-product-with-existing-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cannot create product with existing ID" from examples/order-management/tests/features/behavior/inventory/create-product.feature +- outcome: Executable scenario: Cannot create product with existing ID + +```gwt +Given the system is ready +And a product "prod_test_002" already exists +When I send a CreateProduct command with: +Then the command should be rejected with code "PRODUCT_ALREADY_EXISTS" +``` diff --git a/specs/behavior/order-management/inventory/create-product.examples/s-003-create-product-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/inventory/create-product.examples/s-003-create-product-is-idempotent-with-same-command-id.sdp.md index 66586a8b..51eb73b7 100644 --- a/specs/behavior/order-management/inventory/create-product.examples/s-003-create-product-is-idempotent-with-same-command-id.sdp.md +++ b/specs/behavior/order-management/inventory/create-product.examples/s-003-create-product-is-idempotent-with-same-command-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "CreateProduct is idempotent with same commandId" from examples/order-management/tests/features/behavior/inventory/create-product.feature +- outcome: Executable scenario: CreateProduct is idempotent with same commandId + +```gwt +Given the backend is running and clean +When I create a product with commandId "cmd-prod-idem-01": and I repeat creating a product with commandId "cmd-prod-idem-01": +Then the second command should return duplicate status +``` diff --git a/specs/behavior/order-management/inventory/create-product.sdp.md b/specs/behavior/order-management/inventory/create-product.sdp.md index 44ad7bce..4e80e60c 100644 --- a/specs/behavior/order-management/inventory/create-product.sdp.md +++ b/specs/behavior/order-management/inventory/create-product.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: to create new products in the catalog so that they can be sold and tracked (test carrier: examples/order-management/tests/features/behavior/inventory/create-product.feature) +- actor: an inventory manager +- outcome: to create new products in the catalog so that they can be sold and tracked diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-001-sum-of-available-and-reserved.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-001-sum-of-available-and-reserved.sdp.md index 2163c040..05edbb06 100644 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-001-sum-of-available-and-reserved.sdp.md +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-001-sum-of-available-and-reserved.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Sum of available and reserved" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature +- outcome: Executable scenario: Sum of available and reserved + +```gwt +Given the inventory domain module is imported +And an inventory CMS with availableQuantity 100 and reservedQuantity 25 +When I calculate the total quantity +Then the total quantity is 125 +``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-002-only-available-when-reserved-is-zero.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-002-only-available-when-reserved-is-zero.sdp.md index 88f73122..1431e3ca 100644 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-002-only-available-when-reserved-is-zero.sdp.md +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-002-only-available-when-reserved-is-zero.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Only available when reserved is zero" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature +- outcome: Executable scenario: Only available when reserved is zero + +```gwt +Given the inventory domain module is imported +And an inventory CMS with availableQuantity 50 and reservedQuantity 0 +When I calculate the total quantity +Then the total quantity is 50 +``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-003-only-reserved-when-available-is-zero.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-003-only-reserved-when-available-is-zero.sdp.md index 8376b85f..bc7e6bb9 100644 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-003-only-reserved-when-available-is-zero.sdp.md +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-003-only-reserved-when-available-is-zero.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Only reserved when available is zero" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature +- outcome: Executable scenario: Only reserved when available is zero + +```gwt +Given the inventory domain module is imported +And an inventory CMS with availableQuantity 0 and reservedQuantity 30 +When I calculate the total quantity +Then the total quantity is 30 +``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-004-both-quantities-are-zero.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-004-both-quantities-are-zero.sdp.md index 7691341c..d9a42048 100644 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-004-both-quantities-are-zero.sdp.md +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-004-both-quantities-are-zero.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Both quantities are zero" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature +- outcome: Executable scenario: Both quantities are zero + +```gwt +Given the inventory domain module is imported +And an inventory CMS with availableQuantity 0 and reservedQuantity 0 +When I calculate the total quantity +Then the total quantity is 0 +``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-005-cms-fields-match-input-parameters.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-005-cms-fields-match-input-parameters.sdp.md index 753954a8..651fbbe9 100644 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-005-cms-fields-match-input-parameters.sdp.md +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-005-cms-fields-match-input-parameters.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "CMS fields match input parameters" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature +- outcome: Executable scenario: CMS fields match input parameters + +```gwt +Given the inventory domain module is imported +When I create an initial inventory CMS with productId "prod_123", productName "Test Widget", sku "SKU-TEST-001", and unitPrice 29.99 +Then the CMS has the following field values: +``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-006-initial-quantities-and-version-are-zero.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-006-initial-quantities-and-version-are-zero.sdp.md index c09d61ed..5c7739ab 100644 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-006-initial-quantities-and-version-are-zero.sdp.md +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-006-initial-quantities-and-version-are-zero.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Initial quantities and version are zero" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature +- outcome: Executable scenario: Initial quantities and version are zero + +```gwt +Given the inventory domain module is imported +When I create an initial inventory CMS with productId "prod_123", productName "Test", sku "SKU-001", and unitPrice 10.00 +Then the CMS has the following numeric field values: +And the CMS stateVersion equals the current inventory CMS version +``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-007-timestamps-are-set-to-current-time.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-007-timestamps-are-set-to-current-time.sdp.md index 3bf7cec3..9959852a 100644 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-007-timestamps-are-set-to-current-time.sdp.md +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-007-timestamps-are-set-to-current-time.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Timestamps are set to current time" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature +- outcome: Executable scenario: Timestamps are set to current time + +```gwt +Given the inventory domain module is imported +And I record the current time +When I create an initial inventory CMS with productId "prod_123", productName "Test", sku "SKU-001", and unitPrice 10.00 +Then the CMS createdAt is between the recorded time and now +And the CMS updatedAt equals createdAt +``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-008-current-version-cms-is-unchanged.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-008-current-version-cms-is-unchanged.sdp.md index 8bb31225..2eac122a 100644 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-008-current-version-cms-is-unchanged.sdp.md +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-008-current-version-cms-is-unchanged.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Current version CMS is unchanged" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature +- outcome: Executable scenario: Current version CMS is unchanged + +```gwt +Given the inventory domain module is imported +And an inventory CMS at the current stateVersion with productId "prod_123" and availableQuantity 100 +When I upcast the inventory CMS +Then the upcasted CMS equals the original CMS +And the upcasted CMS stateVersion equals the current inventory CMS version +``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-009-missing-state-version-is-upgraded.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-009-missing-state-version-is-upgraded.sdp.md index 7105496b..5e6dd23f 100644 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-009-missing-state-version-is-upgraded.sdp.md +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-009-missing-state-version-is-upgraded.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Missing stateVersion is upgraded" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature +- outcome: Executable scenario: Missing stateVersion is upgraded + +```gwt +Given the inventory domain module is imported +And an inventory CMS without a stateVersion field and with productId "prod_123" and availableQuantity 50 +When I upcast the inventory CMS +Then the upcasted CMS stateVersion equals the current inventory CMS version +And the upcasted CMS productId is "prod_123" +And the upcasted CMS availableQuantity is 50 +``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-010-version-0-is-upgraded.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-010-version-0-is-upgraded.sdp.md index 75cf10a2..9f241f10 100644 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-010-version-0-is-upgraded.sdp.md +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-010-version-0-is-upgraded.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Version 0 is upgraded" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature +- outcome: Executable scenario: Version 0 is upgraded + +```gwt +Given the inventory domain module is imported +And an inventory CMS with stateVersion 0, productId "prod_123", availableQuantity 75, and reservedQuantity 15 +When I upcast the inventory CMS +Then the upcasted CMS stateVersion equals the current inventory CMS version +And the upcasted CMS has the following preserved fields: +``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-011-all-fields-are-preserved-during-upcast.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-011-all-fields-are-preserved-during-upcast.sdp.md index 8f1061fe..cbba0d86 100644 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-011-all-fields-are-preserved-during-upcast.sdp.md +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-011-all-fields-are-preserved-during-upcast.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "All fields are preserved during upcast" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature +- outcome: Executable scenario: All fields are preserved during upcast + +```gwt +Given the inventory domain module is imported +And an inventory CMS with stateVersion 0 and the following fields: +When I upcast the inventory CMS +Then the upcasted CMS has the following preserved fields: +``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-012-future-version-throws-error.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-012-future-version-throws-error.sdp.md index 38b18116..48e7c690 100644 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-012-future-version-throws-error.sdp.md +++ b/specs/behavior/order-management/inventory/inventory-domain.examples/s-012-future-version-throws-error.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Future version throws error" from examples/order-management/tests/features/behavior/inventory/inventory-domain.feature +- outcome: Executable scenario: Future version throws error + +```gwt +Given the inventory domain module is imported +And an inventory CMS with a stateVersion 10 higher than the current version +When I attempt to upcast the inventory CMS +Then an error is thrown mentioning "newer than supported version" +``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.sdp.md index 1e2a38af..46e09643 100644 --- a/specs/behavior/order-management/inventory/inventory-domain.sdp.md +++ b/specs/behavior/order-management/inventory/inventory-domain.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: pure domain functions to behave correctly so that inventory state is calculated, initialized, and upcasted reliably (test carrier: examples/order-management/tests/features/behavior/inventory/inventory-domain.feature) +- actor: a developer working with the Inventory bounded context +- outcome: pure domain functions to behave correctly so that inventory state is calculated, initialized, and upcasted reliably + +## Behavior + +- rule: calculateTotalQuantity returns the sum of available and reserved quantities +- rule: createInitialInventoryCMS produces a correctly initialized CMS record +- rule: upcastInventoryCMS migrates older CMS versions to the current version +- rule: upcastInventoryCMS rejects future CMS versions diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-001-passes-for-a-valid-product.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-001-passes-for-a-valid-product.sdp.md index 63774e30..51b70ca3 100644 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-001-passes-for-a-valid-product.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-001-passes-for-a-valid-product.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "passes for a valid product" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature +- outcome: Executable scenario: passes for a valid product + +```gwt +Given a valid product +When I call assertProductExists +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-002-throws-product-not-found-for-null-product-reference.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-002-throws-product-not-found-for-null-product-reference.sdp.md index 860ef04b..c367abd6 100644 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-002-throws-product-not-found-for-null-product-reference.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-002-throws-product-not-found-for-null-product-reference.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "throws PRODUCT_NOT_FOUND for null product reference" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature +- outcome: Executable scenario: throws PRODUCT_NOT_FOUND for null product reference + +```gwt +Given a null product reference +When I call assertProductExists +Then an InventoryInvariantError is thrown with code "PRODUCT_NOT_FOUND" +``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-003-throws-product-not-found-for-undefined-product-reference.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-003-throws-product-not-found-for-undefined-product-reference.sdp.md index d15f4400..a2abeee3 100644 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-003-throws-product-not-found-for-undefined-product-reference.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-003-throws-product-not-found-for-undefined-product-reference.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "throws PRODUCT_NOT_FOUND for undefined product reference" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature +- outcome: Executable scenario: throws PRODUCT_NOT_FOUND for undefined product reference + +```gwt +Given an undefined product reference +When I call assertProductExists +Then an InventoryInvariantError is thrown with code "PRODUCT_NOT_FOUND" +``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-004-passes-for-null-product-reference.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-004-passes-for-null-product-reference.sdp.md index 86520bb2..16b58d5b 100644 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-004-passes-for-null-product-reference.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-004-passes-for-null-product-reference.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "passes for null product reference" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature +- outcome: Executable scenario: passes for null product reference + +```gwt +Given a null product reference +When I call assertProductDoesNotExist +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-005-passes-for-undefined-product-reference.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-005-passes-for-undefined-product-reference.sdp.md index 3f47ab08..41da7615 100644 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-005-passes-for-undefined-product-reference.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-005-passes-for-undefined-product-reference.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "passes for undefined product reference" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature +- outcome: Executable scenario: passes for undefined product reference + +```gwt +Given an undefined product reference +When I call assertProductDoesNotExist +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-006-throws-product-already-exists-for-existing-product.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-006-throws-product-already-exists-for-existing-product.sdp.md index f81c2ab3..2b1e35fd 100644 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-006-throws-product-already-exists-for-existing-product.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-006-throws-product-already-exists-for-existing-product.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "throws PRODUCT_ALREADY_EXISTS for existing product" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature +- outcome: Executable scenario: throws PRODUCT_ALREADY_EXISTS for existing product + +```gwt +Given an existing product with productId "prod_existing" +When I call assertProductDoesNotExist +Then an InventoryInvariantError is thrown with code "PRODUCT_ALREADY_EXISTS" +And the error context contains productId "prod_existing" +``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-007-passes-for-standard-sku.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-007-passes-for-standard-sku.sdp.md index 759ebb85..13cb7d0b 100644 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-007-passes-for-standard-sku.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-007-passes-for-standard-sku.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "passes for standard SKU" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature +- outcome: Executable scenario: passes for standard SKU + +```gwt +Given the SKU value "SKU-123" +When I call assertValidSku +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-008-passes-for-sku-with-special-characters.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-008-passes-for-sku-with-special-characters.sdp.md index 90b23787..f7a3a5fb 100644 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-008-passes-for-sku-with-special-characters.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-008-passes-for-sku-with-special-characters.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "passes for SKU with special characters" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature +- outcome: Executable scenario: passes for SKU with special characters + +```gwt +Given the SKU value "SKU_ABC-123/XYZ" +When I call assertValidSku +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-009-throws-invalid-sku-for-empty-sku.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-009-throws-invalid-sku-for-empty-sku.sdp.md index 7097cc6b..9e97b4ee 100644 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-009-throws-invalid-sku-for-empty-sku.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-009-throws-invalid-sku-for-empty-sku.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "throws INVALID_SKU for empty SKU" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature +- outcome: Executable scenario: throws INVALID_SKU for empty SKU + +```gwt +Given an empty SKU value +When I call assertValidSku +Then an InventoryInvariantError is thrown with code "INVALID_SKU" +``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-010-throws-invalid-sku-for-whitespace-only-sku.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-010-throws-invalid-sku-for-whitespace-only-sku.sdp.md index 977472a4..0494d2b5 100644 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-010-throws-invalid-sku-for-whitespace-only-sku.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-010-throws-invalid-sku-for-whitespace-only-sku.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "throws INVALID_SKU for whitespace-only SKU" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature +- outcome: Executable scenario: throws INVALID_SKU for whitespace-only SKU + +```gwt +Given a whitespace-only SKU value +When I call assertValidSku +Then an InventoryInvariantError is thrown with code "INVALID_SKU" +``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-011-passes-for-standard-product-name.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-011-passes-for-standard-product-name.sdp.md index 10f637aa..36539bdc 100644 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-011-passes-for-standard-product-name.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-011-passes-for-standard-product-name.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "passes for standard product name" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature +- outcome: Executable scenario: passes for standard product name + +```gwt +Given the product name "Test Product" +When I call assertValidProductName +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-012-passes-for-product-name-with-numbers.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-012-passes-for-product-name-with-numbers.sdp.md index 747dc2a6..3c7d311f 100644 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-012-passes-for-product-name-with-numbers.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-012-passes-for-product-name-with-numbers.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "passes for product name with numbers" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature +- outcome: Executable scenario: passes for product name with numbers + +```gwt +Given the product name "Widget 2000" +When I call assertValidProductName +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-013-throws-invalid-product-name-for-empty-product-name.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-013-throws-invalid-product-name-for-empty-product-name.sdp.md index 2b8b62e8..09c1cdcf 100644 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-013-throws-invalid-product-name-for-empty-product-name.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-013-throws-invalid-product-name-for-empty-product-name.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "throws INVALID_PRODUCT_NAME for empty product name" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature +- outcome: Executable scenario: throws INVALID_PRODUCT_NAME for empty product name + +```gwt +Given an empty product name +When I call assertValidProductName +Then an InventoryInvariantError is thrown with code "INVALID_PRODUCT_NAME" +``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-014-throws-invalid-product-name-for-whitespace-only-product-name.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-014-throws-invalid-product-name-for-whitespace-only-product-name.sdp.md index 57698cef..0fc6bc34 100644 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-014-throws-invalid-product-name-for-whitespace-only-product-name.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-014-throws-invalid-product-name-for-whitespace-only-product-name.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "throws INVALID_PRODUCT_NAME for whitespace-only product name" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature +- outcome: Executable scenario: throws INVALID_PRODUCT_NAME for whitespace-only product name + +```gwt +Given a whitespace-only product name +When I call assertValidProductName +Then an InventoryInvariantError is thrown with code "INVALID_PRODUCT_NAME" +``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-015-passes-for-positive-integer-10.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-015-passes-for-positive-integer-10.sdp.md index d79d6a55..8ade3b5f 100644 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-015-passes-for-positive-integer-10.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-015-passes-for-positive-integer-10.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "passes for positive integer 10" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature +- outcome: Executable scenario: passes for positive integer 10 + +```gwt +Given the quantity value 10 +When I call assertPositiveQuantity +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-016-passes-for-positive-integer-1.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-016-passes-for-positive-integer-1.sdp.md index 30f12908..568a762b 100644 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-016-passes-for-positive-integer-1.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-016-passes-for-positive-integer-1.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "passes for positive integer 1" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature +- outcome: Executable scenario: passes for positive integer 1 + +```gwt +Given the quantity value 1 +When I call assertPositiveQuantity +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-017-throws-invalid-quantity-for-zero.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-017-throws-invalid-quantity-for-zero.sdp.md index efd1c826..674a3fe5 100644 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-017-throws-invalid-quantity-for-zero.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-017-throws-invalid-quantity-for-zero.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "throws INVALID_QUANTITY for zero" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature +- outcome: Executable scenario: throws INVALID_QUANTITY for zero + +```gwt +Given the quantity value 0 +When I call assertPositiveQuantity +Then an InventoryInvariantError is thrown with code "INVALID_QUANTITY" +``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-018-throws-invalid-quantity-for-negative-number.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-018-throws-invalid-quantity-for-negative-number.sdp.md index a13308f9..fad26dea 100644 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-018-throws-invalid-quantity-for-negative-number.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-018-throws-invalid-quantity-for-negative-number.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "throws INVALID_QUANTITY for negative number" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature +- outcome: Executable scenario: throws INVALID_QUANTITY for negative number + +```gwt +Given the quantity value -5 +When I call assertPositiveQuantity +Then an InventoryInvariantError is thrown with code "INVALID_QUANTITY" +And the error context contains quantity -5 +``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-019-throws-invalid-quantity-for-non-integer.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-019-throws-invalid-quantity-for-non-integer.sdp.md index d36659da..49975350 100644 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-019-throws-invalid-quantity-for-non-integer.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-019-throws-invalid-quantity-for-non-integer.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "throws INVALID_QUANTITY for non-integer" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature +- outcome: Executable scenario: throws INVALID_QUANTITY for non-integer + +```gwt +Given the quantity value 1.5 +When I call assertPositiveQuantity +Then an InventoryInvariantError is thrown with code "INVALID_QUANTITY" +``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-020-includes-context-string-in-error-message.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-020-includes-context-string-in-error-message.sdp.md index fcdeee6b..25ef7859 100644 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-020-includes-context-string-in-error-message.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.examples/s-020-includes-context-string-in-error-message.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "includes context string in error message" from examples/order-management/tests/features/behavior/inventory/product-invariants.feature +- outcome: Executable scenario: includes context string in error message + +```gwt +Given the quantity value 0 with context "adding stock" +When I call assertPositiveQuantity with context +Then the error message contains "adding stock" +``` diff --git a/specs/behavior/order-management/inventory/product-invariants.sdp.md b/specs/behavior/order-management/inventory/product-invariants.sdp.md index b5d53457..14ae5e1b 100644 --- a/specs/behavior/order-management/inventory/product-invariants.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: pure invariant functions that validate product state so that invalid state transitions are prevented with structured error information (test carrier: examples/order-management/tests/features/behavior/inventory/product-invariants.feature) +- actor: a developer working with the Inventory aggregate +- outcome: pure invariant functions that validate product state so that invalid state transitions are prevented with structured error information + +## Behavior + +- rule: assertProductExists validates that a product reference is not null or undefined +- rule: assertProductDoesNotExist validates that a product reference is null or undefined +- rule: assertValidSku validates that a SKU string is non-empty +- rule: assertValidProductName validates that a product name is non-empty +- rule: assertPositiveQuantity validates that a quantity is a positive integer diff --git a/specs/behavior/order-management/inventory/release-reservation.examples/s-001-successfully-release-pending-reservation.sdp.md b/specs/behavior/order-management/inventory/release-reservation.examples/s-001-successfully-release-pending-reservation.sdp.md index 256093d9..092fb21a 100644 --- a/specs/behavior/order-management/inventory/release-reservation.examples/s-001-successfully-release-pending-reservation.sdp.md +++ b/specs/behavior/order-management/inventory/release-reservation.examples/s-001-successfully-release-pending-reservation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Successfully release pending reservation" from examples/order-management/tests/features/behavior/inventory/release-reservation.feature +- outcome: Executable scenario: Successfully release pending reservation + +```gwt +Given the system is ready +And a product "prod_release_001" exists with 50 available and 10 reserved stock +And a pending reservation "res_release_001" exists for order "ord_release_001" with: +When I send a ReleaseReservation command for "res_release_001" with reason "Order cancelled" +Then the command should succeed +``` diff --git a/specs/behavior/order-management/inventory/release-reservation.examples/s-002-can-release-confirmed-reservation-for-order-cancellation.sdp.md b/specs/behavior/order-management/inventory/release-reservation.examples/s-002-can-release-confirmed-reservation-for-order-cancellation.sdp.md index 60ec980d..09d7a52a 100644 --- a/specs/behavior/order-management/inventory/release-reservation.examples/s-002-can-release-confirmed-reservation-for-order-cancellation.sdp.md +++ b/specs/behavior/order-management/inventory/release-reservation.examples/s-002-can-release-confirmed-reservation-for-order-cancellation.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Can release confirmed reservation (for order cancellation)" from examples/order-management/tests/features/behavior/inventory/release-reservation.feature +- outcome: Executable scenario: Can release confirmed reservation (for order cancellation) + +```gwt +Given the system is ready +And a confirmed reservation "res_release_002" exists for order "ord_release_002" +When I send a ReleaseReservation command for "res_release_002" with reason "Order cancelled after confirmation" +Then the command should succeed +``` diff --git a/specs/behavior/order-management/inventory/release-reservation.examples/s-003-release-reservation-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/inventory/release-reservation.examples/s-003-release-reservation-is-idempotent-with-same-command-id.sdp.md index f219cc95..b24be1fc 100644 --- a/specs/behavior/order-management/inventory/release-reservation.examples/s-003-release-reservation-is-idempotent-with-same-command-id.sdp.md +++ b/specs/behavior/order-management/inventory/release-reservation.examples/s-003-release-reservation-is-idempotent-with-same-command-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "ReleaseReservation is idempotent with same commandId" from examples/order-management/tests/features/behavior/inventory/release-reservation.feature +- outcome: Executable scenario: ReleaseReservation is idempotent with same commandId + +```gwt +Given the system is ready +And a pending reservation "res_release_003" exists for order "ord_release_003" +When I send a ReleaseReservation command twice with the same commandId for "res_release_003" +Then the second command should return duplicate status +``` diff --git a/specs/behavior/order-management/inventory/release-reservation.sdp.md b/specs/behavior/order-management/inventory/release-reservation.sdp.md index 46c9340e..52c46522 100644 --- a/specs/behavior/order-management/inventory/release-reservation.sdp.md +++ b/specs/behavior/order-management/inventory/release-reservation.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: to release stock reservations so that stock returns to available when orders are cancelled (test carrier: examples/order-management/tests/features/behavior/inventory/release-reservation.feature) +- outcome: to release stock reservations so that stock returns to available when orders are cancelled diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-001-single-item-reservation-returns-count-of-1.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-001-single-item-reservation-returns-count-of-1.sdp.md index e3a750bc..2203a73f 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-001-single-item-reservation-returns-count-of-1.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-001-single-item-reservation-returns-count-of-1.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Single item reservation returns count of 1" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Single item reservation returns count of 1 + +```gwt +Given a reservation with 1 item +When I calculate the reservation item count +Then the item count is 1 +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-002-multiple-items-reservation-returns-correct-count.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-002-multiple-items-reservation-returns-correct-count.sdp.md index 35a12b00..874ecc61 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-002-multiple-items-reservation-returns-correct-count.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-002-multiple-items-reservation-returns-correct-count.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Multiple items reservation returns correct count" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Multiple items reservation returns correct count + +```gwt +Given a reservation with 3 items +When I calculate the reservation item count +Then the item count is 3 +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-003-empty-items-reservation-returns-count-of-0.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-003-empty-items-reservation-returns-count-of-0.sdp.md index d30b2a12..25917f53 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-003-empty-items-reservation-returns-count-of-0.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-003-empty-items-reservation-returns-count-of-0.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Empty items reservation returns count of 0" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Empty items reservation returns count of 0 + +```gwt +Given a reservation with 0 items +When I calculate the reservation item count +Then the item count is 0 +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-004-multiple-items-returns-sum-of-all-quantities.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-004-multiple-items-returns-sum-of-all-quantities.sdp.md index ba0157df..d526e214 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-004-multiple-items-returns-sum-of-all-quantities.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-004-multiple-items-returns-sum-of-all-quantities.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Multiple items returns sum of all quantities" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Multiple items returns sum of all quantities + +```gwt +Given reservation items with quantities 5, 3, and 10 +When I calculate the total reserved quantity +Then the total reserved quantity is 18 +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-005-single-item-returns-its-quantity.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-005-single-item-returns-its-quantity.sdp.md index 4c3c1668..af035089 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-005-single-item-returns-its-quantity.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-005-single-item-returns-its-quantity.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Single item returns its quantity" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Single item returns its quantity + +```gwt +Given reservation items with quantity 7 +When I calculate the total reserved quantity +Then the total reserved quantity is 7 +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-006-empty-items-returns-0.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-006-empty-items-returns-0.sdp.md index 9899606e..0566834d 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-006-empty-items-returns-0.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-006-empty-items-returns-0.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Empty items returns 0" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Empty items returns 0 + +```gwt +Given no reservation items +When I calculate the total reserved quantity +Then the total reserved quantity is 0 +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-007-creates-cms-with-correct-reservation-id-and-order-id.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-007-creates-cms-with-correct-reservation-id-and-order-id.sdp.md index e63ed15b..3367da47 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-007-creates-cms-with-correct-reservation-id-and-order-id.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-007-creates-cms-with-correct-reservation-id-and-order-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Creates CMS with correct reservationId and orderId" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Creates CMS with correct reservationId and orderId + +```gwt +Given reservation ID "res_123" and order ID "ord_456" +When I create an initial reservation CMS with 1 item +Then the CMS has the following properties: +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-008-initializes-items-array-correctly.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-008-initializes-items-array-correctly.sdp.md index 2da9f452..fb57859a 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-008-initializes-items-array-correctly.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-008-initializes-items-array-correctly.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Initializes items array correctly" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Initializes items array correctly + +```gwt +Given reservation ID "res_123" and order ID "ord_456" +When I create an initial reservation CMS with 2 items +Then the CMS items array has length 2 +And the CMS items match the input items +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-009-sets-status-to-pending.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-009-sets-status-to-pending.sdp.md index fc3b2632..b8505384 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-009-sets-status-to-pending.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-009-sets-status-to-pending.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Sets status to pending" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Sets status to pending + +```gwt +Given reservation ID "res_123" and order ID "ord_456" +When I create an initial reservation CMS with 1 item +Then the CMS status is "pending" +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-010-sets-expires-at-with-default-ttl.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-010-sets-expires-at-with-default-ttl.sdp.md index 2f2e95e7..18f65202 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-010-sets-expires-at-with-default-ttl.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-010-sets-expires-at-with-default-ttl.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Sets expiresAt with default TTL" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Sets expiresAt with default TTL + +```gwt +Given reservation ID "res_123" and order ID "ord_456" +And the current timestamp is captured +When I create an initial reservation CMS with 1 item using default TTL +Then the CMS expiresAt is approximately now plus the default TTL +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-011-supports-custom-ttl.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-011-supports-custom-ttl.sdp.md index 8cb6aa9f..3a38f1b6 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-011-supports-custom-ttl.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-011-supports-custom-ttl.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Supports custom TTL" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Supports custom TTL + +```gwt +Given reservation ID "res_123" and order ID "ord_456" +And the current timestamp is captured +When I create an initial reservation CMS with 1 item using custom TTL of 1800000 ms +Then the CMS expiresAt is approximately now plus 1800000 ms +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-012-initializes-version-to-0.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-012-initializes-version-to-0.sdp.md index eb120310..af1719bf 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-012-initializes-version-to-0.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-012-initializes-version-to-0.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Initializes version to 0" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Initializes version to 0 + +```gwt +Given reservation ID "res_123" and order ID "ord_456" +When I create an initial reservation CMS with 1 item +Then the CMS version is 0 +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-013-initializes-with-current-state-version.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-013-initializes-with-current-state-version.sdp.md index d0e74c0b..9afd6ec2 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-013-initializes-with-current-state-version.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-013-initializes-with-current-state-version.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Initializes with current state version" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Initializes with current state version + +```gwt +Given reservation ID "res_123" and order ID "ord_456" +When I create an initial reservation CMS with 1 item +Then the CMS stateVersion equals the current reservation CMS version constant +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-014-sets-created-at-and-updated-at-to-current-timestamp.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-014-sets-created-at-and-updated-at-to-current-timestamp.sdp.md index 1161fa7a..2eb297ff 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-014-sets-created-at-and-updated-at-to-current-timestamp.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-014-sets-created-at-and-updated-at-to-current-timestamp.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Sets createdAt and updatedAt to current timestamp" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Sets createdAt and updatedAt to current timestamp + +```gwt +Given reservation ID "res_123" and order ID "ord_456" +And the current timestamp is captured +When I create an initial reservation CMS with 1 item +Then the CMS createdAt is between the before and after timestamps +And the CMS updatedAt equals createdAt +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-015-returns-false-when-reservation-has-not-expired.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-015-returns-false-when-reservation-has-not-expired.sdp.md index 9b37a805..81c63bb5 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-015-returns-false-when-reservation-has-not-expired.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-015-returns-false-when-reservation-has-not-expired.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when reservation has not expired" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Returns false when reservation has not expired + +```gwt +Given a pending reservation expiring 1 hour in the future +When I check if the reservation is expired +Then the reservation is not expired +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-016-returns-true-when-reservation-has-expired.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-016-returns-true-when-reservation-has-expired.sdp.md index ab0f74ac..19674bcf 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-016-returns-true-when-reservation-has-expired.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-016-returns-true-when-reservation-has-expired.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when reservation has expired" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Returns true when reservation has expired + +```gwt +Given a pending reservation that expired 1 second ago +When I check if the reservation is expired +Then the reservation is expired +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-017-returns-false-when-reservation-is-confirmed-regardless-of-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-017-returns-false-when-reservation-is-confirmed-regardless-of-expiry.sdp.md index b39db067..eec1c65e 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-017-returns-false-when-reservation-is-confirmed-regardless-of-expiry.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-017-returns-false-when-reservation-is-confirmed-regardless-of-expiry.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when reservation is confirmed regardless of expiry" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Returns false when reservation is confirmed regardless of expiry + +```gwt +Given a confirmed reservation that expired 1 hour ago +When I check if the reservation is expired +Then the reservation is not expired +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-018-returns-false-when-reservation-is-released-regardless-of-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-018-returns-false-when-reservation-is-released-regardless-of-expiry.sdp.md index 791dddc9..5c4d2f9a 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-018-returns-false-when-reservation-is-released-regardless-of-expiry.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-018-returns-false-when-reservation-is-released-regardless-of-expiry.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when reservation is released regardless of expiry" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Returns false when reservation is released regardless of expiry + +```gwt +Given a released reservation that expired 1 hour ago +When I check if the reservation is expired +Then the reservation is not expired +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-019-handles-exact-expiry-boundary-correctly.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-019-handles-exact-expiry-boundary-correctly.sdp.md index 5164a5a1..d8de7cfa 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-019-handles-exact-expiry-boundary-correctly.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-019-handles-exact-expiry-boundary-correctly.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Handles exact expiry boundary correctly" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Handles exact expiry boundary correctly + +```gwt +Given a pending reservation expiring at exactly the current time +When I check if the reservation is expired +Then the reservation is not expired +And when 1 millisecond passes and I check again +And the reservation is expired +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-020-returns-unchanged-cms-when-already-at-current-version.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-020-returns-unchanged-cms-when-already-at-current-version.sdp.md index 97dc7d9c..4cff4fd2 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-020-returns-unchanged-cms-when-already-at-current-version.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-020-returns-unchanged-cms-when-already-at-current-version.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns unchanged CMS when already at current version" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Returns unchanged CMS when already at current version + +```gwt +Given a reservation CMS at the current state version +When I upcast the reservation CMS +Then the result equals the original CMS +And the result stateVersion equals the current version constant +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-021-upgrades-cms-with-missing-state-version-to-current-version.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-021-upgrades-cms-with-missing-state-version-to-current-version.sdp.md index 4ce5b6e1..63fd316e 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-021-upgrades-cms-with-missing-state-version-to-current-version.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-021-upgrades-cms-with-missing-state-version-to-current-version.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Upgrades CMS with missing stateVersion to current version" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Upgrades CMS with missing stateVersion to current version + +```gwt +Given a reservation CMS with missing stateVersion +When I upcast the reservation CMS +Then the result stateVersion equals the current version constant +And the result preserves the original reservationId and items +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-022-throws-error-for-future-versions.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-022-throws-error-for-future-versions.sdp.md index 356add6d..d7eac643 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-022-throws-error-for-future-versions.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-022-throws-error-for-future-versions.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws error for future versions" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Throws error for future versions + +```gwt +Given a reservation CMS with stateVersion far above current +When I attempt to upcast the reservation CMS +Then an error is thrown matching "newer than supported version" +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-023-preserves-all-fields-during-upcast.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-023-preserves-all-fields-during-upcast.sdp.md index dd3cde9a..ce6df986 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-023-preserves-all-fields-during-upcast.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.examples/s-023-preserves-all-fields-during-upcast.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Preserves all fields during upcast" from examples/order-management/tests/features/behavior/inventory/reservation-domain.feature +- outcome: Executable scenario: Preserves all fields during upcast + +```gwt +Given a reservation CMS at state version 0 with specific field values +When I upcast the reservation CMS +Then all original fields are preserved in the result: +And the result items match the original items +``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.sdp.md index b79aa098..d7cda7d7 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: pure reservation domain functions to behave correctly so that reservation CMS state is managed reliably (test carrier: examples/order-management/tests/features/behavior/inventory/reservation-domain.feature) +- actor: a developer working with the inventory context +- outcome: pure reservation domain functions to behave correctly so that reservation CMS state is managed reliably + +## Behavior + +- rule: calculateReservationItemCount returns the number of line items +- rule: calculateTotalReservedQuantity sums all item quantities +- rule: createInitialReservationCMS produces a valid initial state +- rule: isReservationExpired checks pending reservations against current time +- rule: upcastReservationCMS migrates old CMS versions to current diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-001-does-not-throw-when-reservation-exists.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-001-does-not-throw-when-reservation-exists.sdp.md index b265c4f3..e48bab19 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-001-does-not-throw-when-reservation-exists.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-001-does-not-throw-when-reservation-exists.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Does not throw when reservation exists" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Does not throw when reservation exists + +```gwt +Given a valid reservation CMS +When I call assertReservationExists +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-002-throws-reservation-not-found-when-reservation-is-null.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-002-throws-reservation-not-found-when-reservation-is-null.sdp.md index 15a79f94..683e301b 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-002-throws-reservation-not-found-when-reservation-is-null.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-002-throws-reservation-not-found-when-reservation-is-null.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws RESERVATION_NOT_FOUND when reservation is null" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Throws RESERVATION_NOT_FOUND when reservation is null + +```gwt +Given a null reservation reference +When I call assertReservationExists +Then an InventoryInvariantError is thrown with code "RESERVATION_NOT_FOUND" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-003-throws-reservation-not-found-when-reservation-is-undefined.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-003-throws-reservation-not-found-when-reservation-is-undefined.sdp.md index e99752af..6730f1c8 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-003-throws-reservation-not-found-when-reservation-is-undefined.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-003-throws-reservation-not-found-when-reservation-is-undefined.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws RESERVATION_NOT_FOUND when reservation is undefined" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Throws RESERVATION_NOT_FOUND when reservation is undefined + +```gwt +Given an undefined reservation reference +When I call assertReservationExists +Then an InventoryInvariantError is thrown with code "RESERVATION_NOT_FOUND" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-004-does-not-throw-when-reservation-is-null.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-004-does-not-throw-when-reservation-is-null.sdp.md index 84cb298f..6d69df81 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-004-does-not-throw-when-reservation-is-null.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-004-does-not-throw-when-reservation-is-null.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Does not throw when reservation is null" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Does not throw when reservation is null + +```gwt +Given a null reservation reference +When I call assertReservationDoesNotExist +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-005-does-not-throw-when-reservation-is-undefined.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-005-does-not-throw-when-reservation-is-undefined.sdp.md index 743fcf48..15664ea0 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-005-does-not-throw-when-reservation-is-undefined.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-005-does-not-throw-when-reservation-is-undefined.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Does not throw when reservation is undefined" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Does not throw when reservation is undefined + +```gwt +Given an undefined reservation reference +When I call assertReservationDoesNotExist +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-006-throws-reservation-already-exists-when-reservation-exists.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-006-throws-reservation-already-exists-when-reservation-exists.sdp.md index ccba365d..d5923fcb 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-006-throws-reservation-already-exists-when-reservation-exists.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-006-throws-reservation-already-exists-when-reservation-exists.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Throws RESERVATION_ALREADY_EXISTS when reservation exists" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Throws RESERVATION_ALREADY_EXISTS when reservation exists + +```gwt +Given a valid reservation CMS with reservationId "res_existing" +When I call assertReservationDoesNotExist +Then an InventoryInvariantError is thrown with code "RESERVATION_ALREADY_EXISTS" +And the error context reservationId is "res_existing" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-007-does-not-throw-when-items-has-one-item.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-007-does-not-throw-when-items-has-one-item.sdp.md index 7453e7c6..d4fb9493 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-007-does-not-throw-when-items-has-one-item.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-007-does-not-throw-when-items-has-one-item.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Does not throw when items has one item" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Does not throw when items has one item + +```gwt +Given reservation items with 1 item +When I call assertReservationHasItems +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-008-does-not-throw-when-items-has-multiple-items.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-008-does-not-throw-when-items-has-multiple-items.sdp.md index b0993cf1..56ea2d9a 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-008-does-not-throw-when-items-has-multiple-items.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-008-does-not-throw-when-items-has-multiple-items.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Does not throw when items has multiple items" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Does not throw when items has multiple items + +```gwt +Given reservation items with 2 items +When I call assertReservationHasItems +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-009-throws-empty-reservation-when-items-array-is-empty.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-009-throws-empty-reservation-when-items-array-is-empty.sdp.md index e7a6d89f..c177b2b7 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-009-throws-empty-reservation-when-items-array-is-empty.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-009-throws-empty-reservation-when-items-array-is-empty.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws EMPTY_RESERVATION when items array is empty" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Throws EMPTY_RESERVATION when items array is empty + +```gwt +Given an empty reservation items array +When I call assertReservationHasItems +Then an InventoryInvariantError is thrown with code "EMPTY_RESERVATION" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-010-does-not-throw-for-valid-item-with-quantity-5.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-010-does-not-throw-for-valid-item-with-quantity-5.sdp.md index 6c449e79..05b145ee 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-010-does-not-throw-for-valid-item-with-quantity-5.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-010-does-not-throw-for-valid-item-with-quantity-5.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Does not throw for valid item with quantity 5" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Does not throw for valid item with quantity 5 + +```gwt +Given a reservation item with productId "prod_1" and quantity 5 +When I call validateReservationItem +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-011-does-not-throw-for-item-with-quantity-1.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-011-does-not-throw-for-item-with-quantity-1.sdp.md index 97c9abb9..e865bd43 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-011-does-not-throw-for-item-with-quantity-1.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-011-does-not-throw-for-item-with-quantity-1.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Does not throw for item with quantity 1" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Does not throw for item with quantity 1 + +```gwt +Given a reservation item with productId "prod_1" and quantity 1 +When I call validateReservationItem +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-012-throws-invalid-quantity-for-zero-quantity.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-012-throws-invalid-quantity-for-zero-quantity.sdp.md index c74c45ef..ddb8e932 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-012-throws-invalid-quantity-for-zero-quantity.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-012-throws-invalid-quantity-for-zero-quantity.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws INVALID_QUANTITY for zero quantity" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Throws INVALID_QUANTITY for zero quantity + +```gwt +Given a reservation item with productId "prod_1" and quantity 0 +When I call validateReservationItem +Then an InventoryInvariantError is thrown with code "INVALID_QUANTITY" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-013-throws-invalid-quantity-for-negative-quantity.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-013-throws-invalid-quantity-for-negative-quantity.sdp.md index 4edbe7db..92388e42 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-013-throws-invalid-quantity-for-negative-quantity.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-013-throws-invalid-quantity-for-negative-quantity.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws INVALID_QUANTITY for negative quantity" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Throws INVALID_QUANTITY for negative quantity + +```gwt +Given a reservation item with productId "prod_1" and quantity -5 +When I call validateReservationItem +Then an InventoryInvariantError is thrown with code "INVALID_QUANTITY" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-014-throws-invalid-quantity-for-non-integer-quantity.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-014-throws-invalid-quantity-for-non-integer-quantity.sdp.md index b2cf2472..273aab77 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-014-throws-invalid-quantity-for-non-integer-quantity.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-014-throws-invalid-quantity-for-non-integer-quantity.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws INVALID_QUANTITY for non-integer quantity" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Throws INVALID_QUANTITY for non-integer quantity + +```gwt +Given a reservation item with productId "prod_1" and quantity 1.5 +When I call validateReservationItem +Then an InventoryInvariantError is thrown with code "INVALID_QUANTITY" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-015-throws-invalid-reservation-item-for-empty-product-id.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-015-throws-invalid-reservation-item-for-empty-product-id.sdp.md index e5cbfc17..34991794 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-015-throws-invalid-reservation-item-for-empty-product-id.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-015-throws-invalid-reservation-item-for-empty-product-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws INVALID_RESERVATION_ITEM for empty productId" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Throws INVALID_RESERVATION_ITEM for empty productId + +```gwt +Given a reservation item with productId "" and quantity 5 +When I call validateReservationItem +Then an InventoryInvariantError is thrown with code "INVALID_RESERVATION_ITEM" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-016-does-not-throw-for-valid-items-array.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-016-does-not-throw-for-valid-items-array.sdp.md index aaa7f40a..34be7570 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-016-does-not-throw-for-valid-items-array.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-016-does-not-throw-for-valid-items-array.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Does not throw for valid items array" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Does not throw for valid items array + +```gwt +Given a reservation items array with 2 valid items +When I call validateReservationItems +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-017-throws-empty-reservation-for-empty-array.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-017-throws-empty-reservation-for-empty-array.sdp.md index 00e74d3c..82672b85 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-017-throws-empty-reservation-for-empty-array.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-017-throws-empty-reservation-for-empty-array.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws EMPTY_RESERVATION for empty array" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Throws EMPTY_RESERVATION for empty array + +```gwt +Given an empty reservation items array +When I call validateReservationItems +Then an InventoryInvariantError is thrown with code "EMPTY_RESERVATION" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-018-throws-invalid-quantity-when-one-item-has-invalid-quantity.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-018-throws-invalid-quantity-when-one-item-has-invalid-quantity.sdp.md index c7685383..c6bbed2f 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-018-throws-invalid-quantity-when-one-item-has-invalid-quantity.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-018-throws-invalid-quantity-when-one-item-has-invalid-quantity.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws INVALID_QUANTITY when one item has invalid quantity" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Throws INVALID_QUANTITY when one item has invalid quantity + +```gwt +Given a reservation items array where the second item has quantity 0 +When I call validateReservationItems +Then an InventoryInvariantError is thrown with code "INVALID_QUANTITY" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-019-has-correct-name-property.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-019-has-correct-name-property.sdp.md index 74aef44c..bd5cdcc3 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-019-has-correct-name-property.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-019-has-correct-name-property.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Has correct name property" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Has correct name property + +```gwt +Given an InventoryInvariantError with code "INSUFFICIENT_STOCK" and message "Custom message" +When the scenario runs +Then the error name is "InventoryInvariantError" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-020-has-correct-code-property.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-020-has-correct-code-property.sdp.md index 1cbb5e74..1e427957 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-020-has-correct-code-property.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-020-has-correct-code-property.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Has correct code property" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Has correct code property + +```gwt +Given an InventoryInvariantError with code "INSUFFICIENT_STOCK" and message "Custom message" +When the scenario runs +Then the error code is "INSUFFICIENT_STOCK" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-021-has-correct-message-property.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-021-has-correct-message-property.sdp.md index 4e401afe..61c9baea 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-021-has-correct-message-property.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-021-has-correct-message-property.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Has correct message property" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Has correct message property + +```gwt +Given an InventoryInvariantError with code "INSUFFICIENT_STOCK" and message "Custom message" +When the scenario runs +Then the error message is "Custom message" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-022-has-correct-context-property.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-022-has-correct-context-property.sdp.md index ca85ea11..1ff94f3c 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-022-has-correct-context-property.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-022-has-correct-context-property.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Has correct context property" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Has correct context property + +```gwt +Given an InventoryInvariantError with code "INSUFFICIENT_STOCK" and context +When the scenario runs +Then the error context contains productId "prod_123" +And the error context contains extra "data" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-023-can-have-undefined-context.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-023-can-have-undefined-context.sdp.md index 61f40046..a69aabd6 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-023-can-have-undefined-context.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-023-can-have-undefined-context.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Can have undefined context" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Can have undefined context + +```gwt +Given an InventoryInvariantError with code "INSUFFICIENT_STOCK" and no context +When the scenario runs +Then the error context is undefined +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-024-is-instance-of-error.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-024-is-instance-of-error.sdp.md index e002dc47..19eb5eb1 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-024-is-instance-of-error.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-024-is-instance-of-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Is instance of Error" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: Is instance of Error + +```gwt +Given an InventoryInvariantError with code "INSUFFICIENT_STOCK" and message "Custom message" +When the scenario runs +Then the error is an instance of Error +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-025-reservation-is-pending-check-returns-true-for-pending-status.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-025-reservation-is-pending-check-returns-true-for-pending-status.sdp.md index 68247f9e..58b99460 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-025-reservation-is-pending-check-returns-true-for-pending-status.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-025-reservation-is-pending-check-returns-true-for-pending-status.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "reservationIsPending.check returns true for pending status" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationIsPending.check returns true for pending status + +```gwt +Given a reservation in "pending" status +When I call reservationIsPending.check +Then the check result is true +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-026-reservation-is-pending-check-returns-false-for-non-pending-statuses.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-026-reservation-is-pending-check-returns-false-for-non-pending-statuses.sdp.md index c71bb892..ff3f013b 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-026-reservation-is-pending-check-returns-false-for-non-pending-statuses.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-026-reservation-is-pending-check-returns-false-for-non-pending-statuses.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "reservationIsPending.check returns false for non-pending statuses" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationIsPending.check returns false for non-pending statuses + +```gwt +Given a reservation in "value" status +When I call reservationIsPending.check +Then the check result is false +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-027-reservation-is-pending-assert-passes-for-pending-status.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-027-reservation-is-pending-assert-passes-for-pending-status.sdp.md index 0b4ab080..d551bc7e 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-027-reservation-is-pending-assert-passes-for-pending-status.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-027-reservation-is-pending-assert-passes-for-pending-status.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "reservationIsPending.assert passes for pending status" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationIsPending.assert passes for pending status + +```gwt +Given a reservation in "pending" status +When I call reservationIsPending.assert +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-028-reservation-is-pending-assert-throws-reservation-not-pending-for-confirmed.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-028-reservation-is-pending-assert-throws-reservation-not-pending-for-confirmed.sdp.md index f45b93b0..dd141937 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-028-reservation-is-pending-assert-throws-reservation-not-pending-for-confirmed.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-028-reservation-is-pending-assert-throws-reservation-not-pending-for-confirmed.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "reservationIsPending.assert throws RESERVATION_NOT_PENDING for confirmed" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationIsPending.assert throws RESERVATION_NOT_PENDING for confirmed + +```gwt +Given a reservation in "confirmed" status with reservationId "res_test" +When I call reservationIsPending.assert +Then an InventoryInvariantError is thrown with code "RESERVATION_NOT_PENDING" +And the error context reservationId is "res_test" +And the error context currentStatus is "confirmed" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-029-reservation-is-pending-assert-throws-reservation-not-pending-for-released.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-029-reservation-is-pending-assert-throws-reservation-not-pending-for-released.sdp.md index ef1fcfc6..cdb805d9 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-029-reservation-is-pending-assert-throws-reservation-not-pending-for-released.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-029-reservation-is-pending-assert-throws-reservation-not-pending-for-released.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "reservationIsPending.assert throws RESERVATION_NOT_PENDING for released" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationIsPending.assert throws RESERVATION_NOT_PENDING for released + +```gwt +Given a reservation in "released" status +When I call reservationIsPending.assert +Then an InventoryInvariantError is thrown with code "RESERVATION_NOT_PENDING" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-030-reservation-is-pending-validate-returns-valid-for-pending.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-030-reservation-is-pending-validate-returns-valid-for-pending.sdp.md index 215a990d..a8d53166 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-030-reservation-is-pending-validate-returns-valid-for-pending.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-030-reservation-is-pending-validate-returns-valid-for-pending.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "reservationIsPending.validate returns valid for pending" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationIsPending.validate returns valid for pending + +```gwt +Given a reservation in "pending" status +When I call reservationIsPending.validate +Then the validate result is valid +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-031-reservation-is-pending-validate-returns-invalid-for-released.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-031-reservation-is-pending-validate-returns-invalid-for-released.sdp.md index cba6b24b..a30f1197 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-031-reservation-is-pending-validate-returns-invalid-for-released.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-031-reservation-is-pending-validate-returns-invalid-for-released.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "reservationIsPending.validate returns invalid for released" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationIsPending.validate returns invalid for released + +```gwt +Given a reservation in "released" status +When I call reservationIsPending.validate +Then the validate result is invalid with code "RESERVATION_NOT_PENDING" +And the validate result context currentStatus is "released" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-032-reservation-not-expired-check-returns-true-for-pending-with-future-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-032-reservation-not-expired-check-returns-true-for-pending-with-future-expiry.sdp.md index 67e64559..e45535cc 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-032-reservation-not-expired-check-returns-true-for-pending-with-future-expiry.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-032-reservation-not-expired-check-returns-true-for-pending-with-future-expiry.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "reservationNotExpired.check returns true for pending with future expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationNotExpired.check returns true for pending with future expiry + +```gwt +Given a pending reservation expiring 1 hour from now +When I call reservationNotExpired.check +Then the check result is true +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-033-reservation-not-expired-check-returns-true-for-confirmed-with-past-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-033-reservation-not-expired-check-returns-true-for-confirmed-with-past-expiry.sdp.md index 62387130..914f8b0c 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-033-reservation-not-expired-check-returns-true-for-confirmed-with-past-expiry.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-033-reservation-not-expired-check-returns-true-for-confirmed-with-past-expiry.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "reservationNotExpired.check returns true for confirmed with past expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationNotExpired.check returns true for confirmed with past expiry + +```gwt +Given a confirmed reservation with past expiry +When I call reservationNotExpired.check +Then the check result is true +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-034-reservation-not-expired-check-returns-true-for-released-with-past-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-034-reservation-not-expired-check-returns-true-for-released-with-past-expiry.sdp.md index 49d31350..35e2617a 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-034-reservation-not-expired-check-returns-true-for-released-with-past-expiry.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-034-reservation-not-expired-check-returns-true-for-released-with-past-expiry.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "reservationNotExpired.check returns true for released with past expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationNotExpired.check returns true for released with past expiry + +```gwt +Given a released reservation with past expiry +When I call reservationNotExpired.check +Then the check result is true +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-035-reservation-not-expired-check-returns-false-for-pending-with-past-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-035-reservation-not-expired-check-returns-false-for-pending-with-past-expiry.sdp.md index 988c9d69..d2b48f00 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-035-reservation-not-expired-check-returns-false-for-pending-with-past-expiry.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-035-reservation-not-expired-check-returns-false-for-pending-with-past-expiry.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "reservationNotExpired.check returns false for pending with past expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationNotExpired.check returns false for pending with past expiry + +```gwt +Given a pending reservation that expired 1 second ago +When I call reservationNotExpired.check +Then the check result is false +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-036-reservation-not-expired-assert-passes-for-pending-with-future-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-036-reservation-not-expired-assert-passes-for-pending-with-future-expiry.sdp.md index 6e7efab6..09fe8e17 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-036-reservation-not-expired-assert-passes-for-pending-with-future-expiry.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-036-reservation-not-expired-assert-passes-for-pending-with-future-expiry.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "reservationNotExpired.assert passes for pending with future expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationNotExpired.assert passes for pending with future expiry + +```gwt +Given a pending reservation expiring 1 hour from now +When I call reservationNotExpired.assert +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-037-reservation-not-expired-assert-passes-for-confirmed-with-past-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-037-reservation-not-expired-assert-passes-for-confirmed-with-past-expiry.sdp.md index bc0382e5..1a4661da 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-037-reservation-not-expired-assert-passes-for-confirmed-with-past-expiry.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-037-reservation-not-expired-assert-passes-for-confirmed-with-past-expiry.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "reservationNotExpired.assert passes for confirmed with past expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationNotExpired.assert passes for confirmed with past expiry + +```gwt +Given a confirmed reservation with past expiry +When I call reservationNotExpired.assert +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-038-reservation-not-expired-assert-throws-reservation-expired-for-pending-with.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-038-reservation-not-expired-assert-throws-reservation-expired-for-pending-with.sdp.md index 7aa1ee1c..f08b179d 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-038-reservation-not-expired-assert-throws-reservation-expired-for-pending-with.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-038-reservation-not-expired-assert-throws-reservation-expired-for-pending-with.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "reservationNotExpired.assert throws RESERVATION_EXPIRED for pending with past expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationNotExpired.assert throws RESERVATION_EXPIRED for pending with past expiry + +```gwt +Given a pending reservation that expired 1 second ago with reservationId "res_expired" +When I call reservationNotExpired.assert +Then an InventoryInvariantError is thrown with code "RESERVATION_EXPIRED" +And the error context reservationId is "res_expired" +And the error context includes expiresAt +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-039-reservation-not-expired-validate-returns-valid-for-pending-with-future-exp.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-039-reservation-not-expired-validate-returns-valid-for-pending-with-future-exp.sdp.md index 660eed0c..b9e68091 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-039-reservation-not-expired-validate-returns-valid-for-pending-with-future-exp.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-039-reservation-not-expired-validate-returns-valid-for-pending-with-future-exp.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "reservationNotExpired.validate returns valid for pending with future expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationNotExpired.validate returns valid for pending with future expiry + +```gwt +Given a pending reservation expiring 1 hour from now +When I call reservationNotExpired.validate +Then the validate result is valid +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-040-reservation-not-expired-validate-returns-invalid-for-pending-with-past-exp.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-040-reservation-not-expired-validate-returns-invalid-for-pending-with-past-exp.sdp.md index 15a14186..345f683a 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-040-reservation-not-expired-validate-returns-invalid-for-pending-with-past-exp.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-040-reservation-not-expired-validate-returns-invalid-for-pending-with-past-exp.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "reservationNotExpired.validate returns invalid for pending with past expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationNotExpired.validate returns invalid for pending with past expiry + +```gwt +Given a pending reservation that expired 1 second ago +When I call reservationNotExpired.validate +Then the validate result is invalid with code "RESERVATION_EXPIRED" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-041-reservation-has-expired-check-returns-true-for-pending-with-past-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-041-reservation-has-expired-check-returns-true-for-pending-with-past-expiry.sdp.md index d623fe97..723790be 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-041-reservation-has-expired-check-returns-true-for-pending-with-past-expiry.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-041-reservation-has-expired-check-returns-true-for-pending-with-past-expiry.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "reservationHasExpired.check returns true for pending with past expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationHasExpired.check returns true for pending with past expiry + +```gwt +Given a pending reservation that expired 1 second ago +When I call reservationHasExpired.check +Then the check result is true +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-042-reservation-has-expired-check-returns-true-for-non-pending-statuses.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-042-reservation-has-expired-check-returns-true-for-non-pending-statuses.sdp.md index 04fce13c..043de61c 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-042-reservation-has-expired-check-returns-true-for-non-pending-statuses.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-042-reservation-has-expired-check-returns-true-for-non-pending-statuses.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "reservationHasExpired.check returns true for non-pending statuses" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationHasExpired.check returns true for non-pending statuses + +```gwt +Given a "value" reservation with future expiry +When I call reservationHasExpired.check +Then the check result is true +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-043-reservation-has-expired-check-returns-false-for-pending-with-future-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-043-reservation-has-expired-check-returns-false-for-pending-with-future-expiry.sdp.md index e48b8843..c17bd577 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-043-reservation-has-expired-check-returns-false-for-pending-with-future-expiry.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-043-reservation-has-expired-check-returns-false-for-pending-with-future-expiry.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "reservationHasExpired.check returns false for pending with future expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationHasExpired.check returns false for pending with future expiry + +```gwt +Given a pending reservation expiring 1 hour from now +When I call reservationHasExpired.check +Then the check result is false +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-044-reservation-has-expired-assert-passes-for-pending-with-past-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-044-reservation-has-expired-assert-passes-for-pending-with-past-expiry.sdp.md index d1f9011b..0d37871d 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-044-reservation-has-expired-assert-passes-for-pending-with-past-expiry.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-044-reservation-has-expired-assert-passes-for-pending-with-past-expiry.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "reservationHasExpired.assert passes for pending with past expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationHasExpired.assert passes for pending with past expiry + +```gwt +Given a pending reservation that expired 1 second ago +When I call reservationHasExpired.assert +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-045-reservation-has-expired-assert-passes-for-confirmed-regardless-of-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-045-reservation-has-expired-assert-passes-for-confirmed-regardless-of-expiry.sdp.md index 55b291b0..a59e63fa 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-045-reservation-has-expired-assert-passes-for-confirmed-regardless-of-expiry.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-045-reservation-has-expired-assert-passes-for-confirmed-regardless-of-expiry.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "reservationHasExpired.assert passes for confirmed regardless of expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationHasExpired.assert passes for confirmed regardless of expiry + +```gwt +Given a confirmed reservation with future expiry +When I call reservationHasExpired.assert +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-046-reservation-has-expired-assert-throws-reservation-not-expired-for-pending.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-046-reservation-has-expired-assert-throws-reservation-not-expired-for-pending.sdp.md index 7acb2596..d2c5bb14 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-046-reservation-has-expired-assert-throws-reservation-not-expired-for-pending.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-046-reservation-has-expired-assert-throws-reservation-not-expired-for-pending.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "reservationHasExpired.assert throws RESERVATION_NOT_EXPIRED for pending with future expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationHasExpired.assert throws RESERVATION_NOT_EXPIRED for pending with future expiry + +```gwt +Given a pending reservation expiring 1 hour from now with reservationId "res_active" +When I call reservationHasExpired.assert +Then an InventoryInvariantError is thrown with code "RESERVATION_NOT_EXPIRED" +And the error context reservationId is "res_active" +And the error context includes expiresAt +And the error context includes currentTime +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-047-reservation-has-expired-validate-returns-valid-for-expired-reservation.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-047-reservation-has-expired-validate-returns-valid-for-expired-reservation.sdp.md index ac79e0bd..fbac14a0 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-047-reservation-has-expired-validate-returns-valid-for-expired-reservation.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-047-reservation-has-expired-validate-returns-valid-for-expired-reservation.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "reservationHasExpired.validate returns valid for expired reservation" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationHasExpired.validate returns valid for expired reservation + +```gwt +Given a pending reservation that expired 1 second ago +When I call reservationHasExpired.validate +Then the validate result is valid +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-048-reservation-has-expired-validate-returns-invalid-for-pending-with-future-e.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-048-reservation-has-expired-validate-returns-invalid-for-pending-with-future-e.sdp.md index f6f18135..5bd941eb 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-048-reservation-has-expired-validate-returns-invalid-for-pending-with-future-e.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-048-reservation-has-expired-validate-returns-invalid-for-pending-with-future-e.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "reservationHasExpired.validate returns invalid for pending with future expiry" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: reservationHasExpired.validate returns invalid for pending with future expiry + +```gwt +Given a pending reservation expiring 1 hour from now +When I call reservationHasExpired.validate +Then the validate result is invalid with code "RESERVATION_NOT_EXPIRED" +And the validate result context includes expiresAt +And the validate result context includes currentTime +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-049-confirm-reservation-invariants-check-all-returns-true-for-pending-and-not.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-049-confirm-reservation-invariants-check-all-returns-true-for-pending-and-not.sdp.md index 704ab575..36ac31f9 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-049-confirm-reservation-invariants-check-all-returns-true-for-pending-and-not.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-049-confirm-reservation-invariants-check-all-returns-true-for-pending-and-not.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "confirmReservationInvariants.checkAll returns true for pending and not expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: confirmReservationInvariants.checkAll returns true for pending and not expired + +```gwt +Given a pending reservation expiring 1 hour from now +When I call confirmReservationInvariants.checkAll +Then the checkAll result is true +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-050-confirm-reservation-invariants-check-all-returns-false-for-confirmed-and-n.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-050-confirm-reservation-invariants-check-all-returns-false-for-confirmed-and-n.sdp.md index 24a5adc4..1935add6 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-050-confirm-reservation-invariants-check-all-returns-false-for-confirmed-and-n.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-050-confirm-reservation-invariants-check-all-returns-false-for-confirmed-and-n.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "confirmReservationInvariants.checkAll returns false for confirmed and not expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: confirmReservationInvariants.checkAll returns false for confirmed and not expired + +```gwt +Given a confirmed reservation with future expiry +When I call confirmReservationInvariants.checkAll +Then the checkAll result is false +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-051-confirm-reservation-invariants-check-all-returns-false-for-pending-and-exp.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-051-confirm-reservation-invariants-check-all-returns-false-for-pending-and-exp.sdp.md index dd510dc9..3e759c6a 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-051-confirm-reservation-invariants-check-all-returns-false-for-pending-and-exp.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-051-confirm-reservation-invariants-check-all-returns-false-for-pending-and-exp.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "confirmReservationInvariants.checkAll returns false for pending and expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: confirmReservationInvariants.checkAll returns false for pending and expired + +```gwt +Given a pending reservation that expired 1 second ago +When I call confirmReservationInvariants.checkAll +Then the checkAll result is false +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-052-confirm-reservation-invariants-assert-all-passes-for-pending-and-not-expir.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-052-confirm-reservation-invariants-assert-all-passes-for-pending-and-not-expir.sdp.md index 54e6eb2b..d7082068 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-052-confirm-reservation-invariants-assert-all-passes-for-pending-and-not-expir.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-052-confirm-reservation-invariants-assert-all-passes-for-pending-and-not-expir.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "confirmReservationInvariants.assertAll passes for pending and not expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: confirmReservationInvariants.assertAll passes for pending and not expired + +```gwt +Given a pending reservation expiring 1 hour from now +When I call confirmReservationInvariants.assertAll +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-053-confirm-reservation-invariants-assert-all-throws-reservation-not-pending-f.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-053-confirm-reservation-invariants-assert-all-throws-reservation-not-pending-f.sdp.md index 77b289a2..6a64d3b7 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-053-confirm-reservation-invariants-assert-all-throws-reservation-not-pending-f.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-053-confirm-reservation-invariants-assert-all-throws-reservation-not-pending-f.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "confirmReservationInvariants.assertAll throws RESERVATION_NOT_PENDING for confirmed" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: confirmReservationInvariants.assertAll throws RESERVATION_NOT_PENDING for confirmed + +```gwt +Given a confirmed reservation with future expiry +When I call confirmReservationInvariants.assertAll +Then an InventoryInvariantError is thrown with code "RESERVATION_NOT_PENDING" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-054-confirm-reservation-invariants-assert-all-throws-reservation-expired-for-p.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-054-confirm-reservation-invariants-assert-all-throws-reservation-expired-for-p.sdp.md index 960b2279..8940b1ea 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-054-confirm-reservation-invariants-assert-all-throws-reservation-expired-for-p.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-054-confirm-reservation-invariants-assert-all-throws-reservation-expired-for-p.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "confirmReservationInvariants.assertAll throws RESERVATION_EXPIRED for pending and expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: confirmReservationInvariants.assertAll throws RESERVATION_EXPIRED for pending and expired + +```gwt +Given a pending reservation that expired 1 second ago +When I call confirmReservationInvariants.assertAll +Then an InventoryInvariantError is thrown with code "RESERVATION_EXPIRED" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-055-confirm-reservation-invariants-validate-all-returns-valid-for-pending-and.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-055-confirm-reservation-invariants-validate-all-returns-valid-for-pending-and.sdp.md index a33fdecc..19c84530 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-055-confirm-reservation-invariants-validate-all-returns-valid-for-pending-and.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-055-confirm-reservation-invariants-validate-all-returns-valid-for-pending-and.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "confirmReservationInvariants.validateAll returns valid for pending and not expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: confirmReservationInvariants.validateAll returns valid for pending and not expired + +```gwt +Given a pending reservation expiring 1 hour from now +When I call confirmReservationInvariants.validateAll +Then the validateAll result is valid +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-056-confirm-reservation-invariants-validate-all-returns-single-violation-for-c.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-056-confirm-reservation-invariants-validate-all-returns-single-violation-for-c.sdp.md index 64dd460b..9219de78 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-056-confirm-reservation-invariants-validate-all-returns-single-violation-for-c.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-056-confirm-reservation-invariants-validate-all-returns-single-violation-for-c.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "confirmReservationInvariants.validateAll returns single violation for confirmed and not expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: confirmReservationInvariants.validateAll returns single violation for confirmed and not expired + +```gwt +Given a confirmed reservation with future expiry +When I call confirmReservationInvariants.validateAll +Then the validateAll result is invalid +And the violations include code "RESERVATION_NOT_PENDING" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-057-confirm-reservation-invariants-validate-all-returns-violation-for-pending.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-057-confirm-reservation-invariants-validate-all-returns-violation-for-pending.sdp.md index 21c7eb7a..9402f3fe 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-057-confirm-reservation-invariants-validate-all-returns-violation-for-pending.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-057-confirm-reservation-invariants-validate-all-returns-violation-for-pending.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "confirmReservationInvariants.validateAll returns violation for pending and expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: confirmReservationInvariants.validateAll returns violation for pending and expired + +```gwt +Given a pending reservation that expired 1 second ago +When I call confirmReservationInvariants.validateAll +Then the validateAll result is invalid +And the violations include code "RESERVATION_EXPIRED" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-058-expire-reservation-invariants-check-all-returns-true-for-pending-and-expir.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-058-expire-reservation-invariants-check-all-returns-true-for-pending-and-expir.sdp.md index 14a5004b..eaed282b 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-058-expire-reservation-invariants-check-all-returns-true-for-pending-and-expir.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-058-expire-reservation-invariants-check-all-returns-true-for-pending-and-expir.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "expireReservationInvariants.checkAll returns true for pending and expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: expireReservationInvariants.checkAll returns true for pending and expired + +```gwt +Given a pending reservation that expired 1 second ago +When I call expireReservationInvariants.checkAll +Then the checkAll result is true +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-059-expire-reservation-invariants-check-all-returns-false-for-confirmed-and-ex.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-059-expire-reservation-invariants-check-all-returns-false-for-confirmed-and-ex.sdp.md index c41f0817..c6b29d51 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-059-expire-reservation-invariants-check-all-returns-false-for-confirmed-and-ex.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-059-expire-reservation-invariants-check-all-returns-false-for-confirmed-and-ex.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "expireReservationInvariants.checkAll returns false for confirmed and expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: expireReservationInvariants.checkAll returns false for confirmed and expired + +```gwt +Given a confirmed reservation with past expiry +When I call expireReservationInvariants.checkAll +Then the checkAll result is false +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-060-expire-reservation-invariants-check-all-returns-false-for-pending-and-not.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-060-expire-reservation-invariants-check-all-returns-false-for-pending-and-not.sdp.md index b46c55f6..57a17c97 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-060-expire-reservation-invariants-check-all-returns-false-for-pending-and-not.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-060-expire-reservation-invariants-check-all-returns-false-for-pending-and-not.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "expireReservationInvariants.checkAll returns false for pending and not expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: expireReservationInvariants.checkAll returns false for pending and not expired + +```gwt +Given a pending reservation expiring 1 hour from now +When I call expireReservationInvariants.checkAll +Then the checkAll result is false +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-061-expire-reservation-invariants-assert-all-passes-for-pending-and-expired.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-061-expire-reservation-invariants-assert-all-passes-for-pending-and-expired.sdp.md index 3a229118..021d3067 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-061-expire-reservation-invariants-assert-all-passes-for-pending-and-expired.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-061-expire-reservation-invariants-assert-all-passes-for-pending-and-expired.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "expireReservationInvariants.assertAll passes for pending and expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: expireReservationInvariants.assertAll passes for pending and expired + +```gwt +Given a pending reservation that expired 1 second ago +When I call expireReservationInvariants.assertAll +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-062-expire-reservation-invariants-assert-all-throws-reservation-not-pending-fo.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-062-expire-reservation-invariants-assert-all-throws-reservation-not-pending-fo.sdp.md index 43c4d9b9..e0448cde 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-062-expire-reservation-invariants-assert-all-throws-reservation-not-pending-fo.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-062-expire-reservation-invariants-assert-all-throws-reservation-not-pending-fo.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "expireReservationInvariants.assertAll throws RESERVATION_NOT_PENDING for confirmed" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: expireReservationInvariants.assertAll throws RESERVATION_NOT_PENDING for confirmed + +```gwt +Given a confirmed reservation with past expiry +When I call expireReservationInvariants.assertAll +Then an InventoryInvariantError is thrown with code "RESERVATION_NOT_PENDING" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-063-expire-reservation-invariants-assert-all-throws-reservation-not-expired-fo.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-063-expire-reservation-invariants-assert-all-throws-reservation-not-expired-fo.sdp.md index 0384cd98..4d169855 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-063-expire-reservation-invariants-assert-all-throws-reservation-not-expired-fo.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-063-expire-reservation-invariants-assert-all-throws-reservation-not-expired-fo.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "expireReservationInvariants.assertAll throws RESERVATION_NOT_EXPIRED for pending and not expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: expireReservationInvariants.assertAll throws RESERVATION_NOT_EXPIRED for pending and not expired + +```gwt +Given a pending reservation expiring 1 hour from now +When I call expireReservationInvariants.assertAll +Then an InventoryInvariantError is thrown with code "RESERVATION_NOT_EXPIRED" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-064-expire-reservation-invariants-validate-all-returns-valid-for-pending-and-e.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-064-expire-reservation-invariants-validate-all-returns-valid-for-pending-and-e.sdp.md index 11ede76f..7b091681 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-064-expire-reservation-invariants-validate-all-returns-valid-for-pending-and-e.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-064-expire-reservation-invariants-validate-all-returns-valid-for-pending-and-e.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "expireReservationInvariants.validateAll returns valid for pending and expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: expireReservationInvariants.validateAll returns valid for pending and expired + +```gwt +Given a pending reservation that expired 1 second ago +When I call expireReservationInvariants.validateAll +Then the validateAll result is valid +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-065-expire-reservation-invariants-validate-all-returns-single-violation-for-re.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-065-expire-reservation-invariants-validate-all-returns-single-violation-for-re.sdp.md index b1dacf0d..0c17a5f7 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-065-expire-reservation-invariants-validate-all-returns-single-violation-for-re.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-065-expire-reservation-invariants-validate-all-returns-single-violation-for-re.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "expireReservationInvariants.validateAll returns single violation for released and expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: expireReservationInvariants.validateAll returns single violation for released and expired + +```gwt +Given a released reservation with past expiry +When I call expireReservationInvariants.validateAll +Then the validateAll result is invalid +And the violations include code "RESERVATION_NOT_PENDING" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-066-expire-reservation-invariants-validate-all-returns-single-violation-for-pe.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-066-expire-reservation-invariants-validate-all-returns-single-violation-for-pe.sdp.md index 12986624..9ba90380 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-066-expire-reservation-invariants-validate-all-returns-single-violation-for-pe.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-066-expire-reservation-invariants-validate-all-returns-single-violation-for-pe.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "expireReservationInvariants.validateAll returns single violation for pending and not expired" from examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature +- outcome: Executable scenario: expireReservationInvariants.validateAll returns single violation for pending and not expired + +```gwt +Given a pending reservation expiring 1 hour from now +When I call expireReservationInvariants.validateAll +Then the validateAll result is invalid +And the violations include code "RESERVATION_NOT_EXPIRED" +``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.sdp.md index 87c5ee25..5c85dff6 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.sdp.md @@ -10,4 +10,19 @@ relations: ## Intent -- outcome: reservation invariant functions to enforce domain rules so that invalid reservation state is rejected consistently (test carrier: examples/order-management/tests/features/behavior/inventory/reservation-invariants.feature) +- actor: a developer working with the inventory context +- outcome: reservation invariant functions to enforce domain rules so that invalid reservation state is rejected consistently + +## Behavior + +- rule: assertReservationExists throws when reservation is null or undefined +- rule: assertReservationDoesNotExist throws when reservation already exists +- rule: assertReservationHasItems throws when items array is empty +- rule: validateReservationItem validates individual item data via Zod schema +- rule: validateReservationItems validates the full items array +- rule: InventoryInvariantError carries structured error information +- rule: reservationIsPending validates that reservation status is pending +- rule: reservationNotExpired validates that a pending reservation has not passed its expiry +- rule: reservationHasExpired validates that a reservation has passed its expiry time +- rule: confirmReservationInvariants validates pending + not expired for confirmation +- rule: expireReservationInvariants validates pending + has expired for expiration processing diff --git a/specs/behavior/order-management/inventory/reserve-stock.examples/s-001-successfully-reserve-available-stock.sdp.md b/specs/behavior/order-management/inventory/reserve-stock.examples/s-001-successfully-reserve-available-stock.sdp.md index 1d91ce63..0fd508a8 100644 --- a/specs/behavior/order-management/inventory/reserve-stock.examples/s-001-successfully-reserve-available-stock.sdp.md +++ b/specs/behavior/order-management/inventory/reserve-stock.examples/s-001-successfully-reserve-available-stock.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Successfully reserve available stock" from examples/order-management/tests/features/behavior/inventory/reserve-stock.feature +- outcome: Executable scenario: Successfully reserve available stock + +```gwt +Given the system is ready +And a product "prod_reserve_001" exists with 100 available stock +When I send a ReserveStock command with: and the reservation includes: +Then the command should succeed +``` diff --git a/specs/behavior/order-management/inventory/reserve-stock.examples/s-002-reserve-multiple-items-atomically.sdp.md b/specs/behavior/order-management/inventory/reserve-stock.examples/s-002-reserve-multiple-items-atomically.sdp.md index 4cc1edbf..2141e1a4 100644 --- a/specs/behavior/order-management/inventory/reserve-stock.examples/s-002-reserve-multiple-items-atomically.sdp.md +++ b/specs/behavior/order-management/inventory/reserve-stock.examples/s-002-reserve-multiple-items-atomically.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reserve multiple items atomically" from examples/order-management/tests/features/behavior/inventory/reserve-stock.feature +- outcome: Executable scenario: Reserve multiple items atomically + +```gwt +Given the system is ready +And a product "prod_reserve_002" exists with 50 available stock +And another product "prod_reserve_003" exists with 30 available stock +When I send a ReserveStock command with: and the reservation includes: +Then the command should succeed +``` diff --git a/specs/behavior/order-management/inventory/reserve-stock.examples/s-003-reservation-fails-when-insufficient-stock.sdp.md b/specs/behavior/order-management/inventory/reserve-stock.examples/s-003-reservation-fails-when-insufficient-stock.sdp.md index 2e279dc6..4a79c13a 100644 --- a/specs/behavior/order-management/inventory/reserve-stock.examples/s-003-reservation-fails-when-insufficient-stock.sdp.md +++ b/specs/behavior/order-management/inventory/reserve-stock.examples/s-003-reservation-fails-when-insufficient-stock.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Reservation fails when insufficient stock" from examples/order-management/tests/features/behavior/inventory/reserve-stock.feature +- outcome: Executable scenario: Reservation fails when insufficient stock + +```gwt +Given the system is ready +And a product "prod_reserve_004" exists with 5 available stock +When I send a ReserveStock command with: and the reservation includes: +Then the command should fail with reason "Insufficient stock" +``` diff --git a/specs/behavior/order-management/inventory/reserve-stock.examples/s-004-multi-item-reservation-is-all-or-nothing.sdp.md b/specs/behavior/order-management/inventory/reserve-stock.examples/s-004-multi-item-reservation-is-all-or-nothing.sdp.md index 49af2ac2..290028a2 100644 --- a/specs/behavior/order-management/inventory/reserve-stock.examples/s-004-multi-item-reservation-is-all-or-nothing.sdp.md +++ b/specs/behavior/order-management/inventory/reserve-stock.examples/s-004-multi-item-reservation-is-all-or-nothing.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Multi-item reservation is all-or-nothing" from examples/order-management/tests/features/behavior/inventory/reserve-stock.feature +- outcome: Executable scenario: Multi-item reservation is all-or-nothing + +```gwt +Given the system is ready +And a product "prod_reserve_005" exists with 100 available stock +And another product "prod_reserve_006" exists with 2 available stock +When I send a ReserveStock command with: and the reservation includes: +Then the command should fail with reason "Insufficient stock" +``` diff --git a/specs/behavior/order-management/inventory/reserve-stock.examples/s-005-cannot-reserve-non-existent-product.sdp.md b/specs/behavior/order-management/inventory/reserve-stock.examples/s-005-cannot-reserve-non-existent-product.sdp.md index 8581a114..9030c2d7 100644 --- a/specs/behavior/order-management/inventory/reserve-stock.examples/s-005-cannot-reserve-non-existent-product.sdp.md +++ b/specs/behavior/order-management/inventory/reserve-stock.examples/s-005-cannot-reserve-non-existent-product.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cannot reserve non-existent product" from examples/order-management/tests/features/behavior/inventory/reserve-stock.feature +- outcome: Executable scenario: Cannot reserve non-existent product + +```gwt +Given the system is ready +And no product exists with ID "prod_ghost" +When I send a ReserveStock command with: and the reservation includes: +Then the command should fail with reason "Insufficient stock" +``` diff --git a/specs/behavior/order-management/inventory/reserve-stock.examples/s-006-reserve-stock-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/inventory/reserve-stock.examples/s-006-reserve-stock-is-idempotent-with-same-command-id.sdp.md index a418fb95..dbbcaf2e 100644 --- a/specs/behavior/order-management/inventory/reserve-stock.examples/s-006-reserve-stock-is-idempotent-with-same-command-id.sdp.md +++ b/specs/behavior/order-management/inventory/reserve-stock.examples/s-006-reserve-stock-is-idempotent-with-same-command-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "ReserveStock is idempotent with same commandId" from examples/order-management/tests/features/behavior/inventory/reserve-stock.feature +- outcome: Executable scenario: ReserveStock is idempotent with same commandId + +```gwt +Given the system is ready +And a product "prod_reserve_007" exists with 100 available stock +When I send a ReserveStock command twice with the same commandId for reservation "res_006" +Then the second command should return duplicate status +``` diff --git a/specs/behavior/order-management/inventory/reserve-stock.sdp.md b/specs/behavior/order-management/inventory/reserve-stock.sdp.md index be2a0828..2868d119 100644 --- a/specs/behavior/order-management/inventory/reserve-stock.sdp.md +++ b/specs/behavior/order-management/inventory/reserve-stock.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: to reserve stock for orders so that stock is held until order is confirmed or cancelled (test carrier: examples/order-management/tests/features/behavior/inventory/reserve-stock.feature) +- outcome: to reserve stock for orders so that stock is held until order is confirmed or cancelled diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-001-passes-when-stock-is-sufficient.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-001-passes-when-stock-is-sufficient.sdp.md index a4adbbf8..ca956e65 100644 --- a/specs/behavior/order-management/inventory/stock-invariants.examples/s-001-passes-when-stock-is-sufficient.sdp.md +++ b/specs/behavior/order-management/inventory/stock-invariants.examples/s-001-passes-when-stock-is-sufficient.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "passes when stock is sufficient" from examples/order-management/tests/features/behavior/inventory/stock-invariants.feature +- outcome: Executable scenario: passes when stock is sufficient + +```gwt +Given a product with available quantity 100 +When I assert sufficient stock for quantity 50 +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-002-passes-when-requesting-exact-available-quantity.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-002-passes-when-requesting-exact-available-quantity.sdp.md index a162a2b9..cb86649d 100644 --- a/specs/behavior/order-management/inventory/stock-invariants.examples/s-002-passes-when-requesting-exact-available-quantity.sdp.md +++ b/specs/behavior/order-management/inventory/stock-invariants.examples/s-002-passes-when-requesting-exact-available-quantity.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "passes when requesting exact available quantity" from examples/order-management/tests/features/behavior/inventory/stock-invariants.feature +- outcome: Executable scenario: passes when requesting exact available quantity + +```gwt +Given a product with available quantity 100 +When I assert sufficient stock for quantity 100 +Then no error is thrown +``` diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-003-throws-insufficient-stock-when-stock-is-not-enough.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-003-throws-insufficient-stock-when-stock-is-not-enough.sdp.md index 1ce0bd9e..beebe874 100644 --- a/specs/behavior/order-management/inventory/stock-invariants.examples/s-003-throws-insufficient-stock-when-stock-is-not-enough.sdp.md +++ b/specs/behavior/order-management/inventory/stock-invariants.examples/s-003-throws-insufficient-stock-when-stock-is-not-enough.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "throws INSUFFICIENT_STOCK when stock is not enough" from examples/order-management/tests/features/behavior/inventory/stock-invariants.feature +- outcome: Executable scenario: throws INSUFFICIENT_STOCK when stock is not enough + +```gwt +Given a product with available quantity 10 and productId "prod_low" +When I assert sufficient stock for quantity 20 +Then an InventoryInvariantError is thrown with code "INSUFFICIENT_STOCK" +And the error context productId is "prod_low" +And the error context availableQuantity is 10 +And the error context requestedQuantity is 20 +``` diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-004-throws-insufficient-stock-when-stock-is-zero.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-004-throws-insufficient-stock-when-stock-is-zero.sdp.md index bc6053bf..ab861a02 100644 --- a/specs/behavior/order-management/inventory/stock-invariants.examples/s-004-throws-insufficient-stock-when-stock-is-zero.sdp.md +++ b/specs/behavior/order-management/inventory/stock-invariants.examples/s-004-throws-insufficient-stock-when-stock-is-zero.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "throws INSUFFICIENT_STOCK when stock is zero" from examples/order-management/tests/features/behavior/inventory/stock-invariants.feature +- outcome: Executable scenario: throws INSUFFICIENT_STOCK when stock is zero + +```gwt +Given a product with available quantity 0 +When I assert sufficient stock for quantity 1 +Then an InventoryInvariantError is thrown with code "INSUFFICIENT_STOCK" +``` diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-005-returns-available-when-stock-is-sufficient.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-005-returns-available-when-stock-is-sufficient.sdp.md index 65f95fbd..393e6345 100644 --- a/specs/behavior/order-management/inventory/stock-invariants.examples/s-005-returns-available-when-stock-is-sufficient.sdp.md +++ b/specs/behavior/order-management/inventory/stock-invariants.examples/s-005-returns-available-when-stock-is-sufficient.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "returns available when stock is sufficient" from examples/order-management/tests/features/behavior/inventory/stock-invariants.feature +- outcome: Executable scenario: returns available when stock is sufficient + +```gwt +Given a product with available quantity 100 +When I check stock availability for quantity 50 +Then the result shows stock is available +``` diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-006-returns-available-when-requesting-exact-amount.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-006-returns-available-when-requesting-exact-amount.sdp.md index bc52df0c..64eaca4e 100644 --- a/specs/behavior/order-management/inventory/stock-invariants.examples/s-006-returns-available-when-requesting-exact-amount.sdp.md +++ b/specs/behavior/order-management/inventory/stock-invariants.examples/s-006-returns-available-when-requesting-exact-amount.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "returns available when requesting exact amount" from examples/order-management/tests/features/behavior/inventory/stock-invariants.feature +- outcome: Executable scenario: returns available when requesting exact amount + +```gwt +Given a product with available quantity 100 +When I check stock availability for quantity 100 +Then the result shows stock is available +``` diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-007-returns-unavailable-with-deficit-when-stock-is-insufficient.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-007-returns-unavailable-with-deficit-when-stock-is-insufficient.sdp.md index ad16f903..2502d579 100644 --- a/specs/behavior/order-management/inventory/stock-invariants.examples/s-007-returns-unavailable-with-deficit-when-stock-is-insufficient.sdp.md +++ b/specs/behavior/order-management/inventory/stock-invariants.examples/s-007-returns-unavailable-with-deficit-when-stock-is-insufficient.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "returns unavailable with deficit when stock is insufficient" from examples/order-management/tests/features/behavior/inventory/stock-invariants.feature +- outcome: Executable scenario: returns unavailable with deficit when stock is insufficient + +```gwt +Given a product with available quantity 10 +When I check stock availability for quantity 25 +Then the result shows stock is not available +And the deficit is 15 +``` diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-008-returns-correct-deficit-for-zero-stock.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-008-returns-correct-deficit-for-zero-stock.sdp.md index 6dfb7768..58fe71cc 100644 --- a/specs/behavior/order-management/inventory/stock-invariants.examples/s-008-returns-correct-deficit-for-zero-stock.sdp.md +++ b/specs/behavior/order-management/inventory/stock-invariants.examples/s-008-returns-correct-deficit-for-zero-stock.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "returns correct deficit for zero stock" from examples/order-management/tests/features/behavior/inventory/stock-invariants.feature +- outcome: Executable scenario: returns correct deficit for zero stock + +```gwt +Given a product with available quantity 0 +When I check stock availability for quantity 10 +Then the result shows stock is not available +And the deficit is 10 +``` diff --git a/specs/behavior/order-management/inventory/stock-invariants.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.sdp.md index f25f2188..9ec638b4 100644 --- a/specs/behavior/order-management/inventory/stock-invariants.sdp.md +++ b/specs/behavior/order-management/inventory/stock-invariants.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: pure stock invariant functions that validate quantity constraints so that stock over-allocation is prevented with structured error information (test carrier: examples/order-management/tests/features/behavior/inventory/stock-invariants.feature) +- actor: a developer working with the Inventory bounded context +- outcome: pure stock invariant functions that validate quantity constraints so that stock over-allocation is prevented with structured error information + +## Behavior + +- rule: assertSufficientStock ensures requested quantity does not exceed available stock +- rule: checkStockAvailability returns availability status with optional deficit diff --git a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-001-multi-product-order-uses-dcb-for-atomic-reservation.sdp.md b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-001-multi-product-order-uses-dcb-for-atomic-reservation.sdp.md index d63793f2..ace4ceb7 100644 --- a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-001-multi-product-order-uses-dcb-for-atomic-reservation.sdp.md +++ b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-001-multi-product-order-uses-dcb-for-atomic-reservation.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Multi-product order uses DCB for atomic reservation" from examples/order-management/tests/features/modernization/dcb-multi-product-reservation.feature +- outcome: Executable scenario: Multi-product order uses DCB for atomic reservation + +```gwt +Given the inventory bounded context is initialized +And the test run has a unique namespace +And products exist with sufficient inventory: +And an order with the following items: +When the order is submitted using executeWithDCB +Then all inventory reservations should succeed atomically +And a single ReservationCreated event should be emitted +And each product's available quantity should be reduced +``` diff --git a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-002-insufficient-inventory-for-one-product-rejects-entire-reservation.sdp.md b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-002-insufficient-inventory-for-one-product-rejects-entire-reservation.sdp.md index 69d6678f..41007804 100644 --- a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-002-insufficient-inventory-for-one-product-rejects-entire-reservation.sdp.md +++ b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-002-insufficient-inventory-for-one-product-rejects-entire-reservation.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Insufficient inventory for one product rejects entire reservation" from examples/order-management/tests/features/modernization/dcb-multi-product-reservation.feature +- outcome: Executable scenario: Insufficient inventory for one product rejects entire reservation + +```gwt +Given the inventory bounded context is initialized +And the test run has a unique namespace +And products exist with inventory: +And an order with the following items: +When the order is submitted using executeWithDCB +Then the entire reservation should be rejected +And no inventory should be reserved for any product +And rejection reason should indicate "prod-002" has insufficient stock +``` diff --git a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-003-dcb-handles-concurrent-reservation-conflicts.sdp.md b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-003-dcb-handles-concurrent-reservation-conflicts.sdp.md index ee83b40c..0c0c5fc1 100644 --- a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-003-dcb-handles-concurrent-reservation-conflicts.sdp.md +++ b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-003-dcb-handles-concurrent-reservation-conflicts.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "DCB handles concurrent reservation conflicts" from examples/order-management/tests/features/modernization/dcb-multi-product-reservation.feature +- outcome: Executable scenario: DCB handles concurrent reservation conflicts + +```gwt +Given the inventory bounded context is initialized +And the test run has a unique namespace +And a product with available quantity 10 +And two concurrent orders each requesting quantity 8 +When both orders are submitted simultaneously +Then exactly one order should succeed +And one order should be rejected with conflict error +And total reserved should not exceed available +``` diff --git a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-004-duplicate-product-i-ds-are-rejected.sdp.md b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-004-duplicate-product-i-ds-are-rejected.sdp.md index 2ea0d463..8c7ad0f7 100644 --- a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-004-duplicate-product-i-ds-are-rejected.sdp.md +++ b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-004-duplicate-product-i-ds-are-rejected.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Duplicate product IDs are rejected" from examples/order-management/tests/features/modernization/dcb-multi-product-reservation.feature +- outcome: Executable scenario: Duplicate product IDs are rejected + +```gwt +Given the inventory bounded context is initialized +And the test run has a unique namespace +And products exist with sufficient inventory: +When attempting to reserve with duplicate product IDs: +Then the reservation should be rejected with code "DUPLICATE_PRODUCT_IDS" +And the error context should include the duplicate product IDs +``` diff --git a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.sdp.md b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.sdp.md index 5f5dcaa9..21e1f562 100644 --- a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.sdp.md +++ b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.sdp.md @@ -10,4 +10,9 @@ relations: ## Intent -- outcome: to see DCB demonstrated in the order submission flow so that I understand how to use executeWithDCB for multi-entity operations (test carrier: examples/order-management/tests/features/modernization/dcb-multi-product-reservation.feature) +- actor: a platform developer +- outcome: to see DCB demonstrated in the order submission flow so that I understand how to use executeWithDCB for multi-entity operations + +## Behavior + +- rule: Order submission uses DCB for atomic multi-product reservation diff --git a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-001-order-submitted-includes-customer-snapshot.sdp.md b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-001-order-submitted-includes-customer-snapshot.sdp.md index d5fcb8df..044e3564 100644 --- a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-001-order-submitted-includes-customer-snapshot.sdp.md +++ b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-001-order-submitted-includes-customer-snapshot.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "OrderSubmitted includes customer snapshot" from examples/order-management/tests/features/modernization/fat-events-order-submitted.feature +- outcome: Executable scenario: OrderSubmitted includes customer snapshot + +```gwt +Given the orders bounded context is initialized +And the test run has a unique namespace +And a customer exists: +And the customer has a draft order +When the customer submits the order +Then the OrderSubmitted event should include: +And the event schema version should be 2 +``` diff --git a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-002-event-enrichment-does-not-block-order-submission.sdp.md b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-002-event-enrichment-does-not-block-order-submission.sdp.md index f68a7fb5..c4641358 100644 --- a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-002-event-enrichment-does-not-block-order-submission.sdp.md +++ b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-002-event-enrichment-does-not-block-order-submission.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Event enrichment does not block order submission" from examples/order-management/tests/features/modernization/fat-events-order-submitted.feature +- outcome: Executable scenario: Event enrichment does not block order submission + +```gwt +Given the orders bounded context is initialized +And the test run has a unique namespace +And a customer with complete profile +And a draft order ready for submission +When the order is submitted +Then the command should complete within acceptable latency +And the event should be enriched with customer data +``` diff --git a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-003-customer-snapshot-is-immutable-in-event.sdp.md b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-003-customer-snapshot-is-immutable-in-event.sdp.md index 9dde7dae..58eacce0 100644 --- a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-003-customer-snapshot-is-immutable-in-event.sdp.md +++ b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-003-customer-snapshot-is-immutable-in-event.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Customer snapshot is immutable in event" from examples/order-management/tests/features/modernization/fat-events-order-submitted.feature +- outcome: Executable scenario: Customer snapshot is immutable in event + +```gwt +Given the orders bounded context is initialized +And the test run has a unique namespace +And an OrderSubmitted event exists with customer name "John Doe" +When the customer updates their name to "John Smith" +Then querying the original event should still show "John Doe" +And new OrderSubmitted events should show "John Smith" +``` diff --git a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-004-missing-customer-data-handled-gracefully.sdp.md b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-004-missing-customer-data-handled-gracefully.sdp.md index db10bb97..2c8ad8a2 100644 --- a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-004-missing-customer-data-handled-gracefully.sdp.md +++ b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-004-missing-customer-data-handled-gracefully.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Missing customer data handled gracefully" from examples/order-management/tests/features/modernization/fat-events-order-submitted.feature +- outcome: Executable scenario: Missing customer data handled gracefully + +```gwt +Given the orders bounded context is initialized +And the test run has a unique namespace +And a customer with incomplete profile (missing email) +When the customer submits an order +Then the OrderSubmitted event should include available data +And missing fields should have null or default values +And the order submission should not fail +``` diff --git a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-005-v1-events-are-upcasted-to-v2-with-null-customer.sdp.md b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-005-v1-events-are-upcasted-to-v2-with-null-customer.sdp.md index 20052bbb..789c7199 100644 --- a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-005-v1-events-are-upcasted-to-v2-with-null-customer.sdp.md +++ b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-005-v1-events-are-upcasted-to-v2-with-null-customer.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "V1 events are upcasted to V2 with null customer" from examples/order-management/tests/features/modernization/fat-events-order-submitted.feature +- outcome: Executable scenario: V1 events are upcasted to V2 with null customer + +```gwt +Given the orders bounded context is initialized +And the test run has a unique namespace +And a legacy V1 OrderSubmitted event without customer data +When the event is read through the upcaster +Then the event should have schema version 2 +And the customer field should be null indicating a legacy event +``` diff --git a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-006-v2-events-are-not-modified-by-upcaster.sdp.md b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-006-v2-events-are-not-modified-by-upcaster.sdp.md index d3db3fce..9e1fd134 100644 --- a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-006-v2-events-are-not-modified-by-upcaster.sdp.md +++ b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-006-v2-events-are-not-modified-by-upcaster.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "V2 events are not modified by upcaster" from examples/order-management/tests/features/modernization/fat-events-order-submitted.feature +- outcome: Executable scenario: V2 events are not modified by upcaster + +```gwt +Given the orders bounded context is initialized +And the test run has a unique namespace +And a V2 OrderSubmitted event with customer data +When the event is read through the upcaster +Then the event should have schema version 2 +And wasUpcasted should be false +And the customer snapshot should be preserved +``` diff --git a/specs/behavior/order-management/modernization/fat-events-order-submitted.sdp.md b/specs/behavior/order-management/modernization/fat-events-order-submitted.sdp.md index 8ea83a03..6962a3e0 100644 --- a/specs/behavior/order-management/modernization/fat-events-order-submitted.sdp.md +++ b/specs/behavior/order-management/modernization/fat-events-order-submitted.sdp.md @@ -10,4 +10,9 @@ relations: ## Intent -- outcome: OrderSubmitted events to include customer snapshots so that I can process orders without additional customer queries (test carrier: examples/order-management/tests/features/modernization/fat-events-order-submitted.feature) +- actor: an event consumer +- outcome: OrderSubmitted events to include customer snapshots so that I can process orders without additional customer queries + +## Behavior + +- rule: OrderSubmitted event includes customer snapshot diff --git a/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-001-order-detail-view-shows-instant-updates.sdp.md b/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-001-order-detail-view-shows-instant-updates.sdp.md index 20cb7c68..0162d2f4 100644 --- a/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-001-order-detail-view-shows-instant-updates.sdp.md +++ b/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-001-order-detail-view-shows-instant-updates.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Order detail view shows instant updates" from examples/order-management/tests/features/modernization/reactive-order-detail.feature +- outcome: Executable scenario: Order detail view shows instant updates + +```gwt +Given the orders bounded context is initialized +And the test run has a unique namespace +And an order exists with status "draft" +And a client is subscribed to the order detail view +When the order status changes to "submitted" +Then the UI should receive the update within 50ms +And no polling should have occurred +``` diff --git a/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-002-multiple-rapid-updates-are-applied-correctly.sdp.md b/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-002-multiple-rapid-updates-are-applied-correctly.sdp.md index 1a90aa5e..5233824b 100644 --- a/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-002-multiple-rapid-updates-are-applied-correctly.sdp.md +++ b/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-002-multiple-rapid-updates-are-applied-correctly.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Multiple rapid updates are applied correctly" from examples/order-management/tests/features/modernization/reactive-order-detail.feature +- outcome: Executable scenario: Multiple rapid updates are applied correctly + +```gwt +Given the orders bounded context is initialized +And the test run has a unique namespace +And an order exists with 2 items +And a client is subscribed to the order detail view +When 5 items are added in rapid succession +Then all items should appear in the view +And the final item count should be 7 +``` diff --git a/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-003-optimistic-update-rolls-back-on-conflict.sdp.md b/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-003-optimistic-update-rolls-back-on-conflict.sdp.md index c947df82..fbd356dc 100644 --- a/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-003-optimistic-update-rolls-back-on-conflict.sdp.md +++ b/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-003-optimistic-update-rolls-back-on-conflict.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Optimistic update rolls back on conflict" from examples/order-management/tests/features/modernization/reactive-order-detail.feature +- outcome: Executable scenario: Optimistic update rolls back on conflict + +```gwt +Given the orders bounded context is initialized +And the test run has a unique namespace +And a client has an optimistic order total of $100 +And the server projection shows order total of $150 +When the conflict is detected +Then the optimistic state should be rolled back to $150 +And a conflict event should be logged +``` diff --git a/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-004-stale-event-stream-is-handled-gracefully.sdp.md b/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-004-stale-event-stream-is-handled-gracefully.sdp.md index 0cc921cc..9f4b4536 100644 --- a/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-004-stale-event-stream-is-handled-gracefully.sdp.md +++ b/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-004-stale-event-stream-is-handled-gracefully.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Stale event stream is handled gracefully" from examples/order-management/tests/features/modernization/reactive-order-detail.feature +- outcome: Executable scenario: Stale event stream is handled gracefully + +```gwt +Given the orders bounded context is initialized +And the test run has a unique namespace +And a client subscribed with an outdated event cursor +When the server has newer events +Then the client should catch up to current state +And no data loss should occur +``` diff --git a/specs/behavior/order-management/modernization/reactive-order-detail.sdp.md b/specs/behavior/order-management/modernization/reactive-order-detail.sdp.md index 4f6da183..89524c60 100644 --- a/specs/behavior/order-management/modernization/reactive-order-detail.sdp.md +++ b/specs/behavior/order-management/modernization/reactive-order-detail.sdp.md @@ -10,4 +10,9 @@ relations: ## Intent -- outcome: to see useReactiveProjection demonstrated for order detail so that I understand how to build instant-updating UI components (test carrier: examples/order-management/tests/features/modernization/reactive-order-detail.feature) +- actor: a frontend developer +- outcome: to see useReactiveProjection demonstrated for order detail so that I understand how to build instant-updating UI components + +## Behavior + +- rule: Order detail view uses reactive projection for instant updates diff --git a/specs/behavior/order-management/modernization/reference-documentation.examples/s-001-readme-has-reference-implementation-designation.sdp.md b/specs/behavior/order-management/modernization/reference-documentation.examples/s-001-readme-has-reference-implementation-designation.sdp.md index 498866a9..43419775 100644 --- a/specs/behavior/order-management/modernization/reference-documentation.examples/s-001-readme-has-reference-implementation-designation.sdp.md +++ b/specs/behavior/order-management/modernization/reference-documentation.examples/s-001-readme-has-reference-implementation-designation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "README has Reference Implementation designation" from examples/order-management/tests/features/modernization/reference-documentation.feature +- outcome: Executable scenario: README has Reference Implementation designation + +```gwt +Given the example app README exists at "examples/order-management/README.md" +And the example app README +When reading the document header +Then it should have a clear "Reference Implementation" badge or heading +And the purpose section should explain: +``` diff --git a/specs/behavior/order-management/modernization/reference-documentation.examples/s-002-all-demonstrated-patterns-are-cataloged.sdp.md b/specs/behavior/order-management/modernization/reference-documentation.examples/s-002-all-demonstrated-patterns-are-cataloged.sdp.md index 699bca3a..29c869ef 100644 --- a/specs/behavior/order-management/modernization/reference-documentation.examples/s-002-all-demonstrated-patterns-are-cataloged.sdp.md +++ b/specs/behavior/order-management/modernization/reference-documentation.examples/s-002-all-demonstrated-patterns-are-cataloged.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "All demonstrated patterns are cataloged" from examples/order-management/tests/features/modernization/reference-documentation.feature +- outcome: Executable scenario: All demonstrated patterns are cataloged + +```gwt +Given the example app README exists at "examples/order-management/README.md" +And the "Patterns Demonstrated" section in README +When the scenario runs +Then it should list the following patterns: +``` diff --git a/specs/behavior/order-management/modernization/reference-documentation.examples/s-003-pattern-links-are-valid.sdp.md b/specs/behavior/order-management/modernization/reference-documentation.examples/s-003-pattern-links-are-valid.sdp.md index 3a469989..5db7c22c 100644 --- a/specs/behavior/order-management/modernization/reference-documentation.examples/s-003-pattern-links-are-valid.sdp.md +++ b/specs/behavior/order-management/modernization/reference-documentation.examples/s-003-pattern-links-are-valid.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Pattern links are valid" from examples/order-management/tests/features/modernization/reference-documentation.feature +- outcome: Executable scenario: Pattern links are valid + +```gwt +Given the example app README exists at "examples/order-management/README.md" +And each pattern in the catalog has a code location link +When validating the links +Then all code links should point to existing files +And all documentation links should be valid +``` diff --git a/specs/behavior/order-management/modernization/reference-documentation.examples/s-004-architecture-diagram-is-present.sdp.md b/specs/behavior/order-management/modernization/reference-documentation.examples/s-004-architecture-diagram-is-present.sdp.md index 0759c401..4cd7f09a 100644 --- a/specs/behavior/order-management/modernization/reference-documentation.examples/s-004-architecture-diagram-is-present.sdp.md +++ b/specs/behavior/order-management/modernization/reference-documentation.examples/s-004-architecture-diagram-is-present.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Architecture diagram is present" from examples/order-management/tests/features/modernization/reference-documentation.feature +- outcome: Executable scenario: Architecture diagram is present + +```gwt +Given the example app README exists at "examples/order-management/README.md" +And the README +When looking for the Architecture Diagram section +Then it should include a visual diagram (Mermaid or image) +And the diagram should show Orders BC and Inventory BC +And the diagram should indicate where each platform pattern is used +``` diff --git a/specs/behavior/order-management/modernization/reference-documentation.sdp.md b/specs/behavior/order-management/modernization/reference-documentation.sdp.md index 8a844a54..ffff2bc6 100644 --- a/specs/behavior/order-management/modernization/reference-documentation.sdp.md +++ b/specs/behavior/order-management/modernization/reference-documentation.sdp.md @@ -10,4 +10,9 @@ relations: ## Intent -- outcome: clear documentation designating this as a reference implementation so that I understand its purpose and how to learn from it (test carrier: examples/order-management/tests/features/modernization/reference-documentation.feature) +- actor: a platform user +- outcome: clear documentation designating this as a reference implementation so that I understand its purpose and how to learn from it + +## Behavior + +- rule: README documents the app as a Reference Implementation diff --git a/specs/behavior/order-management/orders/add-items.examples/s-001-add-single-item-to-empty-draft-order.sdp.md b/specs/behavior/order-management/orders/add-items.examples/s-001-add-single-item-to-empty-draft-order.sdp.md index b91a0f37..a554b589 100644 --- a/specs/behavior/order-management/orders/add-items.examples/s-001-add-single-item-to-empty-draft-order.sdp.md +++ b/specs/behavior/order-management/orders/add-items.examples/s-001-add-single-item-to-empty-draft-order.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Add single item to empty draft order" from examples/order-management/tests/features/behavior/orders/add-items.feature +- outcome: Executable scenario: Add single item to empty draft order + +```gwt +Given the system is ready +And an order "ord_items_001" exists with status "draft" +And the order has no items +When I add an item to order "ord_items_001": +Then the command should succeed +And the order should have 1 item +And the order total should be 30 +``` diff --git a/specs/behavior/order-management/orders/add-items.examples/s-002-add-multiple-items-to-draft-order.sdp.md b/specs/behavior/order-management/orders/add-items.examples/s-002-add-multiple-items-to-draft-order.sdp.md index 92888f25..c66da136 100644 --- a/specs/behavior/order-management/orders/add-items.examples/s-002-add-multiple-items-to-draft-order.sdp.md +++ b/specs/behavior/order-management/orders/add-items.examples/s-002-add-multiple-items-to-draft-order.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Add multiple items to draft order" from examples/order-management/tests/features/behavior/orders/add-items.feature +- outcome: Executable scenario: Add multiple items to draft order + +```gwt +Given the system is ready +And an order "ord_items_002" exists with status "draft" +And the order has no items +When I add items to order "ord_items_002": +Then the command should succeed +And the order should have 3 items +And the order total should be 60 +``` diff --git a/specs/behavior/order-management/orders/add-items.examples/s-003-cannot-add-items-to-submitted-order.sdp.md b/specs/behavior/order-management/orders/add-items.examples/s-003-cannot-add-items-to-submitted-order.sdp.md index 89ded015..154c0420 100644 --- a/specs/behavior/order-management/orders/add-items.examples/s-003-cannot-add-items-to-submitted-order.sdp.md +++ b/specs/behavior/order-management/orders/add-items.examples/s-003-cannot-add-items-to-submitted-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cannot add items to submitted order" from examples/order-management/tests/features/behavior/orders/add-items.feature +- outcome: Executable scenario: Cannot add items to submitted order + +```gwt +Given the system is ready +And an order "ord_items_003" exists with status "submitted" +When I add an item to order "ord_items_003": +Then the command should be rejected with code "ORDER_NOT_IN_DRAFT" +``` diff --git a/specs/behavior/order-management/orders/add-items.examples/s-004-cannot-add-items-to-cancelled-order.sdp.md b/specs/behavior/order-management/orders/add-items.examples/s-004-cannot-add-items-to-cancelled-order.sdp.md index 1b941428..c884a425 100644 --- a/specs/behavior/order-management/orders/add-items.examples/s-004-cannot-add-items-to-cancelled-order.sdp.md +++ b/specs/behavior/order-management/orders/add-items.examples/s-004-cannot-add-items-to-cancelled-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cannot add items to cancelled order" from examples/order-management/tests/features/behavior/orders/add-items.feature +- outcome: Executable scenario: Cannot add items to cancelled order + +```gwt +Given the system is ready +And an order "ord_items_004" exists with status "cancelled" +When I add an item to order "ord_items_004": +Then the command should be rejected with code "ORDER_NOT_IN_DRAFT" +``` diff --git a/specs/behavior/order-management/orders/add-items.examples/s-005-cannot-add-item-with-zero-quantity.sdp.md b/specs/behavior/order-management/orders/add-items.examples/s-005-cannot-add-item-with-zero-quantity.sdp.md index c3163a0c..4570818a 100644 --- a/specs/behavior/order-management/orders/add-items.examples/s-005-cannot-add-item-with-zero-quantity.sdp.md +++ b/specs/behavior/order-management/orders/add-items.examples/s-005-cannot-add-item-with-zero-quantity.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cannot add item with zero quantity" from examples/order-management/tests/features/behavior/orders/add-items.feature +- outcome: Executable scenario: Cannot add item with zero quantity + +```gwt +Given the system is ready +And an order "ord_items_005" exists with status "draft" +When I add an item to order "ord_items_005": +Then the command should be rejected +``` diff --git a/specs/behavior/order-management/orders/add-items.examples/s-006-cannot-add-item-with-negative-quantity.sdp.md b/specs/behavior/order-management/orders/add-items.examples/s-006-cannot-add-item-with-negative-quantity.sdp.md index d1f9543e..2e215666 100644 --- a/specs/behavior/order-management/orders/add-items.examples/s-006-cannot-add-item-with-negative-quantity.sdp.md +++ b/specs/behavior/order-management/orders/add-items.examples/s-006-cannot-add-item-with-negative-quantity.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cannot add item with negative quantity" from examples/order-management/tests/features/behavior/orders/add-items.feature +- outcome: Executable scenario: Cannot add item with negative quantity + +```gwt +Given the system is ready +And an order "ord_items_006" exists with status "draft" +When I add an item to order "ord_items_006": +Then the command should be rejected +``` diff --git a/specs/behavior/order-management/orders/add-items.examples/s-007-cannot-add-item-with-negative-price.sdp.md b/specs/behavior/order-management/orders/add-items.examples/s-007-cannot-add-item-with-negative-price.sdp.md index 1bec579c..cb7ac17e 100644 --- a/specs/behavior/order-management/orders/add-items.examples/s-007-cannot-add-item-with-negative-price.sdp.md +++ b/specs/behavior/order-management/orders/add-items.examples/s-007-cannot-add-item-with-negative-price.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cannot add item with negative price" from examples/order-management/tests/features/behavior/orders/add-items.feature +- outcome: Executable scenario: Cannot add item with negative price + +```gwt +Given the system is ready +And an order "ord_items_007" exists with status "draft" +When I add an item to order "ord_items_007": +Then the command should be rejected +``` diff --git a/specs/behavior/order-management/orders/add-items.sdp.md b/specs/behavior/order-management/orders/add-items.sdp.md index 2c868501..c6f3ee59 100644 --- a/specs/behavior/order-management/orders/add-items.sdp.md +++ b/specs/behavior/order-management/orders/add-items.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: to add items to my order so that I can purchase multiple products (test carrier: examples/order-management/tests/features/behavior/orders/add-items.feature) +- actor: a customer +- outcome: to add items to my order so that I can purchase multiple products diff --git a/specs/behavior/order-management/orders/cancel-order.examples/s-001-cancel-draft-order.sdp.md b/specs/behavior/order-management/orders/cancel-order.examples/s-001-cancel-draft-order.sdp.md index 9675f52c..8bebd473 100644 --- a/specs/behavior/order-management/orders/cancel-order.examples/s-001-cancel-draft-order.sdp.md +++ b/specs/behavior/order-management/orders/cancel-order.examples/s-001-cancel-draft-order.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Cancel draft order" from examples/order-management/tests/features/behavior/orders/cancel-order.feature +- outcome: Executable scenario: Cancel draft order + +```gwt +Given the system is ready +And an order "ord_cancel_001" exists with status "draft" +When I send a CancelOrder command for "ord_cancel_001" with reason "Changed my mind" +Then the command should succeed +And the order "ord_cancel_001" status should be "cancelled" +``` diff --git a/specs/behavior/order-management/orders/cancel-order.examples/s-002-cancel-submitted-order.sdp.md b/specs/behavior/order-management/orders/cancel-order.examples/s-002-cancel-submitted-order.sdp.md index 7b2ef432..eb02c684 100644 --- a/specs/behavior/order-management/orders/cancel-order.examples/s-002-cancel-submitted-order.sdp.md +++ b/specs/behavior/order-management/orders/cancel-order.examples/s-002-cancel-submitted-order.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Cancel submitted order" from examples/order-management/tests/features/behavior/orders/cancel-order.feature +- outcome: Executable scenario: Cancel submitted order + +```gwt +Given the system is ready +And an order "ord_cancel_002" exists with status "submitted" +When I send a CancelOrder command for "ord_cancel_002" with reason "Found better price" +Then the command should succeed +And the order "ord_cancel_002" status should be "cancelled" +``` diff --git a/specs/behavior/order-management/orders/cancel-order.examples/s-003-cannot-cancel-already-cancelled-order.sdp.md b/specs/behavior/order-management/orders/cancel-order.examples/s-003-cannot-cancel-already-cancelled-order.sdp.md index 497cab74..95343ce9 100644 --- a/specs/behavior/order-management/orders/cancel-order.examples/s-003-cannot-cancel-already-cancelled-order.sdp.md +++ b/specs/behavior/order-management/orders/cancel-order.examples/s-003-cannot-cancel-already-cancelled-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cannot cancel already cancelled order" from examples/order-management/tests/features/behavior/orders/cancel-order.feature +- outcome: Executable scenario: Cannot cancel already cancelled order + +```gwt +Given the system is ready +And an order "ord_cancel_003" exists with status "cancelled" +When I send a CancelOrder command for "ord_cancel_003" with reason "Double cancel" +Then the command should be rejected with code "ORDER_ALREADY_CANCELLED" +``` diff --git a/specs/behavior/order-management/orders/cancel-order.examples/s-004-cancel-confirmed-order.sdp.md b/specs/behavior/order-management/orders/cancel-order.examples/s-004-cancel-confirmed-order.sdp.md index 2f1bc3d7..2aec2461 100644 --- a/specs/behavior/order-management/orders/cancel-order.examples/s-004-cancel-confirmed-order.sdp.md +++ b/specs/behavior/order-management/orders/cancel-order.examples/s-004-cancel-confirmed-order.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Cancel confirmed order" from examples/order-management/tests/features/behavior/orders/cancel-order.feature +- outcome: Executable scenario: Cancel confirmed order + +```gwt +Given the system is ready +And an order "ord_cancel_004" exists with status "confirmed" +When I send a CancelOrder command for "ord_cancel_004" with reason "Changed mind after confirmation" +Then the command should succeed +And the order "ord_cancel_004" status should be "cancelled" +``` diff --git a/specs/behavior/order-management/orders/cancel-order.examples/s-005-cannot-cancel-non-existent-order.sdp.md b/specs/behavior/order-management/orders/cancel-order.examples/s-005-cannot-cancel-non-existent-order.sdp.md index e174f925..bfdafd71 100644 --- a/specs/behavior/order-management/orders/cancel-order.examples/s-005-cannot-cancel-non-existent-order.sdp.md +++ b/specs/behavior/order-management/orders/cancel-order.examples/s-005-cannot-cancel-non-existent-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cannot cancel non-existent order" from examples/order-management/tests/features/behavior/orders/cancel-order.feature +- outcome: Executable scenario: Cannot cancel non-existent order + +```gwt +Given the system is ready +And no order exists with ID "ord_cancel_nonexistent" +When I send a CancelOrder command for "ord_cancel_nonexistent" with reason "Test" +Then the command should be rejected with code "ORDER_NOT_FOUND" +``` diff --git a/specs/behavior/order-management/orders/cancel-order.examples/s-006-cancel-order-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/orders/cancel-order.examples/s-006-cancel-order-is-idempotent-with-same-command-id.sdp.md index 5fe319dc..892e64c6 100644 --- a/specs/behavior/order-management/orders/cancel-order.examples/s-006-cancel-order-is-idempotent-with-same-command-id.sdp.md +++ b/specs/behavior/order-management/orders/cancel-order.examples/s-006-cancel-order-is-idempotent-with-same-command-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "CancelOrder is idempotent with same commandId" from examples/order-management/tests/features/behavior/orders/cancel-order.feature +- outcome: Executable scenario: CancelOrder is idempotent with same commandId + +```gwt +Given the system is ready +And an order "ord_cancel_005" exists with status "draft" +When I send a CancelOrder command twice with the same commandId for "ord_cancel_005" +Then the order should only be cancelled once +``` diff --git a/specs/behavior/order-management/orders/cancel-order.sdp.md b/specs/behavior/order-management/orders/cancel-order.sdp.md index ba21f9ec..38038678 100644 --- a/specs/behavior/order-management/orders/cancel-order.sdp.md +++ b/specs/behavior/order-management/orders/cancel-order.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: to cancel my order so that I don't have to complete the purchase (test carrier: examples/order-management/tests/features/behavior/orders/cancel-order.feature) +- actor: a customer +- outcome: to cancel my order so that I don't have to complete the purchase diff --git a/specs/behavior/order-management/orders/confirm-order.examples/s-001-successfully-confirm-a-submitted-order.sdp.md b/specs/behavior/order-management/orders/confirm-order.examples/s-001-successfully-confirm-a-submitted-order.sdp.md index f7d11acb..9818c10e 100644 --- a/specs/behavior/order-management/orders/confirm-order.examples/s-001-successfully-confirm-a-submitted-order.sdp.md +++ b/specs/behavior/order-management/orders/confirm-order.examples/s-001-successfully-confirm-a-submitted-order.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Successfully confirm a submitted order" from examples/order-management/tests/features/behavior/orders/confirm-order.feature +- outcome: Executable scenario: Successfully confirm a submitted order + +```gwt +Given the system is ready +And an order "ord_confirm_001" exists with status "submitted" +When I send a ConfirmOrder command for "ord_confirm_001" +Then the command should succeed +And the order "ord_confirm_001" status should be "confirmed" +``` diff --git a/specs/behavior/order-management/orders/confirm-order.examples/s-002-cannot-confirm-a-draft-order.sdp.md b/specs/behavior/order-management/orders/confirm-order.examples/s-002-cannot-confirm-a-draft-order.sdp.md index 903f52b0..e7c9e5d7 100644 --- a/specs/behavior/order-management/orders/confirm-order.examples/s-002-cannot-confirm-a-draft-order.sdp.md +++ b/specs/behavior/order-management/orders/confirm-order.examples/s-002-cannot-confirm-a-draft-order.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Cannot confirm a draft order" from examples/order-management/tests/features/behavior/orders/confirm-order.feature +- outcome: Executable scenario: Cannot confirm a draft order + +```gwt +Given the system is ready +And an order "ord_confirm_002" exists with status "draft" +When I send a ConfirmOrder command for "ord_confirm_002" +Then the command should be rejected with code "ORDER_NOT_SUBMITTED" +And the order "ord_confirm_002" status should remain "draft" +``` diff --git a/specs/behavior/order-management/orders/confirm-order.examples/s-003-cannot-confirm-an-already-confirmed-order.sdp.md b/specs/behavior/order-management/orders/confirm-order.examples/s-003-cannot-confirm-an-already-confirmed-order.sdp.md index d6aa247e..79c2a1c6 100644 --- a/specs/behavior/order-management/orders/confirm-order.examples/s-003-cannot-confirm-an-already-confirmed-order.sdp.md +++ b/specs/behavior/order-management/orders/confirm-order.examples/s-003-cannot-confirm-an-already-confirmed-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cannot confirm an already confirmed order" from examples/order-management/tests/features/behavior/orders/confirm-order.feature +- outcome: Executable scenario: Cannot confirm an already confirmed order + +```gwt +Given the system is ready +And an order "ord_confirm_003" exists with status "confirmed" +When I send a ConfirmOrder command for "ord_confirm_003" +Then the command should be rejected with code "ORDER_NOT_SUBMITTED" +``` diff --git a/specs/behavior/order-management/orders/confirm-order.examples/s-004-cannot-confirm-a-cancelled-order.sdp.md b/specs/behavior/order-management/orders/confirm-order.examples/s-004-cannot-confirm-a-cancelled-order.sdp.md index 96947261..0280def9 100644 --- a/specs/behavior/order-management/orders/confirm-order.examples/s-004-cannot-confirm-a-cancelled-order.sdp.md +++ b/specs/behavior/order-management/orders/confirm-order.examples/s-004-cannot-confirm-a-cancelled-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cannot confirm a cancelled order" from examples/order-management/tests/features/behavior/orders/confirm-order.feature +- outcome: Executable scenario: Cannot confirm a cancelled order + +```gwt +Given the system is ready +And an order "ord_confirm_004" exists with status "cancelled" +When I send a ConfirmOrder command for "ord_confirm_004" +Then the command should be rejected with code "ORDER_NOT_SUBMITTED" +``` diff --git a/specs/behavior/order-management/orders/confirm-order.examples/s-005-cannot-confirm-a-non-existent-order.sdp.md b/specs/behavior/order-management/orders/confirm-order.examples/s-005-cannot-confirm-a-non-existent-order.sdp.md index 4e71e200..626846f3 100644 --- a/specs/behavior/order-management/orders/confirm-order.examples/s-005-cannot-confirm-a-non-existent-order.sdp.md +++ b/specs/behavior/order-management/orders/confirm-order.examples/s-005-cannot-confirm-a-non-existent-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cannot confirm a non-existent order" from examples/order-management/tests/features/behavior/orders/confirm-order.feature +- outcome: Executable scenario: Cannot confirm a non-existent order + +```gwt +Given the system is ready +And no order exists with ID "ord_nonexistent_001" +When I send a ConfirmOrder command for "ord_nonexistent_001" +Then the command should be rejected with code "ORDER_NOT_FOUND" +``` diff --git a/specs/behavior/order-management/orders/confirm-order.examples/s-006-confirm-order-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/orders/confirm-order.examples/s-006-confirm-order-is-idempotent-with-same-command-id.sdp.md index 64d136b6..e32a7630 100644 --- a/specs/behavior/order-management/orders/confirm-order.examples/s-006-confirm-order-is-idempotent-with-same-command-id.sdp.md +++ b/specs/behavior/order-management/orders/confirm-order.examples/s-006-confirm-order-is-idempotent-with-same-command-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "ConfirmOrder is idempotent with same commandId" from examples/order-management/tests/features/behavior/orders/confirm-order.feature +- outcome: Executable scenario: ConfirmOrder is idempotent with same commandId + +```gwt +Given the system is ready +And an order "ord_confirm_005" exists with status "submitted" +When I send a ConfirmOrder command twice with the same commandId for "ord_confirm_005" +Then the order should only be confirmed once +``` diff --git a/specs/behavior/order-management/orders/confirm-order.sdp.md b/specs/behavior/order-management/orders/confirm-order.sdp.md index 3a9eba4e..b8431ad8 100644 --- a/specs/behavior/order-management/orders/confirm-order.sdp.md +++ b/specs/behavior/order-management/orders/confirm-order.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: to confirm submitted orders so that they can be marked as confirmed (test carrier: examples/order-management/tests/features/behavior/orders/confirm-order.feature) +- actor: a system administrator +- outcome: to confirm submitted orders so that they can be marked as confirmed diff --git a/specs/behavior/order-management/orders/create-order.examples/s-001-successfully-create-a-new-order.sdp.md b/specs/behavior/order-management/orders/create-order.examples/s-001-successfully-create-a-new-order.sdp.md index e0c190e3..6d71c78d 100644 --- a/specs/behavior/order-management/orders/create-order.examples/s-001-successfully-create-a-new-order.sdp.md +++ b/specs/behavior/order-management/orders/create-order.examples/s-001-successfully-create-a-new-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Successfully create a new order" from examples/order-management/tests/features/behavior/orders/create-order.feature +- outcome: Executable scenario: Successfully create a new order + +```gwt +Given the system is ready +And no order exists with ID "ord_test_001" +When I send a CreateOrder command with: +Then the command should succeed +``` diff --git a/specs/behavior/order-management/orders/create-order.examples/s-002-cannot-create-order-with-existing-id.sdp.md b/specs/behavior/order-management/orders/create-order.examples/s-002-cannot-create-order-with-existing-id.sdp.md index 90b0f38c..d8dc08e2 100644 --- a/specs/behavior/order-management/orders/create-order.examples/s-002-cannot-create-order-with-existing-id.sdp.md +++ b/specs/behavior/order-management/orders/create-order.examples/s-002-cannot-create-order-with-existing-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cannot create order with existing ID" from examples/order-management/tests/features/behavior/orders/create-order.feature +- outcome: Executable scenario: Cannot create order with existing ID + +```gwt +Given the system is ready +And an order "ord_test_002" already exists +When I send a CreateOrder command with: +Then the command should be rejected with code "ORDER_ALREADY_EXISTS" +``` diff --git a/specs/behavior/order-management/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md index 1fc4b104..689701e1 100644 --- a/specs/behavior/order-management/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md +++ b/specs/behavior/order-management/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "CreateOrder is idempotent with same commandId" from examples/order-management/tests/features/behavior/orders/create-order.feature +- outcome: Executable scenario: CreateOrder is idempotent with same commandId + +```gwt +Given the backend is running and clean +When I create an order with commandId "cmd-idem-01": and I repeat creating an order with commandId "cmd-idem-01": +Then the second command should return duplicate status +``` diff --git a/specs/behavior/order-management/orders/create-order.sdp.md b/specs/behavior/order-management/orders/create-order.sdp.md index 587b71f0..6413594a 100644 --- a/specs/behavior/order-management/orders/create-order.sdp.md +++ b/specs/behavior/order-management/orders/create-order.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: to create a new order so that I can add items and submit it later (test carrier: examples/order-management/tests/features/behavior/orders/create-order.feature) +- actor: a customer +- outcome: to create a new order so that I can add items and submit it later diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-001-empty-items-array-returns-zero.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-001-empty-items-array-returns-zero.sdp.md index 9cb83f0d..8198abef 100644 --- a/specs/behavior/order-management/orders/order-domain.examples/s-001-empty-items-array-returns-zero.sdp.md +++ b/specs/behavior/order-management/orders/order-domain.examples/s-001-empty-items-array-returns-zero.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Empty items array returns zero" from examples/order-management/tests/features/behavior/orders/order-domain.feature +- outcome: Executable scenario: Empty items array returns zero + +```gwt +Given an empty items array +When I calculate the total amount +Then the total amount is 0 +``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-002-single-item-total.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-002-single-item-total.sdp.md index 1f09e44b..1f1d7120 100644 --- a/specs/behavior/order-management/orders/order-domain.examples/s-002-single-item-total.sdp.md +++ b/specs/behavior/order-management/orders/order-domain.examples/s-002-single-item-total.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Single item total" from examples/order-management/tests/features/behavior/orders/order-domain.feature +- outcome: Executable scenario: Single item total + +```gwt +Given an items array with: +When I calculate the total amount +Then the total amount is 21 +``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-003-multiple-items-total.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-003-multiple-items-total.sdp.md index bc21284c..4b105f07 100644 --- a/specs/behavior/order-management/orders/order-domain.examples/s-003-multiple-items-total.sdp.md +++ b/specs/behavior/order-management/orders/order-domain.examples/s-003-multiple-items-total.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Multiple items total" from examples/order-management/tests/features/behavior/orders/order-domain.feature +- outcome: Executable scenario: Multiple items total + +```gwt +Given an items array with: +When I calculate the total amount +Then the total amount is 70 +``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-004-zero-quantity-results-in-zero-contribution.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-004-zero-quantity-results-in-zero-contribution.sdp.md index 0181d62e..2fb59862 100644 --- a/specs/behavior/order-management/orders/order-domain.examples/s-004-zero-quantity-results-in-zero-contribution.sdp.md +++ b/specs/behavior/order-management/orders/order-domain.examples/s-004-zero-quantity-results-in-zero-contribution.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Zero quantity results in zero contribution" from examples/order-management/tests/features/behavior/orders/order-domain.feature +- outcome: Executable scenario: Zero quantity results in zero contribution + +```gwt +Given an items array with: +When I calculate the total amount +Then the total amount is 0 +``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-005-zero-price-results-in-zero-contribution.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-005-zero-price-results-in-zero-contribution.sdp.md index 027d90ae..3b5f5db8 100644 --- a/specs/behavior/order-management/orders/order-domain.examples/s-005-zero-price-results-in-zero-contribution.sdp.md +++ b/specs/behavior/order-management/orders/order-domain.examples/s-005-zero-price-results-in-zero-contribution.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Zero price results in zero contribution" from examples/order-management/tests/features/behavior/orders/order-domain.feature +- outcome: Executable scenario: Zero price results in zero contribution + +```gwt +Given an items array with: +When I calculate the total amount +Then the total amount is 0 +``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-006-decimal-prices-are-handled-correctly.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-006-decimal-prices-are-handled-correctly.sdp.md index 67052900..68c22694 100644 --- a/specs/behavior/order-management/orders/order-domain.examples/s-006-decimal-prices-are-handled-correctly.sdp.md +++ b/specs/behavior/order-management/orders/order-domain.examples/s-006-decimal-prices-are-handled-correctly.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Decimal prices are handled correctly" from examples/order-management/tests/features/behavior/orders/order-domain.feature +- outcome: Executable scenario: Decimal prices are handled correctly + +```gwt +Given an items array with: +When I calculate the total amount +Then the total amount is approximately 29.97 +``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-007-cms-is-created-with-the-provided-order-id-and-customer-id.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-007-cms-is-created-with-the-provided-order-id-and-customer-id.sdp.md index 0eccb2ce..f3351a3e 100644 --- a/specs/behavior/order-management/orders/order-domain.examples/s-007-cms-is-created-with-the-provided-order-id-and-customer-id.sdp.md +++ b/specs/behavior/order-management/orders/order-domain.examples/s-007-cms-is-created-with-the-provided-order-id-and-customer-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "CMS is created with the provided orderId and customerId" from examples/order-management/tests/features/behavior/orders/order-domain.feature +- outcome: Executable scenario: CMS is created with the provided orderId and customerId + +```gwt +Given I create an initial order CMS with orderId "ord_123" and customerId "cust_456" +When the scenario runs +Then the CMS has the following field values: +``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-008-cms-initializes-with-draft-status.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-008-cms-initializes-with-draft-status.sdp.md index e0f3348e..6762448b 100644 --- a/specs/behavior/order-management/orders/order-domain.examples/s-008-cms-initializes-with-draft-status.sdp.md +++ b/specs/behavior/order-management/orders/order-domain.examples/s-008-cms-initializes-with-draft-status.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "CMS initializes with draft status" from examples/order-management/tests/features/behavior/orders/order-domain.feature +- outcome: Executable scenario: CMS initializes with draft status + +```gwt +Given I create an initial order CMS with orderId "ord_123" and customerId "cust_456" +When the scenario runs +Then the CMS status is "draft" +``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-009-cms-initializes-with-empty-items-array.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-009-cms-initializes-with-empty-items-array.sdp.md index 00f29bf5..54d3fdc6 100644 --- a/specs/behavior/order-management/orders/order-domain.examples/s-009-cms-initializes-with-empty-items-array.sdp.md +++ b/specs/behavior/order-management/orders/order-domain.examples/s-009-cms-initializes-with-empty-items-array.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "CMS initializes with empty items array" from examples/order-management/tests/features/behavior/orders/order-domain.feature +- outcome: Executable scenario: CMS initializes with empty items array + +```gwt +Given I create an initial order CMS with orderId "ord_123" and customerId "cust_456" +When the scenario runs +Then the CMS items array is empty +``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-010-cms-initializes-with-zero-total-amount.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-010-cms-initializes-with-zero-total-amount.sdp.md index a72028eb..02bc065d 100644 --- a/specs/behavior/order-management/orders/order-domain.examples/s-010-cms-initializes-with-zero-total-amount.sdp.md +++ b/specs/behavior/order-management/orders/order-domain.examples/s-010-cms-initializes-with-zero-total-amount.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "CMS initializes with zero totalAmount" from examples/order-management/tests/features/behavior/orders/order-domain.feature +- outcome: Executable scenario: CMS initializes with zero totalAmount + +```gwt +Given I create an initial order CMS with orderId "ord_123" and customerId "cust_456" +When the scenario runs +Then the CMS totalAmount is 0 +``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-011-cms-initializes-with-version-0.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-011-cms-initializes-with-version-0.sdp.md index 182d2df0..69898011 100644 --- a/specs/behavior/order-management/orders/order-domain.examples/s-011-cms-initializes-with-version-0.sdp.md +++ b/specs/behavior/order-management/orders/order-domain.examples/s-011-cms-initializes-with-version-0.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "CMS initializes with version 0" from examples/order-management/tests/features/behavior/orders/order-domain.feature +- outcome: Executable scenario: CMS initializes with version 0 + +```gwt +Given I create an initial order CMS with orderId "ord_123" and customerId "cust_456" +When the scenario runs +Then the CMS version is 0 +``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-012-cms-initializes-with-current-state-version.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-012-cms-initializes-with-current-state-version.sdp.md index f03b2e93..3eccd5b0 100644 --- a/specs/behavior/order-management/orders/order-domain.examples/s-012-cms-initializes-with-current-state-version.sdp.md +++ b/specs/behavior/order-management/orders/order-domain.examples/s-012-cms-initializes-with-current-state-version.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "CMS initializes with current state version" from examples/order-management/tests/features/behavior/orders/order-domain.feature +- outcome: Executable scenario: CMS initializes with current state version + +```gwt +Given I create an initial order CMS with orderId "ord_123" and customerId "cust_456" +When the scenario runs +Then the CMS stateVersion equals CURRENT_ORDER_CMS_VERSION +``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-013-cms-sets-created-at-and-updated-at-to-current-timestamp.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-013-cms-sets-created-at-and-updated-at-to-current-timestamp.sdp.md index 14d24d14..9cc4e2c1 100644 --- a/specs/behavior/order-management/orders/order-domain.examples/s-013-cms-sets-created-at-and-updated-at-to-current-timestamp.sdp.md +++ b/specs/behavior/order-management/orders/order-domain.examples/s-013-cms-sets-created-at-and-updated-at-to-current-timestamp.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "CMS sets createdAt and updatedAt to current timestamp" from examples/order-management/tests/features/behavior/orders/order-domain.feature +- outcome: Executable scenario: CMS sets createdAt and updatedAt to current timestamp + +```gwt +Given a timestamp is captured before creation +And I create an initial order CMS with orderId "ord_123" and customerId "cust_456" +When the scenario runs +Then the CMS createdAt is between the before and after timestamps +And the CMS updatedAt equals createdAt +``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-014-cms-already-at-current-version-is-returned-unchanged.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-014-cms-already-at-current-version-is-returned-unchanged.sdp.md index 53af95d5..f9466fd2 100644 --- a/specs/behavior/order-management/orders/order-domain.examples/s-014-cms-already-at-current-version-is-returned-unchanged.sdp.md +++ b/specs/behavior/order-management/orders/order-domain.examples/s-014-cms-already-at-current-version-is-returned-unchanged.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "CMS already at current version is returned unchanged" from examples/order-management/tests/features/behavior/orders/order-domain.feature +- outcome: Executable scenario: CMS already at current version is returned unchanged + +```gwt +Given an OrderCMS at the current stateVersion with: +When I upcast the OrderCMS +Then the result equals the original CMS +And the result stateVersion equals CURRENT_ORDER_CMS_VERSION +``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-015-cms-with-missing-state-version-is-upgraded.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-015-cms-with-missing-state-version-is-upgraded.sdp.md index 742ff198..30cba36d 100644 --- a/specs/behavior/order-management/orders/order-domain.examples/s-015-cms-with-missing-state-version-is-upgraded.sdp.md +++ b/specs/behavior/order-management/orders/order-domain.examples/s-015-cms-with-missing-state-version-is-upgraded.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "CMS with missing stateVersion is upgraded" from examples/order-management/tests/features/behavior/orders/order-domain.feature +- outcome: Executable scenario: CMS with missing stateVersion is upgraded + +```gwt +Given an OrderCMS without stateVersion and with: +When I upcast the OrderCMS +Then the result stateVersion equals CURRENT_ORDER_CMS_VERSION +And the result preserves the original field values +``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-016-cms-with-state-version-0-is-upgraded.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-016-cms-with-state-version-0-is-upgraded.sdp.md index 1eec1ed9..4d144f7a 100644 --- a/specs/behavior/order-management/orders/order-domain.examples/s-016-cms-with-state-version-0-is-upgraded.sdp.md +++ b/specs/behavior/order-management/orders/order-domain.examples/s-016-cms-with-state-version-0-is-upgraded.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "CMS with stateVersion 0 is upgraded" from examples/order-management/tests/features/behavior/orders/order-domain.feature +- outcome: Executable scenario: CMS with stateVersion 0 is upgraded + +```gwt +Given an OrderCMS at stateVersion 0 with: +And the CMS has 1 item +When I upcast the OrderCMS +Then the result stateVersion equals CURRENT_ORDER_CMS_VERSION +And the result status is "submitted" +And the result has 1 item +And the result totalAmount is 10 +``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-017-all-fields-are-preserved-during-upcast.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-017-all-fields-are-preserved-during-upcast.sdp.md index 7f33f9ba..42d435a0 100644 --- a/specs/behavior/order-management/orders/order-domain.examples/s-017-all-fields-are-preserved-during-upcast.sdp.md +++ b/specs/behavior/order-management/orders/order-domain.examples/s-017-all-fields-are-preserved-during-upcast.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "All fields are preserved during upcast" from examples/order-management/tests/features/behavior/orders/order-domain.feature +- outcome: Executable scenario: All fields are preserved during upcast + +```gwt +Given an OrderCMS at stateVersion 0 with: +And the CMS has items: +When I upcast the OrderCMS +Then the upcast result preserves all fields: +And the result items match the original items +``` diff --git a/specs/behavior/order-management/orders/order-domain.sdp.md b/specs/behavior/order-management/orders/order-domain.sdp.md index cef3b6f2..1d80c9a2 100644 --- a/specs/behavior/order-management/orders/order-domain.sdp.md +++ b/specs/behavior/order-management/orders/order-domain.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: pure domain functions for order calculations, initialization, and upcasting so that order state is computed correctly without side effects (test carrier: examples/order-management/tests/features/behavior/orders/order-domain.feature) +- actor: a developer working with the Order aggregate +- outcome: pure domain functions for order calculations, initialization, and upcasting so that order state is computed correctly without side effects + +## Behavior + +- rule: calculateTotalAmount computes the sum of quantity * unitPrice for all items +- rule: createInitialOrderCMS produces a draft order with correct defaults +- rule: upcastOrderCMS migrates older CMS versions to current version diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-001-check-all-returns-true-for-draft-order-with-items.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-001-check-all-returns-true-for-draft-order-with-items.sdp.md index 7800209b..7dc44b09 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-001-check-all-returns-true-for-draft-order-with-items.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-001-check-all-returns-true-for-draft-order-with-items.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "checkAll returns true for draft order with items" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: checkAll returns true for draft order with items + +```gwt +Given a draft order with items +When I call orderSubmitInvariants.checkAll() +Then the checkAll result is true +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-002-check-all-returns-false-for-non-draft-order-with-items.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-002-check-all-returns-false-for-non-draft-order-with-items.sdp.md index 8a4ef968..284d9648 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-002-check-all-returns-false-for-non-draft-order-with-items.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-002-check-all-returns-false-for-non-draft-order-with-items.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "checkAll returns false for non-draft order with items" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: checkAll returns false for non-draft order with items + +```gwt +Given a submitted order with items +When I call orderSubmitInvariants.checkAll() +Then the checkAll result is false +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-003-check-all-returns-false-for-draft-order-without-items.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-003-check-all-returns-false-for-draft-order-without-items.sdp.md index 96add58b..815166e6 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-003-check-all-returns-false-for-draft-order-without-items.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-003-check-all-returns-false-for-draft-order-without-items.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "checkAll returns false for draft order without items" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: checkAll returns false for draft order without items + +```gwt +Given a draft order with no items +When I call orderSubmitInvariants.checkAll() +Then the checkAll result is false +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-004-assert-all-does-not-throw-for-valid-draft-order-with-items.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-004-assert-all-does-not-throw-for-valid-draft-order-with-items.sdp.md index 7c8696a3..ad451de9 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-004-assert-all-does-not-throw-for-valid-draft-order-with-items.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-004-assert-all-does-not-throw-for-valid-draft-order-with-items.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assertAll does not throw for valid draft order with items" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: assertAll does not throw for valid draft order with items + +```gwt +Given a draft order with items +When I call orderSubmitInvariants.assertAll() +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-005-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-005-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md index 6503e364..5d6f5cad 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-005-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-005-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assertAll throws ORDER_NOT_IN_DRAFT for submitted order (fail-fast)" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: assertAll throws ORDER_NOT_IN_DRAFT for submitted order (fail-fast) + +```gwt +Given a submitted order with items +When I call orderSubmitInvariants.assertAll() +Then an OrderInvariantError is thrown with code "ORDER_NOT_IN_DRAFT" +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-006-assert-all-throws-order-has-no-items-for-draft-order-with-no-items.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-006-assert-all-throws-order-has-no-items-for-draft-order-with-no-items.sdp.md index 24c5f9e3..0fda2223 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-006-assert-all-throws-order-has-no-items-for-draft-order-with-no-items.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-006-assert-all-throws-order-has-no-items-for-draft-order-with-no-items.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assertAll throws ORDER_HAS_NO_ITEMS for draft order with no items" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: assertAll throws ORDER_HAS_NO_ITEMS for draft order with no items + +```gwt +Given a draft order with no items +When I call orderSubmitInvariants.assertAll() +Then an OrderInvariantError is thrown with code "ORDER_HAS_NO_ITEMS" +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-007-validate-all-returns-valid-result-for-draft-order-with-items.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-007-validate-all-returns-valid-result-for-draft-order-with-items.sdp.md index 58c2a7a7..1366b48f 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-007-validate-all-returns-valid-result-for-draft-order-with-items.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-007-validate-all-returns-valid-result-for-draft-order-with-items.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "validateAll returns valid result for draft order with items" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: validateAll returns valid result for draft order with items + +```gwt +Given a draft order with items +When I call orderSubmitInvariants.validateAll() +Then the validation result is valid +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-008-validate-all-returns-both-violations-for-submitted-order-with-no-items.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-008-validate-all-returns-both-violations-for-submitted-order-with-no-items.sdp.md index ac314458..e72f2728 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-008-validate-all-returns-both-violations-for-submitted-order-with-no-items.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-008-validate-all-returns-both-violations-for-submitted-order-with-no-items.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "validateAll returns both violations for submitted order with no items" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: validateAll returns both violations for submitted order with no items + +```gwt +Given a submitted order with no items +When I call orderSubmitInvariants.validateAll() +Then the validation result is invalid with 2 violations +And the violation codes include: +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-009-check-all-returns-true-for-draft-order-under-item-limit.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-009-check-all-returns-true-for-draft-order-under-item-limit.sdp.md index be5595ec..8b73d11d 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-009-check-all-returns-true-for-draft-order-under-item-limit.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-009-check-all-returns-true-for-draft-order-under-item-limit.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "checkAll returns true for draft order under item limit" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: checkAll returns true for draft order under item limit + +```gwt +Given a draft order with items +When I call orderAddItemInvariants.checkAll() +Then the checkAll result is true +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-010-check-all-returns-false-for-non-draft-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-010-check-all-returns-false-for-non-draft-order.sdp.md index bf8023bd..8e2ae219 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-010-check-all-returns-false-for-non-draft-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-010-check-all-returns-false-for-non-draft-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "checkAll returns false for non-draft order" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: checkAll returns false for non-draft order + +```gwt +Given a confirmed order with no items +When I call orderAddItemInvariants.checkAll() +Then the checkAll result is false +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-011-check-all-returns-false-for-draft-order-at-max-capacity.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-011-check-all-returns-false-for-draft-order-at-max-capacity.sdp.md index 1e5fc2ef..349ace25 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-011-check-all-returns-false-for-draft-order-at-max-capacity.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-011-check-all-returns-false-for-draft-order-at-max-capacity.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "checkAll returns false for draft order at max capacity" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: checkAll returns false for draft order at max capacity + +```gwt +Given a draft order at max item capacity +When I call orderAddItemInvariants.checkAll() +Then the checkAll result is false +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-012-assert-all-does-not-throw-for-valid-draft-order-under-limit.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-012-assert-all-does-not-throw-for-valid-draft-order-under-limit.sdp.md index 1e69bff8..1dac8f79 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-012-assert-all-does-not-throw-for-valid-draft-order-under-limit.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-012-assert-all-does-not-throw-for-valid-draft-order-under-limit.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assertAll does not throw for valid draft order under limit" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: assertAll does not throw for valid draft order under limit + +```gwt +Given a draft order with no items +When I call orderAddItemInvariants.assertAll() +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-013-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-013-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md index 0a23c54f..dcd0dc5f 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-013-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-013-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assertAll throws ORDER_NOT_IN_DRAFT for submitted order (fail-fast)" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: assertAll throws ORDER_NOT_IN_DRAFT for submitted order (fail-fast) + +```gwt +Given a submitted order with no items +When I call orderAddItemInvariants.assertAll() +Then an OrderInvariantError is thrown with code "ORDER_NOT_IN_DRAFT" +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-014-assert-all-throws-max-items-exceeded-for-draft-order-at-capacity.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-014-assert-all-throws-max-items-exceeded-for-draft-order-at-capacity.sdp.md index 226ba0e2..1e050698 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-014-assert-all-throws-max-items-exceeded-for-draft-order-at-capacity.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-014-assert-all-throws-max-items-exceeded-for-draft-order-at-capacity.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assertAll throws MAX_ITEMS_EXCEEDED for draft order at capacity" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: assertAll throws MAX_ITEMS_EXCEEDED for draft order at capacity + +```gwt +Given a draft order at max item capacity +When I call orderAddItemInvariants.assertAll() +Then an OrderInvariantError is thrown with code "MAX_ITEMS_EXCEEDED" +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-015-validate-all-returns-valid-result-for-draft-order-under-limit.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-015-validate-all-returns-valid-result-for-draft-order-under-limit.sdp.md index c3d22a9f..216ddb77 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-015-validate-all-returns-valid-result-for-draft-order-under-limit.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-015-validate-all-returns-valid-result-for-draft-order-under-limit.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "validateAll returns valid result for draft order under limit" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: validateAll returns valid result for draft order under limit + +```gwt +Given a draft order with no items +When I call orderAddItemInvariants.validateAll() +Then the validation result is valid +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-016-validate-all-returns-both-violations-for-submitted-order-at-capacity.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-016-validate-all-returns-both-violations-for-submitted-order-at-capacity.sdp.md index 7a47e659..03ac1555 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-016-validate-all-returns-both-violations-for-submitted-order-at-capacity.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-016-validate-all-returns-both-violations-for-submitted-order-at-capacity.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "validateAll returns both violations for submitted order at capacity" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: validateAll returns both violations for submitted order at capacity + +```gwt +Given a submitted order at max item capacity +When I call orderAddItemInvariants.validateAll() +Then the validation result is invalid with 2 violations +And the violation codes include: +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-017-check-all-returns-expected-for-status-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-017-check-all-returns-expected-for-status-order.sdp.md index 75b8421c..f8ebe1c0 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-017-check-all-returns-expected-for-status-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-017-check-all-returns-expected-for-status-order.sdp.md @@ -6,8 +6,14 @@ readiness: idea relations: refines: spec:behavior.order-management.orders.order-invariant-sets --- -# checkAll returns expected for status order +# checkAll returns value for value order ## Intent -- outcome: Executable scenario "checkAll returns expected for status order" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: checkAll returns value for value order + +```gwt +Given an order in "value" status +When I call orderCancelInvariants.checkAll() +Then the checkAll result is value +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-018-assert-all-does-not-throw-for-draft-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-018-assert-all-does-not-throw-for-draft-order.sdp.md index f87060d5..2b0fcfe2 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-018-assert-all-does-not-throw-for-draft-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-018-assert-all-does-not-throw-for-draft-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assertAll does not throw for draft order" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: assertAll does not throw for draft order + +```gwt +Given an order in "draft" status +When I call orderCancelInvariants.assertAll() +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-019-assert-all-does-not-throw-for-submitted-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-019-assert-all-does-not-throw-for-submitted-order.sdp.md index 8b6fb918..43856926 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-019-assert-all-does-not-throw-for-submitted-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-019-assert-all-does-not-throw-for-submitted-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assertAll does not throw for submitted order" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: assertAll does not throw for submitted order + +```gwt +Given an order in "submitted" status +When I call orderCancelInvariants.assertAll() +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-020-assert-all-throws-order-already-confirmed-for-confirmed-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-020-assert-all-throws-order-already-confirmed-for-confirmed-order.sdp.md index 36fe925c..334d2c1c 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-020-assert-all-throws-order-already-confirmed-for-confirmed-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-020-assert-all-throws-order-already-confirmed-for-confirmed-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assertAll throws ORDER_ALREADY_CONFIRMED for confirmed order" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: assertAll throws ORDER_ALREADY_CONFIRMED for confirmed order + +```gwt +Given an order in "confirmed" status +When I call orderCancelInvariants.assertAll() +Then an OrderInvariantError is thrown with code "ORDER_ALREADY_CONFIRMED" +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-021-assert-all-throws-order-already-cancelled-for-cancelled-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-021-assert-all-throws-order-already-cancelled-for-cancelled-order.sdp.md index efeb07d3..2ce886e0 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-021-assert-all-throws-order-already-cancelled-for-cancelled-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-021-assert-all-throws-order-already-cancelled-for-cancelled-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assertAll throws ORDER_ALREADY_CANCELLED for cancelled order" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: assertAll throws ORDER_ALREADY_CANCELLED for cancelled order + +```gwt +Given an order in "cancelled" status +When I call orderCancelInvariants.assertAll() +Then an OrderInvariantError is thrown with code "ORDER_ALREADY_CANCELLED" +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-022-validate-all-returns-valid-result-for-draft-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-022-validate-all-returns-valid-result-for-draft-order.sdp.md index b196f82f..b968b1c7 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-022-validate-all-returns-valid-result-for-draft-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-022-validate-all-returns-valid-result-for-draft-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "validateAll returns valid result for draft order" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: validateAll returns valid result for draft order + +```gwt +Given an order in "draft" status +When I call orderCancelInvariants.validateAll() +Then the validation result is valid +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-023-validate-all-returns-single-violation-for-confirmed-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-023-validate-all-returns-single-violation-for-confirmed-order.sdp.md index e72d03da..0f360f89 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-023-validate-all-returns-single-violation-for-confirmed-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-023-validate-all-returns-single-violation-for-confirmed-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "validateAll returns single violation for confirmed order" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: validateAll returns single violation for confirmed order + +```gwt +Given an order in "confirmed" status +When I call orderCancelInvariants.validateAll() +Then the validation result is invalid with 1 violation +And the violation codes include: +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-024-validate-all-returns-single-violation-for-cancelled-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-024-validate-all-returns-single-violation-for-cancelled-order.sdp.md index 9b736e9d..f8462583 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-024-validate-all-returns-single-violation-for-cancelled-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-024-validate-all-returns-single-violation-for-cancelled-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "validateAll returns single violation for cancelled order" from examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature +- outcome: Executable scenario: validateAll returns single violation for cancelled order + +```gwt +Given an order in "cancelled" status +When I call orderCancelInvariants.validateAll() +Then the validation result is invalid with 1 violation +And the violation codes include: +``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.sdp.md index dbf7d7be..2b7496d8 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: checkAll, assertAll, and validateAll to enforce multiple invariants together so that command handlers get comprehensive validation with fail-fast or collect-all semantics (test carrier: examples/order-management/tests/features/behavior/orders/order-invariant-sets.feature) +- actor: a developer working with composed invariant sets +- outcome: checkAll, assertAll, and validateAll to enforce multiple invariants together so that command handlers get comprehensive validation with fail-fast or collect-all semantics + +## Behavior + +- rule: orderSubmitInvariants composes orderIsDraft and orderHasItems for order submission +- rule: orderAddItemInvariants composes orderIsDraft and orderCanAddItem for adding items +- rule: orderCancelInvariants composes orderNotConfirmed and orderNotCancelled for cancellation diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-001-passes-for-a-valid-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-001-passes-for-a-valid-order.sdp.md index 1a5c5ef6..fa27908b 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-001-passes-for-a-valid-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-001-passes-for-a-valid-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "passes for a valid order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: passes for a valid order + +```gwt +Given a valid order +When I call assertOrderExists +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-002-throws-order-not-found-for-null-order-reference.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-002-throws-order-not-found-for-null-order-reference.sdp.md index ace8fe54..215d662a 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-002-throws-order-not-found-for-null-order-reference.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-002-throws-order-not-found-for-null-order-reference.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "throws ORDER_NOT_FOUND for null order reference" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: throws ORDER_NOT_FOUND for null order reference + +```gwt +Given a null order reference +When I call assertOrderExists +Then an OrderInvariantError is thrown with code "ORDER_NOT_FOUND" +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-003-throws-order-not-found-for-undefined-order-reference.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-003-throws-order-not-found-for-undefined-order-reference.sdp.md index e7f961e5..25791188 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-003-throws-order-not-found-for-undefined-order-reference.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-003-throws-order-not-found-for-undefined-order-reference.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "throws ORDER_NOT_FOUND for undefined order reference" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: throws ORDER_NOT_FOUND for undefined order reference + +```gwt +Given an undefined order reference +When I call assertOrderExists +Then an OrderInvariantError is thrown with code "ORDER_NOT_FOUND" +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-004-passes-for-null-order-reference.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-004-passes-for-null-order-reference.sdp.md index d2a76e09..d154a87b 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-004-passes-for-null-order-reference.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-004-passes-for-null-order-reference.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "passes for null order reference" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: passes for null order reference + +```gwt +Given a null order reference +When I call assertOrderDoesNotExist +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-005-passes-for-undefined-order-reference.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-005-passes-for-undefined-order-reference.sdp.md index d4bd6232..529964ad 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-005-passes-for-undefined-order-reference.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-005-passes-for-undefined-order-reference.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "passes for undefined order reference" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: passes for undefined order reference + +```gwt +Given an undefined order reference +When I call assertOrderDoesNotExist +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-006-throws-order-already-exists-for-existing-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-006-throws-order-already-exists-for-existing-order.sdp.md index 98d5c323..ca5d3227 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-006-throws-order-already-exists-for-existing-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-006-throws-order-already-exists-for-existing-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "throws ORDER_ALREADY_EXISTS for existing order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: throws ORDER_ALREADY_EXISTS for existing order + +```gwt +Given an existing order with orderId "ord_existing" +When I call assertOrderDoesNotExist +Then an OrderInvariantError is thrown with code "ORDER_ALREADY_EXISTS" +And the error context contains orderId "ord_existing" +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-007-check-returns-true-for-draft-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-007-check-returns-true-for-draft-order.sdp.md index 55113ea6..76b74084 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-007-check-returns-true-for-draft-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-007-check-returns-true-for-draft-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "check returns true for draft order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: check returns true for draft order + +```gwt +Given an order in "draft" status +When I call orderIsDraft.check() +Then the result is true +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-008-check-returns-false-for-submitted-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-008-check-returns-false-for-submitted-order.sdp.md index 49360b25..465d34d2 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-008-check-returns-false-for-submitted-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-008-check-returns-false-for-submitted-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "check returns false for submitted order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: check returns false for submitted order + +```gwt +Given an order in "submitted" status +When I call orderIsDraft.check() +Then the result is false +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-009-assert-passes-for-draft-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-009-assert-passes-for-draft-order.sdp.md index a483f559..a25ef99a 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-009-assert-passes-for-draft-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-009-assert-passes-for-draft-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assert passes for draft order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: assert passes for draft order + +```gwt +Given an order in "draft" status +When I call orderIsDraft.assert() +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-010-assert-throws-order-not-in-draft-for-non-draft-statuses.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-010-assert-throws-order-not-in-draft-for-non-draft-statuses.sdp.md index 208d2006..a1f7adb1 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-010-assert-throws-order-not-in-draft-for-non-draft-statuses.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-010-assert-throws-order-not-in-draft-for-non-draft-statuses.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "assert throws ORDER_NOT_IN_DRAFT for non-draft statuses" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: assert throws ORDER_NOT_IN_DRAFT for non-draft statuses + +```gwt +Given an order in "value" status +When I call orderIsDraft.assert() +Then an OrderInvariantError is thrown with code "ORDER_NOT_IN_DRAFT" +And the error context contains currentStatus "value" +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-011-check-returns-true-for-submitted-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-011-check-returns-true-for-submitted-order.sdp.md index 09c81111..ef2f931e 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-011-check-returns-true-for-submitted-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-011-check-returns-true-for-submitted-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "check returns true for submitted order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: check returns true for submitted order + +```gwt +Given an order in "submitted" status +When I call orderIsSubmitted.check() +Then the result is true +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-012-check-returns-false-for-draft-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-012-check-returns-false-for-draft-order.sdp.md index 0235a4a0..4486db39 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-012-check-returns-false-for-draft-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-012-check-returns-false-for-draft-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "check returns false for draft order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: check returns false for draft order + +```gwt +Given an order in "draft" status +When I call orderIsSubmitted.check() +Then the result is false +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-013-assert-passes-for-submitted-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-013-assert-passes-for-submitted-order.sdp.md index 26855a26..883e5498 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-013-assert-passes-for-submitted-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-013-assert-passes-for-submitted-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assert passes for submitted order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: assert passes for submitted order + +```gwt +Given an order in "submitted" status +When I call orderIsSubmitted.assert() +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-014-assert-throws-order-not-submitted-for-non-submitted-statuses.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-014-assert-throws-order-not-submitted-for-non-submitted-statuses.sdp.md index ce4ecf54..b49da75b 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-014-assert-throws-order-not-submitted-for-non-submitted-statuses.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-014-assert-throws-order-not-submitted-for-non-submitted-statuses.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assert throws ORDER_NOT_SUBMITTED for non-submitted statuses" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: assert throws ORDER_NOT_SUBMITTED for non-submitted statuses + +```gwt +Given an order in "value" status +When I call orderIsSubmitted.assert() +Then an OrderInvariantError is thrown with code "ORDER_NOT_SUBMITTED" +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-015-check-returns-true-for-draft-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-015-check-returns-true-for-draft-order.sdp.md index 7bb73bbd..93e22e06 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-015-check-returns-true-for-draft-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-015-check-returns-true-for-draft-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "check returns true for draft order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: check returns true for draft order + +```gwt +Given an order in "draft" status +When I call orderNotCancelled.check() +Then the result is true +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-016-check-returns-true-for-submitted-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-016-check-returns-true-for-submitted-order.sdp.md index ed0f980d..60ff5c31 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-016-check-returns-true-for-submitted-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-016-check-returns-true-for-submitted-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "check returns true for submitted order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: check returns true for submitted order + +```gwt +Given an order in "submitted" status +When I call orderNotCancelled.check() +Then the result is true +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-017-check-returns-false-for-cancelled-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-017-check-returns-false-for-cancelled-order.sdp.md index c26afaca..33386bd4 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-017-check-returns-false-for-cancelled-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-017-check-returns-false-for-cancelled-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "check returns false for cancelled order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: check returns false for cancelled order + +```gwt +Given an order in "cancelled" status +When I call orderNotCancelled.check() +Then the result is false +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-018-assert-passes-for-draft-order-not-cancelled.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-018-assert-passes-for-draft-order-not-cancelled.sdp.md index 3281d22f..dc504610 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-018-assert-passes-for-draft-order-not-cancelled.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-018-assert-passes-for-draft-order-not-cancelled.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assert passes for draft order (not cancelled)" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: assert passes for draft order (not cancelled) + +```gwt +Given an order in "draft" status +When I call orderNotCancelled.assert() +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-019-assert-passes-for-confirmed-order-not-cancelled.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-019-assert-passes-for-confirmed-order-not-cancelled.sdp.md index 546a5d02..3ec3ed97 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-019-assert-passes-for-confirmed-order-not-cancelled.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-019-assert-passes-for-confirmed-order-not-cancelled.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assert passes for confirmed order (not cancelled)" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: assert passes for confirmed order (not cancelled) + +```gwt +Given an order in "confirmed" status +When I call orderNotCancelled.assert() +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-020-assert-throws-order-already-cancelled-for-cancelled-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-020-assert-throws-order-already-cancelled-for-cancelled-order.sdp.md index 0a4331cf..a4441e04 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-020-assert-throws-order-already-cancelled-for-cancelled-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-020-assert-throws-order-already-cancelled-for-cancelled-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "assert throws ORDER_ALREADY_CANCELLED for cancelled order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: assert throws ORDER_ALREADY_CANCELLED for cancelled order + +```gwt +Given a cancelled order with orderId "ord_cancelled" +When I call orderNotCancelled.assert() +Then an OrderInvariantError is thrown with code "ORDER_ALREADY_CANCELLED" +And the error context contains orderId "ord_cancelled" +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-021-check-returns-true-for-draft-order-not-confirmed.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-021-check-returns-true-for-draft-order-not-confirmed.sdp.md index 012d7a09..0c3a6f01 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-021-check-returns-true-for-draft-order-not-confirmed.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-021-check-returns-true-for-draft-order-not-confirmed.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "check returns true for draft order (not confirmed)" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: check returns true for draft order (not confirmed) + +```gwt +Given an order in "draft" status +When I call orderNotConfirmed.check() +Then the result is true +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-022-check-returns-true-for-submitted-order-not-confirmed.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-022-check-returns-true-for-submitted-order-not-confirmed.sdp.md index bb9cfdda..aea66d25 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-022-check-returns-true-for-submitted-order-not-confirmed.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-022-check-returns-true-for-submitted-order-not-confirmed.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "check returns true for submitted order (not confirmed)" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: check returns true for submitted order (not confirmed) + +```gwt +Given an order in "submitted" status +When I call orderNotConfirmed.check() +Then the result is true +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-023-check-returns-false-for-confirmed-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-023-check-returns-false-for-confirmed-order.sdp.md index ebb47e39..68b64be5 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-023-check-returns-false-for-confirmed-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-023-check-returns-false-for-confirmed-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "check returns false for confirmed order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: check returns false for confirmed order + +```gwt +Given an order in "confirmed" status +When I call orderNotConfirmed.check() +Then the result is false +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-024-assert-passes-for-draft-order-not-confirmed.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-024-assert-passes-for-draft-order-not-confirmed.sdp.md index f49ec2e2..d2f91b08 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-024-assert-passes-for-draft-order-not-confirmed.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-024-assert-passes-for-draft-order-not-confirmed.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assert passes for draft order (not confirmed)" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: assert passes for draft order (not confirmed) + +```gwt +Given an order in "draft" status +When I call orderNotConfirmed.assert() +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-025-assert-passes-for-cancelled-order-not-confirmed.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-025-assert-passes-for-cancelled-order-not-confirmed.sdp.md index 57228321..50bfbf6e 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-025-assert-passes-for-cancelled-order-not-confirmed.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-025-assert-passes-for-cancelled-order-not-confirmed.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assert passes for cancelled order (not confirmed)" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: assert passes for cancelled order (not confirmed) + +```gwt +Given an order in "cancelled" status +When I call orderNotConfirmed.assert() +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-026-assert-throws-order-already-confirmed-for-confirmed-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-026-assert-throws-order-already-confirmed-for-confirmed-order.sdp.md index 931b7ef2..29054c2b 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-026-assert-throws-order-already-confirmed-for-confirmed-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-026-assert-throws-order-already-confirmed-for-confirmed-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "assert throws ORDER_ALREADY_CONFIRMED for confirmed order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: assert throws ORDER_ALREADY_CONFIRMED for confirmed order + +```gwt +Given a confirmed order with orderId "ord_confirmed" +When I call orderNotConfirmed.assert() +Then an OrderInvariantError is thrown with code "ORDER_ALREADY_CONFIRMED" +And the error context contains orderId "ord_confirmed" +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-027-check-returns-true-when-order-has-items.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-027-check-returns-true-when-order-has-items.sdp.md index 86eaef01..e1086dc5 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-027-check-returns-true-when-order-has-items.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-027-check-returns-true-when-order-has-items.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "check returns true when order has items" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: check returns true when order has items + +```gwt +Given an order with 1 item +When I call orderHasItems.check() +Then the result is true +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-028-check-returns-false-when-order-has-no-items.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-028-check-returns-false-when-order-has-no-items.sdp.md index 7b4f2f77..b6439ee5 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-028-check-returns-false-when-order-has-no-items.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-028-check-returns-false-when-order-has-no-items.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "check returns false when order has no items" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: check returns false when order has no items + +```gwt +Given an order with 0 items +When I call orderHasItems.check() +Then the result is false +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-029-assert-passes-when-order-has-items.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-029-assert-passes-when-order-has-items.sdp.md index 876598ab..6ef4b5fe 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-029-assert-passes-when-order-has-items.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-029-assert-passes-when-order-has-items.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assert passes when order has items" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: assert passes when order has items + +```gwt +Given an order with 1 item +When I call orderHasItems.assert() +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-030-assert-passes-when-order-has-multiple-items.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-030-assert-passes-when-order-has-multiple-items.sdp.md index 2a41d257..80f3e10c 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-030-assert-passes-when-order-has-multiple-items.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-030-assert-passes-when-order-has-multiple-items.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assert passes when order has multiple items" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: assert passes when order has multiple items + +```gwt +Given an order with 2 items +When I call orderHasItems.assert() +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-031-assert-throws-order-has-no-items-for-empty-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-031-assert-throws-order-has-no-items-for-empty-order.sdp.md index c96de24e..81db887c 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-031-assert-throws-order-has-no-items-for-empty-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-031-assert-throws-order-has-no-items-for-empty-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "assert throws ORDER_HAS_NO_ITEMS for empty order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: assert throws ORDER_HAS_NO_ITEMS for empty order + +```gwt +Given an order with 0 items and orderId "ord_empty" +When I call orderHasItems.assert() +Then an OrderInvariantError is thrown with code "ORDER_HAS_NO_ITEMS" +And the error context contains orderId "ord_empty" +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-032-check-returns-true-when-order-has-room-for-items.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-032-check-returns-true-when-order-has-room-for-items.sdp.md index f45306b0..555cef1c 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-032-check-returns-true-when-order-has-room-for-items.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-032-check-returns-true-when-order-has-room-for-items.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "check returns true when order has room for items" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: check returns true when order has room for items + +```gwt +Given an order with 0 items +When I call orderCanAddItem.check() +Then the result is true +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-033-check-returns-false-when-order-is-at-max-capacity.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-033-check-returns-false-when-order-is-at-max-capacity.sdp.md index 705766b4..67b6e9d0 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-033-check-returns-false-when-order-is-at-max-capacity.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-033-check-returns-false-when-order-is-at-max-capacity.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "check returns false when order is at max capacity" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: check returns false when order is at max capacity + +```gwt +Given an order at max item capacity +When I call orderCanAddItem.check() +Then the result is false +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-034-assert-passes-when-order-has-room-for-items.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-034-assert-passes-when-order-has-room-for-items.sdp.md index 52a77bdf..a402abaa 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-034-assert-passes-when-order-has-room-for-items.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-034-assert-passes-when-order-has-room-for-items.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assert passes when order has room for items" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: assert passes when order has room for items + +```gwt +Given an order with 0 items +When I call orderCanAddItem.assert() +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-035-assert-passes-when-order-is-one-under-max-capacity.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-035-assert-passes-when-order-is-one-under-max-capacity.sdp.md index 85f1d299..b6806e80 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-035-assert-passes-when-order-is-one-under-max-capacity.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-035-assert-passes-when-order-is-one-under-max-capacity.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assert passes when order is one under max capacity" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: assert passes when order is one under max capacity + +```gwt +Given an order one under max item capacity +When I call orderCanAddItem.assert() +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-036-assert-throws-max-items-exceeded-at-max-capacity.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-036-assert-throws-max-items-exceeded-at-max-capacity.sdp.md index 102015c4..1fb3b458 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-036-assert-throws-max-items-exceeded-at-max-capacity.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-036-assert-throws-max-items-exceeded-at-max-capacity.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "assert throws MAX_ITEMS_EXCEEDED at max capacity" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: assert throws MAX_ITEMS_EXCEEDED at max capacity + +```gwt +Given an order at max item capacity with orderId "ord_full" +When I call orderCanAddItem.assert() +Then an OrderInvariantError is thrown with code "MAX_ITEMS_EXCEEDED" +And the error context contains currentCount equal to MAX_ITEMS_PER_ORDER +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-037-passes-when-item-exists-in-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-037-passes-when-item-exists-in-order.sdp.md index 335f70ca..62d01a30 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-037-passes-when-item-exists-in-order.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-037-passes-when-item-exists-in-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "passes when item exists in order" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: passes when item exists in order + +```gwt +Given an order with item productId "prod_target" +When I call assertItemExists with productId "prod_target" +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-038-passes-when-item-is-one-of-many.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-038-passes-when-item-is-one-of-many.sdp.md index ba6a4641..3b663c2f 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-038-passes-when-item-is-one-of-many.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-038-passes-when-item-is-one-of-many.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "passes when item is one of many" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: passes when item is one of many + +```gwt +Given an order with items "prod_1", "prod_target", "prod_3" +When I call assertItemExists with productId "prod_target" +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-039-throws-item-not-found-when-item-does-not-exist.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-039-throws-item-not-found-when-item-does-not-exist.sdp.md index c3bc61c8..9a5bcf4c 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-039-throws-item-not-found-when-item-does-not-exist.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-039-throws-item-not-found-when-item-does-not-exist.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "throws ITEM_NOT_FOUND when item does not exist" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: throws ITEM_NOT_FOUND when item does not exist + +```gwt +Given an order with item productId "prod_other" and orderId "ord_test" +When I call assertItemExists with productId "prod_missing" +Then an OrderInvariantError is thrown with code "ITEM_NOT_FOUND" +And the error context contains productId "prod_missing" +And the error context contains orderId "ord_test" +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-040-throws-item-not-found-when-items-array-is-empty.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-040-throws-item-not-found-when-items-array-is-empty.sdp.md index fc229bab..15303133 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-040-throws-item-not-found-when-items-array-is-empty.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-040-throws-item-not-found-when-items-array-is-empty.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "throws ITEM_NOT_FOUND when items array is empty" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: throws ITEM_NOT_FOUND when items array is empty + +```gwt +Given an order with 0 items +When I call assertItemExists with productId "prod_any" +Then an OrderInvariantError is thrown with code "ITEM_NOT_FOUND" +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-041-passes-for-valid-item.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-041-passes-for-valid-item.sdp.md index 4ca8e076..26794a4a 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-041-passes-for-valid-item.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-041-passes-for-valid-item.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "passes for valid item" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: passes for valid item + +```gwt +Given a valid item with quantity 1 and unitPrice 10 +When I call validateItem +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-042-passes-for-item-with-decimal-price.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-042-passes-for-item-with-decimal-price.sdp.md index 499c615e..e4c2762d 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-042-passes-for-item-with-decimal-price.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-042-passes-for-item-with-decimal-price.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "passes for item with decimal price" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: passes for item with decimal price + +```gwt +Given a valid item with quantity 1 and unitPrice 9.99 +When I call validateItem +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-043-passes-for-item-with-zero-price-free-item.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-043-passes-for-item-with-zero-price-free-item.sdp.md index 6c4ed18a..8d7badea 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-043-passes-for-item-with-zero-price-free-item.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-043-passes-for-item-with-zero-price-free-item.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "passes for item with zero price (free item)" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: passes for item with zero price (free item) + +```gwt +Given a valid item with quantity 1 and unitPrice 0 +When I call validateItem +Then no error is thrown +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-044-throws-invalid-quantity-for-negative-quantity.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-044-throws-invalid-quantity-for-negative-quantity.sdp.md index e06e8078..ecadae9c 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-044-throws-invalid-quantity-for-negative-quantity.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-044-throws-invalid-quantity-for-negative-quantity.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "throws INVALID_QUANTITY for negative quantity" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: throws INVALID_QUANTITY for negative quantity + +```gwt +Given an item with quantity -1 +When I call validateItem +Then an OrderInvariantError is thrown with code "INVALID_QUANTITY" +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-045-throws-invalid-quantity-for-zero-quantity.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-045-throws-invalid-quantity-for-zero-quantity.sdp.md index 0753b7cf..cd09c891 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-045-throws-invalid-quantity-for-zero-quantity.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-045-throws-invalid-quantity-for-zero-quantity.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "throws INVALID_QUANTITY for zero quantity" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: throws INVALID_QUANTITY for zero quantity + +```gwt +Given an item with quantity 0 +When I call validateItem +Then an OrderInvariantError is thrown with code "INVALID_QUANTITY" +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-046-throws-invalid-quantity-for-non-integer-quantity.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-046-throws-invalid-quantity-for-non-integer-quantity.sdp.md index af3a904c..6509773e 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-046-throws-invalid-quantity-for-non-integer-quantity.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-046-throws-invalid-quantity-for-non-integer-quantity.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "throws INVALID_QUANTITY for non-integer quantity" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: throws INVALID_QUANTITY for non-integer quantity + +```gwt +Given an item with quantity 1.5 +When I call validateItem +Then an OrderInvariantError is thrown with code "INVALID_QUANTITY" +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-047-throws-invalid-price-for-negative-price.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-047-throws-invalid-price-for-negative-price.sdp.md index f08af2db..063e92d3 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-047-throws-invalid-price-for-negative-price.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-047-throws-invalid-price-for-negative-price.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "throws INVALID_PRICE for negative price" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: throws INVALID_PRICE for negative price + +```gwt +Given an item with unitPrice -5 +When I call validateItem +Then an OrderInvariantError is thrown with code "INVALID_PRICE" +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-048-throws-invalid-item-data-for-empty-product-id.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-048-throws-invalid-item-data-for-empty-product-id.sdp.md index 55aa9d24..c107cb62 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-048-throws-invalid-item-data-for-empty-product-id.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-048-throws-invalid-item-data-for-empty-product-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "throws INVALID_ITEM_DATA for empty productId" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: throws INVALID_ITEM_DATA for empty productId + +```gwt +Given an item with empty productId +When I call validateItem +Then an OrderInvariantError is thrown with code "INVALID_ITEM_DATA" +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-049-throws-invalid-item-data-for-empty-product-name.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-049-throws-invalid-item-data-for-empty-product-name.sdp.md index 0fdc7658..ffbf8349 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-049-throws-invalid-item-data-for-empty-product-name.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-049-throws-invalid-item-data-for-empty-product-name.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "throws INVALID_ITEM_DATA for empty productName" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: throws INVALID_ITEM_DATA for empty productName + +```gwt +Given an item with empty productName +When I call validateItem +Then an OrderInvariantError is thrown with code "INVALID_ITEM_DATA" +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-050-error-has-correct-name-property.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-050-error-has-correct-name-property.sdp.md index 519661bd..ced0ed04 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-050-error-has-correct-name-property.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-050-error-has-correct-name-property.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "error has correct name property" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: error has correct name property + +```gwt +Given the feature fixture is in place +When I create an OrderInvariantError with code "ORDER_NOT_FOUND" and message "Test message" +Then the error name is "OrderInvariantError" +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-051-error-has-correct-code-property.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-051-error-has-correct-code-property.sdp.md index c6280a7f..292b8744 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-051-error-has-correct-code-property.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-051-error-has-correct-code-property.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "error has correct code property" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: error has correct code property + +```gwt +Given the feature fixture is in place +When I create an OrderInvariantError with code "ORDER_NOT_IN_DRAFT" and message "Test message" +Then the error code is "ORDER_NOT_IN_DRAFT" +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-052-error-has-correct-message-property.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-052-error-has-correct-message-property.sdp.md index 15359cbe..5ae5071b 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-052-error-has-correct-message-property.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-052-error-has-correct-message-property.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "error has correct message property" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: error has correct message property + +```gwt +Given the feature fixture is in place +When I create an OrderInvariantError with code "ORDER_NOT_FOUND" and message "Custom message" +Then the error message is "Custom message" +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-053-error-has-correct-context-property.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-053-error-has-correct-context-property.sdp.md index 3697aefd..e7d82cd6 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-053-error-has-correct-context-property.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-053-error-has-correct-context-property.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "error has correct context property" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: error has correct context property + +```gwt +Given the feature fixture is in place +When I create an OrderInvariantError with code "ORDER_NOT_FOUND" and message "Message" and context: +Then the error context matches the provided context +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-054-error-can-have-undefined-context.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-054-error-can-have-undefined-context.sdp.md index 4c799c0d..0209faf7 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-054-error-can-have-undefined-context.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-054-error-can-have-undefined-context.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "error can have undefined context" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: error can have undefined context + +```gwt +Given the feature fixture is in place +When I create an OrderInvariantError with code "ORDER_NOT_FOUND" and message "Message" +Then the error context is undefined +``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-055-error-is-an-instance-of-error.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-055-error-is-an-instance-of-error.sdp.md index f9687979..c3cfb76a 100644 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-055-error-is-an-instance-of-error.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.examples/s-055-error-is-an-instance-of-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "error is an instance of Error" from examples/order-management/tests/features/behavior/orders/order-invariants.feature +- outcome: Executable scenario: error is an instance of Error + +```gwt +Given the feature fixture is in place +When I create an OrderInvariantError with code "ORDER_NOT_FOUND" and message "Message" +Then the error is an instance of Error +``` diff --git a/specs/behavior/order-management/orders/order-invariants.sdp.md b/specs/behavior/order-management/orders/order-invariants.sdp.md index 9a4020a1..fc072c98 100644 --- a/specs/behavior/order-management/orders/order-invariants.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.sdp.md @@ -10,4 +10,19 @@ relations: ## Intent -- outcome: pure invariant functions that validate order state so that invalid state transitions are prevented with structured error information (test carrier: examples/order-management/tests/features/behavior/orders/order-invariants.feature) +- actor: a developer working with the Order aggregate +- outcome: pure invariant functions that validate order state so that invalid state transitions are prevented with structured error information + +## Behavior + +- rule: assertOrderExists validates that an order reference is not null or undefined +- rule: assertOrderDoesNotExist validates that an order reference is null or undefined +- rule: orderIsDraft checks whether an order is in draft status +- rule: orderIsSubmitted checks whether an order is in submitted status +- rule: orderNotCancelled checks whether an order has not been cancelled +- rule: orderNotConfirmed checks whether an order has not been confirmed +- rule: orderHasItems checks whether an order contains at least one item +- rule: orderCanAddItem checks whether an order has room for more items +- rule: assertItemExists validates that a product exists in the order items +- rule: validateItem validates item data integrity +- rule: OrderInvariantError carries structured error information diff --git a/specs/behavior/order-management/orders/remove-order-item.examples/s-001-remove-item-from-draft-order-with-multiple-items.sdp.md b/specs/behavior/order-management/orders/remove-order-item.examples/s-001-remove-item-from-draft-order-with-multiple-items.sdp.md index 68b92e2f..ffad42c4 100644 --- a/specs/behavior/order-management/orders/remove-order-item.examples/s-001-remove-item-from-draft-order-with-multiple-items.sdp.md +++ b/specs/behavior/order-management/orders/remove-order-item.examples/s-001-remove-item-from-draft-order-with-multiple-items.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Remove item from draft order with multiple items" from examples/order-management/tests/features/behavior/orders/remove-order-item.feature +- outcome: Executable scenario: Remove item from draft order with multiple items + +```gwt +Given the system is ready +And an order "ord_remove_001" exists with status "draft" +And the order has the following items: +When I remove item "prod_001" from order "ord_remove_001" +Then the command should succeed +And the order should have 1 item +And the order total should be 25 +``` diff --git a/specs/behavior/order-management/orders/remove-order-item.examples/s-002-remove-last-item-from-draft-order.sdp.md b/specs/behavior/order-management/orders/remove-order-item.examples/s-002-remove-last-item-from-draft-order.sdp.md index 7ac68ed6..9777e41c 100644 --- a/specs/behavior/order-management/orders/remove-order-item.examples/s-002-remove-last-item-from-draft-order.sdp.md +++ b/specs/behavior/order-management/orders/remove-order-item.examples/s-002-remove-last-item-from-draft-order.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Remove last item from draft order" from examples/order-management/tests/features/behavior/orders/remove-order-item.feature +- outcome: Executable scenario: Remove last item from draft order + +```gwt +Given the system is ready +And an order "ord_remove_002" exists with status "draft" +And the order has the following items: +When I remove item "prod_001" from order "ord_remove_002" +Then the command should succeed +And the order should have 0 items +And the order total should be 0 +``` diff --git a/specs/behavior/order-management/orders/remove-order-item.examples/s-003-cannot-remove-item-from-submitted-order.sdp.md b/specs/behavior/order-management/orders/remove-order-item.examples/s-003-cannot-remove-item-from-submitted-order.sdp.md index 75c931cc..205fe1df 100644 --- a/specs/behavior/order-management/orders/remove-order-item.examples/s-003-cannot-remove-item-from-submitted-order.sdp.md +++ b/specs/behavior/order-management/orders/remove-order-item.examples/s-003-cannot-remove-item-from-submitted-order.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Cannot remove item from submitted order" from examples/order-management/tests/features/behavior/orders/remove-order-item.feature +- outcome: Executable scenario: Cannot remove item from submitted order + +```gwt +Given the system is ready +And an order "ord_remove_003" exists with status "submitted" +And the order has the following items: +When I remove item "prod_001" from order "ord_remove_003" +Then the command should be rejected with code "ORDER_NOT_IN_DRAFT" +``` diff --git a/specs/behavior/order-management/orders/remove-order-item.examples/s-004-cannot-remove-item-from-cancelled-order.sdp.md b/specs/behavior/order-management/orders/remove-order-item.examples/s-004-cannot-remove-item-from-cancelled-order.sdp.md index 696054d0..ff86d4f3 100644 --- a/specs/behavior/order-management/orders/remove-order-item.examples/s-004-cannot-remove-item-from-cancelled-order.sdp.md +++ b/specs/behavior/order-management/orders/remove-order-item.examples/s-004-cannot-remove-item-from-cancelled-order.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Cannot remove item from cancelled order" from examples/order-management/tests/features/behavior/orders/remove-order-item.feature +- outcome: Executable scenario: Cannot remove item from cancelled order + +```gwt +Given the system is ready +And an order "ord_remove_004" exists with status "cancelled" +And the order has the following items: +When I remove item "prod_001" from order "ord_remove_004" +Then the command should be rejected with code "ORDER_NOT_IN_DRAFT" +``` diff --git a/specs/behavior/order-management/orders/remove-order-item.examples/s-005-cannot-remove-item-from-confirmed-order.sdp.md b/specs/behavior/order-management/orders/remove-order-item.examples/s-005-cannot-remove-item-from-confirmed-order.sdp.md index 70b3f48d..7c9a1ef2 100644 --- a/specs/behavior/order-management/orders/remove-order-item.examples/s-005-cannot-remove-item-from-confirmed-order.sdp.md +++ b/specs/behavior/order-management/orders/remove-order-item.examples/s-005-cannot-remove-item-from-confirmed-order.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Cannot remove item from confirmed order" from examples/order-management/tests/features/behavior/orders/remove-order-item.feature +- outcome: Executable scenario: Cannot remove item from confirmed order + +```gwt +Given the system is ready +And an order "ord_remove_005" exists with status "confirmed" +And the order has the following items: +When I remove item "prod_001" from order "ord_remove_005" +Then the command should be rejected with code "ORDER_NOT_IN_DRAFT" +``` diff --git a/specs/behavior/order-management/orders/remove-order-item.examples/s-006-cannot-remove-non-existent-item.sdp.md b/specs/behavior/order-management/orders/remove-order-item.examples/s-006-cannot-remove-non-existent-item.sdp.md index 9542b31a..9eed4a0f 100644 --- a/specs/behavior/order-management/orders/remove-order-item.examples/s-006-cannot-remove-non-existent-item.sdp.md +++ b/specs/behavior/order-management/orders/remove-order-item.examples/s-006-cannot-remove-non-existent-item.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Cannot remove non-existent item" from examples/order-management/tests/features/behavior/orders/remove-order-item.feature +- outcome: Executable scenario: Cannot remove non-existent item + +```gwt +Given the system is ready +And an order "ord_remove_006" exists with status "draft" +And the order has the following items: +When I remove item "prod_nonexistent" from order "ord_remove_006" +Then the command should be rejected with code "ITEM_NOT_FOUND" +``` diff --git a/specs/behavior/order-management/orders/remove-order-item.examples/s-007-remove-order-item-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/orders/remove-order-item.examples/s-007-remove-order-item-is-idempotent-with-same-command-id.sdp.md index b06d4230..6a819ed9 100644 --- a/specs/behavior/order-management/orders/remove-order-item.examples/s-007-remove-order-item-is-idempotent-with-same-command-id.sdp.md +++ b/specs/behavior/order-management/orders/remove-order-item.examples/s-007-remove-order-item-is-idempotent-with-same-command-id.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "RemoveOrderItem is idempotent with same commandId" from examples/order-management/tests/features/behavior/orders/remove-order-item.feature +- outcome: Executable scenario: RemoveOrderItem is idempotent with same commandId + +```gwt +Given the system is ready +And an order "ord_remove_007" exists with status "draft" +And the order has the following items: +When I remove item "prod_001" from order "ord_remove_007" with commandId "cmd_remove_007" +Then the command should succeed +And I retry removing item "prod_001" from order "ord_remove_007" with commandId "cmd_remove_007" +And the command should return duplicate result +``` diff --git a/specs/behavior/order-management/orders/remove-order-item.sdp.md b/specs/behavior/order-management/orders/remove-order-item.sdp.md index ded08f0b..15c6c37d 100644 --- a/specs/behavior/order-management/orders/remove-order-item.sdp.md +++ b/specs/behavior/order-management/orders/remove-order-item.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: to remove items from my order so that I can adjust my purchase before submitting (test carrier: examples/order-management/tests/features/behavior/orders/remove-order-item.feature) +- actor: a customer +- outcome: to remove items from my order so that I can adjust my purchase before submitting diff --git a/specs/behavior/order-management/orders/submit-order.examples/s-001-successfully-submit-order-with-items.sdp.md b/specs/behavior/order-management/orders/submit-order.examples/s-001-successfully-submit-order-with-items.sdp.md index ade6acfd..3a5471b1 100644 --- a/specs/behavior/order-management/orders/submit-order.examples/s-001-successfully-submit-order-with-items.sdp.md +++ b/specs/behavior/order-management/orders/submit-order.examples/s-001-successfully-submit-order-with-items.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Successfully submit order with items" from examples/order-management/tests/features/behavior/orders/submit-order.feature +- outcome: Executable scenario: Successfully submit order with items + +```gwt +Given the system is ready +And an order "ord_submit_001" exists with status "draft" +And the order has the following items: +When I send a SubmitOrder command for "ord_submit_001" +Then the command should succeed +And the order "ord_submit_001" status should be "submitted" +And the order total should be 45 +``` diff --git a/specs/behavior/order-management/orders/submit-order.examples/s-002-cannot-submit-empty-order.sdp.md b/specs/behavior/order-management/orders/submit-order.examples/s-002-cannot-submit-empty-order.sdp.md index 59728b4d..2687b618 100644 --- a/specs/behavior/order-management/orders/submit-order.examples/s-002-cannot-submit-empty-order.sdp.md +++ b/specs/behavior/order-management/orders/submit-order.examples/s-002-cannot-submit-empty-order.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Cannot submit empty order" from examples/order-management/tests/features/behavior/orders/submit-order.feature +- outcome: Executable scenario: Cannot submit empty order + +```gwt +Given the system is ready +And an order "ord_empty_001" exists with status "draft" +And the order has no items +When I send a SubmitOrder command for "ord_empty_001" +Then the command should be rejected with code "ORDER_HAS_NO_ITEMS" +And the order "ord_empty_001" status should remain "draft" +``` diff --git a/specs/behavior/order-management/orders/submit-order.sdp.md b/specs/behavior/order-management/orders/submit-order.sdp.md index 3086b8dc..3aa75204 100644 --- a/specs/behavior/order-management/orders/submit-order.sdp.md +++ b/specs/behavior/order-management/orders/submit-order.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: to submit my order so that it can be processed for fulfillment (test carrier: examples/order-management/tests/features/behavior/orders/submit-order.feature) +- actor: a customer +- outcome: to submit my order so that it can be processed for fulfillment diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-001-define-a-logic-projection-for-command-validation.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-001-define-a-logic-projection-for-command-validation.sdp.md index a37b78bb..10d6116b 100644 --- a/specs/behavior/order-management/roadmap/projection-categories.examples/s-001-define-a-logic-projection-for-command-validation.sdp.md +++ b/specs/behavior/order-management/roadmap/projection-categories.examples/s-001-define-a-logic-projection-for-command-validation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Define a Logic projection for command validation" from examples/order-management/tests/features/roadmap/projection-categories.feature +- outcome: Executable scenario: Define a Logic projection for command validation + +```gwt +Given the projection category system is available +When I define a projection with category "logic": +Then the projection should not be client-exposed +And the projection should not be reactive +And the projection should be minimal (validation-only fields) +``` diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-002-define-a-view-projection-for-ui-queries.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-002-define-a-view-projection-for-ui-queries.sdp.md index 256dd00d..26dc9c74 100644 --- a/specs/behavior/order-management/roadmap/projection-categories.examples/s-002-define-a-view-projection-for-ui-queries.sdp.md +++ b/specs/behavior/order-management/roadmap/projection-categories.examples/s-002-define-a-view-projection-for-ui-queries.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Define a View projection for UI queries" from examples/order-management/tests/features/roadmap/projection-categories.feature +- outcome: Executable scenario: Define a View projection for UI queries + +```gwt +Given the projection category system is available +When I define a projection with category "view": +Then the projection should be client-exposed +And the projection should be reactive +And the projection should support denormalized data +``` diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-003-define-a-reporting-projection-for-analytics.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-003-define-a-reporting-projection-for-analytics.sdp.md index 5286b123..607a0ce1 100644 --- a/specs/behavior/order-management/roadmap/projection-categories.examples/s-003-define-a-reporting-projection-for-analytics.sdp.md +++ b/specs/behavior/order-management/roadmap/projection-categories.examples/s-003-define-a-reporting-projection-for-analytics.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Define a Reporting projection for analytics" from examples/order-management/tests/features/roadmap/projection-categories.feature +- outcome: Executable scenario: Define a Reporting projection for analytics + +```gwt +Given the projection category system is available +When I define a projection with category "reporting": +Then the projection should be admin-only exposed +And the projection should not be reactive +And the projection should support aggregations +``` diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-004-define-an-integration-projection-for-cross-context-sync.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-004-define-an-integration-projection-for-cross-context-sync.sdp.md index 3ead4a73..80d4c70a 100644 --- a/specs/behavior/order-management/roadmap/projection-categories.examples/s-004-define-an-integration-projection-for-cross-context-sync.sdp.md +++ b/specs/behavior/order-management/roadmap/projection-categories.examples/s-004-define-an-integration-projection-for-cross-context-sync.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Define an Integration projection for cross-context sync" from examples/order-management/tests/features/roadmap/projection-categories.feature +- outcome: Executable scenario: Define an Integration projection for cross-context sync + +```gwt +Given the projection category system is available +When I define a projection with category "integration": +Then the projection should not be client-exposed +And the projection should publish to EventBus +And the projection should define a contract schema +``` diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-005-query-projections-by-category.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-005-query-projections-by-category.sdp.md index 64c6c5aa..c5a4e188 100644 --- a/specs/behavior/order-management/roadmap/projection-categories.examples/s-005-query-projections-by-category.sdp.md +++ b/specs/behavior/order-management/roadmap/projection-categories.examples/s-005-query-projections-by-category.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Query projections by category" from examples/order-management/tests/features/roadmap/projection-categories.feature +- outcome: Executable scenario: Query projections by category + +```gwt +Given the projection category system is available +And projections exist: +When I query projections by category "view" +Then I should get ["orderSummaries"] +``` diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-006-query-all-reactive-projections.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-006-query-all-reactive-projections.sdp.md index 47665e55..dcb78cc1 100644 --- a/specs/behavior/order-management/roadmap/projection-categories.examples/s-006-query-all-reactive-projections.sdp.md +++ b/specs/behavior/order-management/roadmap/projection-categories.examples/s-006-query-all-reactive-projections.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Query all reactive projections" from examples/order-management/tests/features/roadmap/projection-categories.feature +- outcome: Executable scenario: Query all reactive projections + +```gwt +Given the projection category system is available +And projections exist: +When I query all reactive projections +Then I should get ["orderSummaries", "productViews"] +``` diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-007-prevent-client-query-on-logic-projection.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-007-prevent-client-query-on-logic-projection.sdp.md index 8127d3b4..02a0413e 100644 --- a/specs/behavior/order-management/roadmap/projection-categories.examples/s-007-prevent-client-query-on-logic-projection.sdp.md +++ b/specs/behavior/order-management/roadmap/projection-categories.examples/s-007-prevent-client-query-on-logic-projection.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Prevent client query on Logic projection" from examples/order-management/tests/features/roadmap/projection-categories.feature +- outcome: Executable scenario: Prevent client query on Logic projection + +```gwt +Given the projection category system is available +And a projection "orderExists" with category "logic" +When a client attempts to query "orderExists" +Then the query should be rejected with "Logic projections are not client-exposed" +``` diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-008-warn-when-view-projection-is-not-optimized-for-reactivity.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-008-warn-when-view-projection-is-not-optimized-for-reactivity.sdp.md index a3d58b2e..9f8251fe 100644 --- a/specs/behavior/order-management/roadmap/projection-categories.examples/s-008-warn-when-view-projection-is-not-optimized-for-reactivity.sdp.md +++ b/specs/behavior/order-management/roadmap/projection-categories.examples/s-008-warn-when-view-projection-is-not-optimized-for-reactivity.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Warn when View projection is not optimized for reactivity" from examples/order-management/tests/features/roadmap/projection-categories.feature +- outcome: Executable scenario: Warn when View projection is not optimized for reactivity + +```gwt +Given the projection category system is available +And a projection "slowView" with category "view" +And the projection handler contains expensive computations +When the projection is validated +Then a warning should be raised about reactive performance +``` diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-009-migrate-existing-projection-to-categorized-system.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-009-migrate-existing-projection-to-categorized-system.sdp.md index 3202d298..667602be 100644 --- a/specs/behavior/order-management/roadmap/projection-categories.examples/s-009-migrate-existing-projection-to-categorized-system.sdp.md +++ b/specs/behavior/order-management/roadmap/projection-categories.examples/s-009-migrate-existing-projection-to-categorized-system.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Migrate existing projection to categorized system" from examples/order-management/tests/features/roadmap/projection-categories.feature +- outcome: Executable scenario: Migrate existing projection to categorized system + +```gwt +Given the projection category system is available +And an uncategorized projection "orderSummaries" +When I apply category migration +Then the projection should have inferred category "view" +And the migration log should record the change +``` diff --git a/specs/behavior/order-management/roadmap/projection-categories.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.sdp.md index 82963166..e1b643e8 100644 --- a/specs/behavior/order-management/roadmap/projection-categories.sdp.md +++ b/specs/behavior/order-management/roadmap/projection-categories.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: A taxonomy that categorizes projections by their purpose and query pattern. Projection categories enable: - Clear separation between internal and client-facing projections - Targeted reactivity (only View projections need reactive layer) (test carrier: examples/order-management/tests/features/roadmap/projection-categories.feature) +- outcome: Projection Categories diff --git a/specs/behavior/order-management/sagas/admin.examples/s-001-returns-zero-counts-for-empty-database.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-001-returns-zero-counts-for-empty-database.sdp.md index 7e01bf29..40902a0e 100644 --- a/specs/behavior/order-management/sagas/admin.examples/s-001-returns-zero-counts-for-empty-database.sdp.md +++ b/specs/behavior/order-management/sagas/admin.examples/s-001-returns-zero-counts-for-empty-database.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns zero counts for empty database" from examples/order-management/tests/features/behavior/sagas/admin.feature +- outcome: Executable scenario: Returns zero counts for empty database + +```gwt +Given a fresh unit test context +When I query getSagaStats for saga type "OrderFulfillment" +Then the stats should have counts: +``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-002-counts-sagas-by-status-correctly.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-002-counts-sagas-by-status-correctly.sdp.md index a54cb850..c4e8e372 100644 --- a/specs/behavior/order-management/sagas/admin.examples/s-002-counts-sagas-by-status-correctly.sdp.md +++ b/specs/behavior/order-management/sagas/admin.examples/s-002-counts-sagas-by-status-correctly.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Counts sagas by status correctly" from examples/order-management/tests/features/behavior/sagas/admin.feature +- outcome: Executable scenario: Counts sagas by status correctly + +```gwt +Given a fresh unit test context +And the following sagas exist: +When I query getSagaStats for saga type "OrderFulfillment" +Then the stats should have counts: +``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-003-filters-by-saga-type.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-003-filters-by-saga-type.sdp.md index 33453f4f..48e9d3e2 100644 --- a/specs/behavior/order-management/sagas/admin.examples/s-003-filters-by-saga-type.sdp.md +++ b/specs/behavior/order-management/sagas/admin.examples/s-003-filters-by-saga-type.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Filters by saga type" from examples/order-management/tests/features/behavior/sagas/admin.feature +- outcome: Executable scenario: Filters by saga type + +```gwt +Given a fresh unit test context +And the following sagas exist: +When I query getSagaStats for saga type "OrderFulfillment" and I query getSagaStats for saga type "PaymentProcessing" +Then the stats should show completed count of 2 +And the stats should show completed count of 1 +``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-004-returns-empty-array-when-no-sagas-exist.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-004-returns-empty-array-when-no-sagas-exist.sdp.md index d1265700..10cf3ba7 100644 --- a/specs/behavior/order-management/sagas/admin.examples/s-004-returns-empty-array-when-no-sagas-exist.sdp.md +++ b/specs/behavior/order-management/sagas/admin.examples/s-004-returns-empty-array-when-no-sagas-exist.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns empty array when no sagas exist" from examples/order-management/tests/features/behavior/sagas/admin.feature +- outcome: Executable scenario: Returns empty array when no sagas exist + +```gwt +Given a fresh unit test context +When I query getStuckSagas for saga type "OrderFulfillment" +Then the stuck sagas result is empty +``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-005-returns-running-sagas-older-than-threshold.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-005-returns-running-sagas-older-than-threshold.sdp.md index 00425bb2..2b3084a1 100644 --- a/specs/behavior/order-management/sagas/admin.examples/s-005-returns-running-sagas-older-than-threshold.sdp.md +++ b/specs/behavior/order-management/sagas/admin.examples/s-005-returns-running-sagas-older-than-threshold.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Returns running sagas older than threshold" from examples/order-management/tests/features/behavior/sagas/admin.feature +- outcome: Executable scenario: Returns running sagas older than threshold + +```gwt +Given a fresh unit test context +And a saga "old-running" of type "OrderFulfillment" with status "running" updated 2 hours ago +And a saga "recent-running" of type "OrderFulfillment" with status "running" updated 30 minutes ago +And a saga "completed" of type "OrderFulfillment" with status "completed" updated 2 hours ago +When I query getStuckSagas for saga type "OrderFulfillment" +Then the stuck sagas result has 1 entry +And the stuck saga has sagaId "old-running" +``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-006-respects-custom-threshold.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-006-respects-custom-threshold.sdp.md index 7d0ce1c0..eeb691e4 100644 --- a/specs/behavior/order-management/sagas/admin.examples/s-006-respects-custom-threshold.sdp.md +++ b/specs/behavior/order-management/sagas/admin.examples/s-006-respects-custom-threshold.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Respects custom threshold" from examples/order-management/tests/features/behavior/sagas/admin.feature +- outcome: Executable scenario: Respects custom threshold + +```gwt +Given a fresh unit test context +And a saga "ten-min-old" of type "OrderFulfillment" with status "running" updated 10 minutes ago +When I query getStuckSagas for saga type "OrderFulfillment" with threshold 5 minutes +Then the stuck sagas result has 1 entry +And the stuck saga has sagaId "ten-min-old" +``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-007-returns-empty-array-when-no-failed-sagas.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-007-returns-empty-array-when-no-failed-sagas.sdp.md index bda46d2a..31c3f28c 100644 --- a/specs/behavior/order-management/sagas/admin.examples/s-007-returns-empty-array-when-no-failed-sagas.sdp.md +++ b/specs/behavior/order-management/sagas/admin.examples/s-007-returns-empty-array-when-no-failed-sagas.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns empty array when no failed sagas" from examples/order-management/tests/features/behavior/sagas/admin.feature +- outcome: Executable scenario: Returns empty array when no failed sagas + +```gwt +Given a fresh unit test context +And a saga "1" of type "OrderFulfillment" with status "completed" +When I query getFailedSagas for saga type "OrderFulfillment" +Then the failed sagas result is empty +``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-008-returns-only-failed-sagas.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-008-returns-only-failed-sagas.sdp.md index e3d06d0a..b924e0bf 100644 --- a/specs/behavior/order-management/sagas/admin.examples/s-008-returns-only-failed-sagas.sdp.md +++ b/specs/behavior/order-management/sagas/admin.examples/s-008-returns-only-failed-sagas.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns only failed sagas" from examples/order-management/tests/features/behavior/sagas/admin.feature +- outcome: Executable scenario: Returns only failed sagas + +```gwt +Given a fresh unit test context +And the following sagas exist: +When I query getFailedSagas for saga type "OrderFulfillment" +Then the failed sagas result has 2 entries +And the failed saga IDs include: +``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-009-respects-limit-parameter.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-009-respects-limit-parameter.sdp.md index 170b6d63..7a5de4e9 100644 --- a/specs/behavior/order-management/sagas/admin.examples/s-009-respects-limit-parameter.sdp.md +++ b/specs/behavior/order-management/sagas/admin.examples/s-009-respects-limit-parameter.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Respects limit parameter" from examples/order-management/tests/features/behavior/sagas/admin.feature +- outcome: Executable scenario: Respects limit parameter + +```gwt +Given a fresh unit test context +And 5 failed sagas of type "OrderFulfillment" +When I query getFailedSagas for saga type "OrderFulfillment" with limit 3 +Then the failed sagas result has 3 entries +``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-010-allows-marking-valid-source-status-saga-as-failed.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-010-allows-marking-valid-source-status-saga-as-failed.sdp.md index e2f492bf..10e02324 100644 --- a/specs/behavior/order-management/sagas/admin.examples/s-010-allows-marking-valid-source-status-saga-as-failed.sdp.md +++ b/specs/behavior/order-management/sagas/admin.examples/s-010-allows-marking-valid-source-status-saga-as-failed.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Allows marking valid-source-status saga as failed" from examples/order-management/tests/features/behavior/sagas/admin.feature +- outcome: Executable scenario: Allows marking valid-source-status saga as failed + +```gwt +Given a fresh unit test context +And a saga "test" of type "OrderFulfillment" with status "value" +When I call markSagaFailed for saga "test" of type "OrderFulfillment" with reason "value" +Then the mutation result status is "marked_failed" +``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-011-rejects-marking-invalid-source-status-saga-as-failed.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-011-rejects-marking-invalid-source-status-saga-as-failed.sdp.md index 75ea95e8..a041052b 100644 --- a/specs/behavior/order-management/sagas/admin.examples/s-011-rejects-marking-invalid-source-status-saga-as-failed.sdp.md +++ b/specs/behavior/order-management/sagas/admin.examples/s-011-rejects-marking-invalid-source-status-saga-as-failed.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Rejects marking invalid-source-status saga as failed" from examples/order-management/tests/features/behavior/sagas/admin.feature +- outcome: Executable scenario: Rejects marking invalid-source-status saga as failed + +```gwt +Given a fresh unit test context +And a saga "test" of type "OrderFulfillment" with status "value" +When I call markSagaFailed for saga "test" of type "OrderFulfillment" with reason "Should not work" +Then the mutation result status is "invalid_transition" +And the mutation result currentStatus is "value" +``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-012-returns-not-found-for-non-existent-saga.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-012-returns-not-found-for-non-existent-saga.sdp.md index 3bb5b25c..81cc0bca 100644 --- a/specs/behavior/order-management/sagas/admin.examples/s-012-returns-not-found-for-non-existent-saga.sdp.md +++ b/specs/behavior/order-management/sagas/admin.examples/s-012-returns-not-found-for-non-existent-saga.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns not_found for non-existent saga" from examples/order-management/tests/features/behavior/sagas/admin.feature +- outcome: Executable scenario: Returns not_found for non-existent saga + +```gwt +Given a fresh unit test context +When I call markSagaFailed for saga "nonexistent" of type "OrderFulfillment" with reason "Should not work" +Then the mutation result status is "not_found" +``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-013-allows-marking-failed-saga-as-compensated.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-013-allows-marking-failed-saga-as-compensated.sdp.md index 338e64ee..7b85d873 100644 --- a/specs/behavior/order-management/sagas/admin.examples/s-013-allows-marking-failed-saga-as-compensated.sdp.md +++ b/specs/behavior/order-management/sagas/admin.examples/s-013-allows-marking-failed-saga-as-compensated.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Allows marking failed saga as compensated" from examples/order-management/tests/features/behavior/sagas/admin.feature +- outcome: Executable scenario: Allows marking failed saga as compensated + +```gwt +Given a fresh unit test context +And a saga "test" of type "OrderFulfillment" with status "failed" +When I call markSagaCompensated for saga "test" of type "OrderFulfillment" +Then the mutation result status is "marked_compensated" +``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-014-rejects-marking-non-failed-saga-as-compensated.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-014-rejects-marking-non-failed-saga-as-compensated.sdp.md index 7165453b..5cb3d942 100644 --- a/specs/behavior/order-management/sagas/admin.examples/s-014-rejects-marking-non-failed-saga-as-compensated.sdp.md +++ b/specs/behavior/order-management/sagas/admin.examples/s-014-rejects-marking-non-failed-saga-as-compensated.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Rejects marking non-failed saga as compensated" from examples/order-management/tests/features/behavior/sagas/admin.feature +- outcome: Executable scenario: Rejects marking non-failed saga as compensated + +```gwt +Given a fresh unit test context +And a saga "test" of type "OrderFulfillment" with status "running" +When I call markSagaCompensated for saga "test" of type "OrderFulfillment" +Then the mutation result status is "invalid_transition" +And the mutation result currentStatus is "running" +``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-015-allows-retrying-failed-saga.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-015-allows-retrying-failed-saga.sdp.md index e74c78b7..5d5b419c 100644 --- a/specs/behavior/order-management/sagas/admin.examples/s-015-allows-retrying-failed-saga.sdp.md +++ b/specs/behavior/order-management/sagas/admin.examples/s-015-allows-retrying-failed-saga.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Allows retrying failed saga" from examples/order-management/tests/features/behavior/sagas/admin.feature +- outcome: Executable scenario: Allows retrying failed saga + +```gwt +Given a fresh unit test context +And a saga "test" of type "OrderFulfillment" with status "failed" and error "Previous error" +When I call retrySaga for saga "test" of type "OrderFulfillment" +Then the mutation result status is "reset_to_pending" +``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-016-rejects-retrying-non-failed-saga.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-016-rejects-retrying-non-failed-saga.sdp.md index 62e8d08a..21305684 100644 --- a/specs/behavior/order-management/sagas/admin.examples/s-016-rejects-retrying-non-failed-saga.sdp.md +++ b/specs/behavior/order-management/sagas/admin.examples/s-016-rejects-retrying-non-failed-saga.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Rejects retrying non-failed saga" from examples/order-management/tests/features/behavior/sagas/admin.feature +- outcome: Executable scenario: Rejects retrying non-failed saga + +```gwt +Given a fresh unit test context +And a saga "test" of type "OrderFulfillment" with status "value" +When I call retrySaga for saga "test" of type "OrderFulfillment" +Then the mutation result status is "invalid_state" +And the mutation result currentStatus is "value" +``` diff --git a/specs/behavior/order-management/sagas/admin.sdp.md b/specs/behavior/order-management/sagas/admin.sdp.md index 3735f7ed..b52b38c5 100644 --- a/specs/behavior/order-management/sagas/admin.sdp.md +++ b/specs/behavior/order-management/sagas/admin.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: to query and manage saga instances so that I can monitor and recover from saga failures (test carrier: examples/order-management/tests/features/behavior/sagas/admin.feature) +- actor: a system administrator +- outcome: to query and manage saga instances so that I can monitor and recover from saga failures + +## Behavior + +- rule: getSagaStats returns status counts for a saga type +- rule: getStuckSagas returns running sagas older than a threshold +- rule: getFailedSagas returns only failed sagas of a given type +- rule: markSagaFailed validates state transitions before marking a saga as failed +- rule: markSagaCompensated validates state transitions before marking a saga as compensated +- rule: retrySaga validates state transitions before retrying a saga diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-001-parse-vertical-data-table-to-object.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-001-parse-vertical-data-table-to-object.sdp.md index 1371ab8a..f62093d5 100644 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-001-parse-vertical-data-table-to-object.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-001-parse-vertical-data-table-to-object.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Parse vertical DataTable to object" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature +- outcome: Executable scenario: Parse vertical DataTable to object + +```gwt +Given the platform-core testing module is imported +And a DataTable with field-value rows +When I call tableRowsToObject(rows) +Then I receive an object with keys from field column and values from value column +``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-002-parse-data-table-preserves-all-string-values.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-002-parse-data-table-preserves-all-string-values.sdp.md index 00887738..c717b360 100644 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-002-parse-data-table-preserves-all-string-values.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-002-parse-data-table-preserves-all-string-values.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Parse DataTable preserves all string values" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature +- outcome: Executable scenario: Parse DataTable preserves all string values + +```gwt +Given the platform-core testing module is imported +And a DataTable with field-value rows including "isActive" as "true" +When I call tableRowsToObject(rows) +Then all values are strings +And isActive is the string "true" not boolean true +``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-003-parse-integer-value-from-string.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-003-parse-integer-value-from-string.sdp.md index 15c38038..dfe1954e 100644 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-003-parse-integer-value-from-string.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-003-parse-integer-value-from-string.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Parse integer value from string" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature +- outcome: Executable scenario: Parse integer value from string + +```gwt +Given the platform-core testing module is imported +When I call parseTableValue("42", "int") +Then I receive the number 42 +``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-004-parse-float-value-from-string.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-004-parse-float-value-from-string.sdp.md index 6cda5311..a3324c11 100644 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-004-parse-float-value-from-string.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-004-parse-float-value-from-string.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Parse float value from string" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature +- outcome: Executable scenario: Parse float value from string + +```gwt +Given the platform-core testing module is imported +When I call parseTableValue("3.14", "float") +Then I receive the number 3.14 +``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-005-parse-boolean-true-from-string.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-005-parse-boolean-true-from-string.sdp.md index fc7f5c6b..856d8ecb 100644 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-005-parse-boolean-true-from-string.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-005-parse-boolean-true-from-string.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Parse boolean true from string" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature +- outcome: Executable scenario: Parse boolean true from string + +```gwt +Given the platform-core testing module is imported +When I call parseTableValue("true", "boolean") +Then I receive the boolean true +``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-006-parse-boolean-false-from-string.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-006-parse-boolean-false-from-string.sdp.md index 57cfca2f..60d801dd 100644 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-006-parse-boolean-false-from-string.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-006-parse-boolean-false-from-string.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Parse boolean false from string" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature +- outcome: Executable scenario: Parse boolean false from string + +```gwt +Given the platform-core testing module is imported +When I call parseTableValue("false", "boolean") +Then I receive the boolean false +``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-007-parse-invalid-integer-throws-error.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-007-parse-invalid-integer-throws-error.sdp.md index da24cbe0..4270765a 100644 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-007-parse-invalid-integer-throws-error.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-007-parse-invalid-integer-throws-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Parse invalid integer throws error" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature +- outcome: Executable scenario: Parse invalid integer throws error + +```gwt +Given the platform-core testing module is imported +When I call parseTableValue("not-a-number", "int") +Then an error is thrown with message containing "Invalid integer" +``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-008-get-required-field-succeeds-when-present.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-008-get-required-field-succeeds-when-present.sdp.md index b1f2dfef..4ba526c4 100644 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-008-get-required-field-succeeds-when-present.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-008-get-required-field-succeeds-when-present.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Get required field succeeds when present" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature +- outcome: Executable scenario: Get required field succeeds when present + +```gwt +Given the platform-core testing module is imported +And a parsed object with orderId "order-123" and status "draft" +When I call getRequiredField(obj, "orderId") +Then I receive "order-123" +``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-009-get-required-field-throws-for-missing-field.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-009-get-required-field-throws-for-missing-field.sdp.md index 25863da2..3f6b76a9 100644 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-009-get-required-field-throws-for-missing-field.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-009-get-required-field-throws-for-missing-field.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Get required field throws for missing field" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature +- outcome: Executable scenario: Get required field throws for missing field + +```gwt +Given the platform-core testing module is imported +And a parsed object with only status "draft" +When I call getRequiredField(obj, "orderId") +Then an error is thrown with message containing "orderId" +And the error message indicates the field is required +``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-010-get-optional-field-returns-value-when-present.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-010-get-optional-field-returns-value-when-present.sdp.md index d31c38da..bc860e64 100644 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-010-get-optional-field-returns-value-when-present.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-010-get-optional-field-returns-value-when-present.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Get optional field returns value when present" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature +- outcome: Executable scenario: Get optional field returns value when present + +```gwt +Given the platform-core testing module is imported +And a parsed object with notes "Some notes" +When I call getOptionalField(obj, "notes") +Then I receive "Some notes" +``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-011-get-optional-field-returns-undefined-for-missing.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-011-get-optional-field-returns-undefined-for-missing.sdp.md index 537c01d7..b8db70ef 100644 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-011-get-optional-field-returns-undefined-for-missing.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-011-get-optional-field-returns-undefined-for-missing.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Get optional field returns undefined for missing" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature +- outcome: Executable scenario: Get optional field returns undefined for missing + +```gwt +Given the platform-core testing module is imported +And a parsed object with only status "draft" +When I call getOptionalField(obj, "notes") +Then I receive undefined +``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-012-get-optional-field-with-default-value.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-012-get-optional-field-with-default-value.sdp.md index 6d578f4e..bace6578 100644 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-012-get-optional-field-with-default-value.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-012-get-optional-field-with-default-value.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Get optional field with default value" from examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature +- outcome: Executable scenario: Get optional field with default value + +```gwt +Given the platform-core testing module is imported +And a parsed object with only status "draft" +When I call getOptionalField(obj, "priority", "normal") +Then I receive "normal" +``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.sdp.md index c8db6299..b246a167 100644 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: DataTable parsing helpers so that I can easily extract structured data from Gherkin tables (test carrier: examples/order-management/tests/features/behavior/testing-infrastructure/data-table-parsing.feature) +- actor: a BDD test author +- outcome: DataTable parsing helpers so that I can easily extract structured data from Gherkin tables diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-001-assert-decision-success.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-001-assert-decision-success.sdp.md index 61d1b06d..c2e28333 100644 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-001-assert-decision-success.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-001-assert-decision-success.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Assert decision success" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature +- outcome: Executable scenario: Assert decision success + +```gwt +Given the platform-decider testing module is imported +And a DeciderOutput with status "success" +When I call assertDecisionSuccess(result) +Then the assertion passes +``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-002-assert-decision-success-fails-for-rejected-result.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-002-assert-decision-success-fails-for-rejected-result.sdp.md index b0b5d3eb..653a1890 100644 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-002-assert-decision-success-fails-for-rejected-result.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-002-assert-decision-success-fails-for-rejected-result.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Assert decision success fails for rejected result" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature +- outcome: Executable scenario: Assert decision success fails for rejected result + +```gwt +Given the platform-decider testing module is imported +And a DeciderOutput with status "rejected" and code "INVALID_STATE" +When I call assertDecisionSuccess(result) +Then the assertion fails +And the error message contains "success" +And the error message indicates the actual status was "rejected" +``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-003-extract-success-event-from-result.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-003-extract-success-event-from-result.sdp.md index beee9744..99b0533e 100644 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-003-extract-success-event-from-result.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-003-extract-success-event-from-result.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Extract success event from result" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature +- outcome: Executable scenario: Extract success event from result + +```gwt +Given the platform-decider testing module is imported +And a DeciderOutput with status "success" and event type "OrderCreated" +When I call getSuccessEvent(result) +Then I receive the event object +And the event type is "OrderCreated" +``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-004-extract-success-data-from-result.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-004-extract-success-data-from-result.sdp.md index 6d496adc..6a6dba96 100644 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-004-extract-success-data-from-result.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-004-extract-success-data-from-result.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Extract success data from result" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature +- outcome: Executable scenario: Extract success data from result + +```gwt +Given the platform-decider testing module is imported +And a DeciderOutput with status "success" and data containing orderId "ord-123" +When I call getSuccessData(result) +Then I receive an object with orderId "ord-123" +``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-005-extract-state-update-from-result.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-005-extract-state-update-from-result.sdp.md index 347811a8..8a053b46 100644 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-005-extract-state-update-from-result.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-005-extract-state-update-from-result.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Extract state update from result" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature +- outcome: Executable scenario: Extract state update from result + +```gwt +Given the platform-decider testing module is imported +And a DeciderOutput with status "success" and state update setting status to "submitted" +When I call getSuccessStateUpdate(result) +Then I receive the state update object +And the status field is "submitted" +``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-006-assert-event-type-matches.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-006-assert-event-type-matches.sdp.md index 70554b13..66e8e711 100644 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-006-assert-event-type-matches.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-006-assert-event-type-matches.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Assert event type matches" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature +- outcome: Executable scenario: Assert event type matches + +```gwt +Given the platform-decider testing module is imported +And a DeciderOutput with status "success" and event type "OrderCreated" +When I call assertEventType(result, "OrderCreated") +Then the assertion passes +``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-007-assert-event-type-fails-for-wrong-type.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-007-assert-event-type-fails-for-wrong-type.sdp.md index 0dabee72..e797c715 100644 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-007-assert-event-type-fails-for-wrong-type.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-007-assert-event-type-fails-for-wrong-type.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Assert event type fails for wrong type" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature +- outcome: Executable scenario: Assert event type fails for wrong type + +```gwt +Given the platform-decider testing module is imported +And a DeciderOutput with status "success" and event type "OrderCreated" +When I call assertEventType(result, "OrderSubmitted") +Then the assertion fails +And the error message contains "OrderSubmitted" +``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-008-assert-event-payload-field.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-008-assert-event-payload-field.sdp.md index 06945fe4..3613c28f 100644 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-008-assert-event-payload-field.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-008-assert-event-payload-field.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Assert event payload field" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature +- outcome: Executable scenario: Assert event payload field + +```gwt +Given the platform-decider testing module is imported +And a DeciderOutput with success event containing customerId "cust-456" +When I call assertEventPayload(result, "customerId", "cust-456") +Then the assertion passes +``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-009-assert-state-update-field.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-009-assert-state-update-field.sdp.md index 5c35381e..d16b47b7 100644 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-009-assert-state-update-field.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-009-assert-state-update-field.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Assert state update field" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature +- outcome: Executable scenario: Assert state update field + +```gwt +Given the platform-decider testing module is imported +And a DeciderOutput with status "success" and state update setting status to "confirmed" +When I call assertStateUpdate(result, "status", "confirmed") +Then the assertion passes +``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-010-assert-decision-rejected.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-010-assert-decision-rejected.sdp.md index 332d8c0c..5e236ba0 100644 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-010-assert-decision-rejected.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-010-assert-decision-rejected.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Assert decision rejected" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature +- outcome: Executable scenario: Assert decision rejected + +```gwt +Given the platform-decider testing module is imported +And a DeciderOutput with status "rejected" and code "ORDER_NOT_FOUND" +When I call assertDecisionRejected(result) +Then the assertion passes +``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-011-assert-rejection-code-matches.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-011-assert-rejection-code-matches.sdp.md index 28bc3e8d..5c3c4435 100644 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-011-assert-rejection-code-matches.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-011-assert-rejection-code-matches.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Assert rejection code matches" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature +- outcome: Executable scenario: Assert rejection code matches + +```gwt +Given the platform-decider testing module is imported +And a DeciderOutput with status "rejected" and code "INVALID_STATE" +When I call assertRejectionCode(result, "INVALID_STATE") +Then the assertion passes +``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-012-assert-rejection-code-fails-for-wrong-code.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-012-assert-rejection-code-fails-for-wrong-code.sdp.md index 7ea67958..2048dac1 100644 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-012-assert-rejection-code-fails-for-wrong-code.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-012-assert-rejection-code-fails-for-wrong-code.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Assert rejection code fails for wrong code" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature +- outcome: Executable scenario: Assert rejection code fails for wrong code + +```gwt +Given the platform-decider testing module is imported +And a DeciderOutput with status "rejected" and code "INVALID_STATE" +When I call assertRejectionCode(result, "NOT_FOUND") +Then the assertion fails +And the error message contains "INVALID_STATE" +``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-013-assert-rejection-message-contains-text.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-013-assert-rejection-message-contains-text.sdp.md index 9252153a..f4e38db9 100644 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-013-assert-rejection-message-contains-text.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-013-assert-rejection-message-contains-text.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Assert rejection message contains text" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature +- outcome: Executable scenario: Assert rejection message contains text + +```gwt +Given the platform-decider testing module is imported +And a DeciderOutput with status "rejected" and message "Order must be in draft status" +When I call assertRejectionMessage(result, "draft status") +Then the assertion passes +``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-014-assert-decision-failed.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-014-assert-decision-failed.sdp.md index 04534f0c..93a70711 100644 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-014-assert-decision-failed.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-014-assert-decision-failed.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Assert decision failed" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature +- outcome: Executable scenario: Assert decision failed + +```gwt +Given the platform-decider testing module is imported +And a DeciderOutput with status "failed" and reason "Database connection error" +When I call assertDecisionFailed(result) +Then the assertion passes +``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-015-assert-failure-reason-matches.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-015-assert-failure-reason-matches.sdp.md index e68bcec5..31c29dca 100644 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-015-assert-failure-reason-matches.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-015-assert-failure-reason-matches.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Assert failure reason matches" from examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature +- outcome: Executable scenario: Assert failure reason matches + +```gwt +Given the platform-decider testing module is imported +And a DeciderOutput with status "failed" and reason "Validation failed" +When I call assertFailureReason(result, "Validation") +Then the assertion passes +``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.sdp.md index 61dc8528..ca77e794 100644 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: assertion helpers for DeciderOutput results so that I can write clear, consistent test assertions (test carrier: examples/order-management/tests/features/behavior/testing-infrastructure/decider-assertions.feature) +- actor: a developer testing deciders +- outcome: assertion helpers for DeciderOutput results so that I can write clear, consistent test assertions diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-001-assert-valid-transition.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-001-assert-valid-transition.sdp.md index 2e42d2ef..732fb71a 100644 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-001-assert-valid-transition.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-001-assert-valid-transition.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Assert valid transition" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature +- outcome: Executable scenario: Assert valid transition + +```gwt +Given the platform-fsm testing module is imported +And an OrderStatus FSM with the following transitions: +When I call assertCanTransition(fsm, "draft", "submitted") +Then the assertion passes +``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-002-assert-invalid-transition-fails.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-002-assert-invalid-transition-fails.sdp.md index 540e79bd..1284fce0 100644 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-002-assert-invalid-transition-fails.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-002-assert-invalid-transition-fails.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Assert invalid transition fails" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature +- outcome: Executable scenario: Assert invalid transition fails + +```gwt +Given the platform-fsm testing module is imported +And an OrderStatus FSM with the following transitions: +When I call assertCanTransition(fsm, "cancelled", "confirmed") +Then the assertion fails +And the error message indicates the transition is not allowed +``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-003-assert-transition-is-not-allowed.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-003-assert-transition-is-not-allowed.sdp.md index 311f488d..8dc1ebcf 100644 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-003-assert-transition-is-not-allowed.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-003-assert-transition-is-not-allowed.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Assert transition is not allowed" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature +- outcome: Executable scenario: Assert transition is not allowed + +```gwt +Given the platform-fsm testing module is imported +And an OrderStatus FSM with the following transitions: +When I call assertCannotTransition(fsm, "draft", "confirmed") +Then the assertion passes +``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-004-assert-cannot-transition-fails-for-valid-transition.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-004-assert-cannot-transition-fails-for-valid-transition.sdp.md index d918bb89..aa47a1a3 100644 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-004-assert-cannot-transition-fails-for-valid-transition.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-004-assert-cannot-transition-fails-for-valid-transition.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Assert cannot transition fails for valid transition" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature +- outcome: Executable scenario: Assert cannot transition fails for valid transition + +```gwt +Given the platform-fsm testing module is imported +And an OrderStatus FSM with the following transitions: +When I call assertCannotTransition(fsm, "draft", "submitted") +Then the assertion fails +And the error message indicates the transition IS allowed +``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-005-assert-terminal-state.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-005-assert-terminal-state.sdp.md index 7d607105..6b27884f 100644 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-005-assert-terminal-state.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-005-assert-terminal-state.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Assert terminal state" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature +- outcome: Executable scenario: Assert terminal state + +```gwt +Given the platform-fsm testing module is imported +And an OrderStatus FSM with the following transitions: +When I call assertIsTerminalState(fsm, "cancelled") +Then the assertion passes +``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-006-assert-terminal-state-fails-for-non-terminal.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-006-assert-terminal-state-fails-for-non-terminal.sdp.md index 7dd7d565..4959a4f7 100644 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-006-assert-terminal-state-fails-for-non-terminal.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-006-assert-terminal-state-fails-for-non-terminal.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Assert terminal state fails for non-terminal" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature +- outcome: Executable scenario: Assert terminal state fails for non-terminal + +```gwt +Given the platform-fsm testing module is imported +And an OrderStatus FSM with the following transitions: +When I call assertIsTerminalState(fsm, "submitted") +Then the assertion fails +And the error message indicates "submitted" is not terminal +``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-007-assert-non-terminal-state.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-007-assert-non-terminal-state.sdp.md index 405523f5..ec1b245e 100644 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-007-assert-non-terminal-state.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-007-assert-non-terminal-state.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Assert non-terminal state" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature +- outcome: Executable scenario: Assert non-terminal state + +```gwt +Given the platform-fsm testing module is imported +And an OrderStatus FSM with the following transitions: +When I call assertIsNotTerminalState(fsm, "draft") +Then the assertion passes +``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-008-assert-initial-state.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-008-assert-initial-state.sdp.md index efba5cb9..50f39c13 100644 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-008-assert-initial-state.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-008-assert-initial-state.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Assert initial state" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature +- outcome: Executable scenario: Assert initial state + +```gwt +Given the platform-fsm testing module is imported +And an OrderStatus FSM with the following transitions: +When I call assertIsInitialState(fsm, "draft") +Then the assertion passes +``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-009-assert-valid-state.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-009-assert-valid-state.sdp.md index 523956e8..6090e675 100644 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-009-assert-valid-state.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-009-assert-valid-state.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Assert valid state" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature +- outcome: Executable scenario: Assert valid state + +```gwt +Given the platform-fsm testing module is imported +And an OrderStatus FSM with the following transitions: +When I call assertIsValidState(fsm, "submitted") +Then the assertion passes +``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-010-assert-invalid-state-fails.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-010-assert-invalid-state-fails.sdp.md index bc6e6e52..ec3d8de0 100644 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-010-assert-invalid-state-fails.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-010-assert-invalid-state-fails.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Assert invalid state fails" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature +- outcome: Executable scenario: Assert invalid state fails + +```gwt +Given the platform-fsm testing module is imported +And an OrderStatus FSM with the following transitions: +When I call assertIsValidState(fsm, "nonexistent") +Then the assertion fails +``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-011-get-all-valid-transitions.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-011-get-all-valid-transitions.sdp.md index 6cf8e992..be03abe1 100644 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-011-get-all-valid-transitions.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-011-get-all-valid-transitions.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Get all valid transitions" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature +- outcome: Executable scenario: Get all valid transitions + +```gwt +Given the platform-fsm testing module is imported +And an OrderStatus FSM with the following transitions: +When I call getAllValidTransitions(fsm) +Then I receive a list of [from, to] state pairs +And the list includes ["draft", "submitted"] +And the list includes ["submitted", "confirmed"] +And the list includes ["submitted", "cancelled"] +And the list includes ["confirmed", "cancelled"] +``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-012-get-all-states.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-012-get-all-states.sdp.md index d0825444..70be6dce 100644 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-012-get-all-states.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-012-get-all-states.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Get all states" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature +- outcome: Executable scenario: Get all states + +```gwt +Given the platform-fsm testing module is imported +And an OrderStatus FSM with the following transitions: +When I call getAllStates(fsm) +Then I receive a list containing "draft", "submitted", "confirmed", "cancelled" +``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-013-get-terminal-states.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-013-get-terminal-states.sdp.md index 7cdcc7f5..3f38594c 100644 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-013-get-terminal-states.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-013-get-terminal-states.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Get terminal states" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature +- outcome: Executable scenario: Get terminal states + +```gwt +Given the platform-fsm testing module is imported +And an OrderStatus FSM with the following transitions: +When I call getTerminalStates(fsm) +Then I receive a list containing only "cancelled" +``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-014-get-non-terminal-states.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-014-get-non-terminal-states.sdp.md index 95485647..54f6673c 100644 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-014-get-non-terminal-states.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-014-get-non-terminal-states.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Get non-terminal states" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature +- outcome: Executable scenario: Get non-terminal states + +```gwt +Given the platform-fsm testing module is imported +And an OrderStatus FSM with the following transitions: +When I call getNonTerminalStates(fsm) +Then I receive a list containing "draft", "submitted", "confirmed" +And the list does not contain "cancelled" +``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-015-assert-valid-transitions-from-a-state.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-015-assert-valid-transitions-from-a-state.sdp.md index c093fe92..c7f0a649 100644 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-015-assert-valid-transitions-from-a-state.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-015-assert-valid-transitions-from-a-state.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Assert valid transitions from a state" from examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature +- outcome: Executable scenario: Assert valid transitions from a state + +```gwt +Given the platform-fsm testing module is imported +And an OrderStatus FSM with the following transitions: +When I call assertValidTransitionsFrom(fsm, "submitted", ["confirmed", "cancelled"]) +Then the assertion passes +``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.sdp.md index 36a26041..b597d2df 100644 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: FSM-specific assertion helpers so that I can verify transition validity concisely (test carrier: examples/order-management/tests/features/behavior/testing-infrastructure/fsm-assertions.feature) +- actor: a developer testing finite state machines +- outcome: FSM-specific assertion helpers so that I can verify transition validity concisely diff --git a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-001-generate-unique-test-run-id.sdp.md b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-001-generate-unique-test-run-id.sdp.md index a1fbe54d..51372f5f 100644 --- a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-001-generate-unique-test-run-id.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-001-generate-unique-test-run-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Generate unique test run ID" from examples/order-management/tests/features/behavior/testing-infrastructure/test-isolation.feature +- outcome: Executable scenario: Generate unique test run ID + +```gwt +Given the platform-core testing module is imported +When I call generateTestRunId() +Then I receive a unique string identifier +And subsequent calls return different IDs +``` diff --git a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-002-module-level-test-run-id-is-stable-within-a-test-run.sdp.md b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-002-module-level-test-run-id-is-stable-within-a-test-run.sdp.md index ed869404..1741386c 100644 --- a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-002-module-level-test-run-id-is-stable-within-a-test-run.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-002-module-level-test-run-id-is-stable-within-a-test-run.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Module-level testRunId is stable within a test run" from examples/order-management/tests/features/behavior/testing-infrastructure/test-isolation.feature +- outcome: Executable scenario: Module-level testRunId is stable within a test run + +```gwt +Given the platform-core testing module is imported +And a test run has started +When I access testRunId multiple times +Then the same value is returned each time +``` diff --git a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-003-prefix-entity-i-ds-with-test-run-namespace.sdp.md b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-003-prefix-entity-i-ds-with-test-run-namespace.sdp.md index b02073d7..23d42ab6 100644 --- a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-003-prefix-entity-i-ds-with-test-run-namespace.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-003-prefix-entity-i-ds-with-test-run-namespace.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Prefix entity IDs with test run namespace" from examples/order-management/tests/features/behavior/testing-infrastructure/test-isolation.feature +- outcome: Executable scenario: Prefix entity IDs with test run namespace + +```gwt +Given the platform-core testing module is imported +And a testRunId has been generated +When I call withPrefix("order-123") +Then the result contains the testRunId prefix +And the original ID is preserved after the prefix +And the format is "{testRunId}_order-123" +``` diff --git a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-004-custom-prefix-for-specific-isolation.sdp.md b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-004-custom-prefix-for-specific-isolation.sdp.md index 36ae96db..5298bd93 100644 --- a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-004-custom-prefix-for-specific-isolation.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-004-custom-prefix-for-specific-isolation.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Custom prefix for specific isolation" from examples/order-management/tests/features/behavior/testing-infrastructure/test-isolation.feature +- outcome: Executable scenario: Custom prefix for specific isolation + +```gwt +Given the platform-core testing module is imported +When I call withCustomPrefix("mytest", "order-123") +Then the result is "mytest_order-123" +``` diff --git a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-005-test-isolation-prevents-cross-test-pollution.sdp.md b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-005-test-isolation-prevents-cross-test-pollution.sdp.md index 183f9f40..3292bd9a 100644 --- a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-005-test-isolation-prevents-cross-test-pollution.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-005-test-isolation-prevents-cross-test-pollution.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Test isolation prevents cross-test pollution" from examples/order-management/tests/features/behavior/testing-infrastructure/test-isolation.feature +- outcome: Executable scenario: Test isolation prevents cross-test pollution + +```gwt +Given the platform-core testing module is imported +And test A creates an entity with withPrefix("entity-1") +And test B has a different testRunId +When test B queries for entities +Then test B does not see test A's entity +``` diff --git a/specs/behavior/order-management/testing-infrastructure/test-isolation.sdp.md b/specs/behavior/order-management/testing-infrastructure/test-isolation.sdp.md index e78a9b58..badf3b5f 100644 --- a/specs/behavior/order-management/testing-infrastructure/test-isolation.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/test-isolation.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: automatic namespace isolation for test data so that tests don't interfere with each other (test carrier: examples/order-management/tests/features/behavior/testing-infrastructure/test-isolation.feature) +- actor: a test author +- outcome: automatic namespace isolation for test data so that tests don't interfere with each other diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-001-successful-command-records-intent-and-completion.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-001-successful-command-records-intent-and-completion.sdp.md index a56dd42b..b8d51d1e 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-001-successful-command-records-intent-and-completion.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-001-successful-command-records-intent-and-completion.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Successful command records intent and completion" from examples/order-management/tests/integration-features/durability/durable-commands.feature +- outcome: Executable scenario: Successful command records intent and completion + +```gwt +Given the backend is running and clean +And durable command execution is configured with timeoutMs 5000 +And a draft order exists for durable command test +When I submit the order using durable execution +Then an intent record should exist for the command +And the intent status should be "completed" +And the intent should have a completionEventId +And the order status should be "submitted" +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-002-intent-record-captures-command-metadata.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-002-intent-record-captures-command-metadata.sdp.md index 7fed7761..5b6feffd 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-002-intent-record-captures-command-metadata.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-002-intent-record-captures-command-metadata.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Intent record captures command metadata" from examples/order-management/tests/integration-features/durability/durable-commands.feature +- outcome: Executable scenario: Intent record captures command metadata + +```gwt +Given the backend is running and clean +And durable command execution is configured with timeoutMs 5000 +And a draft order exists for durable command test +When I submit the order using durable execution with correlationId "corr-dur-001" +Then the intent record should have correlationId "corr-dur-001" +And the intent record should have operationType "SubmitOrder" +And the intent record should have boundedContext "orders" +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-003-business-rejection-records-failed-intent.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-003-business-rejection-records-failed-intent.sdp.md index 32a6807b..95d2a23e 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-003-business-rejection-records-failed-intent.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-003-business-rejection-records-failed-intent.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Business rejection records failed intent" from examples/order-management/tests/integration-features/durability/durable-commands.feature +- outcome: Executable scenario: Business rejection records failed intent + +```gwt +Given the backend is running and clean +And durable command execution is configured with timeoutMs 5000 +And an empty draft order exists for durable command test +When I submit the order using durable execution +Then an intent record should exist for the command +And the intent status should be "failed" +And the intent error should contain "EMPTY_ORDER" +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-004-technical-failure-records-failed-intent.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-004-technical-failure-records-failed-intent.sdp.md index d0dd4a98..a016dbe9 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-004-technical-failure-records-failed-intent.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-004-technical-failure-records-failed-intent.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Technical failure records failed intent" from examples/order-management/tests/integration-features/durability/durable-commands.feature +- outcome: Executable scenario: Technical failure records failed intent + +```gwt +Given the backend is running and clean +And durable command execution is configured with timeoutMs 5000 +And a non-existent order for durable command test +When I attempt to submit the order using durable execution +Then an intent record should exist for the command +And the intent status should be "failed" +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-005-intent-statistics-show-correct-counts.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-005-intent-statistics-show-correct-counts.sdp.md index b602efd9..f9022d1b 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-005-intent-statistics-show-correct-counts.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-005-intent-statistics-show-correct-counts.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Intent statistics show correct counts" from examples/order-management/tests/integration-features/durability/durable-commands.feature +- outcome: Executable scenario: Intent statistics show correct counts + +```gwt +Given the backend is running and clean +And durable command execution is configured with timeoutMs 5000 +And multiple durable commands have been executed +When I query intent stats +Then stats should show pending, completed, failed, and abandoned counts +And the total should match the sum of all statuses +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.sdp.md index f4fc5ad1..ed91e10e 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: commands to be tracked with intent/completion bracketing so that crashed or hung commands can be detected and recovered (test carrier: examples/order-management/tests/integration-features/durability/durable-commands.feature) +- actor: a developer using event sourcing +- outcome: commands to be tracked with intent/completion bracketing so that crashed or hung commands can be detected and recovered + +## Behavior + +- rule: Intent is recorded before command execution +- rule: Failed commands are tracked +- rule: Intent stats are queryable diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-001-publishing-creates-records-for-each-target-context.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-001-publishing-creates-records-for-each-target-context.sdp.md index 144ce704..55cf9e87 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-001-publishing-creates-records-for-each-target-context.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-001-publishing-creates-records-for-each-target-context.sdp.md @@ -6,8 +6,15 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication --- -# Publishing creates records for each target context +# Partition key format is eventId:targetContext ## Intent -- outcome: Executable scenario "Publishing creates records for each target context" from examples/order-management/tests/integration-features/durability/durable-publication.feature +- outcome: Executable scenario: Partition key format is eventId:targetContext + +```gwt +Given an eventId "evt-123" and target context "inventory" +When creating a publication partition key +Then the partition key value should be "evt-123:inventory" +And the partition key name should be "publication" +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-002-publication-records-contain-event-metadata.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-002-publication-records-contain-event-metadata.sdp.md index 245d782f..0820026e 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-002-publication-records-contain-event-metadata.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-002-publication-records-contain-event-metadata.sdp.md @@ -6,8 +6,14 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication --- -# Publication records contain event metadata +# Different events get different partition keys ## Intent -- outcome: Executable scenario "Publication records contain event metadata" from examples/order-management/tests/integration-features/durability/durable-publication.feature +- outcome: Executable scenario: Different events get different partition keys + +```gwt +Given an eventId "value" and target context "value" +When creating a publication partition key +Then the partition key value should be "value" +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-003-publish-result-contains-publication-i-ds.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-003-publish-result-contains-publication-i-ds.sdp.md index 27164d09..bb9602d6 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-003-publish-result-contains-publication-i-ds.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-003-publish-result-contains-publication-i-ds.sdp.md @@ -6,8 +6,17 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication --- -# Publish result contains publication IDs +# Publishing event creates tracking records for each target ## Intent -- outcome: Executable scenario "Publish result contains publication IDs" from examples/order-management/tests/integration-features/durability/durable-publication.feature +- outcome: Executable scenario: Publishing event creates tracking records for each target + +```gwt +Given a durable event publisher configured with maxAttempts 5 +And an event "evt-123" to publish to contexts "inventory" and "notifications" +When publishing the event +Then 2 publication tracking records should be created +And each record should have status "pending" +And each record should have attemptCount 0 +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-004-query-publications-by-event-id.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-004-query-publications-by-event-id.sdp.md index d695db1c..d22a8dba 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-004-query-publications-by-event-id.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-004-query-publications-by-event-id.sdp.md @@ -6,8 +6,17 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication --- -# Query publications by event ID +# Publishing event enqueues delivery actions via Workpool ## Intent -- outcome: Executable scenario "Query publications by event ID" from examples/order-management/tests/integration-features/durability/durable-publication.feature +- outcome: Executable scenario: Publishing event enqueues delivery actions via Workpool + +```gwt +Given a durable event publisher configured with maxAttempts 5 +And an event "evt-123" to publish to contexts "inventory" and "notifications" +When publishing the event +Then 2 delivery actions should be enqueued +And each action should have correct partition key +And each action should have onComplete handler set +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-005-query-returns-empty-for-unknown-event.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-005-query-returns-empty-for-unknown-event.sdp.md index 6d5f8aa3..cb4c1cc1 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-005-query-returns-empty-for-unknown-event.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-005-query-returns-empty-for-unknown-event.sdp.md @@ -6,8 +6,17 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication --- -# Query returns empty for unknown event +# Publish result contains publication IDs for each target ## Intent -- outcome: Executable scenario "Query returns empty for unknown event" from examples/order-management/tests/integration-features/durability/durable-publication.feature +- outcome: Executable scenario: Publish result contains publication IDs for each target + +```gwt +Given a durable event publisher +And an event "evt-123" to publish to contexts "inventory" and "notifications" +When publishing the event +Then the result should contain eventId "evt-123" +And the result should have 2 publications +And each publication should have a unique publicationId starting with "pub_" +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-006-query-publications-by-status.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-006-query-publications-by-status.sdp.md index b9fad86b..3185b7b2 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-006-query-publications-by-status.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-006-query-publications-by-status.sdp.md @@ -6,8 +6,16 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication --- -# Query publications by status +# Correlation ID is passed through to tracking records ## Intent -- outcome: Executable scenario "Query publications by status" from examples/order-management/tests/integration-features/durability/durable-publication.feature +- outcome: Executable scenario: Correlation ID is passed through to tracking records + +```gwt +Given a durable event publisher +And an event "evt-123" with correlationId "corr-456" +And target contexts "inventory" +When publishing the event +Then the tracking record should have correlationId "corr-456" +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-007-stats-show-counts-by-status.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-007-stats-show-counts-by-status.sdp.md index b5686675..d4145675 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-007-stats-show-counts-by-status.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-007-stats-show-counts-by-status.sdp.md @@ -6,8 +6,16 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication --- -# Stats show counts by status +# Get publication status returns all target contexts ## Intent -- outcome: Executable scenario "Stats show counts by status" from examples/order-management/tests/integration-features/durability/durable-publication.feature +- outcome: Executable scenario: Get publication status returns all target contexts + +```gwt +Given publications exist for event "evt-123" to 3 targets +When getting publication status for event "evt-123" +Then the result should contain 3 publications +And the result should show inventory as delivered +And the result should show analytics as dead_letter +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-008-publications-for-different-events-are-isolated.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-008-publications-for-different-events-are-isolated.sdp.md index 5c2ce919..264abd65 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-008-publications-for-different-events-are-isolated.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-008-publications-for-different-events-are-isolated.sdp.md @@ -6,8 +6,14 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication --- -# Publications for different events are isolated +# Get publication status returns empty array for unknown event ## Intent -- outcome: Executable scenario "Publications for different events are isolated" from examples/order-management/tests/integration-features/durability/durable-publication.feature +- outcome: Executable scenario: Get publication status returns empty array for unknown event + +```gwt +Given no publications exist for event "evt-unknown" +When getting publication status for event "evt-unknown" +Then the result should be an empty array +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.sdp.md index 9f1c3f31..ffaf99ce 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.sdp.md @@ -6,8 +6,8 @@ readiness: idea relations: refines: spec:behavior.order-management --- -# Durable Cross-Context Publication (App Integration) +# Durable Cross-Context Event Publication ## Intent -- outcome: cross-context event publications to be tracked and retryable so that events are reliably delivered even when target contexts fail (test carrier: examples/order-management/tests/integration-features/durability/durable-publication.feature) +- outcome: Durable Cross-Context Event Publication diff --git a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-001-create-a-running-checkpoint-for-replay.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-001-create-a-running-checkpoint-for-replay.sdp.md index f718a3dc..d067cf32 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-001-create-a-running-checkpoint-for-replay.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-001-create-a-running-checkpoint-for-replay.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Create a running checkpoint for replay" from examples/order-management/tests/integration-features/durability/event-replay.feature +- outcome: Executable scenario: Create a running checkpoint for replay + +```gwt +Given the backend is running and clean +When creating a checkpoint for projection "orderSummary" +Then a checkpoint should exist in replayCheckpoints +And the checkpoint status should be "running" +And the checkpoint eventsProcessed should be 0 +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-002-update-checkpoint-progress.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-002-update-checkpoint-progress.sdp.md index 35fdf6d2..14993cce 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-002-update-checkpoint-progress.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-002-update-checkpoint-progress.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Update checkpoint progress" from examples/order-management/tests/integration-features/durability/event-replay.feature +- outcome: Executable scenario: Update checkpoint progress + +```gwt +Given the backend is running and clean +And a running checkpoint for projection "testProjection" +When updating the checkpoint with 50 events processed +Then the checkpoint eventsProcessed should be 50 +And the updatedAt timestamp should be recent +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-003-cannot-start-replay-for-already-running-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-003-cannot-start-replay-for-already-running-projection.sdp.md index 5b7e9ee8..654a8e8e 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-003-cannot-start-replay-for-already-running-projection.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-003-cannot-start-replay-for-already-running-projection.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cannot start replay for already running projection" from examples/order-management/tests/integration-features/durability/event-replay.feature +- outcome: Executable scenario: Cannot start replay for already running projection + +```gwt +Given the backend is running and clean +And a running replay exists for projection "orderSummary" +When attempting to start another replay for "orderSummary" +Then the result should indicate REPLAY_ALREADY_ACTIVE +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-004-query-checkpoint-by-replay-id.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-004-query-checkpoint-by-replay-id.sdp.md index 395efbec..89a0e5c1 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-004-query-checkpoint-by-replay-id.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-004-query-checkpoint-by-replay-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Query checkpoint by replayId" from examples/order-management/tests/integration-features/durability/event-replay.feature +- outcome: Executable scenario: Query checkpoint by replayId + +```gwt +Given the backend is running and clean +And a checkpoint exists with replayId "replay-test-001" +When querying checkpoint by replayId +Then the checkpoint should be returned with correct details +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-005-list-checkpoints-by-status.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-005-list-checkpoints-by-status.sdp.md index d246712d..199a2c66 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-005-list-checkpoints-by-status.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-005-list-checkpoints-by-status.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "List checkpoints by status" from examples/order-management/tests/integration-features/durability/event-replay.feature +- outcome: Executable scenario: List checkpoints by status + +```gwt +Given the backend is running and clean +And multiple checkpoints with different statuses exist +When listing checkpoints with status "running" +Then only running checkpoints should be returned +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/event-replay.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/event-replay.sdp.md index 7c9c7e9a..68c240ea 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/event-replay.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/event-replay.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: to rebuild projections from event history so that I can recover from bugs or add new projections (test carrier: examples/order-management/tests/integration-features/durability/event-replay.feature) +- actor: a developer maintaining projections +- outcome: to rebuild projections from event history so that I can recover from bugs or add new projections + +## Behavior + +- rule: Checkpoints track replay progress +- rule: Concurrent replays are prevented +- rule: Replay status can be queried diff --git a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-001-append-event-with-unique-idempotency-key-succeeds.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-001-append-event-with-unique-idempotency-key-succeeds.sdp.md index f3ab2097..56682567 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-001-append-event-with-unique-idempotency-key-succeeds.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-001-append-event-with-unique-idempotency-key-succeeds.sdp.md @@ -6,8 +6,14 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durability.idempotent-append --- -# Append event with unique idempotency key succeeds +# Command idempotency key uses commandType:entityId:commandId format ## Intent -- outcome: Executable scenario "Append event with unique idempotency key succeeds" from examples/order-management/tests/integration-features/durability/idempotent-append.feature +- outcome: Executable scenario: Command idempotency key uses commandType:entityId:commandId format + +```gwt +Given the feature fixture is in place +When building command idempotency key with type "SubmitOrder", entity "ord-123", command "cmd-456" +Then the idempotency key should be "SubmitOrder:ord-123:cmd-456" +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-002-different-idempotency-keys-create-separate-events.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-002-different-idempotency-keys-create-separate-events.sdp.md index e4592fe1..1897001c 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-002-different-idempotency-keys-create-separate-events.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-002-different-idempotency-keys-create-separate-events.sdp.md @@ -6,8 +6,14 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durability.idempotent-append --- -# Different idempotency keys create separate events +# Action idempotency key uses actionType:entityId format ## Intent -- outcome: Executable scenario "Different idempotency keys create separate events" from examples/order-management/tests/integration-features/durability/idempotent-append.feature +- outcome: Executable scenario: Action idempotency key uses actionType:entityId format + +```gwt +Given the feature fixture is in place +When building action idempotency key with type "payment" and entity "ord-123" +Then the idempotency key should be "payment:ord-123" +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-003-second-append-with-same-idempotency-key-returns-duplicate.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-003-second-append-with-same-idempotency-key-returns-duplicate.sdp.md index deab74cb..f6d2ebff 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-003-second-append-with-same-idempotency-key-returns-duplicate.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-003-second-append-with-same-idempotency-key-returns-duplicate.sdp.md @@ -6,8 +6,14 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durability.idempotent-append --- -# Second append with same idempotency key returns duplicate +# Saga step idempotency key uses sagaType:sagaId:step format ## Intent -- outcome: Executable scenario "Second append with same idempotency key returns duplicate" from examples/order-management/tests/integration-features/durability/idempotent-append.feature +- outcome: Executable scenario: Saga step idempotency key uses sagaType:sagaId:step format + +```gwt +Given the feature fixture is in place +When building saga step idempotency key with type "OrderFulfillment", id "saga-789", step "reserveStock" +Then the idempotency key should be "OrderFulfillment:saga-789:reserveStock" +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-004-same-key-with-different-payload-is-rejected.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-004-same-key-with-different-payload-is-rejected.sdp.md index e0c74e86..fced5dab 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-004-same-key-with-different-payload-is-rejected.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-004-same-key-with-different-payload-is-rejected.sdp.md @@ -6,8 +6,14 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durability.idempotent-append --- -# Same key with different payload is rejected +# Scheduled job idempotency key uses jobType:scheduleId:timestamp format ## Intent -- outcome: Executable scenario "Same key with different payload is rejected" from examples/order-management/tests/integration-features/durability/idempotent-append.feature +- outcome: Executable scenario: Scheduled job idempotency key uses jobType:scheduleId:timestamp format + +```gwt +Given the feature fixture is in place +When building scheduled job idempotency key with type "expireReservations", schedule "job-001", timestamp 1704067200 +Then the idempotency key should be "expireReservations:job-001:1704067200" +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-005-same-idempotency-key-on-different-streams-creates-separate-events.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-005-same-idempotency-key-on-different-streams-creates-separate-events.sdp.md index b9099408..3d085b0e 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-005-same-idempotency-key-on-different-streams-creates-separate-events.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-005-same-idempotency-key-on-different-streams-creates-separate-events.sdp.md @@ -6,8 +6,15 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durability.idempotent-append --- -# Same idempotency key on different streams creates separate events +# First append with idempotency key succeeds ## Intent -- outcome: Executable scenario "Same idempotency key on different streams creates separate events" from examples/order-management/tests/integration-features/durability/idempotent-append.feature +- outcome: Executable scenario: First append with idempotency key succeeds + +```gwt +Given no existing event for idempotency key "payment:ord-123" +When calling idempotentAppendEvent with key "payment:ord-123" +Then the append result status should be "appended" +And a new event ID should be generated +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.sdp.md index 9444af20..b142bcd8 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.sdp.md @@ -6,8 +6,8 @@ readiness: idea relations: refines: spec:behavior.order-management --- -# Idempotent Event Append (App Integration) +# Idempotent Event Append ## Intent -- outcome: event appends with idempotency keys to be deduplicated so that retried operations don't create duplicate events (test carrier: examples/order-management/tests/integration-features/durability/idempotent-append.feature) +- outcome: Idempotent Event Append diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-001-intent-exceeding-timeout-is-flagged-as-abandoned.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-001-intent-exceeding-timeout-is-flagged-as-abandoned.sdp.md index 0c49e5a3..8f6c492b 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-001-intent-exceeding-timeout-is-flagged-as-abandoned.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-001-intent-exceeding-timeout-is-flagged-as-abandoned.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Intent exceeding timeout is flagged as abandoned" from examples/order-management/tests/integration-features/durability/orphan-detection.feature +- outcome: Executable scenario: Intent exceeding timeout is flagged as abandoned + +```gwt +Given the backend is running and clean +And orphan detection is configured +And a pending intent exists with timeout 100ms +And the intent was created more than 100ms ago +When the orphan detection runs +Then the intent should be marked as "abandoned" +And the intent should have an error message about timeout +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-002-intent-within-timeout-is-not-flagged.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-002-intent-within-timeout-is-not-flagged.sdp.md index 1bb43c55..79dfb64d 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-002-intent-within-timeout-is-not-flagged.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-002-intent-within-timeout-is-not-flagged.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Intent within timeout is not flagged" from examples/order-management/tests/integration-features/durability/orphan-detection.feature +- outcome: Executable scenario: Intent within timeout is not flagged + +```gwt +Given the backend is running and clean +And orphan detection is configured +And a pending intent exists with timeout 60000ms +And the intent was created recently +When the orphan detection runs +Then the intent should still be "pending" +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-003-completed-intent-is-not-flagged-even-if-old.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-003-completed-intent-is-not-flagged-even-if-old.sdp.md index f3393b82..ee29caff 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-003-completed-intent-is-not-flagged-even-if-old.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-003-completed-intent-is-not-flagged-even-if-old.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Completed intent is not flagged even if old" from examples/order-management/tests/integration-features/durability/orphan-detection.feature +- outcome: Executable scenario: Completed intent is not flagged even if old + +```gwt +Given the backend is running and clean +And orphan detection is configured +And a completed intent exists from long ago +When the orphan detection runs +Then the intent should still be "completed" +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-004-failed-intent-is-not-flagged-even-if-old.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-004-failed-intent-is-not-flagged-even-if-old.sdp.md index 962e0a67..caa5cd21 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-004-failed-intent-is-not-flagged-even-if-old.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-004-failed-intent-is-not-flagged-even-if-old.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Failed intent is not flagged even if old" from examples/order-management/tests/integration-features/durability/orphan-detection.feature +- outcome: Executable scenario: Failed intent is not flagged even if old + +```gwt +Given the backend is running and clean +And orphan detection is configured +And a failed intent exists from long ago +When the orphan detection runs +Then the intent should still be "failed" +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-005-list-abandoned-intents-for-investigation.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-005-list-abandoned-intents-for-investigation.sdp.md index 228651bf..844a8fb0 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-005-list-abandoned-intents-for-investigation.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-005-list-abandoned-intents-for-investigation.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "List abandoned intents for investigation" from examples/order-management/tests/integration-features/durability/orphan-detection.feature +- outcome: Executable scenario: List abandoned intents for investigation + +```gwt +Given the backend is running and clean +And orphan detection is configured +And multiple intents have been abandoned +When I query abandoned intents +Then I should receive a list of abandoned intents +And each intent should have intentKey, operationType, and error +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-006-timeout-handler-marks-pending-intent-as-abandoned.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-006-timeout-handler-marks-pending-intent-as-abandoned.sdp.md index 1d3290d7..359184ad 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-006-timeout-handler-marks-pending-intent-as-abandoned.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-006-timeout-handler-marks-pending-intent-as-abandoned.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Timeout handler marks pending intent as abandoned" from examples/order-management/tests/integration-features/durability/orphan-detection.feature +- outcome: Executable scenario: Timeout handler marks pending intent as abandoned + +```gwt +Given the backend is running and clean +And orphan detection is configured +And a pending intent exists with intentKey "timeout-test-001" +When the timeout handler fires for intentKey "timeout-test-001" +Then the intent status should be "abandoned" +And the result should be "abandoned" +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-007-timeout-handler-no-ops-for-completed-intent.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-007-timeout-handler-no-ops-for-completed-intent.sdp.md index 8539fce5..445b2dfa 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-007-timeout-handler-no-ops-for-completed-intent.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-007-timeout-handler-no-ops-for-completed-intent.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Timeout handler no-ops for completed intent" from examples/order-management/tests/integration-features/durability/orphan-detection.feature +- outcome: Executable scenario: Timeout handler no-ops for completed intent + +```gwt +Given the backend is running and clean +And orphan detection is configured +And a completed intent exists with intentKey "timeout-test-002" +When the timeout handler fires for intentKey "timeout-test-002" +Then the intent status should still be "completed" +And the result should be "already_completed" +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.sdp.md index 23c4282e..ec3e013b 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: orphaned intents to be detected and flagged so that stuck commands can be investigated and recovered (test carrier: examples/order-management/tests/integration-features/durability/orphan-detection.feature) +- actor: a developer using event sourcing +- outcome: orphaned intents to be detected and flagged so that stuck commands can be investigated and recovered + +## Behavior + +- rule: Pending intents exceeding timeout are detected +- rule: Completed intents are never flagged +- rule: Abandoned intents are queryable +- rule: Scheduled timeout handler marks orphan diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-001-first-failure-creates-pending-poison-record.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-001-first-failure-creates-pending-poison-record.sdp.md index d07ca3fb..3a018334 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-001-first-failure-creates-pending-poison-record.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-001-first-failure-creates-pending-poison-record.sdp.md @@ -6,8 +6,15 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durability.poison-event --- -# First failure creates pending poison record +# Successful processing creates no poison record ## Intent -- outcome: Executable scenario "First failure creates pending poison record" from examples/order-management/tests/integration-features/durability/poison-event.feature +- outcome: Executable scenario: Successful processing creates no poison record + +```gwt +Given a poison event handler wrapping a successful projection +When processing an event +Then no poison record should be created +And the handler should complete successfully +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-002-second-failure-increments-attempt-count.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-002-second-failure-increments-attempt-count.sdp.md index f360a23e..bff863c7 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-002-second-failure-increments-attempt-count.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-002-second-failure-increments-attempt-count.sdp.md @@ -6,8 +6,16 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durability.poison-event --- -# Second failure increments attempt count +# First failure records attempt but does not quarantine ## Intent -- outcome: Executable scenario "Second failure increments attempt count" from examples/order-management/tests/integration-features/durability/poison-event.feature +- outcome: Executable scenario: First failure records attempt but does not quarantine + +```gwt +Given a poison event handler with maxAttempts 3 and no existing record +When processing an event that throws an error +Then a poison record should be created with attemptCount 1 +And the record status should be "pending" +And the original error should be re-thrown +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-003-event-quarantined-after-3-failures.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-003-event-quarantined-after-3-failures.sdp.md index 648a5e06..96413315 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-003-event-quarantined-after-3-failures.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-003-event-quarantined-after-3-failures.sdp.md @@ -6,8 +6,15 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durability.poison-event --- -# Event quarantined after 3 failures +# Event becomes quarantined after max retries ## Intent -- outcome: Executable scenario "Event quarantined after 3 failures" from examples/order-management/tests/integration-features/durability/poison-event.feature +- outcome: Executable scenario: Event becomes quarantined after max retries + +```gwt +Given a poison event handler with maxAttempts 3 and existing record with 2 attempts +When processing an event that throws an error +Then the poison record should be updated to status "quarantined" +And the error should NOT be re-thrown +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-004-quarantine-captures-error-details.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-004-quarantine-captures-error-details.sdp.md index 0a2d229a..baad50e6 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-004-quarantine-captures-error-details.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-004-quarantine-captures-error-details.sdp.md @@ -6,8 +6,15 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durability.poison-event --- -# Quarantine captures error details +# Quarantined event is silently skipped ## Intent -- outcome: Executable scenario "Quarantine captures error details" from examples/order-management/tests/integration-features/durability/poison-event.feature +- outcome: Executable scenario: Quarantined event is silently skipped + +```gwt +Given a poison event handler with a quarantined record for the event +When processing the quarantined event +Then the projection handler should NOT be called +And no error should be thrown +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-005-quarantined-event-bypasses-handler-completely.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-005-quarantined-event-bypasses-handler-completely.sdp.md index 32741973..9b2a37ec 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-005-quarantined-event-bypasses-handler-completely.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-005-quarantined-event-bypasses-handler-completely.sdp.md @@ -6,8 +6,14 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durability.poison-event --- -# Quarantined event bypasses handler completely +# onQuarantine callback invoked when alertOnQuarantine is true ## Intent -- outcome: Executable scenario "Quarantined event bypasses handler completely" from examples/order-management/tests/integration-features/durability/poison-event.feature +- outcome: Executable scenario: onQuarantine callback invoked when alertOnQuarantine is true + +```gwt +Given a poison handler with alertOnQuarantine true and onQuarantine callback +When an event becomes quarantined +Then the onQuarantine callback should be invoked with event details +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-006-unquarantine-resets-status-for-retry.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-006-unquarantine-resets-status-for-retry.sdp.md index a878fde0..ae345300 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-006-unquarantine-resets-status-for-retry.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-006-unquarantine-resets-status-for-retry.sdp.md @@ -6,8 +6,14 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durability.poison-event --- -# Unquarantine resets status for retry +# onQuarantine NOT invoked when alertOnQuarantine is false ## Intent -- outcome: Executable scenario "Unquarantine resets status for retry" from examples/order-management/tests/integration-features/durability/poison-event.feature +- outcome: Executable scenario: onQuarantine NOT invoked when alertOnQuarantine is false + +```gwt +Given a poison handler with alertOnQuarantine false +When an event becomes quarantined +Then the onQuarantine callback should NOT be invoked +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-007-unquarantine-of-non-quarantined-event-returns-not-quarantined.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-007-unquarantine-of-non-quarantined-event-returns-not-quarantined.sdp.md index 237ed1b0..ac3a9763 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-007-unquarantine-of-non-quarantined-event-returns-not-quarantined.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-007-unquarantine-of-non-quarantined-event-returns-not-quarantined.sdp.md @@ -6,8 +6,14 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durability.poison-event --- -# Unquarantine of non-quarantined event returns not_quarantined +# isEventQuarantined returns true for quarantined event ## Intent -- outcome: Executable scenario "Unquarantine of non-quarantined event returns not_quarantined" from examples/order-management/tests/integration-features/durability/poison-event.feature +- outcome: Executable scenario: isEventQuarantined returns true for quarantined event + +```gwt +Given a quarantined poison record for event "evt-123" +When checking if event "evt-123" is quarantined for projection "orderSummary" +Then the result should be true +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-008-stats-show-quarantined-event-counts-by-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-008-stats-show-quarantined-event-counts-by-projection.sdp.md index 6f19d63d..a1296761 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-008-stats-show-quarantined-event-counts-by-projection.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-008-stats-show-quarantined-event-counts-by-projection.sdp.md @@ -6,8 +6,14 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durability.poison-event --- -# Stats show quarantined event counts by projection +# isEventQuarantined returns false for non-quarantined event ## Intent -- outcome: Executable scenario "Stats show quarantined event counts by projection" from examples/order-management/tests/integration-features/durability/poison-event.feature +- outcome: Executable scenario: isEventQuarantined returns false for non-quarantined event + +```gwt +Given a pending poison record for event "evt-123" +When checking if event "evt-123" is quarantined for projection "orderSummary" +Then the result should be false +``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.sdp.md index 3fd5905d..d549c0d7 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/poison-event.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/poison-event.sdp.md @@ -6,8 +6,8 @@ readiness: idea relations: refines: spec:behavior.order-management --- -# Poison Event Handling (App Integration) +# Poison Event Handling ## Intent -- outcome: malformed events to be quarantined after repeated failures so that a single bad event doesn't block all downstream projections (test carrier: examples/order-management/tests/integration-features/durability/poison-event.feature) +- outcome: Poison Event Handling diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-001-dcb-operation-succeeds-on-first-attempt.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-001-dcb-operation-succeeds-on-first-attempt.sdp.md index b58ab921..1d0e0402 100644 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-001-dcb-operation-succeeds-on-first-attempt.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-001-dcb-operation-succeeds-on-first-attempt.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "DCB operation succeeds on first attempt" from examples/order-management/tests/integration-features/durable-adapters/dcb-retry.feature +- outcome: Executable scenario: DCB operation succeeds on first attempt + +```gwt +Given the backend is running and clean +And a product "dcb-prod-01" exists with 100 available stock +When I reserve stock via DCB for order "dcb-ord-01" with: +Then the DCB result status should be "success" +And no retry should be scheduled +And I wait for projections to process +And the product "dcb-prod-01" should have 90 available and 10 reserved stock +``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-002-dcb-rejected-result-passes-through-unchanged.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-002-dcb-rejected-result-passes-through-unchanged.sdp.md index 6f1af5bb..d902418d 100644 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-002-dcb-rejected-result-passes-through-unchanged.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-002-dcb-rejected-result-passes-through-unchanged.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "DCB rejected result passes through unchanged" from examples/order-management/tests/integration-features/durable-adapters/dcb-retry.feature +- outcome: Executable scenario: DCB rejected result passes through unchanged + +```gwt +Given the backend is running and clean +And a product "dcb-prod-02" exists with 5 available stock +When I reserve stock via DCB for order "dcb-ord-02" with: +Then the DCB result status should be "failed" +And the result should include failure reason +And no retry should be scheduled +``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-003-dcb-conflict-returns-retry-metadata-with-updated-version.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-003-dcb-conflict-returns-retry-metadata-with-updated-version.sdp.md index 9cbf174f..589c57be 100644 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-003-dcb-conflict-returns-retry-metadata-with-updated-version.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-003-dcb-conflict-returns-retry-metadata-with-updated-version.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "DCB conflict returns retry metadata with updated version" from examples/order-management/tests/integration-features/durable-adapters/dcb-retry.feature +- outcome: Executable scenario: DCB conflict returns retry metadata with updated version + +```gwt +Given the backend is running and clean +And a DCB test scope "conflict-scope-01" is initialized +And the scope version is advanced to cause conflict +When I execute a DCB operation with expected version 0 +Then the DCB result status should be "deferred" +And retry metadata should include a DCB partition key +And the retry should use the updated expected version +``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md index c0780812..d44c1ff1 100644 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Max retries exceeded returns rejected" from examples/order-management/tests/integration-features/durable-adapters/dcb-retry.feature +- outcome: Executable scenario: Max retries exceeded returns rejected + +```gwt +Given the backend is running and clean +And a DCB test scope "max-retry-scope" is initialized +When I execute a DCB operation at max attempt count +Then the DCB result status should be "rejected" +And the result code should be "DCB_MAX_RETRIES_EXCEEDED" +``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-005-final-scope-conflict-rolls-back-state-updates.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-005-final-scope-conflict-rolls-back-state-updates.sdp.md index decfc1f7..f20d1125 100644 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-005-final-scope-conflict-rolls-back-state-updates.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-005-final-scope-conflict-rolls-back-state-updates.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "Final scope conflict rolls back state updates" from examples/order-management/tests/integration-features/durable-adapters/dcb-retry.feature +- outcome: Executable scenario: Final scope conflict rolls back state updates + +```gwt +Given the backend is running and clean +And a product "dcb-prod-final-conflict" exists with 100 available stock +When I execute a DCB operation that hits a final scope conflict for product "dcb-prod-final-conflict" +Then the DCB result status should be "conflict" +And the conflict result should report current version 1 +And the product "dcb-prod-final-conflict" should have 100 available and 0 reserved stock +And the DCB scope should exist at version 1 +And the DCB scope should only reference the competing stream +And no DCB success events should exist for the rollback correlation id +``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-006-backoff-increases-exponentially.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-006-backoff-increases-exponentially.sdp.md index 29a4fff2..08180724 100644 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-006-backoff-increases-exponentially.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-006-backoff-increases-exponentially.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Backoff increases exponentially" from examples/order-management/tests/integration-features/durable-adapters/dcb-retry.feature +- outcome: Executable scenario: Backoff increases exponentially + +```gwt +Given the backend is running and clean +And backoff config with initialMs 100 and base 2 +When calculating backoff for attempts 0, 1, 2, 3 +Then the base delays should be 100, 200, 400, 800 respectively +``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-007-backoff-is-capped-at-maximum.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-007-backoff-is-capped-at-maximum.sdp.md index 5a579297..a52ae10d 100644 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-007-backoff-is-capped-at-maximum.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-007-backoff-is-capped-at-maximum.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Backoff is capped at maximum" from examples/order-management/tests/integration-features/durable-adapters/dcb-retry.feature +- outcome: Executable scenario: Backoff is capped at maximum + +```gwt +Given the backend is running and clean +And backoff config with maxMs 30000 +When calculating backoff for attempt 10 +Then total delay should not exceed 30000ms +``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-008-retries-use-consistent-partition-key.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-008-retries-use-consistent-partition-key.sdp.md index f85880d2..b2012ee6 100644 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-008-retries-use-consistent-partition-key.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-008-retries-use-consistent-partition-key.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Retries use consistent partition key" from examples/order-management/tests/integration-features/durable-adapters/dcb-retry.feature +- outcome: Executable scenario: Retries use consistent partition key + +```gwt +Given the backend is running and clean +And a DCB test scope with key "tenant:t1:reservation:r1" +When conflict metadata is generated twice for that scope +Then the partition key should be "dcb:tenant:t1:reservation:r1" +And repeated metadata generation should return the same partition key +``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.sdp.md index ffea40bc..d4520eeb 100644 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: DCB operations to automatically retry on OCC conflicts so that concurrent modifications are handled gracefully without manual retry logic (test carrier: examples/order-management/tests/integration-features/durable-adapters/dcb-retry.feature) +- actor: a developer using the order-management app +- outcome: DCB operations to automatically retry on OCC conflicts so that concurrent modifications are handled gracefully without manual retry logic + +## Behavior + +- rule: DCB operations succeed without retry when no conflict +- rule: OCC conflicts return retry scheduling metadata +- rule: Backoff uses exponential increase with jitter +- rule: Scope-aware scheduling metadata stays stable across retries diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-001-normal-requests-pass-rate-limiting.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-001-normal-requests-pass-rate-limiting.sdp.md index d676f78d..bf9c4b02 100644 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-001-normal-requests-pass-rate-limiting.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-001-normal-requests-pass-rate-limiting.sdp.md @@ -6,8 +6,18 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting --- -# Normal requests pass rate limiting +# Requests within rate limit succeed ## Intent -- outcome: Executable scenario "Normal requests pass rate limiting" from examples/order-management/tests/integration-features/durable-adapters/rate-limiting.feature +- outcome: Executable scenario: Requests within rate limit succeed + +```gwt +Given the test environment is initialized +And rate limiter component is mounted +And rate limit "commandDispatch" allows 100 requests per minute +And 50 requests have been made in the current window +When a new command is dispatched +Then the command should proceed to handler +And rate limit bucket should show 51 consumed +``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-002-exhausted-rate-limit-rejects-request.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-002-exhausted-rate-limit-rejects-request.sdp.md index 0935f6c1..adc81500 100644 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-002-exhausted-rate-limit-rejects-request.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-002-exhausted-rate-limit-rejects-request.sdp.md @@ -6,8 +6,18 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting --- -# Exhausted rate limit rejects request +# Requests exceeding rate limit are rejected ## Intent -- outcome: Executable scenario "Exhausted rate limit rejects request" from examples/order-management/tests/integration-features/durable-adapters/rate-limiting.feature +- outcome: Executable scenario: Requests exceeding rate limit are rejected + +```gwt +Given the test environment is initialized +And rate limiter component is mounted +And rate limit "commandDispatch" allows 100 requests per minute +And 100 requests have been made in the current window +When a new command is dispatched +Then the command should be rejected with "RATE_LIMITED" +And response should include "retryAfterMs" +``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-003-different-users-have-independent-limits.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-003-different-users-have-independent-limits.sdp.md index 57deec8e..322d3a48 100644 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-003-different-users-have-independent-limits.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-003-different-users-have-independent-limits.sdp.md @@ -6,8 +6,17 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting --- -# Different users have independent limits +# Token bucket refills over time ## Intent -- outcome: Executable scenario "Different users have independent limits" from examples/order-management/tests/integration-features/durable-adapters/rate-limiting.feature +- outcome: Executable scenario: Token bucket refills over time + +```gwt +Given the test environment is initialized +And rate limiter component is mounted +And rate limit "commandDispatch" with rate 100/minute and capacity 150 +And bucket is depleted to 0 tokens +When 30 seconds pass +Then bucket should have approximately 50 tokens available +``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md index 29bedb86..7a4efa72 100644 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md @@ -6,8 +6,18 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting --- -# Same user different command types have independent limits +# Rate limit key isolation by user ## Intent -- outcome: Executable scenario "Same user different command types have independent limits" from examples/order-management/tests/integration-features/durable-adapters/rate-limiting.feature +- outcome: Executable scenario: Rate limit key isolation by user + +```gwt +Given the test environment is initialized +And rate limiter component is mounted +And rate limit key strategy is "byUserId" +And user "alice" has exhausted her rate limit +When user "bob" dispatches a command +Then "bob"'s command should proceed +And "alice" should remain rate limited +``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-005-rate-limited-command-returns-standard-rejection.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-005-rate-limited-command-returns-standard-rejection.sdp.md index c9d99736..b8f896ff 100644 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-005-rate-limited-command-returns-standard-rejection.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-005-rate-limited-command-returns-standard-rejection.sdp.md @@ -6,8 +6,18 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting --- -# Rate limited command returns standard rejection +# Admin rebuild respects hourly limit ## Intent -- outcome: Executable scenario "Rate limited command returns standard rejection" from examples/order-management/tests/integration-features/durable-adapters/rate-limiting.feature +- outcome: Executable scenario: Admin rebuild respects hourly limit + +```gwt +Given the test environment is initialized +And rate limiter component is mounted +And rate limit "adminRebuild" allows 10 rebuilds per hour +And 5 rebuilds have been triggered this hour +When admin triggers another rebuild +Then the rebuild should start +And rebuild count should be 6 +``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-006-health-check-commands-bypass-rate-limiting.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-006-health-check-commands-bypass-rate-limiting.sdp.md index 1da003bb..89d1e22c 100644 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-006-health-check-commands-bypass-rate-limiting.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-006-health-check-commands-bypass-rate-limiting.sdp.md @@ -6,8 +6,18 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting --- -# Health check commands bypass rate limiting +# Admin rebuild blocked when limit exceeded ## Intent -- outcome: Executable scenario "Health check commands bypass rate limiting" from examples/order-management/tests/integration-features/durable-adapters/rate-limiting.feature +- outcome: Executable scenario: Admin rebuild blocked when limit exceeded + +```gwt +Given the test environment is initialized +And rate limiter component is mounted +And rate limit "adminRebuild" allows 10 rebuilds per hour +And 10 rebuilds have been triggered this hour +When admin triggers another rebuild +Then the operation should be rejected +And response should indicate "Rate limit exceeded for adminRebuild" +``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-007-high-volume-rate-limit-uses-sharded-counting.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-007-high-volume-rate-limit-uses-sharded-counting.sdp.md index de9110fc..7d966513 100644 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-007-high-volume-rate-limit-uses-sharded-counting.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-007-high-volume-rate-limit-uses-sharded-counting.sdp.md @@ -6,8 +6,17 @@ readiness: idea relations: refines: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting --- -# High-volume rate limit uses sharded counting +# Adapter converts component response to RateLimitResult ## Intent -- outcome: Executable scenario "High-volume rate limit uses sharded counting" from examples/order-management/tests/integration-features/durable-adapters/rate-limiting.feature +- outcome: Executable scenario: Adapter converts component response to RateLimitResult + +```gwt +Given the test environment is initialized +And rate limiter component is mounted +And a rate limiter with "commandDispatch" limit configured +When createConvexRateLimitAdapter is called +Then it returns a function compatible with RateLimitChecker interface +And the function returns { allowed: boolean, retryAfterMs?: number } +``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.sdp.md index 8346dfb3..7a96d884 100644 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.sdp.md @@ -6,8 +6,15 @@ readiness: idea relations: refines: spec:behavior.order-management --- -# Rate Limiting Middleware (App Integration) +# Rate Limiting - API Protection ## Intent -- outcome: commands to be rate limited at the middleware level so that the system is protected from excessive requests (test carrier: examples/order-management/tests/integration-features/durable-adapters/rate-limiting.feature) +- actor: a platform developer +- outcome: to rate limit commands and admin operations so that the system is protected from abuse and overload + +## Behavior + +- rule: Rate limiting protects command dispatch +- rule: Admin operations have separate rate limits +- rule: Rate limiter adapter integrates with middleware diff --git a/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md index c0d7e09a..6ad49b0e 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Successfully add stock to existing product" from examples/order-management/tests/integration-features/inventory/add-stock.feature +- outcome: Executable scenario: Successfully add stock to existing product + +```gwt +Given the backend is running and clean +And a product "prod-stock-01" exists with 0 stock +When I add stock to product "prod-stock-01": +Then the command should succeed +And I wait for projections to process +And the product "prod-stock-01" should have 50 available stock +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-002-reject-adding-stock-to-non-existent-product.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-002-reject-adding-stock-to-non-existent-product.sdp.md index 1dd0c3ae..1ae02128 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-002-reject-adding-stock-to-non-existent-product.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-002-reject-adding-stock-to-non-existent-product.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Reject adding stock to non-existent product" from examples/order-management/tests/integration-features/inventory/add-stock.feature +- outcome: Executable scenario: Reject adding stock to non-existent product + +```gwt +Given the backend is running and clean +When I add stock to product "prod-nonexistent": +Then the command should be rejected with code "PRODUCT_NOT_FOUND" +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-003-add-stock-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-003-add-stock-is-idempotent-with-same-command-id.sdp.md index 6e15670a..5337ea1e 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-003-add-stock-is-idempotent-with-same-command-id.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-003-add-stock-is-idempotent-with-same-command-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "AddStock is idempotent with same commandId" from examples/order-management/tests/integration-features/inventory/add-stock.feature +- outcome: Executable scenario: AddStock is idempotent with same commandId + +```gwt +Given the backend is running and clean +And a product "prod-stock-02" exists with 10 stock +When I add stock with commandId "cmd-stock-idem-01" to product "prod-stock-02": and I repeat adding stock with commandId "cmd-stock-idem-01" to product "prod-stock-02": +Then the second command should return duplicate status +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/add-stock.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/add-stock.sdp.md index b86f16c5..94ce90cc 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/add-stock.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/add-stock.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: to add stock to existing products so that products are available for sale (test carrier: examples/order-management/tests/integration-features/inventory/add-stock.feature) +- actor: an inventory manager +- outcome: to add stock to existing products so that products are available for sale diff --git a/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-001-confirm-pending-reservation.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-001-confirm-pending-reservation.sdp.md index ba7e90fa..c675fd88 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-001-confirm-pending-reservation.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-001-confirm-pending-reservation.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Confirm pending reservation" from examples/order-management/tests/integration-features/inventory/confirm-reservation.feature +- outcome: Executable scenario: Confirm pending reservation + +```gwt +Given the backend is running and clean +And a product "prod-conf-int-01" exists with 20 available stock +And a pending reservation "res-conf-int-01" exists for order "ord-conf-int-01" with: +When I confirm the reservation "res-conf-int-01" +Then the command should succeed +And I wait for projections to process +And the reservation "res-conf-int-01" should have status "confirmed" +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-002-reject-confirming-already-confirmed-reservation.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-002-reject-confirming-already-confirmed-reservation.sdp.md index a2884a20..23cd443a 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-002-reject-confirming-already-confirmed-reservation.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-002-reject-confirming-already-confirmed-reservation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject confirming already confirmed reservation" from examples/order-management/tests/integration-features/inventory/confirm-reservation.feature +- outcome: Executable scenario: Reject confirming already confirmed reservation + +```gwt +Given the backend is running and clean +And a product "prod-conf-int-02" exists with 20 available stock +And a confirmed reservation "res-conf-int-02" exists for order "ord-conf-int-02" with: +When I confirm the reservation "res-conf-int-02" +Then the command should be rejected with code "RESERVATION_NOT_PENDING" +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-003-reject-confirming-non-existent-reservation.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-003-reject-confirming-non-existent-reservation.sdp.md index a6e3b88e..d1be938f 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-003-reject-confirming-non-existent-reservation.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-003-reject-confirming-non-existent-reservation.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Reject confirming non-existent reservation" from examples/order-management/tests/integration-features/inventory/confirm-reservation.feature +- outcome: Executable scenario: Reject confirming non-existent reservation + +```gwt +Given the backend is running and clean +When I confirm the reservation "res-nonexistent-01" +Then the command should be rejected with code "RESERVATION_NOT_FOUND" +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.sdp.md index 09fa35ac..aabf5b36 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: to confirm stock reservations so that reserved stock becomes committed to the order (test carrier: examples/order-management/tests/integration-features/inventory/confirm-reservation.feature) +- outcome: to confirm stock reservations so that reserved stock becomes committed to the order diff --git a/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-001-successfully-create-a-new-product-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-001-successfully-create-a-new-product-and-verify-projection.sdp.md index 08d262fd..9d2ff830 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-001-successfully-create-a-new-product-and-verify-projection.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-001-successfully-create-a-new-product-and-verify-projection.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Successfully create a new product and verify projection" from examples/order-management/tests/integration-features/inventory/create-product.feature +- outcome: Executable scenario: Successfully create a new product and verify projection + +```gwt +Given the backend is running and clean +When I create a product with: +Then the command should succeed +And I wait for projections to process +And the product "prod-int-01" should exist with name "Test Widget" +And the product "prod-int-01" should have 0 available stock +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-002-reject-duplicate-product-id.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-002-reject-duplicate-product-id.sdp.md index cb2d9d4a..f179b744 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-002-reject-duplicate-product-id.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-002-reject-duplicate-product-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Reject duplicate product ID" from examples/order-management/tests/integration-features/inventory/create-product.feature +- outcome: Executable scenario: Reject duplicate product ID + +```gwt +Given the backend is running and clean +And a product "prod-int-02" exists +When I create a product with: +Then the command should be rejected with code "PRODUCT_ALREADY_EXISTS" +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-003-reject-duplicate-sku.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-003-reject-duplicate-sku.sdp.md index 38922679..f5f8095f 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-003-reject-duplicate-sku.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-003-reject-duplicate-sku.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Reject duplicate SKU" from examples/order-management/tests/integration-features/inventory/create-product.feature +- outcome: Executable scenario: Reject duplicate SKU + +```gwt +Given the backend is running and clean +And a product with SKU "SKU-DUP-001" exists +When I create a product with: +Then the command should be rejected with code "SKU_ALREADY_EXISTS" +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-004-create-product-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-004-create-product-is-idempotent-with-same-command-id.sdp.md index 46c59111..db06a932 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-004-create-product-is-idempotent-with-same-command-id.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-004-create-product-is-idempotent-with-same-command-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "CreateProduct is idempotent with same commandId" from examples/order-management/tests/integration-features/inventory/create-product.feature +- outcome: Executable scenario: CreateProduct is idempotent with same commandId + +```gwt +Given the backend is running and clean +When I create a product with commandId "cmd-prod-idem-01": and I repeat creating a product with commandId "cmd-prod-idem-01": +Then the second command should return duplicate status +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/create-product.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/create-product.sdp.md index 3e4bc4db..97f1c69e 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/create-product.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/create-product.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: to create new products in the catalog so that they can be sold and tracked (test carrier: examples/order-management/tests/integration-features/inventory/create-product.feature) +- actor: an inventory manager +- outcome: to create new products in the catalog so that they can be sold and tracked diff --git a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-001-list-products-returns-all-products.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-001-list-products-returns-all-products.sdp.md index 9727e352..32710fc4 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-001-list-products-returns-all-products.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-001-list-products-returns-all-products.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "List products returns all products" from examples/order-management/tests/integration-features/inventory/query-inventory.feature +- outcome: Executable scenario: List products returns all products + +```gwt +Given the backend is running and clean +And the following products exist: +When I list all products +Then the result should contain at least 3 products +And the result should include product "prod-qry-01" with name "Widget A" +And the result should include product "prod-qry-02" with name "Widget B" +And the result should include product "prod-qry-03" with name "Widget C" +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-002-get-stock-availability-for-product.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-002-get-stock-availability-for-product.sdp.md index 1185cfea..6fa82dd6 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-002-get-stock-availability-for-product.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-002-get-stock-availability-for-product.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Get stock availability for product" from examples/order-management/tests/integration-features/inventory/query-inventory.feature +- outcome: Executable scenario: Get stock availability for product + +```gwt +Given the backend is running and clean +And a product "prod-avail-01" exists with: +When I get stock availability for product "prod-avail-01" +Then the availability should show 50 available and 10 reserved +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-003-check-availability-for-multiple-items.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-003-check-availability-for-multiple-items.sdp.md index 2f1885ea..02326863 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-003-check-availability-for-multiple-items.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-003-check-availability-for-multiple-items.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Check availability for multiple items" from examples/order-management/tests/integration-features/inventory/query-inventory.feature +- outcome: Executable scenario: Check availability for multiple items + +```gwt +Given the backend is running and clean +And the following products exist: +When I check availability for items: and I check availability for items: +Then all items should be available +And not all items should be available +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-004-get-reservation-by-order-id.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-004-get-reservation-by-order-id.sdp.md index e6c97f42..c670b2d6 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-004-get-reservation-by-order-id.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-004-get-reservation-by-order-id.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Get reservation by order ID" from examples/order-management/tests/integration-features/inventory/query-inventory.feature +- outcome: Executable scenario: Get reservation by order ID + +```gwt +Given the backend is running and clean +And a product "prod-res-01" exists with 20 stock +And a pending reservation exists for order "ord-qry-01" with: +When I get reservation by order ID "ord-qry-01" +Then the reservation should exist for order "ord-qry-01" +And the reservation status should be "pending" +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.sdp.md index 8e19fe54..b45d5417 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: to query inventory information so that I can view product availability and reservations (test carrier: examples/order-management/tests/integration-features/inventory/query-inventory.feature) +- actor: a user +- outcome: to query inventory information so that I can view product availability and reservations diff --git a/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-001-release-pending-reservation.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-001-release-pending-reservation.sdp.md index f2f18542..b5966c64 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-001-release-pending-reservation.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-001-release-pending-reservation.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Release pending reservation" from examples/order-management/tests/integration-features/inventory/release-reservation.feature +- outcome: Executable scenario: Release pending reservation + +```gwt +Given the backend is running and clean +And a product "prod-rel-int-01" exists with 20 available stock +And a pending reservation "res-rel-int-01" exists for order "ord-rel-int-01" with: +When I release the reservation "res-rel-int-01" with reason "Order cancelled" +Then the command should succeed +And I wait for projections to process +And the reservation "res-rel-int-01" should have status "released" +And the product "prod-rel-int-01" should have 20 available and 0 reserved stock +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-002-reject-releasing-non-pending-reservation.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-002-reject-releasing-non-pending-reservation.sdp.md index 0cb83b7c..929dace0 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-002-reject-releasing-non-pending-reservation.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-002-reject-releasing-non-pending-reservation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject releasing non-pending reservation" from examples/order-management/tests/integration-features/inventory/release-reservation.feature +- outcome: Executable scenario: Reject releasing non-pending reservation + +```gwt +Given the backend is running and clean +And a product "prod-rel-int-02" exists with 20 available stock +And a confirmed reservation "res-rel-int-02" exists for order "ord-rel-int-02" with: +When I release the reservation "res-rel-int-02" with reason "Testing" +Then the command should be rejected with code "RESERVATION_NOT_PENDING" +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.sdp.md index 3130ad80..eec178c6 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: to release stock reservations so that reserved stock becomes available again when orders are cancelled (test carrier: examples/order-management/tests/integration-features/inventory/release-reservation.feature) +- outcome: to release stock reservations so that reserved stock becomes available again when orders are cancelled diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-001-expire-pending-reservations-past-ttl.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-001-expire-pending-reservations-past-ttl.sdp.md index e97c20c7..fc5ceafb 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-001-expire-pending-reservations-past-ttl.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-001-expire-pending-reservations-past-ttl.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Expire pending reservations past TTL" from examples/order-management/tests/integration-features/inventory/reservation-expiration.feature +- outcome: Executable scenario: Expire pending reservations past TTL + +```gwt +Given the backend is running and clean +And a product "prod-exp-int-01" exists with 25 available stock +And an expired pending reservation "res-exp-int-01" exists for order "ord-exp-int-01" with: +When I trigger the reservation expiration process +Then the expiration process should have processed at least 1 reservation +And I wait for projections to process +And the reservation "res-exp-int-01" should have status "expired" +And the product "prod-exp-int-01" should have 25 available and 0 reserved stock +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-002-skip-confirmed-reservations.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-002-skip-confirmed-reservations.sdp.md index e8e5636a..60c47d38 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-002-skip-confirmed-reservations.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-002-skip-confirmed-reservations.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Skip confirmed reservations" from examples/order-management/tests/integration-features/inventory/reservation-expiration.feature +- outcome: Executable scenario: Skip confirmed reservations + +```gwt +Given the backend is running and clean +And a product "prod-exp-int-02" exists with 25 available stock +And an expired confirmed reservation "res-exp-int-02" exists for order "ord-exp-int-02" with: +When I trigger the reservation expiration process and I wait for 1000 milliseconds +Then the reservation "res-exp-int-02" should have status "confirmed" +And the product "prod-exp-int-02" should have 20 available and 5 reserved stock +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-003-skip-reservations-not-yet-expired.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-003-skip-reservations-not-yet-expired.sdp.md index 51b6fbde..7b42454c 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-003-skip-reservations-not-yet-expired.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-003-skip-reservations-not-yet-expired.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Skip reservations not yet expired" from examples/order-management/tests/integration-features/inventory/reservation-expiration.feature +- outcome: Executable scenario: Skip reservations not yet expired + +```gwt +Given the backend is running and clean +And a product "prod-exp-int-03" exists with 25 available stock +And a future pending reservation "res-exp-int-03" exists for order "ord-exp-int-03" with: +When I trigger the reservation expiration process and I wait for 1000 milliseconds +Then the reservation "res-exp-int-03" should have status "pending" +And the product "prod-exp-int-03" should have 20 available and 5 reserved stock +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-004-batch-expiration-of-multiple-reservations.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-004-batch-expiration-of-multiple-reservations.sdp.md index bc6d2cd3..574b953d 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-004-batch-expiration-of-multiple-reservations.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-004-batch-expiration-of-multiple-reservations.sdp.md @@ -10,4 +10,19 @@ relations: ## Intent -- outcome: Executable scenario "Batch expiration of multiple reservations" from examples/order-management/tests/integration-features/inventory/reservation-expiration.feature +- outcome: Executable scenario: Batch expiration of multiple reservations + +```gwt +Given the backend is running and clean +And a product "prod-exp-int-04" exists with 65 available stock +And an expired pending reservation "res-exp-int-04a" exists for order "ord-exp-int-04a" with: +And an expired pending reservation "res-exp-int-04b" exists for order "ord-exp-int-04b" with: +And an expired pending reservation "res-exp-int-04c" exists for order "ord-exp-int-04c" with: +When I trigger the reservation expiration process +Then the expiration process should have processed 3 reservations +And I wait for projections to process +And the reservation "res-exp-int-04a" should have status "expired" +And the reservation "res-exp-int-04b" should have status "expired" +And the reservation "res-exp-int-04c" should have status "expired" +And the product "prod-exp-int-04" should have 65 available and 0 reserved stock +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.sdp.md index bf87087d..461cb996 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: expired reservations to be automatically released so that reserved stock becomes available again when orders are not completed in time (test carrier: examples/order-management/tests/integration-features/inventory/reservation-expiration.feature) +- outcome: expired reservations to be automatically released so that reserved stock becomes available again when orders are not completed in time diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-001-reserve-stock-successfully.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-001-reserve-stock-successfully.sdp.md index 39338a95..591f638f 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-001-reserve-stock-successfully.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-001-reserve-stock-successfully.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Reserve stock successfully" from examples/order-management/tests/integration-features/inventory/reserve-stock.feature +- outcome: Executable scenario: Reserve stock successfully + +```gwt +Given the backend is running and clean +And a product "prod-res-int-01" exists with 100 available stock +When I reserve stock for order "ord-res-int-01" with: +Then the command should succeed +And I wait for projections to process +And the product "prod-res-int-01" should have 90 available and 10 reserved stock +And the reservation should have status "pending" +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-002-reserve-stock-for-multiple-items.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-002-reserve-stock-for-multiple-items.sdp.md index 59cf18da..38ae2566 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-002-reserve-stock-for-multiple-items.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-002-reserve-stock-for-multiple-items.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Reserve stock for multiple items" from examples/order-management/tests/integration-features/inventory/reserve-stock.feature +- outcome: Executable scenario: Reserve stock for multiple items + +```gwt +Given the backend is running and clean +And a product "prod-res-int-02" exists with 50 available stock +And another product "prod-res-int-03" exists with 30 available stock +When I reserve stock for order "ord-res-int-02" with: +Then the command should succeed +And I wait for projections to process +And the product "prod-res-int-02" should have 45 available and 5 reserved stock +And the product "prod-res-int-03" should have 27 available and 3 reserved stock +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-003-reject-when-insufficient-stock.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-003-reject-when-insufficient-stock.sdp.md index c3d4b240..114c7452 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-003-reject-when-insufficient-stock.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-003-reject-when-insufficient-stock.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject when insufficient stock" from examples/order-management/tests/integration-features/inventory/reserve-stock.feature +- outcome: Executable scenario: Reject when insufficient stock + +```gwt +Given the backend is running and clean +And a product "prod-res-int-04" exists with 5 available stock +When I reserve stock for order "ord-res-int-03" with: +Then the command should return failed status with reason "Insufficient stock" +And the product "prod-res-int-04" should have 5 available and 0 reserved stock +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-004-all-or-nothing-reservation-when-one-item-fails.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-004-all-or-nothing-reservation-when-one-item-fails.sdp.md index 2decc79e..c2fa8e6d 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-004-all-or-nothing-reservation-when-one-item-fails.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-004-all-or-nothing-reservation-when-one-item-fails.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "All-or-nothing reservation when one item fails" from examples/order-management/tests/integration-features/inventory/reserve-stock.feature +- outcome: Executable scenario: All-or-nothing reservation when one item fails + +```gwt +Given the backend is running and clean +And a product "prod-res-int-05" exists with 100 available stock +And another product "prod-res-int-06" exists with 2 available stock +When I reserve stock for order "ord-res-int-04" with: +Then the command should return failed status with reason "Insufficient stock" +And the product "prod-res-int-05" should have 100 available and 0 reserved stock +And the product "prod-res-int-06" should have 2 available and 0 reserved stock +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-005-reject-for-non-existent-product.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-005-reject-for-non-existent-product.sdp.md index c09e44ba..18393703 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-005-reject-for-non-existent-product.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-005-reject-for-non-existent-product.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Reject for non-existent product" from examples/order-management/tests/integration-features/inventory/reserve-stock.feature +- outcome: Executable scenario: Reject for non-existent product + +```gwt +Given the backend is running and clean +When I reserve stock for order "ord-res-int-05" with: +Then the command should return failed status with reason "Insufficient stock" +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-006-return-failed-status-when-reservation-fails.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-006-return-failed-status-when-reservation-fails.sdp.md index 096751ef..d5dea61b 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-006-return-failed-status-when-reservation-fails.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-006-return-failed-status-when-reservation-fails.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Return failed status when reservation fails" from examples/order-management/tests/integration-features/inventory/reserve-stock.feature +- outcome: Executable scenario: Return failed status when reservation fails + +```gwt +Given the backend is running and clean +And a product "prod-res-int-07" exists with 3 available stock +When I reserve stock for order "ord-res-int-06" with: +Then the command should return failed status +And the result should have an eventId for the failure event +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-007-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-007-idempotent-with-same-command-id.sdp.md index 89e3f5e3..86b41c5c 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-007-idempotent-with-same-command-id.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-007-idempotent-with-same-command-id.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Idempotent with same commandId" from examples/order-management/tests/integration-features/inventory/reserve-stock.feature +- outcome: Executable scenario: Idempotent with same commandId + +```gwt +Given the backend is running and clean +And a product "prod-res-int-08" exists with 100 available stock +When I reserve stock for order "ord-res-int-07" with commandId "cmd-res-idem-01": and I repeat reserving stock for order "ord-res-int-07" with commandId "cmd-res-idem-01": +Then the second command should return duplicate status +And I wait for projections to process +And the product "prod-res-int-08" should have 90 available and 10 reserved stock +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.sdp.md index 0d5c2219..dfa6536f 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: to reserve stock for orders so that stock is held until order is confirmed or cancelled (test carrier: examples/order-management/tests/integration-features/inventory/reserve-stock.feature) +- outcome: to reserve stock for orders so that stock is held until order is confirmed or cancelled diff --git a/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-001-add-item-to-draft-order-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-001-add-item-to-draft-order-and-verify-projection.sdp.md index 97b9c221..06355437 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-001-add-item-to-draft-order-and-verify-projection.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-001-add-item-to-draft-order-and-verify-projection.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Add item to draft order and verify projection" from examples/order-management/tests/integration-features/orders/add-order-item.feature +- outcome: Executable scenario: Add item to draft order and verify projection + +```gwt +Given the backend is running and clean +And an order "ord-add-item-01" exists in draft status +When I add an item to order "ord-add-item-01": +Then the command should succeed +And I wait for projections to process +And the order "ord-add-item-01" should have 1 items +And the order "ord-add-item-01" total should be 30 +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-002-reject-adding-item-to-submitted-order.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-002-reject-adding-item-to-submitted-order.sdp.md index 983dc11d..43ec85b6 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-002-reject-adding-item-to-submitted-order.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-002-reject-adding-item-to-submitted-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Reject adding item to submitted order" from examples/order-management/tests/integration-features/orders/add-order-item.feature +- outcome: Executable scenario: Reject adding item to submitted order + +```gwt +Given the backend is running and clean +And a submitted order "ord-add-item-02" exists with items: +When I add an item to order "ord-add-item-02": +Then the command should be rejected with code "ORDER_NOT_IN_DRAFT" +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/add-order-item.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/add-order-item.sdp.md index cee863a0..266adfe7 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/add-order-item.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/add-order-item.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: to add items to my order so that I can purchase multiple products (test carrier: examples/order-management/tests/integration-features/orders/add-order-item.feature) +- actor: a customer +- outcome: to add items to my order so that I can purchase multiple products diff --git a/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-001-add-multiple-items-to-order-in-batch.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-001-add-multiple-items-to-order-in-batch.sdp.md index 780ded83..a1e4fc28 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-001-add-multiple-items-to-order-in-batch.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-001-add-multiple-items-to-order-in-batch.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Add multiple items to order in batch" from examples/order-management/tests/integration-features/orders/batch-operations.feature +- outcome: Executable scenario: Add multiple items to order in batch + +```gwt +Given the backend is running and clean +And a draft order "ord-batch-01" exists +When I add multiple items to order "ord-batch-01" in batch: +Then the batch should succeed with 3 items +And the batch should have 0 failures +And I wait for projections to process +And the order "ord-batch-01" should have 3 items +And the order "ord-batch-01" total should be 90 +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-002-batch-respects-order-of-execution.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-002-batch-respects-order-of-execution.sdp.md index bff1e86d..c6dacda5 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-002-batch-respects-order-of-execution.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-002-batch-respects-order-of-execution.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Batch respects order of execution" from examples/order-management/tests/integration-features/orders/batch-operations.feature +- outcome: Executable scenario: Batch respects order of execution + +```gwt +Given the backend is running and clean +And a draft order "ord-batch-02" exists with items: +When I remove multiple items from order "ord-batch-02" in batch: +Then the batch should succeed with 2 items +And I wait for projections to process +And the order "ord-batch-02" should have 1 item +And the order "ord-batch-02" total should be 10 +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-003-batch-stops-on-first-failure-in-atomic-mode.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-003-batch-stops-on-first-failure-in-atomic-mode.sdp.md index 74663bbd..a858eea4 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-003-batch-stops-on-first-failure-in-atomic-mode.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-003-batch-stops-on-first-failure-in-atomic-mode.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Batch stops on first failure in atomic mode" from examples/order-management/tests/integration-features/orders/batch-operations.feature +- outcome: Executable scenario: Batch stops on first failure in atomic mode + +```gwt +Given the backend is running and clean +And a submitted order "ord-batch-03" exists with items: +When I add multiple items to order "ord-batch-03" in batch: +Then the batch should have 1 rejection +And the batch should have 1 skipped +And the batch should have 0 successes +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/batch-operations.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/batch-operations.sdp.md index 63ca5be5..ce5a42bd 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/batch-operations.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/batch-operations.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: to add or remove multiple items from an order in a single batch so that I can efficiently manage order contents (test carrier: examples/order-management/tests/integration-features/orders/batch-operations.feature) +- actor: an order operator +- outcome: to add or remove multiple items from an order in a single batch so that I can efficiently manage order contents diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-001-cancel-draft-order-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-001-cancel-draft-order-and-verify-projection.sdp.md index bf5011ea..3aee7250 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-001-cancel-draft-order-and-verify-projection.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-001-cancel-draft-order-and-verify-projection.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Cancel draft order and verify projection" from examples/order-management/tests/integration-features/orders/cancel-order.feature +- outcome: Executable scenario: Cancel draft order and verify projection + +```gwt +Given the backend is running and clean +And a draft order "ord-cancel-01" exists +When I cancel order "ord-cancel-01" with reason "Changed my mind" +Then the command should succeed +And I wait for projections to process +And the order "ord-cancel-01" should exist with status "cancelled" +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-002-cancel-submitted-order-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-002-cancel-submitted-order-and-verify-projection.sdp.md index e717a8bf..c6fba30b 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-002-cancel-submitted-order-and-verify-projection.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-002-cancel-submitted-order-and-verify-projection.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Cancel submitted order and verify projection" from examples/order-management/tests/integration-features/orders/cancel-order.feature +- outcome: Executable scenario: Cancel submitted order and verify projection + +```gwt +Given the backend is running and clean +And a submitted order "ord-cancel-02" exists with items: +When I cancel order "ord-cancel-02" with reason "Found better price" +Then the command should succeed +And I wait for projections to process +And the order "ord-cancel-02" should exist with status "cancelled" +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-003-reject-cancelling-already-cancelled-order.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-003-reject-cancelling-already-cancelled-order.sdp.md index 236a10bf..728a6b76 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-003-reject-cancelling-already-cancelled-order.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-003-reject-cancelling-already-cancelled-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Reject cancelling already cancelled order" from examples/order-management/tests/integration-features/orders/cancel-order.feature +- outcome: Executable scenario: Reject cancelling already cancelled order + +```gwt +Given the backend is running and clean +And a cancelled order "ord-cancel-03" exists +When I cancel order "ord-cancel-03" with reason "Double cancel" +Then the command should be rejected with code "ORDER_ALREADY_CANCELLED" +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-004-cancel-confirmed-order-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-004-cancel-confirmed-order-and-verify-projection.sdp.md index ae0f7f3d..6ce4193f 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-004-cancel-confirmed-order-and-verify-projection.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-004-cancel-confirmed-order-and-verify-projection.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Cancel confirmed order and verify projection" from examples/order-management/tests/integration-features/orders/cancel-order.feature +- outcome: Executable scenario: Cancel confirmed order and verify projection + +```gwt +Given the backend is running and clean +And a confirmed order "ord-cancel-04" exists with items: +When I cancel order "ord-cancel-04" with reason "Changed mind after confirmation" +Then the command should succeed +And I wait for projections to process +And the order "ord-cancel-04" should exist with status "cancelled" +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-005-reservation-is-released-when-confirmed-order-is-cancelled.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-005-reservation-is-released-when-confirmed-order-is-cancelled.sdp.md index 40abe989..1de46f0f 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-005-reservation-is-released-when-confirmed-order-is-cancelled.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-005-reservation-is-released-when-confirmed-order-is-cancelled.sdp.md @@ -10,4 +10,20 @@ relations: ## Intent -- outcome: Executable scenario "Reservation is released when confirmed order is cancelled" from examples/order-management/tests/integration-features/orders/cancel-order.feature +- outcome: Executable scenario: Reservation is released when confirmed order is cancelled + +```gwt +Given the backend is running and clean +And a product "prod-cancel-res-01" exists with 100 available stock +And a draft order "ord-cancel-res-01" exists with items: +When I submit order "ord-cancel-res-01" and I cancel order "ord-cancel-res-01" with reason "Customer changed mind" +Then the command should succeed +And I wait for the saga to complete with timeout 60000 +And the order "ord-cancel-res-01" should have status "confirmed" +And the product "prod-cancel-res-01" should have 90 available and 10 reserved stock +And the command should succeed +And I wait for projections to process +And the order "ord-cancel-res-01" should have status "cancelled" +And the reservation for order "ord-cancel-res-01" should have status "released" +And the product "prod-cancel-res-01" should have 100 available and 0 reserved stock +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-006-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-006-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md index a032b480..47c5c5c2 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-006-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-006-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Cancelling draft order does not trigger reservation release" from examples/order-management/tests/integration-features/orders/cancel-order.feature +- outcome: Executable scenario: Cancelling draft order does not trigger reservation release + +```gwt +Given the backend is running and clean +And a draft order "ord-draft-pm-01" exists +When I cancel order "ord-draft-pm-01" with reason "Changed mind early" +Then the command should succeed +And I wait for projections to process +And the order "ord-draft-pm-01" should have status "cancelled" +And the order "ord-draft-pm-01" should have no reservation +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-007-cancelling-submitted-order-before-saga-completion-releases-pending-reserva.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-007-cancelling-submitted-order-before-saga-completion-releases-pending-reserva.sdp.md index c0bdb60d..0c0e1cf3 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-007-cancelling-submitted-order-before-saga-completion-releases-pending-reserva.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-007-cancelling-submitted-order-before-saga-completion-releases-pending-reserva.sdp.md @@ -10,4 +10,19 @@ relations: ## Intent -- outcome: Executable scenario "Cancelling submitted order before saga completion releases pending reservation" from examples/order-management/tests/integration-features/orders/cancel-order.feature +- outcome: Executable scenario: Cancelling submitted order before saga completion releases pending reservation + +```gwt +Given the backend is running and clean +And a product "prod-pending-01" exists with 100 available stock +And a draft order "ord-pending-01" exists with items: +When I submit order "ord-pending-01" and I cancel order "ord-pending-01" with reason "Changed mind before confirmation" +Then the command should succeed +And I wait for reservation to be created for order "ord-pending-01" +And the product "prod-pending-01" should have reserved stock +And the command should succeed +And I wait for projections to process +And the order "ord-pending-01" should have status "cancelled" +And the reservation for order "ord-pending-01" should have status "released" +And the product "prod-pending-01" should have 100 available and 0 reserved stock +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-008-pm-handles-already-released-reservation-gracefully.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-008-pm-handles-already-released-reservation-gracefully.sdp.md index 7ab118d6..549fe790 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-008-pm-handles-already-released-reservation-gracefully.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-008-pm-handles-already-released-reservation-gracefully.sdp.md @@ -10,4 +10,19 @@ relations: ## Intent -- outcome: Executable scenario "PM handles already released reservation gracefully" from examples/order-management/tests/integration-features/orders/cancel-order.feature +- outcome: Executable scenario: PM handles already released reservation gracefully + +```gwt +Given the backend is running and clean +And a product "prod-idemp-01" exists with 100 available stock +And a draft order "ord-idemp-01" exists with items: +When I submit order "ord-idemp-01" and I cancel order "ord-idemp-01" with reason "First cancel" +Then the command should succeed +And I wait for the saga to complete with timeout 60000 +And the order "ord-idemp-01" should have status "confirmed" +And the product "prod-idemp-01" should have 90 available and 10 reserved stock +And the command should succeed +And I wait for projections to process +And the reservation for order "ord-idemp-01" should have status "released" +And the product "prod-idemp-01" should have 100 available and 0 reserved stock +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-009-pm-skips-expired-reservation-when-order-is-cancelled.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-009-pm-skips-expired-reservation-when-order-is-cancelled.sdp.md index 60218d11..90fc610b 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-009-pm-skips-expired-reservation-when-order-is-cancelled.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-009-pm-skips-expired-reservation-when-order-is-cancelled.sdp.md @@ -10,4 +10,20 @@ relations: ## Intent -- outcome: Executable scenario "PM skips expired reservation when order is cancelled" from examples/order-management/tests/integration-features/orders/cancel-order.feature +- outcome: Executable scenario: PM skips expired reservation when order is cancelled + +```gwt +Given the backend is running and clean +And a product "prod-expired-01" exists with 100 available stock +And a draft order "ord-expired-01" exists with items: +When I submit order "ord-expired-01" and I cancel order "ord-expired-01" with reason "Cancel after expiration" +Then the command should succeed +And I wait for the saga to complete with timeout 60000 +And the order "ord-expired-01" should have status "confirmed" +And I set the reservation status to "expired" for order "ord-expired-01" +And the product "prod-expired-01" should have 90 available and 10 reserved stock +And the command should succeed +And I wait for projections to process +And the order "ord-expired-01" should have status "cancelled" +And the product "prod-expired-01" should have 90 available and 10 reserved stock +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.sdp.md index 0d8e8e7c..5a210fd1 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: to cancel my order so that I don't have to complete the purchase (test carrier: examples/order-management/tests/integration-features/orders/cancel-order.feature) +- actor: a customer +- outcome: to cancel my order so that I don't have to complete the purchase diff --git a/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-001-successfully-create-a-new-order-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-001-successfully-create-a-new-order-and-verify-projection.sdp.md index 6214b30c..04286289 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-001-successfully-create-a-new-order-and-verify-projection.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-001-successfully-create-a-new-order-and-verify-projection.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Successfully create a new order and verify projection" from examples/order-management/tests/integration-features/orders/create-order.feature +- outcome: Executable scenario: Successfully create a new order and verify projection + +```gwt +Given the backend is running and clean +When I create an order with: +Then the command should succeed +And I wait for projections to process +And the order "ord-int-01" should exist with status "draft" +And the order "ord-int-01" should have 0 items +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-002-reject-duplicate-order-id.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-002-reject-duplicate-order-id.sdp.md index 3e2250f0..f3a5bdb9 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-002-reject-duplicate-order-id.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-002-reject-duplicate-order-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Reject duplicate order ID" from examples/order-management/tests/integration-features/orders/create-order.feature +- outcome: Executable scenario: Reject duplicate order ID + +```gwt +Given the backend is running and clean +And an order "ord-int-02" exists +When I create an order with: +Then the command should be rejected with code "ORDER_ALREADY_EXISTS" +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md index 14143c8a..4bf578b3 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "CreateOrder is idempotent with same commandId" from examples/order-management/tests/integration-features/orders/create-order.feature +- outcome: Executable scenario: CreateOrder is idempotent with same commandId + +```gwt +Given the backend is running and clean +When I create an order with commandId "cmd-idem-01": and I repeat creating an order with commandId "cmd-idem-01": +Then the second command should return duplicate status +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/create-order.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/create-order.sdp.md index f6bf63e3..12b419e2 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/create-order.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/create-order.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: to create new orders so that I can purchase products (test carrier: examples/order-management/tests/integration-features/orders/create-order.feature) +- actor: a customer +- outcome: to create new orders so that I can purchase products diff --git a/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-001-query-orders-by-customer-id.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-001-query-orders-by-customer-id.sdp.md index 6b815548..842b4c35 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-001-query-orders-by-customer-id.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-001-query-orders-by-customer-id.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Query orders by customer ID" from examples/order-management/tests/integration-features/orders/query-orders.feature +- outcome: Executable scenario: Query orders by customer ID + +```gwt +Given the backend is running and clean +And customer "cust-query-01" has multiple orders: +And I wait for projections to process +When I query orders for customer "cust-query-01" +Then I should receive 2 orders +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-002-query-orders-by-status.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-002-query-orders-by-status.sdp.md index 12f0d61c..0b0e1ef6 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-002-query-orders-by-status.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-002-query-orders-by-status.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Query orders by status" from examples/order-management/tests/integration-features/orders/query-orders.feature +- outcome: Executable scenario: Query orders by status + +```gwt +Given the backend is running and clean +And orders with different statuses exist: +And I wait for projections to process +When I query orders with status "draft" and I query orders with status "submitted" +Then I should receive at least 1 order +And I should receive at least 1 order +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-003-remove-item-from-draft-order-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-003-remove-item-from-draft-order-and-verify-projection.sdp.md index 93119299..f4d3775e 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-003-remove-item-from-draft-order-and-verify-projection.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-003-remove-item-from-draft-order-and-verify-projection.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Remove item from draft order and verify projection" from examples/order-management/tests/integration-features/orders/query-orders.feature +- outcome: Executable scenario: Remove item from draft order and verify projection + +```gwt +Given the backend is running and clean +And a draft order "ord-remove-01" exists with items: +When I remove item "prod_001" from order "ord-remove-01" +Then the command should succeed +And I wait for projections to process +And the order "ord-remove-01" should have 1 items +And the order "ord-remove-01" total should be 25 +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/query-orders.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/query-orders.sdp.md index e42fc2de..e820da6d 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/query-orders.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/query-orders.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: to query orders by various criteria so that I can find and view order information (test carrier: examples/order-management/tests/integration-features/orders/query-orders.feature) +- actor: a user +- outcome: to query orders by various criteria so that I can find and view order information diff --git a/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-001-submit-order-with-items-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-001-submit-order-with-items-and-verify-projection.sdp.md index 19c3013a..187922ef 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-001-submit-order-with-items-and-verify-projection.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-001-submit-order-with-items-and-verify-projection.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Submit order with items and verify projection" from examples/order-management/tests/integration-features/orders/submit-order.feature +- outcome: Executable scenario: Submit order with items and verify projection + +```gwt +Given the backend is running and clean +And a draft order "ord-submit-01" exists with items: +When I submit order "ord-submit-01" +Then the command should succeed +And I wait for projections to process +And the order "ord-submit-01" should exist with status "submitted" +And the order "ord-submit-01" total should be 45 +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-002-reject-submitting-empty-order.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-002-reject-submitting-empty-order.sdp.md index 86a735c4..77b8a30d 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-002-reject-submitting-empty-order.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-002-reject-submitting-empty-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Reject submitting empty order" from examples/order-management/tests/integration-features/orders/submit-order.feature +- outcome: Executable scenario: Reject submitting empty order + +```gwt +Given the backend is running and clean +And an empty draft order "ord-submit-02" exists +When I submit order "ord-submit-02" +Then the command should be rejected with code "ORDER_HAS_NO_ITEMS" +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-003-reject-submitting-already-submitted-order.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-003-reject-submitting-already-submitted-order.sdp.md index aedf4fb8..18125ec1 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-003-reject-submitting-already-submitted-order.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-003-reject-submitting-already-submitted-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Reject submitting already submitted order" from examples/order-management/tests/integration-features/orders/submit-order.feature +- outcome: Executable scenario: Reject submitting already submitted order + +```gwt +Given the backend is running and clean +And a submitted order "ord-submit-03" exists with items: +When I submit order "ord-submit-03" +Then the command should be rejected with code "ORDER_NOT_IN_DRAFT" +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/submit-order.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/submit-order.sdp.md index 96017419..a780415e 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/submit-order.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/submit-order.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: to submit my order so that it can be processed for fulfillment (test carrier: examples/order-management/tests/integration-features/orders/submit-order.feature) +- actor: a customer +- outcome: to submit my order so that it can be processed for fulfillment diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-001-complete-saga-when-stock-is-available-for-single-item-order.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-001-complete-saga-when-stock-is-available-for-single-item-order.sdp.md index b82d7473..0675570d 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-001-complete-saga-when-stock-is-available-for-single-item-order.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-001-complete-saga-when-stock-is-available-for-single-item-order.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: Executable scenario "Complete saga when stock is available for single item order" from examples/order-management/tests/integration-features/sagas/order-fulfillment.feature +- outcome: Executable scenario: Complete saga when stock is available for single item order + +```gwt +Given the backend is running and clean +And a product "prod-saga-01" exists with 100 available stock +And a draft order "order-saga-01" exists with items: +When I submit order "order-saga-01" +Then the command should succeed +And I wait for the saga to complete with timeout 60000 +And the saga status should be "completed" +And the order "order-saga-01" should have status "confirmed" +And the reservation for order "order-saga-01" should have status "confirmed" +And the product "prod-saga-01" should have less than 100 available stock +``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-002-complete-saga-when-stock-is-available-for-multi-item-order.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-002-complete-saga-when-stock-is-available-for-multi-item-order.sdp.md index 288df5a1..4ae4b436 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-002-complete-saga-when-stock-is-available-for-multi-item-order.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-002-complete-saga-when-stock-is-available-for-multi-item-order.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "Complete saga when stock is available for multi-item order" from examples/order-management/tests/integration-features/sagas/order-fulfillment.feature +- outcome: Executable scenario: Complete saga when stock is available for multi-item order + +```gwt +Given the backend is running and clean +And a product "prod-saga-02a" exists with 50 available stock +And a product "prod-saga-02b" exists with 30 available stock +And a draft order "order-saga-02" exists with items: +When I submit order "order-saga-02" +Then the command should succeed +And I wait for the saga to complete with timeout 60000 +And the saga status should be "completed" +And the order "order-saga-02" should have status "confirmed" +``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-003-cancel-order-when-insufficient-stock-for-single-item.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-003-cancel-order-when-insufficient-stock-for-single-item.sdp.md index ad003628..43138fd8 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-003-cancel-order-when-insufficient-stock-for-single-item.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-003-cancel-order-when-insufficient-stock-for-single-item.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "Cancel order when insufficient stock for single item" from examples/order-management/tests/integration-features/sagas/order-fulfillment.feature +- outcome: Executable scenario: Cancel order when insufficient stock for single item + +```gwt +Given the backend is running and clean +And a product "prod-saga-03" exists with 3 available stock +And a draft order "order-saga-03" exists with items: +When I submit order "order-saga-03" +Then the command should succeed +And I wait for the saga to complete with timeout 60000 +And the saga status should be "completed" +And the order "order-saga-03" should have status "cancelled" +And the product "prod-saga-03" should have 3 available and 0 reserved stock +``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-004-cancel-order-when-one-item-in-multi-item-order-has-insufficient-stock.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-004-cancel-order-when-one-item-in-multi-item-order-has-insufficient-stock.sdp.md index e1637c65..9d810b63 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-004-cancel-order-when-one-item-in-multi-item-order-has-insufficient-stock.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-004-cancel-order-when-one-item-in-multi-item-order-has-insufficient-stock.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: Executable scenario "Cancel order when one item in multi-item order has insufficient stock" from examples/order-management/tests/integration-features/sagas/order-fulfillment.feature +- outcome: Executable scenario: Cancel order when one item in multi-item order has insufficient stock + +```gwt +Given the backend is running and clean +And a product "prod-saga-04a" exists with 100 available stock +And a product "prod-saga-04b" exists with 2 available stock +And a draft order "order-saga-04" exists with items: +When I submit order "order-saga-04" +Then the command should succeed +And I wait for the saga to complete with timeout 60000 +And the saga status should be "completed" +And the order "order-saga-04" should have status "cancelled" +And the product "prod-saga-04a" should have 100 available and 0 reserved stock +``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-005-saga-runs-only-once-per-order.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-005-saga-runs-only-once-per-order.sdp.md index 5a214192..98c85969 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-005-saga-runs-only-once-per-order.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-005-saga-runs-only-once-per-order.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "Saga runs only once per order" from examples/order-management/tests/integration-features/sagas/order-fulfillment.feature +- outcome: Executable scenario: Saga runs only once per order + +```gwt +Given the backend is running and clean +And a product "prod-saga-05" exists with 100 available stock +And a draft order "order-saga-05" exists with items: +When I submit order "order-saga-05" +Then the command should succeed +And I wait for the saga to complete with timeout 60000 +And the saga status should be "completed" +And only one saga should exist for order "order-saga-05" +And the reservation for order "order-saga-05" should have status "confirmed" +``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-006-saga-status-is-completed-after-successful-fulfillment.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-006-saga-status-is-completed-after-successful-fulfillment.sdp.md index feca56d0..9721b741 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-006-saga-status-is-completed-after-successful-fulfillment.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-006-saga-status-is-completed-after-successful-fulfillment.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Saga status is completed after successful fulfillment" from examples/order-management/tests/integration-features/sagas/order-fulfillment.feature +- outcome: Executable scenario: Saga status is completed after successful fulfillment + +```gwt +Given the backend is running and clean +And a product "prod-saga-06" exists with 100 available stock +And a draft order "order-saga-06" exists with items: +When I submit order "order-saga-06" +Then the command should succeed +And I wait for the saga to complete with timeout 60000 +And the saga status should be "completed" +And the saga should have a workflow ID +``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-007-saga-status-is-completed-after-compensation.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-007-saga-status-is-completed-after-compensation.sdp.md index e555f0a9..a64d5f4b 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-007-saga-status-is-completed-after-compensation.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-007-saga-status-is-completed-after-compensation.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Saga status is completed after compensation" from examples/order-management/tests/integration-features/sagas/order-fulfillment.feature +- outcome: Executable scenario: Saga status is completed after compensation + +```gwt +Given the backend is running and clean +And a product "prod-saga-07" exists with 2 available stock +And a draft order "order-saga-07" exists with items: +When I submit order "order-saga-07" +Then the command should succeed +And I wait for the saga to complete with timeout 60000 +And the saga status should be "completed" +``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-008-saga-has-completed-at-timestamp-after-completion.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-008-saga-has-completed-at-timestamp-after-completion.sdp.md index e56bab07..95dfe023 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-008-saga-has-completed-at-timestamp-after-completion.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-008-saga-has-completed-at-timestamp-after-completion.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Saga has completedAt timestamp after completion" from examples/order-management/tests/integration-features/sagas/order-fulfillment.feature +- outcome: Executable scenario: Saga has completedAt timestamp after completion + +```gwt +Given the backend is running and clean +And a product "prod-saga-08" exists with 100 available stock +And a draft order "order-saga-08" exists with items: +When I submit order "order-saga-08" +Then the command should succeed +And I wait for the saga to complete with timeout 60000 +And the saga status should be "completed" +And the saga should have a completedAt timestamp +``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.sdp.md index b0ff99a0..ce008fae 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: to coordinate order fulfillment across bounded contexts so that orders are confirmed when stock is available and cancelled when not (test carrier: examples/order-management/tests/integration-features/sagas/order-fulfillment.feature) +- actor: an order management system +- outcome: to coordinate order fulfillment across bounded contexts so that orders are confirmed when stock is available and cancelled when not diff --git a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-001-get-saga-details-returns-workflow-id-for-completed-saga.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-001-get-saga-details-returns-workflow-id-for-completed-saga.sdp.md index 94547b17..37391efb 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-001-get-saga-details-returns-workflow-id-for-completed-saga.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-001-get-saga-details-returns-workflow-id-for-completed-saga.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "Get saga details returns workflow ID for completed saga" from examples/order-management/tests/integration-features/sagas/saga-admin.feature +- outcome: Executable scenario: Get saga details returns workflow ID for completed saga + +```gwt +Given the backend is running and clean +And a product "prod-admin-01" exists with 100 available stock +And a draft order "order-admin-01" exists with items: +And I submit order "order-admin-01" +And I wait for the saga to complete with timeout 60000 +When I get saga details for "OrderFulfillment" saga with ID "order-admin-01" +Then the saga details should not be null +And the saga details should have status "completed" +And the saga details should have a workflow ID +``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-002-get-saga-steps-returns-step-history.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-002-get-saga-steps-returns-step-history.sdp.md index ac638a0d..f7ce4ffd 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-002-get-saga-steps-returns-step-history.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-002-get-saga-steps-returns-step-history.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "Get saga steps returns step history" from examples/order-management/tests/integration-features/sagas/saga-admin.feature +- outcome: Executable scenario: Get saga steps returns step history + +```gwt +Given the backend is running and clean +And a product "prod-admin-02" exists with 20 available stock +And a draft order "order-admin-02" exists with items: +And I submit order "order-admin-02" +And I wait for the saga to complete with timeout 60000 +When I get saga steps for "OrderFulfillment" saga with ID "order-admin-02" +Then the saga steps should not be null +And the saga steps should have saga ID "order-admin-02" +And the saga steps should have a workflow ID +``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-003-get-saga-steps-returns-null-for-non-existent-saga.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-003-get-saga-steps-returns-null-for-non-existent-saga.sdp.md index c4c3d4c4..223725c8 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-003-get-saga-steps-returns-null-for-non-existent-saga.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-003-get-saga-steps-returns-null-for-non-existent-saga.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Get saga steps returns null for non-existent saga" from examples/order-management/tests/integration-features/sagas/saga-admin.feature +- outcome: Executable scenario: Get saga steps returns null for non-existent saga + +```gwt +Given the backend is running and clean +When I get saga steps for "OrderFulfillment" saga with ID "nonexistent" +Then the saga steps should be null +``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-004-cancel-completed-saga-returns-invalid-state.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-004-cancel-completed-saga-returns-invalid-state.sdp.md index 039212ad..1c58782f 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-004-cancel-completed-saga-returns-invalid-state.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-004-cancel-completed-saga-returns-invalid-state.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Cancel completed saga returns invalid_state" from examples/order-management/tests/integration-features/sagas/saga-admin.feature +- outcome: Executable scenario: Cancel completed saga returns invalid_state + +```gwt +Given the backend is running and clean +And a product "prod-admin-03" exists with 100 available stock +And a draft order "order-admin-03" exists with items: +And I submit order "order-admin-03" +And I wait for the saga to complete with timeout 60000 +When I cancel the "OrderFulfillment" saga with ID "order-admin-03" with reason "Admin cancelled for testing" +Then the cancel result status should be "invalid_state" +``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-005-cancel-non-existent-saga-returns-not-found.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-005-cancel-non-existent-saga-returns-not-found.sdp.md index d825075d..281f9fe5 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-005-cancel-non-existent-saga-returns-not-found.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-005-cancel-non-existent-saga-returns-not-found.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Cancel non-existent saga returns not_found" from examples/order-management/tests/integration-features/sagas/saga-admin.feature +- outcome: Executable scenario: Cancel non-existent saga returns not_found + +```gwt +Given the backend is running and clean +When I cancel the "OrderFulfillment" saga with ID "nonexistent" with reason "Should not work" +Then the cancel result status should be "not_found" +``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-006-cleanup-completed-saga-workflow.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-006-cleanup-completed-saga-workflow.sdp.md index c67d14bc..ed4841b3 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-006-cleanup-completed-saga-workflow.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-006-cleanup-completed-saga-workflow.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Cleanup completed saga workflow" from examples/order-management/tests/integration-features/sagas/saga-admin.feature +- outcome: Executable scenario: Cleanup completed saga workflow + +```gwt +Given the backend is running and clean +And a product "prod-admin-04" exists with 100 available stock +And a draft order "order-admin-04" exists with items: +And I submit order "order-admin-04" +And I wait for the saga to complete with timeout 60000 +When I cleanup the "OrderFulfillment" saga workflow with ID "order-admin-04" +Then the cleanup result status should be one of "cleaned", "cleanup_failed" +``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.sdp.md index 31949476..762f17ee 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: to manage and monitor sagas so that I can troubleshoot and maintain saga workflows (test carrier: examples/order-management/tests/integration-features/sagas/saga-admin.feature) +- actor: a system administrator +- outcome: to manage and monitor sagas so that I can troubleshoot and maintain saga workflows diff --git a/specs/behavior/order-management/timeline/phase-00-initialization.sdp.md b/specs/behavior/order-management/timeline/phase-00-initialization.sdp.md index 503e37a2..9f04b284 100644 --- a/specs/behavior/order-management/timeline/phase-00-initialization.sdp.md +++ b/specs/behavior/order-management/timeline/phase-00-initialization.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Set up repository structure and development tooling. Established monorepo structure with pnpm workspaces, configured development tooling (ESLint, Prettier, TypeScript), and initialized core package structure. Created initial documentation framework and CI/CD pipeline scaffolding. (test carrier: examples/order-management/tests/features/timeline/phase-00-initialization.feature) +- outcome: Project Initialization diff --git a/specs/behavior/order-management/timeline/phase-01-core-infrastructure.sdp.md b/specs/behavior/order-management/timeline/phase-01-core-infrastructure.sdp.md index 72b1c3ad..57d53f5b 100644 --- a/specs/behavior/order-management/timeline/phase-01-core-infrastructure.sdp.md +++ b/specs/behavior/order-management/timeline/phase-01-core-infrastructure.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Build shared types, schemas, and utilities for event sourcing platform. Delivered event and command abstractions with Zod validation, UUID v7 ID generation, and CMS infrastructure. Includes comprehensive type safety, validation framework, and projection support. Implemented in deps/libar-dev-packages/packages/platform/core across 4 sessions. (test carrier: examples/order-management/tests/features/timeline/phase-01-core-infrastructure.feature) +- outcome: Core Infrastructure diff --git a/specs/behavior/order-management/timeline/phase-02-event-store-orchestration.sdp.md b/specs/behavior/order-management/timeline/phase-02-event-store-orchestration.sdp.md index 0fdfc3f1..31d112fb 100644 --- a/specs/behavior/order-management/timeline/phase-02-event-store-orchestration.sdp.md +++ b/specs/behavior/order-management/timeline/phase-02-event-store-orchestration.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Centralized event storage with orchestration infrastructure for reliable projections. Delivered stream-based event persistence with optimistic concurrency control, atomic globalPosition allocation, and comprehensive database schema. Integrated Workpool for projection processing, Action Retrier for external APIs, and Workflow for saga execution. (test carrier: examples/order-management/tests/features/timeline/phase-02-event-store-orchestration.feature) +- outcome: Event Store and Orchestration Infrastructure diff --git a/specs/behavior/order-management/timeline/phase-03-command-bus.sdp.md b/specs/behavior/order-management/timeline/phase-03-command-bus.sdp.md index 025b0864..c1b2060c 100644 --- a/specs/behavior/order-management/timeline/phase-03-command-bus.sdp.md +++ b/specs/behavior/order-management/timeline/phase-03-command-bus.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Centralized command routing with middleware and idempotency. Delivered synchronous and asynchronous command dispatch with middleware pipeline, idempotent command execution via commandId deduplication, and atomic status transitions. Includes command result persistence, event correlation tracking, and CommandOrchestrator (test carrier: examples/order-management/tests/features/timeline/phase-03-command-bus.feature) +- outcome: Command Bus Component diff --git a/specs/behavior/order-management/timeline/phase-04-orders-bc.sdp.md b/specs/behavior/order-management/timeline/phase-04-orders-bc.sdp.md index f1a5bd9e..e285edc3 100644 --- a/specs/behavior/order-management/timeline/phase-04-orders-bc.sdp.md +++ b/specs/behavior/order-management/timeline/phase-04-orders-bc.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Complete reference implementation demonstrating all DDD/ES/CQRS patterns. Delivered full Orders bounded context with domain model, events, commands, invariants, projections, and saga infrastructure. Implemented OrderCMS with lazy upcast pattern, comprehensive OrderStatus state machine, and OrderSummary projections with globalPosition (test carrier: examples/order-management/tests/features/timeline/phase-04-orders-bc.feature) +- outcome: Orders Bounded Context diff --git a/specs/behavior/order-management/timeline/phase-05-inventory-bc.sdp.md b/specs/behavior/order-management/timeline/phase-05-inventory-bc.sdp.md index 69f1598f..b6128575 100644 --- a/specs/behavior/order-management/timeline/phase-05-inventory-bc.sdp.md +++ b/specs/behavior/order-management/timeline/phase-05-inventory-bc.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Multi-aggregate inventory management with stock tracking and reservations. Delivered Inventory bounded context with separate Product and Reservation aggregates, demonstrating the multi-aggregate pattern within a single context. Implemented atomic multi-item reservations with all-or-nothing semantics for saga compensation support. (test carrier: examples/order-management/tests/features/timeline/phase-05-inventory-bc.feature) +- outcome: Inventory Bounded Context diff --git a/specs/behavior/order-management/timeline/phase-06-cross-context-integration.sdp.md b/specs/behavior/order-management/timeline/phase-06-cross-context-integration.sdp.md index 7ca61b79..e8ad748a 100644 --- a/specs/behavior/order-management/timeline/phase-06-cross-context-integration.sdp.md +++ b/specs/behavior/order-management/timeline/phase-06-cross-context-integration.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Saga-based coordination between Orders and Inventory bounded contexts. Delivered OrderFulfillment saga coordinating Orders and Inventory contexts via durable workflow with automatic compensation. Implemented event-triggered saga routing, cross-context projections, and workflow status tracking via onComplete callbacks. (test carrier: examples/order-management/tests/features/timeline/phase-06-cross-context-integration.feature) +- outcome: Cross-Context Integration diff --git a/specs/behavior/order-management/timeline/phase-07-projection-engine.sdp.md b/specs/behavior/order-management/timeline/phase-07-projection-engine.sdp.md index 170e865d..1942ddcd 100644 --- a/specs/behavior/order-management/timeline/phase-07-projection-engine.sdp.md +++ b/specs/behavior/order-management/timeline/phase-07-projection-engine.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Centralized projection management beyond Workpool capabilities. This phase was evaluated and deferred. Workpool (ADR-015) provides sufficient projection processing for current needs. The dedicated engine may be valuable for advanced subscription patterns, complex multi-projection coordination, (test carrier: examples/order-management/tests/features/timeline/phase-07-projection-engine.feature) +- outcome: Projection Engine (Deferred) diff --git a/specs/behavior/order-management/timeline/phase-08-documentation-polish.sdp.md b/specs/behavior/order-management/timeline/phase-08-documentation-polish.sdp.md index 4704450a..52249ee8 100644 --- a/specs/behavior/order-management/timeline/phase-08-documentation-polish.sdp.md +++ b/specs/behavior/order-management/timeline/phase-08-documentation-polish.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Knowledge management systems and frontend MVP with comprehensive testing. Delivered documentation generation infrastructure with @libar-dev/delivery-process package, comprehensive pattern registry, and DDD fundamentals skill. Built frontend MVP with React 19 + Next.js demonstrating real-time Convex features. Established multi-environment (test carrier: examples/order-management/tests/features/timeline/phase-08-documentation-polish.feature) +- outcome: Documentation & Knowledge Infrastructure diff --git a/specs/behavior/order-management/timeline/phase-09-event-system.sdp.md b/specs/behavior/order-management/timeline/phase-09-event-system.sdp.md index d8ffd79e..ec7533c6 100644 --- a/specs/behavior/order-management/timeline/phase-09-event-system.sdp.md +++ b/specs/behavior/order-management/timeline/phase-09-event-system.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Advanced event categorization, upcasting, and correlation tracking. Delivered comprehensive event system with 4-tier type taxonomy (domain, integration, trigger, fat) and schema factories for each category. Implemented sequential event upcasting pipeline with multi-hop migrations for schema evolution. Built correlation (test carrier: examples/order-management/tests/features/timeline/phase-09-event-system.feature) +- outcome: Event System Enhancement diff --git a/specs/behavior/order-management/timeline/phase-10-command-system.sdp.md b/specs/behavior/order-management/timeline/phase-10-command-system.sdp.md index a95a7d7b..aeaec93a 100644 --- a/specs/behavior/order-management/timeline/phase-10-command-system.sdp.md +++ b/specs/behavior/order-management/timeline/phase-10-command-system.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Command categorization, registry, middleware pipeline, and batch execution. Delivered comprehensive command infrastructure with 4-tier categorization taxonomy (aggregate, process, system, batch) and enforced verb-first naming policy. Implemented CommandRegistry for centralized command lookup and introspection. Built extensible (test carrier: examples/order-management/tests/features/timeline/phase-10-command-system.feature) +- outcome: Command System Enhancement diff --git a/specs/behavior/order-management/timeline/phase-11-bc-formalization.sdp.md b/specs/behavior/order-management/timeline/phase-11-bc-formalization.sdp.md index 019b2abe..e76256f3 100644 --- a/specs/behavior/order-management/timeline/phase-11-bc-formalization.sdp.md +++ b/specs/behavior/order-management/timeline/phase-11-bc-formalization.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Contract-based bounded context infrastructure with declarative invariants. Delivered comprehensive bounded context infrastructure with @convex-es/bounded-context package (pure TypeScript, zero Convex dependencies). Implemented DualWriteContextContract for defining commands, events, CMS types, and error codes with full type inference. (test carrier: examples/order-management/tests/features/timeline/phase-11-bc-formalization.feature) +- outcome: Bounded Context Formalization diff --git a/specs/behavior/order-management/timeline/phase-12-repository-read-model.sdp.md b/specs/behavior/order-management/timeline/phase-12-repository-read-model.sdp.md index 37e6ae66..162a2e64 100644 --- a/specs/behavior/order-management/timeline/phase-12-repository-read-model.sdp.md +++ b/specs/behavior/order-management/timeline/phase-12-repository-read-model.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Projection registry, lifecycle management, and query abstraction layer. Delivered comprehensive read model infrastructure with projection registry system supporting primary, secondary, and cross-context projections. Implemented projection lifecycle state machine with 10 valid transitions (active, rebuilding, paused, error). (test carrier: examples/order-management/tests/features/timeline/phase-12-repository-read-model.feature) +- outcome: Repository & Read Model Infrastructure diff --git a/specs/behavior/order-management/timeline/phase-13-process-manager.sdp.md b/specs/behavior/order-management/timeline/phase-13-process-manager.sdp.md index 396766ed..32e673ad 100644 --- a/specs/behavior/order-management/timeline/phase-13-process-manager.sdp.md +++ b/specs/behavior/order-management/timeline/phase-13-process-manager.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Event-triggered process managers with idempotent processing and logging infrastructure. Delivered comprehensive process manager infrastructure with event/time/hybrid trigger support. Implemented PM lifecycle state machine with 6 valid transitions (idle → processing → completed/failed). Built checkpoint-based idempotent processing with (test carrier: examples/order-management/tests/features/timeline/phase-13-process-manager.feature) +- outcome: Process Manager Abstraction diff --git a/specs/behavior/order-management/timeline/phase-14-decider-formalization.sdp.md b/specs/behavior/order-management/timeline/phase-14-decider-formalization.sdp.md index 73ca511d..f74ac7df 100644 --- a/specs/behavior/order-management/timeline/phase-14-decider-formalization.sdp.md +++ b/specs/behavior/order-management/timeline/phase-14-decider-formalization.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Pure decide functions extracted from command handlers for testable domain logic. Extracted pure `decide(state, command) → events` functions from all 12 command handlers (6 orders + 6 inventory), establishing the Decider pattern as foundation for aggregate-less architecture. Implemented FSM module for explicit state machine (test carrier: examples/order-management/tests/features/timeline/phase-14-decider-formalization.feature) +- outcome: Decider Formalization diff --git a/specs/behavior/order-management/timeline/phase-15-projection-categories.sdp.md b/specs/behavior/order-management/timeline/phase-15-projection-categories.sdp.md index ed477267..0bd8214a 100644 --- a/specs/behavior/order-management/timeline/phase-15-projection-categories.sdp.md +++ b/specs/behavior/order-management/timeline/phase-15-projection-categories.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Formalize projection taxonomy with explicit Logic/View/Reporting/Integration categories. Introduce explicit projection categorization to distinguish between minimal command validation data (Logic), denormalized UI queries (View), analytics aggregations (Reporting), and cross-context synchronization (Integration). Update all existing (test carrier: examples/order-management/tests/features/timeline/phase-15-projection-categories.feature) +- outcome: Projection Categories diff --git a/specs/behavior/order-management/timeline/phase-16-dcb.sdp.md b/specs/behavior/order-management/timeline/phase-16-dcb.sdp.md index 13d6ba65..b00e1e01 100644 --- a/specs/behavior/order-management/timeline/phase-16-dcb.sdp.md +++ b/specs/behavior/order-management/timeline/phase-16-dcb.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Enable cross-entity invariants within bounded contexts via scope-based OCC. Introduce Dynamic Consistency Boundaries (DCB) for enforcing invariants spanning multiple aggregates within a single bounded context. Implement dcbScopes table in Event Store for scope-level optimistic concurrency control. Create executeWithDCB (test carrier: examples/order-management/tests/features/timeline/phase-16-dcb.feature) +- outcome: Dynamic Consistency Boundaries diff --git a/specs/behavior/order-management/timeline/phase-17-reactive-projections.sdp.md b/specs/behavior/order-management/timeline/phase-17-reactive-projections.sdp.md index 0da7a7ce..ae830c33 100644 --- a/specs/behavior/order-management/timeline/phase-17-reactive-projections.sdp.md +++ b/specs/behavior/order-management/timeline/phase-17-reactive-projections.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Hybrid Workpool + reactive model for 10-50ms UI updates without polling. Implement reactive layer on top of existing Workpool-based projections to enable near-instant UI updates (10-50ms) without client polling. Create hybrid architecture where Workpool ensures durability while reactive pushes provide speed. Build (test carrier: examples/order-management/tests/features/timeline/phase-17-reactive-projections.feature) +- outcome: Reactive Projections diff --git a/specs/behavior/order-management/timeline/phase-18-production-hardening.sdp.md b/specs/behavior/order-management/timeline/phase-18-production-hardening.sdp.md index 3b946d5f..9ac58b50 100644 --- a/specs/behavior/order-management/timeline/phase-18-production-hardening.sdp.md +++ b/specs/behavior/order-management/timeline/phase-18-production-hardening.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Production-ready observability, monitoring, and operational tooling. Comprehensive production hardening including advanced observability, monitoring dashboards, error tracking, performance profiling, and operational tooling. Build on existing logging infrastructure (Phase 13) with metrics collection, distributed (test carrier: examples/order-management/tests/features/timeline/phase-18-production-hardening.feature) +- outcome: Production Hardening diff --git a/specs/behavior/order-management/timeline/phase-19-testing-infrastructure.sdp.md b/specs/behavior/order-management/timeline/phase-19-testing-infrastructure.sdp.md index 7c6fc1ae..b5b9b90e 100644 --- a/specs/behavior/order-management/timeline/phase-19-testing-infrastructure.sdp.md +++ b/specs/behavior/order-management/timeline/phase-19-testing-infrastructure.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Comprehensive BDD migration with Gherkin feature files for all domain logic. Complete BDD migration for platform packages and remaining application code. Fix integration test duplicate step issue. Establish patterns for testing Deciders (pure Given/When/Then), handlers (with Docker), projections, and sagas. Create (test carrier: examples/order-management/tests/features/timeline/phase-19-testing-infrastructure.feature) +- outcome: Testing Infrastructure diff --git a/specs/behavior/order-management/timeline/phase-20-service-independence.sdp.md b/specs/behavior/order-management/timeline/phase-20-service-independence.sdp.md index 82f17974..6261d4d7 100644 --- a/specs/behavior/order-management/timeline/phase-20-service-independence.sdp.md +++ b/specs/behavior/order-management/timeline/phase-20-service-independence.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Enable bounded contexts to operate independently via ECST/Fat Events and Reservation Pattern. Implement Event-Carried State Transfer (ECST) with Fat Events carrying full context for downstream consumers, eliminating query dependencies between bounded contexts. Create Reservation Pattern for optimistic uniqueness constraints (reserve/confirm/release (test carrier: examples/order-management/tests/features/timeline/phase-20-service-independence.feature) +- outcome: Service Independence diff --git a/specs/behavior/order-management/timeline/phase-21-integration-patterns.sdp.md b/specs/behavior/order-management/timeline/phase-21-integration-patterns.sdp.md index 5927428c..4b217e74 100644 --- a/specs/behavior/order-management/timeline/phase-21-integration-patterns.sdp.md +++ b/specs/behavior/order-management/timeline/phase-21-integration-patterns.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Formalize cross-context communication with Context Map, Published Language, and ACL. Formalize DDD strategic patterns for cross-context integration. Document Context Map showing Orders ↔ Inventory relationship (Customer/Supplier, Conformist patterns). Build Published Language Schema Registry for integration event versioning with (test carrier: examples/order-management/tests/features/timeline/phase-21-integration-patterns.feature) +- outcome: Integration Patterns diff --git a/specs/behavior/order-management/timeline/phase-22-agent-as-bc.sdp.md b/specs/behavior/order-management/timeline/phase-22-agent-as-bc.sdp.md index 97c28028..3cd0cede 100644 --- a/specs/behavior/order-management/timeline/phase-22-agent-as-bc.sdp.md +++ b/specs/behavior/order-management/timeline/phase-22-agent-as-bc.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Demonstrate AI agent as event reactor pattern with autonomous command emission. Implement AI agent as first-class bounded context subscribing to domain events via EventBus and emitting commands autonomously. Build Agent BC example demonstrating pattern detection (e.g., order submission → inventory reservation) with autonomous (test carrier: examples/order-management/tests/features/timeline/phase-22-agent-as-bc.feature) +- outcome: Agent as Bounded Context diff --git a/specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-001-all-feature-files-pass-schema-validation.sdp.md b/specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-001-all-feature-files-pass-schema-validation.sdp.md index 31f78f7d..8882b365 100644 --- a/specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-001-all-feature-files-pass-schema-validation.sdp.md +++ b/specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-001-all-feature-files-pass-schema-validation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "All feature files pass schema validation" from examples/order-management/tests/features/timeline/phase-23-process-setup.feature +- outcome: Executable scenario: All feature files pass schema validation + +```gwt +Given the following deliverables: +And all timeline feature files have Background: Deliverables +When running docs:patterns command +Then no schema validation failures occur +And no parsing warnings appear +``` diff --git a/specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-002-roadmap-md-reflects-planned-phases.sdp.md b/specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-002-roadmap-md-reflects-planned-phases.sdp.md index d1f97ecf..aef0e8ab 100644 --- a/specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-002-roadmap-md-reflects-planned-phases.sdp.md +++ b/specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-002-roadmap-md-reflects-planned-phases.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "ROADMAP.md reflects planned phases" from examples/order-management/tests/features/timeline/phase-23-process-setup.feature +- outcome: Executable scenario: ROADMAP.md reflects planned phases + +```gwt +Given the following deliverables: +And docs:roadmap command is configured +When running pnpm docs:roadmap +Then docs-living/ROADMAP.md is generated +And it shows phases 15-22 as planned +And it shows dependency relationships +``` diff --git a/specs/behavior/order-management/timeline/phase-23-process-setup.sdp.md b/specs/behavior/order-management/timeline/phase-23-process-setup.sdp.md index 2d5adf28..b2a8c896 100644 --- a/specs/behavior/order-management/timeline/phase-23-process-setup.sdp.md +++ b/specs/behavior/order-management/timeline/phase-23-process-setup.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent -- outcome: Configure delivery process at monorepo level for automated documentation. **Problem:** - 23 feature files exist but lack Background: Deliverables DataTables - Schema validation fails on 9 files, warnings on others (test carrier: examples/order-management/tests/features/timeline/phase-23-process-setup.feature) +- outcome: - 23 feature files exist but lack Background: Deliverables DataTables - Schema validation fails on 9 files, warnings on others - Manual documentation in docs/project-management/ not connected to process - No ROADMAP.md, SESSION-CONTEXT.md, REMAINING-WORK.md generators wired - Generator configs exist in package but not exposed at monorepo level +- problem: - 23 feature files exist but lack Background: Deliverables DataTables - Schema validation fails on 9 files, warnings on others - Manual documentation in docs/project-management/ not connected to process - No ROADMAP.md, SESSION-CONTEXT.md, REMAINING-WORK.md generators wired - Generator configs exist in package but not exposed at monorepo level +- value: - Add Background: Deliverables DataTables to all 23 existing feature files - Wire existing generator configs to monorepo-level commands - Update root package.json with new docs:* commands - Ensure generators produce expected output with no validation errors diff --git a/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-001-historical-deliverables-are-preserved.sdp.md b/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-001-historical-deliverables-are-preserved.sdp.md index d2416757..8678c4fa 100644 --- a/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-001-historical-deliverables-are-preserved.sdp.md +++ b/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-001-historical-deliverables-are-preserved.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Historical deliverables are preserved" from examples/order-management/tests/features/timeline/phase-24-old-roadmap-porting.feature +- outcome: Executable scenario: Historical deliverables are preserved + +```gwt +Given the following deliverables: +And old roadmap phases have task tables +When porting to feature file DataTables +Then each task becomes a deliverable row +And Location matches actual code paths +And Release links to CHANGELOG entries +``` diff --git a/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-002-incomplete-phases-deferred-appropriately.sdp.md b/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-002-incomplete-phases-deferred-appropriately.sdp.md index dc7272b6..586c79b1 100644 --- a/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-002-incomplete-phases-deferred-appropriately.sdp.md +++ b/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-002-incomplete-phases-deferred-appropriately.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Incomplete phases deferred appropriately" from examples/order-management/tests/features/timeline/phase-24-old-roadmap-porting.feature +- outcome: Executable scenario: Incomplete phases deferred appropriately + +```gwt +Given the following deliverables: +And Phase 7 (Projection Engine) is deferred +And Phase 11B has incomplete sessions +When reviewing at pivot midpoint +Then assess whether to port based on architecture needs +And document decision in ADR +``` diff --git a/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.sdp.md b/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.sdp.md index c68c341d..c09c7c18 100644 --- a/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.sdp.md +++ b/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent -- outcome: Port completed milestones from old roadmap to feature file DataTables. **Problem:** - Rich detail in docs/project-management/roadmap/*.md (23 files) - Tasks, deliverables, verification steps not captured in feature files (test carrier: examples/order-management/tests/features/timeline/phase-24-old-roadmap-porting.feature) +- outcome: - Rich detail in docs/project-management/roadmap/*.md (23 files) - Tasks, deliverables, verification steps not captured in feature files - Historical context needed for future work and pattern understanding - Manual docs will drift without connection to process +- problem: - Rich detail in docs/project-management/roadmap/*.md (23 files) - Tasks, deliverables, verification steps not captured in feature files - Historical context needed for future work and pattern understanding - Manual docs will drift without connection to process +- value: - Extract deliverables from each completed phase's .md file - Populate DataTables with Location, Tests, Release info - Link to CHANGELOG entries for version history - Mark manual roadmap docs as deprecated once ported diff --git a/specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-001-ad-rs-are-accessible-through-generated-docs.sdp.md b/specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-001-ad-rs-are-accessible-through-generated-docs.sdp.md index f56bbc53..e2c2fc0f 100644 --- a/specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-001-ad-rs-are-accessible-through-generated-docs.sdp.md +++ b/specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-001-ad-rs-are-accessible-through-generated-docs.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "ADRs are accessible through generated docs" from examples/order-management/tests/features/timeline/phase-25-adr-porting.feature +- outcome: Executable scenario: ADRs are accessible through generated docs + +```gwt +Given the following deliverables: +And ADRs have been reviewed and ported +When running pnpm docs:adrs +Then docs-living/DECISIONS.md is generated +And it categorizes ADRs by domain (event-sourcing, projections, commands, etc.) +And superseded ADRs are clearly marked +``` diff --git a/specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-002-adr-validity-is-assessed-against-new-roadmap.sdp.md b/specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-002-adr-validity-is-assessed-against-new-roadmap.sdp.md index 5b947030..be104c0c 100644 --- a/specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-002-adr-validity-is-assessed-against-new-roadmap.sdp.md +++ b/specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-002-adr-validity-is-assessed-against-new-roadmap.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "ADR validity is assessed against new roadmap" from examples/order-management/tests/features/timeline/phase-25-adr-porting.feature +- outcome: Executable scenario: ADR validity is assessed against new roadmap + +```gwt +Given the following deliverables: +And the aggregate-less pivot changes architecture patterns +When reviewing each ADR +Then ADRs conflicting with new patterns are marked superseded +And valid ADRs reference which roadmap phases they support +``` diff --git a/specs/behavior/order-management/timeline/phase-25-adr-porting.sdp.md b/specs/behavior/order-management/timeline/phase-25-adr-porting.sdp.md index a75d6de3..9d710972 100644 --- a/specs/behavior/order-management/timeline/phase-25-adr-porting.sdp.md +++ b/specs/behavior/order-management/timeline/phase-25-adr-porting.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent -- outcome: Port Architecture Decision Records from manual docs to generated documentation. **Problem:** - 33 ADRs exist in docs/architecture/decisions/ as manual .md files - ADRs are disconnected from delivery process (test carrier: examples/order-management/tests/features/timeline/phase-25-adr-porting.feature) +- outcome: - 33 ADRs exist in docs/architecture/decisions/ as manual .md files - ADRs are disconnected from delivery process - Some ADRs may be outdated or superseded by aggregate-less pivot - No generated DECISIONS.md artifact for architectural overview +- problem: - 33 ADRs exist in docs/architecture/decisions/ as manual .md files - ADRs are disconnected from delivery process - Some ADRs may be outdated or superseded by aggregate-less pivot - No generated DECISIONS.md artifact for architectural overview +- value: - Review each ADR against new aggregate-less roadmap for validity - Convert valid ADRs to .feature files with @architect-decision tag - Archive or supersede outdated ADRs with proper annotation - Wire docs:adrs generator to monorepo-level commands - Generate DECISIONS.md with categorized ADR index diff --git a/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-001-planning-sessions-have-defined-outputs.sdp.md b/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-001-planning-sessions-have-defined-outputs.sdp.md index 33538292..81438c58 100644 --- a/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-001-planning-sessions-have-defined-outputs.sdp.md +++ b/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-001-planning-sessions-have-defined-outputs.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Planning sessions have defined outputs" from examples/order-management/tests/features/timeline/phase-26-workflow-configuration.feature +- outcome: Executable scenario: Planning sessions have defined outputs + +```gwt +Given the following deliverables: +And workflow configuration is complete +When starting a planning session +Then the expected artifacts for that workflow type are clear +And session templates guide what to produce +``` diff --git a/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-002-non-code-sessions-are-supported.sdp.md b/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-002-non-code-sessions-are-supported.sdp.md index e550e4e7..f564fe70 100644 --- a/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-002-non-code-sessions-are-supported.sdp.md +++ b/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-002-non-code-sessions-are-supported.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Non-code sessions are supported" from examples/order-management/tests/features/timeline/phase-26-workflow-configuration.feature +- outcome: Executable scenario: Non-code sessions are supported + +```gwt +Given the following deliverables: +And the delivery process supports multiple workflows +When running an Analysis or Design session +Then the process accommodates investigation and documentation +And does not require code commits +``` diff --git a/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-003-configuration-inheritance-works.sdp.md b/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-003-configuration-inheritance-works.sdp.md index 5027a0ee..2ecbbe2c 100644 --- a/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-003-configuration-inheritance-works.sdp.md +++ b/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-003-configuration-inheritance-works.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Configuration inheritance works" from examples/order-management/tests/features/timeline/phase-26-workflow-configuration.feature +- outcome: Executable scenario: Configuration inheritance works + +```gwt +Given the following deliverables: +And universal process definitions exist in package catalogue/ +When configuring monorepo instance in delivery-process/ +Then instance can reference package definitions by name +And instance can extend/override with repo-specific customizations +And templates can be included in session prompts +``` diff --git a/specs/behavior/order-management/timeline/phase-26-workflow-configuration.sdp.md b/specs/behavior/order-management/timeline/phase-26-workflow-configuration.sdp.md index 64559177..c548f41c 100644 --- a/specs/behavior/order-management/timeline/phase-26-workflow-configuration.sdp.md +++ b/specs/behavior/order-management/timeline/phase-26-workflow-configuration.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent -- outcome: Configure delivery workflows at monorepo level to define session outputs. **Problem:** - Base process specs (PROCESS_MODEL.md, PROCESS_SETUP.md) define workflows - Monorepo needs customized workflow configuration for planning sessions (test carrier: examples/order-management/tests/features/timeline/phase-26-workflow-configuration.feature) +- outcome: - Base process specs (PROCESS_MODEL.md, PROCESS_SETUP.md) define workflows - Monorepo needs customized workflow configuration for planning sessions - Not all sessions produce code - some produce designs, requirements, analysis - Need to define what each workflow type should output +- problem: - Base process specs (PROCESS_MODEL.md, PROCESS_SETUP.md) define workflows - Monorepo needs customized workflow configuration for planning sessions - Not all sessions produce code - some produce designs, requirements, analysis - Need to define what each workflow type should output +- value: - Review base process specs for default workflows - Configure monorepo-specific workflow phases (Inception, Elaboration, etc.) - Define session types with expected artifacts: - Requirements: Feature files, PRD content - Analysis: Investigation notes, gap identification - Design: ADRs, architecture decisions - Implementation: Code, tests - Validation: DoD verification, acceptance testing - Create reusable session templates for each workflow type diff --git a/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-001-core-patterns-are-documented-for-roadmap-planning.sdp.md b/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-001-core-patterns-are-documented-for-roadmap-planning.sdp.md index 37dca1ec..d50789ac 100644 --- a/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-001-core-patterns-are-documented-for-roadmap-planning.sdp.md +++ b/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-001-core-patterns-are-documented-for-roadmap-planning.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Core patterns are documented for roadmap planning" from examples/order-management/tests/features/timeline/phase-27-pattern-annotation-priorities.feature +- outcome: Executable scenario: Core patterns are documented for roadmap planning + +```gwt +Given the following deliverables: +And P0 and P1 patterns are annotated +When designing new roadmap phases +Then pattern docs provide architectural context +And relationships between patterns are visible +``` diff --git a/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-002-progressive-annotation-policy-is-sustainable.sdp.md b/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-002-progressive-annotation-policy-is-sustainable.sdp.md index e82bc123..8935f516 100644 --- a/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-002-progressive-annotation-policy-is-sustainable.sdp.md +++ b/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-002-progressive-annotation-policy-is-sustainable.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Progressive annotation policy is sustainable" from examples/order-management/tests/features/timeline/phase-27-pattern-annotation-priorities.feature +- outcome: Executable scenario: Progressive annotation policy is sustainable + +```gwt +Given the following deliverables: +And annotation policy is defined +When developers touch code +Then they annotate changed/related patterns +And annotation coverage grows organically +``` diff --git a/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.sdp.md b/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.sdp.md index 9c69c67a..8a8c7668 100644 --- a/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.sdp.md +++ b/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent -- outcome: Prioritize core infrastructure patterns for annotation to support roadmap design. **Problem:** - PATTERNS.md needs annotations in @convex-es/* packages - New roadmap milestones require understanding core patterns first (test carrier: examples/order-management/tests/features/timeline/phase-27-pattern-annotation-priorities.feature) +- outcome: - PATTERNS.md needs annotations in @convex-es/* packages - New roadmap milestones require understanding core patterns first - Current annotation coverage is sparse - Need strategic prioritization, not exhaustive annotation +- problem: - PATTERNS.md needs annotations in @convex-es/* packages - New roadmap milestones require understanding core patterns first - Current annotation coverage is sparse - Need strategic prioritization, not exhaustive annotation +- value: - Prioritize core infrastructure patterns that inform roadmap decisions: 1. Middleware (command/event flow) 2. Event Bus (event delivery mechanism) 3. Command Orchestrator (7-step lifecycle) 4. CMS (Command Model State) 5. Handlers (command/event handling) - Annotate foundational patterns before advanced ones - Use @architect-roadmap tag for patterns relevant to planned phases - Progressive annotation: annotate per PR as code is touched diff --git a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-001-claude-md-is-generated-from-modules.sdp.md b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-001-claude-md-is-generated-from-modules.sdp.md index e8de27fd..56494e0e 100644 --- a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-001-claude-md-is-generated-from-modules.sdp.md +++ b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-001-claude-md-is-generated-from-modules.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "CLAUDE.md is generated from modules" from examples/order-management/tests/features/timeline/phase-28-modular-claude-md.feature +- outcome: Executable scenario: CLAUDE.md is generated from modules + +```gwt +Given the following deliverables: +And metadata.json defines sections and variations +And modules exist in manual/ and generated/ directories +When running pnpm docs:claude-md +Then CLAUDE.md is compiled from modules +And section numbering is automatic +And token count is reported +``` diff --git a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-002-variations-produce-different-outputs.sdp.md b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-002-variations-produce-different-outputs.sdp.md index 84768a31..6258f2d8 100644 --- a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-002-variations-produce-different-outputs.sdp.md +++ b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-002-variations-produce-different-outputs.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Variations produce different outputs" from examples/order-management/tests/features/timeline/phase-28-modular-claude-md.feature +- outcome: Executable scenario: Variations produce different outputs + +```gwt +Given the following deliverables: +And multiple variations are configured (default, patterns, process) +When building each variation +Then each produces appropriately filtered content +And token budgets are respected per variation +``` diff --git a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-003-pattern-content-is-auto-generated.sdp.md b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-003-pattern-content-is-auto-generated.sdp.md index b617b22b..8fa8a2bb 100644 --- a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-003-pattern-content-is-auto-generated.sdp.md +++ b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-003-pattern-content-is-auto-generated.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Pattern content is auto-generated" from examples/order-management/tests/features/timeline/phase-28-modular-claude-md.feature +- outcome: Executable scenario: Pattern content is auto-generated + +```gwt +Given the following deliverables: +And @architect-pattern annotations exist in code +When running docs:claude-md +Then pattern modules are generated in generated/patterns/ +And changes to code annotations update CLAUDE.md +``` diff --git a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-004-session-templates-are-includable.sdp.md b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-004-session-templates-are-includable.sdp.md index 42f4ded9..c5322d2f 100644 --- a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-004-session-templates-are-includable.sdp.md +++ b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-004-session-templates-are-includable.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Session templates are includable" from examples/order-management/tests/features/timeline/phase-28-modular-claude-md.feature +- outcome: Executable scenario: Session templates are includable + +```gwt +Given the following deliverables: +And session templates exist in catalogue/templates/ +When starting a specific session type (inception, elaboration, etc.) +Then appropriate templates can be included in session prompt +And templates reference current CLAUDE.md content +``` diff --git a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.sdp.md b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.sdp.md index 6fe64379..9581a26e 100644 --- a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.sdp.md +++ b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent -- outcome: Transform CLAUDE.md from monolithic file to modular, partially-generated system. **Problem:** - Current CLAUDE.md is 896 lines of organically accumulated content (2 weeks rapid iteration) - No variation support - same content for all work contexts (test carrier: examples/order-management/tests/features/timeline/phase-28-modular-claude-md.feature) +- outcome: - Current CLAUDE.md is 896 lines of organically accumulated content (2 weeks rapid iteration) - No variation support - same content for all work contexts - Manual maintenance burden - updates lag code changes - Mixed content types: some should be generated, some static - No evidence-based effectiveness tracking - Difficult to compose different "views" for different session types +- problem: - Current CLAUDE.md is 896 lines of organically accumulated content (2 weeks rapid iteration) - No variation support - same content for all work contexts - Manual maintenance burden - updates lag code changes - Mixed content types: some should be generated, some static - No evidence-based effectiveness tracking - Difficult to compose different "views" for different session types +- value: - Extract CLAUDE.md build system to delivery-process package - Create hybrid architecture: generated + manual modules - Support tag-based variations (patterns, process, security, etc.) - Integrate with @architect annotations for auto-generated pattern docs - Enable session templates as includable prompt content - Add effectiveness tracking for evidence-based content decisions diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-001-define-command-preserves-literal-command-type.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-001-define-command-preserves-literal-command-type.sdp.md index bf3afeb4..12e36c51 100644 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-001-define-command-preserves-literal-command-type.sdp.md +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-001-define-command-preserves-literal-command-type.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "defineCommand preserves literal commandType" from packages/platform-bc/tests/features/behavior/bc-contracts.feature +- outcome: Executable scenario: defineCommand preserves literal commandType + +```gwt +Given a command definition with commandType "CreateOrder" +When I call defineCommand with the definition +Then the result commandType should be "CreateOrder" +And the result should preserve the createsAggregate flag as true +``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-002-define-command-includes-all-metadata-fields.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-002-define-command-includes-all-metadata-fields.sdp.md index 3a1199be..7c83cef7 100644 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-002-define-command-includes-all-metadata-fields.sdp.md +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-002-define-command-includes-all-metadata-fields.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "defineCommand includes all metadata fields" from packages/platform-bc/tests/features/behavior/bc-contracts.feature +- outcome: Executable scenario: defineCommand includes all metadata fields + +```gwt +Given a command definition with multiple producesEvents +When I call defineCommand with the definition +Then the result should have producesEvents with 2 items +And the result should have errorCodes with 1 item +``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-003-define-event-preserves-literal-event-type.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-003-define-event-preserves-literal-event-type.sdp.md index a6550939..b3ec6235 100644 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-003-define-event-preserves-literal-event-type.sdp.md +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-003-define-event-preserves-literal-event-type.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "defineEvent preserves literal eventType" from packages/platform-bc/tests/features/behavior/bc-contracts.feature +- outcome: Executable scenario: defineEvent preserves literal eventType + +```gwt +Given an event definition with eventType "OrderCreated" +When I call defineEvent with the definition +Then the result eventType should be "OrderCreated" +And the result category should be "domain" +``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-004-define-event-supports-all-event-categories.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-004-define-event-supports-all-event-categories.sdp.md index 1445a306..9215e058 100644 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-004-define-event-supports-all-event-categories.sdp.md +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-004-define-event-supports-all-event-categories.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "defineEvent supports all event categories" from packages/platform-bc/tests/features/behavior/bc-contracts.feature +- outcome: Executable scenario: defineEvent supports all event categories + +```gwt +Given an event definition with category "integration" +When I call defineEvent with the definition +Then the result category should be "integration" +``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-005-define-projection-preserves-literal-projection-name.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-005-define-projection-preserves-literal-projection-name.sdp.md index d2835bbe..cb4529bc 100644 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-005-define-projection-preserves-literal-projection-name.sdp.md +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-005-define-projection-preserves-literal-projection-name.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "defineProjection preserves literal projectionName" from packages/platform-bc/tests/features/behavior/bc-contracts.feature +- outcome: Executable scenario: defineProjection preserves literal projectionName + +```gwt +Given a projection definition with projectionName "orderSummary" +When I call defineProjection with the definition +Then the result projectionName should be "orderSummary" +And the result type should be "primary" +``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-006-define-projection-preserves-event-subscriptions-tuple.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-006-define-projection-preserves-event-subscriptions-tuple.sdp.md index a1bff8bb..05d0ac1d 100644 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-006-define-projection-preserves-event-subscriptions-tuple.sdp.md +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-006-define-projection-preserves-event-subscriptions-tuple.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "defineProjection preserves eventSubscriptions tuple" from packages/platform-bc/tests/features/behavior/bc-contracts.feature +- outcome: Executable scenario: defineProjection preserves eventSubscriptions tuple + +```gwt +Given a projection definition with 3 event subscriptions +When I call defineProjection with the definition +Then the result should have eventSubscriptions with 3 items +``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-007-is-projection-category-validates-category-strings.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-007-is-projection-category-validates-category-strings.sdp.md index b4361f74..8a174799 100644 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-007-is-projection-category-validates-category-strings.sdp.md +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-007-is-projection-category-validates-category-strings.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isProjectionCategory validates category strings" from packages/platform-bc/tests/features/behavior/bc-contracts.feature +- outcome: Executable scenario: isProjectionCategory validates category strings + +```gwt +Given the feature fixture is in place +When I check isProjectionCategory with value "value" +Then the result should be value +``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-008-is-logic-projection-returns-true-only-for-logic-category.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-008-is-logic-projection-returns-true-only-for-logic-category.sdp.md index bc7feb6c..f73c9896 100644 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-008-is-logic-projection-returns-true-only-for-logic-category.sdp.md +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-008-is-logic-projection-returns-true-only-for-logic-category.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isLogicProjection returns true only for logic category" from packages/platform-bc/tests/features/behavior/bc-contracts.feature +- outcome: Executable scenario: isLogicProjection returns true only for logic category + +```gwt +Given a projection category "logic" +When I check isLogicProjection +Then the result should be true +``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-009-is-view-projection-returns-true-only-for-view-category.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-009-is-view-projection-returns-true-only-for-view-category.sdp.md index 4c30b959..4cda9968 100644 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-009-is-view-projection-returns-true-only-for-view-category.sdp.md +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-009-is-view-projection-returns-true-only-for-view-category.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isViewProjection returns true only for view category" from packages/platform-bc/tests/features/behavior/bc-contracts.feature +- outcome: Executable scenario: isViewProjection returns true only for view category + +```gwt +Given a projection category "view" +When I check isViewProjection +Then the result should be true +``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-010-is-client-exposed-returns-true-only-for-view-category.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-010-is-client-exposed-returns-true-only-for-view-category.sdp.md index 0e9d9e59..e82effa2 100644 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-010-is-client-exposed-returns-true-only-for-view-category.sdp.md +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-010-is-client-exposed-returns-true-only-for-view-category.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isClientExposed returns true only for view category" from packages/platform-bc/tests/features/behavior/bc-contracts.feature +- outcome: Executable scenario: isClientExposed returns true only for view category + +```gwt +Given a projection category "view" +When I check isClientExposed +Then the result should be true +``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-011-is-client-exposed-returns-false-for-non-view-categories.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-011-is-client-exposed-returns-false-for-non-view-categories.sdp.md index 86a55fd3..746a8f65 100644 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-011-is-client-exposed-returns-false-for-non-view-categories.sdp.md +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-011-is-client-exposed-returns-false-for-non-view-categories.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isClientExposed returns false for non-view categories" from packages/platform-bc/tests/features/behavior/bc-contracts.feature +- outcome: Executable scenario: isClientExposed returns false for non-view categories + +```gwt +Given a projection category "reporting" +When I check isClientExposed +Then the result should be false +``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-012-define-process-manager-validates-time-triggered-requires-cron-config.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-012-define-process-manager-validates-time-triggered-requires-cron-config.sdp.md index 5e4e60f4..f8b0d632 100644 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-012-define-process-manager-validates-time-triggered-requires-cron-config.sdp.md +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-012-define-process-manager-validates-time-triggered-requires-cron-config.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "defineProcessManager validates time-triggered requires cronConfig" from packages/platform-bc/tests/features/behavior/bc-contracts.feature +- outcome: Executable scenario: defineProcessManager validates time-triggered requires cronConfig + +```gwt +Given a process manager definition with triggerType "time" without cronConfig +When I call defineProcessManager expecting an error +Then it should throw an error containing "requires cronConfig" +``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-013-define-process-manager-validates-event-triggered-requires-subscriptions.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-013-define-process-manager-validates-event-triggered-requires-subscriptions.sdp.md index 60459036..b0b1c140 100644 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-013-define-process-manager-validates-event-triggered-requires-subscriptions.sdp.md +++ b/specs/behavior/platform-bc/bc-contracts.examples/s-013-define-process-manager-validates-event-triggered-requires-subscriptions.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "defineProcessManager validates event-triggered requires subscriptions" from packages/platform-bc/tests/features/behavior/bc-contracts.feature +- outcome: Executable scenario: defineProcessManager validates event-triggered requires subscriptions + +```gwt +Given a process manager definition with triggerType "event" without subscriptions +When I call defineProcessManager expecting an error +Then it should throw an error containing "requires at least one event subscription" +``` diff --git a/specs/behavior/platform-bc/bc-contracts.sdp.md b/specs/behavior/platform-bc/bc-contracts.sdp.md index 41a3161d..201c2992 100644 --- a/specs/behavior/platform-bc/bc-contracts.sdp.md +++ b/specs/behavior/platform-bc/bc-contracts.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: The @libar-dev/platform-bc package provides type-safe helper functions for defining bounded context contracts. These helpers preserve literal types for type-safe registries and provide runtime validators for category values. (test carrier: packages/platform-bc/tests/features/behavior/bc-contracts.feature) +- outcome: Bounded Context Contract Helper Functions diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-001-direct-table-query-fails-across-component-boundary.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-001-direct-table-query-fails-across-component-boundary.sdp.md index 4f85c96d..8e49cc5b 100644 --- a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-001-direct-table-query-fails-across-component-boundary.sdp.md +++ b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-001-direct-table-query-fails-across-component-boundary.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Direct table query fails across component boundary" from packages/platform-bc/tests/features/behavior/bounded-context-foundation-executable-tests.feature +- outcome: Executable scenario: Direct table query fails across component boundary + +```gwt +Given the platform-bc contracts and definitions are available +And a bounded context "orders" with table "orderCMS" +When the parent app attempts to query "orderCMS" directly +Then the query fails because the table doesn't exist in parent database +``` diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-002-component-api-access-succeeds.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-002-component-api-access-succeeds.sdp.md index f843c3b1..1db410e8 100644 --- a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-002-component-api-access-succeeds.sdp.md +++ b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-002-component-api-access-succeeds.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Component API access succeeds" from packages/platform-bc/tests/features/behavior/bounded-context-foundation-executable-tests.feature +- outcome: Executable scenario: Component API access succeeds + +```gwt +Given the platform-bc contracts and definitions are available +And a bounded context "orders" with handler "createOrder" +When the parent app calls ctx.runMutation(components.orders.handlers.createOrder) +Then the handler executes successfully +``` diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-003-component-handler-writes-commit-atomically-on-success.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-003-component-handler-writes-commit-atomically-on-success.sdp.md index b4f4ecfc..70e0c3ac 100644 --- a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-003-component-handler-writes-commit-atomically-on-success.sdp.md +++ b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-003-component-handler-writes-commit-atomically-on-success.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Component handler writes commit atomically on success" from packages/platform-bc/tests/features/behavior/bounded-context-foundation-executable-tests.feature +- outcome: Executable scenario: Component handler writes commit atomically on success + +```gwt +Given the platform-bc contracts and definitions are available +And a component handler that performs two writes +When the handler completes successfully +Then both writes are visible after commit +``` diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-004-caught-component-failure-rolls-back-only-the-component-writes.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-004-caught-component-failure-rolls-back-only-the-component-writes.sdp.md index 66069677..f96aa359 100644 --- a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-004-caught-component-failure-rolls-back-only-the-component-writes.sdp.md +++ b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-004-caught-component-failure-rolls-back-only-the-component-writes.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Caught component failure rolls back only the component writes" from packages/platform-bc/tests/features/behavior/bounded-context-foundation-executable-tests.feature +- outcome: Executable scenario: Caught component failure rolls back only the component writes + +```gwt +Given the platform-bc contracts and definitions are available +And a parent mutation that writes row X then calls a component handler that throws +When the parent catches the exception +Then row X is preserved +And the component handler's writes are rolled back +``` diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-005-user-id-passed-explicitly-to-component.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-005-user-id-passed-explicitly-to-component.sdp.md index 740bb3e1..88b9876b 100644 --- a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-005-user-id-passed-explicitly-to-component.sdp.md +++ b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-005-user-id-passed-explicitly-to-component.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "User ID passed explicitly to component" from packages/platform-bc/tests/features/behavior/bounded-context-foundation-executable-tests.feature +- outcome: Executable scenario: User ID passed explicitly to component + +```gwt +Given the platform-bc contracts and definitions are available +And a command requiring user authorization +When calling the bounded context handler +Then userId is passed as an explicit argument +And the component does not access ctx.auth +``` diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-006-id-conversion-at-boundary.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-006-id-conversion-at-boundary.sdp.md index 975e1798..a3013c3f 100644 --- a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-006-id-conversion-at-boundary.sdp.md +++ b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-006-id-conversion-at-boundary.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "ID conversion at boundary" from packages/platform-bc/tests/features/behavior/bounded-context-foundation-executable-tests.feature +- outcome: Executable scenario: ID conversion at boundary + +```gwt +Given the platform-bc contracts and definitions are available +And an order with internal ID of type Idvalue +When returning the order through the component API +Then the ID is converted to string format +And external callers receive a string identifier +``` diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-007-contract-provides-type-safety-for-commands.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-007-contract-provides-type-safety-for-commands.sdp.md index 76ca267e..8bfdac72 100644 --- a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-007-contract-provides-type-safety-for-commands.sdp.md +++ b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-007-contract-provides-type-safety-for-commands.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Contract provides type safety for commands" from packages/platform-bc/tests/features/behavior/bounded-context-foundation-executable-tests.feature +- outcome: Executable scenario: Contract provides type safety for commands + +```gwt +Given the platform-bc contracts and definitions are available +And a DualWriteContextContract with commandTypes ["CreateOrder", "SubmitOrder"] +When using ExtractCommandTypes helper +Then the result type is "CreateOrder" "SubmitOrder" +And invalid command types cause compile errors +``` diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.sdp.md index 6b3cc66c..575890eb 100644 --- a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.sdp.md +++ b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: **Provenance:** This file was authored under the refactoring carve-out to expose BoundedContextFoundation in the PatternGraph. The pattern was originally implemented before the `@architect-implements:` convention. Rule invariants and rationales below are transferred verbatim from (test carrier: packages/platform-bc/tests/features/behavior/bounded-context-foundation-executable-tests.feature) +- outcome: BoundedContextFoundation Executable Tests + +## Behavior + +- rule: Components have isolated databases that parent cannot query directly +- rule: Sub-transactions are atomic within components +- rule: ctx.auth does not cross component boundaries +- rule: Id inside component becomes string at API boundary +- rule: DualWriteContextContract formalizes the bounded context API diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-001-first-command-execution-is-recorded.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-001-first-command-execution-is-recorded.sdp.md index 552496e4..a2f2ed4b 100644 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-001-first-command-execution-is-recorded.sdp.md +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-001-first-command-execution-is-recorded.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "First command execution is recorded" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature +- outcome: Executable scenario: First command execution is recorded + +```gwt +Given the platform-bus CommandBus client is available +And the platform-core CommandOrchestrator is available +And no command exists with id "cmd-123" +When recording command "cmd-123" of type "CreateOrder" +Then the command is recorded with status "pending" +And the response indicates isNew = true +``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-002-duplicate-command-returns-cached-result.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-002-duplicate-command-returns-cached-result.sdp.md index a64220a4..9f5e5fc2 100644 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-002-duplicate-command-returns-cached-result.sdp.md +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-002-duplicate-command-returns-cached-result.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Duplicate command returns cached result" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature +- outcome: Executable scenario: Duplicate command returns cached result + +```gwt +Given the platform-bus CommandBus client is available +And the platform-core CommandOrchestrator is available +And command "cmd-123" exists with status "executed" and result "success" +When recording command "cmd-123" again +Then the response indicates isNew = false +And the cached result is returned +``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-003-successful-command-transitions-to-executed.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-003-successful-command-transitions-to-executed.sdp.md index 4f34813d..d3e2521d 100644 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-003-successful-command-transitions-to-executed.sdp.md +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-003-successful-command-transitions-to-executed.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Successful command transitions to executed" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature +- outcome: Executable scenario: Successful command transitions to executed + +```gwt +Given the platform-bus CommandBus client is available +And the platform-core CommandOrchestrator is available +And a command in "pending" status +When the command handler returns success +Then the status becomes "executed" +And the result contains success data +``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-004-business-rejection-transitions-to-rejected.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-004-business-rejection-transitions-to-rejected.sdp.md index ecf0ab48..19d274a5 100644 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-004-business-rejection-transitions-to-rejected.sdp.md +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-004-business-rejection-transitions-to-rejected.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Business rejection transitions to rejected" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature +- outcome: Executable scenario: Business rejection transitions to rejected + +```gwt +Given the platform-bus CommandBus client is available +And the platform-core CommandOrchestrator is available +And a command in "pending" status +When the command handler returns rejected with code "INVALID_STATUS" +Then the status becomes "rejected" +And the result contains the rejection code +``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-005-unexpected-error-transitions-to-failed.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-005-unexpected-error-transitions-to-failed.sdp.md index ff94097d..d9fcccd9 100644 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-005-unexpected-error-transitions-to-failed.sdp.md +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-005-unexpected-error-transitions-to-failed.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Unexpected error transitions to failed" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature +- outcome: Executable scenario: Unexpected error transitions to failed + +```gwt +Given the platform-bus CommandBus client is available +And the platform-core CommandOrchestrator is available +And a command in "pending" status +When the command handler throws an unexpected error +Then the status becomes "failed" +And the result contains error details +``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-006-successful-command-runs-all-7-orchestrator-steps.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-006-successful-command-runs-all-7-orchestrator-steps.sdp.md index 002b8473..313a356c 100644 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-006-successful-command-runs-all-7-orchestrator-steps.sdp.md +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-006-successful-command-runs-all-7-orchestrator-steps.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: Executable scenario "Successful command runs all 7 orchestrator steps" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature +- outcome: Executable scenario: Successful command runs all 7 orchestrator steps + +```gwt +Given the platform-bus CommandBus client is available +And the platform-core CommandOrchestrator is available +And a CommandOrchestrator wired with a successful handler +When dispatching a command +Then the command is recorded +And middleware executes +And the handler is called +And an event is appended +And the projection workpool is enqueued +And the command status is finalized +``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-007-rejected-command-short-circuits-before-event-append.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-007-rejected-command-short-circuits-before-event-append.sdp.md index ca76ffc2..bf5a3ba8 100644 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-007-rejected-command-short-circuits-before-event-append.sdp.md +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-007-rejected-command-short-circuits-before-event-append.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Rejected command short-circuits before event append" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature +- outcome: Executable scenario: Rejected command short-circuits before event append + +```gwt +Given the platform-bus CommandBus client is available +And the platform-core CommandOrchestrator is available +And a CommandOrchestrator wired with a handler returning rejected +When dispatching a command +Then no event is appended +And the command status is finalized as "rejected" +``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-008-correlation-id-is-propagated-to-emitted-event-metadata.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-008-correlation-id-is-propagated-to-emitted-event-metadata.sdp.md index 14792be8..7b1c5101 100644 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-008-correlation-id-is-propagated-to-emitted-event-metadata.sdp.md +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-008-correlation-id-is-propagated-to-emitted-event-metadata.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Correlation id is propagated to emitted event metadata" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature +- outcome: Executable scenario: Correlation id is propagated to emitted event metadata + +```gwt +Given the platform-bus CommandBus client is available +And the platform-core CommandOrchestrator is available +And a command dispatched with correlationId "corr-1" +When the orchestrator appends an event +Then the event metadata carries correlationId "corr-1" +``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-009-get-by-correlation-returns-the-events-for-a-command.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-009-get-by-correlation-returns-the-events-for-a-command.sdp.md index 1642ce70..6c3e9cd5 100644 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-009-get-by-correlation-returns-the-events-for-a-command.sdp.md +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-009-get-by-correlation-returns-the-events-for-a-command.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "getByCorrelation returns the events for a command" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature +- outcome: Executable scenario: getByCorrelation returns the events for a command + +```gwt +Given the platform-bus CommandBus client is available +And the platform-core CommandOrchestrator is available +And a command dispatched with correlationId "corr-2" that produced one event +When calling getByCorrelation with "corr-2" +Then the resulting entry lists the produced eventId +``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-010-registered-middleware-run-in-order.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-010-registered-middleware-run-in-order.sdp.md index f46d48ed..5e48b4a6 100644 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-010-registered-middleware-run-in-order.sdp.md +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-010-registered-middleware-run-in-order.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Registered middleware run in order" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature +- outcome: Executable scenario: Registered middleware run in order + +```gwt +Given the platform-bus CommandBus client is available +And the platform-core CommandOrchestrator is available +And two middlewares registered in order A then B +When a command is dispatched +Then middleware A executes before middleware B +``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-011-middleware-failure-halts-the-pipeline.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-011-middleware-failure-halts-the-pipeline.sdp.md index ff48588c..7c403287 100644 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-011-middleware-failure-halts-the-pipeline.sdp.md +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-011-middleware-failure-halts-the-pipeline.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Middleware failure halts the pipeline" from packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature +- outcome: Executable scenario: Middleware failure halts the pipeline + +```gwt +Given the platform-bus CommandBus client is available +And the platform-core CommandOrchestrator is available +And a middleware that fails +When a command is dispatched +Then no subsequent middleware runs +And the handler is not invoked +``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.sdp.md index 396b7fb5..65524165 100644 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.sdp.md +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: **Provenance:** This file was authored under the refactoring carve-out to expose CommandBusFoundation in the PatternGraph. The pattern was originally implemented before the `@architect-implements:` convention. Rule invariants and rationales below are transferred verbatim from (test carrier: packages/platform-bus/tests/features/behavior/command-bus-foundation-executable-tests.feature) +- outcome: CommandBusFoundation Executable Tests + +## Behavior + +- rule: Commands are idempotent via commandId deduplication +- rule: Status tracks the complete command lifecycle +- rule: The CommandOrchestrator is the only command execution path +- rule: correlationId links commands, events, and projections +- rule: Middleware provides composable cross-cutting concerns diff --git a/specs/behavior/platform-bus/idempotency.examples/s-001-first-command-submission-is-recorded.sdp.md b/specs/behavior/platform-bus/idempotency.examples/s-001-first-command-submission-is-recorded.sdp.md index 43377bbd..6f3b260f 100644 --- a/specs/behavior/platform-bus/idempotency.examples/s-001-first-command-submission-is-recorded.sdp.md +++ b/specs/behavior/platform-bus/idempotency.examples/s-001-first-command-submission-is-recorded.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "First command submission is recorded" from packages/platform-bus/tests/features/behavior/idempotency.feature +- outcome: Executable scenario: First command submission is recorded + +```gwt +Given the command bus component is available +And the test uses isolated command IDs +And a new command with unique id +And command type "CreateOrder" +And target context "orders" +When the command is submitted to the command bus +Then the response status should be "new" +And the command should be queryable by its id +``` diff --git a/specs/behavior/platform-bus/idempotency.examples/s-002-duplicate-command-returns-existing-status-when-completed.sdp.md b/specs/behavior/platform-bus/idempotency.examples/s-002-duplicate-command-returns-existing-status-when-completed.sdp.md index 0fd592d0..c273862c 100644 --- a/specs/behavior/platform-bus/idempotency.examples/s-002-duplicate-command-returns-existing-status-when-completed.sdp.md +++ b/specs/behavior/platform-bus/idempotency.examples/s-002-duplicate-command-returns-existing-status-when-completed.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Duplicate command returns existing status when completed" from packages/platform-bus/tests/features/behavior/idempotency.feature +- outcome: Executable scenario: Duplicate command returns existing status when completed + +```gwt +Given the command bus component is available +And the test uses isolated command IDs +And a command was previously submitted and executed +When a duplicate command with the same id is submitted +Then the response status should be "duplicate" +And the response should include command status "executed" +``` diff --git a/specs/behavior/platform-bus/idempotency.examples/s-003-duplicate-command-during-processing-returns-pending-status.sdp.md b/specs/behavior/platform-bus/idempotency.examples/s-003-duplicate-command-during-processing-returns-pending-status.sdp.md index 6c4cd766..8ea01e39 100644 --- a/specs/behavior/platform-bus/idempotency.examples/s-003-duplicate-command-during-processing-returns-pending-status.sdp.md +++ b/specs/behavior/platform-bus/idempotency.examples/s-003-duplicate-command-during-processing-returns-pending-status.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Duplicate command during processing returns pending status" from packages/platform-bus/tests/features/behavior/idempotency.feature +- outcome: Executable scenario: Duplicate command during processing returns pending status + +```gwt +Given the command bus component is available +And the test uses isolated command IDs +And a command is currently pending +When a duplicate command with the same id is submitted +Then the response status should be "duplicate" +And the response should include command status "pending" +``` diff --git a/specs/behavior/platform-bus/idempotency.examples/s-004-concurrent-duplicate-detection-via-post-insert-verification.sdp.md b/specs/behavior/platform-bus/idempotency.examples/s-004-concurrent-duplicate-detection-via-post-insert-verification.sdp.md index f952bc22..1fe9782b 100644 --- a/specs/behavior/platform-bus/idempotency.examples/s-004-concurrent-duplicate-detection-via-post-insert-verification.sdp.md +++ b/specs/behavior/platform-bus/idempotency.examples/s-004-concurrent-duplicate-detection-via-post-insert-verification.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Concurrent duplicate detection via post-insert verification" from packages/platform-bus/tests/features/behavior/idempotency.feature +- outcome: Executable scenario: Concurrent duplicate detection via post-insert verification + +```gwt +Given the command bus component is available +And the test uses isolated command IDs +And two concurrent submissions with identical command id +When both requests are processed +Then exactly one command record should exist +And the submissions should have one "new" and one "duplicate" response +``` diff --git a/specs/behavior/platform-bus/idempotency.sdp.md b/specs/behavior/platform-bus/idempotency.sdp.md index 85d1afd9..f9baf372 100644 --- a/specs/behavior/platform-bus/idempotency.sdp.md +++ b/specs/behavior/platform-bus/idempotency.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Command idempotency ensures that duplicate command submissions (same commandId) are detected and handled gracefully, preventing double-processing. This is a core infrastructure guarantee that enables reliable command dispatch in distributed systems where retries may occur. (test carrier: packages/platform-bus/tests/features/behavior/idempotency.feature) +- outcome: Command Bus Idempotency diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-001-returns-null-when-checkpoint-position-equals-event-position.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-001-returns-null-when-checkpoint-position-equals-event-position.sdp.md index 90cfc519..bd503a68 100644 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-001-returns-null-when-checkpoint-position-equals-event-position.sdp.md +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-001-returns-null-when-checkpoint-position-equals-event-position.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns null when checkpoint position equals event position" from packages/platform-core/tests/features/behavior/agent/action-handler.feature +- outcome: Executable scenario: Returns null when checkpoint position equals event position + +```gwt +Given an agent config with default test pattern +And a checkpoint with lastProcessedPosition 100 and status "active" +When I invoke the handler with globalPosition 100 +Then the result is null +``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-002-returns-null-when-checkpoint-position-exceeds-event-position.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-002-returns-null-when-checkpoint-position-exceeds-event-position.sdp.md index 78f4fb1f..27ed3f2b 100644 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-002-returns-null-when-checkpoint-position-exceeds-event-position.sdp.md +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-002-returns-null-when-checkpoint-position-exceeds-event-position.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns null when checkpoint position exceeds event position" from packages/platform-core/tests/features/behavior/agent/action-handler.feature +- outcome: Executable scenario: Returns null when checkpoint position exceeds event position + +```gwt +Given an agent config with default test pattern +And a checkpoint with lastProcessedPosition 200 and status "active" +When I invoke the handler with globalPosition 100 +Then the result is null +``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-003-returns-null-when-agent-status-is-paused.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-003-returns-null-when-agent-status-is-paused.sdp.md index 175e870e..640ebe38 100644 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-003-returns-null-when-agent-status-is-paused.sdp.md +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-003-returns-null-when-agent-status-is-paused.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns null when agent status is paused" from packages/platform-core/tests/features/behavior/agent/action-handler.feature +- outcome: Executable scenario: Returns null when agent status is paused + +```gwt +Given an agent config with default test pattern +And a checkpoint with lastProcessedPosition 50 and status "paused" +When I invoke the handler with globalPosition 100 +Then the result is null +``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-004-returns-null-when-agent-status-is-stopped.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-004-returns-null-when-agent-status-is-stopped.sdp.md index ca823834..092997df 100644 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-004-returns-null-when-agent-status-is-stopped.sdp.md +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-004-returns-null-when-agent-status-is-stopped.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns null when agent status is stopped" from packages/platform-core/tests/features/behavior/agent/action-handler.feature +- outcome: Executable scenario: Returns null when agent status is stopped + +```gwt +Given an agent config with default test pattern +And a checkpoint with lastProcessedPosition 50 and status "stopped" +When I invoke the handler with globalPosition 100 +Then the result is null +``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-005-returns-null-when-agent-status-is-error-recovery.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-005-returns-null-when-agent-status-is-error-recovery.sdp.md index f3c6822f..22f29a84 100644 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-005-returns-null-when-agent-status-is-error-recovery.sdp.md +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-005-returns-null-when-agent-status-is-error-recovery.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns null when agent status is error_recovery" from packages/platform-core/tests/features/behavior/agent/action-handler.feature +- outcome: Executable scenario: Returns null when agent status is error_recovery + +```gwt +Given an agent config with default test pattern +And a checkpoint with lastProcessedPosition 50 and status "error_recovery" +When I invoke the handler with globalPosition 100 +Then the result is null +``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-006-processes-normally-when-checkpoint-is-null-first-event.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-006-processes-normally-when-checkpoint-is-null-first-event.sdp.md index 12f33832..4375395f 100644 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-006-processes-normally-when-checkpoint-is-null-first-event.sdp.md +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-006-processes-normally-when-checkpoint-is-null-first-event.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Processes normally when checkpoint is null (first event)" from packages/platform-core/tests/features/behavior/agent/action-handler.feature +- outcome: Executable scenario: Processes normally when checkpoint is null (first event) + +```gwt +Given an agent config with default test pattern +And a null checkpoint +When I invoke the handler with globalPosition 1 +Then the result is not null +And the result has the following properties: +And the decision is not null +``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-007-returns-rule-based-analysis-when-pattern-has-no-analyze-function.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-007-returns-rule-based-analysis-when-pattern-has-no-analyze-function.sdp.md index e5066821..5abe1198 100644 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-007-returns-rule-based-analysis-when-pattern-has-no-analyze-function.sdp.md +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-007-returns-rule-based-analysis-when-pattern-has-no-analyze-function.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Returns rule-based analysis when pattern has no analyze function" from packages/platform-core/tests/features/behavior/agent/action-handler.feature +- outcome: Executable scenario: Returns rule-based analysis when pattern has no analyze function + +```gwt +Given an agent config with default test pattern +And a null checkpoint +When I invoke the handler with default args +Then the result is not null +And the result analysisMethod is "rule-based" +And the result llmMetrics is undefined +``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-008-re-throws-when-pattern-trigger-throws.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-008-re-throws-when-pattern-trigger-throws.sdp.md index 1c038621..795827f4 100644 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-008-re-throws-when-pattern-trigger-throws.sdp.md +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-008-re-throws-when-pattern-trigger-throws.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Re-throws when pattern trigger throws" from packages/platform-core/tests/features/behavior/agent/action-handler.feature +- outcome: Executable scenario: Re-throws when pattern trigger throws + +```gwt +Given an agent config with a throwing pattern "Handler crashed" +And a null checkpoint +When I invoke the handler with default args expecting error +Then the error message is "Handler crashed" +``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-009-propagates-load-state-errors-for-workpool-retry.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-009-propagates-load-state-errors-for-workpool-retry.sdp.md index fae99357..6b34f449 100644 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-009-propagates-load-state-errors-for-workpool-retry.sdp.md +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-009-propagates-load-state-errors-for-workpool-retry.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Propagates loadState errors for Workpool retry" from packages/platform-core/tests/features/behavior/agent/action-handler.feature +- outcome: Executable scenario: Propagates loadState errors for Workpool retry + +```gwt +Given an agent config with default test pattern +And a loadState that rejects with "DB connection lost" +When I invoke the handler with default args expecting error +Then the error message is "DB connection lost" +``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-010-generates-deterministic-decision-id-from-agent-id-and-global-position.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-010-generates-deterministic-decision-id-from-agent-id-and-global-position.sdp.md index 08ce6338..06ca8693 100644 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-010-generates-deterministic-decision-id-from-agent-id-and-global-position.sdp.md +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-010-generates-deterministic-decision-id-from-agent-id-and-global-position.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Generates deterministic decisionId from agentId and globalPosition" from packages/platform-core/tests/features/behavior/agent/action-handler.feature +- outcome: Executable scenario: Generates deterministic decisionId from agentId and globalPosition + +```gwt +Given an agent config with default test pattern +And a null checkpoint +When I invoke the handler with agentId "churn-risk-agent" and globalPosition 42 +Then the result is not null +And the result decisionId is "dec_churn-risk-agent_42" +``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-011-generates-same-decision-id-for-same-inputs-deterministic.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-011-generates-same-decision-id-for-same-inputs-deterministic.sdp.md index 24103cbc..7546eedd 100644 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-011-generates-same-decision-id-for-same-inputs-deterministic.sdp.md +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-011-generates-same-decision-id-for-same-inputs-deterministic.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Generates same decisionId for same inputs (deterministic)" from packages/platform-core/tests/features/behavior/agent/action-handler.feature +- outcome: Executable scenario: Generates same decisionId for same inputs (deterministic) + +```gwt +Given an agent config with default test pattern +And a null checkpoint +When I invoke the handler twice with agentId "agent-x" and globalPosition 99 +Then both results have decisionId "dec_agent-x_99" +``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-012-returns-pattern-id-and-rule-based-decision-when-pattern-triggers.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-012-returns-pattern-id-and-rule-based-decision-when-pattern-triggers.sdp.md index 6d92139c..dc591fb3 100644 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-012-returns-pattern-id-and-rule-based-decision-when-pattern-triggers.sdp.md +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-012-returns-pattern-id-and-rule-based-decision-when-pattern-triggers.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Returns patternId and rule-based decision when pattern triggers" from packages/platform-core/tests/features/behavior/agent/action-handler.feature +- outcome: Executable scenario: Returns patternId and rule-based decision when pattern triggers + +```gwt +Given an agent config with a "churn-risk" pattern that always triggers +And a null checkpoint +When I invoke the handler with default args +Then the result is not null +And the result has the following pattern properties: +And the decision is not null +And the decision command is null +``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-013-returns-llm-analysis-method-when-pattern-has-analyze-function.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-013-returns-llm-analysis-method-when-pattern-has-analyze-function.sdp.md index f50942f6..81802d99 100644 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-013-returns-llm-analysis-method-when-pattern-has-analyze-function.sdp.md +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-013-returns-llm-analysis-method-when-pattern-has-analyze-function.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Returns llm analysis method when pattern has analyze function" from packages/platform-core/tests/features/behavior/agent/action-handler.feature +- outcome: Executable scenario: Returns llm analysis method when pattern has analyze function + +```gwt +Given an agent config with a "fraud-detection" pattern that has LLM analyze +And a null checkpoint +When I invoke the handler with default args +Then the result is not null +And the result has the following pattern properties: +And the decision command is "FlagFraud" +And the decision confidence is 0.95 +``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-014-returns-no-pattern-id-when-no-pattern-matches.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-014-returns-no-pattern-id-when-no-pattern-matches.sdp.md index c6ef4a69..85ec4a27 100644 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-014-returns-no-pattern-id-when-no-pattern-matches.sdp.md +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-014-returns-no-pattern-id-when-no-pattern-matches.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Returns no patternId when no pattern matches" from packages/platform-core/tests/features/behavior/agent/action-handler.feature +- outcome: Executable scenario: Returns no patternId when no pattern matches + +```gwt +Given an agent config with a pattern that never triggers +And a null checkpoint +When I invoke the handler with default args +Then the result is not null +And the result patternId is undefined +And the decision is null +``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-015-does-not-invoke-llm-enrichment-via-runtime.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-015-does-not-invoke-llm-enrichment-via-runtime.sdp.md index 30905193..35883c52 100644 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-015-does-not-invoke-llm-enrichment-via-runtime.sdp.md +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-015-does-not-invoke-llm-enrichment-via-runtime.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Does not invoke LLM enrichment via runtime" from packages/platform-core/tests/features/behavior/agent/action-handler.feature +- outcome: Executable scenario: Does not invoke LLM enrichment via runtime + +```gwt +Given an agent config with a rule-only pattern and a spy runtime +And a null checkpoint +When I invoke the handler with default args +Then the result is not null +And the runtime analyze was not called +And the result llmMetrics is undefined +``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-016-re-throws-when-pattern-executor-fails.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-016-re-throws-when-pattern-executor-fails.sdp.md index efe3b529..e496cb20 100644 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-016-re-throws-when-pattern-executor-fails.sdp.md +++ b/specs/behavior/platform-core/agent/action-handler.examples/s-016-re-throws-when-pattern-executor-fails.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Re-throws when pattern executor fails" from packages/platform-core/tests/features/behavior/agent/action-handler.feature +- outcome: Executable scenario: Re-throws when pattern executor fails + +```gwt +Given an agent config with a throwing pattern "Trigger exploded" +And a null checkpoint +When I invoke the handler with default args expecting error +Then the error message is "Trigger exploded" +``` diff --git a/specs/behavior/platform-core/agent/action-handler.sdp.md b/specs/behavior/platform-core/agent/action-handler.sdp.md index 67d3ded8..14e165b2 100644 --- a/specs/behavior/platform-core/agent/action-handler.sdp.md +++ b/specs/behavior/platform-core/agent/action-handler.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: createAgentActionHandler() factory creates the ACTION half of the Workpool action/mutation split. It loads state, checks idempotency via checkpoint position, checks agent active status, and runs pattern executor. (test carrier: packages/platform-core/tests/features/behavior/agent/action-handler.feature) +- outcome: Agent Action Handler + +## Behavior + +- rule: Idempotency via checkpoint position +- rule: Inactive agent handling +- rule: Normal processing for new events +- rule: Error propagation for Workpool retry +- rule: Deterministic decisionId format +- rule: Patterns mode integration diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-001-operation-executes-and-result-is-returned-when-allowed.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-001-operation-executes-and-result-is-returned-when-allowed.sdp.md index f5b970d9..cdc49a8a 100644 --- a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-001-operation-executes-and-result-is-returned-when-allowed.sdp.md +++ b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-001-operation-executes-and-result-is-returned-when-allowed.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Operation executes and result is returned when allowed" from packages/platform-core/tests/features/behavior/agent/agent-rate-limiter.feature +- outcome: Executable scenario: Operation executes and result is returned when allowed + +```gwt +Given a rate limiter config for agent "test-agent" that allows requests +And an operation that returns analysis "success" with score 0.95 +When I call withRateLimit +Then the result indicates allowed is true +And the result value has analysis "success" and score 0.95 +And the operation was called 1 time +``` diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-002-operation-is-not-executed-when-denied.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-002-operation-is-not-executed-when-denied.sdp.md index b27d656e..b1412b28 100644 --- a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-002-operation-is-not-executed-when-denied.sdp.md +++ b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-002-operation-is-not-executed-when-denied.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Operation is not executed when denied" from packages/platform-core/tests/features/behavior/agent/agent-rate-limiter.feature +- outcome: Executable scenario: Operation is not executed when denied + +```gwt +Given a rate limiter config for agent "test-agent" that denies with retryAfterMs 5000 +And a mock operation +When I call withRateLimit +Then the result indicates allowed is false +And the result retryAfterMs is 5000 +And the operation was not called +``` diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-003-check-rate-limit-receives-agent-scoped-key.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-003-check-rate-limit-receives-agent-scoped-key.sdp.md index c8a5a1f8..f618b09d 100644 --- a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-003-check-rate-limit-receives-agent-scoped-key.sdp.md +++ b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-003-check-rate-limit-receives-agent-scoped-key.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "checkRateLimit receives agent-scoped key" from packages/platform-core/tests/features/behavior/agent/agent-rate-limiter.feature +- outcome: Executable scenario: checkRateLimit receives agent-scoped key + +```gwt +Given a rate limiter config for agent "churn-risk-agent" that allows requests +When I call withRateLimit with a simple operation +Then checkRateLimit was called with key "agent:churn-risk-agent" +``` diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-004-operation-errors-propagate-to-caller.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-004-operation-errors-propagate-to-caller.sdp.md index 375f196b..43bc54dd 100644 --- a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-004-operation-errors-propagate-to-caller.sdp.md +++ b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-004-operation-errors-propagate-to-caller.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Operation errors propagate to caller" from packages/platform-core/tests/features/behavior/agent/agent-rate-limiter.feature +- outcome: Executable scenario: Operation errors propagate to caller + +```gwt +Given a rate limiter config for agent "test-agent" that allows requests +And an operation that throws "LLM API crashed" +When I call withRateLimit expecting an error +Then the error message is "LLM API crashed" +``` diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-005-check-rate-limit-callback-errors-propagate-without-calling-operation.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-005-check-rate-limit-callback-errors-propagate-without-calling-operation.sdp.md index 0c62e1c7..5e4270c6 100644 --- a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-005-check-rate-limit-callback-errors-propagate-without-calling-operation.sdp.md +++ b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-005-check-rate-limit-callback-errors-propagate-without-calling-operation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "checkRateLimit callback errors propagate without calling operation" from packages/platform-core/tests/features/behavior/agent/agent-rate-limiter.feature +- outcome: Executable scenario: checkRateLimit callback errors propagate without calling operation + +```gwt +Given a rate limiter config for agent "test-agent" where checkRateLimit throws "Rate limiter store unavailable" +And a mock operation +When I call withRateLimit expecting an error +Then the error message is "Rate limiter store unavailable" +And the operation was not called +``` diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-006-warning-is-logged-when-rate-limited.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-006-warning-is-logged-when-rate-limited.sdp.md index f028d840..57ddc9e1 100644 --- a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-006-warning-is-logged-when-rate-limited.sdp.md +++ b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-006-warning-is-logged-when-rate-limited.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Warning is logged when rate limited" from packages/platform-core/tests/features/behavior/agent/agent-rate-limiter.feature +- outcome: Executable scenario: Warning is logged when rate limited + +```gwt +Given a rate limiter config with logger for agent "test-agent" that denies with retryAfterMs 3000 +When I call withRateLimit with a simple operation +Then the logger warned "Rate limited" with agentId "test-agent" and retryAfterMs 3000 +``` diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-007-debug-is-logged-when-rate-limit-check-passes.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-007-debug-is-logged-when-rate-limit-check-passes.sdp.md index a65cdd5e..c853a7e7 100644 --- a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-007-debug-is-logged-when-rate-limit-check-passes.sdp.md +++ b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-007-debug-is-logged-when-rate-limit-check-passes.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Debug is logged when rate limit check passes" from packages/platform-core/tests/features/behavior/agent/agent-rate-limiter.feature +- outcome: Executable scenario: Debug is logged when rate limit check passes + +```gwt +Given a rate limiter config with logger for agent "test-agent" that allows requests +When I call withRateLimit with a simple operation +Then the logger logged debug "Rate limit passed, executing operation" with agentId "test-agent" +``` diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.sdp.md index b5edaedd..25152df0 100644 --- a/specs/behavior/platform-core/agent/agent-rate-limiter.sdp.md +++ b/specs/behavior/platform-core/agent/agent-rate-limiter.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: withRateLimit() guards agent operations behind a rate limit check. If allowed, the operation executes and returns the result. If denied, the operation is skipped and retryAfterMs is returned. (test carrier: packages/platform-core/tests/features/behavior/agent/agent-rate-limiter.feature) +- outcome: Agent Rate Limiter + +## Behavior + +- rule: Allowed operations execute and return their result +- rule: Denied operations are skipped with retry information +- rule: Rate limit key is agent-scoped +- rule: Errors propagate correctly +- rule: Logging reflects rate limit outcomes diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-001-action-subscription-has-correct-type-and-references.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-001-action-subscription-has-correct-type-and-references.sdp.md index bea4ec86..3f394e0e 100644 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-001-action-subscription-has-correct-type-and-references.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-001-action-subscription-has-correct-type-and-references.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Action subscription has correct type and references" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature +- outcome: Executable scenario: Action subscription has correct type and references + +```gwt +Given an LLM agent definition with id "llm-churn-risk" and context "orders" +And an action handler and onComplete reference +When I create an action subscription +Then the subscription has all expected properties: +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-002-object-retry-config-is-passed-through.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-002-object-retry-config-is-passed-through.sdp.md index 48a47e80..f8d0c54f 100644 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-002-object-retry-config-is-passed-through.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-002-object-retry-config-is-passed-through.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Object retry config is passed through" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature +- outcome: Executable scenario: Object retry config is passed through + +```gwt +Given an LLM agent definition with id "llm-churn-risk" and context "orders" +And an action handler and onComplete reference +When I create an action subscription with retry config maxAttempts 3, initialBackoffMs 1000, base 2 +Then the subscription retry config equals maxAttempts 3, initialBackoffMs 1000, base 2 +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-003-boolean-retry-config-is-passed-through.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-003-boolean-retry-config-is-passed-through.sdp.md index 04f24934..d912515e 100644 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-003-boolean-retry-config-is-passed-through.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-003-boolean-retry-config-is-passed-through.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Boolean retry config is passed through" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature +- outcome: Executable scenario: Boolean retry config is passed through + +```gwt +Given an LLM agent definition with id "llm-churn-risk" and context "orders" +And an action handler and onComplete reference +When I create an action subscription with retry set to true +Then the subscription retry is true +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-004-retry-field-is-absent-when-not-specified.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-004-retry-field-is-absent-when-not-specified.sdp.md index e5d79ee8..12cf8ce2 100644 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-004-retry-field-is-absent-when-not-specified.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-004-retry-field-is-absent-when-not-specified.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Retry field is absent when not specified" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature +- outcome: Executable scenario: Retry field is absent when not specified + +```gwt +Given an LLM agent definition with id "llm-churn-risk" and context "orders" +And an action handler and onComplete reference +When I create an action subscription +Then the subscription does not have a retry field +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-005-to-workpool-context-returns-all-required-fields.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-005-to-workpool-context-returns-all-required-fields.sdp.md index 4a7e12f7..05e58fd1 100644 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-005-to-workpool-context-returns-all-required-fields.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-005-to-workpool-context-returns-all-required-fields.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "toWorkpoolContext returns all required fields" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature +- outcome: Executable scenario: toWorkpoolContext returns all required fields + +```gwt +Given an LLM agent definition with id "llm-churn-risk" and context "orders" +And an action handler and onComplete reference +And a mock event "OrderCancelled" with streamId "order_123" at position 42 +And a correlation chain with correlationId "corr_abc" +When I create an action subscription and I call toWorkpoolContext with the event and correlation chain +Then the workpool context has all expected fields: +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-006-causation-id-equals-the-event-event-id.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-006-causation-id-equals-the-event-event-id.sdp.md index 54e97c23..291f2a28 100644 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-006-causation-id-equals-the-event-event-id.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-006-causation-id-equals-the-event-event-id.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "causationId equals the event eventId" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature +- outcome: Executable scenario: causationId equals the event eventId + +```gwt +Given an LLM agent definition with id "llm-churn-risk" and context "orders" +And an action handler and onComplete reference +And a mock event "OrderRefunded" with streamId "order_789" at position 99 +And a correlation chain with correlationId "corr_xyz" +When I create an action subscription and I call toWorkpoolContext with the event and correlation chain +Then the workpool context causationId equals the event eventId "evt_99" +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-007-subscription-uses-default-priority-of-250.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-007-subscription-uses-default-priority-of-250.sdp.md index 247babdb..23ce2221 100644 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-007-subscription-uses-default-priority-of-250.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-007-subscription-uses-default-priority-of-250.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Subscription uses default priority of 250" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature +- outcome: Executable scenario: Subscription uses default priority of 250 + +```gwt +Given an LLM agent definition with id "llm-churn-risk" and context "orders" +And an action handler and onComplete reference +When I create an action subscription +Then the subscription priority is 250 +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-008-subscription-uses-custom-priority.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-008-subscription-uses-custom-priority.sdp.md index fba70ffb..b1d25f41 100644 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-008-subscription-uses-custom-priority.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-008-subscription-uses-custom-priority.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Subscription uses custom priority" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature +- outcome: Executable scenario: Subscription uses custom priority + +```gwt +Given an LLM agent definition with id "llm-churn-risk" and context "orders" +And an action handler and onComplete reference +When I create an action subscription with priority 300 +Then the subscription priority is 300 +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-009-name-includes-context-when-provided.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-009-name-includes-context-when-provided.sdp.md index 2a0db12d..0217134e 100644 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-009-name-includes-context-when-provided.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-009-name-includes-context-when-provided.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Name includes context when provided" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature +- outcome: Executable scenario: Name includes context when provided + +```gwt +Given an LLM agent definition with id "llm-churn-risk" and context "orders" +And an action handler and onComplete reference +When I create an action subscription +Then the subscription name is "agent:orders:llm-churn-risk" +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-010-name-omits-context-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-010-name-omits-context-when-not-provided.sdp.md index c0ec6c4b..c6805ec9 100644 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-010-name-omits-context-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-010-name-omits-context-when-not-provided.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Name omits context when not provided" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature +- outcome: Executable scenario: Name omits context when not provided + +```gwt +Given a simple agent definition with id "simple-llm-agent" +And an action handler and onComplete reference +When I create an action subscription +Then the subscription name is "agent:simple-llm-agent" +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-011-filter-contains-all-configured-event-types.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-011-filter-contains-all-configured-event-types.sdp.md index d9d6f5f1..daa4b22d 100644 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-011-filter-contains-all-configured-event-types.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-011-filter-contains-all-configured-event-types.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Filter contains all configured event types" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature +- outcome: Executable scenario: Filter contains all configured event types + +```gwt +Given an LLM agent definition with id "llm-churn-risk" and context "orders" +And an action handler and onComplete reference +When I create an action subscription +Then the subscription filter contains event types: +And the subscription filter has 2 event types +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-012-to-handler-args-produces-correct-agent-event-handler-args.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-012-to-handler-args-produces-correct-agent-event-handler-args.sdp.md index e85bcb38..47bb1525 100644 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-012-to-handler-args-produces-correct-agent-event-handler-args.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-012-to-handler-args-produces-correct-agent-event-handler-args.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "toHandlerArgs produces correct AgentEventHandlerArgs" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature +- outcome: Executable scenario: toHandlerArgs produces correct AgentEventHandlerArgs + +```gwt +Given an LLM agent definition with id "llm-churn-risk" and context "orders" +And an action handler and onComplete reference +And a mock event "OrderCancelled" with streamId "order_123" at position 42 +And a correlation chain with correlationId "corr_abc" +When I create an action subscription and I call toHandlerArgs with the event and correlation chain +Then the handler args have all expected fields: +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-013-get-partition-key-returns-stream-id-based-partition.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-013-get-partition-key-returns-stream-id-based-partition.sdp.md index bc3c5e55..010628f0 100644 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-013-get-partition-key-returns-stream-id-based-partition.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-013-get-partition-key-returns-stream-id-based-partition.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "getPartitionKey returns streamId-based partition" from packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature +- outcome: Executable scenario: getPartitionKey returns streamId-based partition + +```gwt +Given an LLM agent definition with id "llm-churn-risk" and context "orders" +And an action handler and onComplete reference +And a mock event "OrderCancelled" with streamId "order_456" at position 1 +When I create an action subscription and I call getPartitionKey with the event +Then the partition key name is "streamId" +And the partition key value is "order_456" +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.sdp.md index f442c6d9..f0bb2586 100644 --- a/specs/behavior/platform-core/agent/agent-subscription-action.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription-action.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: The ACTION overload of createAgentSubscription() creates an ActionSubscription with handlerType "action", onComplete reference, optional retry config, default priority, correct naming convention, event filtering, toHandlerArgs transformation, toWorkpoolContext shape, and partition key. (test carrier: packages/platform-core/tests/features/behavior/agent/agent-subscription-action.feature) +- outcome: Agent Subscription - Action Overload + +## Behavior + +- rule: Action subscription creation sets correct handler type and references +- rule: Retry configuration is passed through to action subscriptions +- rule: toWorkpoolContext produces correct shape +- rule: Default priority is 250 +- rule: Subscription name follows agent naming convention +- rule: Event filtering uses configured event types +- rule: toHandlerArgs transforms event to AgentEventHandlerArgs +- rule: Partition key defaults to streamId diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-001-subscription-with-context-has-correct-name.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-001-subscription-with-context-has-correct-name.sdp.md index f61a65a3..8b870838 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-001-subscription-with-context-has-correct-name.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-001-subscription-with-context-has-correct-name.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Subscription with context has correct name" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: Subscription with context has correct name + +```gwt +Given a churn risk agent definition with id "churn-risk-agent" and context "orders" +And a mock mutation handler +When I create a mutation subscription +Then the subscription name is "agent:orders:churn-risk-agent" +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-002-subscription-without-context-has-correct-name.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-002-subscription-without-context-has-correct-name.sdp.md index 5912188c..019c0b10 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-002-subscription-without-context-has-correct-name.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-002-subscription-without-context-has-correct-name.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Subscription without context has correct name" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: Subscription without context has correct name + +```gwt +Given a simple agent definition with id "simple-agent" subscribing to "EventA" +And a mock mutation handler +When I create a mutation subscription +Then the subscription name is "agent:simple-agent" +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-003-subscription-uses-default-priority-of-250.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-003-subscription-uses-default-priority-of-250.sdp.md index 7607570d..1d12d273 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-003-subscription-uses-default-priority-of-250.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-003-subscription-uses-default-priority-of-250.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Subscription uses default priority of 250" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: Subscription uses default priority of 250 + +```gwt +Given a churn risk agent definition with id "churn-risk-agent" and context "orders" +And a mock mutation handler +When I create a mutation subscription +Then the subscription priority is 250 +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-004-subscription-uses-custom-priority.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-004-subscription-uses-custom-priority.sdp.md index 9e6206a1..58e64093 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-004-subscription-uses-custom-priority.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-004-subscription-uses-custom-priority.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Subscription uses custom priority" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: Subscription uses custom priority + +```gwt +Given a churn risk agent definition with id "churn-risk-agent" and context "orders" +And a mock mutation handler +When I create a mutation subscription with priority 300 +Then the subscription priority is 300 +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-005-subscription-filter-contains-correct-event-types.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-005-subscription-filter-contains-correct-event-types.sdp.md index 9001891f..4f94de64 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-005-subscription-filter-contains-correct-event-types.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-005-subscription-filter-contains-correct-event-types.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Subscription filter contains correct event types" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: Subscription filter contains correct event types + +```gwt +Given a churn risk agent definition with id "churn-risk-agent" and context "orders" +And a mock mutation handler +When I create a mutation subscription +Then the subscription filter contains event types: +And the subscription filter has 2 event types +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-006-subscription-attaches-the-handler-reference.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-006-subscription-attaches-the-handler-reference.sdp.md index 0c6880e1..b699730d 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-006-subscription-attaches-the-handler-reference.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-006-subscription-attaches-the-handler-reference.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Subscription attaches the handler reference" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: Subscription attaches the handler reference + +```gwt +Given a churn risk agent definition with id "churn-risk-agent" and context "orders" +And a mock mutation handler +When I create a mutation subscription +Then the subscription handler is the mock handler +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-007-to-handler-args-produces-correct-agent-event-handler-args.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-007-to-handler-args-produces-correct-agent-event-handler-args.sdp.md index 5cc572e4..82a4d0d8 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-007-to-handler-args-produces-correct-agent-event-handler-args.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-007-to-handler-args-produces-correct-agent-event-handler-args.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "toHandlerArgs produces correct AgentEventHandlerArgs" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: toHandlerArgs produces correct AgentEventHandlerArgs + +```gwt +Given a churn risk agent definition with id "churn-risk-agent" and context "orders" +And a mock mutation handler +And a mock event "OrderCancelled" with streamId "order_123" at position 42 +And a correlation chain with correlationId "corr_abc" +When I create a mutation subscription and I call toHandlerArgs with the event and correlation chain +Then the handler args have all expected fields: +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-008-to-handler-args-includes-payload-in-handler-args.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-008-to-handler-args-includes-payload-in-handler-args.sdp.md index c6b5649c..625637e1 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-008-to-handler-args-includes-payload-in-handler-args.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-008-to-handler-args-includes-payload-in-handler-args.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "toHandlerArgs includes payload in handler args" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: toHandlerArgs includes payload in handler args + +```gwt +Given a churn risk agent definition with id "churn-risk-agent" and context "orders" +And a mock mutation handler +And a mock event "OrderCancelled" with streamId "order_123" at position 1 +And the event payload is set to orderId "order_123" amount 150 reason "Changed mind" +And a correlation chain with correlationId "corr_xyz" +When I create a mutation subscription and I call toHandlerArgs with the event and correlation chain +Then the handler args payload equals orderId "order_123" amount 150 reason "Changed mind" +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-009-default-agent-transform-wraps-non-object-payload-in-raw.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-009-default-agent-transform-wraps-non-object-payload-in-raw.sdp.md index 4d6310f1..8fbc51a1 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-009-default-agent-transform-wraps-non-object-payload-in-raw.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-009-default-agent-transform-wraps-non-object-payload-in-raw.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "defaultAgentTransform wraps non-object payload in _raw" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: defaultAgentTransform wraps non-object payload in _raw + +```gwt +Given a mock event "OrderCancelled" with streamId "order_123" at position 1 +And the event payload is set to string "string-payload" +And a correlation chain with correlationId "corr_xyz" +When I call defaultAgentTransform with agentId "test-agent" +Then the handler args payload equals _raw "string-payload" +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-010-custom-to-handler-args-transformer-is-used.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-010-custom-to-handler-args-transformer-is-used.sdp.md index f2e2751e..45f497cf 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-010-custom-to-handler-args-transformer-is-used.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-010-custom-to-handler-args-transformer-is-used.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Custom toHandlerArgs transformer is used" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: Custom toHandlerArgs transformer is used + +```gwt +Given a churn risk agent definition with id "churn-risk-agent" and context "orders" +And a mock mutation handler +And a mock event "OrderCancelled" with streamId "order_123" at position 1 +And a correlation chain with correlationId "corr_xyz" +When I create a mutation subscription with a custom toHandlerArgs transformer and I call toHandlerArgs with the event and correlation chain +Then the custom handler args have expected values: +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-011-partitions-by-stream-id-by-default.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-011-partitions-by-stream-id-by-default.sdp.md index c1dcf451..3efb97c0 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-011-partitions-by-stream-id-by-default.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-011-partitions-by-stream-id-by-default.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Partitions by streamId by default" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: Partitions by streamId by default + +```gwt +Given a churn risk agent definition with id "churn-risk-agent" and context "orders" +And a mock mutation handler +And a mock event "OrderCancelled" with streamId "order_456" at position 1 +When I create a mutation subscription and I call getPartitionKey with the event +Then the partition key name is "streamId" +And the partition key value is "order_456" +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-012-custom-partition-key-extractor-is-used.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-012-custom-partition-key-extractor-is-used.sdp.md index 69fb27be..273870a4 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-012-custom-partition-key-extractor-is-used.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-012-custom-partition-key-extractor-is-used.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Custom partition key extractor is used" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: Custom partition key extractor is used + +```gwt +Given a churn risk agent definition with id "churn-risk-agent" and context "orders" +And a mock mutation handler +And a mock event "OrderCancelled" with streamId "order_789" at position 1 +When I create a mutation subscription with a custom partition key extractor and I call getPartitionKey with the event +Then the partition key name is "agent" +And the partition key value is "churn-risk-agent:orders" +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-013-creates-subscriptions-for-multiple-agents.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-013-creates-subscriptions-for-multiple-agents.sdp.md index a9f23937..71cfa941 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-013-creates-subscriptions-for-multiple-agents.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-013-creates-subscriptions-for-multiple-agents.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Creates subscriptions for multiple agents" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: Creates subscriptions for multiple agents + +```gwt +Given a churn risk agent definition with id "churn-risk-agent" and context "orders" +And a fraud agent definition with id "fraud-agent" subscribing to "PaymentFailed" in context "payments" +And a handler map with entries for "churn-risk-agent" and "fraud-agent" +When I create batch subscriptions +Then the batch has 2 subscriptions +And the batch subscription names are: +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-014-throws-if-handler-is-missing-for-an-agent.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-014-throws-if-handler-is-missing-for-an-agent.sdp.md index 9c18b5c3..c2c146ba 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-014-throws-if-handler-is-missing-for-an-agent.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-014-throws-if-handler-is-missing-for-an-agent.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Throws if handler is missing for an agent" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: Throws if handler is missing for an agent + +```gwt +Given a churn risk agent definition with id "churn-risk-agent" and context "orders" +And a simple agent definition with id "simple-agent" subscribing to "EventA" +And a handler map with entry only for "churn-risk-agent" +When I create batch subscriptions for both agents +Then it throws with message containing "Missing handler for agent" +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-015-applies-common-options-to-all-subscriptions.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-015-applies-common-options-to-all-subscriptions.sdp.md index 961188b0..b18ab28a 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-015-applies-common-options-to-all-subscriptions.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-015-applies-common-options-to-all-subscriptions.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Applies common options to all subscriptions" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: Applies common options to all subscriptions + +```gwt +Given a churn risk agent definition with id "churn-risk-agent" and context "orders" +And a simple agent definition with id "simple-agent" subscribing to "EventA" +And a handler map with entries for "churn-risk-agent" and "simple-agent" +When I create batch subscriptions with priority 300 +Then all subscriptions have priority 300 +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-016-same-agent-id-for-multiple-to-handler-args-calls.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-016-same-agent-id-for-multiple-to-handler-args-calls.sdp.md index 21a1f8b1..2ccef84d 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-016-same-agent-id-for-multiple-to-handler-args-calls.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-016-same-agent-id-for-multiple-to-handler-args-calls.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Same agentId for multiple toHandlerArgs calls" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: Same agentId for multiple toHandlerArgs calls + +```gwt +Given a churn risk agent definition with id "churn-risk-agent" and context "orders" +And a mock mutation handler +And a mock event "OrderCancelled" with streamId "order_123" at position 1 +And a correlation chain with correlationId "corr_abc" +When I create a mutation subscription and I call toHandlerArgs twice with the event and correlation chain +Then both handler args have agentId "churn-risk-agent" +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-017-same-agent-id-for-to-handler-args-and-get-partition-key.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-017-same-agent-id-for-to-handler-args-and-get-partition-key.sdp.md index a977350a..9c4cc478 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-017-same-agent-id-for-to-handler-args-and-get-partition-key.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-017-same-agent-id-for-to-handler-args-and-get-partition-key.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Same agentId for toHandlerArgs and getPartitionKey" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: Same agentId for toHandlerArgs and getPartitionKey + +```gwt +Given a churn risk agent definition with id "churn-risk-agent" and context "orders" +And a mock mutation handler with custom transform and partition key capturing agentId +And a mock event "OrderCancelled" with streamId "order_123" at position 1 +And a correlation chain with correlationId "corr_abc" +When I call toHandlerArgs and getPartitionKey +Then both captured agentIds are "churn-risk-agent" +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-018-filter-matches-subscribed-types-and-rejects-unsubscribed-types.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-018-filter-matches-subscribed-types-and-rejects-unsubscribed-types.sdp.md index b433e754..3fb68938 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-018-filter-matches-subscribed-types-and-rejects-unsubscribed-types.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-018-filter-matches-subscribed-types-and-rejects-unsubscribed-types.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Filter matches subscribed types and rejects unsubscribed types" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: Filter matches subscribed types and rejects unsubscribed types + +```gwt +Given a churn risk agent definition with id "churn-risk-agent" and context "orders" +And a mock mutation handler +When I create a mutation subscription +Then the subscription filter contains event types: +And the subscription filter does not contain event types: +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-019-event-types-array-starts-with-correct-length.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-019-event-types-array-starts-with-correct-length.sdp.md index ecaa81b9..505fc379 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-019-event-types-array-starts-with-correct-length.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-019-event-types-array-starts-with-correct-length.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Event types array starts with correct length" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: Event types array starts with correct length + +```gwt +Given a churn risk agent definition with id "churn-risk-agent" and context "orders" +And a mock mutation handler +When I create a mutation subscription +Then the subscription filter has 2 event types +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-020-transforms-all-published-event-fields-correctly.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-020-transforms-all-published-event-fields-correctly.sdp.md index 14cdf417..e565bf3a 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-020-transforms-all-published-event-fields-correctly.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-020-transforms-all-published-event-fields-correctly.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Transforms all PublishedEvent fields correctly" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: Transforms all PublishedEvent fields correctly + +```gwt +Given a fully populated published event +And a fully populated correlation chain with correlationId "corr_test_abc" +When I call defaultAgentTransform with agentId "test-agent-id" +Then the transform result has all expected fields: +And the transform result payload equals key "value" with nested prop 123 +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-021-handles-null-payload.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-021-handles-null-payload.sdp.md index d2ad2f1d..d97b602b 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-021-handles-null-payload.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-021-handles-null-payload.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Handles null payload" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: Handles null payload + +```gwt +Given a mock event "TestEvent" with streamId "stream_1" at position 1 +And the event payload is set to null +And a correlation chain with correlationId "corr_1" +When I call defaultAgentTransform with agentId "agent" +Then the handler args payload equals _raw null +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-022-handles-array-payload.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-022-handles-array-payload.sdp.md index 93c36202..bf7664ba 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-022-handles-array-payload.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.examples/s-022-handles-array-payload.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Handles array payload" from packages/platform-core/tests/features/behavior/agent/agent-subscription.feature +- outcome: Executable scenario: Handles array payload + +```gwt +Given a mock event "TestEvent" with streamId "stream_1" at position 1 +And the event payload is set to array 1 2 3 +And a correlation chain with correlationId "corr_1" +When I call defaultAgentTransform with agentId "agent" +Then the handler args payload equals _raw array 1 2 3 +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.sdp.md index 8d50d064..f54d3711 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: The createAgentSubscription() factory creates valid EventSubscription objects with correct naming, priority, event filtering, handler args transformation, partition key extraction, batch creation, and agentId memoization. The defaultAgentTransform function handles all PublishedEvent fields and edge cases. (test carrier: packages/platform-core/tests/features/behavior/agent/agent-subscription.feature) +- outcome: Agent Subscription - Mutation Overload + +## Behavior + +- rule: createAgentSubscription produces correct subscription properties +- rule: toHandlerArgs transforms event to AgentEventHandlerArgs +- rule: getPartitionKey extracts correct partition key +- rule: createAgentSubscriptions creates batch subscriptions +- rule: AgentId is memoized across calls +- rule: Event filtering only matches subscribed event types +- rule: defaultAgentTransform handles all PublishedEvent fields diff --git a/specs/behavior/platform-core/agent/approval.examples/s-001-all-six-error-codes-are-present.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-001-all-six-error-codes-are-present.sdp.md index 08027856..1698faf1 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-001-all-six-error-codes-are-present.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-001-all-six-error-codes-are-present.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "All six error codes are present" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: All six error codes are present + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then APPROVAL_ERROR_CODES contains the following entries: +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-002-approval-statuses-contains-all-four-statuses-in-order.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-002-approval-statuses-contains-all-four-statuses-in-order.sdp.md index 11e5d4df..1c43b81b 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-002-approval-statuses-contains-all-four-statuses-in-order.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-002-approval-statuses-contains-all-four-statuses-in-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "APPROVAL_STATUSES contains all four statuses in order" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: APPROVAL_STATUSES contains all four statuses in order + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then APPROVAL_STATUSES equals pending, approved, rejected, expired +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-003-approval-statuses-is-a-4-element-array.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-003-approval-statuses-is-a-4-element-array.sdp.md index 645d0215..ece66e7f 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-003-approval-statuses-is-a-4-element-array.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-003-approval-statuses-is-a-4-element-array.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "APPROVAL_STATUSES is a 4-element array" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: APPROVAL_STATUSES is a 4-element array + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then APPROVAL_STATUSES is an array with 4 elements +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-004-returns-true-for-valid-status-strings.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-004-returns-true-for-valid-status-strings.sdp.md index f9aa0ad1..bd063857 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-004-returns-true-for-valid-status-strings.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-004-returns-true-for-valid-status-strings.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for valid status strings" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns true for valid status strings + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isApprovalStatus returns true for all valid statuses: +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-005-returns-false-for-invalid-strings.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-005-returns-false-for-invalid-strings.sdp.md index 1f43c6a0..7ab6b78d 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-005-returns-false-for-invalid-strings.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-005-returns-false-for-invalid-strings.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for invalid strings" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns false for invalid strings + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isApprovalStatus returns false for invalid values: +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-006-returns-false-for-non-string-types.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-006-returns-false-for-non-string-types.sdp.md index 49e737e9..e1dc5338 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-006-returns-false-for-non-string-types.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-006-returns-false-for-non-string-types.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for non-string types" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns false for non-string types + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isApprovalStatus returns false for non-string types including number, null, undefined, object, and array +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-007-accepts-all-four-valid-statuses.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-007-accepts-all-four-valid-statuses.sdp.md index 09748947..b1326c88 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-007-accepts-all-four-valid-statuses.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-007-accepts-all-four-valid-statuses.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts all four valid statuses" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Accepts all four valid statuses + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then ApprovalStatusSchema accepts all APPROVAL_STATUSES values +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-008-rejects-invalid-status-values.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-008-rejects-invalid-status-values.sdp.md index e7d79651..76429475 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-008-rejects-invalid-status-values.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-008-rejects-invalid-status-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects invalid status values" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Rejects invalid status values + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then ApprovalStatusSchema rejects invalid values: +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-009-accepts-a-valid-approval-object.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-009-accepts-a-valid-approval-object.sdp.md index c3ac0f81..dcccca96 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-009-accepts-a-valid-approval-object.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-009-accepts-a-valid-approval-object.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts a valid approval object" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Accepts a valid approval object + +```gwt +Given the module is imported from platform-core +And a test approval with default values +When the scenario runs +Then PendingApprovalSchema accepts the approval +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-010-rejects-approval-with-missing-required-fields.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-010-rejects-approval-with-missing-required-fields.sdp.md index dbdc795b..120e62a2 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-010-rejects-approval-with-missing-required-fields.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-010-rejects-approval-with-missing-required-fields.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects approval with missing required fields" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Rejects approval with missing required fields + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then PendingApprovalSchema rejects an object with only approvalId +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-011-rejects-approval-with-confidence-above-1.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-011-rejects-approval-with-confidence-above-1.sdp.md index a4f1ba70..16fca574 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-011-rejects-approval-with-confidence-above-1.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-011-rejects-approval-with-confidence-above-1.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects approval with confidence above 1" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Rejects approval with confidence above 1 + +```gwt +Given the module is imported from platform-core +And a test approval with confidence 1.5 +When the scenario runs +Then PendingApprovalSchema rejects the approval +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-012-rejects-approval-with-negative-confidence.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-012-rejects-approval-with-negative-confidence.sdp.md index 49b64a6d..115ff883 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-012-rejects-approval-with-negative-confidence.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-012-rejects-approval-with-negative-confidence.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects approval with negative confidence" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Rejects approval with negative confidence + +```gwt +Given the module is imported from platform-core +And a test approval with confidence -0.1 +When the scenario runs +Then PendingApprovalSchema rejects the approval +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-013-accepts-valid-auth-context-with-user-id-only.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-013-accepts-valid-auth-context-with-user-id-only.sdp.md index 00928d88..eb51f786 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-013-accepts-valid-auth-context-with-user-id-only.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-013-accepts-valid-auth-context-with-user-id-only.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts valid auth context with userId only" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Accepts valid auth context with userId only + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then ApprovalAuthContextSchema accepts a context with userId "user-123" +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-014-accepts-auth-context-with-roles.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-014-accepts-auth-context-with-roles.sdp.md index 9f9eaa92..e998b539 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-014-accepts-auth-context-with-roles.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-014-accepts-auth-context-with-roles.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts auth context with roles" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Accepts auth context with roles + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then ApprovalAuthContextSchema accepts a context with roles "reviewer" and "admin" +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-015-accepts-auth-context-with-agent-ids.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-015-accepts-auth-context-with-agent-ids.sdp.md index 022e8bc8..939fefe1 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-015-accepts-auth-context-with-agent-ids.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-015-accepts-auth-context-with-agent-ids.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts auth context with agentIds" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Accepts auth context with agentIds + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then ApprovalAuthContextSchema accepts a context with agentIds "agent-1" and "agent-2" +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-016-rejects-auth-context-with-empty-user-id.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-016-rejects-auth-context-with-empty-user-id.sdp.md index b0a96a18..9e0b454e 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-016-rejects-auth-context-with-empty-user-id.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-016-rejects-auth-context-with-empty-user-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects auth context with empty userId" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Rejects auth context with empty userId + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then ApprovalAuthContextSchema rejects a context with empty userId +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-017-parses-valid-duration-strings.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-017-parses-valid-duration-strings.sdp.md index 6663ce72..433f4784 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-017-parses-valid-duration-strings.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-017-parses-valid-duration-strings.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Parses valid duration strings" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Parses valid duration strings + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then parseApprovalTimeout returns correct milliseconds: +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-018-returns-null-for-invalid-formats.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-018-returns-null-for-invalid-formats.sdp.md index ece248b5..a660d416 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-018-returns-null-for-invalid-formats.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-018-returns-null-for-invalid-formats.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns null for invalid formats" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns null for invalid formats + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then parseApprovalTimeout returns null for all of: +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-019-returns-null-for-zero-values.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-019-returns-null-for-zero-values.sdp.md index b8bcbfc2..84a6ca90 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-019-returns-null-for-zero-values.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-019-returns-null-for-zero-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns null for zero values" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns null for zero values + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then parseApprovalTimeout returns null for all of: +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-020-returns-true-for-valid-timeout-formats.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-020-returns-true-for-valid-timeout-formats.sdp.md index 04975502..17563ec8 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-020-returns-true-for-valid-timeout-formats.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-020-returns-true-for-valid-timeout-formats.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for valid timeout formats" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns true for valid timeout formats + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isValidApprovalTimeout returns true for: +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-021-returns-false-for-invalid-timeout-formats.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-021-returns-false-for-invalid-timeout-formats.sdp.md index 09651fdb..7c179121 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-021-returns-false-for-invalid-timeout-formats.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-021-returns-false-for-invalid-timeout-formats.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for invalid timeout formats" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns false for invalid timeout formats + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isValidApprovalTimeout returns false for: +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-022-uses-explicit-timeout-from-config.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-022-uses-explicit-timeout-from-config.sdp.md index 5aa4119b..bdff5a24 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-022-uses-explicit-timeout-from-config.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-022-uses-explicit-timeout-from-config.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Uses explicit timeout from config" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Uses explicit timeout from config + +```gwt +Given the module is imported from platform-core +And a config with approvalTimeout "1h" and requestedAt 1000000 +When I calculate the expiration time +Then the expiration time equals requestedAt plus 3600000 +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-023-uses-default-timeout-when-not-specified.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-023-uses-default-timeout-when-not-specified.sdp.md index 89d6b0ef..444775b8 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-023-uses-default-timeout-when-not-specified.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-023-uses-default-timeout-when-not-specified.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Uses default timeout when not specified" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Uses default timeout when not specified + +```gwt +Given the module is imported from platform-core +And a config with no approvalTimeout and requestedAt 1000000 +When I calculate the expiration time +Then the expiration time equals requestedAt plus the default timeout +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-024-uses-default-timeout-for-invalid-format.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-024-uses-default-timeout-for-invalid-format.sdp.md index db18a6fd..77f59ad8 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-024-uses-default-timeout-for-invalid-format.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-024-uses-default-timeout-for-invalid-format.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Uses default timeout for invalid format" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Uses default timeout for invalid format + +```gwt +Given the module is imported from platform-core +And a config with approvalTimeout "invalid" and requestedAt 1000000 +When I calculate the expiration time +Then the expiration time equals requestedAt plus the default timeout +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-025-returns-true-when-confidence-is-below-threshold.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-025-returns-true-when-confidence-is-below-threshold.sdp.md index e5770ef9..73dc0263 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-025-returns-true-when-confidence-is-below-threshold.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-025-returns-true-when-confidence-is-below-threshold.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when confidence is below threshold" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns true when confidence is below threshold + +```gwt +Given the module is imported from platform-core +And a config with confidenceThreshold 0.9 +When the scenario runs +Then shouldRequireApproval for action "SomeAction" with confidence 0.85 returns true +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-026-returns-true-when-confidence-equals-threshold-inclusive.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-026-returns-true-when-confidence-equals-threshold-inclusive.sdp.md index 9e2e228f..312f2c4c 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-026-returns-true-when-confidence-equals-threshold-inclusive.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-026-returns-true-when-confidence-equals-threshold-inclusive.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when confidence equals threshold (inclusive)" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns true when confidence equals threshold (inclusive) + +```gwt +Given the module is imported from platform-core +And a config with confidenceThreshold 0.9 +When the scenario runs +Then shouldRequireApproval for action "SomeAction" with confidence 0.9 returns true +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-027-returns-false-when-confidence-is-above-threshold.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-027-returns-false-when-confidence-is-above-threshold.sdp.md index 2924a4d9..2f38e536 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-027-returns-false-when-confidence-is-above-threshold.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-027-returns-false-when-confidence-is-above-threshold.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when confidence is above threshold" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns false when confidence is above threshold + +```gwt +Given the module is imported from platform-core +And a config with confidenceThreshold 0.9 +When the scenario runs +Then shouldRequireApproval for action "SomeAction" with confidence 0.95 returns false +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-028-uses-default-threshold-of-0-9-when-not-specified.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-028-uses-default-threshold-of-0-9-when-not-specified.sdp.md index 49f42719..87e476d8 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-028-uses-default-threshold-of-0-9-when-not-specified.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-028-uses-default-threshold-of-0-9-when-not-specified.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Uses default threshold of 0.9 when not specified" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Uses default threshold of 0.9 when not specified + +```gwt +Given the module is imported from platform-core +And a config with no confidenceThreshold +When the scenario runs +Then shouldRequireApproval for action "SomeAction" with confidence 0.85 returns true +And shouldRequireApproval for action "SomeAction" with confidence 0.91 returns false +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-029-returns-true-for-listed-action-even-with-high-confidence.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-029-returns-true-for-listed-action-even-with-high-confidence.sdp.md index 5f2ddeeb..315d8ead 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-029-returns-true-for-listed-action-even-with-high-confidence.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-029-returns-true-for-listed-action-even-with-high-confidence.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for listed action even with high confidence" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns true for listed action even with high confidence + +```gwt +Given the module is imported from platform-core +And a config with confidenceThreshold 0.9 and requiresApproval list "DeleteCustomer,TransferFunds" +When the scenario runs +Then shouldRequireApproval for action "DeleteCustomer" with confidence 0.99 returns true +And shouldRequireApproval for action "TransferFunds" with confidence 1.0 returns true +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-030-returns-false-for-unlisted-action-with-high-confidence.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-030-returns-false-for-unlisted-action-with-high-confidence.sdp.md index d3c008eb..67be8055 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-030-returns-false-for-unlisted-action-with-high-confidence.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-030-returns-false-for-unlisted-action-with-high-confidence.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for unlisted action with high confidence" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns false for unlisted action with high confidence + +```gwt +Given the module is imported from platform-core +And a config with confidenceThreshold 0.9 and requiresApproval list "DeleteCustomer" +When the scenario runs +Then shouldRequireApproval for action "UpdateCustomer" with confidence 0.95 returns false +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-031-returns-false-for-auto-approved-action-with-low-confidence.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-031-returns-false-for-auto-approved-action-with-low-confidence.sdp.md index 79360ac7..3dcfa73a 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-031-returns-false-for-auto-approved-action-with-low-confidence.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-031-returns-false-for-auto-approved-action-with-low-confidence.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for auto-approved action with low confidence" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns false for auto-approved action with low confidence + +```gwt +Given the module is imported from platform-core +And a config with confidenceThreshold 0.9 and autoApprove list "LogEvent,SendNotification" +When the scenario runs +Then shouldRequireApproval for action "LogEvent" with confidence 0.1 returns false +And shouldRequireApproval for action "SendNotification" with confidence 0.5 returns false +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-032-auto-approve-takes-precedence-over-low-confidence.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-032-auto-approve-takes-precedence-over-low-confidence.sdp.md index fb7b8f38..256784b5 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-032-auto-approve-takes-precedence-over-low-confidence.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-032-auto-approve-takes-precedence-over-low-confidence.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "autoApprove takes precedence over low confidence" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: autoApprove takes precedence over low confidence + +```gwt +Given the module is imported from platform-core +And a config with confidenceThreshold 0.9 and autoApprove list "SafeAction" +When the scenario runs +Then shouldRequireApproval for action "SafeAction" with confidence 0.1 returns false +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-033-requires-approval-wins-when-action-is-in-both-lists.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-033-requires-approval-wins-when-action-is-in-both-lists.sdp.md index 93d2e38a..9b94a845 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-033-requires-approval-wins-when-action-is-in-both-lists.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-033-requires-approval-wins-when-action-is-in-both-lists.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "requiresApproval wins when action is in both lists" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: requiresApproval wins when action is in both lists + +```gwt +Given the module is imported from platform-core +And a config with requiresApproval "ConflictAction" and autoApprove "ConflictAction" +When the scenario runs +Then shouldRequireApproval for action "ConflictAction" with confidence 0.99 returns true +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-034-falls-through-to-confidence-check-with-empty-lists.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-034-falls-through-to-confidence-check-with-empty-lists.sdp.md index 7fd93331..a0eeab50 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-034-falls-through-to-confidence-check-with-empty-lists.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-034-falls-through-to-confidence-check-with-empty-lists.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Falls through to confidence check with empty lists" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Falls through to confidence check with empty lists + +```gwt +Given the module is imported from platform-core +And a config with confidenceThreshold 0.9 and empty requiresApproval and autoApprove +When the scenario runs +Then shouldRequireApproval for action "SomeAction" with confidence 0.85 returns true +And shouldRequireApproval for action "SomeAction" with confidence 0.95 returns false +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-035-falls-through-to-confidence-check-with-undefined-lists.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-035-falls-through-to-confidence-check-with-undefined-lists.sdp.md index a4a535e6..70e69423 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-035-falls-through-to-confidence-check-with-undefined-lists.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-035-falls-through-to-confidence-check-with-undefined-lists.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Falls through to confidence check with undefined lists" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Falls through to confidence check with undefined lists + +```gwt +Given the module is imported from platform-core +And a config with confidenceThreshold 0.9 +When the scenario runs +Then shouldRequireApproval for action "SomeAction" with confidence 0.85 returns true +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-036-handles-confidence-of-0.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-036-handles-confidence-of-0.sdp.md index 221c535b..ae551e6a 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-036-handles-confidence-of-0.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-036-handles-confidence-of-0.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Handles confidence of 0" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Handles confidence of 0 + +```gwt +Given the module is imported from platform-core +And a config with confidenceThreshold 0.9 +When the scenario runs +Then shouldRequireApproval for action "SomeAction" with confidence 0 returns true +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-037-handles-confidence-of-1.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-037-handles-confidence-of-1.sdp.md index c4593ba2..61c17f33 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-037-handles-confidence-of-1.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-037-handles-confidence-of-1.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Handles confidence of 1" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Handles confidence of 1 + +```gwt +Given the module is imported from platform-core +And a config with confidenceThreshold 0.9 +When the scenario runs +Then shouldRequireApproval for action "SomeAction" with confidence 1 returns false +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-038-returns-true-when-agent-id-is-in-auth-context-agent-ids.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-038-returns-true-when-agent-id-is-in-auth-context-agent-ids.sdp.md index c245444a..bc141376 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-038-returns-true-when-agent-id-is-in-auth-context-agent-ids.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-038-returns-true-when-agent-id-is-in-auth-context-agent-ids.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when agentId is in authContext agentIds" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns true when agentId is in authContext agentIds + +```gwt +Given the module is imported from platform-core +And an approval with agentId "agent-1" +And an auth context with agentIds "agent-1,agent-2" +When the scenario runs +Then isAuthorizedReviewer returns true +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-039-returns-false-when-agent-id-is-not-in-auth-context-agent-ids.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-039-returns-false-when-agent-id-is-not-in-auth-context-agent-ids.sdp.md index 2ffbae95..7adba617 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-039-returns-false-when-agent-id-is-not-in-auth-context-agent-ids.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-039-returns-false-when-agent-id-is-not-in-auth-context-agent-ids.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when agentId is not in authContext agentIds" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns false when agentId is not in authContext agentIds + +```gwt +Given the module is imported from platform-core +And an approval with agentId "agent-3" +And an auth context with agentIds "agent-1,agent-2" +When the scenario runs +Then isAuthorizedReviewer returns false +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-040-returns-false-when-agent-ids-is-undefined.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-040-returns-false-when-agent-ids-is-undefined.sdp.md index ec965772..f0a20acc 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-040-returns-false-when-agent-ids-is-undefined.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-040-returns-false-when-agent-ids-is-undefined.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when agentIds is undefined" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns false when agentIds is undefined + +```gwt +Given the module is imported from platform-core +And an approval with agentId "any-agent" +And an auth context with no agentIds +When the scenario runs +Then isAuthorizedReviewer returns false +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-041-returns-false-when-agent-ids-is-empty.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-041-returns-false-when-agent-ids-is-empty.sdp.md index 8f691249..ea8b0132 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-041-returns-false-when-agent-ids-is-empty.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-041-returns-false-when-agent-ids-is-empty.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when agentIds is empty" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns false when agentIds is empty + +```gwt +Given the module is imported from platform-core +And an approval with agentId "any-agent" +And an auth context with empty agentIds +When the scenario runs +Then isAuthorizedReviewer returns false +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-042-returns-true-when-user-has-at-least-one-role.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-042-returns-true-when-user-has-at-least-one-role.sdp.md index 20ac6401..ef16d61d 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-042-returns-true-when-user-has-at-least-one-role.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-042-returns-true-when-user-has-at-least-one-role.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when user has at least one role" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns true when user has at least one role + +```gwt +Given the module is imported from platform-core +And a default approval +And an auth context with roles "reviewer" +When the scenario runs +Then isAuthorizedReviewer returns true +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-043-returns-false-when-roles-is-undefined.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-043-returns-false-when-roles-is-undefined.sdp.md index 29761977..760079dc 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-043-returns-false-when-roles-is-undefined.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-043-returns-false-when-roles-is-undefined.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when roles is undefined" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns false when roles is undefined + +```gwt +Given the module is imported from platform-core +And a default approval +And an auth context with no roles +When the scenario runs +Then isAuthorizedReviewer returns false +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-044-returns-false-when-roles-is-empty.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-044-returns-false-when-roles-is-empty.sdp.md index 041ea109..301335e0 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-044-returns-false-when-roles-is-empty.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-044-returns-false-when-roles-is-empty.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when roles is empty" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns false when roles is empty + +```gwt +Given the module is imported from platform-core +And a default approval +And an auth context with empty roles +When the scenario runs +Then isAuthorizedReviewer returns false +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-045-agent-ids-check-fails-even-with-admin-role.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-045-agent-ids-check-fails-even-with-admin-role.sdp.md index 61a28b2f..909d2d73 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-045-agent-ids-check-fails-even-with-admin-role.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-045-agent-ids-check-fails-even-with-admin-role.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "AgentIds check fails even with admin role" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: AgentIds check fails even with admin role + +```gwt +Given the module is imported from platform-core +And an approval with agentId "restricted-agent" +And an auth context with agentIds "other-agent" and roles "admin" +When the scenario runs +Then isAuthorizedReviewer returns false +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-046-both-agent-ids-and-roles-pass.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-046-both-agent-ids-and-roles-pass.sdp.md index c705f1c7..da46647d 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-046-both-agent-ids-and-roles-pass.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-046-both-agent-ids-and-roles-pass.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Both agentIds and roles pass" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Both agentIds and roles pass + +```gwt +Given the module is imported from platform-core +And an approval with agentId "allowed-agent" +And an auth context with agentIds "allowed-agent" and roles "reviewer" +When the scenario runs +Then isAuthorizedReviewer returns true +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-047-generates-id-with-apr-prefix-and-correct-format.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-047-generates-id-with-apr-prefix-and-correct-format.sdp.md index 575217d0..19a000e1 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-047-generates-id-with-apr-prefix-and-correct-format.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-047-generates-id-with-apr-prefix-and-correct-format.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Generates ID with apr_ prefix and correct format" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Generates ID with apr_ prefix and correct format + +```gwt +Given the module is imported from platform-core +When I generate an approval ID +Then the approval ID starts with "apr_" +And the approval ID has 2 underscore-delimited parts +And the second part has 36 characters +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-048-generates-unique-i-ds-over-multiple-calls.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-048-generates-unique-i-ds-over-multiple-calls.sdp.md index 69ba017b..c83fbbcf 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-048-generates-unique-i-ds-over-multiple-calls.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-048-generates-unique-i-ds-over-multiple-calls.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Generates unique IDs over multiple calls" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Generates unique IDs over multiple calls + +```gwt +Given the module is imported from platform-core +When I generate 3 approval IDs with delay +Then all 3 IDs are unique +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-049-sets-correct-initial-field-values.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-049-sets-correct-initial-field-values.sdp.md index 723f8678..ead05d17 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-049-sets-correct-initial-field-values.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-049-sets-correct-initial-field-values.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Sets correct initial field values" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Sets correct initial field values + +```gwt +Given the module is imported from platform-core +And fake time is set to "2024-01-15T12:00:00Z" +When I create a pending approval for agent "test-agent" decision "dec_123" action "TestAction" confidence 0.75 reason "Test reason" timeout "24h" +Then the approval has the following initial values: +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-050-generates-unique-approval-ids-over-multiple-calls.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-050-generates-unique-approval-ids-over-multiple-calls.sdp.md index d0ec3bca..9757556c 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-050-generates-unique-approval-ids-over-multiple-calls.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-050-generates-unique-approval-ids-over-multiple-calls.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Generates unique approvalIds over multiple calls" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Generates unique approvalIds over multiple calls + +```gwt +Given the module is imported from platform-core +When I create 3 pending approvals with delay +Then all 3 approval IDs are unique +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-051-sets-requested-at-to-current-time.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-051-sets-requested-at-to-current-time.sdp.md index c02fbc1d..adcc91c2 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-051-sets-requested-at-to-current-time.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-051-sets-requested-at-to-current-time.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Sets requestedAt to current time" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Sets requestedAt to current time + +```gwt +Given the module is imported from platform-core +And fake time is set to "2024-01-15T12:00:00Z" +When I create a pending approval with default values +Then the approval requestedAt equals the current fake time +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-052-calculates-expires-at-based-on-config-timeout.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-052-calculates-expires-at-based-on-config-timeout.sdp.md index ee60b839..294e07b0 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-052-calculates-expires-at-based-on-config-timeout.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-052-calculates-expires-at-based-on-config-timeout.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Calculates expiresAt based on config timeout" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Calculates expiresAt based on config timeout + +```gwt +Given the module is imported from platform-core +And fake time is set to "2024-01-15T12:00:00Z" +When I create a pending approval with timeout "1h" +Then the approval expiresAt equals requestedAt plus 3600000 +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-053-does-not-include-optional-fields-initially.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-053-does-not-include-optional-fields-initially.sdp.md index 8246fa3b..d157b58a 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-053-does-not-include-optional-fields-initially.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-053-does-not-include-optional-fields-initially.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Does not include optional fields initially" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Does not include optional fields initially + +```gwt +Given the module is imported from platform-core +And fake time is set to "2024-01-15T12:00:00Z" +When I create a pending approval with default values +Then the approval optional fields are all undefined: +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-054-transitions-pending-approval-to-approved.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-054-transitions-pending-approval-to-approved.sdp.md index 771f743a..0ce37f97 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-054-transitions-pending-approval-to-approved.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-054-transitions-pending-approval-to-approved.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Transitions pending approval to approved" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Transitions pending approval to approved + +```gwt +Given the module is imported from platform-core +And fake time is set to "2024-01-15T12:00:00Z" +And a pending approval +When I approve the approval with reviewer "reviewer-123" +Then the result status is "approved" +And the result reviewerId is "reviewer-123" +And the result reviewedAt equals the current fake time +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-055-includes-review-note-when-provided.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-055-includes-review-note-when-provided.sdp.md index 52596211..aeb02efa 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-055-includes-review-note-when-provided.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-055-includes-review-note-when-provided.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Includes reviewNote when provided" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Includes reviewNote when provided + +```gwt +Given the module is imported from platform-core +And fake time is set to "2024-01-15T12:00:00Z" +And a pending approval +When I approve the approval with reviewer "reviewer-123" and note "Looks good!" +Then the result reviewNote is "Looks good!" +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-056-does-not-include-review-note-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-056-does-not-include-review-note-when-not-provided.sdp.md index bce30f4c..5c9cf0ab 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-056-does-not-include-review-note-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-056-does-not-include-review-note-when-not-provided.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Does not include reviewNote when not provided" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Does not include reviewNote when not provided + +```gwt +Given the module is imported from platform-core +And fake time is set to "2024-01-15T12:00:00Z" +And a pending approval +When I approve the approval with reviewer "reviewer-123" +Then the result reviewNote is undefined +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-057-throws-error-for-non-pending-statuses.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-057-throws-error-for-non-pending-statuses.sdp.md index a0ed2e28..370b058f 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-057-throws-error-for-non-pending-statuses.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-057-throws-error-for-non-pending-statuses.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws error for non-pending statuses" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Throws error for non-pending statuses + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then approving a non-pending approval throws for statuses: +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-058-throws-error-for-expired-pending-approvals.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-058-throws-error-for-expired-pending-approvals.sdp.md index c7ab2a67..4b37eff8 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-058-throws-error-for-expired-pending-approvals.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-058-throws-error-for-expired-pending-approvals.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Throws error for expired pending approvals" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Throws error for expired pending approvals + +```gwt +Given the module is imported from platform-core +And fake time is set to "2024-01-15T12:00:00Z" +When I approve an expired pending approval +Then the approval action throws "approval has expired" +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-059-preserves-other-fields-after-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-059-preserves-other-fields-after-approval.sdp.md index c00bd6d3..7a5ff5b1 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-059-preserves-other-fields-after-approval.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-059-preserves-other-fields-after-approval.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Preserves other fields after approval" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Preserves other fields after approval + +```gwt +Given the module is imported from platform-core +And fake time is set to "2024-01-15T12:00:00Z" +And a pending approval with agentId "my-agent" decisionId "my-decision" confidence 0.8 +When I approve the approval with reviewer "reviewer-123" +Then the result preserves agentId "my-agent" decisionId "my-decision" confidence 0.8 +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-060-transitions-pending-approval-to-rejected-with-reason.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-060-transitions-pending-approval-to-rejected-with-reason.sdp.md index fc7ccf1a..29d6bced 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-060-transitions-pending-approval-to-rejected-with-reason.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-060-transitions-pending-approval-to-rejected-with-reason.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Transitions pending approval to rejected with reason" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Transitions pending approval to rejected with reason + +```gwt +Given the module is imported from platform-core +And fake time is set to "2024-01-15T12:00:00Z" +And a pending approval +When I reject the approval with reviewer "reviewer-123" and reason "Not appropriate" +Then the result status is "rejected" +And the result reviewerId is "reviewer-123" +And the result rejectionReason is "Customer already contacted" +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-061-sets-reviewed-at-to-current-time-on-rejection.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-061-sets-reviewed-at-to-current-time-on-rejection.sdp.md index a0e7e409..6c5a702a 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-061-sets-reviewed-at-to-current-time-on-rejection.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-061-sets-reviewed-at-to-current-time-on-rejection.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Sets reviewedAt to current time on rejection" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Sets reviewedAt to current time on rejection + +```gwt +Given the module is imported from platform-core +And fake time is set to "2024-01-15T12:00:00Z" +And a pending approval +When I reject the approval with reviewer "reviewer-123" and reason "Reason" +Then the result reviewedAt equals the current fake time +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-062-throws-error-when-rejecting-non-pending-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-062-throws-error-when-rejecting-non-pending-approval.sdp.md index bfa780f4..42e1da8f 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-062-throws-error-when-rejecting-non-pending-approval.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-062-throws-error-when-rejecting-non-pending-approval.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws error when rejecting non-pending approval" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Throws error when rejecting non-pending approval + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then rejecting a non-pending approval throws for status "approved" +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-063-throws-error-when-rejecting-expired-pending-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-063-throws-error-when-rejecting-expired-pending-approval.sdp.md index 00a52670..cc3f8a59 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-063-throws-error-when-rejecting-expired-pending-approval.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-063-throws-error-when-rejecting-expired-pending-approval.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Throws error when rejecting expired pending approval" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Throws error when rejecting expired pending approval + +```gwt +Given the module is imported from platform-core +And fake time is set to "2024-01-15T12:00:00Z" +When I reject an expired pending approval +Then the rejection action throws "approval has expired" +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-064-transitions-pending-approval-to-expired.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-064-transitions-pending-approval-to-expired.sdp.md index 778db323..d30abc26 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-064-transitions-pending-approval-to-expired.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-064-transitions-pending-approval-to-expired.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Transitions pending approval to expired" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Transitions pending approval to expired + +```gwt +Given the module is imported from platform-core +And a pending approval +When I expire the approval +Then the result status is "expired" +And the result reviewerId is undefined +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-065-throws-error-when-expiring-non-pending-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-065-throws-error-when-expiring-non-pending-approval.sdp.md index c5855726..55f97835 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-065-throws-error-when-expiring-non-pending-approval.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-065-throws-error-when-expiring-non-pending-approval.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws error when expiring non-pending approval" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Throws error when expiring non-pending approval + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then expiring a non-pending approval throws for status "approved" +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-066-preserves-original-fields-after-expiration.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-066-preserves-original-fields-after-expiration.sdp.md index 4510fc9d..d96a990e 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-066-preserves-original-fields-after-expiration.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-066-preserves-original-fields-after-expiration.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Preserves original fields after expiration" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Preserves original fields after expiration + +```gwt +Given the module is imported from platform-core +And a pending approval with confidence 0.7 +When I expire the approval +Then the result confidence is 0.7 +And the result approvalId matches the original +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-067-returns-success-for-valid-pending-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-067-returns-success-for-valid-pending-approval.sdp.md index 47e02b45..292733ee 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-067-returns-success-for-valid-pending-approval.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-067-returns-success-for-valid-pending-approval.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Returns success for valid pending approval" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns success for valid pending approval + +```gwt +Given the module is imported from platform-core +And fake time is set to "2024-01-15T12:00:00Z" +And a pending approval +And a valid auth context +When I safely approve the approval with note "Note" +Then the safe result is successful +And the safe result approval status is "approved" +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-068-returns-unauthorized-reviewer-when-not-authorized.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-068-returns-unauthorized-reviewer-when-not-authorized.sdp.md index 47344460..e805bb92 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-068-returns-unauthorized-reviewer-when-not-authorized.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-068-returns-unauthorized-reviewer-when-not-authorized.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Returns UNAUTHORIZED_REVIEWER when not authorized" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns UNAUTHORIZED_REVIEWER when not authorized + +```gwt +Given the module is imported from platform-core +And an approval with agentId "restricted-agent" +And an auth context with agentIds "other-agent" +When I safely approve the approval +Then the safe result is not successful +And the safe result error code is "UNAUTHORIZED_REVIEWER" +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-069-returns-invalid-status-transition-when-already-processed.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-069-returns-invalid-status-transition-when-already-processed.sdp.md index 088916f0..7deabeea 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-069-returns-invalid-status-transition-when-already-processed.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-069-returns-invalid-status-transition-when-already-processed.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Returns INVALID_STATUS_TRANSITION when already processed" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns INVALID_STATUS_TRANSITION when already processed + +```gwt +Given the module is imported from platform-core +And an already approved approval +And a valid auth context +When I safely approve the approval +Then the safe result is not successful +And the safe result error code is "INVALID_STATUS_TRANSITION" +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-070-returns-approval-expired-when-past-expiration.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-070-returns-approval-expired-when-past-expiration.sdp.md index 8a2acfe2..4d9b2bc6 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-070-returns-approval-expired-when-past-expiration.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-070-returns-approval-expired-when-past-expiration.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Returns APPROVAL_EXPIRED when past expiration" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns APPROVAL_EXPIRED when past expiration + +```gwt +Given the module is imported from platform-core +And fake time is set to "2024-01-15T12:00:00Z" +And a pending approval that expired 1 second ago +And a valid auth context +When I safely approve the approval +Then the safe result is not successful +And the safe result error code is "APPROVAL_EXPIRED" +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-071-returns-success-for-valid-rejection.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-071-returns-success-for-valid-rejection.sdp.md index 5ad2bddf..929b090d 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-071-returns-success-for-valid-rejection.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-071-returns-success-for-valid-rejection.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Returns success for valid rejection" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns success for valid rejection + +```gwt +Given the module is imported from platform-core +And fake time is set to "2024-01-15T12:00:00Z" +And a pending approval +And a valid auth context +When I safely reject the approval with reason "Reason" +Then the safe result is successful +And the safe result approval status is "rejected" +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-072-returns-unauthorized-reviewer-on-safe-reject.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-072-returns-unauthorized-reviewer-on-safe-reject.sdp.md index 04d09060..ea19e487 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-072-returns-unauthorized-reviewer-on-safe-reject.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-072-returns-unauthorized-reviewer-on-safe-reject.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Returns UNAUTHORIZED_REVIEWER on safe reject" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns UNAUTHORIZED_REVIEWER on safe reject + +```gwt +Given the module is imported from platform-core +And an approval with agentId "restricted-agent" +And an auth context with agentIds "other-agent" +When I safely reject the approval with reason "Reason" +Then the safe result is not successful +And the safe result error code is "UNAUTHORIZED_REVIEWER" +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-073-returns-approval-expired-on-safe-reject.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-073-returns-approval-expired-on-safe-reject.sdp.md index 0a6f9acf..03bf7f9b 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-073-returns-approval-expired-on-safe-reject.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-073-returns-approval-expired-on-safe-reject.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Returns APPROVAL_EXPIRED on safe reject" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns APPROVAL_EXPIRED on safe reject + +```gwt +Given the module is imported from platform-core +And fake time is set to "2024-01-15T12:00:00Z" +And a pending approval that expired 1 second ago +And a valid auth context +When I safely reject the approval with reason "Reason" +Then the safe result is not successful +And the safe result error code is "APPROVAL_EXPIRED" +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-074-is-approval-pending-returns-true-only-for-pending.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-074-is-approval-pending-returns-true-only-for-pending.sdp.md index 28845b93..3d366b6a 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-074-is-approval-pending-returns-true-only-for-pending.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-074-is-approval-pending-returns-true-only-for-pending.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "isApprovalPending returns true only for pending" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: isApprovalPending returns true only for pending + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isApprovalPending returns true for status "pending" +And isApprovalPending returns false for statuses: +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-075-is-approval-approved-returns-true-only-for-approved.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-075-is-approval-approved-returns-true-only-for-approved.sdp.md index ab8a6945..ed700c6b 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-075-is-approval-approved-returns-true-only-for-approved.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-075-is-approval-approved-returns-true-only-for-approved.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "isApprovalApproved returns true only for approved" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: isApprovalApproved returns true only for approved + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isApprovalApproved returns true for status "approved" +And isApprovalApproved returns false for status "pending" +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-076-is-approval-rejected-returns-true-only-for-rejected.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-076-is-approval-rejected-returns-true-only-for-rejected.sdp.md index eb0b6f63..e15bdc14 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-076-is-approval-rejected-returns-true-only-for-rejected.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-076-is-approval-rejected-returns-true-only-for-rejected.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "isApprovalRejected returns true only for rejected" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: isApprovalRejected returns true only for rejected + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isApprovalRejected returns true for status "rejected" +And isApprovalRejected returns false for status "pending" +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-077-is-approval-expired-detects-expired-status-and-time-based-expiration.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-077-is-approval-expired-detects-expired-status-and-time-based-expiration.sdp.md index f48d046a..8ae3c64a 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-077-is-approval-expired-detects-expired-status-and-time-based-expiration.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-077-is-approval-expired-detects-expired-status-and-time-based-expiration.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "isApprovalExpired detects expired status and time-based expiration" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: isApprovalExpired detects expired status and time-based expiration + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isApprovalExpired returns true for status "expired" +And isApprovalExpired returns true for pending approval past expiration time +And isApprovalExpired returns false for pending approval before expiration time +And isApprovalExpired returns false for status "approved" +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-078-is-approval-actionable-checks-pending-and-not-expired.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-078-is-approval-actionable-checks-pending-and-not-expired.sdp.md index f281c4c1..b0f4881c 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-078-is-approval-actionable-checks-pending-and-not-expired.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-078-is-approval-actionable-checks-pending-and-not-expired.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "isApprovalActionable checks pending and not expired" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: isApprovalActionable checks pending and not expired + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isApprovalActionable returns true for pending approval before expiration +And isApprovalActionable returns false for pending approval at expiration +And isApprovalActionable returns false for status "approved" +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-079-returns-remaining-time-for-pending-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-079-returns-remaining-time-for-pending-approval.sdp.md index 5e6ea449..6e15ded7 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-079-returns-remaining-time-for-pending-approval.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-079-returns-remaining-time-for-pending-approval.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns remaining time for pending approval" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns remaining time for pending approval + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then getRemainingApprovalTime returns 5000 for pending approval expiring in 5000ms +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-080-returns-0-for-expired-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-080-returns-0-for-expired-approval.sdp.md index 55132c2e..5b2b0233 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-080-returns-0-for-expired-approval.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-080-returns-0-for-expired-approval.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns 0 for expired approval" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns 0 for expired approval + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then getRemainingApprovalTime returns 0 for pending approval past expiration +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-081-returns-0-for-non-pending-status.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-081-returns-0-for-non-pending-status.sdp.md index e9756972..9215f5a7 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-081-returns-0-for-non-pending-status.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-081-returns-0-for-non-pending-status.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns 0 for non-pending status" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns 0 for non-pending status + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then getRemainingApprovalTime returns 0 for approved status +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-082-formats-hours-and-minutes.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-082-formats-hours-and-minutes.sdp.md index b6374be5..9511d2bb 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-082-formats-hours-and-minutes.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-082-formats-hours-and-minutes.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Formats hours and minutes" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Formats hours and minutes + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then formatRemainingApprovalTime returns "2h 30m" for 2.5 hours remaining +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-083-formats-minutes-only.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-083-formats-minutes-only.sdp.md index f7ea4dd8..17cb14eb 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-083-formats-minutes-only.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-083-formats-minutes-only.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Formats minutes only" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Formats minutes only + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then formatRemainingApprovalTime returns "45m" for 45 minutes remaining +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-084-returns-expired-for-past-expiration.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-084-returns-expired-for-past-expiration.sdp.md index 5df762c0..427bf242 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-084-returns-expired-for-past-expiration.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-084-returns-expired-for-past-expiration.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns expired for past expiration" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns expired for past expiration + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then formatRemainingApprovalTime returns "expired" for past expiration +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-085-returns-true-for-valid-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-085-returns-true-for-valid-approval.sdp.md index 2d2155bc..3c91a325 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-085-returns-true-for-valid-approval.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-085-returns-true-for-valid-approval.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for valid approval" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns true for valid approval + +```gwt +Given the module is imported from platform-core +And a test approval with default values +When the scenario runs +Then validatePendingApproval returns true +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-086-returns-false-for-invalid-inputs.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-086-returns-false-for-invalid-inputs.sdp.md index bbe37d97..98abdae1 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-086-returns-false-for-invalid-inputs.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-086-returns-false-for-invalid-inputs.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for invalid inputs" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns false for invalid inputs + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then validatePendingApproval returns false for: +``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-087-returns-false-for-invalid-confidence.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-087-returns-false-for-invalid-confidence.sdp.md index 5422661f..98f703cf 100644 --- a/specs/behavior/platform-core/agent/approval.examples/s-087-returns-false-for-invalid-confidence.sdp.md +++ b/specs/behavior/platform-core/agent/approval.examples/s-087-returns-false-for-invalid-confidence.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for invalid confidence" from packages/platform-core/tests/features/behavior/agent/approval.feature +- outcome: Executable scenario: Returns false for invalid confidence + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then validatePendingApproval returns false for confidence 2.0 +``` diff --git a/specs/behavior/platform-core/agent/approval.sdp.md b/specs/behavior/platform-core/agent/approval.sdp.md index 2700a3fc..eae993cf 100644 --- a/specs/behavior/platform-core/agent/approval.sdp.md +++ b/specs/behavior/platform-core/agent/approval.sdp.md @@ -10,4 +10,35 @@ relations: ## Intent -- outcome: Pure functions for the human-in-loop approval workflow including approval determination, authorization checks, status transitions, factory functions, type guards, Zod schemas, and timeout helpers. (test carrier: packages/platform-core/tests/features/behavior/agent/approval.feature) +- outcome: Approval Module + +## Behavior + +- rule: Error codes contain all expected entries +- rule: Status constants define the four approval statuses +- rule: isApprovalStatus type guard validates status strings +- rule: ApprovalStatusSchema validates with Zod +- rule: PendingApprovalSchema validates approval objects +- rule: ApprovalAuthContextSchema validates auth context objects +- rule: parseApprovalTimeout converts duration strings to milliseconds +- rule: isValidApprovalTimeout checks format validity +- rule: calculateExpirationTime computes expiration from config and requestedAt +- rule: shouldRequireApproval determines if approval is needed based on confidence +- rule: requiresApproval list forces approval regardless of confidence +- rule: autoApprove list skips approval regardless of confidence +- rule: requiresApproval takes precedence over autoApprove +- rule: shouldRequireApproval edge cases +- rule: isAuthorizedReviewer checks agentIds restriction +- rule: isAuthorizedReviewer checks roles +- rule: isAuthorizedReviewer evaluates agentIds before roles +- rule: generateApprovalId produces correctly formatted unique IDs +- rule: createPendingApproval builds approval with correct initial values +- rule: approveAction transitions pending to approved +- rule: rejectAction transitions pending to rejected +- rule: expireAction transitions pending to expired +- rule: safeApproveAction returns result objects instead of throwing +- rule: safeRejectAction returns result objects instead of throwing +- rule: Type guards correctly identify approval statuses +- rule: getRemainingApprovalTime returns milliseconds until expiration +- rule: formatRemainingApprovalTime returns human-readable duration +- rule: validatePendingApproval checks structural validity diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-001-record-pattern-detected-event.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-001-record-pattern-detected-event.sdp.md index b5a92ce4..89cc375a 100644 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-001-record-pattern-detected-event.sdp.md +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-001-record-pattern-detected-event.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Record PatternDetected event" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature +- outcome: Executable scenario: Record PatternDetected event + +```gwt +Given the agent module is imported from platform-core +And the audit trail utilities are available +And agent detects ChurnRisk pattern +When agent decides to emit SuggestCustomerOutreach +Then PatternDetected event is recorded +And event includes: +``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-002-audit-includes-triggering-events.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-002-audit-includes-triggering-events.sdp.md index df74ed5c..fc33cafa 100644 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-002-audit-includes-triggering-events.sdp.md +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-002-audit-includes-triggering-events.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Audit includes triggering events" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature +- outcome: Executable scenario: Audit includes triggering events + +```gwt +Given the agent module is imported from platform-core +And the audit trail utilities are available +And pattern triggered by events E1, E2, E3 +When PatternDetected is recorded +Then event.triggeringEvents equals ["E1", "E2", "E3"] +``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-003-audit-includes-execution-mode.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-003-audit-includes-execution-mode.sdp.md index ef77b88f..b76e6282 100644 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-003-audit-includes-execution-mode.sdp.md +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-003-audit-includes-execution-mode.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Audit includes execution mode" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature +- outcome: Executable scenario: Audit includes execution mode + +```gwt +Given the agent module is imported from platform-core +And the audit trail utilities are available +And agent decision with confidence 0.85 +And threshold is 0.8 +When PatternDetected is recorded +Then event.executionMode equals "auto-execute" +``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-004-audit-includes-llm-metadata.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-004-audit-includes-llm-metadata.sdp.md index 7bbf4a8e..a603f566 100644 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-004-audit-includes-llm-metadata.sdp.md +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-004-audit-includes-llm-metadata.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Audit includes LLM metadata" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature +- outcome: Executable scenario: Audit includes LLM metadata + +```gwt +Given the agent module is imported from platform-core +And the audit trail utilities are available +And agent used LLM for pattern analysis +When PatternDetected is recorded +Then event.llmContext includes: +``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-005-audit-llm-failures.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-005-audit-llm-failures.sdp.md index 806b8614..9523512e 100644 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-005-audit-llm-failures.sdp.md +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-005-audit-llm-failures.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Audit LLM failures" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature +- outcome: Executable scenario: Audit LLM failures + +```gwt +Given the agent module is imported from platform-core +And the audit trail utilities are available +And LLM call failed with timeout +When AgentLLMError event is recorded +Then event includes error details +And event includes fallback action taken +``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-006-record-auto-executed-action.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-006-record-auto-executed-action.sdp.md index 3c144cf3..ee100b45 100644 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-006-record-auto-executed-action.sdp.md +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-006-record-auto-executed-action.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Record auto-executed action" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature +- outcome: Executable scenario: Record auto-executed action + +```gwt +Given the agent module is imported from platform-core +And the audit trail utilities are available +And an auto-execute decision +When command is executed +Then AgentActionExecuted event is recorded +And event links to original PatternDetected +``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-007-record-approved-action.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-007-record-approved-action.sdp.md index 31ea25fb..14878e67 100644 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-007-record-approved-action.sdp.md +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-007-record-approved-action.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Record approved action" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature +- outcome: Executable scenario: Record approved action + +```gwt +Given the agent module is imported from platform-core +And the audit trail utilities are available +And an action approved by reviewer +When command is executed +Then ApprovalGranted event is recorded +And event includes reviewerId and approvalTime +``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-008-record-rejected-action.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-008-record-rejected-action.sdp.md index 2c5d3410..12b41665 100644 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-008-record-rejected-action.sdp.md +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-008-record-rejected-action.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Record rejected action" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature +- outcome: Executable scenario: Record rejected action + +```gwt +Given the agent module is imported from platform-core +And the audit trail utilities are available +And an action rejected by reviewer +When rejection is processed +Then ApprovalRejected event is recorded +And event includes reviewerId and rejectionReason +``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-009-record-expired-action.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-009-record-expired-action.sdp.md index 1b2f288d..1f9a9416 100644 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-009-record-expired-action.sdp.md +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-009-record-expired-action.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Record expired action" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature +- outcome: Executable scenario: Record expired action + +```gwt +Given the agent module is imported from platform-core +And the audit trail utilities are available +And an action that timed out +When expiration is processed +Then ApprovalExpired event is recorded +And event includes expirationTime +``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-010-query-all-decisions-for-an-agent.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-010-query-all-decisions-for-an-agent.sdp.md index 4d6431f9..bba7dade 100644 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-010-query-all-decisions-for-an-agent.sdp.md +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-010-query-all-decisions-for-an-agent.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Query all decisions for an agent" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature +- outcome: Executable scenario: Query all decisions for an agent + +```gwt +Given the agent module is imported from platform-core +And the audit trail utilities are available +And agent "churn-detector" made 100 decisions +When I query PatternDetected for agent "churn-detector" +Then I receive 100 decision records +``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-011-query-decisions-by-pattern-type.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-011-query-decisions-by-pattern-type.sdp.md index ccb80b90..800ae874 100644 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-011-query-decisions-by-pattern-type.sdp.md +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-011-query-decisions-by-pattern-type.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Query decisions by pattern type" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature +- outcome: Executable scenario: Query decisions by pattern type + +```gwt +Given the agent module is imported from platform-core +And the audit trail utilities are available +And decisions for patterns: ChurnRisk (50), FraudRisk (30) +When I query decisions where patternDetected = "ChurnRisk" +Then I receive 50 records +``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-012-query-decisions-by-time-range.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-012-query-decisions-by-time-range.sdp.md index e9c53b5f..1f3925cd 100644 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-012-query-decisions-by-time-range.sdp.md +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-012-query-decisions-by-time-range.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Query decisions by time range" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature +- outcome: Executable scenario: Query decisions by time range + +```gwt +Given the agent module is imported from platform-core +And the audit trail utilities are available +And decisions from January and February +When I query decisions for January only +Then I receive only January decisions +``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-013-query-decision-with-full-trace.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-013-query-decision-with-full-trace.sdp.md index cbba185d..279bfd1a 100644 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-013-query-decision-with-full-trace.sdp.md +++ b/specs/behavior/platform-core/agent/audit-trail.examples/s-013-query-decision-with-full-trace.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Query decision with full trace" from packages/platform-core/tests/features/behavior/agent/audit-trail.feature +- outcome: Executable scenario: Query decision with full trace + +```gwt +Given the agent module is imported from platform-core +And the audit trail utilities are available +And a decision that led to executed command +When I query with expandTrace: true +Then result includes related events: +``` diff --git a/specs/behavior/platform-core/agent/audit-trail.sdp.md b/specs/behavior/platform-core/agent/audit-trail.sdp.md index d6e2d40a..3d4c94a4 100644 --- a/specs/behavior/platform-core/agent/audit-trail.sdp.md +++ b/specs/behavior/platform-core/agent/audit-trail.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: all agent decisions audited as events so that agent behavior is fully traceable (test carrier: packages/platform-core/tests/features/behavior/agent/audit-trail.feature) +- actor: a platform developer +- outcome: all agent decisions audited as events so that agent behavior is fully traceable + +## Behavior + +- rule: All agent decisions create audit events +- rule: LLM interactions are audited +- rule: Action outcomes are recorded +- rule: Audit trail supports queries diff --git a/specs/behavior/platform-core/agent/audit.examples/s-001-contains-all-ds-1-base-event-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-001-contains-all-ds-1-base-event-types.sdp.md index 6e4c712e..7e97fb12 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-001-contains-all-ds-1-base-event-types.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-001-contains-all-ds-1-base-event-types.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Contains all DS-1 base event types" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Contains all DS-1 base event types + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then AGENT_AUDIT_EVENT_TYPES contains the following entries: +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-002-contains-all-ds-4-command-routing-event-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-002-contains-all-ds-4-command-routing-event-types.sdp.md index ce5f5fa7..4e5a5b0a 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-002-contains-all-ds-4-command-routing-event-types.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-002-contains-all-ds-4-command-routing-event-types.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Contains all DS-4 command routing event types" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Contains all DS-4 command routing event types + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then AGENT_AUDIT_EVENT_TYPES contains the following entries: +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-003-contains-all-ds-5-lifecycle-event-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-003-contains-all-ds-5-lifecycle-event-types.sdp.md index 0a22d432..02ef73a0 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-003-contains-all-ds-5-lifecycle-event-types.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-003-contains-all-ds-5-lifecycle-event-types.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Contains all DS-5 lifecycle event types" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Contains all DS-5 lifecycle event types + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then AGENT_AUDIT_EVENT_TYPES contains the following entries: +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-004-contains-ds-6-failure-tracking-event-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-004-contains-ds-6-failure-tracking-event-type.sdp.md index bd8d8223..460018c0 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-004-contains-ds-6-failure-tracking-event-type.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-004-contains-ds-6-failure-tracking-event-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Contains DS-6 failure tracking event type" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Contains DS-6 failure tracking event type + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then AGENT_AUDIT_EVENT_TYPES contains the following entries: +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-005-has-exactly-17-event-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-005-has-exactly-17-event-types.sdp.md index b5860b53..2e53da9b 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-005-has-exactly-17-event-types.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-005-has-exactly-17-event-types.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Has exactly 17 event types" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Has exactly 17 event types + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then AGENT_AUDIT_EVENT_TYPES has length 17 +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-006-returns-true-for-all-valid-event-type-strings.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-006-returns-true-for-all-valid-event-type-strings.sdp.md index c9a7506a..5d554512 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-006-returns-true-for-all-valid-event-type-strings.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-006-returns-true-for-all-valid-event-type-strings.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for all valid event type strings" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Returns true for all valid event type strings + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isAgentAuditEventType returns true for: +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-007-returns-false-for-invalid-values.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-007-returns-false-for-invalid-values.sdp.md index 3606d83c..8f6e9663 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-007-returns-false-for-invalid-values.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-007-returns-false-for-invalid-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for invalid values" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Returns false for invalid values + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isAgentAuditEventType returns false for: +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-008-returns-false-for-non-string-values.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-008-returns-false-for-non-string-values.sdp.md index b71bb931..74ef6996 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-008-returns-false-for-non-string-values.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-008-returns-false-for-non-string-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for non-string values" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Returns false for non-string values + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isAgentAuditEventType returns false for non-string values +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-009-accepts-all-valid-event-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-009-accepts-all-valid-event-types.sdp.md index 1d823355..466d3cb1 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-009-accepts-all-valid-event-types.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-009-accepts-all-valid-event-types.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts all valid event types" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Accepts all valid event types + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then AgentAuditEventTypeSchema accepts all AGENT_AUDIT_EVENT_TYPES entries +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-010-rejects-invalid-event-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-010-rejects-invalid-event-types.sdp.md index 993adc32..6b7bd3c6 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-010-rejects-invalid-event-types.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-010-rejects-invalid-event-types.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects invalid event types" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Rejects invalid event types + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then AgentAuditEventTypeSchema rejects the following values: +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-011-rejects-non-string-values-via-zod.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-011-rejects-non-string-values-via-zod.sdp.md index 80c38e19..416885a9 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-011-rejects-non-string-values-via-zod.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-011-rejects-non-string-values-via-zod.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects non-string values via Zod" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Rejects non-string values via Zod + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then AgentAuditEventTypeSchema rejects numeric 123 and null +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-012-accepts-valid-llm-context.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-012-accepts-valid-llm-context.sdp.md index 399268bf..653e8ca4 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-012-accepts-valid-llm-context.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-012-accepts-valid-llm-context.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts valid LLM context" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Accepts valid LLM context + +```gwt +Given the module is imported from platform-core +And an LLM context with model "gpt-4" and tokens 1500 and duration 2500 +When the scenario runs +Then the LLM context passes AuditLLMContextSchema validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-013-rejects-negative-tokens.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-013-rejects-negative-tokens.sdp.md index b8776988..903ddb05 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-013-rejects-negative-tokens.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-013-rejects-negative-tokens.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects negative tokens" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Rejects negative tokens + +```gwt +Given the module is imported from platform-core +And an LLM context with model "gpt-4" and tokens -100 and duration 2500 +When the scenario runs +Then the LLM context fails AuditLLMContextSchema validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-014-rejects-negative-duration.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-014-rejects-negative-duration.sdp.md index 406c2f62..6fbdc13d 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-014-rejects-negative-duration.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-014-rejects-negative-duration.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects negative duration" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Rejects negative duration + +```gwt +Given the module is imported from platform-core +And an LLM context with model "gpt-4" and tokens 1500 and duration -100 +When the scenario runs +Then the LLM context fails AuditLLMContextSchema validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-015-rejects-non-integer-tokens.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-015-rejects-non-integer-tokens.sdp.md index 2f91a4c6..4f9772f4 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-015-rejects-non-integer-tokens.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-015-rejects-non-integer-tokens.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects non-integer tokens" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Rejects non-integer tokens + +```gwt +Given the module is imported from platform-core +And an LLM context with model "gpt-4" and tokens 1500.5 and duration 2500 +When the scenario runs +Then the LLM context fails AuditLLMContextSchema validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-016-accepts-zero-values.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-016-accepts-zero-values.sdp.md index f04babf1..0f7bd6ef 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-016-accepts-zero-values.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-016-accepts-zero-values.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts zero values" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Accepts zero values + +```gwt +Given the module is imported from platform-core +And an LLM context with model "test" and tokens 0 and duration 0 +When the scenario runs +Then the LLM context passes AuditLLMContextSchema validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-017-accepts-valid-action-with-flag-for-review.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-017-accepts-valid-action-with-flag-for-review.sdp.md index 5f17b6b5..687c5c32 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-017-accepts-valid-action-with-flag-for-review.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-017-accepts-valid-action-with-flag-for-review.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts valid action with flag-for-review" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Accepts valid action with flag-for-review + +```gwt +Given the module is imported from platform-core +And an audit action with type "SuggestOutreach" and executionMode "flag-for-review" +When the scenario runs +Then the audit action passes AuditActionSchema validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-018-accepts-valid-action-with-auto-execute.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-018-accepts-valid-action-with-auto-execute.sdp.md index e8268f02..afc9a7cb 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-018-accepts-valid-action-with-auto-execute.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-018-accepts-valid-action-with-auto-execute.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts valid action with auto-execute" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Accepts valid action with auto-execute + +```gwt +Given the module is imported from platform-core +And an audit action with type "LogEvent" and executionMode "auto-execute" +When the scenario runs +Then the audit action passes AuditActionSchema validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-019-rejects-action-with-empty-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-019-rejects-action-with-empty-type.sdp.md index 2d5d3963..2ca02244 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-019-rejects-action-with-empty-type.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-019-rejects-action-with-empty-type.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects action with empty type" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Rejects action with empty type + +```gwt +Given the module is imported from platform-core +And an audit action with type "" and executionMode "flag-for-review" +When the scenario runs +Then the audit action fails AuditActionSchema validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-020-rejects-action-with-invalid-execution-mode.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-020-rejects-action-with-invalid-execution-mode.sdp.md index 4b494775..d0c6fc38 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-020-rejects-action-with-invalid-execution-mode.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-020-rejects-action-with-invalid-execution-mode.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects action with invalid executionMode" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Rejects action with invalid executionMode + +```gwt +Given the module is imported from platform-core +And an audit action with type "SuggestOutreach" and executionMode "invalid" +When the scenario runs +Then the audit action fails AuditActionSchema validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-021-rejects-action-with-extra-fields-in-strict-mode.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-021-rejects-action-with-extra-fields-in-strict-mode.sdp.md index 2d0512d9..4e260523 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-021-rejects-action-with-extra-fields-in-strict-mode.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-021-rejects-action-with-extra-fields-in-strict-mode.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects action with extra fields in strict mode" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Rejects action with extra fields in strict mode + +```gwt +Given the module is imported from platform-core +And an audit action with type "Test" and executionMode "auto-execute" and extra field +When the scenario runs +Then the audit action fails AuditActionSchema validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-022-accepts-valid-payload-with-action.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-022-accepts-valid-payload-with-action.sdp.md index 1dfce3b7..ceef0ac0 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-022-accepts-valid-payload-with-action.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-022-accepts-valid-payload-with-action.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts valid payload with action" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Accepts valid payload with action + +```gwt +Given the module is imported from platform-core +And a valid pattern detected payload +When the scenario runs +Then the payload passes PatternDetectedPayloadSchema validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-023-accepts-payload-with-null-pattern-detected.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-023-accepts-payload-with-null-pattern-detected.sdp.md index 80950532..2c09898c 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-023-accepts-payload-with-null-pattern-detected.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-023-accepts-payload-with-null-pattern-detected.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts payload with null patternDetected" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Accepts payload with null patternDetected + +```gwt +Given the module is imported from platform-core +And a pattern detected payload with null patternDetected +When the scenario runs +Then the payload passes PatternDetectedPayloadSchema validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-024-accepts-payload-with-null-action.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-024-accepts-payload-with-null-action.sdp.md index 4d6a07c8..6de1e303 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-024-accepts-payload-with-null-action.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-024-accepts-payload-with-null-action.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts payload with null action" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Accepts payload with null action + +```gwt +Given the module is imported from platform-core +And a pattern detected payload with null action +When the scenario runs +Then the payload passes PatternDetectedPayloadSchema validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-025-accepts-payload-with-llm-context.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-025-accepts-payload-with-llm-context.sdp.md index c1de62de..36bb426b 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-025-accepts-payload-with-llm-context.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-025-accepts-payload-with-llm-context.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts payload with LLM context" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Accepts payload with LLM context + +```gwt +Given the module is imported from platform-core +And a pattern detected payload with LLM context +When the scenario runs +Then the payload passes PatternDetectedPayloadSchema validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-026-rejects-payload-with-confidence-below-0.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-026-rejects-payload-with-confidence-below-0.sdp.md index a32fca75..6cc2552f 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-026-rejects-payload-with-confidence-below-0.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-026-rejects-payload-with-confidence-below-0.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects payload with confidence below 0" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Rejects payload with confidence below 0 + +```gwt +Given the module is imported from platform-core +And a pattern detected payload with confidence -0.1 +When the scenario runs +Then the payload fails PatternDetectedPayloadSchema validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-027-rejects-payload-with-confidence-above-1.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-027-rejects-payload-with-confidence-above-1.sdp.md index 0ed15562..baa87d3a 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-027-rejects-payload-with-confidence-above-1.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-027-rejects-payload-with-confidence-above-1.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects payload with confidence above 1" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Rejects payload with confidence above 1 + +```gwt +Given the module is imported from platform-core +And a pattern detected payload with confidence 1.5 +When the scenario runs +Then the payload fails PatternDetectedPayloadSchema validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-028-accepts-valid-approval-granted-payload.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-028-accepts-valid-approval-granted-payload.sdp.md index 3fc336a1..af782cba 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-028-accepts-valid-approval-granted-payload.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-028-accepts-valid-approval-granted-payload.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts valid approval granted payload" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Accepts valid approval granted payload + +```gwt +Given the module is imported from platform-core +And a valid approval granted payload +When the scenario runs +Then the approval granted payload passes validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-029-accepts-payload-with-review-note.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-029-accepts-payload-with-review-note.sdp.md index 35a5a0b9..895747b8 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-029-accepts-payload-with-review-note.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-029-accepts-payload-with-review-note.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts payload with reviewNote" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Accepts payload with reviewNote + +```gwt +Given the module is imported from platform-core +And an approval granted payload with reviewNote "Looks good!" +When the scenario runs +Then the approval granted payload passes validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-030-rejects-payload-with-empty-action-id.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-030-rejects-payload-with-empty-action-id.sdp.md index 35882135..9a0022a5 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-030-rejects-payload-with-empty-action-id.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-030-rejects-payload-with-empty-action-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects payload with empty actionId" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Rejects payload with empty actionId + +```gwt +Given the module is imported from platform-core +And an approval granted payload with empty actionId +When the scenario runs +Then the approval granted payload fails validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-031-accepts-valid-approval-rejected-payload.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-031-accepts-valid-approval-rejected-payload.sdp.md index 59b877ee..f0616918 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-031-accepts-valid-approval-rejected-payload.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-031-accepts-valid-approval-rejected-payload.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts valid approval rejected payload" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Accepts valid approval rejected payload + +```gwt +Given the module is imported from platform-core +And a valid approval rejected payload +When the scenario runs +Then the approval rejected payload passes validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-032-allows-empty-rejection-reason-string.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-032-allows-empty-rejection-reason-string.sdp.md index 47ed0750..b46a7668 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-032-allows-empty-rejection-reason-string.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-032-allows-empty-rejection-reason-string.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Allows empty rejectionReason string" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Allows empty rejectionReason string + +```gwt +Given the module is imported from platform-core +And an approval rejected payload with empty rejectionReason +When the scenario runs +Then the approval rejected payload passes validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-033-accepts-valid-approval-expired-payload.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-033-accepts-valid-approval-expired-payload.sdp.md index ffa90dfc..eb89a8f3 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-033-accepts-valid-approval-expired-payload.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-033-accepts-valid-approval-expired-payload.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts valid approval expired payload" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Accepts valid approval expired payload + +```gwt +Given the module is imported from platform-core +And a valid approval expired payload +When the scenario runs +Then the approval expired payload passes validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-034-rejects-payload-with-empty-action-id.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-034-rejects-payload-with-empty-action-id.sdp.md index 9e57812e..97d5e707 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-034-rejects-payload-with-empty-action-id.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-034-rejects-payload-with-empty-action-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects payload with empty actionId" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Rejects payload with empty actionId + +```gwt +Given the module is imported from platform-core +And an approval expired payload with empty actionId +When the scenario runs +Then the approval expired payload fails validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-035-accepts-valid-audit-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-035-accepts-valid-audit-event.sdp.md index a896c488..07fc1822 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-035-accepts-valid-audit-event.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-035-accepts-valid-audit-event.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts valid audit event" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Accepts valid audit event + +```gwt +Given the module is imported from platform-core +And a valid full audit event +When the scenario runs +Then the full audit event passes AgentAuditEventSchema validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-036-rejects-event-with-empty-agent-id.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-036-rejects-event-with-empty-agent-id.sdp.md index 5361d648..4668bdfc 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-036-rejects-event-with-empty-agent-id.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-036-rejects-event-with-empty-agent-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects event with empty agentId" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Rejects event with empty agentId + +```gwt +Given the module is imported from platform-core +And a full audit event with empty agentId +When the scenario runs +Then the full audit event fails AgentAuditEventSchema validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-037-rejects-event-with-empty-decision-id.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-037-rejects-event-with-empty-decision-id.sdp.md index f0917116..46837cc9 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-037-rejects-event-with-empty-decision-id.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-037-rejects-event-with-empty-decision-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects event with empty decisionId" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Rejects event with empty decisionId + +```gwt +Given the module is imported from platform-core +And a full audit event with empty decisionId +When the scenario runs +Then the full audit event fails AgentAuditEventSchema validation +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-038-generates-i-ds-with-dec-prefix.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-038-generates-i-ds-with-dec-prefix.sdp.md index 81876a3f..a11de409 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-038-generates-i-ds-with-dec-prefix.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-038-generates-i-ds-with-dec-prefix.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Generates IDs with dec_ prefix" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Generates IDs with dec_ prefix + +```gwt +Given the module is imported from platform-core +When I generate a decision ID +Then the decision ID starts with "dec_" +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-039-generates-i-ds-with-expected-format.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-039-generates-i-ds-with-expected-format.sdp.md index d7a2ca7b..ab58bfff 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-039-generates-i-ds-with-expected-format.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-039-generates-i-ds-with-expected-format.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Generates IDs with expected format" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Generates IDs with expected format + +```gwt +Given the module is imported from platform-core +When I generate a decision ID +Then the decision ID has two underscore-separated parts +And the first part is "dec" +And the second part is a UUIDv7 string +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-040-generates-unique-i-ds-over-multiple-calls.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-040-generates-unique-i-ds-over-multiple-calls.sdp.md index 14ffcbf2..871277df 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-040-generates-unique-i-ds-over-multiple-calls.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-040-generates-unique-i-ds-over-multiple-calls.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Generates unique IDs over multiple calls" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Generates unique IDs over multiple calls + +```gwt +Given the module is imported from platform-core +When I generate 3 decision IDs with small delays +Then all 3 IDs are unique +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-041-uses-a-uui-dv7-payload-in-the-id.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-041-uses-a-uui-dv7-payload-in-the-id.sdp.md index 86c31e83..97a9c2c7 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-041-uses-a-uui-dv7-payload-in-the-id.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-041-uses-a-uui-dv7-payload-in-the-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Uses a UUIDv7 payload in the ID" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Uses a UUIDv7 payload in the ID + +```gwt +Given the module is imported from platform-core +When I generate a decision ID at fixed time "2024-01-15T12:00:00Z" +Then the UUID payload matches UUIDv7 format +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-042-creates-event-with-pattern-detected-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-042-creates-event-with-pattern-detected-type.sdp.md index b578b683..f28f8537 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-042-creates-event-with-pattern-detected-type.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-042-creates-event-with-pattern-detected-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Creates event with PatternDetected type" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Creates event with PatternDetected type + +```gwt +Given the module is imported from platform-core +When I create a pattern detected audit for agent "test-agent" +Then the event type is "PatternDetected" +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-043-includes-all-required-fields.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-043-includes-all-required-fields.sdp.md index 45ccf291..67393c2f 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-043-includes-all-required-fields.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-043-includes-all-required-fields.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: Executable scenario "Includes all required fields" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Includes all required fields + +```gwt +Given the module is imported from platform-core +When I create a pattern detected audit for agent "test-agent" with full payload +Then the event has the following properties: +And the decisionId matches the dec_ format +And the timestamp equals current time +And the payload has patternDetected "churn-risk" +And the payload has confidence 0.85 +And the payload has reasoning "Customer at risk" +And the payload has the expected action +And the payload has triggering events "evt-1" and "evt-2" +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-044-includes-llm-context-when-provided.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-044-includes-llm-context-when-provided.sdp.md index f457ec95..101e5d3d 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-044-includes-llm-context-when-provided.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-044-includes-llm-context-when-provided.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Includes LLM context when provided" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Includes LLM context when provided + +```gwt +Given the module is imported from platform-core +When I create a pattern detected audit with LLM context +Then the payload LLM context is defined +And the LLM context has model "gpt-4" +And the LLM context has tokens 1500 +And the LLM context has duration 2500 +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-045-does-not-include-llm-context-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-045-does-not-include-llm-context-when-not-provided.sdp.md index 75b6c31d..6a6f5eee 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-045-does-not-include-llm-context-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-045-does-not-include-llm-context-when-not-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Does not include LLM context when not provided" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Does not include LLM context when not provided + +```gwt +Given the module is imported from platform-core +When I create a pattern detected audit without LLM context +Then the payload LLM context is undefined +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-046-handles-null-pattern-detected.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-046-handles-null-pattern-detected.sdp.md index 102395e5..8ae03c22 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-046-handles-null-pattern-detected.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-046-handles-null-pattern-detected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles null patternDetected" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Handles null patternDetected + +```gwt +Given the module is imported from platform-core +When I create a pattern detected audit with null patternDetected +Then the payload patternDetected is null +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-047-handles-null-action.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-047-handles-null-action.sdp.md index a41979da..cd770c70 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-047-handles-null-action.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-047-handles-null-action.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles null action" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Handles null action + +```gwt +Given the module is imported from platform-core +When I create a pattern detected audit with null action +Then the payload action is null +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-048-creates-event-with-approval-granted-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-048-creates-event-with-approval-granted-type.sdp.md index b7106133..1a060d9a 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-048-creates-event-with-approval-granted-type.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-048-creates-event-with-approval-granted-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Creates event with ApprovalGranted type" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Creates event with ApprovalGranted type + +```gwt +Given the module is imported from platform-core +When I create an approval granted audit for agent "agent" action "action-123" reviewer "user-456" +Then the event type is "ApprovalGranted" +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-049-includes-all-required-fields-for-approval-granted.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-049-includes-all-required-fields-for-approval-granted.sdp.md index 90c38d71..b153dc6b 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-049-includes-all-required-fields-for-approval-granted.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-049-includes-all-required-fields-for-approval-granted.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Includes all required fields for approval granted" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Includes all required fields for approval granted + +```gwt +Given the module is imported from platform-core +When I create an approval granted audit for agent "test-agent" action "action-123" reviewer "user-456" +Then the event has the following properties: +And the decisionId matches the dec_ format +And the timestamp equals current time +And the payload actionId is "action-123" +And the payload reviewerId is "user-456" +And the payload reviewedAt equals current time +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-050-includes-review-note-when-provided.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-050-includes-review-note-when-provided.sdp.md index 299c4992..11a32faf 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-050-includes-review-note-when-provided.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-050-includes-review-note-when-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Includes reviewNote when provided" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Includes reviewNote when provided + +```gwt +Given the module is imported from platform-core +When I create an approval granted audit with reviewNote "Verified customer is at risk" +Then the payload reviewNote is "Verified customer is at risk" +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-051-does-not-include-review-note-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-051-does-not-include-review-note-when-not-provided.sdp.md index e00a557e..621a5e9d 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-051-does-not-include-review-note-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-051-does-not-include-review-note-when-not-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Does not include reviewNote when not provided" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Does not include reviewNote when not provided + +```gwt +Given the module is imported from platform-core +When I create an approval granted audit without reviewNote +Then the payload reviewNote is undefined +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-052-creates-event-with-approval-rejected-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-052-creates-event-with-approval-rejected-type.sdp.md index 9d9e2281..2fdc9a47 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-052-creates-event-with-approval-rejected-type.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-052-creates-event-with-approval-rejected-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Creates event with ApprovalRejected type" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Creates event with ApprovalRejected type + +```gwt +Given the module is imported from platform-core +When I create an approval rejected audit for agent "agent" +Then the event type is "ApprovalRejected" +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-053-includes-all-required-fields-for-approval-rejected.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-053-includes-all-required-fields-for-approval-rejected.sdp.md index 6bf3b4b5..f99804db 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-053-includes-all-required-fields-for-approval-rejected.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-053-includes-all-required-fields-for-approval-rejected.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Includes all required fields for approval rejected" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Includes all required fields for approval rejected + +```gwt +Given the module is imported from platform-core +When I create an approval rejected audit for agent "test-agent" with reason "Not appropriate" +Then the event has the following properties: +And the decisionId matches the dec_ format +And the timestamp equals current time +And the payload actionId is "action-123" +And the payload reviewerId is "user-456" +And the payload rejectionReason is "Not appropriate" +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-054-creates-event-with-approval-expired-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-054-creates-event-with-approval-expired-type.sdp.md index b085d352..a56476d0 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-054-creates-event-with-approval-expired-type.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-054-creates-event-with-approval-expired-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Creates event with ApprovalExpired type" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Creates event with ApprovalExpired type + +```gwt +Given the module is imported from platform-core +When I create an approval expired audit for agent "agent" +Then the event type is "ApprovalExpired" +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-055-includes-all-required-fields-for-approval-expired.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-055-includes-all-required-fields-for-approval-expired.sdp.md index 0a2d6a7f..4f78aa09 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-055-includes-all-required-fields-for-approval-expired.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-055-includes-all-required-fields-for-approval-expired.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Includes all required fields for approval expired" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Includes all required fields for approval expired + +```gwt +Given the module is imported from platform-core +When I create an approval expired audit for agent "test-agent" +Then the event has the following properties: +And the decisionId matches the dec_ format +And the timestamp equals current time +And the payload actionId is "action-123" +And the payload requestedAt is the stored requested time +And the payload expiredAt equals current time +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-056-creates-event-with-specified-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-056-creates-event-with-specified-type.sdp.md index 152de3f0..8c62b73f 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-056-creates-event-with-specified-type.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-056-creates-event-with-specified-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Creates event with specified type" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Creates event with specified type + +```gwt +Given the module is imported from platform-core +When I create a generic audit event with type "CommandEmitted" +Then the event type is "CommandEmitted" +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-057-includes-all-required-fields-for-generic-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-057-includes-all-required-fields-for-generic-event.sdp.md index e4517841..3877f936 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-057-includes-all-required-fields-for-generic-event.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-057-includes-all-required-fields-for-generic-event.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Includes all required fields for generic event" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Includes all required fields for generic event + +```gwt +Given the module is imported from platform-core +When I create a generic audit event for agent "test-agent" with type "AgentStarted" +Then the event has the following properties: +And the decisionId matches the dec_ format +And the timestamp equals current time +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-058-defaults-payload-to-empty-object-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-058-defaults-payload-to-empty-object-when-not-provided.sdp.md index 5c9de5c3..cb2845d3 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-058-defaults-payload-to-empty-object-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-058-defaults-payload-to-empty-object-when-not-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Defaults payload to empty object when not provided" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Defaults payload to empty object when not provided + +```gwt +Given the module is imported from platform-core +When I create a generic audit event with type "CheckpointUpdated" and no payload +Then the payload equals empty object +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-059-works-with-ds-4-command-routing-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-059-works-with-ds-4-command-routing-types.sdp.md index e7a13ead..3479834c 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-059-works-with-ds-4-command-routing-types.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-059-works-with-ds-4-command-routing-types.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Works with DS-4 command routing types" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Works with DS-4 command routing types + +```gwt +Given the module is imported from platform-core +When I create a generic audit event with type "AgentCommandRouted" +Then the event type is "AgentCommandRouted" +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-060-works-with-ds-5-lifecycle-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-060-works-with-ds-5-lifecycle-types.sdp.md index adc44cb4..8ce75b2e 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-060-works-with-ds-5-lifecycle-types.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-060-works-with-ds-5-lifecycle-types.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Works with DS-5 lifecycle types" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Works with DS-5 lifecycle types + +```gwt +Given the module is imported from platform-core +When I create a generic audit event with type "AgentErrorRecoveryStarted" +Then the event type is "AgentErrorRecoveryStarted" +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-061-returns-true-for-pattern-detected-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-061-returns-true-for-pattern-detected-event.sdp.md index c9c7bd3a..fa6317db 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-061-returns-true-for-pattern-detected-event.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-061-returns-true-for-pattern-detected-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for PatternDetected event" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Returns true for PatternDetected event + +```gwt +Given the module is imported from platform-core +When I create a pattern detected event for type guard test +Then isPatternDetectedEvent returns true +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-062-returns-false-for-approval-granted-event-via-is-pattern-detected.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-062-returns-false-for-approval-granted-event-via-is-pattern-detected.sdp.md index 6b50c704..107d67a5 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-062-returns-false-for-approval-granted-event-via-is-pattern-detected.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-062-returns-false-for-approval-granted-event-via-is-pattern-detected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for ApprovalGranted event via isPatternDetected" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Returns false for ApprovalGranted event via isPatternDetected + +```gwt +Given the module is imported from platform-core +When I create an approval granted event for type guard test +Then isPatternDetectedEvent returns false +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-063-returns-false-for-approval-rejected-event-via-is-pattern-detected.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-063-returns-false-for-approval-rejected-event-via-is-pattern-detected.sdp.md index 8a6a8d34..f7181c65 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-063-returns-false-for-approval-rejected-event-via-is-pattern-detected.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-063-returns-false-for-approval-rejected-event-via-is-pattern-detected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for ApprovalRejected event via isPatternDetected" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Returns false for ApprovalRejected event via isPatternDetected + +```gwt +Given the module is imported from platform-core +When I create an approval rejected event for type guard test +Then isPatternDetectedEvent returns false +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-064-returns-true-for-approval-granted-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-064-returns-true-for-approval-granted-event.sdp.md index b2993578..198b2744 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-064-returns-true-for-approval-granted-event.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-064-returns-true-for-approval-granted-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for ApprovalGranted event" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Returns true for ApprovalGranted event + +```gwt +Given the module is imported from platform-core +When I create an approval granted event for type guard test +Then isApprovalGrantedEvent returns true +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-065-returns-false-for-pattern-detected-event-via-is-approval-granted.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-065-returns-false-for-pattern-detected-event-via-is-approval-granted.sdp.md index f69c4440..4495a3ef 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-065-returns-false-for-pattern-detected-event-via-is-approval-granted.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-065-returns-false-for-pattern-detected-event-via-is-approval-granted.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for PatternDetected event via isApprovalGranted" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Returns false for PatternDetected event via isApprovalGranted + +```gwt +Given the module is imported from platform-core +When I create a pattern detected event for type guard test +Then isApprovalGrantedEvent returns false +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-066-returns-false-for-approval-rejected-event-via-is-approval-granted.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-066-returns-false-for-approval-rejected-event-via-is-approval-granted.sdp.md index 45d3e686..0126f7d5 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-066-returns-false-for-approval-rejected-event-via-is-approval-granted.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-066-returns-false-for-approval-rejected-event-via-is-approval-granted.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for ApprovalRejected event via isApprovalGranted" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Returns false for ApprovalRejected event via isApprovalGranted + +```gwt +Given the module is imported from platform-core +When I create an approval rejected event for type guard test +Then isApprovalGrantedEvent returns false +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-067-returns-true-for-approval-rejected-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-067-returns-true-for-approval-rejected-event.sdp.md index eca8b848..a2009f4f 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-067-returns-true-for-approval-rejected-event.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-067-returns-true-for-approval-rejected-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for ApprovalRejected event" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Returns true for ApprovalRejected event + +```gwt +Given the module is imported from platform-core +When I create an approval rejected event for type guard test +Then isApprovalRejectedEvent returns true +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-068-returns-false-for-approval-granted-event-via-is-approval-rejected.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-068-returns-false-for-approval-granted-event-via-is-approval-rejected.sdp.md index 2af0f782..cbe62da8 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-068-returns-false-for-approval-granted-event-via-is-approval-rejected.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-068-returns-false-for-approval-granted-event-via-is-approval-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for ApprovalGranted event via isApprovalRejected" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Returns false for ApprovalGranted event via isApprovalRejected + +```gwt +Given the module is imported from platform-core +When I create an approval granted event for type guard test +Then isApprovalRejectedEvent returns false +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-069-returns-false-for-pattern-detected-event-via-is-approval-rejected.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-069-returns-false-for-pattern-detected-event-via-is-approval-rejected.sdp.md index 76b87b70..e077c508 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-069-returns-false-for-pattern-detected-event-via-is-approval-rejected.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-069-returns-false-for-pattern-detected-event-via-is-approval-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for PatternDetected event via isApprovalRejected" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Returns false for PatternDetected event via isApprovalRejected + +```gwt +Given the module is imported from platform-core +When I create a pattern detected event for type guard test +Then isApprovalRejectedEvent returns false +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-070-returns-true-for-valid-pattern-detected-audit-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-070-returns-true-for-valid-pattern-detected-audit-event.sdp.md index 58443ae9..a923c747 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-070-returns-true-for-valid-pattern-detected-audit-event.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-070-returns-true-for-valid-pattern-detected-audit-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for valid pattern detected audit event" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Returns true for valid pattern detected audit event + +```gwt +Given the module is imported from platform-core +When I create a pattern detected event for validation +Then validateAgentAuditEvent returns true +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-071-returns-true-for-valid-approval-granted-audit-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-071-returns-true-for-valid-approval-granted-audit-event.sdp.md index 18f9b9ac..509c1aa3 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-071-returns-true-for-valid-approval-granted-audit-event.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-071-returns-true-for-valid-approval-granted-audit-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for valid approval granted audit event" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Returns true for valid approval granted audit event + +```gwt +Given the module is imported from platform-core +When I create an approval granted event for validation +Then validateAgentAuditEvent returns true +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-072-returns-true-for-valid-approval-rejected-audit-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-072-returns-true-for-valid-approval-rejected-audit-event.sdp.md index 179f4c7c..d368007e 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-072-returns-true-for-valid-approval-rejected-audit-event.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-072-returns-true-for-valid-approval-rejected-audit-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for valid approval rejected audit event" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Returns true for valid approval rejected audit event + +```gwt +Given the module is imported from platform-core +When I create an approval rejected event for validation +Then validateAgentAuditEvent returns true +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-073-returns-true-for-valid-approval-expired-audit-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-073-returns-true-for-valid-approval-expired-audit-event.sdp.md index 209c7c88..9dac0330 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-073-returns-true-for-valid-approval-expired-audit-event.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-073-returns-true-for-valid-approval-expired-audit-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for valid approval expired audit event" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Returns true for valid approval expired audit event + +```gwt +Given the module is imported from platform-core +When I create an approval expired event for validation +Then validateAgentAuditEvent returns true +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-074-returns-false-for-null.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-074-returns-false-for-null.sdp.md index 6f863d4e..2618fd75 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-074-returns-false-for-null.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-074-returns-false-for-null.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for null" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Returns false for null + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then validateAgentAuditEvent returns false for null +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-075-returns-false-for-undefined.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-075-returns-false-for-undefined.sdp.md index 6d368898..2cf59584 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-075-returns-false-for-undefined.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-075-returns-false-for-undefined.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for undefined" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Returns false for undefined + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then validateAgentAuditEvent returns false for undefined +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-076-returns-false-for-empty-object.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-076-returns-false-for-empty-object.sdp.md index 06261734..7bdb61c2 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-076-returns-false-for-empty-object.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-076-returns-false-for-empty-object.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for empty object" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Returns false for empty object + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then validateAgentAuditEvent returns false for empty object +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-077-returns-false-for-invalid-event-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-077-returns-false-for-invalid-event-type.sdp.md index a17746db..28ee3843 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-077-returns-false-for-invalid-event-type.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-077-returns-false-for-invalid-event-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for invalid event type" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Returns false for invalid event type + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then validateAgentAuditEvent returns false for invalid event type +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-078-returns-false-for-missing-required-fields.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-078-returns-false-for-missing-required-fields.sdp.md index d49cc898..2d99f391 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-078-returns-false-for-missing-required-fields.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-078-returns-false-for-missing-required-fields.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for missing required fields" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Returns false for missing required fields + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then validateAgentAuditEvent returns false for missing required fields +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-079-creates-complete-audit-trail-for-approved-action.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-079-creates-complete-audit-trail-for-approved-action.sdp.md index b54a1190..eeb5c8f8 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-079-creates-complete-audit-trail-for-approved-action.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-079-creates-complete-audit-trail-for-approved-action.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Creates complete audit trail for approved action" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Creates complete audit trail for approved action + +```gwt +Given the module is imported from platform-core +When I create a detection then approval flow for agent "churn-risk-agent" +Then the detection passes isPatternDetectedEvent +And the detection passes validateAgentAuditEvent +And the approval passes isApprovalGrantedEvent +And the approval passes validateAgentAuditEvent +And the approval timestamp is greater than the detection timestamp +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-080-creates-complete-audit-trail-for-rejected-action.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-080-creates-complete-audit-trail-for-rejected-action.sdp.md index 098297e2..5679701a 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-080-creates-complete-audit-trail-for-rejected-action.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-080-creates-complete-audit-trail-for-rejected-action.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Creates complete audit trail for rejected action" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Creates complete audit trail for rejected action + +```gwt +Given the module is imported from platform-core +When I create a detection then rejection flow for agent "inventory-agent" +Then the rejection passes isApprovalRejectedEvent +And the rejection passes validateAgentAuditEvent +And the rejection reason is "Order already placed by manager" +``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-081-creates-audit-trail-for-expired-action.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-081-creates-audit-trail-for-expired-action.sdp.md index 3ad01599..5a8c5073 100644 --- a/specs/behavior/platform-core/agent/audit.examples/s-081-creates-audit-trail-for-expired-action.sdp.md +++ b/specs/behavior/platform-core/agent/audit.examples/s-081-creates-audit-trail-for-expired-action.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Creates audit trail for expired action" from packages/platform-core/tests/features/behavior/agent/audit.feature +- outcome: Executable scenario: Creates audit trail for expired action + +```gwt +Given the module is imported from platform-core +When I create a detection then expiration flow for agent "notification-agent" +Then the expiration event type is "ApprovalExpired" +And the expiration requestedAt is less than expiredAt +And the expiration passes validateAgentAuditEvent +``` diff --git a/specs/behavior/platform-core/agent/audit.sdp.md b/specs/behavior/platform-core/agent/audit.sdp.md index 0c5cf7f6..c0fc12ca 100644 --- a/specs/behavior/platform-core/agent/audit.sdp.md +++ b/specs/behavior/platform-core/agent/audit.sdp.md @@ -10,4 +10,28 @@ relations: ## Intent -- outcome: Pure functions for agent audit trail functionality: decision ID generation, audit event factory functions, type guards, and Zod schema validation. (test carrier: packages/platform-core/tests/features/behavior/agent/audit.feature) +- outcome: Agent Audit Trail + +## Behavior + +- rule: AGENT_AUDIT_EVENT_TYPES contains all canonical event types +- rule: isAgentAuditEventType validates event type strings +- rule: AgentAuditEventTypeSchema validates via Zod +- rule: AuditLLMContextSchema validates LLM context objects +- rule: AuditActionSchema validates action objects +- rule: PatternDetectedPayloadSchema validates pattern payloads +- rule: ApprovalGrantedPayloadSchema validates approval payloads +- rule: ApprovalRejectedPayloadSchema validates rejection payloads +- rule: ApprovalExpiredPayloadSchema validates expiration payloads +- rule: AgentAuditEventSchema validates full audit event objects +- rule: generateDecisionId produces well-formed unique IDs +- rule: createPatternDetectedAudit factory produces correct events +- rule: createApprovalGrantedAudit factory produces correct events +- rule: createApprovalRejectedAudit factory produces correct events +- rule: createApprovalExpiredAudit factory produces correct events +- rule: createGenericAuditEvent factory produces correct events +- rule: isPatternDetectedEvent type guard identifies PatternDetected events +- rule: isApprovalGrantedEvent type guard identifies ApprovalGranted events +- rule: isApprovalRejectedEvent type guard identifies ApprovalRejected events +- rule: validateAgentAuditEvent validates full event objects +- rule: Audit trail flows create consistent event sequences diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-001-returns-true-for-error-recovery-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-001-returns-true-for-error-recovery-status.sdp.md index 83d8e728..f3df9cdf 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-001-returns-true-for-error-recovery-status.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-001-returns-true-for-error-recovery-status.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for error_recovery status" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Returns true for error_recovery status + +```gwt +Given a checkpoint with status "error_recovery" +When I check if the agent is in error recovery +Then the error recovery result is true +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-002-returns-false-for-active-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-002-returns-false-for-active-status.sdp.md index 8d84e726..bbd0aa80 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-002-returns-false-for-active-status.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-002-returns-false-for-active-status.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for active status" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Returns false for active status + +```gwt +Given a checkpoint with status "active" +When I check if the agent is in error recovery +Then the error recovery result is false +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-003-returns-false-for-paused-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-003-returns-false-for-paused-status.sdp.md index 82a55c70..f4ae3986 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-003-returns-false-for-paused-status.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-003-returns-false-for-paused-status.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for paused status" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Returns false for paused status + +```gwt +Given a checkpoint with status "paused" +When I check if the agent is in error recovery +Then the error recovery result is false +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-004-returns-false-for-stopped-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-004-returns-false-for-stopped-status.sdp.md index f0549e1b..da3fc4f3 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-004-returns-false-for-stopped-status.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-004-returns-false-for-stopped-status.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for stopped status" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Returns false for stopped status + +```gwt +Given a checkpoint with status "stopped" +When I check if the agent is in error recovery +Then the error recovery result is false +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-005-returns-base-config-values-when-overrides-are-undefined.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-005-returns-base-config-values-when-overrides-are-undefined.sdp.md index 590a4c9b..c49df5c9 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-005-returns-base-config-values-when-overrides-are-undefined.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-005-returns-base-config-values-when-overrides-are-undefined.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns base config values when overrides are undefined" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Returns base config values when overrides are undefined + +```gwt +Given a base config with confidenceThreshold 0.8 and patternWindowDuration "30d" +When I resolve effective config without overrides +Then the effective confidenceThreshold is 0.8 +And the effective patternWindowDuration is "30d" +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-006-passes-through-base-rate-limits-when-no-overrides.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-006-passes-through-base-rate-limits-when-no-overrides.sdp.md index 96d4c318..3cc2c84b 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-006-passes-through-base-rate-limits-when-no-overrides.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-006-passes-through-base-rate-limits-when-no-overrides.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Passes through base rateLimits when no overrides" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Passes through base rateLimits when no overrides + +```gwt +Given a base config with confidenceThreshold 0.75 and patternWindowDuration "7d" and rateLimits +When I resolve effective config without overrides +Then the effective rateLimits have the following values: +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-007-omits-rate-limits-when-base-has-none-and-no-overrides.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-007-omits-rate-limits-when-base-has-none-and-no-overrides.sdp.md index 72390d57..be437124 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-007-omits-rate-limits-when-base-has-none-and-no-overrides.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-007-omits-rate-limits-when-base-has-none-and-no-overrides.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Omits rateLimits when base has none and no overrides" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Omits rateLimits when base has none and no overrides + +```gwt +Given a base config with confidenceThreshold 0.5 and patternWindowDuration "1d" +When I resolve effective config without overrides +Then the effective rateLimits are undefined +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-008-overrides-confidence-threshold-while-preserving-pattern-window-duration.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-008-overrides-confidence-threshold-while-preserving-pattern-window-duration.sdp.md index ba7584eb..29ccaa18 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-008-overrides-confidence-threshold-while-preserving-pattern-window-duration.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-008-overrides-confidence-threshold-while-preserving-pattern-window-duration.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Overrides confidenceThreshold while preserving patternWindowDuration" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Overrides confidenceThreshold while preserving patternWindowDuration + +```gwt +Given a base config with confidenceThreshold 0.8 and patternWindowDuration "30d" +When I resolve effective config with confidenceThreshold override 0.95 +Then the effective confidenceThreshold is 0.95 +And the effective patternWindowDuration is "30d" +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-009-overrides-pattern-window-duration-while-preserving-confidence-threshold.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-009-overrides-pattern-window-duration-while-preserving-confidence-threshold.sdp.md index 983cc912..a89f9bc3 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-009-overrides-pattern-window-duration-while-preserving-confidence-threshold.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-009-overrides-pattern-window-duration-while-preserving-confidence-threshold.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Overrides patternWindowDuration while preserving confidenceThreshold" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Overrides patternWindowDuration while preserving confidenceThreshold + +```gwt +Given a base config with confidenceThreshold 0.8 and patternWindowDuration "30d" +When I resolve effective config with patternWindowDuration override "7d" +Then the effective confidenceThreshold is 0.8 +And the effective patternWindowDuration is "7d" +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-010-overrides-rate-limits-max-requests-per-minute-while-preserving-base-cost-b.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-010-overrides-rate-limits-max-requests-per-minute-while-preserving-base-cost-b.sdp.md index 2ef7b9ce..94ef7cda 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-010-overrides-rate-limits-max-requests-per-minute-while-preserving-base-cost-b.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-010-overrides-rate-limits-max-requests-per-minute-while-preserving-base-cost-b.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Overrides rateLimits.maxRequestsPerMinute while preserving base costBudget" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Overrides rateLimits.maxRequestsPerMinute while preserving base costBudget + +```gwt +Given a base config with confidenceThreshold 0.8 and patternWindowDuration "30d" and rateLimits +When I resolve effective config with rateLimits maxRequestsPerMinute override 120 +Then the effective rateLimits have the following values: +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-011-deep-merges-cost-budget-daily-while-preserving-cost-budget-alert-threshold.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-011-deep-merges-cost-budget-daily-while-preserving-cost-budget-alert-threshold.sdp.md index bce0489a..9635dab7 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-011-deep-merges-cost-budget-daily-while-preserving-cost-budget-alert-threshold.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-011-deep-merges-cost-budget-daily-while-preserving-cost-budget-alert-threshold.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Deep-merges costBudget.daily while preserving costBudget.alertThreshold" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Deep-merges costBudget.daily while preserving costBudget.alertThreshold + +```gwt +Given a base config with confidenceThreshold 0.8 and patternWindowDuration "30d" and rateLimits +When I resolve effective config with costBudget daily override 200 +Then the effective rateLimits have the following values: +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-012-deep-merges-cost-budget-alert-threshold-while-preserving-cost-budget-daily.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-012-deep-merges-cost-budget-alert-threshold-while-preserving-cost-budget-daily.sdp.md index a3e969dd..276257f0 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-012-deep-merges-cost-budget-alert-threshold-while-preserving-cost-budget-daily.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-012-deep-merges-cost-budget-alert-threshold-while-preserving-cost-budget-daily.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Deep-merges costBudget.alertThreshold while preserving costBudget.daily" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Deep-merges costBudget.alertThreshold while preserving costBudget.daily + +```gwt +Given a base config with confidenceThreshold 0.8 and patternWindowDuration "30d" and rateLimits +When I resolve effective config with costBudget alertThreshold override 0.95 +Then the effective rateLimits have the following values: +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-013-fully-overrides-all-config-values.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-013-fully-overrides-all-config-values.sdp.md index 2babde9a..2eb6ab03 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-013-fully-overrides-all-config-values.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-013-fully-overrides-all-config-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Fully overrides all config values" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Fully overrides all config values + +```gwt +Given a base config with confidenceThreshold 0.8 and patternWindowDuration "30d" and rateLimits +When I resolve effective config with full overrides +Then the resolved config has the following values: +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-014-adds-rate-limits-via-overrides-when-base-has-none.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-014-adds-rate-limits-via-overrides-when-base-has-none.sdp.md index 8a83d630..21b36658 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-014-adds-rate-limits-via-overrides-when-base-has-none.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-014-adds-rate-limits-via-overrides-when-base-has-none.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Adds rateLimits via overrides when base has none" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Adds rateLimits via overrides when base has none + +```gwt +Given a base config with confidenceThreshold 0.8 and patternWindowDuration "30d" +When I resolve effective config adding rateLimits via overrides +Then the effective rateLimits have the following values: +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-015-empty-overrides-object-returns-base-config-values.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-015-empty-overrides-object-returns-base-config-values.sdp.md index ce8c297a..81589512 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-015-empty-overrides-object-returns-base-config-values.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-015-empty-overrides-object-returns-base-config-values.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Empty overrides object returns base config values" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Empty overrides object returns base config values + +```gwt +Given a base config with confidenceThreshold 0.8 and patternWindowDuration "30d" and base rateLimits only maxRequestsPerMinute 60 +When I resolve effective config with empty overrides +Then the effective confidenceThreshold is 0.8 +And the effective patternWindowDuration is "30d" +And the effective rateLimits maxRequestsPerMinute is 60 +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-016-applies-config-overrides-to-a-checkpoint-without-existing-overrides.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-016-applies-config-overrides-to-a-checkpoint-without-existing-overrides.sdp.md index bb5a4392..ec847c5a 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-016-applies-config-overrides-to-a-checkpoint-without-existing-overrides.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-016-applies-config-overrides-to-a-checkpoint-without-existing-overrides.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Applies configOverrides to a checkpoint without existing overrides" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Applies configOverrides to a checkpoint without existing overrides + +```gwt +Given a checkpoint without configOverrides +When I apply an update with configOverrides confidenceThreshold 0.95 +Then the result configOverrides confidenceThreshold is 0.95 +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-017-merges-new-config-overrides-with-existing-overrides.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-017-merges-new-config-overrides-with-existing-overrides.sdp.md index c0a897ec..2aa7b7b4 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-017-merges-new-config-overrides-with-existing-overrides.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-017-merges-new-config-overrides-with-existing-overrides.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Merges new configOverrides with existing overrides" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Merges new configOverrides with existing overrides + +```gwt +Given a checkpoint with configOverrides confidenceThreshold 0.8 +When I apply an update with configOverrides patternWindowDuration "7d" +Then the result configOverrides has the following values: +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-018-update-overrides-take-precedence-over-existing.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-018-update-overrides-take-precedence-over-existing.sdp.md index c540df9a..4451c87e 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-018-update-overrides-take-precedence-over-existing.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-018-update-overrides-take-precedence-over-existing.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Update overrides take precedence over existing" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Update overrides take precedence over existing + +```gwt +Given a checkpoint with configOverrides confidenceThreshold 0.8 +When I apply an update with configOverrides confidenceThreshold 0.99 +Then the result configOverrides confidenceThreshold is 0.99 +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-019-preserves-existing-config-overrides-when-update-has-no-overrides.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-019-preserves-existing-config-overrides-when-update-has-no-overrides.sdp.md index e3893d95..d2b0d30a 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-019-preserves-existing-config-overrides-when-update-has-no-overrides.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-019-preserves-existing-config-overrides-when-update-has-no-overrides.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Preserves existing configOverrides when update has no overrides" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Preserves existing configOverrides when update has no overrides + +```gwt +Given a checkpoint with configOverrides confidenceThreshold 0.9 and rateLimits maxRequestsPerMinute 30 +When I apply an update with status "paused" only +Then the result configOverrides has the following values: +And the result status is "paused" +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-020-deep-merges-rate-limits-cost-budget-in-checkpoint-overrides.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-020-deep-merges-rate-limits-cost-budget-in-checkpoint-overrides.sdp.md index 3c21e511..0a38ee1c 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-020-deep-merges-rate-limits-cost-budget-in-checkpoint-overrides.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-020-deep-merges-rate-limits-cost-budget-in-checkpoint-overrides.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Deep-merges rateLimits.costBudget in checkpoint overrides" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Deep-merges rateLimits.costBudget in checkpoint overrides + +```gwt +Given a checkpoint with configOverrides rateLimits maxRequestsPerMinute 60 and costBudget daily 100 alertThreshold 0.8 +When I apply an update with configOverrides costBudget daily 200 +Then the result configOverrides has the following values: +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-021-updates-updated-at-timestamp.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-021-updates-updated-at-timestamp.sdp.md index 89c00ded..b64a8dfc 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-021-updates-updated-at-timestamp.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-021-updates-updated-at-timestamp.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Updates updatedAt timestamp" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Updates updatedAt timestamp + +```gwt +Given a checkpoint without configOverrides +When I apply an update with lastProcessedPosition 20 +Then the result updatedAt equals the current time +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-022-increments-events-processed-count.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-022-increments-events-processed-count.sdp.md index 9d6b5fc2..290fda15 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-022-increments-events-processed-count.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-022-increments-events-processed-count.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Increments eventsProcessed count" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Increments eventsProcessed count + +```gwt +Given a checkpoint with eventsProcessed 10 +When I apply an update with incrementEventsProcessed 5 +Then the result eventsProcessed is 15 +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-023-preserves-events-processed-when-no-increment-provided.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-023-preserves-events-processed-when-no-increment-provided.sdp.md index 835e6227..aafb4ec1 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-023-preserves-events-processed-when-no-increment-provided.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-023-preserves-events-processed-when-no-increment-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Preserves eventsProcessed when no increment provided" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Preserves eventsProcessed when no increment provided + +```gwt +Given a checkpoint with eventsProcessed 10 +When I apply an update with status "paused" only +Then the result eventsProcessed is 10 +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-024-does-not-add-config-overrides-key-when-neither-existing-nor-update-have-th.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-024-does-not-add-config-overrides-key-when-neither-existing-nor-update-have-th.sdp.md index 06781947..78fbb777 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-024-does-not-add-config-overrides-key-when-neither-existing-nor-update-have-th.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-024-does-not-add-config-overrides-key-when-neither-existing-nor-update-have-th.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Does not add configOverrides key when neither existing nor update have them" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Does not add configOverrides key when neither existing nor update have them + +```gwt +Given a checkpoint without configOverrides +When I apply an update with lastProcessedPosition 20 +Then the result configOverrides are undefined +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-025-creates-checkpoint-with-sentinel-last-processed-position-of-1.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-025-creates-checkpoint-with-sentinel-last-processed-position-of-1.sdp.md index 9820b5f0..013f3c00 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-025-creates-checkpoint-with-sentinel-last-processed-position-of-1.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-025-creates-checkpoint-with-sentinel-last-processed-position-of-1.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Creates checkpoint with sentinel lastProcessedPosition of -1" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Creates checkpoint with sentinel lastProcessedPosition of -1 + +```gwt +Given the feature fixture is in place +When I create an initial checkpoint for agent "agent-001" and subscription "sub-001" +Then the initial checkpoint lastProcessedPosition is -1 +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-026-creates-checkpoint-with-active-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-026-creates-checkpoint-with-active-status.sdp.md index dd048a29..a010d5c3 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-026-creates-checkpoint-with-active-status.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-026-creates-checkpoint-with-active-status.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Creates checkpoint with active status" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Creates checkpoint with active status + +```gwt +Given the feature fixture is in place +When I create an initial checkpoint for agent "agent-001" and subscription "sub-001" +Then the initial checkpoint status is "active" +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-027-creates-checkpoint-with-zero-events-processed.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-027-creates-checkpoint-with-zero-events-processed.sdp.md index b0c15828..fded1454 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-027-creates-checkpoint-with-zero-events-processed.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-027-creates-checkpoint-with-zero-events-processed.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Creates checkpoint with zero events processed" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Creates checkpoint with zero events processed + +```gwt +Given the feature fixture is in place +When I create an initial checkpoint for agent "agent-001" and subscription "sub-001" +Then the initial checkpoint eventsProcessed is 0 +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-028-creates-checkpoint-with-empty-last-event-id.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-028-creates-checkpoint-with-empty-last-event-id.sdp.md index b6c4b4f8..8deb8578 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-028-creates-checkpoint-with-empty-last-event-id.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-028-creates-checkpoint-with-empty-last-event-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Creates checkpoint with empty lastEventId" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Creates checkpoint with empty lastEventId + +```gwt +Given the feature fixture is in place +When I create an initial checkpoint for agent "agent-001" and subscription "sub-001" +Then the initial checkpoint lastEventId is "" +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-029-sets-updated-at-to-current-time.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-029-sets-updated-at-to-current-time.sdp.md index 45e50a40..61a31685 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-029-sets-updated-at-to-current-time.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-029-sets-updated-at-to-current-time.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Sets updatedAt to current time" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Sets updatedAt to current time + +```gwt +Given the feature fixture is in place +When I create an initial checkpoint for agent "agent-001" and subscription "sub-001" +Then the initial checkpoint updatedAt equals the current time +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-030-preserves-agent-id-and-subscription-id.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-030-preserves-agent-id-and-subscription-id.sdp.md index 854c2c82..8416ae74 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-030-preserves-agent-id-and-subscription-id.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-030-preserves-agent-id-and-subscription-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Preserves agentId and subscriptionId" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Preserves agentId and subscriptionId + +```gwt +Given the feature fixture is in place +When I create an initial checkpoint for agent "my-agent" and subscription "my-sub" +Then the initial checkpoint has the following identity values: +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-031-does-not-include-config-overrides.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-031-does-not-include-config-overrides.sdp.md index 39665160..f56bc746 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-031-does-not-include-config-overrides.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-031-does-not-include-config-overrides.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Does not include configOverrides" from packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature +- outcome: Executable scenario: Does not include configOverrides + +```gwt +Given the feature fixture is in place +When I create an initial checkpoint for agent "agent-001" and subscription "sub-001" +Then the initial checkpoint configOverrides are undefined +``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.sdp.md index edf2af36..7dcef2d0 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Lifecycle-related checkpoint extensions including error recovery detection, effective config resolution with overrides, checkpoint update application with config merges, and initial checkpoint creation. (test carrier: packages/platform-core/tests/features/behavior/agent/checkpoint-extension.feature) +- outcome: Checkpoint Extension + +## Behavior + +- rule: isAgentInErrorRecovery returns true only for error_recovery status +- rule: resolveEffectiveConfig returns base config when no overrides provided +- rule: resolveEffectiveConfig applies partial overrides while preserving other values +- rule: resolveEffectiveConfig deep-merges rateLimits.costBudget +- rule: resolveEffectiveConfig fully overrides all config values +- rule: resolveEffectiveConfig handles edge cases +- rule: applyCheckpointUpdate merges configOverrides correctly +- rule: createInitialAgentCheckpoint produces correct defaults diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-001-contains-all-four-statuses.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-001-contains-all-four-statuses.sdp.md index 6cb71b72..dd474f6b 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-001-contains-all-four-statuses.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-001-contains-all-four-statuses.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Contains all four statuses" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Contains all four statuses + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then AGENT_CHECKPOINT_STATUSES equals ["active", "paused", "stopped", "error_recovery"] +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-002-is-a-readonly-tuple-with-4-elements.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-002-is-a-readonly-tuple-with-4-elements.sdp.md index a6023bfe..e033d1e7 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-002-is-a-readonly-tuple-with-4-elements.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-002-is-a-readonly-tuple-with-4-elements.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Is a readonly tuple with 4 elements" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Is a readonly tuple with 4 elements + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then AGENT_CHECKPOINT_STATUSES is an array +And AGENT_CHECKPOINT_STATUSES has length 4 +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-003-accepts-all-valid-statuses.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-003-accepts-all-valid-statuses.sdp.md index 9b4b3302..59c4a852 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-003-accepts-all-valid-statuses.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-003-accepts-all-valid-statuses.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts all valid statuses" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Accepts all valid statuses + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then AgentCheckpointStatusSchema accepts all of: +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-004-rejects-invalid-statuses.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-004-rejects-invalid-statuses.sdp.md index e15cef2f..189583c0 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-004-rejects-invalid-statuses.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-004-rejects-invalid-statuses.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects invalid statuses" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Rejects invalid statuses + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then AgentCheckpointStatusSchema rejects all of: +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-005-accepts-a-valid-checkpoint-object.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-005-accepts-a-valid-checkpoint-object.sdp.md index d157ffc9..34c8b73b 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-005-accepts-a-valid-checkpoint-object.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-005-accepts-a-valid-checkpoint-object.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts a valid checkpoint object" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Accepts a valid checkpoint object + +```gwt +Given the module is imported from platform-core +And a test checkpoint with defaults +When the scenario runs +Then the checkpoint passes AgentCheckpointSchema validation +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-006-accepts-checkpoint-with-sentinel-position-1.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-006-accepts-checkpoint-with-sentinel-position-1.sdp.md index d42f9b51..b610c782 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-006-accepts-checkpoint-with-sentinel-position-1.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-006-accepts-checkpoint-with-sentinel-position-1.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts checkpoint with sentinel position -1" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Accepts checkpoint with sentinel position -1 + +```gwt +Given the module is imported from platform-core +And a test checkpoint with lastProcessedPosition -1 +When the scenario runs +Then the checkpoint passes AgentCheckpointSchema validation +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-007-rejects-checkpoint-with-position-below-1.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-007-rejects-checkpoint-with-position-below-1.sdp.md index 9a5d9764..f0e66895 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-007-rejects-checkpoint-with-position-below-1.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-007-rejects-checkpoint-with-position-below-1.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects checkpoint with position below -1" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Rejects checkpoint with position below -1 + +```gwt +Given the module is imported from platform-core +And a test checkpoint with lastProcessedPosition -2 +When the scenario runs +Then the checkpoint fails AgentCheckpointSchema validation +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-008-rejects-checkpoint-with-negative-events-processed.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-008-rejects-checkpoint-with-negative-events-processed.sdp.md index 0e4ea756..804bb186 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-008-rejects-checkpoint-with-negative-events-processed.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-008-rejects-checkpoint-with-negative-events-processed.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects checkpoint with negative eventsProcessed" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Rejects checkpoint with negative eventsProcessed + +```gwt +Given the module is imported from platform-core +And a test checkpoint with eventsProcessed -1 +When the scenario runs +Then the checkpoint fails AgentCheckpointSchema validation +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-009-rejects-checkpoint-with-empty-agent-id.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-009-rejects-checkpoint-with-empty-agent-id.sdp.md index 4b208192..10745c92 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-009-rejects-checkpoint-with-empty-agent-id.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-009-rejects-checkpoint-with-empty-agent-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects checkpoint with empty agentId" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Rejects checkpoint with empty agentId + +```gwt +Given the module is imported from platform-core +And a test checkpoint with agentId "" +When the scenario runs +Then the checkpoint fails AgentCheckpointSchema validation +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-010-rejects-checkpoint-with-empty-subscription-id.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-010-rejects-checkpoint-with-empty-subscription-id.sdp.md index dd680207..15b4a4c5 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-010-rejects-checkpoint-with-empty-subscription-id.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-010-rejects-checkpoint-with-empty-subscription-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects checkpoint with empty subscriptionId" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Rejects checkpoint with empty subscriptionId + +```gwt +Given the module is imported from platform-core +And a test checkpoint with subscriptionId "" +When the scenario runs +Then the checkpoint fails AgentCheckpointSchema validation +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-011-rejects-checkpoint-with-missing-required-fields.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-011-rejects-checkpoint-with-missing-required-fields.sdp.md index 54092600..dbf8ce8a 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-011-rejects-checkpoint-with-missing-required-fields.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-011-rejects-checkpoint-with-missing-required-fields.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects checkpoint with missing required fields" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Rejects checkpoint with missing required fields + +```gwt +Given the module is imported from platform-core +And an object with only agentId "test" +When the scenario runs +Then the checkpoint fails AgentCheckpointSchema validation +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-012-creates-checkpoint-with-correct-agent-id-and-subscription-id.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-012-creates-checkpoint-with-correct-agent-id-and-subscription-id.sdp.md index ddd7a956..86e6ea3f 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-012-creates-checkpoint-with-correct-agent-id-and-subscription-id.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-012-creates-checkpoint-with-correct-agent-id-and-subscription-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Creates checkpoint with correct agentId and subscriptionId" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Creates checkpoint with correct agentId and subscriptionId + +```gwt +Given the module is imported from platform-core +When I create an initial checkpoint for agent "my-agent" with subscription "sub-001" +Then the checkpoint has the following properties: +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-013-initializes-position-and-event-tracking-defaults.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-013-initializes-position-and-event-tracking-defaults.sdp.md index 6473221a..2933f8b2 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-013-initializes-position-and-event-tracking-defaults.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-013-initializes-position-and-event-tracking-defaults.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Initializes position and event tracking defaults" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Initializes position and event tracking defaults + +```gwt +Given the module is imported from platform-core +When I create an initial checkpoint for agent "my-agent" with subscription "sub-001" +Then the checkpoint has the following numeric properties: +And the checkpoint lastEventId is "" +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-014-initializes-status-to-active.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-014-initializes-status-to-active.sdp.md index bf9309ca..b779ff32 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-014-initializes-status-to-active.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-014-initializes-status-to-active.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Initializes status to active" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Initializes status to active + +```gwt +Given the module is imported from platform-core +When I create an initial checkpoint for agent "my-agent" with subscription "sub-001" +Then the checkpoint status is "active" +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-015-sets-updated-at-to-current-time.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-015-sets-updated-at-to-current-time.sdp.md index 8805706e..8ecdc3ba 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-015-sets-updated-at-to-current-time.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-015-sets-updated-at-to-current-time.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Sets updatedAt to current time" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Sets updatedAt to current time + +```gwt +Given the module is imported from platform-core +When I create an initial checkpoint for agent "my-agent" with subscription "sub-001" +Then the checkpoint updatedAt equals the current time +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-016-creates-a-checkpoint-that-passes-schema-validation.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-016-creates-a-checkpoint-that-passes-schema-validation.sdp.md index 0aba4c3a..54471518 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-016-creates-a-checkpoint-that-passes-schema-validation.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-016-creates-a-checkpoint-that-passes-schema-validation.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Creates a checkpoint that passes schema validation" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Creates a checkpoint that passes schema validation + +```gwt +Given the module is imported from platform-core +When I create an initial checkpoint for agent "my-agent" with subscription "sub-001" +Then the checkpoint passes AgentCheckpointSchema validation +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-017-updates-last-processed-position.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-017-updates-last-processed-position.sdp.md index 541292c2..0c24d04a 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-017-updates-last-processed-position.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-017-updates-last-processed-position.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Updates lastProcessedPosition" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Updates lastProcessedPosition + +```gwt +Given the module is imported from platform-core +And a test checkpoint with lastProcessedPosition 100 +When I apply an update with lastProcessedPosition 150 +Then the checkpoint lastProcessedPosition is 150 +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-018-updates-last-event-id.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-018-updates-last-event-id.sdp.md index 9220fe5b..2a60f368 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-018-updates-last-event-id.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-018-updates-last-event-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Updates lastEventId" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Updates lastEventId + +```gwt +Given the module is imported from platform-core +And a test checkpoint with lastEventId "evt_old" +When I apply an update with lastEventId "evt_new" +Then the checkpoint lastEventId is "evt_new" +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-019-updates-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-019-updates-status.sdp.md index 4e0564de..ff023963 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-019-updates-status.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-019-updates-status.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Updates status" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Updates status + +```gwt +Given the module is imported from platform-core +And a test checkpoint with status "active" +When I apply an update with status "paused" +Then the checkpoint status is "paused" +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-020-increments-events-processed-by-specified-amount.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-020-increments-events-processed-by-specified-amount.sdp.md index ecf96fb8..b27f5622 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-020-increments-events-processed-by-specified-amount.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-020-increments-events-processed-by-specified-amount.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Increments eventsProcessed by specified amount" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Increments eventsProcessed by specified amount + +```gwt +Given the module is imported from platform-core +And a test checkpoint with eventsProcessed 50 +When I apply an update with incrementEventsProcessed 5 +Then the checkpoint eventsProcessed is 55 +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-021-increments-events-processed-by-1-for-single-event.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-021-increments-events-processed-by-1-for-single-event.sdp.md index 00d14ef5..01b205f1 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-021-increments-events-processed-by-1-for-single-event.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-021-increments-events-processed-by-1-for-single-event.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Increments eventsProcessed by 1 for single event" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Increments eventsProcessed by 1 for single event + +```gwt +Given the module is imported from platform-core +And a test checkpoint with eventsProcessed 100 +When I apply an update with incrementEventsProcessed 1 +Then the checkpoint eventsProcessed is 101 +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-022-does-not-increment-events-processed-when-not-specified.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-022-does-not-increment-events-processed-when-not-specified.sdp.md index fb119e99..3677c0f1 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-022-does-not-increment-events-processed-when-not-specified.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-022-does-not-increment-events-processed-when-not-specified.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Does not increment eventsProcessed when not specified" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Does not increment eventsProcessed when not specified + +```gwt +Given the module is imported from platform-core +And a test checkpoint with eventsProcessed 50 +When I apply an update with lastProcessedPosition 101 +Then the checkpoint eventsProcessed is 50 +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-023-preserves-unchanged-fields.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-023-preserves-unchanged-fields.sdp.md index d793f937..0e537baa 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-023-preserves-unchanged-fields.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-023-preserves-unchanged-fields.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Preserves unchanged fields" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Preserves unchanged fields + +```gwt +Given the module is imported from platform-core +And a fully specified test checkpoint +When I apply an update with lastProcessedPosition 101 +Then the unchanged fields are preserved +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-024-updates-updated-at-to-current-time.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-024-updates-updated-at-to-current-time.sdp.md index 5c0d6a83..f5af608c 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-024-updates-updated-at-to-current-time.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-024-updates-updated-at-to-current-time.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Updates updatedAt to current time" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Updates updatedAt to current time + +```gwt +Given the module is imported from platform-core +And a test checkpoint with updatedAt 10000ms ago +When I apply an update with lastProcessedPosition 101 +Then the checkpoint updatedAt equals the current time +And the checkpoint updatedAt differs from the old time +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-025-applies-multiple-updates-at-once.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-025-applies-multiple-updates-at-once.sdp.md index 5a694790..e0b76d2f 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-025-applies-multiple-updates-at-once.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-025-applies-multiple-updates-at-once.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Applies multiple updates at once" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Applies multiple updates at once + +```gwt +Given the module is imported from platform-core +And a test checkpoint with lastProcessedPosition 100 and lastEventId "evt_old" and status "active" and eventsProcessed 50 +When I apply an update with lastProcessedPosition 101 and lastEventId "evt_new" and status "paused" and incrementEventsProcessed 1 +Then the checkpoint has the following properties: +And the checkpoint eventsProcessed is 51 +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-026-handles-empty-update-by-only-updating-timestamp.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-026-handles-empty-update-by-only-updating-timestamp.sdp.md index 00461bdd..9ea2d509 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-026-handles-empty-update-by-only-updating-timestamp.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-026-handles-empty-update-by-only-updating-timestamp.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Handles empty update by only updating timestamp" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Handles empty update by only updating timestamp + +```gwt +Given the module is imported from platform-core +And a test checkpoint with defaults +When I apply an empty update +Then the checkpoint fields match the original except updatedAt +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-027-returns-true-when-event-position-is-greater-than-checkpoint.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-027-returns-true-when-event-position-is-greater-than-checkpoint.sdp.md index e53c25ab..e45b2d9b 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-027-returns-true-when-event-position-is-greater-than-checkpoint.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-027-returns-true-when-event-position-is-greater-than-checkpoint.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when event position is greater than checkpoint" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Returns true when event position is greater than checkpoint + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then shouldProcessAgentEvent with position 101 and checkpoint 100 returns true +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-028-returns-false-for-duplicate-event-at-same-position.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-028-returns-false-for-duplicate-event-at-same-position.sdp.md index 96a993e0..02337fa2 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-028-returns-false-for-duplicate-event-at-same-position.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-028-returns-false-for-duplicate-event-at-same-position.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for duplicate event at same position" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Returns false for duplicate event at same position + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then shouldProcessAgentEvent with position 100 and checkpoint 100 returns false +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-029-returns-false-for-already-processed-event.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-029-returns-false-for-already-processed-event.sdp.md index 1c4ea60a..60b8d8d9 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-029-returns-false-for-already-processed-event.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-029-returns-false-for-already-processed-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for already-processed event" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Returns false for already-processed event + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then shouldProcessAgentEvent with position 50 and checkpoint 100 returns false +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-030-returns-true-for-position-0-against-sentinel-1-for-a-new-agent.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-030-returns-true-for-position-0-against-sentinel-1-for-a-new-agent.sdp.md index 53a28d16..9ff7ce28 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-030-returns-true-for-position-0-against-sentinel-1-for-a-new-agent.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-030-returns-true-for-position-0-against-sentinel-1-for-a-new-agent.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for position 0 against sentinel -1 for a new agent" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Returns true for position 0 against sentinel -1 for a new agent + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then shouldProcessAgentEvent with position 0 and checkpoint -1 returns true +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-031-returns-true-for-position-1-against-sentinel-1.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-031-returns-true-for-position-1-against-sentinel-1.sdp.md index 09fc9f00..76f4b512 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-031-returns-true-for-position-1-against-sentinel-1.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-031-returns-true-for-position-1-against-sentinel-1.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for position 1 against sentinel -1" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Returns true for position 1 against sentinel -1 + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then shouldProcessAgentEvent with position 1 and checkpoint -1 returns true +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-032-returns-true-for-any-positive-position-against-sentinel-1.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-032-returns-true-for-any-positive-position-against-sentinel-1.sdp.md index 29b34be4..5f033d7d 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-032-returns-true-for-any-positive-position-against-sentinel-1.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-032-returns-true-for-any-positive-position-against-sentinel-1.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for any positive position against sentinel -1" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Returns true for any positive position against sentinel -1 + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then shouldProcessAgentEvent returns true for all positions against sentinel: +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-033-returns-true-for-position-1-against-checkpoint-0.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-033-returns-true-for-position-1-against-checkpoint-0.sdp.md index 02c77d15..f07ea46c 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-033-returns-true-for-position-1-against-checkpoint-0.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-033-returns-true-for-position-1-against-checkpoint-0.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for position 1 against checkpoint 0" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Returns true for position 1 against checkpoint 0 + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then shouldProcessAgentEvent with position 1 and checkpoint 0 returns true +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-034-returns-false-for-position-0-against-checkpoint-0.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-034-returns-false-for-position-0-against-checkpoint-0.sdp.md index 7d966734..1442e008 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-034-returns-false-for-position-0-against-checkpoint-0.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-034-returns-false-for-position-0-against-checkpoint-0.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for position 0 against checkpoint 0" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Returns false for position 0 against checkpoint 0 + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then shouldProcessAgentEvent with position 0 and checkpoint 0 returns false +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-035-handles-large-position-values.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-035-handles-large-position-values.sdp.md index 15746da8..f0c29ba9 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-035-handles-large-position-values.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-035-handles-large-position-values.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Handles large position values" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Handles large position values + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then shouldProcessAgentEvent with position 1000001 and checkpoint 1000000 returns true +And shouldProcessAgentEvent with position 1000000 and checkpoint 1000000 returns false +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-036-processes-sequential-events-correctly.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-036-processes-sequential-events-correctly.sdp.md index 06d283b8..b3d8cf69 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-036-processes-sequential-events-correctly.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-036-processes-sequential-events-correctly.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Processes sequential events correctly" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Processes sequential events correctly + +```gwt +Given the module is imported from platform-core +When processing sequential events starting from sentinel -1 +Then each event is accepted and duplicates are rejected +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-037-handles-gaps-in-event-positions.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-037-handles-gaps-in-event-positions.sdp.md index 90c617c3..76d2c3a0 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-037-handles-gaps-in-event-positions.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-037-handles-gaps-in-event-positions.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Handles gaps in event positions" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Handles gaps in event positions + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then shouldProcessAgentEvent with position 150 and checkpoint 100 returns true +And shouldProcessAgentEvent with position 200 and checkpoint 150 returns true +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-038-is-agent-active-returns-true-only-for-active-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-038-is-agent-active-returns-true-only-for-active-status.sdp.md index b1c51a0a..c262eb06 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-038-is-agent-active-returns-true-only-for-active-status.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-038-is-agent-active-returns-true-only-for-active-status.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isAgentActive returns true only for active status" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: isAgentActive returns true only for active status + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isAgentActive returns the following for each status: +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-039-is-agent-paused-returns-true-only-for-paused-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-039-is-agent-paused-returns-true-only-for-paused-status.sdp.md index d26c0b21..5c32ecca 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-039-is-agent-paused-returns-true-only-for-paused-status.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-039-is-agent-paused-returns-true-only-for-paused-status.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isAgentPaused returns true only for paused status" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: isAgentPaused returns true only for paused status + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isAgentPaused returns the following for each status: +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-040-is-agent-stopped-returns-true-only-for-stopped-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-040-is-agent-stopped-returns-true-only-for-stopped-status.sdp.md index a7b842bd..3e06ed9e 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-040-is-agent-stopped-returns-true-only-for-stopped-status.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-040-is-agent-stopped-returns-true-only-for-stopped-status.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isAgentStopped returns true only for stopped status" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: isAgentStopped returns true only for stopped status + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isAgentStopped returns the following for each status: +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-041-returns-true-for-a-valid-checkpoint.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-041-returns-true-for-a-valid-checkpoint.sdp.md index 5abfa594..fff3d85c 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-041-returns-true-for-a-valid-checkpoint.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-041-returns-true-for-a-valid-checkpoint.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for a valid checkpoint" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Returns true for a valid checkpoint + +```gwt +Given the module is imported from platform-core +And a test checkpoint with defaults +When the scenario runs +Then isValidAgentCheckpoint returns true +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-042-returns-true-for-checkpoint-with-sentinel-position.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-042-returns-true-for-checkpoint-with-sentinel-position.sdp.md index d47ff905..9290c56a 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-042-returns-true-for-checkpoint-with-sentinel-position.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-042-returns-true-for-checkpoint-with-sentinel-position.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for checkpoint with sentinel position" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Returns true for checkpoint with sentinel position + +```gwt +Given the module is imported from platform-core +And a test checkpoint with lastProcessedPosition -1 +When the scenario runs +Then isValidAgentCheckpoint returns true +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-043-returns-false-for-null-undefined-and-empty-object.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-043-returns-false-for-null-undefined-and-empty-object.sdp.md index 6e48a22b..9a613b88 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-043-returns-false-for-null-undefined-and-empty-object.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-043-returns-false-for-null-undefined-and-empty-object.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for null, undefined, and empty object" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Returns false for null, undefined, and empty object + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isValidAgentCheckpoint returns false for: +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-044-returns-false-for-non-object-values.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-044-returns-false-for-non-object-values.sdp.md index c836d634..1bdd5543 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-044-returns-false-for-non-object-values.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-044-returns-false-for-non-object-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for non-object values" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Returns false for non-object values + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isValidAgentCheckpoint returns false for non-objects: +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-045-returns-false-for-checkpoint-with-invalid-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-045-returns-false-for-checkpoint-with-invalid-status.sdp.md index 76621f97..14f55970 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-045-returns-false-for-checkpoint-with-invalid-status.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-045-returns-false-for-checkpoint-with-invalid-status.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for checkpoint with invalid status" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Returns false for checkpoint with invalid status + +```gwt +Given the module is imported from platform-core +And a test checkpoint with status "invalid" +When the scenario runs +Then isValidAgentCheckpoint returns false +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-046-returns-false-for-checkpoint-with-position-below-1.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-046-returns-false-for-checkpoint-with-position-below-1.sdp.md index 751a9ca8..f2f5ce37 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-046-returns-false-for-checkpoint-with-position-below-1.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-046-returns-false-for-checkpoint-with-position-below-1.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for checkpoint with position below -1" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Returns false for checkpoint with position below -1 + +```gwt +Given the module is imported from platform-core +And a test checkpoint with lastProcessedPosition -2 +When the scenario runs +Then isValidAgentCheckpoint returns false +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-047-returns-false-for-checkpoint-with-negative-events-processed.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-047-returns-false-for-checkpoint-with-negative-events-processed.sdp.md index 6e8a6ab4..beb22b14 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-047-returns-false-for-checkpoint-with-negative-events-processed.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-047-returns-false-for-checkpoint-with-negative-events-processed.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for checkpoint with negative eventsProcessed" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Returns false for checkpoint with negative eventsProcessed + +```gwt +Given the module is imported from platform-core +And a test checkpoint with eventsProcessed -1 +When the scenario runs +Then isValidAgentCheckpoint returns false +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-048-new-agent-processes-first-events.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-048-new-agent-processes-first-events.sdp.md index d9c67df2..0cd00f98 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-048-new-agent-processes-first-events.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-048-new-agent-processes-first-events.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "New agent processes first events" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: New agent processes first events + +```gwt +Given the module is imported from platform-core +When I create an initial checkpoint for agent "new-agent" with subscription "sub-001" and I process event at position 0 with id "evt_0" and I process event at position 1 with id "evt_1" +Then the checkpoint lastProcessedPosition is -1 +And the checkpoint eventsProcessed is 0 +And isAgentActive returns true for the checkpoint +And the checkpoint lastProcessedPosition is 0 +And the checkpoint eventsProcessed is 1 +And the checkpoint lastProcessedPosition is 1 +And the checkpoint eventsProcessed is 2 +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-049-agent-pause-and-resume-preserves-position.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-049-agent-pause-and-resume-preserves-position.sdp.md index 84d9cd9d..0e9a3652 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-049-agent-pause-and-resume-preserves-position.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-049-agent-pause-and-resume-preserves-position.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Agent pause and resume preserves position" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Agent pause and resume preserves position + +```gwt +Given the module is imported from platform-core +And a test checkpoint with status "active" and lastProcessedPosition 100 and eventsProcessed 100 +When I apply an update with status "paused" and I apply an update with status "active" +Then isAgentPaused returns true for the checkpoint +And isAgentActive returns false for the checkpoint +And the checkpoint lastProcessedPosition is 100 +And the checkpoint eventsProcessed is 100 +And isAgentActive returns true for the checkpoint +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-050-agent-restart-recovery-skips-already-processed-events.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-050-agent-restart-recovery-skips-already-processed-events.sdp.md index 6931a338..d3817252 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-050-agent-restart-recovery-skips-already-processed-events.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-050-agent-restart-recovery-skips-already-processed-events.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Agent restart recovery skips already-processed events" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Agent restart recovery skips already-processed events + +```gwt +Given the module is imported from platform-core +And a test checkpoint with lastProcessedPosition 500 and lastEventId "evt_500" and eventsProcessed 500 +When the scenario runs +Then shouldProcessAgentEvent with position 500 and checkpoint 500 returns false +And shouldProcessAgentEvent with position 499 and checkpoint 500 returns false +And shouldProcessAgentEvent with position 501 and checkpoint 500 returns true +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-051-duplicate-event-delivery-is-idempotent.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-051-duplicate-event-delivery-is-idempotent.sdp.md index 2aac2528..8fa90cee 100644 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-051-duplicate-event-delivery-is-idempotent.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.examples/s-051-duplicate-event-delivery-is-idempotent.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Duplicate event delivery is idempotent" from packages/platform-core/tests/features/behavior/agent/checkpoint.feature +- outcome: Executable scenario: Duplicate event delivery is idempotent + +```gwt +Given the module is imported from platform-core +And a test checkpoint with lastProcessedPosition 100 and eventsProcessed 100 +When I process event at position 101 with id "evt_101" +Then shouldProcessAgentEvent with position 101 and checkpoint 101 returns false +And the checkpoint eventsProcessed is 101 +And shouldProcessAgentEvent with position 102 and checkpoint 101 returns true +``` diff --git a/specs/behavior/platform-core/agent/checkpoint.sdp.md b/specs/behavior/platform-core/agent/checkpoint.sdp.md index 36d0a6cc..10661812 100644 --- a/specs/behavior/platform-core/agent/checkpoint.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Pure functions for agent checkpoint management: creation, position tracking, idempotency guards, status helpers, and schema validation. (test carrier: packages/platform-core/tests/features/behavior/agent/checkpoint.feature) +- outcome: Agent Checkpoint + +## Behavior + +- rule: AGENT_CHECKPOINT_STATUSES is a readonly tuple of four statuses +- rule: AgentCheckpointStatusSchema accepts only valid status strings +- rule: AgentCheckpointSchema validates complete checkpoint objects +- rule: createInitialAgentCheckpoint produces a valid default checkpoint +- rule: applyCheckpointUpdate merges partial updates into an existing checkpoint +- rule: shouldProcessAgentEvent guards against duplicate and out-of-order events +- rule: Status helper functions reflect checkpoint status accurately +- rule: isValidAgentCheckpoint validates arbitrary input against the schema +- rule: Checkpoint lifecycle supports create-process-pause-resume-recover workflows diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-001-routes-command-through-registry-orchestrator-records-audit-and-updates-sta.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-001-routes-command-through-registry-orchestrator-records-audit-and-updates-sta.sdp.md index fbc74ae8..3b8e3551 100644 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-001-routes-command-through-registry-orchestrator-records-audit-and-updates-sta.sdp.md +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-001-routes-command-through-registry-orchestrator-records-audit-and-updates-sta.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "Routes command through registry, orchestrator, records audit, and updates status" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature +- outcome: Executable scenario: Routes command through registry, orchestrator, records audit, and updates status + +```gwt +Given the module is imported from platform-core +And a standard mock component +And a mock orchestrator that succeeds +And a mock registry containing "SuggestCustomerOutreach" +And a standard route map +When the bridge handler is created and invoked with standard args +Then the orchestrator was called once with the correct arguments +And an AgentCommandRouted audit event was recorded with: +And the decision status was updated to "completed" +``` diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-002-records-agent-command-routing-failed-audit-and-sets-status-to-failed-for-u.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-002-records-agent-command-routing-failed-audit-and-sets-status-to-failed-for-u.sdp.md index 67ab9940..ada40008 100644 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-002-records-agent-command-routing-failed-audit-and-sets-status-to-failed-for-u.sdp.md +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-002-records-agent-command-routing-failed-audit-and-sets-status-to-failed-for-u.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: Executable scenario "Records AgentCommandRoutingFailed audit and sets status to failed for unknown route" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature +- outcome: Executable scenario: Records AgentCommandRoutingFailed audit and sets status to failed for unknown route + +```gwt +Given the module is imported from platform-core +And a standard mock component +And a mock orchestrator that succeeds +And a mock registry containing "SuggestCustomerOutreach" +And a standard route map +When the bridge handler is invoked with commandType "NonExistentCommand" +Then the orchestrator was not called +And an AgentCommandRoutingFailed audit event was recorded for agent "test-agent" decision "dec_test_42" +And the audit payload code is "UNKNOWN_ROUTE" +And the decision status was updated to "failed" +``` diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-003-records-command-not-registered-error-when-registry-does-not-contain-the-co.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-003-records-command-not-registered-error-when-registry-does-not-contain-the-co.sdp.md index 4da25d61..8cc4012e 100644 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-003-records-command-not-registered-error-when-registry-does-not-contain-the-co.sdp.md +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-003-records-command-not-registered-error-when-registry-does-not-contain-the-co.sdp.md @@ -10,4 +10,18 @@ relations: ## Intent -- outcome: Executable scenario "Records COMMAND_NOT_REGISTERED error when registry does not contain the command" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature +- outcome: Executable scenario: Records COMMAND_NOT_REGISTERED error when registry does not contain the command + +```gwt +Given the module is imported from platform-core +And a standard mock component +And a mock orchestrator that succeeds +And an empty mock registry +And a standard route map +When the bridge handler is created and invoked with standard args +Then the orchestrator was not called +And an AgentCommandRoutingFailed audit event was recorded +And the audit payload code is "COMMAND_NOT_REGISTERED" +And the audit payload error contains "not registered in CommandRegistry" +And the decision status was updated to "failed" +``` diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-004-records-invalid-transform-error-when-to-orchestrator-args-throws.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-004-records-invalid-transform-error-when-to-orchestrator-args-throws.sdp.md index 652cfceb..1d913e38 100644 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-004-records-invalid-transform-error-when-to-orchestrator-args-throws.sdp.md +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-004-records-invalid-transform-error-when-to-orchestrator-args-throws.sdp.md @@ -10,4 +10,19 @@ relations: ## Intent -- outcome: Executable scenario "Records INVALID_TRANSFORM error when toOrchestratorArgs throws" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature +- outcome: Executable scenario: Records INVALID_TRANSFORM error when toOrchestratorArgs throws + +```gwt +Given the module is imported from platform-core +And a standard mock component +And a mock orchestrator that succeeds +And a mock registry containing "SuggestCustomerOutreach" +And a route map with a throwing transform for "SuggestCustomerOutreach" +When the bridge handler is created and invoked with standard args +Then the orchestrator was not called +And an AgentCommandRoutingFailed audit event was recorded +And the audit payload code is "INVALID_TRANSFORM" +And the audit payload error contains "Transform failed" +And the audit payload error contains "Missing required field: customerId" +And the decision status was updated to "failed" +``` diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-005-records-agent-command-routing-failed-audit-and-sets-status-to-failed-on-or.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-005-records-agent-command-routing-failed-audit-and-sets-status-to-failed-on-or.sdp.md index a4042155..d5ac04b9 100644 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-005-records-agent-command-routing-failed-audit-and-sets-status-to-failed-on-or.sdp.md +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-005-records-agent-command-routing-failed-audit-and-sets-status-to-failed-on-or.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: Executable scenario "Records AgentCommandRoutingFailed audit and sets status to failed on orchestrator error" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature +- outcome: Executable scenario: Records AgentCommandRoutingFailed audit and sets status to failed on orchestrator error + +```gwt +Given the module is imported from platform-core +And a standard mock component +And a mock orchestrator that throws "Orchestrator timeout" +And a mock registry containing "SuggestCustomerOutreach" +And a standard route map +When the bridge handler is created and invoked with standard args +Then the orchestrator was called once +And an AgentCommandRoutingFailed audit event was recorded for agent "test-agent" decision "dec_test_42" +And the audit payload error is "Orchestrator timeout" +And the decision status was updated to "failed" with error "Orchestrator timeout" +``` diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-006-does-not-throw-when-audit-recording-fails-on-success-path.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-006-does-not-throw-when-audit-recording-fails-on-success-path.sdp.md index b461e255..a92b4a26 100644 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-006-does-not-throw-when-audit-recording-fails-on-success-path.sdp.md +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-006-does-not-throw-when-audit-recording-fails-on-success-path.sdp.md @@ -10,4 +10,18 @@ relations: ## Intent -- outcome: Executable scenario "Does not throw when audit recording fails on success path" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature +- outcome: Executable scenario: Does not throw when audit recording fails on success path + +```gwt +Given the module is imported from platform-core +And a standard mock component +And a mock orchestrator that succeeds +And a mock registry containing "SuggestCustomerOutreach" +And a standard route map +And the audit mutation will throw "Audit store unavailable" +And a mock logger is provided +When the bridge handler is created and invoked with standard args +Then the handler resolves without throwing +And the orchestrator was called once +And the logger recorded an error "Failed to record AgentCommandRouted audit" with agentId "test-agent" and error "Audit store unavailable" +``` diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-007-does-not-throw-when-update-status-mutation-fails-on-success-path.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-007-does-not-throw-when-update-status-mutation-fails-on-success-path.sdp.md index 51761bd2..33fd033a 100644 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-007-does-not-throw-when-update-status-mutation-fails-on-success-path.sdp.md +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-007-does-not-throw-when-update-status-mutation-fails-on-success-path.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: Executable scenario "Does not throw when updateStatus mutation fails on success path" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature +- outcome: Executable scenario: Does not throw when updateStatus mutation fails on success path + +```gwt +Given the module is imported from platform-core +And a standard mock component +And a mock orchestrator that succeeds +And a mock registry containing "SuggestCustomerOutreach" +And a standard route map +And the updateStatus mutation will throw "Status update failed" +When the bridge handler is created and invoked with standard args +Then the handler resolves without throwing +And the orchestrator was called once +And the audit mutation was still called +``` diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-008-skips-status-update-without-error-when-update-status-is-undefined-on-succe.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-008-skips-status-update-without-error-when-update-status-is-undefined-on-succe.sdp.md index dca75b05..ed2506ae 100644 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-008-skips-status-update-without-error-when-update-status-is-undefined-on-succe.sdp.md +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-008-skips-status-update-without-error-when-update-status-is-undefined-on-succe.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: Executable scenario "Skips status update without error when updateStatus is undefined on success path" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature +- outcome: Executable scenario: Skips status update without error when updateStatus is undefined on success path + +```gwt +Given the module is imported from platform-core +And a mock component without updateStatus +And a mock orchestrator that succeeds +And a mock registry containing "SuggestCustomerOutreach" +And a standard route map +When the bridge handler is created and invoked with standard args +Then the handler resolves without throwing +And the orchestrator was called once +And the audit mutation was still called +And exactly 1 mutation call was made +``` diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-009-skips-status-update-on-routing-failure-when-update-status-is-undefined.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-009-skips-status-update-on-routing-failure-when-update-status-is-undefined.sdp.md index f683a041..015dcd8c 100644 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-009-skips-status-update-on-routing-failure-when-update-status-is-undefined.sdp.md +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-009-skips-status-update-on-routing-failure-when-update-status-is-undefined.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "Skips status update on routing failure when updateStatus is undefined" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature +- outcome: Executable scenario: Skips status update on routing failure when updateStatus is undefined + +```gwt +Given the module is imported from platform-core +And a mock component without updateStatus +And a mock orchestrator that succeeds +And a mock registry containing "SuggestCustomerOutreach" +And a standard route map +When the bridge handler is invoked with commandType "NonExistent" +Then the handler resolves without throwing +And exactly 1 mutation call was made +And the only mutation call was the audit record +``` diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-010-includes-pattern-id-in-audit-event-payload-when-present-in-args.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-010-includes-pattern-id-in-audit-event-payload-when-present-in-args.sdp.md index 28335535..7d8e378a 100644 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-010-includes-pattern-id-in-audit-event-payload-when-present-in-args.sdp.md +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-010-includes-pattern-id-in-audit-event-payload-when-present-in-args.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Includes patternId in audit event payload when present in args" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature +- outcome: Executable scenario: Includes patternId in audit event payload when present in args + +```gwt +Given the module is imported from platform-core +And a standard mock component +And a mock orchestrator that succeeds +And a mock registry containing "SuggestCustomerOutreach" +And a standard route map +When the bridge handler is invoked with patternId "churn-risk-v2" +Then an AgentCommandRouted audit event was recorded with patternId "churn-risk-v2" +``` diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-011-does-not-include-pattern-id-in-audit-payload-when-absent-from-args.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-011-does-not-include-pattern-id-in-audit-payload-when-absent-from-args.sdp.md index ca629bf5..4b117618 100644 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-011-does-not-include-pattern-id-in-audit-payload-when-absent-from-args.sdp.md +++ b/specs/behavior/platform-core/agent/command-bridge.examples/s-011-does-not-include-pattern-id-in-audit-payload-when-absent-from-args.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Does not include patternId in audit payload when absent from args" from packages/platform-core/tests/features/behavior/agent/command-bridge.feature +- outcome: Executable scenario: Does not include patternId in audit payload when absent from args + +```gwt +Given the module is imported from platform-core +And a standard mock component +And a mock orchestrator that succeeds +And a mock registry containing "SuggestCustomerOutreach" +And a standard route map +When the bridge handler is created and invoked with standard args +Then an AgentCommandRouted audit event was recorded without patternId +``` diff --git a/specs/behavior/platform-core/agent/command-bridge.sdp.md b/specs/behavior/platform-core/agent/command-bridge.sdp.md index d2ebbc5d..11cce1dc 100644 --- a/specs/behavior/platform-core/agent/command-bridge.sdp.md +++ b/specs/behavior/platform-core/agent/command-bridge.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: createCommandBridgeHandler() wires agent decisions to domain command execution: it looks up the route, validates registry membership, transforms args, calls the orchestrator, records audit events, and updates decision status. Failures at each stage produce structured (test carrier: packages/platform-core/tests/features/behavior/agent/command-bridge.feature) +- outcome: Agent Command Bridge Handler + +## Behavior + +- rule: Happy path routes command through the full pipeline +- rule: Unknown route records routing failure +- rule: Command not in registry records routing failure +- rule: Transform failure records routing failure +- rule: Orchestrator failure records routing failure with error details +- rule: Audit failure does not propagate to caller +- rule: Status update failure does not propagate to caller +- rule: Optional updateStatus is gracefully skipped +- rule: patternId propagation in audit events diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-001-emit-recommendation-command.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-001-emit-recommendation-command.sdp.md index 764af019..bf2193b3 100644 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-001-emit-recommendation-command.sdp.md +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-001-emit-recommendation-command.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Emit recommendation command" from packages/platform-core/tests/features/behavior/agent/command-emission.feature +- outcome: Executable scenario: Emit recommendation command + +```gwt +Given the agent module is imported from platform-core +And the command emission utilities are available +And a detected ChurnRisk pattern +When agent emits SuggestCustomerOutreach command +Then command is delivered to Command Bus +And command has standard metadata +``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-002-command-includes-correlation-id.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-002-command-includes-correlation-id.sdp.md index 893d7d3f..5db85379 100644 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-002-command-includes-correlation-id.sdp.md +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-002-command-includes-correlation-id.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Command includes correlation ID" from packages/platform-core/tests/features/behavior/agent/command-emission.feature +- outcome: Executable scenario: Command includes correlation ID + +```gwt +Given the agent module is imported from platform-core +And the command emission utilities are available +And pattern detected from correlated events +When agent emits command +Then command.correlationId traces back to triggering events +``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-003-command-includes-agent-bc-identifier.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-003-command-includes-agent-bc-identifier.sdp.md index 517a6fa6..fb658062 100644 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-003-command-includes-agent-bc-identifier.sdp.md +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-003-command-includes-agent-bc-identifier.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Command includes agent BC identifier" from packages/platform-core/tests/features/behavior/agent/command-emission.feature +- outcome: Executable scenario: Command includes agent BC identifier + +```gwt +Given the agent module is imported from platform-core +And the command emission utilities are available +And agent BC "churn-detector" +When agent emits command +Then command.source equals "agent:churn-detector" +``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-004-command-includes-reason.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-004-command-includes-reason.sdp.md index 47d0a808..227a3c65 100644 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-004-command-includes-reason.sdp.md +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-004-command-includes-reason.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Command includes reason" from packages/platform-core/tests/features/behavior/agent/command-emission.feature +- outcome: Executable scenario: Command includes reason + +```gwt +Given the agent module is imported from platform-core +And the command emission utilities are available +And agent decision with reasoning +When agent emits command +Then command.metadata.reason describes why action was taken +``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-005-command-includes-confidence.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-005-command-includes-confidence.sdp.md index 77f7d04f..f5d8bda9 100644 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-005-command-includes-confidence.sdp.md +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-005-command-includes-confidence.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Command includes confidence" from packages/platform-core/tests/features/behavior/agent/command-emission.feature +- outcome: Executable scenario: Command includes confidence + +```gwt +Given the agent module is imported from platform-core +And the command emission utilities are available +And pattern detected with 85% confidence +When agent emits command +Then command.metadata.confidence equals 0.85 +``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-006-command-includes-triggering-events.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-006-command-includes-triggering-events.sdp.md index 1293ec12..a89aa541 100644 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-006-command-includes-triggering-events.sdp.md +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-006-command-includes-triggering-events.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Command includes triggering events" from packages/platform-core/tests/features/behavior/agent/command-emission.feature +- outcome: Executable scenario: Command includes triggering events + +```gwt +Given the agent module is imported from platform-core +And the command emission utilities are available +And pattern triggered by events E1, E2, E3 +When agent emits command +Then command.metadata.eventIds equals ["E1", "E2", "E3"] +``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-007-command-includes-llm-context.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-007-command-includes-llm-context.sdp.md index 301175e7..3cfd9ab9 100644 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-007-command-includes-llm-context.sdp.md +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-007-command-includes-llm-context.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Command includes LLM context" from packages/platform-core/tests/features/behavior/agent/command-emission.feature +- outcome: Executable scenario: Command includes LLM context + +```gwt +Given the agent module is imported from platform-core +And the command emission utilities are available +And LLM was used for pattern analysis +When agent emits command +Then command.metadata.llmContext includes model, tokens, duration +``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-008-reject-command-without-reason.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-008-reject-command-without-reason.sdp.md index 641f4fbe..82bfb65b 100644 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-008-reject-command-without-reason.sdp.md +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-008-reject-command-without-reason.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject command without reason" from packages/platform-core/tests/features/behavior/agent/command-emission.feature +- outcome: Executable scenario: Reject command without reason + +```gwt +Given the agent module is imported from platform-core +And the command emission utilities are available +And agent attempting to emit command +When reason is not provided +Then an error is thrown with code "REASON_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-009-reject-command-without-confidence.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-009-reject-command-without-confidence.sdp.md index 6ce0ddf5..13a7b13d 100644 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-009-reject-command-without-confidence.sdp.md +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-009-reject-command-without-confidence.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reject command without confidence" from packages/platform-core/tests/features/behavior/agent/command-emission.feature +- outcome: Executable scenario: Reject command without confidence + +```gwt +Given the agent module is imported from platform-core +And the command emission utilities are available +And agent attempting to emit command +When confidence is not provided +Then an error is thrown with code "CONFIDENCE_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-010-reject-confidence-outside-valid-range.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-010-reject-confidence-outside-valid-range.sdp.md index 90d87511..7c244cc5 100644 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-010-reject-confidence-outside-valid-range.sdp.md +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-010-reject-confidence-outside-valid-range.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Reject confidence outside valid range" from packages/platform-core/tests/features/behavior/agent/command-emission.feature +- outcome: Executable scenario: Reject confidence outside valid range + +```gwt +Given the agent module is imported from platform-core +And the command emission utilities are available +And agent attempting to emit command with confidence 1.5 +When emitCommand is called +Then an error is thrown with code "INVALID_CONFIDENCE" +And error message mentions "must be between 0 and 1" +``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-011-llm-rate-limit-is-handled-with-exponential-backoff.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-011-llm-rate-limit-is-handled-with-exponential-backoff.sdp.md index 4594e912..c33a6563 100644 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-011-llm-rate-limit-is-handled-with-exponential-backoff.sdp.md +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-011-llm-rate-limit-is-handled-with-exponential-backoff.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "LLM rate limit is handled with exponential backoff" from packages/platform-core/tests/features/behavior/agent/command-emission.feature +- outcome: Executable scenario: LLM rate limit is handled with exponential backoff + +```gwt +Given the agent module is imported from platform-core +And the command emission utilities are available +And an agent attempting LLM analysis +And LLM API returns 429 rate limit error +When agent retries the analysis +Then retry uses exponential backoff +And event processing queue is not blocked +And retry attempts are logged for observability +``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-012-llm-timeout-falls-back-to-rule-based-emission.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-012-llm-timeout-falls-back-to-rule-based-emission.sdp.md index bdb31640..d9096cc5 100644 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-012-llm-timeout-falls-back-to-rule-based-emission.sdp.md +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-012-llm-timeout-falls-back-to-rule-based-emission.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "LLM timeout falls back to rule-based emission" from packages/platform-core/tests/features/behavior/agent/command-emission.feature +- outcome: Executable scenario: LLM timeout falls back to rule-based emission + +```gwt +Given the agent module is imported from platform-core +And the command emission utilities are available +And an agent with LLM analysis configured +And LLM request times out after 30 seconds +When command emission is attempted +Then fallback to rule-based decision is used +And command includes fallback indicator in metadata +``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-013-emit-notification-command.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-013-emit-notification-command.sdp.md index 9221b595..029618e8 100644 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-013-emit-notification-command.sdp.md +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-013-emit-notification-command.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Emit notification command" from packages/platform-core/tests/features/behavior/agent/command-emission.feature +- outcome: Executable scenario: Emit notification command + +```gwt +Given the agent module is imported from platform-core +And the command emission utilities are available +And low-risk pattern detected +When agent emits NotifyTeam command +Then command is processed as notification +``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-014-emit-action-command.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-014-emit-action-command.sdp.md index 021ac8d7..2e1ef793 100644 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-014-emit-action-command.sdp.md +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-014-emit-action-command.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Emit action command" from packages/platform-core/tests/features/behavior/agent/command-emission.feature +- outcome: Executable scenario: Emit action command + +```gwt +Given the agent module is imported from platform-core +And the command emission utilities are available +And high-confidence pattern detected +When agent emits AutomatedResponse command +Then command triggers actual business action +``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-015-emit-escalation-command.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-015-emit-escalation-command.sdp.md index e739592c..e12b2867 100644 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-015-emit-escalation-command.sdp.md +++ b/specs/behavior/platform-core/agent/command-emission.examples/s-015-emit-escalation-command.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Emit escalation command" from packages/platform-core/tests/features/behavior/agent/command-emission.feature +- outcome: Executable scenario: Emit escalation command + +```gwt +Given the agent module is imported from platform-core +And the command emission utilities are available +And critical pattern detected +When agent emits EscalateToHuman command +Then command creates review task for human +``` diff --git a/specs/behavior/platform-core/agent/command-emission.sdp.md b/specs/behavior/platform-core/agent/command-emission.sdp.md index bd8da61f..603e242b 100644 --- a/specs/behavior/platform-core/agent/command-emission.sdp.md +++ b/specs/behavior/platform-core/agent/command-emission.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: agents to emit commands with explainability so that agent actions are traceable and auditable (test carrier: packages/platform-core/tests/features/behavior/agent/command-emission.feature) +- actor: a platform developer +- outcome: agents to emit commands with explainability so that agent actions are traceable and auditable + +## Behavior + +- rule: Agents emit commands to Command Bus +- rule: Commands include explainability metadata +- rule: Commands must meet minimum metadata requirements +- rule: Command emission handles LLM failures gracefully +- rule: Different command types for different actions diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-001-returns-the-route-when-command-type-exists-in-the-map.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-001-returns-the-route-when-command-type-exists-in-the-map.sdp.md index d94b58e4..6a315ee5 100644 --- a/specs/behavior/platform-core/agent/command-router.examples/s-001-returns-the-route-when-command-type-exists-in-the-map.sdp.md +++ b/specs/behavior/platform-core/agent/command-router.examples/s-001-returns-the-route-when-command-type-exists-in-the-map.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns the route when commandType exists in the map" from packages/platform-core/tests/features/behavior/agent/command-router.feature +- outcome: Executable scenario: Returns the route when commandType exists in the map + +```gwt +Given a valid route map with "CancelOrder" and "SuggestCustomerOutreach" routes +When I get the route for "CancelOrder" +Then the route is defined +And the route has the following properties: +And the route toOrchestratorArgs is a function +``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-002-returns-undefined-when-command-type-does-not-exist-in-the-map.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-002-returns-undefined-when-command-type-does-not-exist-in-the-map.sdp.md index 1221d7ec..d279ac9c 100644 --- a/specs/behavior/platform-core/agent/command-router.examples/s-002-returns-undefined-when-command-type-does-not-exist-in-the-map.sdp.md +++ b/specs/behavior/platform-core/agent/command-router.examples/s-002-returns-undefined-when-command-type-does-not-exist-in-the-map.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns undefined when commandType does not exist in the map" from packages/platform-core/tests/features/behavior/agent/command-router.feature +- outcome: Executable scenario: Returns undefined when commandType does not exist in the map + +```gwt +Given a valid route map with "CancelOrder" and "SuggestCustomerOutreach" routes +When I get the route for "NonExistentCommand" +Then the route is undefined +``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-003-returns-undefined-for-empty-route-map.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-003-returns-undefined-for-empty-route-map.sdp.md index b683c587..4a21f05e 100644 --- a/specs/behavior/platform-core/agent/command-router.examples/s-003-returns-undefined-for-empty-route-map.sdp.md +++ b/specs/behavior/platform-core/agent/command-router.examples/s-003-returns-undefined-for-empty-route-map.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns undefined for empty route map" from packages/platform-core/tests/features/behavior/agent/command-router.feature +- outcome: Executable scenario: Returns undefined for empty route map + +```gwt +Given an empty route map +When I get the route for "AnyCommand" +Then the route is undefined +``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-004-produces-success-results-for-valid-routes.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-004-produces-success-results-for-valid-routes.sdp.md index e6a99138..5e1a32c3 100644 --- a/specs/behavior/platform-core/agent/command-router.examples/s-004-produces-success-results-for-valid-routes.sdp.md +++ b/specs/behavior/platform-core/agent/command-router.examples/s-004-produces-success-results-for-valid-routes.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Produces success results for valid routes" from packages/platform-core/tests/features/behavior/agent/command-router.feature +- outcome: Executable scenario: Produces success results for valid routes + +```gwt +Given a valid route map with "CancelOrder" and "SuggestCustomerOutreach" routes +When I validate the routes +Then the validation results count is 2 +And all results are successful +And the successful command types include: +``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-005-returns-command-not-registered-error-for-missing-command-type.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-005-returns-command-not-registered-error-for-missing-command-type.sdp.md index 4fdad9c6..3dc1d5ae 100644 --- a/specs/behavior/platform-core/agent/command-router.examples/s-005-returns-command-not-registered-error-for-missing-command-type.sdp.md +++ b/specs/behavior/platform-core/agent/command-router.examples/s-005-returns-command-not-registered-error-for-missing-command-type.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Returns COMMAND_NOT_REGISTERED error for missing commandType" from packages/platform-core/tests/features/behavior/agent/command-router.feature +- outcome: Executable scenario: Returns COMMAND_NOT_REGISTERED error for missing commandType + +```gwt +Given a route map with a "BadRoute" entry that has empty commandType +When I validate the routes +Then the validation results count is 1 +And the first result is a failure with code "COMMAND_NOT_REGISTERED" +And the failure message contains "BadRoute" +And the failure message contains "missing commandType" +``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-006-returns-unknown-route-error-for-missing-bounded-context.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-006-returns-unknown-route-error-for-missing-bounded-context.sdp.md index f1d153ee..757cc908 100644 --- a/specs/behavior/platform-core/agent/command-router.examples/s-006-returns-unknown-route-error-for-missing-bounded-context.sdp.md +++ b/specs/behavior/platform-core/agent/command-router.examples/s-006-returns-unknown-route-error-for-missing-bounded-context.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Returns UNKNOWN_ROUTE error for missing boundedContext" from packages/platform-core/tests/features/behavior/agent/command-router.feature +- outcome: Executable scenario: Returns UNKNOWN_ROUTE error for missing boundedContext + +```gwt +Given a route map with a "NoBCRoute" entry that has empty boundedContext +When I validate the routes +Then the validation results count is 1 +And the first result is a failure with code "UNKNOWN_ROUTE" +And the failure message contains "NoBCRoute" +And the failure message contains "missing boundedContext" +``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-007-returns-invalid-transform-error-for-missing-to-orchestrator-args.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-007-returns-invalid-transform-error-for-missing-to-orchestrator-args.sdp.md index d97343dc..9f71297f 100644 --- a/specs/behavior/platform-core/agent/command-router.examples/s-007-returns-invalid-transform-error-for-missing-to-orchestrator-args.sdp.md +++ b/specs/behavior/platform-core/agent/command-router.examples/s-007-returns-invalid-transform-error-for-missing-to-orchestrator-args.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Returns INVALID_TRANSFORM error for missing toOrchestratorArgs" from packages/platform-core/tests/features/behavior/agent/command-router.feature +- outcome: Executable scenario: Returns INVALID_TRANSFORM error for missing toOrchestratorArgs + +```gwt +Given a route map with a "NoTransformRoute" entry that has undefined toOrchestratorArgs +When I validate the routes +Then the validation results count is 1 +And the first result is a failure with code "INVALID_TRANSFORM" +And the failure message contains "NoTransformRoute" +And the failure message contains "missing toOrchestratorArgs" +``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-008-returns-empty-array-for-empty-route-map.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-008-returns-empty-array-for-empty-route-map.sdp.md index 5ce8b77b..15ab28d4 100644 --- a/specs/behavior/platform-core/agent/command-router.examples/s-008-returns-empty-array-for-empty-route-map.sdp.md +++ b/specs/behavior/platform-core/agent/command-router.examples/s-008-returns-empty-array-for-empty-route-map.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns empty array for empty route map" from packages/platform-core/tests/features/behavior/agent/command-router.feature +- outcome: Executable scenario: Returns empty array for empty route map + +```gwt +Given an empty route map +When I validate the routes +Then the validation results are empty +``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-009-validates-mixed-valid-and-invalid-routes-independently.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-009-validates-mixed-valid-and-invalid-routes-independently.sdp.md index 0eb49048..868c38fc 100644 --- a/specs/behavior/platform-core/agent/command-router.examples/s-009-validates-mixed-valid-and-invalid-routes-independently.sdp.md +++ b/specs/behavior/platform-core/agent/command-router.examples/s-009-validates-mixed-valid-and-invalid-routes-independently.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Validates mixed valid and invalid routes independently" from packages/platform-core/tests/features/behavior/agent/command-router.feature +- outcome: Executable scenario: Validates mixed valid and invalid routes independently + +```gwt +Given a route map with a valid "ValidRoute" and an invalid "InvalidRoute" with empty commandType +When I validate the routes +Then the validation results count is 2 +And the success count is 1 +And the failure count is 1 +``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-010-contains-all-expected-error-codes.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-010-contains-all-expected-error-codes.sdp.md index 5c899b4a..a609febc 100644 --- a/specs/behavior/platform-core/agent/command-router.examples/s-010-contains-all-expected-error-codes.sdp.md +++ b/specs/behavior/platform-core/agent/command-router.examples/s-010-contains-all-expected-error-codes.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Contains all expected error codes" from packages/platform-core/tests/features/behavior/agent/command-router.feature +- outcome: Executable scenario: Contains all expected error codes + +```gwt +Given the feature fixture is in place +When the scenario runs +Then COMMAND_ROUTING_ERROR_CODES contains the following codes: +``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-011-has-exactly-4-error-codes.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-011-has-exactly-4-error-codes.sdp.md index 882b7c6f..e734ba55 100644 --- a/specs/behavior/platform-core/agent/command-router.examples/s-011-has-exactly-4-error-codes.sdp.md +++ b/specs/behavior/platform-core/agent/command-router.examples/s-011-has-exactly-4-error-codes.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Has exactly 4 error codes" from packages/platform-core/tests/features/behavior/agent/command-router.feature +- outcome: Executable scenario: Has exactly 4 error codes + +```gwt +Given the feature fixture is in place +When the scenario runs +Then COMMAND_ROUTING_ERROR_CODES has exactly 4 entries +``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-012-values-are-string-constants-matching-their-keys.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-012-values-are-string-constants-matching-their-keys.sdp.md index 92a4638f..9ce67665 100644 --- a/specs/behavior/platform-core/agent/command-router.examples/s-012-values-are-string-constants-matching-their-keys.sdp.md +++ b/specs/behavior/platform-core/agent/command-router.examples/s-012-values-are-string-constants-matching-their-keys.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Values are string constants matching their keys" from packages/platform-core/tests/features/behavior/agent/command-router.feature +- outcome: Executable scenario: Values are string constants matching their keys + +```gwt +Given the feature fixture is in place +When the scenario runs +Then every COMMAND_ROUTING_ERROR_CODES value is a non-empty string matching its key +``` diff --git a/specs/behavior/platform-core/agent/command-router.sdp.md b/specs/behavior/platform-core/agent/command-router.sdp.md index 272c7da2..2619f615 100644 --- a/specs/behavior/platform-core/agent/command-router.sdp.md +++ b/specs/behavior/platform-core/agent/command-router.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Pure functions for agent command routing: getRoute() looks up routes by commandType, validateRoutes() checks route map integrity, and COMMAND_ROUTING_ERROR_CODES enumerates all routing error codes. (test carrier: packages/platform-core/tests/features/behavior/agent/command-router.feature) +- outcome: Agent Command Router + +## Behavior + +- rule: getRoute returns matching route or undefined +- rule: validateRoutes produces success or error results per route +- rule: COMMAND_ROUTING_ERROR_CODES contains all expected codes diff --git a/specs/behavior/platform-core/agent/commands.examples/s-001-contains-all-expected-error-codes.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-001-contains-all-expected-error-codes.sdp.md index cc5e9f67..2afc94f7 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-001-contains-all-expected-error-codes.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-001-contains-all-expected-error-codes.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Contains all expected error codes" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Contains all expected error codes + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then COMMAND_EMISSION_ERROR_CODES contains the following codes: +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-002-has-exactly-5-error-codes.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-002-has-exactly-5-error-codes.sdp.md index ebd927f8..23e4cb86 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-002-has-exactly-5-error-codes.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-002-has-exactly-5-error-codes.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Has exactly 5 error codes" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Has exactly 5 error codes + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then COMMAND_EMISSION_ERROR_CODES has exactly 5 entries +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-003-accepts-valid-metadata.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-003-accepts-valid-metadata.sdp.md index eefade1b..28e5376c 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-003-accepts-valid-metadata.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-003-accepts-valid-metadata.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts valid metadata" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Accepts valid metadata + +```gwt +Given the module is imported from platform-core +When I parse valid metadata through the schema +Then the schema result is successful +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-004-accepts-metadata-with-optional-pattern-id.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-004-accepts-metadata-with-optional-pattern-id.sdp.md index 01b2f43d..c11955f7 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-004-accepts-metadata-with-optional-pattern-id.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-004-accepts-metadata-with-optional-pattern-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts metadata with optional patternId" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Accepts metadata with optional patternId + +```gwt +Given the module is imported from platform-core +When I parse metadata with patternId "pattern-1" through the schema +Then the schema result is successful +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-005-accepts-metadata-with-optional-analysis.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-005-accepts-metadata-with-optional-analysis.sdp.md index 9c1ed78a..0e740ed4 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-005-accepts-metadata-with-optional-analysis.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-005-accepts-metadata-with-optional-analysis.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts metadata with optional analysis" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Accepts metadata with optional analysis + +```gwt +Given the module is imported from platform-core +When I parse metadata with analysis through the schema +Then the schema result is successful +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-006-rejects-metadata-with-empty-agent-id.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-006-rejects-metadata-with-empty-agent-id.sdp.md index 9cb0e63a..d3459fc8 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-006-rejects-metadata-with-empty-agent-id.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-006-rejects-metadata-with-empty-agent-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects metadata with empty agentId" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Rejects metadata with empty agentId + +```gwt +Given the module is imported from platform-core +When I parse metadata with empty agentId through the schema +Then the schema result is a failure +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-007-rejects-metadata-with-empty-decision-id.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-007-rejects-metadata-with-empty-decision-id.sdp.md index b4d1bd3c..f1f8b2c2 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-007-rejects-metadata-with-empty-decision-id.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-007-rejects-metadata-with-empty-decision-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects metadata with empty decisionId" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Rejects metadata with empty decisionId + +```gwt +Given the module is imported from platform-core +When I parse metadata with empty decisionId through the schema +Then the schema result is a failure +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-008-rejects-metadata-with-confidence-below-0.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-008-rejects-metadata-with-confidence-below-0.sdp.md index 5fb00b1e..c9fe6cc5 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-008-rejects-metadata-with-confidence-below-0.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-008-rejects-metadata-with-confidence-below-0.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects metadata with confidence below 0" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Rejects metadata with confidence below 0 + +```gwt +Given the module is imported from platform-core +When I parse metadata with confidence -0.1 through the schema +Then the schema result is a failure +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-009-rejects-metadata-with-confidence-above-1.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-009-rejects-metadata-with-confidence-above-1.sdp.md index 4e103593..aae74d56 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-009-rejects-metadata-with-confidence-above-1.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-009-rejects-metadata-with-confidence-above-1.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects metadata with confidence above 1" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Rejects metadata with confidence above 1 + +```gwt +Given the module is imported from platform-core +When I parse metadata with confidence 1.5 through the schema +Then the schema result is a failure +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-010-rejects-metadata-with-empty-reason.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-010-rejects-metadata-with-empty-reason.sdp.md index c1896017..a494fdea 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-010-rejects-metadata-with-empty-reason.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-010-rejects-metadata-with-empty-reason.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects metadata with empty reason" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Rejects metadata with empty reason + +```gwt +Given the module is imported from platform-core +When I parse metadata with empty reason through the schema +Then the schema result is a failure +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-011-rejects-metadata-with-empty-event-ids-array.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-011-rejects-metadata-with-empty-event-ids-array.sdp.md index 8d124e87..76589823 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-011-rejects-metadata-with-empty-event-ids-array.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-011-rejects-metadata-with-empty-event-ids-array.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects metadata with empty eventIds array" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Rejects metadata with empty eventIds array + +```gwt +Given the module is imported from platform-core +When I parse metadata with empty eventIds through the schema +Then the schema result is a failure +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-012-accepts-confidence-at-boundaries-0-and-1.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-012-accepts-confidence-at-boundaries-0-and-1.sdp.md index 2e0a5cac..a6de3e72 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-012-accepts-confidence-at-boundaries-0-and-1.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-012-accepts-confidence-at-boundaries-0-and-1.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts confidence at boundaries 0 and 1" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Accepts confidence at boundaries 0 and 1 + +```gwt +Given the module is imported from platform-core +When I parse metadata with confidence 0 through the schema +Then the schema result is successful +And I parse metadata with confidence 1 and it is also successful +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-013-accepts-valid-command.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-013-accepts-valid-command.sdp.md index fff7a430..ba9689fe 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-013-accepts-valid-command.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-013-accepts-valid-command.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts valid command" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Accepts valid command + +```gwt +Given the module is imported from platform-core +When I parse a valid command through the command schema +Then the command schema result is successful +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-014-rejects-command-with-empty-type.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-014-rejects-command-with-empty-type.sdp.md index 385e9679..e23d264a 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-014-rejects-command-with-empty-type.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-014-rejects-command-with-empty-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects command with empty type" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Rejects command with empty type + +```gwt +Given the module is imported from platform-core +When I parse a command with empty type through the command schema +Then the command schema result is a failure +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-015-accepts-command-with-any-payload-type.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-015-accepts-command-with-any-payload-type.sdp.md index 571b9d96..d4eda70d 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-015-accepts-command-with-any-payload-type.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-015-accepts-command-with-any-payload-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts command with any payload type" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Accepts command with any payload type + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then the command schema accepts all payload types: +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-016-rejects-command-with-invalid-metadata.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-016-rejects-command-with-invalid-metadata.sdp.md index 6fead5a8..736cad77 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-016-rejects-command-with-invalid-metadata.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-016-rejects-command-with-invalid-metadata.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects command with invalid metadata" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Rejects command with invalid metadata + +```gwt +Given the module is imported from platform-core +When I parse a command with invalid metadata through the command schema +Then the command schema result is a failure +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-017-returns-invalid-when-type-is-undefined.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-017-returns-invalid-when-type-is-undefined.sdp.md index bce16500..f4a6d1bb 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-017-returns-invalid-when-type-is-undefined.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-017-returns-invalid-when-type-is-undefined.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when type is undefined" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns invalid when type is undefined + +```gwt +Given the module is imported from platform-core +When I validate a command without type +Then validation result is invalid with code "INVALID_COMMAND_TYPE" +And validation message contains "non-empty string" +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-018-returns-invalid-when-type-is-empty-string.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-018-returns-invalid-when-type-is-empty-string.sdp.md index 176798ae..1608bdcd 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-018-returns-invalid-when-type-is-empty-string.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-018-returns-invalid-when-type-is-empty-string.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when type is empty string" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns invalid when type is empty string + +```gwt +Given the module is imported from platform-core +When I validate a command with empty type +Then validation result is invalid with code "INVALID_COMMAND_TYPE" +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-019-returns-invalid-when-type-is-whitespace-only.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-019-returns-invalid-when-type-is-whitespace-only.sdp.md index 61a55ba0..369fe053 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-019-returns-invalid-when-type-is-whitespace-only.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-019-returns-invalid-when-type-is-whitespace-only.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when type is whitespace only" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns invalid when type is whitespace only + +```gwt +Given the module is imported from platform-core +When I validate a command with whitespace-only type +Then validation result is invalid with code "INVALID_COMMAND_TYPE" +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-020-returns-invalid-when-confidence-is-undefined.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-020-returns-invalid-when-confidence-is-undefined.sdp.md index 40764764..6b078193 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-020-returns-invalid-when-confidence-is-undefined.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-020-returns-invalid-when-confidence-is-undefined.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when confidence is undefined" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns invalid when confidence is undefined + +```gwt +Given the module is imported from platform-core +When I validate a command without confidence +Then validation result is invalid with code "CONFIDENCE_REQUIRED" +And validation message contains "Confidence score is required" +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-021-returns-invalid-when-confidence-is-below-0.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-021-returns-invalid-when-confidence-is-below-0.sdp.md index 0d8603c2..a9fb72ad 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-021-returns-invalid-when-confidence-is-below-0.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-021-returns-invalid-when-confidence-is-below-0.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when confidence is below 0" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns invalid when confidence is below 0 + +```gwt +Given the module is imported from platform-core +When I validate a command with confidence -0.1 +Then validation result is invalid with code "INVALID_CONFIDENCE" +And validation message contains "between 0 and 1" +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-022-returns-invalid-when-confidence-is-above-1.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-022-returns-invalid-when-confidence-is-above-1.sdp.md index ceb4c674..13103009 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-022-returns-invalid-when-confidence-is-above-1.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-022-returns-invalid-when-confidence-is-above-1.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when confidence is above 1" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns invalid when confidence is above 1 + +```gwt +Given the module is imported from platform-core +When I validate a command with confidence 1.5 +Then validation result is invalid with code "INVALID_CONFIDENCE" +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-023-accepts-confidence-at-boundary-values.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-023-accepts-confidence-at-boundary-values.sdp.md index 7514e82c..c8dad97f 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-023-accepts-confidence-at-boundary-values.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-023-accepts-confidence-at-boundary-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts confidence at boundary values" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Accepts confidence at boundary values + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then validation accepts confidence at boundaries: +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-024-returns-invalid-when-reason-is-undefined.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-024-returns-invalid-when-reason-is-undefined.sdp.md index afa7322d..dc77ff95 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-024-returns-invalid-when-reason-is-undefined.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-024-returns-invalid-when-reason-is-undefined.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when reason is undefined" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns invalid when reason is undefined + +```gwt +Given the module is imported from platform-core +When I validate a command without reason +Then validation result is invalid with code "REASON_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-025-returns-invalid-when-reason-is-empty-string.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-025-returns-invalid-when-reason-is-empty-string.sdp.md index ae498ed1..472b2103 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-025-returns-invalid-when-reason-is-empty-string.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-025-returns-invalid-when-reason-is-empty-string.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when reason is empty string" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns invalid when reason is empty string + +```gwt +Given the module is imported from platform-core +When I validate a command with empty reason +Then validation result is invalid with code "REASON_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-026-returns-invalid-when-reason-is-whitespace-only.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-026-returns-invalid-when-reason-is-whitespace-only.sdp.md index 23e050a4..9643e166 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-026-returns-invalid-when-reason-is-whitespace-only.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-026-returns-invalid-when-reason-is-whitespace-only.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when reason is whitespace only" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns invalid when reason is whitespace only + +```gwt +Given the module is imported from platform-core +When I validate a command with whitespace-only reason +Then validation result is invalid with code "REASON_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-027-returns-invalid-when-event-ids-is-undefined.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-027-returns-invalid-when-event-ids-is-undefined.sdp.md index e7596ad0..6ec88413 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-027-returns-invalid-when-event-ids-is-undefined.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-027-returns-invalid-when-event-ids-is-undefined.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when eventIds is undefined" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns invalid when eventIds is undefined + +```gwt +Given the module is imported from platform-core +When I validate a command without eventIds +Then validation result is invalid with code "EVENTS_REQUIRED" +And validation message contains "At least one triggering event" +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-028-returns-invalid-when-event-ids-is-empty-array.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-028-returns-invalid-when-event-ids-is-empty-array.sdp.md index 1ef1578a..8ba18f77 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-028-returns-invalid-when-event-ids-is-empty-array.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-028-returns-invalid-when-event-ids-is-empty-array.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when eventIds is empty array" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns invalid when eventIds is empty array + +```gwt +Given the module is imported from platform-core +When I validate a command with empty eventIds +Then validation result is invalid with code "EVENTS_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-029-accepts-single-event-id.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-029-accepts-single-event-id.sdp.md index 9a3cd82a..e3764e47 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-029-accepts-single-event-id.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-029-accepts-single-event-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts single event ID" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Accepts single event ID + +```gwt +Given the module is imported from platform-core +When I validate a command with a single event ID +Then the validation result is valid +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-030-accepts-multiple-event-i-ds.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-030-accepts-multiple-event-i-ds.sdp.md index f4878527..ed2afb71 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-030-accepts-multiple-event-i-ds.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-030-accepts-multiple-event-i-ds.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts multiple event IDs" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Accepts multiple event IDs + +```gwt +Given the module is imported from platform-core +When I validate a command with multiple event IDs +Then the validation result is valid +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-031-returns-valid-for-complete-command-args.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-031-returns-valid-for-complete-command-args.sdp.md index 28e15723..a66fa659 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-031-returns-valid-for-complete-command-args.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-031-returns-valid-for-complete-command-args.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns valid for complete command args" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns valid for complete command args + +```gwt +Given the module is imported from platform-core +When I validate a complete command +Then the validation result is valid +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-032-creates-command-with-all-required-fields.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-032-creates-command-with-all-required-fields.sdp.md index c393748b..d6f1c9be 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-032-creates-command-with-all-required-fields.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-032-creates-command-with-all-required-fields.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Creates command with all required fields" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Creates command with all required fields + +```gwt +Given the module is imported from platform-core +When I create an emitted agent command with standard args +Then the created command has all expected fields +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-033-generates-unique-decision-id.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-033-generates-unique-decision-id.sdp.md index fe76811e..703d9266 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-033-generates-unique-decision-id.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-033-generates-unique-decision-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Generates unique decisionId" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Generates unique decisionId + +```gwt +Given the module is imported from platform-core +When I create an emitted agent command with standard args +Then the decisionId matches the pattern "dec_UUIDv7" +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-034-includes-pattern-id-when-provided-in-options.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-034-includes-pattern-id-when-provided-in-options.sdp.md index c8279b03..58ab09f5 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-034-includes-pattern-id-when-provided-in-options.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-034-includes-pattern-id-when-provided-in-options.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Includes patternId when provided in options" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Includes patternId when provided in options + +```gwt +Given the module is imported from platform-core +When I create an emitted agent command with patternId "churn-risk" +Then the created command metadata patternId is "churn-risk" +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-035-does-not-include-pattern-id-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-035-does-not-include-pattern-id-when-not-provided.sdp.md index cdde86cd..13b49a66 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-035-does-not-include-pattern-id-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-035-does-not-include-pattern-id-when-not-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Does not include patternId when not provided" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Does not include patternId when not provided + +```gwt +Given the module is imported from platform-core +When I create an emitted agent command without options +Then the created command metadata patternId is undefined +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-036-includes-analysis-when-provided-in-options.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-036-includes-analysis-when-provided-in-options.sdp.md index 45b9266e..44e6ec1f 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-036-includes-analysis-when-provided-in-options.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-036-includes-analysis-when-provided-in-options.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Includes analysis when provided in options" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Includes analysis when provided in options + +```gwt +Given the module is imported from platform-core +When I create an emitted agent command with analysis data +Then the created command metadata analysis matches the provided data +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-037-does-not-include-analysis-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-037-does-not-include-analysis-when-not-provided.sdp.md index af00b6d4..8602140b 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-037-does-not-include-analysis-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-037-does-not-include-analysis-when-not-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Does not include analysis when not provided" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Does not include analysis when not provided + +```gwt +Given the module is imported from platform-core +When I create an emitted agent command without options +Then the created command metadata analysis is undefined +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-038-includes-both-pattern-id-and-analysis-when-provided.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-038-includes-both-pattern-id-and-analysis-when-provided.sdp.md index aad27ade..1d4570a7 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-038-includes-both-pattern-id-and-analysis-when-provided.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-038-includes-both-pattern-id-and-analysis-when-provided.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Includes both patternId and analysis when provided" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Includes both patternId and analysis when provided + +```gwt +Given the module is imported from platform-core +When I create an emitted agent command with patternId "pattern-1" and analysis +Then the created command metadata patternId is "pattern-1" +And the created command metadata analysis matches the combined data +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-039-copies-event-ids-array-without-reference-sharing.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-039-copies-event-ids-array-without-reference-sharing.sdp.md index bbe93359..58265ce6 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-039-copies-event-ids-array-without-reference-sharing.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-039-copies-event-ids-array-without-reference-sharing.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Copies eventIds array without reference sharing" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Copies eventIds array without reference sharing + +```gwt +Given the module is imported from platform-core +When I create an emitted agent command and mutate the original eventIds +Then the created command eventIds are unchanged +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-040-throws-error-for-empty-type.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-040-throws-error-for-empty-type.sdp.md index 774ebf06..1ba5a5a1 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-040-throws-error-for-empty-type.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-040-throws-error-for-empty-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws error for empty type" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Throws error for empty type + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then creating a command with empty type throws "Command type must be a non-empty string" +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-041-throws-error-for-invalid-confidence.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-041-throws-error-for-invalid-confidence.sdp.md index db2a9735..daa6b876 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-041-throws-error-for-invalid-confidence.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-041-throws-error-for-invalid-confidence.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws error for invalid confidence" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Throws error for invalid confidence + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then creating a command with confidence 1.5 throws "Confidence must be between 0 and 1" +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-042-throws-error-for-empty-reason.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-042-throws-error-for-empty-reason.sdp.md index 822bb711..dd37cd07 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-042-throws-error-for-empty-reason.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-042-throws-error-for-empty-reason.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws error for empty reason" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Throws error for empty reason + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then creating a command with empty reason throws "Reason is required" +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-043-throws-error-for-empty-event-ids.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-043-throws-error-for-empty-event-ids.sdp.md index 0fba5578..40916fc7 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-043-throws-error-for-empty-event-ids.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-043-throws-error-for-empty-event-ids.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws error for empty eventIds" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Throws error for empty eventIds + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then creating a command with empty eventIds throws "At least one triggering event" +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-044-includes-error-code-in-thrown-message.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-044-includes-error-code-in-thrown-message.sdp.md index 7f8edb8c..208e37a8 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-044-includes-error-code-in-thrown-message.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-044-includes-error-code-in-thrown-message.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Includes error code in thrown message" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Includes error code in thrown message + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then creating a command with empty type throws error code "INVALID_COMMAND_TYPE" +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-045-creates-command-from-decision-with-command.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-045-creates-command-from-decision-with-command.sdp.md index dc535a93..0849505b 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-045-creates-command-from-decision-with-command.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-045-creates-command-from-decision-with-command.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Creates command from decision with command" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Creates command from decision with command + +```gwt +Given the module is imported from platform-core +When I create a command from a standard test decision +Then the decision-created command has all expected fields +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-046-returns-null-when-decision-has-no-command.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-046-returns-null-when-decision-has-no-command.sdp.md index 106ed500..49a57f2d 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-046-returns-null-when-decision-has-no-command.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-046-returns-null-when-decision-has-no-command.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns null when decision has no command" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns null when decision has no command + +```gwt +Given the module is imported from platform-core +When I create a command from a decision with null command +Then the result is null +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-047-includes-pattern-id-when-provided.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-047-includes-pattern-id-when-provided.sdp.md index fe785ff9..f8d01931 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-047-includes-pattern-id-when-provided.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-047-includes-pattern-id-when-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Includes patternId when provided" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Includes patternId when provided + +```gwt +Given the module is imported from platform-core +When I create a command from a decision with patternId "churn-risk" +Then the decision-created command metadata patternId is "churn-risk" +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-048-includes-analysis-when-provided.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-048-includes-analysis-when-provided.sdp.md index 481b4593..8251356c 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-048-includes-analysis-when-provided.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-048-includes-analysis-when-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Includes analysis when provided" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Includes analysis when provided + +```gwt +Given the module is imported from platform-core +When I create a command from a decision with analysis data +Then the decision-created command metadata analysis matches the provided analysis +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-049-maps-all-decision-fields-correctly.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-049-maps-all-decision-fields-correctly.sdp.md index c4d012ea..644e8973 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-049-maps-all-decision-fields-correctly.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-049-maps-all-decision-fields-correctly.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Maps all decision fields correctly" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Maps all decision fields correctly + +```gwt +Given the module is imported from platform-core +When I create a command from a decision with specific fields +Then the decision-created command maps all fields correctly +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-050-returns-true-for-valid-command.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-050-returns-true-for-valid-command.sdp.md index 3dff77cd..124d1135 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-050-returns-true-for-valid-command.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-050-returns-true-for-valid-command.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for valid command" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns true for valid command + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isEmittedAgentCommand returns true for a valid command +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-051-returns-true-for-command-with-optional-fields.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-051-returns-true-for-command-with-optional-fields.sdp.md index bd3dd1a2..2171544a 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-051-returns-true-for-command-with-optional-fields.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-051-returns-true-for-command-with-optional-fields.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for command with optional fields" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns true for command with optional fields + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isEmittedAgentCommand returns true for a command with optional fields +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-052-returns-false-for-non-command-values.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-052-returns-false-for-non-command-values.sdp.md index f783b668..3617209e 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-052-returns-false-for-non-command-values.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-052-returns-false-for-non-command-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for non-command values" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns false for non-command values + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isEmittedAgentCommand returns false for: +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-053-returns-true-when-command-has-pattern-id.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-053-returns-true-when-command-has-pattern-id.sdp.md index eaa5acf1..66e4a4fe 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-053-returns-true-when-command-has-pattern-id.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-053-returns-true-when-command-has-pattern-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when command has patternId" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns true when command has patternId + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then hasPatternId returns true for a command with patternId "churn-risk" +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-054-returns-false-when-command-has-no-pattern-id.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-054-returns-false-when-command-has-no-pattern-id.sdp.md index 4994fb3a..049a70d1 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-054-returns-false-when-command-has-no-pattern-id.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-054-returns-false-when-command-has-no-pattern-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when command has no patternId" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns false when command has no patternId + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then hasPatternId returns false for a command without patternId +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-055-returns-false-when-pattern-id-is-undefined-explicitly.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-055-returns-false-when-pattern-id-is-undefined-explicitly.sdp.md index 81293597..43d2cf6d 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-055-returns-false-when-pattern-id-is-undefined-explicitly.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-055-returns-false-when-pattern-id-is-undefined-explicitly.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when patternId is undefined explicitly" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns false when patternId is undefined explicitly + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then hasPatternId returns false for a command with explicit undefined patternId +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-056-returns-true-when-command-has-analysis.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-056-returns-true-when-command-has-analysis.sdp.md index 6eabd80a..ac2f4c59 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-056-returns-true-when-command-has-analysis.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-056-returns-true-when-command-has-analysis.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when command has analysis" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns true when command has analysis + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then hasAnalysisData returns true for a command with analysis +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-057-returns-false-when-command-has-no-analysis.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-057-returns-false-when-command-has-no-analysis.sdp.md index 6bce2871..170183fa 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-057-returns-false-when-command-has-no-analysis.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-057-returns-false-when-command-has-no-analysis.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when command has no analysis" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns false when command has no analysis + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then hasAnalysisData returns false for a command without analysis +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-058-returns-false-when-analysis-is-undefined-explicitly.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-058-returns-false-when-analysis-is-undefined-explicitly.sdp.md index 091cbe40..ebbe208d 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-058-returns-false-when-analysis-is-undefined-explicitly.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-058-returns-false-when-analysis-is-undefined-explicitly.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when analysis is undefined explicitly" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns false when analysis is undefined explicitly + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then hasAnalysisData returns false for a command with explicit undefined analysis +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-059-returns-true-for-null-analysis.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-059-returns-true-for-null-analysis.sdp.md index abc8100a..4c06d01d 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-059-returns-true-for-null-analysis.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-059-returns-true-for-null-analysis.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for null analysis" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Returns true for null analysis + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then hasAnalysisData returns true for a command with null analysis +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-060-validates-creates-and-verifies-command.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-060-validates-creates-and-verifies-command.sdp.md index 519b45b6..5add5765 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-060-validates-creates-and-verifies-command.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-060-validates-creates-and-verifies-command.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Validates, creates, and verifies command" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Validates, creates, and verifies command + +```gwt +Given the module is imported from platform-core +When I validate args, create a command, and verify with type guard and schema +Then all steps succeed +``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-061-creates-command-from-decision-and-verifies.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-061-creates-command-from-decision-and-verifies.sdp.md index 9b864357..a232660d 100644 --- a/specs/behavior/platform-core/agent/commands.examples/s-061-creates-command-from-decision-and-verifies.sdp.md +++ b/specs/behavior/platform-core/agent/commands.examples/s-061-creates-command-from-decision-and-verifies.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Creates command from decision and verifies" from packages/platform-core/tests/features/behavior/agent/commands.feature +- outcome: Executable scenario: Creates command from decision and verifies + +```gwt +Given the module is imported from platform-core +When I create a command from a decision with options and verify +Then the command passes type guard and has patternId and analysis +``` diff --git a/specs/behavior/platform-core/agent/commands.sdp.md b/specs/behavior/platform-core/agent/commands.sdp.md index f0dc2259..6d0d2887 100644 --- a/specs/behavior/platform-core/agent/commands.sdp.md +++ b/specs/behavior/platform-core/agent/commands.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: Pure functions for agent command emission: validation, factory functions, type guards, and decision-to-command conversion. (test carrier: packages/platform-core/tests/features/behavior/agent/commands.feature) +- outcome: Agent Commands Module + +## Behavior + +- rule: COMMAND_EMISSION_ERROR_CODES contains all expected codes +- rule: EmittedAgentCommandMetadataSchema validates metadata +- rule: EmittedAgentCommandSchema validates commands +- rule: validateAgentCommand validates command arguments +- rule: createEmittedAgentCommand factory creates commands +- rule: createCommandFromDecision converts decisions to commands +- rule: isEmittedAgentCommand type guard validates objects +- rule: hasPatternId type guard checks for patternId presence +- rule: hasAnalysisData type guard checks for analysis presence +- rule: End-to-end command creation flow validates and verifies diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-001-allowed-when-current-spend-plus-estimated-cost-is-under-budget.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-001-allowed-when-current-spend-plus-estimated-cost-is-under-budget.sdp.md index 473cd240..bb224398 100644 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-001-allowed-when-current-spend-plus-estimated-cost-is-under-budget.sdp.md +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-001-allowed-when-current-spend-plus-estimated-cost-is-under-budget.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Allowed when current spend plus estimated cost is under budget" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature +- outcome: Executable scenario: Allowed when current spend plus estimated cost is under budget + +```gwt +Given a cost tracker with currentSpend 5 and dailyBudget 10 and alertThreshold 0.8 +When I check the budget with estimatedCost 1 +Then the result allowed is true +And the remaining budget is 4 +``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-002-denied-when-estimated-cost-would-exceed-budget.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-002-denied-when-estimated-cost-would-exceed-budget.sdp.md index 484681c4..86de694b 100644 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-002-denied-when-estimated-cost-would-exceed-budget.sdp.md +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-002-denied-when-estimated-cost-would-exceed-budget.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Denied when estimated cost would exceed budget" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature +- outcome: Executable scenario: Denied when estimated cost would exceed budget + +```gwt +Given a cost tracker with currentSpend 9.5 and dailyBudget 10 and alertThreshold 0.8 +When I check the budget with estimatedCost 1 +Then the result allowed is false +And the denial has the following properties: +``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-003-denied-when-current-spend-already-equals-budget.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-003-denied-when-current-spend-already-equals-budget.sdp.md index ff56ffd7..f6ccaa0d 100644 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-003-denied-when-current-spend-already-equals-budget.sdp.md +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-003-denied-when-current-spend-already-equals-budget.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Denied when current spend already equals budget" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature +- outcome: Executable scenario: Denied when current spend already equals budget + +```gwt +Given a cost tracker with currentSpend 10 and dailyBudget 10 and alertThreshold 0.8 +When I check the budget with estimatedCost 0.01 +Then the result allowed is false +``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-004-allowed-when-estimated-cost-exactly-reaches-budget.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-004-allowed-when-estimated-cost-exactly-reaches-budget.sdp.md index 4e2b9fe5..7a54ef7e 100644 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-004-allowed-when-estimated-cost-exactly-reaches-budget.sdp.md +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-004-allowed-when-estimated-cost-exactly-reaches-budget.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Allowed when estimated cost exactly reaches budget" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature +- outcome: Executable scenario: Allowed when estimated cost exactly reaches budget + +```gwt +Given a cost tracker with currentSpend 5 and dailyBudget 10 and alertThreshold 0.8 +When I check the budget with estimatedCost 5 +Then the result allowed is true +And the remaining budget is 0 +``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-005-sets-at-alert-threshold-when-spend-exceeds-alert-threshold.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-005-sets-at-alert-threshold-when-spend-exceeds-alert-threshold.sdp.md index 90537914..5c7e6aca 100644 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-005-sets-at-alert-threshold-when-spend-exceeds-alert-threshold.sdp.md +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-005-sets-at-alert-threshold-when-spend-exceeds-alert-threshold.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Sets atAlertThreshold when spend exceeds alert threshold" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature +- outcome: Executable scenario: Sets atAlertThreshold when spend exceeds alert threshold + +```gwt +Given a cost tracker with currentSpend 8.5 and dailyBudget 10 and alertThreshold 0.8 +When I check the budget with estimatedCost 0.5 +Then the result allowed is true +And the atAlertThreshold flag is true +``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-006-does-not-set-at-alert-threshold-when-below-threshold.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-006-does-not-set-at-alert-threshold-when-below-threshold.sdp.md index 1aa96a74..75c9dbed 100644 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-006-does-not-set-at-alert-threshold-when-below-threshold.sdp.md +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-006-does-not-set-at-alert-threshold-when-below-threshold.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Does not set atAlertThreshold when below threshold" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature +- outcome: Executable scenario: Does not set atAlertThreshold when below threshold + +```gwt +Given a cost tracker with currentSpend 5 and dailyBudget 10 and alertThreshold 0.8 +When I check the budget with estimatedCost 1 +Then the result allowed is true +And the atAlertThreshold flag is false +``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-007-sets-at-alert-threshold-at-exact-threshold-boundary.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-007-sets-at-alert-threshold-at-exact-threshold-boundary.sdp.md index 60f14c99..8dc800a9 100644 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-007-sets-at-alert-threshold-at-exact-threshold-boundary.sdp.md +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-007-sets-at-alert-threshold-at-exact-threshold-boundary.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Sets atAlertThreshold at exact threshold boundary" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature +- outcome: Executable scenario: Sets atAlertThreshold at exact threshold boundary + +```gwt +Given a cost tracker with currentSpend 8 and dailyBudget 10 and alertThreshold 0.8 +When I check the budget with estimatedCost 0.5 +Then the result allowed is true +And the atAlertThreshold flag is true +``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-008-simple-multiplication-of-tokens-and-cost-per-token.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-008-simple-multiplication-of-tokens-and-cost-per-token.sdp.md index d57af6c1..d1d6b5ca 100644 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-008-simple-multiplication-of-tokens-and-cost-per-token.sdp.md +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-008-simple-multiplication-of-tokens-and-cost-per-token.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Simple multiplication of tokens and cost per token" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature +- outcome: Executable scenario: Simple multiplication of tokens and cost per token + +```gwt +Given the feature fixture is in place +When I estimate cost for 1000 tokens at 0.000003 per token +Then the estimated cost is 0.003 +``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-009-returns-0-for-0-tokens.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-009-returns-0-for-0-tokens.sdp.md index e22b10a2..66a2178e 100644 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-009-returns-0-for-0-tokens.sdp.md +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-009-returns-0-for-0-tokens.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns 0 for 0 tokens" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature +- outcome: Executable scenario: Returns 0 for 0 tokens + +```gwt +Given the feature fixture is in place +When I estimate cost for 0 tokens at 0.000003 per token +Then the estimated cost is 0 +``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-010-handles-large-token-counts.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-010-handles-large-token-counts.sdp.md index c9edc7c2..e35585cf 100644 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-010-handles-large-token-counts.sdp.md +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-010-handles-large-token-counts.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles large token counts" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature +- outcome: Executable scenario: Handles large token counts + +```gwt +Given the feature fixture is in place +When I estimate cost for 1000000 tokens at 0.000003 per token +Then the estimated cost is approximately 3.0 +``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-011-handles-very-small-cost-per-token.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-011-handles-very-small-cost-per-token.sdp.md index b8395a38..fe125736 100644 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-011-handles-very-small-cost-per-token.sdp.md +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-011-handles-very-small-cost-per-token.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles very small cost per token" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature +- outcome: Executable scenario: Handles very small cost per token + +```gwt +Given the feature fixture is in place +When I estimate cost for 100 tokens at 0.00000015 per token +Then the estimated cost is approximately 0.000015 +``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-012-claude-model-entry-has-positive-input-and-output-costs-with-output-greater.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-012-claude-model-entry-has-positive-input-and-output-costs-with-output-greater.sdp.md index b092f382..7edf07bf 100644 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-012-claude-model-entry-has-positive-input-and-output-costs-with-output-greater.sdp.md +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-012-claude-model-entry-has-positive-input-and-output-costs-with-output-greater.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Claude model entry has positive input and output costs with output greater than input" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature +- outcome: Executable scenario: Claude model entry has positive input and output costs with output greater than input + +```gwt +Given the feature fixture is in place +When I look up the "anthropic/claude-sonnet-4-5-20250929" model costs +Then the model entry is defined +And the input cost is greater than 0 +And the output cost is greater than 0 +And the output cost is greater than the input cost +``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-013-gpt-4o-model-entry-has-positive-input-and-output-costs.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-013-gpt-4o-model-entry-has-positive-input-and-output-costs.sdp.md index 9462ccbc..1873eb05 100644 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-013-gpt-4o-model-entry-has-positive-input-and-output-costs.sdp.md +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-013-gpt-4o-model-entry-has-positive-input-and-output-costs.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "GPT-4o model entry has positive input and output costs" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature +- outcome: Executable scenario: GPT-4o model entry has positive input and output costs + +```gwt +Given the feature fixture is in place +When I look up the "openai/gpt-4o" model costs +Then the model entry is defined +And the input cost is greater than 0 +And the output cost is greater than 0 +``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-014-gpt-4o-mini-model-entry-is-cheaper-than-gpt-4o.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-014-gpt-4o-mini-model-entry-is-cheaper-than-gpt-4o.sdp.md index 56e2a2a6..dc8dfacb 100644 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-014-gpt-4o-mini-model-entry-is-cheaper-than-gpt-4o.sdp.md +++ b/specs/behavior/platform-core/agent/cost-budget.examples/s-014-gpt-4o-mini-model-entry-is-cheaper-than-gpt-4o.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "GPT-4o-mini model entry is cheaper than GPT-4o" from packages/platform-core/tests/features/behavior/agent/cost-budget.feature +- outcome: Executable scenario: GPT-4o-mini model entry is cheaper than GPT-4o + +```gwt +Given the feature fixture is in place +When I look up the "openai/gpt-4o-mini" model costs +Then the model entry is defined +And the input cost is greater than 0 +And the output cost is greater than 0 +And the input cost is less than the "openai/gpt-4o" input cost +``` diff --git a/specs/behavior/platform-core/agent/cost-budget.sdp.md b/specs/behavior/platform-core/agent/cost-budget.sdp.md index 23a920af..69fd4884 100644 --- a/specs/behavior/platform-core/agent/cost-budget.sdp.md +++ b/specs/behavior/platform-core/agent/cost-budget.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Pure functions for agent cost tracking: checkBudget() evaluates spend against budget limits, estimateCost() computes token costs, and DEFAULT_MODEL_COSTS provides per-model pricing data. (test carrier: packages/platform-core/tests/features/behavior/agent/cost-budget.feature) +- outcome: Cost Budget + +## Behavior + +- rule: Budget checks allow or deny based on remaining budget +- rule: Alert threshold flags when spend ratio meets or exceeds threshold +- rule: Cost estimation performs token-cost multiplication +- rule: Default model costs contain expected entries diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-001-contains-all-expected-error-codes.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-001-contains-all-expected-error-codes.sdp.md index 501768bb..88b5f22d 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-001-contains-all-expected-error-codes.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-001-contains-all-expected-error-codes.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Contains all expected error codes" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Contains all expected error codes + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then DEAD_LETTER_ERROR_CODES contains the following entries: +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-002-has-exactly-3-error-codes.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-002-has-exactly-3-error-codes.sdp.md index fd6bcdd3..6284e513 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-002-has-exactly-3-error-codes.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-002-has-exactly-3-error-codes.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Has exactly 3 error codes" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Has exactly 3 error codes + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then DEAD_LETTER_ERROR_CODES has exactly 3 keys +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-003-contains-all-three-statuses-in-order.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-003-contains-all-three-statuses-in-order.sdp.md index 7264f3b8..ddeb0fb8 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-003-contains-all-three-statuses-in-order.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-003-contains-all-three-statuses-in-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Contains all three statuses in order" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Contains all three statuses in order + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then AGENT_DEAD_LETTER_STATUSES equals pending, replayed, ignored +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-004-is-a-readonly-tuple-with-3-elements.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-004-is-a-readonly-tuple-with-3-elements.sdp.md index f4bab616..9215325f 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-004-is-a-readonly-tuple-with-3-elements.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-004-is-a-readonly-tuple-with-3-elements.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Is a readonly tuple with 3 elements" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Is a readonly tuple with 3 elements + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then AGENT_DEAD_LETTER_STATUSES is an array with 3 elements +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-005-type-guard-accepts-valid-statuses.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-005-type-guard-accepts-valid-statuses.sdp.md index 0bebc945..a6873516 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-005-type-guard-accepts-valid-statuses.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-005-type-guard-accepts-valid-statuses.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Type guard accepts valid statuses" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Type guard accepts valid statuses + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isAgentDeadLetterStatus returns true for the following values: +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-006-type-guard-rejects-invalid-values.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-006-type-guard-rejects-invalid-values.sdp.md index 2517b413..d58001b0 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-006-type-guard-rejects-invalid-values.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-006-type-guard-rejects-invalid-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Type guard rejects invalid values" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Type guard rejects invalid values + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isAgentDeadLetterStatus returns false for the following values: +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-007-type-guard-rejects-non-string-types.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-007-type-guard-rejects-non-string-types.sdp.md index 5292be31..7eee559f 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-007-type-guard-rejects-non-string-types.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-007-type-guard-rejects-non-string-types.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Type guard rejects non-string types" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Type guard rejects non-string types + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isAgentDeadLetterStatus returns false for numbers, null, undefined, objects, and arrays +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-008-accepts-all-valid-statuses.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-008-accepts-all-valid-statuses.sdp.md index 88e9e092..19d5f7f7 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-008-accepts-all-valid-statuses.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-008-accepts-all-valid-statuses.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts all valid statuses" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Accepts all valid statuses + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then AgentDeadLetterStatusSchema accepts all AGENT_DEAD_LETTER_STATUSES +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-009-rejects-invalid-status-values.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-009-rejects-invalid-status-values.sdp.md index 0df93682..46b6c408 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-009-rejects-invalid-status-values.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-009-rejects-invalid-status-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects invalid status values" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Rejects invalid status values + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then AgentDeadLetterStatusSchema rejects the following values: +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-010-accepts-valid-context-with-all-fields.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-010-accepts-valid-context-with-all-fields.sdp.md index 67f2aaff..242cc218 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-010-accepts-valid-context-with-all-fields.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-010-accepts-valid-context-with-all-fields.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts valid context with all fields" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Accepts valid context with all fields + +```gwt +Given the module is imported from platform-core +And a test context with correlationId "corr-123" and errorCode "LLM_TIMEOUT" and triggeringPattern "churn-risk" +When the scenario runs +Then AgentDeadLetterContextSchema accepts the context +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-011-accepts-context-with-only-correlation-id.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-011-accepts-context-with-only-correlation-id.sdp.md index fd5f2526..18d1f0f9 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-011-accepts-context-with-only-correlation-id.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-011-accepts-context-with-only-correlation-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts context with only correlationId" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Accepts context with only correlationId + +```gwt +Given the module is imported from platform-core +And a context with only correlationId "corr-123" +When the scenario runs +Then AgentDeadLetterContextSchema accepts the context +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-012-accepts-context-with-only-error-code.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-012-accepts-context-with-only-error-code.sdp.md index f2ac53e1..192c265d 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-012-accepts-context-with-only-error-code.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-012-accepts-context-with-only-error-code.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts context with only errorCode" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Accepts context with only errorCode + +```gwt +Given the module is imported from platform-core +And a context with only errorCode "LLM_TIMEOUT" +When the scenario runs +Then AgentDeadLetterContextSchema accepts the context +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-013-accepts-empty-context-object.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-013-accepts-empty-context-object.sdp.md index 5ef4834c..cd32b600 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-013-accepts-empty-context-object.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-013-accepts-empty-context-object.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts empty context object" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Accepts empty context object + +```gwt +Given the module is imported from platform-core +And an empty context object +When the scenario runs +Then AgentDeadLetterContextSchema accepts the context +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-014-rejects-context-with-unknown-fields-in-strict-mode.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-014-rejects-context-with-unknown-fields-in-strict-mode.sdp.md index 29e36a8c..8c79025a 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-014-rejects-context-with-unknown-fields-in-strict-mode.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-014-rejects-context-with-unknown-fields-in-strict-mode.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects context with unknown fields in strict mode" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Rejects context with unknown fields in strict mode + +```gwt +Given the module is imported from platform-core +And a context with correlationId "corr-123" and an unknown field +When the scenario runs +Then AgentDeadLetterContextSchema rejects the context +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-015-accepts-valid-dead-letter.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-015-accepts-valid-dead-letter.sdp.md index 29ab6780..34b87e6c 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-015-accepts-valid-dead-letter.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-015-accepts-valid-dead-letter.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts valid dead letter" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Accepts valid dead letter + +```gwt +Given the module is imported from platform-core +And a valid test dead letter +When the scenario runs +Then AgentDeadLetterSchema accepts the dead letter +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-016-accepts-dead-letter-with-context.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-016-accepts-dead-letter-with-context.sdp.md index a216e96d..e94faeec 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-016-accepts-dead-letter-with-context.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-016-accepts-dead-letter-with-context.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts dead letter with context" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Accepts dead letter with context + +```gwt +Given the module is imported from platform-core +And a valid test dead letter with context +When the scenario runs +Then AgentDeadLetterSchema accepts the dead letter +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-017-rejects-dead-letter-with-empty-agent-id.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-017-rejects-dead-letter-with-empty-agent-id.sdp.md index 0a92df19..5e40b09b 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-017-rejects-dead-letter-with-empty-agent-id.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-017-rejects-dead-letter-with-empty-agent-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects dead letter with empty agentId" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Rejects dead letter with empty agentId + +```gwt +Given the module is imported from platform-core +And a test dead letter with agentId "" +When the scenario runs +Then AgentDeadLetterSchema rejects the dead letter +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-018-rejects-dead-letter-with-empty-subscription-id.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-018-rejects-dead-letter-with-empty-subscription-id.sdp.md index 2d5ecc86..f4cf5298 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-018-rejects-dead-letter-with-empty-subscription-id.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-018-rejects-dead-letter-with-empty-subscription-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects dead letter with empty subscriptionId" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Rejects dead letter with empty subscriptionId + +```gwt +Given the module is imported from platform-core +And a test dead letter with subscriptionId "" +When the scenario runs +Then AgentDeadLetterSchema rejects the dead letter +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-019-rejects-dead-letter-with-empty-event-id.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-019-rejects-dead-letter-with-empty-event-id.sdp.md index cb5fb7cc..9ddc9818 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-019-rejects-dead-letter-with-empty-event-id.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-019-rejects-dead-letter-with-empty-event-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects dead letter with empty eventId" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Rejects dead letter with empty eventId + +```gwt +Given the module is imported from platform-core +And a test dead letter with eventId "" +When the scenario runs +Then AgentDeadLetterSchema rejects the dead letter +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-020-rejects-dead-letter-with-negative-global-position.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-020-rejects-dead-letter-with-negative-global-position.sdp.md index 9c65c7dc..8efa4cbb 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-020-rejects-dead-letter-with-negative-global-position.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-020-rejects-dead-letter-with-negative-global-position.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects dead letter with negative globalPosition" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Rejects dead letter with negative globalPosition + +```gwt +Given the module is imported from platform-core +And a test dead letter with globalPosition -1 +When the scenario runs +Then AgentDeadLetterSchema rejects the dead letter +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-021-accepts-dead-letter-with-global-position-of-0.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-021-accepts-dead-letter-with-global-position-of-0.sdp.md index 5fd3bc65..a8666e11 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-021-accepts-dead-letter-with-global-position-of-0.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-021-accepts-dead-letter-with-global-position-of-0.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts dead letter with globalPosition of 0" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Accepts dead letter with globalPosition of 0 + +```gwt +Given the module is imported from platform-core +And a test dead letter with globalPosition 0 +When the scenario runs +Then AgentDeadLetterSchema accepts the dead letter +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-022-rejects-dead-letter-with-non-positive-attempt-count.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-022-rejects-dead-letter-with-non-positive-attempt-count.sdp.md index e01b0d56..c062f686 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-022-rejects-dead-letter-with-non-positive-attempt-count.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-022-rejects-dead-letter-with-non-positive-attempt-count.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects dead letter with non-positive attemptCount" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Rejects dead letter with non-positive attemptCount + +```gwt +Given the module is imported from platform-core +And a test dead letter with attemptCount 0 +When the scenario runs +Then AgentDeadLetterSchema rejects the dead letter +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-023-rejects-dead-letter-with-missing-required-fields.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-023-rejects-dead-letter-with-missing-required-fields.sdp.md index 0c548282..837885dd 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-023-rejects-dead-letter-with-missing-required-fields.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-023-rejects-dead-letter-with-missing-required-fields.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects dead letter with missing required fields" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Rejects dead letter with missing required fields + +```gwt +Given the module is imported from platform-core +And a partial object with only agentId "test" +When the scenario runs +Then AgentDeadLetterSchema rejects the dead letter +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-024-removes-content-after-at-when-followed-by-path-like-content.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-024-removes-content-after-at-when-followed-by-path-like-content.sdp.md index acce9c24..305d0c21 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-024-removes-content-after-at-when-followed-by-path-like-content.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-024-removes-content-after-at-when-followed-by-path-like-content.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Removes content after at when followed by path-like content" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Removes content after at when followed by path-like content + +```gwt +Given the module is imported from platform-core +When I sanitize the error "Error occurred at /app/src/agent.ts:42:10" +Then the sanitized message is "Error occurred" +And the sanitized message does not contain "/app/src/agent.ts:42:10" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-025-removes-multi-line-stack-traces.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-025-removes-multi-line-stack-traces.sdp.md index 00719157..af8b6372 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-025-removes-multi-line-stack-traces.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-025-removes-multi-line-stack-traces.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Removes multi-line stack traces" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Removes multi-line stack traces + +```gwt +Given the module is imported from platform-core +When I sanitize a multi-line error with stack traces +Then the sanitized message does not contain "at processEvent" +And the sanitized message does not contain "at runAgent" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-026-preserves-the-error-message-itself.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-026-preserves-the-error-message-itself.sdp.md index 2f20dd12..c8db60d4 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-026-preserves-the-error-message-itself.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-026-preserves-the-error-message-itself.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Preserves the error message itself" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Preserves the error message itself + +```gwt +Given the module is imported from platform-core +When I sanitize the error "LLM timeout during analysis" +Then the sanitized message is "LLM timeout during analysis" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-027-removes-type-script-file-paths-with-at-prefix.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-027-removes-type-script-file-paths-with-at-prefix.sdp.md index 6568d6ab..b5ee38c2 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-027-removes-type-script-file-paths-with-at-prefix.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-027-removes-type-script-file-paths-with-at-prefix.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Removes TypeScript file paths with at prefix" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Removes TypeScript file paths with at prefix + +```gwt +Given the module is imported from platform-core +When I sanitize the error "Failed at /app/src/agent.ts" +Then the sanitized message is "Failed" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-028-replaces-file-paths-without-at-prefix-with-path-marker.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-028-replaces-file-paths-without-at-prefix-with-path-marker.sdp.md index 6655e402..77a7b532 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-028-replaces-file-paths-without-at-prefix-with-path-marker.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-028-replaces-file-paths-without-at-prefix-with-path-marker.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Replaces file paths without at prefix with path marker" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Replaces file paths without at prefix with path marker + +```gwt +Given the module is imported from platform-core +When I sanitize the error "Error in /dist/handler.js:100:5" +Then the sanitized message is "Error in [path]" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-029-removes-esm-file-paths-when-preceded-by-at.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-029-removes-esm-file-paths-when-preceded-by-at.sdp.md index 9a68c741..7030a4ed 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-029-removes-esm-file-paths-when-preceded-by-at.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-029-removes-esm-file-paths-when-preceded-by-at.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Removes ESM file paths when preceded by at" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Removes ESM file paths when preceded by at + +```gwt +Given the module is imported from platform-core +When I sanitize the error "Module error at /lib/module.mjs" +Then the sanitized message is "Module error" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-030-replaces-cjs-file-paths-with-path-marker-when-not-preceded-by-at.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-030-replaces-cjs-file-paths-with-path-marker-when-not-preceded-by-at.sdp.md index 575e1e99..4111a549 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-030-replaces-cjs-file-paths-with-path-marker-when-not-preceded-by-at.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-030-replaces-cjs-file-paths-with-path-marker-when-not-preceded-by-at.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Replaces CJS file paths with path marker when not preceded by at" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Replaces CJS file paths with path marker when not preceded by at + +```gwt +Given the module is imported from platform-core +When I sanitize the error "Require failed for /lib/module.cjs" +Then the sanitized message is "Require failed for [path]" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-031-removes-paths-with-line-and-column-numbers.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-031-removes-paths-with-line-and-column-numbers.sdp.md index 77e229bd..725442dc 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-031-removes-paths-with-line-and-column-numbers.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-031-removes-paths-with-line-and-column-numbers.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Removes paths with line and column numbers" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Removes paths with line and column numbers + +```gwt +Given the module is imported from platform-core +When I sanitize the error "Error at /path/to/file.ts:42:10" +Then the sanitized message does not contain ":42:10" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-032-truncates-long-messages-to-500-characters-ending-with-ellipsis.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-032-truncates-long-messages-to-500-characters-ending-with-ellipsis.sdp.md index 5f440522..630f75bc 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-032-truncates-long-messages-to-500-characters-ending-with-ellipsis.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-032-truncates-long-messages-to-500-characters-ending-with-ellipsis.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Truncates long messages to 500 characters ending with ellipsis" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Truncates long messages to 500 characters ending with ellipsis + +```gwt +Given the module is imported from platform-core +When I sanitize an error of 600 repeated "A" characters +Then the sanitized message has length 500 +And the sanitized message ends with "..." +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-033-does-not-truncate-messages-under-500-characters.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-033-does-not-truncate-messages-under-500-characters.sdp.md index cb4e25d3..6f489d22 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-033-does-not-truncate-messages-under-500-characters.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-033-does-not-truncate-messages-under-500-characters.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Does not truncate messages under 500 characters" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Does not truncate messages under 500 characters + +```gwt +Given the module is imported from platform-core +When I sanitize an error of 400 repeated "A" characters +Then the sanitized message has length 400 +And the sanitized message does not end with "..." +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-034-does-not-truncate-messages-of-exactly-500-characters.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-034-does-not-truncate-messages-of-exactly-500-characters.sdp.md index 49c8eb4a..c3813c74 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-034-does-not-truncate-messages-of-exactly-500-characters.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-034-does-not-truncate-messages-of-exactly-500-characters.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Does not truncate messages of exactly 500 characters" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Does not truncate messages of exactly 500 characters + +```gwt +Given the module is imported from platform-core +When I sanitize an error of 500 repeated "A" characters +Then the sanitized message has length 500 +And the sanitized message does not end with "..." +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-035-handles-error-objects.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-035-handles-error-objects.sdp.md index 68293d93..684738aa 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-035-handles-error-objects.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-035-handles-error-objects.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles Error objects" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Handles Error objects + +```gwt +Given the module is imported from platform-core +When I sanitize an Error object with message "Test error message" +Then the sanitized message contains "Test error message" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-036-handles-string-errors.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-036-handles-string-errors.sdp.md index ea6504df..99785a20 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-036-handles-string-errors.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-036-handles-string-errors.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles string errors" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Handles string errors + +```gwt +Given the module is imported from platform-core +When I sanitize the error "String error message" +Then the sanitized message is "String error message" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-037-handles-objects-with-message-property.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-037-handles-objects-with-message-property.sdp.md index fe4d81c4..e5de2485 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-037-handles-objects-with-message-property.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-037-handles-objects-with-message-property.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles objects with message property" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Handles objects with message property + +```gwt +Given the module is imported from platform-core +When I sanitize an object with message "Object error message" +Then the sanitized message contains "Object error message" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-038-handles-unknown-error-types.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-038-handles-unknown-error-types.sdp.md index eb7f42b3..c0407b13 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-038-handles-unknown-error-types.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-038-handles-unknown-error-types.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles unknown error types" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Handles unknown error types + +```gwt +Given the module is imported from platform-core +When I sanitize an object without message property +Then the sanitized message is "Unknown error" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-039-handles-null.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-039-handles-null.sdp.md index 9482a62c..f6ef3c42 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-039-handles-null.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-039-handles-null.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles null" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Handles null + +```gwt +Given the module is imported from platform-core +When I sanitize null +Then the sanitized message is "Unknown error" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-040-handles-undefined.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-040-handles-undefined.sdp.md index b6b7e8a9..10522c7a 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-040-handles-undefined.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-040-handles-undefined.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles undefined" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Handles undefined + +```gwt +Given the module is imported from platform-core +When I sanitize undefined +Then the sanitized message is "Unknown error" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-041-handles-empty-string.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-041-handles-empty-string.sdp.md index b9aa610d..5855f015 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-041-handles-empty-string.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-041-handles-empty-string.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles empty string" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Handles empty string + +```gwt +Given the module is imported from platform-core +When I sanitize the error "" +Then the sanitized message is "Unknown error" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-042-collapses-multiple-spaces.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-042-collapses-multiple-spaces.sdp.md index aba66b42..1181fed2 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-042-collapses-multiple-spaces.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-042-collapses-multiple-spaces.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Collapses multiple spaces" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Collapses multiple spaces + +```gwt +Given the module is imported from platform-core +When I sanitize the error "Error with multiple spaces" +Then the sanitized message is "Error with multiple spaces" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-043-trims-leading-and-trailing-whitespace.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-043-trims-leading-and-trailing-whitespace.sdp.md index 99400da9..a87b0e13 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-043-trims-leading-and-trailing-whitespace.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-043-trims-leading-and-trailing-whitespace.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Trims leading and trailing whitespace" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Trims leading and trailing whitespace + +```gwt +Given the module is imported from platform-core +When I sanitize the error " Error with surrounding whitespace " +Then the sanitized message is "Error with surrounding whitespace" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-044-handles-newlines.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-044-handles-newlines.sdp.md index 2b7c3c67..f593faeb 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-044-handles-newlines.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-044-handles-newlines.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles newlines" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Handles newlines + +```gwt +Given the module is imported from platform-core +When I sanitize an error with newlines "Error\non\nmultiple\nlines" +Then the sanitized message is "Error on multiple lines" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-045-creates-dead-letter-with-required-fields.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-045-creates-dead-letter-with-required-fields.sdp.md index b9d31156..dffe414b 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-045-creates-dead-letter-with-required-fields.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-045-creates-dead-letter-with-required-fields.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Creates dead letter with required fields" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Creates dead letter with required fields + +```gwt +Given the module is imported from platform-core +And the system time is "2024-01-15T12:00:00Z" +When I create a dead letter with agentId "test-agent" subscriptionId "sub-001" eventId "evt-123" globalPosition 1000 and error "Error message" +Then the dead letter has the following properties: +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-046-creates-dead-letter-with-pending-status.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-046-creates-dead-letter-with-pending-status.sdp.md index cffa13d8..f04c72ac 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-046-creates-dead-letter-with-pending-status.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-046-creates-dead-letter-with-pending-status.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Creates dead letter with pending status" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Creates dead letter with pending status + +```gwt +Given the module is imported from platform-core +And the system time is "2024-01-15T12:00:00Z" +When I create a dead letter with agentId "agent" subscriptionId "sub" eventId "evt" globalPosition 0 and error "error" +Then the dead letter status is "pending" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-047-sets-attempt-count-to-1.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-047-sets-attempt-count-to-1.sdp.md index 137902f3..96e03f22 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-047-sets-attempt-count-to-1.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-047-sets-attempt-count-to-1.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Sets attemptCount to 1" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Sets attemptCount to 1 + +```gwt +Given the module is imported from platform-core +And the system time is "2024-01-15T12:00:00Z" +When I create a dead letter with agentId "agent" subscriptionId "sub" eventId "evt" globalPosition 0 and error "error" +Then the dead letter attemptCount is 1 +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-048-sets-failed-at-to-current-time.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-048-sets-failed-at-to-current-time.sdp.md index 45b844de..81363c84 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-048-sets-failed-at-to-current-time.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-048-sets-failed-at-to-current-time.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Sets failedAt to current time" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Sets failedAt to current time + +```gwt +Given the module is imported from platform-core +And the system time is "2024-01-15T12:00:00Z" +When I create a dead letter with agentId "agent" subscriptionId "sub" eventId "evt" globalPosition 0 and error "error" +Then the dead letter failedAt equals the current time +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-049-includes-context-when-provided.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-049-includes-context-when-provided.sdp.md index 4e92c839..bb321c28 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-049-includes-context-when-provided.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-049-includes-context-when-provided.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Includes context when provided" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Includes context when provided + +```gwt +Given the module is imported from platform-core +And the system time is "2024-01-15T12:00:00Z" +When I create a dead letter with context containing correlationId "corr-123" errorCode "LLM_TIMEOUT" and triggeringPattern "churn-risk" +Then the dead letter context matches the provided context +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-050-does-not-include-context-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-050-does-not-include-context-when-not-provided.sdp.md index 304856ce..3c5d80e7 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-050-does-not-include-context-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-050-does-not-include-context-when-not-provided.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Does not include context when not provided" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Does not include context when not provided + +```gwt +Given the module is imported from platform-core +And the system time is "2024-01-15T12:00:00Z" +When I create a dead letter with agentId "agent" subscriptionId "sub" eventId "evt" globalPosition 0 and error "error" +Then the dead letter context is undefined +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-051-sanitizes-error-objects-removing-stack-like-patterns.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-051-sanitizes-error-objects-removing-stack-like-patterns.sdp.md index 2cf88363..9184dfa1 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-051-sanitizes-error-objects-removing-stack-like-patterns.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-051-sanitizes-error-objects-removing-stack-like-patterns.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Sanitizes Error objects removing stack-like patterns" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Sanitizes Error objects removing stack-like patterns + +```gwt +Given the module is imported from platform-core +And the system time is "2024-01-15T12:00:00Z" +When I create a dead letter with an Error object "Error at /app/src/handler.ts:42" +Then the dead letter error is "Error" +And the dead letter error does not contain "/app/src/handler.ts" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-052-sanitizes-string-errors.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-052-sanitizes-string-errors.sdp.md index fc2f2100..c96bf83a 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-052-sanitizes-string-errors.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-052-sanitizes-string-errors.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Sanitizes string errors" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Sanitizes string errors + +```gwt +Given the module is imported from platform-core +And the system time is "2024-01-15T12:00:00Z" +When I create a dead letter with agentId "agent" subscriptionId "sub" eventId "evt" globalPosition 0 and error "Error at /app/src/handler.ts:42" +Then the dead letter error is "Error" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-053-replaces-paths-in-errors-without-at-prefix.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-053-replaces-paths-in-errors-without-at-prefix.sdp.md index 2d694e8f..a94a300a 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-053-replaces-paths-in-errors-without-at-prefix.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-053-replaces-paths-in-errors-without-at-prefix.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Replaces paths in errors without at prefix" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Replaces paths in errors without at prefix + +```gwt +Given the module is imported from platform-core +And the system time is "2024-01-15T12:00:00Z" +When I create a dead letter with agentId "agent" subscriptionId "sub" eventId "evt" globalPosition 0 and error "Failed loading /app/src/handler.ts" +Then the dead letter error is "Failed loading [path]" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-054-replaces-paths-with-line-column-suffix.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-054-replaces-paths-with-line-column-suffix.sdp.md index 2454cb54..8254a0e3 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-054-replaces-paths-with-line-column-suffix.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-054-replaces-paths-with-line-column-suffix.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Replaces paths with line column suffix" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Replaces paths with line column suffix + +```gwt +Given the module is imported from platform-core +And the system time is "2024-01-15T12:00:00Z" +When I create a dead letter with agentId "agent" subscriptionId "sub" eventId "evt" globalPosition 0 and error "Failed loading /app/src/handler.ts:42:10" +Then the dead letter error is "Failed loading [path]" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-055-sanitizes-unknown-error-types.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-055-sanitizes-unknown-error-types.sdp.md index 939b76ff..3373fb60 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-055-sanitizes-unknown-error-types.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-055-sanitizes-unknown-error-types.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Sanitizes unknown error types" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Sanitizes unknown error types + +```gwt +Given the module is imported from platform-core +And the system time is "2024-01-15T12:00:00Z" +When I create a dead letter with an unknown error type +Then the dead letter error is "Unknown error" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-056-increments-attempt-count.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-056-increments-attempt-count.sdp.md index 2b98c08d..8ad95a94 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-056-increments-attempt-count.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-056-increments-attempt-count.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Increments attemptCount" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Increments attemptCount + +```gwt +Given the module is imported from platform-core +And the system time is "2024-01-15T12:00:00Z" +And a test dead letter with attemptCount 1 +When I increment the dead letter attempt with error "New error" +Then the dead letter attemptCount is 2 +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-057-updates-error-message.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-057-updates-error-message.sdp.md index 6fafebfa..dfc31e52 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-057-updates-error-message.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-057-updates-error-message.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Updates error message" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Updates error message + +```gwt +Given the module is imported from platform-core +And the system time is "2024-01-15T12:00:00Z" +And a test dead letter with error "Old error" +When I increment the dead letter attempt with error "New error" +Then the dead letter error is "New error" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-058-sanitizes-new-error-message-with-at-pattern.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-058-sanitizes-new-error-message-with-at-pattern.sdp.md index 696fc716..8bdbebc3 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-058-sanitizes-new-error-message-with-at-pattern.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-058-sanitizes-new-error-message-with-at-pattern.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Sanitizes new error message with at pattern" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Sanitizes new error message with at pattern + +```gwt +Given the module is imported from platform-core +And the system time is "2024-01-15T12:00:00Z" +And a test dead letter with attemptCount 1 +When I increment the dead letter attempt with error "Error at /app/file.ts:10" +Then the dead letter error is "Error" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-059-sanitizes-new-error-message-with-path-replacement.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-059-sanitizes-new-error-message-with-path-replacement.sdp.md index 237c9802..a8b40163 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-059-sanitizes-new-error-message-with-path-replacement.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-059-sanitizes-new-error-message-with-path-replacement.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Sanitizes new error message with path replacement" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Sanitizes new error message with path replacement + +```gwt +Given the module is imported from platform-core +And the system time is "2024-01-15T12:00:00Z" +And a test dead letter with attemptCount 1 +When I increment the dead letter attempt with error "Failed loading /app/file.ts" +Then the dead letter error is "Failed loading [path]" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-060-updates-failed-at-to-current-time.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-060-updates-failed-at-to-current-time.sdp.md index 8923d7c7..ab983062 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-060-updates-failed-at-to-current-time.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-060-updates-failed-at-to-current-time.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Updates failedAt to current time" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Updates failedAt to current time + +```gwt +Given the module is imported from platform-core +And the system time is "2024-01-15T12:00:00Z" +And a test dead letter with failedAt 10000 ms ago +When I increment the dead letter attempt with error "New error" +Then the dead letter failedAt equals the current time +And the dead letter failedAt is different from the old failedAt +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-061-preserves-other-fields-during-increment.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-061-preserves-other-fields-during-increment.sdp.md index 6bf7530a..416bfc53 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-061-preserves-other-fields-during-increment.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-061-preserves-other-fields-during-increment.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Preserves other fields during increment" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Preserves other fields during increment + +```gwt +Given the module is imported from platform-core +And the system time is "2024-01-15T12:00:00Z" +And a test dead letter with agentId "my-agent" subscriptionId "my-sub" eventId "my-evt" globalPosition 500 status "pending" and context +When I increment the dead letter attempt with error "New error" +Then the dead letter preserves all original fields except attemptCount, error, and failedAt +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-062-handles-multiple-increments.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-062-handles-multiple-increments.sdp.md index 760df7e4..e608eda8 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-062-handles-multiple-increments.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-062-handles-multiple-increments.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Handles multiple increments" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Handles multiple increments + +```gwt +Given the module is imported from platform-core +And the system time is "2024-01-15T12:00:00Z" +And a test dead letter with attemptCount 1 +When I increment the dead letter attempt 3 times with errors "Retry 1", "Retry 2", "Retry 3" +Then the dead letter attemptCount is 4 +And the dead letter error is "Retry 3" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-063-transitions-pending-to-replayed.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-063-transitions-pending-to-replayed.sdp.md index 6ccd2375..3fa647b1 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-063-transitions-pending-to-replayed.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-063-transitions-pending-to-replayed.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Transitions pending to replayed" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Transitions pending to replayed + +```gwt +Given the module is imported from platform-core +And a test dead letter with status "pending" +When I mark the dead letter as replayed +Then the dead letter status is "replayed" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-064-preserves-all-other-fields-when-transitioning-to-replayed.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-064-preserves-all-other-fields-when-transitioning-to-replayed.sdp.md index 2a8ed9ac..daf86991 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-064-preserves-all-other-fields-when-transitioning-to-replayed.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-064-preserves-all-other-fields-when-transitioning-to-replayed.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Preserves all other fields when transitioning to replayed" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Preserves all other fields when transitioning to replayed + +```gwt +Given the module is imported from platform-core +And a test dead letter with status "pending" agentId "my-agent" attemptCount 3 and context +When I mark the dead letter as replayed +Then the dead letter preserves agentId "my-agent" and attemptCount 3 and context +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-065-throws-when-marking-replayed-dead-letter-as-replayed.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-065-throws-when-marking-replayed-dead-letter-as-replayed.sdp.md index a23d361b..71424bd2 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-065-throws-when-marking-replayed-dead-letter-as-replayed.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-065-throws-when-marking-replayed-dead-letter-as-replayed.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Throws when marking replayed dead letter as replayed" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Throws when marking replayed dead letter as replayed + +```gwt +Given the module is imported from platform-core +And a test dead letter with status "replayed" +When the scenario runs +Then marking the dead letter as replayed throws with message containing "replayed" and "pending" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-066-throws-when-marking-ignored-dead-letter-as-replayed.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-066-throws-when-marking-ignored-dead-letter-as-replayed.sdp.md index a3cf3ddb..5bcc5948 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-066-throws-when-marking-ignored-dead-letter-as-replayed.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-066-throws-when-marking-ignored-dead-letter-as-replayed.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Throws when marking ignored dead letter as replayed" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Throws when marking ignored dead letter as replayed + +```gwt +Given the module is imported from platform-core +And a test dead letter with status "ignored" +When the scenario runs +Then marking the dead letter as replayed throws with message containing "ignored" and "pending" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-067-transitions-pending-to-ignored.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-067-transitions-pending-to-ignored.sdp.md index 550903e0..63880127 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-067-transitions-pending-to-ignored.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-067-transitions-pending-to-ignored.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Transitions pending to ignored" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Transitions pending to ignored + +```gwt +Given the module is imported from platform-core +And a test dead letter with status "pending" +When I mark the dead letter as ignored +Then the dead letter status is "ignored" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-068-preserves-all-other-fields-when-transitioning-to-ignored.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-068-preserves-all-other-fields-when-transitioning-to-ignored.sdp.md index c5e9168c..7c5cd2d1 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-068-preserves-all-other-fields-when-transitioning-to-ignored.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-068-preserves-all-other-fields-when-transitioning-to-ignored.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Preserves all other fields when transitioning to ignored" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Preserves all other fields when transitioning to ignored + +```gwt +Given the module is imported from platform-core +And a test dead letter with status "pending" eventId "evt-456" and error "Original error" +When I mark the dead letter as ignored +Then the dead letter preserves eventId "evt-456" and error "Original error" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-069-throws-when-marking-replayed-dead-letter-as-ignored.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-069-throws-when-marking-replayed-dead-letter-as-ignored.sdp.md index 1b01a31b..07678ae7 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-069-throws-when-marking-replayed-dead-letter-as-ignored.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-069-throws-when-marking-replayed-dead-letter-as-ignored.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Throws when marking replayed dead letter as ignored" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Throws when marking replayed dead letter as ignored + +```gwt +Given the module is imported from platform-core +And a test dead letter with status "replayed" +When the scenario runs +Then marking the dead letter as ignored throws with message containing "replayed" and "pending" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-070-throws-when-marking-already-ignored-dead-letter-as-ignored.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-070-throws-when-marking-already-ignored-dead-letter-as-ignored.sdp.md index 217f2142..4e827abb 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-070-throws-when-marking-already-ignored-dead-letter-as-ignored.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-070-throws-when-marking-already-ignored-dead-letter-as-ignored.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Throws when marking already ignored dead letter as ignored" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Throws when marking already ignored dead letter as ignored + +```gwt +Given the module is imported from platform-core +And a test dead letter with status "ignored" +When the scenario runs +Then marking the dead letter as ignored throws with message containing "ignored" and "pending" +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-071-is-dead-letter-pending-returns-true-only-for-pending.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-071-is-dead-letter-pending-returns-true-only-for-pending.sdp.md index d7183891..5827190c 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-071-is-dead-letter-pending-returns-true-only-for-pending.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-071-is-dead-letter-pending-returns-true-only-for-pending.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "isDeadLetterPending returns true only for pending" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: isDeadLetterPending returns true only for pending + +```gwt +Given the module is imported from platform-core +And a test dead letter with status "pending" +When the scenario runs +Then isDeadLetterPending returns true +And isDeadLetterReplayed returns false +And isDeadLetterIgnored returns false +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-072-is-dead-letter-replayed-returns-true-only-for-replayed.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-072-is-dead-letter-replayed-returns-true-only-for-replayed.sdp.md index 49f731bd..fbeaac18 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-072-is-dead-letter-replayed-returns-true-only-for-replayed.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-072-is-dead-letter-replayed-returns-true-only-for-replayed.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "isDeadLetterReplayed returns true only for replayed" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: isDeadLetterReplayed returns true only for replayed + +```gwt +Given the module is imported from platform-core +And a test dead letter with status "replayed" +When the scenario runs +Then isDeadLetterPending returns false +And isDeadLetterReplayed returns true +And isDeadLetterIgnored returns false +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-073-is-dead-letter-ignored-returns-true-only-for-ignored.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-073-is-dead-letter-ignored-returns-true-only-for-ignored.sdp.md index 9ecb103e..615d680c 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-073-is-dead-letter-ignored-returns-true-only-for-ignored.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-073-is-dead-letter-ignored-returns-true-only-for-ignored.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "isDeadLetterIgnored returns true only for ignored" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: isDeadLetterIgnored returns true only for ignored + +```gwt +Given the module is imported from platform-core +And a test dead letter with status "ignored" +When the scenario runs +Then isDeadLetterPending returns false +And isDeadLetterReplayed returns false +And isDeadLetterIgnored returns true +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-074-returns-true-for-valid-dead-letter.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-074-returns-true-for-valid-dead-letter.sdp.md index 7ef9aca4..d24576a2 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-074-returns-true-for-valid-dead-letter.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-074-returns-true-for-valid-dead-letter.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for valid dead letter" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Returns true for valid dead letter + +```gwt +Given the module is imported from platform-core +And a valid test dead letter +When the scenario runs +Then validateAgentDeadLetter returns true +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-075-returns-true-for-dead-letter-with-context.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-075-returns-true-for-dead-letter-with-context.sdp.md index db127ce1..4f567882 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-075-returns-true-for-dead-letter-with-context.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-075-returns-true-for-dead-letter-with-context.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for dead letter with context" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Returns true for dead letter with context + +```gwt +Given the module is imported from platform-core +And a valid test dead letter with context +When the scenario runs +Then validateAgentDeadLetter returns true +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-076-returns-false-for-null.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-076-returns-false-for-null.sdp.md index cac18c44..f647271f 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-076-returns-false-for-null.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-076-returns-false-for-null.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for null" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Returns false for null + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then validateAgentDeadLetter returns false for null +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-077-returns-false-for-undefined.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-077-returns-false-for-undefined.sdp.md index 2bb87101..7b2b3b1a 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-077-returns-false-for-undefined.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-077-returns-false-for-undefined.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for undefined" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Returns false for undefined + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then validateAgentDeadLetter returns false for undefined +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-078-returns-false-for-empty-object.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-078-returns-false-for-empty-object.sdp.md index 6e92d133..20377093 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-078-returns-false-for-empty-object.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-078-returns-false-for-empty-object.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for empty object" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Returns false for empty object + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then validateAgentDeadLetter returns false for an empty object +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-079-returns-false-for-non-object-types.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-079-returns-false-for-non-object-types.sdp.md index a061bf41..f31e2524 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-079-returns-false-for-non-object-types.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-079-returns-false-for-non-object-types.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for non-object types" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Returns false for non-object types + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then validateAgentDeadLetter returns false for non-object types including string, number, and boolean +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-080-returns-false-for-dead-letter-with-invalid-status.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-080-returns-false-for-dead-letter-with-invalid-status.sdp.md index 7742e615..53f38a80 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-080-returns-false-for-dead-letter-with-invalid-status.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-080-returns-false-for-dead-letter-with-invalid-status.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for dead letter with invalid status" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Returns false for dead letter with invalid status + +```gwt +Given the module is imported from platform-core +And a test dead letter with status "invalid" +When the scenario runs +Then validateAgentDeadLetter returns false for the dead letter +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-081-returns-false-for-dead-letter-with-missing-fields.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-081-returns-false-for-dead-letter-with-missing-fields.sdp.md index ea3113e8..33d698cd 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-081-returns-false-for-dead-letter-with-missing-fields.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-081-returns-false-for-dead-letter-with-missing-fields.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for dead letter with missing fields" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Returns false for dead letter with missing fields + +```gwt +Given the module is imported from platform-core +And a partial object with agentId "test" and status "pending" +When the scenario runs +Then validateAgentDeadLetter returns false for the dead letter +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-082-failed-event-processing-and-replay-lifecycle.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-082-failed-event-processing-and-replay-lifecycle.sdp.md index ee579000..2a2c7030 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-082-failed-event-processing-and-replay-lifecycle.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-082-failed-event-processing-and-replay-lifecycle.sdp.md @@ -10,4 +10,20 @@ relations: ## Intent -- outcome: Executable scenario "Failed event processing and replay lifecycle" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Failed event processing and replay lifecycle + +```gwt +Given the module is imported from platform-core +And the system time is "2024-01-15T12:00:00Z" +When I create a dead letter for agent "churn-agent" subscription "sub-001" event "evt-500" position 500 with Error "LLM timeout" and context correlationId "corr-abc" triggeringPattern "churn-risk" and I advance time by 5000 ms and increment wit… +Then the dead letter status is "pending" +And the dead letter attemptCount is 1 +And validateAgentDeadLetter returns true +And the dead letter attemptCount is 2 +And isDeadLetterPending returns true +And the dead letter attemptCount is 3 +And the dead letter status is "replayed" +And isDeadLetterReplayed returns true +And marking the dead letter as ignored throws +And marking the dead letter as replayed throws +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-083-obsolete-event-being-ignored-lifecycle.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-083-obsolete-event-being-ignored-lifecycle.sdp.md index f8c00b9e..d9e02388 100644 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-083-obsolete-event-being-ignored-lifecycle.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.examples/s-083-obsolete-event-being-ignored-lifecycle.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Obsolete event being ignored lifecycle" from packages/platform-core/tests/features/behavior/agent/dead-letter.feature +- outcome: Executable scenario: Obsolete event being ignored lifecycle + +```gwt +Given the module is imported from platform-core +And the system time is "2024-01-15T12:00:00Z" +When I create a dead letter for agent "inventory-agent" subscription "sub-002" event "evt-obsolete" position 100 with string error "Processing failed" and I mark the dead letter as ignored +Then isDeadLetterPending returns true +And the dead letter status is "ignored" +And isDeadLetterIgnored returns true +And marking the dead letter as replayed throws +``` diff --git a/specs/behavior/platform-core/agent/dead-letter.sdp.md b/specs/behavior/platform-core/agent/dead-letter.sdp.md index 7f48132d..5b7dc45b 100644 --- a/specs/behavior/platform-core/agent/dead-letter.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.sdp.md @@ -10,4 +10,24 @@ relations: ## Intent -- outcome: Pure domain functions for agent dead letter queue management: error message sanitization, factory functions, status transitions, type guards, validation, and Zod schema enforcement. (test carrier: packages/platform-core/tests/features/behavior/agent/dead-letter.feature) +- outcome: Agent Dead Letter Queue + +## Behavior + +- rule: Error codes are well-defined constants +- rule: Status types enumerate all valid dead letter statuses +- rule: Zod status schema validates status strings +- rule: Zod context schema validates dead letter context objects +- rule: Zod dead letter schema validates complete dead letter objects +- rule: Sanitization removes stack traces from error messages +- rule: Sanitization removes or replaces file paths +- rule: Sanitization truncates at 500 characters +- rule: Sanitization handles different input types +- rule: Sanitization normalizes whitespace +- rule: Factory function creates dead letters with correct defaults +- rule: Increment updates attempt count, error, and timestamp +- rule: Status transition to replayed only from pending +- rule: Status transition to ignored only from pending +- rule: Type guards correctly identify dead letter statuses +- rule: Validation function checks complete dead letter structure +- rule: Dead letter lifecycle supports replay and ignore paths diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-001-subscribe-to-single-event-type.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-001-subscribe-to-single-event-type.sdp.md index 15c69755..18c3fe9a 100644 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-001-subscribe-to-single-event-type.sdp.md +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-001-subscribe-to-single-event-type.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Subscribe to single event type" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature +- outcome: Executable scenario: Subscribe to single event type + +```gwt +Given the agent module is imported from platform-core +And the EventBus is available +And an agent BC with subscription to "OrderSubmitted" +When an OrderSubmitted event is published +Then the agent receives the event +And event has full fat-event payload +``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-002-subscribe-to-multiple-event-types.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-002-subscribe-to-multiple-event-types.sdp.md index cd1b7796..bcc8d29f 100644 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-002-subscribe-to-multiple-event-types.sdp.md +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-002-subscribe-to-multiple-event-types.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Subscribe to multiple event types" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature +- outcome: Executable scenario: Subscribe to multiple event types + +```gwt +Given the agent module is imported from platform-core +And the EventBus is available +And an agent BC with subscriptions: +When each event type is published +Then the agent receives all three events +``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-003-agent-does-not-receive-unsubscribed-events.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-003-agent-does-not-receive-unsubscribed-events.sdp.md index 1feda928..f6f6202d 100644 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-003-agent-does-not-receive-unsubscribed-events.sdp.md +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-003-agent-does-not-receive-unsubscribed-events.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Agent does not receive unsubscribed events" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature +- outcome: Executable scenario: Agent does not receive unsubscribed events + +```gwt +Given the agent module is imported from platform-core +And the EventBus is available +And an agent BC subscribed to "OrderSubmitted" only +When an OrderCancelled event is published +Then the agent does not receive the event +``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-004-filter-by-payload-field.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-004-filter-by-payload-field.sdp.md index ad235dd2..121b9fcd 100644 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-004-filter-by-payload-field.sdp.md +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-004-filter-by-payload-field.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Filter by payload field" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature +- outcome: Executable scenario: Filter by payload field + +```gwt +Given the agent module is imported from platform-core +And the EventBus is available +And an agent subscribed with filter: amount > 100 +When OrderSubmitted with amount 50 is published and OrderSubmitted with amount 150 is published +Then the agent receives only the amount=150 event +``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-005-filter-by-customer-segment.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-005-filter-by-customer-segment.sdp.md index b29297eb..33817576 100644 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-005-filter-by-customer-segment.sdp.md +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-005-filter-by-customer-segment.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Filter by customer segment" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature +- outcome: Executable scenario: Filter by customer segment + +```gwt +Given the agent module is imported from platform-core +And the EventBus is available +And an agent subscribed with filter: customer.segment = 'premium' +When event for premium customer is published and event for standard customer is published +Then the agent receives only the premium customer event +``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-006-events-delivered-in-publication-order.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-006-events-delivered-in-publication-order.sdp.md index 21edeb48..52382fd9 100644 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-006-events-delivered-in-publication-order.sdp.md +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-006-events-delivered-in-publication-order.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Events delivered in publication order" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature +- outcome: Executable scenario: Events delivered in publication order + +```gwt +Given the agent module is imported from platform-core +And the EventBus is available +And an agent subscribed to OrderSubmitted +When events E1, E2, E3 are published in sequence +Then the agent receives events in order: E1, E2, E3 +``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-007-events-from-same-stream-maintain-order.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-007-events-from-same-stream-maintain-order.sdp.md index b93d89f2..911261fc 100644 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-007-events-from-same-stream-maintain-order.sdp.md +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-007-events-from-same-stream-maintain-order.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Events from same stream maintain order" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature +- outcome: Executable scenario: Events from same stream maintain order + +```gwt +Given the agent module is imported from platform-core +And the EventBus is available +And events for customer "cust_123" with sequence 1, 2, 3 +When agent processes events +Then events are processed in sequence order +``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-008-agent-resumes-from-last-processed-position-after-restart.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-008-agent-resumes-from-last-processed-position-after-restart.sdp.md index cd04adfe..e120e874 100644 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-008-agent-resumes-from-last-processed-position-after-restart.sdp.md +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-008-agent-resumes-from-last-processed-position-after-restart.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Agent resumes from last processed position after restart" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature +- outcome: Executable scenario: Agent resumes from last processed position after restart + +```gwt +Given the agent module is imported from platform-core +And the EventBus is available +And an agent subscribed to OrderSubmitted +And agent has processed events up to position 100 +When server restarts and agent subscription resumes +Then processing continues from position 101 +And no events are reprocessed +And no events are lost +``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-009-checkpoint-updated-after-successful-analysis.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-009-checkpoint-updated-after-successful-analysis.sdp.md index a40bf9da..cb43b502 100644 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-009-checkpoint-updated-after-successful-analysis.sdp.md +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-009-checkpoint-updated-after-successful-analysis.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Checkpoint updated after successful analysis" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature +- outcome: Executable scenario: Checkpoint updated after successful analysis + +```gwt +Given the agent module is imported from platform-core +And the EventBus is available +And an agent subscribed to OrderSubmitted +And agent has processed events up to position 100 +When an event at position 101 is successfully analyzed +Then the checkpoint should be updated to position 101 +And eventsProcessed counter should increment by 1 +And lastEventId should be updated +``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-010-failed-analysis-records-to-dead-letter-without-advancing-checkpoint.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-010-failed-analysis-records-to-dead-letter-without-advancing-checkpoint.sdp.md index 04689576..8e076da9 100644 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-010-failed-analysis-records-to-dead-letter-without-advancing-checkpoint.sdp.md +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-010-failed-analysis-records-to-dead-letter-without-advancing-checkpoint.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Failed analysis records to dead letter without advancing checkpoint" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature +- outcome: Executable scenario: Failed analysis records to dead letter without advancing checkpoint + +```gwt +Given the agent module is imported from platform-core +And the EventBus is available +And an agent subscribed to OrderSubmitted +And agent has processed events up to position 100 +When analysis of event at position 101 fails +Then the checkpoint should remain at position 100 +And a dead letter should be recorded with the error +And eventsProcessed counter should not increment +``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-011-checkpoint-persists-agent-subscription-state.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-011-checkpoint-persists-agent-subscription-state.sdp.md index 5fd4affb..07194653 100644 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-011-checkpoint-persists-agent-subscription-state.sdp.md +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-011-checkpoint-persists-agent-subscription-state.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Checkpoint persists agent subscription state" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature +- outcome: Executable scenario: Checkpoint persists agent subscription state + +```gwt +Given the agent module is imported from platform-core +And the EventBus is available +And an agent with id "churn-detector" +And subscription is active +When checkpoint is queried +Then it returns: +``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-012-pause-subscription.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-012-pause-subscription.sdp.md index 64709a35..f106910f 100644 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-012-pause-subscription.sdp.md +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-012-pause-subscription.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Pause subscription" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature +- outcome: Executable scenario: Pause subscription + +```gwt +Given the agent module is imported from platform-core +And the EventBus is available +And an active agent subscription +When I call subscription.pause() and events are published +Then the agent does not receive events during pause +``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-013-resume-subscription.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-013-resume-subscription.sdp.md index a802b38d..8e5553ea 100644 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-013-resume-subscription.sdp.md +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-013-resume-subscription.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Resume subscription" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature +- outcome: Executable scenario: Resume subscription + +```gwt +Given the agent module is imported from platform-core +And the EventBus is available +And a paused agent subscription +When I call subscription.resume() and events are published +Then the agent receives new events +``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-014-unsubscribe-stops-all-event-delivery.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-014-unsubscribe-stops-all-event-delivery.sdp.md index a9f9294f..9087a6f0 100644 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-014-unsubscribe-stops-all-event-delivery.sdp.md +++ b/specs/behavior/platform-core/agent/event-subscription.examples/s-014-unsubscribe-stops-all-event-delivery.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Unsubscribe stops all event delivery" from packages/platform-core/tests/features/behavior/agent/event-subscription.feature +- outcome: Executable scenario: Unsubscribe stops all event delivery + +```gwt +Given the agent module is imported from platform-core +And the EventBus is available +And an active agent subscription +When I call subscription.unsubscribe() +Then subsequent events are not delivered to agent +``` diff --git a/specs/behavior/platform-core/agent/event-subscription.sdp.md b/specs/behavior/platform-core/agent/event-subscription.sdp.md index 3fd2c0bf..ea4c24db 100644 --- a/specs/behavior/platform-core/agent/event-subscription.sdp.md +++ b/specs/behavior/platform-core/agent/event-subscription.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: agents to subscribe to event streams via EventBus so that agents can react to business events in real-time (test carrier: packages/platform-core/tests/features/behavior/agent/event-subscription.feature) +- actor: a platform developer +- outcome: agents to subscribe to event streams via EventBus so that agents can react to business events in real-time + +## Behavior + +- rule: Agents subscribe to specific event types +- rule: Subscriptions support filters +- rule: Events are delivered in order +- rule: Agent checkpoint tracks processing progress +- rule: Subscriptions can be paused and resumed diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-001-execution-mode-based-on-confidence.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-001-execution-mode-based-on-confidence.sdp.md index 7fd37938..480a96ea 100644 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-001-execution-mode-based-on-confidence.sdp.md +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-001-execution-mode-based-on-confidence.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Execution mode based on confidence" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature +- outcome: Executable scenario: Execution mode based on confidence + +```gwt +Given the agent module is imported from platform-core +And the human-in-loop configuration is available +And confidence threshold is 0.8 +And agent detects pattern with confidence value +When determining execution mode +Then mode should be "value" +``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-002-custom-threshold-per-agent.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-002-custom-threshold-per-agent.sdp.md index f7c80524..b95f6ce6 100644 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-002-custom-threshold-per-agent.sdp.md +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-002-custom-threshold-per-agent.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Custom threshold per agent" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature +- outcome: Executable scenario: Custom threshold per agent + +```gwt +Given the agent module is imported from platform-core +And the human-in-loop configuration is available +And agent "high-risk-detector" with threshold 0.95 +And agent "low-risk-notifier" with threshold 0.5 +When both detect patterns with confidence 0.75 +Then high-risk-detector flags for review +And low-risk-notifier auto-executes +``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-003-requires-approval-action-with-high-confidence.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-003-requires-approval-action-with-high-confidence.sdp.md index 0aebbf2c..ed740e91 100644 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-003-requires-approval-action-with-high-confidence.sdp.md +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-003-requires-approval-action-with-high-confidence.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "RequiresApproval action with high confidence" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature +- outcome: Executable scenario: RequiresApproval action with high confidence + +```gwt +Given the agent module is imported from platform-core +And the human-in-loop configuration is available +And action "AccountSuspension" in requiresApproval list +And agent confidence is 0.99 +When determining execution mode +Then mode should be "flag-for-review" +``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-004-auto-approve-action-with-low-confidence.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-004-auto-approve-action-with-low-confidence.sdp.md index 551d8e18..9396b923 100644 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-004-auto-approve-action-with-low-confidence.sdp.md +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-004-auto-approve-action-with-low-confidence.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "AutoApprove action with low confidence" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature +- outcome: Executable scenario: AutoApprove action with low confidence + +```gwt +Given the agent module is imported from platform-core +And the human-in-loop configuration is available +And action "LowRiskNotification" in autoApprove list +And agent confidence is 0.5 +When determining execution mode +Then mode should be "auto-execute" +``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-005-configure-multiple-approval-requirements.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-005-configure-multiple-approval-requirements.sdp.md index dbd93693..86849a89 100644 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-005-configure-multiple-approval-requirements.sdp.md +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-005-configure-multiple-approval-requirements.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Configure multiple approval requirements" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature +- outcome: Executable scenario: Configure multiple approval requirements + +```gwt +Given the agent module is imported from platform-core +And the human-in-loop configuration is available +And requiresApproval list: +When any of these actions are proposed +Then all require human approval +``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-006-create-review-task.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-006-create-review-task.sdp.md index f16cc159..74aaba2c 100644 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-006-create-review-task.sdp.md +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-006-create-review-task.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Create review task" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature +- outcome: Executable scenario: Create review task + +```gwt +Given the agent module is imported from platform-core +And the human-in-loop configuration is available +And an action flagged for review +When action is submitted +Then AgentActionPending event is recorded +And review task is created +And task includes action details and reasoning +``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-007-approve-pending-action.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-007-approve-pending-action.sdp.md index 1acffa24..01bbc188 100644 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-007-approve-pending-action.sdp.md +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-007-approve-pending-action.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Approve pending action" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature +- outcome: Executable scenario: Approve pending action + +```gwt +Given the agent module is imported from platform-core +And the human-in-loop configuration is available +And a pending action with id "action_123" +When reviewer approves the action +Then ApprovalGranted event is recorded +And original command is executed +``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-008-reject-pending-action.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-008-reject-pending-action.sdp.md index 800a6023..c62dcfdb 100644 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-008-reject-pending-action.sdp.md +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-008-reject-pending-action.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Reject pending action" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature +- outcome: Executable scenario: Reject pending action + +```gwt +Given the agent module is imported from platform-core +And the human-in-loop configuration is available +And a pending action with id "action_123" +When reviewer rejects with reason "False positive" +Then ApprovalRejected event is recorded +And command is NOT executed +And rejection reason is recorded +``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-009-action-expires-after-timeout.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-009-action-expires-after-timeout.sdp.md index 799f5ada..ac7bbf77 100644 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-009-action-expires-after-timeout.sdp.md +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-009-action-expires-after-timeout.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Action expires after timeout" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature +- outcome: Executable scenario: Action expires after timeout + +```gwt +Given the agent module is imported from platform-core +And the human-in-loop configuration is available +And approval timeout is 24 hours +And an action flagged for review +When 24 hours pass without review +Then ApprovalExpired event is recorded +And action status becomes "expired" +``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-010-custom-timeout-per-action-type.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-010-custom-timeout-per-action-type.sdp.md index b98f022e..daf1ea02 100644 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-010-custom-timeout-per-action-type.sdp.md +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-010-custom-timeout-per-action-type.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Custom timeout per action type" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature +- outcome: Executable scenario: Custom timeout per action type + +```gwt +Given the agent module is imported from platform-core +And the human-in-loop configuration is available +And AccountSuspension timeout is 1 hour +And LowRiskNotification timeout is 7 days +When both are flagged for review +Then each uses its configured timeout +``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-011-approve-action-near-timeout.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-011-approve-action-near-timeout.sdp.md index 54c32a69..0dbc6778 100644 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-011-approve-action-near-timeout.sdp.md +++ b/specs/behavior/platform-core/agent/human-in-loop.examples/s-011-approve-action-near-timeout.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Approve action near timeout" from packages/platform-core/tests/features/behavior/agent/human-in-loop.feature +- outcome: Executable scenario: Approve action near timeout + +```gwt +Given the agent module is imported from platform-core +And the human-in-loop configuration is available +And an action 23 hours old +And timeout is 24 hours +When reviewer approves at 23h 59m +Then approval succeeds +And command is executed +``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.sdp.md index 2af216b9..a41dd3d4 100644 --- a/specs/behavior/platform-core/agent/human-in-loop.sdp.md +++ b/specs/behavior/platform-core/agent/human-in-loop.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: configurable human-in-loop controls so that agent actions can be reviewed when appropriate (test carrier: packages/platform-core/tests/features/behavior/agent/human-in-loop.feature) +- actor: a platform developer +- outcome: configurable human-in-loop controls so that agent actions can be reviewed when appropriate + +## Behavior + +- rule: Confidence threshold determines execution mode +- rule: Some actions always require approval +- rule: Flagged actions create review tasks +- rule: Pending actions expire after timeout diff --git a/specs/behavior/platform-core/agent/init.examples/s-001-rejects-empty-string-id.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-001-rejects-empty-string-id.sdp.md index 8007879a..5a45f330 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-001-rejects-empty-string-id.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-001-rejects-empty-string-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects empty string id" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Rejects empty string id + +```gwt +Given a valid agent config with id overridden to "" +When I validate the agent config +Then the validation result is invalid with code "AGENT_ID_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-002-rejects-undefined-id.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-002-rejects-undefined-id.sdp.md index c010ad57..9456cf76 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-002-rejects-undefined-id.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-002-rejects-undefined-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects undefined id" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Rejects undefined id + +```gwt +Given a valid agent config with id deleted +When I validate the agent config +Then the validation result is invalid with code "AGENT_ID_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-003-rejects-whitespace-only-id.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-003-rejects-whitespace-only-id.sdp.md index fca8e1d3..3dd6450a 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-003-rejects-whitespace-only-id.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-003-rejects-whitespace-only-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects whitespace-only id" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Rejects whitespace-only id + +```gwt +Given a valid agent config with id overridden to " " +When I validate the agent config +Then the validation result is invalid with code "AGENT_ID_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-004-rejects-empty-subscriptions-array.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-004-rejects-empty-subscriptions-array.sdp.md index 9284b8bd..0d1410d1 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-004-rejects-empty-subscriptions-array.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-004-rejects-empty-subscriptions-array.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects empty subscriptions array" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Rejects empty subscriptions array + +```gwt +Given a valid agent config with subscriptions overridden to empty array +When I validate the agent config +Then the validation result is invalid with code "NO_SUBSCRIPTIONS" +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-005-rejects-undefined-subscriptions.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-005-rejects-undefined-subscriptions.sdp.md index 31656186..2b256b3a 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-005-rejects-undefined-subscriptions.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-005-rejects-undefined-subscriptions.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects undefined subscriptions" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Rejects undefined subscriptions + +```gwt +Given a valid agent config with subscriptions deleted +When I validate the agent config +Then the validation result is invalid with code "NO_SUBSCRIPTIONS" +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-006-rejects-negative-threshold.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-006-rejects-negative-threshold.sdp.md index 997f648d..d5ccf323 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-006-rejects-negative-threshold.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-006-rejects-negative-threshold.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects negative threshold" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Rejects negative threshold + +```gwt +Given a valid agent config with confidenceThreshold overridden to -0.1 +When I validate the agent config +Then the validation result is invalid with code "INVALID_CONFIDENCE_THRESHOLD" +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-007-rejects-threshold-greater-than-1.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-007-rejects-threshold-greater-than-1.sdp.md index 3d697c49..36672f43 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-007-rejects-threshold-greater-than-1.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-007-rejects-threshold-greater-than-1.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects threshold greater than 1" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Rejects threshold greater than 1 + +```gwt +Given a valid agent config with confidenceThreshold overridden to 1.5 +When I validate the agent config +Then the validation result is invalid with code "INVALID_CONFIDENCE_THRESHOLD" +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-008-rejects-empty-pattern-window-duration.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-008-rejects-empty-pattern-window-duration.sdp.md index cf9f68cb..04b77819 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-008-rejects-empty-pattern-window-duration.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-008-rejects-empty-pattern-window-duration.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects empty pattern window duration" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Rejects empty pattern window duration + +```gwt +Given a valid agent config with patternWindow duration overridden to "" +When I validate the agent config +Then the validation result is invalid with code "INVALID_PATTERN_WINDOW" +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-009-rejects-whitespace-only-pattern-window-duration.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-009-rejects-whitespace-only-pattern-window-duration.sdp.md index 3f6c8d74..7111ffed 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-009-rejects-whitespace-only-pattern-window-duration.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-009-rejects-whitespace-only-pattern-window-duration.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects whitespace-only pattern window duration" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Rejects whitespace-only pattern window duration + +```gwt +Given a valid agent config with patternWindow duration overridden to " " +When I validate the agent config +Then the validation result is invalid with code "INVALID_PATTERN_WINDOW" +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-010-rejects-action-in-both-requires-approval-and-auto-approve.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-010-rejects-action-in-both-requires-approval-and-auto-approve.sdp.md index abb35804..070bd9e3 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-010-rejects-action-in-both-requires-approval-and-auto-approve.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-010-rejects-action-in-both-requires-approval-and-auto-approve.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects action in both requiresApproval and autoApprove" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Rejects action in both requiresApproval and autoApprove + +```gwt +Given a valid agent config with conflicting approval rules for "DeleteCustomer" +When I validate the agent config +Then the validation result is invalid with code "CONFLICTING_APPROVAL_RULES" +And the validation error message contains "DeleteCustomer" +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-011-rejects-config-with-no-patterns-array.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-011-rejects-config-with-no-patterns-array.sdp.md index 5a70e57f..f669cb4f 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-011-rejects-config-with-no-patterns-array.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-011-rejects-config-with-no-patterns-array.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects config with no patterns array" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Rejects config with no patterns array + +```gwt +Given a valid agent config with patterns deleted +When I validate the agent config +Then the validation result is invalid with code "NO_PATTERNS" +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-012-rejects-config-with-empty-patterns-array.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-012-rejects-config-with-empty-patterns-array.sdp.md index b84f4938..d14429b6 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-012-rejects-config-with-empty-patterns-array.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-012-rejects-config-with-empty-patterns-array.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects config with empty patterns array" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Rejects config with empty patterns array + +```gwt +Given a valid agent config with patterns overridden to empty array +When I validate the agent config +Then the validation result is invalid with code "NO_PATTERNS" +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-013-accepts-valid-config-with-patterns.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-013-accepts-valid-config-with-patterns.sdp.md index baf5b3aa..c16577ea 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-013-accepts-valid-config-with-patterns.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-013-accepts-valid-config-with-patterns.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts valid config with patterns" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Accepts valid config with patterns + +```gwt +Given a valid agent config with default values +When I validate the agent config +Then the validation result is valid +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-014-accepts-config-without-confidence-threshold.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-014-accepts-config-without-confidence-threshold.sdp.md index 1f2c5b0f..4acc020e 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-014-accepts-config-without-confidence-threshold.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-014-accepts-config-without-confidence-threshold.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts config without confidenceThreshold" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Accepts config without confidenceThreshold + +```gwt +Given a valid agent config with confidenceThreshold deleted +When I validate the agent config +Then the validation result is valid +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-015-transforms-a-standard-event-correctly.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-015-transforms-a-standard-event-correctly.sdp.md index ea4c91c4..352decee 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-015-transforms-a-standard-event-correctly.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-015-transforms-a-standard-event-correctly.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Transforms a standard event correctly" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Transforms a standard event correctly + +```gwt +Given a standard published event and correlation chain +When I transform to agent handler args with agentId "my-agent" +Then the handler args contain the expected fields: +And the handler args payload matches the event payload +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-016-wraps-array-payload-in-raw-wrapper.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-016-wraps-array-payload-in-raw-wrapper.sdp.md index 60af0911..d2de2ff8 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-016-wraps-array-payload-in-raw-wrapper.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-016-wraps-array-payload-in-raw-wrapper.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Wraps array payload in _raw wrapper" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Wraps array payload in _raw wrapper + +```gwt +Given a published event with array payload +When I transform to agent handler args with agentId "agent-1" +Then the handler args payload equals raw-wrapped array +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-017-wraps-null-payload-in-raw-wrapper.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-017-wraps-null-payload-in-raw-wrapper.sdp.md index f2c6ddaf..a399eac3 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-017-wraps-null-payload-in-raw-wrapper.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-017-wraps-null-payload-in-raw-wrapper.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Wraps null payload in _raw wrapper" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Wraps null payload in _raw wrapper + +```gwt +Given a published event with null payload +When I transform to agent handler args with agentId "agent-1" +Then the handler args payload equals raw-wrapped null +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-018-passes-through-object-payloads-without-wrapping.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-018-passes-through-object-payloads-without-wrapping.sdp.md index eeebf114..3be41fd0 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-018-passes-through-object-payloads-without-wrapping.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-018-passes-through-object-payloads-without-wrapping.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Passes through object payloads without wrapping" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Passes through object payloads without wrapping + +```gwt +Given a published event with nested object payload +When I transform to agent handler args with agentId "agent-1" +Then the handler args payload matches the event payload +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-019-uses-correlation-id-from-the-chain-not-from-the-event.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-019-uses-correlation-id-from-the-chain-not-from-the-event.sdp.md index aa9c4bae..766edf57 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-019-uses-correlation-id-from-the-chain-not-from-the-event.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-019-uses-correlation-id-from-the-chain-not-from-the-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Uses correlationId from the chain not from the event" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Uses correlationId from the chain not from the event + +```gwt +Given a published event with its own correlationId "event_corr" +When I transform to agent handler args with agentId "agent-1" +Then the handler args correlationId is "corr_chain_001" +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-020-subscription-id-starts-with-sub-prefix.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-020-subscription-id-starts-with-sub-prefix.sdp.md index 4863de37..0c531185 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-020-subscription-id-starts-with-sub-prefix.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-020-subscription-id-starts-with-sub-prefix.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Subscription ID starts with sub_ prefix" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Subscription ID starts with sub_ prefix + +```gwt +Given the system time is fixed at "2024-01-15T12:00:00Z" +When I generate a subscription ID for "my-agent" +Then the subscription ID starts with "sub_" +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-021-subscription-id-contains-the-agent-id.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-021-subscription-id-contains-the-agent-id.sdp.md index 740eea7d..415fe4dd 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-021-subscription-id-contains-the-agent-id.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-021-subscription-id-contains-the-agent-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Subscription ID contains the agentId" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Subscription ID contains the agentId + +```gwt +Given the system time is fixed at "2024-01-15T12:00:00Z" +When I generate a subscription ID for "churn-risk-agent" +Then the subscription ID contains "churn-risk-agent" +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-022-subscription-id-contains-a-uuid-segment.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-022-subscription-id-contains-a-uuid-segment.sdp.md index 79255477..1f20c20d 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-022-subscription-id-contains-a-uuid-segment.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-022-subscription-id-contains-a-uuid-segment.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Subscription ID contains a UUID segment" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Subscription ID contains a UUID segment + +```gwt +Given the system time is fixed at "2024-01-15T12:00:00Z" +When I generate a subscription ID for "my-agent" +Then the subscription ID contains a UUIDv7 suffix +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-023-produces-different-i-ds-when-timestamp-differs.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-023-produces-different-i-ds-when-timestamp-differs.sdp.md index 0ab9d642..839c173d 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-023-produces-different-i-ds-when-timestamp-differs.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-023-produces-different-i-ds-when-timestamp-differs.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Produces different IDs when timestamp differs" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Produces different IDs when timestamp differs + +```gwt +Given the system time is fixed at "2024-01-15T12:00:00Z" +When I generate two subscription IDs for "my-agent" with 1ms between them +Then the two subscription IDs are different +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-024-returns-success-with-handle-for-a-valid-config.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-024-returns-success-with-handle-for-a-valid-config.sdp.md index 092a6107..95b55efc 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-024-returns-success-with-handle-for-a-valid-config.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-024-returns-success-with-handle-for-a-valid-config.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns success with handle for a valid config" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Returns success with handle for a valid config + +```gwt +Given a valid agent BC config with id "test-agent" +And mock eventBus and handler dependencies +When I initialize the agent BC +Then the initialization is successful +And the handle has the expected properties: +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-025-returns-error-with-invalid-config-code-for-invalid-config.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-025-returns-error-with-invalid-config-code-for-invalid-config.sdp.md index 197284f8..5d1b8704 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-025-returns-error-with-invalid-config-code-for-invalid-config.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-025-returns-error-with-invalid-config-code-for-invalid-config.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns error with INVALID_CONFIG code for invalid config" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Returns error with INVALID_CONFIG code for invalid config + +```gwt +Given a valid agent BC config with id "" +And mock eventBus and handler dependencies +When I initialize the agent BC +Then the initialization failed with code "INVALID_CONFIG" +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-026-uses-existing-checkpoint-when-provided.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-026-uses-existing-checkpoint-when-provided.sdp.md index 81a23fed..e06c2796 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-026-uses-existing-checkpoint-when-provided.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-026-uses-existing-checkpoint-when-provided.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Uses existing checkpoint when provided" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Uses existing checkpoint when provided + +```gwt +Given a valid agent BC config with id "test-agent" +And mock eventBus and handler dependencies +And an existing checkpoint with lastProcessedPosition 200 +When I initialize the agent BC with the existing checkpoint +Then the initialization is successful +And the handle checkpoint has lastProcessedPosition 200 +And the handle checkpoint has status "active" +``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-027-creates-a-new-checkpoint-when-no-existing-checkpoint-provided.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-027-creates-a-new-checkpoint-when-no-existing-checkpoint-provided.sdp.md index 2a6070b6..d066025b 100644 --- a/specs/behavior/platform-core/agent/init.examples/s-027-creates-a-new-checkpoint-when-no-existing-checkpoint-provided.sdp.md +++ b/specs/behavior/platform-core/agent/init.examples/s-027-creates-a-new-checkpoint-when-no-existing-checkpoint-provided.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Creates a new checkpoint when no existing checkpoint provided" from packages/platform-core/tests/features/behavior/agent/init.feature +- outcome: Executable scenario: Creates a new checkpoint when no existing checkpoint provided + +```gwt +Given a valid agent BC config with id "fresh-agent" +And mock eventBus and handler dependencies +When I initialize the agent BC +Then the initialization is successful +And the handle checkpoint has agentId "fresh-agent" +And the handle checkpoint has lastProcessedPosition -1 +And the handle checkpoint has eventsProcessed 0 +And the handle checkpoint has status "active" +``` diff --git a/specs/behavior/platform-core/agent/init.sdp.md b/specs/behavior/platform-core/agent/init.sdp.md index de096f10..20c88f4e 100644 --- a/specs/behavior/platform-core/agent/init.sdp.md +++ b/specs/behavior/platform-core/agent/init.sdp.md @@ -10,4 +10,20 @@ relations: ## Intent -- outcome: Pure functions for agent initialization and configuration: validateAgentBCConfig (field validation, error codes), toAgentHandlerArgs (event + correlation chain transformation), generateSubscriptionId (deterministic ID generation), (test carrier: packages/platform-core/tests/features/behavior/agent/init.feature) +- outcome: Agent Initialization + +## Behavior + +- rule: validateAgentBCConfig rejects invalid agent ID +- rule: validateAgentBCConfig rejects missing subscriptions +- rule: validateAgentBCConfig rejects invalid confidence threshold +- rule: validateAgentBCConfig rejects invalid pattern window +- rule: validateAgentBCConfig rejects conflicting approval rules +- rule: validateAgentBCConfig rejects missing patterns +- rule: validateAgentBCConfig accepts valid configurations +- rule: toAgentHandlerArgs transforms event and correlation chain +- rule: generateSubscriptionId produces deterministic agent-scoped IDs +- rule: initializeAgentBC returns success handle for valid config +- rule: initializeAgentBC returns error for invalid config +- rule: initializeAgentBC uses existing checkpoint when provided +- rule: initializeAgentBC creates new checkpoint when none provided diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-001-start-agent-command-carries-type-and-required-fields.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-001-start-agent-command-carries-type-and-required-fields.sdp.md index 3fae5685..ac9ed339 100644 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-001-start-agent-command-carries-type-and-required-fields.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-001-start-agent-command-carries-type-and-required-fields.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "StartAgentCommand carries type and required fields" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature +- outcome: Executable scenario: StartAgentCommand carries type and required fields + +```gwt +Given a StartAgentCommand with commandId "cmd-001" agentId "agent-001" correlationId "corr-001" +When the scenario runs +Then the command has the following properties: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-002-pause-agent-command-carries-optional-reason-when-provided.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-002-pause-agent-command-carries-optional-reason-when-provided.sdp.md index 2e4c430e..b589ee97 100644 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-002-pause-agent-command-carries-optional-reason-when-provided.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-002-pause-agent-command-carries-optional-reason-when-provided.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "PauseAgentCommand carries optional reason when provided" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature +- outcome: Executable scenario: PauseAgentCommand carries optional reason when provided + +```gwt +Given a PauseAgentCommand with commandId "cmd-002" agentId "agent-001" correlationId "corr-002" reason "maintenance window" +When the scenario runs +Then the command type is "PauseAgent" +And the command reason is "maintenance window" +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-003-pause-agent-command-has-undefined-reason-when-omitted.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-003-pause-agent-command-has-undefined-reason-when-omitted.sdp.md index 86718458..11e028cc 100644 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-003-pause-agent-command-has-undefined-reason-when-omitted.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-003-pause-agent-command-has-undefined-reason-when-omitted.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "PauseAgentCommand has undefined reason when omitted" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature +- outcome: Executable scenario: PauseAgentCommand has undefined reason when omitted + +```gwt +Given a PauseAgentCommand with commandId "cmd-003" agentId "agent-001" correlationId "corr-003" and no reason +When the scenario runs +Then the command reason is undefined +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-004-resume-agent-command-carries-correct-type.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-004-resume-agent-command-carries-correct-type.sdp.md index 7a315c39..35b63477 100644 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-004-resume-agent-command-carries-correct-type.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-004-resume-agent-command-carries-correct-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "ResumeAgentCommand carries correct type" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature +- outcome: Executable scenario: ResumeAgentCommand carries correct type + +```gwt +Given a ResumeAgentCommand with commandId "cmd-004" agentId "agent-001" correlationId "corr-004" +When the scenario runs +Then the command type is "ResumeAgent" +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-005-stop-agent-command-carries-optional-reason-when-provided.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-005-stop-agent-command-carries-optional-reason-when-provided.sdp.md index cfdb6779..84052736 100644 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-005-stop-agent-command-carries-optional-reason-when-provided.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-005-stop-agent-command-carries-optional-reason-when-provided.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "StopAgentCommand carries optional reason when provided" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature +- outcome: Executable scenario: StopAgentCommand carries optional reason when provided + +```gwt +Given a StopAgentCommand with commandId "cmd-005" agentId "agent-001" correlationId "corr-005" reason "budget exceeded" +When the scenario runs +Then the command type is "StopAgent" +And the command reason is "budget exceeded" +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-006-reconfigure-agent-command-carries-config-overrides-with-nested-fields.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-006-reconfigure-agent-command-carries-config-overrides-with-nested-fields.sdp.md index 27bc7438..6181e2e0 100644 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-006-reconfigure-agent-command-carries-config-overrides-with-nested-fields.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-006-reconfigure-agent-command-carries-config-overrides-with-nested-fields.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "ReconfigureAgentCommand carries configOverrides with nested fields" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature +- outcome: Executable scenario: ReconfigureAgentCommand carries configOverrides with nested fields + +```gwt +Given a ReconfigureAgentCommand with config overrides +When the scenario runs +Then the command type is "ReconfigureAgent" +And the config overrides have the following properties: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-007-discriminated-union-narrows-by-type-field-at-runtime.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-007-discriminated-union-narrows-by-type-field-at-runtime.sdp.md index 484ef1ba..68fb8d28 100644 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-007-discriminated-union-narrows-by-type-field-at-runtime.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-007-discriminated-union-narrows-by-type-field-at-runtime.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Discriminated union narrows by type field at runtime" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature +- outcome: Executable scenario: Discriminated union narrows by type field at runtime + +```gwt +Given an AgentLifecycleCommand of type PauseAgent with reason "test" +When the scenario runs +Then narrowing by type "PauseAgent" yields reason "test" +And narrowing by type "ReconfigureAgent" does not execute +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-008-all-fields-are-optional-in-agent-config-overrides.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-008-all-fields-are-optional-in-agent-config-overrides.sdp.md index 4da9eb3f..3fb48623 100644 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-008-all-fields-are-optional-in-agent-config-overrides.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-008-all-fields-are-optional-in-agent-config-overrides.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "All fields are optional in AgentConfigOverrides" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature +- outcome: Executable scenario: All fields are optional in AgentConfigOverrides + +```gwt +Given an empty AgentConfigOverrides object +When the scenario runs +Then the overrides have all undefined top-level fields: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-009-partial-rate-limits-with-only-max-requests-per-minute.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-009-partial-rate-limits-with-only-max-requests-per-minute.sdp.md index 6e641e8f..84477d8e 100644 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-009-partial-rate-limits-with-only-max-requests-per-minute.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-009-partial-rate-limits-with-only-max-requests-per-minute.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Partial rateLimits with only maxRequestsPerMinute" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature +- outcome: Executable scenario: Partial rateLimits with only maxRequestsPerMinute + +```gwt +Given an AgentConfigOverrides with only maxRequestsPerMinute 10 +When the scenario runs +Then the overrides rateLimits.maxRequestsPerMinute is 10 +And the overrides rateLimits.maxConcurrent is undefined +And the overrides rateLimits.costBudget is undefined +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-010-nested-cost-budget-overrides-with-only-daily.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-010-nested-cost-budget-overrides-with-only-daily.sdp.md index aec59221..49bb0415 100644 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-010-nested-cost-budget-overrides-with-only-daily.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-010-nested-cost-budget-overrides-with-only-daily.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Nested costBudget overrides with only daily" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature +- outcome: Executable scenario: Nested costBudget overrides with only daily + +```gwt +Given an AgentConfigOverrides with only costBudget daily 25 +When the scenario runs +Then the overrides rateLimits.costBudget.daily is 25 +And the overrides rateLimits.costBudget.alertThreshold is undefined +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-011-error-codes-contain-expected-values-and-count.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-011-error-codes-contain-expected-values-and-count.sdp.md index 43461da1..67c59761 100644 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-011-error-codes-contain-expected-values-and-count.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-011-error-codes-contain-expected-values-and-count.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Error codes contain expected values and count" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature +- outcome: Executable scenario: Error codes contain expected values and count + +```gwt +Given the feature fixture is in place +When the scenario runs +Then the AGENT_LIFECYCLE_ERROR_CODES have the following entries: +And there are exactly 2 error codes +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-012-success-result-carries-state-transition-fields.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-012-success-result-carries-state-transition-fields.sdp.md index 8014ac23..0ba27c3a 100644 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-012-success-result-carries-state-transition-fields.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-012-success-result-carries-state-transition-fields.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Success result carries state transition fields" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature +- outcome: Executable scenario: Success result carries state transition fields + +```gwt +Given a success result with agentId "agent-001" previousState "stopped" newState "active" +When the scenario runs +Then the result has the following properties: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-013-failure-result-with-error-code-carries-message-and-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-013-failure-result-with-error-code-carries-message-and-state.sdp.md index af930471..5376709e 100644 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-013-failure-result-with-error-code-carries-message-and-state.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-013-failure-result-with-error-code-carries-message-and-state.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Failure result with error code carries message and state" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature +- outcome: Executable scenario: Failure result with error code carries message and state + +```gwt +Given a failure result with agentId "agent-001" code "INVALID_LIFECYCLE_TRANSITION" message "Cannot PAUSE from stopped state" currentState "stopped" +When the scenario runs +Then the result success is false +And the failure has the following properties: +And the failure message contains "PAUSE" +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-014-failure-result-without-current-state-for-agent-not-found.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-014-failure-result-without-current-state-for-agent-not-found.sdp.md index a8b03ae3..e1375f75 100644 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-014-failure-result-without-current-state-for-agent-not-found.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-014-failure-result-without-current-state-for-agent-not-found.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Failure result without currentState for agent not found" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature +- outcome: Executable scenario: Failure result without currentState for agent not found + +```gwt +Given a failure result with agentId "nonexistent" code "AGENT_NOT_FOUND" message "Agent not found" and no currentState +When the scenario runs +Then the failure currentState is undefined +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-015-discriminated-union-narrows-to-success-branch.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-015-discriminated-union-narrows-to-success-branch.sdp.md index b79fd5e0..4ef75592 100644 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-015-discriminated-union-narrows-to-success-branch.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-015-discriminated-union-narrows-to-success-branch.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Discriminated union narrows to success branch" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature +- outcome: Executable scenario: Discriminated union narrows to success branch + +```gwt +Given a success result with agentId "agent-001" previousState "active" newState "paused" +When the scenario runs +Then narrowing on success yields previousState "active" and newState "paused" +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-016-discriminated-union-narrows-to-failure-branch.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-016-discriminated-union-narrows-to-failure-branch.sdp.md index 08f9ec63..720d4e4c 100644 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-016-discriminated-union-narrows-to-failure-branch.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-016-discriminated-union-narrows-to-failure-branch.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Discriminated union narrows to failure branch" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature +- outcome: Executable scenario: Discriminated union narrows to failure branch + +```gwt +Given a failure result with agentId "agent-001" code "AGENT_NOT_FOUND" message "Agent not found" and no currentState +When the scenario runs +Then narrowing on failure yields code "AGENT_NOT_FOUND" +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-017-all-lifecycle-validators-are-exported.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-017-all-lifecycle-validators-are-exported.sdp.md index 064d9505..05107566 100644 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-017-all-lifecycle-validators-are-exported.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-017-all-lifecycle-validators-are-exported.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "All lifecycle validators are exported" from packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature +- outcome: Executable scenario: All lifecycle validators are exported + +```gwt +Given the feature fixture is in place +When the scenario runs +Then the following validators are defined: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.sdp.md index ad3d9fe0..260a38af 100644 --- a/specs/behavior/platform-core/agent/lifecycle-commands.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-commands.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Agent lifecycle command types, error codes, result types, and Convex validator exports for the discriminated-union command model. (test carrier: packages/platform-core/tests/features/behavior/agent/lifecycle-commands.feature) +- outcome: Lifecycle Commands + +## Behavior + +- rule: Command types construct with correct discriminated union fields +- rule: AgentConfigOverrides allows partial and nested optional fields +- rule: AGENT_LIFECYCLE_ERROR_CODES defines exactly the expected constants +- rule: Result types construct success and failure variants with discrimination +- rule: Convex validators are exported and defined diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-001-agent-lifecycle-states-contains-all-four-states.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-001-agent-lifecycle-states-contains-all-four-states.sdp.md index 95176849..dd846b3f 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-001-agent-lifecycle-states-contains-all-four-states.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-001-agent-lifecycle-states-contains-all-four-states.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "AGENT_LIFECYCLE_STATES contains all four states" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature +- outcome: Executable scenario: AGENT_LIFECYCLE_STATES contains all four states + +```gwt +Given the feature fixture is in place +When the scenario runs +Then AGENT_LIFECYCLE_STATES equals: +And AGENT_LIFECYCLE_STATES has length 4 +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-002-agent-lifecycle-events-contains-all-seven-events.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-002-agent-lifecycle-events-contains-all-seven-events.sdp.md index 6b829958..d5579675 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-002-agent-lifecycle-events-contains-all-seven-events.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-002-agent-lifecycle-events-contains-all-seven-events.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "AGENT_LIFECYCLE_EVENTS contains all seven events" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature +- outcome: Executable scenario: AGENT_LIFECYCLE_EVENTS contains all seven events + +```gwt +Given the feature fixture is in place +When the scenario runs +Then AGENT_LIFECYCLE_EVENTS equals: +And AGENT_LIFECYCLE_EVENTS has length 7 +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-003-transition-agent-state-returns-correct-target-for-every-valid-transition.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-003-transition-agent-state-returns-correct-target-for-every-valid-transition.sdp.md index 3a3d4aeb..04a6c604 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-003-transition-agent-state-returns-correct-target-for-every-valid-transition.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-003-transition-agent-state-returns-correct-target-for-every-valid-transition.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "transitionAgentState returns correct target for every valid transition" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature +- outcome: Executable scenario: transitionAgentState returns correct target for every valid transition + +```gwt +Given the feature fixture is in place +When the scenario runs +Then transitionAgentState returns the correct target for all valid transitions: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-004-is-valid-agent-transition-returns-true-for-every-valid-pair.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-004-is-valid-agent-transition-returns-true-for-every-valid-pair.sdp.md index d8cefabc..fbd7ac8b 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-004-is-valid-agent-transition-returns-true-for-every-valid-pair.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-004-is-valid-agent-transition-returns-true-for-every-valid-pair.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isValidAgentTransition returns true for every valid pair" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature +- outcome: Executable scenario: isValidAgentTransition returns true for every valid pair + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isValidAgentTransition returns true for all valid pairs: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-005-transition-agent-state-returns-null-for-representative-invalid-pairs.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-005-transition-agent-state-returns-null-for-representative-invalid-pairs.sdp.md index e802f616..4e6b5708 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-005-transition-agent-state-returns-null-for-representative-invalid-pairs.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-005-transition-agent-state-returns-null-for-representative-invalid-pairs.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "transitionAgentState returns null for representative invalid pairs" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature +- outcome: Executable scenario: transitionAgentState returns null for representative invalid pairs + +```gwt +Given the feature fixture is in place +When the scenario runs +Then transitionAgentState returns null for these invalid pairs: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-006-exactly-18-invalid-pairs-exist-and-all-return-false.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-006-exactly-18-invalid-pairs-exist-and-all-return-false.sdp.md index 3ce2089c..367390a9 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-006-exactly-18-invalid-pairs-exist-and-all-return-false.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-006-exactly-18-invalid-pairs-exist-and-all-return-false.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Exactly 18 invalid pairs exist and all return false" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature +- outcome: Executable scenario: Exactly 18 invalid pairs exist and all return false + +```gwt +Given the feature fixture is in place +When the scenario runs +Then there are exactly 18 invalid state-event pairs +And isValidAgentTransition returns false for every invalid pair +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-007-exactly-18-invalid-pairs-return-null-from-transition-agent-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-007-exactly-18-invalid-pairs-return-null-from-transition-agent-state.sdp.md index 98bf564d..5e7641ae 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-007-exactly-18-invalid-pairs-return-null-from-transition-agent-state.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-007-exactly-18-invalid-pairs-return-null-from-transition-agent-state.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Exactly 18 invalid pairs return null from transitionAgentState" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature +- outcome: Executable scenario: Exactly 18 invalid pairs return null from transitionAgentState + +```gwt +Given the feature fixture is in place +When the scenario runs +Then there are exactly 18 invalid state-event pairs for transitionAgentState +And transitionAgentState returns null for every invalid pair +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-008-assert-valid-agent-transition-returns-next-state-for-valid-transitions.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-008-assert-valid-agent-transition-returns-next-state-for-valid-transitions.sdp.md index 8ee0b77f..a41bd230 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-008-assert-valid-agent-transition-returns-next-state-for-valid-transitions.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-008-assert-valid-agent-transition-returns-next-state-for-valid-transitions.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assertValidAgentTransition returns next state for valid transitions" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature +- outcome: Executable scenario: assertValidAgentTransition returns next state for valid transitions + +```gwt +Given the feature fixture is in place +When the scenario runs +Then assertValidAgentTransition returns the correct state for valid inputs: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-009-assert-valid-agent-transition-throws-for-invalid-transition.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-009-assert-valid-agent-transition-throws-for-invalid-transition.sdp.md index ecb18c77..3bddeeb5 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-009-assert-valid-agent-transition-throws-for-invalid-transition.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-009-assert-valid-agent-transition-throws-for-invalid-transition.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assertValidAgentTransition throws for invalid transition" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature +- outcome: Executable scenario: assertValidAgentTransition throws for invalid transition + +```gwt +Given the feature fixture is in place +When the scenario runs +Then assertValidAgentTransition throws for from "stopped" event "PAUSE" agentId "test-agent" +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-010-assert-valid-agent-transition-error-message-includes-details.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-010-assert-valid-agent-transition-error-message-includes-details.sdp.md index 066b66b8..f47f3d83 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-010-assert-valid-agent-transition-error-message-includes-details.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-010-assert-valid-agent-transition-error-message-includes-details.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assertValidAgentTransition error message includes details" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature +- outcome: Executable scenario: assertValidAgentTransition error message includes details + +```gwt +Given the feature fixture is in place +When the scenario runs +Then assertValidAgentTransition error for from "stopped" event "PAUSE" agentId "my-agent" contains: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-011-get-valid-agent-events-from-returns-correct-events-for-stopped.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-011-get-valid-agent-events-from-returns-correct-events-for-stopped.sdp.md index a50ec654..d3e64d9c 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-011-get-valid-agent-events-from-returns-correct-events-for-stopped.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-011-get-valid-agent-events-from-returns-correct-events-for-stopped.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "getValidAgentEventsFrom returns correct events for stopped" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature +- outcome: Executable scenario: getValidAgentEventsFrom returns correct events for stopped + +```gwt +Given the state is "stopped" +When the scenario runs +Then getValidAgentEventsFrom returns: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-012-get-valid-agent-events-from-returns-correct-events-for-active.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-012-get-valid-agent-events-from-returns-correct-events-for-active.sdp.md index 3d789cb8..2eb909c3 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-012-get-valid-agent-events-from-returns-correct-events-for-active.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-012-get-valid-agent-events-from-returns-correct-events-for-active.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "getValidAgentEventsFrom returns correct events for active" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature +- outcome: Executable scenario: getValidAgentEventsFrom returns correct events for active + +```gwt +Given the state is "active" +When the scenario runs +Then getValidAgentEventsFrom returns: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-013-get-valid-agent-events-from-returns-correct-events-for-paused.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-013-get-valid-agent-events-from-returns-correct-events-for-paused.sdp.md index 38b8255e..343a47aa 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-013-get-valid-agent-events-from-returns-correct-events-for-paused.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-013-get-valid-agent-events-from-returns-correct-events-for-paused.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "getValidAgentEventsFrom returns correct events for paused" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature +- outcome: Executable scenario: getValidAgentEventsFrom returns correct events for paused + +```gwt +Given the state is "paused" +When the scenario runs +Then getValidAgentEventsFrom returns: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-014-get-valid-agent-events-from-returns-correct-events-for-error-recovery.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-014-get-valid-agent-events-from-returns-correct-events-for-error-recovery.sdp.md index af3aff4e..b1fa09c9 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-014-get-valid-agent-events-from-returns-correct-events-for-error-recovery.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-014-get-valid-agent-events-from-returns-correct-events-for-error-recovery.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "getValidAgentEventsFrom returns correct events for error_recovery" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature +- outcome: Executable scenario: getValidAgentEventsFrom returns correct events for error_recovery + +```gwt +Given the state is "error_recovery" +When the scenario runs +Then getValidAgentEventsFrom returns: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-015-get-all-agent-transitions-returns-exactly-10-transitions.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-015-get-all-agent-transitions-returns-exactly-10-transitions.sdp.md index eb2990eb..2ab7d7a0 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-015-get-all-agent-transitions-returns-exactly-10-transitions.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-015-get-all-agent-transitions-returns-exactly-10-transitions.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "getAllAgentTransitions returns exactly 10 transitions" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature +- outcome: Executable scenario: getAllAgentTransitions returns exactly 10 transitions + +```gwt +Given the feature fixture is in place +When the scenario runs +Then getAllAgentTransitions returns exactly 10 transitions +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-016-each-transition-has-from-event-and-to-fields.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-016-each-transition-has-from-event-and-to-fields.sdp.md index a0d1606d..747d59e5 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-016-each-transition-has-from-event-and-to-fields.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-016-each-transition-has-from-event-and-to-fields.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Each transition has from event and to fields" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature +- outcome: Executable scenario: Each transition has from event and to fields + +```gwt +Given the feature fixture is in place +When the scenario runs +Then every transition from getAllAgentTransitions has from event and to fields +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-017-get-all-agent-transitions-contains-specific-transitions.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-017-get-all-agent-transitions-contains-specific-transitions.sdp.md index 83940c03..50507792 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-017-get-all-agent-transitions-contains-specific-transitions.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-017-get-all-agent-transitions-contains-specific-transitions.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "getAllAgentTransitions contains specific transitions" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature +- outcome: Executable scenario: getAllAgentTransitions contains specific transitions + +```gwt +Given the feature fixture is in place +When the scenario runs +Then getAllAgentTransitions contains these transitions: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-018-get-all-agent-transitions-returns-same-reference-each-call.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-018-get-all-agent-transitions-returns-same-reference-each-call.sdp.md index 33b1ad69..1868a6bd 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-018-get-all-agent-transitions-returns-same-reference-each-call.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-018-get-all-agent-transitions-returns-same-reference-each-call.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "getAllAgentTransitions returns same reference each call" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature +- outcome: Executable scenario: getAllAgentTransitions returns same reference each call + +```gwt +Given the feature fixture is in place +When the scenario runs +Then getAllAgentTransitions returns the same reference on repeated calls +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-019-is-agent-error-state-returns-correct-classification-for-all-states.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-019-is-agent-error-state-returns-correct-classification-for-all-states.sdp.md index f54a3273..e9054688 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-019-is-agent-error-state-returns-correct-classification-for-all-states.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-019-is-agent-error-state-returns-correct-classification-for-all-states.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isAgentErrorState returns correct classification for all states" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature +- outcome: Executable scenario: isAgentErrorState returns correct classification for all states + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isAgentErrorState returns the correct value for each state: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-020-is-agent-processing-state-returns-correct-classification-for-all-states.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-020-is-agent-processing-state-returns-correct-classification-for-all-states.sdp.md index 92b4e9cb..4b9c589a 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-020-is-agent-processing-state-returns-correct-classification-for-all-states.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-020-is-agent-processing-state-returns-correct-classification-for-all-states.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isAgentProcessingState returns correct classification for all states" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature +- outcome: Executable scenario: isAgentProcessingState returns correct classification for all states + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isAgentProcessingState returns the correct value for each state: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-021-command-to-event-maps-known-commands-and-returns-null-for-unknown.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-021-command-to-event-maps-known-commands-and-returns-null-for-unknown.sdp.md index 1d695386..7bfaafee 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-021-command-to-event-maps-known-commands-and-returns-null-for-unknown.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-021-command-to-event-maps-known-commands-and-returns-null-for-unknown.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "commandToEvent maps known commands and returns null for unknown" from packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature +- outcome: Executable scenario: commandToEvent maps known commands and returns null for unknown + +```gwt +Given the feature fixture is in place +When the scenario runs +Then commandToEvent returns the correct mapping: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.sdp.md index 773e7f72..6b4a87f6 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.sdp.md @@ -10,4 +10,20 @@ relations: ## Intent -- outcome: Pure agent lifecycle state machine with states, events, transitions, classification helpers, and command-to-event mapping. (test carrier: packages/platform-core/tests/features/behavior/agent/lifecycle-fsm.feature) +- outcome: Lifecycle FSM + +## Behavior + +- rule: Lifecycle state constants are well-defined +- rule: Lifecycle event constants are well-defined +- rule: All 10 valid transitions produce the correct target state +- rule: isValidAgentTransition returns true for all valid pairs +- rule: transitionAgentState returns null for invalid transitions +- rule: Exhaustive invalid pair coverage via isValidAgentTransition +- rule: Exhaustive invalid pair coverage via transitionAgentState +- rule: assertValidAgentTransition returns next state or throws +- rule: getValidAgentEventsFrom returns correct events per state +- rule: getAllAgentTransitions returns the complete transition table +- rule: isAgentErrorState classifies states correctly +- rule: isAgentProcessingState classifies states correctly +- rule: commandToEvent maps command types to lifecycle events diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-001-happy-path-stopped-to-active-with-agent-started-audit.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-001-happy-path-stopped-to-active-with-agent-started-audit.sdp.md index 9a112f38..3fc48258 100644 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-001-happy-path-stopped-to-active-with-agent-started-audit.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-001-happy-path-stopped-to-active-with-agent-started-audit.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Happy path - stopped to active with AgentStarted audit" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature +- outcome: Executable scenario: Happy path - stopped to active with AgentStarted audit + +```gwt +Given the module is imported from platform-core +And an agent in "stopped" state with lastProcessedPosition 25 +And a logger is attached +When handleStartAgent is invoked with agentId "test-agent" and correlationId "corr_001" +Then the result is successful with previousState "stopped" and newState "active" +And transitionLifecycle was called with status "active" and audit event type "AgentStarted" +And the AgentStarted audit payload contains: +And the logger info was called with "Agent started" and agentId "test-agent" +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-002-rejects-start-from-active-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-002-rejects-start-from-active-state.sdp.md index c8d440fe..c957c6c3 100644 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-002-rejects-start-from-active-state.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-002-rejects-start-from-active-state.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Rejects START from active state" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature +- outcome: Executable scenario: Rejects START from active state + +```gwt +Given the module is imported from platform-core +And an agent in "active" state +When handleStartAgent is invoked with agentId "test-agent" and correlationId "corr_002" +Then the result is a failure with code INVALID_LIFECYCLE_TRANSITION +And the failure message contains "START" and "active" +And the failure currentState is "active" +And transitionLifecycle was not called +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-003-rejects-start-from-paused-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-003-rejects-start-from-paused-state.sdp.md index 8f16d6de..6c2e295e 100644 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-003-rejects-start-from-paused-state.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-003-rejects-start-from-paused-state.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Rejects START from paused state" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature +- outcome: Executable scenario: Rejects START from paused state + +```gwt +Given the module is imported from platform-core +And an agent in "paused" state +When handleStartAgent is invoked with agentId "test-agent" and correlationId "corr_003" +Then the result is a failure with code INVALID_LIFECYCLE_TRANSITION +And the failure currentState is "paused" +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-004-happy-path-active-to-paused-with-agent-paused-audit-and-reason.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-004-happy-path-active-to-paused-with-agent-paused-audit-and-reason.sdp.md index 34add0df..dd0f4380 100644 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-004-happy-path-active-to-paused-with-agent-paused-audit-and-reason.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-004-happy-path-active-to-paused-with-agent-paused-audit-and-reason.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Happy path - active to paused with AgentPaused audit and reason" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature +- outcome: Executable scenario: Happy path - active to paused with AgentPaused audit and reason + +```gwt +Given the module is imported from platform-core +And an agent in "active" state with lastProcessedPosition 50 and eventsProcessed 20 +And a logger is attached +When handlePauseAgent is invoked with agentId "test-agent" correlationId "corr_010" and reason "Maintenance window" +Then the result is successful with previousState "active" and newState "paused" +And transitionLifecycle was called with status "paused" and audit event type "AgentPaused" +And the AgentPaused audit payload contains: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-005-rejects-pause-from-stopped-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-005-rejects-pause-from-stopped-state.sdp.md index 679fd401..53ad4104 100644 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-005-rejects-pause-from-stopped-state.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-005-rejects-pause-from-stopped-state.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Rejects PAUSE from stopped state" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature +- outcome: Executable scenario: Rejects PAUSE from stopped state + +```gwt +Given the module is imported from platform-core +And an agent in "stopped" state +When handlePauseAgent is invoked with agentId "test-agent" and correlationId "corr_011" +Then the result is a failure with code INVALID_LIFECYCLE_TRANSITION +And the failure message contains "PAUSE" and "stopped" +And the failure currentState is "stopped" +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-006-happy-path-paused-to-active-with-agent-resumed-audit.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-006-happy-path-paused-to-active-with-agent-resumed-audit.sdp.md index 28b06aa7..c6bd927a 100644 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-006-happy-path-paused-to-active-with-agent-resumed-audit.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-006-happy-path-paused-to-active-with-agent-resumed-audit.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Happy path - paused to active with AgentResumed audit" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature +- outcome: Executable scenario: Happy path - paused to active with AgentResumed audit + +```gwt +Given the module is imported from platform-core +And an agent in "paused" state with lastProcessedPosition 75 +And a logger is attached +When handleResumeAgent is invoked with agentId "test-agent" and correlationId "corr_020" +Then the result is successful with previousState "paused" and newState "active" +And transitionLifecycle was called with status "active" and audit event type "AgentResumed" +And the AgentResumed audit payload contains: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-007-rejects-resume-from-stopped-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-007-rejects-resume-from-stopped-state.sdp.md index 1e1919a8..0a57a1d0 100644 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-007-rejects-resume-from-stopped-state.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-007-rejects-resume-from-stopped-state.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Rejects RESUME from stopped state" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature +- outcome: Executable scenario: Rejects RESUME from stopped state + +```gwt +Given the module is imported from platform-core +And an agent in "stopped" state +When handleResumeAgent is invoked with agentId "test-agent" and correlationId "corr_021" +Then the result is a failure with code INVALID_LIFECYCLE_TRANSITION +And the failure message contains "RESUME" and "stopped" +And the failure currentState is "stopped" +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-008-happy-path-active-to-stopped-with-agent-stopped-audit.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-008-happy-path-active-to-stopped-with-agent-stopped-audit.sdp.md index 30c4f484..f653cb05 100644 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-008-happy-path-active-to-stopped-with-agent-stopped-audit.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-008-happy-path-active-to-stopped-with-agent-stopped-audit.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Happy path - active to stopped with AgentStopped audit" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature +- outcome: Executable scenario: Happy path - active to stopped with AgentStopped audit + +```gwt +Given the module is imported from platform-core +And an agent in "active" state with lastProcessedPosition 100 +And a logger is attached +When handleStopAgent is invoked with agentId "test-agent" correlationId "corr_030" and reason "Decommissioning" +Then the result is successful with previousState "active" and newState "stopped" +And transitionLifecycle was called with status "stopped" and audit event type "AgentStopped" +And the AgentStopped audit payload contains: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-009-happy-path-paused-to-stopped-as-universal-escape-hatch.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-009-happy-path-paused-to-stopped-as-universal-escape-hatch.sdp.md index 4bd6e4b0..bb49e12f 100644 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-009-happy-path-paused-to-stopped-as-universal-escape-hatch.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-009-happy-path-paused-to-stopped-as-universal-escape-hatch.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Happy path - paused to stopped as universal escape hatch" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature +- outcome: Executable scenario: Happy path - paused to stopped as universal escape hatch + +```gwt +Given the module is imported from platform-core +And an agent in "paused" state with lastProcessedPosition 60 +When handleStopAgent is invoked with agentId "test-agent" and correlationId "corr_031" +Then the result is successful with previousState "paused" and newState "stopped" +And the AgentStopped audit payload has previousState "paused" and stoppedAtPosition 60 +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-010-happy-path-error-recovery-to-stopped.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-010-happy-path-error-recovery-to-stopped.sdp.md index 49c1d0bd..f4625b36 100644 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-010-happy-path-error-recovery-to-stopped.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-010-happy-path-error-recovery-to-stopped.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Happy path - error_recovery to stopped" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature +- outcome: Executable scenario: Happy path - error_recovery to stopped + +```gwt +Given the module is imported from platform-core +And an agent in "error_recovery" state with lastProcessedPosition 88 +When handleStopAgent is invoked with agentId "test-agent" and correlationId "corr_032" +Then the result is successful with previousState "error_recovery" and newState "stopped" +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-011-rejects-stop-from-already-stopped-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-011-rejects-stop-from-already-stopped-state.sdp.md index c8979efa..e82d1cbb 100644 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-011-rejects-stop-from-already-stopped-state.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-011-rejects-stop-from-already-stopped-state.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Rejects STOP from already stopped state" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature +- outcome: Executable scenario: Rejects STOP from already stopped state + +```gwt +Given the module is imported from platform-core +And an agent in "stopped" state +When handleStopAgent is invoked with agentId "test-agent" and correlationId "corr_033" +Then the result is a failure with code INVALID_LIFECYCLE_TRANSITION +And the failure message contains "STOP" and "stopped" +And the failure currentState is "stopped" +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-012-reconfigures-active-agent-with-merged-overrides.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-012-reconfigures-active-agent-with-merged-overrides.sdp.md index 669915e1..21b0b1df 100644 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-012-reconfigures-active-agent-with-merged-overrides.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-012-reconfigures-active-agent-with-merged-overrides.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Reconfigures active agent with merged overrides" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature +- outcome: Executable scenario: Reconfigures active agent with merged overrides + +```gwt +Given the module is imported from platform-core +And an agent in "active" state with existing config overrides +And a logger is attached +When handleReconfigureAgent is invoked with agentId "test-agent" correlationId "corr_040" and new overrides +Then the result is successful with previousState "active" and newState "active" +And patchConfigOverrides was called with merged overrides +And the AgentReconfigured audit payload contains previous and new overrides +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-013-reconfigures-paused-agent-transitioning-to-active.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-013-reconfigures-paused-agent-transitioning-to-active.sdp.md index d2bd6ba9..0eceb58e 100644 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-013-reconfigures-paused-agent-transitioning-to-active.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-013-reconfigures-paused-agent-transitioning-to-active.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Reconfigures paused agent transitioning to active" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature +- outcome: Executable scenario: Reconfigures paused agent transitioning to active + +```gwt +Given the module is imported from platform-core +And an agent in "paused" state with no config overrides +When handleReconfigureAgent is invoked with agentId "test-agent" correlationId "corr_041" and paused overrides +Then the result is successful with previousState "paused" and newState "active" +And patchConfigOverrides was called with paused agent overrides +And transitionLifecycle was called with status "active" for paused reconfigure +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-014-rejects-reconfigure-from-stopped-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-014-rejects-reconfigure-from-stopped-state.sdp.md index ae015f7a..da1016a3 100644 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-014-rejects-reconfigure-from-stopped-state.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-014-rejects-reconfigure-from-stopped-state.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Rejects RECONFIGURE from stopped state" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature +- outcome: Executable scenario: Rejects RECONFIGURE from stopped state + +```gwt +Given the module is imported from platform-core +And an agent in "stopped" state +When handleReconfigureAgent is invoked with agentId "test-agent" correlationId "corr_042" and overrides +Then the result is a failure with code INVALID_LIFECYCLE_TRANSITION +And the failure message contains "RECONFIGURE" and "stopped" +And the failure currentState is "stopped" +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-015-handles-first-time-config-overrides-when-checkpoint-has-none.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-015-handles-first-time-config-overrides-when-checkpoint-has-none.sdp.md index 0cd37fe1..2a965903 100644 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-015-handles-first-time-config-overrides-when-checkpoint-has-none.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-015-handles-first-time-config-overrides-when-checkpoint-has-none.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Handles first-time config overrides when checkpoint has none" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature +- outcome: Executable scenario: Handles first-time config overrides when checkpoint has none + +```gwt +Given the module is imported from platform-core +And an agent in "active" state with no existing config overrides +When handleReconfigureAgent is invoked with agentId "test-agent" correlationId "corr_043" and first-time overrides +Then the result is successful +And patchConfigOverrides was called with first-time overrides only +And the AgentReconfigured audit payload has undefined previousOverrides +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-016-factory-returns-all-5-handler-functions.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-016-factory-returns-all-5-handler-functions.sdp.md index 67a06015..9b4cf533 100644 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-016-factory-returns-all-5-handler-functions.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-016-factory-returns-all-5-handler-functions.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Factory returns all 5 handler functions" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature +- outcome: Executable scenario: Factory returns all 5 handler functions + +```gwt +Given the module is imported from platform-core +When createLifecycleHandlers is invoked with a mock component +Then the result contains all handler functions: +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-017-factory-handlers-complete-a-start-pause-stop-round-trip.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-017-factory-handlers-complete-a-start-pause-stop-round-trip.sdp.md index a94e12d7..ebbfecb6 100644 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-017-factory-handlers-complete-a-start-pause-stop-round-trip.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-017-factory-handlers-complete-a-start-pause-stop-round-trip.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Factory handlers complete a start-pause-stop round trip" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature +- outcome: Executable scenario: Factory handlers complete a start-pause-stop round trip + +```gwt +Given the module is imported from platform-core +When a round-trip lifecycle sequence is executed via factory handlers +Then all three operations succeed +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-018-uses-no-op-logger-when-none-provided.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-018-uses-no-op-logger-when-none-provided.sdp.md index 321e4819..039243e0 100644 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-018-uses-no-op-logger-when-none-provided.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-018-uses-no-op-logger-when-none-provided.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Uses no-op logger when none provided" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature +- outcome: Executable scenario: Uses no-op logger when none provided + +```gwt +Given the module is imported from platform-core +And an agent in "stopped" state +When handleStartAgent is invoked without a logger with agentId "test-agent" and correlationId "corr_200" +Then the result is successful +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-019-logs-warning-on-invalid-transition.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-019-logs-warning-on-invalid-transition.sdp.md index 27905216..c337de72 100644 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-019-logs-warning-on-invalid-transition.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-019-logs-warning-on-invalid-transition.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Logs warning on invalid transition" from packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature +- outcome: Executable scenario: Logs warning on invalid transition + +```gwt +Given the module is imported from platform-core +And an agent in "active" state +And a logger is attached +When handleStartAgent is invoked with logger with agentId "test-agent" and correlationId "corr_201" +Then the logger warn was called with "Invalid lifecycle transition" and command "StartAgent" and currentState "active" +``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.sdp.md index 34d7653b..fdb8c0e4 100644 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Agent lifecycle handler functions and the createLifecycleHandlers factory. Each handler loads the checkpoint, validates the FSM transition via a pure decider, and atomically writes the new status plus an audit event. (test carrier: packages/platform-core/tests/features/behavior/agent/lifecycle-handlers.feature) +- outcome: Lifecycle Handlers + +## Behavior + +- rule: handleStartAgent transitions stopped to active with AgentStarted audit +- rule: handlePauseAgent transitions active to paused with AgentPaused audit +- rule: handleResumeAgent transitions paused to active with AgentResumed audit +- rule: handleStopAgent transitions active, paused, or error_recovery to stopped with AgentStopped audit +- rule: handleReconfigureAgent patches config overrides and transitions to active +- rule: createLifecycleHandlers factory returns all 5 handler functions +- rule: Lifecycle handlers use logger correctly diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-001-returns-immediately-without-calling-any-mutations.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-001-returns-immediately-without-calling-any-mutations.sdp.md index fc5f5c1b..9b5d8868 100644 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-001-returns-immediately-without-calling-any-mutations.sdp.md +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-001-returns-immediately-without-calling-any-mutations.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns immediately without calling any mutations" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature +- outcome: Executable scenario: Returns immediately without calling any mutations + +```gwt +Given the module is imported from platform-core +And a handler with default config +And args with a canceled result +When the handler is invoked +Then runMutation is not called +``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-002-records-dead-letter-and-audit-event-but-does-not-advance-checkpoint.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-002-records-dead-letter-and-audit-event-but-does-not-advance-checkpoint.sdp.md index a921782a..2917bb49 100644 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-002-records-dead-letter-and-audit-event-but-does-not-advance-checkpoint.sdp.md +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-002-records-dead-letter-and-audit-event-but-does-not-advance-checkpoint.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Records dead letter and audit event but does not advance checkpoint" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature +- outcome: Executable scenario: Records dead letter and audit event but does not advance checkpoint + +```gwt +Given the module is imported from platform-core +And a handler with default config +And args with a failed result with error "LLM timeout after 30s" +When the handler is invoked +Then the dead letter is recorded with fields: +And the audit is recorded with eventType "AgentAnalysisFailed" and agentId "test-agent" +And the checkpoint update is not called +And the checkpoint loadOrCreate is not called +``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-003-advances-checkpoint-when-return-value-is-null.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-003-advances-checkpoint-when-return-value-is-null.sdp.md index 1696ae89..a40a941f 100644 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-003-advances-checkpoint-when-return-value-is-null.sdp.md +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-003-advances-checkpoint-when-return-value-is-null.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "Advances checkpoint when returnValue is null" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature +- outcome: Executable scenario: Advances checkpoint when returnValue is null + +```gwt +Given the module is imported from platform-core +And a handler with default config +And args with a success result with null returnValue +When the handler is invoked +Then the checkpoint loadOrCreate is called +And the checkpoint update is called +And the audit record is not called +And the commands record is not called +And the approvals create is not called +``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-004-persists-in-correct-order-when-requires-approval-is-true.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-004-persists-in-correct-order-when-requires-approval-is-true.sdp.md index b5903acb..7978e62d 100644 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-004-persists-in-correct-order-when-requires-approval-is-true.sdp.md +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-004-persists-in-correct-order-when-requires-approval-is-true.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Persists in correct order when requiresApproval is true" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature +- outcome: Executable scenario: Persists in correct order when requiresApproval is true + +```gwt +Given the module is imported from platform-core +And a handler with default config and fake timers at "2024-01-15T12:00:00Z" +And args with a success result containing a decision with requiresApproval true +When the handler is invoked +Then the persistence order is: +``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-005-updates-checkpoint-with-correct-args.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-005-updates-checkpoint-with-correct-args.sdp.md index 89cd483e..972f00a8 100644 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-005-updates-checkpoint-with-correct-args.sdp.md +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-005-updates-checkpoint-with-correct-args.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Updates checkpoint with correct args" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature +- outcome: Executable scenario: Updates checkpoint with correct args + +```gwt +Given the module is imported from platform-core +And a handler with default config and fake timers at "2024-01-15T12:00:00Z" +And args with a success result and context agentId "my-agent" subscriptionId "sub_my-agent" eventId "evt_999" globalPosition 150 +When the handler is invoked +Then the checkpoint update is called with: +``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-006-uses-default-24h-timeout-for-approval-expires-at.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-006-uses-default-24h-timeout-for-approval-expires-at.sdp.md index 7473db74..3db17022 100644 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-006-uses-default-24h-timeout-for-approval-expires-at.sdp.md +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-006-uses-default-24h-timeout-for-approval-expires-at.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Uses default 24h timeout for approval expiresAt" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature +- outcome: Executable scenario: Uses default 24h timeout for approval expiresAt + +```gwt +Given the module is imported from platform-core +And a handler with default config and fake timers at "2024-01-15T12:00:00Z" +And args with a success result containing a decision with requiresApproval true +When the handler is invoked +Then the approval expiresAt equals Date.now() plus 86400000 ms +``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-007-records-command-but-not-approval-when-requires-approval-is-false.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-007-records-command-but-not-approval-when-requires-approval-is-false.sdp.md index ed99fc1f..91de46ea 100644 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-007-records-command-but-not-approval-when-requires-approval-is-false.sdp.md +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-007-records-command-but-not-approval-when-requires-approval-is-false.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Records command but not approval when requiresApproval is false" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature +- outcome: Executable scenario: Records command but not approval when requiresApproval is false + +```gwt +Given the module is imported from platform-core +And a handler with default config and fake timers at "2024-01-15T12:00:00Z" +And args with a success result containing a decision with requiresApproval false +When the handler is invoked +Then the commands record is called +And the approvals create is not called +``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-008-does-not-create-approval-when-requires-approval-is-true-but-command-is-nul.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-008-does-not-create-approval-when-requires-approval-is-true-but-command-is-nul.sdp.md index 64014c08..14223681 100644 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-008-does-not-create-approval-when-requires-approval-is-true-but-command-is-nul.sdp.md +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-008-does-not-create-approval-when-requires-approval-is-true-but-command-is-nul.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Does not create approval when requiresApproval is true but command is null" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature +- outcome: Executable scenario: Does not create approval when requiresApproval is true but command is null + +```gwt +Given the module is imported from platform-core +And a handler with default config and fake timers at "2024-01-15T12:00:00Z" +And args with a success result containing a decision with null command and requiresApproval true +When the handler is invoked +Then the approvals create is not called +And the commands record is not called +And the checkpoint update is called +``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-009-uses-custom-approval-timeout-ms-for-approval-expires-at.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-009-uses-custom-approval-timeout-ms-for-approval-expires-at.sdp.md index e7212d27..a5250538 100644 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-009-uses-custom-approval-timeout-ms-for-approval-expires-at.sdp.md +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-009-uses-custom-approval-timeout-ms-for-approval-expires-at.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Uses custom approvalTimeoutMs for approval expiresAt" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature +- outcome: Executable scenario: Uses custom approvalTimeoutMs for approval expiresAt + +```gwt +Given the module is imported from platform-core +And a handler with approvalTimeoutMs 3600000 and fake timers at "2024-01-15T12:00:00Z" +And args with a success result containing a decision with requiresApproval true +When the handler is invoked +Then the approval expiresAt equals Date.now() plus 3600000 ms +``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-010-records-audit-and-checkpoint-but-skips-command-and-approval.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-010-records-audit-and-checkpoint-but-skips-command-and-approval.sdp.md index 4b266313..e43aed5c 100644 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-010-records-audit-and-checkpoint-but-skips-command-and-approval.sdp.md +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-010-records-audit-and-checkpoint-but-skips-command-and-approval.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Records audit and checkpoint but skips command and approval" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature +- outcome: Executable scenario: Records audit and checkpoint but skips command and approval + +```gwt +Given the module is imported from platform-core +And a handler with default config and fake timers at "2024-01-15T12:00:00Z" +And args with a success result containing a no-command decision +When the handler is invoked +Then the audit record is called +And the commands record is not called +And the approvals create is not called +And the checkpoint update is called +``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-011-skips-when-checkpoint-position-equals-event-position.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-011-skips-when-checkpoint-position-equals-event-position.sdp.md index ee49cd93..4b068e1a 100644 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-011-skips-when-checkpoint-position-equals-event-position.sdp.md +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-011-skips-when-checkpoint-position-equals-event-position.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: Executable scenario "Skips when checkpoint position equals event position" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature +- outcome: Executable scenario: Skips when checkpoint position equals event position + +```gwt +Given the module is imported from platform-core +And a handler with default config and fake timers at "2024-01-15T12:00:00Z" +And args with a success result and context globalPosition 42 +And the checkpoint loadOrCreate returns lastProcessedPosition 42 +When the handler is invoked +Then the checkpoint loadOrCreate is called +And the checkpoint update is not called +And the audit record is not called +And the commands record is not called +And the approvals create is not called +``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-012-catches-checkpoint-error-and-creates-dead-letter-instead-of-throwing.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-012-catches-checkpoint-error-and-creates-dead-letter-instead-of-throwing.sdp.md index 37dfb655..69103e0e 100644 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-012-catches-checkpoint-error-and-creates-dead-letter-instead-of-throwing.sdp.md +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-012-catches-checkpoint-error-and-creates-dead-letter-instead-of-throwing.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Catches checkpoint error and creates dead letter instead of throwing" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature +- outcome: Executable scenario: Catches checkpoint error and creates dead letter instead of throwing + +```gwt +Given the module is imported from platform-core +And a handler with default config and a logger +And the checkpoint loadOrCreate will throw "Database connection lost" +And args with a success result containing a standard decision +When the handler is invoked +Then the handler resolves without throwing +And the dead letter is recorded with fields: +And the logger error is called with message "Unexpected error in agent onComplete" and agentId "test-agent" and error "Database connection lost" +``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-013-dead-letters-and-skips-checkpoint-when-audit-persistence-fails.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-013-dead-letters-and-skips-checkpoint-when-audit-persistence-fails.sdp.md index 3ff24dfe..a721db26 100644 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-013-dead-letters-and-skips-checkpoint-when-audit-persistence-fails.sdp.md +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-013-dead-letters-and-skips-checkpoint-when-audit-persistence-fails.sdp.md @@ -10,4 +10,20 @@ relations: ## Intent -- outcome: Executable scenario "Dead-letters and skips checkpoint when audit persistence fails" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature +- outcome: Executable scenario: Dead-letters and skips checkpoint when audit persistence fails + +```gwt +Given the module is imported from platform-core +And a handler with default config and a logger +And the checkpoint loadOrCreate returns lastProcessedPosition 0 +And the audit record will throw "Audit store unavailable" +And args with a success result containing a decision with command and requiresApproval false +When the handler is invoked +Then the handler resolves without throwing +And the audit record is called +And the commands record is not called +And the checkpoint update is not called +And the dead letter is recorded with fields: +And the dead letter context includes correlationId "corr_123" and errorCode "AGENT_ONCOMPLETE_REQUIRED_PERSISTENCE_FAILED" +And the logger error is called with message "Required persistence failed in agent onComplete" and agentId "test-agent" and error "Required onComplete audit persistence failed: Audit store unavailable" +``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-014-dead-letters-and-skips-checkpoint-when-command-persistence-fails.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-014-dead-letters-and-skips-checkpoint-when-command-persistence-fails.sdp.md index 4692edb8..f026da9d 100644 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-014-dead-letters-and-skips-checkpoint-when-command-persistence-fails.sdp.md +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-014-dead-letters-and-skips-checkpoint-when-command-persistence-fails.sdp.md @@ -10,4 +10,18 @@ relations: ## Intent -- outcome: Executable scenario "Dead-letters and skips checkpoint when command persistence fails" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature +- outcome: Executable scenario: Dead-letters and skips checkpoint when command persistence fails + +```gwt +Given the module is imported from platform-core +And a handler with default config and a logger +And the checkpoint loadOrCreate returns lastProcessedPosition 0 +And the commands record will throw "Command store unavailable" +And args with a success result containing a decision with command and requiresApproval false +When the handler is invoked +Then the handler resolves without throwing +And the audit record is called +And the commands record is called +And the checkpoint update is not called +And the dead letter is recorded with fields: +``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-015-dead-letters-and-skips-checkpoint-when-approval-persistence-fails.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-015-dead-letters-and-skips-checkpoint-when-approval-persistence-fails.sdp.md index 6f7dcec2..57c2fb61 100644 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-015-dead-letters-and-skips-checkpoint-when-approval-persistence-fails.sdp.md +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-015-dead-letters-and-skips-checkpoint-when-approval-persistence-fails.sdp.md @@ -10,4 +10,19 @@ relations: ## Intent -- outcome: Executable scenario "Dead-letters and skips checkpoint when approval persistence fails" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature +- outcome: Executable scenario: Dead-letters and skips checkpoint when approval persistence fails + +```gwt +Given the module is imported from platform-core +And a handler with default config and a logger +And the checkpoint loadOrCreate returns lastProcessedPosition 0 +And the approvals create will throw "Approval store unavailable" +And args with a success result containing a decision with requiresApproval true +When the handler is invoked +Then the handler resolves without throwing +And the audit record is called +And the commands record is called +And the approvals create is called +And the checkpoint update is not called +And the dead letter is recorded with fields: +``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-016-success-persistence-calls-include-verification-proofs.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-016-success-persistence-calls-include-verification-proofs.sdp.md index ecf97313..cc7f5cbe 100644 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-016-success-persistence-calls-include-verification-proofs.sdp.md +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-016-success-persistence-calls-include-verification-proofs.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Success persistence calls include verification proofs" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature +- outcome: Executable scenario: Success persistence calls include verification proofs + +```gwt +Given the module is imported from platform-core +And a handler with default config and fake timers at "2024-01-15T12:00:00Z" +And args with a success result containing a decision with requiresApproval true +When the handler is invoked +Then the audit record includes a verification proof for agentId "test-agent" +And the commands record includes a verification proof for agentId "test-agent" +And the approvals create includes a verification proof for agentId "test-agent" +``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-017-does-not-throw-even-when-dead-letter-recording-also-fails.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-017-does-not-throw-even-when-dead-letter-recording-also-fails.sdp.md index d8a035fa..c2405da5 100644 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-017-does-not-throw-even-when-dead-letter-recording-also-fails.sdp.md +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-017-does-not-throw-even-when-dead-letter-recording-also-fails.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "Does not throw even when dead letter recording also fails" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature +- outcome: Executable scenario: Does not throw even when dead letter recording also fails + +```gwt +Given the module is imported from platform-core +And a handler with default config and a logger +And the checkpoint loadOrCreate will throw "Primary failure" +And the dead letter record will throw "Dead letter also failed" +And args with a success result containing a standard decision +When the handler is invoked +Then the handler resolves without throwing +And the logger error is called with message "Unexpected error in agent onComplete" +And the logger error is called with message "Failed to record dead letter in catch-all" and agentId "test-agent" and eventId "evt_123" +``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-018-does-not-throw-when-failed-result-dead-letter-recording-fails.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-018-does-not-throw-when-failed-result-dead-letter-recording-fails.sdp.md index d5e37a27..9347624e 100644 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-018-does-not-throw-when-failed-result-dead-letter-recording-fails.sdp.md +++ b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-018-does-not-throw-when-failed-result-dead-letter-recording-fails.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Does not throw when failed result dead letter recording fails" from packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature +- outcome: Executable scenario: Does not throw when failed result dead letter recording fails + +```gwt +Given the module is imported from platform-core +And a handler with default config and a logger +And the dead letter record will throw "Dead letter store unavailable" +And args with a failed result with error "Action failed" +When the handler is invoked +Then the handler resolves without throwing +And the logger error is called with message "Failed to record dead letter for action failure" and agentId "test-agent" and error "Dead letter store unavailable" +``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.sdp.md index c989b700..5b122e0d 100644 --- a/specs/behavior/platform-core/agent/oncomplete-handler.sdp.md +++ b/specs/behavior/platform-core/agent/oncomplete-handler.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: The createAgentOnCompleteHandler() factory produces a workpool onComplete callback that processes agent action results. It handles canceled, failed, and successful outcomes with appropriate persistence, idempotency guards, and NO-THROW guarantees. (test carrier: packages/platform-core/tests/features/behavior/agent/oncomplete-handler.feature) +- outcome: Agent onComplete Handler + +## Behavior + +- rule: Canceled results are no-ops +- rule: Failed results record dead letter and audit without checkpoint +- rule: Success with null returnValue still advances checkpoint +- rule: Success with decision persists audit, command, approval, and checkpoint +- rule: Success with no-command decision skips command and approval recording +- rule: Idempotency via checkpoint position +- rule: NO-THROW zone catches errors and records dead letter fallback diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-001-define-rule-based-pattern.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-001-define-rule-based-pattern.sdp.md index 5f16746b..7c0aea97 100644 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-001-define-rule-based-pattern.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-001-define-rule-based-pattern.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Define rule-based pattern" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature +- outcome: Executable scenario: Define rule-based pattern + +```gwt +Given the agent module is imported from platform-core +And the pattern detection framework is available +And a pattern definition "ChurnRisk" +And window: 30 days, minimum 3 events +And trigger: count(OrderCancelled) >= 3 +When I register the pattern +Then pattern is available for detection +``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-002-define-llm-analyzed-pattern.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-002-define-llm-analyzed-pattern.sdp.md index 9c6cba3a..8c375317 100644 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-002-define-llm-analyzed-pattern.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-002-define-llm-analyzed-pattern.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Define LLM-analyzed pattern" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature +- outcome: Executable scenario: Define LLM-analyzed pattern + +```gwt +Given the agent module is imported from platform-core +And the pattern detection framework is available +And a pattern definition "AnomalyDetection" +And LLM analysis prompt for unusual activity +When I register the pattern +Then pattern uses LLM for analysis +``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-003-window-respects-time-boundary.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-003-window-respects-time-boundary.sdp.md index 84307af6..411dd061 100644 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-003-window-respects-time-boundary.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-003-window-respects-time-boundary.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Window respects time boundary" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature +- outcome: Executable scenario: Window respects time boundary + +```gwt +Given the agent module is imported from platform-core +And the pattern detection framework is available +And pattern window of 30 days +And events spanning 60 days +When pattern detection runs +Then only events from last 30 days are analyzed +``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-004-window-respects-event-limit.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-004-window-respects-event-limit.sdp.md index d177089d..b9339612 100644 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-004-window-respects-event-limit.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-004-window-respects-event-limit.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Window respects event limit" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature +- outcome: Executable scenario: Window respects event limit + +```gwt +Given the agent module is imported from platform-core +And the pattern detection framework is available +And pattern window with eventLimit: 100 +And 150 events in time range +When pattern detection runs +Then only most recent 100 events are analyzed +``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-005-empty-window-returns-no-patterns.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-005-empty-window-returns-no-patterns.sdp.md index a2c310ec..debb613f 100644 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-005-empty-window-returns-no-patterns.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-005-empty-window-returns-no-patterns.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Empty window returns no patterns" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature +- outcome: Executable scenario: Empty window returns no patterns + +```gwt +Given the agent module is imported from platform-core +And the pattern detection framework is available +And pattern window with no events +When pattern detection runs +Then no patterns are detected +And result includes "no_events" status +``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-006-pattern-window-loads-events-lazily-for-memory-efficiency.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-006-pattern-window-loads-events-lazily-for-memory-efficiency.sdp.md index 81991a62..e3011e34 100644 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-006-pattern-window-loads-events-lazily-for-memory-efficiency.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-006-pattern-window-loads-events-lazily-for-memory-efficiency.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Pattern window loads events lazily for memory efficiency" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature +- outcome: Executable scenario: Pattern window loads events lazily for memory efficiency + +```gwt +Given the agent module is imported from platform-core +And the pattern detection framework is available +And pattern window duration is 30 days +And 1000 events exist within the pattern window +When pattern trigger is evaluated +Then events are loaded in batches +And memory usage remains bounded +And all relevant events are considered for pattern detection +``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-007-detect-churn-risk-from-cancellations.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-007-detect-churn-risk-from-cancellations.sdp.md index d2f8494e..23301da2 100644 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-007-detect-churn-risk-from-cancellations.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-007-detect-churn-risk-from-cancellations.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Detect ChurnRisk from cancellations" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature +- outcome: Executable scenario: Detect ChurnRisk from cancellations + +```gwt +Given the agent module is imported from platform-core +And the pattern detection framework is available +And events for customer "cust_123": +When pattern detection runs +Then "ChurnRisk" pattern is detected +And confidence is calculated +``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-008-detect-fraud-risk-from-frequency-anomaly.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-008-detect-fraud-risk-from-frequency-anomaly.sdp.md index 40dfba65..f08d7606 100644 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-008-detect-fraud-risk-from-frequency-anomaly.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-008-detect-fraud-risk-from-frequency-anomaly.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Detect FraudRisk from frequency anomaly" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature +- outcome: Executable scenario: Detect FraudRisk from frequency anomaly + +```gwt +Given the agent module is imported from platform-core +And the pattern detection framework is available +And events showing 50 orders in 1 hour +And normal rate is 5 orders per hour +When pattern detection runs +Then "FraudRisk" pattern is detected +And confidence > 0.9 +``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-009-no-pattern-when-threshold-not-met.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-009-no-pattern-when-threshold-not-met.sdp.md index 070407a7..220a5c28 100644 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-009-no-pattern-when-threshold-not-met.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-009-no-pattern-when-threshold-not-met.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "No pattern when threshold not met" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature +- outcome: Executable scenario: No pattern when threshold not met + +```gwt +Given the agent module is imported from platform-core +And the pattern detection framework is available +And events for customer "cust_123": +When pattern detection runs +Then "ChurnRisk" pattern is NOT detected +``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-010-llm-analyzes-event-sequence.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-010-llm-analyzes-event-sequence.sdp.md index 7c66218a..21e5b3b4 100644 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-010-llm-analyzes-event-sequence.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-010-llm-analyzes-event-sequence.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "LLM analyzes event sequence" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature +- outcome: Executable scenario: LLM analyzes event sequence + +```gwt +Given the agent module is imported from platform-core +And the pattern detection framework is available +And events submitted to LLM analysis +When analysis completes +Then result includes detected patterns +And result includes confidence scores +And result includes reasoning text +``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-011-llm-response-includes-suggested-action.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-011-llm-response-includes-suggested-action.sdp.md index b57930d9..fe52e8b4 100644 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-011-llm-response-includes-suggested-action.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-011-llm-response-includes-suggested-action.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "LLM response includes suggested action" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature +- outcome: Executable scenario: LLM response includes suggested action + +```gwt +Given the agent module is imported from platform-core +And the pattern detection framework is available +And a detected pattern with high confidence +When LLM provides analysis +Then suggestedCommand is included +And reasoning explains why +``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-012-llm-timeout-handled-gracefully.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-012-llm-timeout-handled-gracefully.sdp.md index aa923652..11adc43b 100644 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-012-llm-timeout-handled-gracefully.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-detection.examples/s-012-llm-timeout-handled-gracefully.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "LLM timeout handled gracefully" from packages/platform-core/tests/features/behavior/agent/pattern-detection.feature +- outcome: Executable scenario: LLM timeout handled gracefully + +```gwt +Given the agent module is imported from platform-core +And the pattern detection framework is available +And LLM analysis times out +When pattern detection runs +Then fallback to rule-based detection +And audit records timeout event +``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.sdp.md index a4e20f06..66b008ed 100644 --- a/specs/behavior/platform-core/agent/pattern-detection.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-detection.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: agents to detect patterns across event streams so that business insights can be generated automatically (test carrier: packages/platform-core/tests/features/behavior/agent/pattern-detection.feature) +- actor: a platform developer +- outcome: agents to detect patterns across event streams so that business insights can be generated automatically + +## Behavior + +- rule: Patterns are defined with detection criteria +- rule: Pattern window constrains event scope +- rule: Patterns are detected from event sequences +- rule: LLM provides deeper pattern analysis diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-001-returns-null-matched-pattern-and-null-decision-for-empty-patterns-array.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-001-returns-null-matched-pattern-and-null-decision-for-empty-patterns-array.sdp.md index 56b6cd7f..6e4c3a46 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-001-returns-null-matched-pattern-and-null-decision-for-empty-patterns-array.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-001-returns-null-matched-pattern-and-null-decision-for-empty-patterns-array.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Returns null matchedPattern and null decision for empty patterns array" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Returns null matchedPattern and null decision for empty patterns array + +```gwt +Given the module is imported from platform-core +And an event list with 1 default event +When executePatterns is called with no patterns +Then the matchedPattern is null +And the decision is null +And the analysisMethod is "rule-based" +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-002-returns-rule-based-decision-when-trigger-returns-true-and-no-analyze.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-002-returns-rule-based-decision-when-trigger-returns-true-and-no-analyze.sdp.md index fd498cc0..6f8ceea9 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-002-returns-rule-based-decision-when-trigger-returns-true-and-no-analyze.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-002-returns-rule-based-decision-when-trigger-returns-true-and-no-analyze.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "Returns rule-based decision when trigger returns true and no analyze" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Returns rule-based decision when trigger returns true and no analyze + +```gwt +Given the module is imported from platform-core +And an event list with 1 default event +And a pattern "churn-risk" with trigger returning true +When executePatterns is called with those patterns +Then the matchedPattern is "churn-risk" +And the decision is not null +And the analysisMethod is "rule-based" +And the decision command is null +And the decision requiresApproval is true +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-003-skips-pattern-when-trigger-returns-false.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-003-skips-pattern-when-trigger-returns-false.sdp.md index e78f7796..11472d97 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-003-skips-pattern-when-trigger-returns-false.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-003-skips-pattern-when-trigger-returns-false.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Skips pattern when trigger returns false" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Skips pattern when trigger returns false + +```gwt +Given the module is imported from platform-core +And an event list with 1 default event +And a pattern "no-match" with trigger returning false +When executePatterns is called with those patterns +Then the matchedPattern is null +And the decision is null +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-004-returns-llm-decision-when-analyze-returns-detected.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-004-returns-llm-decision-when-analyze-returns-detected.sdp.md index e84c440d..437c24a4 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-004-returns-llm-decision-when-analyze-returns-detected.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-004-returns-llm-decision-when-analyze-returns-detected.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: Executable scenario "Returns llm decision when analyze returns detected" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Returns llm decision when analyze returns detected + +```gwt +Given the module is imported from platform-core +And an event list with 1 event with eventId "evt_1" +And a pattern "churn-risk" with trigger true and analyze returning detected with confidence 0.92 +When executePatterns is called with those patterns +Then the matchedPattern is "churn-risk" +And the analysisMethod is "llm" +And the decision is not null +And the decision command is "SuggestOutreach" +And the decision confidence is 0.92 +And the decision reason is "High churn risk detected" +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-005-continues-to-next-pattern-when-analyze-returns-not-detected.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-005-continues-to-next-pattern-when-analyze-returns-not-detected.sdp.md index bb877686..1aa6485e 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-005-continues-to-next-pattern-when-analyze-returns-not-detected.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-005-continues-to-next-pattern-when-analyze-returns-not-detected.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Continues to next pattern when analyze returns not detected" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Continues to next pattern when analyze returns not detected + +```gwt +Given the module is imported from platform-core +And an event list with 1 default event +And a pattern "first" with trigger true and analyze returning not-detected +And a pattern "second" with trigger returning true +When executePatterns is called with those patterns +Then the matchedPattern is "second" +And the analysisMethod is "rule-based" +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-006-propagates-error-when-analyze-throws.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-006-propagates-error-when-analyze-throws.sdp.md index c7bc6214..e8ee8eec 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-006-propagates-error-when-analyze-throws.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-006-propagates-error-when-analyze-throws.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Propagates error when analyze throws" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Propagates error when analyze throws + +```gwt +Given the module is imported from platform-core +And an event list with 1 default event +And a pattern "risky" with trigger true and analyze that throws "LLM API timeout" +When executePatterns is called with those patterns it rejects with "LLM API timeout" +Then the expected outcome holds +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-007-stops-after-first-matching-pattern.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-007-stops-after-first-matching-pattern.sdp.md index 584ab8fa..5f5c5e8b 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-007-stops-after-first-matching-pattern.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-007-stops-after-first-matching-pattern.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Stops after first matching pattern" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Stops after first matching pattern + +```gwt +Given the module is imported from platform-core +And an event list with 1 default event +And a pattern "first" with trigger returning true +And a spy pattern "second" with trigger spy +When executePatterns is called with those patterns +Then the matchedPattern is "first" +And the second trigger spy was not called +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-008-falls-through-to-second-pattern-when-first-trigger-is-false.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-008-falls-through-to-second-pattern-when-first-trigger-is-false.sdp.md index cd08705f..9c0b8508 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-008-falls-through-to-second-pattern-when-first-trigger-is-false.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-008-falls-through-to-second-pattern-when-first-trigger-is-false.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Falls through to second pattern when first trigger is false" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Falls through to second pattern when first trigger is false + +```gwt +Given the module is imported from platform-core +And an event list with 1 default event +And a pattern "first" with trigger returning false +And a pattern "second" with trigger returning true +When executePatterns is called with those patterns +Then the matchedPattern is "second" +And the analysisMethod is "rule-based" +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-009-skips-pattern-when-min-events-is-not-met.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-009-skips-pattern-when-min-events-is-not-met.sdp.md index 83aa8c2b..868c0e81 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-009-skips-pattern-when-min-events-is-not-met.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-009-skips-pattern-when-min-events-is-not-met.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Skips pattern when minEvents is not met" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Skips pattern when minEvents is not met + +```gwt +Given the module is imported from platform-core +And an event list with 1 default event +And a pattern "needs-many" with minEvents 5 and a trigger spy +When executePatterns is called with those patterns +Then the matchedPattern is null +And the decision is null +And the minEvents trigger spy was not called +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-010-processes-pattern-when-min-events-is-met.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-010-processes-pattern-when-min-events-is-met.sdp.md index 4614fe4f..9436d8be 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-010-processes-pattern-when-min-events-is-met.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-010-processes-pattern-when-min-events-is-met.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Processes pattern when minEvents is met" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Processes pattern when minEvents is met + +```gwt +Given the module is imported from platform-core +And an event list with 5 events +And a pattern "needs-five" with minEvents 5 and trigger returning true +When executePatterns is called with those patterns +Then the matchedPattern is "needs-five" +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-011-excludes-events-outside-the-pattern-window.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-011-excludes-events-outside-the-pattern-window.sdp.md index 266169e7..350edd1c 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-011-excludes-events-outside-the-pattern-window.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-011-excludes-events-outside-the-pattern-window.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Excludes events outside the pattern window" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Excludes events outside the pattern window + +```gwt +Given the module is imported from platform-core +And an event from 1 hour ago with eventId "recent" +And an event from 2 days ago with eventId "old" +And a pattern "short-window" with 1-day window and a trigger spy +When executePatterns is called with those patterns and both events +Then the matchedPattern is "short-window" +And the trigger spy was called once with 1 event having eventId "recent" +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-012-returns-no-match-when-all-events-are-outside-the-window.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-012-returns-no-match-when-all-events-are-outside-the-window.sdp.md index 4d84c43f..b1337d91 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-012-returns-no-match-when-all-events-are-outside-the-window.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-012-returns-no-match-when-all-events-are-outside-the-window.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Returns no match when all events are outside the window" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Returns no match when all events are outside the window + +```gwt +Given the module is imported from platform-core +And an event from 2 days ago with eventId "old" +And a pattern "short-window" with 1-day window and minEvents 1 +When executePatterns is called with those patterns and the old event +Then the matchedPattern is null +And the decision is null +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-013-extracts-command-type-from-analysis-result.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-013-extracts-command-type-from-analysis-result.sdp.md index a664f9fe..b5d70318 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-013-extracts-command-type-from-analysis-result.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-013-extracts-command-type-from-analysis-result.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Extracts command type from analysis result" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Extracts command type from analysis result + +```gwt +Given the module is imported from platform-core +And an analysis result with command "SuggestOutreach" and payload urgency "high" and confidence 0.95 +When buildDecisionFromAnalysis is called with pattern "churn-risk" +Then the decision command is "SuggestOutreach" +And the decision payload equals urgency "high" +And the decision confidence is 0.95 +And the decision reason is "Pattern detected" +And the decision triggeringEvents equals "evt_1" +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-014-returns-null-command-when-no-command-present.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-014-returns-null-command-when-no-command-present.sdp.md index 4afefe54..0f2f40f6 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-014-returns-null-command-when-no-command-present.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-014-returns-null-command-when-no-command-present.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns null command when no command present" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Returns null command when no command present + +```gwt +Given the module is imported from platform-core +And an analysis result with no command and confidence 0.7 +When buildDecisionFromAnalysis is called with pattern "no-command" +Then the decision command is null +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-015-uses-command-payload-when-command-is-present.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-015-uses-command-payload-when-command-is-present.sdp.md index 535b1c8d..a0dc18f6 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-015-uses-command-payload-when-command-is-present.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-015-uses-command-payload-when-command-is-present.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Uses command payload when command is present" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Uses command payload when command is present + +```gwt +Given the module is imported from platform-core +And an analysis result with command "Cmd" and specific payload +When buildDecisionFromAnalysis is called with pattern "payload-test" +Then the decision payload equals specific "data" +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-016-uses-result-data-as-payload-when-no-command-present.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-016-uses-result-data-as-payload-when-no-command-present.sdp.md index c7614e17..dee1474b 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-016-uses-result-data-as-payload-when-no-command-present.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-016-uses-result-data-as-payload-when-no-command-present.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Uses result data as payload when no command present" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Uses result data as payload when no command present + +```gwt +Given the module is imported from platform-core +And an analysis result with no command but with data extra "info" +When buildDecisionFromAnalysis is called with pattern "data-fallback" +Then the decision payload equals extra "info" +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-017-requires-approval-when-confidence-is-below-threshold.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-017-requires-approval-when-confidence-is-below-threshold.sdp.md index 57cececf..bc98890b 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-017-requires-approval-when-confidence-is-below-threshold.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-017-requires-approval-when-confidence-is-below-threshold.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Requires approval when confidence is below threshold" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Requires approval when confidence is below threshold + +```gwt +Given the module is imported from platform-core +And an analysis result with command "SomeAction" and confidence 0.5 +When buildDecisionFromAnalysis is called with confidence threshold 0.8 +Then the decision requiresApproval is true +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-018-does-not-require-approval-when-confidence-meets-threshold.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-018-does-not-require-approval-when-confidence-meets-threshold.sdp.md index 75ba7970..44df29d4 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-018-does-not-require-approval-when-confidence-meets-threshold.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-018-does-not-require-approval-when-confidence-meets-threshold.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Does not require approval when confidence meets threshold" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Does not require approval when confidence meets threshold + +```gwt +Given the module is imported from platform-core +And an analysis result with command "SafeAction" and confidence 0.9 +When buildDecisionFromAnalysis is called with confidence threshold 0.8 +Then the decision requiresApproval is false +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-019-does-not-require-approval-when-confidence-equals-threshold.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-019-does-not-require-approval-when-confidence-equals-threshold.sdp.md index 935a8057..603af7a7 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-019-does-not-require-approval-when-confidence-equals-threshold.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-019-does-not-require-approval-when-confidence-equals-threshold.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Does not require approval when confidence equals threshold" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Does not require approval when confidence equals threshold + +```gwt +Given the module is imported from platform-core +And an analysis result with command "ExactAction" and confidence 0.8 +When buildDecisionFromAnalysis is called with confidence threshold 0.8 +Then the decision requiresApproval is false +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-020-always-requires-approval-when-no-command-is-present.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-020-always-requires-approval-when-no-command-is-present.sdp.md index 6f266785..9522e6a8 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-020-always-requires-approval-when-no-command-is-present.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-020-always-requires-approval-when-no-command-is-present.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Always requires approval when no command is present" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Always requires approval when no command is present + +```gwt +Given the module is imported from platform-core +And an analysis result with no command and confidence 0.99 +When buildDecisionFromAnalysis is called with pattern "no-cmd" +Then the decision requiresApproval is true +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-021-forces-approval-when-command-is-in-requires-approval-list.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-021-forces-approval-when-command-is-in-requires-approval-list.sdp.md index 2f3576e0..246cd847 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-021-forces-approval-when-command-is-in-requires-approval-list.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-021-forces-approval-when-command-is-in-requires-approval-list.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Forces approval when command is in requiresApproval list" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Forces approval when command is in requiresApproval list + +```gwt +Given the module is imported from platform-core +And an analysis result with command "DangerousAction" and confidence 0.99 +When buildDecisionFromAnalysis is called with humanInLoop requiresApproval "DangerousAction" +Then the decision requiresApproval is true +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-022-skips-approval-when-command-is-in-auto-approve-list.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-022-skips-approval-when-command-is-in-auto-approve-list.sdp.md index 90b929a0..f0713ff6 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-022-skips-approval-when-command-is-in-auto-approve-list.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-022-skips-approval-when-command-is-in-auto-approve-list.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Skips approval when command is in autoApprove list" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Skips approval when command is in autoApprove list + +```gwt +Given the module is imported from platform-core +And an analysis result with command "SafeAction" and confidence 0.3 +When buildDecisionFromAnalysis is called with humanInLoop autoApprove "SafeAction" +Then the decision requiresApproval is false +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-023-requires-approval-takes-precedence-over-auto-approve-for-same-command.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-023-requires-approval-takes-precedence-over-auto-approve-for-same-command.sdp.md index 91883254..bc2d1c3d 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-023-requires-approval-takes-precedence-over-auto-approve-for-same-command.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-023-requires-approval-takes-precedence-over-auto-approve-for-same-command.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "requiresApproval takes precedence over autoApprove for same command" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: requiresApproval takes precedence over autoApprove for same command + +```gwt +Given the module is imported from platform-core +And an analysis result with command "ConflictAction" and confidence 0.99 +When buildDecisionFromAnalysis is called with humanInLoop both lists for "ConflictAction" +Then the decision requiresApproval is true +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-024-returns-null-command-for-trigger-only-decision.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-024-returns-null-command-for-trigger-only-decision.sdp.md index 9097e26e..189efec1 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-024-returns-null-command-for-trigger-only-decision.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-024-returns-null-command-for-trigger-only-decision.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Returns null command for trigger-only decision" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Returns null command for trigger-only decision + +```gwt +Given the module is imported from platform-core +And 1 default event for trigger decision +And a trigger pattern named "basic" +When buildDecisionFromTrigger is called +Then the trigger decision command is null +And the trigger decision payload is empty +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-025-always-requires-approval-for-trigger-only-decision.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-025-always-requires-approval-for-trigger-only-decision.sdp.md index f3c7d589..d027b058 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-025-always-requires-approval-for-trigger-only-decision.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-025-always-requires-approval-for-trigger-only-decision.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Always requires approval for trigger-only decision" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Always requires approval for trigger-only decision + +```gwt +Given the module is imported from platform-core +And 1 default event for trigger decision +And a trigger pattern named "basic" +When buildDecisionFromTrigger is called +Then the trigger decision requiresApproval is true +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-026-includes-pattern-name-in-trigger-decision-reason.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-026-includes-pattern-name-in-trigger-decision-reason.sdp.md index b1b2f76d..b7024190 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-026-includes-pattern-name-in-trigger-decision-reason.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-026-includes-pattern-name-in-trigger-decision-reason.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Includes pattern name in trigger decision reason" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Includes pattern name in trigger decision reason + +```gwt +Given the module is imported from platform-core +And 1 default event for trigger decision +And a trigger pattern named "churn-risk" +When buildDecisionFromTrigger is called +Then the trigger decision reason contains "churn-risk" +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-027-includes-event-count-in-trigger-decision-reason.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-027-includes-event-count-in-trigger-decision-reason.sdp.md index 18418f1b..8feada9c 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-027-includes-event-count-in-trigger-decision-reason.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-027-includes-event-count-in-trigger-decision-reason.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Includes event count in trigger decision reason" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Includes event count in trigger decision reason + +```gwt +Given the module is imported from platform-core +And 3 default events for trigger decision +And a trigger pattern named "multi-event" +When buildDecisionFromTrigger is called +Then the trigger decision reason contains "3 events" +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-028-includes-all-event-i-ds-in-triggering-events.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-028-includes-all-event-i-ds-in-triggering-events.sdp.md index 6ebdb5da..f191d8fc 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-028-includes-all-event-i-ds-in-triggering-events.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-028-includes-all-event-i-ds-in-triggering-events.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Includes all event IDs in triggeringEvents" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Includes all event IDs in triggeringEvents + +```gwt +Given the module is imported from platform-core +And events with IDs "evt_a" and "evt_b" for trigger decision +And a trigger pattern named "trigger-test" +When buildDecisionFromTrigger is called +Then the trigger decision triggeringEvents are "evt_a" and "evt_b" +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-029-returns-0-6-confidence-for-1-event.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-029-returns-0-6-confidence-for-1-event.sdp.md index 4f809b44..dec6ddd3 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-029-returns-0-6-confidence-for-1-event.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-029-returns-0-6-confidence-for-1-event.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns 0.6 confidence for 1 event" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Returns 0.6 confidence for 1 event + +```gwt +Given the module is imported from platform-core +And 1 default event for trigger decision +And a trigger pattern named "t" +When buildDecisionFromTrigger is called +Then the trigger decision confidence is approximately 0.6 +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-030-returns-0-7-confidence-for-2-events.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-030-returns-0-7-confidence-for-2-events.sdp.md index da64446c..a546ce06 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-030-returns-0-7-confidence-for-2-events.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-030-returns-0-7-confidence-for-2-events.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns 0.7 confidence for 2 events" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Returns 0.7 confidence for 2 events + +```gwt +Given the module is imported from platform-core +And 2 default events for trigger decision +And a trigger pattern named "t" +When buildDecisionFromTrigger is called +Then the trigger decision confidence is approximately 0.7 +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-031-returns-0-8-confidence-for-3-events.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-031-returns-0-8-confidence-for-3-events.sdp.md index d4dd56ba..5bf8cfb6 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-031-returns-0-8-confidence-for-3-events.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-031-returns-0-8-confidence-for-3-events.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns 0.8 confidence for 3 events" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Returns 0.8 confidence for 3 events + +```gwt +Given the module is imported from platform-core +And 3 default events for trigger decision +And a trigger pattern named "t" +When buildDecisionFromTrigger is called +Then the trigger decision confidence is approximately 0.8 +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-032-caps-at-0-85-for-4-events.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-032-caps-at-0-85-for-4-events.sdp.md index 4f848ded..0d35bb77 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-032-caps-at-0-85-for-4-events.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-032-caps-at-0-85-for-4-events.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Caps at 0.85 for 4 events" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Caps at 0.85 for 4 events + +```gwt +Given the module is imported from platform-core +And 4 default events for trigger decision +And a trigger pattern named "t" +When buildDecisionFromTrigger is called +Then the trigger decision confidence is approximately 0.85 +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-033-caps-at-0-85-for-10-events.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-033-caps-at-0-85-for-10-events.sdp.md index 0ddacb76..d8866793 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-033-caps-at-0-85-for-10-events.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-033-caps-at-0-85-for-10-events.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Caps at 0.85 for 10 events" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Caps at 0.85 for 10 events + +```gwt +Given the module is imported from platform-core +And 10 default events for trigger decision +And a trigger pattern named "t" +When buildDecisionFromTrigger is called +Then the trigger decision confidence is approximately 0.85 +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-034-returns-0-5-for-0-events-edge-case.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-034-returns-0-5-for-0-events-edge-case.sdp.md index e8d3eb20..64d7875c 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-034-returns-0-5-for-0-events-edge-case.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.examples/s-034-returns-0-5-for-0-events-edge-case.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns 0.5 for 0 events edge case" from packages/platform-core/tests/features/behavior/agent/pattern-executor.feature +- outcome: Executable scenario: Returns 0.5 for 0 events edge case + +```gwt +Given the module is imported from platform-core +And 0 events for trigger decision +And a trigger pattern named "t" +When buildDecisionFromTrigger is called +Then the trigger decision confidence is approximately 0.5 +``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.sdp.md index cec894dd..89d6107f 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.sdp.md @@ -10,4 +10,20 @@ relations: ## Intent -- outcome: Pattern execution pipeline for agent bounded contexts including executePatterns (pattern matching, window filtering, minEvents gating), buildDecisionFromAnalysis (command extraction, approval logic), and buildDecisionFromTrigger (heuristic confidence, always requires approval). (test carrier: packages/platform-core/tests/features/behavior/agent/pattern-executor.feature) +- outcome: Pattern Executor + +## Behavior + +- rule: executePatterns returns null for empty patterns +- rule: executePatterns matches single pattern via trigger +- rule: executePatterns delegates to analyze when present +- rule: executePatterns propagates analyze errors +- rule: executePatterns short-circuits on first match +- rule: executePatterns falls through non-matching patterns +- rule: executePatterns enforces minEvents +- rule: executePatterns applies window filtering +- rule: buildDecisionFromAnalysis extracts command and payload +- rule: buildDecisionFromAnalysis determines requiresApproval from confidence threshold +- rule: buildDecisionFromAnalysis respects humanInLoop overrides +- rule: buildDecisionFromTrigger returns basic trigger-only decision +- rule: buildDecisionFromTrigger computes heuristic confidence diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-001-error-codes-object-contains-all-expected-codes.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-001-error-codes-object-contains-all-expected-codes.sdp.md index d2c5a284..d644e842 100644 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-001-error-codes-object-contains-all-expected-codes.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-001-error-codes-object-contains-all-expected-codes.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Error codes object contains all expected codes" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature +- outcome: Executable scenario: Error codes object contains all expected codes + +```gwt +Given the feature fixture is in place +When the scenario runs +Then PATTERN_REGISTRY_ERROR_CODES contains all expected codes: +And PATTERN_REGISTRY_ERROR_CODES has exactly 4 keys +``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-002-single-valid-pattern-passes.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-002-single-valid-pattern-passes.sdp.md index d023e5ba..cd8ed860 100644 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-002-single-valid-pattern-passes.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-002-single-valid-pattern-passes.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Single valid pattern passes" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature +- outcome: Executable scenario: Single valid pattern passes + +```gwt +Given a valid pattern named "churn-risk" +When I validate the pattern definitions +Then the result is valid +``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-003-multiple-patterns-with-unique-names-pass.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-003-multiple-patterns-with-unique-names-pass.sdp.md index ef861442..870f31cb 100644 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-003-multiple-patterns-with-unique-names-pass.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-003-multiple-patterns-with-unique-names-pass.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Multiple patterns with unique names pass" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature +- outcome: Executable scenario: Multiple patterns with unique names pass + +```gwt +Given valid patterns named: +When I validate the pattern definitions +Then the result is valid +``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-004-patterns-with-different-window-configurations-pass.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-004-patterns-with-different-window-configurations-pass.sdp.md index c25a878b..5820a643 100644 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-004-patterns-with-different-window-configurations-pass.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-004-patterns-with-different-window-configurations-pass.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Patterns with different window configurations pass" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature +- outcome: Executable scenario: Patterns with different window configurations pass + +```gwt +Given a pattern "short-window" with window duration "1h" +And a pattern "long-window" with window duration "30d" and minEvents 5 and eventLimit 200 +When I validate the pattern definitions +Then the result is valid +``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-005-pattern-with-analyze-function-passes.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-005-pattern-with-analyze-function-passes.sdp.md index e0bdb2ff..47d51fca 100644 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-005-pattern-with-analyze-function-passes.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-005-pattern-with-analyze-function-passes.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Pattern with analyze function passes" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature +- outcome: Executable scenario: Pattern with analyze function passes + +```gwt +Given a pattern "with-analyzer" that has an analyze function +When I validate the pattern definitions +Then the result is valid +``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-006-empty-array-returns-valid.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-006-empty-array-returns-valid.sdp.md index 00e3b4dd..bd566bd9 100644 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-006-empty-array-returns-valid.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-006-empty-array-returns-valid.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Empty array returns valid" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature +- outcome: Executable scenario: Empty array returns valid + +```gwt +Given an empty pattern array +When I validate the pattern definitions +Then the result is valid +``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-007-two-patterns-with-same-name-fail.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-007-two-patterns-with-same-name-fail.sdp.md index 9fabf80d..3872d751 100644 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-007-two-patterns-with-same-name-fail.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-007-two-patterns-with-same-name-fail.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Two patterns with same name fail" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature +- outcome: Executable scenario: Two patterns with same name fail + +```gwt +Given valid patterns named: +When I validate the pattern definitions +Then the result is invalid with code "DUPLICATE_PATTERN" +And the error message contains "churn-risk" +``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-008-duplicate-detected-in-middle-of-array.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-008-duplicate-detected-in-middle-of-array.sdp.md index f2a99859..8a7c2761 100644 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-008-duplicate-detected-in-middle-of-array.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-008-duplicate-detected-in-middle-of-array.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Duplicate detected in middle of array" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature +- outcome: Executable scenario: Duplicate detected in middle of array + +```gwt +Given valid patterns named: +When I validate the pattern definitions +Then the result is invalid with code "DUPLICATE_PATTERN" +And the error message contains "alpha" +``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-009-short-circuits-on-first-duplicate-found.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-009-short-circuits-on-first-duplicate-found.sdp.md index 8cd28e70..b503b265 100644 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-009-short-circuits-on-first-duplicate-found.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-009-short-circuits-on-first-duplicate-found.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Short-circuits on first duplicate found" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature +- outcome: Executable scenario: Short-circuits on first duplicate found + +```gwt +Given valid patterns named: +When I validate the pattern definitions +Then the result is invalid with code "DUPLICATE_PATTERN" +And the error message contains "alpha" +``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-010-empty-name-fails-with-pattern-name-required.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-010-empty-name-fails-with-pattern-name-required.sdp.md index 5d279fc0..ab67cf0c 100644 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-010-empty-name-fails-with-pattern-name-required.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-010-empty-name-fails-with-pattern-name-required.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Empty name fails with PATTERN_NAME_REQUIRED" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature +- outcome: Executable scenario: Empty name fails with PATTERN_NAME_REQUIRED + +```gwt +Given a valid pattern named "" +When I validate the pattern definitions +Then the result is invalid with code "PATTERN_NAME_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-011-whitespace-only-name-fails-with-pattern-name-required.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-011-whitespace-only-name-fails-with-pattern-name-required.sdp.md index f848621c..6c3ed9e8 100644 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-011-whitespace-only-name-fails-with-pattern-name-required.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-011-whitespace-only-name-fails-with-pattern-name-required.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Whitespace-only name fails with PATTERN_NAME_REQUIRED" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature +- outcome: Executable scenario: Whitespace-only name fails with PATTERN_NAME_REQUIRED + +```gwt +Given a valid pattern named " " +When I validate the pattern definitions +Then the result is invalid with code "PATTERN_NAME_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-012-invalid-pattern-short-circuits-before-duplicate-check.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-012-invalid-pattern-short-circuits-before-duplicate-check.sdp.md index 3d590e73..8b0f3e40 100644 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-012-invalid-pattern-short-circuits-before-duplicate-check.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-012-invalid-pattern-short-circuits-before-duplicate-check.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Invalid pattern short-circuits before duplicate check" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature +- outcome: Executable scenario: Invalid pattern short-circuits before duplicate check + +```gwt +Given a pattern with empty name followed by a pattern named "churn-risk" +When I validate the pattern definitions +Then the result is invalid with code "PATTERN_NAME_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-013-pattern-without-trigger-function-fails.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-013-pattern-without-trigger-function-fails.sdp.md index 2292bc2b..b7963cdf 100644 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-013-pattern-without-trigger-function-fails.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-013-pattern-without-trigger-function-fails.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Pattern without trigger function fails" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature +- outcome: Executable scenario: Pattern without trigger function fails + +```gwt +Given a pattern "no-trigger" without a trigger function +When I validate the pattern definitions +Then the result is invalid with code "TRIGGER_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-014-pattern-with-non-function-trigger-fails.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-014-pattern-with-non-function-trigger-fails.sdp.md index 86950e80..a6d288e6 100644 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-014-pattern-with-non-function-trigger-fails.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-014-pattern-with-non-function-trigger-fails.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Pattern with non-function trigger fails" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature +- outcome: Executable scenario: Pattern with non-function trigger fails + +```gwt +Given a pattern "bad-trigger" with a non-function trigger +When I validate the pattern definitions +Then the result is invalid with code "TRIGGER_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-015-pattern-name-required-maps-to-registry-pattern-name-required.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-015-pattern-name-required-maps-to-registry-pattern-name-required.sdp.md index ee1950b7..29b1c0f0 100644 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-015-pattern-name-required-maps-to-registry-pattern-name-required.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-015-pattern-name-required-maps-to-registry-pattern-name-required.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "PATTERN_NAME_REQUIRED maps to registry PATTERN_NAME_REQUIRED" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature +- outcome: Executable scenario: PATTERN_NAME_REQUIRED maps to registry PATTERN_NAME_REQUIRED + +```gwt +Given a valid pattern named "" +When I validate the pattern definitions +Then the result is invalid with code "PATTERN_NAME_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-016-trigger-required-maps-to-registry-trigger-required.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-016-trigger-required-maps-to-registry-trigger-required.sdp.md index f358eb3b..71bfe0ba 100644 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-016-trigger-required-maps-to-registry-trigger-required.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-016-trigger-required-maps-to-registry-trigger-required.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "TRIGGER_REQUIRED maps to registry TRIGGER_REQUIRED" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature +- outcome: Executable scenario: TRIGGER_REQUIRED maps to registry TRIGGER_REQUIRED + +```gwt +Given a pattern "no-trigger" without a trigger function +When I validate the pattern definitions +Then the result is invalid with code "TRIGGER_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-017-unknown-pattern-error-codes-map-to-invalid-pattern.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-017-unknown-pattern-error-codes-map-to-invalid-pattern.sdp.md index 2103fbd5..59bbb96d 100644 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-017-unknown-pattern-error-codes-map-to-invalid-pattern.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-017-unknown-pattern-error-codes-map-to-invalid-pattern.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Unknown pattern error codes map to INVALID_PATTERN" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature +- outcome: Executable scenario: Unknown pattern error codes map to INVALID_PATTERN + +```gwt +Given a pattern "bad-window" with invalid window duration "invalid" +When I validate the pattern definitions +Then the result is invalid with code "INVALID_PATTERN" +``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-018-accepts-readonly-array-input.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-018-accepts-readonly-array-input.sdp.md index 76d3ea8c..aa2cd31f 100644 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-018-accepts-readonly-array-input.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-018-accepts-readonly-array-input.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts readonly array input" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature +- outcome: Executable scenario: Accepts readonly array input + +```gwt +Given a frozen readonly pattern array with pattern "frozen-pattern" +When I validate the pattern definitions +Then the result is valid +``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-019-error-result-has-correct-discriminated-union-shape.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-019-error-result-has-correct-discriminated-union-shape.sdp.md index a2821d49..585aa804 100644 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-019-error-result-has-correct-discriminated-union-shape.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-registry.examples/s-019-error-result-has-correct-discriminated-union-shape.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Error result has correct discriminated union shape" from packages/platform-core/tests/features/behavior/agent/pattern-registry.feature +- outcome: Executable scenario: Error result has correct discriminated union shape + +```gwt +Given valid patterns named: +When I validate the pattern definitions +Then the result is invalid with code "DUPLICATE_PATTERN" +And the error message is a string +``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.sdp.md index eb07689d..95644037 100644 --- a/specs/behavior/platform-core/agent/pattern-registry.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-registry.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: validatePatternDefinitions() validates an array of PatternDefinition objects, checking for missing names, missing triggers, duplicate names, and unknown error codes. PATTERN_REGISTRY_ERROR_CODES provides the canonical error code constants. (test carrier: packages/platform-core/tests/features/behavior/agent/pattern-registry.feature) +- outcome: Pattern Registry + +## Behavior + +- rule: Error code constants are complete and correct +- rule: Valid patterns pass validation +- rule: Empty array passes validation +- rule: Duplicate names are rejected +- rule: Missing name is rejected +- rule: Missing trigger is rejected +- rule: Error codes are mapped correctly at registry level +- rule: Type safety is preserved diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-001-error-codes-contain-all-expected-values.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-001-error-codes-contain-all-expected-values.sdp.md index dae79db5..c71d930c 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-001-error-codes-contain-all-expected-values.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-001-error-codes-contain-all-expected-values.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Error codes contain all expected values" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Error codes contain all expected values + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then the error codes contain the following entries: +And the error codes object has exactly 6 keys +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-002-accepts-valid-window-with-duration-only.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-002-accepts-valid-window-with-duration-only.sdp.md index 7319a3f9..5826b22f 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-002-accepts-valid-window-with-duration-only.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-002-accepts-valid-window-with-duration-only.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts valid window with duration only" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Accepts valid window with duration only + +```gwt +Given the module is imported from platform-core +When I parse a window with duration "7d" +Then the schema parse succeeds +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-003-accepts-window-with-all-optional-fields.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-003-accepts-window-with-all-optional-fields.sdp.md index 8df7aa21..eacb6b3b 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-003-accepts-window-with-all-optional-fields.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-003-accepts-window-with-all-optional-fields.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts window with all optional fields" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Accepts window with all optional fields + +```gwt +Given the module is imported from platform-core +When I parse a window with duration "7d" eventLimit 100 minEvents 5 loadBatchSize 50 +Then the schema parse succeeds +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-004-rejects-window-with-empty-duration.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-004-rejects-window-with-empty-duration.sdp.md index 0f6710fe..b4948d86 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-004-rejects-window-with-empty-duration.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-004-rejects-window-with-empty-duration.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects window with empty duration" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Rejects window with empty duration + +```gwt +Given the module is imported from platform-core +When I parse a window with duration "" +Then the schema parse fails +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-005-rejects-window-with-missing-duration.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-005-rejects-window-with-missing-duration.sdp.md index 9061f358..d61c86b5 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-005-rejects-window-with-missing-duration.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-005-rejects-window-with-missing-duration.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects window with missing duration" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Rejects window with missing duration + +```gwt +Given the module is imported from platform-core +When I parse a window with no duration +Then the schema parse fails +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-006-rejects-window-with-non-positive-event-limit.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-006-rejects-window-with-non-positive-event-limit.sdp.md index 4bed69e2..4916fcc9 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-006-rejects-window-with-non-positive-event-limit.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-006-rejects-window-with-non-positive-event-limit.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects window with non-positive eventLimit" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Rejects window with non-positive eventLimit + +```gwt +Given the module is imported from platform-core +When I parse a window with duration "7d" and eventLimit 0 +Then the schema parse fails +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-007-rejects-window-with-negative-event-limit.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-007-rejects-window-with-negative-event-limit.sdp.md index 5f2949c4..b0ed232a 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-007-rejects-window-with-negative-event-limit.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-007-rejects-window-with-negative-event-limit.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects window with negative eventLimit" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Rejects window with negative eventLimit + +```gwt +Given the module is imported from platform-core +When I parse a window with duration "7d" and eventLimit -10 +Then the schema parse fails +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-008-rejects-window-with-non-positive-min-events.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-008-rejects-window-with-non-positive-min-events.sdp.md index 672fbc16..8e6cf054 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-008-rejects-window-with-non-positive-min-events.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-008-rejects-window-with-non-positive-min-events.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects window with non-positive minEvents" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Rejects window with non-positive minEvents + +```gwt +Given the module is imported from platform-core +When I parse a window with duration "7d" and minEvents 0 +Then the schema parse fails +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-009-rejects-window-with-non-positive-load-batch-size.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-009-rejects-window-with-non-positive-load-batch-size.sdp.md index 44233b27..3aea032c 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-009-rejects-window-with-non-positive-load-batch-size.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-009-rejects-window-with-non-positive-load-batch-size.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects window with non-positive loadBatchSize" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Rejects window with non-positive loadBatchSize + +```gwt +Given the module is imported from platform-core +When I parse a window with duration "7d" and loadBatchSize 0 +Then the schema parse fails +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-010-rejects-window-with-non-integer-event-limit.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-010-rejects-window-with-non-integer-event-limit.sdp.md index 395e135f..e8b9082f 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-010-rejects-window-with-non-integer-event-limit.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-010-rejects-window-with-non-integer-event-limit.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects window with non-integer eventLimit" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Rejects window with non-integer eventLimit + +```gwt +Given the module is imported from platform-core +When I parse a window with duration "7d" and eventLimit 50.5 +Then the schema parse fails +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-011-parses-days-format-correctly.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-011-parses-days-format-correctly.sdp.md index 763a713c..98c05012 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-011-parses-days-format-correctly.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-011-parses-days-format-correctly.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Parses days format correctly" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Parses days format correctly + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then parseDuration returns expected milliseconds for: +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-012-parses-hours-format-correctly.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-012-parses-hours-format-correctly.sdp.md index 7bf892e3..319f66ca 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-012-parses-hours-format-correctly.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-012-parses-hours-format-correctly.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Parses hours format correctly" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Parses hours format correctly + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then parseDuration returns expected milliseconds for: +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-013-parses-minutes-format-correctly.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-013-parses-minutes-format-correctly.sdp.md index 15b2fad5..b7e60795 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-013-parses-minutes-format-correctly.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-013-parses-minutes-format-correctly.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Parses minutes format correctly" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Parses minutes format correctly + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then parseDuration returns expected milliseconds for: +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-014-handles-uppercase-units.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-014-handles-uppercase-units.sdp.md index 70166754..4614de26 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-014-handles-uppercase-units.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-014-handles-uppercase-units.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles uppercase units" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Handles uppercase units + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then parseDuration returns expected milliseconds for: +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-015-returns-null-for-invalid-formats.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-015-returns-null-for-invalid-formats.sdp.md index 51b64816..7648479e 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-015-returns-null-for-invalid-formats.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-015-returns-null-for-invalid-formats.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns null for invalid formats" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns null for invalid formats + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then parseDuration returns null for: +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-016-trims-leading-and-trailing-whitespace.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-016-trims-leading-and-trailing-whitespace.sdp.md index c0aea55c..2068d776 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-016-trims-leading-and-trailing-whitespace.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-016-trims-leading-and-trailing-whitespace.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Trims leading and trailing whitespace" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Trims leading and trailing whitespace + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then parseDuration returns expected milliseconds for: +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-017-returns-true-for-valid-duration-formats.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-017-returns-true-for-valid-duration-formats.sdp.md index b41901cb..673072cb 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-017-returns-true-for-valid-duration-formats.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-017-returns-true-for-valid-duration-formats.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for valid duration formats" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns true for valid duration formats + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isValidDuration returns true for: +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-018-returns-false-for-invalid-duration-formats.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-018-returns-false-for-invalid-duration-formats.sdp.md index 1c0f150f..a3343ecd 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-018-returns-false-for-invalid-duration-formats.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-018-returns-false-for-invalid-duration-formats.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for invalid duration formats" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns false for invalid duration formats + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isValidDuration returns false for: +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-019-returns-invalid-when-name-is-missing.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-019-returns-invalid-when-name-is-missing.sdp.md index 673acc78..1887cdf8 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-019-returns-invalid-when-name-is-missing.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-019-returns-invalid-when-name-is-missing.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when name is missing" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns invalid when name is missing + +```gwt +Given the module is imported from platform-core +When I validate a pattern with no name +Then the validation result is invalid with code "PATTERN_NAME_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-020-returns-invalid-when-name-is-empty-string.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-020-returns-invalid-when-name-is-empty-string.sdp.md index 84aedff0..52b47b4c 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-020-returns-invalid-when-name-is-empty-string.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-020-returns-invalid-when-name-is-empty-string.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when name is empty string" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns invalid when name is empty string + +```gwt +Given the module is imported from platform-core +When I validate a pattern with name "" +Then the validation result is invalid with code "PATTERN_NAME_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-021-returns-invalid-when-name-is-whitespace-only.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-021-returns-invalid-when-name-is-whitespace-only.sdp.md index 68e20875..674d5deb 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-021-returns-invalid-when-name-is-whitespace-only.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-021-returns-invalid-when-name-is-whitespace-only.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when name is whitespace only" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns invalid when name is whitespace only + +```gwt +Given the module is imported from platform-core +When I validate a pattern with name " " +Then the validation result is invalid with code "PATTERN_NAME_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-022-returns-invalid-when-trigger-is-missing.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-022-returns-invalid-when-trigger-is-missing.sdp.md index 4166b5b3..484acf3d 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-022-returns-invalid-when-trigger-is-missing.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-022-returns-invalid-when-trigger-is-missing.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when trigger is missing" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns invalid when trigger is missing + +```gwt +Given the module is imported from platform-core +When I validate a pattern with no trigger +Then the validation result is invalid with code "TRIGGER_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-023-returns-invalid-when-trigger-is-not-a-function.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-023-returns-invalid-when-trigger-is-not-a-function.sdp.md index 23cd0aa7..4b8d29a5 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-023-returns-invalid-when-trigger-is-not-a-function.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-023-returns-invalid-when-trigger-is-not-a-function.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when trigger is not a function" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns invalid when trigger is not a function + +```gwt +Given the module is imported from platform-core +When I validate a pattern with trigger as a non-function +Then the validation result is invalid with code "TRIGGER_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-024-returns-invalid-when-duration-format-is-invalid.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-024-returns-invalid-when-duration-format-is-invalid.sdp.md index e17f900e..96646c5b 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-024-returns-invalid-when-duration-format-is-invalid.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-024-returns-invalid-when-duration-format-is-invalid.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when duration format is invalid" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns invalid when duration format is invalid + +```gwt +Given the module is imported from platform-core +When I validate a pattern with duration "invalid" +Then the validation result is invalid with code "INVALID_DURATION_FORMAT" +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-025-returns-invalid-when-duration-is-empty.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-025-returns-invalid-when-duration-is-empty.sdp.md index c9aaf270..fe1ff709 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-025-returns-invalid-when-duration-is-empty.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-025-returns-invalid-when-duration-is-empty.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when duration is empty" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns invalid when duration is empty + +```gwt +Given the module is imported from platform-core +When I validate a pattern with duration "" +Then the validation result is invalid with code "INVALID_DURATION_FORMAT" +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-026-returns-invalid-when-event-limit-is-non-positive.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-026-returns-invalid-when-event-limit-is-non-positive.sdp.md index 7d080c2f..6fb86647 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-026-returns-invalid-when-event-limit-is-non-positive.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-026-returns-invalid-when-event-limit-is-non-positive.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when eventLimit is non-positive" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns invalid when eventLimit is non-positive + +```gwt +Given the module is imported from platform-core +When I validate a pattern with eventLimit 0 +Then the validation result is invalid with code "INVALID_EVENT_LIMIT" +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-027-returns-invalid-when-event-limit-is-negative.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-027-returns-invalid-when-event-limit-is-negative.sdp.md index 2a179cfc..2e85c5dc 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-027-returns-invalid-when-event-limit-is-negative.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-027-returns-invalid-when-event-limit-is-negative.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when eventLimit is negative" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns invalid when eventLimit is negative + +```gwt +Given the module is imported from platform-core +When I validate a pattern with eventLimit -10 +Then the validation result is invalid +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-028-returns-invalid-when-event-limit-is-not-an-integer.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-028-returns-invalid-when-event-limit-is-not-an-integer.sdp.md index fbfec731..628f2f0a 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-028-returns-invalid-when-event-limit-is-not-an-integer.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-028-returns-invalid-when-event-limit-is-not-an-integer.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when eventLimit is not an integer" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns invalid when eventLimit is not an integer + +```gwt +Given the module is imported from platform-core +When I validate a pattern with eventLimit 50.5 +Then the validation result is invalid +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-029-returns-invalid-when-min-events-is-non-positive.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-029-returns-invalid-when-min-events-is-non-positive.sdp.md index 35847287..6e5023ad 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-029-returns-invalid-when-min-events-is-non-positive.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-029-returns-invalid-when-min-events-is-non-positive.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when minEvents is non-positive" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns invalid when minEvents is non-positive + +```gwt +Given the module is imported from platform-core +When I validate a pattern with minEvents 0 +Then the validation result is invalid with code "INVALID_MIN_EVENTS" +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-030-returns-invalid-when-load-batch-size-is-non-positive.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-030-returns-invalid-when-load-batch-size-is-non-positive.sdp.md index 45938d61..b8ee13f8 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-030-returns-invalid-when-load-batch-size-is-non-positive.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-030-returns-invalid-when-load-batch-size-is-non-positive.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when loadBatchSize is non-positive" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns invalid when loadBatchSize is non-positive + +```gwt +Given the module is imported from platform-core +When I validate a pattern with loadBatchSize 0 +Then the validation result is invalid with code "INVALID_LOAD_BATCH_SIZE" +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-031-returns-valid-for-minimal-definition.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-031-returns-valid-for-minimal-definition.sdp.md index ec620d65..ba3ebd2a 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-031-returns-valid-for-minimal-definition.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-031-returns-valid-for-minimal-definition.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns valid for minimal definition" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns valid for minimal definition + +```gwt +Given the module is imported from platform-core +When I validate a pattern with name "test-pattern" and duration "7d" and a trigger +Then the validation result is valid +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-032-returns-valid-for-complete-definition.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-032-returns-valid-for-complete-definition.sdp.md index b930ff7d..b1e3543b 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-032-returns-valid-for-complete-definition.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-032-returns-valid-for-complete-definition.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns valid for complete definition" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns valid for complete definition + +```gwt +Given the module is imported from platform-core +When I validate a complete test pattern definition +Then the validation result is valid +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-033-returns-valid-for-definition-with-all-window-options.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-033-returns-valid-for-definition-with-all-window-options.sdp.md index 7b782f55..b6131025 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-033-returns-valid-for-definition-with-all-window-options.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-033-returns-valid-for-definition-with-all-window-options.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns valid for definition with all window options" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns valid for definition with all window options + +```gwt +Given the module is imported from platform-core +When I validate a pattern with all window options +Then the validation result is valid +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-034-returns-the-definition-when-valid.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-034-returns-the-definition-when-valid.sdp.md index 6dfa3f87..f6310eb7 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-034-returns-the-definition-when-valid.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-034-returns-the-definition-when-valid.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns the definition when valid" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns the definition when valid + +```gwt +Given the module is imported from platform-core +When I define a valid test pattern +Then the returned definition is the same object +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-035-throws-error-when-name-is-missing.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-035-throws-error-when-name-is-missing.sdp.md index f717cd79..41c1ab44 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-035-throws-error-when-name-is-missing.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-035-throws-error-when-name-is-missing.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws error when name is missing" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Throws error when name is missing + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then definePattern with empty name throws "Pattern name is required" +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-036-throws-error-when-trigger-is-missing.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-036-throws-error-when-trigger-is-missing.sdp.md index c2afbed0..d35c61e0 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-036-throws-error-when-trigger-is-missing.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-036-throws-error-when-trigger-is-missing.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws error when trigger is missing" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Throws error when trigger is missing + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then definePattern with no trigger throws "Pattern trigger function is required" +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-037-throws-error-when-duration-is-invalid.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-037-throws-error-when-duration-is-invalid.sdp.md index d9c1c183..c6a6cccd 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-037-throws-error-when-duration-is-invalid.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-037-throws-error-when-duration-is-invalid.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws error when duration is invalid" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Throws error when duration is invalid + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then definePattern with duration "invalid" throws "Duration must be in format" +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-038-includes-error-code-in-thrown-error-message.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-038-includes-error-code-in-thrown-error-message.sdp.md index 3291b2e4..695190b3 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-038-includes-error-code-in-thrown-error-message.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-038-includes-error-code-in-thrown-error-message.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Includes error code in thrown error message" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Includes error code in thrown error message + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then definePattern with empty name throws "PATTERN_NAME_REQUIRED" +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-039-calculates-boundary-for-days.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-039-calculates-boundary-for-days.sdp.md index e4b8f825..7557b4e6 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-039-calculates-boundary-for-days.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-039-calculates-boundary-for-days.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Calculates boundary for days" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Calculates boundary for days + +```gwt +Given the module is imported from platform-core +When I calculate the window boundary for "7d" at timestamp 1000000000 +Then the boundary is 1000000000 minus 7 days in milliseconds +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-040-calculates-boundary-for-hours.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-040-calculates-boundary-for-hours.sdp.md index 5b49e95e..ce50470e 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-040-calculates-boundary-for-hours.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-040-calculates-boundary-for-hours.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Calculates boundary for hours" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Calculates boundary for hours + +```gwt +Given the module is imported from platform-core +When I calculate the window boundary for "24h" at timestamp 1000000000 +Then the boundary is 1000000000 minus 24 hours in milliseconds +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-041-calculates-boundary-for-minutes.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-041-calculates-boundary-for-minutes.sdp.md index 9c8c393c..fb747c5f 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-041-calculates-boundary-for-minutes.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-041-calculates-boundary-for-minutes.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Calculates boundary for minutes" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Calculates boundary for minutes + +```gwt +Given the module is imported from platform-core +When I calculate the window boundary for "30m" at timestamp 1000000000 +Then the boundary is 1000000000 minus 30 minutes in milliseconds +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-042-uses-date-now-when-now-is-not-provided.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-042-uses-date-now-when-now-is-not-provided.sdp.md index 246da1c6..8da338ab 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-042-uses-date-now-when-now-is-not-provided.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-042-uses-date-now-when-now-is-not-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Uses Date.now when now is not provided" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Uses Date.now when now is not provided + +```gwt +Given the module is imported from platform-core +When I calculate the window boundary for "7d" without providing now +Then the boundary is approximately Date.now minus 7 days +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-043-throws-error-for-invalid-duration-format.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-043-throws-error-for-invalid-duration-format.sdp.md index f06d9fc2..919ce619 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-043-throws-error-for-invalid-duration-format.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-043-throws-error-for-invalid-duration-format.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws error for invalid duration format" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Throws error for invalid duration format + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then calculateWindowBoundary with duration "invalid" throws "Invalid duration format" +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-044-includes-events-within-the-window.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-044-includes-events-within-the-window.sdp.md index 23f05710..23f11bfd 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-044-includes-events-within-the-window.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-044-includes-events-within-the-window.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Includes events within the window" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Includes events within the window + +```gwt +Given the module is imported from platform-core +And events at offsets 100 and 200 from the 1h boundary at timestamp 1000000000 +When I filter events in a 1h window at timestamp 1000000000 +Then 2 events are returned +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-045-excludes-events-outside-the-window.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-045-excludes-events-outside-the-window.sdp.md index 8896efd7..2d6fa6a1 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-045-excludes-events-outside-the-window.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-045-excludes-events-outside-the-window.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Excludes events outside the window" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Excludes events outside the window + +```gwt +Given the module is imported from platform-core +And events at offsets -100 and 100 from the 1h boundary at timestamp 1000000000 +When I filter events in a 1h window at timestamp 1000000000 +Then 1 event is returned with eventId "evt2" +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-046-includes-events-exactly-at-the-boundary.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-046-includes-events-exactly-at-the-boundary.sdp.md index c55e78e1..dc9c9343 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-046-includes-events-exactly-at-the-boundary.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-046-includes-events-exactly-at-the-boundary.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Includes events exactly at the boundary" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Includes events exactly at the boundary + +```gwt +Given the module is imported from platform-core +And an event exactly at the 1h boundary at timestamp 1000000000 +When I filter events in a 1h window at timestamp 1000000000 +Then 1 event is returned +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-047-applies-event-limit-and-takes-most-recent.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-047-applies-event-limit-and-takes-most-recent.sdp.md index 524700d7..6c2ab21b 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-047-applies-event-limit-and-takes-most-recent.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-047-applies-event-limit-and-takes-most-recent.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Applies event limit and takes most recent" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Applies event limit and takes most recent + +```gwt +Given the module is imported from platform-core +And 3 events at offsets 100 200 300 from the 1h boundary at timestamp 1000000000 +When I filter events in a 1h window with eventLimit 2 at timestamp 1000000000 +Then 2 events are returned containing eventIds "evt2" and "evt3" +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-048-does-not-limit-when-under-event-limit.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-048-does-not-limit-when-under-event-limit.sdp.md index 0f4e45fb..332867f2 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-048-does-not-limit-when-under-event-limit.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-048-does-not-limit-when-under-event-limit.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Does not limit when under event limit" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Does not limit when under event limit + +```gwt +Given the module is imported from platform-core +And events at offsets 100 and 200 from the 1h boundary at timestamp 1000000000 +When I filter events in a 1h window with eventLimit 10 at timestamp 1000000000 +Then 2 events are returned +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-049-returns-empty-array-when-no-events-match.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-049-returns-empty-array-when-no-events-match.sdp.md index 5f96858a..829f08e8 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-049-returns-empty-array-when-no-events-match.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-049-returns-empty-array-when-no-events-match.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns empty array when no events match" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns empty array when no events match + +```gwt +Given the module is imported from platform-core +And events at offsets -1000 and -2000 from the 1h boundary at timestamp 1000000000 +When I filter events in a 1h window at timestamp 1000000000 +Then 0 events are returned +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-050-handles-empty-events-array.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-050-handles-empty-events-array.sdp.md index 62398525..eface5d8 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-050-handles-empty-events-array.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-050-handles-empty-events-array.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles empty events array" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Handles empty events array + +```gwt +Given the module is imported from platform-core +When I filter an empty array in a 1h window at timestamp 1000000000 +Then 0 events are returned +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-051-returns-true-when-events-count-meets-min-events.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-051-returns-true-when-events-count-meets-min-events.sdp.md index 5d98f22c..0640a558 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-051-returns-true-when-events-count-meets-min-events.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-051-returns-true-when-events-count-meets-min-events.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when events count meets minEvents" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns true when events count meets minEvents + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then hasMinimumEvents with 3 events and minEvents 3 is true +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-052-returns-true-when-events-count-exceeds-min-events.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-052-returns-true-when-events-count-exceeds-min-events.sdp.md index 51f7b55a..f2648a9b 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-052-returns-true-when-events-count-exceeds-min-events.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-052-returns-true-when-events-count-exceeds-min-events.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when events count exceeds minEvents" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns true when events count exceeds minEvents + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then hasMinimumEvents with 3 events and minEvents 2 is true +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-053-returns-false-when-events-count-is-below-min-events.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-053-returns-false-when-events-count-is-below-min-events.sdp.md index 72a983bd..8c8b103e 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-053-returns-false-when-events-count-is-below-min-events.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-053-returns-false-when-events-count-is-below-min-events.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when events count is below minEvents" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns false when events count is below minEvents + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then hasMinimumEvents with 2 events and minEvents 5 is false +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-054-defaults-to-min-events-of-1.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-054-defaults-to-min-events-of-1.sdp.md index 9d06b3d6..49efff32 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-054-defaults-to-min-events-of-1.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-054-defaults-to-min-events-of-1.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Defaults to minEvents of 1" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Defaults to minEvents of 1 + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then hasMinimumEvents with 1 event and no minEvents is true +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-055-returns-false-for-empty-events-when-min-events-is-default.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-055-returns-false-for-empty-events-when-min-events-is-default.sdp.md index ef905cf7..c882fab5 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-055-returns-false-for-empty-events-when-min-events-is-default.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-055-returns-false-for-empty-events-when-min-events-is-default.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for empty events when minEvents is default" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns false for empty events when minEvents is default + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then hasMinimumEvents with 0 events and no minEvents is false +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-056-returns-true-when-event-count-meets-threshold.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-056-returns-true-when-event-count-meets-threshold.sdp.md index 77f09777..eeeb2f2e 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-056-returns-true-when-event-count-meets-threshold.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-056-returns-true-when-event-count-meets-threshold.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when event count meets threshold" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns true when event count meets threshold + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then countThreshold 3 with 3 events returns true +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-057-returns-true-when-event-count-exceeds-threshold.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-057-returns-true-when-event-count-exceeds-threshold.sdp.md index df53808d..04869bf6 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-057-returns-true-when-event-count-exceeds-threshold.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-057-returns-true-when-event-count-exceeds-threshold.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when event count exceeds threshold" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns true when event count exceeds threshold + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then countThreshold 2 with 3 events returns true +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-058-returns-false-when-event-count-is-below-threshold.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-058-returns-false-when-event-count-is-below-threshold.sdp.md index 835d665b..67f47308 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-058-returns-false-when-event-count-is-below-threshold.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-058-returns-false-when-event-count-is-below-threshold.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when event count is below threshold" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns false when event count is below threshold + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then countThreshold 5 with 2 events returns false +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-059-returns-true-when-event-type-is-present.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-059-returns-true-when-event-type-is-present.sdp.md index 785d8afc..231a1a04 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-059-returns-true-when-event-type-is-present.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-059-returns-true-when-event-type-is-present.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when event type is present" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns true when event type is present + +```gwt +Given the module is imported from platform-core +And events with types "OrderCreated" and "OrderCancelled" +When I check eventTypePresent for "OrderCancelled" +Then the trigger returns true +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-060-returns-false-when-event-type-is-not-present.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-060-returns-false-when-event-type-is-not-present.sdp.md index da4e0819..bbf69e16 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-060-returns-false-when-event-type-is-not-present.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-060-returns-false-when-event-type-is-not-present.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when event type is not present" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns false when event type is not present + +```gwt +Given the module is imported from platform-core +And events with types "OrderCreated" and "OrderShipped" +When I check eventTypePresent for "OrderCancelled" +Then the trigger returns false +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-061-returns-true-when-any-of-multiple-event-types-is-present.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-061-returns-true-when-any-of-multiple-event-types-is-present.sdp.md index 3eff9ed8..4f91d854 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-061-returns-true-when-any-of-multiple-event-types-is-present.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-061-returns-true-when-any-of-multiple-event-types-is-present.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when any of multiple event types is present" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns true when any of multiple event types is present + +```gwt +Given the module is imported from platform-core +And events with types "OrderRefunded" +When I check eventTypePresent for "OrderCancelled" or "OrderRefunded" +Then the trigger returns true +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-062-respects-min-count-parameter.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-062-respects-min-count-parameter.sdp.md index c05ba0df..2d72cd77 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-062-respects-min-count-parameter.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-062-respects-min-count-parameter.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Respects minCount parameter" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Respects minCount parameter + +```gwt +Given the module is imported from platform-core +And 2 events of type "OrderCancelled" +When I check eventTypePresent for "OrderCancelled" with minCount 3 +Then the trigger returns false +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-063-returns-true-when-min-count-is-met.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-063-returns-true-when-min-count-is-met.sdp.md index d8559e00..f86c9191 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-063-returns-true-when-min-count-is-met.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-063-returns-true-when-min-count-is-met.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when minCount is met" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns true when minCount is met + +```gwt +Given the module is imported from platform-core +And 3 events of type "OrderCancelled" +When I check eventTypePresent for "OrderCancelled" with minCount 3 +Then the trigger returns true +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-064-returns-true-when-minimum-streams-are-present.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-064-returns-true-when-minimum-streams-are-present.sdp.md index 7447dcf6..54af139d 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-064-returns-true-when-minimum-streams-are-present.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-064-returns-true-when-minimum-streams-are-present.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when minimum streams are present" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns true when minimum streams are present + +```gwt +Given the module is imported from platform-core +And events from streams "stream-1" and "stream-2" +When I check multiStreamPresent with minimum 2 +Then the trigger returns true +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-065-returns-false-when-below-minimum-streams.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-065-returns-false-when-below-minimum-streams.sdp.md index 498ab113..8c68e962 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-065-returns-false-when-below-minimum-streams.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-065-returns-false-when-below-minimum-streams.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when below minimum streams" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns false when below minimum streams + +```gwt +Given the module is imported from platform-core +And events from streams "stream-1" and "stream-2" +When I check multiStreamPresent with minimum 3 +Then the trigger returns false +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-066-counts-unique-streams-correctly.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-066-counts-unique-streams-correctly.sdp.md index 3ec4e855..e974e0f6 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-066-counts-unique-streams-correctly.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-066-counts-unique-streams-correctly.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Counts unique streams correctly" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Counts unique streams correctly + +```gwt +Given the module is imported from platform-core +And 3 events all from stream "stream-1" +When I check multiStreamPresent with minimum 2 +Then the trigger returns false +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-067-returns-true-when-all-triggers-match.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-067-returns-true-when-all-triggers-match.sdp.md index 71234555..c4dccc86 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-067-returns-true-when-all-triggers-match.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-067-returns-true-when-all-triggers-match.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when ALL triggers match" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns true when ALL triggers match + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then all() with two true triggers returns true +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-068-returns-false-when-any-trigger-does-not-match.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-068-returns-false-when-any-trigger-does-not-match.sdp.md index c7333be8..6c9b3a1f 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-068-returns-false-when-any-trigger-does-not-match.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-068-returns-false-when-any-trigger-does-not-match.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when ANY trigger does not match" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns false when ANY trigger does not match + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then all() with one true and one false trigger returns false +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-069-returns-false-when-no-triggers-match.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-069-returns-false-when-no-triggers-match.sdp.md index 6ea236a1..b46cb663 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-069-returns-false-when-no-triggers-match.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-069-returns-false-when-no-triggers-match.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when NO triggers match" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns false when NO triggers match + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then all() with two false triggers returns false +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-070-returns-true-for-empty-triggers-array.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-070-returns-true-for-empty-triggers-array.sdp.md index 0857f0f3..88a53dd0 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-070-returns-true-for-empty-triggers-array.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-070-returns-true-for-empty-triggers-array.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for empty triggers array" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns true for empty triggers array + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then all() with no triggers returns true +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-071-passes-events-to-each-trigger.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-071-passes-events-to-each-trigger.sdp.md index e66159dc..a6124cad 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-071-passes-events-to-each-trigger.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-071-passes-events-to-each-trigger.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Passes events to each trigger" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Passes events to each trigger + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then all() passes the events array to each trigger +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-072-returns-true-when-any-trigger-matches.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-072-returns-true-when-any-trigger-matches.sdp.md index 09955289..91825f02 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-072-returns-true-when-any-trigger-matches.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-072-returns-true-when-any-trigger-matches.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when ANY trigger matches" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns true when ANY trigger matches + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then any() with one false and one true trigger returns true +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-073-returns-true-when-all-triggers-match.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-073-returns-true-when-all-triggers-match.sdp.md index 416ad6d4..97e48b3e 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-073-returns-true-when-all-triggers-match.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-073-returns-true-when-all-triggers-match.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when ALL triggers match" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns true when ALL triggers match + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then any() with two true triggers returns true +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-074-returns-false-when-no-triggers-match.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-074-returns-false-when-no-triggers-match.sdp.md index 8914ee75..e2a2c6a9 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-074-returns-false-when-no-triggers-match.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-074-returns-false-when-no-triggers-match.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when NO triggers match" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns false when NO triggers match + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then any() with two false triggers returns false +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-075-returns-false-for-empty-triggers-array.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-075-returns-false-for-empty-triggers-array.sdp.md index 38b6f94d..1c6eda92 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-075-returns-false-for-empty-triggers-array.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-075-returns-false-for-empty-triggers-array.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for empty triggers array" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Returns false for empty triggers array + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then any() with no triggers returns false +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-076-short-circuits-on-first-match.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-076-short-circuits-on-first-match.sdp.md index 43f34985..d0a5cf4d 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-076-short-circuits-on-first-match.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-076-short-circuits-on-first-match.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Short-circuits on first match" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Short-circuits on first match + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then any() calls the first trigger +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-077-combines-count-threshold-with-event-type-using-all.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-077-combines-count-threshold-with-event-type-using-all.sdp.md index eee1479b..165cc216 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-077-combines-count-threshold-with-event-type-using-all.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-077-combines-count-threshold-with-event-type-using-all.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Combines count threshold with event type using all" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Combines count threshold with event type using all + +```gwt +Given the module is imported from platform-core +And 3 events where one is "OrderCancelled" +When I check all(countThreshold 3, eventTypePresent "OrderCancelled") +Then the trigger returns true +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-078-fails-all-when-event-type-missing-despite-count-met.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-078-fails-all-when-event-type-missing-despite-count-met.sdp.md index 488cba96..d1f1e166 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-078-fails-all-when-event-type-missing-despite-count-met.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-078-fails-all-when-event-type-missing-despite-count-met.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Fails all when event type missing despite count met" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Fails all when event type missing despite count met + +```gwt +Given the module is imported from platform-core +And 3 events with no "OrderCancelled" +When I check all(countThreshold 3, eventTypePresent "OrderCancelled") +Then the trigger returns false +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-079-combines-any-with-count-thresholds-alert-present.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-079-combines-any-with-count-thresholds-alert-present.sdp.md index 47fb0605..887c9c98 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-079-combines-any-with-count-thresholds-alert-present.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-079-combines-any-with-count-thresholds-alert-present.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Combines any with count thresholds - alert present" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Combines any with count thresholds - alert present + +```gwt +Given the module is imported from platform-core +And 5 events where first is "HighPriorityAlert" +When I check any(countThreshold 10, eventTypePresent "HighPriorityAlert") +Then the trigger returns true +``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-080-combines-any-with-count-thresholds-neither-condition-met.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-080-combines-any-with-count-thresholds-neither-condition-met.sdp.md index c6c22a4f..7757c850 100644 --- a/specs/behavior/platform-core/agent/patterns.examples/s-080-combines-any-with-count-thresholds-neither-condition-met.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.examples/s-080-combines-any-with-count-thresholds-neither-condition-met.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Combines any with count thresholds - neither condition met" from packages/platform-core/tests/features/behavior/agent/patterns.feature +- outcome: Executable scenario: Combines any with count thresholds - neither condition met + +```gwt +Given the module is imported from platform-core +And 5 regular events +When I check any(countThreshold 10, eventTypePresent "HighPriorityAlert") +Then the trigger returns false +``` diff --git a/specs/behavior/platform-core/agent/patterns.sdp.md b/specs/behavior/platform-core/agent/patterns.sdp.md index 229a79d6..acd04b18 100644 --- a/specs/behavior/platform-core/agent/patterns.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.sdp.md @@ -10,4 +10,22 @@ relations: ## Intent -- outcome: Pure functions for pattern detection including duration parsing, schema validation, pattern definition validation, window boundary calculations, event filtering, minimum event checks, and composable pattern trigger factories. (test carrier: packages/platform-core/tests/features/behavior/agent/patterns.feature) +- outcome: Pattern Detection Framework + +## Behavior + +- rule: Error codes are defined as a complete enumeration +- rule: PatternWindowSchema validates window configuration via Zod +- rule: Duration parsing converts duration strings to milliseconds +- rule: isValidDuration checks format validity +- rule: Pattern definition validation catches invalid configurations +- rule: definePattern factory validates and returns definitions +- rule: Window boundary calculation subtracts parsed duration from now +- rule: Event filtering applies time window and optional event limit +- rule: hasMinimumEvents checks count against window minEvents +- rule: countThreshold trigger fires when event count meets threshold +- rule: eventTypePresent trigger checks for specific event types +- rule: multiStreamPresent trigger checks for events from distinct streams +- rule: PatternTriggers.all combines triggers with AND logic +- rule: PatternTriggers.any combines triggers with OR logic +- rule: Complex trigger combinations compose correctly diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-001-all-expected-error-codes-are-present-with-correct-values.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-001-all-expected-error-codes-are-present-with-correct-values.sdp.md index c04f1596..6cd1cdfe 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-001-all-expected-error-codes-are-present-with-correct-values.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-001-all-expected-error-codes-are-present-with-correct-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "All expected error codes are present with correct values" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: All expected error codes are present with correct values + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then RATE_LIMIT_ERROR_CODES contains all of: +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-002-error-codes-object-has-exactly-8-entries.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-002-error-codes-object-has-exactly-8-entries.sdp.md index f1a69802..d229cce1 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-002-error-codes-object-has-exactly-8-entries.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-002-error-codes-object-has-exactly-8-entries.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Error codes object has exactly 8 entries" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Error codes object has exactly 8 entries + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then RATE_LIMIT_ERROR_CODES has 8 entries +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-003-accepts-valid-cost-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-003-accepts-valid-cost-budget.sdp.md index 4c10d2a0..df2043e9 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-003-accepts-valid-cost-budget.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-003-accepts-valid-cost-budget.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts valid cost budget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Accepts valid cost budget + +```gwt +Given the module is imported from platform-core +When I parse a cost budget with daily 10 and alertThreshold 0.8 +Then the schema parse succeeds +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-004-rejects-budget-with-zero-daily.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-004-rejects-budget-with-zero-daily.sdp.md index 9834faa6..500b7993 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-004-rejects-budget-with-zero-daily.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-004-rejects-budget-with-zero-daily.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects budget with zero daily" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Rejects budget with zero daily + +```gwt +Given the module is imported from platform-core +When I parse a cost budget with daily 0 and alertThreshold 0.8 +Then the schema parse fails +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-005-rejects-budget-with-negative-daily.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-005-rejects-budget-with-negative-daily.sdp.md index 42664158..76f2e5e6 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-005-rejects-budget-with-negative-daily.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-005-rejects-budget-with-negative-daily.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects budget with negative daily" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Rejects budget with negative daily + +```gwt +Given the module is imported from platform-core +When I parse a cost budget with daily -10 and alertThreshold 0.8 +Then the schema parse fails +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-006-rejects-budget-with-alert-threshold-above-1.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-006-rejects-budget-with-alert-threshold-above-1.sdp.md index dbbb53d3..e272c7a3 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-006-rejects-budget-with-alert-threshold-above-1.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-006-rejects-budget-with-alert-threshold-above-1.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects budget with alertThreshold above 1" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Rejects budget with alertThreshold above 1 + +```gwt +Given the module is imported from platform-core +When I parse a cost budget with daily 10 and alertThreshold 1.5 +Then the schema parse fails +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-007-rejects-budget-with-negative-alert-threshold.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-007-rejects-budget-with-negative-alert-threshold.sdp.md index 0dacdb59..5020b0a0 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-007-rejects-budget-with-negative-alert-threshold.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-007-rejects-budget-with-negative-alert-threshold.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects budget with negative alertThreshold" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Rejects budget with negative alertThreshold + +```gwt +Given the module is imported from platform-core +When I parse a cost budget with daily 10 and alertThreshold -0.1 +Then the schema parse fails +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-008-accepts-alert-threshold-at-boundary-0.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-008-accepts-alert-threshold-at-boundary-0.sdp.md index 4f33621d..30770a4f 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-008-accepts-alert-threshold-at-boundary-0.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-008-accepts-alert-threshold-at-boundary-0.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts alertThreshold at boundary 0" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Accepts alertThreshold at boundary 0 + +```gwt +Given the module is imported from platform-core +When I parse a cost budget with daily 10 and alertThreshold 0 +Then the schema parse succeeds +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-009-accepts-alert-threshold-at-boundary-1.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-009-accepts-alert-threshold-at-boundary-1.sdp.md index eed3007d..eaa07991 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-009-accepts-alert-threshold-at-boundary-1.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-009-accepts-alert-threshold-at-boundary-1.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts alertThreshold at boundary 1" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Accepts alertThreshold at boundary 1 + +```gwt +Given the module is imported from platform-core +When I parse a cost budget with daily 10 and alertThreshold 1 +Then the schema parse succeeds +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-010-accepts-valid-config-with-required-fields-only.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-010-accepts-valid-config-with-required-fields-only.sdp.md index 55698a1c..7f98c6f9 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-010-accepts-valid-config-with-required-fields-only.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-010-accepts-valid-config-with-required-fields-only.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts valid config with required fields only" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Accepts valid config with required fields only + +```gwt +Given the module is imported from platform-core +When I parse a rate limit config with maxRequestsPerMinute 60 +Then the schema parse succeeds +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-011-accepts-config-with-all-optional-fields.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-011-accepts-config-with-all-optional-fields.sdp.md index 276295cd..188ef33a 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-011-accepts-config-with-all-optional-fields.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-011-accepts-config-with-all-optional-fields.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts config with all optional fields" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Accepts config with all optional fields + +```gwt +Given the module is imported from platform-core +When I parse a full rate limit config with maxRequestsPerMinute 60 and maxConcurrent 5 and queueDepth 100 and budget +Then the schema parse succeeds +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-012-rejects-config-with-zero-max-requests-per-minute.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-012-rejects-config-with-zero-max-requests-per-minute.sdp.md index e72dda30..0ee43378 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-012-rejects-config-with-zero-max-requests-per-minute.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-012-rejects-config-with-zero-max-requests-per-minute.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects config with zero maxRequestsPerMinute" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Rejects config with zero maxRequestsPerMinute + +```gwt +Given the module is imported from platform-core +When I parse a rate limit config with maxRequestsPerMinute 0 +Then the schema parse fails +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-013-rejects-config-with-negative-max-requests-per-minute.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-013-rejects-config-with-negative-max-requests-per-minute.sdp.md index 83a5e56a..e25f009b 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-013-rejects-config-with-negative-max-requests-per-minute.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-013-rejects-config-with-negative-max-requests-per-minute.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects config with negative maxRequestsPerMinute" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Rejects config with negative maxRequestsPerMinute + +```gwt +Given the module is imported from platform-core +When I parse a rate limit config with maxRequestsPerMinute -10 +Then the schema parse fails +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-014-rejects-config-with-non-integer-max-requests-per-minute.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-014-rejects-config-with-non-integer-max-requests-per-minute.sdp.md index 076b62e4..33027490 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-014-rejects-config-with-non-integer-max-requests-per-minute.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-014-rejects-config-with-non-integer-max-requests-per-minute.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects config with non-integer maxRequestsPerMinute" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Rejects config with non-integer maxRequestsPerMinute + +```gwt +Given the module is imported from platform-core +When I parse a rate limit config with maxRequestsPerMinute 60.5 +Then the schema parse fails +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-015-rejects-config-with-zero-max-concurrent.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-015-rejects-config-with-zero-max-concurrent.sdp.md index e4ded31c..a73297d7 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-015-rejects-config-with-zero-max-concurrent.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-015-rejects-config-with-zero-max-concurrent.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects config with zero maxConcurrent" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Rejects config with zero maxConcurrent + +```gwt +Given the module is imported from platform-core +When I parse a rate limit config with maxRequestsPerMinute 60 and maxConcurrent 0 +Then the schema parse fails +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-016-rejects-config-with-zero-queue-depth.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-016-rejects-config-with-zero-queue-depth.sdp.md index fadd7ab9..bd57c1f0 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-016-rejects-config-with-zero-queue-depth.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-016-rejects-config-with-zero-queue-depth.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects config with zero queueDepth" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Rejects config with zero queueDepth + +```gwt +Given the module is imported from platform-core +When I parse a rate limit config with maxRequestsPerMinute 60 and queueDepth 0 +Then the schema parse fails +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-017-returns-invalid-when-max-requests-per-minute-is-undefined.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-017-returns-invalid-when-max-requests-per-minute-is-undefined.sdp.md index 3446fdea..bde016b9 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-017-returns-invalid-when-max-requests-per-minute-is-undefined.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-017-returns-invalid-when-max-requests-per-minute-is-undefined.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when maxRequestsPerMinute is undefined" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns invalid when maxRequestsPerMinute is undefined + +```gwt +Given the module is imported from platform-core +When I validate a rate limit config with no maxRequestsPerMinute +Then the validation result is invalid +And the validation error code is "INVALID_RATE_LIMIT_CONFIG" +And the validation error message contains "maxRequestsPerMinute" +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-018-returns-invalid-when-max-requests-per-minute-is-zero.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-018-returns-invalid-when-max-requests-per-minute-is-zero.sdp.md index 3e59bd24..bd2eb568 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-018-returns-invalid-when-max-requests-per-minute-is-zero.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-018-returns-invalid-when-max-requests-per-minute-is-zero.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when maxRequestsPerMinute is zero" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns invalid when maxRequestsPerMinute is zero + +```gwt +Given the module is imported from platform-core +When I validate a rate limit config with maxRequestsPerMinute 0 +Then the validation result is invalid +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-019-returns-invalid-when-max-requests-per-minute-is-negative.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-019-returns-invalid-when-max-requests-per-minute-is-negative.sdp.md index de52faf9..55a1a359 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-019-returns-invalid-when-max-requests-per-minute-is-negative.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-019-returns-invalid-when-max-requests-per-minute-is-negative.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when maxRequestsPerMinute is negative" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns invalid when maxRequestsPerMinute is negative + +```gwt +Given the module is imported from platform-core +When I validate a rate limit config with maxRequestsPerMinute -10 +Then the validation result is invalid +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-020-returns-invalid-when-max-requests-per-minute-is-not-an-integer.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-020-returns-invalid-when-max-requests-per-minute-is-not-an-integer.sdp.md index e7f27625..9fbf1e49 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-020-returns-invalid-when-max-requests-per-minute-is-not-an-integer.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-020-returns-invalid-when-max-requests-per-minute-is-not-an-integer.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when maxRequestsPerMinute is not an integer" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns invalid when maxRequestsPerMinute is not an integer + +```gwt +Given the module is imported from platform-core +When I validate a rate limit config with maxRequestsPerMinute 60.5 +Then the validation result is invalid +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-021-returns-valid-for-positive-integer-max-requests-per-minute.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-021-returns-valid-for-positive-integer-max-requests-per-minute.sdp.md index dbd9c90f..fa02df12 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-021-returns-valid-for-positive-integer-max-requests-per-minute.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-021-returns-valid-for-positive-integer-max-requests-per-minute.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns valid for positive integer maxRequestsPerMinute" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns valid for positive integer maxRequestsPerMinute + +```gwt +Given the module is imported from platform-core +When I validate a rate limit config with maxRequestsPerMinute 60 +Then the validation result is valid +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-022-returns-invalid-when-max-concurrent-is-zero.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-022-returns-invalid-when-max-concurrent-is-zero.sdp.md index af6761ce..67ffe41b 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-022-returns-invalid-when-max-concurrent-is-zero.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-022-returns-invalid-when-max-concurrent-is-zero.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when maxConcurrent is zero" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns invalid when maxConcurrent is zero + +```gwt +Given the module is imported from platform-core +When I validate a rate limit config with maxRequestsPerMinute 60 and maxConcurrent 0 +Then the validation result is invalid +And the validation error message contains "maxConcurrent" +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-023-returns-invalid-when-max-concurrent-is-negative.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-023-returns-invalid-when-max-concurrent-is-negative.sdp.md index 85d30ee8..01da95a4 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-023-returns-invalid-when-max-concurrent-is-negative.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-023-returns-invalid-when-max-concurrent-is-negative.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when maxConcurrent is negative" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns invalid when maxConcurrent is negative + +```gwt +Given the module is imported from platform-core +When I validate a rate limit config with maxRequestsPerMinute 60 and maxConcurrent -5 +Then the validation result is invalid +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-024-returns-invalid-when-max-concurrent-is-not-an-integer.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-024-returns-invalid-when-max-concurrent-is-not-an-integer.sdp.md index af67b42a..28f5bcc5 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-024-returns-invalid-when-max-concurrent-is-not-an-integer.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-024-returns-invalid-when-max-concurrent-is-not-an-integer.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when maxConcurrent is not an integer" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns invalid when maxConcurrent is not an integer + +```gwt +Given the module is imported from platform-core +When I validate a rate limit config with maxRequestsPerMinute 60 and maxConcurrent 5.5 +Then the validation result is invalid +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-025-returns-valid-when-max-concurrent-is-undefined.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-025-returns-valid-when-max-concurrent-is-undefined.sdp.md index f3db9065..f6cc07bd 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-025-returns-valid-when-max-concurrent-is-undefined.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-025-returns-valid-when-max-concurrent-is-undefined.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns valid when maxConcurrent is undefined" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns valid when maxConcurrent is undefined + +```gwt +Given the module is imported from platform-core +When I validate a rate limit config with maxRequestsPerMinute 60 +Then the validation result is valid +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-026-returns-invalid-when-queue-depth-is-zero.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-026-returns-invalid-when-queue-depth-is-zero.sdp.md index eda2cbaf..b4b53d69 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-026-returns-invalid-when-queue-depth-is-zero.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-026-returns-invalid-when-queue-depth-is-zero.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when queueDepth is zero" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns invalid when queueDepth is zero + +```gwt +Given the module is imported from platform-core +When I validate a rate limit config with maxRequestsPerMinute 60 and queueDepth 0 +Then the validation result is invalid +And the validation error message contains "queueDepth" +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-027-returns-invalid-when-queue-depth-is-negative.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-027-returns-invalid-when-queue-depth-is-negative.sdp.md index 4536208f..d272e647 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-027-returns-invalid-when-queue-depth-is-negative.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-027-returns-invalid-when-queue-depth-is-negative.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when queueDepth is negative" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns invalid when queueDepth is negative + +```gwt +Given the module is imported from platform-core +When I validate a rate limit config with maxRequestsPerMinute 60 and queueDepth -100 +Then the validation result is invalid +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-028-returns-invalid-when-queue-depth-is-not-an-integer.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-028-returns-invalid-when-queue-depth-is-not-an-integer.sdp.md index 2f3dfe7f..c89efc46 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-028-returns-invalid-when-queue-depth-is-not-an-integer.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-028-returns-invalid-when-queue-depth-is-not-an-integer.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when queueDepth is not an integer" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns invalid when queueDepth is not an integer + +```gwt +Given the module is imported from platform-core +When I validate a rate limit config with maxRequestsPerMinute 60 and queueDepth 100.5 +Then the validation result is invalid +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-029-returns-invalid-when-cost-budget-daily-is-zero.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-029-returns-invalid-when-cost-budget-daily-is-zero.sdp.md index dc3fc6f3..72a6943d 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-029-returns-invalid-when-cost-budget-daily-is-zero.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-029-returns-invalid-when-cost-budget-daily-is-zero.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when costBudget daily is zero" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns invalid when costBudget daily is zero + +```gwt +Given the module is imported from platform-core +When I validate a rate limit config with maxRequestsPerMinute 60 and costBudget daily 0 alertThreshold 0.8 +Then the validation result is invalid +And the validation error message contains "daily" +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-030-returns-invalid-when-cost-budget-daily-is-negative.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-030-returns-invalid-when-cost-budget-daily-is-negative.sdp.md index 55937f75..b50aaa3e 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-030-returns-invalid-when-cost-budget-daily-is-negative.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-030-returns-invalid-when-cost-budget-daily-is-negative.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when costBudget daily is negative" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns invalid when costBudget daily is negative + +```gwt +Given the module is imported from platform-core +When I validate a rate limit config with maxRequestsPerMinute 60 and costBudget daily -10 alertThreshold 0.8 +Then the validation result is invalid +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-031-returns-invalid-when-cost-budget-alert-threshold-is-below-0.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-031-returns-invalid-when-cost-budget-alert-threshold-is-below-0.sdp.md index 691adfdf..60e276a6 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-031-returns-invalid-when-cost-budget-alert-threshold-is-below-0.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-031-returns-invalid-when-cost-budget-alert-threshold-is-below-0.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when costBudget alertThreshold is below 0" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns invalid when costBudget alertThreshold is below 0 + +```gwt +Given the module is imported from platform-core +When I validate a rate limit config with maxRequestsPerMinute 60 and costBudget daily 10 alertThreshold -0.1 +Then the validation result is invalid +And the validation error message contains "alertThreshold" +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-032-returns-invalid-when-cost-budget-alert-threshold-is-above-1.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-032-returns-invalid-when-cost-budget-alert-threshold-is-above-1.sdp.md index cbdbb862..f2daa28f 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-032-returns-invalid-when-cost-budget-alert-threshold-is-above-1.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-032-returns-invalid-when-cost-budget-alert-threshold-is-above-1.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns invalid when costBudget alertThreshold is above 1" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns invalid when costBudget alertThreshold is above 1 + +```gwt +Given the module is imported from platform-core +When I validate a rate limit config with maxRequestsPerMinute 60 and costBudget daily 10 alertThreshold 1.5 +Then the validation result is invalid +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-033-returns-valid-when-cost-budget-is-valid.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-033-returns-valid-when-cost-budget-is-valid.sdp.md index ffc5d3f2..b0674b83 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-033-returns-valid-when-cost-budget-is-valid.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-033-returns-valid-when-cost-budget-is-valid.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns valid when costBudget is valid" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns valid when costBudget is valid + +```gwt +Given the module is imported from platform-core +When I validate a rate limit config with maxRequestsPerMinute 60 and costBudget daily 10 alertThreshold 0.8 +Then the validation result is valid +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-034-returns-valid-for-complete-valid-config.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-034-returns-valid-for-complete-valid-config.sdp.md index 75abf215..5c2bb1d4 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-034-returns-valid-for-complete-valid-config.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-034-returns-valid-for-complete-valid-config.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns valid for complete valid config" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns valid for complete valid config + +```gwt +Given the module is imported from platform-core +When I validate a complete rate limit config +Then the validation result is valid +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-035-default-config-has-correct-field-values.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-035-default-config-has-correct-field-values.sdp.md index 6f2fb6b6..eb7f55f2 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-035-default-config-has-correct-field-values.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-035-default-config-has-correct-field-values.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Default config has correct field values" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Default config has correct field values + +```gwt +Given the module is imported from platform-core +When I create a default rate limit config +Then the config maxRequestsPerMinute matches the default +And the config maxConcurrent matches the default +And the config queueDepth matches the default +And the config has no costBudget +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-036-default-config-passes-validation.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-036-default-config-passes-validation.sdp.md index ec0c2d2e..3a0248eb 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-036-default-config-passes-validation.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-036-default-config-passes-validation.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Default config passes validation" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Default config passes validation + +```gwt +Given the module is imported from platform-core +When I create a default rate limit config and I validate the created config +Then the validation result is valid +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-037-creates-config-with-specified-daily-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-037-creates-config-with-specified-daily-budget.sdp.md index 527bf105..7328b19c 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-037-creates-config-with-specified-daily-budget.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-037-creates-config-with-specified-daily-budget.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Creates config with specified dailyBudget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Creates config with specified dailyBudget + +```gwt +Given the module is imported from platform-core +When I create a rate limit config with dailyBudget 25 +Then the config costBudget daily is 25 +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-038-uses-default-alert-threshold-when-not-specified.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-038-uses-default-alert-threshold-when-not-specified.sdp.md index e0f6ef0a..8a875c17 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-038-uses-default-alert-threshold-when-not-specified.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-038-uses-default-alert-threshold-when-not-specified.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Uses default alertThreshold when not specified" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Uses default alertThreshold when not specified + +```gwt +Given the module is imported from platform-core +When I create a rate limit config with dailyBudget 10 +Then the config costBudget alertThreshold is 0.8 +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-039-uses-specified-alert-threshold.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-039-uses-specified-alert-threshold.sdp.md index 315980ee..1d367200 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-039-uses-specified-alert-threshold.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-039-uses-specified-alert-threshold.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Uses specified alertThreshold" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Uses specified alertThreshold + +```gwt +Given the module is imported from platform-core +When I create a rate limit config with dailyBudget 10 and alertThreshold 0.5 +Then the config costBudget alertThreshold is 0.5 +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-040-uses-specified-max-requests-per-minute.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-040-uses-specified-max-requests-per-minute.sdp.md index 0da1344d..2359b26f 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-040-uses-specified-max-requests-per-minute.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-040-uses-specified-max-requests-per-minute.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Uses specified maxRequestsPerMinute" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Uses specified maxRequestsPerMinute + +```gwt +Given the module is imported from platform-core +When I create a rate limit config with dailyBudget 10 and maxRequestsPerMinute 30 +Then the config maxRequestsPerMinute is 30 +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-041-uses-default-max-requests-per-minute-when-not-specified.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-041-uses-default-max-requests-per-minute-when-not-specified.sdp.md index 4747f74b..edc2cde2 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-041-uses-default-max-requests-per-minute-when-not-specified.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-041-uses-default-max-requests-per-minute-when-not-specified.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Uses default maxRequestsPerMinute when not specified" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Uses default maxRequestsPerMinute when not specified + +```gwt +Given the module is imported from platform-core +When I create a rate limit config with dailyBudget 10 +Then the config maxRequestsPerMinute matches the default +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-042-includes-all-optional-fields.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-042-includes-all-optional-fields.sdp.md index dfa08e57..e586326e 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-042-includes-all-optional-fields.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-042-includes-all-optional-fields.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Includes all optional fields" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Includes all optional fields + +```gwt +Given the module is imported from platform-core +When I create a rate limit config with dailyBudget 10 and maxRequestsPerMinute 30 and maxConcurrent 3 and queueDepth 50 and alertThreshold 0.7 +Then the config has the following values: +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-043-creates-error-with-code-and-message.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-043-creates-error-with-code-and-message.sdp.md index 0d5d503c..2d523036 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-043-creates-error-with-code-and-message.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-043-creates-error-with-code-and-message.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Creates error with code and message" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Creates error with code and message + +```gwt +Given the module is imported from platform-core +When I create a rate limit error with code "LLM_RATE_LIMITED" and message "Rate limit exceeded" +Then the error code is "LLM_RATE_LIMITED" +And the error message is "Rate limit exceeded" +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-044-creates-error-without-optional-fields-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-044-creates-error-without-optional-fields-when-not-provided.sdp.md index 7e426fe8..b749fcd5 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-044-creates-error-without-optional-fields-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-044-creates-error-without-optional-fields-when-not-provided.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Creates error without optional fields when not provided" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Creates error without optional fields when not provided + +```gwt +Given the module is imported from platform-core +When I create a rate limit error with code "LLM_UNAVAILABLE" and message "Service unavailable" +Then the error retryAfterMs is undefined +And the error context is undefined +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-045-creates-error-with-retry-after-ms-when-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-045-creates-error-with-retry-after-ms-when-provided.sdp.md index 37edf0d3..eb105da6 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-045-creates-error-with-retry-after-ms-when-provided.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-045-creates-error-with-retry-after-ms-when-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Creates error with retryAfterMs when provided" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Creates error with retryAfterMs when provided + +```gwt +Given the module is imported from platform-core +When I create a rate limit error with code "LLM_RATE_LIMITED" and message "Rate limited" and retryAfterMs 5000 +Then the error retryAfterMs is 5000 +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-046-creates-error-with-context-when-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-046-creates-error-with-context-when-provided.sdp.md index dfb5008d..c51e25da 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-046-creates-error-with-context-when-provided.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-046-creates-error-with-context-when-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Creates error with context when provided" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Creates error with context when provided + +```gwt +Given the module is imported from platform-core +When I create a rate limit error with code "QUEUE_OVERFLOW" and message "Queue full" and context queueSize 100 maxSize 100 +Then the error context equals queueSize 100 and maxSize 100 +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-047-creates-error-with-both-retry-after-ms-and-context.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-047-creates-error-with-both-retry-after-ms-and-context.sdp.md index cf9d3e05..c9a629a3 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-047-creates-error-with-both-retry-after-ms-and-context.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-047-creates-error-with-both-retry-after-ms-and-context.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Creates error with both retryAfterMs and context" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Creates error with both retryAfterMs and context + +```gwt +Given the module is imported from platform-core +When I create a rate limit error with code "LLM_TIMEOUT" and message "Timeout" and retryAfterMs 10000 and context attempt 3 +Then the error retryAfterMs is 10000 +And the error context equals attempt 3 +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-048-returns-true-for-valid-rate-limit-error.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-048-returns-true-for-valid-rate-limit-error.sdp.md index 1b811ea1..cd9e4295 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-048-returns-true-for-valid-rate-limit-error.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-048-returns-true-for-valid-rate-limit-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for valid rate limit error" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns true for valid rate limit error + +```gwt +Given the module is imported from platform-core +When I check isRateLimitError for a valid LLM_RATE_LIMITED error +Then the type guard result is true +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-049-returns-true-for-all-known-error-codes.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-049-returns-true-for-all-known-error-codes.sdp.md index 068cd103..7cdaf695 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-049-returns-true-for-all-known-error-codes.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-049-returns-true-for-all-known-error-codes.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for all known error codes" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns true for all known error codes + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isRateLimitError returns true for all known error codes +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-050-returns-false-for-non-error-values.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-050-returns-false-for-non-error-values.sdp.md index 716b4125..8f4c4348 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-050-returns-false-for-non-error-values.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-050-returns-false-for-non-error-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for non-error values" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns false for non-error values + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isRateLimitError returns false for all of: +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-051-retryable-error-codes.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-051-retryable-error-codes.sdp.md index 9ddcccfd..2401df71 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-051-retryable-error-codes.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-051-retryable-error-codes.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Retryable error codes" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Retryable error codes + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isRetryableError returns the expected result for each code: +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-052-returns-false-for-non-rate-limit-errors.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-052-returns-false-for-non-rate-limit-errors.sdp.md index a473c72f..62b9097c 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-052-returns-false-for-non-rate-limit-errors.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-052-returns-false-for-non-rate-limit-errors.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for non-rate-limit errors" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns false for non-rate-limit errors + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isRetryableError returns false for non-error values +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-053-permanent-error-codes.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-053-permanent-error-codes.sdp.md index 9b50f3b1..d2017c99 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-053-permanent-error-codes.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-053-permanent-error-codes.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Permanent error codes" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Permanent error codes + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isPermanentError returns the expected result for each code: +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-054-returns-false-for-non-rate-limit-errors.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-054-returns-false-for-non-rate-limit-errors.sdp.md index 35168cbb..21f28332 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-054-returns-false-for-non-rate-limit-errors.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-054-returns-false-for-non-rate-limit-errors.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for non-rate-limit errors" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns false for non-rate-limit errors + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isPermanentError returns false for non-error values +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-055-exponential-2-n-growth-pattern-with-math-random-mocked-to-0.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-055-exponential-2-n-growth-pattern-with-math-random-mocked-to-0.sdp.md index 29c7a048..deff67e9 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-055-exponential-2-n-growth-pattern-with-math-random-mocked-to-0.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-055-exponential-2-n-growth-pattern-with-math-random-mocked-to-0.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Exponential 2^n growth pattern with Math.random mocked to 0" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Exponential 2^n growth pattern with Math.random mocked to 0 + +```gwt +Given the module is imported from platform-core +When Math.random is mocked to return 0 +Then calculateBackoffDelay returns the expected delays: +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-056-caps-at-default-max-delay-of-60000ms.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-056-caps-at-default-max-delay-of-60000ms.sdp.md index 392e22fc..8f8075f7 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-056-caps-at-default-max-delay-of-60000ms.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-056-caps-at-default-max-delay-of-60000ms.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Caps at default maxDelay of 60000ms" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Caps at default maxDelay of 60000ms + +```gwt +Given the module is imported from platform-core +When Math.random is mocked to return 0 +Then calculateBackoffDelay for attempt 10 with baseDelay 1000 returns 60000 +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-057-caps-at-custom-max-delay.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-057-caps-at-custom-max-delay.sdp.md index 0ad6c19d..b8f912bf 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-057-caps-at-custom-max-delay.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-057-caps-at-custom-max-delay.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Caps at custom maxDelay" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Caps at custom maxDelay + +```gwt +Given the module is imported from platform-core +When Math.random is mocked to return 0 +Then calculateBackoffDelay for attempt 5 with baseDelay 1000 and maxDelay 10000 returns 10000 +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-058-does-not-cap-when-delay-is-below-max.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-058-does-not-cap-when-delay-is-below-max.sdp.md index 9e1888d8..7918486e 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-058-does-not-cap-when-delay-is-below-max.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-058-does-not-cap-when-delay-is-below-max.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Does not cap when delay is below max" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Does not cap when delay is below max + +```gwt +Given the module is imported from platform-core +When Math.random is mocked to return 0 +Then calculateBackoffDelay for attempt 2 with baseDelay 1000 and maxDelay 10000 returns 4000 +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-059-adds-jitter-up-to-25-of-delay.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-059-adds-jitter-up-to-25-of-delay.sdp.md index 3b664336..6c6ddbb1 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-059-adds-jitter-up-to-25-of-delay.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-059-adds-jitter-up-to-25-of-delay.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Adds jitter up to 25% of delay" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Adds jitter up to 25% of delay + +```gwt +Given the module is imported from platform-core +When Math.random is mocked to return 0.5 +Then calculateBackoffDelay for attempt 0 with baseDelay 1000 returns 1125 +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-060-adds-max-jitter-of-25-when-random-is-1.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-060-adds-max-jitter-of-25-when-random-is-1.sdp.md index 4ae2bb75..89a54e44 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-060-adds-max-jitter-of-25-when-random-is-1.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-060-adds-max-jitter-of-25-when-random-is-1.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Adds max jitter of 25% when random is 1" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Adds max jitter of 25% when random is 1 + +```gwt +Given the module is imported from platform-core +When Math.random is mocked to return 1 +Then calculateBackoffDelay for attempt 0 with baseDelay 1000 returns 1250 +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-061-uses-default-base-delay-of-1000ms.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-061-uses-default-base-delay-of-1000ms.sdp.md index 0b6387a8..5680283d 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-061-uses-default-base-delay-of-1000ms.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-061-uses-default-base-delay-of-1000ms.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Uses default base delay of 1000ms" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Uses default base delay of 1000ms + +```gwt +Given the module is imported from platform-core +When Math.random is mocked to return 0 +Then calculateBackoffDelay for attempt 0 with default params returns 1000 +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-062-uses-default-max-delay-of-60000ms.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-062-uses-default-max-delay-of-60000ms.sdp.md index a9c27a75..3ca3d91a 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-062-uses-default-max-delay-of-60000ms.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-062-uses-default-max-delay-of-60000ms.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Uses default max delay of 60000ms" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Uses default max delay of 60000ms + +```gwt +Given the module is imported from platform-core +When Math.random is mocked to return 0 +Then calculateBackoffDelay for attempt 10 with default params returns 60000 +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-063-returns-floored-integer.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-063-returns-floored-integer.sdp.md index cd9a6aa1..6d638263 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-063-returns-floored-integer.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-063-returns-floored-integer.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns floored integer" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns floored integer + +```gwt +Given the module is imported from platform-core +When Math.random is mocked to return 0.333 +Then calculateBackoffDelay for attempt 0 with baseDelay 1000 returns an integer +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-064-returns-true-when-total-exceeds-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-064-returns-true-when-total-exceeds-budget.sdp.md index f5ad933c..20231989 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-064-returns-true-when-total-exceeds-budget.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-064-returns-true-when-total-exceeds-budget.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when total exceeds budget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns true when total exceeds budget + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then wouldExceedBudget for currentSpend 9 estimatedCost 2 and daily 10 returns true +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-065-returns-false-when-total-is-under-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-065-returns-false-when-total-is-under-budget.sdp.md index 7a821438..2f94ad7b 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-065-returns-false-when-total-is-under-budget.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-065-returns-false-when-total-is-under-budget.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when total is under budget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns false when total is under budget + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then wouldExceedBudget for currentSpend 5 estimatedCost 3 and daily 10 returns false +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-066-returns-false-when-total-equals-budget-exactly.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-066-returns-false-when-total-equals-budget-exactly.sdp.md index ad020614..58825c90 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-066-returns-false-when-total-equals-budget-exactly.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-066-returns-false-when-total-equals-budget-exactly.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when total equals budget exactly" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns false when total equals budget exactly + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then wouldExceedBudget for currentSpend 7 estimatedCost 3 and daily 10 returns false +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-067-returns-true-when-current-spend-already-exceeds-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-067-returns-true-when-current-spend-already-exceeds-budget.sdp.md index aff710e5..fe4ede62 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-067-returns-true-when-current-spend-already-exceeds-budget.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-067-returns-true-when-current-spend-already-exceeds-budget.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when current spend already exceeds budget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns true when current spend already exceeds budget + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then wouldExceedBudget for currentSpend 11 estimatedCost 0 and daily 10 returns true +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-068-handles-zero-current-spend-under-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-068-handles-zero-current-spend-under-budget.sdp.md index 41366787..59efa741 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-068-handles-zero-current-spend-under-budget.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-068-handles-zero-current-spend-under-budget.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles zero current spend under budget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Handles zero current spend under budget + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then wouldExceedBudget for currentSpend 0 estimatedCost 5 and daily 10 returns false +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-069-handles-zero-current-spend-over-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-069-handles-zero-current-spend-over-budget.sdp.md index 9dcc2203..12657ecf 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-069-handles-zero-current-spend-over-budget.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-069-handles-zero-current-spend-over-budget.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles zero current spend over budget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Handles zero current spend over budget + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then wouldExceedBudget for currentSpend 0 estimatedCost 15 and daily 10 returns true +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-070-handles-small-decimal-values-under-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-070-handles-small-decimal-values-under-budget.sdp.md index 5bacb595..d4d8b432 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-070-handles-small-decimal-values-under-budget.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-070-handles-small-decimal-values-under-budget.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles small decimal values under budget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Handles small decimal values under budget + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then wouldExceedBudget for currentSpend 0.05 estimatedCost 0.04 and daily 0.1 returns false +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-071-handles-small-decimal-values-over-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-071-handles-small-decimal-values-over-budget.sdp.md index 132d585e..c06d9d85 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-071-handles-small-decimal-values-over-budget.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-071-handles-small-decimal-values-over-budget.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles small decimal values over budget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Handles small decimal values over budget + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then wouldExceedBudget for currentSpend 0.05 estimatedCost 0.06 and daily 0.1 returns true +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-072-returns-true-when-spend-reaches-threshold-percentage.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-072-returns-true-when-spend-reaches-threshold-percentage.sdp.md index 6791dc34..24bdb704 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-072-returns-true-when-spend-reaches-threshold-percentage.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-072-returns-true-when-spend-reaches-threshold-percentage.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when spend reaches threshold percentage" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns true when spend reaches threshold percentage + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isAtAlertThreshold for currentSpend 8 with daily 10 and alertThreshold 0.8 returns true +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-073-returns-true-when-spend-exceeds-threshold.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-073-returns-true-when-spend-exceeds-threshold.sdp.md index ea6ce4df..83338ebe 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-073-returns-true-when-spend-exceeds-threshold.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-073-returns-true-when-spend-exceeds-threshold.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when spend exceeds threshold" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns true when spend exceeds threshold + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isAtAlertThreshold for currentSpend 9 with daily 10 and alertThreshold 0.8 returns true +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-074-returns-false-when-spend-is-below-threshold.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-074-returns-false-when-spend-is-below-threshold.sdp.md index 8853d24f..98ace3e4 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-074-returns-false-when-spend-is-below-threshold.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-074-returns-false-when-spend-is-below-threshold.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when spend is below threshold" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns false when spend is below threshold + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isAtAlertThreshold for currentSpend 7 with daily 10 and alertThreshold 0.8 returns false +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-075-handles-threshold-of-0-always-alert.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-075-handles-threshold-of-0-always-alert.sdp.md index e5f1b5b2..18e61674 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-075-handles-threshold-of-0-always-alert.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-075-handles-threshold-of-0-always-alert.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles threshold of 0 - always alert" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Handles threshold of 0 - always alert + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isAtAlertThreshold for currentSpend 0 with daily 10 and alertThreshold 0 returns true +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-076-handles-threshold-of-1-below-full-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-076-handles-threshold-of-1-below-full-budget.sdp.md index dd2b0dcb..0051c386 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-076-handles-threshold-of-1-below-full-budget.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-076-handles-threshold-of-1-below-full-budget.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles threshold of 1 - below full budget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Handles threshold of 1 - below full budget + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isAtAlertThreshold for currentSpend 9.99 with daily 10 and alertThreshold 1 returns false +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-077-handles-threshold-of-1-at-full-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-077-handles-threshold-of-1-at-full-budget.sdp.md index b8225a29..09945e48 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-077-handles-threshold-of-1-at-full-budget.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-077-handles-threshold-of-1-at-full-budget.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles threshold of 1 - at full budget" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Handles threshold of 1 - at full budget + +```gwt +Given the module is imported from platform-core +When the scenario runs +Then isAtAlertThreshold for currentSpend 10 with daily 10 and alertThreshold 1 returns true +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-078-returns-defaults-when-no-config-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-078-returns-defaults-when-no-config-provided.sdp.md index 27bf9011..e0caf61d 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-078-returns-defaults-when-no-config-provided.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-078-returns-defaults-when-no-config-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns defaults when no config provided" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns defaults when no config provided + +```gwt +Given the module is imported from platform-core +When I get the effective rate limit config with no input +Then the effective config matches all defaults +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-079-returns-defaults-when-undefined-config-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-079-returns-defaults-when-undefined-config-provided.sdp.md index 264e1d96..0d37031c 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-079-returns-defaults-when-undefined-config-provided.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-079-returns-defaults-when-undefined-config-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns defaults when undefined config provided" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Returns defaults when undefined config provided + +```gwt +Given the module is imported from platform-core +When I get the effective rate limit config with undefined input +Then the effective config maxRequestsPerMinute matches the default +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-080-uses-provided-max-requests-per-minute.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-080-uses-provided-max-requests-per-minute.sdp.md index e4a4d74c..0749f1f9 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-080-uses-provided-max-requests-per-minute.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-080-uses-provided-max-requests-per-minute.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Uses provided maxRequestsPerMinute" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Uses provided maxRequestsPerMinute + +```gwt +Given the module is imported from platform-core +When I get the effective rate limit config with maxRequestsPerMinute 30 +Then the effective config maxRequestsPerMinute is 30 +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-081-uses-default-max-concurrent-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-081-uses-default-max-concurrent-when-not-provided.sdp.md index 940b3e12..576765b2 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-081-uses-default-max-concurrent-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-081-uses-default-max-concurrent-when-not-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Uses default maxConcurrent when not provided" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Uses default maxConcurrent when not provided + +```gwt +Given the module is imported from platform-core +When I get the effective rate limit config with maxRequestsPerMinute 30 +Then the effective config maxConcurrent matches the default +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-082-uses-provided-max-concurrent.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-082-uses-provided-max-concurrent.sdp.md index 953e4104..806a6249 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-082-uses-provided-max-concurrent.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-082-uses-provided-max-concurrent.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Uses provided maxConcurrent" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Uses provided maxConcurrent + +```gwt +Given the module is imported from platform-core +When I get the effective rate limit config with maxRequestsPerMinute 30 and maxConcurrent 3 +Then the effective config maxConcurrent is 3 +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-083-uses-default-queue-depth-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-083-uses-default-queue-depth-when-not-provided.sdp.md index 10123706..e2310ddd 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-083-uses-default-queue-depth-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-083-uses-default-queue-depth-when-not-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Uses default queueDepth when not provided" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Uses default queueDepth when not provided + +```gwt +Given the module is imported from platform-core +When I get the effective rate limit config with maxRequestsPerMinute 30 +Then the effective config queueDepth matches the default +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-084-uses-provided-queue-depth.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-084-uses-provided-queue-depth.sdp.md index e5446a9a..20b73f43 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-084-uses-provided-queue-depth.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-084-uses-provided-queue-depth.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Uses provided queueDepth" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Uses provided queueDepth + +```gwt +Given the module is imported from platform-core +When I get the effective rate limit config with maxRequestsPerMinute 30 and queueDepth 50 +Then the effective config queueDepth is 50 +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-085-preserves-cost-budget-when-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-085-preserves-cost-budget-when-provided.sdp.md index 8f638c93..d88800de 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-085-preserves-cost-budget-when-provided.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-085-preserves-cost-budget-when-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Preserves costBudget when provided" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Preserves costBudget when provided + +```gwt +Given the module is imported from platform-core +When I get the effective rate limit config with maxRequestsPerMinute 30 and costBudget daily 10 alertThreshold 0.8 +Then the effective config costBudget equals daily 10 and alertThreshold 0.8 +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-086-does-not-include-cost-budget-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-086-does-not-include-cost-budget-when-not-provided.sdp.md index 267bc228..c8726934 100644 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-086-does-not-include-cost-budget-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.examples/s-086-does-not-include-cost-budget-when-not-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Does not include costBudget when not provided" from packages/platform-core/tests/features/behavior/agent/rate-limit.feature +- outcome: Executable scenario: Does not include costBudget when not provided + +```gwt +Given the module is imported from platform-core +When I get the effective rate limit config with maxRequestsPerMinute 30 +Then the effective config costBudget is undefined +``` diff --git a/specs/behavior/platform-core/agent/rate-limit.sdp.md b/specs/behavior/platform-core/agent/rate-limit.sdp.md index affe1960..93ae240e 100644 --- a/specs/behavior/platform-core/agent/rate-limit.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.sdp.md @@ -10,4 +10,21 @@ relations: ## Intent -- outcome: Pure functions and schemas for LLM rate limiting: error codes, Zod schema validation, config validation, factory functions, type guards, exponential backoff calculation, and budget helpers. (test carrier: packages/platform-core/tests/features/behavior/agent/rate-limit.feature) +- outcome: Rate Limit Module + +## Behavior + +- rule: Error codes enumerate all rate-limit failure modes +- rule: CostBudgetSchema validates budget configuration +- rule: AgentRateLimitConfigSchema validates rate limit configuration +- rule: validateRateLimitConfig catches invalid configurations +- rule: createDefaultRateLimitConfig produces valid defaults +- rule: createRateLimitConfigWithBudget produces config with cost budget +- rule: createRateLimitError builds structured error objects +- rule: isRateLimitError identifies valid rate limit error objects +- rule: isRetryableError identifies transient errors eligible for retry +- rule: isPermanentError identifies non-retryable errors +- rule: calculateBackoffDelay computes exponential backoff with jitter +- rule: wouldExceedBudget checks if estimated cost would exceed daily budget +- rule: isAtAlertThreshold checks if spend ratio meets or exceeds alert threshold +- rule: getEffectiveRateLimitConfig merges provided config with defaults diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-001-calls-generate-text-and-parses-a-valid-json-response.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-001-calls-generate-text-and-parses-a-valid-json-response.sdp.md index 2fec44f0..b34916c2 100644 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-001-calls-generate-text-and-parses-a-valid-json-response.sdp.md +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-001-calls-generate-text-and-parses-a-valid-json-response.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Calls generateText and parses a valid JSON response" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature +- outcome: Executable scenario: Calls generateText and parses a valid JSON response + +```gwt +Given a generateText mock returning a churn-risk JSON response with 100 tokens +When I call analyze with prompt "Detect churn risk" and 2 events +Then generateText was called exactly 1 time +And the analyze result has the following properties: +And the first pattern matchingEventIds are "evt_1" and "evt_2" +``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-002-handles-non-json-response-with-defaults.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-002-handles-non-json-response-with-defaults.sdp.md index 1e565a35..b74c5e77 100644 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-002-handles-non-json-response-with-defaults.sdp.md +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-002-handles-non-json-response-with-defaults.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles non-JSON response with defaults" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature +- outcome: Executable scenario: Handles non-JSON response with defaults + +```gwt +Given a generateText mock returning plain text "This is plain text, not JSON" with 30 tokens +When I call analyze with prompt "Analyze events" and 1 event +Then the analyze result has defaults with reasoning "This is plain text, not JSON" +``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-003-handles-malformed-json-gracefully.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-003-handles-malformed-json-gracefully.sdp.md index bd1bfda5..d9f09804 100644 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-003-handles-malformed-json-gracefully.sdp.md +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-003-handles-malformed-json-gracefully.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles malformed JSON gracefully" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature +- outcome: Executable scenario: Handles malformed JSON gracefully + +```gwt +Given a generateText mock returning plain text "{ not valid json }}}" with 20 tokens +When I call analyze with prompt "Analyze events" and 1 event +Then the analyze result has defaults with reasoning "{ not valid json }}}" +``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-004-re-throws-generate-text-errors.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-004-re-throws-generate-text-errors.sdp.md index b3f9725a..86cb6bab 100644 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-004-re-throws-generate-text-errors.sdp.md +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-004-re-throws-generate-text-errors.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Re-throws generateText errors" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature +- outcome: Executable scenario: Re-throws generateText errors + +```gwt +Given a generateText mock that rejects with "API rate limit exceeded" +When I call analyze expecting an error +Then the error message is "API rate limit exceeded" +``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-005-tracks-timing-in-llm-context.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-005-tracks-timing-in-llm-context.sdp.md index 7c5757d2..6f536178 100644 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-005-tracks-timing-in-llm-context.sdp.md +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-005-tracks-timing-in-llm-context.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Tracks timing in llmContext" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature +- outcome: Executable scenario: Tracks timing in llmContext + +```gwt +Given a generateText mock that takes 250ms and returns 50 tokens +When I call analyze with prompt "Analyze" and 1 event +Then the llmContext has the following timing properties: +``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-006-includes-thread-id-in-llm-context-when-present.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-006-includes-thread-id-in-llm-context-when-present.sdp.md index 44400eeb..39638eeb 100644 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-006-includes-thread-id-in-llm-context-when-present.sdp.md +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-006-includes-thread-id-in-llm-context-when-present.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Includes threadId in llmContext when present" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature +- outcome: Executable scenario: Includes threadId in llmContext when present + +```gwt +Given a generateText mock returning JSON with threadId "thread_abc123" and 50 tokens +When I call analyze with prompt "Analyze" and 1 event +Then the llmContext threadId is "thread_abc123" +``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-007-omits-thread-id-from-llm-context-when-not-present.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-007-omits-thread-id-from-llm-context-when-not-present.sdp.md index 5a542dee..a82d5518 100644 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-007-omits-thread-id-from-llm-context-when-not-present.sdp.md +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-007-omits-thread-id-from-llm-context-when-not-present.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Omits threadId from llmContext when not present" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature +- outcome: Executable scenario: Omits threadId from llmContext when not present + +```gwt +Given a generateText mock returning JSON without threadId and 50 tokens +When I call analyze with prompt "Analyze" and 1 event +Then the llmContext does not contain threadId +``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-008-handles-missing-usage-with-zero-tokens.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-008-handles-missing-usage-with-zero-tokens.sdp.md index 1ad196ff..9f07b412 100644 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-008-handles-missing-usage-with-zero-tokens.sdp.md +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-008-handles-missing-usage-with-zero-tokens.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles missing usage with zero tokens" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature +- outcome: Executable scenario: Handles missing usage with zero tokens + +```gwt +Given a generateText mock returning JSON without usage +When I call analyze with prompt "Analyze" and 1 event +Then the llmContext tokens is 0 +``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-009-calls-generate-text-and-parses-json-response-for-reason.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-009-calls-generate-text-and-parses-json-response-for-reason.sdp.md index 36e6a4df..a5a91302 100644 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-009-calls-generate-text-and-parses-json-response-for-reason.sdp.md +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-009-calls-generate-text-and-parses-json-response-for-reason.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Calls generateText and parses JSON response for reason" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature +- outcome: Executable scenario: Calls generateText and parses JSON response for reason + +```gwt +Given a generateText mock returning a reasoning JSON response with 80 tokens +When I call reason with a test event +Then the reason result is a structured object with observation and implications +``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-010-returns-raw-text-when-response-is-not-json.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-010-returns-raw-text-when-response-is-not-json.sdp.md index c04c7852..eef8b6a0 100644 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-010-returns-raw-text-when-response-is-not-json.sdp.md +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-010-returns-raw-text-when-response-is-not-json.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns raw text when response is not JSON" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature +- outcome: Executable scenario: Returns raw text when response is not JSON + +```gwt +Given a generateText mock returning plain text "This event indicates a potential issue with order fulfillment." with 40 tokens +When I call reason with a test event +Then the reason result is the raw text "This event indicates a potential issue with order fulfillment." +``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-011-re-throws-generate-text-errors-from-reason.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-011-re-throws-generate-text-errors-from-reason.sdp.md index a7375582..3efbafd0 100644 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-011-re-throws-generate-text-errors-from-reason.sdp.md +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-011-re-throws-generate-text-errors-from-reason.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Re-throws generateText errors from reason" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature +- outcome: Executable scenario: Re-throws generateText errors from reason + +```gwt +Given a generateText mock that rejects with "Network error" +When I call reason expecting an error +Then the error message is "Network error" +``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-012-logs-reasoning-start-and-completion.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-012-logs-reasoning-start-and-completion.sdp.md index dae6a8b0..701b6f3e 100644 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-012-logs-reasoning-start-and-completion.sdp.md +++ b/specs/behavior/platform-core/agent/thread-adapter.examples/s-012-logs-reasoning-start-and-completion.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Logs reasoning start and completion" from packages/platform-core/tests/features/behavior/agent/thread-adapter.feature +- outcome: Executable scenario: Logs reasoning start and completion + +```gwt +Given a generateText mock returning JSON with 30 tokens and a mock logger +When I call reason with a PaymentFailed event +Then the logger debug was called with "Starting reasoning" and agentId "test-agent" and eventType "PaymentFailed" +And the logger info was called with "Reasoning completed" and agentId "test-agent" and model "anthropic/claude-sonnet-4-5-20250929" +``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.sdp.md index 6f2cacad..736ee3e4 100644 --- a/specs/behavior/platform-core/agent/thread-adapter.sdp.md +++ b/specs/behavior/platform-core/agent/thread-adapter.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: createThreadAdapter() returns an adapter with analyze() and reason() methods that wrap generateText calls, parse JSON responses, and track LLM context metadata including model, tokens, timing, and threadId. (test carrier: packages/platform-core/tests/features/behavior/agent/thread-adapter.feature) +- outcome: Thread Adapter + +## Behavior + +- rule: analyze() parses JSON responses with patterns, confidence, and reasoning +- rule: analyze() handles non-JSON and malformed responses gracefully +- rule: analyze() re-throws generateText errors +- rule: analyze() tracks timing in llmContext +- rule: analyze() handles threadId presence and absence in llmContext +- rule: analyze() handles missing usage in generateText result +- rule: reason() parses JSON and returns structured data +- rule: reason() falls back to raw text for non-JSON responses +- rule: reason() re-throws generateText errors +- rule: reason() logs reasoning start and completion diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-001-executes-commands-sequentially-in-atomic-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-001-executes-commands-sequentially-in-atomic-mode.sdp.md index 4924d00f..ca54b9fa 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-001-executes-commands-sequentially-in-atomic-mode.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-001-executes-commands-sequentially-in-atomic-mode.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Executes commands sequentially in atomic mode" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Executes commands sequentially in atomic mode + +```gwt +Given a mock executor that succeeds for all commands +And a BatchExecutor with the mock executor and standard registry +And a batch of 3 AddOrderItem commands for order "ord_1" +When the batch is executed in "atomic" mode with aggregateId "ord_1" +Then the batch result status is "success" +And the batch summary shows: +And the executor was called 3 times +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-002-stops-on-first-failure-and-skips-remaining-in-atomic-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-002-stops-on-first-failure-and-skips-remaining-in-atomic-mode.sdp.md index 36737e0e..c2b74442 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-002-stops-on-first-failure-and-skips-remaining-in-atomic-mode.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-002-stops-on-first-failure-and-skips-remaining-in-atomic-mode.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Stops on first failure and skips remaining in atomic mode" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Stops on first failure and skips remaining in atomic mode + +```gwt +Given a failing executor that fails after 1 successful command +And a BatchExecutor with the failing executor and standard registry +And a batch of 3 AddOrderItem commands for order "ord_1" +When the batch is executed in "atomic" mode with aggregateId "ord_1" +Then the batch result status is "failed" +And the batch summary shows: +And the executor was called 2 times +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-003-rejects-batch-for-cross-aggregate-commands-in-atomic-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-003-rejects-batch-for-cross-aggregate-commands-in-atomic-mode.sdp.md index 648b88d5..763fe183 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-003-rejects-batch-for-cross-aggregate-commands-in-atomic-mode.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-003-rejects-batch-for-cross-aggregate-commands-in-atomic-mode.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Rejects batch for cross-aggregate commands in atomic mode" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Rejects batch for cross-aggregate commands in atomic mode + +```gwt +Given a mock executor that succeeds for all commands +And a BatchExecutor with the mock executor and standard registry +And a batch of AddOrderItem commands targeting different orders: +When the batch is executed in "atomic" mode with aggregateId "ord_1" +Then the batch result status is "failed" +And all batch results have status "rejected" +And the executor was not called +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-004-uses-shared-correlation-id-in-atomic-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-004-uses-shared-correlation-id-in-atomic-mode.sdp.md index bff0b6d9..8018d45e 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-004-uses-shared-correlation-id-in-atomic-mode.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-004-uses-shared-correlation-id-in-atomic-mode.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Uses shared correlationId in atomic mode" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Uses shared correlationId in atomic mode + +```gwt +Given a mock executor that succeeds for all commands +And a BatchExecutor with the mock executor and standard registry +And a batch of 2 AddOrderItem commands for order "ord_1" +When the batch is executed in "atomic" mode with aggregateId "ord_1" and correlationId "batch_corr_123" +Then the batch correlationId is "batch_corr_123" +And the executor received correlationId "batch_corr_123" +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-005-allows-command-level-correlation-id-override-in-atomic-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-005-allows-command-level-correlation-id-override-in-atomic-mode.sdp.md index 2575955f..1ee88fbd 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-005-allows-command-level-correlation-id-override-in-atomic-mode.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-005-allows-command-level-correlation-id-override-in-atomic-mode.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Allows command-level correlationId override in atomic mode" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Allows command-level correlationId override in atomic mode + +```gwt +Given a mock executor that succeeds for all commands +And a BatchExecutor with the mock executor and standard registry +And a batch with command-level correlationId override for order "ord_1" +When the batch is executed in "atomic" mode with aggregateId "ord_1" and correlationId "batch_corr" +Then the executor call 1 received correlationId "cmd_corr_1" +And the executor call 2 received correlationId "batch_corr" +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-006-executes-all-commands-even-with-failures-in-partial-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-006-executes-all-commands-even-with-failures-in-partial-mode.sdp.md index b8b482ed..6ee951ba 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-006-executes-all-commands-even-with-failures-in-partial-mode.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-006-executes-all-commands-even-with-failures-in-partial-mode.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Executes all commands even with failures in partial mode" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Executes all commands even with failures in partial mode + +```gwt +Given a failing executor that fails after 1 successful command +And a BatchExecutor with the failing executor and standard registry +And a batch of AddOrderItem commands targeting different orders: +When the batch is executed in "partial" mode +Then the batch result status is "partial" +And the batch summary shows: +And the executor was called 3 times +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-007-returns-success-when-all-commands-succeed-in-partial-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-007-returns-success-when-all-commands-succeed-in-partial-mode.sdp.md index 7cf2fbd1..c3dd0f6d 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-007-returns-success-when-all-commands-succeed-in-partial-mode.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-007-returns-success-when-all-commands-succeed-in-partial-mode.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Returns success when all commands succeed in partial mode" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Returns success when all commands succeed in partial mode + +```gwt +Given a mock executor that succeeds for all commands +And a BatchExecutor with the mock executor only +And a batch of CreateOrder commands: +When the batch is executed in "partial" mode +Then the batch result status is "success" +And the batch summary shows: +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-008-allows-cross-aggregate-commands-in-partial-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-008-allows-cross-aggregate-commands-in-partial-mode.sdp.md index 593ac2e4..a3507df9 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-008-allows-cross-aggregate-commands-in-partial-mode.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-008-allows-cross-aggregate-commands-in-partial-mode.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Allows cross-aggregate commands in partial mode" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Allows cross-aggregate commands in partial mode + +```gwt +Given a mock executor that succeeds for all commands +And a BatchExecutor with the mock executor and standard registry +And a batch of AddOrderItem commands targeting different orders: +When the batch is executed in "partial" mode +Then the batch result status is "success" +And the executor was called 2 times +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-009-respects-max-concurrency-in-partial-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-009-respects-max-concurrency-in-partial-mode.sdp.md index 9980ef1e..516e7c69 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-009-respects-max-concurrency-in-partial-mode.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-009-respects-max-concurrency-in-partial-mode.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Respects maxConcurrency in partial mode" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Respects maxConcurrency in partial mode + +```gwt +Given a concurrency-tracking executor +And a BatchExecutor with the tracking executor +And a batch of 10 generic test commands +When the batch is executed in "partial" mode with maxConcurrency 3 +Then the executor was called 10 times +And the maximum observed concurrency was at most 3 +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-010-stops-on-failure-when-continue-on-error-is-false-in-partial-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-010-stops-on-failure-when-continue-on-error-is-false-in-partial-mode.sdp.md index 887f5255..5a9e93f7 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-010-stops-on-failure-when-continue-on-error-is-false-in-partial-mode.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-010-stops-on-failure-when-continue-on-error-is-false-in-partial-mode.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Stops on failure when continueOnError is false in partial mode" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Stops on failure when continueOnError is false in partial mode + +```gwt +Given a failing executor that fails after 1 successful command +And a BatchExecutor with the failing executor only +And a batch of 3 generic test commands +When the batch is executed in "partial" mode with maxConcurrency 1 and continueOnError false +Then the batch result status is "partial" +And the batch summary shows: +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-011-tracks-individual-command-results.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-011-tracks-individual-command-results.sdp.md index 00529b0d..fdc8a849 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-011-tracks-individual-command-results.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-011-tracks-individual-command-results.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Tracks individual command results" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Tracks individual command results + +```gwt +Given a mock executor that succeeds for all commands +And a BatchExecutor with the mock executor only +And a batch of two different command types +When the batch is executed in "partial" mode +Then the batch has 2 results +And result 0 has commandType "TestA" and index 0 +And result 1 has commandType "TestB" and index 1 +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-012-includes-duration-for-each-command.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-012-includes-duration-for-each-command.sdp.md index f2af97fc..c1f8639f 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-012-includes-duration-for-each-command.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-012-includes-duration-for-each-command.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Includes duration for each command" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Includes duration for each command + +```gwt +Given a mock executor that succeeds for all commands +And a BatchExecutor with the mock executor only +And a single Test command +When the batch is executed in "partial" mode +Then result 0 has a numeric durationMs +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-013-includes-error-message-for-failed-commands.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-013-includes-error-message-for-failed-commands.sdp.md index 1e7ba970..3f027bee 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-013-includes-error-message-for-failed-commands.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-013-includes-error-message-for-failed-commands.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Includes error message for failed commands" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Includes error message for failed commands + +```gwt +Given an executor that always rejects with reason "Something went wrong" +And a BatchExecutor with the rejecting executor +And a single Test command +When the batch is executed in "partial" mode +Then result 0 has error "Something went wrong" +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-014-calculates-correct-summary-statistics.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-014-calculates-correct-summary-statistics.sdp.md index 42e94c0f..2d52f47d 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-014-calculates-correct-summary-statistics.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-014-calculates-correct-summary-statistics.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Calculates correct summary statistics" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Calculates correct summary statistics + +```gwt +Given a failing executor that fails after 2 successful commands +And a BatchExecutor with the failing executor only +And a batch of 5 generic test commands +When the batch is executed in "partial" mode with maxConcurrency 1 +Then the batch summary shows: +And the batch summary totalDurationMs is non-negative +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-015-handles-executor-throwing-errors.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-015-handles-executor-throwing-errors.sdp.md index 7080cfae..465ff94f 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-015-handles-executor-throwing-errors.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-015-handles-executor-throwing-errors.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Handles executor throwing errors" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Handles executor throwing errors + +```gwt +Given an executor that throws "Executor crashed" +And a BatchExecutor with the throwing executor +And a single Test command +When the batch is executed in "partial" mode +Then the batch result status is "failed" +And result 0 has status "failed" +And result 0 has error "Executor crashed" +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-016-handles-empty-batch-gracefully.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-016-handles-empty-batch-gracefully.sdp.md index c997c40d..1d277622 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-016-handles-empty-batch-gracefully.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-016-handles-empty-batch-gracefully.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Handles empty batch gracefully" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Handles empty batch gracefully + +```gwt +Given a mock executor that succeeds for all commands +And a BatchExecutor with the mock executor only +When an empty batch is executed in "partial" mode +Then the batch result status is "failed" +And the executor was not called +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-017-rejects-batch-exceeding-max-command-count-before-execution.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-017-rejects-batch-exceeding-max-command-count-before-execution.sdp.md index a97b7fe0..3a394171 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-017-rejects-batch-exceeding-max-command-count-before-execution.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-017-rejects-batch-exceeding-max-command-count-before-execution.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Rejects batch exceeding max command count before execution" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Rejects batch exceeding max command count before execution + +```gwt +Given a mock executor that succeeds for all commands +And a BatchExecutor with the mock executor only +And a batch of 4 generic test commands +When the batch is executed in "partial" mode with max batch size 3 +Then the batch result status is "failed" +And all batch results have status "rejected" +And the executor was not called +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-018-accepts-batch-exactly-at-max-command-count.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-018-accepts-batch-exactly-at-max-command-count.sdp.md index 4143d26d..7925ac5e 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-018-accepts-batch-exactly-at-max-command-count.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-018-accepts-batch-exactly-at-max-command-count.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Accepts batch exactly at max command count" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Accepts batch exactly at max command count + +```gwt +Given a mock executor that succeeds for all commands +And a BatchExecutor with the mock executor only +And a batch of 3 generic test commands +When the batch is executed in "partial" mode with max batch size 3 +Then the batch result status is "success" +And the executor was called 3 times +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-019-accepts-batch-exactly-at-default-max-command-count.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-019-accepts-batch-exactly-at-default-max-command-count.sdp.md index 9858886f..03e1231e 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-019-accepts-batch-exactly-at-default-max-command-count.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-019-accepts-batch-exactly-at-default-max-command-count.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Accepts batch exactly at default max command count" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Accepts batch exactly at default max command count + +```gwt +Given a mock executor that succeeds for all commands +And a BatchExecutor with the mock executor only +And a batch of 100 generic test commands +When the batch is executed in "partial" mode using default max batch size +Then the batch result status is "success" +And the executor was called 100 times +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-020-rejects-batch-exceeding-default-max-command-count-before-execution.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-020-rejects-batch-exceeding-default-max-command-count-before-execution.sdp.md index 5a06c21b..7119800f 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-020-rejects-batch-exceeding-default-max-command-count-before-execution.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-020-rejects-batch-exceeding-default-max-command-count-before-execution.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Rejects batch exceeding default max command count before execution" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Rejects batch exceeding default max command count before execution + +```gwt +Given a mock executor that succeeds for all commands +And a BatchExecutor with the mock executor only +And a batch of 101 generic test commands +When the batch is executed in "partial" mode using default max batch size +Then the batch result status is "failed" +And all batch results have status "rejected" +And the executor was not called +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-021-rejects-commands-from-wrong-bounded-context.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-021-rejects-commands-from-wrong-bounded-context.sdp.md index 7fa1de9b..49933bba 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-021-rejects-commands-from-wrong-bounded-context.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-021-rejects-commands-from-wrong-bounded-context.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Rejects commands from wrong bounded context" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Rejects commands from wrong bounded context + +```gwt +Given a mock executor that succeeds for all commands +And a BatchExecutor with inventory registry and default bounded context "orders" +And a batch with cross-context commands +When the batch is executed in "partial" mode +Then the batch result status is "failed" +And result 1 error contains "validation failed" +And the executor was not called +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-022-creates-a-batch-executor-instance-via-factory.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-022-creates-a-batch-executor-instance-via-factory.sdp.md index 912b23f9..8ba483cc 100644 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-022-creates-a-batch-executor-instance-via-factory.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.examples/s-022-creates-a-batch-executor-instance-via-factory.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Creates a BatchExecutor instance via factory" from packages/platform-core/tests/features/behavior/batch/batch-executor.feature +- outcome: Executable scenario: Creates a BatchExecutor instance via factory + +```gwt +Given a mock executor that succeeds for all commands +When createBatchExecutor is called with the mock executor +Then the result is a BatchExecutor instance +``` diff --git a/specs/behavior/platform-core/batch/batch-executor.sdp.md b/specs/behavior/platform-core/batch/batch-executor.sdp.md index f4e4a259..c15e6087 100644 --- a/specs/behavior/platform-core/batch/batch-executor.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: to execute batch commands in atomic and partial modes so that multiple commands can be processed with appropriate failure semantics (test carrier: packages/platform-core/tests/features/behavior/batch/batch-executor.feature) +- actor: a platform developer +- outcome: to execute batch commands in atomic and partial modes so that multiple commands can be processed with appropriate failure semantics + +## Behavior + +- rule: Atomic mode executes commands sequentially and stops on first failure +- rule: Partial mode executes all commands regardless of individual failures +- rule: BatchExecutor tracks individual command results with type and index +- rule: BatchExecutor handles executor exceptions gracefully +- rule: Default bounded context filters commands to a single context +- rule: createBatchExecutor factory creates BatchExecutor instances diff --git a/specs/behavior/platform-core/batch/validation.examples/s-001-rejects-empty-batch.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-001-rejects-empty-batch.sdp.md index f1f3cc2a..82775a87 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-001-rejects-empty-batch.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-001-rejects-empty-batch.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects empty batch" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Rejects empty batch + +```gwt +Given an empty batch of commands +When the batch is validated in "partial" mode +Then validation fails with error code "EMPTY_BATCH" +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-002-accepts-batch-exactly-at-max-size.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-002-accepts-batch-exactly-at-max-size.sdp.md index d6bf9a29..fdd1f742 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-002-accepts-batch-exactly-at-max-size.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-002-accepts-batch-exactly-at-max-size.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts batch exactly at max size" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Accepts batch exactly at max size + +```gwt +Given a batch of 3 generic test commands +When the batch is validated in "partial" mode with max batch size 3 +Then validation succeeds +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-003-rejects-batch-exceeding-max-size.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-003-rejects-batch-exceeding-max-size.sdp.md index b007eb3b..70384f9e 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-003-rejects-batch-exceeding-max-size.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-003-rejects-batch-exceeding-max-size.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects batch exceeding max size" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Rejects batch exceeding max size + +```gwt +Given a batch of 4 generic test commands +When the batch is validated in "partial" mode with max batch size 3 +Then validation fails with error code "BATCH_TOO_LARGE" +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-004-accepts-batch-exactly-at-default-max-size.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-004-accepts-batch-exactly-at-default-max-size.sdp.md index eccb7cfd..9da143fd 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-004-accepts-batch-exactly-at-default-max-size.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-004-accepts-batch-exactly-at-default-max-size.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts batch exactly at default max size" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Accepts batch exactly at default max size + +```gwt +Given a batch of 100 generic test commands +When the batch is validated in "partial" mode using default max batch size +Then validation succeeds +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-005-rejects-batch-exceeding-default-max-size.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-005-rejects-batch-exceeding-default-max-size.sdp.md index f4cd4e22..f2860f2f 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-005-rejects-batch-exceeding-default-max-size.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-005-rejects-batch-exceeding-default-max-size.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects batch exceeding default max size" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Rejects batch exceeding default max size + +```gwt +Given a batch of 101 generic test commands +When the batch is validated in "partial" mode using default max batch size +Then validation fails with error code "BATCH_TOO_LARGE" +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-006-accepts-valid-commands-without-registry.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-006-accepts-valid-commands-without-registry.sdp.md index 4730935c..b0121401 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-006-accepts-valid-commands-without-registry.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-006-accepts-valid-commands-without-registry.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts valid commands without registry" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Accepts valid commands without registry + +```gwt +Given a batch of commands: +When the batch is validated in "partial" mode without registry +Then validation succeeds +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-007-accepts-commands-in-different-bounded-contexts.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-007-accepts-commands-in-different-bounded-contexts.sdp.md index 8c40fb8c..5a06de67 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-007-accepts-commands-in-different-bounded-contexts.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-007-accepts-commands-in-different-bounded-contexts.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts commands in different bounded contexts" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Accepts commands in different bounded contexts + +```gwt +Given a batch of commands: +And a registry with entries: +When the batch is validated in "partial" mode with registry +Then validation succeeds +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-008-requires-aggregate-id-option.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-008-requires-aggregate-id-option.sdp.md index ec3a28d0..2a12430b 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-008-requires-aggregate-id-option.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-008-requires-aggregate-id-option.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Requires aggregateId option" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Requires aggregateId option + +```gwt +Given a batch of commands: +When the batch is validated in "atomic" mode without options +Then validation fails with error code "MISSING_AGGREGATE_ID" +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-009-requires-aggregate-id-field-option.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-009-requires-aggregate-id-field-option.sdp.md index 1312d389..e7e5e2af 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-009-requires-aggregate-id-field-option.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-009-requires-aggregate-id-field-option.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Requires aggregateIdField option" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Requires aggregateIdField option + +```gwt +Given a batch of commands: +When the batch is validated in "atomic" mode with only aggregateId "ord_1" +Then validation fails with error code "MISSING_AGGREGATE_ID" +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-010-accepts-when-all-commands-target-same-aggregate.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-010-accepts-when-all-commands-target-same-aggregate.sdp.md index 9098b730..6b4b95c8 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-010-accepts-when-all-commands-target-same-aggregate.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-010-accepts-when-all-commands-target-same-aggregate.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Accepts when all commands target same aggregate" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Accepts when all commands target same aggregate + +```gwt +Given a batch of commands: +When the batch is validated in "atomic" mode with aggregateId "ord_1" and field "orderId" +Then validation succeeds +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-011-rejects-when-commands-target-different-aggregates.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-011-rejects-when-commands-target-different-aggregates.sdp.md index b62c2054..a7fa2054 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-011-rejects-when-commands-target-different-aggregates.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-011-rejects-when-commands-target-different-aggregates.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejects when commands target different aggregates" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Rejects when commands target different aggregates + +```gwt +Given a batch of commands: +When the batch is validated in "atomic" mode with aggregateId "ord_1" and field "orderId" +Then validation fails with error code "CROSS_AGGREGATE_ATOMIC" at command index 1 +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-012-accepts-commands-targeting-same-aggregate-with-explicit-aggregate-id.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-012-accepts-commands-targeting-same-aggregate-with-explicit-aggregate-id.sdp.md index 3bfd4dd1..69c1c987 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-012-accepts-commands-targeting-same-aggregate-with-explicit-aggregate-id.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-012-accepts-commands-targeting-same-aggregate-with-explicit-aggregate-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts commands targeting same aggregate with explicit aggregateId" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Accepts commands targeting same aggregate with explicit aggregateId + +```gwt +Given a batch of commands: +And the standard atomic registry +When the batch is validated in "atomic" mode with explicit aggregateId "ord_1" and registry +Then validation succeeds +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-013-infers-aggregate-id-from-first-command-when-not-specified.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-013-infers-aggregate-id-from-first-command-when-not-specified.sdp.md index c96aaa83..b3097d5f 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-013-infers-aggregate-id-from-first-command-when-not-specified.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-013-infers-aggregate-id-from-first-command-when-not-specified.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Infers aggregate ID from first command when not specified" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Infers aggregate ID from first command when not specified + +```gwt +Given a batch of commands: +And the standard atomic registry +When the batch is validated in "atomic" mode with registry only +Then validation succeeds +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-014-rejects-when-commands-target-different-aggregate-instances.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-014-rejects-when-commands-target-different-aggregate-instances.sdp.md index 91fc8946..5d6b9211 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-014-rejects-when-commands-target-different-aggregate-instances.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-014-rejects-when-commands-target-different-aggregate-instances.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects when commands target different aggregate instances" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Rejects when commands target different aggregate instances + +```gwt +Given a batch of commands: +And the standard atomic registry +When the batch is validated in "atomic" mode with registry only +Then validation fails with error code "CROSS_AGGREGATE_ATOMIC" +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-015-rejects-when-commands-target-different-aggregate-types.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-015-rejects-when-commands-target-different-aggregate-types.sdp.md index 7e9db226..ba6685f4 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-015-rejects-when-commands-target-different-aggregate-types.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-015-rejects-when-commands-target-different-aggregate-types.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects when commands target different aggregate types" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Rejects when commands target different aggregate types + +```gwt +Given a batch of commands: +And the standard atomic registry +When the batch is validated in "atomic" mode with registry only +Then validation fails with error code "CROSS_AGGREGATE_ATOMIC" +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-016-rejects-non-aggregate-commands-in-atomic-mode.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-016-rejects-non-aggregate-commands-in-atomic-mode.sdp.md index 700b3d65..f73c9549 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-016-rejects-non-aggregate-commands-in-atomic-mode.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-016-rejects-non-aggregate-commands-in-atomic-mode.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects non-aggregate commands in atomic mode" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Rejects non-aggregate commands in atomic mode + +```gwt +Given a batch of commands: +And the standard atomic registry +When the batch is validated in "atomic" mode with registry only +Then validation fails with error code "WRONG_CATEGORY" +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-017-rejects-unregistered-commands.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-017-rejects-unregistered-commands.sdp.md index 40ca15f4..1e1b6430 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-017-rejects-unregistered-commands.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-017-rejects-unregistered-commands.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects unregistered commands" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Rejects unregistered commands + +```gwt +Given a batch of commands: +And the standard atomic registry +When the batch is validated in "atomic" mode with registry only +Then validation fails with error code "UNREGISTERED_COMMAND" at command index 1 +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-018-accepts-commands-matching-specified-bounded-context.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-018-accepts-commands-matching-specified-bounded-context.sdp.md index f4c249ea..4805376c 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-018-accepts-commands-matching-specified-bounded-context.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-018-accepts-commands-matching-specified-bounded-context.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Accepts commands matching specified bounded context" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Accepts commands matching specified bounded context + +```gwt +Given a batch of commands: +And a registry with entries: +When the batch is validated in "partial" mode with boundedContext "orders" and registry +Then validation succeeds +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-019-rejects-commands-from-wrong-bounded-context.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-019-rejects-commands-from-wrong-bounded-context.sdp.md index d9a2895a..57bb3b80 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-019-rejects-commands-from-wrong-bounded-context.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-019-rejects-commands-from-wrong-bounded-context.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejects commands from wrong bounded context" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Rejects commands from wrong bounded context + +```gwt +Given a batch of commands: +And a registry with entries: +When the batch is validated in "partial" mode with boundedContext "orders" and registry +Then validation fails with error code "WRONG_BOUNDED_CONTEXT" at command index 1 +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-020-extracts-id-from-command-args.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-020-extracts-id-from-command-args.sdp.md index 4040ee45..aae34e5e 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-020-extracts-id-from-command-args.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-020-extracts-id-from-command-args.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Extracts ID from command args" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Extracts ID from command args + +```gwt +Given a command "AddOrderItem" with args {"orderId": "ord_123", "productId": "prod_456"} +When extractAggregateId is called with field "orderId" +Then the extracted ID is "ord_123" +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-021-returns-undefined-for-missing-field.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-021-returns-undefined-for-missing-field.sdp.md index 5ba173ab..d8cc24a4 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-021-returns-undefined-for-missing-field.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-021-returns-undefined-for-missing-field.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns undefined for missing field" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Returns undefined for missing field + +```gwt +Given a command "AddOrderItem" with args {"productId": "prod_456"} +When extractAggregateId is called with field "orderId" +Then the extracted ID is undefined +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-022-returns-undefined-for-non-string-value.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-022-returns-undefined-for-non-string-value.sdp.md index a839b13b..cf86de12 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-022-returns-undefined-for-non-string-value.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-022-returns-undefined-for-non-string-value.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns undefined for non-string value" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Returns undefined for non-string value + +```gwt +Given a command "AddOrderItem" with args {"orderId": 123} +When extractAggregateId is called with field "orderId" +Then the extracted ID is undefined +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-023-groups-commands-by-aggregate-id.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-023-groups-commands-by-aggregate-id.sdp.md index 7fde9832..d9c4f0b0 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-023-groups-commands-by-aggregate-id.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-023-groups-commands-by-aggregate-id.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Groups commands by aggregate ID" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Groups commands by aggregate ID + +```gwt +Given a batch of commands: +When groupByAggregateId is called with field "orderId" +Then there are 2 groups +And group "ord_1" has 2 commands +And group "ord_2" has 1 command +``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-024-uses-placeholder-for-missing-i-ds.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-024-uses-placeholder-for-missing-i-ds.sdp.md index cc7a6573..5325949c 100644 --- a/specs/behavior/platform-core/batch/validation.examples/s-024-uses-placeholder-for-missing-i-ds.sdp.md +++ b/specs/behavior/platform-core/batch/validation.examples/s-024-uses-placeholder-for-missing-i-ds.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Uses placeholder for missing IDs" from packages/platform-core/tests/features/behavior/batch/validation.feature +- outcome: Executable scenario: Uses placeholder for missing IDs + +```gwt +Given a batch of commands: +When groupByAggregateId is called with field "orderId" +Then there are 2 groups +And group "ord_1" has 1 command +And group "__no_id__" has 1 command +``` diff --git a/specs/behavior/platform-core/batch/validation.sdp.md b/specs/behavior/platform-core/batch/validation.sdp.md index ff09dec0..d4679eac 100644 --- a/specs/behavior/platform-core/batch/validation.sdp.md +++ b/specs/behavior/platform-core/batch/validation.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: pre-flight validation for batch command execution so that invalid batches are rejected before processing begins (test carrier: packages/platform-core/tests/features/behavior/batch/validation.feature) +- actor: a platform developer +- outcome: pre-flight validation for batch command execution so that invalid batches are rejected before processing begins + +## Behavior + +- rule: Empty batches are always rejected +- rule: Partial mode accepts valid commands without cross-aggregate constraints +- rule: Atomic mode without registry requires explicit aggregate options +- rule: Atomic mode with registry enforces single-aggregate scope via metadata +- rule: Bounded context option filters commands to a single context +- rule: extractAggregateId extracts string IDs from command args +- rule: groupByAggregateId groups commands by their aggregate ID field diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-001-state-at-current-version-is-returned-as-is.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-001-state-at-current-version-is-returned-as-is.sdp.md index d0e54c9e..cddafd7d 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-001-state-at-current-version-is-returned-as-is.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-001-state-at-current-version-is-returned-as-is.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "State at current version is returned as-is" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: State at current version is returned as-is + +```gwt +Given the module is imported from platform-core +And a CMS upcaster from version 1 to version 2 +And a v2 CMS state with id "test_1" and name "Test" and description "Already at v2" +When the CMS upcaster is applied +Then the result was not upcasted +And the original state version is 2 +And the CMS state equals the input state +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-002-state-is-migrated-from-v1-to-v2.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-002-state-is-migrated-from-v1-to-v2.sdp.md index be33c15f..fbfa64ab 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-002-state-is-migrated-from-v1-to-v2.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-002-state-is-migrated-from-v1-to-v2.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "State is migrated from v1 to v2" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: State is migrated from v1 to v2 + +```gwt +Given the module is imported from platform-core +And a CMS upcaster from version 1 to version 2 +And a v1 CMS state with id "test_1" and name "Test" +When the CMS upcaster is applied +Then the result was upcasted +And the original state version is 1 +And the CMS stateVersion is 2 +And the CMS description is "Migrated from v1" +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-003-state-is-migrated-from-v1-to-v3.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-003-state-is-migrated-from-v1-to-v3.sdp.md index 7a87a8b3..238d3954 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-003-state-is-migrated-from-v1-to-v3.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-003-state-is-migrated-from-v1-to-v3.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "State is migrated from v1 to v3" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: State is migrated from v1 to v3 + +```gwt +Given the module is imported from platform-core +And a CMS upcaster from version 1 to version 3 +And a v1 CMS state with id "test_1" and name "Test" +When the CMS upcaster is applied +Then the result was upcasted +And the original state version is 1 +And the CMS stateVersion is 3 +And the CMS description is "Added in v2" +And the CMS priority is "medium" +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-004-legacy-state-without-state-version-is-treated-as-version-0.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-004-legacy-state-without-state-version-is-treated-as-version-0.sdp.md index 5b3ff658..d8a8e7b2 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-004-legacy-state-without-state-version-is-treated-as-version-0.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-004-legacy-state-without-state-version-is-treated-as-version-0.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Legacy state without stateVersion is treated as version 0" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Legacy state without stateVersion is treated as version 0 + +```gwt +Given the module is imported from platform-core +And a CMS upcaster from version 0 to version 2 with legacy support +And a legacy CMS state with id "legacy_1" and name "Legacy" +When the CMS upcaster is applied +Then the result was upcasted +And the original state version is 0 +And the CMS stateVersion is 2 +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-005-null-input-throws-cms-upcaster-error.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-005-null-input-throws-cms-upcaster-error.sdp.md index 9c37fe83..0ede2ba8 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-005-null-input-throws-cms-upcaster-error.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-005-null-input-throws-cms-upcaster-error.sdp.md @@ -6,8 +6,16 @@ readiness: idea relations: refines: spec:behavior.platform-core.cms.upcaster --- -# Null input throws CMSUpcasterError +# Future schema version throws FUTURE_VERSION error ## Intent -- outcome: Executable scenario "Null input throws CMSUpcasterError" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Future schema version throws FUTURE_VERSION error + +```gwt +Given an upcaster from version 1 to version 2 +And a v5 event with orderId "order_1" and customerId "cust_1" +When the upcaster is applied expecting an error +Then it throws an EventUpcasterError +And the error message contains "is newer than current version" +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-006-undefined-input-throws-cms-upcaster-error.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-006-undefined-input-throws-cms-upcaster-error.sdp.md index c676e6ac..0b5da446 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-006-undefined-input-throws-cms-upcaster-error.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-006-undefined-input-throws-cms-upcaster-error.sdp.md @@ -6,8 +6,16 @@ readiness: idea relations: refines: spec:behavior.platform-core.cms.upcaster --- -# Undefined input throws CMSUpcasterError +# Validation passes after migration ## Intent -- outcome: Executable scenario "Undefined input throws CMSUpcasterError" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Validation passes after migration + +```gwt +Given an upcaster from version 1 to version 2 with a validator that checks createdAt is a number +And a v1 event with orderId "order_1" and customerId "cust_1" +When the upcaster is applied +Then the result was upcasted +And the event payload has a defined createdAt field +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-007-incomplete-migration-chain-throws-at-creation-time.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-007-incomplete-migration-chain-throws-at-creation-time.sdp.md index 9ca36517..0ad26c59 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-007-incomplete-migration-chain-throws-at-creation-time.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-007-incomplete-migration-chain-throws-at-creation-time.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Incomplete migration chain throws at creation time" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Incomplete migration chain throws at creation time + +```gwt +Given the module is imported from platform-core +When a CMS upcaster is created with current version 3 but only a v1 migration +Then it throws an error containing "Missing migration for version 2" +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-008-future-state-version-throws-cms-upcaster-error.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-008-future-state-version-throws-cms-upcaster-error.sdp.md index f0a109bf..438e887b 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-008-future-state-version-throws-cms-upcaster-error.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-008-future-state-version-throws-cms-upcaster-error.sdp.md @@ -6,8 +6,15 @@ readiness: idea relations: refines: spec:behavior.platform-core.cms.upcaster --- -# Future state version throws CMSUpcasterError +# Registry reports registered and unregistered event types ## Intent -- outcome: Executable scenario "Future state version throws CMSUpcasterError" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Registry reports registered and unregistered event types + +```gwt +Given an upcaster registry with "OrderCreated" registered +When the scenario runs +Then the registry has "OrderCreated" +And the registry does not have "UnregisteredEvent" +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-009-migration-function-error-propagates-mid-chain.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-009-migration-function-error-propagates-mid-chain.sdp.md index 04fb848d..e843f9ce 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-009-migration-function-error-propagates-mid-chain.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-009-migration-function-error-propagates-mid-chain.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Migration function error propagates mid-chain" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Migration function error propagates mid-chain + +```gwt +Given the module is imported from platform-core +And a CMS upcaster from v1 to v3 where v2-to-v3 migration throws +And a v1 CMS state with id "test_1" and name "Test" +When the CMS upcaster is applied expecting an error +Then the error message contains "Migration v2->v3 failed: data corruption detected" +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-010-first-migration-function-error-propagates.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-010-first-migration-function-error-propagates.sdp.md index e06f5276..c3d3b786 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-010-first-migration-function-error-propagates.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-010-first-migration-function-error-propagates.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "First migration function error propagates" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: First migration function error propagates + +```gwt +Given the module is imported from platform-core +And a CMS upcaster from v1 to v2 where v1 migration throws +And a v1 CMS state with id "test_1" and name "Test" +When the CMS upcaster is applied expecting an error +Then the error message contains "Invalid v1 state structure" +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-011-state-at-current-version-is-returned-as-is-via-upcast-if-needed.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-011-state-at-current-version-is-returned-as-is-via-upcast-if-needed.sdp.md index 4d8ceca0..8d38d25d 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-011-state-at-current-version-is-returned-as-is-via-upcast-if-needed.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-011-state-at-current-version-is-returned-as-is-via-upcast-if-needed.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "State at current version is returned as-is via upcastIfNeeded" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: State at current version is returned as-is via upcastIfNeeded + +```gwt +Given the module is imported from platform-core +And a v2 CMS state with id "test_1" and description "Current version" +When upcastIfNeeded is called with target version 2 +Then the result was not upcasted +And the original state version is 2 +And the CMS description is "Current version" +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-012-state-is-migrated-via-upcast-if-needed.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-012-state-is-migrated-via-upcast-if-needed.sdp.md index de10cc3f..79707b88 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-012-state-is-migrated-via-upcast-if-needed.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-012-state-is-migrated-via-upcast-if-needed.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "State is migrated via upcastIfNeeded" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: State is migrated via upcastIfNeeded + +```gwt +Given the module is imported from platform-core +And a v1 CMS state with id "test_1" and name "Test" +When upcastIfNeeded is called with target version 2 and migration +Then the result was upcasted +And the original state version is 1 +And the CMS description is "Migrated" +And the CMS stateVersion is 2 +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-013-validation-passes-when-state-is-valid.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-013-validation-passes-when-state-is-valid.sdp.md index bc70f7b5..1c6b3f98 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-013-validation-passes-when-state-is-valid.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-013-validation-passes-when-state-is-valid.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Validation passes when state is valid" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Validation passes when state is valid + +```gwt +Given the module is imported from platform-core +And a v2 CMS state with id "test_1" and description "Valid" +When upcastIfNeeded is called with target version 2 and validation +Then the result was not upcasted +And the CMS state equals the input state +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-014-validation-fails-when-state-is-invalid.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-014-validation-fails-when-state-is-invalid.sdp.md index 8f2d77df..f6ba5cf4 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-014-validation-fails-when-state-is-invalid.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-014-validation-fails-when-state-is-invalid.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Validation fails when state is invalid" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Validation fails when state is invalid + +```gwt +Given the module is imported from platform-core +And a v2 CMS state without description field +When upcastIfNeeded is called with target version 2 and validation expecting error +Then it throws a CMSUpcasterError +And the error message contains "fails validation" +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-015-future-state-version-throws-cms-upcaster-error-via-upcast-if-needed.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-015-future-state-version-throws-cms-upcaster-error-via-upcast-if-needed.sdp.md index 20d1135a..29cee5fd 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-015-future-state-version-throws-cms-upcaster-error-via-upcast-if-needed.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-015-future-state-version-throws-cms-upcaster-error-via-upcast-if-needed.sdp.md @@ -6,8 +6,17 @@ readiness: idea relations: refines: spec:behavior.platform-core.cms.upcaster --- -# Future state version throws CMSUpcasterError via upcastIfNeeded +# Field is renamed in the payload ## Intent -- outcome: Executable scenario "Future state version throws CMSUpcasterError via upcastIfNeeded" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Field is renamed in the payload + +```gwt +Given a renameFieldMigration from "userId" to "customerId" at version 2 +And an event with payload userId "user_123" +When the rename migration is applied +Then the payload field "customerId" is "user_123" +And the payload field "userId" is undefined +And the schema version is 2 +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-016-error-has-correct-name.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-016-error-has-correct-name.sdp.md index e2190345..ac45815d 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-016-error-has-correct-name.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-016-error-has-correct-name.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Error has correct name" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Error has correct name + +```gwt +Given the module is imported from platform-core +And a CMSUpcasterError with code "NULL_STATE" and message "Test error" +When the scenario runs +Then the error name is "CMSUpcasterError" +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-017-error-has-correct-code.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-017-error-has-correct-code.sdp.md index 5e270d74..e6c21f48 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-017-error-has-correct-code.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-017-error-has-correct-code.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Error has correct code" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Error has correct code + +```gwt +Given the module is imported from platform-core +And a CMSUpcasterError with code "MISSING_MIGRATION" and message "Test error" +When the scenario runs +Then the error code is "MISSING_MIGRATION" +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-018-error-has-correct-message.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-018-error-has-correct-message.sdp.md index 804623b8..a71aea21 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-018-error-has-correct-message.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-018-error-has-correct-message.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Error has correct message" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Error has correct message + +```gwt +Given the module is imported from platform-core +And a CMSUpcasterError with code "INVALID_STATE" and message "Custom message" +When the scenario runs +Then the error message text is "Custom message" +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-019-error-stores-context-when-provided.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-019-error-stores-context-when-provided.sdp.md index 22000f8d..01efce97 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-019-error-stores-context-when-provided.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-019-error-stores-context-when-provided.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Error stores context when provided" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Error stores context when provided + +```gwt +Given the module is imported from platform-core +And a CMSUpcasterError with code "INVALID_STATE" and message "Error" and context: +When the scenario runs +Then the error context matches: +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-020-error-has-undefined-context-when-not-provided.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-020-error-has-undefined-context-when-not-provided.sdp.md index bd4c503d..289c4041 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-020-error-has-undefined-context-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-020-error-has-undefined-context-when-not-provided.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Error has undefined context when not provided" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Error has undefined context when not provided + +```gwt +Given the module is imported from platform-core +And a CMSUpcasterError with code "NULL_STATE" and message "Error" +When the scenario runs +Then the error context is undefined +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-021-error-is-instanceof-error.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-021-error-is-instanceof-error.sdp.md index 7e23854a..c7352688 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-021-error-is-instanceof-error.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-021-error-is-instanceof-error.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Error is instanceof Error" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Error is instanceof Error + +```gwt +Given the module is imported from platform-core +And a CMSUpcasterError with code "NULL_STATE" and message "Error" +When the scenario runs +Then the error is an instance of Error +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-022-validation-passes-for-current-version-state.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-022-validation-passes-for-current-version-state.sdp.md index 8f1753bf..05e6586d 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-022-validation-passes-for-current-version-state.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-022-validation-passes-for-current-version-state.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Validation passes for current version state" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Validation passes for current version state + +```gwt +Given the module is imported from platform-core +And a CMS upcaster with validation that checks description is a string +And a v2 CMS state with id "test_1" and description "Valid" +When the CMS upcaster is applied +Then the result was not upcasted +And the CMS state equals the input state +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-023-validation-fails-for-current-version-state-with-empty-description.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-023-validation-fails-for-current-version-state-with-empty-description.sdp.md index c2abc18f..d9f38df1 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-023-validation-fails-for-current-version-state-with-empty-description.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-023-validation-fails-for-current-version-state-with-empty-description.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Validation fails for current version state with empty description" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Validation fails for current version state with empty description + +```gwt +Given the module is imported from platform-core +And a CMS upcaster with validation that checks description is non-empty +And a v2 CMS state with id "test_1" and description "" +When the CMS upcaster is applied expecting an error +Then it throws a CMSUpcasterError +And the error message contains "fails validation" +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-024-validation-passes-after-upcasting-from-v1.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-024-validation-passes-after-upcasting-from-v1.sdp.md index 821a8503..40d35079 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-024-validation-passes-after-upcasting-from-v1.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-024-validation-passes-after-upcasting-from-v1.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Validation passes after upcasting from v1" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Validation passes after upcasting from v1 + +```gwt +Given the module is imported from platform-core +And a CMS upcaster with validation that checks description is a string +And a v1 CMS state with id "test_1" and name "Test" +When the CMS upcaster is applied +Then the result was upcasted +And the CMS description is "Migrated successfully" +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-025-validation-fails-after-upcasting-produces-invalid-state.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-025-validation-fails-after-upcasting-produces-invalid-state.sdp.md index fb61aca1..aa95cd3b 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-025-validation-fails-after-upcasting-produces-invalid-state.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-025-validation-fails-after-upcasting-produces-invalid-state.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Validation fails after upcasting produces invalid state" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Validation fails after upcasting produces invalid state + +```gwt +Given the module is imported from platform-core +And a CMS upcaster with validation that checks description is non-empty and migration produces empty +And a v1 CMS state with id "test_1" and name "Test" +When the CMS upcaster is applied expecting an error +Then it throws a CMSUpcasterError +And the error message contains "Upcasted CMS failed validation" +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-026-static-default-value-is-added.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-026-static-default-value-is-added.sdp.md index 0ae0b294..16555c80 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-026-static-default-value-is-added.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-026-static-default-value-is-added.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Static default value is added" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Static default value is added + +```gwt +Given the module is imported from platform-core +And an addCMSFieldMigration for "priority" with default "standard" to version 2 +And a base CMS state with id "test_1" and name "Test" at version 1 +When the CMS field migration is applied +Then the CMS field "priority" is "standard" +And the CMS field "name" is "Test" +And the CMS stateVersion is 2 +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-027-computed-default-value-is-added.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-027-computed-default-value-is-added.sdp.md index a8516cd0..022056ef 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-027-computed-default-value-is-added.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-027-computed-default-value-is-added.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Computed default value is added" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Computed default value is added + +```gwt +Given the module is imported from platform-core +And an addCMSFieldMigration for "createdAt" with computed value 1704067200000 to version 2 +And a base CMS state with id "test_1" at version 1 +When the CMS field migration is applied +Then the CMS field "createdAt" is 1704067200000 +And the CMS stateVersion is 2 +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-028-computed-default-accesses-state.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-028-computed-default-accesses-state.sdp.md index a8c956d8..28162c12 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-028-computed-default-accesses-state.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-028-computed-default-accesses-state.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Computed default accesses state" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Computed default accesses state + +```gwt +Given the module is imported from platform-core +And an addCMSFieldMigration for "displayName" computed from orderId to version 2 +And a base CMS state with orderId "order_123" at version 1 +When the CMS field migration is applied +Then the CMS field "displayName" is "Order order_123" +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-029-existing-fields-are-preserved.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-029-existing-fields-are-preserved.sdp.md index d46863d5..2869a4b7 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-029-existing-fields-are-preserved.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-029-existing-fields-are-preserved.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Existing fields are preserved" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Existing fields are preserved + +```gwt +Given the module is imported from platform-core +And an addCMSFieldMigration for "newField" with default "value" to version 2 +And a base CMS state with existingField "existing" and anotherField 42 at version 1 with version 5 +When the CMS field migration is applied +Then the CMS field "existingField" is "existing" +And the CMS field "anotherField" is 42 +And the CMS version is 5 +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-030-field-is-renamed.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-030-field-is-renamed.sdp.md index c4c12828..79e07f35 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-030-field-is-renamed.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-030-field-is-renamed.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Field is renamed" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Field is renamed + +```gwt +Given the module is imported from platform-core +And a renameCMSFieldMigration from "userId" to "customerId" at version 2 +And a CMS state with userId "user_123" and name "Test" at version 1 +When the CMS rename migration is applied +Then the CMS field "customerId" is "user_123" +And the CMS field "userId" is undefined +And the CMS field "name" is "Test" +And the CMS stateVersion is 2 +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-031-other-fields-are-preserved-when-renaming.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-031-other-fields-are-preserved-when-renaming.sdp.md index ae0bf008..f17b12cb 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-031-other-fields-are-preserved-when-renaming.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-031-other-fields-are-preserved-when-renaming.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Other fields are preserved when renaming" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Other fields are preserved when renaming + +```gwt +Given the module is imported from platform-core +And a renameCMSFieldMigration from "oldName" to "newName" at version 2 +And a CMS state with oldName "value" and otherField1 "keep1" and otherField2 42 at version 1 with version 3 +When the CMS rename migration is applied +Then the CMS field "otherField1" is "keep1" +And the CMS field "otherField2" is 42 +And the CMS version is 3 +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-032-undefined-value-in-renamed-field-is-handled.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-032-undefined-value-in-renamed-field-is-handled.sdp.md index a6b80831..dca7fc23 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-032-undefined-value-in-renamed-field-is-handled.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-032-undefined-value-in-renamed-field-is-handled.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Undefined value in renamed field is handled" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Undefined value in renamed field is handled + +```gwt +Given the module is imported from platform-core +And a renameCMSFieldMigration from "optionalField" to "renamedOptional" at version 2 +And a base CMS state at version 1 +When the CMS rename migration is applied +Then the CMS field "renamedOptional" is undefined +And the CMS stateVersion is 2 +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-033-specified-field-is-removed.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-033-specified-field-is-removed.sdp.md index fd8d61c5..8287057c 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-033-specified-field-is-removed.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-033-specified-field-is-removed.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Specified field is removed" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Specified field is removed + +```gwt +Given the module is imported from platform-core +And a removeCMSFieldMigration for "deprecatedField" at version 2 +And a CMS state with deprecatedField "old value" and keepField "keep me" at version 1 +When the CMS remove migration is applied +Then the CMS field "deprecatedField" is undefined +And the CMS field "keepField" is "keep me" +And the CMS stateVersion is 2 +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-034-other-fields-are-preserved-when-removing.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-034-other-fields-are-preserved-when-removing.sdp.md index 6f129613..d7b0fac2 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-034-other-fields-are-preserved-when-removing.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-034-other-fields-are-preserved-when-removing.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Other fields are preserved when removing" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Other fields are preserved when removing + +```gwt +Given the module is imported from platform-core +And a removeCMSFieldMigration for "toRemove" at version 2 +And a CMS state with toRemove "bye" and field1 "a" and field2 "b" and nested data at version 1 with version 5 +When the CMS remove migration is applied +Then the CMS field "field1" is "a" +And the CMS field "field2" is "b" +And the CMS nested field equals data 123 +And the CMS version is 5 +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-035-non-existent-field-is-handled-gracefully.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-035-non-existent-field-is-handled-gracefully.sdp.md index b2ab40bb..7a26c784 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-035-non-existent-field-is-handled-gracefully.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-035-non-existent-field-is-handled-gracefully.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Non-existent field is handled gracefully" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Non-existent field is handled gracefully + +```gwt +Given the module is imported from platform-core +And a removeCMSFieldMigration for "nonExistent" at version 2 +And a CMS state with existingField "value" at version 1 +When the CMS remove migration is applied +Then the CMS field "existingField" is "value" +And the CMS stateVersion is 2 +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-036-add-cms-field-migration-works-in-migration-chain.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-036-add-cms-field-migration-works-in-migration-chain.sdp.md index 1af8843f..bdfb89d2 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-036-add-cms-field-migration-works-in-migration-chain.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-036-add-cms-field-migration-works-in-migration-chain.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "addCMSFieldMigration works in migration chain" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: addCMSFieldMigration works in migration chain + +```gwt +Given the module is imported from platform-core +And a CMS upcaster using addCMSFieldMigration for description +And a v1 CMS state with id "test_1" and name "Test" +When the CMS upcaster is applied +Then the result was upcasted +And the CMS description is "Added via helper" +And the CMS stateVersion is 2 +``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-037-multiple-helper-migrations-are-chained.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-037-multiple-helper-migrations-are-chained.sdp.md index 17f16c75..7d7bc106 100644 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-037-multiple-helper-migrations-are-chained.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.examples/s-037-multiple-helper-migrations-are-chained.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: Executable scenario "Multiple helper migrations are chained" from packages/platform-core/tests/features/behavior/cms/upcaster.feature +- outcome: Executable scenario: Multiple helper migrations are chained + +```gwt +Given the module is imported from platform-core +And a CMS upcaster chaining rename and add helper migrations +And a CMS state with userId "user_456" at version 1 +When the CMS upcaster is applied +Then the result was upcasted +And the original state version is 1 +And the CMS field "customerId" is "user_456" +And the CMS field "userId" is undefined +And the CMS field "priority" is "normal" +And the CMS stateVersion is 3 +``` diff --git a/specs/behavior/platform-core/cms/upcaster.sdp.md b/specs/behavior/platform-core/cms/upcaster.sdp.md index 90f2514c..030ab173 100644 --- a/specs/behavior/platform-core/cms/upcaster.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.sdp.md @@ -10,4 +10,23 @@ relations: ## Intent -- outcome: CMS schema evolution utilities with chain-based migration so that CMS state can be transparently upgraded to the latest schema version (test carrier: packages/platform-core/tests/features/behavior/cms/upcaster.feature) +- actor: a platform developer +- outcome: CMS schema evolution utilities with chain-based migration so that CMS state can be transparently upgraded to the latest schema version + +## Behavior + +- rule: createUpcaster returns state at current version without migration +- rule: createUpcaster applies a single migration step +- rule: createUpcaster applies multiple migration steps in order +- rule: createUpcaster handles legacy version 0 state +- rule: createUpcaster rejects invalid inputs and configurations +- rule: upcastIfNeeded returns state at current version without migration +- rule: upcastIfNeeded applies migration when state is behind +- rule: upcastIfNeeded supports validation function +- rule: upcastIfNeeded rejects future state versions +- rule: CMSUpcasterError captures error metadata +- rule: createUpcaster supports post-migration validation +- rule: addCMSFieldMigration adds a field with a static or computed default +- rule: renameCMSFieldMigration renames a field in the CMS state +- rule: removeCMSFieldMigration removes a field from the CMS state +- rule: Helper migrations integrate with createUpcaster chain diff --git a/specs/behavior/platform-core/commands/categories.examples/s-001-command-categories-has-exactly-four-entries-in-the-correct-order.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-001-command-categories-has-exactly-four-entries-in-the-correct-order.sdp.md index 5a0b6b23..8f267b71 100644 --- a/specs/behavior/platform-core/commands/categories.examples/s-001-command-categories-has-exactly-four-entries-in-the-correct-order.sdp.md +++ b/specs/behavior/platform-core/commands/categories.examples/s-001-command-categories-has-exactly-four-entries-in-the-correct-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "COMMAND_CATEGORIES has exactly four entries in the correct order" from packages/platform-core/tests/features/behavior/commands/categories.feature +- outcome: Executable scenario: COMMAND_CATEGORIES has exactly four entries in the correct order + +```gwt +Given the COMMAND_CATEGORIES constant +When the scenario runs +Then it has length 4 +And the categories in order are: +``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-002-schema-accepts-valid-category-strings.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-002-schema-accepts-valid-category-strings.sdp.md index 28a3a411..d038e6db 100644 --- a/specs/behavior/platform-core/commands/categories.examples/s-002-schema-accepts-valid-category-strings.sdp.md +++ b/specs/behavior/platform-core/commands/categories.examples/s-002-schema-accepts-valid-category-strings.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Schema accepts valid category strings" from packages/platform-core/tests/features/behavior/commands/categories.feature +- outcome: Executable scenario: Schema accepts valid category strings + +```gwt +Given the feature fixture is in place +When the following values are parsed with CommandCategorySchema: +Then each parse returns the input value unchanged +``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-003-schema-rejects-invalid-category-values.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-003-schema-rejects-invalid-category-values.sdp.md index f5b7118a..610e4da3 100644 --- a/specs/behavior/platform-core/commands/categories.examples/s-003-schema-rejects-invalid-category-values.sdp.md +++ b/specs/behavior/platform-core/commands/categories.examples/s-003-schema-rejects-invalid-category-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Schema rejects invalid category values" from packages/platform-core/tests/features/behavior/commands/categories.feature +- outcome: Executable scenario: Schema rejects invalid category values + +```gwt +Given the feature fixture is in place +When the following invalid values are parsed with CommandCategorySchema: +Then each parse throws a validation error +``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-004-default-command-category-is-aggregate.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-004-default-command-category-is-aggregate.sdp.md index 2ee4ed60..154d4fdc 100644 --- a/specs/behavior/platform-core/commands/categories.examples/s-004-default-command-category-is-aggregate.sdp.md +++ b/specs/behavior/platform-core/commands/categories.examples/s-004-default-command-category-is-aggregate.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "DEFAULT_COMMAND_CATEGORY is aggregate" from packages/platform-core/tests/features/behavior/commands/categories.feature +- outcome: Executable scenario: DEFAULT_COMMAND_CATEGORY is aggregate + +```gwt +Given the feature fixture is in place +When the scenario runs +Then DEFAULT_COMMAND_CATEGORY equals "aggregate" +``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-005-type-guard-accepts-all-valid-categories.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-005-type-guard-accepts-all-valid-categories.sdp.md index 472d1465..a8de436a 100644 --- a/specs/behavior/platform-core/commands/categories.examples/s-005-type-guard-accepts-all-valid-categories.sdp.md +++ b/specs/behavior/platform-core/commands/categories.examples/s-005-type-guard-accepts-all-valid-categories.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Type guard accepts all valid categories" from packages/platform-core/tests/features/behavior/commands/categories.feature +- outcome: Executable scenario: Type guard accepts all valid categories + +```gwt +Given the feature fixture is in place +When isCommandCategory is called with the following values: +Then each call returns true +``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-006-type-guard-rejects-invalid-values.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-006-type-guard-rejects-invalid-values.sdp.md index c3f6feb5..29d4f96d 100644 --- a/specs/behavior/platform-core/commands/categories.examples/s-006-type-guard-rejects-invalid-values.sdp.md +++ b/specs/behavior/platform-core/commands/categories.examples/s-006-type-guard-rejects-invalid-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Type guard rejects invalid values" from packages/platform-core/tests/features/behavior/commands/categories.feature +- outcome: Executable scenario: Type guard rejects invalid values + +```gwt +Given the feature fixture is in place +When isCommandCategory is called with the following invalid values: +Then each call returns false +``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-007-valid-categories-are-returned-unchanged.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-007-valid-categories-are-returned-unchanged.sdp.md index a806db31..eb45bfbc 100644 --- a/specs/behavior/platform-core/commands/categories.examples/s-007-valid-categories-are-returned-unchanged.sdp.md +++ b/specs/behavior/platform-core/commands/categories.examples/s-007-valid-categories-are-returned-unchanged.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Valid categories are returned unchanged" from packages/platform-core/tests/features/behavior/commands/categories.feature +- outcome: Executable scenario: Valid categories are returned unchanged + +```gwt +Given the feature fixture is in place +When normalizeCommandCategory is called with valid categories: +Then each call returns the expected category +``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-008-invalid-values-normalize-to-aggregate.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-008-invalid-values-normalize-to-aggregate.sdp.md index d9323b45..b4bab506 100644 --- a/specs/behavior/platform-core/commands/categories.examples/s-008-invalid-values-normalize-to-aggregate.sdp.md +++ b/specs/behavior/platform-core/commands/categories.examples/s-008-invalid-values-normalize-to-aggregate.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Invalid values normalize to aggregate" from packages/platform-core/tests/features/behavior/commands/categories.feature +- outcome: Executable scenario: Invalid values normalize to aggregate + +```gwt +Given the feature fixture is in place +When normalizeCommandCategory is called with invalid values: +Then each call returns "aggregate" +``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-009-classification-of-categories-as-aggregate.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-009-classification-of-categories-as-aggregate.sdp.md index d355fd11..87eb3387 100644 --- a/specs/behavior/platform-core/commands/categories.examples/s-009-classification-of-categories-as-aggregate.sdp.md +++ b/specs/behavior/platform-core/commands/categories.examples/s-009-classification-of-categories-as-aggregate.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Classification of categories as aggregate" from packages/platform-core/tests/features/behavior/commands/categories.feature +- outcome: Executable scenario: Classification of categories as aggregate + +```gwt +Given the feature fixture is in place +When isAggregateCommand is called with each category: +Then each call returns the expected aggregate classification +``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-010-classification-of-categories-as-process.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-010-classification-of-categories-as-process.sdp.md index 042948b4..ad36dbde 100644 --- a/specs/behavior/platform-core/commands/categories.examples/s-010-classification-of-categories-as-process.sdp.md +++ b/specs/behavior/platform-core/commands/categories.examples/s-010-classification-of-categories-as-process.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Classification of categories as process" from packages/platform-core/tests/features/behavior/commands/categories.feature +- outcome: Executable scenario: Classification of categories as process + +```gwt +Given the feature fixture is in place +When isProcessCommand is called with each category: +Then each call returns the expected process classification +``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-011-classification-of-categories-as-system.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-011-classification-of-categories-as-system.sdp.md index 58f28506..c6854394 100644 --- a/specs/behavior/platform-core/commands/categories.examples/s-011-classification-of-categories-as-system.sdp.md +++ b/specs/behavior/platform-core/commands/categories.examples/s-011-classification-of-categories-as-system.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Classification of categories as system" from packages/platform-core/tests/features/behavior/commands/categories.feature +- outcome: Executable scenario: Classification of categories as system + +```gwt +Given the feature fixture is in place +When isSystemCommand is called with each category: +Then each call returns the expected system classification +``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-012-classification-of-categories-as-batch.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-012-classification-of-categories-as-batch.sdp.md index 596a48d0..811fc676 100644 --- a/specs/behavior/platform-core/commands/categories.examples/s-012-classification-of-categories-as-batch.sdp.md +++ b/specs/behavior/platform-core/commands/categories.examples/s-012-classification-of-categories-as-batch.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Classification of categories as batch" from packages/platform-core/tests/features/behavior/commands/categories.feature +- outcome: Executable scenario: Classification of categories as batch + +```gwt +Given the feature fixture is in place +When isBatchCommand is called with each category: +Then each call returns the expected batch classification +``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-013-schema-accepts-valid-aggregate-targets.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-013-schema-accepts-valid-aggregate-targets.sdp.md index c6aabc48..73a07f68 100644 --- a/specs/behavior/platform-core/commands/categories.examples/s-013-schema-accepts-valid-aggregate-targets.sdp.md +++ b/specs/behavior/platform-core/commands/categories.examples/s-013-schema-accepts-valid-aggregate-targets.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Schema accepts valid aggregate targets" from packages/platform-core/tests/features/behavior/commands/categories.feature +- outcome: Executable scenario: Schema accepts valid aggregate targets + +```gwt +Given the feature fixture is in place +When an aggregate target with type "Order" and idField "orderId" is parsed +Then the parsed result equals the input target +``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-014-schema-rejects-invalid-aggregate-targets.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-014-schema-rejects-invalid-aggregate-targets.sdp.md index c5de7915..8726bd27 100644 --- a/specs/behavior/platform-core/commands/categories.examples/s-014-schema-rejects-invalid-aggregate-targets.sdp.md +++ b/specs/behavior/platform-core/commands/categories.examples/s-014-schema-rejects-invalid-aggregate-targets.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Schema rejects invalid aggregate targets" from packages/platform-core/tests/features/behavior/commands/categories.feature +- outcome: Executable scenario: Schema rejects invalid aggregate targets + +```gwt +Given the feature fixture is in place +When the following invalid aggregate targets are parsed: +Then each parse throws a validation error +``` diff --git a/specs/behavior/platform-core/commands/categories.sdp.md b/specs/behavior/platform-core/commands/categories.sdp.md index caf033c9..99f90bcd 100644 --- a/specs/behavior/platform-core/commands/categories.sdp.md +++ b/specs/behavior/platform-core/commands/categories.sdp.md @@ -10,4 +10,18 @@ relations: ## Intent -- outcome: command taxonomy utilities with type-safe categories so that commands are correctly classified and validated at runtime (test carrier: packages/platform-core/tests/features/behavior/commands/categories.feature) +- actor: a platform developer +- outcome: command taxonomy utilities with type-safe categories so that commands are correctly classified and validated at runtime + +## Behavior + +- rule: COMMAND_CATEGORIES contains all four command categories in order +- rule: CommandCategorySchema validates category strings via Zod +- rule: Default command category provides a sensible fallback +- rule: isCommandCategory returns true only for valid category strings +- rule: normalizeCommandCategory returns the category unchanged or falls back to aggregate +- rule: isAggregateCommand returns true only for aggregate category +- rule: isProcessCommand returns true only for process category +- rule: isSystemCommand returns true only for system category +- rule: isBatchCommand returns true only for batch category +- rule: AggregateTargetSchema validates aggregate target objects diff --git a/specs/behavior/platform-core/commands/errors.examples/s-001-error-categories-has-exactly-four-entries-with-correct-values.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-001-error-categories-has-exactly-four-entries-with-correct-values.sdp.md index 25f8407d..f1b4cb52 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-001-error-categories-has-exactly-four-entries-with-correct-values.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-001-error-categories-has-exactly-four-entries-with-correct-values.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "ERROR_CATEGORIES has exactly four entries with correct values" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: ERROR_CATEGORIES has exactly four entries with correct values + +```gwt +Given the ERROR_CATEGORIES constant +When the scenario runs +Then it has length 4 +And it contains all categories: +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-002-error-category-members-have-correct-string-values.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-002-error-category-members-have-correct-string-values.sdp.md index b9a64680..43a3b199 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-002-error-category-members-have-correct-string-values.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-002-error-category-members-have-correct-string-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "ErrorCategory members have correct string values" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: ErrorCategory members have correct string values + +```gwt +Given the feature fixture is in place +When the scenario runs +Then the ErrorCategory enum values are: +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-003-type-guard-accepts-valid-error-categories.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-003-type-guard-accepts-valid-error-categories.sdp.md index fec49408..52baa810 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-003-type-guard-accepts-valid-error-categories.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-003-type-guard-accepts-valid-error-categories.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Type guard accepts valid error categories" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: Type guard accepts valid error categories + +```gwt +Given the feature fixture is in place +When isErrorCategory is called with valid values: +Then each isErrorCategory call returns true +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-004-type-guard-rejects-invalid-values.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-004-type-guard-rejects-invalid-values.sdp.md index 092483c4..7df29ed8 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-004-type-guard-rejects-invalid-values.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-004-type-guard-rejects-invalid-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Type guard rejects invalid values" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: Type guard rejects invalid values + +```gwt +Given the feature fixture is in place +When isErrorCategory is called with invalid values: +Then each isErrorCategory call returns false +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-005-command-error-is-created-with-all-properties.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-005-command-error-is-created-with-all-properties.sdp.md index ad40419f..409e92d9 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-005-command-error-is-created-with-all-properties.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-005-command-error-is-created-with-all-properties.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "CommandError is created with all properties" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: CommandError is created with all properties + +```gwt +Given the feature fixture is in place +When a CommandError is created with category "domain", code "ORDER_NOT_FOUND", message "Order was not found", recoverable false, and context orderId "123" +Then the error has all expected properties: +And the error context has orderId "123" +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-006-command-error-is-an-instance-of-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-006-command-error-is-an-instance-of-error.sdp.md index bd97b7dc..ffba907c 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-006-command-error-is-an-instance-of-error.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-006-command-error-is-an-instance-of-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "CommandError is an instance of Error" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: CommandError is an instance of Error + +```gwt +Given the feature fixture is in place +When a CommandError is created with category "domain", code "TEST", and message "test message" +Then it is an instance of Error +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-007-command-error-from-returns-existing-command-error-unchanged.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-007-command-error-from-returns-existing-command-error-unchanged.sdp.md index fd616bec..f8a06173 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-007-command-error-from-returns-existing-command-error-unchanged.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-007-command-error-from-returns-existing-command-error-unchanged.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "CommandError.from returns existing CommandError unchanged" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: CommandError.from returns existing CommandError unchanged + +```gwt +Given a CommandError with category "domain", code "TEST", and message "test" +When CommandError.from is called with that error +Then the result is the same reference as the original +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-008-command-error-from-wraps-a-regular-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-008-command-error-from-wraps-a-regular-error.sdp.md index 2ea5effa..d4754377 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-008-command-error-from-wraps-a-regular-error.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-008-command-error-from-wraps-a-regular-error.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "CommandError.from wraps a regular Error" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: CommandError.from wraps a regular Error + +```gwt +Given the feature fixture is in place +When CommandError.from is called with a regular Error "Something went wrong" and code "WRAPPED_ERROR" +Then the wrapped error has category "infra", code "WRAPPED_ERROR", message "Something went wrong", and is recoverable +And the wrapped error context has originalError "Error" +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-009-command-error-from-wraps-a-string-value.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-009-command-error-from-wraps-a-string-value.sdp.md index 47ce9a4a..d554f6d8 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-009-command-error-from-wraps-a-string-value.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-009-command-error-from-wraps-a-string-value.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "CommandError.from wraps a string value" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: CommandError.from wraps a string value + +```gwt +Given the feature fixture is in place +When CommandError.from is called with string "string error" +Then the wrapped error has category "infra" and message "string error" +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-010-command-error-from-wraps-an-unknown-value.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-010-command-error-from-wraps-an-unknown-value.sdp.md index 2b59840e..47380497 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-010-command-error-from-wraps-an-unknown-value.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-010-command-error-from-wraps-an-unknown-value.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "CommandError.from wraps an unknown value" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: CommandError.from wraps an unknown value + +```gwt +Given the feature fixture is in place +When CommandError.from is called with number 123 +Then the wrapped error has message "123" +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-011-to-json-serializes-error-with-context.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-011-to-json-serializes-error-with-context.sdp.md index 8f88c92a..6c69bb53 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-011-to-json-serializes-error-with-context.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-011-to-json-serializes-error-with-context.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "toJSON serializes error with context" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: toJSON serializes error with context + +```gwt +Given a CommandError with category "domain", code "ORDER_NOT_FOUND", message "Order was not found", recoverable false, and context orderId "123" +When toJSON is called +Then the JSON contains all properties: +And the JSON context has orderId "123" +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-012-to-json-handles-undefined-context.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-012-to-json-handles-undefined-context.sdp.md index 13c0e742..363c033e 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-012-to-json-handles-undefined-context.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-012-to-json-handles-undefined-context.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "toJSON handles undefined context" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: toJSON handles undefined context + +```gwt +Given a CommandError with category "domain", code "TEST", message "test", and no context +When toJSON is called on it +Then the JSON context is undefined +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-013-factory-creates-domain-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-013-factory-creates-domain-error.sdp.md index c975e9a1..94e614f6 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-013-factory-creates-domain-error.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-013-factory-creates-domain-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Factory creates domain error" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: Factory creates domain error + +```gwt +Given the feature fixture is in place +When CommandErrors.domain is called with code "ORDER_ALREADY_SUBMITTED" and message "Order has already been submitted" +Then the factory error has category "domain", code "ORDER_ALREADY_SUBMITTED", and is not recoverable +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-014-factory-creates-validation-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-014-factory-creates-validation-error.sdp.md index 76bc390b..4a2e4772 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-014-factory-creates-validation-error.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-014-factory-creates-validation-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Factory creates validation error" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: Factory creates validation error + +```gwt +Given the feature fixture is in place +When CommandErrors.validation is called with code "INVALID_EMAIL" and message "Email format is invalid" +Then the factory error has category "validation" and is not recoverable +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-015-factory-creates-concurrency-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-015-factory-creates-concurrency-error.sdp.md index 98d181c6..cda035f4 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-015-factory-creates-concurrency-error.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-015-factory-creates-concurrency-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Factory creates concurrency error" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: Factory creates concurrency error + +```gwt +Given the feature fixture is in place +When CommandErrors.concurrency is called with code "VERSION_CONFLICT" and message "Resource was modified by another request" +Then the factory error has category "concurrency" and is recoverable +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-016-factory-creates-infrastructure-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-016-factory-creates-infrastructure-error.sdp.md index 84f18862..5360965b 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-016-factory-creates-infrastructure-error.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-016-factory-creates-infrastructure-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Factory creates infrastructure error" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: Factory creates infrastructure error + +```gwt +Given the feature fixture is in place +When CommandErrors.infrastructure is called with code "DATABASE_UNAVAILABLE" and message "Database connection failed" +Then the factory error has category "infra" and is recoverable +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-017-factory-creates-not-found-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-017-factory-creates-not-found-error.sdp.md index 900ef409..ba613e85 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-017-factory-creates-not-found-error.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-017-factory-creates-not-found-error.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Factory creates not found error" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: Factory creates not found error + +```gwt +Given the feature fixture is in place +When CommandErrors.notFound is called with entity "Order" and id "ord_123" +Then the error has code "ORDER_NOT_FOUND" and message 'Order with ID "ord_123" was not found' +And the error has category "domain" and context entityType "Order" and entityId "ord_123" +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-018-factory-creates-already-exists-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-018-factory-creates-already-exists-error.sdp.md index b19ea972..de471165 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-018-factory-creates-already-exists-error.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-018-factory-creates-already-exists-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Factory creates already exists error" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: Factory creates already exists error + +```gwt +Given the feature fixture is in place +When CommandErrors.alreadyExists is called with entity "Order" and id "ord_123" +Then the error has code "ORDER_ALREADY_EXISTS" and message 'Order with ID "ord_123" already exists' +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-019-factory-creates-invalid-state-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-019-factory-creates-invalid-state-error.sdp.md index 3f28fdc5..e8ecaf15 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-019-factory-creates-invalid-state-error.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-019-factory-creates-invalid-state-error.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Factory creates invalid state error" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: Factory creates invalid state error + +```gwt +Given the feature fixture is in place +When CommandErrors.invalidState is called with entity "Order", current "draft", and required "submitted" +Then the error has code "INVALID_ORDER_STATE" and message 'Order is in "draft" state but "submitted" is required' +And the error context has entityType "Order", currentState "draft", and requiredState "submitted" +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-020-factory-creates-unauthorized-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-020-factory-creates-unauthorized-error.sdp.md index 2ca54184..ceb5ccaa 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-020-factory-creates-unauthorized-error.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-020-factory-creates-unauthorized-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Factory creates unauthorized error" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: Factory creates unauthorized error + +```gwt +Given the feature fixture is in place +When CommandErrors.unauthorized is called with action "delete order" +Then the error has code "UNAUTHORIZED" and message "Not authorized to perform action: delete order" +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-021-factory-creates-rate-limited-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-021-factory-creates-rate-limited-error.sdp.md index 56dcdf13..4708510e 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-021-factory-creates-rate-limited-error.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-021-factory-creates-rate-limited-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Factory creates rate limited error" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: Factory creates rate limited error + +```gwt +Given the feature fixture is in place +When CommandErrors.rateLimited is called with retryAfterMs 5000 +Then the error has code "RATE_LIMITED", category "infra", is recoverable, and context retryAfterMs 5000 +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-022-returns-true-for-matching-category.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-022-returns-true-for-matching-category.sdp.md index bdfddcf3..3851a51f 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-022-returns-true-for-matching-category.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-022-returns-true-for-matching-category.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for matching category" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: Returns true for matching category + +```gwt +Given a CommandError with category "domain" +When the scenario runs +Then isCommandErrorOfCategory returns true for category "domain" +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-023-returns-false-for-non-matching-category.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-023-returns-false-for-non-matching-category.sdp.md index 27a7e5d9..e5c334de 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-023-returns-false-for-non-matching-category.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-023-returns-false-for-non-matching-category.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for non-matching category" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: Returns false for non-matching category + +```gwt +Given a CommandError with category "domain" +When the scenario runs +Then isCommandErrorOfCategory returns false for category "validation" +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-024-returns-false-for-non-command-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-024-returns-false-for-non-command-error.sdp.md index 816d0be8..0e7f7635 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-024-returns-false-for-non-command-error.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-024-returns-false-for-non-command-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for non-CommandError" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: Returns false for non-CommandError + +```gwt +Given a regular Error "test" +When the scenario runs +Then isCommandErrorOfCategory returns false for any category +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-025-recoverable-errors-are-identified-correctly.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-025-recoverable-errors-are-identified-correctly.sdp.md index fb9ab6ca..06a5ce0c 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-025-recoverable-errors-are-identified-correctly.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-025-recoverable-errors-are-identified-correctly.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Recoverable errors are identified correctly" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: Recoverable errors are identified correctly + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isRecoverableError returns true for a concurrency error +And isRecoverableError returns false for a domain error +And isRecoverableError returns true for a regular Error +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-026-non-recoverable-error-gets-delay-of-1.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-026-non-recoverable-error-gets-delay-of-1.sdp.md index 04fdbdae..7335d992 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-026-non-recoverable-error-gets-delay-of-1.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-026-non-recoverable-error-gets-delay-of-1.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Non-recoverable error gets delay of -1" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: Non-recoverable error gets delay of -1 + +```gwt +Given the feature fixture is in place +When getRetryDelay is called with a domain error at attempt 1 +Then the delay is -1 +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-027-concurrency-error-delays-escalate-then-cap.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-027-concurrency-error-delays-escalate-then-cap.sdp.md index 604c4c17..755f2e33 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-027-concurrency-error-delays-escalate-then-cap.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-027-concurrency-error-delays-escalate-then-cap.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Concurrency error delays escalate then cap" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: Concurrency error delays escalate then cap + +```gwt +Given the feature fixture is in place +When the scenario runs +Then getRetryDelay for concurrency errors returns: +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-028-infrastructure-error-delays-escalate-then-cap.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-028-infrastructure-error-delays-escalate-then-cap.sdp.md index 034953a7..151a88e9 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-028-infrastructure-error-delays-escalate-then-cap.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-028-infrastructure-error-delays-escalate-then-cap.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Infrastructure error delays escalate then cap" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: Infrastructure error delays escalate then cap + +```gwt +Given the feature fixture is in place +When the scenario runs +Then getRetryDelay for infrastructure errors returns: +``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-029-unknown-error-gets-infrastructure-style-delay.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-029-unknown-error-gets-infrastructure-style-delay.sdp.md index 92b3a823..b72c1a46 100644 --- a/specs/behavior/platform-core/commands/errors.examples/s-029-unknown-error-gets-infrastructure-style-delay.sdp.md +++ b/specs/behavior/platform-core/commands/errors.examples/s-029-unknown-error-gets-infrastructure-style-delay.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Unknown error gets infrastructure-style delay" from packages/platform-core/tests/features/behavior/commands/errors.feature +- outcome: Executable scenario: Unknown error gets infrastructure-style delay + +```gwt +Given the feature fixture is in place +When getRetryDelay is called with a regular Error at attempt 1 +Then the delay is 1000 +``` diff --git a/specs/behavior/platform-core/commands/errors.sdp.md b/specs/behavior/platform-core/commands/errors.sdp.md index 8bd92284..26ac8238 100644 --- a/specs/behavior/platform-core/commands/errors.sdp.md +++ b/specs/behavior/platform-core/commands/errors.sdp.md @@ -10,4 +10,31 @@ relations: ## Intent -- outcome: a structured error system with categories and recovery semantics so that command failures are classified, serializable, and recoverable (test carrier: packages/platform-core/tests/features/behavior/commands/errors.feature) +- actor: a platform developer +- outcome: a structured error system with categories and recovery semantics so that command failures are classified, serializable, and recoverable + +## Behavior + +- rule: ERROR_CATEGORIES contains all four error categories +- rule: ErrorCategory enum maps to correct string values +- rule: isErrorCategory returns true only for valid category strings +- rule: CommandError constructor creates error with all properties +- rule: CommandError extends Error +- rule: CommandError.from returns CommandError instances unchanged +- rule: CommandError.from wraps non-CommandError values as infrastructure errors +- rule: CommandError.toJSON serializes to a plain object +- rule: CommandErrors.domain creates non-recoverable domain errors +- rule: CommandErrors.validation creates non-recoverable validation errors +- rule: CommandErrors.concurrency creates recoverable concurrency errors +- rule: CommandErrors.infrastructure creates recoverable infrastructure errors +- rule: CommandErrors.notFound creates domain errors with formatted messages +- rule: CommandErrors.alreadyExists creates domain errors with formatted messages +- rule: CommandErrors.invalidState creates domain errors with state info +- rule: CommandErrors.unauthorized creates domain errors for denied actions +- rule: CommandErrors.rateLimited creates recoverable infrastructure errors with retry info +- rule: isCommandErrorOfCategory checks category membership +- rule: isRecoverableError checks recovery semantics +- rule: getRetryDelay returns -1 for non-recoverable errors +- rule: getRetryDelay computes quick backoff for concurrency errors capped at 500ms +- rule: getRetryDelay computes exponential backoff for infrastructure errors capped at 30s +- rule: getRetryDelay treats unknown errors like infrastructure errors diff --git a/specs/behavior/platform-core/commands/factories.examples/s-001-schema-assigns-aggregate-category-and-preserves-command-type.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-001-schema-assigns-aggregate-category-and-preserves-command-type.sdp.md index a05305eb..322f0e65 100644 --- a/specs/behavior/platform-core/commands/factories.examples/s-001-schema-assigns-aggregate-category-and-preserves-command-type.sdp.md +++ b/specs/behavior/platform-core/commands/factories.examples/s-001-schema-assigns-aggregate-category-and-preserves-command-type.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Schema assigns aggregate category and preserves command type" from packages/platform-core/tests/features/behavior/commands/factories.feature +- outcome: Executable scenario: Schema assigns aggregate category and preserves command type + +```gwt +Given an aggregate command schema for "CreateOrder" with payload fields "orderId,customerId" +When a valid command is parsed with commandType "CreateOrder" +Then the parsed command has category "aggregate" +And the parsed command has commandType "CreateOrder" +``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-002-aggregate-target-is-present-on-parsed-command.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-002-aggregate-target-is-present-on-parsed-command.sdp.md index 28d05c4d..e71ba7fc 100644 --- a/specs/behavior/platform-core/commands/factories.examples/s-002-aggregate-target-is-present-on-parsed-command.sdp.md +++ b/specs/behavior/platform-core/commands/factories.examples/s-002-aggregate-target-is-present-on-parsed-command.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Aggregate target is present on parsed command" from packages/platform-core/tests/features/behavior/commands/factories.feature +- outcome: Executable scenario: Aggregate target is present on parsed command + +```gwt +Given an aggregate command schema for "AddOrderItem" with aggregate target type "Order" and idField "orderId" +When a valid command is parsed with commandType "AddOrderItem" +Then the parsed command has aggregateTarget type "Order" and idField "orderId" +``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-003-aggregate-target-is-undefined-when-not-configured.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-003-aggregate-target-is-undefined-when-not-configured.sdp.md index 5d641875..6a3b7a1b 100644 --- a/specs/behavior/platform-core/commands/factories.examples/s-003-aggregate-target-is-undefined-when-not-configured.sdp.md +++ b/specs/behavior/platform-core/commands/factories.examples/s-003-aggregate-target-is-undefined-when-not-configured.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Aggregate target is undefined when not configured" from packages/platform-core/tests/features/behavior/commands/factories.feature +- outcome: Executable scenario: Aggregate target is undefined when not configured + +```gwt +Given an aggregate command schema for "CreateOrder" with payload fields "orderId" +When a valid command is parsed with commandType "CreateOrder" +Then the parsed command has undefined aggregateTarget +``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-004-schema-rejects-a-mismatched-command-type.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-004-schema-rejects-a-mismatched-command-type.sdp.md index 030ec38b..a43879d7 100644 --- a/specs/behavior/platform-core/commands/factories.examples/s-004-schema-rejects-a-mismatched-command-type.sdp.md +++ b/specs/behavior/platform-core/commands/factories.examples/s-004-schema-rejects-a-mismatched-command-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Schema rejects a mismatched command type" from packages/platform-core/tests/features/behavior/commands/factories.feature +- outcome: Executable scenario: Schema rejects a mismatched command type + +```gwt +Given an aggregate command schema for "CreateOrder" with payload fields "orderId" +When a command with commandType "WrongType" is parsed +Then the parse throws a validation error +``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-005-schema-rejects-commands-missing-required-fields.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-005-schema-rejects-commands-missing-required-fields.sdp.md index 34cd13f2..c6bb35be 100644 --- a/specs/behavior/platform-core/commands/factories.examples/s-005-schema-rejects-commands-missing-required-fields.sdp.md +++ b/specs/behavior/platform-core/commands/factories.examples/s-005-schema-rejects-commands-missing-required-fields.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Schema rejects commands missing required fields" from packages/platform-core/tests/features/behavior/commands/factories.feature +- outcome: Executable scenario: Schema rejects commands missing required fields + +```gwt +Given an aggregate command schema for "CreateOrder" with payload fields "orderId" +When commands are parsed with the following missing fields: +Then each parse throws a validation error +``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-006-schema-assigns-process-category-and-preserves-command-type.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-006-schema-assigns-process-category-and-preserves-command-type.sdp.md index ae7c7141..f7fd8997 100644 --- a/specs/behavior/platform-core/commands/factories.examples/s-006-schema-assigns-process-category-and-preserves-command-type.sdp.md +++ b/specs/behavior/platform-core/commands/factories.examples/s-006-schema-assigns-process-category-and-preserves-command-type.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Schema assigns process category and preserves command type" from packages/platform-core/tests/features/behavior/commands/factories.feature +- outcome: Executable scenario: Schema assigns process category and preserves command type + +```gwt +Given a process command schema for "StartOrderFulfillment" with payload fields "orderId,warehouseId" +When a valid process command is parsed with commandType "StartOrderFulfillment" +Then the parsed command has category "process" +And the parsed command has commandType "StartOrderFulfillment" +``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-007-process-type-is-present-on-parsed-command.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-007-process-type-is-present-on-parsed-command.sdp.md index 21f3a728..312a71a4 100644 --- a/specs/behavior/platform-core/commands/factories.examples/s-007-process-type-is-present-on-parsed-command.sdp.md +++ b/specs/behavior/platform-core/commands/factories.examples/s-007-process-type-is-present-on-parsed-command.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Process type is present on parsed command" from packages/platform-core/tests/features/behavior/commands/factories.feature +- outcome: Executable scenario: Process type is present on parsed command + +```gwt +Given a process command schema for "StartOrderFulfillment" with processType "OrderFulfillmentSaga" +When a valid process command is parsed with commandType "StartOrderFulfillment" +Then the parsed command has processType "OrderFulfillmentSaga" +``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-008-process-type-is-undefined-when-not-configured.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-008-process-type-is-undefined-when-not-configured.sdp.md index b7c1c45f..d314ef5e 100644 --- a/specs/behavior/platform-core/commands/factories.examples/s-008-process-type-is-undefined-when-not-configured.sdp.md +++ b/specs/behavior/platform-core/commands/factories.examples/s-008-process-type-is-undefined-when-not-configured.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Process type is undefined when not configured" from packages/platform-core/tests/features/behavior/commands/factories.feature +- outcome: Executable scenario: Process type is undefined when not configured + +```gwt +Given a process command schema for "StartProcess" with payload fields "id" +When a valid process command is parsed with commandType "StartProcess" +Then the parsed command has undefined processType +``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-009-schema-assigns-system-category-and-preserves-command-type.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-009-schema-assigns-system-category-and-preserves-command-type.sdp.md index 0ba0fe6e..3bd65862 100644 --- a/specs/behavior/platform-core/commands/factories.examples/s-009-schema-assigns-system-category-and-preserves-command-type.sdp.md +++ b/specs/behavior/platform-core/commands/factories.examples/s-009-schema-assigns-system-category-and-preserves-command-type.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Schema assigns system category and preserves command type" from packages/platform-core/tests/features/behavior/commands/factories.feature +- outcome: Executable scenario: Schema assigns system category and preserves command type + +```gwt +Given a system command schema for "CleanupExpiredCommands" with payload fields "olderThanDays:number" +When a valid system command is parsed with commandType "CleanupExpiredCommands" +Then the parsed command has category "system" +And the parsed command has commandType "CleanupExpiredCommands" +``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-010-requires-idempotency-defaults-to-false.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-010-requires-idempotency-defaults-to-false.sdp.md index 57102cad..a0daa6f5 100644 --- a/specs/behavior/platform-core/commands/factories.examples/s-010-requires-idempotency-defaults-to-false.sdp.md +++ b/specs/behavior/platform-core/commands/factories.examples/s-010-requires-idempotency-defaults-to-false.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "requiresIdempotency defaults to false" from packages/platform-core/tests/features/behavior/commands/factories.feature +- outcome: Executable scenario: requiresIdempotency defaults to false + +```gwt +Given a system command schema for "RunHealthCheck" with empty payload +When a valid system command is parsed with commandType "RunHealthCheck" +Then the parsed command has requiresIdempotency false +``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-011-requires-idempotency-can-be-set-to-true.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-011-requires-idempotency-can-be-set-to-true.sdp.md index 7633b39d..c119ac4f 100644 --- a/specs/behavior/platform-core/commands/factories.examples/s-011-requires-idempotency-can-be-set-to-true.sdp.md +++ b/specs/behavior/platform-core/commands/factories.examples/s-011-requires-idempotency-can-be-set-to-true.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "requiresIdempotency can be set to true" from packages/platform-core/tests/features/behavior/commands/factories.feature +- outcome: Executable scenario: requiresIdempotency can be set to true + +```gwt +Given a system command schema for "MigrateData" with requiresIdempotency true +When a valid system command is parsed with commandType "MigrateData" +Then the parsed command has requiresIdempotency true +``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-012-schema-assigns-batch-category-with-items.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-012-schema-assigns-batch-category-with-items.sdp.md index 31f36409..48f75d6f 100644 --- a/specs/behavior/platform-core/commands/factories.examples/s-012-schema-assigns-batch-category-with-items.sdp.md +++ b/specs/behavior/platform-core/commands/factories.examples/s-012-schema-assigns-batch-category-with-items.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Schema assigns batch category with items" from packages/platform-core/tests/features/behavior/commands/factories.feature +- outcome: Executable scenario: Schema assigns batch category with items + +```gwt +Given a batch command schema for "BulkCreateOrders" with item fields "customerId,productId" +When a valid batch command is parsed with 2 items +Then the parsed command has category "batch" +And the parsed command has 2 items +``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-013-batch-config-is-present-on-parsed-command.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-013-batch-config-is-present-on-parsed-command.sdp.md index 0003f7e7..cbbc537d 100644 --- a/specs/behavior/platform-core/commands/factories.examples/s-013-batch-config-is-present-on-parsed-command.sdp.md +++ b/specs/behavior/platform-core/commands/factories.examples/s-013-batch-config-is-present-on-parsed-command.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Batch config is present on parsed command" from packages/platform-core/tests/features/behavior/commands/factories.feature +- outcome: Executable scenario: Batch config is present on parsed command + +```gwt +Given a batch command schema for "BulkUpdateProducts" with batchConfig maxItems 100 and continueOnError true +When a valid batch command is parsed with 1 item +Then the parsed command has batchConfig maxItems 100 and continueOnError true +``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-014-schema-rejects-items-that-fail-item-schema-validation.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-014-schema-rejects-items-that-fail-item-schema-validation.sdp.md index 306aebb3..933e3ac3 100644 --- a/specs/behavior/platform-core/commands/factories.examples/s-014-schema-rejects-items-that-fail-item-schema-validation.sdp.md +++ b/specs/behavior/platform-core/commands/factories.examples/s-014-schema-rejects-items-that-fail-item-schema-validation.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Schema rejects items that fail item schema validation" from packages/platform-core/tests/features/behavior/commands/factories.feature +- outcome: Executable scenario: Schema rejects items that fail item schema validation + +```gwt +Given a batch command schema for "BulkProcess" with item fields "id,value:positive-number" +When a batch command is parsed with an invalid item value -5 +Then the parse throws a validation error +``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-015-empty-items-array-is-accepted.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-015-empty-items-array-is-accepted.sdp.md index 083e37d2..ed5fee2d 100644 --- a/specs/behavior/platform-core/commands/factories.examples/s-015-empty-items-array-is-accepted.sdp.md +++ b/specs/behavior/platform-core/commands/factories.examples/s-015-empty-items-array-is-accepted.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Empty items array is accepted" from packages/platform-core/tests/features/behavior/commands/factories.feature +- outcome: Executable scenario: Empty items array is accepted + +```gwt +Given a batch command schema for "BulkProcess" with item fields "id" +When a valid batch command is parsed with 0 items +Then the parsed command has 0 items +``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-016-category-is-extracted-from-each-factory-schema.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-016-category-is-extracted-from-each-factory-schema.sdp.md index 9cb70be7..730889a9 100644 --- a/specs/behavior/platform-core/commands/factories.examples/s-016-category-is-extracted-from-each-factory-schema.sdp.md +++ b/specs/behavior/platform-core/commands/factories.examples/s-016-category-is-extracted-from-each-factory-schema.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Category is extracted from each factory schema" from packages/platform-core/tests/features/behavior/commands/factories.feature +- outcome: Executable scenario: Category is extracted from each factory schema + +```gwt +Given a schema from each command category factory: +When the scenario runs +Then each extraction returns the expected category +``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-017-non-command-schemas-return-undefined.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-017-non-command-schemas-return-undefined.sdp.md index 46b7c517..8dadbd9e 100644 --- a/specs/behavior/platform-core/commands/factories.examples/s-017-non-command-schemas-return-undefined.sdp.md +++ b/specs/behavior/platform-core/commands/factories.examples/s-017-non-command-schemas-return-undefined.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Non-command schemas return undefined" from packages/platform-core/tests/features/behavior/commands/factories.feature +- outcome: Executable scenario: Non-command schemas return undefined + +```gwt +Given getCommandCategoryFromSchema is called on non-command schemas: +When the scenario runs +Then each extraction returns undefined +``` diff --git a/specs/behavior/platform-core/commands/factories.sdp.md b/specs/behavior/platform-core/commands/factories.sdp.md index df7a90a9..f3d7c0ed 100644 --- a/specs/behavior/platform-core/commands/factories.sdp.md +++ b/specs/behavior/platform-core/commands/factories.sdp.md @@ -10,4 +10,25 @@ relations: ## Intent -- outcome: category-specific factory functions for command schemas so that commands are created with the correct category, validated fields, and typed payloads (test carrier: packages/platform-core/tests/features/behavior/commands/factories.feature) +- actor: a platform developer +- outcome: category-specific factory functions for command schemas so that commands are created with the correct category, validated fields, and typed payloads + +## Behavior + +- rule: createAggregateCommandSchema produces schemas with aggregate category and literal command type +- rule: createAggregateCommandSchema includes aggregate target when provided +- rule: createAggregateCommandSchema makes aggregate target optional when not configured +- rule: createAggregateCommandSchema enforces literal command type +- rule: createAggregateCommandSchema rejects commands missing required base fields +- rule: createProcessCommandSchema produces schemas with process category +- rule: createProcessCommandSchema includes process type when provided +- rule: createProcessCommandSchema makes process type optional when not configured +- rule: createSystemCommandSchema produces schemas with system category +- rule: createSystemCommandSchema defaults requiresIdempotency to false +- rule: createSystemCommandSchema allows overriding requiresIdempotency +- rule: createBatchCommandSchema produces schemas with batch category and items array +- rule: createBatchCommandSchema includes batch config when provided +- rule: createBatchCommandSchema validates items against item schema +- rule: createBatchCommandSchema allows empty items array +- rule: getCommandCategoryFromSchema extracts category from factory-created schemas +- rule: getCommandCategoryFromSchema returns undefined for non-command schemas diff --git a/specs/behavior/platform-core/commands/naming.examples/s-001-command-name-prefixes-includes-all-standard-prefixes.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-001-command-name-prefixes-includes-all-standard-prefixes.sdp.md index 7ce1f000..f11c327b 100644 --- a/specs/behavior/platform-core/commands/naming.examples/s-001-command-name-prefixes-includes-all-standard-prefixes.sdp.md +++ b/specs/behavior/platform-core/commands/naming.examples/s-001-command-name-prefixes-includes-all-standard-prefixes.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "COMMAND_NAME_PREFIXES includes all standard prefixes" from packages/platform-core/tests/features/behavior/commands/naming.feature +- outcome: Executable scenario: COMMAND_NAME_PREFIXES includes all standard prefixes + +```gwt +Given the COMMAND_NAME_PREFIXES constant +When the scenario runs +Then it contains all of the following prefixes: +``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-002-create-pattern-accepts-valid-create-prefixed-names.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-002-create-pattern-accepts-valid-create-prefixed-names.sdp.md index 163b0ed2..e8f2d823 100644 --- a/specs/behavior/platform-core/commands/naming.examples/s-002-create-pattern-accepts-valid-create-prefixed-names.sdp.md +++ b/specs/behavior/platform-core/commands/naming.examples/s-002-create-pattern-accepts-valid-create-prefixed-names.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "CREATE pattern accepts valid Create-prefixed names" from packages/platform-core/tests/features/behavior/commands/naming.feature +- outcome: Executable scenario: CREATE pattern accepts valid Create-prefixed names + +```gwt +Given the feature fixture is in place +When the CREATE pattern is tested against the following names: +Then each pattern test returns the expected result +``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-003-add-pattern-accepts-valid-add-prefixed-names.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-003-add-pattern-accepts-valid-add-prefixed-names.sdp.md index d7895531..1ca0b237 100644 --- a/specs/behavior/platform-core/commands/naming.examples/s-003-add-pattern-accepts-valid-add-prefixed-names.sdp.md +++ b/specs/behavior/platform-core/commands/naming.examples/s-003-add-pattern-accepts-valid-add-prefixed-names.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "ADD pattern accepts valid Add-prefixed names" from packages/platform-core/tests/features/behavior/commands/naming.feature +- outcome: Executable scenario: ADD pattern accepts valid Add-prefixed names + +```gwt +Given the feature fixture is in place +When the ADD pattern is tested against the following names: +Then each pattern test returns the expected result +``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-004-update-pattern-accepts-update-change-and-modify-prefixes.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-004-update-pattern-accepts-update-change-and-modify-prefixes.sdp.md index a0bc20ce..d178b8ca 100644 --- a/specs/behavior/platform-core/commands/naming.examples/s-004-update-pattern-accepts-update-change-and-modify-prefixes.sdp.md +++ b/specs/behavior/platform-core/commands/naming.examples/s-004-update-pattern-accepts-update-change-and-modify-prefixes.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "UPDATE pattern accepts Update, Change, and Modify prefixes" from packages/platform-core/tests/features/behavior/commands/naming.feature +- outcome: Executable scenario: UPDATE pattern accepts Update, Change, and Modify prefixes + +```gwt +Given the feature fixture is in place +When the UPDATE pattern is tested against the following names: +Then each pattern test returns the expected result +``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-005-valid-command-names-are-accepted.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-005-valid-command-names-are-accepted.sdp.md index fa967a94..a9e244b1 100644 --- a/specs/behavior/platform-core/commands/naming.examples/s-005-valid-command-names-are-accepted.sdp.md +++ b/specs/behavior/platform-core/commands/naming.examples/s-005-valid-command-names-are-accepted.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Valid command names are accepted" from packages/platform-core/tests/features/behavior/commands/naming.feature +- outcome: Executable scenario: Valid command names are accepted + +```gwt +Given the feature fixture is in place +When isValidCommandName is called with the following names: +Then each validity check returns the expected result +``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-006-invalid-command-names-are-rejected.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-006-invalid-command-names-are-rejected.sdp.md index e29a2996..6e3aa6a7 100644 --- a/specs/behavior/platform-core/commands/naming.examples/s-006-invalid-command-names-are-rejected.sdp.md +++ b/specs/behavior/platform-core/commands/naming.examples/s-006-invalid-command-names-are-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Invalid command names are rejected" from packages/platform-core/tests/features/behavior/commands/naming.feature +- outcome: Executable scenario: Invalid command names are rejected + +```gwt +Given the feature fixture is in place +When isValidCommandName is called with the following names: +Then each validity check returns the expected result +``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-007-valid-names-return-matched-prefix-and-valid-flag.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-007-valid-names-return-matched-prefix-and-valid-flag.sdp.md index f93ce97c..ba21f906 100644 --- a/specs/behavior/platform-core/commands/naming.examples/s-007-valid-names-return-matched-prefix-and-valid-flag.sdp.md +++ b/specs/behavior/platform-core/commands/naming.examples/s-007-valid-names-return-matched-prefix-and-valid-flag.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Valid names return matched prefix and valid flag" from packages/platform-core/tests/features/behavior/commands/naming.feature +- outcome: Executable scenario: Valid names return matched prefix and valid flag + +```gwt +Given the feature fixture is in place +When validateCommandName is called with the following valid names: +Then each validation result is valid with the expected prefix +And no validation result contains suggestions +``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-008-invalid-name-returns-suggestions-and-error-message.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-008-invalid-name-returns-suggestions-and-error-message.sdp.md index cd26e608..70672e38 100644 --- a/specs/behavior/platform-core/commands/naming.examples/s-008-invalid-name-returns-suggestions-and-error-message.sdp.md +++ b/specs/behavior/platform-core/commands/naming.examples/s-008-invalid-name-returns-suggestions-and-error-message.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Invalid name returns suggestions and error message" from packages/platform-core/tests/features/behavior/commands/naming.feature +- outcome: Executable scenario: Invalid name returns suggestions and error message + +```gwt +Given the feature fixture is in place +When validateCommandName is called with "OrderCreate" +Then the validation result is invalid +And the validation message contains "does not follow naming conventions" +And the suggestions include "CreateOrder" +``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-009-inverted-name-receives-corrected-suggestion.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-009-inverted-name-receives-corrected-suggestion.sdp.md index a0b0668a..8599afaf 100644 --- a/specs/behavior/platform-core/commands/naming.examples/s-009-inverted-name-receives-corrected-suggestion.sdp.md +++ b/specs/behavior/platform-core/commands/naming.examples/s-009-inverted-name-receives-corrected-suggestion.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Inverted name receives corrected suggestion" from packages/platform-core/tests/features/behavior/commands/naming.feature +- outcome: Executable scenario: Inverted name receives corrected suggestion + +```gwt +Given the feature fixture is in place +When generateNameSuggestions is called with "OrderCreate" +Then the suggestions include "CreateOrder" +``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-010-suggestions-are-limited-to-at-most-3.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-010-suggestions-are-limited-to-at-most-3.sdp.md index baf7bddb..078b4415 100644 --- a/specs/behavior/platform-core/commands/naming.examples/s-010-suggestions-are-limited-to-at-most-3.sdp.md +++ b/specs/behavior/platform-core/commands/naming.examples/s-010-suggestions-are-limited-to-at-most-3.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Suggestions are limited to at most 3" from packages/platform-core/tests/features/behavior/commands/naming.feature +- outcome: Executable scenario: Suggestions are limited to at most 3 + +```gwt +Given the feature fixture is in place +When generateNameSuggestions is called with "SomeRandomName" +Then the suggestion count is at most 3 +``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-011-known-names-return-their-prefix.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-011-known-names-return-their-prefix.sdp.md index 90cab237..53912163 100644 --- a/specs/behavior/platform-core/commands/naming.examples/s-011-known-names-return-their-prefix.sdp.md +++ b/specs/behavior/platform-core/commands/naming.examples/s-011-known-names-return-their-prefix.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Known names return their prefix" from packages/platform-core/tests/features/behavior/commands/naming.feature +- outcome: Executable scenario: Known names return their prefix + +```gwt +Given the feature fixture is in place +When getCommandPrefix is called with the following names: +Then each prefix extraction returns the expected prefix +``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-012-invalid-or-empty-names-return-undefined.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-012-invalid-or-empty-names-return-undefined.sdp.md index c844dffc..ba27e59d 100644 --- a/specs/behavior/platform-core/commands/naming.examples/s-012-invalid-or-empty-names-return-undefined.sdp.md +++ b/specs/behavior/platform-core/commands/naming.examples/s-012-invalid-or-empty-names-return-undefined.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Invalid or empty names return undefined" from packages/platform-core/tests/features/behavior/commands/naming.feature +- outcome: Executable scenario: Invalid or empty names return undefined + +```gwt +Given the feature fixture is in place +When getCommandPrefix is called with the following names: +Then each prefix extraction returns the expected prefix +``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-013-various-input-formats-produce-correct-pascal-case-names.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-013-various-input-formats-produce-correct-pascal-case-names.sdp.md index 630cd3c0..9dbf4ed7 100644 --- a/specs/behavior/platform-core/commands/naming.examples/s-013-various-input-formats-produce-correct-pascal-case-names.sdp.md +++ b/specs/behavior/platform-core/commands/naming.examples/s-013-various-input-formats-produce-correct-pascal-case-names.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Various input formats produce correct PascalCase names" from packages/platform-core/tests/features/behavior/commands/naming.feature +- outcome: Executable scenario: Various input formats produce correct PascalCase names + +```gwt +Given the feature fixture is in place +When formatCommandName is called with the following inputs: +Then each format call returns the expected output +``` diff --git a/specs/behavior/platform-core/commands/naming.sdp.md b/specs/behavior/platform-core/commands/naming.sdp.md index 31f141fc..8ef0c76d 100644 --- a/specs/behavior/platform-core/commands/naming.sdp.md +++ b/specs/behavior/platform-core/commands/naming.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: command naming conventions enforced at runtime so that commands follow consistent Verb+Noun PascalCase patterns across bounded contexts (test carrier: packages/platform-core/tests/features/behavior/commands/naming.feature) +- actor: a platform developer +- outcome: command naming conventions enforced at runtime so that commands follow consistent Verb+Noun PascalCase patterns across bounded contexts + +## Behavior + +- rule: COMMAND_NAME_PREFIXES contains all recognized verb prefixes +- rule: CREATE pattern matches PascalCase names starting with Create +- rule: ADD pattern matches PascalCase names starting with Add +- rule: UPDATE pattern matches names starting with Update, Change, or Modify +- rule: isValidCommandName returns true only for names matching any recognized prefix pattern +- rule: validateCommandName returns structured validation results with matched prefix +- rule: generateNameSuggestions produces corrective suggestions for invalid names +- rule: getCommandPrefix extracts the matched prefix or returns undefined +- rule: formatCommandName converts various input formats to valid PascalCase command names diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-001-chain-uses-command-id-as-causation-id-and-generates-correlation-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-001-chain-uses-command-id-as-causation-id-and-generates-correlation-id.sdp.md index 79580441..9a56c2cb 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-001-chain-uses-command-id-as-causation-id-and-generates-correlation-id.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-001-chain-uses-command-id-as-causation-id-and-generates-correlation-id.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Chain uses commandId as causationId and generates correlationId" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Chain uses commandId as causationId and generates correlationId + +```gwt +Given the module is imported from platform-core +And the system time is fixed at 1703001234567 +When a correlation chain is created with commandId "cmd_test_123" +Then the chain has the following properties: +And the chain correlationId starts with "corr_" +And the chain userId is undefined +And the chain context is undefined +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-002-chain-uses-provided-correlation-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-002-chain-uses-provided-correlation-id.sdp.md index fa92ee08..6482d3f8 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-002-chain-uses-provided-correlation-id.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-002-chain-uses-provided-correlation-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Chain uses provided correlationId" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Chain uses provided correlationId + +```gwt +Given the module is imported from platform-core +And the system time is fixed at 1703001234567 +When a correlation chain is created with commandId "cmd_test_123" and correlationId "corr_custom_456" +Then the chain correlationId is "corr_custom_456" +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-003-chain-uses-provided-user-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-003-chain-uses-provided-user-id.sdp.md index f317bc46..9b384b91 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-003-chain-uses-provided-user-id.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-003-chain-uses-provided-user-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Chain uses provided userId" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Chain uses provided userId + +```gwt +Given the module is imported from platform-core +And the system time is fixed at 1703001234567 +When a correlation chain is created with commandId "cmd_test_123" and userId "user_abc" +Then the chain userId is "user_abc" +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-004-chain-uses-provided-context.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-004-chain-uses-provided-context.sdp.md index 192b3dee..6911b5c9 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-004-chain-uses-provided-context.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-004-chain-uses-provided-context.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Chain uses provided context" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Chain uses provided context + +```gwt +Given the module is imported from platform-core +And the system time is fixed at 1703001234567 +When a correlation chain is created with commandId "cmd_test_123" and context source "api" version "v1" +Then the chain context equals source "api" version "v1" +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-005-chain-uses-provided-initiated-at.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-005-chain-uses-provided-initiated-at.sdp.md index 50253c28..74cbb831 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-005-chain-uses-provided-initiated-at.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-005-chain-uses-provided-initiated-at.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Chain uses provided initiatedAt" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Chain uses provided initiatedAt + +```gwt +Given the module is imported from platform-core +When a correlation chain is created with commandId "cmd_test_123" and initiatedAt 1700000000000 +Then the chain initiatedAt is 1700000000000 +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-006-chain-accepts-all-options-together.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-006-chain-accepts-all-options-together.sdp.md index 0f340eaa..3d1d740a 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-006-chain-accepts-all-options-together.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-006-chain-accepts-all-options-together.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Chain accepts all options together" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Chain accepts all options together + +```gwt +Given the module is imported from platform-core +When a correlation chain is created with all options commandId "cmd_test_123" correlationId "corr_custom" userId "user_xyz" context key "value" and initiatedAt 1699999999999 +Then the chain equals the full expected object: +And the chain context equals key "value" +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-007-derived-chain-preserves-correlation-id-and-uses-event-id-as-causation-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-007-derived-chain-preserves-correlation-id-and-uses-event-id-as-causation-id.sdp.md index 27fe6cd5..e2afd522 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-007-derived-chain-preserves-correlation-id-and-uses-event-id-as-causation-id.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-007-derived-chain-preserves-correlation-id-and-uses-event-id-as-causation-id.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Derived chain preserves correlationId and uses eventId as causationId" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Derived chain preserves correlationId and uses eventId as causationId + +```gwt +Given the module is imported from platform-core +And the system time is fixed at 1703001234567 +And a causation source with eventId "evt_abc123" and correlationId "corr_original" +When a correlation chain is derived from the source +Then the derived chain has the following properties: +And the derived chain commandId starts with "cmd_" +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-008-derived-chain-inherits-user-id-from-source.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-008-derived-chain-inherits-user-id-from-source.sdp.md index a0dd2d0b..cd80ba63 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-008-derived-chain-inherits-user-id-from-source.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-008-derived-chain-inherits-user-id-from-source.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Derived chain inherits userId from source" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Derived chain inherits userId from source + +```gwt +Given the module is imported from platform-core +And the system time is fixed at 1703001234567 +And a causation source with eventId "evt_abc123" correlationId "corr_original" and userId "user_inherited" +When a correlation chain is derived from the source +Then the derived chain userId is "user_inherited" +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-009-derived-chain-inherits-context-from-source.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-009-derived-chain-inherits-context-from-source.sdp.md index d5815fae..012f14e2 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-009-derived-chain-inherits-context-from-source.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-009-derived-chain-inherits-context-from-source.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Derived chain inherits context from source" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Derived chain inherits context from source + +```gwt +Given the module is imported from platform-core +And the system time is fixed at 1703001234567 +And a causation source with eventId "evt_abc123" correlationId "corr_original" and context parentKey "parentValue" +When a correlation chain is derived from the source +Then the derived chain context equals parentKey "parentValue" +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-010-derived-chain-merges-source-and-option-contexts.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-010-derived-chain-merges-source-and-option-contexts.sdp.md index 6c7b4ef6..173b7b32 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-010-derived-chain-merges-source-and-option-contexts.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-010-derived-chain-merges-source-and-option-contexts.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Derived chain merges source and option contexts" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Derived chain merges source and option contexts + +```gwt +Given the module is imported from platform-core +And the system time is fixed at 1703001234567 +And a causation source with eventId "evt_abc123" correlationId "corr_original" and context parentKey "parentValue" +When a correlation chain is derived from the source with context childKey "childValue" +Then the derived chain context equals parentKey "parentValue" and childKey "childValue" +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-011-option-context-takes-precedence-over-source-context.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-011-option-context-takes-precedence-over-source-context.sdp.md index 0329461f..9323a13f 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-011-option-context-takes-precedence-over-source-context.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-011-option-context-takes-precedence-over-source-context.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Option context takes precedence over source context" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Option context takes precedence over source context + +```gwt +Given the module is imported from platform-core +And the system time is fixed at 1703001234567 +And a causation source with eventId "evt_abc123" correlationId "corr_original" and context key "sourceValue" +When a correlation chain is derived from the source with context key "optionValue" +Then the derived chain context equals key "optionValue" +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-012-source-context-preserved-when-options-have-no-context.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-012-source-context-preserved-when-options-have-no-context.sdp.md index 3a5fddf1..4065d0a5 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-012-source-context-preserved-when-options-have-no-context.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-012-source-context-preserved-when-options-have-no-context.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Source context preserved when options have no context" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Source context preserved when options have no context + +```gwt +Given the module is imported from platform-core +And the system time is fixed at 1703001234567 +And a causation source with eventId "evt_abc123" correlationId "corr_original" and context key "value" +When a correlation chain is derived from the source with empty options +Then the derived chain context equals key "value" +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-013-options-context-used-when-source-has-no-context.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-013-options-context-used-when-source-has-no-context.sdp.md index 1e88848d..9e3ef069 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-013-options-context-used-when-source-has-no-context.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-013-options-context-used-when-source-has-no-context.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Options context used when source has no context" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Options context used when source has no context + +```gwt +Given the module is imported from platform-core +And the system time is fixed at 1703001234567 +And a causation source with eventId "evt_abc123" and correlationId "corr_original" +When a correlation chain is derived from the source with context key "value" +Then the derived chain context equals key "value" +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-014-context-is-undefined-when-neither-source-nor-options-have-context.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-014-context-is-undefined-when-neither-source-nor-options-have-context.sdp.md index 35ea049b..6e0ae278 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-014-context-is-undefined-when-neither-source-nor-options-have-context.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-014-context-is-undefined-when-neither-source-nor-options-have-context.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Context is undefined when neither source nor options have context" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Context is undefined when neither source nor options have context + +```gwt +Given the module is imported from platform-core +And the system time is fixed at 1703001234567 +And a causation source with eventId "evt_abc123" and correlationId "corr_original" +When a correlation chain is derived from the source +Then the derived chain context is undefined +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-015-both-empty-contexts-merge-to-empty-object.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-015-both-empty-contexts-merge-to-empty-object.sdp.md index e87c38d5..a3fd4308 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-015-both-empty-contexts-merge-to-empty-object.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-015-both-empty-contexts-merge-to-empty-object.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Both empty contexts merge to empty object" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Both empty contexts merge to empty object + +```gwt +Given the module is imported from platform-core +And the system time is fixed at 1703001234567 +And a causation source with eventId "evt_abc123" correlationId "corr_original" and empty context +When a correlation chain is derived from the source with empty context +Then the derived chain context is an empty object +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-016-source-context-preserved-when-options-context-is-empty.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-016-source-context-preserved-when-options-context-is-empty.sdp.md index 3955410f..3b7c7e09 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-016-source-context-preserved-when-options-context-is-empty.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-016-source-context-preserved-when-options-context-is-empty.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Source context preserved when options context is empty" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Source context preserved when options context is empty + +```gwt +Given the module is imported from platform-core +And the system time is fixed at 1703001234567 +And a causation source with eventId "evt_abc123" correlationId "corr_original" and context key "value" +When a correlation chain is derived from the source with empty context +Then the derived chain context equals key "value" +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-017-options-context-used-when-source-context-is-empty.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-017-options-context-used-when-source-context-is-empty.sdp.md index 85c0916e..e30f4883 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-017-options-context-used-when-source-context-is-empty.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-017-options-context-used-when-source-context-is-empty.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Options context used when source context is empty" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Options context used when source context is empty + +```gwt +Given the module is imported from platform-core +And the system time is fixed at 1703001234567 +And a causation source with eventId "evt_abc123" correlationId "corr_original" and empty context +When a correlation chain is derived from the source with context key "value" +Then the derived chain context equals key "value" +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-018-derived-chain-uses-provided-command-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-018-derived-chain-uses-provided-command-id.sdp.md index bcbdb1d2..07595474 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-018-derived-chain-uses-provided-command-id.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-018-derived-chain-uses-provided-command-id.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Derived chain uses provided commandId" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Derived chain uses provided commandId + +```gwt +Given the module is imported from platform-core +And the system time is fixed at 1703001234567 +And a causation source with eventId "evt_abc123" and correlationId "corr_original" +When a correlation chain is derived from the source with commandId "cmd_custom_999" +Then the derived chain commandId is "cmd_custom_999" +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-019-derived-chain-uses-provided-initiated-at.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-019-derived-chain-uses-provided-initiated-at.sdp.md index 927b001a..eb690852 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-019-derived-chain-uses-provided-initiated-at.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-019-derived-chain-uses-provided-initiated-at.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Derived chain uses provided initiatedAt" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Derived chain uses provided initiatedAt + +```gwt +Given the module is imported from platform-core +And the system time is fixed at 1703001234567 +And a causation source with eventId "evt_abc123" and correlationId "corr_original" +When a correlation chain is derived from the source with initiatedAt 1700000000000 +Then the derived chain initiatedAt is 1700000000000 +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-020-extracts-correlation-id-and-causation-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-020-extracts-correlation-id-and-causation-id.sdp.md index 48b149dd..c55f595b 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-020-extracts-correlation-id-and-causation-id.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-020-extracts-correlation-id-and-causation-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Extracts correlationId and causationId" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Extracts correlationId and causationId + +```gwt +Given the module is imported from platform-core +And a correlation chain with commandId "cmd_123" correlationId "corr_456" and causationId "evt_789" +When toEventMetadata is called on the chain +Then the metadata has correlationId "corr_456" and causationId "evt_789" +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-021-includes-user-id-when-present.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-021-includes-user-id-when-present.sdp.md index 4493f5fd..bab9fcdd 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-021-includes-user-id-when-present.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-021-includes-user-id-when-present.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Includes userId when present" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Includes userId when present + +```gwt +Given the module is imported from platform-core +And a correlation chain with commandId "cmd_123" correlationId "corr_456" causationId "cmd_123" and userId "user_abc" +When toEventMetadata is called on the chain +Then the metadata userId is "user_abc" +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-022-excludes-user-id-when-undefined.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-022-excludes-user-id-when-undefined.sdp.md index 0a0d228a..bade9a5f 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-022-excludes-user-id-when-undefined.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-022-excludes-user-id-when-undefined.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Excludes userId when undefined" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Excludes userId when undefined + +```gwt +Given the module is imported from platform-core +And a correlation chain with commandId "cmd_123" correlationId "corr_456" and causationId "cmd_123" +When toEventMetadata is called on the chain +Then the metadata does not contain userId +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-023-merges-additional-metadata.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-023-merges-additional-metadata.sdp.md index 8a3f6ea7..e7de187b 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-023-merges-additional-metadata.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-023-merges-additional-metadata.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Merges additional metadata" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Merges additional metadata + +```gwt +Given the module is imported from platform-core +And a correlation chain with commandId "cmd_123" correlationId "corr_456" and causationId "cmd_123" +When toEventMetadata is called with additional metadata requestId "req_xyz" and customField 42 +Then the metadata has correlationId "corr_456" and causationId "cmd_123" +And the metadata has requestId "req_xyz" and customField 42 +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-024-does-not-include-context-initiated-at-or-command-id-from-chain.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-024-does-not-include-context-initiated-at-or-command-id-from-chain.sdp.md index d2f786c9..a376e557 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-024-does-not-include-context-initiated-at-or-command-id-from-chain.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-024-does-not-include-context-initiated-at-or-command-id-from-chain.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Does not include context, initiatedAt, or commandId from chain" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Does not include context, initiatedAt, or commandId from chain + +```gwt +Given the module is imported from platform-core +And a correlation chain with commandId "cmd_123" correlationId "corr_456" causationId "cmd_123" and context key "value" +When toEventMetadata is called on the chain +Then the metadata does not contain excluded fields: +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-025-returns-true-for-chains-with-same-correlation-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-025-returns-true-for-chains-with-same-correlation-id.sdp.md index 71ce185a..769049ac 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-025-returns-true-for-chains-with-same-correlation-id.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-025-returns-true-for-chains-with-same-correlation-id.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for chains with same correlationId" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Returns true for chains with same correlationId + +```gwt +Given the module is imported from platform-core +And chain A with commandId "cmd_1" correlationId "corr_shared" and causationId "cmd_1" +And chain B with commandId "cmd_2" correlationId "corr_shared" and causationId "evt_1" +When isCorrelated is called with chain A and chain B +Then the result is true +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-026-returns-false-for-chains-with-different-correlation-ids.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-026-returns-false-for-chains-with-different-correlation-ids.sdp.md index 44a8f09b..9e93db51 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-026-returns-false-for-chains-with-different-correlation-ids.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-026-returns-false-for-chains-with-different-correlation-ids.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for chains with different correlationIds" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Returns false for chains with different correlationIds + +```gwt +Given the module is imported from platform-core +And chain A with commandId "cmd_1" correlationId "corr_first" and causationId "cmd_1" +And chain B with commandId "cmd_2" correlationId "corr_second" and causationId "evt_1" +When isCorrelated is called with chain A and chain B +Then the result is false +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-027-returns-true-when-child-causation-id-matches-parent-command-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-027-returns-true-when-child-causation-id-matches-parent-command-id.sdp.md index 1de63f0a..971fdf4d 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-027-returns-true-when-child-causation-id-matches-parent-command-id.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-027-returns-true-when-child-causation-id-matches-parent-command-id.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when child causationId matches parent commandId" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Returns true when child causationId matches parent commandId + +```gwt +Given the module is imported from platform-core +And a parent chain with commandId "cmd_parent" correlationId "corr_shared" and causationId "cmd_parent" +And a child chain with commandId "cmd_child" correlationId "corr_shared" and causationId "cmd_parent" +When isCausedBy is called with parent and child +Then the result is true +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-028-returns-false-when-child-causation-id-does-not-match.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-028-returns-false-when-child-causation-id-does-not-match.sdp.md index 72eed607..54165693 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-028-returns-false-when-child-causation-id-does-not-match.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-028-returns-false-when-child-causation-id-does-not-match.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when child causationId does not match" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Returns false when child causationId does not match + +```gwt +Given the module is imported from platform-core +And a parent chain with commandId "cmd_parent" correlationId "corr_shared" and causationId "cmd_parent" +And a child chain with commandId "cmd_child" correlationId "corr_shared" and causationId "evt_other" +When isCausedBy is called with parent and child +Then the result is false +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-029-returns-true-for-same-chain-where-command-is-its-own-cause.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-029-returns-true-for-same-chain-where-command-is-its-own-cause.sdp.md index 571225ca..7c2be8e3 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-029-returns-true-for-same-chain-where-command-is-its-own-cause.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-029-returns-true-for-same-chain-where-command-is-its-own-cause.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for same chain where command is its own cause" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Returns true for same chain where command is its own cause + +```gwt +Given the module is imported from platform-core +And a self-referencing chain with commandId "cmd_1" correlationId "corr_1" and causationId "cmd_1" +When isCausedBy is called with the same chain as both parent and child +Then the result is true +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-030-full-request-flow-tracing-from-user-command-through-saga-reaction.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-030-full-request-flow-tracing-from-user-command-through-saga-reaction.sdp.md index 2bbfe13d..9e76f459 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-030-full-request-flow-tracing-from-user-command-through-saga-reaction.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-030-full-request-flow-tracing-from-user-command-through-saga-reaction.sdp.md @@ -10,4 +10,18 @@ relations: ## Intent -- outcome: Executable scenario "Full request flow tracing from user command through saga reaction" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Full request flow tracing from user command through saga reaction + +```gwt +Given the module is imported from platform-core +And the system time is fixed at 1703001234567 +When a correlation chain is created with commandId "cmd_submit_001" userId "user_123" and context source "web-ui" and toEventMetadata is called on the submit chain and a saga derives a chain from event "evt_order_submitted_001" using the submit… +Then the chain commandId is "cmd_submit_001" +And the chain causationId is "cmd_submit_001" +And the submit metadata correlationId matches the chain correlationId +And the saga chain correlationId matches the submit chain correlationId +And the saga chain causationId is "evt_order_submitted_001" +And the saga chain userId is "user_123" +And the saga chain context equals source "web-ui" +And the submit chain and saga chain are correlated +``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-031-multi-step-saga-preserves-correlation-id-across-three-links.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-031-multi-step-saga-preserves-correlation-id-across-three-links.sdp.md index 734e9a67..8b2f9390 100644 --- a/specs/behavior/platform-core/correlation/chain.examples/s-031-multi-step-saga-preserves-correlation-id-across-three-links.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.examples/s-031-multi-step-saga-preserves-correlation-id-across-three-links.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Multi-step saga preserves correlationId across three links" from packages/platform-core/tests/features/behavior/correlation/chain.feature +- outcome: Executable scenario: Multi-step saga preserves correlationId across three links + +```gwt +Given the module is imported from platform-core +And the system time is fixed at 1703001234567 +When an initial chain is created with commandId "cmd_1" and correlationId "corr_saga_flow" and chain2 is derived from event "evt_1" using the initial chain correlationId and chain3 is derived from event "evt_2" using chain2 correlationId +Then all three chains share correlationId "corr_saga_flow" +And chain2 causationId is "evt_1" +And chain3 causationId is "evt_2" +And all three chains are pairwise correlated +``` diff --git a/specs/behavior/platform-core/correlation/chain.sdp.md b/specs/behavior/platform-core/correlation/chain.sdp.md index 1eddf1db..f7c8cfa7 100644 --- a/specs/behavior/platform-core/correlation/chain.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: correlation chain utilities that create, derive, and inspect chains so that I can trace causation through command-event flows (test carrier: packages/platform-core/tests/features/behavior/correlation/chain.feature) +- actor: a platform developer +- outcome: correlation chain utilities that create, derive, and inspect chains so that I can trace causation through command-event flows + +## Behavior + +- rule: createCorrelationChain with only commandId sets defaults +- rule: createCorrelationChain with options uses provided values +- rule: deriveCorrelationChain basic derivation preserves correlation and sets causation +- rule: deriveCorrelationChain merges context from source and options +- rule: deriveCorrelationChain with options uses provided overrides +- rule: toEventMetadata extracts correlationId and causationId from chain +- rule: isCorrelated compares correlationIds of two chains +- rule: isCausedBy checks if child causationId matches parent commandId +- rule: Correlation chains trace full request flows across command-event boundaries diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-001-record-a-new-correlation.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-001-record-a-new-correlation.sdp.md index e29f4698..047e6326 100644 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-001-record-a-new-correlation.sdp.md +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-001-record-a-new-correlation.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Record a new correlation" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature +- outcome: Executable scenario: Record a new correlation + +```gwt +Given the feature fixture is in place +When a correlation is recorded with commandId "cmd_123", eventIds "evt_456", commandType "CreateOrder", and boundedContext "orders" +Then the record result is true +And the client was called with the correct arguments +``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-002-merge-event-i-ds-for-existing-correlation.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-002-merge-event-i-ds-for-existing-correlation.sdp.md index d89ff636..a4ccb578 100644 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-002-merge-event-i-ds-for-existing-correlation.sdp.md +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-002-merge-event-i-ds-for-existing-correlation.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Merge event IDs for existing correlation" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature +- outcome: Executable scenario: Merge event IDs for existing correlation + +```gwt +Given a correlation exists with commandId "cmd_123", eventId "evt_1", commandType "CreateOrder", and boundedContext "orders" +When a second correlation is recorded with commandId "cmd_123", eventId "evt_2", commandType "CreateOrder", and boundedContext "orders" +Then the correlation for "cmd_123" contains event IDs: +``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-003-return-null-for-non-existent-command.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-003-return-null-for-non-existent-command.sdp.md index 4c3e0dfd..62e4bee2 100644 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-003-return-null-for-non-existent-command.sdp.md +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-003-return-null-for-non-existent-command.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Return null for non-existent command" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature +- outcome: Executable scenario: Return null for non-existent command + +```gwt +Given the feature fixture is in place +When getEventsByCommand is called with "cmd_nonexistent" +Then the result is null +``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-004-return-correlation-for-existing-command.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-004-return-correlation-for-existing-command.sdp.md index 5a5155ec..f0a30a22 100644 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-004-return-correlation-for-existing-command.sdp.md +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-004-return-correlation-for-existing-command.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Return correlation for existing command" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature +- outcome: Executable scenario: Return correlation for existing command + +```gwt +Given a correlation exists with commandId "cmd_123", eventIds "evt_456,evt_789", commandType "CreateOrder", and boundedContext "orders" +When getEventsByCommand is called with "cmd_123" +Then the returned correlation has all properties: +And the returned correlation has eventIds "evt_456" and "evt_789" +``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-005-filter-by-bounded-context.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-005-filter-by-bounded-context.sdp.md index bd91aa7b..6d93d7d4 100644 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-005-filter-by-bounded-context.sdp.md +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-005-filter-by-bounded-context.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Filter by bounded context" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature +- outcome: Executable scenario: Filter by bounded context + +```gwt +Given seeded correlations exist across contexts +When getCorrelationsByContext is called with boundedContext "orders" +Then the result has 2 correlations all with boundedContext "orders" +``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-006-throw-when-bounded-context-is-missing.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-006-throw-when-bounded-context-is-missing.sdp.md index a109cda1..81374b34 100644 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-006-throw-when-bounded-context-is-missing.sdp.md +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-006-throw-when-bounded-context-is-missing.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throw when boundedContext is missing" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature +- outcome: Executable scenario: Throw when boundedContext is missing + +```gwt +Given the feature fixture is in place +When getCorrelationsByContext is called with an empty object +Then it throws "boundedContext is required for getCorrelationsByContext" +``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-007-respect-limit-parameter.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-007-respect-limit-parameter.sdp.md index 739eb588..34cce786 100644 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-007-respect-limit-parameter.sdp.md +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-007-respect-limit-parameter.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Respect limit parameter" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature +- outcome: Executable scenario: Respect limit parameter + +```gwt +Given seeded correlations exist across contexts +When getCorrelationsByContext is called with boundedContext "orders" and limit 1 +Then the result has 1 correlation +``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-008-return-true-for-command-with-events.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-008-return-true-for-command-with-events.sdp.md index 862d3cb8..8e424e19 100644 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-008-return-true-for-command-with-events.sdp.md +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-008-return-true-for-command-with-events.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Return true for command with events" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature +- outcome: Executable scenario: Return true for command with events + +```gwt +Given a correlation exists with commandId "cmd_123", eventId "evt_456", commandType "CreateOrder", and boundedContext "orders" +When hasCorrelation is called with "cmd_123" +Then the hasCorrelation result is true +``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-009-return-false-for-non-existent-command.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-009-return-false-for-non-existent-command.sdp.md index b58bfb2f..31d57bdb 100644 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-009-return-false-for-non-existent-command.sdp.md +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-009-return-false-for-non-existent-command.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Return false for non-existent command" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature +- outcome: Executable scenario: Return false for non-existent command + +```gwt +Given the feature fixture is in place +When hasCorrelation is called with "cmd_nonexistent" +Then the hasCorrelation result is false +``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-010-return-event-count-for-existing-command.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-010-return-event-count-for-existing-command.sdp.md index e10ec2cc..a8928a56 100644 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-010-return-event-count-for-existing-command.sdp.md +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-010-return-event-count-for-existing-command.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Return event count for existing command" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature +- outcome: Executable scenario: Return event count for existing command + +```gwt +Given a correlation exists with commandId "cmd_123", eventIds "evt_1,evt_2,evt_3", commandType "CreateOrder", and boundedContext "orders" +When getEventCount is called with "cmd_123" +Then the event count is 3 +``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-011-return-0-for-non-existent-command.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-011-return-0-for-non-existent-command.sdp.md index 0496c639..528341d4 100644 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-011-return-0-for-non-existent-command.sdp.md +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-011-return-0-for-non-existent-command.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Return 0 for non-existent command" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature +- outcome: Executable scenario: Return 0 for non-existent command + +```gwt +Given the feature fixture is in place +When getEventCount is called with "cmd_nonexistent" +Then the event count is 0 +``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-012-create-a-correlation-service-instance.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-012-create-a-correlation-service-instance.sdp.md index b74878d2..59d312f5 100644 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-012-create-a-correlation-service-instance.sdp.md +++ b/specs/behavior/platform-core/correlation/correlation-service.examples/s-012-create-a-correlation-service-instance.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Create a CorrelationService instance" from packages/platform-core/tests/features/behavior/correlation/correlation-service.feature +- outcome: Executable scenario: Create a CorrelationService instance + +```gwt +Given the feature fixture is in place +When createCorrelationService is called with a mock client +Then the result is an instance of CorrelationService +``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.sdp.md index 1dcbdfbe..e8031dfb 100644 --- a/specs/behavior/platform-core/correlation/correlation-service.sdp.md +++ b/specs/behavior/platform-core/correlation/correlation-service.sdp.md @@ -10,4 +10,20 @@ relations: ## Intent -- outcome: a correlation service that tracks command-to-event relationships so that I can trace which events resulted from which commands (test carrier: packages/platform-core/tests/features/behavior/correlation/correlation-service.feature) +- actor: a platform developer +- outcome: a correlation service that tracks command-to-event relationships so that I can trace which events resulted from which commands + +## Behavior + +- rule: recordCorrelation persists a new command-event correlation +- rule: recordCorrelation merges event IDs for duplicate command IDs +- rule: getEventsByCommand returns null for non-existent commands +- rule: getEventsByCommand returns the full correlation for existing commands +- rule: getCorrelationsByContext filters correlations by bounded context +- rule: getCorrelationsByContext throws when boundedContext is missing +- rule: getCorrelationsByContext respects the limit parameter +- rule: hasCorrelation returns true when a correlation exists for the command +- rule: hasCorrelation returns false for non-existent commands +- rule: getEventCount returns the number of events for an existing command +- rule: getEventCount returns 0 for non-existent commands +- rule: createCorrelationService returns a CorrelationService instance diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-001-successful-execution-without-scope-operations.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-001-successful-execution-without-scope-operations.sdp.md index a7d84e1f..15d80bda 100644 --- a/specs/behavior/platform-core/dcb/execute.examples/s-001-successful-execution-without-scope-operations.sdp.md +++ b/specs/behavior/platform-core/dcb/execute.examples/s-001-successful-execution-without-scope-operations.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "Successful execution without scopeOperations" from packages/platform-core/tests/features/behavior/dcb/execute.feature +- outcome: Executable scenario: Successful execution without scopeOperations + +```gwt +Given a mock mutation context +And a scope key "tenant:t1:reservation:res_123" +And entities with streamIds "product_1" and "product_2" +And a decider that succeeds with event type "ItemsReserved" +And no scopeOperations are provided +When I execute the DCB operation +Then the result status is "success" +And the result contains event type "ItemsReserved" +And the result scopeVersion is 1 +``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-002-successful-execution-includes-schema-version-and-category-in-events.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-002-successful-execution-includes-schema-version-and-category-in-events.sdp.md index 2dafc6af..763fffe4 100644 --- a/specs/behavior/platform-core/dcb/execute.examples/s-002-successful-execution-includes-schema-version-and-category-in-events.sdp.md +++ b/specs/behavior/platform-core/dcb/execute.examples/s-002-successful-execution-includes-schema-version-and-category-in-events.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: Executable scenario "Successful execution includes schemaVersion and category in events" from packages/platform-core/tests/features/behavior/dcb/execute.feature +- outcome: Executable scenario: Successful execution includes schemaVersion and category in events + +```gwt +Given a mock mutation context +And a scope key "tenant:t1:reservation:res_123" +And entities with streamIds "product_1" and "product_2" +And a decider that succeeds with event type "ItemsReserved" +And schemaVersion is 2 +And eventCategory is "domain" +When I execute the DCB operation +Then the result status is "success" +And the generated event has schemaVersion 2 +And the generated event has category "domain" +``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-003-rejected-decider-result-returns-rejection.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-003-rejected-decider-result-returns-rejection.sdp.md index a95a3b64..47864b75 100644 --- a/specs/behavior/platform-core/dcb/execute.examples/s-003-rejected-decider-result-returns-rejection.sdp.md +++ b/specs/behavior/platform-core/dcb/execute.examples/s-003-rejected-decider-result-returns-rejection.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Rejected decider result returns rejection" from packages/platform-core/tests/features/behavior/dcb/execute.feature +- outcome: Executable scenario: Rejected decider result returns rejection + +```gwt +Given a mock mutation context +And a scope key "tenant:t1:reservation:res_123" +And entities with streamIds "product_1" and "product_2" +And a decider that rejects with code "INSUFFICIENT_STOCK" and message "Not enough stock" +When I execute the DCB operation +Then the result status is "rejected" +And the rejection code is "INSUFFICIENT_STOCK" +And the rejection reason is "Not enough stock" +``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-004-failed-decider-result-returns-failure-with-event.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-004-failed-decider-result-returns-failure-with-event.sdp.md index 2bfe498b..c53826f7 100644 --- a/specs/behavior/platform-core/dcb/execute.examples/s-004-failed-decider-result-returns-failure-with-event.sdp.md +++ b/specs/behavior/platform-core/dcb/execute.examples/s-004-failed-decider-result-returns-failure-with-event.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Failed decider result returns failure with event" from packages/platform-core/tests/features/behavior/dcb/execute.feature +- outcome: Executable scenario: Failed decider result returns failure with event + +```gwt +Given a mock mutation context +And a scope key "tenant:t1:reservation:res_123" +And entities with streamIds "product_1" and "product_2" +And a decider that fails with event type "ReservationFailed" and reason "Stock unavailable" +When I execute the DCB operation +Then the result status is "failed" +And the failure reason is "Stock unavailable" +And the result contains event type "ReservationFailed" +``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-005-occ-pre-check-passes-when-expected-version-matches-scope-version.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-005-occ-pre-check-passes-when-expected-version-matches-scope-version.sdp.md index e378efd0..ff7ace9d 100644 --- a/specs/behavior/platform-core/dcb/execute.examples/s-005-occ-pre-check-passes-when-expected-version-matches-scope-version.sdp.md +++ b/specs/behavior/platform-core/dcb/execute.examples/s-005-occ-pre-check-passes-when-expected-version-matches-scope-version.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "OCC pre-check passes when expectedVersion matches scope version" from packages/platform-core/tests/features/behavior/dcb/execute.feature +- outcome: Executable scenario: OCC pre-check passes when expectedVersion matches scope version + +```gwt +Given a mock mutation context +And a scope key "tenant:t1:reservation:res_123" +And entities with streamIds "product_1" and "product_2" +And scopeOperations that return scope with currentVersion 0 +And expectedVersion is 0 +And a decider that succeeds +And scopeOperations commitScope succeeds with newVersion 1 +When I execute the DCB operation +Then the result status is "success" +``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-006-occ-pre-check-detects-stale-expected-version.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-006-occ-pre-check-detects-stale-expected-version.sdp.md index 78d346bd..70fd12b5 100644 --- a/specs/behavior/platform-core/dcb/execute.examples/s-006-occ-pre-check-detects-stale-expected-version.sdp.md +++ b/specs/behavior/platform-core/dcb/execute.examples/s-006-occ-pre-check-detects-stale-expected-version.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "OCC pre-check detects stale expectedVersion" from packages/platform-core/tests/features/behavior/dcb/execute.feature +- outcome: Executable scenario: OCC pre-check detects stale expectedVersion + +```gwt +Given a mock mutation context +And a scope key "tenant:t1:reservation:res_123" +And entities with streamIds "product_1" and "product_2" +And scopeOperations that return scope with currentVersion 5 +And expectedVersion is 3 +When I execute the DCB operation +Then the result status is "conflict" +And the conflict currentVersion is 5 +``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-007-occ-pre-check-detects-scope-not-found-when-expected-version-0.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-007-occ-pre-check-detects-scope-not-found-when-expected-version-0.sdp.md index 8fbb1396..ec37bad2 100644 --- a/specs/behavior/platform-core/dcb/execute.examples/s-007-occ-pre-check-detects-scope-not-found-when-expected-version-0.sdp.md +++ b/specs/behavior/platform-core/dcb/execute.examples/s-007-occ-pre-check-detects-scope-not-found-when-expected-version-0.sdp.md @@ -6,8 +6,19 @@ readiness: idea relations: refines: spec:behavior.platform-core.dcb.execute --- -# OCC pre-check detects scope not found when expectedVersion > 0 +# OCC pre-check detects scope not found when expectedVersion ) 0 ## Intent -- outcome: Executable scenario "OCC pre-check detects scope not found when expectedVersion > 0" from packages/platform-core/tests/features/behavior/dcb/execute.feature +- outcome: Executable scenario: OCC pre-check detects scope not found when expectedVersion ) 0 + +```gwt +Given a mock mutation context +And a scope key "tenant:t1:reservation:res_123" +And entities with streamIds "product_1" and "product_2" +And scopeOperations that return null scope +And expectedVersion is 1 +When I execute the DCB operation +Then the result status is "conflict" +And the conflict currentVersion is 0 +``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-008-occ-pre-check-allows-new-scope-with-expected-version-0.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-008-occ-pre-check-allows-new-scope-with-expected-version-0.sdp.md index 710f0f66..5dd2aa69 100644 --- a/specs/behavior/platform-core/dcb/execute.examples/s-008-occ-pre-check-allows-new-scope-with-expected-version-0.sdp.md +++ b/specs/behavior/platform-core/dcb/execute.examples/s-008-occ-pre-check-allows-new-scope-with-expected-version-0.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "OCC pre-check allows new scope with expectedVersion 0" from packages/platform-core/tests/features/behavior/dcb/execute.feature +- outcome: Executable scenario: OCC pre-check allows new scope with expectedVersion 0 + +```gwt +Given a mock mutation context +And a scope key "tenant:t1:reservation:res_123" +And entities with streamIds "product_1" and "product_2" +And scopeOperations that return null scope +And expectedVersion is 0 +And a decider that succeeds +And scopeOperations commitScope succeeds with newVersion 1 +When I execute the DCB operation +Then the result status is "success" +``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-009-occ-commit-detects-concurrent-modification.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-009-occ-commit-detects-concurrent-modification.sdp.md index 460473f3..03361ad7 100644 --- a/specs/behavior/platform-core/dcb/execute.examples/s-009-occ-commit-detects-concurrent-modification.sdp.md +++ b/specs/behavior/platform-core/dcb/execute.examples/s-009-occ-commit-detects-concurrent-modification.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: Executable scenario "OCC commit detects concurrent modification" from packages/platform-core/tests/features/behavior/dcb/execute.feature +- outcome: Executable scenario: OCC commit detects concurrent modification + +```gwt +Given a mock mutation context +And a scope key "tenant:t1:reservation:res_123" +And entities with streamIds "product_1" and "product_2" +And scopeOperations that return scope with currentVersion 0 +And expectedVersion is 0 +And a decider that succeeds +And scopeOperations commitScope returns conflict with currentVersion 1 +When I execute the DCB operation +Then the result status is "conflict" +And the conflict currentVersion is 1 +``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-010-occ-commit-tracks-updated-stream-i-ds.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-010-occ-commit-tracks-updated-stream-i-ds.sdp.md index c767f987..f72ba6a5 100644 --- a/specs/behavior/platform-core/dcb/execute.examples/s-010-occ-commit-tracks-updated-stream-i-ds.sdp.md +++ b/specs/behavior/platform-core/dcb/execute.examples/s-010-occ-commit-tracks-updated-stream-i-ds.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "OCC commit tracks updated stream IDs" from packages/platform-core/tests/features/behavior/dcb/execute.feature +- outcome: Executable scenario: OCC commit tracks updated stream IDs + +```gwt +Given a mock mutation context +And a scope key "tenant:t1:reservation:res_123" +And entities with streamIds "product_1" and "product_2" +And scopeOperations that return scope with currentVersion 0 +And expectedVersion is 0 +And a decider that succeeds with updates to "product_1" and "product_2" +And scopeOperations commitScope is called +When I execute the DCB operation +Then commitScope was called with streamIds "product_1" and "product_2" +``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-011-invalid-scope-key-returns-rejection.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-011-invalid-scope-key-returns-rejection.sdp.md index f6172d2b..bbfd7919 100644 --- a/specs/behavior/platform-core/dcb/execute.examples/s-011-invalid-scope-key-returns-rejection.sdp.md +++ b/specs/behavior/platform-core/dcb/execute.examples/s-011-invalid-scope-key-returns-rejection.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Invalid scope key returns rejection" from packages/platform-core/tests/features/behavior/dcb/execute.feature +- outcome: Executable scenario: Invalid scope key returns rejection + +```gwt +Given a mock mutation context +And a scope key "tenant:t1:reservation:res_123" +And entities with streamIds "product_1" and "product_2" +And an invalid scope key "invalid_key" +When I execute the DCB operation +Then the result status is "rejected" +And the rejection code contains "INVALID_SCOPE_KEY_FORMAT" +``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-012-missing-entities-returns-rejection.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-012-missing-entities-returns-rejection.sdp.md index 9fa1db49..de5b70e8 100644 --- a/specs/behavior/platform-core/dcb/execute.examples/s-012-missing-entities-returns-rejection.sdp.md +++ b/specs/behavior/platform-core/dcb/execute.examples/s-012-missing-entities-returns-rejection.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Missing entities returns rejection" from packages/platform-core/tests/features/behavior/dcb/execute.feature +- outcome: Executable scenario: Missing entities returns rejection + +```gwt +Given a mock mutation context +And a scope key "tenant:t1:reservation:res_123" +And entities with streamIds "product_1" and "product_2" +And entities where "product_1" exists but "product_2" does not +When I execute the DCB operation +Then the result status is "rejected" +And the rejection code is "ENTITIES_NOT_FOUND" +And the rejection reason contains "product_2" +``` diff --git a/specs/behavior/platform-core/dcb/execute.sdp.md b/specs/behavior/platform-core/dcb/execute.sdp.md index 76fd372c..3ff14a26 100644 --- a/specs/behavior/platform-core/dcb/execute.sdp.md +++ b/specs/behavior/platform-core/dcb/execute.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: executeWithDCB to enforce scope-level OCC so that cross-entity invariants are protected from concurrent modifications (test carrier: packages/platform-core/tests/features/behavior/dcb/execute.feature) +- actor: a platform developer +- outcome: executeWithDCB to enforce scope-level OCC so that cross-entity invariants are protected from concurrent modifications diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-001-create-valid-scope-key-from-components.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-001-create-valid-scope-key-from-components.sdp.md index db7a15ac..0497272e 100644 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-001-create-valid-scope-key-from-components.sdp.md +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-001-create-valid-scope-key-from-components.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Create valid scope key from components" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature +- outcome: Executable scenario: Create valid scope key from components + +```gwt +Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" +And the tenant prefix is "tenant:" for mandatory tenant isolation +When I call createScopeKey with tenantId "t123", scopeType "reservation", scopeId "res_456" +Then I receive scope key "tenant:t123:reservation:res_456" +And the result is a branded DCBScopeKey type +``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-002-scope-id-may-contain-colons-for-composite-identifiers.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-002-scope-id-may-contain-colons-for-composite-identifiers.sdp.md index fa868c69..9e4d2e72 100644 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-002-scope-id-may-contain-colons-for-composite-identifiers.sdp.md +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-002-scope-id-may-contain-colons-for-composite-identifiers.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Scope ID may contain colons for composite identifiers" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature +- outcome: Executable scenario: Scope ID may contain colons for composite identifiers + +```gwt +Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" +And the tenant prefix is "tenant:" for mandatory tenant isolation +When I call createScopeKey with tenantId "t1", scopeType "order", scopeId "ord:2024:001" +Then I receive scope key "tenant:t1:order:ord:2024:001" +``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-003-create-scope-key-throws-on-invalid-input.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-003-create-scope-key-throws-on-invalid-input.sdp.md index b497de66..53a08c4a 100644 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-003-create-scope-key-throws-on-invalid-input.sdp.md +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-003-create-scope-key-throws-on-invalid-input.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "createScopeKey throws on invalid input" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature +- outcome: Executable scenario: createScopeKey throws on invalid input + +```gwt +Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" +And the tenant prefix is "tenant:" for mandatory tenant isolation +When I call createScopeKey with tenantId "value", scopeType "value", scopeId "value" +Then an error is thrown with message containing "value" +``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-004-try-create-scope-key-returns-scope-key-for-valid-input.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-004-try-create-scope-key-returns-scope-key-for-valid-input.sdp.md index 2c020bb7..26871d16 100644 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-004-try-create-scope-key-returns-scope-key-for-valid-input.sdp.md +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-004-try-create-scope-key-returns-scope-key-for-valid-input.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "tryCreateScopeKey returns scope key for valid input" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature +- outcome: Executable scenario: tryCreateScopeKey returns scope key for valid input + +```gwt +Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" +And the tenant prefix is "tenant:" for mandatory tenant isolation +When I call tryCreateScopeKey with tenantId "tenant_1", scopeType "order", scopeId "ord_789" +Then I receive scope key "tenant:tenant_1:order:ord_789" +``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-005-try-create-scope-key-returns-null-for-invalid-input.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-005-try-create-scope-key-returns-null-for-invalid-input.sdp.md index 8baa3529..2515ba0e 100644 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-005-try-create-scope-key-returns-null-for-invalid-input.sdp.md +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-005-try-create-scope-key-returns-null-for-invalid-input.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "tryCreateScopeKey returns null for invalid input" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature +- outcome: Executable scenario: tryCreateScopeKey returns null for invalid input + +```gwt +Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" +And the tenant prefix is "tenant:" for mandatory tenant isolation +When I call tryCreateScopeKey with tenantId "", scopeType "order", scopeId "ord_1" +Then I receive null +``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-006-parse-valid-scope-key-into-components.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-006-parse-valid-scope-key-into-components.sdp.md index 402c983b..eb97bb3b 100644 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-006-parse-valid-scope-key-into-components.sdp.md +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-006-parse-valid-scope-key-into-components.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Parse valid scope key into components" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature +- outcome: Executable scenario: Parse valid scope key into components + +```gwt +Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" +And the tenant prefix is "tenant:" for mandatory tenant isolation +When I call parseScopeKey with "tenant:t1:order:ord_123" +Then I receive parsed scope key with: +``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-007-parse-scope-key-with-composite-scope-id-containing-colons.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-007-parse-scope-key-with-composite-scope-id-containing-colons.sdp.md index 386ddf69..50b63d42 100644 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-007-parse-scope-key-with-composite-scope-id-containing-colons.sdp.md +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-007-parse-scope-key-with-composite-scope-id-containing-colons.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Parse scope key with composite scopeId containing colons" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature +- outcome: Executable scenario: Parse scope key with composite scopeId containing colons + +```gwt +Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" +And the tenant prefix is "tenant:" for mandatory tenant isolation +When I call parseScopeKey with "tenant:t1:reservation:res:2024:summer:001" +Then I receive parsed scope key with: +``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-008-parse-scope-key-returns-null-for-invalid-format.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-008-parse-scope-key-returns-null-for-invalid-format.sdp.md index 79d62d80..a96c2b0e 100644 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-008-parse-scope-key-returns-null-for-invalid-format.sdp.md +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-008-parse-scope-key-returns-null-for-invalid-format.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "parseScopeKey returns null for invalid format" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature +- outcome: Executable scenario: parseScopeKey returns null for invalid format + +```gwt +Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" +And the tenant prefix is "tenant:" for mandatory tenant isolation +When I call parseScopeKey with "value" +Then I receive null +``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-009-validate-scope-key-returns-null-for-valid-scope-key.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-009-validate-scope-key-returns-null-for-valid-scope-key.sdp.md index fb762159..a08ae905 100644 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-009-validate-scope-key-returns-null-for-valid-scope-key.sdp.md +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-009-validate-scope-key-returns-null-for-valid-scope-key.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "validateScopeKey returns null for valid scope key" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature +- outcome: Executable scenario: validateScopeKey returns null for valid scope key + +```gwt +Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" +And the tenant prefix is "tenant:" for mandatory tenant isolation +When I call validateScopeKey with "tenant:t1:reservation:res_123" +Then I receive null indicating valid +``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-010-validate-scope-key-returns-scope-key-empty-error-for-empty-string.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-010-validate-scope-key-returns-scope-key-empty-error-for-empty-string.sdp.md index 46056b3a..78283dfd 100644 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-010-validate-scope-key-returns-scope-key-empty-error-for-empty-string.sdp.md +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-010-validate-scope-key-returns-scope-key-empty-error-for-empty-string.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "validateScopeKey returns SCOPE_KEY_EMPTY error for empty string" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature +- outcome: Executable scenario: validateScopeKey returns SCOPE_KEY_EMPTY error for empty string + +```gwt +Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" +And the tenant prefix is "tenant:" for mandatory tenant isolation +When I call validateScopeKey with "" +Then I receive validation error with code "SCOPE_KEY_EMPTY" +And the error message contains "cannot be empty" +``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-011-validate-scope-key-returns-error-for-missing-tenant-prefix.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-011-validate-scope-key-returns-error-for-missing-tenant-prefix.sdp.md index 1b65a9c9..616f9fc9 100644 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-011-validate-scope-key-returns-error-for-missing-tenant-prefix.sdp.md +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-011-validate-scope-key-returns-error-for-missing-tenant-prefix.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "validateScopeKey returns error for missing tenant prefix" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature +- outcome: Executable scenario: validateScopeKey returns error for missing tenant prefix + +```gwt +Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" +And the tenant prefix is "tenant:" for mandatory tenant isolation +When I call validateScopeKey with "reservation:res_123" +Then I receive validation error with code "INVALID_SCOPE_KEY_FORMAT" +And the error message contains "tenant:" +``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-012-validate-scope-key-returns-error-for-malformed-scope-key.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-012-validate-scope-key-returns-error-for-malformed-scope-key.sdp.md index 7b9ab61a..6ef630f1 100644 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-012-validate-scope-key-returns-error-for-malformed-scope-key.sdp.md +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-012-validate-scope-key-returns-error-for-malformed-scope-key.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "validateScopeKey returns error for malformed scope key" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature +- outcome: Executable scenario: validateScopeKey returns error for malformed scope key + +```gwt +Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" +And the tenant prefix is "tenant:" for mandatory tenant isolation +When I call validateScopeKey with "tenant:t1:reservation" +Then I receive validation error with code "INVALID_SCOPE_KEY_FORMAT" +``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-013-is-valid-scope-key-type-guard.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-013-is-valid-scope-key-type-guard.sdp.md index b804306c..b62d759c 100644 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-013-is-valid-scope-key-type-guard.sdp.md +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-013-is-valid-scope-key-type-guard.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "isValidScopeKey type guard" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature +- outcome: Executable scenario: isValidScopeKey type guard + +```gwt +Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" +And the tenant prefix is "tenant:" for mandatory tenant isolation +When I call isValidScopeKey with "value" +Then I receive value +``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-014-assert-valid-scope-key-throws-on-invalid-input.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-014-assert-valid-scope-key-throws-on-invalid-input.sdp.md index a40dbc5b..59acb044 100644 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-014-assert-valid-scope-key-throws-on-invalid-input.sdp.md +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-014-assert-valid-scope-key-throws-on-invalid-input.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "assertValidScopeKey throws on invalid input" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature +- outcome: Executable scenario: assertValidScopeKey throws on invalid input + +```gwt +Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" +And the tenant prefix is "tenant:" for mandatory tenant isolation +When I call assertValidScopeKey with "invalid_scope" +Then an error is thrown with message containing "INVALID_SCOPE_KEY_FORMAT" +``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-015-assert-valid-scope-key-succeeds-on-valid-input.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-015-assert-valid-scope-key-succeeds-on-valid-input.sdp.md index b9c3a25e..7dd763d0 100644 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-015-assert-valid-scope-key-succeeds-on-valid-input.sdp.md +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-015-assert-valid-scope-key-succeeds-on-valid-input.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "assertValidScopeKey succeeds on valid input" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature +- outcome: Executable scenario: assertValidScopeKey succeeds on valid input + +```gwt +Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" +And the tenant prefix is "tenant:" for mandatory tenant isolation +When I call assertValidScopeKey with "tenant:t1:order:ord_1" +Then no error is thrown +``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-016-is-scope-tenant-checks-tenant-membership.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-016-is-scope-tenant-checks-tenant-membership.sdp.md index bd58cb07..c161edd9 100644 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-016-is-scope-tenant-checks-tenant-membership.sdp.md +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-016-is-scope-tenant-checks-tenant-membership.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "isScopeTenant checks tenant membership" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature +- outcome: Executable scenario: isScopeTenant checks tenant membership + +```gwt +Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" +And the tenant prefix is "tenant:" for mandatory tenant isolation +And a valid scope key "tenant:t1:order:ord_123" +When I call isScopeTenant with tenantId "value" +Then I receive value +``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-017-extract-tenant-id-returns-tenant-id-from-scope-key.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-017-extract-tenant-id-returns-tenant-id-from-scope-key.sdp.md index 8a0f1915..31fe9018 100644 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-017-extract-tenant-id-returns-tenant-id-from-scope-key.sdp.md +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-017-extract-tenant-id-returns-tenant-id-from-scope-key.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "extractTenantId returns tenant ID from scope key" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature +- outcome: Executable scenario: extractTenantId returns tenant ID from scope key + +```gwt +Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" +And the tenant prefix is "tenant:" for mandatory tenant isolation +And a valid scope key "tenant:tenant_abc:reservation:res_001" +When I call extractTenantId +Then I receive "tenant_abc" +``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-018-extract-scope-type-returns-scope-type-from-scope-key.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-018-extract-scope-type-returns-scope-type-from-scope-key.sdp.md index 4352b0a4..b42bfdbd 100644 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-018-extract-scope-type-returns-scope-type-from-scope-key.sdp.md +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-018-extract-scope-type-returns-scope-type-from-scope-key.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "extractScopeType returns scope type from scope key" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature +- outcome: Executable scenario: extractScopeType returns scope type from scope key + +```gwt +Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" +And the tenant prefix is "tenant:" for mandatory tenant isolation +And a valid scope key "tenant:t1:reservation:res_001" +When I call extractScopeType +Then I receive "reservation" +``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-019-extract-scope-id-returns-scope-id-from-scope-key.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-019-extract-scope-id-returns-scope-id-from-scope-key.sdp.md index f354da5b..dbd6031e 100644 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-019-extract-scope-id-returns-scope-id-from-scope-key.sdp.md +++ b/specs/behavior/platform-core/dcb/scope-key.examples/s-019-extract-scope-id-returns-scope-id-from-scope-key.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "extractScopeId returns scope ID from scope key" from packages/platform-core/tests/features/behavior/dcb/scope-key.feature +- outcome: Executable scenario: extractScopeId returns scope ID from scope key + +```gwt +Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" +And the tenant prefix is "tenant:" for mandatory tenant isolation +And a valid scope key "tenant:t1:order:ord:2024:001" +When I call extractScopeId +Then I receive "ord:2024:001" +``` diff --git a/specs/behavior/platform-core/dcb/scope-key.sdp.md b/specs/behavior/platform-core/dcb/scope-key.sdp.md index 70019448..21745cb0 100644 --- a/specs/behavior/platform-core/dcb/scope-key.sdp.md +++ b/specs/behavior/platform-core/dcb/scope-key.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: standardized scope key creation and parsing utilities so that I can ensure tenant isolation in DCB operations (test carrier: packages/platform-core/tests/features/behavior/dcb/scope-key.feature) +- actor: a platform developer +- outcome: standardized scope key creation and parsing utilities so that I can ensure tenant isolation in DCB operations diff --git a/specs/behavior/platform-core/decider/factory.examples/s-001-handler-calls-load-state-with-correct-entity-id.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-001-handler-calls-load-state-with-correct-entity-id.sdp.md index 2785d18d..dfc0da9f 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-001-handler-calls-load-state-with-correct-entity-id.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-001-handler-calls-load-state-with-correct-entity-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Handler calls loadState with correct entityId" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Handler calls loadState with correct entityId + +```gwt +Given a decider handler configured with a success decider +And loadState returns a CMS with id "test-1" and version 1 +When the handler processes a command with entityId "test-1" +Then loadState was called with entityId "test-1" +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-002-handler-calls-decider-with-state-command-input-and-context.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-002-handler-calls-decider-with-state-command-input-and-context.sdp.md index e2d5c084..a3d024c8 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-002-handler-calls-decider-with-state-command-input-and-context.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-002-handler-calls-decider-with-state-command-input-and-context.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Handler calls decider with state, command input, and context" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Handler calls decider with state, command input, and context + +```gwt +Given a decider handler configured with a mock decider +And loadState returns a CMS with id "test-1" and version 1 +When the handler processes a command with entityId "test-1" and newValue 101 +Then the mock decider was called with the CMS state +And the mock decider received command input with entityId "test-1" and newValue 101 +And the mock decider received context with commandId "cmd-1" and correlationId "corr-1" +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-003-handler-calls-apply-update-with-correct-parameters.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-003-handler-calls-apply-update-with-correct-parameters.sdp.md index 6ca69396..b406e537 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-003-handler-calls-apply-update-with-correct-parameters.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-003-handler-calls-apply-update-with-correct-parameters.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Handler calls applyUpdate with correct parameters" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Handler calls applyUpdate with correct parameters + +```gwt +Given a decider handler configured with a success decider +And loadState returns a CMS with id "test-1" and version 5 +When the handler processes a command with entityId "test-1" and newValue 200 +Then applyUpdate was called with docId "doc-1" and stateUpdate value 200 and version 6 +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-004-handler-returns-success-result-with-correct-structure.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-004-handler-returns-success-result-with-correct-structure.sdp.md index 25230903..deb4343f 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-004-handler-returns-success-result-with-correct-structure.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-004-handler-returns-success-result-with-correct-structure.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Handler returns success result with correct structure" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Handler returns success result with correct structure + +```gwt +Given a decider handler configured with a success decider +And loadState returns a CMS with id "test-1" and version 1 +When the handler processes a command with entityId "test-1" +Then the result status is "success" +And the result has all success fields: +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-005-handler-increments-version-correctly-from-existing-version.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-005-handler-increments-version-correctly-from-existing-version.sdp.md index 99f174e5..524862ee 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-005-handler-increments-version-correctly-from-existing-version.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-005-handler-increments-version-correctly-from-existing-version.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Handler increments version correctly from existing version" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Handler increments version correctly from existing version + +```gwt +Given a decider handler configured with a success decider +And loadState returns a CMS with id "test-1" and version 10 +When the handler processes a command with entityId "test-1" +Then the result status is "success" +And the result version is 11 +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-006-handler-returns-rejected-result-without-calling-apply-update.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-006-handler-returns-rejected-result-without-calling-apply-update.sdp.md index c03c5178..f4f4a057 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-006-handler-returns-rejected-result-without-calling-apply-update.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-006-handler-returns-rejected-result-without-calling-apply-update.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Handler returns rejected result without calling applyUpdate" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Handler returns rejected result without calling applyUpdate + +```gwt +Given a decider handler configured with a rejected decider +And loadState returns a CMS with id "test-1" and version 1 +When the handler processes a command with entityId "test-1" +Then the result status is "rejected" +And applyUpdate was not called +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-007-rejected-result-includes-rejection-details.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-007-rejected-result-includes-rejection-details.sdp.md index c9bed99a..d3a8a2ed 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-007-rejected-result-includes-rejection-details.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-007-rejected-result-includes-rejection-details.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Rejected result includes rejection details" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Rejected result includes rejection details + +```gwt +Given a decider handler configured with a rejected decider +And loadState returns a CMS with id "test-1" and version 1 +When the handler processes a command with entityId "test-1" +Then the rejected result has all details: +And the rejected result context has reason "test" +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-008-handler-returns-failed-result-without-calling-apply-update.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-008-handler-returns-failed-result-without-calling-apply-update.sdp.md index 9a78168f..992314ac 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-008-handler-returns-failed-result-without-calling-apply-update.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-008-handler-returns-failed-result-without-calling-apply-update.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Handler returns failed result without calling applyUpdate" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Handler returns failed result without calling applyUpdate + +```gwt +Given a decider handler configured with a failed decider +And loadState returns a CMS with id "test-1" and version 1 +When the handler processes a command with entityId "test-1" +Then the result status is "failed" +And applyUpdate was not called +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-009-failed-result-includes-failure-event-and-details.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-009-failed-result-includes-failure-event-and-details.sdp.md index 6a005d92..5b1f25ee 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-009-failed-result-includes-failure-event-and-details.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-009-failed-result-includes-failure-event-and-details.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Failed result includes failure event and details" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Failed result includes failure event and details + +```gwt +Given a decider handler configured with a failed decider +And loadState returns a CMS with id "test-1" and version 3 +When the handler processes a command with entityId "test-1" +Then the failed result has all details: +And the failed result context has additionalInfo "test" +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-010-handler-propagates-load-state-errors.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-010-handler-propagates-load-state-errors.sdp.md index fbbbfd01..a4bd19df 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-010-handler-propagates-load-state-errors.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-010-handler-propagates-load-state-errors.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Handler propagates loadState errors" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Handler propagates loadState errors + +```gwt +Given a decider handler configured with a success decider +And loadState rejects with error "Entity not found" +When the handler processes a command expecting an error +Then the error message is "Entity not found" +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-011-handler-uses-custom-error-handler-when-provided.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-011-handler-uses-custom-error-handler-when-provided.sdp.md index cbfc8e80..af1f1ad5 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-011-handler-uses-custom-error-handler-when-provided.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-011-handler-uses-custom-error-handler-when-provided.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Handler uses custom error handler when provided" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Handler uses custom error handler when provided + +```gwt +Given a decider handler configured with a success decider and a custom error handler returning rejection "NOT_FOUND" +And loadState rejects with error "Not found" +When the handler processes a command with entityId "test-1" +Then the custom error handler was called +And the result status is "rejected" +And the result rejection code is "NOT_FOUND" +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-012-handler-rethrows-when-custom-error-handler-returns-nothing.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-012-handler-rethrows-when-custom-error-handler-returns-nothing.sdp.md index cb0cb8b3..5614f8b8 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-012-handler-rethrows-when-custom-error-handler-returns-nothing.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-012-handler-rethrows-when-custom-error-handler-returns-nothing.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Handler rethrows when custom error handler returns nothing" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Handler rethrows when custom error handler returns nothing + +```gwt +Given a decider handler configured with a success decider and a custom error handler returning undefined +And loadState rejects with error "Unknown error" +When the handler processes a command expecting an error +Then the error message is "Unknown error" +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-013-handler-logs-debug-on-success.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-013-handler-logs-debug-on-success.sdp.md index ed7b39c8..7f31b112 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-013-handler-logs-debug-on-success.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-013-handler-logs-debug-on-success.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Handler logs debug on success" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Handler logs debug on success + +```gwt +Given a decider handler configured with a success decider and a logger +And loadState returns a CMS with id "test-1" and version 1 +When the handler processes a command with entityId "test-1" +Then the logger debug was called with messages: +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-014-handler-logs-debug-on-rejection.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-014-handler-logs-debug-on-rejection.sdp.md index 455b2acd..90c982e5 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-014-handler-logs-debug-on-rejection.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-014-handler-logs-debug-on-rejection.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Handler logs debug on rejection" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Handler logs debug on rejection + +```gwt +Given a decider handler configured with a rejected decider and a logger +And loadState returns a CMS with id "test-1" and version 1 +When the handler processes a command with entityId "test-1" +Then the logger debug was called with message "[TestHandler] Command rejected" with code "TEST_REJECTED" +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-015-handler-logs-error-on-exception.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-015-handler-logs-error-on-exception.sdp.md index f65da00b..b967b1e5 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-015-handler-logs-error-on-exception.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-015-handler-logs-error-on-exception.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Handler logs error on exception" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Handler logs error on exception + +```gwt +Given a decider handler configured with a success decider and a logger +And loadState rejects with error "Test error" +When the handler processes a command with entityId "test-1" ignoring error +Then the logger error was called with message "[TestHandler] Command error" with entityId "test-1" +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-016-handler-generates-unique-event-id-per-invocation.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-016-handler-generates-unique-event-id-per-invocation.sdp.md index 00753308..2c3958da 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-016-handler-generates-unique-event-id-per-invocation.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-016-handler-generates-unique-event-id-per-invocation.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Handler generates unique eventId per invocation" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Handler generates unique eventId per invocation + +```gwt +Given a decider handler configured with a success decider +And loadState returns a CMS with id "test-1" and version 1 +When the handler processes two commands +Then the two events have different eventIds +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-017-handler-includes-schema-version-in-event-metadata.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-017-handler-includes-schema-version-in-event-metadata.sdp.md index 5210cdfb..3fdb4545 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-017-handler-includes-schema-version-in-event-metadata.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-017-handler-includes-schema-version-in-event-metadata.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Handler includes schemaVersion in event metadata" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Handler includes schemaVersion in event metadata + +```gwt +Given a decider handler configured with a success decider and schemaVersion 3 +And loadState returns a CMS with id "test-1" and version 1 +When the handler processes a command with entityId "test-1" +Then the event metadata schemaVersion is 3 +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-018-handler-builds-correct-stream-id-from-entity-id.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-018-handler-builds-correct-stream-id-from-entity-id.sdp.md index 74c5486c..99e0b7f8 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-018-handler-builds-correct-stream-id-from-entity-id.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-018-handler-builds-correct-stream-id-from-entity-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Handler builds correct streamId from entityId" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Handler builds correct streamId from entityId + +```gwt +Given a decider handler configured with a success decider +And loadState returns a CMS with id "test-1" and version 1 +When the handler processes a command with entityId "my-entity-123" +Then the event streamId contains "my-entity-123" +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-019-entity-handler-calls-try-load-state-with-correct-entity-id.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-019-entity-handler-calls-try-load-state-with-correct-entity-id.sdp.md index f481a2c3..3ceccf4e 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-019-entity-handler-calls-try-load-state-with-correct-entity-id.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-019-entity-handler-calls-try-load-state-with-correct-entity-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Entity handler calls tryLoadState with correct entityId" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Entity handler calls tryLoadState with correct entityId + +```gwt +Given an entity decider handler configured for creation +And tryLoadState returns null +When the entity handler processes a command with entityId "test-1" +Then tryLoadState was called with entityId "test-1" +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-020-entity-handler-calls-decider-with-null-state-when-entity-does-not-exist.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-020-entity-handler-calls-decider-with-null-state-when-entity-does-not-exist.sdp.md index 4c6fbe2f..8cf10826 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-020-entity-handler-calls-decider-with-null-state-when-entity-does-not-exist.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-020-entity-handler-calls-decider-with-null-state-when-entity-does-not-exist.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Entity handler calls decider with null state when entity does not exist" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Entity handler calls decider with null state when entity does not exist + +```gwt +Given an entity decider handler configured with a mock decider +And tryLoadState returns null +When the entity handler processes a command with entityId "test-1" +Then the entity mock decider was called with null state +And the entity mock decider received command input with entityId "test-1" +And the entity mock decider received context with commandId "cmd-1" and correlationId "corr-1" +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-021-entity-handler-calls-insert-for-new-entities.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-021-entity-handler-calls-insert-for-new-entities.sdp.md index c5ab1fe1..96df830b 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-021-entity-handler-calls-insert-for-new-entities.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-021-entity-handler-calls-insert-for-new-entities.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Entity handler calls insert for new entities" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Entity handler calls insert for new entities + +```gwt +Given an entity decider handler configured for creation +And tryLoadState returns null +When the entity handler processes a command with entityId "test-1" and newValue 200 +Then insert was called with entityId "test-1" and stateUpdate value 200 and status "active" and version 1 +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-022-entity-handler-returns-success-with-version-1-for-new-entities.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-022-entity-handler-returns-success-with-version-1-for-new-entities.sdp.md index d1a8f257..cfe0758c 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-022-entity-handler-returns-success-with-version-1-for-new-entities.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-022-entity-handler-returns-success-with-version-1-for-new-entities.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Entity handler returns success with version 1 for new entities" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Entity handler returns success with version 1 for new entities + +```gwt +Given an entity decider handler configured for creation +And tryLoadState returns null +When the entity handler processes a command with entityId "test-1" +Then the result status is "success" +And the entity result has all success fields: +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-023-entity-handler-generates-correct-event-metadata-for-new-entities.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-023-entity-handler-generates-correct-event-metadata-for-new-entities.sdp.md index ad158ded..ea6ae4f2 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-023-entity-handler-generates-correct-event-metadata-for-new-entities.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-023-entity-handler-generates-correct-event-metadata-for-new-entities.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Entity handler generates correct event metadata for new entities" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Entity handler generates correct event metadata for new entities + +```gwt +Given an entity decider handler configured for creation +And tryLoadState returns null +When the entity handler processes a command with entityId "test-1" +Then the entity event has correct metadata: +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-024-entity-handler-calls-decider-with-existing-state-when-entity-exists.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-024-entity-handler-calls-decider-with-existing-state-when-entity-exists.sdp.md index 0e79e2cc..661ef674 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-024-entity-handler-calls-decider-with-existing-state-when-entity-exists.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-024-entity-handler-calls-decider-with-existing-state-when-entity-exists.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Entity handler calls decider with existing state when entity exists" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Entity handler calls decider with existing state when entity exists + +```gwt +Given an entity decider handler configured with an existence-checking mock decider +And tryLoadState returns an existing CMS with id "test-1" +When the entity handler processes a command with entityId "test-1" +Then the existence mock decider was called with the existing CMS state +And the existence mock decider received command input with entityId "test-1" +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-025-entity-handler-returns-rejection-when-entity-already-exists.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-025-entity-handler-returns-rejection-when-entity-already-exists.sdp.md index 3b936dcf..688230f4 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-025-entity-handler-returns-rejection-when-entity-already-exists.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-025-entity-handler-returns-rejection-when-entity-already-exists.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Entity handler returns rejection when entity already exists" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Entity handler returns rejection when entity already exists + +```gwt +Given an entity decider handler configured for creation +And tryLoadState returns an existing CMS with id "test-1" +When the entity handler processes a command with entityId "test-1" +Then the result status is "rejected" +And the result rejection code is "ENTITY_ALREADY_EXISTS" +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-026-entity-handler-does-not-call-insert-when-entity-already-exists.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-026-entity-handler-does-not-call-insert-when-entity-already-exists.sdp.md index 363ad80b..fdbb330b 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-026-entity-handler-does-not-call-insert-when-entity-already-exists.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-026-entity-handler-does-not-call-insert-when-entity-already-exists.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Entity handler does not call insert when entity already exists" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Entity handler does not call insert when entity already exists + +```gwt +Given an entity decider handler configured for creation +And tryLoadState returns an existing CMS with id "test-1" +When the entity handler processes a command with entityId "test-1" +Then insert was not called +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-027-entity-handler-returns-failed-result-with-version-0-for-non-existent-entit.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-027-entity-handler-returns-failed-result-with-version-0-for-non-existent-entit.sdp.md index 7f80e46e..7fbe10c3 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-027-entity-handler-returns-failed-result-with-version-0-for-non-existent-entit.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-027-entity-handler-returns-failed-result-with-version-0-for-non-existent-entit.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Entity handler returns failed result with version 0 for non-existent entity" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Entity handler returns failed result with version 0 for non-existent entity + +```gwt +Given an entity decider handler configured with a failed entity decider +And tryLoadState returns null +When the entity handler processes a command with entityId "test-1" +Then the result status is "failed" +And the entity failed result has expectedVersion 0 +And the entity failed result event type is "TestFailed" +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-028-entity-handler-does-not-call-insert-on-business-failure.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-028-entity-handler-does-not-call-insert-on-business-failure.sdp.md index 68bdf37b..94587cdd 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-028-entity-handler-does-not-call-insert-on-business-failure.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-028-entity-handler-does-not-call-insert-on-business-failure.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Entity handler does not call insert on business failure" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Entity handler does not call insert on business failure + +```gwt +Given an entity decider handler configured with a failed entity decider +And tryLoadState returns null +When the entity handler processes a command with entityId "test-1" +Then insert was not called +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-029-entity-handler-propagates-try-load-state-errors.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-029-entity-handler-propagates-try-load-state-errors.sdp.md index d16d3813..f37c3569 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-029-entity-handler-propagates-try-load-state-errors.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-029-entity-handler-propagates-try-load-state-errors.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Entity handler propagates tryLoadState errors" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Entity handler propagates tryLoadState errors + +```gwt +Given an entity decider handler configured for creation +And tryLoadState rejects with error "Database error" +When the entity handler processes a command expecting an error +Then the error message is "Database error" +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-030-entity-handler-propagates-insert-errors.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-030-entity-handler-propagates-insert-errors.sdp.md index d13f490e..66558255 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-030-entity-handler-propagates-insert-errors.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-030-entity-handler-propagates-insert-errors.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Entity handler propagates insert errors" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Entity handler propagates insert errors + +```gwt +Given an entity decider handler configured for creation +And tryLoadState returns null +And insert rejects with error "Insert constraint violation" +When the entity handler processes a command expecting an error +Then the error message is "Insert constraint violation" +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-031-entity-handler-uses-custom-error-handler-when-provided.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-031-entity-handler-uses-custom-error-handler-when-provided.sdp.md index 34a29d09..d88f1177 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-031-entity-handler-uses-custom-error-handler-when-provided.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-031-entity-handler-uses-custom-error-handler-when-provided.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Entity handler uses custom error handler when provided" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Entity handler uses custom error handler when provided + +```gwt +Given an entity decider handler configured for creation with a custom error handler returning rejection "CONSTRAINT_ERROR" +And tryLoadState rejects with error "Constraint violation" +When the entity handler processes a command with entityId "test-1" +Then the custom error handler was called +And the result status is "rejected" +And the result rejection code is "CONSTRAINT_ERROR" +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-032-entity-handler-logs-debug-on-entity-creation-success.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-032-entity-handler-logs-debug-on-entity-creation-success.sdp.md index 696ae695..aad511b8 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-032-entity-handler-logs-debug-on-entity-creation-success.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-032-entity-handler-logs-debug-on-entity-creation-success.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Entity handler logs debug on entity creation success" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Entity handler logs debug on entity creation success + +```gwt +Given an entity decider handler configured for creation with a logger +And tryLoadState returns null +When the entity handler processes a command with entityId "test-1" +Then the entity logger debug was called with messages: +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-033-entity-handler-logs-debug-on-rejection.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-033-entity-handler-logs-debug-on-rejection.sdp.md index 9436821e..e2bcebfc 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-033-entity-handler-logs-debug-on-rejection.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-033-entity-handler-logs-debug-on-rejection.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Entity handler logs debug on rejection" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Entity handler logs debug on rejection + +```gwt +Given an entity decider handler configured for creation with a logger +And tryLoadState returns an existing CMS with id "test-1" +When the entity handler processes a command with entityId "test-1" +Then the entity logger debug was called with message "[CreateEntity] Command rejected" with code "ENTITY_ALREADY_EXISTS" +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-034-entity-handler-generates-unique-event-id-for-each-creation.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-034-entity-handler-generates-unique-event-id-for-each-creation.sdp.md index 28017248..7a89967f 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-034-entity-handler-generates-unique-event-id-for-each-creation.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-034-entity-handler-generates-unique-event-id-for-each-creation.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Entity handler generates unique eventId for each creation" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Entity handler generates unique eventId for each creation + +```gwt +Given an entity decider handler configured for creation +And tryLoadState returns null +When the entity handler processes two creation commands with different entityIds +Then the two entity events have different eventIds +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-035-entity-handler-includes-schema-version-in-metadata.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-035-entity-handler-includes-schema-version-in-metadata.sdp.md index df999756..32c85955 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-035-entity-handler-includes-schema-version-in-metadata.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-035-entity-handler-includes-schema-version-in-metadata.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Entity handler includes schemaVersion in metadata" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Entity handler includes schemaVersion in metadata + +```gwt +Given an entity decider handler configured for creation with schemaVersion 5 +And tryLoadState returns null +When the entity handler processes a command with entityId "test-1" +Then the entity event metadata schemaVersion is 5 +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-036-pre-validate-rejection-short-circuits-handler.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-036-pre-validate-rejection-short-circuits-handler.sdp.md index 0b037e9f..28fae49a 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-036-pre-validate-rejection-short-circuits-handler.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-036-pre-validate-rejection-short-circuits-handler.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "PreValidate rejection short-circuits handler" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: PreValidate rejection short-circuits handler + +```gwt +Given an entity decider handler configured with preValidate returning rejection "SKU_ALREADY_EXISTS" +When the entity handler processes a command with entityId "test-1" +Then the result status is "rejected" +And the result rejection code is "SKU_ALREADY_EXISTS" +And tryLoadState was not called +And the entity mock decider was not called +And insert was not called +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-037-pre-validate-returning-undefined-allows-normal-flow.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-037-pre-validate-returning-undefined-allows-normal-flow.sdp.md index a0d296d9..78011be1 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-037-pre-validate-returning-undefined-allows-normal-flow.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-037-pre-validate-returning-undefined-allows-normal-flow.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "PreValidate returning undefined allows normal flow" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: PreValidate returning undefined allows normal flow + +```gwt +Given an entity decider handler configured with preValidate returning undefined +And tryLoadState returns null +When the entity handler processes a command with entityId "test-1" +Then preValidate was called with entityId "test-1" +And tryLoadState was called +And insert was called +And the result status is "success" +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-038-pre-validate-receives-correct-arguments.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-038-pre-validate-receives-correct-arguments.sdp.md index 1c7d5c00..90088604 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-038-pre-validate-receives-correct-arguments.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-038-pre-validate-receives-correct-arguments.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "PreValidate receives correct arguments" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: PreValidate receives correct arguments + +```gwt +Given an entity decider handler configured with preValidate returning undefined +And tryLoadState returns null +When the entity handler processes a command with entityId "my-product" and newValue 500 +Then preValidate was called with entityId "my-product" and newValue 500 +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-039-pre-validate-failure-is-logged.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-039-pre-validate-failure-is-logged.sdp.md index 7e8576b8..613a7485 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-039-pre-validate-failure-is-logged.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-039-pre-validate-failure-is-logged.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "PreValidate failure is logged" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: PreValidate failure is logged + +```gwt +Given an entity decider handler configured with preValidate returning rejection "VALIDATION_FAILED" and a logger +When the entity handler processes a command with entityId "test-1" +Then the entity logger debug was called with messages: +``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-040-handler-works-normally-without-pre-validate-configured.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-040-handler-works-normally-without-pre-validate-configured.sdp.md index 519d22ea..150d2960 100644 --- a/specs/behavior/platform-core/decider/factory.examples/s-040-handler-works-normally-without-pre-validate-configured.sdp.md +++ b/specs/behavior/platform-core/decider/factory.examples/s-040-handler-works-normally-without-pre-validate-configured.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Handler works normally without preValidate configured" from packages/platform-core/tests/features/behavior/decider/factory.feature +- outcome: Executable scenario: Handler works normally without preValidate configured + +```gwt +Given an entity decider handler configured for creation without preValidate +And tryLoadState returns null +When the entity handler processes a command with entityId "test-1" +Then tryLoadState was called +And the result status is "success" +``` diff --git a/specs/behavior/platform-core/decider/factory.sdp.md b/specs/behavior/platform-core/decider/factory.sdp.md index c4fe5bfe..8b5ac80a 100644 --- a/specs/behavior/platform-core/decider/factory.sdp.md +++ b/specs/behavior/platform-core/decider/factory.sdp.md @@ -10,4 +10,20 @@ relations: ## Intent -- outcome: Factory functions that wrap pure decider functions with infrastructure concerns (load, persist, event building): - createDeciderHandler: For existing entity updates - createEntityDeciderHandler: For entity creation (null state support) (test carrier: packages/platform-core/tests/features/behavior/decider/factory.feature) +- outcome: Decider Handler Factory + +## Behavior + +- rule: createDeciderHandler success path loads state, calls decider, applies update, and returns success +- rule: createDeciderHandler rejected path returns rejection without applying update +- rule: createDeciderHandler failed path returns failure with event without applying update +- rule: createDeciderHandler error handling propagates or delegates errors +- rule: createDeciderHandler logging emits debug and error messages +- rule: createDeciderHandler event metadata generates unique IDs and correct fields +- rule: createEntityDeciderHandler entity creation calls tryLoadState and insert for new entities +- rule: createEntityDeciderHandler entity already exists returns rejection +- rule: createEntityDeciderHandler failed path returns failure without insert +- rule: createEntityDeciderHandler error handling propagates or delegates errors +- rule: createEntityDeciderHandler logging emits debug messages +- rule: createEntityDeciderHandler event metadata for entity creation +- rule: createEntityDeciderHandler preValidate hook short-circuits before loading state diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-001-dcb-succeeds-on-first-attempt.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-001-dcb-succeeds-on-first-attempt.sdp.md index 30c152f9..0dd7c9ae 100644 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-001-dcb-succeeds-on-first-attempt.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-001-dcb-succeeds-on-first-attempt.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "DCB succeeds on first attempt" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature +- outcome: Executable scenario: DCB succeeds on first attempt + +```gwt +Given DCB retry helper is configured +And a DCB operation with expectedVersion 5 +And currentVersion is 5 - no conflict +When withDCBRetry is called +Then executeWithDCB should be called once +And the success result should be returned unchanged +And no retry should be scheduled +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-002-rejected-result-passes-through-unchanged.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-002-rejected-result-passes-through-unchanged.sdp.md index 6f3282b6..f3b48316 100644 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-002-rejected-result-passes-through-unchanged.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-002-rejected-result-passes-through-unchanged.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Rejected result passes through unchanged" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature +- outcome: Executable scenario: Rejected result passes through unchanged + +```gwt +Given DCB retry helper is configured +And a DCB operation that will be rejected by decider +When withDCBRetry is called +Then the rejected result should be returned unchanged +And no retry should be scheduled +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-003-conflict-triggers-retry-with-updated-version.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-003-conflict-triggers-retry-with-updated-version.sdp.md index 8bf9b8d2..d9071ce1 100644 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-003-conflict-triggers-retry-with-updated-version.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-003-conflict-triggers-retry-with-updated-version.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Conflict triggers retry with updated version" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature +- outcome: Executable scenario: Conflict triggers retry with updated version + +```gwt +Given DCB retry helper is configured +And a DCB operation with expectedVersion 5 +And currentVersion is 6 - conflict detected +When withDCBRetry is called with attempt 0 +Then a retry mutation should be enqueued to Workpool +And the retry should use expectedVersion 6 +And the result should have status "deferred" +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md index a8bae923..ab97fc56 100644 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Max retries exceeded returns rejected" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature +- outcome: Executable scenario: Max retries exceeded returns rejected + +```gwt +Given DCB retry helper is configured +And a DCB operation that conflicts +And attempt is 5 - equal to maxAttempts +When withDCBRetry is called +Then the result should have status "rejected" +And the code should be "DCB_MAX_RETRIES_EXCEEDED" +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-005-scope-aware-scheduling-key-is-preserved.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-005-scope-aware-scheduling-key-is-preserved.sdp.md index 94a289cf..b0b3be30 100644 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-005-scope-aware-scheduling-key-is-preserved.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-005-scope-aware-scheduling-key-is-preserved.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Scope-aware scheduling key is preserved" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature +- outcome: Executable scenario: Scope-aware scheduling key is preserved + +```gwt +Given DCB retry helper is configured +And scope key "tenant:t1:reservation:r1" +When conflict triggers retry +Then partition key should be "dcb:tenant:t1:reservation:r1" +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-006-successful-retry-calls-on-complete-with-result.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-006-successful-retry-calls-on-complete-with-result.sdp.md index f04cc330..804d8df4 100644 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-006-successful-retry-calls-on-complete-with-result.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-006-successful-retry-calls-on-complete-with-result.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Successful retry calls onComplete with result" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature +- outcome: Executable scenario: Successful retry calls onComplete with result + +```gwt +Given DCB retry helper is configured +And a DCB operation with onComplete callback configured +And the operation conflicts then succeeds on retry +When the retry mutation completes successfully +Then onComplete should be called with success result +And the context object should be passed through +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-007-version-advances-during-retry-delay.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-007-version-advances-during-retry-delay.sdp.md index bd636150..a8614526 100644 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-007-version-advances-during-retry-delay.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-007-version-advances-during-retry-delay.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Version advances during retry delay" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature +- outcome: Executable scenario: Version advances during retry delay + +```gwt +Given DCB retry helper is configured +And call A schedules retry with expectedVersion 6 at t=0 +And call B advances version to 7 at t=100ms +When call A's retry executes at t=250ms with expectedVersion 6 +Then it should detect conflict with currentVersion 7 +And it should schedule another retry with expectedVersion 7 +And attempt counter should be 2 +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-008-backoff-increases-exponentially.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-008-backoff-increases-exponentially.sdp.md index 18d91ff2..10ca7318 100644 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-008-backoff-increases-exponentially.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-008-backoff-increases-exponentially.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Backoff increases exponentially" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature +- outcome: Executable scenario: Backoff increases exponentially + +```gwt +Given DCB retry helper is configured +And backoff config with initialMs 100 and base 2 +When calculating backoff for attempt value +Then base delay should be valuems +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-009-backoff-is-capped-at-maximum.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-009-backoff-is-capped-at-maximum.sdp.md index ede1b20b..dd8c7531 100644 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-009-backoff-is-capped-at-maximum.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-009-backoff-is-capped-at-maximum.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Backoff is capped at maximum" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature +- outcome: Executable scenario: Backoff is capped at maximum + +```gwt +Given DCB retry helper is configured +And backoff config with maxMs 30000 +When calculating backoff for attempt 10 +Then total delay should not exceed 30000ms +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-010-jitter-adds-randomness-to-prevent-thundering-herd.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-010-jitter-adds-randomness-to-prevent-thundering-herd.sdp.md index da44c689..2614f9cf 100644 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-010-jitter-adds-randomness-to-prevent-thundering-herd.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-010-jitter-adds-randomness-to-prevent-thundering-herd.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Jitter adds randomness to prevent thundering herd" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature +- outcome: Executable scenario: Jitter adds randomness to prevent thundering herd + +```gwt +Given DCB retry helper is configured +And backoff config with initialMs 100 +When calculating backoff for attempt 0 multiple times +Then results should vary within 50-150% multiplicative jitter range +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-011-jitter-function-is-injectable-for-deterministic-tests.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-011-jitter-function-is-injectable-for-deterministic-tests.sdp.md index aff814e2..ad62243b 100644 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-011-jitter-function-is-injectable-for-deterministic-tests.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-011-jitter-function-is-injectable-for-deterministic-tests.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Jitter function is injectable for deterministic tests" from packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature +- outcome: Executable scenario: Jitter function is injectable for deterministic tests + +```gwt +Given DCB retry helper is configured +And a backoff calculator with custom jitter function returning 1.0 +When calculating backoff for attempt 0 with initialMs 100 +Then result should be exactly 100ms - no random variation +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.sdp.md index 4adf9a7a..5b4bb6d8 100644 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: DCB OCC conflicts to be automatically retried so that I don't need to implement manual retry logic everywhere (test carrier: packages/platform-core/tests/features/behavior/durable-function-adapters/dcb-conflict-retry.feature) +- actor: a platform developer +- outcome: DCB OCC conflicts to be automatically retried so that I don't need to implement manual retry logic everywhere + +## Behavior + +- rule: DCB operations succeed without retry when no conflict +- rule: OCC conflicts trigger automatic retry scheduling via Workpool +- rule: Backoff uses exponential increase with jitter diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-001-adapter-plugs-into-existing-middleware.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-001-adapter-plugs-into-existing-middleware.sdp.md index bd0d761a..f8a1dad3 100644 --- a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-001-adapter-plugs-into-existing-middleware.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-001-adapter-plugs-into-existing-middleware.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Adapter plugs into existing middleware" from packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature +- outcome: Executable scenario: Adapter plugs into existing middleware + +```gwt +Given platform infrastructure is configured for integration tests +And rate limit middleware at order 50 +And ConvexRateLimitAdapter is configured +When a command is dispatched +Then rate limit should be checked via the adapter +And middleware order should be preserved +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-002-rate-limited-command-returns-standard-rejection.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-002-rate-limited-command-returns-standard-rejection.sdp.md index 1f37a031..b7cd2a29 100644 --- a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-002-rate-limited-command-returns-standard-rejection.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-002-rate-limited-command-returns-standard-rejection.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Rate limited command returns standard rejection" from packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature +- outcome: Executable scenario: Rate limited command returns standard rejection + +```gwt +Given platform infrastructure is configured for integration tests +And rate limit is exhausted for current user +When a command is dispatched +Then the result should have status "rejected" +And the code should be "RATE_LIMITED" +And context should include retryAfterMs +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-003-dcb-retry-uses-separate-workpool.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-003-dcb-retry-uses-separate-workpool.sdp.md index c2e5af34..8999c782 100644 --- a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-003-dcb-retry-uses-separate-workpool.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-003-dcb-retry-uses-separate-workpool.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "DCB retry uses separate Workpool" from packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature +- outcome: Executable scenario: DCB retry uses separate Workpool + +```gwt +Given platform infrastructure is configured for integration tests +And dcbRetryPool is configured with maxParallelism 10 +And projectionPool is configured separately +When a DCB conflict triggers retry +Then retry should be enqueued to dcbRetryPool +And projectionPool should not be affected +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-004-retry-mutation-receives-correct-arguments.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-004-retry-mutation-receives-correct-arguments.sdp.md index 06cbcb14..b7062796 100644 --- a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-004-retry-mutation-receives-correct-arguments.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-004-retry-mutation-receives-correct-arguments.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Retry mutation receives correct arguments" from packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature +- outcome: Executable scenario: Retry mutation receives correct arguments + +```gwt +Given platform infrastructure is configured for integration tests +And a DCB operation with scope "tenant:t1:res:r1" +When conflict triggers retry +Then retry mutation should receive updated expectedVersion +And retry mutation should receive incremented attempt +And retry mutation should receive original DCB config +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-005-dcb-retry-with-on-complete-callback-integration.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-005-dcb-retry-with-on-complete-callback-integration.sdp.md index 91432e61..a43580b2 100644 --- a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-005-dcb-retry-with-on-complete-callback-integration.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-005-dcb-retry-with-on-complete-callback-integration.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "DCB retry with onComplete callback integration" from packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature +- outcome: Executable scenario: DCB retry with onComplete callback integration + +```gwt +Given platform infrastructure is configured for integration tests +And dcbRetryPool supports onComplete callbacks +And a DCB operation with onComplete configured +When conflict triggers retry that eventually succeeds +Then onComplete mutation should receive the success result +And parallel DCB operations should each track independently +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-006-workpool-does-not-retry-dcb-mutations-clarification.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-006-workpool-does-not-retry-dcb-mutations-clarification.sdp.md index 32447441..0e633dce 100644 --- a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-006-workpool-does-not-retry-dcb-mutations-clarification.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-006-workpool-does-not-retry-dcb-mutations-clarification.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Workpool does not retry DCB mutations - clarification" from packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature +- outcome: Executable scenario: Workpool does not retry DCB mutations - clarification + +```gwt +Given platform infrastructure is configured for integration tests +And dcbRetryPool has maxAttempts 1 at Workpool level +And withDCBRetry has maxAttempts 5 at DCB level +When a DCB mutation throws an exception - not OCC conflict +Then Workpool should NOT retry as exception is final failure +And onComplete should receive failed result +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-007-rate-limiter-component-creates-tables.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-007-rate-limiter-component-creates-tables.sdp.md index 446ddfe2..48643c7f 100644 --- a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-007-rate-limiter-component-creates-tables.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-007-rate-limiter-component-creates-tables.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Rate limiter component creates tables" from packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature +- outcome: Executable scenario: Rate limiter component creates tables + +```gwt +Given platform infrastructure is configured for integration tests +And convex.config.ts includes rate limiter component +When deployment runs +Then rate limiter internal tables should exist +And rate limiter API should be accessible +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-008-multiple-workpools-can-coexist.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-008-multiple-workpools-can-coexist.sdp.md index 7748c5b5..90cb4bd9 100644 --- a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-008-multiple-workpools-can-coexist.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-008-multiple-workpools-can-coexist.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Multiple Workpools can coexist" from packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature +- outcome: Executable scenario: Multiple Workpools can coexist + +```gwt +Given platform infrastructure is configured for integration tests +And convex.config.ts includes projectionPool +And convex.config.ts includes dcbRetryPool +When deployment runs +Then both Workpools should have independent state +And both should be addressable by name +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.sdp.md index eddeeb6c..7792b0a3 100644 --- a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: adapters to integrate seamlessly with existing infrastructure so that I can adopt production patterns without refactoring (test carrier: packages/platform-core/tests/features/behavior/durable-function-adapters/integration-patterns.feature) +- actor: a platform developer +- outcome: adapters to integrate seamlessly with existing infrastructure so that I can adopt production patterns without refactoring + +## Behavior + +- rule: Rate limit adapter integrates with middleware pipeline +- rule: DCB retry integrates with Workpool infrastructure +- rule: Convex components mount correctly diff --git a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-001-adapter-allows-request-within-rate-limit.sdp.md b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-001-adapter-allows-request-within-rate-limit.sdp.md index 823aa4ab..d34581d2 100644 --- a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-001-adapter-allows-request-within-rate-limit.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-001-adapter-allows-request-within-rate-limit.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Adapter allows request within rate limit" from packages/platform-core/tests/features/behavior/durable-function-adapters/rate-limit-adapter.feature +- outcome: Executable scenario: Adapter allows request within rate limit + +```gwt +Given rate limit "testLimit" is configured with 10 requests per minute +And 5 requests have been made for key "user:alice" +When checking rate limit for key "user:alice" +Then the result should have allowed = true +And retryAfterMs should be undefined +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-002-adapter-rejects-request-exceeding-rate-limit.sdp.md b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-002-adapter-rejects-request-exceeding-rate-limit.sdp.md index ea200a9f..69186302 100644 --- a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-002-adapter-rejects-request-exceeding-rate-limit.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-002-adapter-rejects-request-exceeding-rate-limit.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Adapter rejects request exceeding rate limit" from packages/platform-core/tests/features/behavior/durable-function-adapters/rate-limit-adapter.feature +- outcome: Executable scenario: Adapter rejects request exceeding rate limit + +```gwt +Given rate limit "testLimit" is configured with 10 requests per minute +And 10 requests have been made for key "user:alice" +When checking rate limit for key "user:alice" +Then the result should have allowed = false +And retryAfterMs should be greater than 0 +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-003-different-keys-have-independent-limits.sdp.md b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-003-different-keys-have-independent-limits.sdp.md index 8829a9a4..946a0e1d 100644 --- a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-003-different-keys-have-independent-limits.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-003-different-keys-have-independent-limits.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Different keys have independent limits" from packages/platform-core/tests/features/behavior/durable-function-adapters/rate-limit-adapter.feature +- outcome: Executable scenario: Different keys have independent limits + +```gwt +Given rate limit "testLimit" is configured with 10 requests per minute +And user "alice" has exhausted her rate limit +When checking rate limit for key "user:bob" +Then the result should have allowed = true +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md index 15353f58..39e13363 100644 --- a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Same user different command types have independent limits" from packages/platform-core/tests/features/behavior/durable-function-adapters/rate-limit-adapter.feature +- outcome: Executable scenario: Same user different command types have independent limits + +```gwt +Given rate limit "testLimit" is configured with 10 requests per minute +And user "alice" has exhausted limit for "commandA" +When checking rate limit for "user:alice:commandB" +Then the result should have allowed = true +``` diff --git a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.sdp.md b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.sdp.md index 34bb9bc7..96738ad1 100644 --- a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: the middleware rate limiter to use @convex-dev/rate-limiter so that rate limiting is production-grade with persistence and sharding (test carrier: packages/platform-core/tests/features/behavior/durable-function-adapters/rate-limit-adapter.feature) +- actor: a platform developer +- outcome: the middleware rate limiter to use @convex-dev/rate-limiter so that rate limiting is production-grade with persistence and sharding + +## Behavior + +- rule: Adapter implements RateLimitChecker interface +- rule: Rate limits are isolated by key diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-001-create-basic-fat-event.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-001-create-basic-fat-event.sdp.md index 06a8a1b2..5933260f 100644 --- a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-001-create-basic-fat-event.sdp.md +++ b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-001-create-basic-fat-event.sdp.md @@ -10,4 +10,18 @@ relations: ## Intent -- outcome: Executable scenario "Create basic fat event" from packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature +- outcome: Executable scenario: Create basic fat event + +```gwt +Given the ECST module is imported from platform-core +And a sample customer entity exists +And sample order items exist +And event type "OrderSubmitted" +And payload with orderId and totalAmount +When I call createFatEvent(type, payload) +Then I receive a FatEvent object +And event.type equals "OrderSubmitted" +And event.payload contains the provided data +And event.metadata.timestamp is set +And event.metadata.schemaVersion is set +``` diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-002-create-fat-event-with-schema-definition.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-002-create-fat-event-with-schema-definition.sdp.md index e817795d..5d93f0b2 100644 --- a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-002-create-fat-event-with-schema-definition.sdp.md +++ b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-002-create-fat-event-with-schema-definition.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Create fat event with schema definition" from packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature +- outcome: Executable scenario: Create fat event with schema definition + +```gwt +Given the ECST module is imported from platform-core +And a sample customer entity exists +And sample order items exist +And event type "OrderSubmitted" +And a schema with version "2.0.0" +When I call createFatEvent(type, payload, { schema }) +Then event.metadata.schemaVersion equals "2.0.0" +``` diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-003-schema-validation-failure.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-003-schema-validation-failure.sdp.md index f3bffb6b..44c11704 100644 --- a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-003-schema-validation-failure.sdp.md +++ b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-003-schema-validation-failure.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Schema validation failure" from packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature +- outcome: Executable scenario: Schema validation failure + +```gwt +Given the ECST module is imported from platform-core +And a sample customer entity exists +And sample order items exist +And event type "OrderSubmitted" +And an invalid payload missing required fields +And a schema with validation rules +When I call createFatEvent(type, payload, { schema }) +Then an error is thrown with message "Schema validation failed" +``` diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-004-create-fat-event-with-correlation-id.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-004-create-fat-event-with-correlation-id.sdp.md index 0f298e04..394b0480 100644 --- a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-004-create-fat-event-with-correlation-id.sdp.md +++ b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-004-create-fat-event-with-correlation-id.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Create fat event with correlation ID" from packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature +- outcome: Executable scenario: Create fat event with correlation ID + +```gwt +Given the ECST module is imported from platform-core +And a sample customer entity exists +And sample order items exist +And event type "OrderSubmitted" +And payload with orderId and totalAmount +And a correlationId "corr_abc123" +When I call createFatEvent(type, payload, { correlationId }) +Then event.metadata.correlationId equals "corr_abc123" +``` diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-005-embed-selected-entity-fields.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-005-embed-selected-entity-fields.sdp.md index d1c08352..c48da682 100644 --- a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-005-embed-selected-entity-fields.sdp.md +++ b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-005-embed-selected-entity-fields.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Embed selected entity fields" from packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature +- outcome: Executable scenario: Embed selected entity fields + +```gwt +Given the ECST module is imported from platform-core +And a sample customer entity exists +And sample order items exist +And a customer entity with id, name, email, internalNotes +When I call embedEntity(customer, ['id', 'name', 'email']) +Then the result contains id, name, email +And the result does NOT contain internalNotes +``` diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-006-embed-all-fields.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-006-embed-all-fields.sdp.md index 100a4199..e7b0c529 100644 --- a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-006-embed-all-fields.sdp.md +++ b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-006-embed-all-fields.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Embed all fields" from packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature +- outcome: Executable scenario: Embed all fields + +```gwt +Given the ECST module is imported from platform-core +And a sample customer entity exists +And sample order items exist +And a customer entity with id, name, email +When I call embedEntity(customer) without field list +Then the result contains all entity fields +``` diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-007-embed-non-existent-field.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-007-embed-non-existent-field.sdp.md index 2703e148..6b6bc724 100644 --- a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-007-embed-non-existent-field.sdp.md +++ b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-007-embed-non-existent-field.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Embed non-existent field" from packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature +- outcome: Executable scenario: Embed non-existent field + +```gwt +Given the ECST module is imported from platform-core +And a sample customer entity exists +And sample order items exist +And a customer entity without address field +When I call embedEntity(customer, ['id', 'address']) +Then an error is thrown with message "Field 'address' not found" +``` diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-008-embed-collection-of-items.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-008-embed-collection-of-items.sdp.md index bc18843a..3294e6d8 100644 --- a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-008-embed-collection-of-items.sdp.md +++ b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-008-embed-collection-of-items.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Embed collection of items" from packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature +- outcome: Executable scenario: Embed collection of items + +```gwt +Given the ECST module is imported from platform-core +And a sample customer entity exists +And sample order items exist +And 3 order items with productId, name, quantity +When I call embedCollection(items) +Then the result is an array of 3 items +And each item contains productId, name, quantity +``` diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-009-embed-collection-with-field-selection.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-009-embed-collection-with-field-selection.sdp.md index 9a4361fd..455b1ddc 100644 --- a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-009-embed-collection-with-field-selection.sdp.md +++ b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-009-embed-collection-with-field-selection.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Embed collection with field selection" from packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature +- outcome: Executable scenario: Embed collection with field selection + +```gwt +Given the ECST module is imported from platform-core +And a sample customer entity exists +And sample order items exist +And 3 order items with productId, name, quantity, internalSku +When I call embedCollection(items, ['productId', 'name', 'quantity']) +Then each item contains productId, name, quantity +And no item contains internalSku +``` diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-010-embed-empty-collection.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-010-embed-empty-collection.sdp.md index bb5ecdfe..5a27894c 100644 --- a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-010-embed-empty-collection.sdp.md +++ b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-010-embed-empty-collection.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Embed empty collection" from packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature +- outcome: Executable scenario: Embed empty collection + +```gwt +Given the ECST module is imported from platform-core +And a sample customer entity exists +And sample order items exist +And an empty array of items +When I call embedCollection(items) +Then the result is an empty array +``` diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.sdp.md index c8a7e761..db9d3b30 100644 --- a/specs/behavior/platform-core/ecst/fat-event-builder.sdp.md +++ b/specs/behavior/platform-core/ecst/fat-event-builder.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: to create fat events with embedded context so that downstream consumers have all data needed without back-queries (test carrier: packages/platform-core/tests/features/behavior/ecst/fat-event-builder.feature) +- actor: a platform developer +- outcome: to create fat events with embedded context so that downstream consumers have all data needed without back-queries + +## Behavior + +- rule: createFatEvent() creates properly structured fat events +- rule: embedEntity() snapshots entity fields into event +- rule: embedCollection() snapshots related collections diff --git a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-001-event-type-for-integration-scenarios.sdp.md b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-001-event-type-for-integration-scenarios.sdp.md index 7a9ccd3f..906c073d 100644 --- a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-001-event-type-for-integration-scenarios.sdp.md +++ b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-001-event-type-for-integration-scenarios.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Event type for integration scenarios" from packages/platform-core/tests/features/behavior/ecst/fat-vs-thin-selection.feature +- outcome: Executable scenario: Event type for integration scenarios + +```gwt +Given the event category taxonomy is available +And sample use cases for different event types +And an event for "value" +When determining appropriate event type +Then "value" should be used +And reason is "value" +``` diff --git a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-002-inventory-updated-as-thin-event.sdp.md b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-002-inventory-updated-as-thin-event.sdp.md index 889719ec..66ed23ca 100644 --- a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-002-inventory-updated-as-thin-event.sdp.md +++ b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-002-inventory-updated-as-thin-event.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "InventoryUpdated as thin event" from packages/platform-core/tests/features/behavior/ecst/fat-vs-thin-selection.feature +- outcome: Executable scenario: InventoryUpdated as thin event + +```gwt +Given the event category taxonomy is available +And sample use cases for different event types +And an "InventoryUpdated" event occurring 1000 times/second +When evaluating event type +Then thin event is recommended +And reason is "High frequency, same-context consumers can query" +``` diff --git a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-003-order-submitted-as-fat-event.sdp.md b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-003-order-submitted-as-fat-event.sdp.md index fad47968..f16a3f06 100644 --- a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-003-order-submitted-as-fat-event.sdp.md +++ b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-003-order-submitted-as-fat-event.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "OrderSubmitted as fat event" from packages/platform-core/tests/features/behavior/ecst/fat-vs-thin-selection.feature +- outcome: Executable scenario: OrderSubmitted as fat event + +```gwt +Given the event category taxonomy is available +And sample use cases for different event types +And an "OrderSubmitted" event occurring 10 times/second +And multiple downstream consumers in different contexts +When evaluating event type +Then fat event is recommended +And reason is "Cross-context consumers, low frequency" +``` diff --git a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-004-published-language-event-is-fat.sdp.md b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-004-published-language-event-is-fat.sdp.md index f7419d54..7848d0a9 100644 --- a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-004-published-language-event-is-fat.sdp.md +++ b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-004-published-language-event-is-fat.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Published Language event is fat" from packages/platform-core/tests/features/behavior/ecst/fat-vs-thin-selection.feature +- outcome: Executable scenario: Published Language event is fat + +```gwt +Given the event category taxonomy is available +And sample use cases for different event types +And an event defined in Published Language schema +When checking event requirements +Then event must be fat +And must include all fields defined in the contract +And schemaVersion must match Published Language version +``` diff --git a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-005-category-suggests-event-type.sdp.md b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-005-category-suggests-event-type.sdp.md index 27025e5d..f1b82dca 100644 --- a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-005-category-suggests-event-type.sdp.md +++ b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-005-category-suggests-event-type.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Category suggests event type" from packages/platform-core/tests/features/behavior/ecst/fat-vs-thin-selection.feature +- outcome: Executable scenario: Category suggests event type + +```gwt +Given the event category taxonomy is available +And sample use cases for different event types +And an event with category "value" +When checking suggested event type +Then suggested type is "value" +``` diff --git a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.sdp.md b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.sdp.md index e26d3d73..5f932d09 100644 --- a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.sdp.md +++ b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: guidelines for when to use fat vs thin events so that I make appropriate trade-offs between payload size and independence (test carrier: packages/platform-core/tests/features/behavior/ecst/fat-vs-thin-selection.feature) +- actor: a platform developer +- outcome: guidelines for when to use fat vs thin events so that I make appropriate trade-offs between payload size and independence + +## Behavior + +- rule: Cross-context integration should use fat events +- rule: High-frequency internal events should prefer thin events +- rule: Published Language contracts require fat events +- rule: Event category can indicate fat/thin preference diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-001-mark-single-field-for-shredding.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-001-mark-single-field-for-shredding.sdp.md index 9a6140d2..669a7066 100644 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-001-mark-single-field-for-shredding.sdp.md +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-001-mark-single-field-for-shredding.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Mark single field for shredding" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature +- outcome: Executable scenario: Mark single field for shredding + +```gwt +Given the ECST module with privacy support is imported +And sample entities with PII fields exist +And a customer entity with email "alice@example.com" +When I call embedEntity(customer, ['id', 'name', 'email'], { shred: ['email'] }) +Then the result includes email field +And email is marked with __shred: true metadata +``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-002-mark-multiple-fields-for-shredding.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-002-mark-multiple-fields-for-shredding.sdp.md index 9ee30837..ed5824b9 100644 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-002-mark-multiple-fields-for-shredding.sdp.md +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-002-mark-multiple-fields-for-shredding.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Mark multiple fields for shredding" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature +- outcome: Executable scenario: Mark multiple fields for shredding + +```gwt +Given the ECST module with privacy support is imported +And sample entities with PII fields exist +And a customer entity with email, phone, address +When I call embedEntity(customer, ['id', 'email', 'phone', 'address'], { shred: ['email', 'phone', 'address'] }) +Then email, phone, and address are all marked with __shred: true +``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-003-non-pii-fields-are-not-marked.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-003-non-pii-fields-are-not-marked.sdp.md index 488544c3..bf7377d1 100644 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-003-non-pii-fields-are-not-marked.sdp.md +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-003-non-pii-fields-are-not-marked.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Non-PII fields are not marked" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature +- outcome: Executable scenario: Non-PII fields are not marked + +```gwt +Given the ECST module with privacy support is imported +And sample entities with PII fields exist +And a customer entity with id, name, email +When I call embedEntity(customer, ['id', 'name', 'email'], { shred: ['email'] }) +Then id and name are NOT marked with __shred +``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-004-find-all-shreddable-fields-in-event.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-004-find-all-shreddable-fields-in-event.sdp.md index 77f392ea..82550b12 100644 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-004-find-all-shreddable-fields-in-event.sdp.md +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-004-find-all-shreddable-fields-in-event.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Find all shreddable fields in event" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature +- outcome: Executable scenario: Find all shreddable fields in event + +```gwt +Given the ECST module with privacy support is imported +And sample entities with PII fields exist +And a fat event with marked email and phone fields +When I call findShreddableFields(event) +Then result includes "payload.customer.email" +And result includes "payload.customer.phone" +``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-005-no-shreddable-fields-returns-empty.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-005-no-shreddable-fields-returns-empty.sdp.md index 4ee5b1cd..6d2564a8 100644 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-005-no-shreddable-fields-returns-empty.sdp.md +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-005-no-shreddable-fields-returns-empty.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "No shreddable fields returns empty" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature +- outcome: Executable scenario: No shreddable fields returns empty + +```gwt +Given the ECST module with privacy support is imported +And sample entities with PII fields exist +And a fat event with no marked fields +When I call findShreddableFields(event) +Then result is an empty array +``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-006-mark-fields-in-collection-items.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-006-mark-fields-in-collection-items.sdp.md index c6f40449..5d2a1f43 100644 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-006-mark-fields-in-collection-items.sdp.md +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-006-mark-fields-in-collection-items.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Mark fields in collection items" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature +- outcome: Executable scenario: Mark fields in collection items + +```gwt +Given the ECST module with privacy support is imported +And sample entities with PII fields exist +And 2 shipping addresses with street, city, postalCode +When I call embedCollection(addresses, ['street', 'city', 'postalCode'], { shred: ['street', 'postalCode'] }) +Then each item has street and postalCode marked with __shred: true +And city is not marked in any item +``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-007-shred-all-marked-fields.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-007-shred-all-marked-fields.sdp.md index 28522430..a79b94d4 100644 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-007-shred-all-marked-fields.sdp.md +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-007-shred-all-marked-fields.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Shred all marked fields" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature +- outcome: Executable scenario: Shred all marked fields + +```gwt +Given the ECST module with privacy support is imported +And sample entities with PII fields exist +And a fat event with marked email "alice@example.com" +When I call shredEvent(event) +Then email field is a RedactedValue object +And RedactedValue has __redacted set to true +And RedactedValue has originalType "string" +And RedactedValue has redactedAt timestamp +``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-008-non-marked-fields-are-preserved.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-008-non-marked-fields-are-preserved.sdp.md index 96ebff29..a88d1262 100644 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-008-non-marked-fields-are-preserved.sdp.md +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-008-non-marked-fields-are-preserved.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Non-marked fields are preserved" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature +- outcome: Executable scenario: Non-marked fields are preserved + +```gwt +Given the ECST module with privacy support is imported +And sample entities with PII fields exist +And a fat event with marked email and non-marked name +When I call shredEvent(event) +Then name field value is unchanged +And email field is a RedactedValue object +``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-009-shred-event-returns-audit-trail.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-009-shred-event-returns-audit-trail.sdp.md index 9dd8345a..06f4d2f4 100644 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-009-shred-event-returns-audit-trail.sdp.md +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-009-shred-event-returns-audit-trail.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Shred event returns audit trail" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature +- outcome: Executable scenario: Shred event returns audit trail + +```gwt +Given the ECST module with privacy support is imported +And sample entities with PII fields exist +And a fat event with marked email "alice@example.com" +When I call shredEvent(event) with correlationId "erasure-req-123" +Then the result includes an audit object +And audit.correlationId equals "erasure-req-123" +And audit.fieldsShredded includes the shredded field paths +And audit.shreddedAt is a timestamp +``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-010-check-if-event-has-any-shreddable-fields.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-010-check-if-event-has-any-shreddable-fields.sdp.md index 92250f5b..09ce279d 100644 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-010-check-if-event-has-any-shreddable-fields.sdp.md +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-010-check-if-event-has-any-shreddable-fields.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Check if event has any shreddable fields" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature +- outcome: Executable scenario: Check if event has any shreddable fields + +```gwt +Given the ECST module with privacy support is imported +And sample entities with PII fields exist +And a fat event with marked PII fields +When I call hasShreddableFields(event) +Then the result is true +``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-011-check-event-without-shreddable-fields.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-011-check-event-without-shreddable-fields.sdp.md index 2273d2ed..4cb77aab 100644 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-011-check-event-without-shreddable-fields.sdp.md +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-011-check-event-without-shreddable-fields.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Check event without shreddable fields" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature +- outcome: Executable scenario: Check event without shreddable fields + +```gwt +Given the ECST module with privacy support is imported +And sample entities with PII fields exist +And a fat event with no marked fields +When I call hasShreddableFields(event) +Then the result is false +``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-012-count-shreddable-fields.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-012-count-shreddable-fields.sdp.md index 0b3a1c55..b14ad305 100644 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-012-count-shreddable-fields.sdp.md +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-012-count-shreddable-fields.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Count shreddable fields" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature +- outcome: Executable scenario: Count shreddable fields + +```gwt +Given the ECST module with privacy support is imported +And sample entities with PII fields exist +And a fat event with 2 marked PII fields +When I call countShreddableFields(event) +Then the result is 2 +``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-013-cannot-shred-required-fields.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-013-cannot-shred-required-fields.sdp.md index b07b96e4..1c8bf251 100644 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-013-cannot-shred-required-fields.sdp.md +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-013-cannot-shred-required-fields.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Cannot shred required fields" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature +- outcome: Executable scenario: Cannot shred required fields + +```gwt +Given the ECST module with privacy support is imported +And sample entities with PII fields exist +And an entity with fields id, name, email +When I call embedEntity with shred ["email"] and required ["email"] +Then an error is thrown with message containing "marked as required" +``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-014-non-overlapping-shred-and-required-fields-work.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-014-non-overlapping-shred-and-required-fields-work.sdp.md index 8bc85e5b..6ea65bc4 100644 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-014-non-overlapping-shred-and-required-fields-work.sdp.md +++ b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-014-non-overlapping-shred-and-required-fields-work.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Non-overlapping shred and required fields work" from packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature +- outcome: Executable scenario: Non-overlapping shred and required fields work + +```gwt +Given the ECST module with privacy support is imported +And sample entities with PII fields exist +And an entity with fields id, name, email +When I call embedEntity with shred ["email"] and required ["id"] +Then the result includes email marked with __shred +And the result includes id without __shred marker +``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.sdp.md index 231af3c3..bf26d5b2 100644 --- a/specs/behavior/platform-core/ecst/privacy-markers.sdp.md +++ b/specs/behavior/platform-core/ecst/privacy-markers.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: to mark PII fields in fat events for crypto-shredding so that GDPR right-to-erasure requests can be properly handled (test carrier: packages/platform-core/tests/features/behavior/ecst/privacy-markers.feature) +- actor: a platform developer +- outcome: to mark PII fields in fat events for crypto-shredding so that GDPR right-to-erasure requests can be properly handled + +## Behavior + +- rule: PII fields can be marked for crypto-shredding +- rule: Shred markers can be detected in fat events +- rule: Collections can have per-item privacy markers +- rule: Marked fields can be shredded (replaced with RedactedValue) +- rule: Utility functions for shreddable field detection +- rule: Required fields cannot be marked for shredding diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-001-schema-version-is-included-automatically.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-001-schema-version-is-included-automatically.sdp.md index 484611e5..69afcfa2 100644 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-001-schema-version-is-included-automatically.sdp.md +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-001-schema-version-is-included-automatically.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Schema version is included automatically" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature +- outcome: Executable scenario: Schema version is included automatically + +```gwt +Given the ECST schema registry is available +And sample schemas for different versions exist +And a fat event created without explicit schema +When I inspect the event metadata +Then schemaVersion field exists +And it defaults to "1.0.0" +``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-002-custom-schema-version-is-used.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-002-custom-schema-version-is-used.sdp.md index 6cff4685..7fc2957d 100644 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-002-custom-schema-version-is-used.sdp.md +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-002-custom-schema-version-is-used.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Custom schema version is used" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature +- outcome: Executable scenario: Custom schema version is used + +```gwt +Given the ECST schema registry is available +And sample schemas for different versions exist +And a schema with version "2.1.0" +When I create a fat event with this schema +Then event.metadata.schemaVersion equals "2.1.0" +``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-003-valid-payload-passes-validation.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-003-valid-payload-passes-validation.sdp.md index 3cbfb6cd..6e3a716c 100644 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-003-valid-payload-passes-validation.sdp.md +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-003-valid-payload-passes-validation.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Valid payload passes validation" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature +- outcome: Executable scenario: Valid payload passes validation + +```gwt +Given the ECST schema registry is available +And sample schemas for different versions exist +And an OrderSubmitted schema requiring orderId and items +And a payload with orderId "ord_123" and items array +When I call validateFatEvent(event, schema) +Then validation succeeds with { valid: true } +``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-004-missing-required-field-fails-validation.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-004-missing-required-field-fails-validation.sdp.md index dfb08b35..ccd84b7d 100644 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-004-missing-required-field-fails-validation.sdp.md +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-004-missing-required-field-fails-validation.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Missing required field fails validation" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature +- outcome: Executable scenario: Missing required field fails validation + +```gwt +Given the ECST schema registry is available +And sample schemas for different versions exist +And an OrderSubmitted schema requiring orderId and items +And a payload missing orderId +When I call validateFatEvent(event, schema) +Then validation fails with { valid: false } +And error contains "orderId is required" +``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-005-wrong-field-type-fails-validation.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-005-wrong-field-type-fails-validation.sdp.md index 12b7dfe2..0ebe347c 100644 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-005-wrong-field-type-fails-validation.sdp.md +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-005-wrong-field-type-fails-validation.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Wrong field type fails validation" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature +- outcome: Executable scenario: Wrong field type fails validation + +```gwt +Given the ECST schema registry is available +And sample schemas for different versions exist +And an OrderSubmitted schema requiring items as array +And a payload with items as a string +When I call validateFatEvent(event, schema) +Then validation fails with { valid: false } +And error contains "items must be an array" +``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-006-migrate-v1-event-to-v2-format.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-006-migrate-v1-event-to-v2-format.sdp.md index b7464b33..67593dfa 100644 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-006-migrate-v1-event-to-v2-format.sdp.md +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-006-migrate-v1-event-to-v2-format.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Migrate v1 event to v2 format" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature +- outcome: Executable scenario: Migrate v1 event to v2 format + +```gwt +Given the ECST schema registry is available +And sample schemas for different versions exist +And a v1 OrderSubmitted event without currency field +And a v2 schema that adds currency with default "USD" +And a migration function from v1 to v2 +When I call migrateEvent(event, targetSchema) +Then the result has schemaVersion "2.0.0" +And payload.currency equals "USD" +``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-007-no-migration-needed-for-current-version.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-007-no-migration-needed-for-current-version.sdp.md index 83fd034c..fe6815f1 100644 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-007-no-migration-needed-for-current-version.sdp.md +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-007-no-migration-needed-for-current-version.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "No migration needed for current version" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature +- outcome: Executable scenario: No migration needed for current version + +```gwt +Given the ECST schema registry is available +And sample schemas for different versions exist +And a v2 OrderSubmitted event +And a v2 schema +When I call migrateEvent(event, targetSchema) +Then the event is returned unchanged +``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-008-unknown-source-version-fails-migration.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-008-unknown-source-version-fails-migration.sdp.md index 09b1523f..2e80bb84 100644 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-008-unknown-source-version-fails-migration.sdp.md +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-008-unknown-source-version-fails-migration.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Unknown source version fails migration" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature +- outcome: Executable scenario: Unknown source version fails migration + +```gwt +Given the ECST schema registry is available +And sample schemas for different versions exist +And an event with schemaVersion "0.5.0" +And a schema with no migration path from 0.5.0 +When I call migrateEvent(event, targetSchema) +Then an error is thrown with message "No migration path from 0.5.0" +``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-009-compare-older-version-to-newer-version.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-009-compare-older-version-to-newer-version.sdp.md index 2718108c..534c748c 100644 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-009-compare-older-version-to-newer-version.sdp.md +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-009-compare-older-version-to-newer-version.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Compare older version to newer version" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature +- outcome: Executable scenario: Compare older version to newer version + +```gwt +Given the ECST schema registry is available +And sample schemas for different versions exist +And version "1.0.0" and version "2.0.0" +When comparing versions +Then the result is -1 +``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-010-compare-newer-version-to-older-version.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-010-compare-newer-version-to-older-version.sdp.md index b616600e..dddc2b31 100644 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-010-compare-newer-version-to-older-version.sdp.md +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-010-compare-newer-version-to-older-version.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Compare newer version to older version" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature +- outcome: Executable scenario: Compare newer version to older version + +```gwt +Given the ECST schema registry is available +And sample schemas for different versions exist +And version "2.0.0" and version "1.0.0" +When comparing versions +Then the result is 1 +``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-011-compare-equal-versions.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-011-compare-equal-versions.sdp.md index 6a734797..202fae46 100644 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-011-compare-equal-versions.sdp.md +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-011-compare-equal-versions.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Compare equal versions" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature +- outcome: Executable scenario: Compare equal versions + +```gwt +Given the ECST schema registry is available +And sample schemas for different versions exist +And version "1.0.0" and version "1.0.0" +When comparing versions +Then the result is 0 +``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-012-compare-versions-with-different-minor.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-012-compare-versions-with-different-minor.sdp.md index 5aaf3ec1..407d2e06 100644 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-012-compare-versions-with-different-minor.sdp.md +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-012-compare-versions-with-different-minor.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Compare versions with different minor" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature +- outcome: Executable scenario: Compare versions with different minor + +```gwt +Given the ECST schema registry is available +And sample schemas for different versions exist +And version "1.2.0" and version "1.10.0" +When comparing versions +Then the result is -1 +``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-013-invalid-semver-format-is-rejected.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-013-invalid-semver-format-is-rejected.sdp.md index 673067e5..1f2e9420 100644 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-013-invalid-semver-format-is-rejected.sdp.md +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-013-invalid-semver-format-is-rejected.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Invalid semver format is rejected" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature +- outcome: Executable scenario: Invalid semver format is rejected + +```gwt +Given the ECST schema registry is available +And sample schemas for different versions exist +And an invalid version "1.x.0" +When attempting to compare with "2.0.0" +Then an error is thrown with message containing "Invalid semver format" +``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-014-negative-major-version-is-rejected.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-014-negative-major-version-is-rejected.sdp.md index 6eea4ffa..e329206b 100644 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-014-negative-major-version-is-rejected.sdp.md +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-014-negative-major-version-is-rejected.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Negative major version is rejected" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature +- outcome: Executable scenario: Negative major version is rejected + +```gwt +Given the ECST schema registry is available +And sample schemas for different versions exist +And an invalid version "-1.0.0" +When attempting to compare with "1.0.0" +Then an error is thrown with message containing "non-negative" +``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-015-negative-minor-version-is-rejected.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-015-negative-minor-version-is-rejected.sdp.md index e5caed03..cde73510 100644 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-015-negative-minor-version-is-rejected.sdp.md +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-015-negative-minor-version-is-rejected.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Negative minor version is rejected" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature +- outcome: Executable scenario: Negative minor version is rejected + +```gwt +Given the ECST schema registry is available +And sample schemas for different versions exist +And an invalid version "1.-5.0" +When attempting to compare with "1.0.0" +Then an error is thrown with message containing "non-negative" +``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-016-event-needs-migration-to-newer-version.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-016-event-needs-migration-to-newer-version.sdp.md index cdb0f623..a26b42ed 100644 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-016-event-needs-migration-to-newer-version.sdp.md +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-016-event-needs-migration-to-newer-version.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Event needs migration to newer version" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature +- outcome: Executable scenario: Event needs migration to newer version + +```gwt +Given the ECST schema registry is available +And sample schemas for different versions exist +And an event with schemaVersion "1.0.0" +And a target version "2.0.0" +When checking if migration is needed +Then the result is true +``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-017-event-does-not-need-migration-for-same-version.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-017-event-does-not-need-migration-for-same-version.sdp.md index 8425b5a6..b1d42f5c 100644 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-017-event-does-not-need-migration-for-same-version.sdp.md +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-017-event-does-not-need-migration-for-same-version.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Event does not need migration for same version" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature +- outcome: Executable scenario: Event does not need migration for same version + +```gwt +Given the ECST schema registry is available +And sample schemas for different versions exist +And an event with schemaVersion "2.0.0" +And a target version "2.0.0" +When checking if migration is needed +Then the result is false +``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-018-event-does-not-need-migration-for-older-target.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-018-event-does-not-need-migration-for-older-target.sdp.md index 963f3a1c..8f54aba0 100644 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-018-event-does-not-need-migration-for-older-target.sdp.md +++ b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-018-event-does-not-need-migration-for-older-target.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Event does not need migration for older target" from packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature +- outcome: Executable scenario: Event does not need migration for older target + +```gwt +Given the ECST schema registry is available +And sample schemas for different versions exist +And an event with schemaVersion "3.0.0" +And a target version "2.0.0" +When checking if migration is needed +Then the result is false +``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.sdp.md index f2621756..bd81267e 100644 --- a/specs/behavior/platform-core/ecst/schema-versioning.sdp.md +++ b/specs/behavior/platform-core/ecst/schema-versioning.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: fat events to include schema version information so that consumers can upcast events from older versions (test carrier: packages/platform-core/tests/features/behavior/ecst/schema-versioning.feature) +- actor: a platform developer +- outcome: fat events to include schema version information so that consumers can upcast events from older versions + +## Behavior + +- rule: Fat events must include schema version +- rule: Fat events are validated against their schema +- rule: Older events can be migrated to newer schema versions +- rule: Version comparison utility works correctly +- rule: needsMigration() detects when migration is required diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-001-percentage-is-50-when-half-events-processed.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-001-percentage-is-50-when-half-events-processed.sdp.md index 4cd6ab8b..5fccc573 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-001-percentage-is-50-when-half-events-processed.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-001-percentage-is-50-when-half-events-processed.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Percentage is 50 when half events processed" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature +- outcome: Executable scenario: Percentage is 50 when half events processed + +```gwt +Given 500 events processed out of 1000 total +When calculating percent complete +Then the result should be 50 +``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-002-percentage-is-100-when-all-events-processed.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-002-percentage-is-100-when-all-events-processed.sdp.md index 81fcfc63..42816ad5 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-002-percentage-is-100-when-all-events-processed.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-002-percentage-is-100-when-all-events-processed.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Percentage is 100 when all events processed" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature +- outcome: Executable scenario: Percentage is 100 when all events processed + +```gwt +Given 1000 events processed out of 1000 total +When calculating percent complete +Then the result should be 100 +``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-003-percentage-is-100-when-total-events-is-zero.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-003-percentage-is-100-when-total-events-is-zero.sdp.md index eb2ca582..d904fd49 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-003-percentage-is-100-when-total-events-is-zero.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-003-percentage-is-100-when-total-events-is-zero.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Percentage is 100 when total events is zero" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature +- outcome: Executable scenario: Percentage is 100 when total events is zero + +```gwt +Given 0 events processed out of 0 total +When calculating percent complete +Then the result should be 100 +``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-004-percentage-has-one-decimal-place-precision.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-004-percentage-has-one-decimal-place-precision.sdp.md index 5412bbbd..2523873c 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-004-percentage-has-one-decimal-place-precision.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-004-percentage-has-one-decimal-place-precision.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Percentage has one decimal place precision" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature +- outcome: Executable scenario: Percentage has one decimal place precision + +```gwt +Given 333 events processed out of 1000 total +When calculating percent complete +Then the result should be 33.3 +``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-005-remaining-time-estimated-from-throughput.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-005-remaining-time-estimated-from-throughput.sdp.md index 5f843329..08f627a4 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-005-remaining-time-estimated-from-throughput.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-005-remaining-time-estimated-from-throughput.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Remaining time estimated from throughput" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature +- outcome: Executable scenario: Remaining time estimated from throughput + +```gwt +Given 100 events processed in 10000ms with 1000 total events +When estimating remaining time +Then the estimated time should be 90000ms +``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-006-remaining-time-is-undefined-when-no-events-processed.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-006-remaining-time-is-undefined-when-no-events-processed.sdp.md index e73ec6e4..082477b2 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-006-remaining-time-is-undefined-when-no-events-processed.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-006-remaining-time-is-undefined-when-no-events-processed.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Remaining time is undefined when no events processed" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature +- outcome: Executable scenario: Remaining time is undefined when no events processed + +```gwt +Given 0 events processed in 5000ms with 1000 total events +When estimating remaining time +Then the estimated time should be undefined +``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-007-remaining-time-is-undefined-when-elapsed-time-is-zero.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-007-remaining-time-is-undefined-when-elapsed-time-is-zero.sdp.md index acefd21d..cec12a41 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-007-remaining-time-is-undefined-when-elapsed-time-is-zero.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-007-remaining-time-is-undefined-when-elapsed-time-is-zero.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Remaining time is undefined when elapsed time is zero" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature +- outcome: Executable scenario: Remaining time is undefined when elapsed time is zero + +```gwt +Given 100 events processed in 0ms with 1000 total events +When estimating remaining time +Then the estimated time should be undefined +``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-008-remaining-time-is-zero-when-all-events-processed.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-008-remaining-time-is-zero-when-all-events-processed.sdp.md index 7a4f0dde..47ce66e1 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-008-remaining-time-is-zero-when-all-events-processed.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-008-remaining-time-is-zero-when-all-events-processed.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Remaining time is zero when all events processed" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature +- outcome: Executable scenario: Remaining time is zero when all events processed + +```gwt +Given 1000 events processed in 10000ms with 1000 total events +When estimating remaining time +Then the estimated time should be 0 +``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-009-calculate-progress-for-running-replay.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-009-calculate-progress-for-running-replay.sdp.md index 574fe428..47a7b24e 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-009-calculate-progress-for-running-replay.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-009-calculate-progress-for-running-replay.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Calculate progress for running replay" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature +- outcome: Executable scenario: Calculate progress for running replay + +```gwt +Given a running checkpoint with 500 of 1000 events processed +And the replay started 10 seconds ago +When calculating full progress +Then the progress status should be "running" +And the progress percentComplete should be 50 +And the progress should have an estimatedRemainingMs value +``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-010-calculate-progress-for-completed-replay.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-010-calculate-progress-for-completed-replay.sdp.md index 83117959..fb285490 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-010-calculate-progress-for-completed-replay.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-010-calculate-progress-for-completed-replay.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Calculate progress for completed replay" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature +- outcome: Executable scenario: Calculate progress for completed replay + +```gwt +Given a completed checkpoint with 1000 of 1000 events processed +When calculating full progress +Then the progress status should be "completed" +And the progress percentComplete should be 100 +And the progress should NOT have an estimatedRemainingMs value +``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-011-calculate-progress-includes-error-for-failed-replay.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-011-calculate-progress-includes-error-for-failed-replay.sdp.md index 00c9e1bb..5fae8c02 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-011-calculate-progress-includes-error-for-failed-replay.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-011-calculate-progress-includes-error-for-failed-replay.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Calculate progress includes error for failed replay" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature +- outcome: Executable scenario: Calculate progress includes error for failed replay + +```gwt +Given a failed checkpoint with error "Projection handler threw exception" +When calculating full progress +Then the progress status should be "failed" +And the progress error should be "Projection handler threw exception" +``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-012-running-status-is-active.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-012-running-status-is-active.sdp.md index 1316cf58..b627a8e8 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-012-running-status-is-active.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-012-running-status-is-active.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Running status is active" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature +- outcome: Executable scenario: Running status is active + +```gwt +Given a replay with status "running" +When checking if replay is active +Then the result should be true +``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-013-paused-status-is-active.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-013-paused-status-is-active.sdp.md index 0507bb61..d6b66a69 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-013-paused-status-is-active.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-013-paused-status-is-active.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Paused status is active" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature +- outcome: Executable scenario: Paused status is active + +```gwt +Given a replay with status "paused" +When checking if replay is active +Then the result should be true +``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-014-completed-status-is-not-active.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-014-completed-status-is-not-active.sdp.md index a7d403ec..ef62b6c1 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-014-completed-status-is-not-active.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-014-completed-status-is-not-active.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Completed status is not active" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature +- outcome: Executable scenario: Completed status is not active + +```gwt +Given a replay with status "completed" +When checking if replay is active +Then the result should be false +``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-015-failed-status-is-not-active.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-015-failed-status-is-not-active.sdp.md index 2203db9d..7f37fd3b 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-015-failed-status-is-not-active.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-015-failed-status-is-not-active.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Failed status is not active" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature +- outcome: Executable scenario: Failed status is not active + +```gwt +Given a replay with status "failed" +When checking if replay is active +Then the result should be false +``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-016-completed-status-is-terminal.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-016-completed-status-is-terminal.sdp.md index 7af39b02..64395195 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-016-completed-status-is-terminal.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-016-completed-status-is-terminal.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Completed status is terminal" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature +- outcome: Executable scenario: Completed status is terminal + +```gwt +Given a replay with status "completed" +When checking if status is terminal +Then the result should be true +``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-017-failed-status-is-terminal.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-017-failed-status-is-terminal.sdp.md index 3cf90a4a..ce0e04bc 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-017-failed-status-is-terminal.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-017-failed-status-is-terminal.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Failed status is terminal" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature +- outcome: Executable scenario: Failed status is terminal + +```gwt +Given a replay with status "failed" +When checking if status is terminal +Then the result should be true +``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-018-cancelled-status-is-terminal.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-018-cancelled-status-is-terminal.sdp.md index 0083f21c..ec92f11c 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-018-cancelled-status-is-terminal.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-018-cancelled-status-is-terminal.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Cancelled status is terminal" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature +- outcome: Executable scenario: Cancelled status is terminal + +```gwt +Given a replay with status "cancelled" +When checking if status is terminal +Then the result should be true +``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-019-running-status-is-not-terminal.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-019-running-status-is-not-terminal.sdp.md index 72d637f1..6b0375f7 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-019-running-status-is-not-terminal.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-019-running-status-is-not-terminal.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Running status is not terminal" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature +- outcome: Executable scenario: Running status is not terminal + +```gwt +Given a replay with status "running" +When checking if status is terminal +Then the result should be false +``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-020-paused-status-is-not-terminal.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-020-paused-status-is-not-terminal.sdp.md index 0a952217..33ad5901 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-020-paused-status-is-not-terminal.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-020-paused-status-is-not-terminal.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Paused status is not terminal" from packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature +- outcome: Executable scenario: Paused status is not terminal + +```gwt +Given a replay with status "paused" +When checking if status is terminal +Then the result should be false +``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.sdp.md index 2d6c93cc..710d7d73 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Progress calculation utilities for replay operations including percentage completion, time estimation, and status checks. (test carrier: packages/platform-core/tests/features/behavior/event-replay/replay-progress.feature) +- outcome: Replay Progress Calculator diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-001-create-append-partition-key-generates-correct-format.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-001-create-append-partition-key-generates-correct-format.sdp.md index c5290a67..2470bdea 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-001-create-append-partition-key-generates-correct-format.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-001-create-append-partition-key-generates-correct-format.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "createAppendPartitionKey generates correct format" from packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature +- outcome: Executable scenario: createAppendPartitionKey generates correct format + +```gwt +Given the feature fixture is in place +When calling createAppendPartitionKey with stream type "Order" and ID "ord-456" +Then the partition key name should be "append" +And the partition key value should be "Order:ord-456" +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-002-partition-key-handles-various-stream-types.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-002-partition-key-handles-various-stream-types.sdp.md index c5b7d61e..59bc7d6c 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-002-partition-key-handles-various-stream-types.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-002-partition-key-handles-various-stream-types.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Partition key handles various stream types" from packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature +- outcome: Executable scenario: Partition key handles various stream types + +```gwt +Given the feature fixture is in place +When calling createAppendPartitionKey with stream type "value" and ID "value" +Then the partition key value should be "value" +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-003-durable-append-event-enqueues-action-to-workpool.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-003-durable-append-event-enqueues-action-to-workpool.sdp.md index cc3a06f2..7a2a5855 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-003-durable-append-event-enqueues-action-to-workpool.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-003-durable-append-event-enqueues-action-to-workpool.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "durableAppendEvent enqueues action to Workpool" from packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature +- outcome: Executable scenario: durableAppendEvent enqueues action to Workpool + +```gwt +Given a mock Workpool for durable append +When calling durableAppendEvent for stream "Order:ord-123" +Then Workpool enqueueAction should be called +And the workpool partition key should be "Order:ord-123" +And the result status should be "enqueued" +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-004-durable-append-event-returns-work-id-from-workpool.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-004-durable-append-event-returns-work-id-from-workpool.sdp.md index 6ab678b5..ea3117b6 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-004-durable-append-event-returns-work-id-from-workpool.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-004-durable-append-event-returns-work-id-from-workpool.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "durableAppendEvent returns work ID from Workpool" from packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature +- outcome: Executable scenario: durableAppendEvent returns work ID from Workpool + +```gwt +Given a mock Workpool that returns work ID "work-789" +When calling durableAppendEvent for any event +Then the result workId should be "work-789" +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-005-durable-append-event-passes-on-complete-to-workpool.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-005-durable-append-event-passes-on-complete-to-workpool.sdp.md index ff809d8d..e6250f73 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-005-durable-append-event-passes-on-complete-to-workpool.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-005-durable-append-event-passes-on-complete-to-workpool.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "durableAppendEvent passes onComplete to Workpool" from packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature +- outcome: Executable scenario: durableAppendEvent passes onComplete to Workpool + +```gwt +Given a mock Workpool for durable append +When calling durableAppendEvent with onComplete handler +Then Workpool should receive the onComplete reference +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-006-durable-append-event-includes-idempotency-key-in-context.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-006-durable-append-event-includes-idempotency-key-in-context.sdp.md index 011d25f3..d0bc2052 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-006-durable-append-event-includes-idempotency-key-in-context.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-006-durable-append-event-includes-idempotency-key-in-context.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "durableAppendEvent includes idempotencyKey in context" from packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature +- outcome: Executable scenario: durableAppendEvent includes idempotencyKey in context + +```gwt +Given a mock Workpool for durable append +When calling durableAppendEvent with idempotencyKey "test:ord-123" +Then Workpool context should include the idempotencyKey +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-007-create-durable-append-action-handler-returns-a-function.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-007-create-durable-append-action-handler-returns-a-function.sdp.md index ec24d69c..fada7542 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-007-create-durable-append-action-handler-returns-a-function.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-007-create-durable-append-action-handler-returns-a-function.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "createDurableAppendActionHandler returns a function" from packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature +- outcome: Executable scenario: createDurableAppendActionHandler returns a function + +```gwt +Given the feature fixture is in place +When calling createDurableAppendActionHandler +Then the result should be a callable function +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-008-action-handler-invokes-idempotent-append-event.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-008-action-handler-invokes-idempotent-append-event.sdp.md index a12ea74f..30644473 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-008-action-handler-invokes-idempotent-append-event.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-008-action-handler-invokes-idempotent-append-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Action handler invokes idempotentAppendEvent" from packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature +- outcome: Executable scenario: Action handler invokes idempotentAppendEvent + +```gwt +Given a durable append action handler +When invoking the handler with event args +Then idempotentAppendEvent should be called +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.sdp.md index 3655f99e..c267d857 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-append.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-append.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Wraps event append in Workpool for automatic retry with exponential backoff. Failed appends from async contexts are recovered via Workpool actions. (test carrier: packages/platform-core/tests/features/behavior/event-store-durability/durable-append.feature) +- outcome: Durable Event Append diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-001-partition-key-format-is-event-id-target-context.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-001-partition-key-format-is-event-id-target-context.sdp.md index d44f7f8b..916e6caa 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-001-partition-key-format-is-event-id-target-context.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-001-partition-key-format-is-event-id-target-context.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Partition key format is eventId:targetContext" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature +- outcome: Executable scenario: Partition key format is eventId:targetContext + +```gwt +Given an eventId "evt-123" and target context "inventory" +When creating a publication partition key +Then the partition key value should be "evt-123:inventory" +And the partition key name should be "publication" +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-002-different-events-get-different-partition-keys.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-002-different-events-get-different-partition-keys.sdp.md index e5e27e2f..ee72e870 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-002-different-events-get-different-partition-keys.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-002-different-events-get-different-partition-keys.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Different events get different partition keys" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature +- outcome: Executable scenario: Different events get different partition keys + +```gwt +Given an eventId "value" and target context "value" +When creating a publication partition key +Then the partition key value should be "value" +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-003-publishing-event-creates-tracking-records-for-each-target.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-003-publishing-event-creates-tracking-records-for-each-target.sdp.md index f990e384..86343059 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-003-publishing-event-creates-tracking-records-for-each-target.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-003-publishing-event-creates-tracking-records-for-each-target.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Publishing event creates tracking records for each target" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature +- outcome: Executable scenario: Publishing event creates tracking records for each target + +```gwt +Given a durable event publisher configured with maxAttempts 5 +And an event "evt-123" to publish to contexts "inventory" and "notifications" +When publishing the event +Then 2 publication tracking records should be created +And each record should have status "pending" +And each record should have attemptCount 0 +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-004-publishing-event-enqueues-delivery-actions-via-workpool.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-004-publishing-event-enqueues-delivery-actions-via-workpool.sdp.md index 4dbdf541..2b6c135c 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-004-publishing-event-enqueues-delivery-actions-via-workpool.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-004-publishing-event-enqueues-delivery-actions-via-workpool.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Publishing event enqueues delivery actions via Workpool" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature +- outcome: Executable scenario: Publishing event enqueues delivery actions via Workpool + +```gwt +Given a durable event publisher configured with maxAttempts 5 +And an event "evt-123" to publish to contexts "inventory" and "notifications" +When publishing the event +Then 2 delivery actions should be enqueued +And each action should have correct partition key +And each action should have onComplete handler set +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-005-publish-result-contains-publication-i-ds-for-each-target.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-005-publish-result-contains-publication-i-ds-for-each-target.sdp.md index 0ab6ef44..9dd2e3e4 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-005-publish-result-contains-publication-i-ds-for-each-target.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-005-publish-result-contains-publication-i-ds-for-each-target.sdp.md @@ -6,8 +6,16 @@ readiness: idea relations: refines: spec:behavior.platform-core.event-store-durability.durable-publication --- -# Publish result contains publication IDs for each target +# Query returns empty for unknown event ## Intent -- outcome: Executable scenario "Publish result contains publication IDs for each target" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature +- outcome: Executable scenario: Query returns empty for unknown event + +```gwt +Given the backend is running and clean +And durable publication is configured with maxAttempts 3 +And no publications exist for event "evt-pub-unknown" +When querying publications for event "evt-pub-unknown" +Then 0 publication records should be returned +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-006-correlation-id-is-passed-through-to-tracking-records.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-006-correlation-id-is-passed-through-to-tracking-records.sdp.md index 9348f14e..fb23fa7f 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-006-correlation-id-is-passed-through-to-tracking-records.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-006-correlation-id-is-passed-through-to-tracking-records.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Correlation ID is passed through to tracking records" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature +- outcome: Executable scenario: Correlation ID is passed through to tracking records + +```gwt +Given a durable event publisher +And an event "evt-123" with correlationId "corr-456" +And target contexts "inventory" +When publishing the event +Then the tracking record should have correlationId "corr-456" +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-007-get-publication-status-returns-all-target-contexts.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-007-get-publication-status-returns-all-target-contexts.sdp.md index 7700bd39..851dd341 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-007-get-publication-status-returns-all-target-contexts.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-007-get-publication-status-returns-all-target-contexts.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Get publication status returns all target contexts" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature +- outcome: Executable scenario: Get publication status returns all target contexts + +```gwt +Given publications exist for event "evt-123" to 3 targets +When getting publication status for event "evt-123" +Then the result should contain 3 publications +And the result should show inventory as delivered +And the result should show analytics as dead_letter +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-008-get-publication-status-returns-empty-array-for-unknown-event.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-008-get-publication-status-returns-empty-array-for-unknown-event.sdp.md index 6b26c3e8..a2671034 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-008-get-publication-status-returns-empty-array-for-unknown-event.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-008-get-publication-status-returns-empty-array-for-unknown-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Get publication status returns empty array for unknown event" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature +- outcome: Executable scenario: Get publication status returns empty array for unknown event + +```gwt +Given no publications exist for event "evt-unknown" +When getting publication status for event "evt-unknown" +Then the result should be an empty array +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-009-retry-publication-re-enqueues-delivery-action.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-009-retry-publication-re-enqueues-delivery-action.sdp.md index c6124ae5..f55dde16 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-009-retry-publication-re-enqueues-delivery-action.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-009-retry-publication-re-enqueues-delivery-action.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Retry publication re-enqueues delivery action" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature +- outcome: Executable scenario: Retry publication re-enqueues delivery action + +```gwt +Given a publication record "pub-123" with status "dead_letter" +When retrying publication "pub-123" +Then the result status should be "retried" +And the record status should be updated to "retried" +And attemptCount should be incremented +And a new delivery action should be enqueued +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-010-retry-publication-returns-not-found-for-unknown-publication.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-010-retry-publication-returns-not-found-for-unknown-publication.sdp.md index 5b6cfc02..8a0f29a2 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-010-retry-publication-returns-not-found-for-unknown-publication.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-010-retry-publication-returns-not-found-for-unknown-publication.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Retry publication returns not_found for unknown publication" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature +- outcome: Executable scenario: Retry publication returns not_found for unknown publication + +```gwt +Given no publication record exists for "pub-unknown" +When retrying publication "pub-unknown" +Then the result status should be "not_found" +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-011-retry-publication-returns-already-delivered-for-delivered-publication.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-011-retry-publication-returns-already-delivered-for-delivered-publication.sdp.md index 9dc802ca..9b9cf147 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-011-retry-publication-returns-already-delivered-for-delivered-publication.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-011-retry-publication-returns-already-delivered-for-delivered-publication.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Retry publication returns already_delivered for delivered publication" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature +- outcome: Executable scenario: Retry publication returns already_delivered for delivered publication + +```gwt +Given a publication record "pub-123" with status "delivered" +When retrying publication "pub-123" +Then the result status should be "already_delivered" +And no delivery action should be enqueued +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-012-retry-increments-attempt-count-correctly.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-012-retry-increments-attempt-count-correctly.sdp.md index 0462ca55..ef1f0811 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-012-retry-increments-attempt-count-correctly.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-012-retry-increments-attempt-count-correctly.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Retry increments attempt count correctly" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature +- outcome: Executable scenario: Retry increments attempt count correctly + +```gwt +Given a publication record "pub-123" with status "dead_letter" and attemptCount 5 +When retrying publication "pub-123" +Then the record attemptCount should be 6 +And lastAttemptAt should be updated +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-013-on-complete-updates-status-to-delivered-on-success.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-013-on-complete-updates-status-to-delivered-on-success.sdp.md index cc6d422a..f4fbe274 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-013-on-complete-updates-status-to-delivered-on-success.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-013-on-complete-updates-status-to-delivered-on-success.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "onComplete updates status to delivered on success" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature +- outcome: Executable scenario: onComplete updates status to delivered on success + +```gwt +Given a publication "pub-123" in pending state +And delivery action succeeds +When onComplete callback is invoked with success +Then publication status should be "delivered" +And deliveredAt timestamp should be set +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-014-on-complete-increments-attempt-count-on-failure.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-014-on-complete-increments-attempt-count-on-failure.sdp.md index 5b28ef49..ac9379d8 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-014-on-complete-increments-attempt-count-on-failure.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-014-on-complete-increments-attempt-count-on-failure.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "onComplete increments attemptCount on failure" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature +- outcome: Executable scenario: onComplete increments attemptCount on failure + +```gwt +Given a publication "pub-123" with attemptCount 2 +And delivery action fails +When onComplete callback is invoked with failure +Then publication attemptCount should be 3 +And status should remain "pending" if under maxAttempts +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-015-on-complete-creates-dead-letter-after-max-retries.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-015-on-complete-creates-dead-letter-after-max-retries.sdp.md index 9a690897..948b42a5 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-015-on-complete-creates-dead-letter-after-max-retries.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-015-on-complete-creates-dead-letter-after-max-retries.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "onComplete creates dead letter after max retries" from packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature +- outcome: Executable scenario: onComplete creates dead letter after max retries + +```gwt +Given a publication "pub-123" with attemptCount at maxAttempts +And delivery action fails +When onComplete callback is invoked with failure +Then publication status should be "dead_letter" +And error details should be recorded +``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.sdp.md index d31127ce..972262ff 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Cross-context events use Workpool-backed publication with tracking, retry, and dead letter handling. Covers Rules 3 and 7 from EventStoreDurability spec. (test carrier: packages/platform-core/tests/features/behavior/event-store-durability/durable-publication.feature) +- outcome: Durable Cross-Context Event Publication diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-001-command-idempotency-key-uses-command-type-entity-id-command-id-format.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-001-command-idempotency-key-uses-command-type-entity-id-command-id-format.sdp.md index 4beb7d3a..dcd43171 100644 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-001-command-idempotency-key-uses-command-type-entity-id-command-id-format.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-001-command-idempotency-key-uses-command-type-entity-id-command-id-format.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Command idempotency key uses commandType:entityId:commandId format" from packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature +- outcome: Executable scenario: Command idempotency key uses commandType:entityId:commandId format + +```gwt +Given the feature fixture is in place +When building command idempotency key with type "SubmitOrder", entity "ord-123", command "cmd-456" +Then the idempotency key should be "SubmitOrder:ord-123:cmd-456" +``` diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-002-action-idempotency-key-uses-action-type-entity-id-format.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-002-action-idempotency-key-uses-action-type-entity-id-format.sdp.md index 03d0d026..2e1c3f7b 100644 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-002-action-idempotency-key-uses-action-type-entity-id-format.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-002-action-idempotency-key-uses-action-type-entity-id-format.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Action idempotency key uses actionType:entityId format" from packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature +- outcome: Executable scenario: Action idempotency key uses actionType:entityId format + +```gwt +Given the feature fixture is in place +When building action idempotency key with type "payment" and entity "ord-123" +Then the idempotency key should be "payment:ord-123" +``` diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-003-saga-step-idempotency-key-uses-saga-type-saga-id-step-format.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-003-saga-step-idempotency-key-uses-saga-type-saga-id-step-format.sdp.md index 83fb35d1..a501c4c9 100644 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-003-saga-step-idempotency-key-uses-saga-type-saga-id-step-format.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-003-saga-step-idempotency-key-uses-saga-type-saga-id-step-format.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Saga step idempotency key uses sagaType:sagaId:step format" from packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature +- outcome: Executable scenario: Saga step idempotency key uses sagaType:sagaId:step format + +```gwt +Given the feature fixture is in place +When building saga step idempotency key with type "OrderFulfillment", id "saga-789", step "reserveStock" +Then the idempotency key should be "OrderFulfillment:saga-789:reserveStock" +``` diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-004-scheduled-job-idempotency-key-uses-job-type-schedule-id-timestamp-format.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-004-scheduled-job-idempotency-key-uses-job-type-schedule-id-timestamp-format.sdp.md index 77cd6564..32499499 100644 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-004-scheduled-job-idempotency-key-uses-job-type-schedule-id-timestamp-format.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-004-scheduled-job-idempotency-key-uses-job-type-schedule-id-timestamp-format.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Scheduled job idempotency key uses jobType:scheduleId:timestamp format" from packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature +- outcome: Executable scenario: Scheduled job idempotency key uses jobType:scheduleId:timestamp format + +```gwt +Given the feature fixture is in place +When building scheduled job idempotency key with type "expireReservations", schedule "job-001", timestamp 1704067200 +Then the idempotency key should be "expireReservations:job-001:1704067200" +``` diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-005-first-append-with-idempotency-key-succeeds.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-005-first-append-with-idempotency-key-succeeds.sdp.md index 93c6fa64..a32b8fcf 100644 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-005-first-append-with-idempotency-key-succeeds.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-005-first-append-with-idempotency-key-succeeds.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "First append with idempotency key succeeds" from packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature +- outcome: Executable scenario: First append with idempotency key succeeds + +```gwt +Given no existing event for idempotency key "payment:ord-123" +When calling idempotentAppendEvent with key "payment:ord-123" +Then the append result status should be "appended" +And a new event ID should be generated +``` diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-006-duplicate-append-returns-existing-event.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-006-duplicate-append-returns-existing-event.sdp.md index 4f67f2e3..28c507c5 100644 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-006-duplicate-append-returns-existing-event.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-006-duplicate-append-returns-existing-event.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Duplicate append returns existing event" from packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature +- outcome: Executable scenario: Duplicate append returns existing event + +```gwt +Given an existing event with idempotency key "payment:ord-123" and ID "evt-456" +When calling idempotentAppendEvent with key "payment:ord-123" +Then the append result status should be "duplicate" +And the result event ID should be "evt-456" +``` diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-007-same-key-with-different-payload-is-rejected.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-007-same-key-with-different-payload-is-rejected.sdp.md index 410b8fcd..8367c188 100644 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-007-same-key-with-different-payload-is-rejected.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-007-same-key-with-different-payload-is-rejected.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Same key with different payload is rejected" from packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature +- outcome: Executable scenario: Same key with different payload is rejected + +```gwt +Given an existing event with idempotency key "payment:ord-123" and payload chargeId "ch-legacy" +And appendToStream reports an audited idempotency conflict for existing event "evt-456" +When calling idempotentAppendEvent with key "payment:ord-123" and payload chargeId "ch-new" +Then an idempotency conflict error should be thrown +``` diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-008-different-idempotency-keys-create-separate-events.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-008-different-idempotency-keys-create-separate-events.sdp.md index a48ab08b..0081ecea 100644 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-008-different-idempotency-keys-create-separate-events.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-008-different-idempotency-keys-create-separate-events.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Different idempotency keys create separate events" from packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature +- outcome: Executable scenario: Different idempotency keys create separate events + +```gwt +Given no existing event for idempotency key "payment:ord-456" +When calling idempotentAppendEvent with key "payment:ord-456" +Then the append result status should be "appended" +``` diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-009-occ-conflict-with-duplicate-on-recheck-returns-duplicate.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-009-occ-conflict-with-duplicate-on-recheck-returns-duplicate.sdp.md index 2d7f2314..35409e9f 100644 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-009-occ-conflict-with-duplicate-on-recheck-returns-duplicate.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-009-occ-conflict-with-duplicate-on-recheck-returns-duplicate.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "OCC conflict with duplicate on recheck returns duplicate" from packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature +- outcome: Executable scenario: OCC conflict with duplicate on recheck returns duplicate + +```gwt +Given no initial event but duplicate appears on recheck for key "payment:ord-123" +When calling idempotentAppendEvent with OCC conflict +Then the append result status should be "duplicate" +``` diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-010-true-occ-conflict-throws-error.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-010-true-occ-conflict-throws-error.sdp.md index 14cbfea6..1add659c 100644 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-010-true-occ-conflict-throws-error.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-010-true-occ-conflict-throws-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "True OCC conflict throws error" from packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature +- outcome: Executable scenario: True OCC conflict throws error + +```gwt +Given no event exists and no duplicate on recheck for key "payment:ord-123" +When calling idempotentAppendEvent with true OCC conflict +Then an OCC conflict error should be thrown with version info +``` diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.sdp.md index ad158260..cf9737c7 100644 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Ensures events are only appended once even when the append operation is retried. This pattern prevents duplicate events from corrupting projections and causing double-processing in downstream systems. (test carrier: packages/platform-core/tests/features/behavior/event-store-durability/idempotent-append.feature) +- outcome: Idempotent Event Append diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-001-build-intent-key-generates-correct-format.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-001-build-intent-key-generates-correct-format.sdp.md index a1828fd9..573c62fe 100644 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-001-build-intent-key-generates-correct-format.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-001-build-intent-key-generates-correct-format.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "buildIntentKey generates correct format" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature +- outcome: Executable scenario: buildIntentKey generates correct format + +```gwt +Given the feature fixture is in place +When building intent key for operation "OrderSubmission", stream "Order:ord-123", timestamp 1704067200000 +Then the intent key should be "OrderSubmission:Order:ord-123:1704067200000" +``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-002-intent-key-handles-various-operation-types.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-002-intent-key-handles-various-operation-types.sdp.md index 7ab79dbe..d156ca3d 100644 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-002-intent-key-handles-various-operation-types.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-002-intent-key-handles-various-operation-types.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Intent key handles various operation types" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature +- outcome: Executable scenario: Intent key handles various operation types + +```gwt +Given the feature fixture is in place +When building intent key for operation "value", stream "value:value", timestamp value +Then the intent key should be "value" +``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-003-record-intent-creates-intent-event-with-correct-type.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-003-record-intent-creates-intent-event-with-correct-type.sdp.md index c7368d7d..63a615ed 100644 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-003-record-intent-creates-intent-event-with-correct-type.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-003-record-intent-creates-intent-event-with-correct-type.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "recordIntent creates intent event with correct type" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature +- outcome: Executable scenario: recordIntent creates intent event with correct type + +```gwt +Given a mock context for intent recording +When recording intent for operation "OrderSubmission" with timeout 300000ms +Then an event of type "OrderSubmissionStarted" should be created +And the event data should include the intent key and timeout +``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-004-record-intent-schedules-timeout-check.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-004-record-intent-schedules-timeout-check.sdp.md index 60644e83..caf1dc19 100644 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-004-record-intent-schedules-timeout-check.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-004-record-intent-schedules-timeout-check.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "recordIntent schedules timeout check" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature +- outcome: Executable scenario: recordIntent schedules timeout check + +```gwt +Given a mock context for intent recording +When recording intent with timeout 60000ms +Then scheduler.runAfter should be called with 60000ms delay +``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-005-record-intent-returns-intent-key-and-event-id.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-005-record-intent-returns-intent-key-and-event-id.sdp.md index cfa3962c..2cfc7404 100644 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-005-record-intent-returns-intent-key-and-event-id.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-005-record-intent-returns-intent-key-and-event-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "recordIntent returns intentKey and eventId" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature +- outcome: Executable scenario: recordIntent returns intentKey and eventId + +```gwt +Given a mock context for intent recording +When recording any intent +Then the result should contain intentKey and intentEventId +``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-006-record-completion-creates-success-event.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-006-record-completion-creates-success-event.sdp.md index b3fd415d..5455aa2d 100644 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-006-record-completion-creates-success-event.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-006-record-completion-creates-success-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "recordCompletion creates success event" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature +- outcome: Executable scenario: recordCompletion creates success event + +```gwt +Given a mock context for completion recording +When recording completion with status "success" for intent "OrderSubmission:Order:ord-123:1704067200000" +Then an event of type "OrderSubmissionCompleted" should be created +``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-007-record-completion-creates-failure-event-with-error.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-007-record-completion-creates-failure-event-with-error.sdp.md index dc3adda9..8706e834 100644 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-007-record-completion-creates-failure-event-with-error.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-007-record-completion-creates-failure-event-with-error.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "recordCompletion creates failure event with error" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature +- outcome: Executable scenario: recordCompletion creates failure event with error + +```gwt +Given a mock context for completion recording +When recording completion with status "failure" and error "Validation failed" +Then an event of type "OrderSubmissionFailed" should be created +And the event data should include error "Validation failed" +``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-008-record-completion-creates-abandonment-event.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-008-record-completion-creates-abandonment-event.sdp.md index 0edc7326..948e8302 100644 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-008-record-completion-creates-abandonment-event.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-008-record-completion-creates-abandonment-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "recordCompletion creates abandonment event" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature +- outcome: Executable scenario: recordCompletion creates abandonment event + +```gwt +Given a mock context for completion recording +When recording completion with status "abandoned" for intent "OrderSubmission:Order:ord-123:1704067200000" +Then an event of type "OrderSubmissionAbandoned" should be created +``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-009-check-intent-timeout-returns-already-resolved-when-completion-exists.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-009-check-intent-timeout-returns-already-resolved-when-completion-exists.sdp.md index 3cacd5fd..a49b7f58 100644 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-009-check-intent-timeout-returns-already-resolved-when-completion-exists.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-009-check-intent-timeout-returns-already-resolved-when-completion-exists.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "checkIntentTimeout returns already_resolved when completion exists" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature +- outcome: Executable scenario: checkIntentTimeout returns already_resolved when completion exists + +```gwt +Given a mock context where completion exists for the intent +When calling checkIntentTimeout +Then the result status should be "already_resolved" +And no new event should be created +``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-010-check-intent-timeout-creates-abandonment-when-no-completion.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-010-check-intent-timeout-creates-abandonment-when-no-completion.sdp.md index 6d9ffc72..fac8369e 100644 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-010-check-intent-timeout-creates-abandonment-when-no-completion.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-010-check-intent-timeout-creates-abandonment-when-no-completion.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "checkIntentTimeout creates abandonment when no completion" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature +- outcome: Executable scenario: checkIntentTimeout creates abandonment when no completion + +```gwt +Given a mock context where no completion exists +When calling checkIntentTimeout +Then the result status should be "abandoned" +And an abandonment event should be created +``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-011-check-intent-timeout-is-idempotent.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-011-check-intent-timeout-is-idempotent.sdp.md index 74e5e6d1..763db78c 100644 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-011-check-intent-timeout-is-idempotent.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-011-check-intent-timeout-is-idempotent.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "checkIntentTimeout is idempotent" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature +- outcome: Executable scenario: checkIntentTimeout is idempotent + +```gwt +Given a mock context where abandonment completion already exists +When calling checkIntentTimeout again +Then the result status should be "already_resolved" +``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-012-query-orphaned-intents-returns-intents-without-completion.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-012-query-orphaned-intents-returns-intents-without-completion.sdp.md index c4ca2145..0fa12b6f 100644 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-012-query-orphaned-intents-returns-intents-without-completion.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-012-query-orphaned-intents-returns-intents-without-completion.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "queryOrphanedIntents returns intents without completion" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature +- outcome: Executable scenario: queryOrphanedIntents returns intents without completion + +```gwt +Given 3 intent events where 1 has no completion +When querying orphaned intents older than 300000ms +Then the result should contain 1 orphaned intent +And each orphan should include timeSinceIntent +``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-013-query-orphaned-intents-filters-by-operation-type.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-013-query-orphaned-intents-filters-by-operation-type.sdp.md index a10dc957..b25f7e94 100644 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-013-query-orphaned-intents-filters-by-operation-type.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-013-query-orphaned-intents-filters-by-operation-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "queryOrphanedIntents filters by operation type" from packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature +- outcome: Executable scenario: queryOrphanedIntents filters by operation type + +```gwt +Given orphaned intents for multiple operation types +When querying with operationType filter "OrderSubmission" +Then the query should filter by operation type +``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.sdp.md index 8015d88f..1753bc05 100644 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Records intent before long-running operations and completion after success/failure. Enables timeout detection, reconciliation, and audit trail for multi-step processes. (test carrier: packages/platform-core/tests/features/behavior/event-store-durability/intent-completion.feature) +- outcome: Intent and Completion Bracketing diff --git a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-001-create-outbox-handler-returns-a-callable-function.sdp.md b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-001-create-outbox-handler-returns-a-callable-function.sdp.md index 81376097..c8fcfe21 100644 --- a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-001-create-outbox-handler-returns-a-callable-function.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-001-create-outbox-handler-returns-a-callable-function.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "createOutboxHandler returns a callable function" from packages/platform-core/tests/features/behavior/event-store-durability/outbox-handler.feature +- outcome: Executable scenario: createOutboxHandler returns a callable function + +```gwt +Given the feature fixture is in place +When creating an outbox handler with standard configuration +Then the result should be a function +``` diff --git a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-002-outbox-handler-extracts-idempotency-key-from-context.sdp.md b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-002-outbox-handler-extracts-idempotency-key-from-context.sdp.md index 3d701075..19467ec9 100644 --- a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-002-outbox-handler-extracts-idempotency-key-from-context.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-002-outbox-handler-extracts-idempotency-key-from-context.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Outbox handler extracts idempotency key from context" from packages/platform-core/tests/features/behavior/event-store-durability/outbox-handler.feature +- outcome: Executable scenario: Outbox handler extracts idempotency key from context + +```gwt +Given an outbox handler configured to use orderId for idempotency key +When processing a success result with orderId "ord-123" +Then the idempotency key should be "payment:ord-123" +``` diff --git a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-003-outbox-handler-builds-payment-completed-event-from-success-result.sdp.md b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-003-outbox-handler-builds-payment-completed-event-from-success-result.sdp.md index a0802f1a..b706dfee 100644 --- a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-003-outbox-handler-builds-payment-completed-event-from-success-result.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-003-outbox-handler-builds-payment-completed-event-from-success-result.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Outbox handler builds PaymentCompleted event from success result" from packages/platform-core/tests/features/behavior/event-store-durability/outbox-handler.feature +- outcome: Executable scenario: Outbox handler builds PaymentCompleted event from success result + +```gwt +Given an outbox handler for payment events +When processing success result with chargeId "ch-456" and orderId "ord-123" +Then the event type should be "PaymentCompleted" +And the event data should contain chargeId "ch-456" +``` diff --git a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-004-outbox-handler-builds-payment-failed-event-from-failure-result.sdp.md b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-004-outbox-handler-builds-payment-failed-event-from-failure-result.sdp.md index db80b67e..32fb42bf 100644 --- a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-004-outbox-handler-builds-payment-failed-event-from-failure-result.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-004-outbox-handler-builds-payment-failed-event-from-failure-result.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Outbox handler builds PaymentFailed event from failure result" from packages/platform-core/tests/features/behavior/event-store-durability/outbox-handler.feature +- outcome: Executable scenario: Outbox handler builds PaymentFailed event from failure result + +```gwt +Given an outbox handler for payment events +When processing failure result with error "Card declined" and orderId "ord-123" +Then the event type should be "PaymentFailed" +And the event data should contain error "Card declined" +``` diff --git a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-005-outbox-handler-calls-idempotent-append-event-internally.sdp.md b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-005-outbox-handler-calls-idempotent-append-event-internally.sdp.md index 4d730c14..97abc953 100644 --- a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-005-outbox-handler-calls-idempotent-append-event-internally.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-005-outbox-handler-calls-idempotent-append-event-internally.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Outbox handler calls idempotentAppendEvent internally" from packages/platform-core/tests/features/behavior/event-store-durability/outbox-handler.feature +- outcome: Executable scenario: Outbox handler calls idempotentAppendEvent internally + +```gwt +Given an outbox handler with mock event store +When processing a result with orderId "ord-123" +Then idempotentAppendEvent should be invoked +And the event should include bounded context "orders" +``` diff --git a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-006-outbox-handler-completes-without-error-for-duplicates.sdp.md b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-006-outbox-handler-completes-without-error-for-duplicates.sdp.md index a204586b..ad73f749 100644 --- a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-006-outbox-handler-completes-without-error-for-duplicates.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-006-outbox-handler-completes-without-error-for-duplicates.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Outbox handler completes without error for duplicates" from packages/platform-core/tests/features/behavior/event-store-durability/outbox-handler.feature +- outcome: Executable scenario: Outbox handler completes without error for duplicates + +```gwt +Given an outbox handler where idempotent append returns duplicate +When processing a result with existing idempotency key +Then the handler should complete successfully +``` diff --git a/specs/behavior/platform-core/event-store-durability/outbox-handler.sdp.md b/specs/behavior/platform-core/event-store-durability/outbox-handler.sdp.md index 1a1f1bb7..35f7c29b 100644 --- a/specs/behavior/platform-core/event-store-durability/outbox-handler.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/outbox-handler.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Creates durable onComplete handlers for capturing action results as domain events. The outbox pattern ensures that external API results (success or failure) are reliably captured as events using idempotent append. (test carrier: packages/platform-core/tests/features/behavior/event-store-durability/outbox-handler.feature) +- outcome: Outbox Handler Pattern diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-001-successful-processing-creates-no-poison-record.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-001-successful-processing-creates-no-poison-record.sdp.md index 96dc013d..c793d646 100644 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-001-successful-processing-creates-no-poison-record.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-001-successful-processing-creates-no-poison-record.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Successful processing creates no poison record" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature +- outcome: Executable scenario: Successful processing creates no poison record + +```gwt +Given a poison event handler wrapping a successful projection +When processing an event +Then no poison record should be created +And the handler should complete successfully +``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-002-first-failure-records-attempt-but-does-not-quarantine.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-002-first-failure-records-attempt-but-does-not-quarantine.sdp.md index 1dd57505..0b4b48f9 100644 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-002-first-failure-records-attempt-but-does-not-quarantine.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-002-first-failure-records-attempt-but-does-not-quarantine.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "First failure records attempt but does not quarantine" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature +- outcome: Executable scenario: First failure records attempt but does not quarantine + +```gwt +Given a poison event handler with maxAttempts 3 and no existing record +When processing an event that throws an error +Then a poison record should be created with attemptCount 1 +And the record status should be "pending" +And the original error should be re-thrown +``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-003-event-becomes-quarantined-after-max-retries.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-003-event-becomes-quarantined-after-max-retries.sdp.md index ae0e2aa0..50d32c65 100644 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-003-event-becomes-quarantined-after-max-retries.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-003-event-becomes-quarantined-after-max-retries.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Event becomes quarantined after max retries" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature +- outcome: Executable scenario: Event becomes quarantined after max retries + +```gwt +Given a poison event handler with maxAttempts 3 and existing record with 2 attempts +When processing an event that throws an error +Then the poison record should be updated to status "quarantined" +And the error should NOT be re-thrown +``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-004-quarantined-event-is-silently-skipped.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-004-quarantined-event-is-silently-skipped.sdp.md index 888b4d7f..024e76a2 100644 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-004-quarantined-event-is-silently-skipped.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-004-quarantined-event-is-silently-skipped.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Quarantined event is silently skipped" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature +- outcome: Executable scenario: Quarantined event is silently skipped + +```gwt +Given a poison event handler with a quarantined record for the event +When processing the quarantined event +Then the projection handler should NOT be called +And no error should be thrown +``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-005-on-quarantine-callback-invoked-when-alert-on-quarantine-is-true.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-005-on-quarantine-callback-invoked-when-alert-on-quarantine-is-true.sdp.md index 93f43b61..dabf487f 100644 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-005-on-quarantine-callback-invoked-when-alert-on-quarantine-is-true.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-005-on-quarantine-callback-invoked-when-alert-on-quarantine-is-true.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "onQuarantine callback invoked when alertOnQuarantine is true" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature +- outcome: Executable scenario: onQuarantine callback invoked when alertOnQuarantine is true + +```gwt +Given a poison handler with alertOnQuarantine true and onQuarantine callback +When an event becomes quarantined +Then the onQuarantine callback should be invoked with event details +``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-006-on-quarantine-not-invoked-when-alert-on-quarantine-is-false.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-006-on-quarantine-not-invoked-when-alert-on-quarantine-is-false.sdp.md index ad05fe6f..da55f9ef 100644 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-006-on-quarantine-not-invoked-when-alert-on-quarantine-is-false.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-006-on-quarantine-not-invoked-when-alert-on-quarantine-is-false.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "onQuarantine NOT invoked when alertOnQuarantine is false" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature +- outcome: Executable scenario: onQuarantine NOT invoked when alertOnQuarantine is false + +```gwt +Given a poison handler with alertOnQuarantine false +When an event becomes quarantined +Then the onQuarantine callback should NOT be invoked +``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-007-is-event-quarantined-returns-true-for-quarantined-event.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-007-is-event-quarantined-returns-true-for-quarantined-event.sdp.md index dc214d88..2a6bc448 100644 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-007-is-event-quarantined-returns-true-for-quarantined-event.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-007-is-event-quarantined-returns-true-for-quarantined-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isEventQuarantined returns true for quarantined event" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature +- outcome: Executable scenario: isEventQuarantined returns true for quarantined event + +```gwt +Given a quarantined poison record for event "evt-123" +When checking if event "evt-123" is quarantined for projection "orderSummary" +Then the result should be true +``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-008-is-event-quarantined-returns-false-for-non-quarantined-event.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-008-is-event-quarantined-returns-false-for-non-quarantined-event.sdp.md index 8f35d2da..be5f36d7 100644 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-008-is-event-quarantined-returns-false-for-non-quarantined-event.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-008-is-event-quarantined-returns-false-for-non-quarantined-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isEventQuarantined returns false for non-quarantined event" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature +- outcome: Executable scenario: isEventQuarantined returns false for non-quarantined event + +```gwt +Given a pending poison record for event "evt-123" +When checking if event "evt-123" is quarantined for projection "orderSummary" +Then the result should be false +``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-009-get-poison-event-record-returns-normalized-record.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-009-get-poison-event-record-returns-normalized-record.sdp.md index 02d8628e..c355eed4 100644 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-009-get-poison-event-record-returns-normalized-record.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-009-get-poison-event-record-returns-normalized-record.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "getPoisonEventRecord returns normalized record" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature +- outcome: Executable scenario: getPoisonEventRecord returns normalized record + +```gwt +Given a poison record with attemptCount 3 and error "Test error" +When getting poison record for the event +Then the result should have attempts 3 and lastError "Test error" +``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-010-get-poison-event-record-returns-null-for-non-existent-event.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-010-get-poison-event-record-returns-null-for-non-existent-event.sdp.md index 075e33fa..30f7588c 100644 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-010-get-poison-event-record-returns-null-for-non-existent-event.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-010-get-poison-event-record-returns-null-for-non-existent-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "getPoisonEventRecord returns null for non-existent event" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature +- outcome: Executable scenario: getPoisonEventRecord returns null for non-existent event + +```gwt +Given no poison record exists for event "evt-999" +When getting poison record for event "evt-999" +Then the result should be null +``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-011-unquarantine-event-clears-quarantine-status.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-011-unquarantine-event-clears-quarantine-status.sdp.md index 2fb0bed8..a18dfa80 100644 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-011-unquarantine-event-clears-quarantine-status.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-011-unquarantine-event-clears-quarantine-status.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "unquarantineEvent clears quarantine status" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature +- outcome: Executable scenario: unquarantineEvent clears quarantine status + +```gwt +Given a quarantined poison record for event "evt-123" +When calling unquarantineEvent +Then the result status should be "unquarantined" +And the record should be updated to status "replayed" with attemptCount 0 +``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-012-unquarantine-event-returns-not-found-for-missing-event.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-012-unquarantine-event-returns-not-found-for-missing-event.sdp.md index 29901302..54321e8e 100644 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-012-unquarantine-event-returns-not-found-for-missing-event.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-012-unquarantine-event-returns-not-found-for-missing-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "unquarantineEvent returns not_found for missing event" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature +- outcome: Executable scenario: unquarantineEvent returns not_found for missing event + +```gwt +Given no poison record exists for event "evt-999" +When calling unquarantineEvent for event "evt-999" +Then the result status should be "not_found" +``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-013-unquarantine-event-returns-not-quarantined-for-pending-event.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-013-unquarantine-event-returns-not-quarantined-for-pending-event.sdp.md index 9279a291..a110f94a 100644 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-013-unquarantine-event-returns-not-quarantined-for-pending-event.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-013-unquarantine-event-returns-not-quarantined-for-pending-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "unquarantineEvent returns not_quarantined for pending event" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature +- outcome: Executable scenario: unquarantineEvent returns not_quarantined for pending event + +```gwt +Given a pending poison record for event "evt-123" +When calling unquarantineEvent +Then the result status should be "not_quarantined" +``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-014-list-quarantined-events-returns-quarantined-records.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-014-list-quarantined-events-returns-quarantined-records.sdp.md index f2632ce8..bedb76be 100644 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-014-list-quarantined-events-returns-quarantined-records.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-014-list-quarantined-events-returns-quarantined-records.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "listQuarantinedEvents returns quarantined records" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature +- outcome: Executable scenario: listQuarantinedEvents returns quarantined records + +```gwt +Given 3 quarantined poison records +When listing quarantined events +Then the result should contain 3 records with eventId, projectionName, and attempts +``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-015-list-quarantined-events-filters-by-projection.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-015-list-quarantined-events-filters-by-projection.sdp.md index dca64501..8b6215c3 100644 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-015-list-quarantined-events-filters-by-projection.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-015-list-quarantined-events-filters-by-projection.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "listQuarantinedEvents filters by projection" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature +- outcome: Executable scenario: listQuarantinedEvents filters by projection + +```gwt +Given quarantined records for multiple projections +When listing quarantined events with projectionName "orderSummary" +Then the query should filter by projection name +``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-016-get-poison-event-stats-returns-aggregated-statistics.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-016-get-poison-event-stats-returns-aggregated-statistics.sdp.md index b2a51ee6..744aba40 100644 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-016-get-poison-event-stats-returns-aggregated-statistics.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-016-get-poison-event-stats-returns-aggregated-statistics.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "getPoisonEventStats returns aggregated statistics" from packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature +- outcome: Executable scenario: getPoisonEventStats returns aggregated statistics + +```gwt +Given poison stats with totalQuarantined 10 and byProjection orderSummary:7, inventory:3 +When getting poison event stats +Then the result totalQuarantined should be 10 +And byProjection should contain orderSummary:7 and inventory:3 +``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.sdp.md index 833c5256..896418c6 100644 --- a/specs/behavior/platform-core/event-store-durability/poison-event.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/poison-event.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Handles events that repeatedly fail projection processing. After N failures, events are quarantined and skipped to prevent infinite retry loops. (test carrier: packages/platform-core/tests/features/behavior/event-store-durability/poison-event.feature) +- outcome: Poison Event Handling diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-001-creates-bus-with-empty-subscriptions.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-001-creates-bus-with-empty-subscriptions.sdp.md index 447591a5..37517a51 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-001-creates-bus-with-empty-subscriptions.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-001-creates-bus-with-empty-subscriptions.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Creates bus with empty subscriptions" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Creates bus with empty subscriptions + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with no subscriptions +When the scenario runs +Then getAllSubscriptions returns 0 subscriptions +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-002-creates-bus-with-subscriptions-sorted-by-priority.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-002-creates-bus-with-subscriptions-sorted-by-priority.sdp.md index b3ca3c30..ada7dd4f 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-002-creates-bus-with-subscriptions-sorted-by-priority.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-002-creates-bus-with-subscriptions-sorted-by-priority.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Creates bus with subscriptions sorted by priority" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Creates bus with subscriptions sorted by priority + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with subscriptions at priorities: +When the scenario runs +Then getAllSubscriptions returns 3 subscriptions in order: +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-003-returns-empty-result-when-no-subscriptions-match.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-003-returns-empty-result-when-no-subscriptions-match.sdp.md index d94967bc..cd6864ac 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-003-returns-empty-result-when-no-subscriptions-match.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-003-returns-empty-result-when-no-subscriptions-match.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Returns empty result when no subscriptions match" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Returns empty result when no subscriptions match + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with a subscription "order.handler" for event type "OrderCancelled" +When an "OrderSubmitted" event is published +Then the publish result has 0 matched subscriptions +And the triggered subscriptions list is empty +And the publish result is successful +And the workpool received 0 enqueue calls +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-004-enqueues-matching-subscriptions-via-workpool.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-004-enqueues-matching-subscriptions-via-workpool.sdp.md index 926895d9..976d141a 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-004-enqueues-matching-subscriptions-via-workpool.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-004-enqueues-matching-subscriptions-via-workpool.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Enqueues matching subscriptions via workpool" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Enqueues matching subscriptions via workpool + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with a subscription "order.handler" for event type "OrderSubmitted" +When an "OrderSubmitted" event is published +Then the publish result has 1 matched subscription +And the triggered subscriptions include "order.handler" +And the publish result is successful +And the workpool received 1 enqueue call +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-005-enqueues-multiple-matching-subscriptions.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-005-enqueues-multiple-matching-subscriptions.sdp.md index c091cc9f..ec5610d4 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-005-enqueues-multiple-matching-subscriptions.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-005-enqueues-multiple-matching-subscriptions.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Enqueues multiple matching subscriptions" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Enqueues multiple matching subscriptions + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with subscriptions for event type "OrderSubmitted": +When an "OrderSubmitted" event is published +Then the publish result has 2 matched subscriptions +And the triggered subscriptions are in order: +And the workpool received 2 enqueue calls +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-006-passes-transformed-args-to-workpool.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-006-passes-transformed-args-to-workpool.sdp.md index 5c235426..da76e2d7 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-006-passes-transformed-args-to-workpool.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-006-passes-transformed-args-to-workpool.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Passes transformed args to workpool" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Passes transformed args to workpool + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with a subscription "order.handler" for "OrderSubmitted" with a custom transform +When an "OrderSubmitted" event is published +Then the workpool received args with orderId "order_456" and eventType "OrderSubmitted" +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-007-includes-partition-key-in-workpool-context.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-007-includes-partition-key-in-workpool-context.sdp.md index 381ee49c..f107df98 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-007-includes-partition-key-in-workpool-context.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-007-includes-partition-key-in-workpool-context.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Includes partition key in workpool context" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Includes partition key in workpool context + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with a subscription "order.handler" for "OrderSubmitted" with a custom partition key +When an "OrderSubmitted" event is published +Then the workpool context has partition name "orderId" and value "order_456" +And the workpool context has globalPosition 1000 +And the workpool context has subscriptionName "order.handler" +And the workpool context has eventId "evt_test_123" +And the workpool context has eventType "OrderSubmitted" +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-008-uses-subscription-level-on-complete-when-provided.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-008-uses-subscription-level-on-complete-when-provided.sdp.md index b7508b2a..37e01b01 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-008-uses-subscription-level-on-complete-when-provided.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-008-uses-subscription-level-on-complete-when-provided.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Uses subscription-level onComplete when provided" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Uses subscription-level onComplete when provided + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with a subscription "order.handler" for "OrderSubmitted" with subscription-level onComplete +When an "OrderSubmitted" event is published +Then the workpool options onComplete is the subscription onComplete handler +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-009-uses-default-on-complete-from-config-when-subscription-has-none.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-009-uses-default-on-complete-from-config-when-subscription-has-none.sdp.md index 9d52f19a..5c2cb9cb 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-009-uses-default-on-complete-from-config-when-subscription-has-none.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-009-uses-default-on-complete-from-config-when-subscription-has-none.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Uses default onComplete from config when subscription has none" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Uses default onComplete from config when subscription has none + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with a subscription "order.handler" for "OrderSubmitted" and a default onComplete config +When an "OrderSubmitted" event is published +Then the workpool options onComplete is the default onComplete handler +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-010-does-not-include-on-complete-if-neither-subscription-nor-config-provides-i.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-010-does-not-include-on-complete-if-neither-subscription-nor-config-provides-i.sdp.md index 32550e36..771e3e15 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-010-does-not-include-on-complete-if-neither-subscription-nor-config-provides-i.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-010-does-not-include-on-complete-if-neither-subscription-nor-config-provides-i.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Does not include onComplete if neither subscription nor config provides it" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Does not include onComplete if neither subscription nor config provides it + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with a subscription "order.handler" for "OrderSubmitted" without any onComplete +When an "OrderSubmitted" event is published +Then the workpool options onComplete is undefined +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-011-returns-true-for-indexed-event-type-and-false-for-unsubscribed-type.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-011-returns-true-for-indexed-event-type-and-false-for-unsubscribed-type.sdp.md index fabe92d2..0c8ec3bb 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-011-returns-true-for-indexed-event-type-and-false-for-unsubscribed-type.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-011-returns-true-for-indexed-event-type-and-false-for-unsubscribed-type.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for indexed event type and false for unsubscribed type" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Returns true for indexed event type and false for unsubscribed type + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with a subscription "order.handler" for event type "OrderSubmitted" +When the scenario runs +Then hasSubscribersFor "OrderSubmitted" returns true +And hasSubscribersFor "OrderCancelled" returns false +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-012-returns-true-for-any-event-type-when-wildcard-subscription-exists.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-012-returns-true-for-any-event-type-when-wildcard-subscription-exists.sdp.md index 20155bbf..f7072a89 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-012-returns-true-for-any-event-type-when-wildcard-subscription-exists.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-012-returns-true-for-any-event-type-when-wildcard-subscription-exists.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for any event type when wildcard subscription exists" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Returns true for any event type when wildcard subscription exists + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with a wildcard subscription "wildcard.handler" +When the scenario runs +Then hasSubscribersFor "AnyEventType" returns true +And hasSubscribersFor "AnotherType" returns true +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-013-returns-false-when-no-subscriptions-exist.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-013-returns-false-when-no-subscriptions-exist.sdp.md index 56bc3070..a6463047 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-013-returns-false-when-no-subscriptions-exist.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-013-returns-false-when-no-subscriptions-exist.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when no subscriptions exist" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Returns false when no subscriptions exist + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with no subscriptions +When the scenario runs +Then hasSubscribersFor "SomeEvent" returns false +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-014-returns-all-subscriptions.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-014-returns-all-subscriptions.sdp.md index 257f06b0..cbe8a114 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-014-returns-all-subscriptions.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-014-returns-all-subscriptions.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns all subscriptions" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Returns all subscriptions + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with subscriptions "handler1" and "handler2" +When the scenario runs +Then getAllSubscriptions returns 2 subscriptions +And getAllSubscriptions contains "handler1" and "handler2" +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-015-returns-empty-array-when-no-subscriptions.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-015-returns-empty-array-when-no-subscriptions.sdp.md index f71a7887..140e90a6 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-015-returns-empty-array-when-no-subscriptions.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-015-returns-empty-array-when-no-subscriptions.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns empty array when no subscriptions" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Returns empty array when no subscriptions + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with no subscriptions +When the scenario runs +Then getAllSubscriptions returns an empty array +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-016-returns-subscriptions-matching-event-type-filter.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-016-returns-subscriptions-matching-event-type-filter.sdp.md index 0470948d..60ac2f69 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-016-returns-subscriptions-matching-event-type-filter.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-016-returns-subscriptions-matching-event-type-filter.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns subscriptions matching event type filter" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Returns subscriptions matching event type filter + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with event-type subscriptions: +When getMatchingSubscriptions is called with eventTypes "OrderSubmitted" +Then the matching result has 1 subscription named "order.handler" +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-017-returns-subscriptions-matching-category-filter.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-017-returns-subscriptions-matching-category-filter.sdp.md index a979f2ce..e277c944 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-017-returns-subscriptions-matching-category-filter.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-017-returns-subscriptions-matching-category-filter.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns subscriptions matching category filter" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Returns subscriptions matching category filter + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with category subscriptions: +When getMatchingSubscriptions is called with categories "integration" +Then the matching result has 1 subscription named "integration.handler" +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-018-publishes-to-subscriptions-in-priority-order.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-018-publishes-to-subscriptions-in-priority-order.sdp.md index 0190910e..6baacf54 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-018-publishes-to-subscriptions-in-priority-order.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-018-publishes-to-subscriptions-in-priority-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Publishes to subscriptions in priority order" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Publishes to subscriptions in priority order + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with subscriptions for event type "TestEvent": +When a "TestEvent" event is published +Then the triggered subscriptions are in order: +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-019-propagates-workpool-errors-when-enqueue-fails.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-019-propagates-workpool-errors-when-enqueue-fails.sdp.md index 89145334..fde9306c 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-019-propagates-workpool-errors-when-enqueue-fails.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-019-propagates-workpool-errors-when-enqueue-fails.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Propagates workpool errors when enqueue fails" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Propagates workpool errors when enqueue fails + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with a failing workpool and subscription "order.handler" for "OrderSubmitted" +When an "OrderSubmitted" event is published +Then the publish rejects with error "Workpool unavailable" +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-020-does-not-enqueue-subsequent-subscriptions-if-earlier-enqueue-fails.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-020-does-not-enqueue-subsequent-subscriptions-if-earlier-enqueue-fails.sdp.md index 800f754e..3668d76c 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-020-does-not-enqueue-subsequent-subscriptions-if-earlier-enqueue-fails.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-020-does-not-enqueue-subsequent-subscriptions-if-earlier-enqueue-fails.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Does not enqueue subsequent subscriptions if earlier enqueue fails" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Does not enqueue subsequent subscriptions if earlier enqueue fails + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with a workpool that fails on second enqueue and 3 subscriptions for "OrderSubmitted" +When an "OrderSubmitted" event is published +Then the publish rejects with error "Second enqueue failed" +And the workpool enqueue was called 2 times +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-021-wildcard-subscriptions-match-any-event-type.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-021-wildcard-subscriptions-match-any-event-type.sdp.md index 6db396f6..47069c6d 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-021-wildcard-subscriptions-match-any-event-type.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-021-wildcard-subscriptions-match-any-event-type.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Wildcard subscriptions match any event type" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Wildcard subscriptions match any event type + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with a wildcard subscription "wildcard" +When events of different types are published: +Then every publish result includes "wildcard" in triggered subscriptions +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-022-wildcard-with-bounded-context-filter-only-matches-that-context.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-022-wildcard-with-bounded-context-filter-only-matches-that-context.sdp.md index 28f30ee6..201316d7 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-022-wildcard-with-bounded-context-filter-only-matches-that-context.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-022-wildcard-with-bounded-context-filter-only-matches-that-context.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Wildcard with bounded context filter only matches that context" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Wildcard with bounded context filter only matches that context + +```gwt +Given the module is imported from platform-core +And a ConvexEventBus with a subscription "orders.audit" filtered to bounded context "orders" +When events from different bounded contexts are published: +Then each publish result matches the expected subscription count +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-023-creates-event-bus-instance-with-empty-subscriptions.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-023-creates-event-bus-instance-with-empty-subscriptions.sdp.md index 48106f3a..f74849b7 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-023-creates-event-bus-instance-with-empty-subscriptions.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-023-creates-event-bus-instance-with-empty-subscriptions.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Creates EventBus instance with empty subscriptions" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Creates EventBus instance with empty subscriptions + +```gwt +Given the module is imported from platform-core +When createEventBus is called with empty subscriptions +Then the result is a ConvexEventBus instance +And getAllSubscriptions returns 0 subscriptions +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-024-creates-event-bus-with-config.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-024-creates-event-bus-with-config.sdp.md index 1646746f..b1b66597 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-024-creates-event-bus-with-config.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-024-creates-event-bus-with-config.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Creates EventBus with config" from packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature +- outcome: Executable scenario: Creates EventBus with config + +```gwt +Given the module is imported from platform-core +When createEventBus is called with a subscription and default onComplete config +Then the result is a ConvexEventBus instance +``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.sdp.md index 8a744feb..d073f8ad 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.sdp.md @@ -10,4 +10,19 @@ relations: ## Intent -- outcome: a ConvexEventBus that routes published events to matching subscription handlers via workpool so that event-driven communication is decoupled and reliable (test carrier: packages/platform-core/tests/features/behavior/eventbus/convex-event-bus.feature) +- actor: a platform developer +- outcome: a ConvexEventBus that routes published events to matching subscription handlers via workpool so that event-driven communication is decoupled and reliable + +## Behavior + +- rule: Constructor creates bus with subscriptions sorted by priority +- rule: publish() matches events to subscriptions and enqueues via workpool +- rule: publish() passes transformed args and partition context to workpool +- rule: publish() resolves onComplete from subscription or config default +- rule: hasSubscribersFor() checks event type and wildcard subscriptions +- rule: getAllSubscriptions() returns all registered subscriptions +- rule: getMatchingSubscriptions() filters subscriptions by criteria +- rule: publish() triggers subscriptions in priority order +- rule: publish() propagates workpool errors +- rule: Wildcard subscriptions match events regardless of type +- rule: createEventBus factory creates ConvexEventBus instances diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-001-builder-creates-subscription-with-name-and-handler.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-001-builder-creates-subscription-with-name-and-handler.sdp.md index a41638bb..0c20dd5c 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-001-builder-creates-subscription-with-name-and-handler.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-001-builder-creates-subscription-with-name-and-handler.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Builder creates subscription with name and handler" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: Builder creates subscription with name and handler + +```gwt +Given a SubscriptionBuilder with name "test.handler" and a mock handler +When the subscription is built +Then the subscription has name "test.handler" and the mock handler +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-002-builder-defaults-to-empty-filter.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-002-builder-defaults-to-empty-filter.sdp.md index 013b734f..f9020978 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-002-builder-defaults-to-empty-filter.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-002-builder-defaults-to-empty-filter.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Builder defaults to empty filter" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: Builder defaults to empty filter + +```gwt +Given a SubscriptionBuilder with name "test.handler" and a mock handler +When the subscription is built +Then the subscription filter is empty +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-003-builder-defaults-to-priority-100.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-003-builder-defaults-to-priority-100.sdp.md index 4a1d2579..7776358b 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-003-builder-defaults-to-priority-100.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-003-builder-defaults-to-priority-100.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Builder defaults to priority 100" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: Builder defaults to priority 100 + +```gwt +Given a SubscriptionBuilder with name "test.handler" and a mock handler +When the subscription is built +Then the subscription priority is 100 +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-004-builder-defaults-partition-key-to-stream-id.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-004-builder-defaults-partition-key-to-stream-id.sdp.md index 9f5bd088..8c0957db 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-004-builder-defaults-partition-key-to-stream-id.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-004-builder-defaults-partition-key-to-stream-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Builder defaults partition key to streamId" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: Builder defaults partition key to streamId + +```gwt +Given a SubscriptionBuilder with name "test.handler" and a mock handler +When the subscription is built +Then the partition key for a test event uses streamId with value "order_456" +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-005-for-event-types-sets-event-type-filter.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-005-for-event-types-sets-event-type-filter.sdp.md index ef548601..6fd567ad 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-005-for-event-types-sets-event-type-filter.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-005-for-event-types-sets-event-type-filter.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "forEventTypes sets event type filter" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: forEventTypes sets event type filter + +```gwt +Given a SubscriptionBuilder with name "test.handler" and a mock handler +When forEventTypes is called with "OrderSubmitted" and "OrderCancelled" and the subscription is built +Then the subscription filter eventTypes are: +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-006-for-categories-sets-category-filter.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-006-for-categories-sets-category-filter.sdp.md index 203e5dda..cbabcd62 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-006-for-categories-sets-category-filter.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-006-for-categories-sets-category-filter.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "forCategories sets category filter" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: forCategories sets category filter + +```gwt +Given a SubscriptionBuilder with name "test.handler" and a mock handler +When forCategories is called with "domain" and "integration" and the subscription is built +Then the subscription filter categories are: +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-007-for-bounded-contexts-sets-bounded-context-filter.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-007-for-bounded-contexts-sets-bounded-context-filter.sdp.md index 50de944e..285a361c 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-007-for-bounded-contexts-sets-bounded-context-filter.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-007-for-bounded-contexts-sets-bounded-context-filter.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "forBoundedContexts sets bounded context filter" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: forBoundedContexts sets bounded context filter + +```gwt +Given a SubscriptionBuilder with name "test.handler" and a mock handler +When forBoundedContexts is called with "orders" and "inventory" and the subscription is built +Then the subscription filter boundedContexts are: +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-008-for-stream-types-sets-stream-type-filter.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-008-for-stream-types-sets-stream-type-filter.sdp.md index 96814c8e..e2ea623a 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-008-for-stream-types-sets-stream-type-filter.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-008-for-stream-types-sets-stream-type-filter.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "forStreamTypes sets stream type filter" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: forStreamTypes sets stream type filter + +```gwt +Given a SubscriptionBuilder with name "test.handler" and a mock handler +When forStreamTypes is called with "Order" and "Product" and the subscription is built +Then the subscription filter streamTypes are: +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-009-chaining-multiple-filters-composes-them.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-009-chaining-multiple-filters-composes-them.sdp.md index 58e25e21..64c9980f 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-009-chaining-multiple-filters-composes-them.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-009-chaining-multiple-filters-composes-them.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Chaining multiple filters composes them" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: Chaining multiple filters composes them + +```gwt +Given a SubscriptionBuilder with name "test.handler" and a mock handler +When forEventTypes is called with "OrderSubmitted" and forCategories is called with "domain" and forBoundedContexts is called with "orders" and the subscription is built +Then the subscription filter has all three filter types set +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-010-with-on-complete-sets-the-on-complete-handler.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-010-with-on-complete-sets-the-on-complete-handler.sdp.md index 052cf6e5..e7d976e4 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-010-with-on-complete-sets-the-on-complete-handler.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-010-with-on-complete-sets-the-on-complete-handler.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "withOnComplete sets the onComplete handler" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: withOnComplete sets the onComplete handler + +```gwt +Given a SubscriptionBuilder with name "test.handler" and a mock handler +When withOnComplete is called with the mock onComplete handler and the subscription is built +Then the subscription onComplete is the mock onComplete handler +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-011-with-priority-sets-priority.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-011-with-priority-sets-priority.sdp.md index 5f187d66..a0e0338f 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-011-with-priority-sets-priority.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-011-with-priority-sets-priority.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "withPriority sets priority" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: withPriority sets priority + +```gwt +Given a SubscriptionBuilder with name "test.handler" and a mock handler +When withPriority is called with 50 and the subscription is built +Then the subscription priority is 50 +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-012-with-transform-sets-custom-transformer.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-012-with-transform-sets-custom-transformer.sdp.md index 82ef5ae1..9c8bf40c 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-012-with-transform-sets-custom-transformer.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-012-with-transform-sets-custom-transformer.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "withTransform sets custom transformer" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: withTransform sets custom transformer + +```gwt +Given a SubscriptionBuilder with name "test.handler" and a mock handler +When withTransform is called with a custom transformer and the subscription is built +Then toHandlerArgs returns the transformed output +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-013-with-partition-key-sets-custom-partition-key-extractor.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-013-with-partition-key-sets-custom-partition-key-extractor.sdp.md index ab2f01ed..a9d6de23 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-013-with-partition-key-sets-custom-partition-key-extractor.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-013-with-partition-key-sets-custom-partition-key-extractor.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "withPartitionKey sets custom partition key extractor" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: withPartitionKey sets custom partition key extractor + +```gwt +Given a SubscriptionBuilder with name "test.handler" and a mock handler +When withPartitionKey is called with a customerId extractor and the subscription is built +Then the partition key for an event with customerId "cust_123" returns name "customerId" and value "cust_123" +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-014-add-adds-a-subscription-to-the-registry.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-014-add-adds-a-subscription-to-the-registry.sdp.md index a57844ff..46da5334 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-014-add-adds-a-subscription-to-the-registry.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-014-add-adds-a-subscription-to-the-registry.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "add() adds a subscription to the registry" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: add() adds a subscription to the registry + +```gwt +Given an empty SubscriptionRegistry +When a subscription "test.handler" is added +Then the registry has 1 subscription with name "test.handler" +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-015-add-supports-chaining.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-015-add-supports-chaining.sdp.md index f8a5f04a..3e53fa2d 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-015-add-supports-chaining.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-015-add-supports-chaining.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "add() supports chaining" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: add() supports chaining + +```gwt +Given an empty SubscriptionRegistry +When subscriptions "handler1" and "handler2" are added via chaining +Then the registry has 2 subscriptions +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-016-add-throws-on-duplicate-subscription-name.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-016-add-throws-on-duplicate-subscription-name.sdp.md index a82ca3fe..b033e8c4 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-016-add-throws-on-duplicate-subscription-name.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-016-add-throws-on-duplicate-subscription-name.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "add() throws on duplicate subscription name" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: add() throws on duplicate subscription name + +```gwt +Given an empty SubscriptionRegistry +When a subscription "duplicate.name" is added +Then adding another subscription "duplicate.name" throws a duplicate error +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-017-subscribe-returns-builder-that-adds-to-registry-on-build.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-017-subscribe-returns-builder-that-adds-to-registry-on-build.sdp.md index 369493dd..28892077 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-017-subscribe-returns-builder-that-adds-to-registry-on-build.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-017-subscribe-returns-builder-that-adds-to-registry-on-build.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "subscribe() returns builder that adds to registry on build" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: subscribe() returns builder that adds to registry on build + +```gwt +Given an empty SubscriptionRegistry +When subscribe is called with "test.handler" and built with forEventTypes "OrderSubmitted" +Then the registry has 1 subscription with name "test.handler" +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-018-define-subscriptions-returns-configured-subscriptions.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-018-define-subscriptions-returns-configured-subscriptions.sdp.md index c3a9abba..6429d662 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-018-define-subscriptions-returns-configured-subscriptions.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-018-define-subscriptions-returns-configured-subscriptions.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "defineSubscriptions returns configured subscriptions" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: defineSubscriptions returns configured subscriptions + +```gwt +Given the feature fixture is in place +When defineSubscriptions is called with two subscriptions "handler1" and "handler2" +Then the result has 2 subscriptions named "handler1" and "handler2" +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-019-define-subscriptions-throws-on-duplicate-names-via-subscribe-build.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-019-define-subscriptions-throws-on-duplicate-names-via-subscribe-build.sdp.md index 90a53e1a..9f66b4f5 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-019-define-subscriptions-throws-on-duplicate-names-via-subscribe-build.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-019-define-subscriptions-throws-on-duplicate-names-via-subscribe-build.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "defineSubscriptions throws on duplicate names via subscribe().build()" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: defineSubscriptions throws on duplicate names via subscribe().build() + +```gwt +Given the feature fixture is in place +When the scenario runs +Then calling defineSubscriptions with duplicate "duplicate.handler" via subscribe throws +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-020-define-subscriptions-throws-on-duplicate-names-via-add.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-020-define-subscriptions-throws-on-duplicate-names-via-add.sdp.md index 53c1988a..2c6a357c 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-020-define-subscriptions-throws-on-duplicate-names-via-add.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-020-define-subscriptions-throws-on-duplicate-names-via-add.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "defineSubscriptions throws on duplicate names via add()" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: defineSubscriptions throws on duplicate names via add() + +```gwt +Given the feature fixture is in place +When the scenario runs +Then calling defineSubscriptions with duplicate "duplicate.name" via add throws +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-021-create-subscription-creates-standalone-builder.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-021-create-subscription-creates-standalone-builder.sdp.md index 5f5b183b..ffbd2a23 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-021-create-subscription-creates-standalone-builder.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-021-create-subscription-creates-standalone-builder.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "createSubscription creates standalone builder" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: createSubscription creates standalone builder + +```gwt +Given the feature fixture is in place +When createSubscription is called with "standalone" and forEventTypes "TestEvent" +Then the built subscription has name "standalone" and eventTypes filter "TestEvent" +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-022-empty-filter-matches-any-event.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-022-empty-filter-matches-any-event.sdp.md index 4c6f78ed..b6a416e6 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-022-empty-filter-matches-any-event.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-022-empty-filter-matches-any-event.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Empty filter matches any event" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: Empty filter matches any event + +```gwt +Given a subscription "wildcard" with an empty filter +When the scenario runs +Then matchesEvent returns true for event type "OrderSubmitted" +And matchesEvent returns true for event type "DifferentEvent" +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-023-matches-when-event-type-is-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-023-matches-when-event-type-is-in-the-list.sdp.md index 60ff20a1..45ab0a6d 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-023-matches-when-event-type-is-in-the-list.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-023-matches-when-event-type-is-in-the-list.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Matches when event type is in the list" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: Matches when event type is in the list + +```gwt +Given a subscription "test" with eventTypes filter "OrderSubmitted" and "OrderCancelled" +When the scenario runs +Then matchesEvent returns true for event type "OrderSubmitted" +And matchesEvent returns true for event type "OrderCancelled" +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-024-does-not-match-when-event-type-is-not-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-024-does-not-match-when-event-type-is-not-in-the-list.sdp.md index 436b0a89..a5591d8b 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-024-does-not-match-when-event-type-is-not-in-the-list.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-024-does-not-match-when-event-type-is-not-in-the-list.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Does not match when event type is not in the list" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: Does not match when event type is not in the list + +```gwt +Given a subscription "test" with eventTypes filter "OrderSubmitted" +When the scenario runs +Then matchesEvent returns false for event type "DifferentEvent" +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-025-matches-when-category-is-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-025-matches-when-category-is-in-the-list.sdp.md index 811a8941..536380bb 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-025-matches-when-category-is-in-the-list.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-025-matches-when-category-is-in-the-list.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Matches when category is in the list" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: Matches when category is in the list + +```gwt +Given a subscription "test" with categories filter "domain" and "integration" +When the scenario runs +Then matchesEvent returns true for category "domain" +And matchesEvent returns true for category "integration" +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-026-does-not-match-when-category-is-not-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-026-does-not-match-when-category-is-not-in-the-list.sdp.md index f74b9815..a16c7a86 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-026-does-not-match-when-category-is-not-in-the-list.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-026-does-not-match-when-category-is-not-in-the-list.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Does not match when category is not in the list" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: Does not match when category is not in the list + +```gwt +Given a subscription "test" with categories filter "domain" +When the scenario runs +Then matchesEvent returns false for category "trigger" +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-027-matches-when-bounded-context-is-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-027-matches-when-bounded-context-is-in-the-list.sdp.md index 84e8eacb..161ab789 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-027-matches-when-bounded-context-is-in-the-list.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-027-matches-when-bounded-context-is-in-the-list.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Matches when bounded context is in the list" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: Matches when bounded context is in the list + +```gwt +Given a subscription "test" with boundedContexts filter "orders" and "inventory" +When the scenario runs +Then matchesEvent returns true for boundedContext "orders" +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-028-does-not-match-when-bounded-context-is-not-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-028-does-not-match-when-bounded-context-is-not-in-the-list.sdp.md index 742d3a18..675aee0a 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-028-does-not-match-when-bounded-context-is-not-in-the-list.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-028-does-not-match-when-bounded-context-is-not-in-the-list.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Does not match when bounded context is not in the list" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: Does not match when bounded context is not in the list + +```gwt +Given a subscription "test" with boundedContexts filter "payments" +When the scenario runs +Then matchesEvent returns false for boundedContext "orders" +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-029-matches-when-stream-type-is-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-029-matches-when-stream-type-is-in-the-list.sdp.md index 96f1857b..2521d36c 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-029-matches-when-stream-type-is-in-the-list.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-029-matches-when-stream-type-is-in-the-list.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Matches when stream type is in the list" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: Matches when stream type is in the list + +```gwt +Given a subscription "test" with streamTypes filter "Order" and "Product" +When the scenario runs +Then matchesEvent returns true for streamType "Order" +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-030-does-not-match-when-stream-type-is-not-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-030-does-not-match-when-stream-type-is-not-in-the-list.sdp.md index 6fa17af1..e030ee46 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-030-does-not-match-when-stream-type-is-not-in-the-list.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-030-does-not-match-when-stream-type-is-not-in-the-list.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Does not match when stream type is not in the list" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: Does not match when stream type is not in the list + +```gwt +Given a subscription "test" with streamTypes filter "Customer" +When the scenario runs +Then matchesEvent returns false for streamType "Order" +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-031-all-filters-matching-returns-true.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-031-all-filters-matching-returns-true.sdp.md index 77c0bd9f..b5169802 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-031-all-filters-matching-returns-true.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-031-all-filters-matching-returns-true.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "All filters matching returns true" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: All filters matching returns true + +```gwt +Given a subscription "test" with combined filters eventTypes "OrderSubmitted", categories "domain", and boundedContexts "orders" +When the scenario runs +Then matchesEvent returns true for an event matching all filters +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-032-non-matching-event-type-returns-false-with-combined-filters.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-032-non-matching-event-type-returns-false-with-combined-filters.sdp.md index f1fe7dd3..a4ff6924 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-032-non-matching-event-type-returns-false-with-combined-filters.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-032-non-matching-event-type-returns-false-with-combined-filters.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Non-matching event type returns false with combined filters" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: Non-matching event type returns false with combined filters + +```gwt +Given a subscription "test" with combined filters eventTypes "OrderSubmitted", categories "domain", and boundedContexts "orders" +When the scenario runs +Then matchesEvent returns false for an event with wrong eventType "OrderCancelled" +``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-033-non-matching-category-returns-false-with-combined-filters.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-033-non-matching-category-returns-false-with-combined-filters.sdp.md index aa3417a8..dd2f7dba 100644 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-033-non-matching-category-returns-false-with-combined-filters.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.examples/s-033-non-matching-category-returns-false-with-combined-filters.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Non-matching category returns false with combined filters" from packages/platform-core/tests/features/behavior/eventbus/registry.feature +- outcome: Executable scenario: Non-matching category returns false with combined filters + +```gwt +Given a subscription "test" with combined filters eventTypes "OrderSubmitted", categories "domain", and boundedContexts "orders" +When the scenario runs +Then matchesEvent returns false for an event with wrong category "trigger" +``` diff --git a/specs/behavior/platform-core/eventbus/registry.sdp.md b/specs/behavior/platform-core/eventbus/registry.sdp.md index 4b2704ec..274e08c5 100644 --- a/specs/behavior/platform-core/eventbus/registry.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.sdp.md @@ -10,4 +10,20 @@ relations: ## Intent -- outcome: a subscription registry with builder API and event matching so that event handlers are configured declaratively and matched correctly (test carrier: packages/platform-core/tests/features/behavior/eventbus/registry.feature) +- actor: a platform developer +- outcome: a subscription registry with builder API and event matching so that event handlers are configured declaratively and matched correctly + +## Behavior + +- rule: SubscriptionBuilder creates subscriptions with sensible defaults +- rule: SubscriptionBuilder fluent API configures event filters +- rule: SubscriptionBuilder configures handler options +- rule: SubscriptionRegistry collects subscriptions and rejects duplicates +- rule: defineSubscriptions helper creates subscription arrays from a configuration callback +- rule: createSubscription creates a standalone builder +- rule: An empty filter matches any event +- rule: matchesEvent filters by eventTypes using OR within the list +- rule: matchesEvent filters by categories using OR within the list +- rule: matchesEvent filters by boundedContexts using OR within the list +- rule: matchesEvent filters by streamTypes using OR within the list +- rule: Combined filters use AND logic between filter types diff --git a/specs/behavior/platform-core/events/builder.examples/s-001-generates-event-id-with-bounded-context-prefix.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-001-generates-event-id-with-bounded-context-prefix.sdp.md index f258bdb1..f9b29bf5 100644 --- a/specs/behavior/platform-core/events/builder.examples/s-001-generates-event-id-with-bounded-context-prefix.sdp.md +++ b/specs/behavior/platform-core/events/builder.examples/s-001-generates-event-id-with-bounded-context-prefix.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Generates eventId with bounded context prefix" from packages/platform-core/tests/features/behavior/events/builder.feature +- outcome: Executable scenario: Generates eventId with bounded context prefix + +```gwt +Given a createEventData input with bounded context "orders" +When createEventData is called +Then the result eventId is "orders_event_mock-uuid-v7" +``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-002-copies-all-core-fields-correctly.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-002-copies-all-core-fields-correctly.sdp.md index 2dfba12d..7da56a25 100644 --- a/specs/behavior/platform-core/events/builder.examples/s-002-copies-all-core-fields-correctly.sdp.md +++ b/specs/behavior/platform-core/events/builder.examples/s-002-copies-all-core-fields-correctly.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Copies all core fields correctly" from packages/platform-core/tests/features/behavior/events/builder.feature +- outcome: Executable scenario: Copies all core fields correctly + +```gwt +Given a createEventData input with: +When createEventData is called +Then the result has fields: +``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-003-copies-payload-correctly.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-003-copies-payload-correctly.sdp.md index aaa2890f..50859359 100644 --- a/specs/behavior/platform-core/events/builder.examples/s-003-copies-payload-correctly.sdp.md +++ b/specs/behavior/platform-core/events/builder.examples/s-003-copies-payload-correctly.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Copies payload correctly" from packages/platform-core/tests/features/behavior/events/builder.feature +- outcome: Executable scenario: Copies payload correctly + +```gwt +Given a createEventData input with a complex payload +When createEventData is called +Then the result payload matches the input payload +``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-004-includes-correlation-id-and-causation-id-in-metadata.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-004-includes-correlation-id-and-causation-id-in-metadata.sdp.md index 050452f4..933a1c88 100644 --- a/specs/behavior/platform-core/events/builder.examples/s-004-includes-correlation-id-and-causation-id-in-metadata.sdp.md +++ b/specs/behavior/platform-core/events/builder.examples/s-004-includes-correlation-id-and-causation-id-in-metadata.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Includes correlationId and causationId in metadata" from packages/platform-core/tests/features/behavior/events/builder.feature +- outcome: Executable scenario: Includes correlationId and causationId in metadata + +```gwt +Given a createEventData input with correlationId "corr_unique_123" and causationId "cmd_unique_456" +When createEventData is called +Then the result metadata has: +``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-005-generates-different-event-ids-for-different-bounded-contexts.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-005-generates-different-event-ids-for-different-bounded-contexts.sdp.md index cb9972d5..be28618f 100644 --- a/specs/behavior/platform-core/events/builder.examples/s-005-generates-different-event-ids-for-different-bounded-contexts.sdp.md +++ b/specs/behavior/platform-core/events/builder.examples/s-005-generates-different-event-ids-for-different-bounded-contexts.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Generates different eventIds for different bounded contexts" from packages/platform-core/tests/features/behavior/events/builder.feature +- outcome: Executable scenario: Generates different eventIds for different bounded contexts + +```gwt +Given the feature fixture is in place +When createEventData is called with bounded context "orders" and createEventData is called with bounded context "inventory" +Then generateEventId was called with "orders" and "inventory" +``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-006-returns-complete-new-event-data-structure.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-006-returns-complete-new-event-data-structure.sdp.md index 34e5bf54..41281796 100644 --- a/specs/behavior/platform-core/events/builder.examples/s-006-returns-complete-new-event-data-structure.sdp.md +++ b/specs/behavior/platform-core/events/builder.examples/s-006-returns-complete-new-event-data-structure.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns complete NewEventData structure" from packages/platform-core/tests/features/behavior/events/builder.feature +- outcome: Executable scenario: Returns complete NewEventData structure + +```gwt +Given a createEventData input with bounded context "orders" +When createEventData is called +Then the result has all required properties: +And the result metadata has all required properties: +``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-007-uses-provided-event-id-without-generating-a-new-one.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-007-uses-provided-event-id-without-generating-a-new-one.sdp.md index 71d0cd45..1337139e 100644 --- a/specs/behavior/platform-core/events/builder.examples/s-007-uses-provided-event-id-without-generating-a-new-one.sdp.md +++ b/specs/behavior/platform-core/events/builder.examples/s-007-uses-provided-event-id-without-generating-a-new-one.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Uses provided eventId without generating a new one" from packages/platform-core/tests/features/behavior/events/builder.feature +- outcome: Executable scenario: Uses provided eventId without generating a new one + +```gwt +Given a pre-generated eventId "orders_event_pre-generated-uuid" +When createEventDataWithId is called +Then the result eventId is "orders_event_pre-generated-uuid" +``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-008-extracts-bounded-context-from-event-id-when-not-provided.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-008-extracts-bounded-context-from-event-id-when-not-provided.sdp.md index 4abae381..bdd33e41 100644 --- a/specs/behavior/platform-core/events/builder.examples/s-008-extracts-bounded-context-from-event-id-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/events/builder.examples/s-008-extracts-bounded-context-from-event-id-when-not-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Extracts boundedContext from eventId when not provided" from packages/platform-core/tests/features/behavior/events/builder.feature +- outcome: Executable scenario: Extracts boundedContext from eventId when not provided + +```gwt +Given a pre-generated eventId "inventory_event_some-uuid" without explicit boundedContext +When createEventDataWithId is called +Then the result boundedContext is "inventory" +``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-009-uses-provided-bounded-context-when-explicitly-set.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-009-uses-provided-bounded-context-when-explicitly-set.sdp.md index b0dd32ea..9640868f 100644 --- a/specs/behavior/platform-core/events/builder.examples/s-009-uses-provided-bounded-context-when-explicitly-set.sdp.md +++ b/specs/behavior/platform-core/events/builder.examples/s-009-uses-provided-bounded-context-when-explicitly-set.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Uses provided boundedContext when explicitly set" from packages/platform-core/tests/features/behavior/events/builder.feature +- outcome: Executable scenario: Uses provided boundedContext when explicitly set + +```gwt +Given a pre-generated eventId "orders_event_some-uuid" with explicit boundedContext "custom-context" +When createEventDataWithId is called +Then the result boundedContext is "custom-context" +``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-010-uses-full-event-id-as-bounded-context-when-no-underscore-present.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-010-uses-full-event-id-as-bounded-context-when-no-underscore-present.sdp.md index 4eaba46e..1681e3de 100644 --- a/specs/behavior/platform-core/events/builder.examples/s-010-uses-full-event-id-as-bounded-context-when-no-underscore-present.sdp.md +++ b/specs/behavior/platform-core/events/builder.examples/s-010-uses-full-event-id-as-bounded-context-when-no-underscore-present.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Uses full eventId as boundedContext when no underscore present" from packages/platform-core/tests/features/behavior/events/builder.feature +- outcome: Executable scenario: Uses full eventId as boundedContext when no underscore present + +```gwt +Given a pre-generated eventId "malformed-event-id" without explicit boundedContext +When createEventDataWithId is called +Then the result boundedContext is "malformed-event-id" +``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-011-copies-all-other-fields-correctly-with-pre-generated-event-id.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-011-copies-all-other-fields-correctly-with-pre-generated-event-id.sdp.md index 48a34b74..a8001541 100644 --- a/specs/behavior/platform-core/events/builder.examples/s-011-copies-all-other-fields-correctly-with-pre-generated-event-id.sdp.md +++ b/specs/behavior/platform-core/events/builder.examples/s-011-copies-all-other-fields-correctly-with-pre-generated-event-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Copies all other fields correctly with pre-generated eventId" from packages/platform-core/tests/features/behavior/events/builder.feature +- outcome: Executable scenario: Copies all other fields correctly with pre-generated eventId + +```gwt +Given a pre-generated eventId "orders_event_custom-uuid" with full input +When createEventDataWithId is called +Then the withId result has fields: +``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-012-handles-event-id-with-multiple-underscores-correctly.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-012-handles-event-id-with-multiple-underscores-correctly.sdp.md index 297aba12..4091a1c1 100644 --- a/specs/behavior/platform-core/events/builder.examples/s-012-handles-event-id-with-multiple-underscores-correctly.sdp.md +++ b/specs/behavior/platform-core/events/builder.examples/s-012-handles-event-id-with-multiple-underscores-correctly.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handles eventId with multiple underscores correctly" from packages/platform-core/tests/features/behavior/events/builder.feature +- outcome: Executable scenario: Handles eventId with multiple underscores correctly + +```gwt +Given a pre-generated eventId "my_bounded_context_event_uuid-v7" without explicit boundedContext +When createEventDataWithId is called +Then the result boundedContext is "my" +``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-013-returns-complete-new-event-data-structure-with-pre-generated-event-id.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-013-returns-complete-new-event-data-structure-with-pre-generated-event-id.sdp.md index 27d1dff6..ccd3b1b7 100644 --- a/specs/behavior/platform-core/events/builder.examples/s-013-returns-complete-new-event-data-structure-with-pre-generated-event-id.sdp.md +++ b/specs/behavior/platform-core/events/builder.examples/s-013-returns-complete-new-event-data-structure-with-pre-generated-event-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns complete NewEventData structure with pre-generated eventId" from packages/platform-core/tests/features/behavior/events/builder.feature +- outcome: Executable scenario: Returns complete NewEventData structure with pre-generated eventId + +```gwt +Given a pre-generated eventId "orders_event_test-uuid" +When createEventDataWithId is called +Then the result has all required properties: +And the result metadata has all required properties: +``` diff --git a/specs/behavior/platform-core/events/builder.sdp.md b/specs/behavior/platform-core/events/builder.sdp.md index 44387487..b4de7640 100644 --- a/specs/behavior/platform-core/events/builder.sdp.md +++ b/specs/behavior/platform-core/events/builder.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: builder functions to create event data structures so that events are correctly formatted for Event Store persistence (test carrier: packages/platform-core/tests/features/behavior/events/builder.feature) +- actor: a platform developer +- outcome: builder functions to create event data structures so that events are correctly formatted for Event Store persistence + +## Behavior + +- rule: createEventData generates a complete NewEventData with auto-generated eventId +- rule: createEventDataWithId uses a pre-generated eventId and infers boundedContext diff --git a/specs/behavior/platform-core/events/category.examples/s-001-event-categories-has-exactly-four-entries-in-the-correct-order.sdp.md b/specs/behavior/platform-core/events/category.examples/s-001-event-categories-has-exactly-four-entries-in-the-correct-order.sdp.md index 25323664..7ac81ec7 100644 --- a/specs/behavior/platform-core/events/category.examples/s-001-event-categories-has-exactly-four-entries-in-the-correct-order.sdp.md +++ b/specs/behavior/platform-core/events/category.examples/s-001-event-categories-has-exactly-four-entries-in-the-correct-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "EVENT_CATEGORIES has exactly four entries in the correct order" from packages/platform-core/tests/features/behavior/events/category.feature +- outcome: Executable scenario: EVENT_CATEGORIES has exactly four entries in the correct order + +```gwt +Given the EVENT_CATEGORIES constant +When the scenario runs +Then it has length 4 +And the categories in order are: +``` diff --git a/specs/behavior/platform-core/events/category.examples/s-002-schema-accepts-valid-category-strings.sdp.md b/specs/behavior/platform-core/events/category.examples/s-002-schema-accepts-valid-category-strings.sdp.md index 2dc4775a..e4f8acbe 100644 --- a/specs/behavior/platform-core/events/category.examples/s-002-schema-accepts-valid-category-strings.sdp.md +++ b/specs/behavior/platform-core/events/category.examples/s-002-schema-accepts-valid-category-strings.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Schema accepts valid category strings" from packages/platform-core/tests/features/behavior/events/category.feature +- outcome: Executable scenario: Schema accepts valid category strings + +```gwt +Given the feature fixture is in place +When the following values are parsed with EventCategorySchema: +Then each parse returns the input value unchanged +``` diff --git a/specs/behavior/platform-core/events/category.examples/s-003-schema-rejects-invalid-category-values.sdp.md b/specs/behavior/platform-core/events/category.examples/s-003-schema-rejects-invalid-category-values.sdp.md index 57b8499f..15b3c6ed 100644 --- a/specs/behavior/platform-core/events/category.examples/s-003-schema-rejects-invalid-category-values.sdp.md +++ b/specs/behavior/platform-core/events/category.examples/s-003-schema-rejects-invalid-category-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Schema rejects invalid category values" from packages/platform-core/tests/features/behavior/events/category.feature +- outcome: Executable scenario: Schema rejects invalid category values + +```gwt +Given the feature fixture is in place +When the following values are parsed with EventCategorySchema: +Then each parse throws a validation error +``` diff --git a/specs/behavior/platform-core/events/category.examples/s-004-default-event-category-is-domain.sdp.md b/specs/behavior/platform-core/events/category.examples/s-004-default-event-category-is-domain.sdp.md index c0ba2968..851d01e0 100644 --- a/specs/behavior/platform-core/events/category.examples/s-004-default-event-category-is-domain.sdp.md +++ b/specs/behavior/platform-core/events/category.examples/s-004-default-event-category-is-domain.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "DEFAULT_EVENT_CATEGORY is domain" from packages/platform-core/tests/features/behavior/events/category.feature +- outcome: Executable scenario: DEFAULT_EVENT_CATEGORY is domain + +```gwt +Given the feature fixture is in place +When the scenario runs +Then DEFAULT_EVENT_CATEGORY equals "domain" +``` diff --git a/specs/behavior/platform-core/events/category.examples/s-005-default-schema-version-is-1.sdp.md b/specs/behavior/platform-core/events/category.examples/s-005-default-schema-version-is-1.sdp.md index 0689ab6b..57072b8a 100644 --- a/specs/behavior/platform-core/events/category.examples/s-005-default-schema-version-is-1.sdp.md +++ b/specs/behavior/platform-core/events/category.examples/s-005-default-schema-version-is-1.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "DEFAULT_SCHEMA_VERSION is 1" from packages/platform-core/tests/features/behavior/events/category.feature +- outcome: Executable scenario: DEFAULT_SCHEMA_VERSION is 1 + +```gwt +Given the feature fixture is in place +When the scenario runs +Then DEFAULT_SCHEMA_VERSION equals 1 +``` diff --git a/specs/behavior/platform-core/events/category.examples/s-006-type-guard-accepts-all-valid-categories.sdp.md b/specs/behavior/platform-core/events/category.examples/s-006-type-guard-accepts-all-valid-categories.sdp.md index 1624178a..1d72422c 100644 --- a/specs/behavior/platform-core/events/category.examples/s-006-type-guard-accepts-all-valid-categories.sdp.md +++ b/specs/behavior/platform-core/events/category.examples/s-006-type-guard-accepts-all-valid-categories.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Type guard accepts all valid categories" from packages/platform-core/tests/features/behavior/events/category.feature +- outcome: Executable scenario: Type guard accepts all valid categories + +```gwt +Given the feature fixture is in place +When isEventCategory is called with the following values: +Then each call returns the expected boolean +``` diff --git a/specs/behavior/platform-core/events/category.examples/s-007-type-guard-rejects-invalid-values.sdp.md b/specs/behavior/platform-core/events/category.examples/s-007-type-guard-rejects-invalid-values.sdp.md index 0e306758..6687d9ff 100644 --- a/specs/behavior/platform-core/events/category.examples/s-007-type-guard-rejects-invalid-values.sdp.md +++ b/specs/behavior/platform-core/events/category.examples/s-007-type-guard-rejects-invalid-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Type guard rejects invalid values" from packages/platform-core/tests/features/behavior/events/category.feature +- outcome: Executable scenario: Type guard rejects invalid values + +```gwt +Given the feature fixture is in place +When isEventCategory is called with the following invalid values: +Then each call returns the expected boolean result +``` diff --git a/specs/behavior/platform-core/events/category.examples/s-008-valid-categories-are-returned-unchanged.sdp.md b/specs/behavior/platform-core/events/category.examples/s-008-valid-categories-are-returned-unchanged.sdp.md index e4a25730..7f2bc859 100644 --- a/specs/behavior/platform-core/events/category.examples/s-008-valid-categories-are-returned-unchanged.sdp.md +++ b/specs/behavior/platform-core/events/category.examples/s-008-valid-categories-are-returned-unchanged.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Valid categories are returned unchanged" from packages/platform-core/tests/features/behavior/events/category.feature +- outcome: Executable scenario: Valid categories are returned unchanged + +```gwt +Given the feature fixture is in place +When normalizeCategory is called with valid categories: +Then each call returns the expected result +``` diff --git a/specs/behavior/platform-core/events/category.examples/s-009-invalid-values-normalize-to-domain.sdp.md b/specs/behavior/platform-core/events/category.examples/s-009-invalid-values-normalize-to-domain.sdp.md index c39d535b..1492a7d7 100644 --- a/specs/behavior/platform-core/events/category.examples/s-009-invalid-values-normalize-to-domain.sdp.md +++ b/specs/behavior/platform-core/events/category.examples/s-009-invalid-values-normalize-to-domain.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Invalid values normalize to domain" from packages/platform-core/tests/features/behavior/events/category.feature +- outcome: Executable scenario: Invalid values normalize to domain + +```gwt +Given the feature fixture is in place +When normalizeCategory is called with invalid values: +Then each call returns "domain" +``` diff --git a/specs/behavior/platform-core/events/category.examples/s-010-positive-integers-are-returned-unchanged.sdp.md b/specs/behavior/platform-core/events/category.examples/s-010-positive-integers-are-returned-unchanged.sdp.md index 637a5d87..98cd818f 100644 --- a/specs/behavior/platform-core/events/category.examples/s-010-positive-integers-are-returned-unchanged.sdp.md +++ b/specs/behavior/platform-core/events/category.examples/s-010-positive-integers-are-returned-unchanged.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Positive integers are returned unchanged" from packages/platform-core/tests/features/behavior/events/category.feature +- outcome: Executable scenario: Positive integers are returned unchanged + +```gwt +Given the feature fixture is in place +When normalizeSchemaVersion is called with: +Then each call returns the expected version number +``` diff --git a/specs/behavior/platform-core/events/category.examples/s-011-invalid-values-normalize-to-1.sdp.md b/specs/behavior/platform-core/events/category.examples/s-011-invalid-values-normalize-to-1.sdp.md index 9d953c80..cd5e3e17 100644 --- a/specs/behavior/platform-core/events/category.examples/s-011-invalid-values-normalize-to-1.sdp.md +++ b/specs/behavior/platform-core/events/category.examples/s-011-invalid-values-normalize-to-1.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Invalid values normalize to 1" from packages/platform-core/tests/features/behavior/events/category.feature +- outcome: Executable scenario: Invalid values normalize to 1 + +```gwt +Given the feature fixture is in place +When normalizeSchemaVersion is called with invalid values: +Then each call returns 1 +``` diff --git a/specs/behavior/platform-core/events/category.examples/s-012-classification-of-categories-as-external-or-internal.sdp.md b/specs/behavior/platform-core/events/category.examples/s-012-classification-of-categories-as-external-or-internal.sdp.md index 4b7719a4..42ca9add 100644 --- a/specs/behavior/platform-core/events/category.examples/s-012-classification-of-categories-as-external-or-internal.sdp.md +++ b/specs/behavior/platform-core/events/category.examples/s-012-classification-of-categories-as-external-or-internal.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Classification of categories as external or internal" from packages/platform-core/tests/features/behavior/events/category.feature +- outcome: Executable scenario: Classification of categories as external or internal + +```gwt +Given the feature fixture is in place +When isExternalCategory is called with each category: +Then each call returns the expected classification +``` diff --git a/specs/behavior/platform-core/events/category.examples/s-013-classification-of-categories-as-cross-context.sdp.md b/specs/behavior/platform-core/events/category.examples/s-013-classification-of-categories-as-cross-context.sdp.md index 6550a22f..5668040e 100644 --- a/specs/behavior/platform-core/events/category.examples/s-013-classification-of-categories-as-cross-context.sdp.md +++ b/specs/behavior/platform-core/events/category.examples/s-013-classification-of-categories-as-cross-context.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Classification of categories as cross-context" from packages/platform-core/tests/features/behavior/events/category.feature +- outcome: Executable scenario: Classification of categories as cross-context + +```gwt +Given the feature fixture is in place +When isCrossContextCategory is called with each category: +Then each call returns the expected cross-context classification +``` diff --git a/specs/behavior/platform-core/events/category.sdp.md b/specs/behavior/platform-core/events/category.sdp.md index 6008ffdd..609aef99 100644 --- a/specs/behavior/platform-core/events/category.sdp.md +++ b/specs/behavior/platform-core/events/category.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: event taxonomy utilities with type-safe categories so that events are correctly classified and validated at runtime (test carrier: packages/platform-core/tests/features/behavior/events/category.feature) +- actor: a platform developer +- outcome: event taxonomy utilities with type-safe categories so that events are correctly classified and validated at runtime + +## Behavior + +- rule: EVENT_CATEGORIES contains all four event categories in order +- rule: EventCategorySchema validates category strings via Zod +- rule: Default constants provide sensible fallbacks +- rule: isEventCategory returns true only for valid category strings +- rule: normalizeCategory returns the category unchanged or falls back to domain +- rule: normalizeSchemaVersion returns valid positive integers or falls back to 1 +- rule: isExternalCategory identifies trigger and fat as external +- rule: isCrossContextCategory identifies integration as cross-context diff --git a/specs/behavior/platform-core/events/schemas.examples/s-001-valid-event-metadata-is-accepted-and-fields-are-preserved.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-001-valid-event-metadata-is-accepted-and-fields-are-preserved.sdp.md index 77a24f31..cdf22dc7 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-001-valid-event-metadata-is-accepted-and-fields-are-preserved.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-001-valid-event-metadata-is-accepted-and-fields-are-preserved.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Valid event metadata is accepted and fields are preserved" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Valid event metadata is accepted and fields are preserved + +```gwt +Given valid event metadata +When the metadata is parsed with EventMetadataSchema +Then all metadata fields match the input +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-002-missing-required-fields-are-rejected.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-002-missing-required-fields-are-rejected.sdp.md index 85d29e29..06c4dbc8 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-002-missing-required-fields-are-rejected.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-002-missing-required-fields-are-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Missing required fields are rejected" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Missing required fields are rejected + +```gwt +Given the feature fixture is in place +When an empty object is parsed with EventMetadataSchema +Then the parse throws a validation error +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-003-partial-metadata-with-only-event-id-is-rejected.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-003-partial-metadata-with-only-event-id-is-rejected.sdp.md index 72778ccd..03dcddfa 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-003-partial-metadata-with-only-event-id-is-rejected.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-003-partial-metadata-with-only-event-id-is-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Partial metadata with only eventId is rejected" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Partial metadata with only eventId is rejected + +```gwt +Given the feature fixture is in place +When an object with only eventId is parsed with EventMetadataSchema +Then the parse throws a validation error +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-004-optional-causation-id-is-supported.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-004-optional-causation-id-is-supported.sdp.md index c52004c9..ae49802b 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-004-optional-causation-id-is-supported.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-004-optional-causation-id-is-supported.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Optional causationId is supported" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Optional causationId is supported + +```gwt +Given valid event metadata +When the metadata is parsed without causationId and the metadata is parsed with causationId "cause_123" +Then causationId is undefined +And causationId equals "cause_123" +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-005-invalid-version-values-are-rejected.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-005-invalid-version-values-are-rejected.sdp.md index 7dd5b874..578adf38 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-005-invalid-version-values-are-rejected.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-005-invalid-version-values-are-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Invalid version values are rejected" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Invalid version values are rejected + +```gwt +Given valid event metadata +When the metadata is parsed with invalid version values: +Then each parse throws a validation error +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-006-zero-global-position-is-accepted.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-006-zero-global-position-is-accepted.sdp.md index fe21a1a7..8ea60752 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-006-zero-global-position-is-accepted.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-006-zero-global-position-is-accepted.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Zero globalPosition is accepted" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Zero globalPosition is accepted + +```gwt +Given valid event metadata +When the metadata is parsed with globalPosition 0 +Then globalPosition equals 0 +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-007-enhanced-metadata-includes-category-and-schema-version.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-007-enhanced-metadata-includes-category-and-schema-version.sdp.md index 271a058b..88b84913 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-007-enhanced-metadata-includes-category-and-schema-version.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-007-enhanced-metadata-includes-category-and-schema-version.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Enhanced metadata includes category and schemaVersion" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Enhanced metadata includes category and schemaVersion + +```gwt +Given valid enhanced event metadata +When the enhanced metadata is parsed +Then the parsed category is "domain" +And the parsed schemaVersion is 1 +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-008-category-defaults-to-domain-when-not-provided.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-008-category-defaults-to-domain-when-not-provided.sdp.md index b60f0946..32d2d659 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-008-category-defaults-to-domain-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-008-category-defaults-to-domain-when-not-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Category defaults to domain when not provided" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Category defaults to domain when not provided + +```gwt +Given valid event metadata +When the metadata is parsed with EnhancedEventMetadataSchema +Then the parsed category is "domain" +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-009-schema-version-defaults-to-1-when-not-provided.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-009-schema-version-defaults-to-1-when-not-provided.sdp.md index 4311f2b8..e07a2069 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-009-schema-version-defaults-to-1-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-009-schema-version-defaults-to-1-when-not-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "SchemaVersion defaults to 1 when not provided" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: SchemaVersion defaults to 1 when not provided + +```gwt +Given valid event metadata +When the metadata is parsed with EnhancedEventMetadataSchema +Then the parsed schemaVersion is 1 +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-010-all-valid-categories-are-accepted.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-010-all-valid-categories-are-accepted.sdp.md index 703a9456..a48b7f9b 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-010-all-valid-categories-are-accepted.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-010-all-valid-categories-are-accepted.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "All valid categories are accepted" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: All valid categories are accepted + +```gwt +Given valid event metadata +When the metadata is parsed with each category: +Then each parse returns the matching category +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-011-invalid-categories-are-rejected.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-011-invalid-categories-are-rejected.sdp.md index 544c34a9..cfa47435 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-011-invalid-categories-are-rejected.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-011-invalid-categories-are-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Invalid categories are rejected" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Invalid categories are rejected + +```gwt +Given valid event metadata +When the metadata is parsed with category "invalid" +Then the parse throws a validation error +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-012-schema-accepts-events-with-matching-event-type-and-valid-payload.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-012-schema-accepts-events-with-matching-event-type-and-valid-payload.sdp.md index 0d658e54..e96a1e9a 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-012-schema-accepts-events-with-matching-event-type-and-valid-payload.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-012-schema-accepts-events-with-matching-event-type-and-valid-payload.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Schema accepts events with matching eventType and valid payload" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Schema accepts events with matching eventType and valid payload + +```gwt +Given a createEventSchema for "OrderCreated" with orderId and customerId payload +When an OrderCreated event with valid payload is parsed +Then the parsed eventType is "OrderCreated" +And the parsed payload orderId is "order_123" +And the parsed payload customerId is "customer_456" +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-013-schema-rejects-events-with-wrong-event-type.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-013-schema-rejects-events-with-wrong-event-type.sdp.md index 6fc4515d..1d2cea37 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-013-schema-rejects-events-with-wrong-event-type.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-013-schema-rejects-events-with-wrong-event-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Schema rejects events with wrong eventType" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Schema rejects events with wrong eventType + +```gwt +Given a createEventSchema for "OrderCreated" with orderId payload +When an event with eventType "WrongEvent" is parsed with the schema +Then the parse throws a validation error +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-014-schema-validates-payload-constraints.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-014-schema-validates-payload-constraints.sdp.md index 02a089a8..8282182e 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-014-schema-validates-payload-constraints.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-014-schema-validates-payload-constraints.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Schema validates payload constraints" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Schema validates payload constraints + +```gwt +Given a createEventSchema for "OrderCreated" with orderId and positive quantity payload +When an event with negative quantity is parsed +Then the parse throws a validation error +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-015-optional-metadata-field-is-supported.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-015-optional-metadata-field-is-supported.sdp.md index 452cf971..7c6f1bcf 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-015-optional-metadata-field-is-supported.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-015-optional-metadata-field-is-supported.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Optional metadata field is supported" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Optional metadata field is supported + +```gwt +Given a createEventSchema for "Test" with id payload +When an event without metadata is parsed and an event with metadata source "api" and requestId "req_123" is parsed +Then the parsed metadata is undefined +And the parsed metadata has source "api" and requestId "req_123" +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-016-domain-event-schema-sets-category-to-domain.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-016-domain-event-schema-sets-category-to-domain.sdp.md index e2d42428..3ef75f30 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-016-domain-event-schema-sets-category-to-domain.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-016-domain-event-schema-sets-category-to-domain.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Domain event schema sets category to domain" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Domain event schema sets category to domain + +```gwt +Given a domain event schema for "OrderSubmitted" with orderId and totalAmount +When a domain event with valid payload is parsed +Then the parsed eventType is "OrderSubmitted" +And the parsed category is "domain" +And the parsed payload orderId is "order_123" +And the parsed payload totalAmount is 99.99 +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-017-category-defaults-to-domain-when-not-in-input.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-017-category-defaults-to-domain-when-not-in-input.sdp.md index 3fa3102b..0224e7ee 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-017-category-defaults-to-domain-when-not-in-input.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-017-category-defaults-to-domain-when-not-in-input.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Category defaults to domain when not in input" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Category defaults to domain when not in input + +```gwt +Given a domain event schema for "Test" with id payload +When an event without explicit category is parsed via domain schema +Then the parsed category is "domain" +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-018-schema-version-defaults-to-1-when-not-in-config.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-018-schema-version-defaults-to-1-when-not-in-config.sdp.md index 76bfaf89..d55eb82f 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-018-schema-version-defaults-to-1-when-not-in-config.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-018-schema-version-defaults-to-1-when-not-in-config.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "SchemaVersion defaults to 1 when not in config" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: SchemaVersion defaults to 1 when not in config + +```gwt +Given a domain event schema for "Test" with id payload +When an event without explicit schemaVersion is parsed via domain schema +Then the parsed schemaVersion is 1 +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-019-custom-schema-version-in-config-is-enforced.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-019-custom-schema-version-in-config-is-enforced.sdp.md index d453f093..6ef6dc16 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-019-custom-schema-version-in-config-is-enforced.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-019-custom-schema-version-in-config-is-enforced.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Custom schemaVersion in config is enforced" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Custom schemaVersion in config is enforced + +```gwt +Given a domain event schema for "Test" with id and newField payload and schemaVersion 2 +When a domain event with matching v2 payload is parsed +Then the parsed schemaVersion is 2 +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-020-wrong-schema-version-is-rejected.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-020-wrong-schema-version-is-rejected.sdp.md index 859f4afd..39e01231 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-020-wrong-schema-version-is-rejected.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-020-wrong-schema-version-is-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Wrong schemaVersion is rejected" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Wrong schemaVersion is rejected + +```gwt +Given a domain event schema for "Test" with id payload and schemaVersion 2 +When an event with schemaVersion 3 is parsed via domain schema +Then the parse throws a validation error +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-021-integration-event-schema-sets-category-to-integration.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-021-integration-event-schema-sets-category-to-integration.sdp.md index 4e16278b..7039f9a3 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-021-integration-event-schema-sets-category-to-integration.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-021-integration-event-schema-sets-category-to-integration.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Integration event schema sets category to integration" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Integration event schema sets category to integration + +```gwt +Given an integration event schema for "OrderPlacedIntegration" with source "orders" +When an integration event with valid payload is parsed +Then the parsed eventType is "OrderPlacedIntegration" +And the parsed category is "integration" +And the parsed payload totalAmount is 199.99 +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-022-category-defaults-to-integration-when-not-in-input.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-022-category-defaults-to-integration-when-not-in-input.sdp.md index 3142d0fb..1192d85e 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-022-category-defaults-to-integration-when-not-in-input.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-022-category-defaults-to-integration-when-not-in-input.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Category defaults to integration when not in input" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Category defaults to integration when not in input + +```gwt +Given an integration event schema for "TestIntegration" with source "test" and id payload +When an event without explicit category is parsed via integration schema +Then the parsed category is "integration" +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-023-schema-version-defaults-to-1-for-integration-events.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-023-schema-version-defaults-to-1-for-integration-events.sdp.md index 526198a9..98867490 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-023-schema-version-defaults-to-1-for-integration-events.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-023-schema-version-defaults-to-1-for-integration-events.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "SchemaVersion defaults to 1 for integration events" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: SchemaVersion defaults to 1 for integration events + +```gwt +Given an integration event schema for "TestIntegration" with source "test" and id payload +When an event without explicit schemaVersion is parsed via integration schema +Then the parsed schemaVersion is 1 +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-024-trigger-event-schema-sets-category-to-trigger-with-entity-id-payload.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-024-trigger-event-schema-sets-category-to-trigger-with-entity-id-payload.sdp.md index 22be8168..b6db3da5 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-024-trigger-event-schema-sets-category-to-trigger-with-entity-id-payload.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-024-trigger-event-schema-sets-category-to-trigger-with-entity-id-payload.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Trigger event schema sets category to trigger with entity ID payload" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Trigger event schema sets category to trigger with entity ID payload + +```gwt +Given a trigger event schema for "OrderShipmentStarted" with entityIdField "orderId" +When a trigger event with orderId "order_123" is parsed +Then the parsed eventType is "OrderShipmentStarted" +And the parsed category is "trigger" +And the parsed payload orderId is "order_123" +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-025-trigger-event-rejects-missing-entity-id.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-025-trigger-event-rejects-missing-entity-id.sdp.md index 23248aca..b00e0f16 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-025-trigger-event-rejects-missing-entity-id.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-025-trigger-event-rejects-missing-entity-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Trigger event rejects missing entity ID" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Trigger event rejects missing entity ID + +```gwt +Given a trigger event schema for "ItemUpdated" with entityIdField "itemId" +When a trigger event with itemId "item_123" is parsed and a trigger event with empty payload is parsed +Then the parsed payload itemId is "item_123" +And the parse throws a validation error +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-026-category-defaults-to-trigger-when-not-in-input.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-026-category-defaults-to-trigger-when-not-in-input.sdp.md index 286936bd..20112e00 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-026-category-defaults-to-trigger-when-not-in-input.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-026-category-defaults-to-trigger-when-not-in-input.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Category defaults to trigger when not in input" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Category defaults to trigger when not in input + +```gwt +Given a trigger event schema for "Test" with entityIdField "testId" +When a trigger event with testId "123" is parsed without explicit category +Then the parsed category is "trigger" +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-027-custom-schema-version-for-trigger-events.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-027-custom-schema-version-for-trigger-events.sdp.md index 8eba1c9d..76587e80 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-027-custom-schema-version-for-trigger-events.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-027-custom-schema-version-for-trigger-events.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Custom schemaVersion for trigger events" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Custom schemaVersion for trigger events + +```gwt +Given a trigger event schema for "Test" with entityIdField "testId" and schemaVersion 3 +When a trigger event with testId "123" is parsed with custom schema version +Then the parsed schemaVersion is 3 +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-028-fat-event-schema-sets-category-to-fat-with-full-payload.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-028-fat-event-schema-sets-category-to-fat-with-full-payload.sdp.md index 54bdc3a9..b7ab4bb9 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-028-fat-event-schema-sets-category-to-fat-with-full-payload.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-028-fat-event-schema-sets-category-to-fat-with-full-payload.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Fat event schema sets category to fat with full payload" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Fat event schema sets category to fat with full payload + +```gwt +Given a fat event schema for "OrderSnapshot" with full order payload +When a fat event with valid order snapshot is parsed +Then the parsed eventType is "OrderSnapshot" +And the parsed category is "fat" +And the parsed payload orderId is "order_123" +And the parsed payload items has length 1 +And the parsed payload status is "confirmed" +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-029-category-defaults-to-fat-when-not-in-input.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-029-category-defaults-to-fat-when-not-in-input.sdp.md index b7ccfb4b..afde40a5 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-029-category-defaults-to-fat-when-not-in-input.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-029-category-defaults-to-fat-when-not-in-input.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Category defaults to fat when not in input" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Category defaults to fat when not in input + +```gwt +Given a fat event schema for "TestSnapshot" with record payload +When an event without explicit category is parsed via fat schema +Then the parsed category is "fat" +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-030-complex-nested-payload-with-valid-positive-value.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-030-complex-nested-payload-with-valid-positive-value.sdp.md index dd6d821d..ce113fef 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-030-complex-nested-payload-with-valid-positive-value.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-030-complex-nested-payload-with-valid-positive-value.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Complex nested payload with valid positive value" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Complex nested payload with valid positive value + +```gwt +Given a fat event schema for "ComplexSnapshot" with nested positive value payload +When a fat event with nested value 42 is parsed +Then the parsed nested value is 42 +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-031-complex-nested-payload-rejects-negative-value.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-031-complex-nested-payload-rejects-negative-value.sdp.md index c10c5f64..0696fdb2 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-031-complex-nested-payload-rejects-negative-value.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-031-complex-nested-payload-rejects-negative-value.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Complex nested payload rejects negative value" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Complex nested payload rejects negative value + +```gwt +Given a fat event schema for "ComplexSnapshot" with nested positive value payload +When a fat event with nested negative value is parsed +Then the parse throws a validation error +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-032-custom-schema-version-for-fat-events.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-032-custom-schema-version-for-fat-events.sdp.md index 539f07da..32b1a499 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-032-custom-schema-version-for-fat-events.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-032-custom-schema-version-for-fat-events.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Custom schemaVersion for fat events" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: Custom schemaVersion for fat events + +```gwt +Given a fat event schema for "Test" with id payload and schemaVersion 5 +When a fat event with id payload is parsed +Then the parsed schemaVersion is 5 +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-033-domain-event-schema-accepts-any-payload-shape.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-033-domain-event-schema-accepts-any-payload-shape.sdp.md index 14ac1e28..f0878c0a 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-033-domain-event-schema-accepts-any-payload-shape.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-033-domain-event-schema-accepts-any-payload-shape.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "DomainEventSchema accepts any payload shape" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: DomainEventSchema accepts any payload shape + +```gwt +Given valid event metadata +When an event with arbitrary payload is parsed with DomainEventSchema +Then the payload matches the arbitrary input +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-034-enhanced-domain-event-schema-includes-defaults.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-034-enhanced-domain-event-schema-includes-defaults.sdp.md index 968b172e..9ba30540 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-034-enhanced-domain-event-schema-includes-defaults.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-034-enhanced-domain-event-schema-includes-defaults.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "EnhancedDomainEventSchema includes defaults" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: EnhancedDomainEventSchema includes defaults + +```gwt +Given valid event metadata +When an event with simple payload is parsed with EnhancedDomainEventSchema +Then the parsed category is "domain" +And the parsed schemaVersion is 1 +And the payload matches the simple input +``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-035-enhanced-domain-event-schema-allows-optional-metadata.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-035-enhanced-domain-event-schema-allows-optional-metadata.sdp.md index eddc6565..e5323aa9 100644 --- a/specs/behavior/platform-core/events/schemas.examples/s-035-enhanced-domain-event-schema-allows-optional-metadata.sdp.md +++ b/specs/behavior/platform-core/events/schemas.examples/s-035-enhanced-domain-event-schema-allows-optional-metadata.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "EnhancedDomainEventSchema allows optional metadata" from packages/platform-core/tests/features/behavior/events/schemas.feature +- outcome: Executable scenario: EnhancedDomainEventSchema allows optional metadata + +```gwt +Given valid event metadata +When an event with metadata is parsed with EnhancedDomainEventSchema +Then the metadata matches the expected input +``` diff --git a/specs/behavior/platform-core/events/schemas.sdp.md b/specs/behavior/platform-core/events/schemas.sdp.md index 37c4c263..10452358 100644 --- a/specs/behavior/platform-core/events/schemas.sdp.md +++ b/specs/behavior/platform-core/events/schemas.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: schema factory functions that produce typed Zod schemas so that events are validated at runtime with correct eventType, category, and payload (test carrier: packages/platform-core/tests/features/behavior/events/schemas.feature) +- actor: a platform developer +- outcome: schema factory functions that produce typed Zod schemas so that events are validated at runtime with correct eventType, category, and payload + +## Behavior + +- rule: EventMetadataSchema validates required event metadata fields +- rule: EnhancedEventMetadataSchema extends metadata with category and schemaVersion +- rule: createEventSchema creates schemas with literal eventType and typed payload +- rule: createDomainEventSchema creates schemas with category domain +- rule: createIntegrationEventSchema creates schemas with category integration +- rule: createTriggerEventSchema creates schemas with category trigger and minimal payload +- rule: createFatEventSchema creates schemas with category fat and full payload +- rule: DomainEventSchema and EnhancedDomainEventSchema accept any payload diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-001-event-at-current-version-is-returned-as-is.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-001-event-at-current-version-is-returned-as-is.sdp.md index 451e052a..c7567202 100644 --- a/specs/behavior/platform-core/events/upcaster.examples/s-001-event-at-current-version-is-returned-as-is.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.examples/s-001-event-at-current-version-is-returned-as-is.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Event at current version is returned as-is" from packages/platform-core/tests/features/behavior/events/upcaster.feature +- outcome: Executable scenario: Event at current version is returned as-is + +```gwt +Given an upcaster from version 1 to version 2 +And a v2 event with orderId "order_1" and customerId "cust_1" and createdAt 1234567890 +When the upcaster is applied +Then the result was not upcasted +And the original schema version is 2 +And the current schema version is 2 +And the event payload matches the input payload +``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-002-event-is-migrated-from-v1-to-v2.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-002-event-is-migrated-from-v1-to-v2.sdp.md index 9a9d000a..2bcbb9e8 100644 --- a/specs/behavior/platform-core/events/upcaster.examples/s-002-event-is-migrated-from-v1-to-v2.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.examples/s-002-event-is-migrated-from-v1-to-v2.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Event is migrated from v1 to v2" from packages/platform-core/tests/features/behavior/events/upcaster.feature +- outcome: Executable scenario: Event is migrated from v1 to v2 + +```gwt +Given an upcaster from version 1 to version 2 +And a v1 event with orderId "order_1" and customerId "cust_1" +When the upcaster is applied +Then the result was upcasted +And the original schema version is 1 +And the current schema version is 2 +And the event payload has a defined createdAt field +``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-003-event-is-migrated-from-v1-to-v3.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-003-event-is-migrated-from-v1-to-v3.sdp.md index b9f264f5..cfcce313 100644 --- a/specs/behavior/platform-core/events/upcaster.examples/s-003-event-is-migrated-from-v1-to-v3.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.examples/s-003-event-is-migrated-from-v1-to-v3.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Event is migrated from v1 to v3" from packages/platform-core/tests/features/behavior/events/upcaster.feature +- outcome: Executable scenario: Event is migrated from v1 to v3 + +```gwt +Given an upcaster from version 1 to version 3 +And a v1 event with orderId "order_1" and customerId "cust_1" +When the upcaster is applied +Then the result was upcasted +And the original schema version is 1 +And the current schema version is 3 +And the event payload has a defined createdAt field +And the event payload priority is "medium" +``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-004-incomplete-migration-chain-throws-at-creation-time.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-004-incomplete-migration-chain-throws-at-creation-time.sdp.md index 90a0e899..10dc6ed5 100644 --- a/specs/behavior/platform-core/events/upcaster.examples/s-004-incomplete-migration-chain-throws-at-creation-time.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.examples/s-004-incomplete-migration-chain-throws-at-creation-time.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Incomplete migration chain throws at creation time" from packages/platform-core/tests/features/behavior/events/upcaster.feature +- outcome: Executable scenario: Incomplete migration chain throws at creation time + +```gwt +Given the feature fixture is in place +When an upcaster is created with current version 3 but only a v1 migration +Then it throws an error containing "Missing migration for version 2" +``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-005-future-schema-version-throws-future-version-error.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-005-future-schema-version-throws-future-version-error.sdp.md index d44c6df3..8e60c961 100644 --- a/specs/behavior/platform-core/events/upcaster.examples/s-005-future-schema-version-throws-future-version-error.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.examples/s-005-future-schema-version-throws-future-version-error.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Future schema version throws FUTURE_VERSION error" from packages/platform-core/tests/features/behavior/events/upcaster.feature +- outcome: Executable scenario: Future schema version throws FUTURE_VERSION error + +```gwt +Given an upcaster from version 1 to version 2 +And a v5 event with orderId "order_1" and customerId "cust_1" +When the upcaster is applied expecting an error +Then it throws an EventUpcasterError +And the error message contains "is newer than current version" +``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-006-validation-passes-after-migration.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-006-validation-passes-after-migration.sdp.md index 1afaec2d..47667a19 100644 --- a/specs/behavior/platform-core/events/upcaster.examples/s-006-validation-passes-after-migration.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.examples/s-006-validation-passes-after-migration.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Validation passes after migration" from packages/platform-core/tests/features/behavior/events/upcaster.feature +- outcome: Executable scenario: Validation passes after migration + +```gwt +Given an upcaster from version 1 to version 2 with a validator that checks createdAt is a number +And a v1 event with orderId "order_1" and customerId "cust_1" +When the upcaster is applied +Then the result was upcasted +And the event payload has a defined createdAt field +``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-007-validation-fails-after-migration.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-007-validation-fails-after-migration.sdp.md index 9926fa5b..4616e845 100644 --- a/specs/behavior/platform-core/events/upcaster.examples/s-007-validation-fails-after-migration.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.examples/s-007-validation-fails-after-migration.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Validation fails after migration" from packages/platform-core/tests/features/behavior/events/upcaster.feature +- outcome: Executable scenario: Validation fails after migration + +```gwt +Given an upcaster from version 1 to version 2 with a validator that checks createdAt is positive +And a v1 event with orderId "order_1" and customerId "cust_1" +When the upcaster is applied expecting an error +Then it throws an EventUpcasterError +And the error message contains "failed validation" +``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-008-registry-reports-registered-and-unregistered-event-types.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-008-registry-reports-registered-and-unregistered-event-types.sdp.md index d17475ae..2673e567 100644 --- a/specs/behavior/platform-core/events/upcaster.examples/s-008-registry-reports-registered-and-unregistered-event-types.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.examples/s-008-registry-reports-registered-and-unregistered-event-types.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Registry reports registered and unregistered event types" from packages/platform-core/tests/features/behavior/events/upcaster.feature +- outcome: Executable scenario: Registry reports registered and unregistered event types + +```gwt +Given an upcaster registry with "OrderCreated" registered +When the scenario runs +Then the registry has "OrderCreated" +And the registry does not have "UnregisteredEvent" +``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-009-registry-returns-all-registered-event-types.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-009-registry-returns-all-registered-event-types.sdp.md index 3dccce56..913be532 100644 --- a/specs/behavior/platform-core/events/upcaster.examples/s-009-registry-returns-all-registered-event-types.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.examples/s-009-registry-returns-all-registered-event-types.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Registry returns all registered event types" from packages/platform-core/tests/features/behavior/events/upcaster.feature +- outcome: Executable scenario: Registry returns all registered event types + +```gwt +Given an upcaster registry with types: +When the scenario runs +Then getRegisteredTypes contains all of: +And getRegisteredTypes has length 2 +``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-010-second-registration-overrides-the-first.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-010-second-registration-overrides-the-first.sdp.md index ba0ee15d..0e10c9a9 100644 --- a/specs/behavior/platform-core/events/upcaster.examples/s-010-second-registration-overrides-the-first.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.examples/s-010-second-registration-overrides-the-first.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Second registration overrides the first" from packages/platform-core/tests/features/behavior/events/upcaster.feature +- outcome: Executable scenario: Second registration overrides the first + +```gwt +Given an upcaster registry where "OrderCreated" is registered twice +And the first upcaster migrates to v2 with createdAt 1000 +And the second upcaster migrates to v3 with createdAt 2000 and priority "high" +When a v1 OrderCreated event is upcasted via the registry +Then the current schema version is 3 +And the upcasted createdAt is 2000 +And the upcasted priority is "high" +``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-011-registered-event-type-is-upcasted.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-011-registered-event-type-is-upcasted.sdp.md index f49ed9c5..4eddab1a 100644 --- a/specs/behavior/platform-core/events/upcaster.examples/s-011-registered-event-type-is-upcasted.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.examples/s-011-registered-event-type-is-upcasted.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Registered event type is upcasted" from packages/platform-core/tests/features/behavior/events/upcaster.feature +- outcome: Executable scenario: Registered event type is upcasted + +```gwt +Given an upcaster registry with "OrderCreated" registered for v1 to v2 +And a v1 OrderCreated event +When the event is upcasted via the registry +Then the result was upcasted +And the current schema version is 2 +``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-012-unregistered-event-type-is-returned-as-is.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-012-unregistered-event-type-is-returned-as-is.sdp.md index c866f21d..de7b3ced 100644 --- a/specs/behavior/platform-core/events/upcaster.examples/s-012-unregistered-event-type-is-returned-as-is.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.examples/s-012-unregistered-event-type-is-returned-as-is.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Unregistered event type is returned as-is" from packages/platform-core/tests/features/behavior/events/upcaster.feature +- outcome: Executable scenario: Unregistered event type is returned as-is + +```gwt +Given an empty upcaster registry +And an unregistered event with eventType "UnregisteredEvent" +When the event is upcasted via the registry +Then the result was not upcasted +And the event category is "domain" +And the event schema version is 1 +``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-013-static-default-value-is-added.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-013-static-default-value-is-added.sdp.md index 2a8c4a6c..8819beaa 100644 --- a/specs/behavior/platform-core/events/upcaster.examples/s-013-static-default-value-is-added.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.examples/s-013-static-default-value-is-added.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Static default value is added" from packages/platform-core/tests/features/behavior/events/upcaster.feature +- outcome: Executable scenario: Static default value is added + +```gwt +Given an addFieldMigration for "priority" with default "medium" to version 2 +And an event with payload orderId "order_1" +When the migration is applied +Then the payload field "priority" is "medium" +And the schema version is 2 +``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-014-computed-default-value-is-added-from-event-timestamp.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-014-computed-default-value-is-added-from-event-timestamp.sdp.md index 109d97f3..b6416cf7 100644 --- a/specs/behavior/platform-core/events/upcaster.examples/s-014-computed-default-value-is-added-from-event-timestamp.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.examples/s-014-computed-default-value-is-added-from-event-timestamp.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Computed default value is added from event timestamp" from packages/platform-core/tests/features/behavior/events/upcaster.feature +- outcome: Executable scenario: Computed default value is added from event timestamp + +```gwt +Given an addFieldMigration for "createdAt" computed from timestamp to version 2 +And an event with payload orderId "order_1" and timestamp 1234567890 +When the migration is applied +Then the payload field "createdAt" is 1234567890 +And the schema version is 2 +``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-015-field-is-renamed-in-the-payload.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-015-field-is-renamed-in-the-payload.sdp.md index 03840454..9d5b812f 100644 --- a/specs/behavior/platform-core/events/upcaster.examples/s-015-field-is-renamed-in-the-payload.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.examples/s-015-field-is-renamed-in-the-payload.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Field is renamed in the payload" from packages/platform-core/tests/features/behavior/events/upcaster.feature +- outcome: Executable scenario: Field is renamed in the payload + +```gwt +Given a renameFieldMigration from "userId" to "customerId" at version 2 +And an event with payload userId "user_123" +When the rename migration is applied +Then the payload field "customerId" is "user_123" +And the payload field "userId" is undefined +And the schema version is 2 +``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-016-error-has-correct-name-code-and-message.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-016-error-has-correct-name-code-and-message.sdp.md index 941380a5..8b47e52f 100644 --- a/specs/behavior/platform-core/events/upcaster.examples/s-016-error-has-correct-name-code-and-message.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.examples/s-016-error-has-correct-name-code-and-message.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Error has correct name, code, and message" from packages/platform-core/tests/features/behavior/events/upcaster.feature +- outcome: Executable scenario: Error has correct name, code, and message + +```gwt +Given an EventUpcasterError with code "UNKNOWN_EVENT_TYPE" and message "Test error" +When the scenario runs +Then the error name is "EventUpcasterError" +And the error code is "UNKNOWN_EVENT_TYPE" +``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-017-error-stores-context-when-provided.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-017-error-stores-context-when-provided.sdp.md index af1bcac1..21a8f2cf 100644 --- a/specs/behavior/platform-core/events/upcaster.examples/s-017-error-stores-context-when-provided.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.examples/s-017-error-stores-context-when-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Error stores context when provided" from packages/platform-core/tests/features/behavior/events/upcaster.feature +- outcome: Executable scenario: Error stores context when provided + +```gwt +Given an EventUpcasterError with code "INVALID_EVENT" and message "Error" and context: +When the scenario runs +Then the error context matches: +``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-018-error-has-undefined-context-when-not-provided.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-018-error-has-undefined-context-when-not-provided.sdp.md index 9e51d2f3..22f339e5 100644 --- a/specs/behavior/platform-core/events/upcaster.examples/s-018-error-has-undefined-context-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.examples/s-018-error-has-undefined-context-when-not-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Error has undefined context when not provided" from packages/platform-core/tests/features/behavior/events/upcaster.feature +- outcome: Executable scenario: Error has undefined context when not provided + +```gwt +Given an EventUpcasterError with code "UNKNOWN_EVENT_TYPE" and message "Error" +When the scenario runs +Then the error context is undefined +``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-019-error-is-instanceof-error.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-019-error-is-instanceof-error.sdp.md index 72a56591..6b6a5f4a 100644 --- a/specs/behavior/platform-core/events/upcaster.examples/s-019-error-is-instanceof-error.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.examples/s-019-error-is-instanceof-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Error is instanceof Error" from packages/platform-core/tests/features/behavior/events/upcaster.feature +- outcome: Executable scenario: Error is instanceof Error + +```gwt +Given an EventUpcasterError with code "UNKNOWN_EVENT_TYPE" and message "Error" +When the scenario runs +Then the error is an instance of Error +``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-020-error-preserves-specific-code-values.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-020-error-preserves-specific-code-values.sdp.md index 117569fd..524b8b56 100644 --- a/specs/behavior/platform-core/events/upcaster.examples/s-020-error-preserves-specific-code-values.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.examples/s-020-error-preserves-specific-code-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Error preserves specific code values" from packages/platform-core/tests/features/behavior/events/upcaster.feature +- outcome: Executable scenario: Error preserves specific code values + +```gwt +Given an EventUpcasterError with code "MISSING_MIGRATION" and message "Test error" +When the scenario runs +Then the error code is "MISSING_MIGRATION" +``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-021-error-preserves-custom-message.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-021-error-preserves-custom-message.sdp.md index 09189670..01fe20db 100644 --- a/specs/behavior/platform-core/events/upcaster.examples/s-021-error-preserves-custom-message.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.examples/s-021-error-preserves-custom-message.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Error preserves custom message" from packages/platform-core/tests/features/behavior/events/upcaster.feature +- outcome: Executable scenario: Error preserves custom message + +```gwt +Given an EventUpcasterError with code "INVALID_EVENT" and message "Custom message" +When the scenario runs +Then the error message is "Custom message" +``` diff --git a/specs/behavior/platform-core/events/upcaster.sdp.md b/specs/behavior/platform-core/events/upcaster.sdp.md index 46f6c8b1..c98f928e 100644 --- a/specs/behavior/platform-core/events/upcaster.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.sdp.md @@ -10,4 +10,19 @@ relations: ## Intent -- outcome: event schema evolution utilities with chain-based migration so that events can be transparently upgraded to the latest schema version (test carrier: packages/platform-core/tests/features/behavior/events/upcaster.feature) +- actor: a platform developer +- outcome: event schema evolution utilities with chain-based migration so that events can be transparently upgraded to the latest schema version + +## Behavior + +- rule: createEventUpcaster returns events at current version without migration +- rule: createEventUpcaster applies a single migration step +- rule: createEventUpcaster applies multiple migration steps in order +- rule: createEventUpcaster rejects invalid configurations and future versions +- rule: createEventUpcaster supports post-migration validation +- rule: createUpcasterRegistry tracks upcasters by event type +- rule: createUpcasterRegistry overwrites previously registered upcasters +- rule: createUpcasterRegistry upcasts events using the correct registered upcaster +- rule: addFieldMigration adds a field with a static or computed default +- rule: renameFieldMigration renames a field in the payload +- rule: EventUpcasterError captures error metadata diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md index ee3403b1..aa36f4df 100644 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "FSM is created with correct initial state" from packages/platform-core/tests/features/behavior/fsm/fsm.feature +- outcome: Executable scenario: FSM is created with correct initial state + +```gwt +Given a test FSM with initial state "draft" +When the scenario runs +Then the FSM initial state is "draft" +``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-002-fsm-preserves-the-definition.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-002-fsm-preserves-the-definition.sdp.md index 182ca61f..b056302e 100644 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-002-fsm-preserves-the-definition.sdp.md +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-002-fsm-preserves-the-definition.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "FSM preserves the definition" from packages/platform-core/tests/features/behavior/fsm/fsm.feature +- outcome: Executable scenario: FSM preserves the definition + +```gwt +Given a test FSM with initial state "draft" +When the scenario runs +Then the FSM definition initial state is "draft" +And the FSM definition transitions for "draft" are: +``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-003-valid-transitions-return-true.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-003-valid-transitions-return-true.sdp.md index b00fb225..91664b7b 100644 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-003-valid-transitions-return-true.sdp.md +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-003-valid-transitions-return-true.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Valid transitions return true" from packages/platform-core/tests/features/behavior/fsm/fsm.feature +- outcome: Executable scenario: Valid transitions return true + +```gwt +Given a test FSM with initial state "draft" +When the scenario runs +Then canTransition returns true for: +``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-004-invalid-transitions-return-false.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-004-invalid-transitions-return-false.sdp.md index c39a7ccb..8f5f8c45 100644 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-004-invalid-transitions-return-false.sdp.md +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-004-invalid-transitions-return-false.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Invalid transitions return false" from packages/platform-core/tests/features/behavior/fsm/fsm.feature +- outcome: Executable scenario: Invalid transitions return false + +```gwt +Given a test FSM with initial state "draft" +When the scenario runs +Then canTransition returns false for: +``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-005-standalone-can-transition-function-works.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-005-standalone-can-transition-function-works.sdp.md index 7b2e3e61..c35d0cec 100644 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-005-standalone-can-transition-function-works.sdp.md +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-005-standalone-can-transition-function-works.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Standalone canTransition function works" from packages/platform-core/tests/features/behavior/fsm/fsm.feature +- outcome: Executable scenario: Standalone canTransition function works + +```gwt +Given a test FSM with initial state "draft" +When the scenario runs +Then standalone canTransition returns true for "draft" to "submitted" +And standalone canTransition returns false for "draft" to "confirmed" +``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-006-valid-transitions-do-not-throw.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-006-valid-transitions-do-not-throw.sdp.md index 6c2c9cab..5efb08ff 100644 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-006-valid-transitions-do-not-throw.sdp.md +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-006-valid-transitions-do-not-throw.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Valid transitions do not throw" from packages/platform-core/tests/features/behavior/fsm/fsm.feature +- outcome: Executable scenario: Valid transitions do not throw + +```gwt +Given a test FSM with initial state "draft" +When the scenario runs +Then assertTransition does not throw for: +``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-007-invalid-transition-throws-fsm-transition-error.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-007-invalid-transition-throws-fsm-transition-error.sdp.md index 8876be48..6c4544ea 100644 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-007-invalid-transition-throws-fsm-transition-error.sdp.md +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-007-invalid-transition-throws-fsm-transition-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Invalid transition throws FSMTransitionError" from packages/platform-core/tests/features/behavior/fsm/fsm.feature +- outcome: Executable scenario: Invalid transition throws FSMTransitionError + +```gwt +Given a test FSM with initial state "draft" +When I attempt transition from "draft" to "confirmed" +Then an FSMTransitionError is thrown +``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-008-fsm-transition-error-includes-transition-details.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-008-fsm-transition-error-includes-transition-details.sdp.md index c16a104b..bee8fb3e 100644 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-008-fsm-transition-error-includes-transition-details.sdp.md +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-008-fsm-transition-error-includes-transition-details.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "FSMTransitionError includes transition details" from packages/platform-core/tests/features/behavior/fsm/fsm.feature +- outcome: Executable scenario: FSMTransitionError includes transition details + +```gwt +Given a test FSM with initial state "draft" +When I attempt transition from "draft" to "confirmed" +Then the error has from "draft" and to "confirmed" +And the error has valid transitions: +And the error has code "FSM_INVALID_TRANSITION" +``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-009-standalone-assert-transition-function-works.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-009-standalone-assert-transition-function-works.sdp.md index 99a49cd2..007fb780 100644 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-009-standalone-assert-transition-function-works.sdp.md +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-009-standalone-assert-transition-function-works.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Standalone assertTransition function works" from packages/platform-core/tests/features/behavior/fsm/fsm.feature +- outcome: Executable scenario: Standalone assertTransition function works + +```gwt +Given a test FSM with initial state "draft" +When the scenario runs +Then standalone assertTransition does not throw for "draft" to "submitted" +And standalone assertTransition throws FSMTransitionError for "draft" to "confirmed" +``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-010-returns-valid-transitions-for-each-state.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-010-returns-valid-transitions-for-each-state.sdp.md index b93723c2..70c56882 100644 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-010-returns-valid-transitions-for-each-state.sdp.md +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-010-returns-valid-transitions-for-each-state.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns valid transitions for each state" from packages/platform-core/tests/features/behavior/fsm/fsm.feature +- outcome: Executable scenario: Returns valid transitions for each state + +```gwt +Given a test FSM with initial state "draft" +When the scenario runs +Then validTransitions returns for each state: +``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-011-standalone-valid-transitions-function-works.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-011-standalone-valid-transitions-function-works.sdp.md index 7b7c5aec..544ea78b 100644 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-011-standalone-valid-transitions-function-works.sdp.md +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-011-standalone-valid-transitions-function-works.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Standalone validTransitions function works" from packages/platform-core/tests/features/behavior/fsm/fsm.feature +- outcome: Executable scenario: Standalone validTransitions function works + +```gwt +Given a test FSM with initial state "draft" +When the scenario runs +Then standalone validTransitions for "draft" returns: +``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-012-terminal-states-are-identified.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-012-terminal-states-are-identified.sdp.md index 291745b0..ea134608 100644 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-012-terminal-states-are-identified.sdp.md +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-012-terminal-states-are-identified.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Terminal states are identified" from packages/platform-core/tests/features/behavior/fsm/fsm.feature +- outcome: Executable scenario: Terminal states are identified + +```gwt +Given a test FSM with initial state "draft" +When the scenario runs +Then isTerminal returns true for: +``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-013-non-terminal-states-are-identified.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-013-non-terminal-states-are-identified.sdp.md index 284d460e..fd5edcc5 100644 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-013-non-terminal-states-are-identified.sdp.md +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-013-non-terminal-states-are-identified.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Non-terminal states are identified" from packages/platform-core/tests/features/behavior/fsm/fsm.feature +- outcome: Executable scenario: Non-terminal states are identified + +```gwt +Given a test FSM with initial state "draft" +When the scenario runs +Then isTerminal returns false for: +``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-014-standalone-is-terminal-function-works.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-014-standalone-is-terminal-function-works.sdp.md index 8a8b273e..1ddae1ea 100644 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-014-standalone-is-terminal-function-works.sdp.md +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-014-standalone-is-terminal-function-works.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Standalone isTerminal function works" from packages/platform-core/tests/features/behavior/fsm/fsm.feature +- outcome: Executable scenario: Standalone isTerminal function works + +```gwt +Given a test FSM with initial state "draft" +When the scenario runs +Then standalone isTerminal returns true for "confirmed" +And standalone isTerminal returns false for "draft" +``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-015-valid-states-return-true.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-015-valid-states-return-true.sdp.md index ca716ad5..176ea405 100644 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-015-valid-states-return-true.sdp.md +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-015-valid-states-return-true.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Valid states return true" from packages/platform-core/tests/features/behavior/fsm/fsm.feature +- outcome: Executable scenario: Valid states return true + +```gwt +Given a test FSM with initial state "draft" +When the scenario runs +Then isValidState returns true for: +``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-016-invalid-states-return-false.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-016-invalid-states-return-false.sdp.md index 351605a2..de2ed5e7 100644 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-016-invalid-states-return-false.sdp.md +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-016-invalid-states-return-false.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Invalid states return false" from packages/platform-core/tests/features/behavior/fsm/fsm.feature +- outcome: Executable scenario: Invalid states return false + +```gwt +Given a test FSM with initial state "draft" +When the scenario runs +Then isValidState returns false for: +``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-017-standalone-is-valid-state-function-works.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-017-standalone-is-valid-state-function-works.sdp.md index 5b08cf85..3bcc443f 100644 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-017-standalone-is-valid-state-function-works.sdp.md +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-017-standalone-is-valid-state-function-works.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Standalone isValidState function works" from packages/platform-core/tests/features/behavior/fsm/fsm.feature +- outcome: Executable scenario: Standalone isValidState function works + +```gwt +Given a test FSM with initial state "draft" +When the scenario runs +Then standalone isValidState returns true for "draft" +And standalone isValidState returns false for "unknown" +``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-018-error-has-correct-properties.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-018-error-has-correct-properties.sdp.md index 484d48bc..49e9063b 100644 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-018-error-has-correct-properties.sdp.md +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-018-error-has-correct-properties.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Error has correct properties" from packages/platform-core/tests/features/behavior/fsm/fsm.feature +- outcome: Executable scenario: Error has correct properties + +```gwt +Given the feature fixture is in place +When I create an FSMTransitionError from "draft" to "confirmed" with valid transitions: +Then the error name is "FSMTransitionError" +And the error code is "FSM_INVALID_TRANSITION" +And the error has from "draft" and to "confirmed" +And the error message contains "Invalid transition" +And the error message contains "draft" +And the error message contains "confirmed" +``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-019-error-handles-terminal-states-in-message.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-019-error-handles-terminal-states-in-message.sdp.md index 610be5b4..4f718072 100644 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-019-error-handles-terminal-states-in-message.sdp.md +++ b/specs/behavior/platform-core/fsm/fsm.examples/s-019-error-handles-terminal-states-in-message.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Error handles terminal states in message" from packages/platform-core/tests/features/behavior/fsm/fsm.feature +- outcome: Executable scenario: Error handles terminal states in message + +```gwt +Given the feature fixture is in place +When I create an FSMTransitionError from "confirmed" to "draft" with no valid transitions +Then the error message contains "(none - terminal state)" +``` diff --git a/specs/behavior/platform-core/fsm/fsm.sdp.md b/specs/behavior/platform-core/fsm/fsm.sdp.md index 4c403cbf..04cf7e3c 100644 --- a/specs/behavior/platform-core/fsm/fsm.sdp.md +++ b/specs/behavior/platform-core/fsm/fsm.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: a finite state machine with transition validation so that domain state changes are always safe and auditable (test carrier: packages/platform-core/tests/features/behavior/fsm/fsm.feature) +- actor: a platform developer +- outcome: a finite state machine with transition validation so that domain state changes are always safe and auditable + +## Behavior + +- rule: defineFSM creates an FSM with correct initial state and definition +- rule: canTransition returns true only for transitions defined in the FSM +- rule: assertTransition throws FSMTransitionError for invalid transitions +- rule: validTransitions returns the list of allowed target states +- rule: isTerminal identifies states with no outgoing transitions +- rule: isValidState returns true only for states defined in the FSM +- rule: FSMTransitionError has correct error properties diff --git a/specs/behavior/platform-core/handlers/result.examples/s-001-success-result-has-correct-structure.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-001-success-result-has-correct-structure.sdp.md index dda0d36d..b5f0250e 100644 --- a/specs/behavior/platform-core/handlers/result.examples/s-001-success-result-has-correct-structure.sdp.md +++ b/specs/behavior/platform-core/handlers/result.examples/s-001-success-result-has-correct-structure.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Success result has correct structure" from packages/platform-core/tests/features/behavior/handlers/result.feature +- outcome: Executable scenario: Success result has correct structure + +```gwt +Given a data payload with orderId "order_123" and customerId "cust_456" +And a test event +And a version number 5 +When I create a success result +Then the result has all expected fields: +And the result event matches the test event +``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-002-success-result-preserves-typed-data.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-002-success-result-preserves-typed-data.sdp.md index 6d0b655e..0a8032b8 100644 --- a/specs/behavior/platform-core/handlers/result.examples/s-002-success-result-preserves-typed-data.sdp.md +++ b/specs/behavior/platform-core/handlers/result.examples/s-002-success-result-preserves-typed-data.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Success result preserves typed data" from packages/platform-core/tests/features/behavior/handlers/result.feature +- outcome: Executable scenario: Success result preserves typed data + +```gwt +Given a typed data payload with orderId "order_123" and customerId "cust_456" +And a test event +When I create a success result with version 1 +Then the result data fields are: +``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-003-success-result-returns-status-as-literal-type.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-003-success-result-returns-status-as-literal-type.sdp.md index 520365ea..4d2681d9 100644 --- a/specs/behavior/platform-core/handlers/result.examples/s-003-success-result-returns-status-as-literal-type.sdp.md +++ b/specs/behavior/platform-core/handlers/result.examples/s-003-success-result-returns-status-as-literal-type.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Success result returns status as literal type" from packages/platform-core/tests/features/behavior/handlers/result.feature +- outcome: Executable scenario: Success result returns status as literal type + +```gwt +Given an empty data payload +And a test event +When I create a success result with version 0 +Then the result status is "success" +``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-004-rejected-result-has-code-and-reason.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-004-rejected-result-has-code-and-reason.sdp.md index 2aec2438..1f60df33 100644 --- a/specs/behavior/platform-core/handlers/result.examples/s-004-rejected-result-has-code-and-reason.sdp.md +++ b/specs/behavior/platform-core/handlers/result.examples/s-004-rejected-result-has-code-and-reason.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejected result has code and reason" from packages/platform-core/tests/features/behavior/handlers/result.feature +- outcome: Executable scenario: Rejected result has code and reason + +```gwt +Given the feature fixture is in place +When I create a rejected result with code "ORDER_NOT_FOUND" and reason "Order not found" +Then the rejected result has all expected fields: +``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-005-rejected-result-includes-context-when-provided.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-005-rejected-result-includes-context-when-provided.sdp.md index cd7bb619..7450e30b 100644 --- a/specs/behavior/platform-core/handlers/result.examples/s-005-rejected-result-includes-context-when-provided.sdp.md +++ b/specs/behavior/platform-core/handlers/result.examples/s-005-rejected-result-includes-context-when-provided.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Rejected result includes context when provided" from packages/platform-core/tests/features/behavior/handlers/result.feature +- outcome: Executable scenario: Rejected result includes context when provided + +```gwt +Given the feature fixture is in place +When I create a rejected result with code "ORDER_NOT_FOUND" and reason "Order not found" and context +Then the rejected result status is "rejected" +And the rejected result code is "ORDER_NOT_FOUND" +And the rejected result context contains orderId "order_123" +And the rejected result context searchedAt is a number +``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-006-rejected-result-omits-context-when-not-provided.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-006-rejected-result-omits-context-when-not-provided.sdp.md index 17e2a0b8..75eb4fc5 100644 --- a/specs/behavior/platform-core/handlers/result.examples/s-006-rejected-result-omits-context-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/handlers/result.examples/s-006-rejected-result-omits-context-when-not-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejected result omits context when not provided" from packages/platform-core/tests/features/behavior/handlers/result.feature +- outcome: Executable scenario: Rejected result omits context when not provided + +```gwt +Given the feature fixture is in place +When I create a rejected result with code "VALIDATION_ERROR" and reason "Invalid input" +Then the rejected result does not have a context property +``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-007-rejected-result-returns-status-as-literal-type.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-007-rejected-result-returns-status-as-literal-type.sdp.md index 917a961a..fe210331 100644 --- a/specs/behavior/platform-core/handlers/result.examples/s-007-rejected-result-returns-status-as-literal-type.sdp.md +++ b/specs/behavior/platform-core/handlers/result.examples/s-007-rejected-result-returns-status-as-literal-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejected result returns status as literal type" from packages/platform-core/tests/features/behavior/handlers/result.feature +- outcome: Executable scenario: Rejected result returns status as literal type + +```gwt +Given the feature fixture is in place +When I create a rejected result with code "ERROR" and reason "message" +Then the rejected result status is "rejected" +``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-008-failed-result-has-event-data.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-008-failed-result-has-event-data.sdp.md index 8d7d6679..bf198074 100644 --- a/specs/behavior/platform-core/handlers/result.examples/s-008-failed-result-has-event-data.sdp.md +++ b/specs/behavior/platform-core/handlers/result.examples/s-008-failed-result-has-event-data.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Failed result has event data" from packages/platform-core/tests/features/behavior/handlers/result.feature +- outcome: Executable scenario: Failed result has event data + +```gwt +Given a test event with eventType "ReservationFailed" +When I create a failed result with reason "Insufficient stock" +Then the failed result has all expected fields: +And the failed result event matches the test event +``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-009-failed-result-includes-expected-version-when-provided.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-009-failed-result-includes-expected-version-when-provided.sdp.md index 97b47267..1b0542f6 100644 --- a/specs/behavior/platform-core/handlers/result.examples/s-009-failed-result-includes-expected-version-when-provided.sdp.md +++ b/specs/behavior/platform-core/handlers/result.examples/s-009-failed-result-includes-expected-version-when-provided.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Failed result includes expectedVersion when provided" from packages/platform-core/tests/features/behavior/handlers/result.feature +- outcome: Executable scenario: Failed result includes expectedVersion when provided + +```gwt +Given a test event +When I create a failed result with reason "Operation failed" and expectedVersion 10 +Then the failed result status is "failed" +And the failed result expectedVersion is 10 +``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-010-failed-result-includes-context-when-provided.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-010-failed-result-includes-context-when-provided.sdp.md index 96f6fe81..f2947d48 100644 --- a/specs/behavior/platform-core/handlers/result.examples/s-010-failed-result-includes-context-when-provided.sdp.md +++ b/specs/behavior/platform-core/handlers/result.examples/s-010-failed-result-includes-context-when-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Failed result includes context when provided" from packages/platform-core/tests/features/behavior/handlers/result.feature +- outcome: Executable scenario: Failed result includes context when provided + +```gwt +Given a test event +When I create a failed result with reason "Operation failed" and context +Then the failed result context is: +``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-011-failed-result-includes-both-expected-version-and-context.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-011-failed-result-includes-both-expected-version-and-context.sdp.md index 5e7fc7e7..2815b41e 100644 --- a/specs/behavior/platform-core/handlers/result.examples/s-011-failed-result-includes-both-expected-version-and-context.sdp.md +++ b/specs/behavior/platform-core/handlers/result.examples/s-011-failed-result-includes-both-expected-version-and-context.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Failed result includes both expectedVersion and context" from packages/platform-core/tests/features/behavior/handlers/result.feature +- outcome: Executable scenario: Failed result includes both expectedVersion and context + +```gwt +Given a test event +When I create a failed result with reason "Operation failed" and expectedVersion 5 and context +Then the failed result expectedVersion is 5 +And the failed result context contains detail "extra info" +``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-012-failed-result-omits-optional-properties-when-not-provided.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-012-failed-result-omits-optional-properties-when-not-provided.sdp.md index 5aa2895c..9ce69284 100644 --- a/specs/behavior/platform-core/handlers/result.examples/s-012-failed-result-omits-optional-properties-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/handlers/result.examples/s-012-failed-result-omits-optional-properties-when-not-provided.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Failed result omits optional properties when not provided" from packages/platform-core/tests/features/behavior/handlers/result.feature +- outcome: Executable scenario: Failed result omits optional properties when not provided + +```gwt +Given a test event +When I create a failed result with reason "Simple failure" +Then the failed result does not have expectedVersion property +And the failed result does not have context property +``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-013-failed-result-returns-status-as-literal-type.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-013-failed-result-returns-status-as-literal-type.sdp.md index 138a52fd..3536ad36 100644 --- a/specs/behavior/platform-core/handlers/result.examples/s-013-failed-result-returns-status-as-literal-type.sdp.md +++ b/specs/behavior/platform-core/handlers/result.examples/s-013-failed-result-returns-status-as-literal-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Failed result returns status as literal type" from packages/platform-core/tests/features/behavior/handlers/result.feature +- outcome: Executable scenario: Failed result returns status as literal type + +```gwt +Given a test event +When I create a failed result with reason "message" +Then the failed result status is "failed" +``` diff --git a/specs/behavior/platform-core/handlers/result.sdp.md b/specs/behavior/platform-core/handlers/result.sdp.md index 9494989a..b5912a11 100644 --- a/specs/behavior/platform-core/handlers/result.sdp.md +++ b/specs/behavior/platform-core/handlers/result.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Result helper functions for dual-write command handlers: - successResult: Create success results with event data - rejectedResult: Create rejection results for invariant failures - failedResult: Create failure results that still emit events (test carrier: packages/platform-core/tests/features/behavior/handlers/result.feature) +- outcome: Handler Result Helpers + +## Behavior + +- rule: successResult creates a success result with status, data, version, and event +- rule: rejectedResult creates a rejection result with code, reason, and optional context +- rule: failedResult creates a failure result with event data and optional fields diff --git a/specs/behavior/platform-core/ids/branded.examples/s-001-factory-functions-produce-branded-i-ds-preserving-the-input-value.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-001-factory-functions-produce-branded-i-ds-preserving-the-input-value.sdp.md index 5721d50c..d398c392 100644 --- a/specs/behavior/platform-core/ids/branded.examples/s-001-factory-functions-produce-branded-i-ds-preserving-the-input-value.sdp.md +++ b/specs/behavior/platform-core/ids/branded.examples/s-001-factory-functions-produce-branded-i-ds-preserving-the-input-value.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Factory functions produce branded IDs preserving the input value" from packages/platform-core/tests/features/behavior/ids/branded.feature +- outcome: Executable scenario: Factory functions produce branded IDs preserving the input value + +```gwt +Given the following raw ID strings: +When each factory function is called with its input +Then each result equals its input string +And each result is assignable to its branded type +``` diff --git a/specs/behavior/platform-core/ids/branded.examples/s-002-branded-i-ds-are-assignable-to-plain-string-variables.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-002-branded-i-ds-are-assignable-to-plain-string-variables.sdp.md index 64b059bb..c6159b37 100644 --- a/specs/behavior/platform-core/ids/branded.examples/s-002-branded-i-ds-are-assignable-to-plain-string-variables.sdp.md +++ b/specs/behavior/platform-core/ids/branded.examples/s-002-branded-i-ds-are-assignable-to-plain-string-variables.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Branded IDs are assignable to plain string variables" from packages/platform-core/tests/features/behavior/ids/branded.feature +- outcome: Executable scenario: Branded IDs are assignable to plain string variables + +```gwt +Given branded IDs created from the following inputs: +When each branded ID is assigned to a string variable +Then each string variable equals its original input +``` diff --git a/specs/behavior/platform-core/ids/branded.examples/s-003-branded-i-ds-support-standard-string-methods.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-003-branded-i-ds-support-standard-string-methods.sdp.md index 66d3111a..8cd2df91 100644 --- a/specs/behavior/platform-core/ids/branded.examples/s-003-branded-i-ds-support-standard-string-methods.sdp.md +++ b/specs/behavior/platform-core/ids/branded.examples/s-003-branded-i-ds-support-standard-string-methods.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Branded IDs support standard string methods" from packages/platform-core/tests/features/behavior/ids/branded.feature +- outcome: Executable scenario: Branded IDs support standard string methods + +```gwt +Given a CommandId created from "cmd_TEST_123" +When string methods are called on the branded ID +Then toLowerCase returns "cmd_test_123" +And startsWith "cmd_" returns true +And length equals 12 +``` diff --git a/specs/behavior/platform-core/ids/branded.examples/s-004-generators-produce-correctly-prefixed-branded-i-ds.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-004-generators-produce-correctly-prefixed-branded-i-ds.sdp.md index 0b3c0e23..4698fa91 100644 --- a/specs/behavior/platform-core/ids/branded.examples/s-004-generators-produce-correctly-prefixed-branded-i-ds.sdp.md +++ b/specs/behavior/platform-core/ids/branded.examples/s-004-generators-produce-correctly-prefixed-branded-i-ds.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Generators produce correctly prefixed branded IDs" from packages/platform-core/tests/features/behavior/ids/branded.feature +- outcome: Executable scenario: Generators produce correctly prefixed branded IDs + +```gwt +Given the feature fixture is in place +When the following generators are called: +Then each result starts with its expected prefix +``` diff --git a/specs/behavior/platform-core/ids/branded.examples/s-005-command-and-correlation-generators-produce-valid-uuid-v7-after-prefix.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-005-command-and-correlation-generators-produce-valid-uuid-v7-after-prefix.sdp.md index 11de3c01..2a0dc22e 100644 --- a/specs/behavior/platform-core/ids/branded.examples/s-005-command-and-correlation-generators-produce-valid-uuid-v7-after-prefix.sdp.md +++ b/specs/behavior/platform-core/ids/branded.examples/s-005-command-and-correlation-generators-produce-valid-uuid-v7-after-prefix.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Command and correlation generators produce valid UUID v7 after prefix" from packages/platform-core/tests/features/behavior/ids/branded.feature +- outcome: Executable scenario: Command and correlation generators produce valid UUID v7 after prefix + +```gwt +Given the feature fixture is in place +When generateCommandId is called and generateCorrelationId is called +Then the result after removing "cmd_" matches UUID v7 format +And the result after removing "corr_" matches UUID v7 format +``` diff --git a/specs/behavior/platform-core/ids/branded.examples/s-006-is-valid-id-string-returns-true-for-non-empty-strings.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-006-is-valid-id-string-returns-true-for-non-empty-strings.sdp.md index 95ec0292..0bffa000 100644 --- a/specs/behavior/platform-core/ids/branded.examples/s-006-is-valid-id-string-returns-true-for-non-empty-strings.sdp.md +++ b/specs/behavior/platform-core/ids/branded.examples/s-006-is-valid-id-string-returns-true-for-non-empty-strings.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isValidIdString returns true for non-empty strings" from packages/platform-core/tests/features/behavior/ids/branded.feature +- outcome: Executable scenario: isValidIdString returns true for non-empty strings + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isValidIdString returns true for all of: +``` diff --git a/specs/behavior/platform-core/ids/branded.examples/s-007-is-valid-id-string-returns-false-for-empty-string.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-007-is-valid-id-string-returns-false-for-empty-string.sdp.md index fd51d15d..5dffc4c8 100644 --- a/specs/behavior/platform-core/ids/branded.examples/s-007-is-valid-id-string-returns-false-for-empty-string.sdp.md +++ b/specs/behavior/platform-core/ids/branded.examples/s-007-is-valid-id-string-returns-false-for-empty-string.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isValidIdString returns false for empty string" from packages/platform-core/tests/features/behavior/ids/branded.feature +- outcome: Executable scenario: isValidIdString returns false for empty string + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isValidIdString returns false for "" +``` diff --git a/specs/behavior/platform-core/ids/branded.examples/s-008-is-valid-id-string-returns-false-for-non-string-values.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-008-is-valid-id-string-returns-false-for-non-string-values.sdp.md index 3dab2d0f..7b674753 100644 --- a/specs/behavior/platform-core/ids/branded.examples/s-008-is-valid-id-string-returns-false-for-non-string-values.sdp.md +++ b/specs/behavior/platform-core/ids/branded.examples/s-008-is-valid-id-string-returns-false-for-non-string-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isValidIdString returns false for non-string values" from packages/platform-core/tests/features/behavior/ids/branded.feature +- outcome: Executable scenario: isValidIdString returns false for non-string values + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isValidIdString returns false for all non-string values: +``` diff --git a/specs/behavior/platform-core/ids/branded.examples/s-009-is-valid-id-string-narrows-type-for-type-script.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-009-is-valid-id-string-narrows-type-for-type-script.sdp.md index 3654e957..b524258e 100644 --- a/specs/behavior/platform-core/ids/branded.examples/s-009-is-valid-id-string-narrows-type-for-type-script.sdp.md +++ b/specs/behavior/platform-core/ids/branded.examples/s-009-is-valid-id-string-narrows-type-for-type-script.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isValidIdString narrows type for TypeScript" from packages/platform-core/tests/features/behavior/ids/branded.feature +- outcome: Executable scenario: isValidIdString narrows type for TypeScript + +```gwt +Given an unknown value "test_id" +When isValidIdString returns true +Then the value is usable as a string with length greater than 0 +``` diff --git a/specs/behavior/platform-core/ids/branded.examples/s-010-n-100-generated-command-ids-are-all-unique.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-010-n-100-generated-command-ids-are-all-unique.sdp.md index 43ca3fd5..af496906 100644 --- a/specs/behavior/platform-core/ids/branded.examples/s-010-n-100-generated-command-ids-are-all-unique.sdp.md +++ b/specs/behavior/platform-core/ids/branded.examples/s-010-n-100-generated-command-ids-are-all-unique.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "100 generated CommandIds are all unique" from packages/platform-core/tests/features/behavior/ids/branded.feature +- outcome: Executable scenario: 100 generated CommandIds are all unique + +```gwt +Given the feature fixture is in place +When 100 CommandIds are generated +Then all 100 are distinct +``` diff --git a/specs/behavior/platform-core/ids/branded.examples/s-011-n-100-generated-correlation-ids-are-all-unique.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-011-n-100-generated-correlation-ids-are-all-unique.sdp.md index 48075062..ff673fb7 100644 --- a/specs/behavior/platform-core/ids/branded.examples/s-011-n-100-generated-correlation-ids-are-all-unique.sdp.md +++ b/specs/behavior/platform-core/ids/branded.examples/s-011-n-100-generated-correlation-ids-are-all-unique.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "100 generated CorrelationIds are all unique" from packages/platform-core/tests/features/behavior/ids/branded.feature +- outcome: Executable scenario: 100 generated CorrelationIds are all unique + +```gwt +Given the feature fixture is in place +When 100 CorrelationIds are generated +Then all 100 are distinct +``` diff --git a/specs/behavior/platform-core/ids/branded.sdp.md b/specs/behavior/platform-core/ids/branded.sdp.md index c8cf2236..44309ffb 100644 --- a/specs/behavior/platform-core/ids/branded.sdp.md +++ b/specs/behavior/platform-core/ids/branded.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: branded ID types that provide compile-time safety so that different ID kinds cannot be accidentally interchanged (test carrier: packages/platform-core/tests/features/behavior/ids/branded.feature) +- actor: a platform developer +- outcome: branded ID types that provide compile-time safety so that different ID kinds cannot be accidentally interchanged + +## Behavior + +- rule: Factory functions create branded IDs from raw strings +- rule: Branded IDs remain fully compatible with string operations +- rule: ID generators produce correctly branded and prefixed IDs +- rule: isValidIdString validates and narrows unknown values to strings +- rule: ID generators produce unique values across repeated calls diff --git a/specs/behavior/platform-core/ids/generator.examples/s-001-generated-id-matches-the-expected-format.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-001-generated-id-matches-the-expected-format.sdp.md index 58aa34f5..b31c1f4e 100644 --- a/specs/behavior/platform-core/ids/generator.examples/s-001-generated-id-matches-the-expected-format.sdp.md +++ b/specs/behavior/platform-core/ids/generator.examples/s-001-generated-id-matches-the-expected-format.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Generated ID matches the expected format" from packages/platform-core/tests/features/behavior/ids/generator.feature +- outcome: Executable scenario: Generated ID matches the expected format + +```gwt +Given the feature fixture is in place +When generateId is called with context "orders" and type "order" +Then the result matches pattern "^orders_order_[0-9a-f-]{36}$" +``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-002-each-call-produces-a-unique-id.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-002-each-call-produces-a-unique-id.sdp.md index c1e8334d..980b43ad 100644 --- a/specs/behavior/platform-core/ids/generator.examples/s-002-each-call-produces-a-unique-id.sdp.md +++ b/specs/behavior/platform-core/ids/generator.examples/s-002-each-call-produces-a-unique-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Each call produces a unique ID" from packages/platform-core/tests/features/behavior/ids/generator.feature +- outcome: Executable scenario: Each call produces a unique ID + +```gwt +Given the feature fixture is in place +When generateId is called twice with context "orders" and type "order" +Then the two IDs are different +``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-003-generated-id-starts-with-the-provided-context-and-type.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-003-generated-id-starts-with-the-provided-context-and-type.sdp.md index eb66c9b4..18a21dea 100644 --- a/specs/behavior/platform-core/ids/generator.examples/s-003-generated-id-starts-with-the-provided-context-and-type.sdp.md +++ b/specs/behavior/platform-core/ids/generator.examples/s-003-generated-id-starts-with-the-provided-context-and-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Generated ID starts with the provided context and type" from packages/platform-core/tests/features/behavior/ids/generator.feature +- outcome: Executable scenario: Generated ID starts with the provided context and type + +```gwt +Given the feature fixture is in place +When generateId is called with context "inventory" and type "product" +Then the result starts with "inventory_product_" +``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-004-lowercase-alphanumeric-values-are-accepted-for-context-and-type.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-004-lowercase-alphanumeric-values-are-accepted-for-context-and-type.sdp.md index cc3d953b..87f0e896 100644 --- a/specs/behavior/platform-core/ids/generator.examples/s-004-lowercase-alphanumeric-values-are-accepted-for-context-and-type.sdp.md +++ b/specs/behavior/platform-core/ids/generator.examples/s-004-lowercase-alphanumeric-values-are-accepted-for-context-and-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Lowercase alphanumeric values are accepted for context and type" from packages/platform-core/tests/features/behavior/ids/generator.feature +- outcome: Executable scenario: Lowercase alphanumeric values are accepted for context and type + +```gwt +Given the feature fixture is in place +When generateId is called with the following inputs: +Then each result starts with its expected prefix +``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-005-empty-context-or-type-throws-an-error.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-005-empty-context-or-type-throws-an-error.sdp.md index 406760c8..b32285ad 100644 --- a/specs/behavior/platform-core/ids/generator.examples/s-005-empty-context-or-type-throws-an-error.sdp.md +++ b/specs/behavior/platform-core/ids/generator.examples/s-005-empty-context-or-type-throws-an-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Empty context or type throws an error" from packages/platform-core/tests/features/behavior/ids/generator.feature +- outcome: Executable scenario: Empty context or type throws an error + +```gwt +Given the feature fixture is in place +When the scenario runs +Then generateId throws for invalid inputs: +``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-006-context-with-disallowed-characters-throws-an-error.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-006-context-with-disallowed-characters-throws-an-error.sdp.md index ef30c7f7..f5f5d9be 100644 --- a/specs/behavior/platform-core/ids/generator.examples/s-006-context-with-disallowed-characters-throws-an-error.sdp.md +++ b/specs/behavior/platform-core/ids/generator.examples/s-006-context-with-disallowed-characters-throws-an-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Context with disallowed characters throws an error" from packages/platform-core/tests/features/behavior/ids/generator.feature +- outcome: Executable scenario: Context with disallowed characters throws an error + +```gwt +Given the feature fixture is in place +When the scenario runs +Then generateId throws for invalid inputs: +``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-007-type-with-underscore-throws-an-error.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-007-type-with-underscore-throws-an-error.sdp.md index 6c60563f..0ab8ae10 100644 --- a/specs/behavior/platform-core/ids/generator.examples/s-007-type-with-underscore-throws-an-error.sdp.md +++ b/specs/behavior/platform-core/ids/generator.examples/s-007-type-with-underscore-throws-an-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Type with underscore throws an error" from packages/platform-core/tests/features/behavior/ids/generator.feature +- outcome: Executable scenario: Type with underscore throws an error + +```gwt +Given the feature fixture is in place +When the scenario runs +Then generateId throws for invalid inputs: +``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-008-a-well-formed-id-is-parsed-into-its-components.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-008-a-well-formed-id-is-parsed-into-its-components.sdp.md index 9a50bbdb..6545f5db 100644 --- a/specs/behavior/platform-core/ids/generator.examples/s-008-a-well-formed-id-is-parsed-into-its-components.sdp.md +++ b/specs/behavior/platform-core/ids/generator.examples/s-008-a-well-formed-id-is-parsed-into-its-components.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "A well-formed ID is parsed into its components" from packages/platform-core/tests/features/behavior/ids/generator.feature +- outcome: Executable scenario: A well-formed ID is parsed into its components + +```gwt +Given the ID string "orders_order_0190a7c4-1234-7abc-8def-1234567890ab" +When parseId is called +Then the parsed result is: +``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-009-an-id-produced-by-generate-id-is-parseable.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-009-an-id-produced-by-generate-id-is-parseable.sdp.md index c7efab1f..5c82fc8b 100644 --- a/specs/behavior/platform-core/ids/generator.examples/s-009-an-id-produced-by-generate-id-is-parseable.sdp.md +++ b/specs/behavior/platform-core/ids/generator.examples/s-009-an-id-produced-by-generate-id-is-parseable.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "An ID produced by generateId is parseable" from packages/platform-core/tests/features/behavior/ids/generator.feature +- outcome: Executable scenario: An ID produced by generateId is parseable + +```gwt +Given an ID generated with context "inventory" and type "product" +When parseId is called +Then the parsed context is "inventory" +And the parsed type is "product" +And the parsed uuid matches "^[0-9a-f-]{36}$" +``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-010-uuid-portion-containing-underscores-is-preserved.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-010-uuid-portion-containing-underscores-is-preserved.sdp.md index 2106c594..c0440f9c 100644 --- a/specs/behavior/platform-core/ids/generator.examples/s-010-uuid-portion-containing-underscores-is-preserved.sdp.md +++ b/specs/behavior/platform-core/ids/generator.examples/s-010-uuid-portion-containing-underscores-is-preserved.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "UUID portion containing underscores is preserved" from packages/platform-core/tests/features/behavior/ids/generator.feature +- outcome: Executable scenario: UUID portion containing underscores is preserved + +```gwt +Given the ID string "orders_order_uuid_with_extra_parts" +When parseId is called +Then the parsed result is: +``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-011-i-ds-with-fewer-than-three-parts-return-null.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-011-i-ds-with-fewer-than-three-parts-return-null.sdp.md index 5d4093e0..9c84db6e 100644 --- a/specs/behavior/platform-core/ids/generator.examples/s-011-i-ds-with-fewer-than-three-parts-return-null.sdp.md +++ b/specs/behavior/platform-core/ids/generator.examples/s-011-i-ds-with-fewer-than-three-parts-return-null.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "IDs with fewer than three parts return null" from packages/platform-core/tests/features/behavior/ids/generator.feature +- outcome: Executable scenario: IDs with fewer than three parts return null + +```gwt +Given the feature fixture is in place +When the scenario runs +Then parseId returns null for all of: +``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-012-i-ds-with-empty-context-or-type-return-null.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-012-i-ds-with-empty-context-or-type-return-null.sdp.md index 1b56b4ad..d64ec06c 100644 --- a/specs/behavior/platform-core/ids/generator.examples/s-012-i-ds-with-empty-context-or-type-return-null.sdp.md +++ b/specs/behavior/platform-core/ids/generator.examples/s-012-i-ds-with-empty-context-or-type-return-null.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "IDs with empty context or type return null" from packages/platform-core/tests/features/behavior/ids/generator.feature +- outcome: Executable scenario: IDs with empty context or type return null + +```gwt +Given the feature fixture is in place +When the scenario runs +Then parseId returns null for all of: +``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-013-correlation-id-has-the-expected-format-and-is-unique-per-call.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-013-correlation-id-has-the-expected-format-and-is-unique-per-call.sdp.md index 104424a3..ca471036 100644 --- a/specs/behavior/platform-core/ids/generator.examples/s-013-correlation-id-has-the-expected-format-and-is-unique-per-call.sdp.md +++ b/specs/behavior/platform-core/ids/generator.examples/s-013-correlation-id-has-the-expected-format-and-is-unique-per-call.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Correlation ID has the expected format and is unique per call" from packages/platform-core/tests/features/behavior/ids/generator.feature +- outcome: Executable scenario: Correlation ID has the expected format and is unique per call + +```gwt +Given the feature fixture is in place +When generateCorrelationId is called twice +Then both results match pattern "^corr_[0-9a-f-]{36}$" +And the two results are different +``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-014-command-id-has-the-expected-format-and-is-unique-per-call.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-014-command-id-has-the-expected-format-and-is-unique-per-call.sdp.md index 05c39c5f..5f1bb40f 100644 --- a/specs/behavior/platform-core/ids/generator.examples/s-014-command-id-has-the-expected-format-and-is-unique-per-call.sdp.md +++ b/specs/behavior/platform-core/ids/generator.examples/s-014-command-id-has-the-expected-format-and-is-unique-per-call.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Command ID has the expected format and is unique per call" from packages/platform-core/tests/features/behavior/ids/generator.feature +- outcome: Executable scenario: Command ID has the expected format and is unique per call + +```gwt +Given the feature fixture is in place +When generateCommandId is called twice +Then both results match pattern "^cmd_[0-9a-f-]{36}$" +And the two results are different +``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-015-event-id-has-the-expected-format-and-uses-the-provided-context.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-015-event-id-has-the-expected-format-and-uses-the-provided-context.sdp.md index 4dd7cedc..8acf9ced 100644 --- a/specs/behavior/platform-core/ids/generator.examples/s-015-event-id-has-the-expected-format-and-uses-the-provided-context.sdp.md +++ b/specs/behavior/platform-core/ids/generator.examples/s-015-event-id-has-the-expected-format-and-uses-the-provided-context.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Event ID has the expected format and uses the provided context" from packages/platform-core/tests/features/behavior/ids/generator.feature +- outcome: Executable scenario: Event ID has the expected format and uses the provided context + +```gwt +Given the feature fixture is in place +When generateEventId is called with context "orders" and generateEventId is called with context "inventory" +Then the result matches pattern "^orders_event_[0-9a-f-]{36}$" +And the result starts with "inventory_event_" +``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-016-event-i-ds-are-unique-per-call.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-016-event-i-ds-are-unique-per-call.sdp.md index e6b871fd..9cf80261 100644 --- a/specs/behavior/platform-core/ids/generator.examples/s-016-event-i-ds-are-unique-per-call.sdp.md +++ b/specs/behavior/platform-core/ids/generator.examples/s-016-event-i-ds-are-unique-per-call.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Event IDs are unique per call" from packages/platform-core/tests/features/behavior/ids/generator.feature +- outcome: Executable scenario: Event IDs are unique per call + +```gwt +Given the feature fixture is in place +When generateEventId is called twice with context "orders" +Then the two results are different +``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-017-empty-context-throws-an-error.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-017-empty-context-throws-an-error.sdp.md index 43f2b97e..aa56a29a 100644 --- a/specs/behavior/platform-core/ids/generator.examples/s-017-empty-context-throws-an-error.sdp.md +++ b/specs/behavior/platform-core/ids/generator.examples/s-017-empty-context-throws-an-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Empty context throws an error" from packages/platform-core/tests/features/behavior/ids/generator.feature +- outcome: Executable scenario: Empty context throws an error + +```gwt +Given the feature fixture is in place +When the scenario runs +Then generateEventId with empty context throws "context cannot be empty" +``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-018-integration-event-id-has-the-expected-format-and-is-unique-per-call.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-018-integration-event-id-has-the-expected-format-and-is-unique-per-call.sdp.md index abbf2d46..1b5f4f47 100644 --- a/specs/behavior/platform-core/ids/generator.examples/s-018-integration-event-id-has-the-expected-format-and-is-unique-per-call.sdp.md +++ b/specs/behavior/platform-core/ids/generator.examples/s-018-integration-event-id-has-the-expected-format-and-is-unique-per-call.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Integration event ID has the expected format and is unique per call" from packages/platform-core/tests/features/behavior/ids/generator.feature +- outcome: Executable scenario: Integration event ID has the expected format and is unique per call + +```gwt +Given the feature fixture is in place +When generateIntegrationEventId is called twice +Then both results match pattern "^int_evt_[0-9a-f-]{36}$" +And the two results are different +``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-019-uuid-portion-has-version-7-indicator.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-019-uuid-portion-has-version-7-indicator.sdp.md index e5cd57f9..108a366c 100644 --- a/specs/behavior/platform-core/ids/generator.examples/s-019-uuid-portion-has-version-7-indicator.sdp.md +++ b/specs/behavior/platform-core/ids/generator.examples/s-019-uuid-portion-has-version-7-indicator.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "UUID portion has version 7 indicator" from packages/platform-core/tests/features/behavior/ids/generator.feature +- outcome: Executable scenario: UUID portion has version 7 indicator + +```gwt +Given the feature fixture is in place +When generateId is called with context "test" and type "item" +Then the UUID portion matches "^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$" +``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-020-ten-sequential-i-ds-are-lexicographically-sorted.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-020-ten-sequential-i-ds-are-lexicographically-sorted.sdp.md index 64189369..acac4df7 100644 --- a/specs/behavior/platform-core/ids/generator.examples/s-020-ten-sequential-i-ds-are-lexicographically-sorted.sdp.md +++ b/specs/behavior/platform-core/ids/generator.examples/s-020-ten-sequential-i-ds-are-lexicographically-sorted.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Ten sequential IDs are lexicographically sorted" from packages/platform-core/tests/features/behavior/ids/generator.feature +- outcome: Executable scenario: Ten sequential IDs are lexicographically sorted + +```gwt +Given the feature fixture is in place +When 10 IDs are generated sequentially with context "test" and type "item" +Then the IDs are in lexicographic order +``` diff --git a/specs/behavior/platform-core/ids/generator.sdp.md b/specs/behavior/platform-core/ids/generator.sdp.md index 8694bccc..56d0e3fc 100644 --- a/specs/behavior/platform-core/ids/generator.sdp.md +++ b/specs/behavior/platform-core/ids/generator.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: prefixed ID generation with validation so that IDs follow a consistent format across bounded contexts (test carrier: packages/platform-core/tests/features/behavior/ids/generator.feature) +- actor: a platform developer +- outcome: prefixed ID generation with validation so that IDs follow a consistent format across bounded contexts + +## Behavior + +- rule: generateId produces IDs in {context}_{type}_{uuid} format +- rule: generateId rejects invalid context and type values +- rule: parseId decomposes valid IDs into context, type, and uuid +- rule: parseId returns null for malformed IDs +- rule: generateCorrelationId produces corr_-prefixed unique IDs +- rule: generateCommandId produces cmd_-prefixed unique IDs +- rule: generateEventId produces context-prefixed event IDs +- rule: generateIntegrationEventId produces int_evt_-prefixed unique IDs +- rule: Generated UUIDs conform to UUID v7 and are time-ordered diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-001-define-acl-for-payment-gateway.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-001-define-acl-for-payment-gateway.sdp.md index 1c0c56a1..3743d4c4 100644 --- a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-001-define-acl-for-payment-gateway.sdp.md +++ b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-001-define-acl-for-payment-gateway.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Define ACL for payment gateway" from packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature +- outcome: Executable scenario: Define ACL for payment gateway + +```gwt +Given the integration module is imported from platform-core +And ACL utilities are available +And an external payment gateway with model { txn_id, amt, ccy, status } +When I define a PaymentACL with fromGateway() method +Then the ACL can translate gateway responses to domain models +And domain models have { transactionId, amount, currency, status } +``` diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-002-acl-translates-field-names.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-002-acl-translates-field-names.sdp.md index 2f89bcb2..14c1c19c 100644 --- a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-002-acl-translates-field-names.sdp.md +++ b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-002-acl-translates-field-names.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "ACL translates field names" from packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature +- outcome: Executable scenario: ACL translates field names + +```gwt +Given the integration module is imported from platform-core +And ACL utilities are available +And external field "txn_id" maps to domain "transactionId" +When ACL processes { txn_id: 'abc123' } +Then result has { transactionId: 'abc123' } +And result does NOT have txn_id +``` diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-003-acl-transforms-field-values.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-003-acl-transforms-field-values.sdp.md index e5e9d89b..6a70ea17 100644 --- a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-003-acl-transforms-field-values.sdp.md +++ b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-003-acl-transforms-field-values.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "ACL transforms field values" from packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature +- outcome: Executable scenario: ACL transforms field values + +```gwt +Given the integration module is imported from platform-core +And ACL utilities are available +And external "amt" is in cents (15000) +And domain "amount.value" is in dollars +When ACL processes { amt: 15000 } +Then result has { amount: { value: 150.00 } } +``` diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-004-acl-translates-domain-to-external.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-004-acl-translates-domain-to-external.sdp.md index 0ce8191f..7ab1ed19 100644 --- a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-004-acl-translates-domain-to-external.sdp.md +++ b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-004-acl-translates-domain-to-external.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "ACL translates domain to external" from packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature +- outcome: Executable scenario: ACL translates domain to external + +```gwt +Given the integration module is imported from platform-core +And ACL utilities are available +And a domain PaymentRequest { transactionId, amount, currency } +When I call paymentACL.toGateway(domainModel) +Then result has { txn_id, amt, ccy } +And amounts are converted to cents +``` diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-005-round-trip-translation-preserves-data.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-005-round-trip-translation-preserves-data.sdp.md index 127a3b5d..894c961e 100644 --- a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-005-round-trip-translation-preserves-data.sdp.md +++ b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-005-round-trip-translation-preserves-data.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Round-trip translation preserves data" from packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature +- outcome: Executable scenario: Round-trip translation preserves data + +```gwt +Given the integration module is imported from platform-core +And ACL utilities are available +And a domain model +When I call toGateway() then fromGateway() +Then the result equals the original domain model +``` diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-006-missing-required-external-field.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-006-missing-required-external-field.sdp.md index 58b2ab7b..e3ee012d 100644 --- a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-006-missing-required-external-field.sdp.md +++ b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-006-missing-required-external-field.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Missing required external field" from packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature +- outcome: Executable scenario: Missing required external field + +```gwt +Given the integration module is imported from platform-core +And ACL utilities are available +And external response missing "txn_id" +When ACL processes the response +Then an error is thrown with code "INVALID_EXTERNAL_RESPONSE" +And error.field equals "txn_id" +``` diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-007-invalid-external-field-type.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-007-invalid-external-field-type.sdp.md index ba26f245..9f96e42a 100644 --- a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-007-invalid-external-field-type.sdp.md +++ b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-007-invalid-external-field-type.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Invalid external field type" from packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature +- outcome: Executable scenario: Invalid external field type + +```gwt +Given the integration module is imported from platform-core +And ACL utilities are available +And external response with amt: "not a number" +When ACL processes the response +Then an error is thrown with code "INVALID_EXTERNAL_RESPONSE" +And error.field equals "amt" +``` diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-008-unknown-external-status.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-008-unknown-external-status.sdp.md index 15facffa..37ee2440 100644 --- a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-008-unknown-external-status.sdp.md +++ b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-008-unknown-external-status.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Unknown external status" from packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature +- outcome: Executable scenario: Unknown external status + +```gwt +Given the integration module is imported from platform-core +And ACL utilities are available +And external response with status: "unknown_status" +When ACL processes the response +Then an error is thrown with code "UNMAPPED_VALUE" +And error.field equals "status" +``` diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-009-multiple-payment-gateways-with-different-schemas.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-009-multiple-payment-gateways-with-different-schemas.sdp.md index 72dfb861..e6b38cc7 100644 --- a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-009-multiple-payment-gateways-with-different-schemas.sdp.md +++ b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-009-multiple-payment-gateways-with-different-schemas.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Multiple payment gateways with different schemas" from packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature +- outcome: Executable scenario: Multiple payment gateways with different schemas + +```gwt +Given the integration module is imported from platform-core +And ACL utilities are available +And StripeACL for Stripe responses { id, amount, currency } +And PayPalACL for PayPal responses { transaction_id, value, cur_code } +When processing responses from both systems +Then both produce consistent domain PaymentConfirmation models +``` diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.sdp.md index 8e70d4f5..3227134b 100644 --- a/specs/behavior/platform-core/integration/anti-corruption-layer.sdp.md +++ b/specs/behavior/platform-core/integration/anti-corruption-layer.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: ACL utilities to translate external models so that domain code remains clean of foreign concepts (test carrier: packages/platform-core/tests/features/behavior/integration/anti-corruption-layer.feature) +- actor: a platform developer +- outcome: ACL utilities to translate external models so that domain code remains clean of foreign concepts + +## Behavior + +- rule: ACL defines translation interface +- rule: ACL supports bidirectional translation +- rule: ACL validates external input +- rule: Different ACLs for different external systems diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-001-register-upstream-downstream-relationship.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-001-register-upstream-downstream-relationship.sdp.md index 4fc7c5d2..3a6e04ca 100644 --- a/specs/behavior/platform-core/integration/context-map.examples/s-001-register-upstream-downstream-relationship.sdp.md +++ b/specs/behavior/platform-core/integration/context-map.examples/s-001-register-upstream-downstream-relationship.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Register Upstream/Downstream relationship" from packages/platform-core/tests/features/behavior/integration/context-map.feature +- outcome: Executable scenario: Register Upstream/Downstream relationship + +```gwt +Given the integration module is imported from platform-core +And the Context Map registry is available +And BC "Orders" publishes events +And BC "Inventory" consumes those events +When I register the relationship as "Upstream/Downstream" +Then Context Map shows Orders as upstream +And Context Map shows Inventory as downstream +``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-002-register-customer-supplier-relationship.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-002-register-customer-supplier-relationship.sdp.md index 7aea13cd..ceedd867 100644 --- a/specs/behavior/platform-core/integration/context-map.examples/s-002-register-customer-supplier-relationship.sdp.md +++ b/specs/behavior/platform-core/integration/context-map.examples/s-002-register-customer-supplier-relationship.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Register Customer/Supplier relationship" from packages/platform-core/tests/features/behavior/integration/context-map.feature +- outcome: Executable scenario: Register Customer/Supplier relationship + +```gwt +Given the integration module is imported from platform-core +And the Context Map registry is available +And BC "Shipping" needs data from BC "Orders" +And Shipping's needs drive Orders' API +When I register the relationship as "Customer/Supplier" +Then Context Map shows Orders as supplier +And Context Map shows Shipping as customer +``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-003-register-conformist-relationship.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-003-register-conformist-relationship.sdp.md index 146e0cfc..e2b9e186 100644 --- a/specs/behavior/platform-core/integration/context-map.examples/s-003-register-conformist-relationship.sdp.md +++ b/specs/behavior/platform-core/integration/context-map.examples/s-003-register-conformist-relationship.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Register Conformist relationship" from packages/platform-core/tests/features/behavior/integration/context-map.feature +- outcome: Executable scenario: Register Conformist relationship + +```gwt +Given the integration module is imported from platform-core +And the Context Map registry is available +And BC "Analytics" adopts EventStore schema +When I register the relationship as "Conformist" +Then Context Map shows Analytics conforms to EventStore +``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-004-register-acl-relationship.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-004-register-acl-relationship.sdp.md index ec4ea282..2dd9cb2f 100644 --- a/specs/behavior/platform-core/integration/context-map.examples/s-004-register-acl-relationship.sdp.md +++ b/specs/behavior/platform-core/integration/context-map.examples/s-004-register-acl-relationship.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Register ACL relationship" from packages/platform-core/tests/features/behavior/integration/context-map.feature +- outcome: Executable scenario: Register ACL relationship + +```gwt +Given the integration module is imported from platform-core +And the Context Map registry is available +And BC "Payments" translates ExternalGateway responses +When I register the relationship as "ACL" +Then Context Map shows Payments has ACL for ExternalGateway +``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-005-register-partnership-relationship.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-005-register-partnership-relationship.sdp.md index fba1afc1..035a8517 100644 --- a/specs/behavior/platform-core/integration/context-map.examples/s-005-register-partnership-relationship.sdp.md +++ b/specs/behavior/platform-core/integration/context-map.examples/s-005-register-partnership-relationship.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Register Partnership relationship" from packages/platform-core/tests/features/behavior/integration/context-map.feature +- outcome: Executable scenario: Register Partnership relationship + +```gwt +Given the integration module is imported from platform-core +And the Context Map registry is available +And BC "Orders" and BC "Inventory" collaborate on shared model +When I register the relationship as "Partnership" +Then Context Map shows bidirectional partnership +And both BCs are listed as collaborators +``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-006-register-shared-kernel-relationship.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-006-register-shared-kernel-relationship.sdp.md index bf5619a8..8d0db0eb 100644 --- a/specs/behavior/platform-core/integration/context-map.examples/s-006-register-shared-kernel-relationship.sdp.md +++ b/specs/behavior/platform-core/integration/context-map.examples/s-006-register-shared-kernel-relationship.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Register Shared Kernel relationship" from packages/platform-core/tests/features/behavior/integration/context-map.feature +- outcome: Executable scenario: Register Shared Kernel relationship + +```gwt +Given the integration module is imported from platform-core +And the Context Map registry is available +And BC "Core" provides shared types to "Orders" and "Inventory" +When I register the relationships as "Shared Kernel" +Then Context Map shows Core as shared kernel provider +And dependents include Orders and Inventory +``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-007-register-open-host-service-relationship.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-007-register-open-host-service-relationship.sdp.md index a54414bb..aecf6c2d 100644 --- a/specs/behavior/platform-core/integration/context-map.examples/s-007-register-open-host-service-relationship.sdp.md +++ b/specs/behavior/platform-core/integration/context-map.examples/s-007-register-open-host-service-relationship.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Register Open Host Service relationship" from packages/platform-core/tests/features/behavior/integration/context-map.feature +- outcome: Executable scenario: Register Open Host Service relationship + +```gwt +Given the integration module is imported from platform-core +And the Context Map registry is available +And BC "Orders" exposes public API for external consumers +When I register the relationship as "Open Host Service" +Then Context Map shows Orders as OHS provider +And external consumers are documented +``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-008-query-all-relationships-for-a-bc.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-008-query-all-relationships-for-a-bc.sdp.md index 110544cc..168ce426 100644 --- a/specs/behavior/platform-core/integration/context-map.examples/s-008-query-all-relationships-for-a-bc.sdp.md +++ b/specs/behavior/platform-core/integration/context-map.examples/s-008-query-all-relationships-for-a-bc.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Query all relationships for a BC" from packages/platform-core/tests/features/behavior/integration/context-map.feature +- outcome: Executable scenario: Query all relationships for a BC + +```gwt +Given the integration module is imported from platform-core +And the Context Map registry is available +And Orders has relationships with Inventory, Shipping, and Payments +When I query relationships for "Orders" +Then I receive all 3 relationships +And each includes type and direction +``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-009-query-upstream-b-cs.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-009-query-upstream-b-cs.sdp.md index ee01dd93..ed85f0f2 100644 --- a/specs/behavior/platform-core/integration/context-map.examples/s-009-query-upstream-b-cs.sdp.md +++ b/specs/behavior/platform-core/integration/context-map.examples/s-009-query-upstream-b-cs.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Query upstream BCs" from packages/platform-core/tests/features/behavior/integration/context-map.feature +- outcome: Executable scenario: Query upstream BCs + +```gwt +Given the integration module is imported from platform-core +And the Context Map registry is available +And Analytics consumes from Orders, Inventory, and Payments +When I query upstream BCs for "Analytics" +Then I receive ["Orders", "Inventory", "Payments"] +``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-010-query-bc-with-no-relationships.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-010-query-bc-with-no-relationships.sdp.md index 2ef9a340..7fce55da 100644 --- a/specs/behavior/platform-core/integration/context-map.examples/s-010-query-bc-with-no-relationships.sdp.md +++ b/specs/behavior/platform-core/integration/context-map.examples/s-010-query-bc-with-no-relationships.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Query BC with no relationships" from packages/platform-core/tests/features/behavior/integration/context-map.feature +- outcome: Executable scenario: Query BC with no relationships + +```gwt +Given the integration module is imported from platform-core +And the Context Map registry is available +And BC "Isolated" has no registered relationships +When I query relationships for "Isolated" +Then I receive an empty array +``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-011-duplicate-relationship-is-rejected.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-011-duplicate-relationship-is-rejected.sdp.md index 7de7f848..97a7c764 100644 --- a/specs/behavior/platform-core/integration/context-map.examples/s-011-duplicate-relationship-is-rejected.sdp.md +++ b/specs/behavior/platform-core/integration/context-map.examples/s-011-duplicate-relationship-is-rejected.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Duplicate relationship is rejected" from packages/platform-core/tests/features/behavior/integration/context-map.feature +- outcome: Executable scenario: Duplicate relationship is rejected + +```gwt +Given the integration module is imported from platform-core +And the Context Map registry is available +And relationship "Orders → Inventory" already exists +When I attempt to register "Orders → Inventory" again +Then an error is thrown with code "DUPLICATE_RELATIONSHIP" +``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-012-self-referential-relationship-is-rejected.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-012-self-referential-relationship-is-rejected.sdp.md index b8ffe16b..4594d11a 100644 --- a/specs/behavior/platform-core/integration/context-map.examples/s-012-self-referential-relationship-is-rejected.sdp.md +++ b/specs/behavior/platform-core/integration/context-map.examples/s-012-self-referential-relationship-is-rejected.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Self-referential relationship is rejected" from packages/platform-core/tests/features/behavior/integration/context-map.feature +- outcome: Executable scenario: Self-referential relationship is rejected + +```gwt +Given the integration module is imported from platform-core +And the Context Map registry is available +When I attempt to register "Orders → Orders" +Then an error is thrown with code "SELF_REFERENCE" +``` diff --git a/specs/behavior/platform-core/integration/context-map.sdp.md b/specs/behavior/platform-core/integration/context-map.sdp.md index 696542d4..44192bd9 100644 --- a/specs/behavior/platform-core/integration/context-map.sdp.md +++ b/specs/behavior/platform-core/integration/context-map.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: BC relationships documented in a Context Map so that integration points are explicit and maintainable (test carrier: packages/platform-core/tests/features/behavior/integration/context-map.feature) +- actor: a platform developer +- outcome: BC relationships documented in a Context Map so that integration points are explicit and maintainable + +## Behavior + +- rule: Context Map supports DDD relationship types +- rule: Context Map enables topology queries +- rule: Context Map validates relationship consistency diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-001-generate-sample-from-schema.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-001-generate-sample-from-schema.sdp.md index 0edd8003..58e40f38 100644 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-001-generate-sample-from-schema.sdp.md +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-001-generate-sample-from-schema.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Generate sample from schema" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature +- outcome: Executable scenario: Generate sample from schema + +```gwt +Given the integration module is imported from platform-core +And contract testing utilities are available +And a registered schema "OrderSubmittedV1" +When I call createContractSample('OrderSubmittedV1') +Then a valid sample event is generated +And it passes OrderSubmittedV1 schema validation +``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-002-generate-sample-with-overrides.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-002-generate-sample-with-overrides.sdp.md index 2fc74674..3c6410ad 100644 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-002-generate-sample-with-overrides.sdp.md +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-002-generate-sample-with-overrides.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Generate sample with overrides" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature +- outcome: Executable scenario: Generate sample with overrides + +```gwt +Given the integration module is imported from platform-core +And contract testing utilities are available +And a registered schema "OrderSubmittedV1" +When I call createContractSample('OrderSubmittedV1', { orderId: 'custom_123' }) +Then sample.orderId equals "custom_123" +And other fields have generated values +``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-003-generate-multiple-samples.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-003-generate-multiple-samples.sdp.md index 52696c4b..4df34e86 100644 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-003-generate-multiple-samples.sdp.md +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-003-generate-multiple-samples.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Generate multiple samples" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature +- outcome: Executable scenario: Generate multiple samples + +```gwt +Given the integration module is imported from platform-core +And contract testing utilities are available +And a registered schema "OrderSubmittedV1" +When I call createContractSamples('OrderSubmittedV1', 10) +Then I receive 10 unique sample events +And all pass schema validation +``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-004-producer-emits-valid-event.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-004-producer-emits-valid-event.sdp.md index 30f9439a..0e11f0b9 100644 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-004-producer-emits-valid-event.sdp.md +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-004-producer-emits-valid-event.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Producer emits valid event" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature +- outcome: Executable scenario: Producer emits valid event + +```gwt +Given the integration module is imported from platform-core +And contract testing utilities are available +And a producer function that creates OrderSubmitted events +When I run createProducerContractTest('OrderSubmittedV1', producer) +Then test passes when producer emits valid V1 events +``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-005-producer-emits-invalid-event.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-005-producer-emits-invalid-event.sdp.md index efcfbe74..6b96c5c2 100644 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-005-producer-emits-invalid-event.sdp.md +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-005-producer-emits-invalid-event.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Producer emits invalid event" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature +- outcome: Executable scenario: Producer emits invalid event + +```gwt +Given the integration module is imported from platform-core +And contract testing utilities are available +And a producer that emits events missing "orderId" +When I run createProducerContractTest('OrderSubmittedV1', producer) +Then test fails with "SCHEMA_VALIDATION_FAILED" +And error identifies missing field +``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-006-producer-emits-wrong-version.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-006-producer-emits-wrong-version.sdp.md index 92078c3b..f706d21a 100644 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-006-producer-emits-wrong-version.sdp.md +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-006-producer-emits-wrong-version.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Producer emits wrong version" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature +- outcome: Executable scenario: Producer emits wrong version + +```gwt +Given the integration module is imported from platform-core +And contract testing utilities are available +And a producer emitting V2 events +When I run createProducerContractTest('OrderSubmittedV1', producer) +Then test fails with "VERSION_MISMATCH" +``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-007-consumer-processes-valid-event.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-007-consumer-processes-valid-event.sdp.md index 5acde1ea..44c2272d 100644 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-007-consumer-processes-valid-event.sdp.md +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-007-consumer-processes-valid-event.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Consumer processes valid event" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature +- outcome: Executable scenario: Consumer processes valid event + +```gwt +Given the integration module is imported from platform-core +And contract testing utilities are available +And a consumer handler for OrderSubmitted +When I run createConsumerContractTest('OrderSubmittedV1', consumer) +Then test passes when consumer processes sample events +``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-008-consumer-handles-all-sample-variations.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-008-consumer-handles-all-sample-variations.sdp.md index 5c3eebc9..5b156af0 100644 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-008-consumer-handles-all-sample-variations.sdp.md +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-008-consumer-handles-all-sample-variations.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Consumer handles all sample variations" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature +- outcome: Executable scenario: Consumer handles all sample variations + +```gwt +Given the integration module is imported from platform-core +And contract testing utilities are available +And a consumer handler for OrderSubmitted +When I run createConsumerContractTest with 100 samples +Then consumer successfully processes all 100 samples +``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-009-consumer-rejects-valid-event.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-009-consumer-rejects-valid-event.sdp.md index b29a274a..5113c033 100644 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-009-consumer-rejects-valid-event.sdp.md +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-009-consumer-rejects-valid-event.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Consumer rejects valid event" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature +- outcome: Executable scenario: Consumer rejects valid event + +```gwt +Given the integration module is imported from platform-core +And contract testing utilities are available +And a consumer that throws on valid V1 events +When I run createConsumerContractTest('OrderSubmittedV1', consumer) +Then test fails with "CONSUMER_REJECTED_VALID_EVENT" +``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-010-compatible-producer-and-consumer.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-010-compatible-producer-and-consumer.sdp.md index 189b9b4c..faa69105 100644 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-010-compatible-producer-and-consumer.sdp.md +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-010-compatible-producer-and-consumer.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Compatible producer and consumer" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature +- outcome: Executable scenario: Compatible producer and consumer + +```gwt +Given the integration module is imported from platform-core +And contract testing utilities are available +And producer emitting OrderSubmittedV1 +And consumer expecting OrderSubmittedV1 +When I run verifyContractCompatibility(producer, consumer, 'OrderSubmittedV1') +Then verification passes +``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-011-incompatible-versions-detected.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-011-incompatible-versions-detected.sdp.md index f75f7bf0..dc2f2b52 100644 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-011-incompatible-versions-detected.sdp.md +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-011-incompatible-versions-detected.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Incompatible versions detected" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature +- outcome: Executable scenario: Incompatible versions detected + +```gwt +Given the integration module is imported from platform-core +And contract testing utilities are available +And producer emitting OrderSubmittedV2 +And consumer expecting OrderSubmittedV1 +And no downcaster registered +When I run verifyContractCompatibility(producer, consumer) +Then verification fails with "SCHEMA_MISMATCH" +And suggestion mentions "register downcaster V2 → V1" +``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-012-compatible-with-downcaster.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-012-compatible-with-downcaster.sdp.md index 259de9bb..51ad977f 100644 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-012-compatible-with-downcaster.sdp.md +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-012-compatible-with-downcaster.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Compatible with downcaster" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature +- outcome: Executable scenario: Compatible with downcaster + +```gwt +Given the integration module is imported from platform-core +And contract testing utilities are available +And producer emitting OrderSubmittedV2 +And consumer expecting OrderSubmittedV1 +And downcaster V2 → V1 is registered +When I run verifyContractCompatibility(producer, consumer) +Then verification passes +``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-013-contract-violation-is-recorded.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-013-contract-violation-is-recorded.sdp.md index 81a183e4..ecb95245 100644 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-013-contract-violation-is-recorded.sdp.md +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-013-contract-violation-is-recorded.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Contract violation is recorded" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature +- outcome: Executable scenario: Contract violation is recorded + +```gwt +Given the integration module is imported from platform-core +And contract testing utilities are available +And a schema mismatch detected at runtime +When violation detection processes the mismatch +Then a ContractViolation is created +And it includes eventType, producerVersion, consumerExpectedVersion +And it includes timestamp and details +And it is passed to ContractMetrics.recordViolation() +``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-014-query-contract-violations.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-014-query-contract-violations.sdp.md index 060df1fe..f96d4b62 100644 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-014-query-contract-violations.sdp.md +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-014-query-contract-violations.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Query contract violations" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature +- outcome: Executable scenario: Query contract violations + +```gwt +Given the integration module is imported from platform-core +And contract testing utilities are available +And multiple contract violations have been recorded +When I call contractMetrics.getViolations() +Then I receive all recorded violations +And they are sorted by timestamp descending +``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-015-query-violations-since-timestamp.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-015-query-violations-since-timestamp.sdp.md index a924a356..8924f5b5 100644 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-015-query-violations-since-timestamp.sdp.md +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-015-query-violations-since-timestamp.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Query violations since timestamp" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature +- outcome: Executable scenario: Query violations since timestamp + +```gwt +Given the integration module is imported from platform-core +And contract testing utilities are available +And violations recorded at different times +When I call contractMetrics.getViolations({ since: oneHourAgo }) +Then I receive only violations from the last hour +``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-016-no-violations-returns-empty-array.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-016-no-violations-returns-empty-array.sdp.md index f835c838..6d33ae00 100644 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-016-no-violations-returns-empty-array.sdp.md +++ b/specs/behavior/platform-core/integration/contract-testing.examples/s-016-no-violations-returns-empty-array.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "No violations returns empty array" from packages/platform-core/tests/features/behavior/integration/contract-testing.feature +- outcome: Executable scenario: No violations returns empty array + +```gwt +Given the integration module is imported from platform-core +And contract testing utilities are available +And no contract violations have been recorded +When I call contractMetrics.getViolations() +Then I receive an empty array +``` diff --git a/specs/behavior/platform-core/integration/contract-testing.sdp.md b/specs/behavior/platform-core/integration/contract-testing.sdp.md index 6e2b1f18..4249a67f 100644 --- a/specs/behavior/platform-core/integration/contract-testing.sdp.md +++ b/specs/behavior/platform-core/integration/contract-testing.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: utilities for contract testing integration events so that producer-consumer compatibility is validated (test carrier: packages/platform-core/tests/features/behavior/integration/contract-testing.feature) +- actor: a platform developer +- outcome: utilities for contract testing integration events so that producer-consumer compatibility is validated + +## Behavior + +- rule: Generate valid contract samples +- rule: Validate producer emits valid events +- rule: Validate consumer handles valid events +- rule: Detect producer-consumer mismatches +- rule: Contract violations are detected and recorded diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-001-upcast-v1-event-to-v2.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-001-upcast-v1-event-to-v2.sdp.md index c553fbcb..e022d911 100644 --- a/specs/behavior/platform-core/integration/event-versioning.examples/s-001-upcast-v1-event-to-v2.sdp.md +++ b/specs/behavior/platform-core/integration/event-versioning.examples/s-001-upcast-v1-event-to-v2.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Upcast V1 event to V2" from packages/platform-core/tests/features/behavior/integration/event-versioning.feature +- outcome: Executable scenario: Upcast V1 event to V2 + +```gwt +Given the integration module is imported from platform-core +And the versioning utilities are available +And OrderSubmittedV1 { orderId, customerId, items } +And OrderSubmittedV2 adds required "currency" field +When I register an upcaster V1 → V2 +Then upcasting V1 event adds currency: 'USD' default +``` diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-002-chain-upcasters-for-multiple-versions.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-002-chain-upcasters-for-multiple-versions.sdp.md index a81c4bca..33108c7c 100644 --- a/specs/behavior/platform-core/integration/event-versioning.examples/s-002-chain-upcasters-for-multiple-versions.sdp.md +++ b/specs/behavior/platform-core/integration/event-versioning.examples/s-002-chain-upcasters-for-multiple-versions.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Chain upcasters for multiple versions" from packages/platform-core/tests/features/behavior/integration/event-versioning.feature +- outcome: Executable scenario: Chain upcasters for multiple versions + +```gwt +Given the integration module is imported from platform-core +And the versioning utilities are available +And versions V1, V2, V3 with upcasters V1→V2 and V2→V3 +When I upcast a V1 event to V3 +Then both upcasters are applied in sequence +And final result is valid V3 +``` diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-003-upcast-adds-computed-field.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-003-upcast-adds-computed-field.sdp.md index def725b9..a9f35e13 100644 --- a/specs/behavior/platform-core/integration/event-versioning.examples/s-003-upcast-adds-computed-field.sdp.md +++ b/specs/behavior/platform-core/integration/event-versioning.examples/s-003-upcast-adds-computed-field.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Upcast adds computed field" from packages/platform-core/tests/features/behavior/integration/event-versioning.feature +- outcome: Executable scenario: Upcast adds computed field + +```gwt +Given the integration module is imported from platform-core +And the versioning utilities are available +And V1 has { items } array +And V2 adds computed { itemCount } +When upcasting V1 to V2 +Then itemCount equals items.length +``` diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-004-downcast-v2-event-to-v1.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-004-downcast-v2-event-to-v1.sdp.md index eebc43bf..3c90b4fd 100644 --- a/specs/behavior/platform-core/integration/event-versioning.examples/s-004-downcast-v2-event-to-v1.sdp.md +++ b/specs/behavior/platform-core/integration/event-versioning.examples/s-004-downcast-v2-event-to-v1.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Downcast V2 event to V1" from packages/platform-core/tests/features/behavior/integration/event-versioning.feature +- outcome: Executable scenario: Downcast V2 event to V1 + +```gwt +Given the integration module is imported from platform-core +And the versioning utilities are available +And OrderSubmittedV2 { orderId, customerId, items, currency } +And consumer expects OrderSubmittedV1 +When I register a downcaster V2 → V1 +Then downcasting V2 event removes currency field +``` diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-005-downcast-removes-required-in-new-field.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-005-downcast-removes-required-in-new-field.sdp.md index ff03528a..822c1969 100644 --- a/specs/behavior/platform-core/integration/event-versioning.examples/s-005-downcast-removes-required-in-new-field.sdp.md +++ b/specs/behavior/platform-core/integration/event-versioning.examples/s-005-downcast-removes-required-in-new-field.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Downcast removes required-in-new field" from packages/platform-core/tests/features/behavior/integration/event-versioning.feature +- outcome: Executable scenario: Downcast removes required-in-new field + +```gwt +Given the integration module is imported from platform-core +And the versioning utilities are available +And V2 has required "priority" field +And V1 has no priority concept +When downcasting V2 to V1 +Then priority field is removed +And result is valid V1 +``` diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-006-register-schema-with-migration.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-006-register-schema-with-migration.sdp.md index b7719ada..40aa3127 100644 --- a/specs/behavior/platform-core/integration/event-versioning.examples/s-006-register-schema-with-migration.sdp.md +++ b/specs/behavior/platform-core/integration/event-versioning.examples/s-006-register-schema-with-migration.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Register schema with migration" from packages/platform-core/tests/features/behavior/integration/event-versioning.feature +- outcome: Executable scenario: Register schema with migration + +```gwt +Given the integration module is imported from platform-core +And the versioning utilities are available +And OrderSubmittedV2 schema +When I register with backwardCompatible: ['1.0.0'] and provide migrate function for V1 +Then V1 events can be automatically upcasted +``` diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-007-missing-migration-path.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-007-missing-migration-path.sdp.md index 6c7d31ba..f88f5df9 100644 --- a/specs/behavior/platform-core/integration/event-versioning.examples/s-007-missing-migration-path.sdp.md +++ b/specs/behavior/platform-core/integration/event-versioning.examples/s-007-missing-migration-path.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Missing migration path" from packages/platform-core/tests/features/behavior/integration/event-versioning.feature +- outcome: Executable scenario: Missing migration path + +```gwt +Given the integration module is imported from platform-core +And the versioning utilities are available +And V1 and V3 registered +And no V2 or direct V1→V3 migration +When attempting to upcast V1 to V3 +Then an error is thrown with code "NO_MIGRATION_PATH" +``` diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-008-breaking-change-without-migration.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-008-breaking-change-without-migration.sdp.md index 2e9fcd1a..bf638d43 100644 --- a/specs/behavior/platform-core/integration/event-versioning.examples/s-008-breaking-change-without-migration.sdp.md +++ b/specs/behavior/platform-core/integration/event-versioning.examples/s-008-breaking-change-without-migration.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Breaking change without migration" from packages/platform-core/tests/features/behavior/integration/event-versioning.feature +- outcome: Executable scenario: Breaking change without migration + +```gwt +Given the integration module is imported from platform-core +And the versioning utilities are available +And V2 removes required V1 field "orderId" +When attempting to register V2 as backwardCompatible with V1 +Then an error is thrown with code "BREAKING_CHANGE" +And error suggests registering migration function +``` diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-009-detect-version-from-event-metadata.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-009-detect-version-from-event-metadata.sdp.md index e1299ce8..48b2f9d8 100644 --- a/specs/behavior/platform-core/integration/event-versioning.examples/s-009-detect-version-from-event-metadata.sdp.md +++ b/specs/behavior/platform-core/integration/event-versioning.examples/s-009-detect-version-from-event-metadata.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Detect version from event metadata" from packages/platform-core/tests/features/behavior/integration/event-versioning.feature +- outcome: Executable scenario: Detect version from event metadata + +```gwt +Given the integration module is imported from platform-core +And the versioning utilities are available +And an event with metadata.schemaVersion: "2.0.0" +When I call detectVersion(event) +Then result equals "2.0.0" +``` diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-010-infer-version-from-payload-shape.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-010-infer-version-from-payload-shape.sdp.md index 19990635..029fac0d 100644 --- a/specs/behavior/platform-core/integration/event-versioning.examples/s-010-infer-version-from-payload-shape.sdp.md +++ b/specs/behavior/platform-core/integration/event-versioning.examples/s-010-infer-version-from-payload-shape.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Infer version from payload shape" from packages/platform-core/tests/features/behavior/integration/event-versioning.feature +- outcome: Executable scenario: Infer version from payload shape + +```gwt +Given the integration module is imported from platform-core +And the versioning utilities are available +And an event without schemaVersion metadata +And payload matches OrderSubmittedV1 shape +When I call detectVersion(event, 'OrderSubmitted') +Then result equals "1.0.0" +``` diff --git a/specs/behavior/platform-core/integration/event-versioning.sdp.md b/specs/behavior/platform-core/integration/event-versioning.sdp.md index 2872daa3..e0ba14b4 100644 --- a/specs/behavior/platform-core/integration/event-versioning.sdp.md +++ b/specs/behavior/platform-core/integration/event-versioning.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: integration events to support schema evolution so that old consumers continue working when schemas change (test carrier: packages/platform-core/tests/features/behavior/integration/event-versioning.feature) +- actor: a platform developer +- outcome: integration events to support schema evolution so that old consumers continue working when schemas change + +## Behavior + +- rule: Upcasters migrate old schemas to new +- rule: Downcasters support old consumers +- rule: Migrations are registered with schema versions +- rule: Event version is detected automatically diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-001-create-publisher-with-empty-routes.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-001-create-publisher-with-empty-routes.sdp.md index 31cae8bf..da50c026 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-001-create-publisher-with-empty-routes.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-001-create-publisher-with-empty-routes.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Create publisher with empty routes" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Create publisher with empty routes + +```gwt +Given the module is imported from platform-core +And a mock workpool client +When a publisher is created with no routes +Then getRoutes returns 0 routes +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-002-create-publisher-with-one-route.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-002-create-publisher-with-one-route.sdp.md index 4b3c1fac..0ff3bcaf 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-002-create-publisher-with-one-route.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-002-create-publisher-with-one-route.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Create publisher with one route" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Create publisher with one route + +```gwt +Given the module is imported from platform-core +And a mock workpool client +And a route from "OrderSubmitted" to "OrderPlacedIntegration" with schema version 1 +When a publisher is created with that route +Then getRoutes returns 1 route +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-003-reject-duplicate-source-event-type-routes.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-003-reject-duplicate-source-event-type-routes.sdp.md index 42264246..6eb94c1e 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-003-reject-duplicate-source-event-type-routes.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-003-reject-duplicate-source-event-type-routes.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Reject duplicate sourceEventType routes" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Reject duplicate sourceEventType routes + +```gwt +Given the module is imported from platform-core +And a mock workpool client +And two routes both mapping from "OrderSubmitted" +When a publisher is created with both routes +Then an IntegrationRouteError is thrown +And the error message contains "Duplicate route for source event type" +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-004-check-route-existence-for-registered-and-unregistered-types.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-004-check-route-existence-for-registered-and-unregistered-types.sdp.md index e1605c4f..61fe48e4 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-004-check-route-existence-for-registered-and-unregistered-types.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-004-check-route-existence-for-registered-and-unregistered-types.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Check route existence for registered and unregistered types" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Check route existence for registered and unregistered types + +```gwt +Given the module is imported from platform-core +And a mock workpool client +And a route from "OrderSubmitted" to "OrderPlacedIntegration" with schema version 1 +And a publisher is created with that route +When the scenario runs +Then hasRouteFor "OrderSubmitted" returns true +And hasRouteFor returns false for unregistered types: +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-005-retrieve-all-registered-routes.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-005-retrieve-all-registered-routes.sdp.md index 76ba6c9f..3d89ba74 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-005-retrieve-all-registered-routes.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-005-retrieve-all-registered-routes.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Retrieve all registered routes" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Retrieve all registered routes + +```gwt +Given the module is imported from platform-core +And a mock workpool client +And routes are configured for source event types: +When a publisher is created with those routes +Then getRoutes returns 2 routes +And the returned routes include source event types: +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-006-return-null-when-no-route-matches.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-006-return-null-when-no-route-matches.sdp.md index dc03b765..b9f6fcd0 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-006-return-null-when-no-route-matches.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-006-return-null-when-no-route-matches.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Return null when no route matches" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Return null when no route matches + +```gwt +Given the module is imported from platform-core +And a mock workpool client +And a route from "OrderSubmitted" to "OrderPlacedIntegration" with schema version 1 +And a publisher is created with that route +When publish is called with source event type "DifferentEvent" +Then the publish result is null +And the workpool received 0 calls +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-007-translate-and-publish-a-domain-event.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-007-translate-and-publish-a-domain-event.sdp.md index 26532b9c..a71d87b2 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-007-translate-and-publish-a-domain-event.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-007-translate-and-publish-a-domain-event.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Translate and publish a domain event" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Translate and publish a domain event + +```gwt +Given the module is imported from platform-core +And a mock workpool client +And a translating route from "OrderSubmitted" to "OrderPlacedIntegration" +And a publisher is created with that route +When publish is called with a standard source event +Then the publish result is not null +And the publish result indicates success with 1 handler invoked +And the integration event ID starts with "int_" +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-008-enqueue-multiple-handlers.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-008-enqueue-multiple-handlers.sdp.md index def7f4bb..ad0a69c4 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-008-enqueue-multiple-handlers.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-008-enqueue-multiple-handlers.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Enqueue multiple handlers" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Enqueue multiple handlers + +```gwt +Given the module is imported from platform-core +And a mock workpool client +And a route from "OrderSubmitted" to "OrderPlacedIntegration" with 2 handlers +And a publisher is created with that route +When publish is called with a standard source event +Then the publish result indicates success with 2 handlers invoked +And the workpool received 2 calls +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-009-verify-integration-event-metadata-fields.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-009-verify-integration-event-metadata-fields.sdp.md index 073e7fcc..2f4f1b42 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-009-verify-integration-event-metadata-fields.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-009-verify-integration-event-metadata-fields.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Verify integration event metadata fields" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Verify integration event metadata fields + +```gwt +Given the module is imported from platform-core +And a mock workpool client +And a route from "OrderSubmitted" to "OrderPlacedIntegration" with schema version 2 and orderId translator +And a publisher is created with that route +When publish is called with a standard source event +Then the enqueued integration event has metadata: +And the enqueued integration event payload equals orderId "order_456" +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-010-include-user-id-when-present-in-chain.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-010-include-user-id-when-present-in-chain.sdp.md index 45649d3c..9c96778a 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-010-include-user-id-when-present-in-chain.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-010-include-user-id-when-present-in-chain.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Include userId when present in chain" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Include userId when present in chain + +```gwt +Given the module is imported from platform-core +And a mock workpool client +And a simple route from "OrderSubmitted" to "OrderPlacedIntegration" +And a publisher is created with that route +When publish is called with userId "user_abc" +Then the enqueued integration event userId is "user_abc" +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-011-omit-user-id-when-absent-from-chain.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-011-omit-user-id-when-absent-from-chain.sdp.md index fd057bfb..161b23ed 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-011-omit-user-id-when-absent-from-chain.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-011-omit-user-id-when-absent-from-chain.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Omit userId when absent from chain" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Omit userId when absent from chain + +```gwt +Given the module is imported from platform-core +And a mock workpool client +And a simple route from "OrderSubmitted" to "OrderPlacedIntegration" +And a publisher is created with that route +When publish is called without userId +Then the enqueued integration event userId is undefined +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-012-pass-on-complete-handler-to-workpool.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-012-pass-on-complete-handler-to-workpool.sdp.md index 96435325..39325eff 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-012-pass-on-complete-handler-to-workpool.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-012-pass-on-complete-handler-to-workpool.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Pass onComplete handler to workpool" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Pass onComplete handler to workpool + +```gwt +Given the module is imported from platform-core +And a mock workpool client +And a simple route from "OrderSubmitted" to "OrderPlacedIntegration" +And an onComplete handler reference +And a publisher is created with that route and onComplete +When publish is called with a standard source event +Then the workpool options include the onComplete handler +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-013-propagate-translator-error.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-013-propagate-translator-error.sdp.md index 3dfafe56..2d182ad0 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-013-propagate-translator-error.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-013-propagate-translator-error.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Propagate translator error" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Propagate translator error + +```gwt +Given the module is imported from platform-core +And a mock workpool client +And a route with a failing translator +And a publisher is created with that route +When publish is called with a standard source event +Then the publish call rejects with "Translation failed: invalid payload structure" +And the workpool received 0 calls +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-014-verify-workpool-context-fields.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-014-verify-workpool-context-fields.sdp.md index d2e0f71e..89058d60 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-014-verify-workpool-context-fields.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-014-verify-workpool-context-fields.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Verify workpool context fields" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Verify workpool context fields + +```gwt +Given the module is imported from platform-core +And a mock workpool client +And a simple route from "OrderSubmitted" to "OrderPlacedIntegration" +And a publisher is created with that route +When publish is called with a standard source event +Then the workpool context includes: +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-015-build-a-route-with-all-required-fields.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-015-build-a-route-with-all-required-fields.sdp.md index a4fa265e..2559ed65 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-015-build-a-route-with-all-required-fields.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-015-build-a-route-with-all-required-fields.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Build a route with all required fields" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Build a route with all required fields + +```gwt +Given the module is imported from platform-core +When a route is built with from "OrderSubmitted", to "OrderPlacedIntegration", a translator, and one handler +Then the built route sourceEventType is "OrderSubmitted" +And the built route targetEventType is "OrderPlacedIntegration" +And the built route schemaVersion defaults to 1 +And the built route has 1 handler +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-016-set-schema-version-via-version-method.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-016-set-schema-version-via-version-method.sdp.md index d5837e89..183c550f 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-016-set-schema-version-via-version-method.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-016-set-schema-version-via-version-method.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Set schema version via version method" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Set schema version via version method + +```gwt +Given the module is imported from platform-core +When a route is built with version 3 +Then the built route schemaVersion is 3 +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-017-pass-multiple-handlers-to-notify.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-017-pass-multiple-handlers-to-notify.sdp.md index 30511ff3..670451e6 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-017-pass-multiple-handlers-to-notify.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-017-pass-multiple-handlers-to-notify.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Pass multiple handlers to notify" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Pass multiple handlers to notify + +```gwt +Given the module is imported from platform-core +When a route is built with 2 handlers via notify +Then the built route has 2 handlers +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-018-translator-function-transforms-source-event.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-018-translator-function-transforms-source-event.sdp.md index c75f37c5..b19a85b7 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-018-translator-function-transforms-source-event.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-018-translator-function-transforms-source-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Translator function transforms source event" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Translator function transforms source event + +```gwt +Given the module is imported from platform-core +When a route is built with a translator that extracts eventId and eventType +Then invoking the translator with eventId "evt_1" and eventType "OrderSubmitted" returns the expected payload +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-019-reject-missing-source-event-type.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-019-reject-missing-source-event-type.sdp.md index 4b038730..cdd4aef1 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-019-reject-missing-source-event-type.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-019-reject-missing-source-event-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Reject missing source event type" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Reject missing source event type + +```gwt +Given the module is imported from platform-core +When build is called without from +Then an IntegrationRouteError is thrown with code "MISSING_SOURCE_EVENT_TYPE" +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-020-reject-missing-target-event-type.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-020-reject-missing-target-event-type.sdp.md index b0ed5edd..69df3e07 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-020-reject-missing-target-event-type.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-020-reject-missing-target-event-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Reject missing target event type" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Reject missing target event type + +```gwt +Given the module is imported from platform-core +When build is called without to +Then an IntegrationRouteError is thrown with code "MISSING_TARGET_EVENT_TYPE" +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-021-reject-missing-translator.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-021-reject-missing-translator.sdp.md index ad0966c2..5f90bd33 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-021-reject-missing-translator.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-021-reject-missing-translator.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Reject missing translator" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Reject missing translator + +```gwt +Given the module is imported from platform-core +When build is called without translate +Then an IntegrationRouteError is thrown with code "MISSING_TRANSLATOR" +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-022-reject-missing-handlers.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-022-reject-missing-handlers.sdp.md index 223c7af6..1dc64478 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-022-reject-missing-handlers.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-022-reject-missing-handlers.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Reject missing handlers" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Reject missing handlers + +```gwt +Given the module is imported from platform-core +When build is called without notify +Then an IntegrationRouteError is thrown with code "MISSING_HANDLERS" +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-023-build-route-via-define-integration-route-factory.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-023-build-route-via-define-integration-route-factory.sdp.md index ad8b2497..852f4817 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-023-build-route-via-define-integration-route-factory.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-023-build-route-via-define-integration-route-factory.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Build route via defineIntegrationRoute factory" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Build route via defineIntegrationRoute factory + +```gwt +Given the module is imported from platform-core +When a route is built using defineIntegrationRoute +Then the built route sourceEventType is "OrderSubmitted" +And the built route targetEventType is "OrderPlacedIntegration" +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-024-create-publisher-via-factory-function.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-024-create-publisher-via-factory-function.sdp.md index 5079f399..5530b821 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-024-create-publisher-via-factory-function.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-024-create-publisher-via-factory-function.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Create publisher via factory function" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Create publisher via factory function + +```gwt +Given the module is imported from platform-core +And a mock workpool client +When a publisher is created using createIntegrationPublisher with one route +Then hasRouteFor "OrderSubmitted" returns true on the factory publisher +And getRoutes returns 1 route on the factory publisher +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-025-verify-integration-route-error-properties.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-025-verify-integration-route-error-properties.sdp.md index 6ea1b6ef..2ec4cba5 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-025-verify-integration-route-error-properties.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-025-verify-integration-route-error-properties.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Verify IntegrationRouteError properties" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Verify IntegrationRouteError properties + +```gwt +Given the module is imported from platform-core +When an IntegrationRouteError is created with code "MISSING_TRANSLATOR" and message "Test message" +Then the error name is "IntegrationRouteError" +And the error code is "MISSING_TRANSLATOR" +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-026-verify-integration-route-error-with-context.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-026-verify-integration-route-error-with-context.sdp.md index 96a01624..8cf11b3b 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-026-verify-integration-route-error-with-context.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-026-verify-integration-route-error-with-context.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Verify IntegrationRouteError with context" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Verify IntegrationRouteError with context + +```gwt +Given the module is imported from platform-core +When an IntegrationRouteError is created with code "DUPLICATE_SOURCE_EVENT_TYPE", message "Test", and context sourceEventType "OrderSubmitted" +Then the error context equals sourceEventType "OrderSubmitted" +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-027-verify-integration-route-error-instanceof-chain.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-027-verify-integration-route-error-instanceof-chain.sdp.md index 10d8e39e..84d5c59b 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-027-verify-integration-route-error-instanceof-chain.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-027-verify-integration-route-error-instanceof-chain.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Verify IntegrationRouteError instanceof chain" from packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature +- outcome: Executable scenario: Verify IntegrationRouteError instanceof chain + +```gwt +Given the module is imported from platform-core +When an IntegrationRouteError is created with code "MISSING_HANDLERS" and message "Test" +Then the error is an instance of Error +And the error is an instance of IntegrationRouteError +``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.sdp.md index ccae9549..d98a6fe0 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.sdp.md @@ -10,4 +10,28 @@ relations: ## Intent -- outcome: an integration event publisher that translates domain events into integration events so that bounded contexts can communicate through well-defined published language contracts (test carrier: packages/platform-core/tests/features/behavior/integration/integration-event-publisher.feature) +- actor: a platform developer +- outcome: an integration event publisher that translates domain events into integration events so that bounded contexts can communicate through well-defined published language contracts + +## Behavior + +- rule: Constructor accepts an empty or populated route list +- rule: Constructor rejects duplicate source event type routes +- rule: hasRouteFor returns true for registered and false for unregistered event types +- rule: getRoutes returns all registered routes +- rule: Publish returns null for unmatched source event types +- rule: Publish translates domain events to integration events +- rule: Publish enqueues all handlers for a matched route +- rule: Integration event includes correct metadata from source event and correlation chain +- rule: Publish propagates userId from the correlation chain when present +- rule: Publish includes onComplete callback in workpool options when configured +- rule: Publish propagates translator errors to the caller +- rule: Publish includes integration context in workpool options +- rule: IntegrationRouteBuilder builds routes with all required fields via fluent API +- rule: IntegrationRouteBuilder version method sets schema version +- rule: IntegrationRouteBuilder notify accepts multiple handlers +- rule: IntegrationRouteBuilder translate sets the translator function +- rule: IntegrationRouteBuilder build rejects incomplete configurations +- rule: defineIntegrationRoute returns a builder for fluent route construction +- rule: createIntegrationPublisher creates a functional publisher instance +- rule: IntegrationRouteError has correct name, code, context, and is instanceof Error diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-001-register-integration-event-schema.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-001-register-integration-event-schema.sdp.md index bf7b2cfb..5f8919eb 100644 --- a/specs/behavior/platform-core/integration/published-language.examples/s-001-register-integration-event-schema.sdp.md +++ b/specs/behavior/platform-core/integration/published-language.examples/s-001-register-integration-event-schema.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Register integration event schema" from packages/platform-core/tests/features/behavior/integration/published-language.feature +- outcome: Executable scenario: Register integration event schema + +```gwt +Given the integration module is imported from platform-core +And the Published Language registry is available +And event type "OrderSubmitted" +And schema version "1.0.0" +When I call registerIntegrationSchema({ eventType, version, schema }) +Then the schema is available in the registry +And getSchema('OrderSubmitted', '1.0.0') returns the schema +``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-002-register-multiple-versions.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-002-register-multiple-versions.sdp.md index e8f54fe2..ca0ca2a7 100644 --- a/specs/behavior/platform-core/integration/published-language.examples/s-002-register-multiple-versions.sdp.md +++ b/specs/behavior/platform-core/integration/published-language.examples/s-002-register-multiple-versions.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Register multiple versions" from packages/platform-core/tests/features/behavior/integration/published-language.feature +- outcome: Executable scenario: Register multiple versions + +```gwt +Given the integration module is imported from platform-core +And the Published Language registry is available +And "OrderSubmitted" version "1.0.0" is registered +When I register "OrderSubmitted" version "2.0.0" +Then both versions are available +And getLatestVersion('OrderSubmitted') returns "2.0.0" +``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-003-duplicate-version-is-rejected.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-003-duplicate-version-is-rejected.sdp.md index 5995a9f8..c3a1446d 100644 --- a/specs/behavior/platform-core/integration/published-language.examples/s-003-duplicate-version-is-rejected.sdp.md +++ b/specs/behavior/platform-core/integration/published-language.examples/s-003-duplicate-version-is-rejected.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Duplicate version is rejected" from packages/platform-core/tests/features/behavior/integration/published-language.feature +- outcome: Executable scenario: Duplicate version is rejected + +```gwt +Given the integration module is imported from platform-core +And the Published Language registry is available +And "OrderSubmitted" version "1.0.0" is registered +When I attempt to register "OrderSubmitted" version "1.0.0" again +Then an error is thrown with code "VERSION_EXISTS" +``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-004-convert-domain-event-to-integration-event.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-004-convert-domain-event-to-integration-event.sdp.md index 5252e452..1b49bf72 100644 --- a/specs/behavior/platform-core/integration/published-language.examples/s-004-convert-domain-event-to-integration-event.sdp.md +++ b/specs/behavior/platform-core/integration/published-language.examples/s-004-convert-domain-event-to-integration-event.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "Convert domain event to integration event" from packages/platform-core/tests/features/behavior/integration/published-language.feature +- outcome: Executable scenario: Convert domain event to integration event + +```gwt +Given the integration module is imported from platform-core +And the Published Language registry is available +And a registered schema for "OrderSubmitted" v1.0.0 +And a domain OrderSubmitted event with orderId and customerId +When I call toPublishedLanguage('OrderSubmitted', payload) +Then result.type equals "OrderSubmitted" +And result.payload contains orderId and customerId +And result.metadata.schemaVersion equals "1.0.0" +And result.metadata.timestamp is set +``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-005-convert-with-explicit-version.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-005-convert-with-explicit-version.sdp.md index 2f06bf1c..c3696bce 100644 --- a/specs/behavior/platform-core/integration/published-language.examples/s-005-convert-with-explicit-version.sdp.md +++ b/specs/behavior/platform-core/integration/published-language.examples/s-005-convert-with-explicit-version.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Convert with explicit version" from packages/platform-core/tests/features/behavior/integration/published-language.feature +- outcome: Executable scenario: Convert with explicit version + +```gwt +Given the integration module is imported from platform-core +And the Published Language registry is available +And "OrderSubmitted" versions "1.0.0" and "2.0.0" are registered +When I call toPublishedLanguage('OrderSubmitted', payload, { version: '1.0.0' }) +Then result.metadata.schemaVersion equals "1.0.0" +``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-006-unregistered-event-type-fails.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-006-unregistered-event-type-fails.sdp.md index e170a08d..b3cda58a 100644 --- a/specs/behavior/platform-core/integration/published-language.examples/s-006-unregistered-event-type-fails.sdp.md +++ b/specs/behavior/platform-core/integration/published-language.examples/s-006-unregistered-event-type-fails.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Unregistered event type fails" from packages/platform-core/tests/features/behavior/integration/published-language.feature +- outcome: Executable scenario: Unregistered event type fails + +```gwt +Given the integration module is imported from platform-core +And the Published Language registry is available +And no schema registered for "UnknownEvent" +When I call toPublishedLanguage('UnknownEvent', payload) +Then an error is thrown with code "SCHEMA_NOT_FOUND" +``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-007-invalid-payload-fails-schema-validation.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-007-invalid-payload-fails-schema-validation.sdp.md index 3e290950..aee47fde 100644 --- a/specs/behavior/platform-core/integration/published-language.examples/s-007-invalid-payload-fails-schema-validation.sdp.md +++ b/specs/behavior/platform-core/integration/published-language.examples/s-007-invalid-payload-fails-schema-validation.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Invalid payload fails schema validation" from packages/platform-core/tests/features/behavior/integration/published-language.feature +- outcome: Executable scenario: Invalid payload fails schema validation + +```gwt +Given the integration module is imported from platform-core +And the Published Language registry is available +And a registered schema requiring "orderId" field +When I call toPublishedLanguage('OrderSubmitted', {}) +Then an error is thrown with code "SCHEMA_VALIDATION_FAILED" +And error details mention missing "orderId" +``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-008-event-tagging-for-routing-and-dcb.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-008-event-tagging-for-routing-and-dcb.sdp.md index 973de076..c19d80b5 100644 --- a/specs/behavior/platform-core/integration/published-language.examples/s-008-event-tagging-for-routing-and-dcb.sdp.md +++ b/specs/behavior/platform-core/integration/published-language.examples/s-008-event-tagging-for-routing-and-dcb.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Event tagging for routing and DCB" from packages/platform-core/tests/features/behavior/integration/published-language.feature +- outcome: Executable scenario: Event tagging for routing and DCB + +```gwt +Given the integration module is imported from platform-core +And the Published Language registry is available +And a registered schema for "OrderSubmitted" v1.0.0 +And a domain event with customerId "cust_456" +When I call toPublishedLanguage('OrderSubmitted', payload, { tags: { customerId: 'cust_456' } }) +Then result.metadata.tags contains customerId +And tags can be used for DCB consistency queries +``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-009-multiple-tags-for-routing.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-009-multiple-tags-for-routing.sdp.md index 76b096ce..4be17593 100644 --- a/specs/behavior/platform-core/integration/published-language.examples/s-009-multiple-tags-for-routing.sdp.md +++ b/specs/behavior/platform-core/integration/published-language.examples/s-009-multiple-tags-for-routing.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Multiple tags for routing" from packages/platform-core/tests/features/behavior/integration/published-language.feature +- outcome: Executable scenario: Multiple tags for routing + +```gwt +Given the integration module is imported from platform-core +And the Published Language registry is available +And a registered schema for "OrderSubmitted" v1.0.0 +When I call toPublishedLanguage with tags { customerId: 'cust_456', region: 'US' } +Then result.metadata.tags contains both customerId and region +``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-010-register-schema-with-compatibility-mode.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-010-register-schema-with-compatibility-mode.sdp.md index fe5fccea..8f800929 100644 --- a/specs/behavior/platform-core/integration/published-language.examples/s-010-register-schema-with-compatibility-mode.sdp.md +++ b/specs/behavior/platform-core/integration/published-language.examples/s-010-register-schema-with-compatibility-mode.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Register schema with compatibility mode" from packages/platform-core/tests/features/behavior/integration/published-language.feature +- outcome: Executable scenario: Register schema with compatibility mode + +```gwt +Given the integration module is imported from platform-core +And the Published Language registry is available +And a new integration event type "InventoryReserved" +When I register with version "1.0.0" and compatibility "backward" +Then the schema is available in the registry +And compatibility mode is stored with the schema +``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-011-query-schema-compatibility-mode.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-011-query-schema-compatibility-mode.sdp.md index 3e0f1af5..68c572d9 100644 --- a/specs/behavior/platform-core/integration/published-language.examples/s-011-query-schema-compatibility-mode.sdp.md +++ b/specs/behavior/platform-core/integration/published-language.examples/s-011-query-schema-compatibility-mode.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Query schema compatibility mode" from packages/platform-core/tests/features/behavior/integration/published-language.feature +- outcome: Executable scenario: Query schema compatibility mode + +```gwt +Given the integration module is imported from platform-core +And the Published Language registry is available +And "OrderSubmitted" v2.0.0 registered with compatibility "full" +When I call getSchema('OrderSubmitted', '2.0.0') +Then result.compatibility equals "full" +``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-012-list-all-event-types.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-012-list-all-event-types.sdp.md index c23e2b89..8e5c56c7 100644 --- a/specs/behavior/platform-core/integration/published-language.examples/s-012-list-all-event-types.sdp.md +++ b/specs/behavior/platform-core/integration/published-language.examples/s-012-list-all-event-types.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "List all event types" from packages/platform-core/tests/features/behavior/integration/published-language.feature +- outcome: Executable scenario: List all event types + +```gwt +Given the integration module is imported from platform-core +And the Published Language registry is available +And schemas registered for "OrderSubmitted", "OrderConfirmed", "PaymentReceived" +When I call listEventTypes() +Then I receive ["OrderSubmitted", "OrderConfirmed", "PaymentReceived"] +``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-013-list-versions-for-event-type.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-013-list-versions-for-event-type.sdp.md index 194ab028..a891682d 100644 --- a/specs/behavior/platform-core/integration/published-language.examples/s-013-list-versions-for-event-type.sdp.md +++ b/specs/behavior/platform-core/integration/published-language.examples/s-013-list-versions-for-event-type.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "List versions for event type" from packages/platform-core/tests/features/behavior/integration/published-language.feature +- outcome: Executable scenario: List versions for event type + +```gwt +Given the integration module is imported from platform-core +And the Published Language registry is available +And "OrderSubmitted" has versions "1.0.0", "1.1.0", "2.0.0" +When I call listVersions('OrderSubmitted') +Then I receive ["1.0.0", "1.1.0", "2.0.0"] +``` diff --git a/specs/behavior/platform-core/integration/published-language.sdp.md b/specs/behavior/platform-core/integration/published-language.sdp.md index 4bd35924..28cfa0ac 100644 --- a/specs/behavior/platform-core/integration/published-language.sdp.md +++ b/specs/behavior/platform-core/integration/published-language.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: a registry of versioned integration event schemas so that cross-BC communication has stable contracts (test carrier: packages/platform-core/tests/features/behavior/integration/published-language.feature) +- actor: a platform developer +- outcome: a registry of versioned integration event schemas so that cross-BC communication has stable contracts + +## Behavior + +- rule: Schemas are registered with versions +- rule: toPublishedLanguage() converts domain events +- rule: Registry supports schema queries diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-001-set-contains-all-provided-invariants.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-001-set-contains-all-provided-invariants.sdp.md index 4ba06264..e86e0d5a 100644 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-001-set-contains-all-provided-invariants.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-001-set-contains-all-provided-invariants.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Set contains all provided invariants" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature +- outcome: Executable scenario: Set contains all provided invariants + +```gwt +Given an invariant set with "isDraft" and "hasItems" +When the scenario runs +Then the set has the following invariant names: +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-002-invariants-array-is-immutable-and-a-frozen-copy.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-002-invariants-array-is-immutable-and-a-frozen-copy.sdp.md index 1c198f45..c309b14d 100644 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-002-invariants-array-is-immutable-and-a-frozen-copy.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-002-invariants-array-is-immutable-and-a-frozen-copy.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Invariants array is immutable and a frozen copy" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature +- outcome: Executable scenario: Invariants array is immutable and a frozen copy + +```gwt +Given an invariant set with "isDraft" and "hasItems" from a mutable array +When the scenario runs +Then the invariants array is frozen +And mutating the original array does not affect the set +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-003-check-all-returns-true-when-all-invariants-pass.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-003-check-all-returns-true-when-all-invariants-pass.sdp.md index 4ac036f3..8c679bbd 100644 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-003-check-all-returns-true-when-all-invariants-pass.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-003-check-all-returns-true-when-all-invariants-pass.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "checkAll returns true when all invariants pass" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature +- outcome: Executable scenario: checkAll returns true when all invariants pass + +```gwt +Given an invariant set with "isDraft" and "hasItems" +When I checkAll with status "draft" and 1 item +Then the checkAll result is true +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-004-check-all-returns-false-when-first-invariant-fails.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-004-check-all-returns-false-when-first-invariant-fails.sdp.md index 3ffd756c..d6a67280 100644 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-004-check-all-returns-false-when-first-invariant-fails.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-004-check-all-returns-false-when-first-invariant-fails.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "checkAll returns false when first invariant fails" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature +- outcome: Executable scenario: checkAll returns false when first invariant fails + +```gwt +Given an invariant set with "isDraft" and "hasItems" +When I checkAll with status "submitted" and 1 item +Then the checkAll result is false +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-005-check-all-returns-false-when-second-invariant-fails.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-005-check-all-returns-false-when-second-invariant-fails.sdp.md index 3328b974..5c2279b8 100644 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-005-check-all-returns-false-when-second-invariant-fails.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-005-check-all-returns-false-when-second-invariant-fails.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "checkAll returns false when second invariant fails" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature +- outcome: Executable scenario: checkAll returns false when second invariant fails + +```gwt +Given an invariant set with "isDraft" and "hasItems" +When I checkAll with status "draft" and 0 items +Then the checkAll result is false +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-006-check-all-returns-false-when-all-invariants-fail.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-006-check-all-returns-false-when-all-invariants-fail.sdp.md index f6194ca4..a7fefda9 100644 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-006-check-all-returns-false-when-all-invariants-fail.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-006-check-all-returns-false-when-all-invariants-fail.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "checkAll returns false when all invariants fail" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature +- outcome: Executable scenario: checkAll returns false when all invariants fail + +```gwt +Given an invariant set with "isDraft" and "hasItems" +When I checkAll with status "submitted" and 0 items +Then the checkAll result is false +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-007-assert-all-does-not-throw-when-all-invariants-pass.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-007-assert-all-does-not-throw-when-all-invariants-pass.sdp.md index 986bf367..2c85071e 100644 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-007-assert-all-does-not-throw-when-all-invariants-pass.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-007-assert-all-does-not-throw-when-all-invariants-pass.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assertAll does not throw when all invariants pass" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature +- outcome: Executable scenario: assertAll does not throw when all invariants pass + +```gwt +Given an invariant set with "isDraft", "hasItems", and "notTooManyItems" +When I assertAll with status "draft" and 1 item +Then no assertAll error is thrown +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-008-assert-all-throws-on-first-failure-with-fail-fast.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-008-assert-all-throws-on-first-failure-with-fail-fast.sdp.md index e6be5e8f..606ad4d1 100644 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-008-assert-all-throws-on-first-failure-with-fail-fast.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-008-assert-all-throws-on-first-failure-with-fail-fast.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assertAll throws on first failure with fail-fast" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature +- outcome: Executable scenario: assertAll throws on first failure with fail-fast + +```gwt +Given an invariant set with "isDraft", "hasItems", and "notTooManyItems" +When I assertAll with status "submitted" and 0 items +Then the assertAll error has code "NOT_DRAFT" +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-009-assert-all-throws-correct-error-class.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-009-assert-all-throws-correct-error-class.sdp.md index 1215fc04..6e3138fa 100644 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-009-assert-all-throws-correct-error-class.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-009-assert-all-throws-correct-error-class.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assertAll throws correct error class" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature +- outcome: Executable scenario: assertAll throws correct error class + +```gwt +Given an invariant set with "isDraft", "hasItems", and "notTooManyItems" +When I assertAll with status "confirmed" and 1 item +Then the assertAll error is an instance of TestInvariantError and InvariantError +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-010-assert-all-throws-error-with-context-when-provided.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-010-assert-all-throws-error-with-context-when-provided.sdp.md index 4f2f5c29..afb56027 100644 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-010-assert-all-throws-error-with-context-when-provided.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-010-assert-all-throws-error-with-context-when-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assertAll throws error with context when provided" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature +- outcome: Executable scenario: assertAll throws error with context when provided + +```gwt +Given an invariant set with "isDraft", "hasItems", and "notTooManyItems" +When I assertAll with orderId "order-123" and status "submitted" and 1 item +Then the assertAll error has context with orderId "order-123" +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-011-validate-all-returns-valid-when-all-invariants-pass.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-011-validate-all-returns-valid-when-all-invariants-pass.sdp.md index 6f8a5517..52e6523b 100644 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-011-validate-all-returns-valid-when-all-invariants-pass.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-011-validate-all-returns-valid-when-all-invariants-pass.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "validateAll returns valid when all invariants pass" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature +- outcome: Executable scenario: validateAll returns valid when all invariants pass + +```gwt +Given an invariant set with "isDraft", "hasItems", and "notTooManyItems" +When I validateAll with status "draft" and 1 item +Then the validateAll result is valid +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-012-validate-all-collects-single-violation.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-012-validate-all-collects-single-violation.sdp.md index 98e4dc23..484433b4 100644 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-012-validate-all-collects-single-violation.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-012-validate-all-collects-single-violation.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "validateAll collects single violation" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature +- outcome: Executable scenario: validateAll collects single violation + +```gwt +Given an invariant set with "isDraft", "hasItems", and "notTooManyItems" +When I validateAll with orderId "order-123" and status "submitted" and 1 item +Then the validateAll result is invalid with 1 violation +And the validateAll violation 0 has: +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-013-validate-all-collects-multiple-violations-without-short-circuiting.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-013-validate-all-collects-multiple-violations-without-short-circuiting.sdp.md index 27a7367d..8a17025f 100644 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-013-validate-all-collects-multiple-violations-without-short-circuiting.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-013-validate-all-collects-multiple-violations-without-short-circuiting.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "validateAll collects multiple violations without short-circuiting" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature +- outcome: Executable scenario: validateAll collects multiple violations without short-circuiting + +```gwt +Given an invariant set with "isDraft", "hasItems", and "notTooManyItems" +When I validateAll with status "submitted" and 0 items +Then the validateAll result is invalid with 2 violations +And the validateAll violation codes include: +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-014-validate-all-collects-violations-from-non-adjacent-invariants.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-014-validate-all-collects-violations-from-non-adjacent-invariants.sdp.md index afd3dbc3..376bb736 100644 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-014-validate-all-collects-violations-from-non-adjacent-invariants.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-014-validate-all-collects-violations-from-non-adjacent-invariants.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "validateAll collects violations from non-adjacent invariants" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature +- outcome: Executable scenario: validateAll collects violations from non-adjacent invariants + +```gwt +Given an invariant set with "isDraft", "hasItems", and "notTooManyItems" +When I validateAll with status "submitted" and 15 items +Then the validateAll result is invalid with 2 violations +And the validateAll violation codes include: +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-015-validate-all-omits-context-when-invariant-has-no-context-function.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-015-validate-all-omits-context-when-invariant-has-no-context-function.sdp.md index 4e4056a8..1476761d 100644 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-015-validate-all-omits-context-when-invariant-has-no-context-function.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-015-validate-all-omits-context-when-invariant-has-no-context-function.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "validateAll omits context when invariant has no context function" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature +- outcome: Executable scenario: validateAll omits context when invariant has no context function + +```gwt +Given an invariant set with "isDraft", "hasItems", and "notTooManyItems" +When I validateAll with status "draft" and 0 items +Then the validateAll result is invalid with 1 violation +And the validateAll violation 0 has code "NO_ITEMS" and undefined context +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-016-empty-set-passes-all-operations.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-016-empty-set-passes-all-operations.sdp.md index 1b7a3895..b41c18a4 100644 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-016-empty-set-passes-all-operations.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-016-empty-set-passes-all-operations.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Empty set passes all operations" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature +- outcome: Executable scenario: Empty set passes all operations + +```gwt +Given an empty invariant set +When the scenario runs +Then checkAll returns true for the empty set +And assertAll does not throw for the empty set +And validateAll returns valid for the empty set +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-017-single-invariant-set-passes-all-operations-with-valid-state.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-017-single-invariant-set-passes-all-operations-with-valid-state.sdp.md index 9ac55e47..4abca2c2 100644 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-017-single-invariant-set-passes-all-operations-with-valid-state.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-017-single-invariant-set-passes-all-operations-with-valid-state.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Single invariant set passes all operations with valid state" from packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature +- outcome: Executable scenario: Single invariant set passes all operations with valid state + +```gwt +Given a single invariant set with "isDraft" +When I operate on the single set with status "draft" +Then the single set checkAll result is true +And the single set assertAll does not throw +And the single set validateAll returns valid +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.sdp.md index c7e0a2c9..9ef1f670 100644 --- a/specs/behavior/platform-core/invariants/create-invariant-set.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant-set.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: to group invariants into a set and validate them together so that I can check, assert, or validate multiple domain rules in one call (test carrier: packages/platform-core/tests/features/behavior/invariants/create-invariant-set.feature) +- actor: a domain developer +- outcome: to group invariants into a set and validate them together so that I can check, assert, or validate multiple domain rules in one call + +## Behavior + +- rule: createInvariantSet creates a set with all invariants accessible and immutable +- rule: checkAll returns true when all invariants pass and false when any fail +- rule: assertAll does not throw when all pass and throws on first failure with fail-fast +- rule: validateAll collects all violations without short-circuiting +- rule: Empty invariant set always passes all operations +- rule: Single invariant set works correctly diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-001-invariant-has-correct-name-and-code.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-001-invariant-has-correct-name-and-code.sdp.md index e24fc3ba..42abec1b 100644 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-001-invariant-has-correct-name-and-code.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-001-invariant-has-correct-name-and-code.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Invariant has correct name and code" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature +- outcome: Executable scenario: Invariant has correct name and code + +```gwt +Given a "isDraft" invariant with code "NOT_DRAFT" for draft status +When the scenario runs +Then the invariant has the following identity: +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-002-check-returns-true-when-state-satisfies-the-predicate.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-002-check-returns-true-when-state-satisfies-the-predicate.sdp.md index 6e893b51..f2b3f15b 100644 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-002-check-returns-true-when-state-satisfies-the-predicate.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-002-check-returns-true-when-state-satisfies-the-predicate.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "check returns true when state satisfies the predicate" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature +- outcome: Executable scenario: check returns true when state satisfies the predicate + +```gwt +Given a "isDraft" invariant with code "NOT_DRAFT" for draft status +When I check a state with status "draft" +Then the check result is true +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-003-check-returns-false-when-state-violates-the-predicate.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-003-check-returns-false-when-state-violates-the-predicate.sdp.md index c406d4f8..954ad02a 100644 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-003-check-returns-false-when-state-violates-the-predicate.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-003-check-returns-false-when-state-violates-the-predicate.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "check returns false when state violates the predicate" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature +- outcome: Executable scenario: check returns false when state violates the predicate + +```gwt +Given a "isDraft" invariant with code "NOT_DRAFT" for draft status +When I check a state with status "submitted" +Then the check result is false +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-004-assert-does-not-throw-when-state-is-valid.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-004-assert-does-not-throw-when-state-is-valid.sdp.md index 51179f10..aedffab9 100644 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-004-assert-does-not-throw-when-state-is-valid.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-004-assert-does-not-throw-when-state-is-valid.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assert does not throw when state is valid" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature +- outcome: Executable scenario: assert does not throw when state is valid + +```gwt +Given a "isDraft" invariant with code "NOT_DRAFT" for draft status +When I assert a state with status "draft" +Then no error is thrown +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-005-assert-throws-invariant-error-when-state-is-invalid.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-005-assert-throws-invariant-error-when-state-is-invalid.sdp.md index 1d6ffd0c..4f7370d0 100644 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-005-assert-throws-invariant-error-when-state-is-invalid.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-005-assert-throws-invariant-error-when-state-is-invalid.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assert throws InvariantError when state is invalid" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature +- outcome: Executable scenario: assert throws InvariantError when state is invalid + +```gwt +Given a "isDraft" invariant with code "NOT_DRAFT" for draft status +When I assert a state with status "submitted" +Then an InvariantError is thrown +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-006-assert-error-has-correct-code-for-invalid-state.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-006-assert-error-has-correct-code-for-invalid-state.sdp.md index cda75f8a..e94fc758 100644 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-006-assert-error-has-correct-code-for-invalid-state.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-006-assert-error-has-correct-code-for-invalid-state.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assert error has correct code for invalid state" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature +- outcome: Executable scenario: assert error has correct code for invalid state + +```gwt +Given a "isDraft" invariant with code "NOT_DRAFT" for draft status +When I assert a state with status "confirmed" +Then the thrown error has code "NOT_DRAFT" +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-007-assert-error-has-correct-message-for-invalid-state.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-007-assert-error-has-correct-message-for-invalid-state.sdp.md index 981c9b5e..c5f11d90 100644 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-007-assert-error-has-correct-message-for-invalid-state.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-007-assert-error-has-correct-message-for-invalid-state.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assert error has correct message for invalid state" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature +- outcome: Executable scenario: assert error has correct message for invalid state + +```gwt +Given a "isDraft" invariant with code "NOT_DRAFT" for draft status +When I assert a state with status "confirmed" +Then the thrown error has message "Expected draft status, got confirmed" +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-008-assert-error-has-correct-context-for-invalid-state.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-008-assert-error-has-correct-context-for-invalid-state.sdp.md index 6b0b5f61..953b1424 100644 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-008-assert-error-has-correct-context-for-invalid-state.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-008-assert-error-has-correct-context-for-invalid-state.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assert error has correct context for invalid state" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature +- outcome: Executable scenario: assert error has correct context for invalid state + +```gwt +Given a "isDraft" invariant with code "NOT_DRAFT" for draft status +When I assert a state with orderId "order-123" and status "submitted" +Then the thrown error has context: +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-009-validate-returns-valid-result-for-valid-state.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-009-validate-returns-valid-result-for-valid-state.sdp.md index e181b8ea..a576d844 100644 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-009-validate-returns-valid-result-for-valid-state.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-009-validate-returns-valid-result-for-valid-state.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "validate returns valid result for valid state" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature +- outcome: Executable scenario: validate returns valid result for valid state + +```gwt +Given a "isDraft" invariant with code "NOT_DRAFT" for draft status +When I validate a state with status "draft" +Then the validation result is valid +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-010-validate-returns-violation-details-for-invalid-state.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-010-validate-returns-violation-details-for-invalid-state.sdp.md index 71f02ca1..42bab476 100644 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-010-validate-returns-violation-details-for-invalid-state.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-010-validate-returns-violation-details-for-invalid-state.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "validate returns violation details for invalid state" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature +- outcome: Executable scenario: validate returns violation details for invalid state + +```gwt +Given a "isDraft" invariant with code "NOT_DRAFT" for draft status +When I validate a state with orderId "order-123" and status "submitted" +Then the validation result is invalid with: +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-011-assert-error-has-undefined-context-when-no-context-function.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-011-assert-error-has-undefined-context-when-no-context-function.sdp.md index 29b8f88f..9805700d 100644 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-011-assert-error-has-undefined-context-when-no-context-function.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-011-assert-error-has-undefined-context-when-no-context-function.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assert error has undefined context when no context function" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature +- outcome: Executable scenario: assert error has undefined context when no context function + +```gwt +Given a "hasItems" invariant with code "NO_ITEMS" without context function +When I assert the hasItems invariant with an empty items state +Then the thrown error has undefined context +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-012-validate-result-has-undefined-context-when-no-context-function.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-012-validate-result-has-undefined-context-when-no-context-function.sdp.md index fbb8133c..68b5dd99 100644 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-012-validate-result-has-undefined-context-when-no-context-function.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-012-validate-result-has-undefined-context-when-no-context-function.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "validate result has undefined context when no context function" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature +- outcome: Executable scenario: validate result has undefined context when no context function + +```gwt +Given a "hasItems" invariant with code "NO_ITEMS" without context function +When I validate the hasItems invariant with an empty items state +Then the validation result is invalid without context with: +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-013-check-uses-parameter-to-find-matching-item.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-013-check-uses-parameter-to-find-matching-item.sdp.md index 6350c3a3..d25653b7 100644 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-013-check-uses-parameter-to-find-matching-item.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-013-check-uses-parameter-to-find-matching-item.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "check uses parameter to find matching item" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature +- outcome: Executable scenario: check uses parameter to find matching item + +```gwt +Given a parameterized "itemExists" invariant with code "ITEM_NOT_FOUND" +And a state with items: +When I check the parameterized invariant with parameter "prod-1" +Then the check result is true +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-014-check-returns-false-when-parameter-does-not-match.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-014-check-returns-false-when-parameter-does-not-match.sdp.md index b66eb07e..9792d577 100644 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-014-check-returns-false-when-parameter-does-not-match.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-014-check-returns-false-when-parameter-does-not-match.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "check returns false when parameter does not match" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature +- outcome: Executable scenario: check returns false when parameter does not match + +```gwt +Given a parameterized "itemExists" invariant with code "ITEM_NOT_FOUND" +And a state with items: +When I check the parameterized invariant with parameter "prod-2" +Then the check result is false +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-015-assert-uses-parameter-in-error-message-and-context.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-015-assert-uses-parameter-in-error-message-and-context.sdp.md index d9441436..9c4e0f92 100644 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-015-assert-uses-parameter-in-error-message-and-context.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-015-assert-uses-parameter-in-error-message-and-context.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "assert uses parameter in error message and context" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature +- outcome: Executable scenario: assert uses parameter in error message and context + +```gwt +Given a parameterized "itemExists" invariant with code "ITEM_NOT_FOUND" +And a state with orderId "order-123" and items: +When I assert the parameterized invariant with parameter "prod-missing" +Then the thrown error has message "Item prod-missing not found in order order-123" +And the thrown error has context: +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-016-validate-uses-parameter-in-result.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-016-validate-uses-parameter-in-result.sdp.md index 0fa750ed..9a6a24d0 100644 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-016-validate-uses-parameter-in-result.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-016-validate-uses-parameter-in-result.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "validate uses parameter in result" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature +- outcome: Executable scenario: validate uses parameter in result + +```gwt +Given a parameterized "itemExists" invariant with code "ITEM_NOT_FOUND" +And a state with orderId "order-456" and no items +When I validate the parameterized invariant with parameter "prod-xyz" +Then the validation result is invalid with: +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-017-assert-throws-error-of-the-correct-custom-class.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-017-assert-throws-error-of-the-correct-custom-class.sdp.md index a294df62..ebb334a6 100644 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-017-assert-throws-error-of-the-correct-custom-class.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant.examples/s-017-assert-throws-error-of-the-correct-custom-class.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "assert throws error of the correct custom class" from packages/platform-core/tests/features/behavior/invariants/create-invariant.feature +- outcome: Executable scenario: assert throws error of the correct custom class + +```gwt +Given an invariant using a custom "Order" error class +When I assert the custom invariant with invalid state +Then the thrown error is an instance of the custom error class +And the thrown error is an instance of InvariantError +And the thrown error has name "OrderInvariantError" +``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.sdp.md index 30711524..015122ef 100644 --- a/specs/behavior/platform-core/invariants/create-invariant.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: a factory function to create invariants from a specification so that domain rules are reusable, composable, and produce structured violations (test carrier: packages/platform-core/tests/features/behavior/invariants/create-invariant.feature) +- actor: a domain developer +- outcome: a factory function to create invariants from a specification so that domain rules are reusable, composable, and produce structured violations + +## Behavior + +- rule: createInvariant produces an invariant with correct name, code, and methods +- rule: assert does not throw for valid state and throws InvariantError for invalid state +- rule: validate returns structured result without throwing +- rule: Invariant without context function omits context from errors and results +- rule: Parameterized invariants pass extra arguments to check, message, and context +- rule: createInvariant uses the provided error class for thrown errors diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-001-creating-an-error-with-code-and-message.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-001-creating-an-error-with-code-and-message.sdp.md index d80ffa52..3f3594a9 100644 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-001-creating-an-error-with-code-and-message.sdp.md +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-001-creating-an-error-with-code-and-message.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Creating an error with code and message" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature +- outcome: Executable scenario: Creating an error with code and message + +```gwt +Given an InvariantError with code "ORDER_NOT_FOUND" and message "Order not found" +When the scenario runs +Then the error is an instance of Error +And the error is an instance of InvariantError +And the error has the following properties: +``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-002-including-context-when-provided.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-002-including-context-when-provided.sdp.md index ec18c6a7..68ad97af 100644 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-002-including-context-when-provided.sdp.md +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-002-including-context-when-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Including context when provided" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature +- outcome: Executable scenario: Including context when provided + +```gwt +Given an InvariantError with code "VALIDATION_ERROR" and message "Invalid quantity" and context: +When the scenario runs +Then the error context equals the provided context +``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-003-context-is-undefined-when-not-provided.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-003-context-is-undefined-when-not-provided.sdp.md index 6ba9ace8..4091a7bf 100644 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-003-context-is-undefined-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-003-context-is-undefined-when-not-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Context is undefined when not provided" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature +- outcome: Executable scenario: Context is undefined when not provided + +```gwt +Given an InvariantError with code "SOME_ERROR" and message "message" without context +When the scenario runs +Then the error context is undefined +``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-004-error-has-proper-stack-trace.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-004-error-has-proper-stack-trace.sdp.md index 67337435..b2b244fe 100644 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-004-error-has-proper-stack-trace.sdp.md +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-004-error-has-proper-stack-trace.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Error has proper stack trace" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature +- outcome: Executable scenario: Error has proper stack trace + +```gwt +Given an InvariantError with code "ERROR" and message "message" without context +When the scenario runs +Then the error stack is defined +And the error stack contains "InvariantError" +``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-005-creating-a-context-specific-error-class.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-005-creating-a-context-specific-error-class.sdp.md index 562d188d..1280ac18 100644 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-005-creating-a-context-specific-error-class.sdp.md +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-005-creating-a-context-specific-error-class.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Creating a context-specific error class" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature +- outcome: Executable scenario: Creating a context-specific error class + +```gwt +Given a context-specific error class for "Order" +When I create an error with code "ORDER_NOT_FOUND" and message "Order not found" +Then the error is an instance of InvariantError +And the error has the following properties: +``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-006-different-contexts-produce-different-classes.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-006-different-contexts-produce-different-classes.sdp.md index 3cb094fd..cf392fc5 100644 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-006-different-contexts-produce-different-classes.sdp.md +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-006-different-contexts-produce-different-classes.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Different contexts produce different classes" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature +- outcome: Executable scenario: Different contexts produce different classes + +```gwt +Given a context-specific error class for "Order" +And a context-specific error class for "Inventory" +When I create an Order error with code "ORDER_NOT_FOUND" and message "not found" and I create an Inventory error with code "PRODUCT_NOT_FOUND" and message "not found" +Then the Order error name is "OrderInvariantError" +And the Inventory error name is "InventoryInvariantError" +And both errors are instances of InvariantError +``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-007-typed-error-codes-are-supported.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-007-typed-error-codes-are-supported.sdp.md index df41edb9..fa54b0b9 100644 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-007-typed-error-codes-are-supported.sdp.md +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-007-typed-error-codes-are-supported.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Typed error codes are supported" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature +- outcome: Executable scenario: Typed error codes are supported + +```gwt +Given a context-specific error class for "Order" with typed codes +When I create errors with each typed code +Then all errors compile and instantiate successfully +``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-008-context-specific-errors-include-context-data.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-008-context-specific-errors-include-context-data.sdp.md index 86136c83..4d65170e 100644 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-008-context-specific-errors-include-context-data.sdp.md +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-008-context-specific-errors-include-context-data.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Context-specific errors include context data" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature +- outcome: Executable scenario: Context-specific errors include context data + +```gwt +Given a context-specific error class for "Product" +When I create an error with code "OUT_OF_STOCK" and message "Product out of stock" and context: +Then the error context equals the provided context +``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-009-context-specific-class-has-proper-constructor-name.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-009-context-specific-class-has-proper-constructor-name.sdp.md index 2994efc7..ef24f860 100644 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-009-context-specific-class-has-proper-constructor-name.sdp.md +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-009-context-specific-class-has-proper-constructor-name.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Context-specific class has proper constructor name" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature +- outcome: Executable scenario: Context-specific class has proper constructor name + +```gwt +Given a context-specific error class for "Customer" +When the scenario runs +Then the class name is "CustomerInvariantError" +``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-010-returns-true-for-invariant-error-instances.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-010-returns-true-for-invariant-error-instances.sdp.md index c1bc6677..f81dac7b 100644 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-010-returns-true-for-invariant-error-instances.sdp.md +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-010-returns-true-for-invariant-error-instances.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for InvariantError instances" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature +- outcome: Executable scenario: Returns true for InvariantError instances + +```gwt +Given an InvariantError with code "CODE" and message "message" without context +When the scenario runs +Then isInvariantError returns true +``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-011-returns-true-for-context-specific-error-instances.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-011-returns-true-for-context-specific-error-instances.sdp.md index e8731154..6cd2ed55 100644 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-011-returns-true-for-context-specific-error-instances.sdp.md +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-011-returns-true-for-context-specific-error-instances.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for context-specific error instances" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature +- outcome: Executable scenario: Returns true for context-specific error instances + +```gwt +Given a context-specific error class for "Order" +When I create an error with code "CODE" and message "message" +Then isInvariantError returns true for the context error +``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-012-returns-false-for-regular-error-instances.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-012-returns-false-for-regular-error-instances.sdp.md index e5a37c5a..2814c536 100644 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-012-returns-false-for-regular-error-instances.sdp.md +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-012-returns-false-for-regular-error-instances.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for regular Error instances" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature +- outcome: Executable scenario: Returns false for regular Error instances + +```gwt +Given a regular Error with message "message" +When the scenario runs +Then isInvariantError returns false +``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-013-returns-false-for-non-error-values.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-013-returns-false-for-non-error-values.sdp.md index 2307103d..778d61b9 100644 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-013-returns-false-for-non-error-values.sdp.md +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-013-returns-false-for-non-error-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for non-error values" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature +- outcome: Executable scenario: Returns false for non-error values + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isInvariantError returns false for all of: +``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-014-returns-true-when-error-has-the-specified-code.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-014-returns-true-when-error-has-the-specified-code.sdp.md index 39b0ad93..b47faf08 100644 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-014-returns-true-when-error-has-the-specified-code.sdp.md +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-014-returns-true-when-error-has-the-specified-code.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true when error has the specified code" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature +- outcome: Executable scenario: Returns true when error has the specified code + +```gwt +Given an InvariantError with code "ORDER_NOT_FOUND" and message "message" without context +When the scenario runs +Then hasCode with "ORDER_NOT_FOUND" returns true +``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-015-returns-false-when-error-has-a-different-code.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-015-returns-false-when-error-has-a-different-code.sdp.md index 18e6b58a..55c3a5d3 100644 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-015-returns-false-when-error-has-a-different-code.sdp.md +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-015-returns-false-when-error-has-a-different-code.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false when error has a different code" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature +- outcome: Executable scenario: Returns false when error has a different code + +```gwt +Given an InvariantError with code "ORDER_NOT_FOUND" and message "message" without context +When the scenario runs +Then hasCode with "ORDER_ALREADY_EXISTS" returns false +``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-016-returns-false-for-non-invariant-error-values.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-016-returns-false-for-non-invariant-error-values.sdp.md index 2ff9ff32..ec1c6904 100644 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-016-returns-false-for-non-invariant-error-values.sdp.md +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-016-returns-false-for-non-invariant-error-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for non-InvariantError values" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature +- outcome: Executable scenario: Returns false for non-InvariantError values + +```gwt +Given the feature fixture is in place +When the scenario runs +Then hasCode returns false for all of: +``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-017-works-with-context-specific-errors.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-017-works-with-context-specific-errors.sdp.md index db9c2a70..82148480 100644 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-017-works-with-context-specific-errors.sdp.md +++ b/specs/behavior/platform-core/invariants/invariant-error.examples/s-017-works-with-context-specific-errors.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Works with context-specific errors" from packages/platform-core/tests/features/behavior/invariants/invariant-error.feature +- outcome: Executable scenario: Works with context-specific errors + +```gwt +Given a context-specific error class for "Inventory" +When I create an error with code "OUT_OF_STOCK" and message "message" +Then hasCode with "OUT_OF_STOCK" returns true for the context error +And hasCode with "OTHER_CODE" returns false for the context error +``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.sdp.md index 25b521f2..59ceefd9 100644 --- a/specs/behavior/platform-core/invariants/invariant-error.sdp.md +++ b/specs/behavior/platform-core/invariants/invariant-error.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: a base invariant error class with factory and type guards so that domain rule violations are expressed as typed, inspectable errors (test carrier: packages/platform-core/tests/features/behavior/invariants/invariant-error.feature) +- actor: a domain developer +- outcome: a base invariant error class with factory and type guards so that domain rule violations are expressed as typed, inspectable errors + +## Behavior + +- rule: InvariantError constructor creates a properly structured error +- rule: forContext factory creates context-specific error classes +- rule: isInvariantError type guard identifies InvariantError instances +- rule: hasCode type guard checks error codes diff --git a/specs/behavior/platform-core/logging/commands.examples/s-001-command-start-is-logged-at-info-level.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-001-command-start-is-logged-at-info-level.sdp.md index ff7ab324..e80a66e8 100644 --- a/specs/behavior/platform-core/logging/commands.examples/s-001-command-start-is-logged-at-info-level.sdp.md +++ b/specs/behavior/platform-core/logging/commands.examples/s-001-command-start-is-logged-at-info-level.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Command start is logged at INFO level" from packages/platform-core/tests/features/behavior/logging/commands.feature +- outcome: Executable scenario: Command start is logged at INFO level + +```gwt +Given a base command log context +When I call logCommandStart +Then the log has 1 entry at level "INFO" with message "Command started" +And the log data equals the base context +``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-002-entity-specific-fields-are-included-in-start-log-data.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-002-entity-specific-fields-are-included-in-start-log-data.sdp.md index 64db861d..4df70e99 100644 --- a/specs/behavior/platform-core/logging/commands.examples/s-002-entity-specific-fields-are-included-in-start-log-data.sdp.md +++ b/specs/behavior/platform-core/logging/commands.examples/s-002-entity-specific-fields-are-included-in-start-log-data.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Entity-specific fields are included in start log data" from packages/platform-core/tests/features/behavior/logging/commands.feature +- outcome: Executable scenario: Entity-specific fields are included in start log data + +```gwt +Given a base command log context with extra fields +When I call logCommandStart with the extended context +Then the log data equals the extended context +``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-003-command-success-is-logged-at-info-level-with-result.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-003-command-success-is-logged-at-info-level-with-result.sdp.md index d73d46bd..b76ab421 100644 --- a/specs/behavior/platform-core/logging/commands.examples/s-003-command-success-is-logged-at-info-level-with-result.sdp.md +++ b/specs/behavior/platform-core/logging/commands.examples/s-003-command-success-is-logged-at-info-level-with-result.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Command success is logged at INFO level with result" from packages/platform-core/tests/features/behavior/logging/commands.feature +- outcome: Executable scenario: Command success is logged at INFO level with result + +```gwt +Given a base command log context +When I call logCommandSuccess with version 1 and eventType "OrderCreated" +Then the success log data equals the base context merged with: +``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-004-context-fields-are-preserved-alongside-result-fields.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-004-context-fields-are-preserved-alongside-result-fields.sdp.md index 963750e6..553b302b 100644 --- a/specs/behavior/platform-core/logging/commands.examples/s-004-context-fields-are-preserved-alongside-result-fields.sdp.md +++ b/specs/behavior/platform-core/logging/commands.examples/s-004-context-fields-are-preserved-alongside-result-fields.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Context fields are preserved alongside result fields" from packages/platform-core/tests/features/behavior/logging/commands.feature +- outcome: Executable scenario: Context fields are preserved alongside result fields + +```gwt +Given a base command log context +When I call logCommandSuccess with version 5 and eventType "OrderConfirmed" +Then the log data has all expected properties: +``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-005-command-rejection-is-logged-at-warn-level.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-005-command-rejection-is-logged-at-warn-level.sdp.md index 0cddca4a..059cc315 100644 --- a/specs/behavior/platform-core/logging/commands.examples/s-005-command-rejection-is-logged-at-warn-level.sdp.md +++ b/specs/behavior/platform-core/logging/commands.examples/s-005-command-rejection-is-logged-at-warn-level.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Command rejection is logged at WARN level" from packages/platform-core/tests/features/behavior/logging/commands.feature +- outcome: Executable scenario: Command rejection is logged at WARN level + +```gwt +Given a base command log context +When I call logCommandRejected with code "INVALID_STATE" and message "Order already confirmed" +Then the rejection log data equals the base context merged with: +``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-006-rejection-uses-prefixed-field-names-not-raw-code-message.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-006-rejection-uses-prefixed-field-names-not-raw-code-message.sdp.md index 4ea3b810..c2342b45 100644 --- a/specs/behavior/platform-core/logging/commands.examples/s-006-rejection-uses-prefixed-field-names-not-raw-code-message.sdp.md +++ b/specs/behavior/platform-core/logging/commands.examples/s-006-rejection-uses-prefixed-field-names-not-raw-code-message.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejection uses prefixed field names not raw code/message" from packages/platform-core/tests/features/behavior/logging/commands.feature +- outcome: Executable scenario: Rejection uses prefixed field names not raw code/message + +```gwt +Given a base command log context +When I call logCommandRejected with code "DUPLICATE" and message "Order ID already exists" +Then the log data has expected properties: +And the log data does not have properties: +``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-007-business-failure-is-logged-at-warn-level.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-007-business-failure-is-logged-at-warn-level.sdp.md index d8310e6d..ce86750f 100644 --- a/specs/behavior/platform-core/logging/commands.examples/s-007-business-failure-is-logged-at-warn-level.sdp.md +++ b/specs/behavior/platform-core/logging/commands.examples/s-007-business-failure-is-logged-at-warn-level.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Business failure is logged at WARN level" from packages/platform-core/tests/features/behavior/logging/commands.feature +- outcome: Executable scenario: Business failure is logged at WARN level + +```gwt +Given a base command log context +When I call logCommandFailed with eventType "ReservationFailed" and reason "Insufficient stock" +Then the failure log data equals the base context merged with: +``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-008-business-failure-uses-failure-reason-not-reason.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-008-business-failure-uses-failure-reason-not-reason.sdp.md index 2e03e3bc..229311f1 100644 --- a/specs/behavior/platform-core/logging/commands.examples/s-008-business-failure-uses-failure-reason-not-reason.sdp.md +++ b/specs/behavior/platform-core/logging/commands.examples/s-008-business-failure-uses-failure-reason-not-reason.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Business failure uses failureReason not reason" from packages/platform-core/tests/features/behavior/logging/commands.feature +- outcome: Executable scenario: Business failure uses failureReason not reason + +```gwt +Given a base command log context +When I call logCommandFailed with eventType "PaymentFailed" and reason "Card declined" +Then the log data has failureReason "Card declined" +And the log data does not have property "reason" +``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-009-error-object-is-logged-at-error-level-with-message-and-stack.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-009-error-object-is-logged-at-error-level-with-message-and-stack.sdp.md index 2ed60957..12450899 100644 --- a/specs/behavior/platform-core/logging/commands.examples/s-009-error-object-is-logged-at-error-level-with-message-and-stack.sdp.md +++ b/specs/behavior/platform-core/logging/commands.examples/s-009-error-object-is-logged-at-error-level-with-message-and-stack.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Error object is logged at ERROR level with message and stack" from packages/platform-core/tests/features/behavior/logging/commands.feature +- outcome: Executable scenario: Error object is logged at ERROR level with message and stack + +```gwt +Given a base command log context +When I call logCommandError with an Error "Database connection failed" +Then the log has 1 entry at level "ERROR" with message "Command failed" +And the log error data has message "Database connection failed" +And the log error data has a stack trace containing "Database connection failed" +``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-010-string-error-is-logged-directly.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-010-string-error-is-logged-directly.sdp.md index eb36fdc2..fa81d1b1 100644 --- a/specs/behavior/platform-core/logging/commands.examples/s-010-string-error-is-logged-directly.sdp.md +++ b/specs/behavior/platform-core/logging/commands.examples/s-010-string-error-is-logged-directly.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "String error is logged directly" from packages/platform-core/tests/features/behavior/logging/commands.feature +- outcome: Executable scenario: String error is logged directly + +```gwt +Given a base command log context +When I call logCommandError with string "Something went wrong" +Then the log has 1 entry at level "ERROR" with message "Command failed" +And the log data error field equals "Something went wrong" +``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-011-non-string-non-error-values-are-stringified.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-011-non-string-non-error-values-are-stringified.sdp.md index 36306498..c43877ba 100644 --- a/specs/behavior/platform-core/logging/commands.examples/s-011-non-string-non-error-values-are-stringified.sdp.md +++ b/specs/behavior/platform-core/logging/commands.examples/s-011-non-string-non-error-values-are-stringified.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Non-string non-Error values are stringified" from packages/platform-core/tests/features/behavior/logging/commands.feature +- outcome: Executable scenario: Non-string non-Error values are stringified + +```gwt +Given a base command log context +When I call logCommandError with a plain object +Then the log data error field equals "[object Object]" +``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-012-null-error-is-stringified.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-012-null-error-is-stringified.sdp.md index e22da551..126feaf5 100644 --- a/specs/behavior/platform-core/logging/commands.examples/s-012-null-error-is-stringified.sdp.md +++ b/specs/behavior/platform-core/logging/commands.examples/s-012-null-error-is-stringified.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Null error is stringified" from packages/platform-core/tests/features/behavior/logging/commands.feature +- outcome: Executable scenario: Null error is stringified + +```gwt +Given a base command log context +When I call logCommandError with null +Then the log data error field equals "null" +``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-013-undefined-error-is-stringified.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-013-undefined-error-is-stringified.sdp.md index 2324f994..940bee1c 100644 --- a/specs/behavior/platform-core/logging/commands.examples/s-013-undefined-error-is-stringified.sdp.md +++ b/specs/behavior/platform-core/logging/commands.examples/s-013-undefined-error-is-stringified.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Undefined error is stringified" from packages/platform-core/tests/features/behavior/logging/commands.feature +- outcome: Executable scenario: Undefined error is stringified + +```gwt +Given a base command log context +When I call logCommandError with undefined +Then the log data error field equals "undefined" +``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-014-stack-trace-is-preserved-for-debugging.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-014-stack-trace-is-preserved-for-debugging.sdp.md index 4facf890..d44b1858 100644 --- a/specs/behavior/platform-core/logging/commands.examples/s-014-stack-trace-is-preserved-for-debugging.sdp.md +++ b/specs/behavior/platform-core/logging/commands.examples/s-014-stack-trace-is-preserved-for-debugging.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Stack trace is preserved for debugging" from packages/platform-core/tests/features/behavior/logging/commands.feature +- outcome: Executable scenario: Stack trace is preserved for debugging + +```gwt +Given a base command log context +When I call logCommandError with an Error "Test error" +Then the log error data has a stack trace containing "Test error" +``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-015-full-success-lifecycle-produces-start-and-success-logs.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-015-full-success-lifecycle-produces-start-and-success-logs.sdp.md index 38653055..c5840d8f 100644 --- a/specs/behavior/platform-core/logging/commands.examples/s-015-full-success-lifecycle-produces-start-and-success-logs.sdp.md +++ b/specs/behavior/platform-core/logging/commands.examples/s-015-full-success-lifecycle-produces-start-and-success-logs.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Full success lifecycle produces start and success logs" from packages/platform-core/tests/features/behavior/logging/commands.feature +- outcome: Executable scenario: Full success lifecycle produces start and success logs + +```gwt +Given a base command log context +When I log a full success lifecycle +Then there are 2 log entries with messages: +``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-016-rejection-lifecycle-produces-info-and-warn-logs.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-016-rejection-lifecycle-produces-info-and-warn-logs.sdp.md index bee0cafd..6c65e0a7 100644 --- a/specs/behavior/platform-core/logging/commands.examples/s-016-rejection-lifecycle-produces-info-and-warn-logs.sdp.md +++ b/specs/behavior/platform-core/logging/commands.examples/s-016-rejection-lifecycle-produces-info-and-warn-logs.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rejection lifecycle produces INFO and WARN logs" from packages/platform-core/tests/features/behavior/logging/commands.feature +- outcome: Executable scenario: Rejection lifecycle produces INFO and WARN logs + +```gwt +Given a base command log context +When I log a rejection lifecycle +Then there are 2 log entries +And the log level counts are: +``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-017-error-lifecycle-produces-info-and-error-logs.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-017-error-lifecycle-produces-info-and-error-logs.sdp.md index e5782f1b..7a047e95 100644 --- a/specs/behavior/platform-core/logging/commands.examples/s-017-error-lifecycle-produces-info-and-error-logs.sdp.md +++ b/specs/behavior/platform-core/logging/commands.examples/s-017-error-lifecycle-produces-info-and-error-logs.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Error lifecycle produces INFO and ERROR logs" from packages/platform-core/tests/features/behavior/logging/commands.feature +- outcome: Executable scenario: Error lifecycle produces INFO and ERROR logs + +```gwt +Given a base command log context +When I log an error lifecycle +Then there are 2 log entries +And the log level counts are: +``` diff --git a/specs/behavior/platform-core/logging/commands.sdp.md b/specs/behavior/platform-core/logging/commands.sdp.md index d4aaf0d8..ccf15823 100644 --- a/specs/behavior/platform-core/logging/commands.sdp.md +++ b/specs/behavior/platform-core/logging/commands.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: structured logging helpers for command lifecycle events so that I can trace command execution with consistent field naming (test carrier: packages/platform-core/tests/features/behavior/logging/commands.feature) +- actor: a platform developer +- outcome: structured logging helpers for command lifecycle events so that I can trace command execution with consistent field naming + +## Behavior + +- rule: logCommandStart logs at INFO level with full context +- rule: logCommandSuccess logs at INFO level with version and eventType +- rule: logCommandRejected logs at WARN level with rejection details +- rule: logCommandFailed logs business failures at WARN level +- rule: logCommandError logs unexpected errors at ERROR level +- rule: Command lifecycle can be traced through sequential log entries diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-001-messages-are-prefixed-with-scope.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-001-messages-are-prefixed-with-scope.sdp.md index 5577a54c..6d50d74c 100644 --- a/specs/behavior/platform-core/logging/scoped.examples/s-001-messages-are-prefixed-with-scope.sdp.md +++ b/specs/behavior/platform-core/logging/scoped.examples/s-001-messages-are-prefixed-with-scope.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Messages are prefixed with scope" from packages/platform-core/tests/features/behavior/logging/scoped.feature +- outcome: Executable scenario: Messages are prefixed with scope + +```gwt +Given a scoped logger "TestScope" at level "DEBUG" +When I log an info message "Test message" +Then console.info was called with "[TestScope] Test message" +``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-002-data-object-is-appended-as-json.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-002-data-object-is-appended-as-json.sdp.md index 3d55ad76..cf810bad 100644 --- a/specs/behavior/platform-core/logging/scoped.examples/s-002-data-object-is-appended-as-json.sdp.md +++ b/specs/behavior/platform-core/logging/scoped.examples/s-002-data-object-is-appended-as-json.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Data object is appended as JSON" from packages/platform-core/tests/features/behavior/logging/scoped.feature +- outcome: Executable scenario: Data object is appended as JSON + +```gwt +Given a scoped logger "TestScope" at level "DEBUG" +When I log an info message "Test message" with data '{"key":"value"}' +Then console.info was called with '[TestScope] Test message {"key":"value"}' +``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-003-empty-data-object-is-omitted-from-output.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-003-empty-data-object-is-omitted-from-output.sdp.md index fbfe6225..25b2495b 100644 --- a/specs/behavior/platform-core/logging/scoped.examples/s-003-empty-data-object-is-omitted-from-output.sdp.md +++ b/specs/behavior/platform-core/logging/scoped.examples/s-003-empty-data-object-is-omitted-from-output.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Empty data object is omitted from output" from packages/platform-core/tests/features/behavior/logging/scoped.feature +- outcome: Executable scenario: Empty data object is omitted from output + +```gwt +Given a scoped logger "TestScope" at level "DEBUG" +When I log an info message "Test message" with empty data +Then console.info was called with "[TestScope] Test message" +``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-004-debug-level-allows-debug-messages.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-004-debug-level-allows-debug-messages.sdp.md index 5e9cfcae..3673478e 100644 --- a/specs/behavior/platform-core/logging/scoped.examples/s-004-debug-level-allows-debug-messages.sdp.md +++ b/specs/behavior/platform-core/logging/scoped.examples/s-004-debug-level-allows-debug-messages.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "DEBUG level allows debug messages" from packages/platform-core/tests/features/behavior/logging/scoped.feature +- outcome: Executable scenario: DEBUG level allows debug messages + +```gwt +Given a scoped logger "Test" at level "DEBUG" +When I log a debug message "Debug message" +Then console.debug was called +``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-005-info-level-suppresses-debug-messages.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-005-info-level-suppresses-debug-messages.sdp.md index 8bc2e92d..ce85d901 100644 --- a/specs/behavior/platform-core/logging/scoped.examples/s-005-info-level-suppresses-debug-messages.sdp.md +++ b/specs/behavior/platform-core/logging/scoped.examples/s-005-info-level-suppresses-debug-messages.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "INFO level suppresses debug messages" from packages/platform-core/tests/features/behavior/logging/scoped.feature +- outcome: Executable scenario: INFO level suppresses debug messages + +```gwt +Given a scoped logger "Test" at level "INFO" +When I log a debug message "Debug message" +Then console.debug was not called +``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-006-info-level-allows-info-messages.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-006-info-level-allows-info-messages.sdp.md index 063545e5..0317b133 100644 --- a/specs/behavior/platform-core/logging/scoped.examples/s-006-info-level-allows-info-messages.sdp.md +++ b/specs/behavior/platform-core/logging/scoped.examples/s-006-info-level-allows-info-messages.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "INFO level allows info messages" from packages/platform-core/tests/features/behavior/logging/scoped.feature +- outcome: Executable scenario: INFO level allows info messages + +```gwt +Given a scoped logger "Test" at level "INFO" +When I log an info message "Info message" +Then console.info was called +``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-007-info-level-allows-warn-messages.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-007-info-level-allows-warn-messages.sdp.md index 02fc628a..fac31f41 100644 --- a/specs/behavior/platform-core/logging/scoped.examples/s-007-info-level-allows-warn-messages.sdp.md +++ b/specs/behavior/platform-core/logging/scoped.examples/s-007-info-level-allows-warn-messages.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "INFO level allows warn messages" from packages/platform-core/tests/features/behavior/logging/scoped.feature +- outcome: Executable scenario: INFO level allows warn messages + +```gwt +Given a scoped logger "Test" at level "INFO" +When I log a warn message "Warn message" +Then console.warn was called +``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-008-error-level-allows-error-messages.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-008-error-level-allows-error-messages.sdp.md index 317efd8e..c8ef9911 100644 --- a/specs/behavior/platform-core/logging/scoped.examples/s-008-error-level-allows-error-messages.sdp.md +++ b/specs/behavior/platform-core/logging/scoped.examples/s-008-error-level-allows-error-messages.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "ERROR level allows error messages" from packages/platform-core/tests/features/behavior/logging/scoped.feature +- outcome: Executable scenario: ERROR level allows error messages + +```gwt +Given a scoped logger "Test" at level "ERROR" +When I log an error message "Error message" +Then console.error was called +``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-009-default-level-is-info-when-not-specified.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-009-default-level-is-info-when-not-specified.sdp.md index 90fb30c7..6ee68d53 100644 --- a/specs/behavior/platform-core/logging/scoped.examples/s-009-default-level-is-info-when-not-specified.sdp.md +++ b/specs/behavior/platform-core/logging/scoped.examples/s-009-default-level-is-info-when-not-specified.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Default level is INFO when not specified" from packages/platform-core/tests/features/behavior/logging/scoped.feature +- outcome: Executable scenario: Default level is INFO when not specified + +```gwt +Given a scoped logger "Test" with no explicit level +When I log a debug message "Debug message" and an info message "Info message" +Then console.debug was not called +And console.info was called +``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-010-each-log-level-uses-its-corresponding-console-method.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-010-each-log-level-uses-its-corresponding-console-method.sdp.md index ea183326..4999aaaa 100644 --- a/specs/behavior/platform-core/logging/scoped.examples/s-010-each-log-level-uses-its-corresponding-console-method.sdp.md +++ b/specs/behavior/platform-core/logging/scoped.examples/s-010-each-log-level-uses-its-corresponding-console-method.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Each log level uses its corresponding console method" from packages/platform-core/tests/features/behavior/logging/scoped.feature +- outcome: Executable scenario: Each log level uses its corresponding console method + +```gwt +Given a scoped logger "Test" at level "DEBUG" +When the scenario runs +Then logging at each level calls the correct console method: +``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-011-report-level-outputs-structured-json-via-console-log.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-011-report-level-outputs-structured-json-via-console-log.sdp.md index ef53e94e..a9c51e70 100644 --- a/specs/behavior/platform-core/logging/scoped.examples/s-011-report-level-outputs-structured-json-via-console-log.sdp.md +++ b/specs/behavior/platform-core/logging/scoped.examples/s-011-report-level-outputs-structured-json-via-console-log.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Report level outputs structured JSON via console.log" from packages/platform-core/tests/features/behavior/logging/scoped.feature +- outcome: Executable scenario: Report level outputs structured JSON via console.log + +```gwt +Given a scoped logger "Test" at level "DEBUG" +When I log a report "Metrics" with data '{"count":10}' +Then console.log was called with structured JSON containing: +``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-012-timing-start-uses-console-time.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-012-timing-start-uses-console-time.sdp.md index 43941c06..ae5d18c2 100644 --- a/specs/behavior/platform-core/logging/scoped.examples/s-012-timing-start-uses-console-time.sdp.md +++ b/specs/behavior/platform-core/logging/scoped.examples/s-012-timing-start-uses-console-time.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Timing start uses console.time" from packages/platform-core/tests/features/behavior/logging/scoped.feature +- outcome: Executable scenario: Timing start uses console.time + +```gwt +Given a scoped logger "Test" at level "DEBUG" +When I log a trace "Operation" with timing "start" +Then console.time was called with "[Test] Operation" +``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-013-timing-end-uses-console-time-end.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-013-timing-end-uses-console-time-end.sdp.md index 758500b4..56e996f4 100644 --- a/specs/behavior/platform-core/logging/scoped.examples/s-013-timing-end-uses-console-time-end.sdp.md +++ b/specs/behavior/platform-core/logging/scoped.examples/s-013-timing-end-uses-console-time-end.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Timing end uses console.timeEnd" from packages/platform-core/tests/features/behavior/logging/scoped.feature +- outcome: Executable scenario: Timing end uses console.timeEnd + +```gwt +Given a scoped logger "Test" at level "DEBUG" +When I log a trace "Operation" with timing "end" +Then console.timeEnd was called with "[Test] Operation" +``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-014-regular-trace-without-timing-uses-console-debug.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-014-regular-trace-without-timing-uses-console-debug.sdp.md index 17fdee11..b2c1daab 100644 --- a/specs/behavior/platform-core/logging/scoped.examples/s-014-regular-trace-without-timing-uses-console-debug.sdp.md +++ b/specs/behavior/platform-core/logging/scoped.examples/s-014-regular-trace-without-timing-uses-console-debug.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Regular trace without timing uses console.debug" from packages/platform-core/tests/features/behavior/logging/scoped.feature +- outcome: Executable scenario: Regular trace without timing uses console.debug + +```gwt +Given a scoped logger "Test" at level "DEBUG" +When I log a trace "Trace message" with data '{"data":"value"}' +Then console.debug was called +And console.time was not called +And console.timeEnd was not called +``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-015-no-op-logger-does-not-call-any-console-methods.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-015-no-op-logger-does-not-call-any-console-methods.sdp.md index ca18b0d9..4883be02 100644 --- a/specs/behavior/platform-core/logging/scoped.examples/s-015-no-op-logger-does-not-call-any-console-methods.sdp.md +++ b/specs/behavior/platform-core/logging/scoped.examples/s-015-no-op-logger-does-not-call-any-console-methods.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "No-op logger does not call any console methods" from packages/platform-core/tests/features/behavior/logging/scoped.feature +- outcome: Executable scenario: No-op logger does not call any console methods + +```gwt +Given a no-op logger +When I invoke all log levels on the no-op logger +Then no console methods were called: +``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-016-no-op-logger-implements-the-full-logger-interface.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-016-no-op-logger-implements-the-full-logger-interface.sdp.md index c56c57be..45b87b07 100644 --- a/specs/behavior/platform-core/logging/scoped.examples/s-016-no-op-logger-implements-the-full-logger-interface.sdp.md +++ b/specs/behavior/platform-core/logging/scoped.examples/s-016-no-op-logger-implements-the-full-logger-interface.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "No-op logger implements the full Logger interface" from packages/platform-core/tests/features/behavior/logging/scoped.feature +- outcome: Executable scenario: No-op logger implements the full Logger interface + +```gwt +Given a no-op logger +When the scenario runs +Then the no-op logger has all required methods: +``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-017-child-logger-prefixes-with-combined-scope.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-017-child-logger-prefixes-with-combined-scope.sdp.md index 11c324e4..4737c043 100644 --- a/specs/behavior/platform-core/logging/scoped.examples/s-017-child-logger-prefixes-with-combined-scope.sdp.md +++ b/specs/behavior/platform-core/logging/scoped.examples/s-017-child-logger-prefixes-with-combined-scope.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Child logger prefixes with combined scope" from packages/platform-core/tests/features/behavior/logging/scoped.feature +- outcome: Executable scenario: Child logger prefixes with combined scope + +```gwt +Given a child logger with parent "Parent" and child "Child" at level "DEBUG" +When I log an info message "Test" on the child logger +Then console.info was called with "[Parent:Child] Test" +``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-018-child-logger-respects-provided-log-level.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-018-child-logger-respects-provided-log-level.sdp.md index 41b3ffa2..eb450147 100644 --- a/specs/behavior/platform-core/logging/scoped.examples/s-018-child-logger-respects-provided-log-level.sdp.md +++ b/specs/behavior/platform-core/logging/scoped.examples/s-018-child-logger-respects-provided-log-level.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Child logger respects provided log level" from packages/platform-core/tests/features/behavior/logging/scoped.feature +- outcome: Executable scenario: Child logger respects provided log level + +```gwt +Given a child logger with parent "Parent" and child "Child" at level "WARN" +When I log an info message "Info" on the child logger and I log a warn message "Warn" on the child logger +Then console.info was not called +And console.warn was called +``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-019-child-logger-defaults-to-info-level.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-019-child-logger-defaults-to-info-level.sdp.md index de8f9d02..1d938399 100644 --- a/specs/behavior/platform-core/logging/scoped.examples/s-019-child-logger-defaults-to-info-level.sdp.md +++ b/specs/behavior/platform-core/logging/scoped.examples/s-019-child-logger-defaults-to-info-level.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Child logger defaults to INFO level" from packages/platform-core/tests/features/behavior/logging/scoped.feature +- outcome: Executable scenario: Child logger defaults to INFO level + +```gwt +Given a child logger with parent "Parent" and child "Child" with no explicit level +When I log a debug message "Debug" on the child logger and I log an info message "Info" on the child logger +Then console.debug was not called +And console.info was called +``` diff --git a/specs/behavior/platform-core/logging/scoped.sdp.md b/specs/behavior/platform-core/logging/scoped.sdp.md index 474cad92..1ea588ac 100644 --- a/specs/behavior/platform-core/logging/scoped.sdp.md +++ b/specs/behavior/platform-core/logging/scoped.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: scoped loggers that prefix messages and filter by level so that I can organize and control logging output per component (test carrier: packages/platform-core/tests/features/behavior/logging/scoped.feature) +- actor: a platform developer +- outcome: scoped loggers that prefix messages and filter by level so that I can organize and control logging output per component + +## Behavior + +- rule: createScopedLogger prefixes messages with the scope name +- rule: createScopedLogger filters messages below the configured log level +- rule: createScopedLogger maps each log level to the correct console method +- rule: Trace level supports console timing via the timing data field +- rule: createPlatformNoOpLogger produces a logger that discards all output +- rule: createChildLogger combines parent and child scopes with colon separator diff --git a/specs/behavior/platform-core/logging/testing.examples/s-001-all-six-log-method-calls-are-captured.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-001-all-six-log-method-calls-are-captured.sdp.md index 08ceb84e..3d972587 100644 --- a/specs/behavior/platform-core/logging/testing.examples/s-001-all-six-log-method-calls-are-captured.sdp.md +++ b/specs/behavior/platform-core/logging/testing.examples/s-001-all-six-log-method-calls-are-captured.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "All six log method calls are captured" from packages/platform-core/tests/features/behavior/logging/testing.feature +- outcome: Executable scenario: All six log method calls are captured + +```gwt +Given a fresh mock logger +When I log one message at each level +Then the logger should have captured 6 calls +``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-002-each-call-records-the-correct-log-level.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-002-each-call-records-the-correct-log-level.sdp.md index aa61be65..0d675223 100644 --- a/specs/behavior/platform-core/logging/testing.examples/s-002-each-call-records-the-correct-log-level.sdp.md +++ b/specs/behavior/platform-core/logging/testing.examples/s-002-each-call-records-the-correct-log-level.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Each call records the correct log level" from packages/platform-core/tests/features/behavior/logging/testing.feature +- outcome: Executable scenario: Each call records the correct log level + +```gwt +Given a fresh mock logger +When I log one message at each level +Then each call has the correct level: +``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-003-message-text-is-captured-correctly.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-003-message-text-is-captured-correctly.sdp.md index 1459af7a..04748349 100644 --- a/specs/behavior/platform-core/logging/testing.examples/s-003-message-text-is-captured-correctly.sdp.md +++ b/specs/behavior/platform-core/logging/testing.examples/s-003-message-text-is-captured-correctly.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Message text is captured correctly" from packages/platform-core/tests/features/behavior/logging/testing.feature +- outcome: Executable scenario: Message text is captured correctly + +```gwt +Given a fresh mock logger +When I log an info message "Test message" +Then the first call message should be "Test message" +``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-004-structured-data-is-captured-correctly.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-004-structured-data-is-captured-correctly.sdp.md index ab44650c..1ce2d6f1 100644 --- a/specs/behavior/platform-core/logging/testing.examples/s-004-structured-data-is-captured-correctly.sdp.md +++ b/specs/behavior/platform-core/logging/testing.examples/s-004-structured-data-is-captured-correctly.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Structured data is captured correctly" from packages/platform-core/tests/features/behavior/logging/testing.feature +- outcome: Executable scenario: Structured data is captured correctly + +```gwt +Given a fresh mock logger +When I log an info message with data key "value" and count 42 +Then the first call data should contain key "value" and count 42 +``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-005-data-is-undefined-when-not-provided.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-005-data-is-undefined-when-not-provided.sdp.md index dcf16427..d724758c 100644 --- a/specs/behavior/platform-core/logging/testing.examples/s-005-data-is-undefined-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/logging/testing.examples/s-005-data-is-undefined-when-not-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Data is undefined when not provided" from packages/platform-core/tests/features/behavior/logging/testing.feature +- outcome: Executable scenario: Data is undefined when not provided + +```gwt +Given a fresh mock logger +When I log an info message "No data" +Then the first call data should be undefined +``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-006-timestamp-is-captured-within-bounds.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-006-timestamp-is-captured-within-bounds.sdp.md index 5501eb31..193fc36d 100644 --- a/specs/behavior/platform-core/logging/testing.examples/s-006-timestamp-is-captured-within-bounds.sdp.md +++ b/specs/behavior/platform-core/logging/testing.examples/s-006-timestamp-is-captured-within-bounds.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Timestamp is captured within bounds" from packages/platform-core/tests/features/behavior/logging/testing.feature +- outcome: Executable scenario: Timestamp is captured within bounds + +```gwt +Given a fresh mock logger +When I log an info message with timestamp tracking +Then the first call timestamp should be within the tracked bounds +``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-007-clearing-resets-calls-to-empty.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-007-clearing-resets-calls-to-empty.sdp.md index e1f2527b..785d6a4e 100644 --- a/specs/behavior/platform-core/logging/testing.examples/s-007-clearing-resets-calls-to-empty.sdp.md +++ b/specs/behavior/platform-core/logging/testing.examples/s-007-clearing-resets-calls-to-empty.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Clearing resets calls to empty" from packages/platform-core/tests/features/behavior/logging/testing.feature +- outcome: Executable scenario: Clearing resets calls to empty + +```gwt +Given a fresh mock logger +When I log 2 info messages and then clear +Then the logger should have captured 0 calls +``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-008-calls-are-filtered-by-level-correctly.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-008-calls-are-filtered-by-level-correctly.sdp.md index f159888c..a1919df1 100644 --- a/specs/behavior/platform-core/logging/testing.examples/s-008-calls-are-filtered-by-level-correctly.sdp.md +++ b/specs/behavior/platform-core/logging/testing.examples/s-008-calls-are-filtered-by-level-correctly.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Calls are filtered by level correctly" from packages/platform-core/tests/features/behavior/logging/testing.feature +- outcome: Executable scenario: Calls are filtered by level correctly + +```gwt +Given a fresh mock logger +When I log "Debug 1" at DEBUG, "Info 1" at INFO, "Debug 2" at DEBUG, and "Error 1" at ERROR +Then getCallsAtLevel returns the correct counts: +``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-009-partial-and-exact-message-matching.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-009-partial-and-exact-message-matching.sdp.md index 34232f7b..63f9bb42 100644 --- a/specs/behavior/platform-core/logging/testing.examples/s-009-partial-and-exact-message-matching.sdp.md +++ b/specs/behavior/platform-core/logging/testing.examples/s-009-partial-and-exact-message-matching.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Partial and exact message matching" from packages/platform-core/tests/features/behavior/logging/testing.feature +- outcome: Executable scenario: Partial and exact message matching + +```gwt +Given a fresh mock logger +When I log "Command executed successfully" at INFO and "Command failed with error" at WARN +Then hasLoggedMessage returns the expected results: +``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-010-exact-message-match-works.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-010-exact-message-match-works.sdp.md index 894c5ea1..69a5c03a 100644 --- a/specs/behavior/platform-core/logging/testing.examples/s-010-exact-message-match-works.sdp.md +++ b/specs/behavior/platform-core/logging/testing.examples/s-010-exact-message-match-works.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Exact message match works" from packages/platform-core/tests/features/behavior/logging/testing.feature +- outcome: Executable scenario: Exact message match works + +```gwt +Given a fresh mock logger +When I log an info message "Exact message" +Then hasLoggedMessage for "Exact message" returns true +``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-011-level-and-message-must-both-match.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-011-level-and-message-must-both-match.sdp.md index 8ac965e6..caa178fb 100644 --- a/specs/behavior/platform-core/logging/testing.examples/s-011-level-and-message-must-both-match.sdp.md +++ b/specs/behavior/platform-core/logging/testing.examples/s-011-level-and-message-must-both-match.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Level and message must both match" from packages/platform-core/tests/features/behavior/logging/testing.feature +- outcome: Executable scenario: Level and message must both match + +```gwt +Given a fresh mock logger +When I log "Info message" at INFO and "Error message" at ERROR +Then hasLoggedAt returns the expected results: +``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-012-returns-the-last-call-at-a-given-level.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-012-returns-the-last-call-at-a-given-level.sdp.md index cf76900b..6c0d9ea7 100644 --- a/specs/behavior/platform-core/logging/testing.examples/s-012-returns-the-last-call-at-a-given-level.sdp.md +++ b/specs/behavior/platform-core/logging/testing.examples/s-012-returns-the-last-call-at-a-given-level.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns the last call at a given level" from packages/platform-core/tests/features/behavior/logging/testing.feature +- outcome: Executable scenario: Returns the last call at a given level + +```gwt +Given a fresh mock logger +When I log "First info", "Second info", and "Third info" at INFO +Then getLastCallAt INFO should have message "Third info" +``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-013-returns-undefined-when-no-calls-at-level.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-013-returns-undefined-when-no-calls-at-level.sdp.md index 3abaf7fe..95b4003d 100644 --- a/specs/behavior/platform-core/logging/testing.examples/s-013-returns-undefined-when-no-calls-at-level.sdp.md +++ b/specs/behavior/platform-core/logging/testing.examples/s-013-returns-undefined-when-no-calls-at-level.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns undefined when no calls at level" from packages/platform-core/tests/features/behavior/logging/testing.feature +- outcome: Executable scenario: Returns undefined when no calls at level + +```gwt +Given a fresh mock logger +When I log an info message "Info message" +Then getLastCallAt ERROR should be undefined +``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-014-multiple-accesses-return-equal-arrays.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-014-multiple-accesses-return-equal-arrays.sdp.md index 3856e343..4d6ce456 100644 --- a/specs/behavior/platform-core/logging/testing.examples/s-014-multiple-accesses-return-equal-arrays.sdp.md +++ b/specs/behavior/platform-core/logging/testing.examples/s-014-multiple-accesses-return-equal-arrays.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Multiple accesses return equal arrays" from packages/platform-core/tests/features/behavior/logging/testing.feature +- outcome: Executable scenario: Multiple accesses return equal arrays + +```gwt +Given a fresh mock logger +When I log an info message "Test" +Then two accesses to the calls property should be equal +``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-015-info-minimum-captures-info-report-warn-error-only.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-015-info-minimum-captures-info-report-warn-error-only.sdp.md index 18845955..80deec41 100644 --- a/specs/behavior/platform-core/logging/testing.examples/s-015-info-minimum-captures-info-report-warn-error-only.sdp.md +++ b/specs/behavior/platform-core/logging/testing.examples/s-015-info-minimum-captures-info-report-warn-error-only.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "INFO minimum captures INFO, REPORT, WARN, ERROR only" from packages/platform-core/tests/features/behavior/logging/testing.feature +- outcome: Executable scenario: INFO minimum captures INFO, REPORT, WARN, ERROR only + +```gwt +Given a filtered mock logger with minimum level "INFO" +When I log one message at each level on the filtered logger +Then the filtered logger should have captured 4 calls +And the filtered logger getCallsAtLevel returns: +``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-016-debug-minimum-captures-all-6-levels.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-016-debug-minimum-captures-all-6-levels.sdp.md index 72b0edef..8ad4e7f4 100644 --- a/specs/behavior/platform-core/logging/testing.examples/s-016-debug-minimum-captures-all-6-levels.sdp.md +++ b/specs/behavior/platform-core/logging/testing.examples/s-016-debug-minimum-captures-all-6-levels.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "DEBUG minimum captures all 6 levels" from packages/platform-core/tests/features/behavior/logging/testing.feature +- outcome: Executable scenario: DEBUG minimum captures all 6 levels + +```gwt +Given a filtered mock logger with minimum level "DEBUG" +When I log one message at each level on the filtered logger +Then the filtered logger should have captured 6 calls +``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-017-error-minimum-captures-only-error.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-017-error-minimum-captures-only-error.sdp.md index 828e4add..59bd3a32 100644 --- a/specs/behavior/platform-core/logging/testing.examples/s-017-error-minimum-captures-only-error.sdp.md +++ b/specs/behavior/platform-core/logging/testing.examples/s-017-error-minimum-captures-only-error.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "ERROR minimum captures only ERROR" from packages/platform-core/tests/features/behavior/logging/testing.feature +- outcome: Executable scenario: ERROR minimum captures only ERROR + +```gwt +Given a filtered mock logger with minimum level "ERROR" +When I log one message at each level on the filtered logger +Then the filtered logger should have captured 1 calls +And the filtered logger first call level should be "ERROR" +``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-018-warn-minimum-captures-warn-and-error.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-018-warn-minimum-captures-warn-and-error.sdp.md index af788d57..a5f9fd23 100644 --- a/specs/behavior/platform-core/logging/testing.examples/s-018-warn-minimum-captures-warn-and-error.sdp.md +++ b/specs/behavior/platform-core/logging/testing.examples/s-018-warn-minimum-captures-warn-and-error.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "WARN minimum captures WARN and ERROR" from packages/platform-core/tests/features/behavior/logging/testing.feature +- outcome: Executable scenario: WARN minimum captures WARN and ERROR + +```gwt +Given a filtered mock logger with minimum level "WARN" +When I log one message at each level on the filtered logger +Then the filtered logger should have captured 2 calls +And the filtered logger getCallsAtLevel returns: +``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-019-clear-resets-filtered-calls.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-019-clear-resets-filtered-calls.sdp.md index 5ec2926d..8e731e34 100644 --- a/specs/behavior/platform-core/logging/testing.examples/s-019-clear-resets-filtered-calls.sdp.md +++ b/specs/behavior/platform-core/logging/testing.examples/s-019-clear-resets-filtered-calls.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Clear resets filtered calls" from packages/platform-core/tests/features/behavior/logging/testing.feature +- outcome: Executable scenario: Clear resets filtered calls + +```gwt +Given a filtered mock logger with minimum level "INFO" +When I log an info and a debug message on the filtered logger and then clear +Then the filtered logger should have captured 0 calls +``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-020-has-logged-message-only-searches-filtered-calls.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-020-has-logged-message-only-searches-filtered-calls.sdp.md index 4eeb5f96..939c4edb 100644 --- a/specs/behavior/platform-core/logging/testing.examples/s-020-has-logged-message-only-searches-filtered-calls.sdp.md +++ b/specs/behavior/platform-core/logging/testing.examples/s-020-has-logged-message-only-searches-filtered-calls.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "hasLoggedMessage only searches filtered calls" from packages/platform-core/tests/features/behavior/logging/testing.feature +- outcome: Executable scenario: hasLoggedMessage only searches filtered calls + +```gwt +Given a filtered mock logger with minimum level "WARN" +When I log "Info message" at INFO and "Warning message" at WARN on the filtered logger +Then filtered hasLoggedMessage returns: +``` diff --git a/specs/behavior/platform-core/logging/testing.sdp.md b/specs/behavior/platform-core/logging/testing.sdp.md index e694bf6d..a360b852 100644 --- a/specs/behavior/platform-core/logging/testing.sdp.md +++ b/specs/behavior/platform-core/logging/testing.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: mock loggers for testing so that I can assert on log output without real console side effects (test carrier: packages/platform-core/tests/features/behavior/logging/testing.feature) +- actor: a platform developer +- outcome: mock loggers for testing so that I can assert on log output without real console side effects + +## Behavior + +- rule: createMockLogger captures all log method calls with metadata +- rule: clear() resets the captured calls array +- rule: getCallsAtLevel filters captured calls by log level +- rule: hasLoggedMessage finds messages by partial text match +- rule: hasLoggedAt checks both level and message text together +- rule: getLastCallAt returns the most recent call at a specific level +- rule: calls property returns consistent array references +- rule: createFilteredMockLogger only captures logs at or above minimum level +- rule: Filtered logger helper methods respect the minimum level filter diff --git a/specs/behavior/platform-core/logging/types.examples/s-001-priority-values-increase-from-debug-to-error.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-001-priority-values-increase-from-debug-to-error.sdp.md index c80306aa..d65f2766 100644 --- a/specs/behavior/platform-core/logging/types.examples/s-001-priority-values-increase-from-debug-to-error.sdp.md +++ b/specs/behavior/platform-core/logging/types.examples/s-001-priority-values-increase-from-debug-to-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Priority values increase from DEBUG to ERROR" from packages/platform-core/tests/features/behavior/logging/types.feature +- outcome: Executable scenario: Priority values increase from DEBUG to ERROR + +```gwt +Given the feature fixture is in place +When I inspect the LOG_LEVEL_PRIORITY map +Then the priority order from lowest to highest is: +``` diff --git a/specs/behavior/platform-core/logging/types.examples/s-002-all-6-log-levels-are-defined-as-numbers.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-002-all-6-log-levels-are-defined-as-numbers.sdp.md index 72d717fa..f8c70d10 100644 --- a/specs/behavior/platform-core/logging/types.examples/s-002-all-6-log-levels-are-defined-as-numbers.sdp.md +++ b/specs/behavior/platform-core/logging/types.examples/s-002-all-6-log-levels-are-defined-as-numbers.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "All 6 log levels are defined as numbers" from packages/platform-core/tests/features/behavior/logging/types.feature +- outcome: Executable scenario: All 6 log levels are defined as numbers + +```gwt +Given the feature fixture is in place +When I inspect the LOG_LEVEL_PRIORITY map +Then all log levels are defined as numbers: +``` diff --git a/specs/behavior/platform-core/logging/types.examples/s-003-default-log-level-is-info.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-003-default-log-level-is-info.sdp.md index 376577a6..b54858df 100644 --- a/specs/behavior/platform-core/logging/types.examples/s-003-default-log-level-is-info.sdp.md +++ b/specs/behavior/platform-core/logging/types.examples/s-003-default-log-level-is-info.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Default log level is INFO" from packages/platform-core/tests/features/behavior/logging/types.feature +- outcome: Executable scenario: Default log level is INFO + +```gwt +Given the feature fixture is in place +When I check the DEFAULT_LOG_LEVEL constant +Then it should be "INFO" +``` diff --git a/specs/behavior/platform-core/logging/types.examples/s-004-messages-at-or-above-info-level-pass-the-filter.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-004-messages-at-or-above-info-level-pass-the-filter.sdp.md index 90c73556..72b2ef44 100644 --- a/specs/behavior/platform-core/logging/types.examples/s-004-messages-at-or-above-info-level-pass-the-filter.sdp.md +++ b/specs/behavior/platform-core/logging/types.examples/s-004-messages-at-or-above-info-level-pass-the-filter.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Messages at or above INFO level pass the filter" from packages/platform-core/tests/features/behavior/logging/types.feature +- outcome: Executable scenario: Messages at or above INFO level pass the filter + +```gwt +Given the configured log level is "INFO" +When the scenario runs +Then shouldLog returns true for levels: +``` diff --git a/specs/behavior/platform-core/logging/types.examples/s-005-messages-below-info-level-are-filtered-out.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-005-messages-below-info-level-are-filtered-out.sdp.md index 43ee6fae..5dfde474 100644 --- a/specs/behavior/platform-core/logging/types.examples/s-005-messages-below-info-level-are-filtered-out.sdp.md +++ b/specs/behavior/platform-core/logging/types.examples/s-005-messages-below-info-level-are-filtered-out.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Messages below INFO level are filtered out" from packages/platform-core/tests/features/behavior/logging/types.feature +- outcome: Executable scenario: Messages below INFO level are filtered out + +```gwt +Given the configured log level is "INFO" +When the scenario runs +Then shouldLog returns false for levels: +``` diff --git a/specs/behavior/platform-core/logging/types.examples/s-006-debug-configured-level-allows-all-messages.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-006-debug-configured-level-allows-all-messages.sdp.md index 923bf438..774c83bc 100644 --- a/specs/behavior/platform-core/logging/types.examples/s-006-debug-configured-level-allows-all-messages.sdp.md +++ b/specs/behavior/platform-core/logging/types.examples/s-006-debug-configured-level-allows-all-messages.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "DEBUG configured level allows all messages" from packages/platform-core/tests/features/behavior/logging/types.feature +- outcome: Executable scenario: DEBUG configured level allows all messages + +```gwt +Given the configured log level is "DEBUG" +When the scenario runs +Then shouldLog returns true for levels: +``` diff --git a/specs/behavior/platform-core/logging/types.examples/s-007-error-configured-level-only-allows-error.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-007-error-configured-level-only-allows-error.sdp.md index 9cb49f5f..f1fac9f3 100644 --- a/specs/behavior/platform-core/logging/types.examples/s-007-error-configured-level-only-allows-error.sdp.md +++ b/specs/behavior/platform-core/logging/types.examples/s-007-error-configured-level-only-allows-error.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "ERROR configured level only allows ERROR" from packages/platform-core/tests/features/behavior/logging/types.feature +- outcome: Executable scenario: ERROR configured level only allows ERROR + +```gwt +Given the configured log level is "ERROR" +When the scenario runs +Then shouldLog returns false for levels: +And shouldLog returns true for level "ERROR" +``` diff --git a/specs/behavior/platform-core/logging/types.examples/s-008-warn-configured-level-allows-warn-and-error-only.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-008-warn-configured-level-allows-warn-and-error-only.sdp.md index 59f527a4..4f1e5f63 100644 --- a/specs/behavior/platform-core/logging/types.examples/s-008-warn-configured-level-allows-warn-and-error-only.sdp.md +++ b/specs/behavior/platform-core/logging/types.examples/s-008-warn-configured-level-allows-warn-and-error-only.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "WARN configured level allows WARN and ERROR only" from packages/platform-core/tests/features/behavior/logging/types.feature +- outcome: Executable scenario: WARN configured level allows WARN and ERROR only + +```gwt +Given the configured log level is "WARN" +When the scenario runs +Then shouldLog returns false for levels: +And shouldLog returns true for levels at WARN and above: +``` diff --git a/specs/behavior/platform-core/logging/types.sdp.md b/specs/behavior/platform-core/logging/types.sdp.md index 9df0cc8e..17f38b36 100644 --- a/specs/behavior/platform-core/logging/types.sdp.md +++ b/specs/behavior/platform-core/logging/types.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: well-defined log level priorities and filtering so that I can control logging verbosity consistently (test carrier: packages/platform-core/tests/features/behavior/logging/types.feature) +- actor: a platform developer +- outcome: well-defined log level priorities and filtering so that I can control logging verbosity consistently + +## Behavior + +- rule: LOG_LEVEL_PRIORITY defines numeric ordering for all log levels +- rule: DEFAULT_LOG_LEVEL is INFO +- rule: shouldLog returns true when message level )= configured level diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-001-adding-middleware-increases-size-and-returns-pipeline-for-chaining.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-001-adding-middleware-increases-size-and-returns-pipeline-for-chaining.sdp.md index 5b5ba8eb..83d46cf3 100644 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-001-adding-middleware-increases-size-and-returns-pipeline-for-chaining.sdp.md +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-001-adding-middleware-increases-size-and-returns-pipeline-for-chaining.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Adding middleware increases size and returns pipeline for chaining" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature +- outcome: Executable scenario: Adding middleware increases size and returns pipeline for chaining + +```gwt +Given a new middleware pipeline +When I add a middleware named "a" with order 10 and I chain a middleware named "b" with order 20 +Then the pipeline size is 1 +And use returns the pipeline instance +And the pipeline size is 2 +``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-002-removing-an-existing-middleware-returns-true-and-decreases-size.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-002-removing-an-existing-middleware-returns-true-and-decreases-size.sdp.md index 07e3cef2..d36a71d0 100644 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-002-removing-an-existing-middleware-returns-true-and-decreases-size.sdp.md +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-002-removing-an-existing-middleware-returns-true-and-decreases-size.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Removing an existing middleware returns true and decreases size" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature +- outcome: Executable scenario: Removing an existing middleware returns true and decreases size + +```gwt +Given a new middleware pipeline +And middleware "a" with order 10 is registered +And middleware "b" with order 20 is registered +When I remove the middleware named "a" +Then the remove result is true +And the pipeline size is 1 +``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-003-removing-a-non-existent-middleware-returns-false.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-003-removing-a-non-existent-middleware-returns-false.sdp.md index 12e2a5e5..b22f6a5b 100644 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-003-removing-a-non-existent-middleware-returns-false.sdp.md +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-003-removing-a-non-existent-middleware-returns-false.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Removing a non-existent middleware returns false" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature +- outcome: Executable scenario: Removing a non-existent middleware returns false + +```gwt +Given a new middleware pipeline +When I remove the middleware named "nonexistent" +Then the remove result is false +``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-004-has-returns-true-for-existing-middleware.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-004-has-returns-true-for-existing-middleware.sdp.md index de5f1a1c..cfdf0c8a 100644 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-004-has-returns-true-for-existing-middleware.sdp.md +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-004-has-returns-true-for-existing-middleware.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "has returns true for existing middleware" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature +- outcome: Executable scenario: has returns true for existing middleware + +```gwt +Given a new middleware pipeline +And middleware "test" with order 10 is registered +When the scenario runs +Then has "test" returns true +``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-005-has-returns-false-for-non-existent-middleware.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-005-has-returns-false-for-non-existent-middleware.sdp.md index e31fe54c..86af83f6 100644 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-005-has-returns-false-for-non-existent-middleware.sdp.md +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-005-has-returns-false-for-non-existent-middleware.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "has returns false for non-existent middleware" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature +- outcome: Executable scenario: has returns false for non-existent middleware + +```gwt +Given a new middleware pipeline +When the scenario runs +Then has "nonexistent" returns false +``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-006-names-are-returned-sorted-by-order.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-006-names-are-returned-sorted-by-order.sdp.md index 2bcda8d3..fca958b7 100644 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-006-names-are-returned-sorted-by-order.sdp.md +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-006-names-are-returned-sorted-by-order.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Names are returned sorted by order" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature +- outcome: Executable scenario: Names are returned sorted by order + +```gwt +Given a new middleware pipeline +And middleware "c" with order 30 is registered +And middleware "a" with order 10 is registered +And middleware "b" with order 20 is registered +When the scenario runs +Then getMiddlewareNames returns: +``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-007-handler-executes-directly-with-empty-pipeline.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-007-handler-executes-directly-with-empty-pipeline.sdp.md index f0db5923..5c832e4f 100644 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-007-handler-executes-directly-with-empty-pipeline.sdp.md +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-007-handler-executes-directly-with-empty-pipeline.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handler executes directly with empty pipeline" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature +- outcome: Executable scenario: Handler executes directly with empty pipeline + +```gwt +Given a new middleware pipeline +When I execute with no middlewares and a success handler +Then the execution result status is "success" +``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-008-before-hooks-run-in-order-10-then-20.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-008-before-hooks-run-in-order-10-then-20.sdp.md index a821e26b..7a59206a 100644 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-008-before-hooks-run-in-order-10-then-20.sdp.md +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-008-before-hooks-run-in-order-10-then-20.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Before hooks run in order 10 then 20" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature +- outcome: Executable scenario: Before hooks run in order 10 then 20 + +```gwt +Given a new middleware pipeline +And a before-hook middleware "first" with order 10 that records its name +And a before-hook middleware "second" with order 20 that records its name +When I execute the pipeline with a success handler +Then the recorded execution order is: +``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-009-after-hooks-run-in-order-20-then-10.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-009-after-hooks-run-in-order-20-then-10.sdp.md index b989ad17..8a2718b3 100644 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-009-after-hooks-run-in-order-20-then-10.sdp.md +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-009-after-hooks-run-in-order-20-then-10.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "After hooks run in order 20 then 10" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature +- outcome: Executable scenario: After hooks run in order 20 then 10 + +```gwt +Given a new middleware pipeline +And an after-hook middleware "first" with order 10 that records its name +And an after-hook middleware "second" with order 20 that records its name +When I execute the pipeline with a success handler +Then the recorded execution order is: +``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-010-short-circuit-prevents-subsequent-middleware-execution.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-010-short-circuit-prevents-subsequent-middleware-execution.sdp.md index eef2b1cb..c9f8915d 100644 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-010-short-circuit-prevents-subsequent-middleware-execution.sdp.md +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-010-short-circuit-prevents-subsequent-middleware-execution.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Short-circuit prevents subsequent middleware execution" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature +- outcome: Executable scenario: Short-circuit prevents subsequent middleware execution + +```gwt +Given a new middleware pipeline +And a before-hook middleware "validator" with order 10 that short-circuits with VALIDATION_ERROR +And a before-hook middleware "auth" with order 20 that records its name +When I execute the pipeline with a success handler +Then the execution result status is "rejected" +And the recorded execution order contains only: +``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-011-enricher-middleware-passes-custom-context-to-subsequent-middleware.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-011-enricher-middleware-passes-custom-context-to-subsequent-middleware.sdp.md index e7878493..40f14a76 100644 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-011-enricher-middleware-passes-custom-context-to-subsequent-middleware.sdp.md +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-011-enricher-middleware-passes-custom-context-to-subsequent-middleware.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Enricher middleware passes custom context to subsequent middleware" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature +- outcome: Executable scenario: Enricher middleware passes custom context to subsequent middleware + +```gwt +Given a new middleware pipeline +And a before-hook middleware "enricher" with order 10 that sets custom.enriched to true +And a before-hook middleware "checker" with order 20 that captures the context +When I execute the pipeline with a success handler +Then the captured context has custom.enriched set to true +``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-012-throwing-before-hook-produces-middleware-error.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-012-throwing-before-hook-produces-middleware-error.sdp.md index bf760ea8..27ca79b8 100644 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-012-throwing-before-hook-produces-middleware-error.sdp.md +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-012-throwing-before-hook-produces-middleware-error.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Throwing before hook produces middleware error" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature +- outcome: Executable scenario: Throwing before hook produces middleware error + +```gwt +Given a new middleware pipeline +And a before-hook middleware "failing" with order 10 that throws "Middleware failed" +When I execute the pipeline with a success handler +Then the execution result status is "rejected" +And the rejection code is "MIDDLEWARE_ERROR" +And the rejection reason is "Middleware failed" +``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-013-throwing-handler-produces-handler-error.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-013-throwing-handler-produces-handler-error.sdp.md index afe9068f..2330600a 100644 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-013-throwing-handler-produces-handler-error.sdp.md +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-013-throwing-handler-produces-handler-error.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Throwing handler produces handler error" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature +- outcome: Executable scenario: Throwing handler produces handler error + +```gwt +Given a new middleware pipeline +When I execute the pipeline with a handler that throws "Handler failed" +Then the execution result status is "rejected" +And the rejection code is "HANDLER_ERROR" +And the rejection reason is "Handler failed" +``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-014-failing-after-hook-does-not-prevent-other-after-hooks.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-014-failing-after-hook-does-not-prevent-other-after-hooks.sdp.md index 13a52244..b36e1dee 100644 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-014-failing-after-hook-does-not-prevent-other-after-hooks.sdp.md +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-014-failing-after-hook-does-not-prevent-other-after-hooks.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Failing after hook does not prevent other after hooks" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature +- outcome: Executable scenario: Failing after hook does not prevent other after hooks + +```gwt +Given a new middleware pipeline +And an after-hook middleware "failing" with order 10 that throws in after +And an after-hook middleware "succeeding" with order 20 that records its name in after +When I execute the pipeline with a success handler +Then both after hooks were called +And the execution result status is "success" +``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-015-only-pre-short-circuit-middleware-after-hooks-run.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-015-only-pre-short-circuit-middleware-after-hooks-run.sdp.md index 158906d0..738ec290 100644 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-015-only-pre-short-circuit-middleware-after-hooks-run.sdp.md +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-015-only-pre-short-circuit-middleware-after-hooks-run.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Only pre-short-circuit middleware after hooks run" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature +- outcome: Executable scenario: Only pre-short-circuit middleware after hooks run + +```gwt +Given a new middleware pipeline +And a middleware "first" with order 10 and both hooks that records in after +And a middleware "shortcircuit" with order 20 that short-circuits and records in after +And a middleware "third" with order 30 and both hooks that records in after +When I execute the pipeline with a success handler +Then the after hooks called are only: +``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-016-clear-empties-the-pipeline.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-016-clear-empties-the-pipeline.sdp.md index 707399d0..87b4da6f 100644 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-016-clear-empties-the-pipeline.sdp.md +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-016-clear-empties-the-pipeline.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Clear empties the pipeline" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature +- outcome: Executable scenario: Clear empties the pipeline + +```gwt +Given a new middleware pipeline +And middleware "a" with order 10 is registered +And middleware "b" with order 20 is registered +When I clear the pipeline +Then the pipeline size is 0 +``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-017-clone-has-same-middlewares-but-is-independent.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-017-clone-has-same-middlewares-but-is-independent.sdp.md index d6a448d0..46af869e 100644 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-017-clone-has-same-middlewares-but-is-independent.sdp.md +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-017-clone-has-same-middlewares-but-is-independent.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Clone has same middlewares but is independent" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature +- outcome: Executable scenario: Clone has same middlewares but is independent + +```gwt +Given a new middleware pipeline +And middleware "a" with order 10 is registered +And middleware "b" with order 20 is registered +When I clone the pipeline and I add a middleware named "c" with order 30 to the clone +Then the cloned pipeline size is 2 +And the cloned pipeline middleware names are: +And the original pipeline size is 2 +And the cloned pipeline size is 3 +``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-018-factory-creates-pipeline-without-options.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-018-factory-creates-pipeline-without-options.sdp.md index ad77af6f..a33a2b49 100644 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-018-factory-creates-pipeline-without-options.sdp.md +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-018-factory-creates-pipeline-without-options.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Factory creates pipeline without options" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature +- outcome: Executable scenario: Factory creates pipeline without options + +```gwt +Given the feature fixture is in place +When I create a pipeline via factory +Then the result is a MiddlewarePipeline instance +``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-019-factory-creates-pipeline-with-debug-option.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-019-factory-creates-pipeline-with-debug-option.sdp.md index eec5f6b5..63a6a35e 100644 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-019-factory-creates-pipeline-with-debug-option.sdp.md +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-019-factory-creates-pipeline-with-debug-option.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Factory creates pipeline with debug option" from packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature +- outcome: Executable scenario: Factory creates pipeline with debug option + +```gwt +Given the feature fixture is in place +When I create a pipeline via factory with debug true +Then the result is a MiddlewarePipeline instance +``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.sdp.md index 2aa12924..0fcd0d88 100644 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.sdp.md +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.sdp.md @@ -10,4 +10,23 @@ relations: ## Intent -- outcome: Verifies middleware pipeline registration, ordering, before/after hook execution, short-circuiting, error handling, and lifecycle operations. (test carrier: packages/platform-core/tests/features/behavior/middleware/middleware-pipeline.feature) +- outcome: MiddlewarePipeline orchestration + +## Behavior + +- rule: use() adds middleware and supports chaining +- rule: remove() removes middleware by name +- rule: has() checks middleware existence +- rule: getMiddlewareNames returns names sorted by order +- rule: execute() runs handler when no middlewares are registered +- rule: Before hooks execute in ascending order +- rule: After hooks execute in reverse order +- rule: Before hook short-circuits on continue false +- rule: Context passes between before hooks +- rule: Before hook errors produce MIDDLEWARE_ERROR rejection +- rule: Handler errors produce HANDLER_ERROR rejection +- rule: After hook errors do not prevent other after hooks or change result +- rule: Short-circuit runs after hooks only for already-executed middlewares +- rule: clear() removes all middlewares +- rule: clone() creates an independent copy +- rule: createMiddlewarePipeline factory creates instances diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-001-structure-validation-has-correct-order.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-001-structure-validation-has-correct-order.sdp.md index 8363ba7a..15987e98 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-001-structure-validation-has-correct-order.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-001-structure-validation-has-correct-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Structure validation has correct order" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Structure validation has correct order + +```gwt +Given the structure validation order constant +When the scenario runs +Then the order value is 10 +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-002-valid-payload-passes-structure-validation.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-002-valid-payload-passes-structure-validation.sdp.md index 36b095d3..f8432bd8 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-002-valid-payload-passes-structure-validation.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-002-valid-payload-passes-structure-validation.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Valid payload passes structure validation" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Valid payload passes structure validation + +```gwt +Given a structure validation middleware with a CreateOrder schema requiring orderId and customerId +When the middleware processes a valid CreateOrder command +Then the before hook returns continue true +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-003-invalid-payload-is-rejected-by-structure-validation.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-003-invalid-payload-is-rejected-by-structure-validation.sdp.md index b99fadbc..2a91ae54 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-003-invalid-payload-is-rejected-by-structure-validation.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-003-invalid-payload-is-rejected-by-structure-validation.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Invalid payload is rejected by structure validation" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Invalid payload is rejected by structure validation + +```gwt +Given a structure validation middleware with a CreateOrder schema requiring orderId, customerId, and amount +When the middleware processes a CreateOrder command missing the amount field +Then the before hook returns continue false +And the result status is "rejected" +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-004-unregistered-command-skips-structure-validation.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-004-unregistered-command-skips-structure-validation.sdp.md index ca1ce20d..9a5dc990 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-004-unregistered-command-skips-structure-validation.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-004-unregistered-command-skips-structure-validation.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Unregistered command skips structure validation" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Unregistered command skips structure validation + +```gwt +Given a structure validation middleware with no schemas +When the middleware processes a valid CreateOrder command +Then the before hook returns continue true +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-005-registry-validation-validates-against-registry-schema.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-005-registry-validation-validates-against-registry-schema.sdp.md index 94c6f2d3..7dcb25ac 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-005-registry-validation-validates-against-registry-schema.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-005-registry-validation-validates-against-registry-schema.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Registry validation validates against registry schema" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Registry validation validates against registry schema + +```gwt +Given a registry validation middleware with a CreateOrder registration +When the middleware processes a valid CreateOrder command +Then the before hook returns continue true +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-006-registry-validation-skips-unregistered-commands.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-006-registry-validation-skips-unregistered-commands.sdp.md index 2e22f190..af6ec101 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-006-registry-validation-skips-unregistered-commands.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-006-registry-validation-skips-unregistered-commands.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Registry validation skips unregistered commands" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Registry validation skips unregistered commands + +```gwt +Given a registry validation middleware with no registrations +When the middleware processes a valid CreateOrder command +Then the before hook returns continue true +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-007-domain-validation-has-correct-order.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-007-domain-validation-has-correct-order.sdp.md index ded825a2..79e85299 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-007-domain-validation-has-correct-order.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-007-domain-validation-has-correct-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Domain validation has correct order" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Domain validation has correct order + +```gwt +Given the domain validation order constant +When the scenario runs +Then the order value is 20 +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-008-domain-validation-passes-when-validator-returns-undefined.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-008-domain-validation-passes-when-validator-returns-undefined.sdp.md index 6ea982cc..d2473c8f 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-008-domain-validation-passes-when-validator-returns-undefined.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-008-domain-validation-passes-when-validator-returns-undefined.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Domain validation passes when validator returns undefined" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Domain validation passes when validator returns undefined + +```gwt +Given a domain validation middleware where CreateOrder validator returns undefined +When the middleware processes a valid CreateOrder command +Then the before hook returns continue true +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-009-domain-validation-rejects-when-validator-returns-error-message.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-009-domain-validation-rejects-when-validator-returns-error-message.sdp.md index ba3db8fe..c926323f 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-009-domain-validation-rejects-when-validator-returns-error-message.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-009-domain-validation-rejects-when-validator-returns-error-message.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Domain validation rejects when validator returns error message" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Domain validation rejects when validator returns error message + +```gwt +Given a domain validation middleware where CreateOrder validator returns "Order already exists" +When the middleware processes a valid CreateOrder command +Then the before hook returns continue false +And the result status is "rejected" +And the result reason is "Order already exists" +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-010-domain-validation-skips-commands-without-validators.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-010-domain-validation-skips-commands-without-validators.sdp.md index 22a51182..e2f7b048 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-010-domain-validation-skips-commands-without-validators.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-010-domain-validation-skips-commands-without-validators.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Domain validation skips commands without validators" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Domain validation skips commands without validators + +```gwt +Given a domain validation middleware with no validators +When the middleware processes a valid CreateOrder command +Then the before hook returns continue true +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-011-combined-validators-return-first-error.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-011-combined-validators-return-first-error.sdp.md index df5cff98..7b8e8a24 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-011-combined-validators-return-first-error.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-011-combined-validators-return-first-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Combined validators return first error" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Combined validators return first error + +```gwt +Given a combined validator with validators returning undefined, "Error from second", "Error from third" +When the combined validator runs +Then the combined result is "Error from second" +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-012-combined-validators-return-undefined-when-all-pass.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-012-combined-validators-return-undefined-when-all-pass.sdp.md index 3847d95a..9aaab7df 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-012-combined-validators-return-undefined-when-all-pass.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-012-combined-validators-return-undefined-when-all-pass.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Combined validators return undefined when all pass" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Combined validators return undefined when all pass + +```gwt +Given a combined validator with all validators returning undefined +When the combined validator runs +Then the combined result is undefined +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-013-required-string-validates-non-empty-strings.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-013-required-string-validates-non-empty-strings.sdp.md index bc48359c..803038e9 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-013-required-string-validates-non-empty-strings.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-013-required-string-validates-non-empty-strings.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "requiredString validates non-empty strings" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: requiredString validates non-empty strings + +```gwt +Given a requiredString validator for field "name" +When the scenario runs +Then validating the field produces expected results: +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-014-positive-number-validates-positive-numbers.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-014-positive-number-validates-positive-numbers.sdp.md index 3cb92e6a..4015f57c 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-014-positive-number-validates-positive-numbers.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-014-positive-number-validates-positive-numbers.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "positiveNumber validates positive numbers" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: positiveNumber validates positive numbers + +```gwt +Given a positiveNumber validator for field "quantity" +When the scenario runs +Then validating the number field produces expected results: +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-015-number-range-validates-within-range.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-015-number-range-validates-within-range.sdp.md index 8c810153..2382667a 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-015-number-range-validates-within-range.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-015-number-range-validates-within-range.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "numberRange validates within range" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: numberRange validates within range + +```gwt +Given a numberRange validator for field "score" with min 0 and max 100 +When the scenario runs +Then validating the number field in range produces expected results: +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-016-starts-with-prefix-validates-prefix.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-016-starts-with-prefix-validates-prefix.sdp.md index 3f2361f2..2c3973f6 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-016-starts-with-prefix-validates-prefix.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-016-starts-with-prefix-validates-prefix.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "startsWithPrefix validates prefix" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: startsWithPrefix validates prefix + +```gwt +Given a startsWithPrefix validator for field "orderId" with prefix "ord_" +When the scenario runs +Then validating the prefix field produces expected results: +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-017-authorization-has-correct-order.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-017-authorization-has-correct-order.sdp.md index 918a161c..033da4a0 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-017-authorization-has-correct-order.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-017-authorization-has-correct-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Authorization has correct order" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Authorization has correct order + +```gwt +Given the authorization order constant +When the scenario runs +Then the order value is 30 +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-018-authorization-allows-when-checker-returns-allowed-true.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-018-authorization-allows-when-checker-returns-allowed-true.sdp.md index 7792f622..44f5c80b 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-018-authorization-allows-when-checker-returns-allowed-true.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-018-authorization-allows-when-checker-returns-allowed-true.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Authorization allows when checker returns allowed true" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Authorization allows when checker returns allowed true + +```gwt +Given an authorization middleware that always allows +When the middleware processes a valid CreateOrder command +Then the before hook returns continue true +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-019-authorization-rejects-when-checker-returns-allowed-false.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-019-authorization-rejects-when-checker-returns-allowed-false.sdp.md index b0650dc9..957f2654 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-019-authorization-rejects-when-checker-returns-allowed-false.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-019-authorization-rejects-when-checker-returns-allowed-false.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Authorization rejects when checker returns allowed false" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Authorization rejects when checker returns allowed false + +```gwt +Given an authorization middleware that denies with reason "Access denied" +When the middleware processes a valid CreateOrder command +Then the before hook returns continue false +And the result status is "rejected" +And the result code is "UNAUTHORIZED" +And the result reason is "Access denied" +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-020-authorization-skips-configured-commands.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-020-authorization-skips-configured-commands.sdp.md index 4e2a6213..de345e08 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-020-authorization-skips-configured-commands.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-020-authorization-skips-configured-commands.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Authorization skips configured commands" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Authorization skips configured commands + +```gwt +Given an authorization middleware that denies but skips CreateOrder +When the middleware processes a valid CreateOrder command +Then the before hook returns continue true +And the checker was not called +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-021-role-based-checker-allows-user-with-required-role.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-021-role-based-checker-allows-user-with-required-role.sdp.md index 43bcc983..76642e65 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-021-role-based-checker-allows-user-with-required-role.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-021-role-based-checker-allows-user-with-required-role.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Role-based checker allows user with required role" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Role-based checker allows user with required role + +```gwt +Given a role-based checker requiring "user" or "admin" for CreateOrder +When checking authorization for a user with role "user" +Then the authorization result is allowed +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-022-role-based-checker-rejects-user-without-required-role.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-022-role-based-checker-rejects-user-without-required-role.sdp.md index 52622b1e..30b3cf2f 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-022-role-based-checker-rejects-user-without-required-role.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-022-role-based-checker-rejects-user-without-required-role.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Role-based checker rejects user without required role" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Role-based checker rejects user without required role + +```gwt +Given a role-based checker requiring "admin" for CreateOrder +When checking authorization for a user with role "user" +Then the authorization result is not allowed +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-023-role-based-checker-requires-authentication.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-023-role-based-checker-requires-authentication.sdp.md index a69894b1..bd65d543 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-023-role-based-checker-requires-authentication.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-023-role-based-checker-requires-authentication.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Role-based checker requires authentication" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Role-based checker requires authentication + +```gwt +Given a role-based checker requiring "user" for CreateOrder +When checking authorization with no user role +Then the authorization result is not allowed +And the authorization reason is "Authentication required" +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-024-role-based-checker-allows-when-no-roles-specified.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-024-role-based-checker-allows-when-no-roles-specified.sdp.md index eb358ef7..ec93c872 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-024-role-based-checker-allows-when-no-roles-specified.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-024-role-based-checker-allows-when-no-roles-specified.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Role-based checker allows when no roles specified" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Role-based checker allows when no roles specified + +```gwt +Given a role-based checker with no role requirements +When checking authorization for a user with role "user" +Then the authorization result is allowed +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-025-logging-has-correct-order.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-025-logging-has-correct-order.sdp.md index 5af8f028..1383c7d7 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-025-logging-has-correct-order.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-025-logging-has-correct-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Logging has correct order" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Logging has correct order + +```gwt +Given the logging order constant +When the scenario runs +Then the order value is 40 +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-026-logging-middleware-logs-before-and-after-execution.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-026-logging-middleware-logs-before-and-after-execution.sdp.md index 9988ed52..e77c7105 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-026-logging-middleware-logs-before-and-after-execution.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-026-logging-middleware-logs-before-and-after-execution.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Logging middleware logs before and after execution" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Logging middleware logs before and after execution + +```gwt +Given a logging middleware with a mock logger +When the before hook runs for a CreateOrder command and the after hook runs with a success result +Then the logger contains message "Command started: CreateOrder" +And the logger contains message "Command succeeded: CreateOrder" +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-027-logging-middleware-logs-errors-for-failed-commands.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-027-logging-middleware-logs-errors-for-failed-commands.sdp.md index 0fd72bac..32132bb2 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-027-logging-middleware-logs-errors-for-failed-commands.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-027-logging-middleware-logs-errors-for-failed-commands.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Logging middleware logs errors for failed commands" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Logging middleware logs errors for failed commands + +```gwt +Given a logging middleware with a mock logger +When the after hook runs with a failed result +Then the logger has error-level entries +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-028-no-op-logger-does-not-throw-on-any-level.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-028-no-op-logger-does-not-throw-on-any-level.sdp.md index 78f404f6..74977642 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-028-no-op-logger-does-not-throw-on-any-level.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-028-no-op-logger-does-not-throw-on-any-level.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "NoOp logger does not throw on any level" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: NoOp logger does not throw on any level + +```gwt +Given a no-op logger +When the scenario runs +Then calling all log levels does not throw +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-029-json-logger-outputs-correctly-formatted-logs.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-029-json-logger-outputs-correctly-formatted-logs.sdp.md index 71b54d49..f36df5ab 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-029-json-logger-outputs-correctly-formatted-logs.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-029-json-logger-outputs-correctly-formatted-logs.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "JSON logger outputs correctly formatted logs" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: JSON logger outputs correctly formatted logs + +```gwt +Given a JSON logger without timestamps +When logging an info message "test message" with context key "value" +Then the JSON output has level "info" and message "test message" and key "value" +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-030-json-logger-includes-timestamp-when-configured.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-030-json-logger-includes-timestamp-when-configured.sdp.md index fa5d0309..014e565a 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-030-json-logger-includes-timestamp-when-configured.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-030-json-logger-includes-timestamp-when-configured.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "JSON logger includes timestamp when configured" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: JSON logger includes timestamp when configured + +```gwt +Given a JSON logger with timestamps +When logging an info message "test" +Then the JSON output has a timestamp field +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-031-rate-limit-has-correct-order.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-031-rate-limit-has-correct-order.sdp.md index de5b665d..879fbb7d 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-031-rate-limit-has-correct-order.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-031-rate-limit-has-correct-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rate limit has correct order" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Rate limit has correct order + +```gwt +Given the rate limit order constant +When the scenario runs +Then the order value is 50 +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-032-rate-limit-allows-when-not-exceeded.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-032-rate-limit-allows-when-not-exceeded.sdp.md index 7a4002d0..d2efa360 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-032-rate-limit-allows-when-not-exceeded.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-032-rate-limit-allows-when-not-exceeded.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rate limit allows when not exceeded" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Rate limit allows when not exceeded + +```gwt +Given a rate limit middleware that always allows +When the middleware processes a valid CreateOrder command +Then the before hook returns continue true +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-033-rate-limit-rejects-when-exceeded.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-033-rate-limit-rejects-when-exceeded.sdp.md index 9283bd92..6feda041 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-033-rate-limit-rejects-when-exceeded.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-033-rate-limit-rejects-when-exceeded.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Rate limit rejects when exceeded" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Rate limit rejects when exceeded + +```gwt +Given a rate limit middleware that always denies with retryAfterMs 1000 +When the middleware processes a valid CreateOrder command +Then the before hook returns continue false +And the result status is "rejected" +And the result code is "RATE_LIMITED" +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-034-rate-limit-skips-configured-commands.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-034-rate-limit-skips-configured-commands.sdp.md index ef3460a9..b945c435 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-034-rate-limit-skips-configured-commands.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-034-rate-limit-skips-configured-commands.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rate limit skips configured commands" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: Rate limit skips configured commands + +```gwt +Given a rate limit middleware that denies but skips CreateOrder +When the middleware processes a valid CreateOrder command +Then the before hook returns continue true +And the rate limit checker was not called +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-035-by-user-id-generates-correct-key.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-035-by-user-id-generates-correct-key.sdp.md index 2508455c..f3789a47 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-035-by-user-id-generates-correct-key.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-035-by-user-id-generates-correct-key.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "byUserId generates correct key" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: byUserId generates correct key + +```gwt +Given a byUserId key generator +When generating a key for user "user_123" +Then the generated key is "user:user_123" +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-036-by-user-id-handles-anonymous-users.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-036-by-user-id-handles-anonymous-users.sdp.md index 9913c1c1..a4e2d209 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-036-by-user-id-handles-anonymous-users.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-036-by-user-id-handles-anonymous-users.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "byUserId handles anonymous users" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: byUserId handles anonymous users + +```gwt +Given a byUserId key generator for anonymous users +When generating a key with no user +Then the generated key is "user:anonymous" +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-037-by-command-type-generates-correct-key.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-037-by-command-type-generates-correct-key.sdp.md index ec428743..e801a1d1 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-037-by-command-type-generates-correct-key.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-037-by-command-type-generates-correct-key.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "byCommandType generates correct key" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: byCommandType generates correct key + +```gwt +Given a byCommandType key generator +When generating a key for command type "CreateOrder" +Then the generated key is "command:CreateOrder" +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-038-by-user-and-command-generates-composite-key.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-038-by-user-and-command-generates-composite-key.sdp.md index c73bebc9..ab919cfc 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-038-by-user-and-command-generates-composite-key.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-038-by-user-and-command-generates-composite-key.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "byUserAndCommand generates composite key" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: byUserAndCommand generates composite key + +```gwt +Given a byUserAndCommand key generator +When generating a key for user "user_123" and command "CreateOrder" +Then the generated key is "user:user_123:CreateOrder" +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-039-all-middleware-orders-follow-correct-sequence.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-039-all-middleware-orders-follow-correct-sequence.sdp.md index 891f7461..4fcf8174 100644 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-039-all-middleware-orders-follow-correct-sequence.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.examples/s-039-all-middleware-orders-follow-correct-sequence.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "All middleware orders follow correct sequence" from packages/platform-core/tests/features/behavior/middleware/middlewares.feature +- outcome: Executable scenario: All middleware orders follow correct sequence + +```gwt +Given all middleware order constants +When the scenario runs +Then the orders follow the sequence: +``` diff --git a/specs/behavior/platform-core/middleware/middlewares.sdp.md b/specs/behavior/platform-core/middleware/middlewares.sdp.md index 4c8ed990..9ca9e087 100644 --- a/specs/behavior/platform-core/middleware/middlewares.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.sdp.md @@ -10,4 +10,20 @@ relations: ## Intent -- outcome: Verifies all 5 built-in middlewares: structure validation, domain validation, authorization, logging, and rate limiting. Each middleware has a fixed order and specific before/after hook behavior. (test carrier: packages/platform-core/tests/features/behavior/middleware/middlewares.feature) +- outcome: Built-in middlewares + +## Behavior + +- rule: Structure validation middleware validates command args against Zod schemas +- rule: Registry validation middleware uses schemas from a command registry +- rule: Domain validation middleware runs async validators and rejects on error messages +- rule: combineDomainValidators runs all validators and returns first error +- rule: CommonValidators provide reusable field-level validation helpers +- rule: Authorization middleware checks permissions and supports skipping +- rule: createRoleBasedChecker creates role-based authorization checkers +- rule: Logging middleware logs command lifecycle events +- rule: createNoOpLogger creates a silent logger +- rule: createJsonLogger outputs structured JSON logs +- rule: Rate limit middleware enforces rate limits and supports skipping +- rule: RateLimitKeys provides key generation strategies +- rule: Middleware ordering constants follow the correct pipeline sequence diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-001-operation-executes-normally-and-returns-result.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-001-operation-executes-normally-and-returns-result.sdp.md index 1cba9364..91e4270c 100644 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-001-operation-executes-normally-and-returns-result.sdp.md +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-001-operation-executes-normally-and-returns-result.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Operation executes normally and returns result" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature +- outcome: Executable scenario: Operation executes normally and returns result + +```gwt +Given a circuit "test-circuit" in closed state +When I execute a succeeding operation through the circuit breaker +Then the operation result is "success" +And the operation was called 1 time +And the circuit state is "closed" +``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-002-circuit-remains-closed-after-a-single-failure.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-002-circuit-remains-closed-after-a-single-failure.sdp.md index c83e1f69..c3564052 100644 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-002-circuit-remains-closed-after-a-single-failure.sdp.md +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-002-circuit-remains-closed-after-a-single-failure.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Circuit remains closed after a single failure" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature +- outcome: Executable scenario: Circuit remains closed after a single failure + +```gwt +Given a circuit "test-circuit" in closed state +When I execute a failing operation through the circuit breaker +Then the operation throws "transient error" +And the circuit state is "closed" +``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-003-circuit-opens-after-default-failure-threshold-of-5-failures.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-003-circuit-opens-after-default-failure-threshold-of-5-failures.sdp.md index 63fb6708..bda8f311 100644 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-003-circuit-opens-after-default-failure-threshold-of-5-failures.sdp.md +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-003-circuit-opens-after-default-failure-threshold-of-5-failures.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Circuit opens after default failure threshold of 5 failures" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature +- outcome: Executable scenario: Circuit opens after default failure threshold of 5 failures + +```gwt +Given a circuit "test-circuit" in closed state +When I trigger 5 consecutive failures on circuit "test-circuit" +Then the circuit state is "open" +And the next operation on circuit "test-circuit" is rejected without invocation +``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-004-circuit-transitions-to-half-open-after-timeout.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-004-circuit-transitions-to-half-open-after-timeout.sdp.md index 4bbd2726..6b8bc574 100644 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-004-circuit-transitions-to-half-open-after-timeout.sdp.md +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-004-circuit-transitions-to-half-open-after-timeout.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Circuit transitions to half-open after timeout" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature +- outcome: Executable scenario: Circuit transitions to half-open after timeout + +```gwt +Given a circuit "test-circuit" that has been opened by 5 failures +When I advance time by 60001 milliseconds +Then the circuit state is "half-open" +And a probe operation on circuit "test-circuit" returns "probe success" +``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-005-circuit-closes-on-success-in-half-open-state.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-005-circuit-closes-on-success-in-half-open-state.sdp.md index cba4ba09..98d917f7 100644 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-005-circuit-closes-on-success-in-half-open-state.sdp.md +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-005-circuit-closes-on-success-in-half-open-state.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Circuit closes on success in half-open state" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature +- outcome: Executable scenario: Circuit closes on success in half-open state + +```gwt +Given a circuit "test-circuit" in half-open state +When I execute a succeeding operation returning "recovered" through circuit "test-circuit" +Then the circuit state is "closed" +And a normal operation on circuit "test-circuit" returns "normal" +``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-006-circuit-re-opens-on-failure-in-half-open-state.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-006-circuit-re-opens-on-failure-in-half-open-state.sdp.md index cb2074bb..6b2e6eaf 100644 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-006-circuit-re-opens-on-failure-in-half-open-state.sdp.md +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-006-circuit-re-opens-on-failure-in-half-open-state.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Circuit re-opens on failure in half-open state" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature +- outcome: Executable scenario: Circuit re-opens on failure in half-open state + +```gwt +Given a circuit "test-circuit" in half-open state +When I execute a failing operation throwing "still broken" through circuit "test-circuit" +Then the circuit state is "open" +And the next operation on circuit "test-circuit" is rejected without invocation +``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-007-requires-3-consecutive-successes-in-half-open-to-close-circuit.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-007-requires-3-consecutive-successes-in-half-open-to-close-circuit.sdp.md index 99c0b866..53b346c8 100644 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-007-requires-3-consecutive-successes-in-half-open-to-close-circuit.sdp.md +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-007-requires-3-consecutive-successes-in-half-open-to-close-circuit.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Requires 3 consecutive successes in half-open to close circuit" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature +- outcome: Executable scenario: Requires 3 consecutive successes in half-open to close circuit + +```gwt +Given a circuit "threshold-circuit" opened with failureThreshold 2 and timeout 5000 and successThreshold 3 +When I advance time by 5001 milliseconds +Then the circuit state for "threshold-circuit" is "half-open" +And the circuit "threshold-circuit" remains half-open after each success until the 3rd with config failureThreshold 2 timeout 5000 successThreshold 3 +``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-008-returns-closed-for-unknown-circuit.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-008-returns-closed-for-unknown-circuit.sdp.md index 34948849..08fabc9f 100644 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-008-returns-closed-for-unknown-circuit.sdp.md +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-008-returns-closed-for-unknown-circuit.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns closed for unknown circuit" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature +- outcome: Executable scenario: Returns closed for unknown circuit + +```gwt +Given the feature fixture is in place +When I query the state of circuit "unknown-test" +Then the queried circuit state is "closed" +``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-009-reflects-current-state-after-a-successful-operation.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-009-reflects-current-state-after-a-successful-operation.sdp.md index 479c76b5..fa586f8e 100644 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-009-reflects-current-state-after-a-successful-operation.sdp.md +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-009-reflects-current-state-after-a-successful-operation.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Reflects current state after a successful operation" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature +- outcome: Executable scenario: Reflects current state after a successful operation + +```gwt +Given a circuit "test-circuit" in closed state +When I execute a succeeding operation through the circuit breaker +Then the circuit state is "closed" +``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-010-reset-clears-an-open-circuit-back-to-closed.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-010-reset-clears-an-open-circuit-back-to-closed.sdp.md index a0920eb2..8a6bbc95 100644 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-010-reset-clears-an-open-circuit-back-to-closed.sdp.md +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-010-reset-clears-an-open-circuit-back-to-closed.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Reset clears an open circuit back to closed" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature +- outcome: Executable scenario: Reset clears an open circuit back to closed + +```gwt +Given a circuit "reset-test" that has been opened by 5 failures +When I reset circuit "reset-test" +Then the circuit state for "reset-test" is "closed" +And a normal operation on circuit "reset-test" returns "back to normal" +``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-011-respects-custom-failure-threshold.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-011-respects-custom-failure-threshold.sdp.md index 6a11126f..3053628e 100644 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-011-respects-custom-failure-threshold.sdp.md +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-011-respects-custom-failure-threshold.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Respects custom failureThreshold" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature +- outcome: Executable scenario: Respects custom failureThreshold + +```gwt +Given a circuit "custom-circuit" in closed state +When I trigger 2 consecutive failures on circuit "custom-circuit" with failureThreshold 2 +Then the circuit state for "custom-circuit" is "open" +``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-012-respects-custom-timeout.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-012-respects-custom-timeout.sdp.md index c761a68b..b97586cf 100644 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-012-respects-custom-timeout.sdp.md +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-012-respects-custom-timeout.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Respects custom timeout" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature +- outcome: Executable scenario: Respects custom timeout + +```gwt +Given a circuit "custom-circuit" opened with failureThreshold 2 and timeout 5000 +When I advance time by 4000 milliseconds and I advance time by 1001 milliseconds +Then the circuit state for "custom-circuit" is "open" +And the circuit state for "custom-circuit" is "half-open" +``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-013-failure-count-resets-on-success-in-closed-state.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-013-failure-count-resets-on-success-in-closed-state.sdp.md index 07730857..e5b00445 100644 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-013-failure-count-resets-on-success-in-closed-state.sdp.md +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-013-failure-count-resets-on-success-in-closed-state.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Failure count resets on success in closed state" from packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature +- outcome: Executable scenario: Failure count resets on success in closed state + +```gwt +Given a circuit "test-circuit" in closed state +When I trigger 4 consecutive failures on circuit "test-circuit" and I execute a succeeding operation through the circuit breaker and I trigger 4 more consecutive failures on circuit "test-circuit" +Then the circuit state is "closed" +``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.sdp.md index 2d8c614e..b2d735ea 100644 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.sdp.md +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.sdp.md @@ -10,4 +10,18 @@ relations: ## Intent -- outcome: a circuit breaker for fault isolation so that cascading failures are prevented when operations fail repeatedly (test carrier: packages/platform-core/tests/features/behavior/monitoring/circuit-breaker.feature) +- actor: a platform developer +- outcome: a circuit breaker for fault isolation so that cascading failures are prevented when operations fail repeatedly + +## Behavior + +- rule: A closed circuit executes operations normally +- rule: A closed circuit opens after reaching the failure threshold +- rule: An open circuit transitions to half-open after the timeout elapses +- rule: A half-open circuit closes on a successful probe +- rule: A half-open circuit re-opens on a failed probe +- rule: With successThreshold ) 1, multiple consecutive successes are required to close +- rule: getCircuitState returns the current state of a circuit +- rule: resetCircuit clears circuit state back to closed +- rule: Custom configuration overrides default thresholds and timeouts +- rule: A success in closed state resets the failure counter diff --git a/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-001-wraps-partition-key-in-structured-field-for-primary-projection.sdp.md b/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-001-wraps-partition-key-in-structured-field-for-primary-projection.sdp.md index 4265a0fc..43c9e955 100644 --- a/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-001-wraps-partition-key-in-structured-field-for-primary-projection.sdp.md +++ b/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-001-wraps-partition-key-in-structured-field-for-primary-projection.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Wraps partition key in structured field for primary projection" from packages/platform-core/tests/features/behavior/orchestration/command-orchestrator.feature +- outcome: Executable scenario: Wraps partition key in structured field for primary projection + +```gwt +Given an orchestrator with mock dependencies +And a successful command handler result +And a command config with primary projection "orderSummary" partitioned by "orderId" +When I execute the command with orderId "ord_123" +Then the workpool was called at least 1 time +And the workpool call 0 context contains: +And the workpool call 0 partition is name "orderId" value "ord_123" +``` diff --git a/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-002-wraps-partition-key-in-structured-field-for-secondary-projections.sdp.md b/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-002-wraps-partition-key-in-structured-field-for-secondary-projections.sdp.md index 2dd0cdc6..d647565c 100644 --- a/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-002-wraps-partition-key-in-structured-field-for-secondary-projections.sdp.md +++ b/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-002-wraps-partition-key-in-structured-field-for-secondary-projections.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "Wraps partition key in structured field for secondary projections" from packages/platform-core/tests/features/behavior/orchestration/command-orchestrator.feature +- outcome: Executable scenario: Wraps partition key in structured field for secondary projections + +```gwt +Given an orchestrator with mock dependencies +And a successful command handler result +And a command config with primary projection "orderSummary" partitioned by "orderId" +And a secondary projection "orderWithInventory" partitioned by "orderId" +When I execute the command with orderId "ord_456" +Then the workpool was called at least 2 times +And the workpool call 1 context contains: +And the workpool call 1 partition is name "orderId" value "ord_456" +And the primary projection stays on the projection pool +``` diff --git a/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-003-wraps-partition-key-in-structured-field-for-failed-projection.sdp.md b/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-003-wraps-partition-key-in-structured-field-for-failed-projection.sdp.md index 80bc6618..a9dc2040 100644 --- a/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-003-wraps-partition-key-in-structured-field-for-failed-projection.sdp.md +++ b/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-003-wraps-partition-key-in-structured-field-for-failed-projection.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Wraps partition key in structured field for failed projection" from packages/platform-core/tests/features/behavior/orchestration/command-orchestrator.feature +- outcome: Executable scenario: Wraps partition key in structured field for failed projection + +```gwt +Given an orchestrator with mock dependencies +And a failed command handler result +And a command config with failed projection "reservationFailure" partitioned by "orderId" +When I execute the command with orderId "ord_789" +Then the workpool was called at least 1 time +And the workpool call 0 context contains: +And the workpool call 0 partition is name "orderId" value "ord_789" +``` diff --git a/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-004-routes-saga-work-to-saga-pool-only.sdp.md b/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-004-routes-saga-work-to-saga-pool-only.sdp.md index 50a2b7d9..6efaa5ca 100644 --- a/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-004-routes-saga-work-to-saga-pool-only.sdp.md +++ b/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-004-routes-saga-work-to-saga-pool-only.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Routes saga work to sagaPool only" from packages/platform-core/tests/features/behavior/orchestration/command-orchestrator.feature +- outcome: Executable scenario: Routes saga work to sagaPool only + +```gwt +Given an orchestrator with mock dependencies +And a successful command handler result +And a command config with saga routing +When I execute the command with orderId "ord_saga_123" +Then the saga pool should receive exactly one enqueue call +And the fanout pool should remain unused +``` diff --git a/specs/behavior/platform-core/orchestration/command-orchestrator.sdp.md b/specs/behavior/platform-core/orchestration/command-orchestrator.sdp.md index a74fdfa6..e4b73988 100644 --- a/specs/behavior/platform-core/orchestration/command-orchestrator.sdp.md +++ b/specs/behavior/platform-core/orchestration/command-orchestrator.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Verifies that the partition context passed to Workpool's enqueueMutation uses the structured { name, value } format across all projection paths. (test carrier: packages/platform-core/tests/features/behavior/orchestration/command-orchestrator.feature) +- outcome: CommandOrchestrator partition key structure + +## Behavior + +- rule: Primary projection receives structured partition key +- rule: Secondary projections receive structured partition key +- rule: Failed projection receives structured partition key +- rule: Saga routing uses sagaPool diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-001-successful-cross-context-coordination.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-001-successful-cross-context-coordination.sdp.md index ac78345f..2a0cc144 100644 --- a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-001-successful-cross-context-coordination.sdp.md +++ b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-001-successful-cross-context-coordination.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Successful cross-context coordination" from packages/platform-core/tests/features/behavior/orchestration/saga-orchestration-executable-tests.feature +- outcome: Executable scenario: Successful cross-context coordination + +```gwt +Given the saga registry and Convex Workflow integration are available +And an OrderSubmitted event for order "ord-123" +When the Order Fulfillment saga processes the event +Then it calls Inventory BC to reserve stock +And on success, it confirms the order +And the saga completes with status "completed" +``` diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-002-compensation-on-step-failure.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-002-compensation-on-step-failure.sdp.md index 2113f292..13c1d12b 100644 --- a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-002-compensation-on-step-failure.sdp.md +++ b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-002-compensation-on-step-failure.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Compensation on step failure" from packages/platform-core/tests/features/behavior/orchestration/saga-orchestration-executable-tests.feature +- outcome: Executable scenario: Compensation on step failure + +```gwt +Given the saga registry and Convex Workflow integration are available +And an OrderSubmitted event for order "ord-456" +When the Inventory BC rejects the reservation (insufficient stock) +Then the saga executes compensation +And the order is cancelled +And the saga completes with status "compensated" +``` diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-003-workflow-resumes-from-the-last-completed-step-after-restart.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-003-workflow-resumes-from-the-last-completed-step-after-restart.sdp.md index 75d979e9..b2aa580e 100644 --- a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-003-workflow-resumes-from-the-last-completed-step-after-restart.sdp.md +++ b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-003-workflow-resumes-from-the-last-completed-step-after-restart.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Workflow resumes from the last completed step after restart" from packages/platform-core/tests/features/behavior/orchestration/saga-orchestration-executable-tests.feature +- outcome: Executable scenario: Workflow resumes from the last completed step after restart + +```gwt +Given the saga registry and Convex Workflow integration are available +And a saga workflow that has completed step 1 and is mid-step 2 +When the server restarts +Then the workflow resumes at step 2 without re-running step 1 +``` diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-004-compensation-executes-in-reverse-order-of-completed-steps.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-004-compensation-executes-in-reverse-order-of-completed-steps.sdp.md index 0caa59a3..17d01faf 100644 --- a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-004-compensation-executes-in-reverse-order-of-completed-steps.sdp.md +++ b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-004-compensation-executes-in-reverse-order-of-completed-steps.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Compensation executes in reverse order of completed steps" from packages/platform-core/tests/features/behavior/orchestration/saga-orchestration-executable-tests.feature +- outcome: Executable scenario: Compensation executes in reverse order of completed steps + +```gwt +Given the saga registry and Convex Workflow integration are available +And a saga that completed steps 1 and 2 then failed at step 3 +When compensation runs +Then step 2's compensation runs before step 1's compensation +``` diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-005-first-trigger-starts-saga.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-005-first-trigger-starts-saga.sdp.md index fd59c5cf..87bb5920 100644 --- a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-005-first-trigger-starts-saga.sdp.md +++ b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-005-first-trigger-starts-saga.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "First trigger starts saga" from packages/platform-core/tests/features/behavior/orchestration/saga-orchestration-executable-tests.feature +- outcome: Executable scenario: First trigger starts saga + +```gwt +Given the saga registry and Convex Workflow integration are available +And no saga exists for order "ord-789" +When startSagaIfNotExists is called with sagaId "ord-789" +Then a new saga record is created with status "pending" +And the workflow is started +And the result indicates isNew = true +``` diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-006-duplicate-trigger-returns-existing-saga.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-006-duplicate-trigger-returns-existing-saga.sdp.md index 8e6895a3..d892fb3f 100644 --- a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-006-duplicate-trigger-returns-existing-saga.sdp.md +++ b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-006-duplicate-trigger-returns-existing-saga.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Duplicate trigger returns existing saga" from packages/platform-core/tests/features/behavior/orchestration/saga-orchestration-executable-tests.feature +- outcome: Executable scenario: Duplicate trigger returns existing saga + +```gwt +Given the saga registry and Convex Workflow integration are available +And a saga exists for order "ord-789" with status "pending" +When startSagaIfNotExists is called with sagaId "ord-789" again +Then no new saga is created +And the existing saga info is returned +And the result indicates isNew = false +``` diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-007-on-complete-updates-saga-status-after-workflow-finishes.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-007-on-complete-updates-saga-status-after-workflow-finishes.sdp.md index 58840095..a2416589 100644 --- a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-007-on-complete-updates-saga-status-after-workflow-finishes.sdp.md +++ b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-007-on-complete-updates-saga-status-after-workflow-finishes.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "onComplete updates saga status after workflow finishes" from packages/platform-core/tests/features/behavior/orchestration/saga-orchestration-executable-tests.feature +- outcome: Executable scenario: onComplete updates saga status after workflow finishes + +```gwt +Given the saga registry and Convex Workflow integration are available +And a saga workflow that completes successfully +When the onComplete callback runs +Then the sagas table row transitions to status "completed" +``` diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.sdp.md index bb996a92..63aaf1a0 100644 --- a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.sdp.md +++ b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: **Provenance:** This file was authored under the refactoring carve-out to expose SagaOrchestration in the PatternGraph. The pattern was originally implemented before the `@architect-implements:` convention. Rule invariants and rationales below are transferred verbatim from (test carrier: packages/platform-core/tests/features/behavior/orchestration/saga-orchestration-executable-tests.feature) +- outcome: SagaOrchestration Executable Tests + +## Behavior + +- rule: Sagas orchestrate operations across multiple bounded contexts +- rule: @convex-dev/workflow provides durability across server restarts +- rule: Compensation reverses partial operations on failure +- rule: Saga idempotency prevents duplicate workflows via sagaId +- rule: Saga status is updated via onComplete callback, not inside workflow diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-001-executor-exposes-pm-name-and-event-subscriptions.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-001-executor-exposes-pm-name-and-event-subscriptions.sdp.md index ce5145e6..4ec590b8 100644 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-001-executor-exposes-pm-name-and-event-subscriptions.sdp.md +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-001-executor-exposes-pm-name-and-event-subscriptions.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Executor exposes pmName and eventSubscriptions" from packages/platform-core/tests/features/behavior/processManager/executor.feature +- outcome: Executable scenario: Executor exposes pmName and eventSubscriptions + +```gwt +Given a PM executor "orderNotification" subscribing to "OrderConfirmed,OrderShipped" +When the scenario runs +Then the executor pmName is "orderNotification" +And the executor eventSubscriptions are "OrderConfirmed,OrderShipped" +``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-002-handles-returns-true-for-subscribed-and-false-for-unsubscribed-events.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-002-handles-returns-true-for-subscribed-and-false-for-unsubscribed-events.sdp.md index 866ab0a9..6f9e97ae 100644 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-002-handles-returns-true-for-subscribed-and-false-for-unsubscribed-events.sdp.md +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-002-handles-returns-true-for-subscribed-and-false-for-unsubscribed-events.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "handles() returns true for subscribed and false for unsubscribed events" from packages/platform-core/tests/features/behavior/processManager/executor.feature +- outcome: Executable scenario: handles() returns true for subscribed and false for unsubscribed events + +```gwt +Given a PM executor "orderNotification" subscribing to "OrderConfirmed,OrderShipped" +When the scenario runs +Then handles returns expected results for event types: +``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-003-processes-event-and-emits-commands.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-003-processes-event-and-emits-commands.sdp.md index b959f436..d11397c2 100644 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-003-processes-event-and-emits-commands.sdp.md +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-003-processes-event-and-emits-commands.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Processes event and emits commands" from packages/platform-core/tests/features/behavior/processManager/executor.feature +- outcome: Executable scenario: Processes event and emits commands + +```gwt +Given a PM executor "orderNotification" subscribing to "OrderConfirmed" +And the handler returns a "SendNotification" command +When the executor processes an "OrderConfirmed" event +Then the process result status is "processed" +And the handler was called with the event +And 1 command was emitted with commandType "SendNotification" +``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-004-skips-unsubscribed-event-with-not-subscribed-reason.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-004-skips-unsubscribed-event-with-not-subscribed-reason.sdp.md index d6dc1980..132ba1d0 100644 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-004-skips-unsubscribed-event-with-not-subscribed-reason.sdp.md +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-004-skips-unsubscribed-event-with-not-subscribed-reason.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Skips unsubscribed event with not_subscribed reason" from packages/platform-core/tests/features/behavior/processManager/executor.feature +- outcome: Executable scenario: Skips unsubscribed event with not_subscribed reason + +```gwt +Given a PM executor "orderNotification" subscribing to "OrderConfirmed" +When the executor processes an "OrderCancelled" event +Then the process result status is "skipped" +And the skip reason is "not_subscribed" +And the handler was not called +``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-005-passes-custom-state-to-handler.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-005-passes-custom-state-to-handler.sdp.md index cd215054..bcef46d3 100644 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-005-passes-custom-state-to-handler.sdp.md +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-005-passes-custom-state-to-handler.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Passes custom state to handler" from packages/platform-core/tests/features/behavior/processManager/executor.feature +- outcome: Executable scenario: Passes custom state to handler + +```gwt +Given a PM executor "orderNotification" subscribing to "OrderConfirmed" +And the PM state store has custom state for "orderNotification:ord_123" +When the executor processes an "OrderConfirmed" event +Then the handler received the custom state +``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-006-uses-stream-id-as-default-instance-id.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-006-uses-stream-id-as-default-instance-id.sdp.md index 9ea49825..0fccf579 100644 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-006-uses-stream-id-as-default-instance-id.sdp.md +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-006-uses-stream-id-as-default-instance-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Uses streamId as default instance ID" from packages/platform-core/tests/features/behavior/processManager/executor.feature +- outcome: Executable scenario: Uses streamId as default instance ID + +```gwt +Given a PM executor "orderNotification" subscribing to "OrderConfirmed" with no custom resolver +When the executor processes an "OrderConfirmed" event with streamId "ord_custom_id" +Then storage getPMState was called with instanceId "ord_custom_id" +``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-007-uses-custom-instance-id-resolver.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-007-uses-custom-instance-id-resolver.sdp.md index ea4fa918..3663fffa 100644 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-007-uses-custom-instance-id-resolver.sdp.md +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-007-uses-custom-instance-id-resolver.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Uses custom instance ID resolver" from packages/platform-core/tests/features/behavior/processManager/executor.feature +- outcome: Executable scenario: Uses custom instance ID resolver + +```gwt +Given a PM executor "orderNotification" subscribing to "OrderConfirmed" with a customer-based resolver +When the executor processes an "OrderConfirmed" event with customerId "cust_789" +Then storage getPMState was called with instanceId "customer:cust_789" +``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-008-returns-failed-status-when-handler-throws.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-008-returns-failed-status-when-handler-throws.sdp.md index 0169c264..52a2c775 100644 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-008-returns-failed-status-when-handler-throws.sdp.md +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-008-returns-failed-status-when-handler-throws.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns failed status when handler throws" from packages/platform-core/tests/features/behavior/processManager/executor.feature +- outcome: Executable scenario: Returns failed status when handler throws + +```gwt +Given a PM executor "orderNotification" subscribing to "OrderConfirmed" with a throwing handler +When the executor processes an "OrderConfirmed" event +Then the process result status is "failed" +And the result error contains "Handler failed" +And 1 dead letter was recorded +``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-009-returns-failed-status-when-command-emitter-throws.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-009-returns-failed-status-when-command-emitter-throws.sdp.md index f0b53381..ff796b80 100644 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-009-returns-failed-status-when-command-emitter-throws.sdp.md +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-009-returns-failed-status-when-command-emitter-throws.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns failed status when command emitter throws" from packages/platform-core/tests/features/behavior/processManager/executor.feature +- outcome: Executable scenario: Returns failed status when command emitter throws + +```gwt +Given a PM executor "orderNotification" subscribing to "OrderConfirmed" with a throwing emitter +When the executor processes an "OrderConfirmed" event +Then the process result status is "failed" +And 1 dead letter was recorded +``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-010-returns-all-pm-names.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-010-returns-all-pm-names.sdp.md index 4134dd4b..41d8571c 100644 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-010-returns-all-pm-names.sdp.md +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-010-returns-all-pm-names.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns all PM names" from packages/platform-core/tests/features/behavior/processManager/executor.feature +- outcome: Executable scenario: Returns all PM names + +```gwt +Given a multi-executor with "orderNotification" and "orderAnalytics" +When the scenario runs +Then the multi-executor pmNames are "orderNotification,orderAnalytics" +``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-011-finds-executors-by-event-type.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-011-finds-executors-by-event-type.sdp.md index f91b3f48..7b5b1394 100644 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-011-finds-executors-by-event-type.sdp.md +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-011-finds-executors-by-event-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Finds executors by event type" from packages/platform-core/tests/features/behavior/processManager/executor.feature +- outcome: Executable scenario: Finds executors by event type + +```gwt +Given a multi-executor with "orderNotification" and "orderAnalytics" +When the scenario runs +Then findExecutors returns expected counts: +``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-012-processes-event-through-all-matching-executors.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-012-processes-event-through-all-matching-executors.sdp.md index b621dd35..3476e2b4 100644 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-012-processes-event-through-all-matching-executors.sdp.md +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-012-processes-event-through-all-matching-executors.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Processes event through all matching executors" from packages/platform-core/tests/features/behavior/processManager/executor.feature +- outcome: Executable scenario: Processes event through all matching executors + +```gwt +Given a multi-executor with "orderNotification" and "orderAnalytics" +When processAll is called with an "OrderConfirmed" event +Then processAll returns 2 results +And processAll result 0 has pmName "orderNotification" and status "processed" +And processAll result 1 has pmName "orderAnalytics" and status "processed" +And 2 commands were emitted total +``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-013-returns-empty-array-for-unsubscribed-event.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-013-returns-empty-array-for-unsubscribed-event.sdp.md index 5f792f53..b8cf0b84 100644 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-013-returns-empty-array-for-unsubscribed-event.sdp.md +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-013-returns-empty-array-for-unsubscribed-event.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns empty array for unsubscribed event" from packages/platform-core/tests/features/behavior/processManager/executor.feature +- outcome: Executable scenario: Returns empty array for unsubscribed event + +```gwt +Given a multi-executor with "orderNotification" and "orderAnalytics" +When processAll is called with an "OrderCancelled" event +Then processAll returns 0 results +And 0 commands were emitted total +``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-014-processes-single-matching-executor.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-014-processes-single-matching-executor.sdp.md index e8b6a4e1..e5d00c48 100644 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-014-processes-single-matching-executor.sdp.md +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-014-processes-single-matching-executor.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Processes single matching executor" from packages/platform-core/tests/features/behavior/processManager/executor.feature +- outcome: Executable scenario: Processes single matching executor + +```gwt +Given a multi-executor with "orderNotification" and "orderAnalytics" +When processAll is called with an "OrderShipped" event +Then processAll returns 1 results +And processAll result 0 has pmName "orderAnalytics" and status "processed" +And 1 command was emitted with commandType "TrackEvent" +``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-015-isolates-exceptions-so-other-executors-still-run.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-015-isolates-exceptions-so-other-executors-still-run.sdp.md index 287288cf..74a0b557 100644 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-015-isolates-exceptions-so-other-executors-still-run.sdp.md +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-015-isolates-exceptions-so-other-executors-still-run.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Isolates exceptions so other executors still run" from packages/platform-core/tests/features/behavior/processManager/executor.feature +- outcome: Executable scenario: Isolates exceptions so other executors still run + +```gwt +Given a multi-executor with a throwing executor and "orderNotification" and "orderAnalytics" +When processAll is called with an "OrderConfirmed" event +Then processAll returns 3 results +And processAll result 0 has pmName "throwingPM" and status "failed" +And processAll result 0 error contains "Unexpected executor error" +And processAll result 1 has pmName "orderNotification" and status "processed" +And processAll result 2 has pmName "orderAnalytics" and status "processed" +And 2 commands were emitted total +``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-016-handles-empty-executors-array.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-016-handles-empty-executors-array.sdp.md index 9d074521..28813a71 100644 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-016-handles-empty-executors-array.sdp.md +++ b/specs/behavior/platform-core/process-manager/executor.examples/s-016-handles-empty-executors-array.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Handles empty executors array" from packages/platform-core/tests/features/behavior/processManager/executor.feature +- outcome: Executable scenario: Handles empty executors array + +```gwt +Given an empty multi-executor +When processAll is called with an "OrderConfirmed" event +Then the multi-executor pmNames are empty +And findExecutors for "OrderConfirmed" returns 0 executors +And processAll returns 0 results +``` diff --git a/specs/behavior/platform-core/process-manager/executor.sdp.md b/specs/behavior/platform-core/process-manager/executor.sdp.md index f026c2d5..bdabd9ad 100644 --- a/specs/behavior/platform-core/process-manager/executor.sdp.md +++ b/specs/behavior/platform-core/process-manager/executor.sdp.md @@ -10,4 +10,22 @@ relations: ## Intent -- outcome: a process manager executor that routes events to handlers so that process managers react to domain events and emit commands (test carrier: packages/platform-core/tests/features/behavior/processManager/executor.feature) +- actor: a platform developer +- outcome: a process manager executor that routes events to handlers so that process managers react to domain events and emit commands + +## Behavior + +- rule: Factory creates executor with correct identity and subscription filtering +- rule: Executor processes subscribed events and emits commands +- rule: Executor skips events it is not subscribed to +- rule: Executor passes custom state from storage to handler +- rule: Default instance ID resolver uses streamId +- rule: Custom instance ID resolver overrides default +- rule: Handler errors produce failed status and dead letters +- rule: Command emitter errors produce failed status and dead letters +- rule: Multi-executor exposes all PM names and finds executors by event type +- rule: processAll routes events through all matching executors +- rule: processAll returns empty for unsubscribed events +- rule: processAll routes to single matching executor +- rule: processAll isolates exceptions across executors +- rule: processAll handles empty executors array gracefully diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-001-idle-state-allows-start.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-001-idle-state-allows-start.sdp.md index f8ac6e37..5e93a0e7 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-001-idle-state-allows-start.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-001-idle-state-allows-start.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Idle state allows START" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Idle state allows START + +```gwt +Given the feature fixture is in place +When I check if transition from "idle" with "START" is valid +Then the transition is valid +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-002-idle-state-rejects-invalid-events.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-002-idle-state-rejects-invalid-events.sdp.md index 2d832231..7093336a 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-002-idle-state-rejects-invalid-events.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-002-idle-state-rejects-invalid-events.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Idle state rejects invalid events" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Idle state rejects invalid events + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isPMValidTransition returns false for: +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-003-processing-state-allows-success-and-fail.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-003-processing-state-allows-success-and-fail.sdp.md index 0c031db1..fdef26a2 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-003-processing-state-allows-success-and-fail.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-003-processing-state-allows-success-and-fail.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Processing state allows SUCCESS and FAIL" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Processing state allows SUCCESS and FAIL + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isPMValidTransition returns true for: +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-004-processing-state-rejects-invalid-events.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-004-processing-state-rejects-invalid-events.sdp.md index 29fbdfe0..28f08a33 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-004-processing-state-rejects-invalid-events.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-004-processing-state-rejects-invalid-events.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Processing state rejects invalid events" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Processing state rejects invalid events + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isPMValidTransition returns false for: +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-005-completed-state-allows-reset.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-005-completed-state-allows-reset.sdp.md index 90257a02..4ba9c5c9 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-005-completed-state-allows-reset.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-005-completed-state-allows-reset.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Completed state allows RESET" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Completed state allows RESET + +```gwt +Given the feature fixture is in place +When I check if transition from "completed" with "RESET" is valid +Then the transition is valid +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-006-completed-state-rejects-invalid-events.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-006-completed-state-rejects-invalid-events.sdp.md index 8c07ba0b..a5c4926b 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-006-completed-state-rejects-invalid-events.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-006-completed-state-rejects-invalid-events.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Completed state rejects invalid events" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Completed state rejects invalid events + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isPMValidTransition returns false for: +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-007-failed-state-allows-retry-and-reset.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-007-failed-state-allows-retry-and-reset.sdp.md index 33565ad0..2e93a05d 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-007-failed-state-allows-retry-and-reset.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-007-failed-state-allows-retry-and-reset.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Failed state allows RETRY and RESET" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Failed state allows RETRY and RESET + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isPMValidTransition returns true for: +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-008-failed-state-rejects-invalid-events.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-008-failed-state-rejects-invalid-events.sdp.md index 391a3a26..4a3a53ce 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-008-failed-state-rejects-invalid-events.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-008-failed-state-rejects-invalid-events.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Failed state rejects invalid events" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Failed state rejects invalid events + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isPMValidTransition returns false for: +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-009-valid-transitions-return-correct-target-state.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-009-valid-transitions-return-correct-target-state.sdp.md index d9b34aa5..3f42c478 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-009-valid-transitions-return-correct-target-state.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-009-valid-transitions-return-correct-target-state.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Valid transitions return correct target state" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Valid transitions return correct target state + +```gwt +Given the feature fixture is in place +When the scenario runs +Then pmTransitionState returns the expected state for: +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md index ac1ee418..64f5ed73 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Invalid transitions return null" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Invalid transitions return null + +```gwt +Given the feature fixture is in place +When the scenario runs +Then pmTransitionState returns null for: +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-011-idle-state-has-exactly-one-valid-event.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-011-idle-state-has-exactly-one-valid-event.sdp.md index ed93da1a..703e0493 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-011-idle-state-has-exactly-one-valid-event.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-011-idle-state-has-exactly-one-valid-event.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Idle state has exactly one valid event" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Idle state has exactly one valid event + +```gwt +Given the feature fixture is in place +When I get valid events from "idle" +Then the valid events contain "START" +And the valid events count is 1 +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-012-processing-state-has-exactly-two-valid-events.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-012-processing-state-has-exactly-two-valid-events.sdp.md index 46a14ab6..2d035c4b 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-012-processing-state-has-exactly-two-valid-events.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-012-processing-state-has-exactly-two-valid-events.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Processing state has exactly two valid events" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Processing state has exactly two valid events + +```gwt +Given the feature fixture is in place +When I get valid events from "processing" +Then the valid events contain all of: +And the valid events count is 2 +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-013-completed-state-has-exactly-one-valid-event.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-013-completed-state-has-exactly-one-valid-event.sdp.md index 5a17d32c..b258c7dc 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-013-completed-state-has-exactly-one-valid-event.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-013-completed-state-has-exactly-one-valid-event.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Completed state has exactly one valid event" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Completed state has exactly one valid event + +```gwt +Given the feature fixture is in place +When I get valid events from "completed" +Then the valid events contain "RESET" +And the valid events count is 1 +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-014-failed-state-has-exactly-two-valid-events.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-014-failed-state-has-exactly-two-valid-events.sdp.md index ecee5529..16f7f2be 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-014-failed-state-has-exactly-two-valid-events.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-014-failed-state-has-exactly-two-valid-events.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Failed state has exactly two valid events" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Failed state has exactly two valid events + +```gwt +Given the feature fixture is in place +When I get valid events from "failed" +Then the valid events contain all of: +And the valid events count is 2 +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-015-returns-exactly-6-transitions-with-correct-properties.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-015-returns-exactly-6-transitions-with-correct-properties.sdp.md index 4e3dbb8c..b39a508e 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-015-returns-exactly-6-transitions-with-correct-properties.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-015-returns-exactly-6-transitions-with-correct-properties.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns exactly 6 transitions with correct properties" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Returns exactly 6 transitions with correct properties + +```gwt +Given the feature fixture is in place +When I get all PM transitions +Then there are 6 transitions +And each transition has "from", "event", and "to" properties +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-016-all-expected-transitions-are-present.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-016-all-expected-transitions-are-present.sdp.md index 72b64c48..b9bfbd02 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-016-all-expected-transitions-are-present.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-016-all-expected-transitions-are-present.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "All expected transitions are present" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: All expected transitions are present + +```gwt +Given the feature fixture is in place +When I get all PM transitions +Then all expected transitions are present: +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-017-returns-same-array-reference-on-repeated-calls.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-017-returns-same-array-reference-on-repeated-calls.sdp.md index 0113aa38..0ae09782 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-017-returns-same-array-reference-on-repeated-calls.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-017-returns-same-array-reference-on-repeated-calls.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns same array reference on repeated calls" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Returns same array reference on repeated calls + +```gwt +Given the feature fixture is in place +When I get all PM transitions twice +Then both references are identical +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-018-valid-transition-returns-new-state.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-018-valid-transition-returns-new-state.sdp.md index 27d900f4..7ad035d2 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-018-valid-transition-returns-new-state.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-018-valid-transition-returns-new-state.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Valid transition returns new state" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Valid transition returns new state + +```gwt +Given the feature fixture is in place +When I assert PM transition from "idle" with "START" for "orderNotification" instance "inst-123" +Then the result state is "processing" +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-019-invalid-transition-throws-with-pm-name-and-instance-id.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-019-invalid-transition-throws-with-pm-name-and-instance-id.sdp.md index ff7cb5fc..476bdf6b 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-019-invalid-transition-throws-with-pm-name-and-instance-id.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-019-invalid-transition-throws-with-pm-name-and-instance-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Invalid transition throws with PM name and instance ID" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Invalid transition throws with PM name and instance ID + +```gwt +Given the feature fixture is in place +When the scenario runs +Then assertPMValidTransition throws for: +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-020-completed-is-terminal.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-020-completed-is-terminal.sdp.md index cf2d08b6..bd670704 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-020-completed-is-terminal.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-020-completed-is-terminal.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Completed is terminal" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Completed is terminal + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isTerminalState returns true for "completed" +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-021-non-terminal-states-return-false.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-021-non-terminal-states-return-false.sdp.md index df685678..10133da9 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-021-non-terminal-states-return-false.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-021-non-terminal-states-return-false.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Non-terminal states return false" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Non-terminal states return false + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isTerminalState returns false for: +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-022-failed-is-an-error-state.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-022-failed-is-an-error-state.sdp.md index fffc2b8d..0e0e808c 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-022-failed-is-an-error-state.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-022-failed-is-an-error-state.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Failed is an error state" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Failed is an error state + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isErrorState returns true for "failed" +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-023-non-error-states-return-false.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-023-non-error-states-return-false.sdp.md index fe8abee3..00fbea70 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-023-non-error-states-return-false.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-023-non-error-states-return-false.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Non-error states return false" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Non-error states return false + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isErrorState returns false for: +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-024-all-non-terminal-states-have-at-least-one-valid-event.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-024-all-non-terminal-states-have-at-least-one-valid-event.sdp.md index ce248b45..18528f17 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-024-all-non-terminal-states-have-at-least-one-valid-event.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-024-all-non-terminal-states-have-at-least-one-valid-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "All non-terminal states have at least one valid event" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: All non-terminal states have at least one valid event + +```gwt +Given the feature fixture is in place +When the scenario runs +Then every non-terminal state has at least one valid event +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-025-critical-reachability-paths-exist.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-025-critical-reachability-paths-exist.sdp.md index 5de81fa2..e8c860ee 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-025-critical-reachability-paths-exist.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-025-critical-reachability-paths-exist.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Critical reachability paths exist" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Critical reachability paths exist + +```gwt +Given the feature fixture is in place +When the scenario runs +Then pmTransitionState returns the expected state for: +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-026-happy-path-idle-to-processing-to-completed.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-026-happy-path-idle-to-processing-to-completed.sdp.md index 360ebc94..af38edc2 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-026-happy-path-idle-to-processing-to-completed.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-026-happy-path-idle-to-processing-to-completed.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Happy path - idle to processing to completed" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Happy path - idle to processing to completed + +```gwt +Given PM state is "idle" +When I apply events in sequence: +Then the final PM state is "completed" +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-027-failure-path-idle-to-processing-to-failed.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-027-failure-path-idle-to-processing-to-failed.sdp.md index c1917cb4..0bc3c5f0 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-027-failure-path-idle-to-processing-to-failed.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-027-failure-path-idle-to-processing-to-failed.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Failure path - idle to processing to failed" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Failure path - idle to processing to failed + +```gwt +Given PM state is "idle" +When I apply events in sequence: +Then the final PM state is "failed" +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-028-retry-workflow-idle-to-processing-to-failed-to-processing-to-completed.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-028-retry-workflow-idle-to-processing-to-failed-to-processing-to-completed.sdp.md index 7e1dabe6..efea3c51 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-028-retry-workflow-idle-to-processing-to-failed-to-processing-to-completed.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-028-retry-workflow-idle-to-processing-to-failed-to-processing-to-completed.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Retry workflow - idle to processing to failed to processing to completed" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Retry workflow - idle to processing to failed to processing to completed + +```gwt +Given PM state is "idle" +When I apply events in sequence: +Then the final PM state is "completed" +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-029-time-triggered-pm-workflow-idle-to-processing-to-completed-to-idle.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-029-time-triggered-pm-workflow-idle-to-processing-to-completed-to-idle.sdp.md index 3710e56d..61a28f29 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-029-time-triggered-pm-workflow-idle-to-processing-to-completed-to-idle.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-029-time-triggered-pm-workflow-idle-to-processing-to-completed-to-idle.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Time-triggered PM workflow - idle to processing to completed to idle" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Time-triggered PM workflow - idle to processing to completed to idle + +```gwt +Given PM state is "idle" +When I apply events in sequence: +Then the final PM state is "idle" +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-030-failed-reset-workflow-idle-to-processing-to-failed-to-idle.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-030-failed-reset-workflow-idle-to-processing-to-failed-to-idle.sdp.md index 6f0411f5..73d9a4a4 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-030-failed-reset-workflow-idle-to-processing-to-failed-to-idle.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-030-failed-reset-workflow-idle-to-processing-to-failed-to-idle.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Failed reset workflow - idle to processing to failed to idle" from packages/platform-core/tests/features/behavior/processManager/lifecycle.feature +- outcome: Executable scenario: Failed reset workflow - idle to processing to failed to idle + +```gwt +Given PM state is "idle" +When I apply events in sequence: +Then the final PM state is "idle" +``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.sdp.md index fea91982..a087c396 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.sdp.md @@ -10,4 +10,20 @@ relations: ## Intent -- outcome: a process manager lifecycle state machine so that PM state transitions are validated and auditable (test carrier: packages/platform-core/tests/features/behavior/processManager/lifecycle.feature) +- actor: a platform developer +- outcome: a process manager lifecycle state machine so that PM state transitions are validated and auditable + +## Behavior + +- rule: isPMValidTransition validates allowed transitions from idle state +- rule: isPMValidTransition validates allowed transitions from processing state +- rule: isPMValidTransition validates allowed transitions from completed state +- rule: isPMValidTransition validates allowed transitions from failed state +- rule: pmTransitionState returns the target state for valid transitions and null for invalid +- rule: getPMValidEventsFrom returns the set of valid events for each state +- rule: getAllPMTransitions returns all valid transitions in the state machine +- rule: assertPMValidTransition returns the target state or throws with PM context +- rule: isTerminalState identifies completed as the only terminal state +- rule: isErrorState identifies failed as the only error state +- rule: All non-terminal states can transition and critical paths are reachable +- rule: Typical PM workflows produce the expected state sequences diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-001-register-a-single-process-manager.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-001-register-a-single-process-manager.sdp.md index 429b85aa..9f110f1e 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-001-register-a-single-process-manager.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-001-register-a-single-process-manager.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Register a single process manager" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Register a single process manager + +```gwt +Given an empty registry +When I register the "orderNotification" process manager +Then the registry has "orderNotification" +And the registry size is 1 +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-002-register-multiple-process-managers.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-002-register-multiple-process-managers.sdp.md index 4e4126ca..84a646ca 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-002-register-multiple-process-managers.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-002-register-multiple-process-managers.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Register multiple process managers" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Register multiple process managers + +```gwt +Given an empty registry +When I register all three process managers +Then the registry size is 3 +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-003-duplicate-registration-throws-an-error.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-003-duplicate-registration-throws-an-error.sdp.md index 088a6a58..27e5e44d 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-003-duplicate-registration-throws-an-error.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-003-duplicate-registration-throws-an-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Duplicate registration throws an error" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Duplicate registration throws an error + +```gwt +Given an empty registry +When I register the "orderNotification" process manager +Then registering "orderNotification" again throws "is already registered" +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-004-get-returns-pm-by-name.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-004-get-returns-pm-by-name.sdp.md index f03be2f2..ef283d8f 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-004-get-returns-pm-by-name.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-004-get-returns-pm-by-name.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Get returns PM by name" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Get returns PM by name + +```gwt +Given a registry with orderNotification and reservationExpiration +When I get the process manager "orderNotification" +Then the returned PM name is "orderNotification" +And the returned PM trigger type is "event" +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-005-get-returns-undefined-for-unknown-pm.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-005-get-returns-undefined-for-unknown-pm.sdp.md index b7940185..f617d13f 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-005-get-returns-undefined-for-unknown-pm.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-005-get-returns-undefined-for-unknown-pm.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Get returns undefined for unknown PM" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Get returns undefined for unknown PM + +```gwt +Given a registry with orderNotification and reservationExpiration +When I get the process manager "unknownPM" +Then the returned PM is undefined +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-006-has-returns-true-for-registered-pm.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-006-has-returns-true-for-registered-pm.sdp.md index 91473ca1..791bb82b 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-006-has-returns-true-for-registered-pm.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-006-has-returns-true-for-registered-pm.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Has returns true for registered PM" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Has returns true for registered PM + +```gwt +Given an empty registry +When I register the "orderNotification" process manager +Then the registry has "orderNotification" +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-007-has-returns-false-for-unregistered-pm.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-007-has-returns-false-for-unregistered-pm.sdp.md index 9df61975..893ce41f 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-007-has-returns-false-for-unregistered-pm.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-007-has-returns-false-for-unregistered-pm.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Has returns false for unregistered PM" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Has returns false for unregistered PM + +```gwt +Given an empty registry +When the scenario runs +Then the registry does not have "unknownPM" +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md index 742f93aa..e10dbbfa 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "List returns empty array for empty registry" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: List returns empty array for empty registry + +```gwt +Given an empty registry +When the scenario runs +Then the list is empty +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-009-list-returns-all-registered-p-ms.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-009-list-returns-all-registered-p-ms.sdp.md index be83e1ae..296a4eb9 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-009-list-returns-all-registered-p-ms.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-009-list-returns-all-registered-p-ms.sdp.md @@ -6,8 +6,15 @@ readiness: idea relations: refines: spec:behavior.platform-core.process-manager.registry --- -# List returns all registered PMs +# List returns all registered projections ## Intent -- outcome: Executable scenario "List returns all registered PMs" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: List returns all registered projections + +```gwt +Given a registry with "orderSummary" and "productCatalog" projections +When I list all projections +Then the list has 2 projections +And the list contains all of: +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md index 92ca1025..9902b9b3 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Size is 0 for empty registry" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Size is 0 for empty registry + +```gwt +Given an empty registry +When the scenario runs +Then the registry size is 0 +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-011-size-reflects-registration-count.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-011-size-reflects-registration-count.sdp.md index fe893d30..f89a9e3c 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-011-size-reflects-registration-count.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-011-size-reflects-registration-count.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Size reflects registration count" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Size reflects registration count + +```gwt +Given a registry with orderNotification and reservationExpiration +When the scenario runs +Then the registry size is 2 +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-012-returns-pm-subscribed-to-a-specific-event.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-012-returns-pm-subscribed-to-a-specific-event.sdp.md index 80181055..227c9f1a 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-012-returns-pm-subscribed-to-a-specific-event.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-012-returns-pm-subscribed-to-a-specific-event.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns PM subscribed to a specific event" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Returns PM subscribed to a specific event + +```gwt +Given a fully populated registry +When I query PMs by trigger event "OrderConfirmed" +Then the trigger event result contains 1 PM +And the trigger event result includes "orderNotification" +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-013-returns-pm-for-shared-event-across-hybrid-pm.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-013-returns-pm-for-shared-event-across-hybrid-pm.sdp.md index 7b59ac19..937801a8 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-013-returns-pm-for-shared-event-across-hybrid-pm.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-013-returns-pm-for-shared-event-across-hybrid-pm.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns PM for shared event across hybrid PM" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Returns PM for shared event across hybrid PM + +```gwt +Given a fully populated registry +When I query PMs by trigger event "OrderPaid" +Then the trigger event result contains 1 PM +And the trigger event result includes "orderFulfillment" +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-014-returns-empty-for-unknown-event-type.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-014-returns-empty-for-unknown-event-type.sdp.md index fd6d3304..0c15a857 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-014-returns-empty-for-unknown-event-type.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-014-returns-empty-for-unknown-event-type.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns empty for unknown event type" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Returns empty for unknown event type + +```gwt +Given a fully populated registry +When I query PMs by trigger event "UnknownEvent" +Then the trigger event result is empty +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-015-returns-empty-for-event-matching-no-subscriptions.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-015-returns-empty-for-event-matching-no-subscriptions.sdp.md index 0909d0e7..d7cebae4 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-015-returns-empty-for-event-matching-no-subscriptions.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-015-returns-empty-for-event-matching-no-subscriptions.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns empty for event matching no subscriptions" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Returns empty for event matching no subscriptions + +```gwt +Given a fully populated registry +When I query PMs by trigger event "ReleaseReservation" +Then the trigger event result is empty +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-016-returns-empty-array-for-empty-registry.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-016-returns-empty-array-for-empty-registry.sdp.md index 81b7be86..75dc5327 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-016-returns-empty-array-for-empty-registry.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-016-returns-empty-array-for-empty-registry.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns empty array for empty registry" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Returns empty array for empty registry + +```gwt +Given an empty registry +When the scenario runs +Then getAllTriggerEvents returns an empty array +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-017-returns-unique-sorted-event-types.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-017-returns-unique-sorted-event-types.sdp.md index cb7ad57e..21809ce7 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-017-returns-unique-sorted-event-types.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-017-returns-unique-sorted-event-types.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns unique sorted event types" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Returns unique sorted event types + +```gwt +Given an empty registry +When I register the "orderNotification" process manager and I also register the "orderFulfillment" process manager +Then getAllTriggerEvents result is sorted and unique +And getAllTriggerEvents contains all of: +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-018-returns-empty-array-for-empty-registry-for-commands.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-018-returns-empty-array-for-empty-registry-for-commands.sdp.md index ace25de9..407de666 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-018-returns-empty-array-for-empty-registry-for-commands.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-018-returns-empty-array-for-empty-registry-for-commands.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns empty array for empty registry for commands" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Returns empty array for empty registry for commands + +```gwt +Given an empty registry +When the scenario runs +Then getAllEmittedCommands returns an empty array +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-019-returns-unique-sorted-command-types.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-019-returns-unique-sorted-command-types.sdp.md index 42e866df..abc6c67c 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-019-returns-unique-sorted-command-types.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-019-returns-unique-sorted-command-types.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns unique sorted command types" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Returns unique sorted command types + +```gwt +Given a fully populated registry +When the scenario runs +Then getAllEmittedCommands result is sorted and unique +And getAllEmittedCommands contains all of: +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-020-filters-by-orders-context.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-020-filters-by-orders-context.sdp.md index bbff1df3..731154b7 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-020-filters-by-orders-context.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-020-filters-by-orders-context.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Filters by orders context" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Filters by orders context + +```gwt +Given a fully populated registry +When I query PMs by context "orders" +Then the context result contains 2 PMs +And the context result includes these PM names: +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-021-filters-by-inventory-context.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-021-filters-by-inventory-context.sdp.md index 9309bbc6..9c0dc6b0 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-021-filters-by-inventory-context.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-021-filters-by-inventory-context.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Filters by inventory context" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Filters by inventory context + +```gwt +Given a fully populated registry +When I query PMs by context "inventory" +Then the context result contains 1 PM +And the context result first PM is "reservationExpiration" +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-022-returns-empty-for-unknown-context.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-022-returns-empty-for-unknown-context.sdp.md index 38ae3ceb..c1eb7572 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-022-returns-empty-for-unknown-context.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-022-returns-empty-for-unknown-context.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns empty for unknown context" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Returns empty for unknown context + +```gwt +Given a fully populated registry +When I query PMs by context "unknown" +Then the context result is empty +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-023-filters-by-event-trigger-type.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-023-filters-by-event-trigger-type.sdp.md index 4c21d173..acd4aab5 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-023-filters-by-event-trigger-type.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-023-filters-by-event-trigger-type.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Filters by event trigger type" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Filters by event trigger type + +```gwt +Given a fully populated registry +When I query PMs by trigger type "event" +Then the trigger type result contains 1 PM +And the trigger type result first PM is "orderNotification" +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-024-filters-by-time-trigger-type.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-024-filters-by-time-trigger-type.sdp.md index 372cad58..dbd49401 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-024-filters-by-time-trigger-type.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-024-filters-by-time-trigger-type.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Filters by time trigger type" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Filters by time trigger type + +```gwt +Given a fully populated registry +When I query PMs by trigger type "time" +Then the trigger type result contains 1 PM +And the trigger type result first PM is "reservationExpiration" +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-025-filters-by-hybrid-trigger-type.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-025-filters-by-hybrid-trigger-type.sdp.md index b4b5ebfd..369b827e 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-025-filters-by-hybrid-trigger-type.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-025-filters-by-hybrid-trigger-type.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Filters by hybrid trigger type" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Filters by hybrid trigger type + +```gwt +Given a fully populated registry +When I query PMs by trigger type "hybrid" +Then the trigger type result contains 1 PM +And the trigger type result first PM is "orderFulfillment" +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-026-returns-time-and-hybrid-triggered-p-ms.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-026-returns-time-and-hybrid-triggered-p-ms.sdp.md index 7eae98d7..b9490738 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-026-returns-time-and-hybrid-triggered-p-ms.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-026-returns-time-and-hybrid-triggered-p-ms.sdp.md @@ -6,8 +6,15 @@ readiness: idea relations: refines: spec:behavior.platform-core.process-manager.registry --- -# Returns time and hybrid triggered PMs +# GetByCategory returns integration projections ## Intent -- outcome: Executable scenario "Returns time and hybrid triggered PMs" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: GetByCategory returns integration projections + +```gwt +Given a registry with all five category projections +When I get projections by category "integration" +Then the category lookup returns 1 projection +And the first category lookup result is "orderWithInventory" +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-027-excludes-event-only-triggered-p-ms.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-027-excludes-event-only-triggered-p-ms.sdp.md index ef1e94a5..18b17f21 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-027-excludes-event-only-triggered-p-ms.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-027-excludes-event-only-triggered-p-ms.sdp.md @@ -6,8 +6,14 @@ readiness: idea relations: refines: spec:behavior.platform-core.process-manager.registry --- -# Excludes event-only triggered PMs +# GetByCategory returns empty when no projections match ## Intent -- outcome: Executable scenario "Excludes event-only triggered PMs" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: GetByCategory returns empty when no projections match + +```gwt +Given a registry with the "orderSummary" projection +When I get projections by category "logic" +Then the category lookup returns 0 projections +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-028-all-time-triggered-p-ms-have-cron-config.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-028-all-time-triggered-p-ms-have-cron-config.sdp.md index 06a24013..42c9c102 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-028-all-time-triggered-p-ms-have-cron-config.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-028-all-time-triggered-p-ms-have-cron-config.sdp.md @@ -6,8 +6,14 @@ readiness: idea relations: refines: spec:behavior.platform-core.process-manager.registry --- -# All time-triggered PMs have cronConfig +# GetByCategory verifies all results have requested category ## Intent -- outcome: Executable scenario "All time-triggered PMs have cronConfig" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: GetByCategory verifies all results have requested category + +```gwt +Given a registry with all five category projections +When I get projections by category "view" +Then all returned projections have category "view" +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-029-find-all-handlers-for-order-shipped-event.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-029-find-all-handlers-for-order-shipped-event.sdp.md index c4acf5cd..9400c714 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-029-find-all-handlers-for-order-shipped-event.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-029-find-all-handlers-for-order-shipped-event.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Find all handlers for OrderShipped event" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Find all handlers for OrderShipped event + +```gwt +Given an empty registry +When I register the "orderNotification" process manager and I also register the "orderFulfillment" process manager and I query PMs by trigger event "OrderShipped" +Then the trigger event result contains 1 PM +And the trigger event result includes "orderNotification" +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-030-get-all-time-triggered-p-ms-for-cron-scheduling.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-030-get-all-time-triggered-p-ms-for-cron-scheduling.sdp.md index 3e43b99d..ec1e9393 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-030-get-all-time-triggered-p-ms-for-cron-scheduling.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-030-get-all-time-triggered-p-ms-for-cron-scheduling.sdp.md @@ -6,8 +6,16 @@ readiness: idea relations: refines: spec:behavior.platform-core.process-manager.registry --- -# Get all time-triggered PMs for cron scheduling +# Category index is maintained incrementally ## Intent -- outcome: Executable scenario "Get all time-triggered PMs for cron scheduling" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Category index is maintained incrementally + +```gwt +Given an empty projection registry +When I register "orderSummary" with category "view" and I register "orderExistence" with category "logic" and I register "productCatalog" with category "view" +Then the category lookup for "view" returns 1 projection +And the category counts are: +And the category lookup for "view" returns 2 projections +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-031-pm-with-empty-subscriptions-and-commands-is-handled-correctly.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-031-pm-with-empty-subscriptions-and-commands-is-handled-correctly.sdp.md index 34d3a3d0..42b3ea4b 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-031-pm-with-empty-subscriptions-and-commands-is-handled-correctly.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-031-pm-with-empty-subscriptions-and-commands-is-handled-correctly.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "PM with empty subscriptions and commands is handled correctly" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: PM with empty subscriptions and commands is handled correctly + +```gwt +Given an empty registry +When I register a no-op time-triggered process manager +Then the registry has "noopPM" +And the registry size is 1 +And getAllTriggerEvents returns an empty array +And getAllEmittedCommands returns an empty array +And getByTriggerType "time" returns 1 PM named "noopPM" +And getTimeTriggeredPMs returns 1 PM +And querying by trigger event "SomeEvent" returns empty +``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-032-mixed-p-ms-where-some-have-empty-arrays.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-032-mixed-p-ms-where-some-have-empty-arrays.sdp.md index a4610f3e..2150cda8 100644 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-032-mixed-p-ms-where-some-have-empty-arrays.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.examples/s-032-mixed-p-ms-where-some-have-empty-arrays.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Mixed PMs where some have empty arrays" from packages/platform-core/tests/features/behavior/processManager/registry.feature +- outcome: Executable scenario: Mixed PMs where some have empty arrays + +```gwt +Given an empty registry +When I register the "orderNotification" process manager and I register a no-op time-triggered process manager +Then getAllTriggerEvents contains exactly these events: +And getAllEmittedCommands contains exactly these commands: +``` diff --git a/specs/behavior/platform-core/process-manager/registry.sdp.md b/specs/behavior/platform-core/process-manager/registry.sdp.md index 28a7b229..8237f1f3 100644 --- a/specs/behavior/platform-core/process-manager/registry.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.sdp.md @@ -10,4 +10,22 @@ relations: ## Intent -- outcome: a process manager registry with CRUD and lookup capabilities so that process managers can be registered, retrieved, and queried by various criteria (test carrier: packages/platform-core/tests/features/behavior/processManager/registry.feature) +- actor: a platform developer +- outcome: a process manager registry with CRUD and lookup capabilities so that process managers can be registered, retrieved, and queried by various criteria + +## Behavior + +- rule: register adds a process manager definition to the registry +- rule: get retrieves a process manager by name +- rule: has checks whether a process manager is registered +- rule: list returns all registered process managers +- rule: size returns the count of registered process managers +- rule: getByTriggerEvent finds PMs subscribed to a given event type +- rule: getAllTriggerEvents returns unique sorted event types from all PMs +- rule: getAllEmittedCommands returns unique sorted command types from all PMs +- rule: getByContext filters process managers by bounded context +- rule: getByTriggerType filters process managers by trigger type +- rule: getTimeTriggeredPMs returns time and hybrid triggered PMs +- rule: Event routing use case finds all handlers for an event +- rule: Cron setup use case retrieves all time-triggered PMs for scheduling +- rule: Registry handles PMs with empty event subscriptions and commands diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-001-no-correlation-strategy-uses-stream-id.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-001-no-correlation-strategy-uses-stream-id.sdp.md index 4c5fcb71..75fc5025 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-001-no-correlation-strategy-uses-stream-id.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-001-no-correlation-strategy-uses-stream-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "No correlation strategy uses streamId" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: No correlation strategy uses streamId + +```gwt +Given an event with streamId "ord_custom_id" +When I compute PM instance ID without a correlation strategy +Then the instance ID is "ord_custom_id" +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-002-correlation-property-is-extracted-from-payload.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-002-correlation-property-is-extracted-from-payload.sdp.md index 9fb606a6..c9079942 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-002-correlation-property-is-extracted-from-payload.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-002-correlation-property-is-extracted-from-payload.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Correlation property is extracted from payload" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Correlation property is extracted from payload + +```gwt +Given an event with payload property "customerId" set to "cust_888" +When I compute PM instance ID with correlation property "customerId" +Then the instance ID is "cust_888" +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-003-falls-back-to-stream-id-when-correlation-property-not-in-payload.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-003-falls-back-to-stream-id-when-correlation-property-not-in-payload.sdp.md index 6bc3d9bd..1ab144d0 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-003-falls-back-to-stream-id-when-correlation-property-not-in-payload.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-003-falls-back-to-stream-id-when-correlation-property-not-in-payload.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Falls back to streamId when correlation property not in payload" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Falls back to streamId when correlation property not in payload + +```gwt +Given an event with streamId "ord_fallback" and payload without "customerId" +When I compute PM instance ID with correlation property "customerId" +Then the instance ID is "ord_fallback" +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-004-falls-back-to-stream-id-when-correlation-property-is-not-a-string.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-004-falls-back-to-stream-id-when-correlation-property-is-not-a-string.sdp.md index bee04d42..fd56e157 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-004-falls-back-to-stream-id-when-correlation-property-is-not-a-string.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-004-falls-back-to-stream-id-when-correlation-property-is-not-a-string.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Falls back to streamId when correlation property is not a string" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Falls back to streamId when correlation property is not a string + +```gwt +Given an event with streamId "ord_fallback" and numeric payload property "numericId" +When I compute PM instance ID with correlation property "numericId" +Then the instance ID is "ord_fallback" +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-005-falls-back-to-stream-id-when-correlation-property-is-null.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-005-falls-back-to-stream-id-when-correlation-property-is-null.sdp.md index 43629814..e88ddefc 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-005-falls-back-to-stream-id-when-correlation-property-is-null.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-005-falls-back-to-stream-id-when-correlation-property-is-null.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Falls back to streamId when correlation property is null" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Falls back to streamId when correlation property is null + +```gwt +Given an event with streamId "ord_null_fallback" and null payload property "nullField" +When I compute PM instance ID with correlation property "nullField" +Then the instance ID is "ord_null_fallback" +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-006-falls-back-to-stream-id-when-correlation-property-is-undefined.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-006-falls-back-to-stream-id-when-correlation-property-is-undefined.sdp.md index 9aa74e88..2fc1b66e 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-006-falls-back-to-stream-id-when-correlation-property-is-undefined.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-006-falls-back-to-stream-id-when-correlation-property-is-undefined.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Falls back to streamId when correlation property is undefined" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Falls back to streamId when correlation property is undefined + +```gwt +Given an event with streamId "ord_undefined_fallback" and undefined payload property "undefinedField" +When I compute PM instance ID with correlation property "undefinedField" +Then the instance ID is "ord_undefined_fallback" +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-007-empty-string-correlation-property-value-is-used-as-is.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-007-empty-string-correlation-property-value-is-used-as-is.sdp.md index 8035a8cb..937ea320 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-007-empty-string-correlation-property-value-is-used-as-is.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-007-empty-string-correlation-property-value-is-used-as-is.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Empty string correlation property value is used as-is" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Empty string correlation property value is used as-is + +```gwt +Given an event with streamId "ord_fallback" and payload property "orderId" set to "" +When I compute PM instance ID with correlation property "orderId" +Then the instance ID is "" +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-008-whitespace-only-correlation-property-value-is-used-as-is.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-008-whitespace-only-correlation-property-value-is-used-as-is.sdp.md index 9cf07103..aaf09d8c 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-008-whitespace-only-correlation-property-value-is-used-as-is.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-008-whitespace-only-correlation-property-value-is-used-as-is.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Whitespace-only correlation property value is used as-is" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Whitespace-only correlation property value is used as-is + +```gwt +Given an event with streamId "ord_fallback" and payload property "orderId" set to " " +When I compute PM instance ID with correlation property "orderId" +Then the instance ID is " " +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-009-order-id-correlation-strategy-extracts-correctly.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-009-order-id-correlation-strategy-extracts-correctly.sdp.md index 789d0e8f..3b47af7b 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-009-order-id-correlation-strategy-extracts-correctly.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-009-order-id-correlation-strategy-extracts-correctly.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "orderId correlation strategy extracts correctly" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: orderId correlation strategy extracts correctly + +```gwt +Given an event with streamId "stream_123" and payload property "orderId" set to "order_specific_id" +When I compute PM instance ID with correlation property "orderId" +Then the instance ID is "order_specific_id" +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-010-subscription-name-without-context.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-010-subscription-name-without-context.sdp.md index e7bdab8e..7358a016 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-010-subscription-name-without-context.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-010-subscription-name-without-context.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Subscription name without context" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Subscription name without context + +```gwt +Given a PM definition "orderNotification" without context +When I create a PM subscription +Then the subscription name is "pm:orderNotification" +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-011-subscription-name-with-context.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-011-subscription-name-with-context.sdp.md index 302fb5dd..4f380040 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-011-subscription-name-with-context.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-011-subscription-name-with-context.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Subscription name with context" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Subscription name with context + +```gwt +Given a PM definition "orderNotification" with context "orders" +When I create a PM subscription +Then the subscription name is "pm:orders:orderNotification" +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-012-default-priority-is-200.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-012-default-priority-is-200.sdp.md index 0b49fca7..8d1b548e 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-012-default-priority-is-200.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-012-default-priority-is-200.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Default priority is 200" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Default priority is 200 + +```gwt +Given a PM definition "orderNotification" without context +When I create a PM subscription +Then the subscription priority is 200 +And the subscription priority equals DEFAULT_PM_SUBSCRIPTION_PRIORITY +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-013-custom-priority-overrides-default.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-013-custom-priority-overrides-default.sdp.md index aedbf12c..96354e0a 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-013-custom-priority-overrides-default.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-013-custom-priority-overrides-default.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Custom priority overrides default" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Custom priority overrides default + +```gwt +Given a PM definition "orderNotification" without context +When I create a PM subscription with priority 150 +Then the subscription priority is 150 +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-014-filters-by-event-types-from-pm-definition.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-014-filters-by-event-types-from-pm-definition.sdp.md index 541157fc..97ad87d1 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-014-filters-by-event-types-from-pm-definition.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-014-filters-by-event-types-from-pm-definition.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Filters by event types from PM definition" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Filters by event types from PM definition + +```gwt +Given a PM definition "orderNotification" subscribing to events: +When I create a PM subscription +Then the subscription filters by event types: +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-015-creates-mutable-copy-of-event-types.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-015-creates-mutable-copy-of-event-types.sdp.md index fef37656..e7a0c320 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-015-creates-mutable-copy-of-event-types.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-015-creates-mutable-copy-of-event-types.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Creates mutable copy of event types" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Creates mutable copy of event types + +```gwt +Given a PM definition "orderNotification" subscribing to events: +When I create a PM subscription +Then the filter event types are a copy not the original reference +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-016-default-to-handler-args-produces-correct-output.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-016-default-to-handler-args-produces-correct-output.sdp.md index c158a81e..f4a4fc60 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-016-default-to-handler-args-produces-correct-output.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-016-default-to-handler-args-produces-correct-output.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Default toHandlerArgs produces correct output" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Default toHandlerArgs produces correct output + +```gwt +Given a PM definition "orderNotification" without correlation strategy +And a test event for handler args transformation +And a correlation chain with correlationId "corr_001" +When I create a PM subscription and call toHandlerArgs +Then the handler args contain instanceId "ord_456" +And the handler args contain eventId "evt_test" +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-017-instance-id-from-correlation-strategy.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-017-instance-id-from-correlation-strategy.sdp.md index 30603765..221d3826 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-017-instance-id-from-correlation-strategy.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-017-instance-id-from-correlation-strategy.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "instanceId from correlation strategy" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: instanceId from correlation strategy + +```gwt +Given a PM definition with correlation property "orderId" +And an event in stream "stream_different" with payload property "orderId" set to "ord_from_payload" +And a correlation chain with correlationId "corr_001" +When I create a PM subscription and call toHandlerArgs +Then the handler args contain instanceId "ord_from_payload" +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-018-custom-to-handler-args-transformer-is-used.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-018-custom-to-handler-args-transformer-is-used.sdp.md index 15c970ec..3204cf58 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-018-custom-to-handler-args-transformer-is-used.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-018-custom-to-handler-args-transformer-is-used.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Custom toHandlerArgs transformer is used" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Custom toHandlerArgs transformer is used + +```gwt +Given a PM definition "orderNotification" with a custom toHandlerArgs transformer +And an event in stream "ord_123" +And a correlation chain with correlationId "corr_001" +When I create a PM subscription and call toHandlerArgs +Then the custom transformer was called with the event and instanceId "ord_123" +And the handler args contain customField "custom_value" +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-019-default-partition-by-instance-id.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-019-default-partition-by-instance-id.sdp.md index 2b41312e..d2a11c4b 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-019-default-partition-by-instance-id.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-019-default-partition-by-instance-id.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Default partition by instanceId" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Default partition by instanceId + +```gwt +Given a PM definition "orderNotification" without correlation strategy +And an event with streamId "ord_partition_test" +When I create a PM subscription and call getPartitionKey +Then the partition key name is "instanceId" +And the partition key value is "ord_partition_test" +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-020-correlation-strategy-affects-partition-key.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-020-correlation-strategy-affects-partition-key.sdp.md index 37163593..f63ec6c1 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-020-correlation-strategy-affects-partition-key.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-020-correlation-strategy-affects-partition-key.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Correlation strategy affects partition key" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Correlation strategy affects partition key + +```gwt +Given a PM definition with correlation property "customerId" +And an event with payload property "customerId" set to "cust_partition" +When I create a PM subscription and call getPartitionKey +Then the partition key name is "instanceId" +And the partition key value is "cust_partition" +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-021-custom-get-partition-key-is-used.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-021-custom-get-partition-key-is-used.sdp.md index dd8eb0c0..8f015877 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-021-custom-get-partition-key-is-used.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-021-custom-get-partition-key-is-used.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Custom getPartitionKey is used" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Custom getPartitionKey is used + +```gwt +Given a PM definition "orderNotification" with a custom getPartitionKey +And an event with streamId "ord_custom" +When I create a PM subscription and call getPartitionKey +Then the custom getPartitionKey was called with the event and instanceId "ord_custom" +And the partition key name is "customPartition" +And the partition key value is "custom:ord_custom" +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-022-handler-reference-is-passed-through.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-022-handler-reference-is-passed-through.sdp.md index 9aeb1726..c8e7e88a 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-022-handler-reference-is-passed-through.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-022-handler-reference-is-passed-through.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Handler reference is passed through" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Handler reference is passed through + +```gwt +Given a PM definition "orderNotification" without context +When I create a PM subscription +Then the subscription handler is the same reference as the input handler +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-023-bulk-creation-produces-correct-subscription-names.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-023-bulk-creation-produces-correct-subscription-names.sdp.md index 57aefde9..f7bd26b4 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-023-bulk-creation-produces-correct-subscription-names.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-023-bulk-creation-produces-correct-subscription-names.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Bulk creation produces correct subscription names" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Bulk creation produces correct subscription names + +```gwt +Given PM definitions: +When I create PM subscriptions in bulk +Then there are 2 subscriptions +And the subscription names are: +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-024-missing-handler-throws-error.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-024-missing-handler-throws-error.sdp.md index 2044f2b7..f694ade6 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-024-missing-handler-throws-error.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-024-missing-handler-throws-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Missing handler throws error" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Missing handler throws error + +```gwt +Given PM definitions: +When I create PM subscriptions with only "orderNotification" handler +Then it throws an error about missing handler for "orderAnalytics" +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-025-common-priority-applies-to-all-subscriptions.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-025-common-priority-applies-to-all-subscriptions.sdp.md index da918d3a..434e1f83 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-025-common-priority-applies-to-all-subscriptions.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-025-common-priority-applies-to-all-subscriptions.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Common priority applies to all subscriptions" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Common priority applies to all subscriptions + +```gwt +Given PM definitions: +When I create PM subscriptions in bulk with priority 250 +Then all subscriptions have priority 250 +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-026-each-subscription-has-correct-event-filter.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-026-each-subscription-has-correct-event-filter.sdp.md index 22a3873e..3d0625e9 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-026-each-subscription-has-correct-event-filter.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-026-each-subscription-has-correct-event-filter.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Each subscription has correct event filter" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Each subscription has correct event filter + +```gwt +Given PM definitions: +When I create PM subscriptions in bulk +Then subscription 0 filters by events "OrderConfirmed" +And subscription 1 also filters by events "OrderConfirmed,OrderShipped" +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-027-empty-definitions-produces-empty-subscriptions.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-027-empty-definitions-produces-empty-subscriptions.sdp.md index 45c907f3..8a4bf4ce 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-027-empty-definitions-produces-empty-subscriptions.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-027-empty-definitions-produces-empty-subscriptions.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Empty definitions produces empty subscriptions" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Empty definitions produces empty subscriptions + +```gwt +Given the feature fixture is in place +When I create PM subscriptions with no definitions +Then there are 0 subscriptions +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-028-handlers-match-their-definitions.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-028-handlers-match-their-definitions.sdp.md index 92856930..c901322c 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-028-handlers-match-their-definitions.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-028-handlers-match-their-definitions.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Handlers match their definitions" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Handlers match their definitions + +```gwt +Given PM definitions: +When I create PM subscriptions in bulk +Then subscription 0 handler is the "orderNotification" mock handler +And subscription 1 also uses the "orderAnalytics" mock handler +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-029-default-priority-constant-is-200.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-029-default-priority-constant-is-200.sdp.md index a65fdb62..fe9f1eee 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-029-default-priority-constant-is-200.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-029-default-priority-constant-is-200.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Default priority constant is 200" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Default priority constant is 200 + +```gwt +Given the feature fixture is in place +When the scenario runs +Then DEFAULT_PM_SUBSCRIPTION_PRIORITY is 200 +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-030-priority-is-after-projections-and-before-sagas.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-030-priority-is-after-projections-and-before-sagas.sdp.md index 5aabe2dc..da6d8ffe 100644 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-030-priority-is-after-projections-and-before-sagas.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.examples/s-030-priority-is-after-projections-and-before-sagas.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Priority is after projections and before sagas" from packages/platform-core/tests/features/behavior/processManager/subscription.feature +- outcome: Executable scenario: Priority is after projections and before sagas + +```gwt +Given the feature fixture is in place +When the scenario runs +Then DEFAULT_PM_SUBSCRIPTION_PRIORITY is greater than projection priority 100 +And DEFAULT_PM_SUBSCRIPTION_PRIORITY is less than saga priority 300 +``` diff --git a/specs/behavior/platform-core/process-manager/subscription.sdp.md b/specs/behavior/platform-core/process-manager/subscription.sdp.md index 9fb75898..7028939b 100644 --- a/specs/behavior/platform-core/process-manager/subscription.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.sdp.md @@ -10,4 +10,30 @@ relations: ## Intent -- outcome: PM subscription helpers for EventBus registration so that process managers can subscribe to domain events with correct instance routing (test carrier: packages/platform-core/tests/features/behavior/processManager/subscription.feature) +- actor: a platform developer +- outcome: PM subscription helpers for EventBus registration so that process managers can subscribe to domain events with correct instance routing + +## Behavior + +- rule: computePMInstanceId returns streamId when no correlation strategy +- rule: computePMInstanceId extracts correlation property from payload +- rule: computePMInstanceId falls back to streamId for invalid correlation values +- rule: computePMInstanceId accepts edge-case string values +- rule: createPMSubscription generates correct subscription names +- rule: createPMSubscription configures priority correctly +- rule: createPMSubscription filters by PM event types +- rule: createPMSubscription transforms handler args with default transformer +- rule: createPMSubscription computes instanceId from correlation strategy +- rule: createPMSubscription supports custom toHandlerArgs transformer +- rule: createPMSubscription partitions by instanceId by default +- rule: createPMSubscription uses correlation strategy for partition key +- rule: createPMSubscription supports custom getPartitionKey +- rule: createPMSubscription passes handler reference through +- rule: createPMSubscriptions creates subscriptions for all definitions +- rule: createPMSubscriptions throws on missing handler +- rule: createPMSubscriptions applies common options to all +- rule: createPMSubscriptions creates correct event filters +- rule: createPMSubscriptions handles empty definitions +- rule: createPMSubscriptions passes handlers correctly +- rule: DEFAULT_PM_SUBSCRIPTION_PRIORITY has value 200 +- rule: DEFAULT_PM_SUBSCRIPTION_PRIORITY is between projections and sagas diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-001-all-valid-pm-statuses-are-accepted.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-001-all-valid-pm-statuses-are-accepted.sdp.md index 2f7e4cc9..f843be4f 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-001-all-valid-pm-statuses-are-accepted.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-001-all-valid-pm-statuses-are-accepted.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "All valid PM statuses are accepted" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: All valid PM statuses are accepted + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isProcessManagerStatus returns true for all of: +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-002-every-entry-in-process-manager-statuses-passes-the-guard.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-002-every-entry-in-process-manager-statuses-passes-the-guard.sdp.md index 8702173d..e94de09f 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-002-every-entry-in-process-manager-statuses-passes-the-guard.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-002-every-entry-in-process-manager-statuses-passes-the-guard.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Every entry in PROCESS_MANAGER_STATUSES passes the guard" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: Every entry in PROCESS_MANAGER_STATUSES passes the guard + +```gwt +Given the feature fixture is in place +When the scenario runs +Then every value in PROCESS_MANAGER_STATUSES passes isProcessManagerStatus +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-003-invalid-status-strings-are-rejected.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-003-invalid-status-strings-are-rejected.sdp.md index 478dd7e3..56cad649 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-003-invalid-status-strings-are-rejected.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-003-invalid-status-strings-are-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Invalid status strings are rejected" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: Invalid status strings are rejected + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isProcessManagerStatus returns false for strings: +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-004-non-string-values-are-rejected-by-is-process-manager-status.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-004-non-string-values-are-rejected-by-is-process-manager-status.sdp.md index e201575a..e9764bb5 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-004-non-string-values-are-rejected-by-is-process-manager-status.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-004-non-string-values-are-rejected-by-is-process-manager-status.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Non-string values are rejected by isProcessManagerStatus" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: Non-string values are rejected by isProcessManagerStatus + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isProcessManagerStatus returns false for non-string values +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-005-arrays-containing-valid-statuses-are-rejected-by-is-process-manager-status.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-005-arrays-containing-valid-statuses-are-rejected-by-is-process-manager-status.sdp.md index 4030c0f8..c811658c 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-005-arrays-containing-valid-statuses-are-rejected-by-is-process-manager-status.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-005-arrays-containing-valid-statuses-are-rejected-by-is-process-manager-status.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Arrays containing valid statuses are rejected by isProcessManagerStatus" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: Arrays containing valid statuses are rejected by isProcessManagerStatus + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isProcessManagerStatus returns false for arrays of valid statuses +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-006-is-process-manager-status-is-case-sensitive.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-006-is-process-manager-status-is-case-sensitive.sdp.md index a3031cdd..025c3d10 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-006-is-process-manager-status-is-case-sensitive.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-006-is-process-manager-status-is-case-sensitive.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isProcessManagerStatus is case-sensitive" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: isProcessManagerStatus is case-sensitive + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isProcessManagerStatus returns false for case variants: +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-007-type-narrowing-works-in-conditionals.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-007-type-narrowing-works-in-conditionals.sdp.md index bf3b17b5..9c6d7708 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-007-type-narrowing-works-in-conditionals.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-007-type-narrowing-works-in-conditionals.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Type narrowing works in conditionals" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: Type narrowing works in conditionals + +```gwt +Given an unknown value "processing" +When I check isProcessManagerStatus on the value +Then the narrowed PM status equals "processing" +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-008-type-guard-works-as-array-filter-predicate.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-008-type-guard-works-as-array-filter-predicate.sdp.md index c887d6a9..47eac07b 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-008-type-guard-works-as-array-filter-predicate.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-008-type-guard-works-as-array-filter-predicate.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Type guard works as array filter predicate" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: Type guard works as array filter predicate + +```gwt +Given an array of mixed values including PM statuses +When I filter the array with isProcessManagerStatus +Then the filtered PM result contains exactly: +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-009-process-manager-statuses-contains-exactly-4-statuses-in-order.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-009-process-manager-statuses-contains-exactly-4-statuses-in-order.sdp.md index d0fdd566..87c3fce7 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-009-process-manager-statuses-contains-exactly-4-statuses-in-order.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-009-process-manager-statuses-contains-exactly-4-statuses-in-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "PROCESS_MANAGER_STATUSES contains exactly 4 statuses in order" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: PROCESS_MANAGER_STATUSES contains exactly 4 statuses in order + +```gwt +Given the feature fixture is in place +When the scenario runs +Then PROCESS_MANAGER_STATUSES equals exactly: +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-010-process-manager-statuses-is-a-readonly-array-with-correct-bounds.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-010-process-manager-statuses-is-a-readonly-array-with-correct-bounds.sdp.md index 13b094e4..5ccbf842 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-010-process-manager-statuses-is-a-readonly-array-with-correct-bounds.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-010-process-manager-statuses-is-a-readonly-array-with-correct-bounds.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "PROCESS_MANAGER_STATUSES is a readonly array with correct bounds" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: PROCESS_MANAGER_STATUSES is a readonly array with correct bounds + +```gwt +Given the feature fixture is in place +When the scenario runs +Then PROCESS_MANAGER_STATUSES first element is "idle" +And PROCESS_MANAGER_STATUSES last element is "failed" +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-011-process-manager-statuses-contains-all-lifecycle-states.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-011-process-manager-statuses-contains-all-lifecycle-states.sdp.md index c779765d..a20cd72c 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-011-process-manager-statuses-contains-all-lifecycle-states.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-011-process-manager-statuses-contains-all-lifecycle-states.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "PROCESS_MANAGER_STATUSES contains all lifecycle states" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: PROCESS_MANAGER_STATUSES contains all lifecycle states + +```gwt +Given the feature fixture is in place +When the scenario runs +Then PROCESS_MANAGER_STATUSES contains all of: +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-012-process-manager-statuses-is-in-logical-lifecycle-order.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-012-process-manager-statuses-is-in-logical-lifecycle-order.sdp.md index 552bec3b..bf4a77a0 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-012-process-manager-statuses-is-in-logical-lifecycle-order.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-012-process-manager-statuses-is-in-logical-lifecycle-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "PROCESS_MANAGER_STATUSES is in logical lifecycle order" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: PROCESS_MANAGER_STATUSES is in logical lifecycle order + +```gwt +Given the feature fixture is in place +When the scenario runs +Then PM statuses are in lifecycle order: +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-013-all-valid-dead-letter-statuses-are-accepted.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-013-all-valid-dead-letter-statuses-are-accepted.sdp.md index 03e5de24..deb870b1 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-013-all-valid-dead-letter-statuses-are-accepted.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-013-all-valid-dead-letter-statuses-are-accepted.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "All valid dead letter statuses are accepted" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: All valid dead letter statuses are accepted + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isDeadLetterStatus returns true for all of: +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-014-every-entry-in-dead-letter-statuses-passes-the-guard.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-014-every-entry-in-dead-letter-statuses-passes-the-guard.sdp.md index 250cbfa4..6ab6aefe 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-014-every-entry-in-dead-letter-statuses-passes-the-guard.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-014-every-entry-in-dead-letter-statuses-passes-the-guard.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Every entry in DEAD_LETTER_STATUSES passes the guard" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: Every entry in DEAD_LETTER_STATUSES passes the guard + +```gwt +Given the feature fixture is in place +When the scenario runs +Then every value in DEAD_LETTER_STATUSES passes isDeadLetterStatus +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-015-invalid-status-strings-are-rejected-by-is-dead-letter-status.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-015-invalid-status-strings-are-rejected-by-is-dead-letter-status.sdp.md index 184355f7..2a1fec74 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-015-invalid-status-strings-are-rejected-by-is-dead-letter-status.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-015-invalid-status-strings-are-rejected-by-is-dead-letter-status.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Invalid status strings are rejected by isDeadLetterStatus" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: Invalid status strings are rejected by isDeadLetterStatus + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isDeadLetterStatus returns false for strings: +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-016-pm-statuses-are-rejected-by-is-dead-letter-status.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-016-pm-statuses-are-rejected-by-is-dead-letter-status.sdp.md index 93d2c87d..2740f95f 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-016-pm-statuses-are-rejected-by-is-dead-letter-status.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-016-pm-statuses-are-rejected-by-is-dead-letter-status.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "PM statuses are rejected by isDeadLetterStatus" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: PM statuses are rejected by isDeadLetterStatus + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isDeadLetterStatus returns false for PM-domain statuses: +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-017-non-string-values-are-rejected-by-is-dead-letter-status.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-017-non-string-values-are-rejected-by-is-dead-letter-status.sdp.md index ab6e0ad3..fd87ebb3 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-017-non-string-values-are-rejected-by-is-dead-letter-status.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-017-non-string-values-are-rejected-by-is-dead-letter-status.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Non-string values are rejected by isDeadLetterStatus" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: Non-string values are rejected by isDeadLetterStatus + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isDeadLetterStatus returns false for non-string values +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-018-arrays-containing-valid-dl-statuses-are-rejected.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-018-arrays-containing-valid-dl-statuses-are-rejected.sdp.md index 29d637d5..deb3d3c8 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-018-arrays-containing-valid-dl-statuses-are-rejected.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-018-arrays-containing-valid-dl-statuses-are-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Arrays containing valid DL statuses are rejected" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: Arrays containing valid DL statuses are rejected + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isDeadLetterStatus returns false for arrays of valid DL statuses +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-019-is-dead-letter-status-is-case-sensitive.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-019-is-dead-letter-status-is-case-sensitive.sdp.md index d2ab5443..b6c90ca8 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-019-is-dead-letter-status-is-case-sensitive.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-019-is-dead-letter-status-is-case-sensitive.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isDeadLetterStatus is case-sensitive" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: isDeadLetterStatus is case-sensitive + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isDeadLetterStatus returns false for case variants: +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-020-dl-type-narrowing-works-in-conditionals.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-020-dl-type-narrowing-works-in-conditionals.sdp.md index b567a5c1..3ae97695 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-020-dl-type-narrowing-works-in-conditionals.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-020-dl-type-narrowing-works-in-conditionals.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "DL type narrowing works in conditionals" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: DL type narrowing works in conditionals + +```gwt +Given an unknown value "replayed" +When I check isDeadLetterStatus on the value +Then the narrowed DL status equals "replayed" +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-021-dl-type-guard-works-as-array-filter-predicate.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-021-dl-type-guard-works-as-array-filter-predicate.sdp.md index 24cde1b9..6ba15503 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-021-dl-type-guard-works-as-array-filter-predicate.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-021-dl-type-guard-works-as-array-filter-predicate.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "DL type guard works as array filter predicate" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: DL type guard works as array filter predicate + +```gwt +Given an array of mixed values including DL statuses +When I filter the array with isDeadLetterStatus +Then the filtered DL result contains exactly: +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-022-dead-letter-statuses-contains-exactly-3-statuses-in-order.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-022-dead-letter-statuses-contains-exactly-3-statuses-in-order.sdp.md index 3feba699..60697969 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-022-dead-letter-statuses-contains-exactly-3-statuses-in-order.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-022-dead-letter-statuses-contains-exactly-3-statuses-in-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "DEAD_LETTER_STATUSES contains exactly 3 statuses in order" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: DEAD_LETTER_STATUSES contains exactly 3 statuses in order + +```gwt +Given the feature fixture is in place +When the scenario runs +Then DEAD_LETTER_STATUSES equals exactly: +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-023-dead-letter-statuses-is-a-readonly-array-with-correct-bounds.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-023-dead-letter-statuses-is-a-readonly-array-with-correct-bounds.sdp.md index b8c1c7e5..dccf6d5f 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-023-dead-letter-statuses-is-a-readonly-array-with-correct-bounds.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-023-dead-letter-statuses-is-a-readonly-array-with-correct-bounds.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "DEAD_LETTER_STATUSES is a readonly array with correct bounds" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: DEAD_LETTER_STATUSES is a readonly array with correct bounds + +```gwt +Given the feature fixture is in place +When the scenario runs +Then DEAD_LETTER_STATUSES first element is "pending" +And DEAD_LETTER_STATUSES last element is "ignored" +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-024-dead-letter-statuses-contains-all-dead-letter-states.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-024-dead-letter-statuses-contains-all-dead-letter-states.sdp.md index e766b7c3..1859efa4 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-024-dead-letter-statuses-contains-all-dead-letter-states.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-024-dead-letter-statuses-contains-all-dead-letter-states.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "DEAD_LETTER_STATUSES contains all dead letter states" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: DEAD_LETTER_STATUSES contains all dead letter states + +```gwt +Given the feature fixture is in place +When the scenario runs +Then DEAD_LETTER_STATUSES contains all of: +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-025-dead-letter-statuses-is-in-logical-workflow-order.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-025-dead-letter-statuses-is-in-logical-workflow-order.sdp.md index 5387db84..513c1440 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-025-dead-letter-statuses-is-in-logical-workflow-order.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-025-dead-letter-statuses-is-in-logical-workflow-order.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "DEAD_LETTER_STATUSES is in logical workflow order" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: DEAD_LETTER_STATUSES is in logical workflow order + +```gwt +Given the feature fixture is in place +When the scenario runs +Then DL statuses are in workflow order: +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-026-full-dead-letter-with-all-fields-has-correct-structure.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-026-full-dead-letter-with-all-fields-has-correct-structure.sdp.md index 11c19dc4..5d72ab59 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-026-full-dead-letter-with-all-fields-has-correct-structure.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-026-full-dead-letter-with-all-fields-has-correct-structure.sdp.md @@ -10,4 +10,19 @@ relations: ## Intent -- outcome: Executable scenario "Full dead letter with all fields has correct structure" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: Full dead letter with all fields has correct structure + +```gwt +Given a dead letter with all fields populated +When the scenario runs +Then the dead letter has processManagerName "testPM" +And the dead letter has instanceId "inst-123" +And the dead letter has eventId "evt-456" +And the dead letter has error "Command execution failed" +And the dead letter has attemptCount 3 +And the dead letter has status "pending" +And the dead letter failedCommand has commandType "SendNotification" +And the dead letter failedCommand has payload with orderId "ord-789" +And the dead letter has context with retryable true +And the dead letter has a positive failedAt timestamp +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-027-dead-letter-with-only-required-fields-has-undefined-optionals.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-027-dead-letter-with-only-required-fields-has-undefined-optionals.sdp.md index cbaf4fd2..3c84397b 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-027-dead-letter-with-only-required-fields-has-undefined-optionals.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-027-dead-letter-with-only-required-fields-has-undefined-optionals.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Dead letter with only required fields has undefined optionals" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: Dead letter with only required fields has undefined optionals + +```gwt +Given a dead letter with only required fields +When the scenario runs +Then the dead letter eventId is undefined +And the dead letter failedCommand is undefined +And the dead letter context is undefined +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-028-dead-letter-supports-each-status-individually.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-028-dead-letter-supports-each-status-individually.sdp.md index f06aed0e..0182f549 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-028-dead-letter-supports-each-status-individually.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-028-dead-letter-supports-each-status-individually.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Dead letter supports each status individually" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: Dead letter supports each status individually + +```gwt +Given the feature fixture is in place +When the scenario runs +Then a dead letter can be created with each status: +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-029-failed-command-captures-command-type-and-complex-payload.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-029-failed-command-captures-command-type-and-complex-payload.sdp.md index 0c0de9af..e9254236 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-029-failed-command-captures-command-type-and-complex-payload.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-029-failed-command-captures-command-type-and-complex-payload.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "failedCommand captures command type and complex payload" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: failedCommand captures command type and complex payload + +```gwt +Given a dead letter with a complex failedCommand +When the scenario runs +Then the dead letter failedCommand is defined +And the failedCommand commandType is "SendOrderConfirmation" +And the failedCommand payload has orderId "ord-123" +And the failedCommand payload has customerId "cust-456" +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-030-failed-command-allows-empty-payload.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-030-failed-command-allows-empty-payload.sdp.md index ad638876..0d79e1de 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-030-failed-command-allows-empty-payload.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-030-failed-command-allows-empty-payload.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "failedCommand allows empty payload" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: failedCommand allows empty payload + +```gwt +Given a dead letter with an empty failedCommand payload +When the scenario runs +Then the dead letter failedCommand payload is an empty object +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-031-dead-letter-handles-high-attempt-count.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-031-dead-letter-handles-high-attempt-count.sdp.md index 58c02a17..c80f2d85 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-031-dead-letter-handles-high-attempt-count.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-031-dead-letter-handles-high-attempt-count.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Dead letter handles high attempt count" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: Dead letter handles high attempt count + +```gwt +Given a dead letter with attemptCount 999 +When the scenario runs +Then the dead letter has attemptCount 999 +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-032-dead-letter-handles-long-error-messages.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-032-dead-letter-handles-long-error-messages.sdp.md index 391431e1..f1546faa 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-032-dead-letter-handles-long-error-messages.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-032-dead-letter-handles-long-error-messages.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Dead letter handles long error messages" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: Dead letter handles long error messages + +```gwt +Given a dead letter with a long error message +When the scenario runs +Then the dead letter error matches the long error message +``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-033-dead-letter-handles-complex-context-objects.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-033-dead-letter-handles-complex-context-objects.sdp.md index c74d9fb2..a28eb394 100644 --- a/specs/behavior/platform-core/process-manager/types.examples/s-033-dead-letter-handles-complex-context-objects.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.examples/s-033-dead-letter-handles-complex-context-objects.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Dead letter handles complex context objects" from packages/platform-core/tests/features/behavior/processManager/types.feature +- outcome: Executable scenario: Dead letter handles complex context objects + +```gwt +Given a dead letter with a complex context object +When the scenario runs +Then the dead letter context has correlationId "corr-123" +And the dead letter context has a metadata property +And the dead letter context has a tags property +``` diff --git a/specs/behavior/platform-core/process-manager/types.sdp.md b/specs/behavior/platform-core/process-manager/types.sdp.md index 646f4a32..69bd4d41 100644 --- a/specs/behavior/platform-core/process-manager/types.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.sdp.md @@ -10,4 +10,20 @@ relations: ## Intent -- outcome: type guards and constants for process manager runtime types so that status values are validated at runtime with full type narrowing (test carrier: packages/platform-core/tests/features/behavior/processManager/types.feature) +- actor: a platform developer +- outcome: type guards and constants for process manager runtime types so that status values are validated at runtime with full type narrowing + +## Behavior + +- rule: isProcessManagerStatus returns true for all valid PM statuses +- rule: isProcessManagerStatus rejects invalid values +- rule: isProcessManagerStatus supports TypeScript type narrowing +- rule: PROCESS_MANAGER_STATUSES exports the canonical PM status list +- rule: isDeadLetterStatus returns true for all valid dead letter statuses +- rule: isDeadLetterStatus rejects invalid values +- rule: isDeadLetterStatus supports TypeScript type narrowing +- rule: DEAD_LETTER_STATUSES exports the canonical dead letter status list +- rule: ProcessManagerDeadLetter has correct structure with all fields +- rule: ProcessManagerDeadLetter supports all dead letter statuses +- rule: ProcessManagerDeadLetter failedCommand captures type and payload +- rule: ProcessManagerDeadLetter handles edge cases diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-001-process-event-when-no-pm-state-exists.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-001-process-event-when-no-pm-state-exists.sdp.md index 6bfdbad0..b9ef1290 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-001-process-event-when-no-pm-state-exists.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-001-process-event-when-no-pm-state-exists.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Process event when no PM state exists" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature +- outcome: Executable scenario: Process event when no PM state exists + +```gwt +Given no PM state exists for "orderNotification" instance "ord_123" +When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" +Then the PM result status is "processed" +And the PM result commandsEmitted contains: +And the process callback was invoked 1 time +And the emitCommands callback was invoked 1 time +And the emitted commands list has 1 entry +``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md index 32647a6c..1d99e745 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Process event when globalPosition exceeds checkpoint" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature +- outcome: Executable scenario: Process event when globalPosition exceeds checkpoint + +```gwt +Given a PM state exists for "orderNotification" instance "ord_123" at position 1000 with status "idle" +When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 2000 event "evt_002" correlation "corr_002" +Then the PM result status is "processed" +And the process callback was invoked 1 time +``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-003-pm-state-is-updated-after-processing.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-003-pm-state-is-updated-after-processing.sdp.md index 37699bac..f2968203 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-003-pm-state-is-updated-after-processing.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-003-pm-state-is-updated-after-processing.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "PM state is updated after processing" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature +- outcome: Executable scenario: PM state is updated after processing + +```gwt +Given no PM state exists for "orderNotification" instance "ord_123" +When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" +Then the saved PM state for "orderNotification" instance "ord_123" has fields: +``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md index e713893e..7d5a2564 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Skip event when globalPosition equals checkpoint" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature +- outcome: Executable scenario: Skip event when globalPosition equals checkpoint + +```gwt +Given a PM state exists for "orderNotification" instance "ord_123" at position 1000 with status "idle" +When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" +Then the PM result status is "skipped" +And the PM result skip reason is "already_processed" +And the process callback was not invoked +And the emitCommands callback was not invoked +``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md index bcd62ad9..0490b4fa 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Skip event when globalPosition is less than checkpoint" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature +- outcome: Executable scenario: Skip event when globalPosition is less than checkpoint + +```gwt +Given a PM state exists for "orderNotification" instance "ord_123" at position 2000 with status "idle" +When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" +Then the PM result status is "skipped" +And the PM result skip reason is "already_processed" +And the process callback was not invoked +``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-006-skip-event-when-pm-is-in-completed-state.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-006-skip-event-when-pm-is-in-completed-state.sdp.md index a97c3876..cbb333a1 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-006-skip-event-when-pm-is-in-completed-state.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-006-skip-event-when-pm-is-in-completed-state.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Skip event when PM is in completed state" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature +- outcome: Executable scenario: Skip event when PM is in completed state + +```gwt +Given a PM state exists for "orderNotification" instance "ord_123" at position 1000 with status "completed" +When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 2000 event "evt_002" correlation "corr_002" +Then the PM result status is "skipped" +And the PM result skip reason is "terminal_state" +And the process callback was not invoked +``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-007-separate-instances-are-processed-independently.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-007-separate-instances-are-processed-independently.sdp.md index e2e22d17..6f5779bc 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-007-separate-instances-are-processed-independently.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-007-separate-instances-are-processed-independently.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Separate instances are processed independently" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature +- outcome: Executable scenario: Separate instances are processed independently + +```gwt +Given no PM state exists for "orderNotification" instance "ord_001" +And no PM state exists for "orderNotification" instance "ord_002" +When I call withPMCheckpoint with pm "orderNotification" instance "ord_001" position 1000 event "evt_001" correlation "corr_001" and I call withPMCheckpoint with pm "orderNotification" instance "ord_002" position 500 event "evt_002" correlation… +Then the saved PM state for "orderNotification" instance "ord_001" has lastGlobalPosition 1000 +And the saved PM state for "orderNotification" instance "ord_002" has lastGlobalPosition 500 +``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-008-retry-succeeds-after-emit-commands-failure.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-008-retry-succeeds-after-emit-commands-failure.sdp.md index 3dbc97e9..8825bc2a 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-008-retry-succeeds-after-emit-commands-failure.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-008-retry-succeeds-after-emit-commands-failure.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Retry succeeds after emitCommands failure" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature +- outcome: Executable scenario: Retry succeeds after emitCommands failure + +```gwt +Given no PM state exists for "orderNotification" instance "ord_123" +When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 100 event "evt_001" correlation "corr_001" and emitCommands fails on first call and I retry withPMCheckpoint with pm "orderNotification" instance "ord_123" pos… +Then the first call PM result status is "failed" +And the first call PM result error contains "queue unavailable" +And the saved PM state for "orderNotification" instance "ord_123" has status "failed" +And the retry PM result status is "processed" +And the retry PM result commandsEmitted contains: +And the emitted commands list has 1 entry +``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-009-retry-succeeds-when-pm-is-stuck-in-processing-state.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-009-retry-succeeds-when-pm-is-stuck-in-processing-state.sdp.md index e8247c53..f2158400 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-009-retry-succeeds-when-pm-is-stuck-in-processing-state.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-009-retry-succeeds-when-pm-is-stuck-in-processing-state.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Retry succeeds when PM is stuck in processing state" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature +- outcome: Executable scenario: Retry succeeds when PM is stuck in processing state + +```gwt +Given a PM state exists for "orderNotification" instance "ord_123" at position 100 with status "processing" +When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 100 event "evt_001" correlation "corr_001" +Then the PM result status is "processed" +And the PM result commandsEmitted contains: +And the emitted commands list has 1 entry +``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-010-reject-negative-global-position.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-010-reject-negative-global-position.sdp.md index bd6919ca..0ef9a072 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-010-reject-negative-global-position.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-010-reject-negative-global-position.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Reject negative globalPosition" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature +- outcome: Executable scenario: Reject negative globalPosition + +```gwt +Given no PM state exists for "orderNotification" instance "ord_123" +When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position -1 event "evt_001" correlation "corr_001" +Then the PM result status is "failed" +And the PM result error contains "Invalid globalPosition" +And the PM result error contains "-1" +And the process callback was not invoked +And the emitCommands callback was not invoked +``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-011-global-position-zero-is-treated-as-already-processed.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-011-global-position-zero-is-treated-as-already-processed.sdp.md index 5130daaf..911a251e 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-011-global-position-zero-is-treated-as-already-processed.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-011-global-position-zero-is-treated-as-already-processed.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "GlobalPosition zero is treated as already processed" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature +- outcome: Executable scenario: GlobalPosition zero is treated as already processed + +```gwt +Given no PM state exists for "orderNotification" instance "ord_123" +When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 0 event "evt_001" correlation "corr_001" +Then the PM result status is "skipped" +And the PM result skip reason is "already_processed" +``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-012-first-real-event-after-initialization-is-processed.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-012-first-real-event-after-initialization-is-processed.sdp.md index f4b33d99..40bb5c38 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-012-first-real-event-after-initialization-is-processed.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-012-first-real-event-after-initialization-is-processed.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "First real event after initialization is processed" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature +- outcome: Executable scenario: First real event after initialization is processed + +```gwt +Given no PM state exists for "orderNotification" instance "ord_123" +When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000000000 event "evt_001" correlation "corr_001" +Then the PM result status is "processed" +And the process callback was invoked 1 time +``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-013-dead-letter-recorded-when-process-throws.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-013-dead-letter-recorded-when-process-throws.sdp.md index 81bf09ca..e2df8d8f 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-013-dead-letter-recorded-when-process-throws.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-013-dead-letter-recorded-when-process-throws.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Dead letter recorded when process throws" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature +- outcome: Executable scenario: Dead letter recorded when process throws + +```gwt +Given no PM state exists for "orderNotification" instance "ord_123" +When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" and process throws "Handler failed: external service unavailable" +Then the PM result status is "failed" +And the PM result error contains "external service unavailable" +And the dead letters list has 1 entry +And the dead letter at index 0 has pmName "orderNotification" and instanceId "ord_123" +And the saved PM state for "orderNotification" instance "ord_123" has status "failed" +``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-014-dead-letter-recorded-when-emit-commands-throws.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-014-dead-letter-recorded-when-emit-commands-throws.sdp.md index 8674a163..e3a6af33 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-014-dead-letter-recorded-when-emit-commands-throws.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-014-dead-letter-recorded-when-emit-commands-throws.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Dead letter recorded when emitCommands throws" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature +- outcome: Executable scenario: Dead letter recorded when emitCommands throws + +```gwt +Given no PM state exists for "orderNotification" instance "ord_123" +When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" and emitCommands throws "Command emission failed: queue unavailable" +Then the PM result status is "failed" +And the dead letters list has 1 entry +And the dead letter at index 0 error contains "Command emission failed" +``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-015-commands-failed-counter-is-incremented-on-failure.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-015-commands-failed-counter-is-incremented-on-failure.sdp.md index 86379739..f9510975 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-015-commands-failed-counter-is-incremented-on-failure.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-015-commands-failed-counter-is-incremented-on-failure.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "commandsFailed counter is incremented on failure" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature +- outcome: Executable scenario: commandsFailed counter is incremented on failure + +```gwt +Given no PM state exists for "orderNotification" instance "ord_123" +When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" and emitCommands throws "Emission failed" +Then the saved PM state for "orderNotification" instance "ord_123" has commandsFailed 1 +``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-016-commands-emitted-counter-tracks-multiple-commands.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-016-commands-emitted-counter-tracks-multiple-commands.sdp.md index 845c3da1..b789c3cc 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-016-commands-emitted-counter-tracks-multiple-commands.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-016-commands-emitted-counter-tracks-multiple-commands.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "commandsEmitted counter tracks multiple commands" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature +- outcome: Executable scenario: commandsEmitted counter tracks multiple commands + +```gwt +Given no PM state exists for "orderNotification" instance "ord_123" +When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" and process returns 3 commands +Then the saved PM state for "orderNotification" instance "ord_123" has commandsEmitted 3 +``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-017-result-contains-emitted-command-types.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-017-result-contains-emitted-command-types.sdp.md index acaa6fb0..1026943e 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-017-result-contains-emitted-command-types.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-017-result-contains-emitted-command-types.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Result contains emitted command types" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature +- outcome: Executable scenario: Result contains emitted command types + +```gwt +Given no PM state exists for "orderNotification" instance "ord_123" +When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" and process returns commands "SendEmail,UpdateCRM" +Then the PM result status is "processed" +And the PM result commandsEmitted contains: +``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-018-empty-command-list-produces-no-op-processed-result.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-018-empty-command-list-produces-no-op-processed-result.sdp.md index ba3c33bd..4988ef98 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-018-empty-command-list-produces-no-op-processed-result.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-018-empty-command-list-produces-no-op-processed-result.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Empty command list produces no-op processed result" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature +- outcome: Executable scenario: Empty command list produces no-op processed result + +```gwt +Given no PM state exists for "orderNotification" instance "ord_123" +When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" and process returns 0 commands +Then the PM result status is "processed" +And the PM result commandsEmitted is empty +And the emitCommands callback was not invoked +``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-019-helper-processes-event-and-updates-state.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-019-helper-processes-event-and-updates-state.sdp.md index 7b047186..3ab8b264 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-019-helper-processes-event-and-updates-state.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-019-helper-processes-event-and-updates-state.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Helper processes event and updates state" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature +- outcome: Executable scenario: Helper processes event and updates state + +```gwt +Given the feature fixture is in place +When I create a PM checkpoint helper and call it with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" +Then the helper result status is "processed" +And the helper emitted commands list has 1 entry +And the helper PM state for "orderNotification" instance "ord_123" has lastGlobalPosition 1000 +``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-020-helper-maintains-pm-idempotency-semantics.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-020-helper-maintains-pm-idempotency-semantics.sdp.md index 3fbfb1ae..e6607de4 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-020-helper-maintains-pm-idempotency-semantics.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-020-helper-maintains-pm-idempotency-semantics.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Helper maintains PM idempotency semantics" from packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature +- outcome: Executable scenario: Helper maintains PM idempotency semantics + +```gwt +Given the feature fixture is in place +When I create a PM checkpoint helper and call it twice with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" +Then the second helper call result status is "skipped" +And the helper emitted commands list has 1 entry +And the helper first emitted command type is "Cmd1" +``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.sdp.md index f9581d61..4a9a6058 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Tests the PM checkpoint-based idempotency pattern including skip already-processed events (globalPosition check), skip terminal states (completed PM), process new events with lifecycle transitions, command emission tracking, dead letter recording on failures, (test carrier: packages/platform-core/tests/features/behavior/processManager/with-pm-checkpoint.feature) +- outcome: withPMCheckpoint Helper + +## Behavior + +- rule: withPMCheckpoint processes new events and updates PM state +- rule: withPMCheckpoint skips events at or below the checkpoint position +- rule: withPMCheckpoint skips events when PM is in a terminal state +- rule: withPMCheckpoint maintains separate state per PM instance +- rule: withPMCheckpoint allows retry after emitCommands failure +- rule: withPMCheckpoint validates input parameters +- rule: withPMCheckpoint records dead letters on failure +- rule: withPMCheckpoint tracks emitted commands accurately +- rule: createPMCheckpointHelper creates a reusable helper with bound storage diff --git a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-001-projection-rebuild-re-processes-events.sdp.md b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-001-projection-rebuild-re-processes-events.sdp.md index c2e06caa..552a76f6 100644 --- a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-001-projection-rebuild-re-processes-events.sdp.md +++ b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-001-projection-rebuild-re-processes-events.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Projection rebuild re-processes events" from packages/platform-core/tests/features/behavior/production-hardening/admin-tooling.feature +- outcome: Executable scenario: Projection rebuild re-processes events + +```gwt +Given the test environment is initialized +And admin endpoints are configured +And a corrupted projection at position 500 +When admin triggers rebuild from position 0 +Then checkpoint should reset to position 0 +And projection status should be "rebuilding" +And workpool should re-process all events +``` diff --git a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-002-dead-letter-retry-re-enqueues-event.sdp.md b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-002-dead-letter-retry-re-enqueues-event.sdp.md index f12ea264..ee9fcf9c 100644 --- a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-002-dead-letter-retry-re-enqueues-event.sdp.md +++ b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-002-dead-letter-retry-re-enqueues-event.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Dead letter retry re-enqueues event" from packages/platform-core/tests/features/behavior/production-hardening/admin-tooling.feature +- outcome: Executable scenario: Dead letter retry re-enqueues event + +```gwt +Given the test environment is initialized +And admin endpoints are configured +And a dead letter with status "pending" +When admin retries the dead letter +Then dead letter status should be "retrying" +And event should be re-enqueued to workpool +``` diff --git a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-003-event-flow-trace-returns-full-history.sdp.md b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-003-event-flow-trace-returns-full-history.sdp.md index eef4b7e7..0e250960 100644 --- a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-003-event-flow-trace-returns-full-history.sdp.md +++ b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-003-event-flow-trace-returns-full-history.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Event flow trace returns full history" from packages/platform-core/tests/features/behavior/production-hardening/admin-tooling.feature +- outcome: Executable scenario: Event flow trace returns full history + +```gwt +Given the test environment is initialized +And admin endpoints are configured +And events with correlation ID "corr-123" +When admin requests event flow trace +Then response should include command, events, and projection updates +And entries should be ordered by timestamp +``` diff --git a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-004-rebuild-status-shows-progress.sdp.md b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-004-rebuild-status-shows-progress.sdp.md index ed8888f1..ab28cb3b 100644 --- a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-004-rebuild-status-shows-progress.sdp.md +++ b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-004-rebuild-status-shows-progress.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Rebuild status shows progress" from packages/platform-core/tests/features/behavior/production-hardening/admin-tooling.feature +- outcome: Executable scenario: Rebuild status shows progress + +```gwt +Given the test environment is initialized +And admin endpoints are configured +And a rebuild in progress for projection "orderSummaries" +When admin queries rebuild status +Then response should include current position +And response should include total events to process +And response should include estimated time remaining +``` diff --git a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-005-bulk-dead-letter-retry-processes-all-pending.sdp.md b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-005-bulk-dead-letter-retry-processes-all-pending.sdp.md index 3fbc4bff..2d75befe 100644 --- a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-005-bulk-dead-letter-retry-processes-all-pending.sdp.md +++ b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-005-bulk-dead-letter-retry-processes-all-pending.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Bulk dead letter retry processes all pending" from packages/platform-core/tests/features/behavior/production-hardening/admin-tooling.feature +- outcome: Executable scenario: Bulk dead letter retry processes all pending + +```gwt +Given the test environment is initialized +And admin endpoints are configured +And 10 dead letters with status "pending" for projection "inventory" +When admin triggers bulk retry +Then all 10 dead letters should transition to "retrying" +And response should include count of retried items +``` diff --git a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-006-system-diagnostics-returns-comprehensive-state.sdp.md b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-006-system-diagnostics-returns-comprehensive-state.sdp.md index 757c2402..f380661d 100644 --- a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-006-system-diagnostics-returns-comprehensive-state.sdp.md +++ b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-006-system-diagnostics-returns-comprehensive-state.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "System diagnostics returns comprehensive state" from packages/platform-core/tests/features/behavior/production-hardening/admin-tooling.feature +- outcome: Executable scenario: System diagnostics returns comprehensive state + +```gwt +Given the test environment is initialized +And admin endpoints are configured +And the system is running +When admin requests system diagnostics +Then response should include projection statuses +And response should include workpool queue depths +And response should include circuit breaker states +And response should include dead letter counts +``` diff --git a/specs/behavior/platform-core/production-hardening/admin-tooling.sdp.md b/specs/behavior/platform-core/production-hardening/admin-tooling.sdp.md index e59344c5..b35480f7 100644 --- a/specs/behavior/platform-core/production-hardening/admin-tooling.sdp.md +++ b/specs/behavior/platform-core/production-hardening/admin-tooling.sdp.md @@ -10,4 +10,9 @@ relations: ## Intent -- outcome: admin endpoints for operational tasks so that I can rebuild projections, manage dead letters, and diagnose issues (test carrier: packages/platform-core/tests/features/behavior/production-hardening/admin-tooling.feature) +- actor: a platform operator +- outcome: admin endpoints for operational tasks so that I can rebuild projections, manage dead letters, and diagnose issues + +## Behavior + +- rule: Admin tooling enables operational tasks diff --git a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-001-circuit-opens-after-repeated-failures.sdp.md b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-001-circuit-opens-after-repeated-failures.sdp.md index 01829ebe..85cf7182 100644 --- a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-001-circuit-opens-after-repeated-failures.sdp.md +++ b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-001-circuit-opens-after-repeated-failures.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Circuit opens after repeated failures" from packages/platform-core/tests/features/behavior/production-hardening/circuit-breakers.feature +- outcome: Executable scenario: Circuit opens after repeated failures + +```gwt +Given the test environment is initialized +And circuit breaker state table exists +And a circuit breaker with threshold 5 +When 5 consecutive failures occur +Then circuit state should be "OPEN" +And subsequent calls should fail fast with "CIRCUIT_OPEN" +``` diff --git a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-002-circuit-transitions-to-half-open-after-timeout.sdp.md b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-002-circuit-transitions-to-half-open-after-timeout.sdp.md index e13d07c9..d701ad36 100644 --- a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-002-circuit-transitions-to-half-open-after-timeout.sdp.md +++ b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-002-circuit-transitions-to-half-open-after-timeout.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Circuit transitions to half-open after timeout" from packages/platform-core/tests/features/behavior/production-hardening/circuit-breakers.feature +- outcome: Executable scenario: Circuit transitions to half-open after timeout + +```gwt +Given the test environment is initialized +And circuit breaker state table exists +And a circuit in "OPEN" state +When the reset timeout expires (via scheduled function) +Then circuit state should be "HALF_OPEN" +And one test request should be allowed through +``` diff --git a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-003-successful-half-open-request-closes-circuit.sdp.md b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-003-successful-half-open-request-closes-circuit.sdp.md index 9b4713b8..7fa8bd7c 100644 --- a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-003-successful-half-open-request-closes-circuit.sdp.md +++ b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-003-successful-half-open-request-closes-circuit.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Successful half-open request closes circuit" from packages/platform-core/tests/features/behavior/production-hardening/circuit-breakers.feature +- outcome: Executable scenario: Successful half-open request closes circuit + +```gwt +Given the test environment is initialized +And circuit breaker state table exists +And a circuit in "HALF_OPEN" state +When a request succeeds +Then circuit state should be "CLOSED" +And normal traffic should resume +``` diff --git a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-004-failed-half-open-request-reopens-circuit.sdp.md b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-004-failed-half-open-request-reopens-circuit.sdp.md index 9827493d..d521e286 100644 --- a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-004-failed-half-open-request-reopens-circuit.sdp.md +++ b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-004-failed-half-open-request-reopens-circuit.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Failed half-open request reopens circuit" from packages/platform-core/tests/features/behavior/production-hardening/circuit-breakers.feature +- outcome: Executable scenario: Failed half-open request reopens circuit + +```gwt +Given the test environment is initialized +And circuit breaker state table exists +And a circuit in "HALF_OPEN" state +When a request fails +Then circuit state should return to "OPEN" +And timeout timer should reset +``` diff --git a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-005-circuit-state-persists-across-function-invocations.sdp.md b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-005-circuit-state-persists-across-function-invocations.sdp.md index 77fee2a7..2e7eafde 100644 --- a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-005-circuit-state-persists-across-function-invocations.sdp.md +++ b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-005-circuit-state-persists-across-function-invocations.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Circuit state persists across function invocations" from packages/platform-core/tests/features/behavior/production-hardening/circuit-breakers.feature +- outcome: Executable scenario: Circuit state persists across function invocations + +```gwt +Given the test environment is initialized +And circuit breaker state table exists +And a circuit breaker in "OPEN" state +When the Convex function completes and a new invocation starts +Then the circuit state should still be "OPEN" +And failure count should be preserved +``` diff --git a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-006-multiple-circuit-breakers-operate-independently.sdp.md b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-006-multiple-circuit-breakers-operate-independently.sdp.md index 65f92490..0a629bf8 100644 --- a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-006-multiple-circuit-breakers-operate-independently.sdp.md +++ b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-006-multiple-circuit-breakers-operate-independently.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Multiple circuit breakers operate independently" from packages/platform-core/tests/features/behavior/production-hardening/circuit-breakers.feature +- outcome: Executable scenario: Multiple circuit breakers operate independently + +```gwt +Given the test environment is initialized +And circuit breaker state table exists +And circuit breaker "payment-gateway" in "OPEN" state +And circuit breaker "email-service" in "CLOSED" state +When a request to "email-service" is made +Then the request should proceed normally +And "payment-gateway" should remain "OPEN" +``` diff --git a/specs/behavior/platform-core/production-hardening/circuit-breakers.sdp.md b/specs/behavior/platform-core/production-hardening/circuit-breakers.sdp.md index 75ad965f..a61dd9eb 100644 --- a/specs/behavior/platform-core/production-hardening/circuit-breakers.sdp.md +++ b/specs/behavior/platform-core/production-hardening/circuit-breakers.sdp.md @@ -10,4 +10,9 @@ relations: ## Intent -- outcome: circuit breakers for external dependencies so that failures are isolated and the system degrades gracefully (test carrier: packages/platform-core/tests/features/behavior/production-hardening/circuit-breakers.feature) +- actor: a platform developer +- outcome: circuit breakers for external dependencies so that failures are isolated and the system degrades gracefully + +## Behavior + +- rule: Circuit breakers prevent cascade failures diff --git a/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-001-trace-spans-command-to-projection-flow.sdp.md b/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-001-trace-spans-command-to-projection-flow.sdp.md index b264fdfd..b94cabeb 100644 --- a/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-001-trace-spans-command-to-projection-flow.sdp.md +++ b/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-001-trace-spans-command-to-projection-flow.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Trace spans command-to-projection flow" from packages/platform-core/tests/features/behavior/production-hardening/distributed-tracing.feature +- outcome: Executable scenario: Trace spans command-to-projection flow + +```gwt +Given the test environment is initialized +And trace context propagation is enabled +And a SubmitOrder command with trace context +When the command is processed and OrderSubmitted event is published and projection is updated +Then all log entries should share the same trace ID +And logs should show parent-child relationships via spanId +``` diff --git a/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-002-missing-trace-context-uses-default.sdp.md b/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-002-missing-trace-context-uses-default.sdp.md index 461c1540..6c23a302 100644 --- a/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-002-missing-trace-context-uses-default.sdp.md +++ b/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-002-missing-trace-context-uses-default.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Missing trace context uses default" from packages/platform-core/tests/features/behavior/production-hardening/distributed-tracing.feature +- outcome: Executable scenario: Missing trace context uses default + +```gwt +Given the test environment is initialized +And trace context propagation is enabled +And a command without trace context +When the command is processed +Then a new trace ID should be generated +And all downstream operations should use the generated trace +``` diff --git a/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-003-trace-context-is-preserved-in-event-metadata.sdp.md b/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-003-trace-context-is-preserved-in-event-metadata.sdp.md index 92523534..29c0c0f6 100644 --- a/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-003-trace-context-is-preserved-in-event-metadata.sdp.md +++ b/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-003-trace-context-is-preserved-in-event-metadata.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Trace context is preserved in event metadata" from packages/platform-core/tests/features/behavior/production-hardening/distributed-tracing.feature +- outcome: Executable scenario: Trace context is preserved in event metadata + +```gwt +Given the test environment is initialized +And trace context propagation is enabled +And a command with traceId "trace-abc" and spanId "span-001" +When the command produces an event +Then the event metadata should contain traceId "trace-abc" +And the event metadata should contain a new spanId with parentSpanId "span-001" +``` diff --git a/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-004-multiple-projections-share-same-trace.sdp.md b/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-004-multiple-projections-share-same-trace.sdp.md index 3b6f685f..1fc16d0f 100644 --- a/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-004-multiple-projections-share-same-trace.sdp.md +++ b/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-004-multiple-projections-share-same-trace.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Multiple projections share same trace" from packages/platform-core/tests/features/behavior/production-hardening/distributed-tracing.feature +- outcome: Executable scenario: Multiple projections share same trace + +```gwt +Given the test environment is initialized +And trace context propagation is enabled +And an event with traceId "trace-xyz" +When two different projections process the event +Then both projection logs should include traceId "trace-xyz" +``` diff --git a/specs/behavior/platform-core/production-hardening/distributed-tracing.sdp.md b/specs/behavior/platform-core/production-hardening/distributed-tracing.sdp.md index a5efd3b5..6ce55a0c 100644 --- a/specs/behavior/platform-core/production-hardening/distributed-tracing.sdp.md +++ b/specs/behavior/platform-core/production-hardening/distributed-tracing.sdp.md @@ -10,4 +10,9 @@ relations: ## Intent -- outcome: to trace event flows through the system so that I can debug issues and understand command-to-projection paths (test carrier: packages/platform-core/tests/features/behavior/production-hardening/distributed-tracing.feature) +- actor: a platform operator +- outcome: to trace event flows through the system so that I can debug issues and understand command-to-projection paths + +## Behavior + +- rule: Distributed tracing visualizes event flow diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-001-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-001-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md index d9f79dce..8fe54826 100644 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-001-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-001-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Circuit breaker uses action retrier for half-open probe" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature +- outcome: Executable scenario: Circuit breaker uses action retrier for half-open probe + +```gwt +Given the test environment is initialized +And action retrier component is configured +And workpool component is configured +And a circuit breaker "payment-api" in "HALF_OPEN" state +When a test request is initiated +Then action retrier should execute with maxFailures=0 +And circuit state should update to "CLOSED" on success +``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-002-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-002-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md index 0777e383..3fcba05a 100644 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-002-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-002-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Failed half-open probe reopens circuit via action retrier" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature +- outcome: Executable scenario: Failed half-open probe reopens circuit via action retrier + +```gwt +Given the test environment is initialized +And action retrier component is configured +And workpool component is configured +And a circuit breaker "payment-api" in "HALF_OPEN" state +When the probe action fails +Then onCircuitProbeComplete should transition to "OPEN" +And timeout should be rescheduled for next half-open transition +``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-003-closed-circuit-uses-action-retrier-with-configured-retries.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-003-closed-circuit-uses-action-retrier-with-configured-retries.sdp.md index 9af3148e..d7beefed 100644 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-003-closed-circuit-uses-action-retrier-with-configured-retries.sdp.md +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-003-closed-circuit-uses-action-retrier-with-configured-retries.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Closed circuit uses action retrier with configured retries" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature +- outcome: Executable scenario: Closed circuit uses action retrier with configured retries + +```gwt +Given the test environment is initialized +And action retrier component is configured +And workpool component is configured +And a circuit breaker "payment-api" in "CLOSED" state +And retry config has maxFailures=3 and initialBackoffMs=250 +When an external operation is executed +Then action retrier should use the configured retry settings +And onOperationComplete should update circuit state on completion +``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-004-dcb-conflict-triggers-workpool-based-retry.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-004-dcb-conflict-triggers-workpool-based-retry.sdp.md index 780e982d..f2eb1c11 100644 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-004-dcb-conflict-triggers-workpool-based-retry.sdp.md +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-004-dcb-conflict-triggers-workpool-based-retry.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "DCB conflict triggers Workpool-based retry" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature +- outcome: Executable scenario: DCB conflict triggers Workpool-based retry + +```gwt +Given the test environment is initialized +And action retrier component is configured +And workpool component is configured +And a DCB operation with scope "tenant:t1:reservation:r1" +And expectedVersion is 5 but currentVersion is 6 +When conflict is detected +Then Workpool should enqueue retry mutation with backoff +And partition key should be "dcb:tenant:t1:reservation:r1" +And only one retry should run at a time for that scope +``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-005-dcb-retry-respects-exponential-backoff-with-jitter.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-005-dcb-retry-respects-exponential-backoff-with-jitter.sdp.md index 968cccd0..2fd24ae6 100644 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-005-dcb-retry-respects-exponential-backoff-with-jitter.sdp.md +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-005-dcb-retry-respects-exponential-backoff-with-jitter.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "DCB retry respects exponential backoff with jitter" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature +- outcome: Executable scenario: DCB retry respects exponential backoff with jitter + +```gwt +Given the test environment is initialized +And action retrier component is configured +And workpool component is configured +And a DCB conflict on attempt 3 +When calculateBackoff is called +Then delay should be approximately 400ms (100 * 2^2) +And jitter should add 0-50% randomness +And maximum delay should be capped at 30 seconds +``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-006-dcb-retry-uses-latest-version-after-conflict.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-006-dcb-retry-uses-latest-version-after-conflict.sdp.md index 6d1eacd8..de803b90 100644 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-006-dcb-retry-uses-latest-version-after-conflict.sdp.md +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-006-dcb-retry-uses-latest-version-after-conflict.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "DCB retry uses latest version after conflict" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature +- outcome: Executable scenario: DCB retry uses latest version after conflict + +```gwt +Given the test environment is initialized +And action retrier component is configured +And workpool component is configured +And a DCB conflict with currentVersion 10 +When retry is enqueued via Workpool +Then the retry config should have expectedVersion=10 +And the retry attempt counter should increment +``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-007-dcb-retry-partition-key-prevents-concurrent-retries.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-007-dcb-retry-partition-key-prevents-concurrent-retries.sdp.md index b8e53615..ba89cf74 100644 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-007-dcb-retry-partition-key-prevents-concurrent-retries.sdp.md +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-007-dcb-retry-partition-key-prevents-concurrent-retries.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "DCB retry partition key prevents concurrent retries" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature +- outcome: Executable scenario: DCB retry partition key prevents concurrent retries + +```gwt +Given the test environment is initialized +And action retrier component is configured +And workpool component is configured +And two DCB conflicts for scope "tenant:t1:reservation:r1" +When both conflicts trigger retries +Then Workpool partition key should serialize execution +And the second retry should wait for the first to complete +``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-008-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-008-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md index 0ab9b47b..7a09ab2a 100644 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-008-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-008-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Dead letter retry uses action retrier for external calls" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature +- outcome: Executable scenario: Dead letter retry uses action retrier for external calls + +```gwt +Given the test environment is initialized +And action retrier component is configured +And workpool component is configured +And a dead letter with status "pending" and eventId "evt-123" +When admin triggers retry +Then action retrier should execute processEvent action +And dead letter status should be "retrying" +And retryRunId should track the action run +``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-009-failed-dlq-retry-returns-to-pending-status.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-009-failed-dlq-retry-returns-to-pending-status.sdp.md index 7a168627..2f0c5392 100644 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-009-failed-dlq-retry-returns-to-pending-status.sdp.md +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-009-failed-dlq-retry-returns-to-pending-status.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Failed DLQ retry returns to pending status" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature +- outcome: Executable scenario: Failed DLQ retry returns to pending status + +```gwt +Given the test environment is initialized +And action retrier component is configured +And workpool component is configured +And a dead letter in "retrying" status +When action retrier exhausts all retry attempts +Then onDLQRetryComplete should update status to "pending" +And lastError should contain the failure reason +And item should be available for manual review +``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-010-successful-dlq-retry-marks-item-resolved.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-010-successful-dlq-retry-marks-item-resolved.sdp.md index a0ad5163..c4abe319 100644 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-010-successful-dlq-retry-marks-item-resolved.sdp.md +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-010-successful-dlq-retry-marks-item-resolved.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Successful DLQ retry marks item resolved" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature +- outcome: Executable scenario: Successful DLQ retry marks item resolved + +```gwt +Given the test environment is initialized +And action retrier component is configured +And workpool component is configured +And a dead letter in "retrying" status +When action retrier completes successfully +Then onDLQRetryComplete should update status to "resolved" +And resolvedAt timestamp should be set +``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-011-dlq-retry-tracks-retry-count.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-011-dlq-retry-tracks-retry-count.sdp.md index e2060d8c..1b3afedd 100644 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-011-dlq-retry-tracks-retry-count.sdp.md +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-011-dlq-retry-tracks-retry-count.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "DLQ retry tracks retry count" from packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature +- outcome: Executable scenario: DLQ retry tracks retry count + +```gwt +Given the test environment is initialized +And action retrier component is configured +And workpool component is configured +And a dead letter with retryCount=2 +When admin triggers another retry +Then retryCount should increment to 3 +And lastRetryAt should be updated +``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.sdp.md index 53d91691..880ed3a7 100644 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.sdp.md +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.sdp.md @@ -10,4 +10,9 @@ relations: ## Intent -- outcome: durable function components integrated with platform patterns so that external calls, retries, and conflict handling are reliable (test carrier: packages/platform-core/tests/features/behavior/production-hardening/durable-function-integration.feature) +- actor: a platform developer +- outcome: durable function components integrated with platform patterns so that external calls, retries, and conflict handling are reliable + +## Behavior + +- rule: Durable functions provide reliable execution patterns diff --git a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-001-readiness-probe-checks-dependencies.sdp.md b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-001-readiness-probe-checks-dependencies.sdp.md index 55cd3dd8..3def4493 100644 --- a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-001-readiness-probe-checks-dependencies.sdp.md +++ b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-001-readiness-probe-checks-dependencies.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Readiness probe checks dependencies" from packages/platform-core/tests/features/behavior/production-hardening/health-endpoints.feature +- outcome: Executable scenario: Readiness probe checks dependencies + +```gwt +Given the test environment is initialized +And health check endpoints are configured +And the health endpoint is configured +When event store is reachable and projections are within lag threshold +Then /health/ready should return 200 +And response body should include component statuses +``` diff --git a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-002-unhealthy-dependency-fails-readiness.sdp.md b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-002-unhealthy-dependency-fails-readiness.sdp.md index b537da3e..1f5a162b 100644 --- a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-002-unhealthy-dependency-fails-readiness.sdp.md +++ b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-002-unhealthy-dependency-fails-readiness.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Unhealthy dependency fails readiness" from packages/platform-core/tests/features/behavior/production-hardening/health-endpoints.feature +- outcome: Executable scenario: Unhealthy dependency fails readiness + +```gwt +Given the test environment is initialized +And health check endpoints are configured +And event store is unreachable +When /health/ready is called +Then response should be 503 +And response body should identify failed component +``` diff --git a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-003-liveness-probe-always-succeeds.sdp.md b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-003-liveness-probe-always-succeeds.sdp.md index 21c7acbb..1a9d524f 100644 --- a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-003-liveness-probe-always-succeeds.sdp.md +++ b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-003-liveness-probe-always-succeeds.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Liveness probe always succeeds" from packages/platform-core/tests/features/behavior/production-hardening/health-endpoints.feature +- outcome: Executable scenario: Liveness probe always succeeds + +```gwt +Given the test environment is initialized +And health check endpoints are configured +And the health endpoint is configured +When /health/live is called +Then response should be 200 +And no dependency checks should be performed +``` diff --git a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-004-projection-lag-threshold-determines-health.sdp.md b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-004-projection-lag-threshold-determines-health.sdp.md index 75cd57d3..479be1fa 100644 --- a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-004-projection-lag-threshold-determines-health.sdp.md +++ b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-004-projection-lag-threshold-determines-health.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Projection lag threshold determines health" from packages/platform-core/tests/features/behavior/production-hardening/health-endpoints.feature +- outcome: Executable scenario: Projection lag threshold determines health + +```gwt +Given the test environment is initialized +And health check endpoints are configured +And a projection with lag above threshold (100 events) +When /health/ready is called +Then response should be 503 +And response body should identify "projection_lag" as degraded +``` diff --git a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-005-health-response-includes-all-component-statuses.sdp.md b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-005-health-response-includes-all-component-statuses.sdp.md index 01429d14..5882bfff 100644 --- a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-005-health-response-includes-all-component-statuses.sdp.md +++ b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-005-health-response-includes-all-component-statuses.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Health response includes all component statuses" from packages/platform-core/tests/features/behavior/production-hardening/health-endpoints.feature +- outcome: Executable scenario: Health response includes all component statuses + +```gwt +Given the test environment is initialized +And health check endpoints are configured +And event store is healthy +And projections have zero lag +And workpool has pending jobs +When /health/ready is called +Then response should include status for "event_store", "projections", "workpool" +``` diff --git a/specs/behavior/platform-core/production-hardening/health-endpoints.sdp.md b/specs/behavior/platform-core/production-hardening/health-endpoints.sdp.md index 18c7ed0e..3db0fa1d 100644 --- a/specs/behavior/platform-core/production-hardening/health-endpoints.sdp.md +++ b/specs/behavior/platform-core/production-hardening/health-endpoints.sdp.md @@ -10,4 +10,9 @@ relations: ## Intent -- outcome: health check endpoints so that I can configure readiness and liveness probes for the application (test carrier: packages/platform-core/tests/features/behavior/production-hardening/health-endpoints.feature) +- actor: a Kubernetes operator +- outcome: health check endpoints so that I can configure readiness and liveness probes for the application + +## Behavior + +- rule: Health endpoints support Kubernetes probes diff --git a/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-001-projection-lag-is-tracked.sdp.md b/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-001-projection-lag-is-tracked.sdp.md index 5f85ff10..37e5404d 100644 --- a/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-001-projection-lag-is-tracked.sdp.md +++ b/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-001-projection-lag-is-tracked.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Projection lag is tracked" from packages/platform-core/tests/features/behavior/production-hardening/metrics-collection.feature +- outcome: Executable scenario: Projection lag is tracked + +```gwt +Given the test environment is initialized +And a metrics collector is configured +And a projection with checkpoint at position 100 +And the latest event is at position 150 +When metrics are collected +Then projection.lag_events should be 50 +And the metric should include projection name label +``` diff --git a/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-002-metrics-collection-handles-missing-checkpoints.sdp.md b/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-002-metrics-collection-handles-missing-checkpoints.sdp.md index 55ef8388..8d4ab041 100644 --- a/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-002-metrics-collection-handles-missing-checkpoints.sdp.md +++ b/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-002-metrics-collection-handles-missing-checkpoints.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Metrics collection handles missing checkpoints" from packages/platform-core/tests/features/behavior/production-hardening/metrics-collection.feature +- outcome: Executable scenario: Metrics collection handles missing checkpoints + +```gwt +Given the test environment is initialized +And a metrics collector is configured +And a projection without a checkpoint entry +When metrics are collected +Then projection.lag_events should default to current global position +And a warning should be logged +``` diff --git a/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-003-event-throughput-is-calculated.sdp.md b/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-003-event-throughput-is-calculated.sdp.md index af30a99d..ff5c576c 100644 --- a/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-003-event-throughput-is-calculated.sdp.md +++ b/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-003-event-throughput-is-calculated.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Event throughput is calculated" from packages/platform-core/tests/features/behavior/production-hardening/metrics-collection.feature +- outcome: Executable scenario: Event throughput is calculated + +```gwt +Given the test environment is initialized +And a metrics collector is configured +And 100 events were published in the last minute +When metrics are collected +Then events.throughput should be approximately 100 events/min +``` diff --git a/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-004-dead-letter-queue-size-is-tracked.sdp.md b/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-004-dead-letter-queue-size-is-tracked.sdp.md index f63a2b97..c9351fd9 100644 --- a/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-004-dead-letter-queue-size-is-tracked.sdp.md +++ b/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-004-dead-letter-queue-size-is-tracked.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Dead letter queue size is tracked" from packages/platform-core/tests/features/behavior/production-hardening/metrics-collection.feature +- outcome: Executable scenario: Dead letter queue size is tracked + +```gwt +Given the test environment is initialized +And a metrics collector is configured +And 5 dead letters exist for projection "orderSummaries" +When metrics are collected +Then dlq.size should be 5 +And the metric should include projection name label +``` diff --git a/specs/behavior/platform-core/production-hardening/metrics-collection.sdp.md b/specs/behavior/platform-core/production-hardening/metrics-collection.sdp.md index 272c2a51..325ba247 100644 --- a/specs/behavior/platform-core/production-hardening/metrics-collection.sdp.md +++ b/specs/behavior/platform-core/production-hardening/metrics-collection.sdp.md @@ -10,4 +10,9 @@ relations: ## Intent -- outcome: to collect system health metrics so that I can monitor projection lag, event throughput, and command latency (test carrier: packages/platform-core/tests/features/behavior/production-hardening/metrics-collection.feature) +- actor: a platform operator +- outcome: to collect system health metrics so that I can monitor projection lag, event throughput, and command latency + +## Behavior + +- rule: Metrics track system health indicators diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-001-requests-within-rate-limit-succeed.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-001-requests-within-rate-limit-succeed.sdp.md index 9e44c33f..3e104cda 100644 --- a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-001-requests-within-rate-limit-succeed.sdp.md +++ b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-001-requests-within-rate-limit-succeed.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Requests within rate limit succeed" from packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature +- outcome: Executable scenario: Requests within rate limit succeed + +```gwt +Given the test environment is initialized +And rate limiter component is mounted +And rate limit "commandDispatch" allows 100 requests per minute +And 50 requests have been made in the current window +When a new command is dispatched +Then the command should proceed to handler +And rate limit bucket should show 51 consumed +``` diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-002-requests-exceeding-rate-limit-are-rejected.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-002-requests-exceeding-rate-limit-are-rejected.sdp.md index e4042907..23a9ebc9 100644 --- a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-002-requests-exceeding-rate-limit-are-rejected.sdp.md +++ b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-002-requests-exceeding-rate-limit-are-rejected.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Requests exceeding rate limit are rejected" from packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature +- outcome: Executable scenario: Requests exceeding rate limit are rejected + +```gwt +Given the test environment is initialized +And rate limiter component is mounted +And rate limit "commandDispatch" allows 100 requests per minute +And 100 requests have been made in the current window +When a new command is dispatched +Then the command should be rejected with "RATE_LIMITED" +And response should include "retryAfterMs" +``` diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-003-token-bucket-refills-over-time.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-003-token-bucket-refills-over-time.sdp.md index c028051e..10c30576 100644 --- a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-003-token-bucket-refills-over-time.sdp.md +++ b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-003-token-bucket-refills-over-time.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Token bucket refills over time" from packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature +- outcome: Executable scenario: Token bucket refills over time + +```gwt +Given the test environment is initialized +And rate limiter component is mounted +And rate limit "commandDispatch" with rate 100/minute and capacity 150 +And bucket is depleted to 0 tokens +When 30 seconds pass +Then bucket should have approximately 50 tokens available +``` diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-004-rate-limit-key-isolation-by-user.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-004-rate-limit-key-isolation-by-user.sdp.md index d36e6a58..0eaa6c4d 100644 --- a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-004-rate-limit-key-isolation-by-user.sdp.md +++ b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-004-rate-limit-key-isolation-by-user.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Rate limit key isolation by user" from packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature +- outcome: Executable scenario: Rate limit key isolation by user + +```gwt +Given the test environment is initialized +And rate limiter component is mounted +And rate limit key strategy is "byUserId" +And user "alice" has exhausted her rate limit +When user "bob" dispatches a command +Then "bob"'s command should proceed +And "alice" should remain rate limited +``` diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-005-admin-rebuild-respects-hourly-limit.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-005-admin-rebuild-respects-hourly-limit.sdp.md index ddcbe30e..570afe82 100644 --- a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-005-admin-rebuild-respects-hourly-limit.sdp.md +++ b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-005-admin-rebuild-respects-hourly-limit.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Admin rebuild respects hourly limit" from packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature +- outcome: Executable scenario: Admin rebuild respects hourly limit + +```gwt +Given the test environment is initialized +And rate limiter component is mounted +And rate limit "adminRebuild" allows 10 rebuilds per hour +And 5 rebuilds have been triggered this hour +When admin triggers another rebuild +Then the rebuild should start +And rebuild count should be 6 +``` diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-006-admin-rebuild-blocked-when-limit-exceeded.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-006-admin-rebuild-blocked-when-limit-exceeded.sdp.md index be167c37..4c07d093 100644 --- a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-006-admin-rebuild-blocked-when-limit-exceeded.sdp.md +++ b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-006-admin-rebuild-blocked-when-limit-exceeded.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Admin rebuild blocked when limit exceeded" from packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature +- outcome: Executable scenario: Admin rebuild blocked when limit exceeded + +```gwt +Given the test environment is initialized +And rate limiter component is mounted +And rate limit "adminRebuild" allows 10 rebuilds per hour +And 10 rebuilds have been triggered this hour +When admin triggers another rebuild +Then the operation should be rejected +And response should indicate "Rate limit exceeded for adminRebuild" +``` diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-007-adapter-converts-component-response-to-rate-limit-result.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-007-adapter-converts-component-response-to-rate-limit-result.sdp.md index 5498c1f0..c1a577ff 100644 --- a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-007-adapter-converts-component-response-to-rate-limit-result.sdp.md +++ b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-007-adapter-converts-component-response-to-rate-limit-result.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Adapter converts component response to RateLimitResult" from packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature +- outcome: Executable scenario: Adapter converts component response to RateLimitResult + +```gwt +Given the test environment is initialized +And rate limiter component is mounted +And a rate limiter with "commandDispatch" limit configured +When createConvexRateLimitAdapter is called +Then it returns a function compatible with RateLimitChecker interface +And the function returns { allowed: boolean, retryAfterMs?: number } +``` diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-008-adapter-handles-component-errors-gracefully.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-008-adapter-handles-component-errors-gracefully.sdp.md index 610803d1..f3342caf 100644 --- a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-008-adapter-handles-component-errors-gracefully.sdp.md +++ b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-008-adapter-handles-component-errors-gracefully.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Adapter handles component errors gracefully" from packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature +- outcome: Executable scenario: Adapter handles component errors gracefully + +```gwt +Given the test environment is initialized +And rate limiter component is mounted +And rate limiter component throws an error +When the adapter is invoked +Then the error should propagate to caller +And middleware should handle the error appropriately +``` diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.sdp.md index c8abfdfa..2cbd1305 100644 --- a/specs/behavior/platform-core/production-hardening/rate-limiting.sdp.md +++ b/specs/behavior/platform-core/production-hardening/rate-limiting.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: to rate limit commands and admin operations so that the system is protected from abuse and overload (test carrier: packages/platform-core/tests/features/behavior/production-hardening/rate-limiting.feature) +- actor: a platform developer +- outcome: to rate limit commands and admin operations so that the system is protected from abuse and overload + +## Behavior + +- rule: Rate limiting protects command dispatch +- rule: Admin operations have separate rate limits +- rule: Rate limiter adapter integrates with middleware diff --git a/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-001-projection-categories-tuple-contains-all-valid-categories.sdp.md b/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-001-projection-categories-tuple-contains-all-valid-categories.sdp.md index 0dc2210d..fea3f2d1 100644 --- a/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-001-projection-categories-tuple-contains-all-valid-categories.sdp.md +++ b/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-001-projection-categories-tuple-contains-all-valid-categories.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "PROJECTION_CATEGORIES tuple contains all valid categories" from packages/platform-core/tests/features/behavior/projection-categories/category-definitions.feature +- outcome: Executable scenario: PROJECTION_CATEGORIES tuple contains all valid categories + +```gwt +Given the projection category taxonomy: +When I access PROJECTION_CATEGORIES +Then it contains exactly "logic", "view", "reporting", "integration" +And it is a readonly tuple +``` diff --git a/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-002-is-projection-category-validates-category-strings.sdp.md b/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-002-is-projection-category-validates-category-strings.sdp.md index d9b2b89c..68884a4e 100644 --- a/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-002-is-projection-category-validates-category-strings.sdp.md +++ b/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-002-is-projection-category-validates-category-strings.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isProjectionCategory validates category strings" from packages/platform-core/tests/features/behavior/projection-categories/category-definitions.feature +- outcome: Executable scenario: isProjectionCategory validates category strings + +```gwt +Given the projection category taxonomy: +When I call isProjectionCategory with "value" +Then I receive value +``` diff --git a/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-003-category-helper-functions-identify-correct-categories.sdp.md b/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-003-category-helper-functions-identify-correct-categories.sdp.md index 0de94aad..b70d2c56 100644 --- a/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-003-category-helper-functions-identify-correct-categories.sdp.md +++ b/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-003-category-helper-functions-identify-correct-categories.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Category helper functions identify correct categories" from packages/platform-core/tests/features/behavior/projection-categories/category-definitions.feature +- outcome: Executable scenario: Category helper functions identify correct categories + +```gwt +Given the projection category taxonomy: +And a projection category "value" +When the scenario runs +Then isLogicProjection returns value +And isViewProjection returns value +And isReportingProjection returns value +And isIntegrationProjection returns value +``` diff --git a/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-004-is-client-exposed-returns-correct-exposure-status.sdp.md b/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-004-is-client-exposed-returns-correct-exposure-status.sdp.md index c72cea1e..ad70aa41 100644 --- a/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-004-is-client-exposed-returns-correct-exposure-status.sdp.md +++ b/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-004-is-client-exposed-returns-correct-exposure-status.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "isClientExposed returns correct exposure status" from packages/platform-core/tests/features/behavior/projection-categories/category-definitions.feature +- outcome: Executable scenario: isClientExposed returns correct exposure status + +```gwt +Given the projection category taxonomy: +And a projection category "value" +When I call isClientExposed +Then I receive value +``` diff --git a/specs/behavior/platform-core/projection-categories/category-definitions.sdp.md b/specs/behavior/platform-core/projection-categories/category-definitions.sdp.md index c794ceaf..16d5ec5c 100644 --- a/specs/behavior/platform-core/projection-categories/category-definitions.sdp.md +++ b/specs/behavior/platform-core/projection-categories/category-definitions.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: projections classified into four distinct categories so that I can route queries and optimize projection behavior (test carrier: packages/platform-core/tests/features/behavior/projection-categories/category-definitions.feature) +- actor: a platform developer +- outcome: projections classified into four distinct categories so that I can route queries and optimize projection behavior diff --git a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-001-missing-category-returns-category-required-error.sdp.md b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-001-missing-category-returns-category-required-error.sdp.md index cf80c68b..f8edbb96 100644 --- a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-001-missing-category-returns-category-required-error.sdp.md +++ b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-001-missing-category-returns-category-required-error.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Missing category returns CATEGORY_REQUIRED error" from packages/platform-core/tests/features/behavior/projection-categories/explicit-declaration.feature +- outcome: Executable scenario: Missing category returns CATEGORY_REQUIRED error + +```gwt +Given the projection validation module is available +And valid categories are "logic", "view", "reporting", "integration" +When I validate a projection category with undefined +Then validation fails +And error code is "CATEGORY_REQUIRED" +And error message contains "required" +And suggested categories are provided +``` diff --git a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-002-null-category-returns-category-required-error.sdp.md b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-002-null-category-returns-category-required-error.sdp.md index 6aa788d7..7a847f38 100644 --- a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-002-null-category-returns-category-required-error.sdp.md +++ b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-002-null-category-returns-category-required-error.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Null category returns CATEGORY_REQUIRED error" from packages/platform-core/tests/features/behavior/projection-categories/explicit-declaration.feature +- outcome: Executable scenario: Null category returns CATEGORY_REQUIRED error + +```gwt +Given the projection validation module is available +And valid categories are "logic", "view", "reporting", "integration" +When I validate a projection category with null +Then validation fails +And error code is "CATEGORY_REQUIRED" +And suggested categories are provided +``` diff --git a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-003-valid-category-passes-validation.sdp.md b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-003-valid-category-passes-validation.sdp.md index d001ac22..df6248a1 100644 --- a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-003-valid-category-passes-validation.sdp.md +++ b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-003-valid-category-passes-validation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Valid category passes validation" from packages/platform-core/tests/features/behavior/projection-categories/explicit-declaration.feature +- outcome: Executable scenario: Valid category passes validation + +```gwt +Given the projection validation module is available +And valid categories are "logic", "view", "reporting", "integration" +When I validate a projection category with "value" +Then validation succeeds +And returned category is "value" +``` diff --git a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-004-assert-valid-category-returns-category-on-valid-input.sdp.md b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-004-assert-valid-category-returns-category-on-valid-input.sdp.md index f67d2d49..3f0eceea 100644 --- a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-004-assert-valid-category-returns-category-on-valid-input.sdp.md +++ b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-004-assert-valid-category-returns-category-on-valid-input.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "assertValidCategory returns category on valid input" from packages/platform-core/tests/features/behavior/projection-categories/explicit-declaration.feature +- outcome: Executable scenario: assertValidCategory returns category on valid input + +```gwt +Given the projection validation module is available +And valid categories are "logic", "view", "reporting", "integration" +When I call assertValidCategory with "view" +Then I receive "view" +And no error is thrown +``` diff --git a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-005-invalid-category-returns-invalid-category-error.sdp.md b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-005-invalid-category-returns-invalid-category-error.sdp.md index f6ffe614..f51fd94d 100644 --- a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-005-invalid-category-returns-invalid-category-error.sdp.md +++ b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-005-invalid-category-returns-invalid-category-error.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Invalid category returns INVALID_CATEGORY error" from packages/platform-core/tests/features/behavior/projection-categories/explicit-declaration.feature +- outcome: Executable scenario: Invalid category returns INVALID_CATEGORY error + +```gwt +Given the projection validation module is available +And valid categories are "logic", "view", "reporting", "integration" +When I validate a projection category with "value" +Then validation fails +And error code is "INVALID_CATEGORY" +And error message contains "value" +And suggested categories are provided +``` diff --git a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-006-assert-valid-category-throws-on-invalid-input.sdp.md b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-006-assert-valid-category-throws-on-invalid-input.sdp.md index 7ae2e29f..0a2d9ebe 100644 --- a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-006-assert-valid-category-throws-on-invalid-input.sdp.md +++ b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-006-assert-valid-category-throws-on-invalid-input.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "assertValidCategory throws on invalid input" from packages/platform-core/tests/features/behavior/projection-categories/explicit-declaration.feature +- outcome: Executable scenario: assertValidCategory throws on invalid input + +```gwt +Given the projection validation module is available +And valid categories are "logic", "view", "reporting", "integration" +When I call assertValidCategory with "invalid" +Then an error is thrown +And error message contains "INVALID_CATEGORY" +``` diff --git a/specs/behavior/platform-core/projection-categories/explicit-declaration.sdp.md b/specs/behavior/platform-core/projection-categories/explicit-declaration.sdp.md index 1c51fa90..b1ec9c44 100644 --- a/specs/behavior/platform-core/projection-categories/explicit-declaration.sdp.md +++ b/specs/behavior/platform-core/projection-categories/explicit-declaration.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: projections to require explicit category declaration so that all projections have clear query routing semantics (test carrier: packages/platform-core/tests/features/behavior/projection-categories/explicit-declaration.feature) +- actor: a platform developer +- outcome: projections to require explicit category declaration so that all projections have clear query routing semantics diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-001-get-by-category-returns-all-view-projections.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-001-get-by-category-returns-all-view-projections.sdp.md index 905cf32f..0b9c6309 100644 --- a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-001-get-by-category-returns-all-view-projections.sdp.md +++ b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-001-get-by-category-returns-all-view-projections.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "getByCategory returns all view projections" from packages/platform-core/tests/features/behavior/projection-categories/registry-lookup.feature +- outcome: Executable scenario: getByCategory returns all view projections + +```gwt +Given a projection registry with the following projections: +When I call getByCategory with "view" +Then I receive 2 projections +And the result contains "orderSummary" +And the result contains "productCatalog" +``` diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-002-get-by-category-returns-all-logic-projections.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-002-get-by-category-returns-all-logic-projections.sdp.md index f0907d2b..eb4e7ad6 100644 --- a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-002-get-by-category-returns-all-logic-projections.sdp.md +++ b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-002-get-by-category-returns-all-logic-projections.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "getByCategory returns all logic projections" from packages/platform-core/tests/features/behavior/projection-categories/registry-lookup.feature +- outcome: Executable scenario: getByCategory returns all logic projections + +```gwt +Given a projection registry with the following projections: +When I call getByCategory with "logic" +Then I receive 1 projection +And the result contains "orderExistence" +``` diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-003-get-by-category-returns-all-reporting-projections.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-003-get-by-category-returns-all-reporting-projections.sdp.md index 25396cc8..127f1a4f 100644 --- a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-003-get-by-category-returns-all-reporting-projections.sdp.md +++ b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-003-get-by-category-returns-all-reporting-projections.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "getByCategory returns all reporting projections" from packages/platform-core/tests/features/behavior/projection-categories/registry-lookup.feature +- outcome: Executable scenario: getByCategory returns all reporting projections + +```gwt +Given a projection registry with the following projections: +When I call getByCategory with "reporting" +Then I receive 1 projection +And the result contains "dailySales" +``` diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-004-get-by-category-returns-all-integration-projections.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-004-get-by-category-returns-all-integration-projections.sdp.md index 171e46ae..ac7b0501 100644 --- a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-004-get-by-category-returns-all-integration-projections.sdp.md +++ b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-004-get-by-category-returns-all-integration-projections.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "getByCategory returns all integration projections" from packages/platform-core/tests/features/behavior/projection-categories/registry-lookup.feature +- outcome: Executable scenario: getByCategory returns all integration projections + +```gwt +Given a projection registry with the following projections: +When I call getByCategory with "integration" +Then I receive 1 projection +And the result contains "orderStatusFeed" +``` diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-005-get-by-category-returns-empty-array-for-category-with-no-projections.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-005-get-by-category-returns-empty-array-for-category-with-no-projections.sdp.md index 5bfd7fc8..c06138c9 100644 --- a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-005-get-by-category-returns-empty-array-for-category-with-no-projections.sdp.md +++ b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-005-get-by-category-returns-empty-array-for-category-with-no-projections.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "getByCategory returns empty array for category with no projections" from packages/platform-core/tests/features/behavior/projection-categories/registry-lookup.feature +- outcome: Executable scenario: getByCategory returns empty array for category with no projections + +```gwt +Given a projection registry with the following projections: +And an empty projection registry +When I call getByCategory with "view" +Then I receive 0 projections +``` diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-006-target-view-projections-for-reactive-layer.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-006-target-view-projections-for-reactive-layer.sdp.md index 8888882f..8ab3b85f 100644 --- a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-006-target-view-projections-for-reactive-layer.sdp.md +++ b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-006-target-view-projections-for-reactive-layer.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Target view projections for reactive layer" from packages/platform-core/tests/features/behavior/projection-categories/registry-lookup.feature +- outcome: Executable scenario: Target view projections for reactive layer + +```gwt +Given a projection registry with the following projections: +When I call getByCategory with "view" +Then all returned projections have category "view" +And these are candidates for reactive subscriptions +``` diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-007-target-integration-projections-for-event-bus-routing.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-007-target-integration-projections-for-event-bus-routing.sdp.md index f51babf4..f9426d8a 100644 --- a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-007-target-integration-projections-for-event-bus-routing.sdp.md +++ b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-007-target-integration-projections-for-event-bus-routing.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Target integration projections for EventBus routing" from packages/platform-core/tests/features/behavior/projection-categories/registry-lookup.feature +- outcome: Executable scenario: Target integration projections for EventBus routing + +```gwt +Given a projection registry with the following projections: +When I call getByCategory with "integration" +Then all returned projections have category "integration" +And these are candidates for EventBus publication +``` diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.sdp.md index fff95c66..cf82f3e8 100644 --- a/specs/behavior/platform-core/projection-categories/registry-lookup.sdp.md +++ b/specs/behavior/platform-core/projection-categories/registry-lookup.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: to query projections by category from the registry so that I can target specific projection types for different purposes (test carrier: packages/platform-core/tests/features/behavior/projection-categories/registry-lookup.feature) +- actor: a platform developer +- outcome: to query projections by category from the registry so that I can target specific projection types for different purposes diff --git a/specs/behavior/platform-core/projections/categories.examples/s-001-projection-category-schema-accepts-all-valid-categories.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-001-projection-category-schema-accepts-all-valid-categories.sdp.md index 0dd34562..a921704f 100644 --- a/specs/behavior/platform-core/projections/categories.examples/s-001-projection-category-schema-accepts-all-valid-categories.sdp.md +++ b/specs/behavior/platform-core/projections/categories.examples/s-001-projection-category-schema-accepts-all-valid-categories.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "ProjectionCategorySchema accepts all valid categories" from packages/platform-core/tests/features/behavior/projections/categories.feature +- outcome: Executable scenario: ProjectionCategorySchema accepts all valid categories + +```gwt +Given the feature fixture is in place +When I parse each valid category through ProjectionCategorySchema +Then all parse results succeed for: +``` diff --git a/specs/behavior/platform-core/projections/categories.examples/s-002-projection-category-schema-rejects-invalid-values.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-002-projection-category-schema-rejects-invalid-values.sdp.md index 35d2dbba..9751d015 100644 --- a/specs/behavior/platform-core/projections/categories.examples/s-002-projection-category-schema-rejects-invalid-values.sdp.md +++ b/specs/behavior/platform-core/projections/categories.examples/s-002-projection-category-schema-rejects-invalid-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "ProjectionCategorySchema rejects invalid values" from packages/platform-core/tests/features/behavior/projections/categories.feature +- outcome: Executable scenario: ProjectionCategorySchema rejects invalid values + +```gwt +Given the feature fixture is in place +When I parse each invalid value through ProjectionCategorySchema +Then all parse results fail for: +``` diff --git a/specs/behavior/platform-core/projections/categories.examples/s-003-projection-category-schema-rejects-non-string-types.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-003-projection-category-schema-rejects-non-string-types.sdp.md index 1de00f31..c81af463 100644 --- a/specs/behavior/platform-core/projections/categories.examples/s-003-projection-category-schema-rejects-non-string-types.sdp.md +++ b/specs/behavior/platform-core/projections/categories.examples/s-003-projection-category-schema-rejects-non-string-types.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "ProjectionCategorySchema rejects non-string types" from packages/platform-core/tests/features/behavior/projections/categories.feature +- outcome: Executable scenario: ProjectionCategorySchema rejects non-string types + +```gwt +Given the feature fixture is in place +When I parse non-string types through ProjectionCategorySchema +Then the schema rejects the number 123 +And the schema rejects null +``` diff --git a/specs/behavior/platform-core/projections/categories.examples/s-004-is-projection-category-rejects-objects.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-004-is-projection-category-rejects-objects.sdp.md index 24f2d992..92c28d63 100644 --- a/specs/behavior/platform-core/projections/categories.examples/s-004-is-projection-category-rejects-objects.sdp.md +++ b/specs/behavior/platform-core/projections/categories.examples/s-004-is-projection-category-rejects-objects.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isProjectionCategory rejects objects" from packages/platform-core/tests/features/behavior/projections/categories.feature +- outcome: Executable scenario: isProjectionCategory rejects objects + +```gwt +Given the feature fixture is in place +When I call isProjectionCategory with an empty object +Then the type guard returns false +``` diff --git a/specs/behavior/platform-core/projections/categories.examples/s-005-is-projection-category-rejects-arrays.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-005-is-projection-category-rejects-arrays.sdp.md index 534249df..6ad6372b 100644 --- a/specs/behavior/platform-core/projections/categories.examples/s-005-is-projection-category-rejects-arrays.sdp.md +++ b/specs/behavior/platform-core/projections/categories.examples/s-005-is-projection-category-rejects-arrays.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isProjectionCategory rejects arrays" from packages/platform-core/tests/features/behavior/projections/categories.feature +- outcome: Executable scenario: isProjectionCategory rejects arrays + +```gwt +Given the feature fixture is in place +When I call isProjectionCategory with an array containing "view" +Then the type guard returns false +``` diff --git a/specs/behavior/platform-core/projections/categories.examples/s-006-is-projection-category-rejects-booleans.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-006-is-projection-category-rejects-booleans.sdp.md index 20d6c564..05018d17 100644 --- a/specs/behavior/platform-core/projections/categories.examples/s-006-is-projection-category-rejects-booleans.sdp.md +++ b/specs/behavior/platform-core/projections/categories.examples/s-006-is-projection-category-rejects-booleans.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isProjectionCategory rejects booleans" from packages/platform-core/tests/features/behavior/projections/categories.feature +- outcome: Executable scenario: isProjectionCategory rejects booleans + +```gwt +Given the feature fixture is in place +When I call isProjectionCategory with boolean values +Then the type guard returns false for both true and false +``` diff --git a/specs/behavior/platform-core/projections/categories.examples/s-007-is-projection-category-rejects-whitespace-padded-strings.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-007-is-projection-category-rejects-whitespace-padded-strings.sdp.md index 48495a7d..5fc3a3e4 100644 --- a/specs/behavior/platform-core/projections/categories.examples/s-007-is-projection-category-rejects-whitespace-padded-strings.sdp.md +++ b/specs/behavior/platform-core/projections/categories.examples/s-007-is-projection-category-rejects-whitespace-padded-strings.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isProjectionCategory rejects whitespace-padded strings" from packages/platform-core/tests/features/behavior/projections/categories.feature +- outcome: Executable scenario: isProjectionCategory rejects whitespace-padded strings + +```gwt +Given the feature fixture is in place +When I call isProjectionCategory with whitespace-padded values +Then the type guard rejects space-padded view and tab-padded logic +``` diff --git a/specs/behavior/platform-core/projections/categories.examples/s-008-projection-validation-errors-has-expected-error-codes.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-008-projection-validation-errors-has-expected-error-codes.sdp.md index 4907cc06..554a2721 100644 --- a/specs/behavior/platform-core/projections/categories.examples/s-008-projection-validation-errors-has-expected-error-codes.sdp.md +++ b/specs/behavior/platform-core/projections/categories.examples/s-008-projection-validation-errors-has-expected-error-codes.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "PROJECTION_VALIDATION_ERRORS has expected error codes" from packages/platform-core/tests/features/behavior/projections/categories.feature +- outcome: Executable scenario: PROJECTION_VALIDATION_ERRORS has expected error codes + +```gwt +Given the feature fixture is in place +When the scenario runs +Then CATEGORY_REQUIRED error code equals "CATEGORY_REQUIRED" +And INVALID_CATEGORY error code equals "INVALID_CATEGORY" +``` diff --git a/specs/behavior/platform-core/projections/categories.examples/s-009-validate-projection-category-rejects-non-string-types.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-009-validate-projection-category-rejects-non-string-types.sdp.md index 2041e5e8..3394976e 100644 --- a/specs/behavior/platform-core/projections/categories.examples/s-009-validate-projection-category-rejects-non-string-types.sdp.md +++ b/specs/behavior/platform-core/projections/categories.examples/s-009-validate-projection-category-rejects-non-string-types.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "validateProjectionCategory rejects non-string types" from packages/platform-core/tests/features/behavior/projections/categories.feature +- outcome: Executable scenario: validateProjectionCategory rejects non-string types + +```gwt +Given the feature fixture is in place +When I validate non-string types as projection categories +Then all produce INVALID_CATEGORY errors: +``` diff --git a/specs/behavior/platform-core/projections/categories.examples/s-010-assert-valid-category-throws-category-required-for-undefined.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-010-assert-valid-category-throws-category-required-for-undefined.sdp.md index c067df2d..f06adde7 100644 --- a/specs/behavior/platform-core/projections/categories.examples/s-010-assert-valid-category-throws-category-required-for-undefined.sdp.md +++ b/specs/behavior/platform-core/projections/categories.examples/s-010-assert-valid-category-throws-category-required-for-undefined.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "assertValidCategory throws CATEGORY_REQUIRED for undefined" from packages/platform-core/tests/features/behavior/projections/categories.feature +- outcome: Executable scenario: assertValidCategory throws CATEGORY_REQUIRED for undefined + +```gwt +Given the feature fixture is in place +When I call assertValidCategory with undefined +Then the error message contains "CATEGORY_REQUIRED" +``` diff --git a/specs/behavior/platform-core/projections/categories.sdp.md b/specs/behavior/platform-core/projections/categories.sdp.md index c071d93e..37ad469d 100644 --- a/specs/behavior/platform-core/projections/categories.sdp.md +++ b/specs/behavior/platform-core/projections/categories.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Covers Zod schema validation, type guard edge cases for non-string types, validation error constants, and validateProjectionCategory edge cases that complement the core category-definitions and explicit-declaration features. (test carrier: packages/platform-core/tests/features/behavior/projections/categories.feature) +- outcome: Projection Categories Edge Cases and Schema Validation + +## Behavior + +- rule: ProjectionCategorySchema accepts only the four canonical categories +- rule: isProjectionCategory returns false for all non-string types +- rule: PROJECTION_VALIDATION_ERRORS exposes known error codes +- rule: validateProjectionCategory returns INVALID_CATEGORY for non-string types +- rule: assertValidCategory throws CATEGORY_REQUIRED for undefined input diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-001-allowed-transitions-from-active-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-001-allowed-transitions-from-active-state.sdp.md index 57b294ed..ef3405f9 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-001-allowed-transitions-from-active-state.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-001-allowed-transitions-from-active-state.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Allowed transitions from active state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Allowed transitions from active state + +```gwt +Given the feature fixture is in place +When I check valid transitions from "active" +Then the following transitions are allowed: +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-002-rejected-transitions-from-active-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-002-rejected-transitions-from-active-state.sdp.md index 4402f0da..2e6a2cd8 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-002-rejected-transitions-from-active-state.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-002-rejected-transitions-from-active-state.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejected transitions from active state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Rejected transitions from active state + +```gwt +Given the feature fixture is in place +When I check valid transitions from "active" +Then the following transitions are rejected: +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-003-allowed-transitions-from-rebuilding-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-003-allowed-transitions-from-rebuilding-state.sdp.md index 0e019a1e..da26776b 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-003-allowed-transitions-from-rebuilding-state.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-003-allowed-transitions-from-rebuilding-state.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Allowed transitions from rebuilding state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Allowed transitions from rebuilding state + +```gwt +Given the feature fixture is in place +When I check valid transitions from "rebuilding" +Then the following transitions are allowed: +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-004-rejected-transitions-from-rebuilding-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-004-rejected-transitions-from-rebuilding-state.sdp.md index 8f2ea64b..d45a295b 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-004-rejected-transitions-from-rebuilding-state.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-004-rejected-transitions-from-rebuilding-state.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejected transitions from rebuilding state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Rejected transitions from rebuilding state + +```gwt +Given the feature fixture is in place +When I check valid transitions from "rebuilding" +Then the following transitions are rejected: +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-005-allowed-transitions-from-paused-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-005-allowed-transitions-from-paused-state.sdp.md index 82317fb6..b29bf526 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-005-allowed-transitions-from-paused-state.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-005-allowed-transitions-from-paused-state.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Allowed transitions from paused state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Allowed transitions from paused state + +```gwt +Given the feature fixture is in place +When I check valid transitions from "paused" +Then the following transitions are allowed: +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-006-rejected-transitions-from-paused-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-006-rejected-transitions-from-paused-state.sdp.md index 9efa6b97..4de56957 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-006-rejected-transitions-from-paused-state.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-006-rejected-transitions-from-paused-state.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejected transitions from paused state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Rejected transitions from paused state + +```gwt +Given the feature fixture is in place +When I check valid transitions from "paused" +Then the following transitions are rejected: +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-007-allowed-transitions-from-error-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-007-allowed-transitions-from-error-state.sdp.md index 0ab3b669..c0782524 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-007-allowed-transitions-from-error-state.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-007-allowed-transitions-from-error-state.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Allowed transitions from error state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Allowed transitions from error state + +```gwt +Given the feature fixture is in place +When I check valid transitions from "error" +Then the following transitions are allowed: +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-008-rejected-transitions-from-error-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-008-rejected-transitions-from-error-state.sdp.md index 0436fd5a..d37c7f6c 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-008-rejected-transitions-from-error-state.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-008-rejected-transitions-from-error-state.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejected transitions from error state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Rejected transitions from error state + +```gwt +Given the feature fixture is in place +When I check valid transitions from "error" +Then the following transitions are rejected: +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-009-valid-transitions-produce-correct-target-states.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-009-valid-transitions-produce-correct-target-states.sdp.md index b868af6e..8dfb0f1d 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-009-valid-transitions-produce-correct-target-states.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-009-valid-transitions-produce-correct-target-states.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Valid transitions produce correct target states" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Valid transitions produce correct target states + +```gwt +Given the feature fixture is in place +When the scenario runs +Then transitionState returns correct targets for: +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md index c3b4a8d0..504e2c1f 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Invalid transitions return null" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Invalid transitions return null + +```gwt +Given the feature fixture is in place +When the scenario runs +Then transitionState returns null for: +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-011-valid-events-from-active-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-011-valid-events-from-active-state.sdp.md index a7380293..87a667cd 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-011-valid-events-from-active-state.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-011-valid-events-from-active-state.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Valid events from active state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Valid events from active state + +```gwt +Given the feature fixture is in place +When I get valid events from "active" +Then the valid events are: +And the event count is 3 +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-012-valid-events-from-rebuilding-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-012-valid-events-from-rebuilding-state.sdp.md index 04166090..637beea5 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-012-valid-events-from-rebuilding-state.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-012-valid-events-from-rebuilding-state.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Valid events from rebuilding state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Valid events from rebuilding state + +```gwt +Given the feature fixture is in place +When I get valid events from "rebuilding" +Then the valid events are: +And the event count is 2 +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-013-valid-events-from-paused-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-013-valid-events-from-paused-state.sdp.md index 9031f7fa..840a3011 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-013-valid-events-from-paused-state.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-013-valid-events-from-paused-state.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Valid events from paused state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Valid events from paused state + +```gwt +Given the feature fixture is in place +When I get valid events from "paused" +Then the valid events are: +And the event count is 3 +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-014-valid-events-from-error-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-014-valid-events-from-error-state.sdp.md index 7e4e084e..189ecd1b 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-014-valid-events-from-error-state.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-014-valid-events-from-error-state.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Valid events from error state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Valid events from error state + +```gwt +Given the feature fixture is in place +When I get valid events from "error" +Then the valid events are: +And the event count is 2 +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-015-returns-all-10-valid-transitions-with-correct-structure.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-015-returns-all-10-valid-transitions-with-correct-structure.sdp.md index 9486eb89..7bac5c9a 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-015-returns-all-10-valid-transitions-with-correct-structure.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-015-returns-all-10-valid-transitions-with-correct-structure.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns all 10 valid transitions with correct structure" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Returns all 10 valid transitions with correct structure + +```gwt +Given the feature fixture is in place +When I get all transitions +Then the transition count is 10 +And each transition has "from", "event", and "to" properties +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-016-all-expected-transitions-are-included.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-016-all-expected-transitions-are-included.sdp.md index 2bbe4b7a..7dd1614f 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-016-all-expected-transitions-are-included.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-016-all-expected-transitions-are-included.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "All expected transitions are included" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: All expected transitions are included + +```gwt +Given the feature fixture is in place +When I get all transitions +Then the transition list includes: +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-017-returns-same-array-reference-memoized.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-017-returns-same-array-reference-memoized.sdp.md index 83d9861f..ae55a205 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-017-returns-same-array-reference-memoized.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-017-returns-same-array-reference-memoized.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns same array reference (memoized)" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Returns same array reference (memoized) + +```gwt +Given the feature fixture is in place +When I get all transitions twice +Then both references are the same object +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-018-returns-new-state-for-valid-transition.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-018-returns-new-state-for-valid-transition.sdp.md index 0ab711e4..a951ed03 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-018-returns-new-state-for-valid-transition.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-018-returns-new-state-for-valid-transition.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns new state for valid transition" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Returns new state for valid transition + +```gwt +Given the feature fixture is in place +When I assert valid transition from "active" with "START_REBUILD" for "orderSummary" +Then the result state is "rebuilding" +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-019-throws-for-invalid-transition-with-projection-name.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-019-throws-for-invalid-transition-with-projection-name.sdp.md index 3968ccc7..f38eff14 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-019-throws-for-invalid-transition-with-projection-name.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-019-throws-for-invalid-transition-with-projection-name.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Throws for invalid transition with projection name" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Throws for invalid transition with projection name + +```gwt +Given the feature fixture is in place +When the scenario runs +Then assertValidTransition throws for: +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-020-all-states-are-reachable-from-at-least-one-other-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-020-all-states-are-reachable-from-at-least-one-other-state.sdp.md index f796f394..394e9ec0 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-020-all-states-are-reachable-from-at-least-one-other-state.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-020-all-states-are-reachable-from-at-least-one-other-state.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "All states are reachable from at least one other state" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: All states are reachable from at least one other state + +```gwt +Given the feature fixture is in place +When I get all transitions +Then every state is a target of at least one transition: +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-021-all-states-have-at-least-one-outgoing-transition.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-021-all-states-have-at-least-one-outgoing-transition.sdp.md index d460f341..3fec5bf8 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-021-all-states-have-at-least-one-outgoing-transition.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-021-all-states-have-at-least-one-outgoing-transition.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "All states have at least one outgoing transition" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: All states have at least one outgoing transition + +```gwt +Given the feature fixture is in place +When the scenario runs +Then every state has at least one valid event: +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-022-recovery-path-exists-from-error-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-022-recovery-path-exists-from-error-to-active.sdp.md index 76876b29..26450a01 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-022-recovery-path-exists-from-error-to-active.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-022-recovery-path-exists-from-error-to-active.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Recovery path exists from error to active" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Recovery path exists from error to active + +```gwt +Given the feature fixture is in place +When I transition from "error" with "RECOVER" +Then the result state is "active" +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-023-error-path-exists-from-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-023-error-path-exists-from-active.sdp.md index 9238f4ee..63d4b504 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-023-error-path-exists-from-active.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-023-error-path-exists-from-active.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Error path exists from active" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Error path exists from active + +```gwt +Given the feature fixture is in place +When I transition from "active" with "FAIL" +Then the result state is "error" +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-024-rebuild-retry-path-exists-from-error.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-024-rebuild-retry-path-exists-from-error.sdp.md index 8bf86822..ab39c740 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-024-rebuild-retry-path-exists-from-error.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-024-rebuild-retry-path-exists-from-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rebuild retry path exists from error" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Rebuild retry path exists from error + +```gwt +Given the feature fixture is in place +When I transition from "error" with "START_REBUILD" +Then the result state is "rebuilding" +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-025-normal-processing-active-state-allows-fail-event.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-025-normal-processing-active-state-allows-fail-event.sdp.md index 33e62e4b..a8178dd9 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-025-normal-processing-active-state-allows-fail-event.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-025-normal-processing-active-state-allows-fail-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Normal processing — active state allows FAIL event" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Normal processing — active state allows FAIL event + +```gwt +Given the projection is in "active" state +When the scenario runs +Then the valid events include "FAIL" +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-026-rebuild-workflow-active-to-rebuilding-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-026-rebuild-workflow-active-to-rebuilding-to-active.sdp.md index a2252536..38463723 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-026-rebuild-workflow-active-to-rebuilding-to-active.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-026-rebuild-workflow-active-to-rebuilding-to-active.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Rebuild workflow — active to rebuilding to active" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Rebuild workflow — active to rebuilding to active + +```gwt +Given the projection is in "active" state +When I apply event "START_REBUILD" and I apply event "COMPLETE_REBUILD" +Then the current state is "rebuilding" +And the current state is "active" +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-027-error-recovery-workflow-active-to-error-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-027-error-recovery-workflow-active-to-error-to-active.sdp.md index ff9781a8..26364d6a 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-027-error-recovery-workflow-active-to-error-to-active.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-027-error-recovery-workflow-active-to-error-to-active.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Error recovery workflow — active to error to active" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Error recovery workflow — active to error to active + +```gwt +Given the projection is in "active" state +When I apply event "FAIL" and I apply event "RECOVER" +Then the current state is "error" +And the current state is "active" +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-028-error-rebuild-workflow-active-to-error-to-rebuilding-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-028-error-rebuild-workflow-active-to-error-to-rebuilding-to-active.sdp.md index 37fa38e9..c48790ba 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-028-error-rebuild-workflow-active-to-error-to-rebuilding-to-active.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-028-error-rebuild-workflow-active-to-error-to-rebuilding-to-active.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Error rebuild workflow — active to error to rebuilding to active" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Error rebuild workflow — active to error to rebuilding to active + +```gwt +Given the projection is in "active" state +When I apply event "FAIL" and I apply event "START_REBUILD" and I apply event "COMPLETE_REBUILD" +Then the current state is "error" +And the current state is "rebuilding" +And the current state is "active" +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-029-pause-and-resume-workflow-active-to-paused-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-029-pause-and-resume-workflow-active-to-paused-to-active.sdp.md index b26e7e2e..61a89e35 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-029-pause-and-resume-workflow-active-to-paused-to-active.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-029-pause-and-resume-workflow-active-to-paused-to-active.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Pause and resume workflow — active to paused to active" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Pause and resume workflow — active to paused to active + +```gwt +Given the projection is in "active" state +When I apply event "PAUSE" and I apply event "RESUME" +Then the current state is "paused" +And the current state is "active" +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-030-rebuild-failure-workflow-active-to-rebuilding-to-error-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-030-rebuild-failure-workflow-active-to-rebuilding-to-error-to-active.sdp.md index 92687f7a..b94cb252 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-030-rebuild-failure-workflow-active-to-rebuilding-to-error-to-active.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-030-rebuild-failure-workflow-active-to-rebuilding-to-error-to-active.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Rebuild failure workflow — active to rebuilding to error to active" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Rebuild failure workflow — active to rebuilding to error to active + +```gwt +Given the projection is in "active" state +When I apply event "START_REBUILD" and I apply event "FAIL" and I apply event "RECOVER" +Then the current state is "rebuilding" +And the current state is "error" +And the current state is "active" +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-031-paused-rebuild-workflow-active-to-paused-to-rebuilding-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-031-paused-rebuild-workflow-active-to-paused-to-rebuilding-to-active.sdp.md index f8dac940..aec43896 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-031-paused-rebuild-workflow-active-to-paused-to-rebuilding-to-active.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-031-paused-rebuild-workflow-active-to-paused-to-rebuilding-to-active.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Paused rebuild workflow — active to paused to rebuilding to active" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Paused rebuild workflow — active to paused to rebuilding to active + +```gwt +Given the projection is in "active" state +When I apply event "PAUSE" and I apply event "START_REBUILD" and I apply event "COMPLETE_REBUILD" +Then the current state is "paused" +And the current state is "rebuilding" +And the current state is "active" +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-032-paused-error-workflow-active-to-paused-to-error-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-032-paused-error-workflow-active-to-paused-to-error-to-active.sdp.md index de15895d..85930b9c 100644 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-032-paused-error-workflow-active-to-paused-to-error-to-active.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.examples/s-032-paused-error-workflow-active-to-paused-to-error-to-active.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Paused error workflow — active to paused to error to active" from packages/platform-core/tests/features/behavior/projections/lifecycle.feature +- outcome: Executable scenario: Paused error workflow — active to paused to error to active + +```gwt +Given the projection is in "active" state +When I apply event "PAUSE" and I apply event "FAIL" and I apply event "RECOVER" +Then the current state is "paused" +And the current state is "error" +And the current state is "active" +``` diff --git a/specs/behavior/platform-core/projections/lifecycle.sdp.md b/specs/behavior/platform-core/projections/lifecycle.sdp.md index f5d7a4d9..1271fb54 100644 --- a/specs/behavior/platform-core/projections/lifecycle.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: a projection lifecycle state machine so that projection state transitions are validated and auditable (test carrier: packages/platform-core/tests/features/behavior/projections/lifecycle.feature) +- actor: a platform developer +- outcome: a projection lifecycle state machine so that projection state transitions are validated and auditable + +## Behavior + +- rule: isValidTransition returns true for allowed transitions and false for disallowed +- rule: transitionState returns the target state for valid transitions and null for invalid +- rule: getValidEventsFrom returns the set of allowed events for each state +- rule: getAllTransitions returns all valid transitions in the state machine +- rule: assertValidTransition returns new state or throws with projection name +- rule: The state machine is complete — all states are reachable and can transition out +- rule: Typical multi-step workflows complete successfully diff --git a/specs/behavior/platform-core/projections/registry.examples/s-001-register-a-single-projection.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-001-register-a-single-projection.sdp.md index 78cd7041..c2c1e097 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-001-register-a-single-projection.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-001-register-a-single-projection.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Register a single projection" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: Register a single projection + +```gwt +Given an empty projection registry +When I register the "orderSummary" projection +Then the registry has "orderSummary" +And the registry size is 1 +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-002-register-multiple-projections.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-002-register-multiple-projections.sdp.md index 53c2f878..84e452ad 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-002-register-multiple-projections.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-002-register-multiple-projections.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Register multiple projections" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: Register multiple projections + +```gwt +Given an empty projection registry +When I register all standard projections +Then the registry size is 3 +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-003-duplicate-projection-name-throws-error.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-003-duplicate-projection-name-throws-error.sdp.md index 96dab727..cdb196a2 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-003-duplicate-projection-name-throws-error.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-003-duplicate-projection-name-throws-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Duplicate projection name throws error" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: Duplicate projection name throws error + +```gwt +Given a registry with the "orderSummary" projection +When I attempt to register "orderSummary" again +Then it throws "Projection \"orderSummary\" is already registered" +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-004-get-returns-projection-by-name.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-004-get-returns-projection-by-name.sdp.md index 1eba382e..36fc06fe 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-004-get-returns-projection-by-name.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-004-get-returns-projection-by-name.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Get returns projection by name" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: Get returns projection by name + +```gwt +Given a registry with "orderSummary" and "productCatalog" projections +When I get the "orderSummary" projection +Then the projection name is "orderSummary" +And the target table is "orderSummaries" +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-005-get-returns-undefined-for-unknown-projection.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-005-get-returns-undefined-for-unknown-projection.sdp.md index 54d7b89b..deb846d5 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-005-get-returns-undefined-for-unknown-projection.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-005-get-returns-undefined-for-unknown-projection.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Get returns undefined for unknown projection" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: Get returns undefined for unknown projection + +```gwt +Given a registry with "orderSummary" and "productCatalog" projections +When I get the "unknownProjection" projection +Then the result is undefined +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-006-has-returns-true-for-registered-projection.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-006-has-returns-true-for-registered-projection.sdp.md index cd162c67..3b2827b9 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-006-has-returns-true-for-registered-projection.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-006-has-returns-true-for-registered-projection.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Has returns true for registered projection" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: Has returns true for registered projection + +```gwt +Given a registry with the "orderSummary" projection +When I check if the registry has "orderSummary" +Then the result is true +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-007-has-returns-false-for-unregistered-projection.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-007-has-returns-false-for-unregistered-projection.sdp.md index 25a865c7..fbba3a8d 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-007-has-returns-false-for-unregistered-projection.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-007-has-returns-false-for-unregistered-projection.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Has returns false for unregistered projection" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: Has returns false for unregistered projection + +```gwt +Given an empty projection registry +When I check if the registry has "unknownProjection" +Then the result is false +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md index b56c3fcc..86061011 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "List returns empty array for empty registry" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: List returns empty array for empty registry + +```gwt +Given an empty projection registry +When I list all projections +Then the list is empty +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-009-list-returns-all-registered-projections.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-009-list-returns-all-registered-projections.sdp.md index 59c47cb6..4cc50842 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-009-list-returns-all-registered-projections.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-009-list-returns-all-registered-projections.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "List returns all registered projections" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: List returns all registered projections + +```gwt +Given a registry with "orderSummary" and "productCatalog" projections +When I list all projections +Then the list has 2 projections +And the list contains all of: +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md index 4ff2d7ce..dc9c1949 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Size is 0 for empty registry" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: Size is 0 for empty registry + +```gwt +Given an empty projection registry +When the scenario runs +Then the registry size is 0 +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-011-size-reflects-registration-count.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-011-size-reflects-registration-count.sdp.md index 47b687dc..76e103df 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-011-size-reflects-registration-count.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-011-size-reflects-registration-count.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Size reflects registration count" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: Size reflects registration count + +```gwt +Given a registry with "orderSummary" and "productCatalog" projections +When the scenario runs +Then the registry size is 2 +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-012-get-by-event-type-returns-multiple-matching-projections.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-012-get-by-event-type-returns-multiple-matching-projections.sdp.md index dc0b2423..8195a614 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-012-get-by-event-type-returns-multiple-matching-projections.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-012-get-by-event-type-returns-multiple-matching-projections.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "GetByEventType returns multiple matching projections" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: GetByEventType returns multiple matching projections + +```gwt +Given a registry with all standard projections +When I get projections by event type "OrderCreated" +Then the event lookup returns 2 projections +And the event lookup contains all of: +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-013-get-by-event-type-returns-single-context-specific-projection.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-013-get-by-event-type-returns-single-context-specific-projection.sdp.md index 7e0dc696..b024386f 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-013-get-by-event-type-returns-single-context-specific-projection.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-013-get-by-event-type-returns-single-context-specific-projection.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "GetByEventType returns single context-specific projection" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: GetByEventType returns single context-specific projection + +```gwt +Given a registry with all standard projections +When I get projections by event type "ProductCreated" +Then the event lookup returns 1 projection +And the first event lookup result is "productCatalog" +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-014-get-by-event-type-returns-empty-for-unknown-event.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-014-get-by-event-type-returns-empty-for-unknown-event.sdp.md index 1521d33b..dc293797 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-014-get-by-event-type-returns-empty-for-unknown-event.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-014-get-by-event-type-returns-empty-for-unknown-event.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "GetByEventType returns empty for unknown event" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: GetByEventType returns empty for unknown event + +```gwt +Given a registry with all standard projections +When I get projections by event type "UnknownEvent" +Then the event lookup returns 0 projections +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-015-get-all-event-types-returns-empty-for-empty-registry.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-015-get-all-event-types-returns-empty-for-empty-registry.sdp.md index 0d1a3991..2948c149 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-015-get-all-event-types-returns-empty-for-empty-registry.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-015-get-all-event-types-returns-empty-for-empty-registry.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "GetAllEventTypes returns empty for empty registry" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: GetAllEventTypes returns empty for empty registry + +```gwt +Given an empty projection registry +When I get all event types +Then the event types list is empty +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-016-get-all-event-types-returns-sorted-unique-event-types.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-016-get-all-event-types-returns-sorted-unique-event-types.sdp.md index e10e593a..a3fc6bb8 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-016-get-all-event-types-returns-sorted-unique-event-types.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-016-get-all-event-types-returns-sorted-unique-event-types.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "GetAllEventTypes returns sorted unique event types" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: GetAllEventTypes returns sorted unique event types + +```gwt +Given a registry with all standard projections +When I get all event types +Then the event types are sorted +And the event types are unique +And the event types include all of: +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-017-get-by-context-filters-by-orders-context.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-017-get-by-context-filters-by-orders-context.sdp.md index f80e593b..79e7d60b 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-017-get-by-context-filters-by-orders-context.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-017-get-by-context-filters-by-orders-context.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "GetByContext filters by orders context" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: GetByContext filters by orders context + +```gwt +Given a registry with all standard projections +When I get projections by context "orders" +Then the context lookup returns 1 projection +And the first context lookup result is "orderSummary" +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-018-get-by-context-filters-by-inventory-context.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-018-get-by-context-filters-by-inventory-context.sdp.md index d92603f6..90506e29 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-018-get-by-context-filters-by-inventory-context.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-018-get-by-context-filters-by-inventory-context.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "GetByContext filters by inventory context" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: GetByContext filters by inventory context + +```gwt +Given a registry with all standard projections +When I get projections by context "inventory" +Then the context lookup returns 1 projection +And the first context lookup result is "productCatalog" +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-019-get-by-context-filters-by-cross-context.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-019-get-by-context-filters-by-cross-context.sdp.md index 0434f092..83ea1572 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-019-get-by-context-filters-by-cross-context.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-019-get-by-context-filters-by-cross-context.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "GetByContext filters by cross-context" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: GetByContext filters by cross-context + +```gwt +Given a registry with all standard projections +When I get projections by context "cross-context" +Then the context lookup returns 1 projection +And the first context lookup result is "orderWithInventory" +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-020-get-by-context-returns-empty-for-unknown-context.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-020-get-by-context-returns-empty-for-unknown-context.sdp.md index d1cda6aa..c66cd706 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-020-get-by-context-returns-empty-for-unknown-context.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-020-get-by-context-returns-empty-for-unknown-context.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "GetByContext returns empty for unknown context" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: GetByContext returns empty for unknown context + +```gwt +Given a registry with all standard projections +When I get projections by context "unknown" +Then the context lookup returns 0 projections +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-021-get-rebuild-order-returns-empty-for-empty-registry.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-021-get-rebuild-order-returns-empty-for-empty-registry.sdp.md index c12cf9e3..5fd76fc9 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-021-get-rebuild-order-returns-empty-for-empty-registry.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-021-get-rebuild-order-returns-empty-for-empty-registry.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "GetRebuildOrder returns empty for empty registry" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: GetRebuildOrder returns empty for empty registry + +```gwt +Given an empty projection registry +When I get the rebuild order +Then the rebuild order is empty +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-022-get-rebuild-order-places-primary-before-cross-context.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-022-get-rebuild-order-places-primary-before-cross-context.sdp.md index 548f8ced..504f5d5f 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-022-get-rebuild-order-places-primary-before-cross-context.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-022-get-rebuild-order-places-primary-before-cross-context.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "GetRebuildOrder places primary before cross-context" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: GetRebuildOrder places primary before cross-context + +```gwt +Given a registry with projections registered in reverse order +When I get the rebuild order +Then "orderSummary" appears before "orderWithInventory" +And "productCatalog" appears before "orderWithInventory" +And the rebuild order has 3 projections +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-023-get-by-category-returns-view-projections.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-023-get-by-category-returns-view-projections.sdp.md index 3580fe14..b13209a7 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-023-get-by-category-returns-view-projections.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-023-get-by-category-returns-view-projections.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "GetByCategory returns view projections" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: GetByCategory returns view projections + +```gwt +Given a registry with all five category projections +When I get projections by category "view" +Then the category lookup returns 2 projections +And the category lookup contains all of: +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-024-get-by-category-returns-logic-projections.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-024-get-by-category-returns-logic-projections.sdp.md index 631be229..475a4b1f 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-024-get-by-category-returns-logic-projections.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-024-get-by-category-returns-logic-projections.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "GetByCategory returns logic projections" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: GetByCategory returns logic projections + +```gwt +Given a registry with all five category projections +When I get projections by category "logic" +Then the category lookup returns 1 projection +And the first category lookup result is "orderExistence" +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-025-get-by-category-returns-reporting-projections.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-025-get-by-category-returns-reporting-projections.sdp.md index 3d9f4031..a12e9ebe 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-025-get-by-category-returns-reporting-projections.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-025-get-by-category-returns-reporting-projections.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "GetByCategory returns reporting projections" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: GetByCategory returns reporting projections + +```gwt +Given a registry with all five category projections +When I get projections by category "reporting" +Then the category lookup returns 1 projection +And the first category lookup result is "dailySales" +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-026-get-by-category-returns-integration-projections.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-026-get-by-category-returns-integration-projections.sdp.md index 1c90e2a1..ea1990e1 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-026-get-by-category-returns-integration-projections.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-026-get-by-category-returns-integration-projections.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "GetByCategory returns integration projections" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: GetByCategory returns integration projections + +```gwt +Given a registry with all five category projections +When I get projections by category "integration" +Then the category lookup returns 1 projection +And the first category lookup result is "orderWithInventory" +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-027-get-by-category-returns-empty-when-no-projections-match.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-027-get-by-category-returns-empty-when-no-projections-match.sdp.md index c8eed1ff..472c235c 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-027-get-by-category-returns-empty-when-no-projections-match.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-027-get-by-category-returns-empty-when-no-projections-match.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "GetByCategory returns empty when no projections match" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: GetByCategory returns empty when no projections match + +```gwt +Given a registry with the "orderSummary" projection +When I get projections by category "logic" +Then the category lookup returns 0 projections +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-028-get-by-category-verifies-all-results-have-requested-category.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-028-get-by-category-verifies-all-results-have-requested-category.sdp.md index ac35e073..901563fe 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-028-get-by-category-verifies-all-results-have-requested-category.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-028-get-by-category-verifies-all-results-have-requested-category.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "GetByCategory verifies all results have requested category" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: GetByCategory verifies all results have requested category + +```gwt +Given a registry with all five category projections +When I get projections by category "view" +Then all returned projections have category "view" +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-029-get-by-category-works-regardless-of-registration-order.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-029-get-by-category-works-regardless-of-registration-order.sdp.md index 34ffc5b2..2dbbe3fc 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-029-get-by-category-works-regardless-of-registration-order.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-029-get-by-category-works-regardless-of-registration-order.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "GetByCategory works regardless of registration order" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: GetByCategory works regardless of registration order + +```gwt +Given a registry with projections registered in non-category-grouped order +When I get projections by category "view" +Then the category lookup returns 2 projections +And the category lookup names sorted are "orderSummary" and "productCatalog" +``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-030-category-index-is-maintained-incrementally.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-030-category-index-is-maintained-incrementally.sdp.md index 780ce78c..7784d581 100644 --- a/specs/behavior/platform-core/projections/registry.examples/s-030-category-index-is-maintained-incrementally.sdp.md +++ b/specs/behavior/platform-core/projections/registry.examples/s-030-category-index-is-maintained-incrementally.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Category index is maintained incrementally" from packages/platform-core/tests/features/behavior/projections/registry.feature +- outcome: Executable scenario: Category index is maintained incrementally + +```gwt +Given an empty projection registry +When I register "orderSummary" with category "view" and I register "orderExistence" with category "logic" and I register "productCatalog" with category "view" +Then the category lookup for "view" returns 1 projection +And the category counts are: +And the category lookup for "view" returns 2 projections +``` diff --git a/specs/behavior/platform-core/projections/registry.sdp.md b/specs/behavior/platform-core/projections/registry.sdp.md index f5ff257a..7f618afa 100644 --- a/specs/behavior/platform-core/projections/registry.sdp.md +++ b/specs/behavior/platform-core/projections/registry.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: The ProjectionRegistry provides CRUD operations and lookup capabilities for managing projection definitions across bounded contexts. (test carrier: packages/platform-core/tests/features/behavior/projections/registry.feature) +- outcome: Projection Registry CRUD and Lookup + +## Behavior + +- rule: Registry accepts and stores projection definitions +- rule: Registry returns projection definitions by name +- rule: Registry checks existence of projection definitions +- rule: Registry lists all registered projection definitions +- rule: Registry reports its size accurately +- rule: Registry looks up projections by event type subscription +- rule: Registry aggregates all subscribed event types +- rule: Registry filters projections by bounded context +- rule: Registry determines projection rebuild ordering +- rule: Registry filters projections by category with indexed lookup diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-001-process-event-when-no-checkpoint-exists.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-001-process-event-when-no-checkpoint-exists.sdp.md index 884a2b9f..c1f66800 100644 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-001-process-event-when-no-checkpoint-exists.sdp.md +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-001-process-event-when-no-checkpoint-exists.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Process event when no checkpoint exists" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature +- outcome: Executable scenario: Process event when no checkpoint exists + +```gwt +Given no checkpoint exists for partition "ord_123" +When I call withCheckpoint with projection "orderSummary" partition "ord_123" position 1000 event "evt_001" +Then the result status is "processed" +And the process callback was invoked 1 time +And the updateCheckpoint callback was invoked 1 time +And the processed events list contains: +``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md index ceb327e3..254c75c7 100644 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Process event when globalPosition exceeds checkpoint" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature +- outcome: Executable scenario: Process event when globalPosition exceeds checkpoint + +```gwt +Given a checkpoint exists for partition "ord_123" at position 1000 with event "evt_001" +When I call withCheckpoint with projection "orderSummary" partition "ord_123" position 2000 event "evt_002" +Then the result status is "processed" +And the process callback was invoked 1 time +``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-003-checkpoint-is-updated-after-processing.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-003-checkpoint-is-updated-after-processing.sdp.md index 6061337f..83a6e685 100644 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-003-checkpoint-is-updated-after-processing.sdp.md +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-003-checkpoint-is-updated-after-processing.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Checkpoint is updated after processing" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature +- outcome: Executable scenario: Checkpoint is updated after processing + +```gwt +Given no checkpoint exists for partition "ord_123" +When I call withCheckpoint with projection "orderSummary" partition "ord_123" position 1000 event "evt_001" +Then the saved checkpoint for partition "ord_123" has all fields: +And the saved checkpoint updatedAt is recent +``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md index c61ba6ba..5ef0851d 100644 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Skip event when globalPosition equals checkpoint" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature +- outcome: Executable scenario: Skip event when globalPosition equals checkpoint + +```gwt +Given a checkpoint exists for partition "ord_123" at position 1000 with event "evt_001" +When I call withCheckpoint with projection "orderSummary" partition "ord_123" position 1000 event "evt_001" +Then the result status is "skipped" +And the process callback was not invoked +And the updateCheckpoint callback was not invoked +``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md index 1f7ebaaa..b1747628 100644 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Skip event when globalPosition is less than checkpoint" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature +- outcome: Executable scenario: Skip event when globalPosition is less than checkpoint + +```gwt +Given a checkpoint exists for partition "ord_123" at position 2000 with event "evt_002" +When I call withCheckpoint with projection "orderSummary" partition "ord_123" position 1000 event "evt_001" +Then the result status is "skipped" +And the process callback was not invoked +``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-006-separate-checkpoints-per-partition.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-006-separate-checkpoints-per-partition.sdp.md index ae568bf0..eb28b977 100644 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-006-separate-checkpoints-per-partition.sdp.md +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-006-separate-checkpoints-per-partition.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Separate checkpoints per partition" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature +- outcome: Executable scenario: Separate checkpoints per partition + +```gwt +Given no checkpoint exists for partition "ord_001" +And no checkpoint exists for partition "ord_002" +When I process partition "ord_001" with projection "orderSummary" position 1000 event "evt_001" and I process partition "ord_002" with projection "orderSummary" position 500 event "evt_002" +Then both partitions were processed +And the saved checkpoint for partition "ord_001" has lastGlobalPosition 1000 +And the saved checkpoint for partition "ord_002" has lastGlobalPosition 500 +``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-007-same-position-in-different-partitions-does-not-cause-skip.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-007-same-position-in-different-partitions-does-not-cause-skip.sdp.md index 711aa78f..482f6d00 100644 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-007-same-position-in-different-partitions-does-not-cause-skip.sdp.md +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-007-same-position-in-different-partitions-does-not-cause-skip.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Same position in different partitions does not cause skip" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature +- outcome: Executable scenario: Same position in different partitions does not cause skip + +```gwt +Given a checkpoint exists for partition "ord_001" at position 1000 with event "evt_001" +When I call withCheckpoint with projection "orderSummary" partition "ord_002" position 1000 event "evt_002" +Then the result status is "processed" +And the process callback was invoked 1 time +``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-008-checkpoint-not-updated-when-process-throws.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-008-checkpoint-not-updated-when-process-throws.sdp.md index 1325d0fa..dd90c31c 100644 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-008-checkpoint-not-updated-when-process-throws.sdp.md +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-008-checkpoint-not-updated-when-process-throws.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Checkpoint not updated when process throws" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature +- outcome: Executable scenario: Checkpoint not updated when process throws + +```gwt +Given no checkpoint exists for partition "ord_123" +When I call withCheckpoint with a failing process for partition "ord_123" position 1000 event "evt_001" +Then the call rejects with "Process failed: database unavailable" +And the updateCheckpoint callback was not invoked +And no checkpoint exists in store for partition "ord_123" +``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-009-retry-succeeds-after-process-failure.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-009-retry-succeeds-after-process-failure.sdp.md index 33842dec..bdecde42 100644 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-009-retry-succeeds-after-process-failure.sdp.md +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-009-retry-succeeds-after-process-failure.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Retry succeeds after process failure" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature +- outcome: Executable scenario: Retry succeeds after process failure + +```gwt +Given no checkpoint exists for partition "ord_123" +When I call withCheckpoint with a transiently failing process for partition "ord_123" position 1000 event "evt_001" +Then the first attempt rejects with "Transient failure" +And the retry attempt succeeds with status "processed" +And the processed events list contains: +And the saved checkpoint for partition "ord_123" has lastGlobalPosition 1000 +``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-010-all-checkpoint-fields-stored-correctly.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-010-all-checkpoint-fields-stored-correctly.sdp.md index 39977b31..40254574 100644 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-010-all-checkpoint-fields-stored-correctly.sdp.md +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-010-all-checkpoint-fields-stored-correctly.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "All checkpoint fields stored correctly" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature +- outcome: Executable scenario: All checkpoint fields stored correctly + +```gwt +Given no checkpoint exists for partition "prod_xyz" +When I call withCheckpoint with projection "productCatalog" partition "prod_xyz" position 12345 event "evt_abc123" +Then updateCheckpoint was called with checkpoint matching: +``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-011-helper-processes-and-stores-checkpoint.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-011-helper-processes-and-stores-checkpoint.sdp.md index 080bab22..23e36d07 100644 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-011-helper-processes-and-stores-checkpoint.sdp.md +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-011-helper-processes-and-stores-checkpoint.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Helper processes and stores checkpoint" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature +- outcome: Executable scenario: Helper processes and stores checkpoint + +```gwt +Given the feature fixture is in place +When I create a checkpoint helper and process partition "ord_123" position 1000 event "evt_001" +Then the helper result status is "processed" +And the helper processed events list contains: +And the helper checkpoint for partition "ord_123" has lastGlobalPosition 1000 +``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-012-helper-maintains-checkpoint-semantics-across-calls.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-012-helper-maintains-checkpoint-semantics-across-calls.sdp.md index 74e21e0e..a7bfdc90 100644 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-012-helper-maintains-checkpoint-semantics-across-calls.sdp.md +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-012-helper-maintains-checkpoint-semantics-across-calls.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Helper maintains checkpoint semantics across calls" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature +- outcome: Executable scenario: Helper maintains checkpoint semantics across calls + +```gwt +Given the feature fixture is in place +When I create a checkpoint helper and run a three-call sequence on partition "ord_123" +Then the second call was skipped +And the helper processed events list contains: +``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-013-should-process-event-position-comparisons.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-013-should-process-event-position-comparisons.sdp.md index 82d60eb0..534c0167 100644 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-013-should-process-event-position-comparisons.sdp.md +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-013-should-process-event-position-comparisons.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "shouldProcessEvent position comparisons" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature +- outcome: Executable scenario: shouldProcessEvent position comparisons + +```gwt +Given the feature fixture is in place +When the scenario runs +Then shouldProcessEvent returns expected results for: +``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-014-initial-checkpoint-has-sentinel-values.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-014-initial-checkpoint-has-sentinel-values.sdp.md index d30f06aa..c7c2be42 100644 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-014-initial-checkpoint-has-sentinel-values.sdp.md +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-014-initial-checkpoint-has-sentinel-values.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Initial checkpoint has sentinel values" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature +- outcome: Executable scenario: Initial checkpoint has sentinel values + +```gwt +Given the feature fixture is in place +When I create an initial checkpoint for projection "orderSummary" partition "ord_123" +Then the initial checkpoint has all fields: +And the initial checkpoint updatedAt is greater than 0 +``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-015-each-initial-checkpoint-gets-a-unique-updated-at.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-015-each-initial-checkpoint-gets-a-unique-updated-at.sdp.md index 223206bd..1e66fffd 100644 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-015-each-initial-checkpoint-gets-a-unique-updated-at.sdp.md +++ b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-015-each-initial-checkpoint-gets-a-unique-updated-at.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Each initial checkpoint gets a unique updatedAt" from packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature +- outcome: Executable scenario: Each initial checkpoint gets a unique updatedAt + +```gwt +Given the feature fixture is in place +When I create two initial checkpoints with a delay +Then the second checkpoint updatedAt is greater than or equal to the first +``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.sdp.md index a9ae1780..3226dd18 100644 --- a/specs/behavior/platform-core/projections/with-checkpoint.sdp.md +++ b/specs/behavior/platform-core/projections/with-checkpoint.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Tests the checkpoint-based projection idempotency pattern including skip already-processed events, process new events, atomic checkpoint updates, and the createCheckpointHelper factory. (test carrier: packages/platform-core/tests/features/behavior/projections/with-checkpoint.feature) +- outcome: withCheckpoint Projection Idempotency + +## Behavior + +- rule: withCheckpoint processes events that have not been seen before +- rule: withCheckpoint skips events at or below the checkpoint position +- rule: withCheckpoint maintains separate checkpoints per partition key +- rule: withCheckpoint does not update checkpoint when processing fails +- rule: withCheckpoint stores all checkpoint fields correctly +- rule: createCheckpointHelper creates a reusable pre-configured helper +- rule: shouldProcessEvent returns true only when event position exceeds checkpoint +- rule: createInitialCheckpoint creates a checkpoint with sentinel values diff --git a/specs/behavior/platform-core/queries/factory.examples/s-001-single-result-query-descriptor-has-correct-result-type-and-config.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-001-single-result-query-descriptor-has-correct-result-type-and-config.sdp.md index e8a1164e..44a01c9e 100644 --- a/specs/behavior/platform-core/queries/factory.examples/s-001-single-result-query-descriptor-has-correct-result-type-and-config.sdp.md +++ b/specs/behavior/platform-core/queries/factory.examples/s-001-single-result-query-descriptor-has-correct-result-type-and-config.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Single result query descriptor has correct result type and config" from packages/platform-core/tests/features/behavior/queries/factory.feature +- outcome: Executable scenario: Single result query descriptor has correct result type and config + +```gwt +Given a read model query descriptor for "getOrderById" with result type "single" +When the scenario runs +Then the descriptor has result type "single" +And the descriptor config has all expected fields: +``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-002-list-result-query-descriptor-has-correct-result-type.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-002-list-result-query-descriptor-has-correct-result-type.sdp.md index 1593e8cf..50e98029 100644 --- a/specs/behavior/platform-core/queries/factory.examples/s-002-list-result-query-descriptor-has-correct-result-type.sdp.md +++ b/specs/behavior/platform-core/queries/factory.examples/s-002-list-result-query-descriptor-has-correct-result-type.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "List result query descriptor has correct result type" from packages/platform-core/tests/features/behavior/queries/factory.feature +- outcome: Executable scenario: List result query descriptor has correct result type + +```gwt +Given a read model query descriptor for "getOrdersByCustomer" with result type "list" +When the scenario runs +Then the descriptor has result type "list" +And the descriptor config queryName is "getOrdersByCustomer" +``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-003-count-result-query-descriptor-has-correct-result-type.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-003-count-result-query-descriptor-has-correct-result-type.sdp.md index d582ccb7..86b81509 100644 --- a/specs/behavior/platform-core/queries/factory.examples/s-003-count-result-query-descriptor-has-correct-result-type.sdp.md +++ b/specs/behavior/platform-core/queries/factory.examples/s-003-count-result-query-descriptor-has-correct-result-type.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Count result query descriptor has correct result type" from packages/platform-core/tests/features/behavior/queries/factory.feature +- outcome: Executable scenario: Count result query descriptor has correct result type + +```gwt +Given a read model query descriptor for "countPendingOrders" with result type "count" +When the scenario runs +Then the descriptor has result type "count" +And the descriptor config queryName is "countPendingOrders" +``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-004-paginated-query-descriptor-uses-default-page-sizes.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-004-paginated-query-descriptor-uses-default-page-sizes.sdp.md index f162ce20..49576c7c 100644 --- a/specs/behavior/platform-core/queries/factory.examples/s-004-paginated-query-descriptor-uses-default-page-sizes.sdp.md +++ b/specs/behavior/platform-core/queries/factory.examples/s-004-paginated-query-descriptor-uses-default-page-sizes.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Paginated query descriptor uses default page sizes" from packages/platform-core/tests/features/behavior/queries/factory.feature +- outcome: Executable scenario: Paginated query descriptor uses default page sizes + +```gwt +Given a paginated query descriptor for "listOrders" with index "by_customer" +When the scenario runs +Then the descriptor has result type "paginated" +And the descriptor config queryName is "listOrders" +And the descriptor config paginationIndex is "by_customer" +And the descriptor defaults use standard pagination constants +``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-005-paginated-query-descriptor-uses-custom-page-sizes.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-005-paginated-query-descriptor-uses-custom-page-sizes.sdp.md index bdb9ce1b..829273ae 100644 --- a/specs/behavior/platform-core/queries/factory.examples/s-005-paginated-query-descriptor-uses-custom-page-sizes.sdp.md +++ b/specs/behavior/platform-core/queries/factory.examples/s-005-paginated-query-descriptor-uses-custom-page-sizes.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Paginated query descriptor uses custom page sizes" from packages/platform-core/tests/features/behavior/queries/factory.feature +- outcome: Executable scenario: Paginated query descriptor uses custom page sizes + +```gwt +Given a paginated query descriptor for "listProducts" with custom page size 50 and max 200 +When the scenario runs +Then the descriptor has custom page sizes: +``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-006-config-receives-default-pagination-values.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-006-config-receives-default-pagination-values.sdp.md index 7342db50..b5d5ce1c 100644 --- a/specs/behavior/platform-core/queries/factory.examples/s-006-config-receives-default-pagination-values.sdp.md +++ b/specs/behavior/platform-core/queries/factory.examples/s-006-config-receives-default-pagination-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Config receives default pagination values" from packages/platform-core/tests/features/behavior/queries/factory.feature +- outcome: Executable scenario: Config receives default pagination values + +```gwt +Given a paginated query descriptor for "listItems" with index "by_created" and no custom sizes +When the scenario runs +Then the descriptor config has default pagination values +``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-007-empty-registry-has-correct-context-and-projection.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-007-empty-registry-has-correct-context-and-projection.sdp.md index 298a13f8..e330b157 100644 --- a/specs/behavior/platform-core/queries/factory.examples/s-007-empty-registry-has-correct-context-and-projection.sdp.md +++ b/specs/behavior/platform-core/queries/factory.examples/s-007-empty-registry-has-correct-context-and-projection.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Empty registry has correct context and projection" from packages/platform-core/tests/features/behavior/queries/factory.feature +- outcome: Executable scenario: Empty registry has correct context and projection + +```gwt +Given a query registry for context "orders" and projection "orderSummary" with no queries +When the scenario runs +Then the registry context is "orders" +And the registry sourceProjection is "orderSummary" +And the registry has 0 queries +``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-008-registry-with-multiple-queries-provides-keyed-access.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-008-registry-with-multiple-queries-provides-keyed-access.sdp.md index c108d698..e458aae7 100644 --- a/specs/behavior/platform-core/queries/factory.examples/s-008-registry-with-multiple-queries-provides-keyed-access.sdp.md +++ b/specs/behavior/platform-core/queries/factory.examples/s-008-registry-with-multiple-queries-provides-keyed-access.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Registry with multiple queries provides keyed access" from packages/platform-core/tests/features/behavior/queries/factory.feature +- outcome: Executable scenario: Registry with multiple queries provides keyed access + +```gwt +Given a query registry with a "single" query "getById" and a "paginated" query "list" +When the scenario runs +Then the registry has 2 queries +And the registry query result types are: +``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-009-type-safe-access-to-registered-query-descriptor.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-009-type-safe-access-to-registered-query-descriptor.sdp.md index cd014cb7..f4292b85 100644 --- a/specs/behavior/platform-core/queries/factory.examples/s-009-type-safe-access-to-registered-query-descriptor.sdp.md +++ b/specs/behavior/platform-core/queries/factory.examples/s-009-type-safe-access-to-registered-query-descriptor.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Type-safe access to registered query descriptor" from packages/platform-core/tests/features/behavior/queries/factory.feature +- outcome: Executable scenario: Type-safe access to registered query descriptor + +```gwt +Given a query registry with a single query "getById" +When the scenario runs +Then the registry query "getById" has queryName "getById" +``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-010-no-options-returns-descriptor-defaults.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-010-no-options-returns-descriptor-defaults.sdp.md index ab4c9af0..26970499 100644 --- a/specs/behavior/platform-core/queries/factory.examples/s-010-no-options-returns-descriptor-defaults.sdp.md +++ b/specs/behavior/platform-core/queries/factory.examples/s-010-no-options-returns-descriptor-defaults.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "No options returns descriptor defaults" from packages/platform-core/tests/features/behavior/queries/factory.feature +- outcome: Executable scenario: No options returns descriptor defaults + +```gwt +Given a paginated query with default page size 25 and max 100 +When getPaginationOptions is called with no options +Then the pagination page size is 25 +And the pagination cursor is undefined +``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-011-provided-page-size-within-limits-is-used.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-011-provided-page-size-within-limits-is-used.sdp.md index cc5a69f4..1cdb4567 100644 --- a/specs/behavior/platform-core/queries/factory.examples/s-011-provided-page-size-within-limits-is-used.sdp.md +++ b/specs/behavior/platform-core/queries/factory.examples/s-011-provided-page-size-within-limits-is-used.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Provided page size within limits is used" from packages/platform-core/tests/features/behavior/queries/factory.feature +- outcome: Executable scenario: Provided page size within limits is used + +```gwt +Given a paginated query with default page size 25 and max 100 +When getPaginationOptions is called with page size 50 +Then the pagination page size is 50 +``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-012-page-size-exceeding-max-is-clamped.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-012-page-size-exceeding-max-is-clamped.sdp.md index f2a4c0fb..eeca9235 100644 --- a/specs/behavior/platform-core/queries/factory.examples/s-012-page-size-exceeding-max-is-clamped.sdp.md +++ b/specs/behavior/platform-core/queries/factory.examples/s-012-page-size-exceeding-max-is-clamped.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Page size exceeding max is clamped" from packages/platform-core/tests/features/behavior/queries/factory.feature +- outcome: Executable scenario: Page size exceeding max is clamped + +```gwt +Given a paginated query with default page size 25 and max 100 +When getPaginationOptions is called with page size 500 +Then the pagination page size is 100 +``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-013-zero-and-negative-page-sizes-are-clamped-to-1.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-013-zero-and-negative-page-sizes-are-clamped-to-1.sdp.md index 43508565..7581e5f9 100644 --- a/specs/behavior/platform-core/queries/factory.examples/s-013-zero-and-negative-page-sizes-are-clamped-to-1.sdp.md +++ b/specs/behavior/platform-core/queries/factory.examples/s-013-zero-and-negative-page-sizes-are-clamped-to-1.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Zero and negative page sizes are clamped to 1" from packages/platform-core/tests/features/behavior/queries/factory.feature +- outcome: Executable scenario: Zero and negative page sizes are clamped to 1 + +```gwt +Given a paginated query with default page size 25 and max 100 +When getPaginationOptions is called with each page size: +Then each result has page size 1 +``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-014-cursor-is-passed-through-to-options.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-014-cursor-is-passed-through-to-options.sdp.md index a765095f..151b1273 100644 --- a/specs/behavior/platform-core/queries/factory.examples/s-014-cursor-is-passed-through-to-options.sdp.md +++ b/specs/behavior/platform-core/queries/factory.examples/s-014-cursor-is-passed-through-to-options.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Cursor is passed through to options" from packages/platform-core/tests/features/behavior/queries/factory.feature +- outcome: Executable scenario: Cursor is passed through to options + +```gwt +Given a paginated query with default page size 25 and max 100 +When getPaginationOptions is called with page size 20 and cursor "abc123" +Then the pagination cursor is "abc123" +``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-015-cursor-is-undefined-when-not-provided.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-015-cursor-is-undefined-when-not-provided.sdp.md index e71751ea..3b954961 100644 --- a/specs/behavior/platform-core/queries/factory.examples/s-015-cursor-is-undefined-when-not-provided.sdp.md +++ b/specs/behavior/platform-core/queries/factory.examples/s-015-cursor-is-undefined-when-not-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Cursor is undefined when not provided" from packages/platform-core/tests/features/behavior/queries/factory.feature +- outcome: Executable scenario: Cursor is undefined when not provided + +```gwt +Given a paginated query with default page size 25 and max 100 +When getPaginationOptions is called with page size 20 +Then the pagination cursor is undefined +``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-016-read-model-and-paginated-descriptors-preserve-result-types.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-016-read-model-and-paginated-descriptors-preserve-result-types.sdp.md index 493684fb..ae0eca5a 100644 --- a/specs/behavior/platform-core/queries/factory.examples/s-016-read-model-and-paginated-descriptors-preserve-result-types.sdp.md +++ b/specs/behavior/platform-core/queries/factory.examples/s-016-read-model-and-paginated-descriptors-preserve-result-types.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Read model and paginated descriptors preserve result types" from packages/platform-core/tests/features/behavior/queries/factory.feature +- outcome: Executable scenario: Read model and paginated descriptors preserve result types + +```gwt +Given a typed single ReadModelQueryDescriptor for "getOrder" +And a typed PaginatedQueryDescriptor for "listProducts" +When the scenario runs +Then the single descriptor has result type "single" +And the paginated descriptor has result type "paginated" +``` diff --git a/specs/behavior/platform-core/queries/factory.sdp.md b/specs/behavior/platform-core/queries/factory.sdp.md index 1dff237e..dfd3763d 100644 --- a/specs/behavior/platform-core/queries/factory.sdp.md +++ b/specs/behavior/platform-core/queries/factory.sdp.md @@ -10,4 +10,22 @@ relations: ## Intent -- outcome: factory functions for query descriptors and pagination so that read model queries are created with correct types, configurations, and pagination defaults (test carrier: packages/platform-core/tests/features/behavior/queries/factory.feature) +- actor: a platform developer +- outcome: factory functions for query descriptors and pagination so that read model queries are created with correct types, configurations, and pagination defaults + +## Behavior + +- rule: createReadModelQuery produces descriptors with correct result type and config +- rule: createPaginatedQuery produces paginated descriptors with default page sizes +- rule: createPaginatedQuery accepts custom page sizes +- rule: createPaginatedQuery applies defaults to config when not provided +- rule: createQueryRegistry creates a registry with context and projection +- rule: createQueryRegistry indexes multiple query descriptors +- rule: createQueryRegistry provides type-safe access to query descriptors +- rule: getPaginationOptions returns defaults when no options provided +- rule: getPaginationOptions respects provided page size within limits +- rule: getPaginationOptions caps page size at max +- rule: getPaginationOptions enforces minimum page size of 1 +- rule: getPaginationOptions passes through cursor +- rule: getPaginationOptions returns undefined cursor when not provided +- rule: Query descriptors preserve TypeScript result types diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-001-pagination-constants-have-expected-values.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-001-pagination-constants-have-expected-values.sdp.md index 40c35d05..8c1ebbc1 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-001-pagination-constants-have-expected-values.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-001-pagination-constants-have-expected-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Pagination constants have expected values" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Pagination constants have expected values + +```gwt +Given the feature fixture is in place +When the scenario runs +Then the pagination constants are: +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-002-returns-defaults-when-no-options-provided.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-002-returns-defaults-when-no-options-provided.sdp.md index 9519b070..40cf58db 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-002-returns-defaults-when-no-options-provided.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-002-returns-defaults-when-no-options-provided.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Returns defaults when no options provided" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Returns defaults when no options provided + +```gwt +Given a pagination config with defaultPageSize 20 and maxPageSize 100 +When I normalize pagination options with no input +Then the normalized pageSize is 20 +And the normalized cursor is undefined +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-003-uses-provided-page-size-within-limits.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-003-uses-provided-page-size-within-limits.sdp.md index 915c109b..ce9f23e7 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-003-uses-provided-page-size-within-limits.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-003-uses-provided-page-size-within-limits.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Uses provided page size within limits" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Uses provided page size within limits + +```gwt +Given a pagination config with defaultPageSize 20 and maxPageSize 100 +When I normalize pagination options with pageSize 50 +Then the normalized pageSize is 50 +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-004-caps-page-size-at-max.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-004-caps-page-size-at-max.sdp.md index 334f49e7..93bb7dfd 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-004-caps-page-size-at-max.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-004-caps-page-size-at-max.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Caps page size at max" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Caps page size at max + +```gwt +Given a pagination config with defaultPageSize 20 and maxPageSize 100 +When I normalize pagination options with pageSize 200 +Then the normalized pageSize is 100 +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-005-enforces-minimum-page-size-of-1-for-boundary-values.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-005-enforces-minimum-page-size-of-1-for-boundary-values.sdp.md index d39cb0c5..c7beaeaf 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-005-enforces-minimum-page-size-of-1-for-boundary-values.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-005-enforces-minimum-page-size-of-1-for-boundary-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Enforces minimum page size of 1 for boundary values" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Enforces minimum page size of 1 for boundary values + +```gwt +Given a pagination config with defaultPageSize 20 and maxPageSize 100 +When I normalize pagination options with pageSize values: +Then all normalized pageSizes are 1 +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-006-passes-through-cursor.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-006-passes-through-cursor.sdp.md index 70904176..5701d935 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-006-passes-through-cursor.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-006-passes-through-cursor.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Passes through cursor" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Passes through cursor + +```gwt +Given a pagination config with defaultPageSize 20 and maxPageSize 100 +When I normalize pagination options with cursor "abc123" +Then the normalized cursor is "abc123" +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-007-works-with-custom-config-values.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-007-works-with-custom-config-values.sdp.md index a3f1ae64..fa2b60b2 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-007-works-with-custom-config-values.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-007-works-with-custom-config-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Works with custom config values" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Works with custom config values + +```gwt +Given a pagination config with defaultPageSize 10 and maxPageSize 50 +When I normalize pagination options with various inputs: +Then the expected outcome holds +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-008-rounds-floating-point-page-sizes-down.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-008-rounds-floating-point-page-sizes-down.sdp.md index 04753c60..00562806 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-008-rounds-floating-point-page-sizes-down.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-008-rounds-floating-point-page-sizes-down.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rounds floating-point page sizes down" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Rounds floating-point page sizes down + +```gwt +Given a pagination config with defaultPageSize 20 and maxPageSize 100 +When I normalize pagination options with float pageSize values: +Then the expected outcome holds +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-009-creates-an-empty-page-with-correct-structure.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-009-creates-an-empty-page-with-correct-structure.sdp.md index 10f74c6d..b0cc079a 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-009-creates-an-empty-page-with-correct-structure.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-009-creates-an-empty-page-with-correct-structure.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Creates an empty page with correct structure" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Creates an empty page with correct structure + +```gwt +Given the feature fixture is in place +When I create an empty page +Then the page has 0 items +And the page continueCursor is null +And the page isDone is true +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-010-preserves-type-information-with-empty-array.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-010-preserves-type-information-with-empty-array.sdp.md index fd144d22..eb582b52 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-010-preserves-type-information-with-empty-array.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-010-preserves-type-information-with-empty-array.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Preserves type information with empty array" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Preserves type information with empty array + +```gwt +Given the feature fixture is in place +When I create an empty page +Then the page items is an array with length 0 +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-011-creates-a-page-with-items-and-cursor.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-011-creates-a-page-with-items-and-cursor.sdp.md index e6cf983d..30438c37 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-011-creates-a-page-with-items-and-cursor.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-011-creates-a-page-with-items-and-cursor.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Creates a page with items and cursor" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Creates a page with items and cursor + +```gwt +Given items with ids "1", "2", "3" +When I create a paged result with pageSize 3 and cursor "next-cursor" +Then the page has 3 items +And the page continueCursor is "next-cursor" +And the page isDone is false +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-012-creates-a-done-page-when-cursor-is-null.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-012-creates-a-done-page-when-cursor-is-null.sdp.md index 36bd6048..db14a918 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-012-creates-a-done-page-when-cursor-is-null.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-012-creates-a-done-page-when-cursor-is-null.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Creates a done page when cursor is null" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Creates a done page when cursor is null + +```gwt +Given items with ids "1", "2" +When I create a paged result with pageSize 3 and null cursor +Then the page items match the input items +And the page continueCursor is null +And the page isDone is true +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-013-handles-empty-items-array-with-null-cursor.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-013-handles-empty-items-array-with-null-cursor.sdp.md index 1b9ec712..73340234 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-013-handles-empty-items-array-with-null-cursor.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-013-handles-empty-items-array-with-null-cursor.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Handles empty items array with null cursor" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Handles empty items array with null cursor + +```gwt +Given the feature fixture is in place +When I create a paged result with no items and null cursor +Then the page has 0 items +And the page isDone is true +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-014-encodes-and-decodes-simple-position-data.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-014-encodes-and-decodes-simple-position-data.sdp.md index d9588d61..efc12a1b 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-014-encodes-and-decodes-simple-position-data.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-014-encodes-and-decodes-simple-position-data.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Encodes and decodes simple position data" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Encodes and decodes simple position data + +```gwt +Given a cursor position with offset 20 and lastId "abc123" +When I encode and decode the cursor position +Then the decoded position matches the original +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-015-encodes-and-decodes-complex-position-data.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-015-encodes-and-decodes-complex-position-data.sdp.md index 4b7c8925..9f4e9668 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-015-encodes-and-decodes-complex-position-data.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-015-encodes-and-decodes-complex-position-data.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Encodes and decodes complex position data" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Encodes and decodes complex position data + +```gwt +Given a cursor position with globalPosition, streamId, and timestamp +When I encode and decode the cursor position +Then the decoded position matches the original +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-016-produces-base64-encoded-string.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-016-produces-base64-encoded-string.sdp.md index 74550a3b..9eb4fe67 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-016-produces-base64-encoded-string.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-016-produces-base64-encoded-string.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Produces base64-encoded string" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Produces base64-encoded string + +```gwt +Given a cursor position with offset 0 +When I encode the cursor position +Then the encoded cursor is valid base64 +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-017-round-trips-various-data-shapes.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-017-round-trips-various-data-shapes.sdp.md index 64023dba..ab1573f9 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-017-round-trips-various-data-shapes.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-017-round-trips-various-data-shapes.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Round-trips various data shapes" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Round-trips various data shapes + +```gwt +Given the feature fixture is in place +When I encode and decode each data shape: +Then all decoded shapes match their originals +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-018-returns-null-for-invalid-cursor-inputs.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-018-returns-null-for-invalid-cursor-inputs.sdp.md index d1da232d..3a3e7b7b 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-018-returns-null-for-invalid-cursor-inputs.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-018-returns-null-for-invalid-cursor-inputs.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns null for invalid cursor inputs" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Returns null for invalid cursor inputs + +```gwt +Given the feature fixture is in place +When I decode invalid cursor values: +Then all decoded results are null +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-019-returns-null-for-base64-with-invalid-characters-in-middle-or-end.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-019-returns-null-for-base64-with-invalid-characters-in-middle-or-end.sdp.md index 4097c123..5bb80dbd 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-019-returns-null-for-base64-with-invalid-characters-in-middle-or-end.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-019-returns-null-for-base64-with-invalid-characters-in-middle-or-end.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns null for base64 with invalid characters in middle or end" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Returns null for base64 with invalid characters in middle or end + +```gwt +Given the feature fixture is in place +When I decode cursors with invalid base64 characters: +Then all decoded results are null +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-020-returns-null-for-truncated-utf-8-sequences.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-020-returns-null-for-truncated-utf-8-sequences.sdp.md index 4b309a5a..4a506709 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-020-returns-null-for-truncated-utf-8-sequences.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-020-returns-null-for-truncated-utf-8-sequences.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns null for truncated UTF-8 sequences" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Returns null for truncated UTF-8 sequences + +```gwt +Given the feature fixture is in place +When I decode the cursor "wA==" +Then the decoded result is null +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-021-returns-true-for-valid-page-sizes.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-021-returns-true-for-valid-page-sizes.sdp.md index 0cac41ad..9a5b1236 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-021-returns-true-for-valid-page-sizes.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-021-returns-true-for-valid-page-sizes.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns true for valid page sizes" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Returns true for valid page sizes + +```gwt +Given the feature fixture is in place +When the scenario runs +Then these page sizes are valid: +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-022-returns-false-for-invalid-page-sizes.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-022-returns-false-for-invalid-page-sizes.sdp.md index 133c713f..31686348 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-022-returns-false-for-invalid-page-sizes.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-022-returns-false-for-invalid-page-sizes.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns false for invalid page sizes" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Returns false for invalid page sizes + +```gwt +Given the feature fixture is in place +When the scenario runs +Then these page sizes are invalid: +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-023-respects-custom-max-page-size.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-023-respects-custom-max-page-size.sdp.md index b7376c9e..afc14014 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-023-respects-custom-max-page-size.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-023-respects-custom-max-page-size.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Respects custom max page size" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Respects custom max page size + +```gwt +Given the feature fixture is in place +When the scenario runs +Then page size 50 is valid with max 50 +And page size 51 is invalid with max 50 +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-024-returns-requested-size-when-valid.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-024-returns-requested-size-when-valid.sdp.md index b01e3b12..c967fc4e 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-024-returns-requested-size-when-valid.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-024-returns-requested-size-when-valid.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns requested size when valid" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Returns requested size when valid + +```gwt +Given the feature fixture is in place +When the scenario runs +Then effective page size for requested 50 is 50 +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-025-returns-default-when-not-specified.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-025-returns-default-when-not-specified.sdp.md index c85bf48c..1fc9e555 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-025-returns-default-when-not-specified.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-025-returns-default-when-not-specified.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Returns default when not specified" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Returns default when not specified + +```gwt +Given the feature fixture is in place +When the scenario runs +Then effective page size for undefined is DEFAULT_PAGE_SIZE +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-026-caps-at-max-and-enforces-minimum.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-026-caps-at-max-and-enforces-minimum.sdp.md index 18027dfa..464ce9cd 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-026-caps-at-max-and-enforces-minimum.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-026-caps-at-max-and-enforces-minimum.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Caps at max and enforces minimum" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Caps at max and enforces minimum + +```gwt +Given the feature fixture is in place +When the scenario runs +Then these effective page sizes are correct: +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-027-uses-custom-default-and-max-sizes.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-027-uses-custom-default-and-max-sizes.sdp.md index 28444902..195d4c0b 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-027-uses-custom-default-and-max-sizes.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-027-uses-custom-default-and-max-sizes.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Uses custom default and max sizes" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Uses custom default and max sizes + +```gwt +Given the feature fixture is in place +When the scenario runs +Then these effective page sizes with custom config are correct: +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-028-rounds-floating-point-sizes-down.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-028-rounds-floating-point-sizes-down.sdp.md index 9d7add0e..c2ad7af0 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-028-rounds-floating-point-sizes-down.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-028-rounds-floating-point-sizes-down.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rounds floating-point sizes down" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Rounds floating-point sizes down + +```gwt +Given the feature fixture is in place +When the scenario runs +Then these effective page sizes are correct: +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-029-simulates-complete-pagination-flow.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-029-simulates-complete-pagination-flow.sdp.md index 34a0a22d..0d6b45ee 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-029-simulates-complete-pagination-flow.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-029-simulates-complete-pagination-flow.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Simulates complete pagination flow" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Simulates complete pagination flow + +```gwt +Given items for page 1 with ids "1", "2", "3" and encoded cursor offset 3 +When I create a paged result for page 1 and I create a final page with item id "4" +Then page 1 isDone is false +And the decoded cursor offset is 3 +And page 2 isDone is true +And page 2 continueCursor is null +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-030-handles-empty-result-set.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-030-handles-empty-result-set.sdp.md index 27ac31b1..d8c5a2bc 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-030-handles-empty-result-set.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-030-handles-empty-result-set.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Handles empty result set" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Handles empty result set + +```gwt +Given the feature fixture is in place +When I create an empty page +Then the page has 0 items +And the page isDone is true +``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-031-handles-exact-page-size-match-with-continuation.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-031-handles-exact-page-size-match-with-continuation.sdp.md index 016a68aa..f2a18c8a 100644 --- a/specs/behavior/platform-core/queries/pagination.examples/s-031-handles-exact-page-size-match-with-continuation.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.examples/s-031-handles-exact-page-size-match-with-continuation.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Handles exact page size match with continuation" from packages/platform-core/tests/features/behavior/queries/pagination.feature +- outcome: Executable scenario: Handles exact page size match with continuation + +```gwt +Given items for page 1 with ids "1", "2", "3" and encoded cursor offset 3 +When I create a paged result for page 1 +Then the page has 3 items +And page 1 isDone is false +``` diff --git a/specs/behavior/platform-core/queries/pagination.sdp.md b/specs/behavior/platform-core/queries/pagination.sdp.md index 4d3916d2..ac3d1c69 100644 --- a/specs/behavior/platform-core/queries/pagination.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: cursor-based pagination utilities for read model queries so that query results are paginated with consistent defaults, cursor encoding, and page size validation (test carrier: packages/platform-core/tests/features/behavior/queries/pagination.feature) +- actor: a platform developer +- outcome: cursor-based pagination utilities for read model queries so that query results are paginated with consistent defaults, cursor encoding, and page size validation + +## Behavior + +- rule: Pagination constants define reasonable defaults +- rule: normalizePaginationOptions clamps page size and passes through cursor +- rule: createEmptyPage creates a done page with no items +- rule: createPagedResult creates a page with items and continuation state +- rule: encodeCursor and decodeCursor round-trip arbitrary position data +- rule: decodeCursor returns null for invalid or missing input +- rule: isValidPageSize validates integer page sizes within bounds +- rule: getEffectivePageSize returns clamped page size with defaults +- rule: Pagination workflow supports multi-page traversal and edge cases diff --git a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-001-conflicting-optimistic-update-is-rolled-back.sdp.md b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-001-conflicting-optimistic-update-is-rolled-back.sdp.md index 1d2ff423..efae6f0d 100644 --- a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-001-conflicting-optimistic-update-is-rolled-back.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-001-conflicting-optimistic-update-is-rolled-back.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Conflicting optimistic update is rolled back" from packages/platform-core/tests/features/behavior/reactive-projections/conflict-detection.feature +- outcome: Executable scenario: Conflicting optimistic update is rolled back + +```gwt +Given the conflict detection module is initialized +And a reactive projection with optimistic state tracking +And optimistic state based on event A +And durable state updated with event B (different branch) +When conflict is detected +Then optimistic state should be discarded +And client should show durable state +``` diff --git a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-002-conflict-detection-handles-network-partition.sdp.md b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-002-conflict-detection-handles-network-partition.sdp.md index 1278d04b..eb6ceae8 100644 --- a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-002-conflict-detection-handles-network-partition.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-002-conflict-detection-handles-network-partition.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Conflict detection handles network partition" from packages/platform-core/tests/features/behavior/reactive-projections/conflict-detection.feature +- outcome: Executable scenario: Conflict detection handles network partition + +```gwt +Given the conflict detection module is initialized +And a reactive projection with optimistic state tracking +And optimistic updates accumulated during offline period +When client reconnects and receives durable state +Then all conflicting optimistic updates are rolled back +And non-conflicting updates are preserved +``` diff --git a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-003-no-conflict-when-optimistic-is-ahead-of-durable.sdp.md b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-003-no-conflict-when-optimistic-is-ahead-of-durable.sdp.md index 2281399f..f7d6bfcb 100644 --- a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-003-no-conflict-when-optimistic-is-ahead-of-durable.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-003-no-conflict-when-optimistic-is-ahead-of-durable.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "No conflict when optimistic is ahead of durable" from packages/platform-core/tests/features/behavior/reactive-projections/conflict-detection.feature +- outcome: Executable scenario: No conflict when optimistic is ahead of durable + +```gwt +Given the conflict detection module is initialized +And a reactive projection with optimistic state tracking +And optimistic state with events A, B +And durable state with only event A +When durable catches up with event B +Then states converge without rollback +And no user-visible disruption occurs +``` diff --git a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-004-rollback-triggers-ui-notification.sdp.md b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-004-rollback-triggers-ui-notification.sdp.md index f2b56712..735eca61 100644 --- a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-004-rollback-triggers-ui-notification.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-004-rollback-triggers-ui-notification.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Rollback triggers UI notification" from packages/platform-core/tests/features/behavior/reactive-projections/conflict-detection.feature +- outcome: Executable scenario: Rollback triggers UI notification + +```gwt +Given the conflict detection module is initialized +And a reactive projection with optimistic state tracking +And optimistic state that will conflict +When conflict is detected and rollback occurs +Then client receives conflict notification +And UI can display appropriate feedback +``` diff --git a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-005-partial-clearing-preserves-unconfirmed-events.sdp.md b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-005-partial-clearing-preserves-unconfirmed-events.sdp.md index 4aaf7c1c..5ff02683 100644 --- a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-005-partial-clearing-preserves-unconfirmed-events.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-005-partial-clearing-preserves-unconfirmed-events.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Partial clearing preserves unconfirmed events" from packages/platform-core/tests/features/behavior/reactive-projections/conflict-detection.feature +- outcome: Executable scenario: Partial clearing preserves unconfirmed events + +```gwt +Given the conflict detection module is initialized +And a reactive projection with optimistic state tracking +And optimistic state with events at positions value +When durable confirms position value +Then remaining event positions should be "value" +``` diff --git a/specs/behavior/platform-core/reactive-projections/conflict-detection.sdp.md b/specs/behavior/platform-core/reactive-projections/conflict-detection.sdp.md index 88f91547..a616ac11 100644 --- a/specs/behavior/platform-core/reactive-projections/conflict-detection.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/conflict-detection.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: conflicts detected and resolved automatically so that data integrity is maintained despite optimistic updates (test carrier: packages/platform-core/tests/features/behavior/reactive-projections/conflict-detection.feature) +- actor: a platform developer +- outcome: conflicts detected and resolved automatically so that data integrity is maintained despite optimistic updates diff --git a/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-001-client-receives-instant-update-then-durable-confirmation.sdp.md b/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-001-client-receives-instant-update-then-durable-confirmation.sdp.md index 359b32b7..f1a932cb 100644 --- a/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-001-client-receives-instant-update-then-durable-confirmation.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-001-client-receives-instant-update-then-durable-confirmation.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Client receives instant update then durable confirmation" from packages/platform-core/tests/features/behavior/reactive-projections/hybrid-model.feature +- outcome: Executable scenario: Client receives instant update then durable confirmation + +```gwt +Given the reactive projection system is initialized +And a view projection "orderSummary" is registered +And an order is submitted +When the OrderSubmitted event is published +Then client sees optimistic update within 50ms +And Workpool updates durable projection within 500ms +And client state converges to durable state +``` diff --git a/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-002-optimistic-update-works-during-workpool-backlog.sdp.md b/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-002-optimistic-update-works-during-workpool-backlog.sdp.md index b4934167..291e959a 100644 --- a/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-002-optimistic-update-works-during-workpool-backlog.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-002-optimistic-update-works-during-workpool-backlog.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Optimistic update works during Workpool backlog" from packages/platform-core/tests/features/behavior/reactive-projections/hybrid-model.feature +- outcome: Executable scenario: Optimistic update works during Workpool backlog + +```gwt +Given the reactive projection system is initialized +And a view projection "orderSummary" is registered +And the Workpool has a processing backlog +When an event is published +Then client sees optimistic update immediately +And optimistic state includes pending event +And durable state catches up when Workpool processes +``` diff --git a/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-003-durable-state-takes-precedence-after-convergence.sdp.md b/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-003-durable-state-takes-precedence-after-convergence.sdp.md index f2eabc02..7a43ab97 100644 --- a/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-003-durable-state-takes-precedence-after-convergence.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-003-durable-state-takes-precedence-after-convergence.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Durable state takes precedence after convergence" from packages/platform-core/tests/features/behavior/reactive-projections/hybrid-model.feature +- outcome: Executable scenario: Durable state takes precedence after convergence + +```gwt +Given the reactive projection system is initialized +And a view projection "orderSummary" is registered +And optimistic state from events A, B +And Workpool processes events A, B +When durable projection is updated +Then optimistic overlay clears for processed events +And client shows durable state +``` diff --git a/specs/behavior/platform-core/reactive-projections/hybrid-model.sdp.md b/specs/behavior/platform-core/reactive-projections/hybrid-model.sdp.md index 30ef331c..217da3b6 100644 --- a/specs/behavior/platform-core/reactive-projections/hybrid-model.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/hybrid-model.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: projections that combine durability with instant feedback so that users see optimistic updates while maintaining data integrity (test carrier: packages/platform-core/tests/features/behavior/reactive-projections/hybrid-model.feature) +- actor: a frontend developer +- outcome: projections that combine durability with instant feedback so that users see optimistic updates while maintaining data integrity diff --git a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-001-category-determines-reactive-eligibility.sdp.md b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-001-category-determines-reactive-eligibility.sdp.md index 4e3c8745..15592be2 100644 --- a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-001-category-determines-reactive-eligibility.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-001-category-determines-reactive-eligibility.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Category determines reactive eligibility" from packages/platform-core/tests/features/behavior/reactive-projections/reactive-eligibility.feature +- outcome: Executable scenario: Category determines reactive eligibility + +```gwt +Given the projection registry is available +And projections are categorized by type +And a projection with category "value" +When the scenario runs +Then it should value for reactive updates +``` diff --git a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-002-non-view-projection-rejects-reactive-subscription.sdp.md b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-002-non-view-projection-rejects-reactive-subscription.sdp.md index 953eebb6..27959842 100644 --- a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-002-non-view-projection-rejects-reactive-subscription.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-002-non-view-projection-rejects-reactive-subscription.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Non-view projection rejects reactive subscription" from packages/platform-core/tests/features/behavior/reactive-projections/reactive-eligibility.feature +- outcome: Executable scenario: Non-view projection rejects reactive subscription + +```gwt +Given the projection registry is available +And projections are categorized by type +And a projection with category "logic" +When useReactiveProjection is called +Then it should fail with code "REACTIVE_NOT_SUPPORTED" +And error message should suggest using regular useQuery +``` diff --git a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-003-view-projection-enables-full-reactive-functionality.sdp.md b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-003-view-projection-enables-full-reactive-functionality.sdp.md index 542a2e3b..d49c549b 100644 --- a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-003-view-projection-enables-full-reactive-functionality.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-003-view-projection-enables-full-reactive-functionality.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "View projection enables full reactive functionality" from packages/platform-core/tests/features/behavior/reactive-projections/reactive-eligibility.feature +- outcome: Executable scenario: View projection enables full reactive functionality + +```gwt +Given the projection registry is available +And projections are categorized by type +And a projection with category "view" +When useReactiveProjection is called +Then reactive subscription is established +And optimistic updates are enabled +And conflict detection is active +``` diff --git a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-004-initial-reactive-result-represents-loading-state.sdp.md b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-004-initial-reactive-result-represents-loading-state.sdp.md index 726e02f5..3d9d0160 100644 --- a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-004-initial-reactive-result-represents-loading-state.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-004-initial-reactive-result-represents-loading-state.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "Initial reactive result represents loading state" from packages/platform-core/tests/features/behavior/reactive-projections/reactive-eligibility.feature +- outcome: Executable scenario: Initial reactive result represents loading state + +```gwt +Given the projection registry is available +And projections are categorized by type +When createInitialReactiveResult is called +Then state should be null +And isLoading should be true +And isOptimistic should be false +And durablePosition should be 0 +And pendingEvents should be 0 +And error should be null +``` diff --git a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.sdp.md b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.sdp.md index 4a7a2b91..f8fcc362 100644 --- a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: only view projections to support reactive updates so that system resources are optimized (test carrier: packages/platform-core/tests/features/behavior/reactive-projections/reactive-eligibility.feature) +- actor: a platform developer +- outcome: only view projections to support reactive updates so that system resources are optimized diff --git a/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-001-evolve-produces-identical-results-on-client-and-server.sdp.md b/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-001-evolve-produces-identical-results-on-client-and-server.sdp.md index f56a3f26..76904d36 100644 --- a/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-001-evolve-produces-identical-results-on-client-and-server.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-001-evolve-produces-identical-results-on-client-and-server.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Evolve produces identical results on client and server" from packages/platform-core/tests/features/behavior/reactive-projections/shared-evolve.feature +- outcome: Executable scenario: Evolve produces identical results on client and server + +```gwt +Given an evolve function is defined for the projection +And the evolve function handles OrderSubmitted and OrderConfirmed events +And an OrderSubmitted event +When evolve is applied on client (optimistic) and evolve is applied on server (durable) +Then both should produce identical state +``` diff --git a/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-002-evolve-handles-unknown-event-types-gracefully.sdp.md b/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-002-evolve-handles-unknown-event-types-gracefully.sdp.md index 81df1611..24881721 100644 --- a/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-002-evolve-handles-unknown-event-types-gracefully.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-002-evolve-handles-unknown-event-types-gracefully.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Evolve handles unknown event types gracefully" from packages/platform-core/tests/features/behavior/reactive-projections/shared-evolve.feature +- outcome: Executable scenario: Evolve handles unknown event types gracefully + +```gwt +Given an evolve function is defined for the projection +And the evolve function handles OrderSubmitted and OrderConfirmed events +And an evolve function for known event types +When an unknown event type is applied +Then state should remain unchanged +And no error should be thrown +``` diff --git a/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-003-multiple-events-evolve-in-sequence.sdp.md b/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-003-multiple-events-evolve-in-sequence.sdp.md index 0941c39a..53b69b81 100644 --- a/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-003-multiple-events-evolve-in-sequence.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-003-multiple-events-evolve-in-sequence.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Multiple events evolve in sequence" from packages/platform-core/tests/features/behavior/reactive-projections/shared-evolve.feature +- outcome: Executable scenario: Multiple events evolve in sequence + +```gwt +Given an evolve function is defined for the projection +And the evolve function handles OrderSubmitted and OrderConfirmed events +And a base projection state +When OrderSubmitted then OrderConfirmed events are applied +Then final state reflects all event transformations in order +And intermediate states are consistent +``` diff --git a/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-004-evolve-error-includes-event-context.sdp.md b/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-004-evolve-error-includes-event-context.sdp.md index 37815101..febcbc5a 100644 --- a/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-004-evolve-error-includes-event-context.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-004-evolve-error-includes-event-context.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Evolve error includes event context" from packages/platform-core/tests/features/behavior/reactive-projections/shared-evolve.feature +- outcome: Executable scenario: Evolve error includes event context + +```gwt +Given an evolve function is defined for the projection +And the evolve function handles OrderSubmitted and OrderConfirmed events +And a base projection state +And an evolve function that throws on "CorruptEvent" +When a "CorruptEvent" at position 5 is merged +Then error message should contain "position=5" +And error message should contain "CorruptEvent" +``` diff --git a/specs/behavior/platform-core/reactive-projections/shared-evolve.sdp.md b/specs/behavior/platform-core/reactive-projections/shared-evolve.sdp.md index 2e27a4c7..dde05128 100644 --- a/specs/behavior/platform-core/reactive-projections/shared-evolve.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/shared-evolve.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: evolve logic shared between client and server so that state transformations are always consistent (test carrier: packages/platform-core/tests/features/behavior/reactive-projections/shared-evolve.feature) +- actor: a platform developer +- outcome: evolve logic shared between client and server so that state transformations are always consistent diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-001-get-instance-returns-the-same-instance-on-multiple-calls.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-001-get-instance-returns-the-same-instance-on-multiple-calls.sdp.md index a98852f5..4dd60878 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-001-get-instance-returns-the-same-instance-on-multiple-calls.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-001-get-instance-returns-the-same-instance-on-multiple-calls.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "getInstance returns the same instance on multiple calls" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: getInstance returns the same instance on multiple calls + +```gwt +Given a fresh CommandRegistry instance +When getInstance is called again +Then both instances are the same object +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-002-reset-creates-a-new-instance.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-002-reset-creates-a-new-instance.sdp.md index 798fad84..c10a361a 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-002-reset-creates-a-new-instance.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-002-reset-creates-a-new-instance.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Reset creates a new instance" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: Reset creates a new instance + +```gwt +Given a fresh CommandRegistry instance +When the registry is reset and a new instance is obtained +Then the new instance is a different object +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-003-register-a-command-successfully.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-003-register-a-command-successfully.sdp.md index a1f39def..af40789a 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-003-register-a-command-successfully.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-003-register-a-command-successfully.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Register a command successfully" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: Register a command successfully + +```gwt +Given a fresh CommandRegistry instance +When a "CreateOrder" command is registered +Then the registry has "CreateOrder" +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-004-duplicate-registration-throws-an-error.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-004-duplicate-registration-throws-an-error.sdp.md index 1794e809..3e4ed3bf 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-004-duplicate-registration-throws-an-error.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-004-duplicate-registration-throws-an-error.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Duplicate registration throws an error" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: Duplicate registration throws an error + +```gwt +Given a fresh CommandRegistry instance +And a "CreateOrder" command is registered in context "orders" +When a duplicate "CreateOrder" command is registered in context "other" +Then the registration throws a duplicate error mentioning "orders" +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-005-different-command-types-can-be-registered.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-005-different-command-types-can-be-registered.sdp.md index 4fc6afc5..4cd2785f 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-005-different-command-types-can-be-registered.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-005-different-command-types-can-be-registered.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Different command types can be registered" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: Different command types can be registered + +```gwt +Given a fresh CommandRegistry instance +When "CreateOrder" and "CancelOrder" commands are both registered +Then the registry size is 2 +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-006-unregister-removes-a-registered-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-006-unregister-removes-a-registered-command.sdp.md index 708804dd..9c0bb93b 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-006-unregister-removes-a-registered-command.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-006-unregister-removes-a-registered-command.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Unregister removes a registered command" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: Unregister removes a registered command + +```gwt +Given a fresh CommandRegistry instance +And a "CreateOrder" command is registered +When "CreateOrder" is unregistered +Then unregister returned true +And the registry does not have "CreateOrder" +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-007-unregister-returns-false-for-non-existent-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-007-unregister-returns-false-for-non-existent-command.sdp.md index 7a7e8a82..455fcbea 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-007-unregister-returns-false-for-non-existent-command.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-007-unregister-returns-false-for-non-existent-command.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Unregister returns false for non-existent command" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: Unregister returns false for non-existent command + +```gwt +Given a fresh CommandRegistry instance +When "NonExistent" is unregistered +Then unregister returned false +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-008-get-config-returns-config-for-a-registered-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-008-get-config-returns-config-for-a-registered-command.sdp.md index b074a54b..adabee8e 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-008-get-config-returns-config-for-a-registered-command.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-008-get-config-returns-config-for-a-registered-command.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "getConfig returns config for a registered command" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: getConfig returns config for a registered command + +```gwt +Given a fresh CommandRegistry instance +And a "CreateOrder" command is registered +When getConfig is called for "CreateOrder" +Then the config is defined with commandType "CreateOrder" +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-009-get-config-returns-undefined-for-a-non-existent-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-009-get-config-returns-undefined-for-a-non-existent-command.sdp.md index e9dc1d28..9a7f1719 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-009-get-config-returns-undefined-for-a-non-existent-command.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-009-get-config-returns-undefined-for-a-non-existent-command.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "getConfig returns undefined for a non-existent command" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: getConfig returns undefined for a non-existent command + +```gwt +Given a fresh CommandRegistry instance +When getConfig is called for "NonExistent" +Then the config is undefined +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-010-get-registration-returns-full-registration-for-a-registered-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-010-get-registration-returns-full-registration-for-a-registered-command.sdp.md index 03203d2f..ac486f50 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-010-get-registration-returns-full-registration-for-a-registered-command.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-010-get-registration-returns-full-registration-for-a-registered-command.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "getRegistration returns full registration for a registered command" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: getRegistration returns full registration for a registered command + +```gwt +Given a fresh CommandRegistry instance +And a "CreateOrder" command is registered with description "Creates an order" +When getRegistration is called for "CreateOrder" +Then the registration is defined with commandType "CreateOrder" and description "Creates an order" +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-011-get-registration-returns-undefined-for-a-non-existent-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-011-get-registration-returns-undefined-for-a-non-existent-command.sdp.md index 8735ad02..7a7215b3 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-011-get-registration-returns-undefined-for-a-non-existent-command.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-011-get-registration-returns-undefined-for-a-non-existent-command.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "getRegistration returns undefined for a non-existent command" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: getRegistration returns undefined for a non-existent command + +```gwt +Given a fresh CommandRegistry instance +When getRegistration is called for "NonExistent" +Then the registration result is undefined +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-012-has-returns-true-for-a-registered-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-012-has-returns-true-for-a-registered-command.sdp.md index 28b63a74..1909bb9e 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-012-has-returns-true-for-a-registered-command.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-012-has-returns-true-for-a-registered-command.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "has returns true for a registered command" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: has returns true for a registered command + +```gwt +Given a fresh CommandRegistry instance +And a "CreateOrder" command is registered +When the scenario runs +Then the registry has "CreateOrder" +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-013-has-returns-false-for-a-non-existent-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-013-has-returns-false-for-a-non-existent-command.sdp.md index 1fe7ab80..7b3bbccd 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-013-has-returns-false-for-a-non-existent-command.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-013-has-returns-false-for-a-non-existent-command.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "has returns false for a non-existent command" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: has returns false for a non-existent command + +```gwt +Given a fresh CommandRegistry instance +When the scenario runs +Then the registry does not have "NonExistent" +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-014-validate-returns-valid-for-correct-payload.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-014-validate-returns-valid-for-correct-payload.sdp.md index 62a0558a..bb0e0ab3 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-014-validate-returns-valid-for-correct-payload.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-014-validate-returns-valid-for-correct-payload.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Validate returns valid for correct payload" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: Validate returns valid for correct payload + +```gwt +Given a fresh CommandRegistry instance +And a "CreateOrder" command is registered with orderId and customerId schema +When "CreateOrder" is validated with orderId "ord_123" and customerId "cust_456" +Then validation is valid with matching data +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-015-validate-returns-invalid-for-incorrect-payload.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-015-validate-returns-invalid-for-incorrect-payload.sdp.md index df43604b..bd05c659 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-015-validate-returns-invalid-for-incorrect-payload.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-015-validate-returns-invalid-for-incorrect-payload.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Validate returns invalid for incorrect payload" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: Validate returns invalid for incorrect payload + +```gwt +Given a fresh CommandRegistry instance +And a "CreateOrder" command is registered with orderId and customerId schema +When "CreateOrder" is validated with only orderId "ord_123" +Then validation is invalid with errors +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-016-validate-returns-unknown-command-for-non-existent-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-016-validate-returns-unknown-command-for-non-existent-command.sdp.md index e8bee177..effc8851 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-016-validate-returns-unknown-command-for-non-existent-command.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-016-validate-returns-unknown-command-for-non-existent-command.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Validate returns UNKNOWN_COMMAND for non-existent command" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: Validate returns UNKNOWN_COMMAND for non-existent command + +```gwt +Given a fresh CommandRegistry instance +When "NonExistent" is validated with empty payload +Then validation is invalid with error code "UNKNOWN_COMMAND" +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-017-list-returns-empty-array-when-no-commands-are-registered.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-017-list-returns-empty-array-when-no-commands-are-registered.sdp.md index 52c11984..4b8582fc 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-017-list-returns-empty-array-when-no-commands-are-registered.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-017-list-returns-empty-array-when-no-commands-are-registered.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "list returns empty array when no commands are registered" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: list returns empty array when no commands are registered + +```gwt +Given a fresh CommandRegistry instance +When the scenario runs +Then list returns an empty array +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-018-list-returns-all-registered-commands.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-018-list-returns-all-registered-commands.sdp.md index 2e820e34..cf42a87a 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-018-list-returns-all-registered-commands.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-018-list-returns-all-registered-commands.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "list returns all registered commands" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: list returns all registered commands + +```gwt +Given a fresh CommandRegistry instance +And "CreateOrder" and "CancelOrder" are registered for listing +When the scenario runs +Then list returns 2 commands containing: +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-019-list-returns-command-info-objects-with-correct-shape.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-019-list-returns-command-info-objects-with-correct-shape.sdp.md index 9d7b698c..1ed5d44c 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-019-list-returns-command-info-objects-with-correct-shape.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-019-list-returns-command-info-objects-with-correct-shape.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "list returns CommandInfo objects with correct shape" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: list returns CommandInfo objects with correct shape + +```gwt +Given a fresh CommandRegistry instance +And a "CreateOrder" command is registered with full metadata +When the scenario runs +Then the CommandInfo has the expected fields +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-020-filter-commands-by-category.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-020-filter-commands-by-category.sdp.md index 2240a163..968c52e9 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-020-filter-commands-by-category.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-020-filter-commands-by-category.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Filter commands by category" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: Filter commands by category + +```gwt +Given a fresh CommandRegistry instance +And the following categorized commands are registered: +When the scenario runs +Then listByCategory returns the expected results: +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-021-filter-commands-by-bounded-context.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-021-filter-commands-by-bounded-context.sdp.md index e6c67686..d00fe99b 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-021-filter-commands-by-bounded-context.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-021-filter-commands-by-bounded-context.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Filter commands by bounded context" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: Filter commands by bounded context + +```gwt +Given a fresh CommandRegistry instance +And commands are registered across contexts for context filtering +When the scenario runs +Then listByContext "orders" returns 2 commands +And listByContext "nonexistent" returns 0 commands +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-022-filter-commands-by-tag.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-022-filter-commands-by-tag.sdp.md index c45c1709..3faae3b2 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-022-filter-commands-by-tag.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-022-filter-commands-by-tag.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Filter commands by tag" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: Filter commands by tag + +```gwt +Given a fresh CommandRegistry instance +And commands are registered with tags for tag filtering +When the scenario runs +Then listByTag "orders" returns 2 commands +And listByTag "inventory" returns 1 command with commandType "ReserveStock" +And listByTag "nonexistent" returns 0 commands +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-023-group-commands-by-bounded-context.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-023-group-commands-by-bounded-context.sdp.md index f1486d3f..b6309299 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-023-group-commands-by-bounded-context.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-023-group-commands-by-bounded-context.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Group commands by bounded context" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: Group commands by bounded context + +```gwt +Given a fresh CommandRegistry instance +And commands are registered across contexts for grouping +When the scenario runs +Then groupByContext returns a map with 2 keys +And the "orders" group has 2 commands +And the "inventory" group has 1 command +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-024-group-by-context-returns-empty-map-when-no-commands.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-024-group-by-context-returns-empty-map-when-no-commands.sdp.md index 1d803e65..1901bbd1 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-024-group-by-context-returns-empty-map-when-no-commands.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-024-group-by-context-returns-empty-map-when-no-commands.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "groupByContext returns empty map when no commands" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: groupByContext returns empty map when no commands + +```gwt +Given a fresh CommandRegistry instance +When the scenario runs +Then groupByContext returns a map with 0 keys +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-025-size-reflects-registered-command-count.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-025-size-reflects-registered-command-count.sdp.md index 38538b04..a45b8645 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-025-size-reflects-registered-command-count.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-025-size-reflects-registered-command-count.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Size reflects registered command count" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: Size reflects registered command count + +```gwt +Given a fresh CommandRegistry instance +When "CreateOrder" and "CancelOrder" are registered for size check +Then the registry size is 0 +And the registry size is 2 +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-026-clear-removes-all-registrations.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-026-clear-removes-all-registrations.sdp.md index 4b60d68a..75234d63 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-026-clear-removes-all-registrations.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-026-clear-removes-all-registrations.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Clear removes all registrations" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: Clear removes all registrations + +```gwt +Given a fresh CommandRegistry instance +And "CreateOrder" and "CancelOrder" are registered for clearing +When the registry is cleared +Then the registry size is 0 +``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-027-global-registry-is-a-functional-registry-instance.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-027-global-registry-is-a-functional-registry-instance.sdp.md index 310a1dd7..72ae1d35 100644 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-027-global-registry-is-a-functional-registry-instance.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.examples/s-027-global-registry-is-a-functional-registry-instance.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "globalRegistry is a functional registry instance" from packages/platform-core/tests/features/behavior/registry/command-registry.feature +- outcome: Executable scenario: globalRegistry is a functional registry instance + +```gwt +Given the feature fixture is in place +When the scenario runs +Then globalRegistry is defined +And globalRegistry exposes a register function +``` diff --git a/specs/behavior/platform-core/registry/command-registry.sdp.md b/specs/behavior/platform-core/registry/command-registry.sdp.md index a0e0cde5..49980874 100644 --- a/specs/behavior/platform-core/registry/command-registry.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.sdp.md @@ -10,4 +10,23 @@ relations: ## Intent -- outcome: a central registry for command definitions so that commands can be looked up, validated, and filtered at runtime (test carrier: packages/platform-core/tests/features/behavior/registry/command-registry.feature) +- actor: a platform developer +- outcome: a central registry for command definitions so that commands can be looked up, validated, and filtered at runtime + +## Behavior + +- rule: CommandRegistry implements the singleton pattern +- rule: Commands can be registered and duplicate registration is rejected +- rule: Commands can be unregistered from the registry +- rule: getConfig returns the command configuration or undefined +- rule: getRegistration returns the full registration or undefined +- rule: has checks whether a command is registered +- rule: validate checks command payloads against registered Zod schemas +- rule: list returns all registered commands as CommandInfo objects +- rule: listByCategory filters commands by their category +- rule: listByContext filters commands by bounded context +- rule: listByTag filters commands by tag +- rule: groupByContext groups commands by their bounded context +- rule: size returns the number of registered commands +- rule: clear removes all registrations +- rule: globalRegistry is a functional singleton instance diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-001-config-has-correct-command-type-bounded-context-and-projection-name.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-001-config-has-correct-command-type-bounded-context-and-projection-name.sdp.md index 970b70d3..778f0861 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-001-config-has-correct-command-type-bounded-context-and-projection-name.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-001-config-has-correct-command-type-bounded-context-and-projection-name.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Config has correct commandType, boundedContext, and projection name" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: Config has correct commandType, boundedContext, and projection name + +```gwt +Given the module is imported from platform-core +When an aggregate command "CreateOrder" is defined in context "orders" with projection "orderSummary" +Then the config commandType is "CreateOrder" +And the config boundedContext is "orders" +And the config projection name is "orderSummary" +``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-002-to-handler-args-merges-original-args-with-command-id-and-correlation-id.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-002-to-handler-args-merges-original-args-with-command-id-and-correlation-id.sdp.md index 728b4278..d7d23461 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-002-to-handler-args-merges-original-args-with-command-id-and-correlation-id.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-002-to-handler-args-merges-original-args-with-command-id-and-correlation-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "toHandlerArgs merges original args with commandId and correlationId" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: toHandlerArgs merges original args with commandId and correlationId + +```gwt +Given the module is imported from platform-core +And an aggregate command "CreateOrder" is defined with an orderId field +When toHandlerArgs is called with orderId "ord_123", commandId "cmd_456", correlationId "corr_789" +Then the handler args equal orderId "ord_123", commandId "cmd_456", correlationId "corr_789" +``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-003-default-partition-key-uses-aggregate-id-field.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-003-default-partition-key-uses-aggregate-id-field.sdp.md index 0ce7e14b..c1a45058 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-003-default-partition-key-uses-aggregate-id-field.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-003-default-partition-key-uses-aggregate-id-field.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Default partition key uses aggregateIdField" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: Default partition key uses aggregateIdField + +```gwt +Given the module is imported from platform-core +And an aggregate command "CreateOrder" is defined with aggregateIdField "orderId" +When getPartitionKey is called with orderId "ord_123" +Then the partition key is name "orderId" and value "ord_123" +``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-004-custom-partition-key-overrides-the-default.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-004-custom-partition-key-overrides-the-default.sdp.md index c98cf14b..59026e84 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-004-custom-partition-key-overrides-the-default.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-004-custom-partition-key-overrides-the-default.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Custom partition key overrides the default" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: Custom partition key overrides the default + +```gwt +Given the module is imported from platform-core +And an aggregate command "CreateOrder" is defined with a custom partition key on "customerId" +When getPartitionKey is called with orderId "ord_123" and customerId "cust_456" +Then the partition key is name "customerId" and value "cust_456" +``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-005-metadata-reflects-aggregate-category-and-custom-options.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-005-metadata-reflects-aggregate-category-and-custom-options.sdp.md index 2bb87324..9051d582 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-005-metadata-reflects-aggregate-category-and-custom-options.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-005-metadata-reflects-aggregate-category-and-custom-options.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Metadata reflects aggregate category and custom options" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: Metadata reflects aggregate category and custom options + +```gwt +Given the module is imported from platform-core +When an aggregate command "CreateOrder" is defined with description "Creates a new order", schemaVersion 2, and tags "orders,create" +Then the metadata category is "aggregate" +And the metadata targetAggregate type is "Order" with idField "orderId" +And the metadata description is "Creates a new order" +And the metadata schemaVersion is 2 +And the metadata tags are "orders,create" +``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-006-command-is-auto-registered-by-default.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-006-command-is-auto-registered-by-default.sdp.md index c58c29ff..88bde989 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-006-command-is-auto-registered-by-default.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-006-command-is-auto-registered-by-default.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Command is auto-registered by default" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: Command is auto-registered by default + +```gwt +Given the module is imported from platform-core +When an aggregate command "CreateOrder" is defined without autoRegister option +Then the global registry has "CreateOrder" +``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-007-command-is-not-registered-when-auto-register-is-false.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-007-command-is-not-registered-when-auto-register-is-false.sdp.md index 9e37881e..1457a659 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-007-command-is-not-registered-when-auto-register-is-false.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-007-command-is-not-registered-when-auto-register-is-false.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Command is not registered when autoRegister is false" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: Command is not registered when autoRegister is false + +```gwt +Given the module is imported from platform-core +When an aggregate command "CreateOrder" is defined with autoRegister false +Then the global registry does not have "CreateOrder" +``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-008-secondary-projections-are-included-in-config.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-008-secondary-projections-are-included-in-config.sdp.md index d1a840b1..8f85fe19 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-008-secondary-projections-are-included-in-config.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-008-secondary-projections-are-included-in-config.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Secondary projections are included in config" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: Secondary projections are included in config + +```gwt +Given the module is imported from platform-core +When an aggregate command "CreateOrder" is defined with a secondary projection "orderStats" +Then the config has 1 secondary projection +And the first secondary projection name is "orderStats" +``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-009-saga-route-is-included-in-config.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-009-saga-route-is-included-in-config.sdp.md index 4a780660..6482e051 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-009-saga-route-is-included-in-config.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-009-saga-route-is-included-in-config.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Saga route is included in config" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: Saga route is included in config + +```gwt +Given the module is imported from platform-core +When an aggregate command "CreateOrder" is defined with a saga route returning "OrderCreated" +Then the config saga route is defined +And the saga route getEventType returns "OrderCreated" +``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-010-saga-route-on-complete-is-preserved.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-010-saga-route-on-complete-is-preserved.sdp.md index 1c42759c..ea09c9f6 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-010-saga-route-on-complete-is-preserved.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-010-saga-route-on-complete-is-preserved.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "sagaRoute.onComplete is preserved" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: sagaRoute.onComplete is preserved + +```gwt +Given the module is imported from platform-core +When an aggregate command "CreateOrder" is defined with a saga route that has an onComplete handler +Then the config saga route onComplete is the same reference as the provided handler +``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-011-failed-projection-is-included-in-config.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-011-failed-projection-is-included-in-config.sdp.md index 869675bc..06902348 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-011-failed-projection-is-included-in-config.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-011-failed-projection-is-included-in-config.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Failed projection is included in config" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: Failed projection is included in config + +```gwt +Given the module is imported from platform-core +When an aggregate command "CreateOrder" is defined with a failed projection "orderFailures" +Then the config failed projection is defined +And the config failed projection name is "orderFailures" +``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-012-schema-version-defaults-to-1.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-012-schema-version-defaults-to-1.sdp.md index 82dbb7a4..57eb42a1 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-012-schema-version-defaults-to-1.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-012-schema-version-defaults-to-1.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "SchemaVersion defaults to 1" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: SchemaVersion defaults to 1 + +```gwt +Given the module is imported from platform-core +When an aggregate command "CreateOrder" is defined without specifying schemaVersion +Then the metadata schemaVersion is 1 +``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-013-process-command-has-correct-category-and-target.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-013-process-command-has-correct-category-and-target.sdp.md index 38168cc5..f8f5c3fc 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-013-process-command-has-correct-category-and-target.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-013-process-command-has-correct-category-and-target.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Process command has correct category and target" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: Process command has correct category and target + +```gwt +Given the module is imported from platform-core +When a process command "StartOrderFulfillment" is defined for process "OrderFulfillment" +Then the process metadata category is "process" +And the process metadata targetProcess is "OrderFulfillment" +And the process metadata targetAggregate is undefined +``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-014-partition-key-uses-process-id-field.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-014-partition-key-uses-process-id-field.sdp.md index 42a7eec6..3dbdacb1 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-014-partition-key-uses-process-id-field.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-014-partition-key-uses-process-id-field.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Partition key uses processIdField" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: Partition key uses processIdField + +```gwt +Given the module is imported from platform-core +And a process command "StartOrderFulfillment" is defined with processIdField "processId" +When the process getPartitionKey is called with processId "proc_123" +Then the process partition key is name "processId" and value "proc_123" +``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-015-process-command-auto-registers-with-category-and-target-info.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-015-process-command-auto-registers-with-category-and-target-info.sdp.md index b5756ad6..d71a0631 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-015-process-command-auto-registers-with-category-and-target-info.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-015-process-command-auto-registers-with-category-and-target-info.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Process command auto-registers with category and target info" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: Process command auto-registers with category and target info + +```gwt +Given the module is imported from platform-core +When a process command "StartOrderFulfillment" is defined for process "OrderFulfillment" with auto-register +Then the global registry has "StartOrderFulfillment" +And the registry entry for "StartOrderFulfillment" has category "process" and targetProcess "OrderFulfillment" +``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-016-system-command-has-correct-category-subsystem-and-description.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-016-system-command-has-correct-category-subsystem-and-description.sdp.md index 7d1bdde4..fc45ddda 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-016-system-command-has-correct-category-subsystem-and-description.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-016-system-command-has-correct-category-subsystem-and-description.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "System command has correct category, subsystem, and description" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: System command has correct category, subsystem, and description + +```gwt +Given the module is imported from platform-core +When a system command "CleanupExpiredCommands" is defined with subsystem "cleanup" and description "Cleans up expired command records" +Then the system metadata category is "system" +And the system metadata subsystem is "cleanup" +And the system metadata description is "Cleans up expired command records" +``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-017-system-to-handler-args-merges-args-with-command-id-and-correlation-id.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-017-system-to-handler-args-merges-args-with-command-id-and-correlation-id.sdp.md index b2200276..35558b36 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-017-system-to-handler-args-merges-args-with-command-id-and-correlation-id.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-017-system-to-handler-args-merges-args-with-command-id-and-correlation-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "System toHandlerArgs merges args with commandId and correlationId" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: System toHandlerArgs merges args with commandId and correlationId + +```gwt +Given the module is imported from platform-core +And a system command "CleanupExpiredCommands" is defined +When system toHandlerArgs is called with olderThanMs 86400000, commandId "cmd_123", correlationId "corr_456" +Then the system handler args equal olderThanMs 86400000, commandId "cmd_123", correlationId "corr_456" +``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-018-system-command-without-projection-has-no-projection-property.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-018-system-command-without-projection-has-no-projection-property.sdp.md index 42af5b5c..a0b3b4aa 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-018-system-command-without-projection-has-no-projection-property.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-018-system-command-without-projection-has-no-projection-property.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "System command without projection has no projection property" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: System command without projection has no projection property + +```gwt +Given the module is imported from platform-core +When a system command "CleanupExpiredCommands" is defined without a projection +Then the system config commandType is "CleanupExpiredCommands" +And the system config does not have a projection property +``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-019-system-command-with-projection-includes-it-in-config.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-019-system-command-with-projection-includes-it-in-config.sdp.md index cce1f0aa..eef8e145 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-019-system-command-with-projection-includes-it-in-config.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-019-system-command-with-projection-includes-it-in-config.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "System command with projection includes it in config" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: System command with projection includes it in config + +```gwt +Given the module is imported from platform-core +When a system command "CleanupExpiredCommands" is defined with projection "cleanupStats" +Then the system config projection name is "cleanupStats" +``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-020-system-partition-key-defaults-to-system-command-type.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-020-system-partition-key-defaults-to-system-command-type.sdp.md index d391d4a9..7244f961 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-020-system-partition-key-defaults-to-system-command-type.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-020-system-partition-key-defaults-to-system-command-type.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "System partition key defaults to system/commandType" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: System partition key defaults to system/commandType + +```gwt +Given the module is imported from platform-core +And a system command "CleanupExpiredCommands" is defined with a projection +When the system getPartitionKey is called with olderThanMs 86400000 +Then the system partition key is name "system" and value "CleanupExpiredCommands" +``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-021-system-command-without-projection-is-not-registered-even-with-auto-registe.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-021-system-command-without-projection-is-not-registered-even-with-auto-registe.sdp.md index 5ab87e41..cde6ecbc 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-021-system-command-without-projection-is-not-registered-even-with-auto-registe.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-021-system-command-without-projection-is-not-registered-even-with-auto-registe.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "System command without projection is not registered even with autoRegister true" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: System command without projection is not registered even with autoRegister true + +```gwt +Given the module is imported from platform-core +When a system command "CleanupExpiredCommandsNoProj" is defined with autoRegister true but no projection and a system command "CleanupExpiredCommandsWithProj" is defined with autoRegister true and projection "cleanupStats" +Then the global registry does not have "CleanupExpiredCommandsNoProj" +And the global registry has "CleanupExpiredCommandsWithProj" +``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-022-system-schema-version-defaults-to-1.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-022-system-schema-version-defaults-to-1.sdp.md index f6c09adb..77c94b4a 100644 --- a/specs/behavior/platform-core/registry/define-command.examples/s-022-system-schema-version-defaults-to-1.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.examples/s-022-system-schema-version-defaults-to-1.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "System schemaVersion defaults to 1" from packages/platform-core/tests/features/behavior/registry/define-command.feature +- outcome: Executable scenario: System schemaVersion defaults to 1 + +```gwt +Given the module is imported from platform-core +When a system command "CleanupExpiredCommands" is defined without specifying schemaVersion +Then the system metadata schemaVersion is 1 +``` diff --git a/specs/behavior/platform-core/registry/define-command.sdp.md b/specs/behavior/platform-core/registry/define-command.sdp.md index b826b3d8..2496341a 100644 --- a/specs/behavior/platform-core/registry/define-command.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.sdp.md @@ -10,4 +10,29 @@ relations: ## Intent -- outcome: helper functions that reduce boilerplate for defining commands so that aggregate, process, and system commands can be defined concisely (test carrier: packages/platform-core/tests/features/behavior/registry/define-command.feature) +- actor: a platform developer +- outcome: helper functions that reduce boilerplate for defining commands so that aggregate, process, and system commands can be defined concisely + +## Behavior + +- rule: defineAggregateCommand creates a correctly structured command config +- rule: defineAggregateCommand generates toHandlerArgs that adds commandId and correlationId +- rule: defineAggregateCommand generates default partition key from aggregateIdField +- rule: defineAggregateCommand allows custom partition key override +- rule: defineAggregateCommand sets correct metadata for aggregate commands +- rule: defineAggregateCommand auto-registers with global registry by default +- rule: defineAggregateCommand handles secondary projections +- rule: defineAggregateCommand handles saga routing +- rule: defineAggregateCommand preserves sagaRoute.onComplete for dead letter tracking +- rule: defineAggregateCommand handles failed projection +- rule: defineAggregateCommand defaults schemaVersion to 1 +- rule: defineProcessCommand creates a process command with correct metadata +- rule: defineProcessCommand uses processIdField for default partition key +- rule: defineProcessCommand auto-registers with correct category info +- rule: defineSystemCommand creates a system command with correct metadata +- rule: defineSystemCommand generates toHandlerArgs correctly +- rule: defineSystemCommand works without projection +- rule: defineSystemCommand supports optional projection +- rule: defineSystemCommand uses system partition key when no custom key specified +- rule: defineSystemCommand registers only when projection is provided +- rule: defineSystemCommand defaults schemaVersion to 1 diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-001-load-and-upcast-cms-by-entity-id.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-001-load-and-upcast-cms-by-entity-id.sdp.md index ada88588..c29e5b29 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-001-load-and-upcast-cms-by-entity-id.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-001-load-and-upcast-cms-by-entity-id.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Load and upcast CMS by entity ID" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: Load and upcast CMS by entity ID + +```gwt +Given a raw CMS document exists with testId "test_456" and docId "doc_123" +When I load the entity with ID "test_456" +Then the load result has all expected fields: +And the query was called with table "testCMS" and index "by_testId" +And the upcast function was called with the raw document +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-002-load-throws-not-found-error-for-missing-entity.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-002-load-throws-not-found-error-for-missing-entity.sdp.md index 436a1bcc..21790495 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-002-load-throws-not-found-error-for-missing-entity.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-002-load-throws-not-found-error-for-missing-entity.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Load throws NotFoundError for missing entity" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: Load throws NotFoundError for missing entity + +```gwt +Given no CMS document exists for the query +When I attempt to load the entity with ID "nonexistent" +Then a NotFoundError is thrown with message "testCMS not found: nonexistent" +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-003-load-returns-upcast-metadata.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-003-load-returns-upcast-metadata.sdp.md index 5f8d9717..1dcbd0e1 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-003-load-returns-upcast-metadata.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-003-load-returns-upcast-metadata.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Load returns upcast metadata" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: Load returns upcast metadata + +```gwt +Given a raw CMS document exists with testId "test_456" and docId "doc_123" +And the upcast function returns wasUpcasted true and originalStateVersion 1 +When I load the entity with ID "test_456" +Then the load result wasUpcasted is true +And the load result originalStateVersion is 1 +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-004-load-propagates-upcast-errors.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-004-load-propagates-upcast-errors.sdp.md index 90b53354..a5d171e3 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-004-load-propagates-upcast-errors.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-004-load-propagates-upcast-errors.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Load propagates upcast errors" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: Load propagates upcast errors + +```gwt +Given a raw CMS document exists with testId "test_456" and docId "doc_123" +And the upcast function throws "Upcast failed: invalid state" +When I attempt to load the entity with ID "test_456" +Then an error is thrown with message "Upcast failed: invalid state" +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-005-try-load-returns-cms-when-entity-exists.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-005-try-load-returns-cms-when-entity-exists.sdp.md index 7f0f859f..93168cc5 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-005-try-load-returns-cms-when-entity-exists.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-005-try-load-returns-cms-when-entity-exists.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "tryLoad returns CMS when entity exists" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: tryLoad returns CMS when entity exists + +```gwt +Given a raw CMS document exists with testId "test_456" and docId "doc_123" +When I tryLoad the entity with ID "test_456" +Then the tryLoad result is not null +And the tryLoad result has docId "doc_123" and testId "test_456" +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-006-try-load-returns-null-when-entity-does-not-exist.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-006-try-load-returns-null-when-entity-does-not-exist.sdp.md index b8c99833..90426962 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-006-try-load-returns-null-when-entity-does-not-exist.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-006-try-load-returns-null-when-entity-does-not-exist.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "tryLoad returns null when entity does not exist" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: tryLoad returns null when entity does not exist + +```gwt +Given no CMS document exists for the query +When I tryLoad the entity with ID "nonexistent" +Then the tryLoad result is null +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-007-try-load-resolves-to-null-without-throwing.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-007-try-load-resolves-to-null-without-throwing.sdp.md index a50b7668..f1f6889a 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-007-try-load-resolves-to-null-without-throwing.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-007-try-load-resolves-to-null-without-throwing.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "tryLoad resolves to null without throwing" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: tryLoad resolves to null without throwing + +```gwt +Given no CMS document exists for the query +When I tryLoad the entity with ID "nonexistent" +Then the tryLoad promise resolves to null +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-008-try-load-propagates-upcast-errors.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-008-try-load-propagates-upcast-errors.sdp.md index e68ee432..2f605396 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-008-try-load-propagates-upcast-errors.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-008-try-load-propagates-upcast-errors.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "tryLoad propagates upcast errors" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: tryLoad propagates upcast errors + +```gwt +Given a raw CMS document exists with testId "test_456" and docId "doc_123" +And the upcast function throws "Invalid CMS state during upcast" +When I attempt to tryLoad the entity with ID "test_456" +Then an error is thrown with message "Invalid CMS state during upcast" +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-009-exists-returns-true-when-entity-exists.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-009-exists-returns-true-when-entity-exists.sdp.md index 2e5388b0..34fb6dc4 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-009-exists-returns-true-when-entity-exists.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-009-exists-returns-true-when-entity-exists.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "exists returns true when entity exists" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: exists returns true when entity exists + +```gwt +Given a raw CMS document exists with testId "test_456" and docId "doc_123" +When I check if entity "test_456" exists +Then the exists result is true +And the query was called with table "testCMS" and index "by_testId" +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-010-exists-returns-false-when-entity-does-not-exist.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-010-exists-returns-false-when-entity-does-not-exist.sdp.md index 3e8baa7c..d72d9d1b 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-010-exists-returns-false-when-entity-does-not-exist.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-010-exists-returns-false-when-entity-does-not-exist.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "exists returns false when entity does not exist" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: exists returns false when entity does not exist + +```gwt +Given no CMS document exists for the query +When I check if entity "nonexistent" exists +Then the exists result is false +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-011-exists-does-not-call-upcast-function.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-011-exists-does-not-call-upcast-function.sdp.md index d80b54d0..11ce0378 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-011-exists-does-not-call-upcast-function.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-011-exists-does-not-call-upcast-function.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "exists does not call upcast function" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: exists does not call upcast function + +```gwt +Given a raw CMS document exists with testId "test_456" and docId "doc_123" +When I check if entity "test_456" exists +Then the upcast function was not called +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-012-load-many-loads-multiple-entities-in-parallel.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-012-load-many-loads-multiple-entities-in-parallel.sdp.md index 33ed9456..1018f92a 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-012-load-many-loads-multiple-entities-in-parallel.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-012-load-many-loads-multiple-entities-in-parallel.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "loadMany loads multiple entities in parallel" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: loadMany loads multiple entities in parallel + +```gwt +Given raw CMS documents exist for IDs: +When I loadMany with IDs "test_1,test_2" +Then the loadMany result has length 2 +And the loadMany results match: +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-013-load-many-returns-null-for-missing-entities.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-013-load-many-returns-null-for-missing-entities.sdp.md index c1683e30..0437fd81 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-013-load-many-returns-null-for-missing-entities.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-013-load-many-returns-null-for-missing-entities.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "loadMany returns null for missing entities" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: loadMany returns null for missing entities + +```gwt +Given raw CMS documents exist with gaps: +When I loadMany with IDs "test_1,missing,test_3" +Then the loadMany result has length 3 +And the loadMany result at index 0 is not null +And the loadMany result at index 1 is null +And the loadMany result at index 2 is not null +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-014-load-many-returns-empty-array-for-empty-input.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-014-load-many-returns-empty-array-for-empty-input.sdp.md index 97f5605f..a04c101f 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-014-load-many-returns-empty-array-for-empty-input.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-014-load-many-returns-empty-array-for-empty-input.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "loadMany returns empty array for empty input" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: loadMany returns empty array for empty input + +```gwt +Given the feature fixture is in place +When I loadMany with an empty ID list +Then the loadMany result is an empty array +And the query was not called +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-015-load-many-upcasts-all-loaded-entities.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-015-load-many-upcasts-all-loaded-entities.sdp.md index 3c6bfdb9..07acf565 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-015-load-many-upcasts-all-loaded-entities.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-015-load-many-upcasts-all-loaded-entities.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "loadMany upcasts all loaded entities" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: loadMany upcasts all loaded entities + +```gwt +Given raw CMS documents exist for IDs: +When I loadMany with IDs "test_1,test_2" +Then the upcast function was called 2 times +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-016-load-many-preserves-order-of-input-i-ds.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-016-load-many-preserves-order-of-input-i-ds.sdp.md index 8be16496..44d9f284 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-016-load-many-preserves-order-of-input-i-ds.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-016-load-many-preserves-order-of-input-i-ds.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "loadMany preserves order of input IDs" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: loadMany preserves order of input IDs + +```gwt +Given raw CMS documents exist for IDs: +When I loadMany with IDs "a,b,c" +Then the loadMany results are in order: +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-017-load-many-propagates-upcast-errors-for-any-entity.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-017-load-many-propagates-upcast-errors-for-any-entity.sdp.md index 5feb5208..3b01bec6 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-017-load-many-propagates-upcast-errors-for-any-entity.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-017-load-many-propagates-upcast-errors-for-any-entity.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "loadMany propagates upcast errors for any entity" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: loadMany propagates upcast errors for any entity + +```gwt +Given raw CMS documents exist for IDs: +And the upcast function succeeds then throws "Upcast failed for second entity" +When I attempt to loadMany with IDs "test_1,test_2" +Then an error is thrown with message "Upcast failed for second entity" +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-018-insert-creates-cms-record-and-returns-document-id.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-018-insert-creates-cms-record-and-returns-document-id.sdp.md index 190f0868..18c975e0 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-018-insert-creates-cms-record-and-returns-document-id.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-018-insert-creates-cms-record-and-returns-document-id.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "insert creates CMS record and returns document ID" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: insert creates CMS record and returns document ID + +```gwt +Given a new CMS record with testId "test_789" and name "New Entity" +When I insert the CMS record +Then the insert returns document ID "doc_789" +And the insert was called with table "testCMS" +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-019-update-patches-cms-when-version-matches.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-019-update-patches-cms-when-version-matches.sdp.md index b2181eab..5b683598 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-019-update-patches-cms-when-version-matches.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-019-update-patches-cms-when-version-matches.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "update patches CMS when version matches" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: update patches CMS when version matches + +```gwt +Given a stored document "doc_123" with version 5 +When I update document "doc_123" with name "Updated" at version 5 +Then the patch was called with the update fields +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-020-update-throws-not-found-error-for-missing-document.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-020-update-throws-not-found-error-for-missing-document.sdp.md index 6603b336..19539df4 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-020-update-throws-not-found-error-for-missing-document.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-020-update-throws-not-found-error-for-missing-document.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "update throws NotFoundError for missing document" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: update throws NotFoundError for missing document + +```gwt +Given no stored document exists for ID "nonexistent" +When I attempt to update document "nonexistent" at version 1 +Then a NotFoundError is thrown +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-021-update-throws-version-conflict-error-on-version-mismatch.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-021-update-throws-version-conflict-error-on-version-mismatch.sdp.md index d1cba84b..1cb9a78b 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-021-update-throws-version-conflict-error-on-version-mismatch.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-021-update-throws-version-conflict-error-on-version-mismatch.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "update throws VersionConflictError on version mismatch" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: update throws VersionConflictError on version mismatch + +```gwt +Given a stored document "doc_123" with version 10 +When I attempt to update document "doc_123" at version 5 +Then a VersionConflictError is thrown with message "expected 5, got 10" +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-022-not-found-error-has-correct-properties.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-022-not-found-error-has-correct-properties.sdp.md index 1e549665..5ebcdc54 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-022-not-found-error-has-correct-properties.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-022-not-found-error-has-correct-properties.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "NotFoundError has correct properties" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: NotFoundError has correct properties + +```gwt +Given the feature fixture is in place +When I create a NotFoundError with table "orderCMS" and id "order_123" +Then the NotFoundError has all expected properties: +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-023-not-found-error-is-instanceof-error.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-023-not-found-error-is-instanceof-error.sdp.md index c2cf1db7..f07b34fb 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-023-not-found-error-is-instanceof-error.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-023-not-found-error-is-instanceof-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "NotFoundError is instanceof Error" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: NotFoundError is instanceof Error + +```gwt +Given the feature fixture is in place +When I create a NotFoundError with table "testCMS" and id "test_1" +Then the NotFoundError is an instance of Error +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-024-is-not-found-error-type-guard-returns-true-for-not-found-error.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-024-is-not-found-error-type-guard-returns-true-for-not-found-error.sdp.md index a8c155dd..7f2d527c 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-024-is-not-found-error-type-guard-returns-true-for-not-found-error.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-024-is-not-found-error-type-guard-returns-true-for-not-found-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isNotFoundError type guard returns true for NotFoundError" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: isNotFoundError type guard returns true for NotFoundError + +```gwt +Given the feature fixture is in place +When I create a NotFoundError with table "testCMS" and id "test_1" +Then isNotFoundError returns true +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-025-is-not-found-error-type-guard-returns-false-for-non-not-found-error-values.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-025-is-not-found-error-type-guard-returns-false-for-non-not-found-error-values.sdp.md index 237c1803..297ae40f 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-025-is-not-found-error-type-guard-returns-false-for-non-not-found-error-values.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-025-is-not-found-error-type-guard-returns-false-for-non-not-found-error-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isNotFoundError type guard returns false for non-NotFoundError values" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: isNotFoundError type guard returns false for non-NotFoundError values + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isNotFoundError returns false for: +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-026-version-conflict-error-has-correct-properties.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-026-version-conflict-error-has-correct-properties.sdp.md index 8f039fdc..8b8601c6 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-026-version-conflict-error-has-correct-properties.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-026-version-conflict-error-has-correct-properties.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "VersionConflictError has correct properties" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: VersionConflictError has correct properties + +```gwt +Given the feature fixture is in place +When I create a VersionConflictError with table "orderCMS" id "order_123" expected 5 actual 10 +Then the VersionConflictError has all expected properties: +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-027-version-conflict-error-is-instanceof-error.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-027-version-conflict-error-is-instanceof-error.sdp.md index dfa68891..a25dcc63 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-027-version-conflict-error-is-instanceof-error.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-027-version-conflict-error-is-instanceof-error.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "VersionConflictError is instanceof Error" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: VersionConflictError is instanceof Error + +```gwt +Given the feature fixture is in place +When I create a VersionConflictError with table "testCMS" id "test_1" expected 1 actual 2 +Then the VersionConflictError is an instance of Error +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-028-is-version-conflict-error-type-guard-returns-true-for-version-conflict-err.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-028-is-version-conflict-error-type-guard-returns-true-for-version-conflict-err.sdp.md index 0477ea8a..48227edb 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-028-is-version-conflict-error-type-guard-returns-true-for-version-conflict-err.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-028-is-version-conflict-error-type-guard-returns-true-for-version-conflict-err.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isVersionConflictError type guard returns true for VersionConflictError" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: isVersionConflictError type guard returns true for VersionConflictError + +```gwt +Given the feature fixture is in place +When I create a VersionConflictError with table "testCMS" id "test_1" expected 1 actual 2 +Then isVersionConflictError returns true +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-029-is-version-conflict-error-type-guard-returns-false-for-other-errors.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-029-is-version-conflict-error-type-guard-returns-false-for-other-errors.sdp.md index 7c47445d..f9803237 100644 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-029-is-version-conflict-error-type-guard-returns-false-for-other-errors.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.examples/s-029-is-version-conflict-error-type-guard-returns-false-for-other-errors.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "isVersionConflictError type guard returns false for other errors" from packages/platform-core/tests/features/behavior/repository/cms-repository.feature +- outcome: Executable scenario: isVersionConflictError type guard returns false for other errors + +```gwt +Given the feature fixture is in place +When the scenario runs +Then isVersionConflictError returns false for: +``` diff --git a/specs/behavior/platform-core/repository/cms-repository.sdp.md b/specs/behavior/platform-core/repository/cms-repository.sdp.md index d8f7b0ac..68763a06 100644 --- a/specs/behavior/platform-core/repository/cms-repository.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Factory-created typed repositories for CMS persistence: - createCMSRepository: Factory for typed repositories with upcast support - NotFoundError: Entity not found errors with table and ID metadata - VersionConflictError: OCC failures with version mismatch details (test carrier: packages/platform-core/tests/features/behavior/repository/cms-repository.feature) +- outcome: CMS Repository + +## Behavior + +- rule: load retrieves and upcasts a CMS entity by ID +- rule: tryLoad returns null instead of throwing for missing entities +- rule: exists checks entity presence without upcast overhead +- rule: loadMany retrieves multiple entities in parallel with null for missing +- rule: insert persists a new CMS record and returns the document ID +- rule: update patches CMS with optimistic concurrency control +- rule: NotFoundError has correct properties and type guard +- rule: VersionConflictError has correct properties and type guard diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-001-confirm-reservation-with-entity-id.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-001-confirm-reservation-with-entity-id.sdp.md index 25b0ecc1..013bd8bb 100644 --- a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-001-confirm-reservation-with-entity-id.sdp.md +++ b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-001-confirm-reservation-with-entity-id.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Confirm reservation with entity ID" from packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature +- outcome: Executable scenario: Confirm reservation with entity ID + +```gwt +Given the reservation module is imported from platform-core +And an active reservation exists for "alice@example.com" +And an active reservation with id "res_123" for "alice@example.com" +When I call confirm({ reservationId: 'res_123', entityId: 'user_456' }) +Then confirmation succeeds +And reservation.status equals "confirmed" +And reservation.entityId equals "user_456" +And reservation.confirmedAt is set +``` diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-002-confirmed-reservation-is-permanent.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-002-confirmed-reservation-is-permanent.sdp.md index 277b09b5..c0259d0b 100644 --- a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-002-confirmed-reservation-is-permanent.sdp.md +++ b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-002-confirmed-reservation-is-permanent.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Confirmed reservation is permanent" from packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature +- outcome: Executable scenario: Confirmed reservation is permanent + +```gwt +Given the reservation module is imported from platform-core +And an active reservation exists for "alice@example.com" +And a confirmed reservation for "alice@example.com" +When I query the reservation +Then expiresAt is null (no expiration) +And status equals "confirmed" +``` diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-003-cannot-confirm-expired-reservation.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-003-cannot-confirm-expired-reservation.sdp.md index ca563a0a..5008a8d8 100644 --- a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-003-cannot-confirm-expired-reservation.sdp.md +++ b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-003-cannot-confirm-expired-reservation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Cannot confirm expired reservation" from packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature +- outcome: Executable scenario: Cannot confirm expired reservation + +```gwt +Given the reservation module is imported from platform-core +And an active reservation exists for "alice@example.com" +And an expired reservation with id "res_expired" +When I call confirm({ reservationId: 'res_expired', entityId: 'user_789' }) +Then an error is thrown with code "RESERVATION_ALREADY_EXPIRED" +``` diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-004-cannot-confirm-already-confirmed-reservation.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-004-cannot-confirm-already-confirmed-reservation.sdp.md index 1dc03d57..ba103cf8 100644 --- a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-004-cannot-confirm-already-confirmed-reservation.sdp.md +++ b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-004-cannot-confirm-already-confirmed-reservation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Cannot confirm already confirmed reservation" from packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature +- outcome: Executable scenario: Cannot confirm already confirmed reservation + +```gwt +Given the reservation module is imported from platform-core +And an active reservation exists for "alice@example.com" +And a confirmed reservation with id "res_confirmed" +When I call confirm({ reservationId: 'res_confirmed', entityId: 'user_999' }) +Then an error is thrown with code "RESERVATION_ALREADY_CONFIRMED" +``` diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-005-cannot-confirm-non-existent-reservation.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-005-cannot-confirm-non-existent-reservation.sdp.md index c8271a04..c90c118f 100644 --- a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-005-cannot-confirm-non-existent-reservation.sdp.md +++ b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-005-cannot-confirm-non-existent-reservation.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cannot confirm non-existent reservation" from packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature +- outcome: Executable scenario: Cannot confirm non-existent reservation + +```gwt +Given the reservation module is imported from platform-core +And an active reservation exists for "alice@example.com" +When I call confirm({ reservationId: 'res_nonexistent', entityId: 'user_000' }) +Then an error is thrown with code "RESERVATION_NOT_FOUND" +``` diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-006-cannot-confirm-released-reservation.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-006-cannot-confirm-released-reservation.sdp.md index 0e356d4a..4e4ddfb6 100644 --- a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-006-cannot-confirm-released-reservation.sdp.md +++ b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-006-cannot-confirm-released-reservation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Cannot confirm released reservation" from packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature +- outcome: Executable scenario: Cannot confirm released reservation + +```gwt +Given the reservation module is imported from platform-core +And an active reservation exists for "alice@example.com" +And a released reservation with id "res_released" +When I call confirm({ reservationId: 'res_released', entityId: 'user_123' }) +Then an error is thrown with code "RESERVATION_ALREADY_RELEASED" +``` diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-007-entity-id-is-required.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-007-entity-id-is-required.sdp.md index 3797edab..f2729f78 100644 --- a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-007-entity-id-is-required.sdp.md +++ b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-007-entity-id-is-required.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Entity ID is required" from packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature +- outcome: Executable scenario: Entity ID is required + +```gwt +Given the reservation module is imported from platform-core +And an active reservation exists for "alice@example.com" +And an active reservation with id "res_123" +When I call confirm({ reservationId: 'res_123' }) without entityId +Then an error is thrown with code "ENTITY_ID_REQUIRED" +``` diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-008-entity-id-can-be-any-string-identifier.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-008-entity-id-can-be-any-string-identifier.sdp.md index b141d82d..fe5b058c 100644 --- a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-008-entity-id-can-be-any-string-identifier.sdp.md +++ b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-008-entity-id-can-be-any-string-identifier.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Entity ID can be any string identifier" from packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature +- outcome: Executable scenario: Entity ID can be any string identifier + +```gwt +Given the reservation module is imported from platform-core +And an active reservation exists for "alice@example.com" +And an active reservation with id "res_123" +When I call confirm({ reservationId: 'res_123', entityId: 'custom_id_format' }) +Then confirmation succeeds +And reservation.entityId equals "custom_id_format" +``` diff --git a/specs/behavior/platform-core/reservation/confirm-operation.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.sdp.md index 06aa5d70..53e6817e 100644 --- a/specs/behavior/platform-core/reservation/confirm-operation.sdp.md +++ b/specs/behavior/platform-core/reservation/confirm-operation.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: to confirm reservations when entities are created so that the reserved value becomes permanently associated (test carrier: packages/platform-core/tests/features/behavior/reservation/confirm-operation.feature) +- actor: a platform developer +- outcome: to confirm reservations when entities are created so that the reserved value becomes permanently associated + +## Behavior + +- rule: confirm() links reservation to created entity +- rule: Only active reservations can be confirmed +- rule: Entity ID must be provided for confirmation diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-001-release-active-reservation.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-001-release-active-reservation.sdp.md index fb6b97d0..4c2de5f8 100644 --- a/specs/behavior/platform-core/reservation/release-operation.examples/s-001-release-active-reservation.sdp.md +++ b/specs/behavior/platform-core/reservation/release-operation.examples/s-001-release-active-reservation.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Release active reservation" from packages/platform-core/tests/features/behavior/reservation/release-operation.feature +- outcome: Executable scenario: Release active reservation + +```gwt +Given the reservation module is imported from platform-core +And an active reservation exists +And an active reservation with id "res_123" for "cancel@example.com" +When I call release({ reservationId: 'res_123' }) +Then release succeeds +And reservation.status equals "released" +And "cancel@example.com" is available for new reservations +``` diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-002-released-value-can-be-immediately-reserved.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-002-released-value-can-be-immediately-reserved.sdp.md index eba9b1bf..124a9998 100644 --- a/specs/behavior/platform-core/reservation/release-operation.examples/s-002-released-value-can-be-immediately-reserved.sdp.md +++ b/specs/behavior/platform-core/reservation/release-operation.examples/s-002-released-value-can-be-immediately-reserved.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Released value can be immediately reserved" from packages/platform-core/tests/features/behavior/reservation/release-operation.feature +- outcome: Executable scenario: Released value can be immediately reserved + +```gwt +Given the reservation module is imported from platform-core +And an active reservation exists +And I released reservation for "reuse@example.com" +When I call reserve({ type: 'email', value: 'reuse@example.com', ttl: 300000 }) +Then a new reservation is created successfully +``` diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-003-cannot-release-confirmed-reservation.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-003-cannot-release-confirmed-reservation.sdp.md index d4e3a9d3..a2b71461 100644 --- a/specs/behavior/platform-core/reservation/release-operation.examples/s-003-cannot-release-confirmed-reservation.sdp.md +++ b/specs/behavior/platform-core/reservation/release-operation.examples/s-003-cannot-release-confirmed-reservation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Cannot release confirmed reservation" from packages/platform-core/tests/features/behavior/reservation/release-operation.feature +- outcome: Executable scenario: Cannot release confirmed reservation + +```gwt +Given the reservation module is imported from platform-core +And an active reservation exists +And a confirmed reservation with id "res_confirmed" +When I call release({ reservationId: 'res_confirmed' }) +Then an error is thrown with code "RESERVATION_ALREADY_CONFIRMED" +``` diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-004-cannot-release-already-released-reservation.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-004-cannot-release-already-released-reservation.sdp.md index ae1351c1..65c0e0d5 100644 --- a/specs/behavior/platform-core/reservation/release-operation.examples/s-004-cannot-release-already-released-reservation.sdp.md +++ b/specs/behavior/platform-core/reservation/release-operation.examples/s-004-cannot-release-already-released-reservation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Cannot release already released reservation" from packages/platform-core/tests/features/behavior/reservation/release-operation.feature +- outcome: Executable scenario: Cannot release already released reservation + +```gwt +Given the reservation module is imported from platform-core +And an active reservation exists +And a released reservation with id "res_released" +When I call release({ reservationId: 'res_released' }) +Then an error is thrown with code "RESERVATION_ALREADY_RELEASED" +``` diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-005-cannot-release-expired-reservation.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-005-cannot-release-expired-reservation.sdp.md index 4b801f3e..1d6a3260 100644 --- a/specs/behavior/platform-core/reservation/release-operation.examples/s-005-cannot-release-expired-reservation.sdp.md +++ b/specs/behavior/platform-core/reservation/release-operation.examples/s-005-cannot-release-expired-reservation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Cannot release expired reservation" from packages/platform-core/tests/features/behavior/reservation/release-operation.feature +- outcome: Executable scenario: Cannot release expired reservation + +```gwt +Given the reservation module is imported from platform-core +And an active reservation exists +And an expired reservation with id "res_expired" +When I call release({ reservationId: 'res_expired' }) +Then an error is thrown with code "RESERVATION_ALREADY_EXPIRED" +``` diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-006-cannot-release-non-existent-reservation.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-006-cannot-release-non-existent-reservation.sdp.md index 5538d5e5..53b257f0 100644 --- a/specs/behavior/platform-core/reservation/release-operation.examples/s-006-cannot-release-non-existent-reservation.sdp.md +++ b/specs/behavior/platform-core/reservation/release-operation.examples/s-006-cannot-release-non-existent-reservation.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cannot release non-existent reservation" from packages/platform-core/tests/features/behavior/reservation/release-operation.feature +- outcome: Executable scenario: Cannot release non-existent reservation + +```gwt +Given the reservation module is imported from platform-core +And an active reservation exists +When I call release({ reservationId: 'res_nonexistent' }) +Then an error is thrown with code "RESERVATION_NOT_FOUND" +``` diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-007-expired-reservations-are-marked-by-cron.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-007-expired-reservations-are-marked-by-cron.sdp.md index c691c8de..79a87973 100644 --- a/specs/behavior/platform-core/reservation/release-operation.examples/s-007-expired-reservations-are-marked-by-cron.sdp.md +++ b/specs/behavior/platform-core/reservation/release-operation.examples/s-007-expired-reservations-are-marked-by-cron.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Expired reservations are marked by cron" from packages/platform-core/tests/features/behavior/reservation/release-operation.feature +- outcome: Executable scenario: Expired reservations are marked by cron + +```gwt +Given the reservation module is imported from platform-core +And an active reservation exists +And a reservation with TTL that expired 1 minute ago +When the TTL expiration cron runs +Then reservation.status equals "expired" +And the value is available for new reservations +``` diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-008-cron-does-not-affect-active-reservations.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-008-cron-does-not-affect-active-reservations.sdp.md index e8943209..1ee70a10 100644 --- a/specs/behavior/platform-core/reservation/release-operation.examples/s-008-cron-does-not-affect-active-reservations.sdp.md +++ b/specs/behavior/platform-core/reservation/release-operation.examples/s-008-cron-does-not-affect-active-reservations.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Cron does not affect active reservations" from packages/platform-core/tests/features/behavior/reservation/release-operation.feature +- outcome: Executable scenario: Cron does not affect active reservations + +```gwt +Given the reservation module is imported from platform-core +And an active reservation exists +And a reservation with 10 minutes remaining TTL +When the TTL expiration cron runs +Then reservation.status remains "reserved" +``` diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-009-cron-does-not-affect-confirmed-reservations.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-009-cron-does-not-affect-confirmed-reservations.sdp.md index 097fbc90..22d36485 100644 --- a/specs/behavior/platform-core/reservation/release-operation.examples/s-009-cron-does-not-affect-confirmed-reservations.sdp.md +++ b/specs/behavior/platform-core/reservation/release-operation.examples/s-009-cron-does-not-affect-confirmed-reservations.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Cron does not affect confirmed reservations" from packages/platform-core/tests/features/behavior/reservation/release-operation.feature +- outcome: Executable scenario: Cron does not affect confirmed reservations + +```gwt +Given the reservation module is imported from platform-core +And an active reservation exists +And a confirmed reservation +When the TTL expiration cron runs +Then reservation.status remains "confirmed" +``` diff --git a/specs/behavior/platform-core/reservation/release-operation.sdp.md b/specs/behavior/platform-core/reservation/release-operation.sdp.md index 577ece74..52f09fe6 100644 --- a/specs/behavior/platform-core/reservation/release-operation.sdp.md +++ b/specs/behavior/platform-core/reservation/release-operation.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: to release reservations before they expire so that values become immediately available when users cancel (test carrier: packages/platform-core/tests/features/behavior/reservation/release-operation.feature) +- actor: a platform developer +- outcome: to release reservations before they expire so that values become immediately available when users cancel + +## Behavior + +- rule: release() frees a reservation immediately +- rule: Only active reservations can be released +- rule: TTL expiration cron marks expired reservations diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-001-email-reservation-key-format.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-001-email-reservation-key-format.sdp.md index 6aa17970..2113cd18 100644 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-001-email-reservation-key-format.sdp.md +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-001-email-reservation-key-format.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Email reservation key format" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature +- outcome: Executable scenario: Email reservation key format + +```gwt +Given the reservation module is imported from platform-core +When I call reserve({ type: 'email', value: 'alice@example.com', ttl: 300000 }) +Then reservation.key equals "email:alice@example.com" +``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-002-username-reservation-key-format.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-002-username-reservation-key-format.sdp.md index c1ac3b89..352efcc8 100644 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-002-username-reservation-key-format.sdp.md +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-002-username-reservation-key-format.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Username reservation key format" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature +- outcome: Executable scenario: Username reservation key format + +```gwt +Given the reservation module is imported from platform-core +When I call reserve({ type: 'username', value: 'alice123', ttl: 300000 }) +Then reservation.key equals "username:alice123" +``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-003-custom-type-reservation-key-format.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-003-custom-type-reservation-key-format.sdp.md index 9086381d..28abdbb8 100644 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-003-custom-type-reservation-key-format.sdp.md +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-003-custom-type-reservation-key-format.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Custom type reservation key format" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature +- outcome: Executable scenario: Custom type reservation key format + +```gwt +Given the reservation module is imported from platform-core +When I call reserve({ type: 'phone', value: '+1-555-0123', ttl: 300000 }) +Then reservation.key equals "phone:+1-555-0123" +``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-004-same-value-different-types.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-004-same-value-different-types.sdp.md index 45717e86..995f17e1 100644 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-004-same-value-different-types.sdp.md +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-004-same-value-different-types.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Same value different types" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature +- outcome: Executable scenario: Same value different types + +```gwt +Given the reservation module is imported from platform-core +And a reservation for email "alice" +When I call reserve({ type: 'username', value: 'alice', ttl: 300000 }) +Then reservation succeeds +And two reservations exist with different keys: +``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-005-independent-type-uniqueness.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-005-independent-type-uniqueness.sdp.md index 9cc2e403..ef8c582f 100644 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-005-independent-type-uniqueness.sdp.md +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-005-independent-type-uniqueness.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Independent type uniqueness" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature +- outcome: Executable scenario: Independent type uniqueness + +```gwt +Given the reservation module is imported from platform-core +And a confirmed reservation for email "taken@example.com" +When I call reserve({ type: 'recovery_email', value: 'taken@example.com', ttl: 300000 }) +Then reservation succeeds +And key is "recovery_email:taken@example.com" +``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-006-type-is-required.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-006-type-is-required.sdp.md index 874c1e98..940359e5 100644 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-006-type-is-required.sdp.md +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-006-type-is-required.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Type is required" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature +- outcome: Executable scenario: Type is required + +```gwt +Given the reservation module is imported from platform-core +When I call reserve({ value: 'test@example.com', ttl: 300000 }) without type +Then an error is thrown with code "TYPE_REQUIRED" +``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-007-value-is-required.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-007-value-is-required.sdp.md index c4cc202f..8bdbe899 100644 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-007-value-is-required.sdp.md +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-007-value-is-required.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Value is required" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature +- outcome: Executable scenario: Value is required + +```gwt +Given the reservation module is imported from platform-core +When I call reserve({ type: 'email', ttl: 300000 }) without value +Then an error is thrown with code "VALUE_REQUIRED" +``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-008-empty-type-is-invalid.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-008-empty-type-is-invalid.sdp.md index 33996eac..2e3e49f9 100644 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-008-empty-type-is-invalid.sdp.md +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-008-empty-type-is-invalid.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Empty type is invalid" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature +- outcome: Executable scenario: Empty type is invalid + +```gwt +Given the reservation module is imported from platform-core +When I call reserve({ type: '', value: 'test@example.com', ttl: 300000 }) +Then an error is thrown with code "INVALID_TYPE" +``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-009-empty-value-is-invalid.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-009-empty-value-is-invalid.sdp.md index 6e18ec1a..26baa6e4 100644 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-009-empty-value-is-invalid.sdp.md +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-009-empty-value-is-invalid.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Empty value is invalid" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature +- outcome: Executable scenario: Empty value is invalid + +```gwt +Given the reservation module is imported from platform-core +When I call reserve({ type: 'email', value: '', ttl: 300000 }) +Then an error is thrown with code "INVALID_VALUE" +``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-010-find-reservation-by-key.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-010-find-reservation-by-key.sdp.md index 36cc9997..5fa880fe 100644 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-010-find-reservation-by-key.sdp.md +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-010-find-reservation-by-key.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Find reservation by key" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature +- outcome: Executable scenario: Find reservation by key + +```gwt +Given the reservation module is imported from platform-core +And an active reservation for email "lookup@example.com" +When I call findReservation({ key: 'email:lookup@example.com' }) +Then I receive the reservation object +``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-011-find-reservation-by-type-and-value.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-011-find-reservation-by-type-and-value.sdp.md index 5ecc94e4..a3f0007c 100644 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-011-find-reservation-by-type-and-value.sdp.md +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-011-find-reservation-by-type-and-value.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Find reservation by type and value" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature +- outcome: Executable scenario: Find reservation by type and value + +```gwt +Given the reservation module is imported from platform-core +And an active reservation for email "lookup@example.com" +When I call findReservation({ type: 'email', value: 'lookup@example.com' }) +Then I receive the reservation object +``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-012-non-existent-key-returns-null.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-012-non-existent-key-returns-null.sdp.md index 7c90cf44..d76dba74 100644 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-012-non-existent-key-returns-null.sdp.md +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-012-non-existent-key-returns-null.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Non-existent key returns null" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature +- outcome: Executable scenario: Non-existent key returns null + +```gwt +Given the reservation module is imported from platform-core +When I call findReservation({ key: 'email:nonexistent@example.com' }) +Then I receive null +``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-013-type-containing-colon-is-rejected.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-013-type-containing-colon-is-rejected.sdp.md index a09f1e2b..319e2931 100644 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-013-type-containing-colon-is-rejected.sdp.md +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-013-type-containing-colon-is-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Type containing colon is rejected" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature +- outcome: Executable scenario: Type containing colon is rejected + +```gwt +Given the reservation module is imported from platform-core +When I call reserve({ type: 'email:backup', value: 'test@example.com', ttl: 300000 }) +Then an error is thrown with code "INVALID_TYPE" +``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-014-value-can-contain-colon-url-with-port.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-014-value-can-contain-colon-url-with-port.sdp.md index 667ab07f..858b4317 100644 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-014-value-can-contain-colon-url-with-port.sdp.md +++ b/specs/behavior/platform-core/reservation/reservation-key.examples/s-014-value-can-contain-colon-url-with-port.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Value can contain colon (URL with port)" from packages/platform-core/tests/features/behavior/reservation/reservation-key.feature +- outcome: Executable scenario: Value can contain colon (URL with port) + +```gwt +Given the reservation module is imported from platform-core +When I call reserve({ type: 'url', value: 'https://example.com:8080', ttl: 300000 }) +Then I receive a reservation object +And reservation.key equals "url:https://example.com:8080" +``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.sdp.md index 73faed99..b9e5f552 100644 --- a/specs/behavior/platform-core/reservation/reservation-key.sdp.md +++ b/specs/behavior/platform-core/reservation/reservation-key.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: reservation keys to be type-scoped so that different uniqueness constraints don't conflict (test carrier: packages/platform-core/tests/features/behavior/reservation/reservation-key.feature) +- actor: a platform developer +- outcome: reservation keys to be type-scoped so that different uniqueness constraints don't conflict + +## Behavior + +- rule: Reservation key combines type and value +- rule: Different types are independent namespaces +- rule: Type and value must be valid strings +- rule: Reservations can be looked up by key +- rule: Separator character is handled correctly diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-001-reserve-an-email-address.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-001-reserve-an-email-address.sdp.md index 1f023fb6..b5e40451 100644 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-001-reserve-an-email-address.sdp.md +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-001-reserve-an-email-address.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Reserve an email address" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature +- outcome: Executable scenario: Reserve an email address + +```gwt +Given the reservation module is imported from platform-core +And the reservation table exists +And no existing reservation for "alice@example.com" +When I call reserve({ type: 'email', value: 'alice@example.com', ttl: 300000 }) +Then I receive a reservation object +And reservation.key equals "email:alice@example.com" +And reservation.status equals "reserved" +And reservation.expiresAt is 5 minutes from now +``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-002-reserve-with-correlation-id.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-002-reserve-with-correlation-id.sdp.md index 698644d6..9f0de579 100644 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-002-reserve-with-correlation-id.sdp.md +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-002-reserve-with-correlation-id.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Reserve with correlation ID" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature +- outcome: Executable scenario: Reserve with correlation ID + +```gwt +Given the reservation module is imported from platform-core +And the reservation table exists +And no existing reservation for "bob@example.com" +And correlationId "corr_123" +When I call reserve({ type: 'email', value: 'bob@example.com', ttl: 300000, correlationId }) +Then reservation.correlationId equals "corr_123" +``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-003-first-reservation-wins.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-003-first-reservation-wins.sdp.md index 40443366..62f5e98d 100644 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-003-first-reservation-wins.sdp.md +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-003-first-reservation-wins.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "First reservation wins" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature +- outcome: Executable scenario: First reservation wins + +```gwt +Given the reservation module is imported from platform-core +And the reservation table exists +And no existing reservation for "unique@example.com" +When reservation A is created for "unique@example.com" and reservation B is attempted concurrently for "unique@example.com" +Then reservation A succeeds +And reservation B fails with "ALREADY_RESERVED" +``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-004-reserved-value-cannot-be-re-reserved.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-004-reserved-value-cannot-be-re-reserved.sdp.md index d7d99383..e5f43c7f 100644 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-004-reserved-value-cannot-be-re-reserved.sdp.md +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-004-reserved-value-cannot-be-re-reserved.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Reserved value cannot be re-reserved" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature +- outcome: Executable scenario: Reserved value cannot be re-reserved + +```gwt +Given the reservation module is imported from platform-core +And the reservation table exists +And an active reservation for "taken@example.com" +When I call reserve({ type: 'email', value: 'taken@example.com', ttl: 300000 }) +Then an error is thrown with code "ALREADY_RESERVED" +And error.existingReservationId is provided +``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-005-different-ttl-values.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-005-different-ttl-values.sdp.md index 9fbb4a8e..e0dc4838 100644 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-005-different-ttl-values.sdp.md +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-005-different-ttl-values.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Different TTL values" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature +- outcome: Executable scenario: Different TTL values + +```gwt +Given the reservation module is imported from platform-core +And the reservation table exists +And no existing reservation +When I call reserve with ttl value +Then expiresAt is value from now +``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-006-ttl-must-be-positive.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-006-ttl-must-be-positive.sdp.md index 4f383814..c8de2839 100644 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-006-ttl-must-be-positive.sdp.md +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-006-ttl-must-be-positive.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "TTL must be positive" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature +- outcome: Executable scenario: TTL must be positive + +```gwt +Given the reservation module is imported from platform-core +And the reservation table exists +When I call reserve({ type: 'email', value: 'test@example.com', ttl: 0 }) +Then an error is thrown with code "INVALID_TTL" +``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-007-ttl-has-maximum-limit.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-007-ttl-has-maximum-limit.sdp.md index 59313c38..de81a2b4 100644 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-007-ttl-has-maximum-limit.sdp.md +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-007-ttl-has-maximum-limit.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "TTL has maximum limit" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature +- outcome: Executable scenario: TTL has maximum limit + +```gwt +Given the reservation module is imported from platform-core +And the reservation table exists +When I call reserve({ type: 'email', value: 'test@example.com', ttl: 86400001 }) +Then an error is thrown with code "TTL_TOO_LONG" +And error message mentions maximum of 24 hours +``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-008-negative-ttl-is-rejected.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-008-negative-ttl-is-rejected.sdp.md index a9ebc60a..dec5694f 100644 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-008-negative-ttl-is-rejected.sdp.md +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-008-negative-ttl-is-rejected.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Negative TTL is rejected" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature +- outcome: Executable scenario: Negative TTL is rejected + +```gwt +Given the reservation module is imported from platform-core +And the reservation table exists +When I call reserve({ type: 'email', value: 'negative@example.com', ttl: -1 }) +Then an error is thrown with code "INVALID_TTL" +``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-009-ttl-at-minimum-boundary-succeeds.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-009-ttl-at-minimum-boundary-succeeds.sdp.md index 8677eb61..0dd88a50 100644 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-009-ttl-at-minimum-boundary-succeeds.sdp.md +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-009-ttl-at-minimum-boundary-succeeds.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "TTL at minimum boundary succeeds" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature +- outcome: Executable scenario: TTL at minimum boundary succeeds + +```gwt +Given the reservation module is imported from platform-core +And the reservation table exists +When I call reserve({ type: 'email', value: 'minttl@example.com', ttl: 1000 }) +Then I receive a reservation object +``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-010-ttl-just-below-minimum-is-rejected.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-010-ttl-just-below-minimum-is-rejected.sdp.md index fee001b9..f04f3c49 100644 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-010-ttl-just-below-minimum-is-rejected.sdp.md +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-010-ttl-just-below-minimum-is-rejected.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "TTL just below minimum is rejected" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature +- outcome: Executable scenario: TTL just below minimum is rejected + +```gwt +Given the reservation module is imported from platform-core +And the reservation table exists +When I call reserve({ type: 'email', value: 'belowmin@example.com', ttl: 999 }) +Then an error is thrown with code "INVALID_TTL" +``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-011-na-n-ttl-is-rejected.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-011-na-n-ttl-is-rejected.sdp.md index 75579ab1..19b3fd5e 100644 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-011-na-n-ttl-is-rejected.sdp.md +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-011-na-n-ttl-is-rejected.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "NaN TTL is rejected" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature +- outcome: Executable scenario: NaN TTL is rejected + +```gwt +Given the reservation module is imported from platform-core +And the reservation table exists +When I call reserve with NaN TTL +Then an error is thrown with code "INVALID_TTL" +``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-012-infinity-ttl-is-rejected.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-012-infinity-ttl-is-rejected.sdp.md index c9c1b487..d6f87415 100644 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-012-infinity-ttl-is-rejected.sdp.md +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-012-infinity-ttl-is-rejected.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Infinity TTL is rejected" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature +- outcome: Executable scenario: Infinity TTL is rejected + +```gwt +Given the reservation module is imported from platform-core +And the reservation table exists +When I call reserve with Infinity TTL +Then an error is thrown with code "INVALID_TTL" +``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-013-whitespace-only-type-is-invalid.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-013-whitespace-only-type-is-invalid.sdp.md index 94107795..b0dde0c7 100644 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-013-whitespace-only-type-is-invalid.sdp.md +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-013-whitespace-only-type-is-invalid.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Whitespace-only type is invalid" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature +- outcome: Executable scenario: Whitespace-only type is invalid + +```gwt +Given the reservation module is imported from platform-core +And the reservation table exists +When I call reserve({ type: ' ', value: 'test@example.com', ttl: 300000 }) +Then an error is thrown with code "INVALID_TYPE" +``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-014-whitespace-only-value-is-invalid.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-014-whitespace-only-value-is-invalid.sdp.md index 059c0b6b..7708bc48 100644 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-014-whitespace-only-value-is-invalid.sdp.md +++ b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-014-whitespace-only-value-is-invalid.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Whitespace-only value is invalid" from packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature +- outcome: Executable scenario: Whitespace-only value is invalid + +```gwt +Given the reservation module is imported from platform-core +And the reservation table exists +When I call reserve({ type: 'email', value: ' ', ttl: 300000 }) +Then an error is thrown with code "INVALID_VALUE" +``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.sdp.md index 4b8b48e9..20ba3512 100644 --- a/specs/behavior/platform-core/reservation/reserve-operation.sdp.md +++ b/specs/behavior/platform-core/reservation/reserve-operation.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: to reserve unique values with TTL so that I can enforce uniqueness before entity creation (test carrier: packages/platform-core/tests/features/behavior/reservation/reserve-operation.feature) +- actor: a platform developer +- outcome: to reserve unique values with TTL so that I can enforce uniqueness before entity creation + +## Behavior + +- rule: reserve() creates a time-limited claim on a unique value +- rule: Concurrent reservations use OCC for atomicity +- rule: TTL determines reservation expiration time +- rule: TTL boundary values are validated +- rule: Type and value input is sanitized diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-001-complete-metadata-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-001-complete-metadata-is-accepted.sdp.md index c13f8a37..a8cce721 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-001-complete-metadata-is-accepted.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-001-complete-metadata-is-accepted.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Complete metadata is accepted" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Complete metadata is accepted + +```gwt +Given a metadata object with commandId "cmd_123", commandType "TestCommand", correlationId "corr_456", and a valid timestamp +When the metadata is validated against CommandMetadataSchema +Then the validation succeeds +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-002-metadata-with-optional-user-id-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-002-metadata-with-optional-user-id-is-accepted.sdp.md index 3a2f5b34..9d318673 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-002-metadata-with-optional-user-id-is-accepted.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-002-metadata-with-optional-user-id-is-accepted.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Metadata with optional userId is accepted" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Metadata with optional userId is accepted + +```gwt +Given a metadata object with commandId "cmd_123", commandType "TestCommand", correlationId "corr_456", userId "user_789", and a valid timestamp +When the metadata is validated against CommandMetadataSchema +Then the validation succeeds +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-003-metadata-with-invalid-timestamps-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-003-metadata-with-invalid-timestamps-is-rejected.sdp.md index 567f5d59..7ec6da5e 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-003-metadata-with-invalid-timestamps-is-rejected.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-003-metadata-with-invalid-timestamps-is-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Metadata with invalid timestamps is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Metadata with invalid timestamps is rejected + +```gwt +Given metadata objects with the following timestamps: +When each metadata object is validated against CommandMetadataSchema +Then each validation fails +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-004-metadata-missing-required-fields-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-004-metadata-missing-required-fields-is-rejected.sdp.md index 2c0dc316..0165222c 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-004-metadata-missing-required-fields-is-rejected.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-004-metadata-missing-required-fields-is-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Metadata missing required fields is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Metadata missing required fields is rejected + +```gwt +Given a metadata object with only commandId "cmd_123" +When the metadata is validated against CommandMetadataSchema +Then the validation fails +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-005-complete-command-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-005-complete-command-is-accepted.sdp.md index 0a272c29..efa1d6c6 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-005-complete-command-is-accepted.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-005-complete-command-is-accepted.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Complete command is accepted" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Complete command is accepted + +```gwt +Given a TestCommand schema created with createCommandSchema and payload field "foo:string" +When a valid command is parsed with commandType "TestCommand" and payload foo "bar" +Then the validation succeeds +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-006-command-with-optional-payload-fields-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-006-command-with-optional-payload-fields-is-accepted.sdp.md index b707e5ce..39bce2e6 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-006-command-with-optional-payload-fields-is-accepted.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-006-command-with-optional-payload-fields-is-accepted.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Command with optional payload fields is accepted" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Command with optional payload fields is accepted + +```gwt +Given a TestCommand schema created with createCommandSchema and payload field "foo:string" +When a valid command is parsed with commandType "TestCommand" and payload foo "bar" and bar 42 +Then the validation succeeds +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-007-command-with-wrong-command-type-literal-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-007-command-with-wrong-command-type-literal-is-rejected.sdp.md index 97550651..256efee8 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-007-command-with-wrong-command-type-literal-is-rejected.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-007-command-with-wrong-command-type-literal-is-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Command with wrong commandType literal is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Command with wrong commandType literal is rejected + +```gwt +Given a TestCommand schema created with createCommandSchema and payload field "foo:string" +When a command is parsed with commandType "WrongType" and payload foo "bar" +Then the validation fails +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-008-command-with-invalid-payload-type-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-008-command-with-invalid-payload-type-is-rejected.sdp.md index 0fec028b..40cc39a5 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-008-command-with-invalid-payload-type-is-rejected.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-008-command-with-invalid-payload-type-is-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Command with invalid payload type is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Command with invalid payload type is rejected + +```gwt +Given a TestCommand schema created with createCommandSchema and payload field "foo:string" +When a command is parsed with payload foo as number 123 +Then the validation fails +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-009-command-with-missing-required-payload-field-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-009-command-with-missing-required-payload-field-is-rejected.sdp.md index 0c493ad4..74972bfe 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-009-command-with-missing-required-payload-field-is-rejected.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-009-command-with-missing-required-payload-field-is-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Command with missing required payload field is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Command with missing required payload field is rejected + +```gwt +Given a TestCommand schema created with createCommandSchema and payload field "foo:string" +When a command is parsed with an empty payload object +Then the validation fails +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-010-command-missing-target-context-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-010-command-missing-target-context-is-rejected.sdp.md index 290f5e69..aa3ca6bd 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-010-command-missing-target-context-is-rejected.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-010-command-missing-target-context-is-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Command missing targetContext is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Command missing targetContext is rejected + +```gwt +Given a TestCommand schema created with createCommandSchema and payload field "foo:string" +When a command is parsed without targetContext +Then the validation fails +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-011-schema-provides-type-inference-for-command-type-literal.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-011-schema-provides-type-inference-for-command-type-literal.sdp.md index 819f7ab7..2d5007e6 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-011-schema-provides-type-inference-for-command-type-literal.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-011-schema-provides-type-inference-for-command-type-literal.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Schema provides type inference for commandType literal" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Schema provides type inference for commandType literal + +```gwt +Given a TestCommand schema created with createCommandSchema and payload field "foo:string" +When a valid command is parsed with commandType "TestCommand" and payload foo "bar" +Then the parsed commandType equals "TestCommand" +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-012-success-with-version-and-data-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-012-success-with-version-and-data-is-accepted.sdp.md index db97d663..d9e89195 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-012-success-with-version-and-data-is-accepted.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-012-success-with-version-and-data-is-accepted.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Success with version and data is accepted" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Success with version and data is accepted + +```gwt +Given a success result with version 1 and data id "123" +When the result is validated against CommandSuccessResultSchema +Then the validation succeeds +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-013-success-with-undefined-data-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-013-success-with-undefined-data-is-accepted.sdp.md index 47305a0c..65b62494 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-013-success-with-undefined-data-is-accepted.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-013-success-with-undefined-data-is-accepted.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Success with undefined data is accepted" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Success with undefined data is accepted + +```gwt +Given a success result with version 5 and undefined data +When the result is validated against CommandSuccessResultSchema +Then the validation succeeds +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-014-success-without-version-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-014-success-without-version-is-rejected.sdp.md index 641aaa9b..a405a48e 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-014-success-without-version-is-rejected.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-014-success-without-version-is-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Success without version is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Success without version is rejected + +```gwt +Given a success result without version and data id "123" +When the result is validated against CommandSuccessResultSchema +Then the validation fails +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-015-rejected-with-code-and-reason-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-015-rejected-with-code-and-reason-is-accepted.sdp.md index 95f766b1..3ea00468 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-015-rejected-with-code-and-reason-is-accepted.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-015-rejected-with-code-and-reason-is-accepted.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejected with code and reason is accepted" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Rejected with code and reason is accepted + +```gwt +Given a rejected result with code "VALIDATION_ERROR" and reason "Invalid input data" +When the result is validated against CommandRejectedResultSchema +Then the validation succeeds +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-016-rejected-with-optional-context-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-016-rejected-with-optional-context-is-accepted.sdp.md index c6090b38..a8516c34 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-016-rejected-with-optional-context-is-accepted.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-016-rejected-with-optional-context-is-accepted.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejected with optional context is accepted" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Rejected with optional context is accepted + +```gwt +Given a rejected result with code "BUSINESS_RULE_VIOLATION", reason "Cannot cancel completed order", and context +When the result is validated against CommandRejectedResultSchema +Then the validation succeeds +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-017-rejected-without-reason-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-017-rejected-without-reason-is-rejected.sdp.md index 8418454e..37009049 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-017-rejected-without-reason-is-rejected.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-017-rejected-without-reason-is-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Rejected without reason is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Rejected without reason is rejected + +```gwt +Given a rejected result with code "VALIDATION_ERROR" and no reason +When the result is validated against CommandRejectedResultSchema +Then the validation fails +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-018-conflict-with-concurrent-modification-code-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-018-conflict-with-concurrent-modification-code-is-accepted.sdp.md index 3c473eb0..085b0716 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-018-conflict-with-concurrent-modification-code-is-accepted.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-018-conflict-with-concurrent-modification-code-is-accepted.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Conflict with CONCURRENT_MODIFICATION code is accepted" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Conflict with CONCURRENT_MODIFICATION code is accepted + +```gwt +Given a conflict result with code "CONCURRENT_MODIFICATION" and currentVersion 5 +When the result is validated against CommandConflictResultSchema +Then the validation succeeds +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-019-conflict-with-wrong-code-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-019-conflict-with-wrong-code-is-rejected.sdp.md index d9b820e5..22fc88ac 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-019-conflict-with-wrong-code-is-rejected.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-019-conflict-with-wrong-code-is-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Conflict with wrong code is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Conflict with wrong code is rejected + +```gwt +Given a conflict result with code "OTHER_CODE" and currentVersion 5 +When the result is validated against CommandConflictResultSchema +Then the validation fails +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-020-conflict-without-current-version-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-020-conflict-without-current-version-is-rejected.sdp.md index 97e0247c..87db0d12 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-020-conflict-without-current-version-is-rejected.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-020-conflict-without-current-version-is-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Conflict without currentVersion is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Conflict without currentVersion is rejected + +```gwt +Given a conflict result with code "CONCURRENT_MODIFICATION" and no currentVersion +When the result is validated against CommandConflictResultSchema +Then the validation fails +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-021-error-with-message-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-021-error-with-message-is-accepted.sdp.md index 70507b25..0286dea7 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-021-error-with-message-is-accepted.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-021-error-with-message-is-accepted.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Error with message is accepted" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Error with message is accepted + +```gwt +Given an error result with message "Unexpected database error" +When the result is validated against CommandErrorResultSchema +Then the validation succeeds +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-022-error-without-message-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-022-error-without-message-is-rejected.sdp.md index 632147bb..11ce8b49 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-022-error-without-message-is-rejected.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-022-error-without-message-is-rejected.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Error without message is rejected" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Error without message is rejected + +```gwt +Given an error result with no message +When the result is validated against CommandErrorResultSchema +Then the validation fails +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-023-union-discriminates-success-and-preserves-version.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-023-union-discriminates-success-and-preserves-version.sdp.md index c9ad7e43..5436991c 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-023-union-discriminates-success-and-preserves-version.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-023-union-discriminates-success-and-preserves-version.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Union discriminates success and preserves version" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Union discriminates success and preserves version + +```gwt +Given a result with status "success", version 1, and data null +When the result is validated against CommandResultSchema +Then the validation succeeds +And the parsed result has status "success" and version 1 +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-024-union-discriminates-rejected-and-preserves-code-and-reason.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-024-union-discriminates-rejected-and-preserves-code-and-reason.sdp.md index e8fe2335..92e62c69 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-024-union-discriminates-rejected-and-preserves-code-and-reason.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-024-union-discriminates-rejected-and-preserves-code-and-reason.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Union discriminates rejected and preserves code and reason" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Union discriminates rejected and preserves code and reason + +```gwt +Given a result with status "rejected", code "ERROR", and reason "Something went wrong" +When the result is validated against CommandResultSchema +Then the validation succeeds +And the parsed result has status "rejected", code "ERROR", and reason "Something went wrong" +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-025-union-discriminates-conflict-and-preserves-current-version.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-025-union-discriminates-conflict-and-preserves-current-version.sdp.md index c6a52007..ee3640dc 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-025-union-discriminates-conflict-and-preserves-current-version.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-025-union-discriminates-conflict-and-preserves-current-version.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Union discriminates conflict and preserves currentVersion" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Union discriminates conflict and preserves currentVersion + +```gwt +Given a result with status "conflict", code "CONCURRENT_MODIFICATION", and currentVersion 10 +When the result is validated against CommandResultSchema +Then the validation succeeds +And the parsed result has status "conflict" and currentVersion 10 +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-026-union-discriminates-error-and-preserves-message.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-026-union-discriminates-error-and-preserves-message.sdp.md index 05b9a73b..9fd2ec0f 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-026-union-discriminates-error-and-preserves-message.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-026-union-discriminates-error-and-preserves-message.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Union discriminates error and preserves message" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Union discriminates error and preserves message + +```gwt +Given a result with status "error" and message "Internal error" +When the result is validated against CommandResultSchema +Then the validation succeeds +And the parsed result has status "error" and message "Internal error" +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-027-union-rejects-unknown-status.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-027-union-rejects-unknown-status.sdp.md index 2f6fb07b..2dd404d8 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-027-union-rejects-unknown-status.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.examples/s-027-union-rejects-unknown-status.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Union rejects unknown status" from packages/platform-core/tests/features/behavior/schemas/command-schemas.feature +- outcome: Executable scenario: Union rejects unknown status + +```gwt +Given a result with status "unknown" and data object +When the result is validated against CommandResultSchema +Then the validation fails +``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.sdp.md index 38ed5fdb..c377fcd1 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Zod schemas for command metadata, command factory, and command result discriminated unions used throughout the platform. (test carrier: packages/platform-core/tests/features/behavior/schemas/command-schemas.feature) +- outcome: Command Schemas + +## Behavior + +- rule: CommandMetadataSchema validates required fields and timestamp constraints +- rule: createCommandSchema produces schemas that enforce commandType literal and payload shape +- rule: CommandSuccessResultSchema validates success results with version and optional data +- rule: CommandRejectedResultSchema validates rejected results with code and reason +- rule: CommandConflictResultSchema validates conflict results with CONCURRENT_MODIFICATION code +- rule: CommandErrorResultSchema validates error results requiring a message +- rule: CommandResultSchema discriminated union correctly routes by status field diff --git a/specs/behavior/platform-core/testing/guards.examples/s-001-allow-execution-when-convex-test-mode-is-true.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-001-allow-execution-when-convex-test-mode-is-true.sdp.md index 8aba6ff5..c4e9e5b7 100644 --- a/specs/behavior/platform-core/testing/guards.examples/s-001-allow-execution-when-convex-test-mode-is-true.sdp.md +++ b/specs/behavior/platform-core/testing/guards.examples/s-001-allow-execution-when-convex-test-mode-is-true.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Allow execution when __CONVEX_TEST_MODE__ is true" from packages/platform-core/tests/features/behavior/testing/guards.feature +- outcome: Executable scenario: Allow execution when __CONVEX_TEST_MODE__ is true + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And globalThis.__CONVEX_TEST_MODE__ is true +When I call ensureTestEnvironment() +Then no error is thrown +``` diff --git a/specs/behavior/platform-core/testing/guards.examples/s-002-allow-execution-when-is-test-env-is-set.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-002-allow-execution-when-is-test-env-is-set.sdp.md index 04d6d1f7..5a145bac 100644 --- a/specs/behavior/platform-core/testing/guards.examples/s-002-allow-execution-when-is-test-env-is-set.sdp.md +++ b/specs/behavior/platform-core/testing/guards.examples/s-002-allow-execution-when-is-test-env-is-set.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Allow execution when IS_TEST env is set" from packages/platform-core/tests/features/behavior/testing/guards.feature +- outcome: Executable scenario: Allow execution when IS_TEST env is set + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And process.env.IS_TEST is "true" +When I call ensureTestEnvironment() +Then no error is thrown +``` diff --git a/specs/behavior/platform-core/testing/guards.examples/s-003-allow-execution-on-self-hosted-runtime-without-explicit-test-signal.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-003-allow-execution-on-self-hosted-runtime-without-explicit-test-signal.sdp.md index 5b2fc95d..8976723c 100644 --- a/specs/behavior/platform-core/testing/guards.examples/s-003-allow-execution-on-self-hosted-runtime-without-explicit-test-signal.sdp.md +++ b/specs/behavior/platform-core/testing/guards.examples/s-003-allow-execution-on-self-hosted-runtime-without-explicit-test-signal.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Allow execution on self-hosted runtime without explicit test signal" from packages/platform-core/tests/features/behavior/testing/guards.feature +- outcome: Executable scenario: Allow execution on self-hosted runtime without explicit test signal + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And process.env exists +And CONVEX_CLOUD_URL is not set +And IS_TEST is not set +And __CONVEX_TEST_MODE__ is not true +When I call ensureTestEnvironment() +Then no error is thrown +``` diff --git a/specs/behavior/platform-core/testing/guards.examples/s-004-block-execution-in-cloud-production.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-004-block-execution-in-cloud-production.sdp.md index 6119dc4f..462794a4 100644 --- a/specs/behavior/platform-core/testing/guards.examples/s-004-block-execution-in-cloud-production.sdp.md +++ b/specs/behavior/platform-core/testing/guards.examples/s-004-block-execution-in-cloud-production.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Block execution in cloud production" from packages/platform-core/tests/features/behavior/testing/guards.feature +- outcome: Executable scenario: Block execution in cloud production + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And process.env.CONVEX_CLOUD_URL is set +And IS_TEST is not set +And __CONVEX_TEST_MODE__ is not true +When I call ensureTestEnvironment() +Then an error is thrown with message containing "SECURITY" +And the error message contains "Test-only function" +``` diff --git a/specs/behavior/platform-core/testing/guards.examples/s-005-is-test-environment-returns-true-in-test-mode.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-005-is-test-environment-returns-true-in-test-mode.sdp.md index abb89aa6..69c06985 100644 --- a/specs/behavior/platform-core/testing/guards.examples/s-005-is-test-environment-returns-true-in-test-mode.sdp.md +++ b/specs/behavior/platform-core/testing/guards.examples/s-005-is-test-environment-returns-true-in-test-mode.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "isTestEnvironment returns true in test mode" from packages/platform-core/tests/features/behavior/testing/guards.feature +- outcome: Executable scenario: isTestEnvironment returns true in test mode + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And globalThis.__CONVEX_TEST_MODE__ is true +When I call isTestEnvironment() +Then I receive true +``` diff --git a/specs/behavior/platform-core/testing/guards.examples/s-006-is-test-environment-returns-true-with-is-test-env.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-006-is-test-environment-returns-true-with-is-test-env.sdp.md index 2ddfa42d..6e95dd0f 100644 --- a/specs/behavior/platform-core/testing/guards.examples/s-006-is-test-environment-returns-true-with-is-test-env.sdp.md +++ b/specs/behavior/platform-core/testing/guards.examples/s-006-is-test-environment-returns-true-with-is-test-env.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "isTestEnvironment returns true with IS_TEST env" from packages/platform-core/tests/features/behavior/testing/guards.feature +- outcome: Executable scenario: isTestEnvironment returns true with IS_TEST env + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And process.env.IS_TEST is "true" +When I call isTestEnvironment() +Then I receive true +``` diff --git a/specs/behavior/platform-core/testing/guards.examples/s-007-is-test-environment-returns-false-in-production.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-007-is-test-environment-returns-false-in-production.sdp.md index 256eef7a..84bd1cf7 100644 --- a/specs/behavior/platform-core/testing/guards.examples/s-007-is-test-environment-returns-false-in-production.sdp.md +++ b/specs/behavior/platform-core/testing/guards.examples/s-007-is-test-environment-returns-false-in-production.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "isTestEnvironment returns false in production" from packages/platform-core/tests/features/behavior/testing/guards.feature +- outcome: Executable scenario: isTestEnvironment returns false in production + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And process.env.CONVEX_CLOUD_URL is set +And IS_TEST is not set +When I call isTestEnvironment() +Then I receive false +``` diff --git a/specs/behavior/platform-core/testing/guards.examples/s-008-is-test-environment-is-a-safe-boolean-check.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-008-is-test-environment-is-a-safe-boolean-check.sdp.md index c511282d..a7cc35c6 100644 --- a/specs/behavior/platform-core/testing/guards.examples/s-008-is-test-environment-is-a-safe-boolean-check.sdp.md +++ b/specs/behavior/platform-core/testing/guards.examples/s-008-is-test-environment-is-a-safe-boolean-check.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "isTestEnvironment is a safe boolean check" from packages/platform-core/tests/features/behavior/testing/guards.feature +- outcome: Executable scenario: isTestEnvironment is a safe boolean check + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +When I call isTestEnvironment() +Then I receive a boolean value +And no error is ever thrown from this function +``` diff --git a/specs/behavior/platform-core/testing/guards.sdp.md b/specs/behavior/platform-core/testing/guards.sdp.md index 79689121..21527666 100644 --- a/specs/behavior/platform-core/testing/guards.sdp.md +++ b/specs/behavior/platform-core/testing/guards.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: environment guards for test-only functions so that test utilities cannot be called in production (test carrier: packages/platform-core/tests/features/behavior/testing/guards.feature) +- actor: a platform developer +- outcome: environment guards for test-only functions so that test utilities cannot be called in production diff --git a/specs/behavior/platform-core/testing/integration-isolation.examples/s-001-fresh-state-after-docker-restart.sdp.md b/specs/behavior/platform-core/testing/integration-isolation.examples/s-001-fresh-state-after-docker-restart.sdp.md index fcc21878..0d67a081 100644 --- a/specs/behavior/platform-core/testing/integration-isolation.examples/s-001-fresh-state-after-docker-restart.sdp.md +++ b/specs/behavior/platform-core/testing/integration-isolation.examples/s-001-fresh-state-after-docker-restart.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Fresh state after Docker restart" from packages/platform-core/tests/features/behavior/testing/integration-isolation.feature +- outcome: Executable scenario: Fresh state after Docker restart + +```gwt +Given the integration test environment is configured +And Docker backend is available on port 3210 +And a previous test created entity "order-123" +When Docker is restarted via "just restart" +Then querying for "order-123" should return nothing +And Workpool state should be empty +And scheduled functions should be cleared +``` diff --git a/specs/behavior/platform-core/testing/integration-isolation.examples/s-002-detect-state-pollution-without-restart.sdp.md b/specs/behavior/platform-core/testing/integration-isolation.examples/s-002-detect-state-pollution-without-restart.sdp.md index b2f7c414..c06733c5 100644 --- a/specs/behavior/platform-core/testing/integration-isolation.examples/s-002-detect-state-pollution-without-restart.sdp.md +++ b/specs/behavior/platform-core/testing/integration-isolation.examples/s-002-detect-state-pollution-without-restart.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Detect state pollution without restart" from packages/platform-core/tests/features/behavior/testing/integration-isolation.feature +- outcome: Executable scenario: Detect state pollution without restart + +```gwt +Given the integration test environment is configured +And Docker backend is available on port 3210 +And a test created entity with id "polluted-entity" +And Docker was NOT restarted +When a new test queries the database +Then "polluted-entity" may still exist +And this indicates potential state pollution +``` diff --git a/specs/behavior/platform-core/testing/integration-isolation.examples/s-003-unique-namespace-per-test.sdp.md b/specs/behavior/platform-core/testing/integration-isolation.examples/s-003-unique-namespace-per-test.sdp.md index 7b64cb0b..3988cb3f 100644 --- a/specs/behavior/platform-core/testing/integration-isolation.examples/s-003-unique-namespace-per-test.sdp.md +++ b/specs/behavior/platform-core/testing/integration-isolation.examples/s-003-unique-namespace-per-test.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "Unique namespace per test" from packages/platform-core/tests/features/behavior/testing/integration-isolation.feature +- outcome: Executable scenario: Unique namespace per test + +```gwt +Given the integration test environment is configured +And Docker backend is available on port 3210 +And test "test-1" with namespace "ns_abc123" +And test "test-2" with namespace "ns_def456" +When both tests create entity with logical id "order-1" +Then test-1 creates "ns_abc123_order-1" +And test-2 creates "ns_def456_order-1" +And no collision occurs +``` diff --git a/specs/behavior/platform-core/testing/integration-isolation.examples/s-004-namespace-applied-to-correlation-i-ds.sdp.md b/specs/behavior/platform-core/testing/integration-isolation.examples/s-004-namespace-applied-to-correlation-i-ds.sdp.md index 14485a2e..e5fe1c0b 100644 --- a/specs/behavior/platform-core/testing/integration-isolation.examples/s-004-namespace-applied-to-correlation-i-ds.sdp.md +++ b/specs/behavior/platform-core/testing/integration-isolation.examples/s-004-namespace-applied-to-correlation-i-ds.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Namespace applied to correlation IDs" from packages/platform-core/tests/features/behavior/testing/integration-isolation.feature +- outcome: Executable scenario: Namespace applied to correlation IDs + +```gwt +Given the integration test environment is configured +And Docker backend is available on port 3210 +And a test with namespace "ns_test" +When executing a command +Then correlationId should include namespace prefix +And events can be traced to the specific test +``` diff --git a/specs/behavior/platform-core/testing/integration-isolation.examples/s-005-workpool-jobs-from-previous-test-don-t-interfere.sdp.md b/specs/behavior/platform-core/testing/integration-isolation.examples/s-005-workpool-jobs-from-previous-test-don-t-interfere.sdp.md index f0d3744d..039e4eb8 100644 --- a/specs/behavior/platform-core/testing/integration-isolation.examples/s-005-workpool-jobs-from-previous-test-don-t-interfere.sdp.md +++ b/specs/behavior/platform-core/testing/integration-isolation.examples/s-005-workpool-jobs-from-previous-test-don-t-interfere.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Workpool jobs from previous test don't interfere" from packages/platform-core/tests/features/behavior/testing/integration-isolation.feature +- outcome: Executable scenario: Workpool jobs from previous test don't interfere + +```gwt +Given the integration test environment is configured +And Docker backend is available on port 3210 +And test-1 queued a Workpool job that takes 5 seconds +And test-1 completed without waiting for the job +When test-2 starts immediately +Then test-2 should not see test-1's pending job +And Docker restart is required for complete isolation +``` diff --git a/specs/behavior/platform-core/testing/integration-isolation.examples/s-006-scheduled-functions-use-test-specific-context.sdp.md b/specs/behavior/platform-core/testing/integration-isolation.examples/s-006-scheduled-functions-use-test-specific-context.sdp.md index 5440172a..8937b93d 100644 --- a/specs/behavior/platform-core/testing/integration-isolation.examples/s-006-scheduled-functions-use-test-specific-context.sdp.md +++ b/specs/behavior/platform-core/testing/integration-isolation.examples/s-006-scheduled-functions-use-test-specific-context.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Scheduled functions use test-specific context" from packages/platform-core/tests/features/behavior/testing/integration-isolation.feature +- outcome: Executable scenario: Scheduled functions use test-specific context + +```gwt +Given the integration test environment is configured +And Docker backend is available on port 3210 +And a test schedules a function for 1 minute later +When the test completes +Then the scheduled function should include test namespace +And cleanup can identify test-specific scheduled functions +``` diff --git a/specs/behavior/platform-core/testing/integration-isolation.sdp.md b/specs/behavior/platform-core/testing/integration-isolation.sdp.md index db638d1b..2646282a 100644 --- a/specs/behavior/platform-core/testing/integration-isolation.sdp.md +++ b/specs/behavior/platform-core/testing/integration-isolation.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: integration tests to be properly isolated so that tests don't interfere with each other and produce reliable results (test carrier: packages/platform-core/tests/features/behavior/testing/integration-isolation.feature) +- actor: a platform developer +- outcome: integration tests to be properly isolated so that tests don't interfere with each other and produce reliable results + +## Behavior + +- rule: Docker restart provides clean state between test suites +- rule: Each test uses unique namespace to prevent collisions +- rule: Background jobs are isolated between tests diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-001-package-has-feature-directory-platform-core.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-001-package-has-feature-directory-platform-core.sdp.md index 54a20c0d..a4ad2432 100644 --- a/specs/behavior/platform-core/testing/platform-coverage.examples/s-001-package-has-feature-directory-platform-core.sdp.md +++ b/specs/behavior/platform-core/testing/platform-coverage.examples/s-001-package-has-feature-directory-platform-core.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Package has feature directory - platform-core" from packages/platform-core/tests/features/behavior/testing/platform-coverage.feature +- outcome: Executable scenario: Package has feature directory - platform-core + +```gwt +Given the monorepo contains @libar-dev/platform-* packages +And each package follows the standard directory structure +And package @libar-dev/platform-core +When checking test structure +Then tests/features/ directory should exist +And at least one .feature file should be present +``` diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-002-package-has-feature-directory-platform-decider.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-002-package-has-feature-directory-platform-decider.sdp.md index 9b557a48..e071d71a 100644 --- a/specs/behavior/platform-core/testing/platform-coverage.examples/s-002-package-has-feature-directory-platform-decider.sdp.md +++ b/specs/behavior/platform-core/testing/platform-coverage.examples/s-002-package-has-feature-directory-platform-decider.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Package has feature directory - platform-decider" from packages/platform-core/tests/features/behavior/testing/platform-coverage.feature +- outcome: Executable scenario: Package has feature directory - platform-decider + +```gwt +Given the monorepo contains @libar-dev/platform-* packages +And each package follows the standard directory structure +And package @libar-dev/platform-decider +When checking test structure +Then tests/features/ directory should exist +And at least one .feature file should be present +``` diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-003-package-has-feature-directory-platform-fsm.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-003-package-has-feature-directory-platform-fsm.sdp.md index c0a66f1c..e35de7da 100644 --- a/specs/behavior/platform-core/testing/platform-coverage.examples/s-003-package-has-feature-directory-platform-fsm.sdp.md +++ b/specs/behavior/platform-core/testing/platform-coverage.examples/s-003-package-has-feature-directory-platform-fsm.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Package has feature directory - platform-fsm" from packages/platform-core/tests/features/behavior/testing/platform-coverage.feature +- outcome: Executable scenario: Package has feature directory - platform-fsm + +```gwt +Given the monorepo contains @libar-dev/platform-* packages +And each package follows the standard directory structure +And package @libar-dev/platform-fsm +When checking test structure +Then tests/features/ directory should exist +And at least one .feature file should be present +``` diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-004-package-has-feature-directory-platform-store.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-004-package-has-feature-directory-platform-store.sdp.md index bfeeeab8..adf70b87 100644 --- a/specs/behavior/platform-core/testing/platform-coverage.examples/s-004-package-has-feature-directory-platform-store.sdp.md +++ b/specs/behavior/platform-core/testing/platform-coverage.examples/s-004-package-has-feature-directory-platform-store.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Package has feature directory - platform-store" from packages/platform-core/tests/features/behavior/testing/platform-coverage.feature +- outcome: Executable scenario: Package has feature directory - platform-store + +```gwt +Given the monorepo contains @libar-dev/platform-* packages +And each package follows the standard directory structure +And package @libar-dev/platform-store +When checking test structure +Then tests/features/ directory should exist +And at least one .feature file should be present +``` diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-005-package-has-feature-directory-platform-bus.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-005-package-has-feature-directory-platform-bus.sdp.md index e19a05cd..a79c34d8 100644 --- a/specs/behavior/platform-core/testing/platform-coverage.examples/s-005-package-has-feature-directory-platform-bus.sdp.md +++ b/specs/behavior/platform-core/testing/platform-coverage.examples/s-005-package-has-feature-directory-platform-bus.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Package has feature directory - platform-bus" from packages/platform-core/tests/features/behavior/testing/platform-coverage.feature +- outcome: Executable scenario: Package has feature directory - platform-bus + +```gwt +Given the monorepo contains @libar-dev/platform-* packages +And each package follows the standard directory structure +And package @libar-dev/platform-bus +When checking test structure +Then tests/features/ directory should exist +And at least one .feature file should be present +``` diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-006-package-has-feature-directory-platform-bc.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-006-package-has-feature-directory-platform-bc.sdp.md index bb219141..1f73fe21 100644 --- a/specs/behavior/platform-core/testing/platform-coverage.examples/s-006-package-has-feature-directory-platform-bc.sdp.md +++ b/specs/behavior/platform-core/testing/platform-coverage.examples/s-006-package-has-feature-directory-platform-bc.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Package has feature directory - platform-bc" from packages/platform-core/tests/features/behavior/testing/platform-coverage.feature +- outcome: Executable scenario: Package has feature directory - platform-bc + +```gwt +Given the monorepo contains @libar-dev/platform-* packages +And each package follows the standard directory structure +And package @libar-dev/platform-bc +When checking test structure +Then tests/features/ directory should exist +And at least one .feature file should be present +``` diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-007-exported-function-has-feature-coverage.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-007-exported-function-has-feature-coverage.sdp.md index 3af0fad9..e54f0398 100644 --- a/specs/behavior/platform-core/testing/platform-coverage.examples/s-007-exported-function-has-feature-coverage.sdp.md +++ b/specs/behavior/platform-core/testing/platform-coverage.examples/s-007-exported-function-has-feature-coverage.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Exported function has feature coverage" from packages/platform-core/tests/features/behavior/testing/platform-coverage.feature +- outcome: Executable scenario: Exported function has feature coverage + +```gwt +Given the monorepo contains @libar-dev/platform-* packages +And each package follows the standard directory structure +And an exported function "createDeciderHandler" +When checking BDD coverage +Then a feature file should document its behavior +And scenarios should cover happy path and edge cases +``` diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-008-missing-coverage-is-detected.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-008-missing-coverage-is-detected.sdp.md index 9fd88a65..a27e7732 100644 --- a/specs/behavior/platform-core/testing/platform-coverage.examples/s-008-missing-coverage-is-detected.sdp.md +++ b/specs/behavior/platform-core/testing/platform-coverage.examples/s-008-missing-coverage-is-detected.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Missing coverage is detected" from packages/platform-core/tests/features/behavior/testing/platform-coverage.feature +- outcome: Executable scenario: Missing coverage is detected + +```gwt +Given the monorepo contains @libar-dev/platform-* packages +And each package follows the standard directory structure +And an exported function without feature coverage +When running coverage analysis +Then a warning should be generated +And the missing function should be listed +``` diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-009-step-definitions-follow-naming-convention.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-009-step-definitions-follow-naming-convention.sdp.md index 4d61a215..c3de32d9 100644 --- a/specs/behavior/platform-core/testing/platform-coverage.examples/s-009-step-definitions-follow-naming-convention.sdp.md +++ b/specs/behavior/platform-core/testing/platform-coverage.examples/s-009-step-definitions-follow-naming-convention.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Step definitions follow naming convention" from packages/platform-core/tests/features/behavior/testing/platform-coverage.feature +- outcome: Executable scenario: Step definitions follow naming convention + +```gwt +Given the monorepo contains @libar-dev/platform-* packages +And each package follows the standard directory structure +And package @libar-dev/platform-core +When checking step definition organization +Then steps should be in tests/steps/ directory +And each feature area has its own step file +And no duplicate step patterns exist across files +``` diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-010-step-file-matches-feature-file.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-010-step-file-matches-feature-file.sdp.md index e38f67fe..23aa66bd 100644 --- a/specs/behavior/platform-core/testing/platform-coverage.examples/s-010-step-file-matches-feature-file.sdp.md +++ b/specs/behavior/platform-core/testing/platform-coverage.examples/s-010-step-file-matches-feature-file.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Step file matches feature file" from packages/platform-core/tests/features/behavior/testing/platform-coverage.feature +- outcome: Executable scenario: Step file matches feature file + +```gwt +Given the monorepo contains @libar-dev/platform-* packages +And each package follows the standard directory structure +And feature file "decider-outputs.feature" +When looking for step definitions +Then steps should be in "steps/decider/outputs.steps.ts" or "steps/decider.steps.ts" +``` diff --git a/specs/behavior/platform-core/testing/platform-coverage.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.sdp.md index da9b67f6..6fd037a0 100644 --- a/specs/behavior/platform-core/testing/platform-coverage.sdp.md +++ b/specs/behavior/platform-core/testing/platform-coverage.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: all platform packages to have BDD test coverage so that public APIs are documented through executable specifications (test carrier: packages/platform-core/tests/features/behavior/testing/platform-coverage.feature) +- actor: a platform maintainer +- outcome: all platform packages to have BDD test coverage so that public APIs are documented through executable specifications + +## Behavior + +- rule: Each platform package must have a tests/features/ directory +- rule: Public APIs must have corresponding feature files +- rule: Step definitions must be organized by domain diff --git a/specs/behavior/platform-core/testing/polling.examples/s-001-sleep-for-specified-duration.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-001-sleep-for-specified-duration.sdp.md index 348ed361..02fcd661 100644 --- a/specs/behavior/platform-core/testing/polling.examples/s-001-sleep-for-specified-duration.sdp.md +++ b/specs/behavior/platform-core/testing/polling.examples/s-001-sleep-for-specified-duration.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Sleep for specified duration" from packages/platform-core/tests/features/behavior/testing/polling.feature +- outcome: Executable scenario: Sleep for specified duration + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +When I call sleep(50) +Then the function resolves after approximately 50ms +And no error is thrown +``` diff --git a/specs/behavior/platform-core/testing/polling.examples/s-002-sleep-returns-a-promise.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-002-sleep-returns-a-promise.sdp.md index b79f785e..5fd44e4e 100644 --- a/specs/behavior/platform-core/testing/polling.examples/s-002-sleep-returns-a-promise.sdp.md +++ b/specs/behavior/platform-core/testing/polling.examples/s-002-sleep-returns-a-promise.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Sleep returns a promise" from packages/platform-core/tests/features/behavior/testing/polling.feature +- outcome: Executable scenario: Sleep returns a promise + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +When I call sleep(10) +Then I receive a Promise +And I can await the result +``` diff --git a/specs/behavior/platform-core/testing/polling.examples/s-003-wait-until-returns-truthy-result-immediately.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-003-wait-until-returns-truthy-result-immediately.sdp.md index 865f2dcc..31ce614a 100644 --- a/specs/behavior/platform-core/testing/polling.examples/s-003-wait-until-returns-truthy-result-immediately.sdp.md +++ b/specs/behavior/platform-core/testing/polling.examples/s-003-wait-until-returns-truthy-result-immediately.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "waitUntil returns truthy result immediately" from packages/platform-core/tests/features/behavior/testing/polling.feature +- outcome: Executable scenario: waitUntil returns truthy result immediately + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And a check function that returns truthy on first call +When I call waitUntil with the check function +Then I receive the truthy value +And the check was called once +``` diff --git a/specs/behavior/platform-core/testing/polling.examples/s-004-wait-until-polls-until-condition-is-met.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-004-wait-until-polls-until-condition-is-met.sdp.md index 8bfb2b11..71ebc676 100644 --- a/specs/behavior/platform-core/testing/polling.examples/s-004-wait-until-polls-until-condition-is-met.sdp.md +++ b/specs/behavior/platform-core/testing/polling.examples/s-004-wait-until-polls-until-condition-is-met.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "waitUntil polls until condition is met" from packages/platform-core/tests/features/behavior/testing/polling.feature +- outcome: Executable scenario: waitUntil polls until condition is met + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And a check function that returns truthy after 3 calls +When I call waitUntil with the check function +Then I receive the truthy value +And the check was called 3 times +``` diff --git a/specs/behavior/platform-core/testing/polling.examples/s-005-wait-until-throws-on-timeout.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-005-wait-until-throws-on-timeout.sdp.md index a0c17513..9699eca3 100644 --- a/specs/behavior/platform-core/testing/polling.examples/s-005-wait-until-throws-on-timeout.sdp.md +++ b/specs/behavior/platform-core/testing/polling.examples/s-005-wait-until-throws-on-timeout.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "waitUntil throws on timeout" from packages/platform-core/tests/features/behavior/testing/polling.feature +- outcome: Executable scenario: waitUntil throws on timeout + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And a check function that always returns falsy +When I call waitUntil with timeoutMs 100 and pollIntervalMs 20 +Then an error is thrown with message containing "within 100ms" +``` diff --git a/specs/behavior/platform-core/testing/polling.examples/s-006-wait-until-uses-custom-timeout-message.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-006-wait-until-uses-custom-timeout-message.sdp.md index e1804f85..9ba40c4a 100644 --- a/specs/behavior/platform-core/testing/polling.examples/s-006-wait-until-uses-custom-timeout-message.sdp.md +++ b/specs/behavior/platform-core/testing/polling.examples/s-006-wait-until-uses-custom-timeout-message.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "waitUntil uses custom timeout message" from packages/platform-core/tests/features/behavior/testing/polling.feature +- outcome: Executable scenario: waitUntil uses custom timeout message + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And a check function that always returns falsy +When I call waitUntil with message "Order to be confirmed" +Then an error is thrown with message containing "Order to be confirmed" +``` diff --git a/specs/behavior/platform-core/testing/polling.examples/s-007-wait-until-respects-poll-interval-ms.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-007-wait-until-respects-poll-interval-ms.sdp.md index fb565fdd..2ce2f43f 100644 --- a/specs/behavior/platform-core/testing/polling.examples/s-007-wait-until-respects-poll-interval-ms.sdp.md +++ b/specs/behavior/platform-core/testing/polling.examples/s-007-wait-until-respects-poll-interval-ms.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "waitUntil respects pollIntervalMs" from packages/platform-core/tests/features/behavior/testing/polling.feature +- outcome: Executable scenario: waitUntil respects pollIntervalMs + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And a check function that tracks call timestamps +When I call waitUntil with pollIntervalMs 50 +Then calls are spaced approximately 50ms apart +``` diff --git a/specs/behavior/platform-core/testing/polling.examples/s-008-wait-for-resolves-when-predicate-returns-true.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-008-wait-for-resolves-when-predicate-returns-true.sdp.md index e905e348..72cc9ee2 100644 --- a/specs/behavior/platform-core/testing/polling.examples/s-008-wait-for-resolves-when-predicate-returns-true.sdp.md +++ b/specs/behavior/platform-core/testing/polling.examples/s-008-wait-for-resolves-when-predicate-returns-true.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "waitFor resolves when predicate returns true" from packages/platform-core/tests/features/behavior/testing/polling.feature +- outcome: Executable scenario: waitFor resolves when predicate returns true + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And a predicate that returns true after 2 calls +When I call waitFor with the predicate +Then the function resolves without error +And the predicate was called 2 times +``` diff --git a/specs/behavior/platform-core/testing/polling.examples/s-009-wait-for-throws-on-timeout.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-009-wait-for-throws-on-timeout.sdp.md index 546bbea6..b57515b9 100644 --- a/specs/behavior/platform-core/testing/polling.examples/s-009-wait-for-throws-on-timeout.sdp.md +++ b/specs/behavior/platform-core/testing/polling.examples/s-009-wait-for-throws-on-timeout.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "waitFor throws on timeout" from packages/platform-core/tests/features/behavior/testing/polling.feature +- outcome: Executable scenario: waitFor throws on timeout + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And a predicate that always returns false +When I call waitFor with timeoutMs 100 +Then an error is thrown with message containing "100ms" +``` diff --git a/specs/behavior/platform-core/testing/polling.examples/s-010-default-timeout-is-30-seconds.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-010-default-timeout-is-30-seconds.sdp.md index f0e7754f..391370d7 100644 --- a/specs/behavior/platform-core/testing/polling.examples/s-010-default-timeout-is-30-seconds.sdp.md +++ b/specs/behavior/platform-core/testing/polling.examples/s-010-default-timeout-is-30-seconds.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Default timeout is 30 seconds" from packages/platform-core/tests/features/behavior/testing/polling.feature +- outcome: Executable scenario: Default timeout is 30 seconds + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +When the scenario runs +Then DEFAULT_TIMEOUT_MS equals 30000 +``` diff --git a/specs/behavior/platform-core/testing/polling.examples/s-011-default-poll-interval-is-100ms.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-011-default-poll-interval-is-100ms.sdp.md index c5088713..0175350a 100644 --- a/specs/behavior/platform-core/testing/polling.examples/s-011-default-poll-interval-is-100ms.sdp.md +++ b/specs/behavior/platform-core/testing/polling.examples/s-011-default-poll-interval-is-100ms.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Default poll interval is 100ms" from packages/platform-core/tests/features/behavior/testing/polling.feature +- outcome: Executable scenario: Default poll interval is 100ms + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +When the scenario runs +Then DEFAULT_POLL_INTERVAL_MS equals 100 +``` diff --git a/specs/behavior/platform-core/testing/polling.sdp.md b/specs/behavior/platform-core/testing/polling.sdp.md index 91ca4544..18c95082 100644 --- a/specs/behavior/platform-core/testing/polling.sdp.md +++ b/specs/behavior/platform-core/testing/polling.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: async polling utilities so that I can wait for eventual consistency patterns (test carrier: packages/platform-core/tests/features/behavior/testing/polling.feature) +- actor: a developer writing integration tests +- outcome: async polling utilities so that I can wait for eventual consistency patterns diff --git a/specs/behavior/platform-core/testing/world.examples/s-001-create-base-unit-test-world.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-001-create-base-unit-test-world.sdp.md index 9d2b3b6d..58b10bd3 100644 --- a/specs/behavior/platform-core/testing/world.examples/s-001-create-base-unit-test-world.sdp.md +++ b/specs/behavior/platform-core/testing/world.examples/s-001-create-base-unit-test-world.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "Create base unit test world" from packages/platform-core/tests/features/behavior/testing/world.feature +- outcome: Executable scenario: Create base unit test world + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And a mock ConvexTest instance +When I call createBaseUnitTestWorld(t) +Then I receive a BaseUnitTestWorld object +And the world.t is the mock instance +And the world.lastResult is null +And the world.lastError is null +And the world.scenario is an empty object +``` diff --git a/specs/behavior/platform-core/testing/world.examples/s-002-unit-test-world-supports-scenario-context.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-002-unit-test-world-supports-scenario-context.sdp.md index ac2dac37..7390f21d 100644 --- a/specs/behavior/platform-core/testing/world.examples/s-002-unit-test-world-supports-scenario-context.sdp.md +++ b/specs/behavior/platform-core/testing/world.examples/s-002-unit-test-world-supports-scenario-context.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Unit test world supports scenario context" from packages/platform-core/tests/features/behavior/testing/world.feature +- outcome: Executable scenario: Unit test world supports scenario context + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And a BaseUnitTestWorld instance +When I set world.scenario.orderId to "order-123" +Then world.scenario.orderId is "order-123" +``` diff --git a/specs/behavior/platform-core/testing/world.examples/s-003-unit-test-world-tracks-last-result.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-003-unit-test-world-tracks-last-result.sdp.md index cbd13e5a..6e79d033 100644 --- a/specs/behavior/platform-core/testing/world.examples/s-003-unit-test-world-tracks-last-result.sdp.md +++ b/specs/behavior/platform-core/testing/world.examples/s-003-unit-test-world-tracks-last-result.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Unit test world tracks last result" from packages/platform-core/tests/features/behavior/testing/world.feature +- outcome: Executable scenario: Unit test world tracks last result + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And a BaseUnitTestWorld instance +When I set world.lastResult to a success object +Then world.lastResult contains the success object +``` diff --git a/specs/behavior/platform-core/testing/world.examples/s-004-unit-test-world-tracks-last-error.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-004-unit-test-world-tracks-last-error.sdp.md index 0e6c1913..eff30373 100644 --- a/specs/behavior/platform-core/testing/world.examples/s-004-unit-test-world-tracks-last-error.sdp.md +++ b/specs/behavior/platform-core/testing/world.examples/s-004-unit-test-world-tracks-last-error.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Unit test world tracks last error" from packages/platform-core/tests/features/behavior/testing/world.feature +- outcome: Executable scenario: Unit test world tracks last error + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And a BaseUnitTestWorld instance +When I set world.lastError to an Error +Then world.lastError is the Error instance +``` diff --git a/specs/behavior/platform-core/testing/world.examples/s-005-create-base-integration-test-world.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-005-create-base-integration-test-world.sdp.md index 983a2797..6b57100e 100644 --- a/specs/behavior/platform-core/testing/world.examples/s-005-create-base-integration-test-world.sdp.md +++ b/specs/behavior/platform-core/testing/world.examples/s-005-create-base-integration-test-world.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Create base integration test world" from packages/platform-core/tests/features/behavior/testing/world.feature +- outcome: Executable scenario: Create base integration test world + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And a mock ConvexTestingHelper instance +When I call createBaseIntegrationTestWorld(t) +Then I receive a BaseIntegrationTestWorld object +And the world.t is the mock instance +And the world.backendUrl is set +``` diff --git a/specs/behavior/platform-core/testing/world.examples/s-006-integration-test-world-uses-custom-backend-url.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-006-integration-test-world-uses-custom-backend-url.sdp.md index 951adbd7..9aa64b4e 100644 --- a/specs/behavior/platform-core/testing/world.examples/s-006-integration-test-world-uses-custom-backend-url.sdp.md +++ b/specs/behavior/platform-core/testing/world.examples/s-006-integration-test-world-uses-custom-backend-url.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Integration test world uses custom backend URL" from packages/platform-core/tests/features/behavior/testing/world.feature +- outcome: Executable scenario: Integration test world uses custom backend URL + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And a mock ConvexTestingHelper instance +When I call createBaseIntegrationTestWorld(t, "http://custom:3210") +Then world.backendUrl is "http://custom:3210" +``` diff --git a/specs/behavior/platform-core/testing/world.examples/s-007-integration-test-world-defaults-to-localhost.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-007-integration-test-world-defaults-to-localhost.sdp.md index 67d2f3bb..8d3357d9 100644 --- a/specs/behavior/platform-core/testing/world.examples/s-007-integration-test-world-defaults-to-localhost.sdp.md +++ b/specs/behavior/platform-core/testing/world.examples/s-007-integration-test-world-defaults-to-localhost.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Integration test world defaults to localhost" from packages/platform-core/tests/features/behavior/testing/world.feature +- outcome: Executable scenario: Integration test world defaults to localhost + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And a mock ConvexTestingHelper instance +And no CONVEX_URL environment variable is set +When I call createBaseIntegrationTestWorld(t) +Then world.backendUrl contains "127.0.0.1:3210" +``` diff --git a/specs/behavior/platform-core/testing/world.examples/s-008-reset-world-state-clears-all-fields.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-008-reset-world-state-clears-all-fields.sdp.md index ee3760d6..47db12fd 100644 --- a/specs/behavior/platform-core/testing/world.examples/s-008-reset-world-state-clears-all-fields.sdp.md +++ b/specs/behavior/platform-core/testing/world.examples/s-008-reset-world-state-clears-all-fields.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Reset world state clears all fields" from packages/platform-core/tests/features/behavior/testing/world.feature +- outcome: Executable scenario: Reset world state clears all fields + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And a BaseUnitTestWorld instance with populated state +When I call resetWorldState(world) +Then world.lastResult is null +And world.lastError is null +And world.scenario is an empty object +``` diff --git a/specs/behavior/platform-core/testing/world.examples/s-009-reset-preserves-test-backend-reference.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-009-reset-preserves-test-backend-reference.sdp.md index 12788f32..ed6c8556 100644 --- a/specs/behavior/platform-core/testing/world.examples/s-009-reset-preserves-test-backend-reference.sdp.md +++ b/specs/behavior/platform-core/testing/world.examples/s-009-reset-preserves-test-backend-reference.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reset preserves test backend reference" from packages/platform-core/tests/features/behavior/testing/world.feature +- outcome: Executable scenario: Reset preserves test backend reference + +```gwt +Given the following deliverables: +And the platform-core testing module is imported +And a BaseUnitTestWorld instance with a mock t +When I call resetWorldState(world) +Then world.t is still the original mock instance +``` diff --git a/specs/behavior/platform-core/testing/world.sdp.md b/specs/behavior/platform-core/testing/world.sdp.md index 8c6e09f4..52d111b9 100644 --- a/specs/behavior/platform-core/testing/world.sdp.md +++ b/specs/behavior/platform-core/testing/world.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: world/state management utilities so that I can manage scenario context across steps (test carrier: packages/platform-core/tests/features/behavior/testing/world.feature) +- actor: a BDD test author +- outcome: world/state management utilities so that I can manage scenario context across steps diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-001-single-entity-projections-recommend-entity-strategy.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-001-single-entity-projections-recommend-entity-strategy.sdp.md index 0cf085a4..d046c8de 100644 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-001-single-entity-projections-recommend-entity-strategy.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-001-single-entity-projections-recommend-entity-strategy.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Single entity projections recommend entity strategy" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature +- outcome: Executable scenario: Single entity projections recommend entity strategy + +```gwt +Given the decision tree priority is global > saga > customer > entity +And projection characteristics with singleEntity true and all others false +When I call classifyProjection +Then the strategy should be "entity" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-002-single-entity-projections-return-simple-complexity.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-002-single-entity-projections-return-simple-complexity.sdp.md index 971a1c8f..b0889e73 100644 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-002-single-entity-projections-return-simple-complexity.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-002-single-entity-projections-return-simple-complexity.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Single entity projections return simple complexity" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature +- outcome: Executable scenario: Single entity projections return simple complexity + +```gwt +Given the decision tree priority is global > saga > customer > entity +And projection characteristics with singleEntity true and all others false +When I call classifyProjection +Then the complexity should be "simple" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-003-single-entity-projections-include-rationale-about-stream-id.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-003-single-entity-projections-include-rationale-about-stream-id.sdp.md index b3da6d4f..12b8550f 100644 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-003-single-entity-projections-include-rationale-about-stream-id.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-003-single-entity-projections-include-rationale-about-stream-id.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Single entity projections include rationale about streamId" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature +- outcome: Executable scenario: Single entity projections include rationale about streamId + +```gwt +Given the decision tree priority is global > saga > customer > entity +And projection characteristics with singleEntity true and all others false +When I call classifyProjection +Then the rationale should contain "streamId" +And the rationale should contain "per-entity ordering" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-004-classification-defaults-to-entity-when-all-flags-are-false.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-004-classification-defaults-to-entity-when-all-flags-are-false.sdp.md index e3754a5d..de792a2e 100644 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-004-classification-defaults-to-entity-when-all-flags-are-false.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-004-classification-defaults-to-entity-when-all-flags-are-false.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Classification defaults to entity when all flags are false" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature +- outcome: Executable scenario: Classification defaults to entity when all flags are false + +```gwt +Given the decision tree priority is global > saga > customer > entity +And projection characteristics with all flags false +When I call classifyProjection +Then the strategy should be "entity" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-005-global-rollup-projections-recommend-global-strategy.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-005-global-rollup-projections-recommend-global-strategy.sdp.md index 72330f2f..6bc63cb9 100644 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-005-global-rollup-projections-recommend-global-strategy.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-005-global-rollup-projections-recommend-global-strategy.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Global rollup projections recommend global strategy" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature +- outcome: Executable scenario: Global rollup projections recommend global strategy + +```gwt +Given the decision tree priority is global > saga > customer > entity +And projection characteristics with globalRollup true and singleEntity false +When I call classifyProjection +Then the strategy should be "global" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-006-global-rollup-projections-return-complex-complexity.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-006-global-rollup-projections-return-complex-complexity.sdp.md index 9c90218b..3edb3014 100644 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-006-global-rollup-projections-return-complex-complexity.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-006-global-rollup-projections-return-complex-complexity.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Global rollup projections return complex complexity" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature +- outcome: Executable scenario: Global rollup projections return complex complexity + +```gwt +Given the decision tree priority is global > saga > customer > entity +And projection characteristics with globalRollup true and singleEntity false +When I call classifyProjection +Then the complexity should be "complex" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-007-global-rollup-projections-include-rationale-about-occ-conflicts.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-007-global-rollup-projections-include-rationale-about-occ-conflicts.sdp.md index 5165aa37..78fcdf2b 100644 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-007-global-rollup-projections-include-rationale-about-occ-conflicts.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-007-global-rollup-projections-include-rationale-about-occ-conflicts.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Global rollup projections include rationale about OCC conflicts" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature +- outcome: Executable scenario: Global rollup projections include rationale about OCC conflicts + +```gwt +Given the decision tree priority is global > saga > customer > entity +And projection characteristics with globalRollup true and singleEntity false +When I call classifyProjection +Then the rationale should contain "OCC conflicts" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-008-global-strategy-prioritizes-over-other-flags.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-008-global-strategy-prioritizes-over-other-flags.sdp.md index 636f2824..a6a54e9c 100644 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-008-global-strategy-prioritizes-over-other-flags.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-008-global-strategy-prioritizes-over-other-flags.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Global strategy prioritizes over other flags" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature +- outcome: Executable scenario: Global strategy prioritizes over other flags + +```gwt +Given the decision tree priority is global > saga > customer > entity +And projection characteristics with all flags true +When I call classifyProjection +Then the strategy should be "global" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-009-cross-context-projections-recommend-saga-strategy.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-009-cross-context-projections-recommend-saga-strategy.sdp.md index 6a34a844..9d2e1160 100644 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-009-cross-context-projections-recommend-saga-strategy.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-009-cross-context-projections-recommend-saga-strategy.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cross-context projections recommend saga strategy" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature +- outcome: Executable scenario: Cross-context projections recommend saga strategy + +```gwt +Given the decision tree priority is global > saga > customer > entity +And projection characteristics with crossContext true and globalRollup false +When I call classifyProjection +Then the strategy should be "saga" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-010-cross-context-projections-return-complex-complexity.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-010-cross-context-projections-return-complex-complexity.sdp.md index 2c20b323..8ce75e06 100644 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-010-cross-context-projections-return-complex-complexity.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-010-cross-context-projections-return-complex-complexity.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Cross-context projections return complex complexity" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature +- outcome: Executable scenario: Cross-context projections return complex complexity + +```gwt +Given the decision tree priority is global > saga > customer > entity +And projection characteristics with crossContext true and globalRollup false +When I call classifyProjection +Then the complexity should be "complex" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-011-cross-context-projections-include-rationale-about-correlation-id.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-011-cross-context-projections-include-rationale-about-correlation-id.sdp.md index 7a60fb70..d13ad78f 100644 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-011-cross-context-projections-include-rationale-about-correlation-id.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-011-cross-context-projections-include-rationale-about-correlation-id.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Cross-context projections include rationale about correlationId" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature +- outcome: Executable scenario: Cross-context projections include rationale about correlationId + +```gwt +Given the decision tree priority is global > saga > customer > entity +And projection characteristics with crossContext true and globalRollup false +When I call classifyProjection +Then the rationale should contain "correlationId" +And the rationale should contain "causal ordering" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-012-saga-strategy-prioritizes-over-customer-and-entity.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-012-saga-strategy-prioritizes-over-customer-and-entity.sdp.md index 6a4aa2cb..5fe1b9a2 100644 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-012-saga-strategy-prioritizes-over-customer-and-entity.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-012-saga-strategy-prioritizes-over-customer-and-entity.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Saga strategy prioritizes over customer and entity" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature +- outcome: Executable scenario: Saga strategy prioritizes over customer and entity + +```gwt +Given the decision tree priority is global > saga > customer > entity +And projection characteristics with singleEntity true, customerScoped true, crossContext true, globalRollup false +When I call classifyProjection +Then the strategy should be "saga" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-013-customer-scoped-projections-recommend-customer-strategy.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-013-customer-scoped-projections-recommend-customer-strategy.sdp.md index 64d626dc..79991e6e 100644 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-013-customer-scoped-projections-recommend-customer-strategy.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-013-customer-scoped-projections-recommend-customer-strategy.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Customer-scoped projections recommend customer strategy" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature +- outcome: Executable scenario: Customer-scoped projections recommend customer strategy + +```gwt +Given the decision tree priority is global > saga > customer > entity +And projection characteristics with customerScoped true and crossContext false and globalRollup false +When I call classifyProjection +Then the strategy should be "customer" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-014-customer-scoped-projections-return-moderate-complexity.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-014-customer-scoped-projections-return-moderate-complexity.sdp.md index 87b6252b..8c9ba2ce 100644 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-014-customer-scoped-projections-return-moderate-complexity.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-014-customer-scoped-projections-return-moderate-complexity.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Customer-scoped projections return moderate complexity" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature +- outcome: Executable scenario: Customer-scoped projections return moderate complexity + +```gwt +Given the decision tree priority is global > saga > customer > entity +And projection characteristics with customerScoped true and crossContext false and globalRollup false +When I call classifyProjection +Then the complexity should be "moderate" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-015-customer-scoped-projections-include-rationale-about-customer-id.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-015-customer-scoped-projections-include-rationale-about-customer-id.sdp.md index 5a678497..6ae1645f 100644 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-015-customer-scoped-projections-include-rationale-about-customer-id.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-015-customer-scoped-projections-include-rationale-about-customer-id.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Customer-scoped projections include rationale about customerId" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature +- outcome: Executable scenario: Customer-scoped projections include rationale about customerId + +```gwt +Given the decision tree priority is global > saga > customer > entity +And projection characteristics with customerScoped true and crossContext false and globalRollup false +When I call classifyProjection +Then the rationale should contain "customerId" +And the rationale should contain "per-customer ordering" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-016-customer-strategy-prioritizes-over-entity.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-016-customer-strategy-prioritizes-over-entity.sdp.md index 143efe5f..f119b3c5 100644 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-016-customer-strategy-prioritizes-over-entity.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-016-customer-strategy-prioritizes-over-entity.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Customer strategy prioritizes over entity" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature +- outcome: Executable scenario: Customer strategy prioritizes over entity + +```gwt +Given the decision tree priority is global > saga > customer > entity +And projection characteristics with singleEntity true, customerScoped true, crossContext false, globalRollup false +When I call classifyProjection +Then the strategy should be "customer" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-017-decision-tree-follows-priority-global-saga-customer-entity.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-017-decision-tree-follows-priority-global-saga-customer-entity.sdp.md index eb04a9a3..329f9651 100644 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-017-decision-tree-follows-priority-global-saga-customer-entity.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-017-decision-tree-follows-priority-global-saga-customer-entity.sdp.md @@ -6,8 +6,21 @@ readiness: idea relations: refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier --- -# Decision tree follows priority global > saga > customer > entity +# Decision tree follows priority global ) saga ) customer ) entity ## Intent -- outcome: Executable scenario "Decision tree follows priority global > saga > customer > entity" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature +- outcome: Executable scenario: Decision tree follows priority global ) saga ) customer ) entity + +```gwt +Given the decision tree priority is global > saga > customer > entity +And projection characteristics with all flags true +And projection characteristics with globalRollup false but all others true +And projection characteristics with globalRollup false, crossContext false, but customerScoped and singleEntity true +And projection characteristics with only singleEntity true +When the scenario runs +Then classifying should return strategy "global" +And classifying should return strategy "saga" +And classifying should return strategy "customer" +And classifying should return strategy "entity" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-018-strategy-parallelism-values.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-018-strategy-parallelism-values.sdp.md index f4a35145..c3c9ac3f 100644 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-018-strategy-parallelism-values.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-018-strategy-parallelism-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Strategy parallelism values" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature +- outcome: Executable scenario: Strategy parallelism values + +```gwt +Given the decision tree priority is global > saga > customer > entity +When I access PARALLELISM_BY_STRATEGY for "value" +Then the parallelism should be value +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-019-get-recommended-parallelism-by-strategy.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-019-get-recommended-parallelism-by-strategy.sdp.md index 52ef0500..835dff80 100644 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-019-get-recommended-parallelism-by-strategy.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-019-get-recommended-parallelism-by-strategy.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Get recommended parallelism by strategy" from packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature +- outcome: Executable scenario: Get recommended parallelism by strategy + +```gwt +Given the decision tree priority is global > saga > customer > entity +When I call getRecommendedParallelism with "value" +Then the result should be value +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.sdp.md index 623a5b3c..6ea8611c 100644 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: projections classified by complexity characteristics so that I can select appropriate partition strategies (test carrier: packages/platform-core/tests/features/behavior/workpool-partitioning/complexity-classifier.feature) +- actor: a platform developer +- outcome: projections classified by complexity characteristics so that I can select appropriate partition strategies diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-001-global-partition-key-has-name-global.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-001-global-partition-key-has-name-global.sdp.md index b2197385..52560938 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-001-global-partition-key-has-name-global.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-001-global-partition-key-has-name-global.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "GLOBAL_PARTITION_KEY has name 'global'" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: GLOBAL_PARTITION_KEY has name 'global' + +```gwt +Given the feature fixture is in place +When I access GLOBAL_PARTITION_KEY +Then the partition key name should be "global" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-002-global-partition-key-has-value-global.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-002-global-partition-key-has-value-global.sdp.md index 10703d3c..ffacb4ff 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-002-global-partition-key-has-value-global.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-002-global-partition-key-has-value-global.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "GLOBAL_PARTITION_KEY has value 'global'" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: GLOBAL_PARTITION_KEY has value 'global' + +```gwt +Given the feature fixture is in place +When I access GLOBAL_PARTITION_KEY +Then the partition key value should be "global" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-003-entity-partition-key-uses-stream-type-stream-id-format.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-003-entity-partition-key-uses-stream-type-stream-id-format.sdp.md index 5a8126a0..1bea1de8 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-003-entity-partition-key-uses-stream-type-stream-id-format.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-003-entity-partition-key-uses-stream-type-stream-id-format.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Entity partition key uses streamType:streamId format" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: Entity partition key uses streamType:streamId format + +```gwt +Given a createEntityPartitionKey helper for streamType "Order" +When called with streamId "ord-123" +Then the partition key should be name "streamId" and value "Order:ord-123" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-004-entity-partition-key-prioritizes-stream-id-over-other-id-fields.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-004-entity-partition-key-prioritizes-stream-id-over-other-id-fields.sdp.md index 1153c43c..c7c4eb89 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-004-entity-partition-key-prioritizes-stream-id-over-other-id-fields.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-004-entity-partition-key-prioritizes-stream-id-over-other-id-fields.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Entity partition key prioritizes streamId over other ID fields" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: Entity partition key prioritizes streamId over other ID fields + +```gwt +Given a createEntityPartitionKey helper for streamType "Order" +When called with streamId "stream-123", orderId "ord-456", productId "prod-789" +Then the partition key should be name "streamId" and value "Order:stream-123" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-005-entity-partition-key-falls-back-to-alternate-id-fields.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-005-entity-partition-key-falls-back-to-alternate-id-fields.sdp.md index a2a4dbcc..04c18d7e 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-005-entity-partition-key-falls-back-to-alternate-id-fields.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-005-entity-partition-key-falls-back-to-alternate-id-fields.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Entity partition key falls back to alternate ID fields" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: Entity partition key falls back to alternate ID fields + +```gwt +Given a createEntityPartitionKey helper for streamType "value" +When called with value "value" +Then the partition key should be name "streamId" and value "value" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-006-entity-partition-key-throws-when-no-id-field-provided.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-006-entity-partition-key-throws-when-no-id-field-provided.sdp.md index efd80c46..9a9f6f19 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-006-entity-partition-key-throws-when-no-id-field-provided.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-006-entity-partition-key-throws-when-no-id-field-provided.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Entity partition key throws when no ID field provided" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: Entity partition key throws when no ID field provided + +```gwt +Given a createEntityPartitionKey helper for streamType "Order" +When called with empty args +Then an error should be thrown with message containing "requires streamId, orderId, productId, or reservationId" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-007-entity-partition-key-includes-available-keys-in-error-message.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-007-entity-partition-key-includes-available-keys-in-error-message.sdp.md index 7e3bca9d..5725f511 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-007-entity-partition-key-includes-available-keys-in-error-message.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-007-entity-partition-key-includes-available-keys-in-error-message.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Entity partition key includes available keys in error message" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: Entity partition key includes available keys in error message + +```gwt +Given a createEntityPartitionKey helper for streamType "Order" +When called with customerId "cust-123" and someField "value" +Then an error should be thrown with message containing "Received args with keys:" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-008-entity-partition-key-uses-provided-stream-type-in-value.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-008-entity-partition-key-uses-provided-stream-type-in-value.sdp.md index 753255b2..8a068d18 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-008-entity-partition-key-uses-provided-stream-type-in-value.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-008-entity-partition-key-uses-provided-stream-type-in-value.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Entity partition key uses provided streamType in value" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: Entity partition key uses provided streamType in value + +```gwt +Given a createEntityPartitionKey helper for streamType "value" +When called with value "value" +Then the partition key value should be "value" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-009-customer-partition-key-returns-customer-id.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-009-customer-partition-key-returns-customer-id.sdp.md index 16b29939..f2c20ec3 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-009-customer-partition-key-returns-customer-id.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-009-customer-partition-key-returns-customer-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Customer partition key returns customerId" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: Customer partition key returns customerId + +```gwt +Given a createCustomerPartitionKey helper +When called with customerId "cust-123" +Then the partition key should be name "customerId" and value "cust-123" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-010-customer-partition-key-ignores-additional-fields.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-010-customer-partition-key-ignores-additional-fields.sdp.md index 2b0e3aed..63f23bdc 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-010-customer-partition-key-ignores-additional-fields.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-010-customer-partition-key-ignores-additional-fields.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Customer partition key ignores additional fields" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: Customer partition key ignores additional fields + +```gwt +Given a createCustomerPartitionKey helper +When called with customerId "cust-456", orderId "ord-789", someOtherField "value" +Then the partition key should be name "customerId" and value "cust-456" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-011-customer-partition-key-throws-when-customer-id-is-undefined.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-011-customer-partition-key-throws-when-customer-id-is-undefined.sdp.md index b2bc68a5..09414f99 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-011-customer-partition-key-throws-when-customer-id-is-undefined.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-011-customer-partition-key-throws-when-customer-id-is-undefined.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Customer partition key throws when customerId is undefined" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: Customer partition key throws when customerId is undefined + +```gwt +Given a createCustomerPartitionKey helper +When called with customerId undefined +Then an error should be thrown with message containing "requires customerId field" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-012-customer-partition-key-throws-when-customer-id-is-missing.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-012-customer-partition-key-throws-when-customer-id-is-missing.sdp.md index aa8b0631..77db0457 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-012-customer-partition-key-throws-when-customer-id-is-missing.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-012-customer-partition-key-throws-when-customer-id-is-missing.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Customer partition key throws when customerId is missing" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: Customer partition key throws when customerId is missing + +```gwt +Given a createCustomerPartitionKey helper +When called with customerId missing entirely +Then an error should be thrown with message containing "requires customerId field" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-013-customer-partition-key-throws-when-customer-id-is-empty-string.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-013-customer-partition-key-throws-when-customer-id-is-empty-string.sdp.md index 77e67e3b..d020c783 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-013-customer-partition-key-throws-when-customer-id-is-empty-string.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-013-customer-partition-key-throws-when-customer-id-is-empty-string.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Customer partition key throws when customerId is empty string" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: Customer partition key throws when customerId is empty string + +```gwt +Given a createCustomerPartitionKey helper +When called with customerId empty string +Then an error should be thrown with message containing "requires customerId field" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-014-saga-partition-key-returns-correlation-id.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-014-saga-partition-key-returns-correlation-id.sdp.md index 6096f8d4..d9c5e39f 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-014-saga-partition-key-returns-correlation-id.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-014-saga-partition-key-returns-correlation-id.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Saga partition key returns correlationId" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: Saga partition key returns correlationId + +```gwt +Given a createSagaPartitionKey helper +When called with correlationId "corr-123" +Then the partition key should be name "correlationId" and value "corr-123" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-015-saga-partition-key-ignores-additional-fields.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-015-saga-partition-key-ignores-additional-fields.sdp.md index 03de4ca1..9202bd6e 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-015-saga-partition-key-ignores-additional-fields.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-015-saga-partition-key-ignores-additional-fields.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Saga partition key ignores additional fields" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: Saga partition key ignores additional fields + +```gwt +Given a createSagaPartitionKey helper +When called with correlationId "corr-456", sagaId "saga-789", orderId "ord-101" +Then the partition key should be name "correlationId" and value "corr-456" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-016-saga-partition-key-throws-when-correlation-id-is-undefined.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-016-saga-partition-key-throws-when-correlation-id-is-undefined.sdp.md index 79dfcb0d..5916b0a9 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-016-saga-partition-key-throws-when-correlation-id-is-undefined.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-016-saga-partition-key-throws-when-correlation-id-is-undefined.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Saga partition key throws when correlationId is undefined" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: Saga partition key throws when correlationId is undefined + +```gwt +Given a createSagaPartitionKey helper +When called with correlationId undefined +Then an error should be thrown with message containing "requires correlationId field" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-017-saga-partition-key-throws-when-correlation-id-is-missing.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-017-saga-partition-key-throws-when-correlation-id-is-missing.sdp.md index 68cd89e3..41190c25 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-017-saga-partition-key-throws-when-correlation-id-is-missing.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-017-saga-partition-key-throws-when-correlation-id-is-missing.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Saga partition key throws when correlationId is missing" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: Saga partition key throws when correlationId is missing + +```gwt +Given a createSagaPartitionKey helper +When called with correlationId missing entirely +Then an error should be thrown with message containing "requires correlationId field" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-018-saga-partition-key-throws-when-correlation-id-is-empty-string.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-018-saga-partition-key-throws-when-correlation-id-is-empty-string.sdp.md index 0554c733..174944ea 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-018-saga-partition-key-throws-when-correlation-id-is-empty-string.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-018-saga-partition-key-throws-when-correlation-id-is-empty-string.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Saga partition key throws when correlationId is empty string" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: Saga partition key throws when correlationId is empty string + +```gwt +Given a createSagaPartitionKey helper +When called with correlationId empty string +Then an error should be thrown with message containing "requires correlationId field" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-019-global-partition-key-returns-global-partition-key.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-019-global-partition-key-returns-global-partition-key.sdp.md index 6c377ab8..8d59d976 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-019-global-partition-key-returns-global-partition-key.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-019-global-partition-key-returns-global-partition-key.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Global partition key returns GLOBAL_PARTITION_KEY" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: Global partition key returns GLOBAL_PARTITION_KEY + +```gwt +Given a createGlobalPartitionKey helper +When called with no arguments +Then the result should equal GLOBAL_PARTITION_KEY +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-020-global-partition-key-ignores-any-arguments.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-020-global-partition-key-ignores-any-arguments.sdp.md index ff2b86f8..497accbd 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-020-global-partition-key-ignores-any-arguments.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-020-global-partition-key-ignores-any-arguments.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Global partition key ignores any arguments" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: Global partition key ignores any arguments + +```gwt +Given a createGlobalPartitionKey helper with type argument +When called with orderId "ord-123" +Then the result should equal GLOBAL_PARTITION_KEY +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-021-global-partition-key-returns-same-reference-on-multiple-calls.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-021-global-partition-key-returns-same-reference-on-multiple-calls.sdp.md index 4554f15f..fcc24709 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-021-global-partition-key-returns-same-reference-on-multiple-calls.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-021-global-partition-key-returns-same-reference-on-multiple-calls.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "Global partition key returns same reference on multiple calls" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: Global partition key returns same reference on multiple calls + +```gwt +Given a createGlobalPartitionKey helper +When called multiple times +Then all results should be the same reference as GLOBAL_PARTITION_KEY +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-022-dcb-partition-key-has-name-dcb.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-022-dcb-partition-key-has-name-dcb.sdp.md index b0106fa3..bcfc2085 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-022-dcb-partition-key-has-name-dcb.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-022-dcb-partition-key-has-name-dcb.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "DCB partition key has name 'dcb'" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: DCB partition key has name 'dcb' + +```gwt +Given the feature fixture is in place +When I call createDCBPartitionKey with scope key "tenant:T:entity:Order:ord-123" +Then the partition key name should be "dcb" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-023-dcb-partition-key-uses-scope-key-as-value.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-023-dcb-partition-key-uses-scope-key-as-value.sdp.md index ad65b328..f097ed43 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-023-dcb-partition-key-uses-scope-key-as-value.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-023-dcb-partition-key-uses-scope-key-as-value.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "DCB partition key uses scope key as value" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: DCB partition key uses scope key as value + +```gwt +Given the feature fixture is in place +When I call createDCBPartitionKey with scope key "tenant:T:reservation:res-456" +Then the partition key value should be "tenant:T:reservation:res-456" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-024-dcb-partition-key-handles-various-scope-key-formats.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-024-dcb-partition-key-handles-various-scope-key-formats.sdp.md index 029fb775..c3ef5ade 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-024-dcb-partition-key-handles-various-scope-key-formats.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-024-dcb-partition-key-handles-various-scope-key-formats.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "DCB partition key handles various scope key formats" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature +- outcome: Executable scenario: DCB partition key handles various scope key formats + +```gwt +Given the feature fixture is in place +When I call createDCBPartitionKey with scope key "value" +Then the partition key should be name "dcb" and value "value" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.sdp.md index bff9ed07..86693b10 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: standardized partition key helper functions so that I can ensure consistent partition key generation across projections (test carrier: packages/platform-core/tests/features/behavior/workpool-partitioning/partition-key-helpers.feature) +- actor: a platform developer +- outcome: standardized partition key helper functions so that I can ensure consistent partition key generation across projections diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-001-valid-result-for-config-with-get-partition-key.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-001-valid-result-for-config-with-get-partition-key.sdp.md index 4d5fa551..a5073b88 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-001-valid-result-for-config-with-get-partition-key.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-001-valid-result-for-config-with-get-partition-key.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Valid result for config with getPartitionKey" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Valid result for config with getPartitionKey + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And a command config for "CreateOrder" with projection "orderSummary" using createEntityPartitionKey +When I call validateCommandConfigPartitions +Then the result should be valid +And there should be 0 errors +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-002-valid-result-for-inline-partition-key-function.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-002-valid-result-for-inline-partition-key-function.sdp.md index ea96c160..c300676b 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-002-valid-result-for-inline-partition-key-function.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-002-valid-result-for-inline-partition-key-function.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Valid result for inline partition key function" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Valid result for inline partition key function + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And a command config for "CreateOrder" with projection "orderSummary" using inline function +When I call validateCommandConfigPartitions +Then the result should be valid +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-003-validates-secondary-projections-with-get-partition-key.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-003-validates-secondary-projections-with-get-partition-key.sdp.md index 4e44283e..94760219 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-003-validates-secondary-projections-with-get-partition-key.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-003-validates-secondary-projections-with-get-partition-key.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Validates secondary projections with getPartitionKey" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Validates secondary projections with getPartitionKey + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And a command config with primary projection with getPartitionKey +And secondary projections with getPartitionKey +When I call validateCommandConfigPartitions +Then the result should be valid +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-004-validates-failed-projection-with-get-partition-key.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-004-validates-failed-projection-with-get-partition-key.sdp.md index 2ab5bdcd..97af7e51 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-004-validates-failed-projection-with-get-partition-key.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-004-validates-failed-projection-with-get-partition-key.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Validates failed projection with getPartitionKey" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Validates failed projection with getPartitionKey + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And a command config with primary projection with getPartitionKey +And failed projection with getPartitionKey +When I call validateCommandConfigPartitions +Then the result should be valid +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-005-returns-missing-partition-key-error-for-missing-get-partition-key.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-005-returns-missing-partition-key-error-for-missing-get-partition-key.sdp.md index 1f3c99bb..be880424 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-005-returns-missing-partition-key-error-for-missing-get-partition-key.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-005-returns-missing-partition-key-error-for-missing-get-partition-key.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Returns MISSING_PARTITION_KEY error for missing getPartitionKey" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Returns MISSING_PARTITION_KEY error for missing getPartitionKey + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And a command config for "CreateOrder" with projection "orderSummary" missing getPartitionKey +When I call validateCommandConfigPartitions +Then the result should be invalid +And there should be 1 error +And the error code should be "MISSING_PARTITION_KEY" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-006-includes-projection-name-in-error.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-006-includes-projection-name-in-error.sdp.md index 41ece9c2..985010fc 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-006-includes-projection-name-in-error.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-006-includes-projection-name-in-error.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Includes projection name in error" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Includes projection name in error + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And a command config for "CreateOrder" with projection "orderSummary" missing getPartitionKey +When I call validateCommandConfigPartitions +Then the error projectionName should be "orderSummary" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-007-includes-config-path-in-error.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-007-includes-config-path-in-error.sdp.md index d6c6185c..040e1045 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-007-includes-config-path-in-error.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-007-includes-config-path-in-error.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Includes config path in error" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Includes config path in error + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And a command config for "CreateOrder" with projection "orderSummary" missing getPartitionKey +When I call validateCommandConfigPartitions +Then the error configPath should be "CreateOrder.projection" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-008-suggests-helper-functions-in-error-message.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-008-suggests-helper-functions-in-error-message.sdp.md index 2463269f..80c17573 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-008-suggests-helper-functions-in-error-message.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-008-suggests-helper-functions-in-error-message.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Suggests helper functions in error message" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Suggests helper functions in error message + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And a command config for "CreateOrder" with projection "orderSummary" missing getPartitionKey +When I call validateCommandConfigPartitions +Then the error message should contain "createEntityPartitionKey" +And the error message should contain "createCustomerPartitionKey" +And the error message should contain "createSagaPartitionKey" +And the error message should contain "GLOBAL_PARTITION_KEY" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-009-returns-invalid-partition-key-shape-when-returning-null.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-009-returns-invalid-partition-key-shape-when-returning-null.sdp.md index 2d800dc1..2de569d7 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-009-returns-invalid-partition-key-shape-when-returning-null.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-009-returns-invalid-partition-key-shape-when-returning-null.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns INVALID_PARTITION_KEY_SHAPE when returning null" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Returns INVALID_PARTITION_KEY_SHAPE when returning null + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And a command config with getPartitionKey returning null +When I call validateCommandConfigPartitions +Then the result should be invalid +And the error code should be "INVALID_PARTITION_KEY_SHAPE" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-010-returns-invalid-partition-key-shape-when-returning-wrong-type.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-010-returns-invalid-partition-key-shape-when-returning-wrong-type.sdp.md index d60c098f..3260f7d0 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-010-returns-invalid-partition-key-shape-when-returning-wrong-type.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-010-returns-invalid-partition-key-shape-when-returning-wrong-type.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns INVALID_PARTITION_KEY_SHAPE when returning wrong type" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Returns INVALID_PARTITION_KEY_SHAPE when returning wrong type + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And a command config with getPartitionKey returning a string +When I call validateCommandConfigPartitions +Then the result should be invalid +And the error code should be "INVALID_PARTITION_KEY_SHAPE" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-011-returns-invalid-partition-key-shape-when-missing-name.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-011-returns-invalid-partition-key-shape-when-missing-name.sdp.md index 58f13d16..c5723602 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-011-returns-invalid-partition-key-shape-when-missing-name.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-011-returns-invalid-partition-key-shape-when-missing-name.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns INVALID_PARTITION_KEY_SHAPE when missing name" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Returns INVALID_PARTITION_KEY_SHAPE when missing name + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And a command config with getPartitionKey returning object with only value +When I call validateCommandConfigPartitions +Then the result should be invalid +And the error code should be "INVALID_PARTITION_KEY_SHAPE" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-012-returns-invalid-partition-key-shape-when-missing-value.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-012-returns-invalid-partition-key-shape-when-missing-value.sdp.md index 2c301bb9..e3a3b03f 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-012-returns-invalid-partition-key-shape-when-missing-value.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-012-returns-invalid-partition-key-shape-when-missing-value.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns INVALID_PARTITION_KEY_SHAPE when missing value" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Returns INVALID_PARTITION_KEY_SHAPE when missing value + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And a command config with getPartitionKey returning object with only name +When I call validateCommandConfigPartitions +Then the result should be invalid +And the error code should be "INVALID_PARTITION_KEY_SHAPE" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-013-returns-invalid-partition-key-shape-when-value-is-number.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-013-returns-invalid-partition-key-shape-when-value-is-number.sdp.md index 753b8b19..a6953740 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-013-returns-invalid-partition-key-shape-when-value-is-number.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-013-returns-invalid-partition-key-shape-when-value-is-number.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns INVALID_PARTITION_KEY_SHAPE when value is number" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Returns INVALID_PARTITION_KEY_SHAPE when value is number + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And a command config with getPartitionKey returning value as number +When I call validateCommandConfigPartitions +Then the result should be invalid +And the error code should be "INVALID_PARTITION_KEY_SHAPE" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-014-returns-empty-partition-value-for-empty-string.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-014-returns-empty-partition-value-for-empty-string.sdp.md index 8c7771b6..9e45f903 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-014-returns-empty-partition-value-for-empty-string.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-014-returns-empty-partition-value-for-empty-string.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns EMPTY_PARTITION_VALUE for empty string" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Returns EMPTY_PARTITION_VALUE for empty string + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And a command config with getPartitionKey returning empty string value +When I call validateCommandConfigPartitions +Then the result should be invalid +And the error code should be "EMPTY_PARTITION_VALUE" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-015-returns-empty-partition-value-for-whitespace-only-string.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-015-returns-empty-partition-value-for-whitespace-only-string.sdp.md index 19beadcd..e84dd390 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-015-returns-empty-partition-value-for-whitespace-only-string.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-015-returns-empty-partition-value-for-whitespace-only-string.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Returns EMPTY_PARTITION_VALUE for whitespace-only string" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Returns EMPTY_PARTITION_VALUE for whitespace-only string + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And a command config with getPartitionKey returning whitespace-only value +When I call validateCommandConfigPartitions +Then the result should be invalid +And the error code should be "EMPTY_PARTITION_VALUE" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-016-collects-errors-from-all-projections.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-016-collects-errors-from-all-projections.sdp.md index 1d5e0255..c8a91f38 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-016-collects-errors-from-all-projections.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-016-collects-errors-from-all-projections.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Collects errors from all projections" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Collects errors from all projections + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And a command config with all projections missing getPartitionKey +When I call validateCommandConfigPartitions +Then there should be 3 errors +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-017-reports-correct-config-paths-for-secondary-projections.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-017-reports-correct-config-paths-for-secondary-projections.sdp.md index cee64125..2e8fe1c5 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-017-reports-correct-config-paths-for-secondary-projections.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-017-reports-correct-config-paths-for-secondary-projections.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Reports correct config paths for secondary projections" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Reports correct config paths for secondary projections + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And a command config with valid primary projection +And 2 secondary projections missing getPartitionKey +When I call validateCommandConfigPartitions +Then error 0 configPath should be "CreateOrder.secondaryProjections[0]" +And error 1 configPath should be "CreateOrder.secondaryProjections[1]" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-018-reports-correct-config-path-for-failed-projection.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-018-reports-correct-config-path-for-failed-projection.sdp.md index f506f923..a4252db4 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-018-reports-correct-config-path-for-failed-projection.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-018-reports-correct-config-path-for-failed-projection.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Reports correct config path for failed projection" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Reports correct config path for failed projection + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And a command config with valid primary projection +And failed projection missing getPartitionKey +When I call validateCommandConfigPartitions +Then the error configPath should be "CreateOrder.failedProjection" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-019-does-not-throw-for-valid-configs-array.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-019-does-not-throw-for-valid-configs-array.sdp.md index f9800948..8ca6aa1a 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-019-does-not-throw-for-valid-configs-array.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-019-does-not-throw-for-valid-configs-array.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Does not throw for valid configs array" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Does not throw for valid configs array + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And an array of valid command configs +When I call assertValidPartitionKeys +Then no error should be thrown +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-020-does-not-throw-for-empty-array.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-020-does-not-throw-for-empty-array.sdp.md index 84d89016..5007e29f 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-020-does-not-throw-for-empty-array.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-020-does-not-throw-for-empty-array.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Does not throw for empty array" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Does not throw for empty array + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And an empty array of command configs +When I call assertValidPartitionKeys +Then no error should be thrown +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-021-throws-on-first-invalid-config.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-021-throws-on-first-invalid-config.sdp.md index e2ca5056..0c09e25e 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-021-throws-on-first-invalid-config.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-021-throws-on-first-invalid-config.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Throws on first invalid config" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Throws on first invalid config + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And an array with one invalid command config +When I call assertValidPartitionKeys +Then an error should be thrown with message containing "Partition key validation failed" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-022-includes-all-errors-in-thrown-message.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-022-includes-all-errors-in-thrown-message.sdp.md index a0901407..ac7efa9a 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-022-includes-all-errors-in-thrown-message.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-022-includes-all-errors-in-thrown-message.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Includes all errors in thrown message" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Includes all errors in thrown message + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And an array with 2 invalid command configs +When I call assertValidPartitionKeys +Then an error should be thrown with message containing "2 projection(s)" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-023-includes-error-codes-in-thrown-message.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-023-includes-error-codes-in-thrown-message.sdp.md index 6778ed63..3f215694 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-023-includes-error-codes-in-thrown-message.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-023-includes-error-codes-in-thrown-message.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Includes error codes in thrown message" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Includes error codes in thrown message + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And an array with one config missing getPartitionKey +When I call assertValidPartitionKeys +Then an error should be thrown with message containing "MISSING_PARTITION_KEY" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-024-includes-config-path-in-thrown-message.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-024-includes-config-path-in-thrown-message.sdp.md index 7c64fd23..69cecaf3 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-024-includes-config-path-in-thrown-message.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-024-includes-config-path-in-thrown-message.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Includes config path in thrown message" from packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature +- outcome: Executable scenario: Includes config path in thrown message + +```gwt +Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE +And an array with one config for "CreateOrder" missing getPartitionKey on primary projection +When I call assertValidPartitionKeys +Then an error should be thrown with message containing "CreateOrder.projection" +``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.sdp.md index 3a673c83..52d92d9e 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: command configs validated for partition keys so that missing or invalid partition keys are caught at startup (test carrier: packages/platform-core/tests/features/behavior/workpool-partitioning/partition-validation.feature) +- actor: a platform developer +- outcome: command configs validated for partition keys so that missing or invalid partition keys are caught at startup diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-001-success-creates-output-with-correct-status.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-001-success-creates-output-with-correct-status.sdp.md index a7836f73..fd471742 100644 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-001-success-creates-output-with-correct-status.sdp.md +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-001-success-creates-output-with-correct-status.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "success() creates output with correct status" from packages/platform-decider/tests/features/behavior/decider-outputs.feature +- outcome: Executable scenario: success() creates output with correct status + +```gwt +Given test event types are defined +And test data types are defined +And test state update types are defined +When creating a success output +Then the output status should be "success" +And the output data should have result "ok" +And the output event should have type "TestEvent" +And the output event payload should have testId "123" +And the output stateUpdate should have status "completed" +``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-002-success-includes-all-required-properties.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-002-success-includes-all-required-properties.sdp.md index 949538ae..04ee8118 100644 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-002-success-includes-all-required-properties.sdp.md +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-002-success-includes-all-required-properties.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "success() includes all required properties" from packages/platform-decider/tests/features/behavior/decider-outputs.feature +- outcome: Executable scenario: success() includes all required properties + +```gwt +Given test event types are defined +And test data types are defined +And test state update types are defined +When creating a minimal success output +Then the output should have all required properties: +``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-003-rejected-creates-output-with-code-and-message.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-003-rejected-creates-output-with-code-and-message.sdp.md index 9c01f32f..38a01243 100644 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-003-rejected-creates-output-with-code-and-message.sdp.md +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-003-rejected-creates-output-with-code-and-message.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Executable scenario "rejected() creates output with code and message" from packages/platform-decider/tests/features/behavior/decider-outputs.feature +- outcome: Executable scenario: rejected() creates output with code and message + +```gwt +Given test event types are defined +And test data types are defined +And test state update types are defined +When creating a rejected output with code "TEST_ERROR" and message "Something went wrong" +Then the output status should be "rejected" +And the output code should be "TEST_ERROR" +And the output message should be "Something went wrong" +And the output context should be undefined +``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-004-rejected-includes-context-when-provided.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-004-rejected-includes-context-when-provided.sdp.md index dead3d6e..99ae5399 100644 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-004-rejected-includes-context-when-provided.sdp.md +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-004-rejected-includes-context-when-provided.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "rejected() includes context when provided" from packages/platform-decider/tests/features/behavior/decider-outputs.feature +- outcome: Executable scenario: rejected() includes context when provided + +```gwt +Given test event types are defined +And test data types are defined +And test state update types are defined +When creating a rejected output with code "TEST_ERROR" and message "Something went wrong" and detail "extra info" +Then the output status should be "rejected" +And the output context should have detail "extra info" +``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-005-failed-creates-output-with-reason-and-event.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-005-failed-creates-output-with-reason-and-event.sdp.md index 34ff4c82..d47de35c 100644 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-005-failed-creates-output-with-reason-and-event.sdp.md +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-005-failed-creates-output-with-reason-and-event.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "failed() creates output with reason and event" from packages/platform-decider/tests/features/behavior/decider-outputs.feature +- outcome: Executable scenario: failed() creates output with reason and event + +```gwt +Given test event types are defined +And test data types are defined +And test state update types are defined +When creating a failed output with reason "Operation failed" and eventType "TestEvent" and testId "456" +Then the output status should be "failed" +And the output reason should be "Operation failed" +And the output event should have type "TestEvent" +And the output event payload should have testId "456" +And the output context should be undefined +``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-006-failed-includes-context-when-provided.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-006-failed-includes-context-when-provided.sdp.md index c5bbca49..d48eaa3e 100644 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-006-failed-includes-context-when-provided.sdp.md +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-006-failed-includes-context-when-provided.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "failed() includes context when provided" from packages/platform-decider/tests/features/behavior/decider-outputs.feature +- outcome: Executable scenario: failed() includes context when provided + +```gwt +Given test event types are defined +And test data types are defined +And test state update types are defined +When creating a failed output with reason "Operation failed" and attemptNumber 3 +Then the output status should be "failed" +And the output context should have attemptNumber 3 +``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-007-is-success-returns-true-for-success-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-007-is-success-returns-true-for-success-output.sdp.md index aa2991aa..a6c55653 100644 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-007-is-success-returns-true-for-success-output.sdp.md +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-007-is-success-returns-true-for-success-output.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "isSuccess() returns true for success output" from packages/platform-decider/tests/features/behavior/decider-outputs.feature +- outcome: Executable scenario: isSuccess() returns true for success output + +```gwt +Given test event types are defined +And test data types are defined +And test state update types are defined +And a success output is created +When checking isSuccess on the output +Then the type guard should return true +``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-008-is-success-returns-false-for-rejected-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-008-is-success-returns-false-for-rejected-output.sdp.md index 9c5681e1..c8f61fe8 100644 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-008-is-success-returns-false-for-rejected-output.sdp.md +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-008-is-success-returns-false-for-rejected-output.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "isSuccess() returns false for rejected output" from packages/platform-decider/tests/features/behavior/decider-outputs.feature +- outcome: Executable scenario: isSuccess() returns false for rejected output + +```gwt +Given test event types are defined +And test data types are defined +And test state update types are defined +And a rejected output is created +When checking isSuccess on the output +Then the type guard should return false +``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-009-is-success-returns-false-for-failed-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-009-is-success-returns-false-for-failed-output.sdp.md index ac477ea7..750adbc9 100644 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-009-is-success-returns-false-for-failed-output.sdp.md +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-009-is-success-returns-false-for-failed-output.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "isSuccess() returns false for failed output" from packages/platform-decider/tests/features/behavior/decider-outputs.feature +- outcome: Executable scenario: isSuccess() returns false for failed output + +```gwt +Given test event types are defined +And test data types are defined +And test state update types are defined +And a failed output is created +When checking isSuccess on the output +Then the type guard should return false +``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-010-is-success-enables-type-narrowing.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-010-is-success-enables-type-narrowing.sdp.md index 6c7b0aa5..7e0f06c6 100644 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-010-is-success-enables-type-narrowing.sdp.md +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-010-is-success-enables-type-narrowing.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "isSuccess() enables type narrowing" from packages/platform-decider/tests/features/behavior/decider-outputs.feature +- outcome: Executable scenario: isSuccess() enables type narrowing + +```gwt +Given test event types are defined +And test data types are defined +And test state update types are defined +And a success output is created +When checking isSuccess on the output +Then the output data property should be accessible +``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-011-is-rejected-returns-true-for-rejected-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-011-is-rejected-returns-true-for-rejected-output.sdp.md index c18ec1f1..f42d6d11 100644 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-011-is-rejected-returns-true-for-rejected-output.sdp.md +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-011-is-rejected-returns-true-for-rejected-output.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "isRejected() returns true for rejected output" from packages/platform-decider/tests/features/behavior/decider-outputs.feature +- outcome: Executable scenario: isRejected() returns true for rejected output + +```gwt +Given test event types are defined +And test data types are defined +And test state update types are defined +And a rejected output is created +When checking isRejected on the output +Then the type guard should return true +``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-012-is-rejected-returns-false-for-success-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-012-is-rejected-returns-false-for-success-output.sdp.md index a1eed64d..5714fd9b 100644 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-012-is-rejected-returns-false-for-success-output.sdp.md +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-012-is-rejected-returns-false-for-success-output.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "isRejected() returns false for success output" from packages/platform-decider/tests/features/behavior/decider-outputs.feature +- outcome: Executable scenario: isRejected() returns false for success output + +```gwt +Given test event types are defined +And test data types are defined +And test state update types are defined +And a success output is created +When checking isRejected on the output +Then the type guard should return false +``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-013-is-rejected-returns-false-for-failed-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-013-is-rejected-returns-false-for-failed-output.sdp.md index f11ead43..a57b5fff 100644 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-013-is-rejected-returns-false-for-failed-output.sdp.md +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-013-is-rejected-returns-false-for-failed-output.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "isRejected() returns false for failed output" from packages/platform-decider/tests/features/behavior/decider-outputs.feature +- outcome: Executable scenario: isRejected() returns false for failed output + +```gwt +Given test event types are defined +And test data types are defined +And test state update types are defined +And a failed output is created +When checking isRejected on the output +Then the type guard should return false +``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-014-is-rejected-enables-type-narrowing.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-014-is-rejected-enables-type-narrowing.sdp.md index a13a48da..d60867ec 100644 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-014-is-rejected-enables-type-narrowing.sdp.md +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-014-is-rejected-enables-type-narrowing.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "isRejected() enables type narrowing" from packages/platform-decider/tests/features/behavior/decider-outputs.feature +- outcome: Executable scenario: isRejected() enables type narrowing + +```gwt +Given test event types are defined +And test data types are defined +And test state update types are defined +And a rejected output is created +When checking isRejected on the output +Then the output code property should be accessible +``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-015-is-failed-returns-true-for-failed-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-015-is-failed-returns-true-for-failed-output.sdp.md index 53c881a8..b78a5418 100644 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-015-is-failed-returns-true-for-failed-output.sdp.md +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-015-is-failed-returns-true-for-failed-output.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "isFailed() returns true for failed output" from packages/platform-decider/tests/features/behavior/decider-outputs.feature +- outcome: Executable scenario: isFailed() returns true for failed output + +```gwt +Given test event types are defined +And test data types are defined +And test state update types are defined +And a failed output is created +When checking isFailed on the output +Then the type guard should return true +``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-016-is-failed-returns-false-for-success-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-016-is-failed-returns-false-for-success-output.sdp.md index 852c951c..cf26af4e 100644 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-016-is-failed-returns-false-for-success-output.sdp.md +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-016-is-failed-returns-false-for-success-output.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "isFailed() returns false for success output" from packages/platform-decider/tests/features/behavior/decider-outputs.feature +- outcome: Executable scenario: isFailed() returns false for success output + +```gwt +Given test event types are defined +And test data types are defined +And test state update types are defined +And a success output is created +When checking isFailed on the output +Then the type guard should return false +``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-017-is-failed-returns-false-for-rejected-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-017-is-failed-returns-false-for-rejected-output.sdp.md index 42cb445c..bacc474c 100644 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-017-is-failed-returns-false-for-rejected-output.sdp.md +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-017-is-failed-returns-false-for-rejected-output.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "isFailed() returns false for rejected output" from packages/platform-decider/tests/features/behavior/decider-outputs.feature +- outcome: Executable scenario: isFailed() returns false for rejected output + +```gwt +Given test event types are defined +And test data types are defined +And test state update types are defined +And a rejected output is created +When checking isFailed on the output +Then the type guard should return false +``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-018-is-failed-enables-type-narrowing.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-018-is-failed-enables-type-narrowing.sdp.md index 68258071..ace14f67 100644 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-018-is-failed-enables-type-narrowing.sdp.md +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-018-is-failed-enables-type-narrowing.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "isFailed() enables type narrowing" from packages/platform-decider/tests/features/behavior/decider-outputs.feature +- outcome: Executable scenario: isFailed() enables type narrowing + +```gwt +Given test event types are defined +And test data types are defined +And test state update types are defined +And a failed output is created +When checking isFailed on the output +Then the output reason property should be accessible +``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-019-type-guards-are-mutually-exclusive.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-019-type-guards-are-mutually-exclusive.sdp.md index ff5ea189..97350c6f 100644 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-019-type-guards-are-mutually-exclusive.sdp.md +++ b/specs/behavior/platform-decider/decider-outputs.examples/s-019-type-guards-are-mutually-exclusive.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Type guards are mutually exclusive" from packages/platform-decider/tests/features/behavior/decider-outputs.feature +- outcome: Executable scenario: Type guards are mutually exclusive + +```gwt +Given test event types are defined +And test data types are defined +And test state update types are defined +And a "value" output is created +When the scenario runs +Then exactly one type guard should return true +``` diff --git a/specs/behavior/platform-decider/decider-outputs.sdp.md b/specs/behavior/platform-decider/decider-outputs.sdp.md index fa4cb17a..8a92aef7 100644 --- a/specs/behavior/platform-decider/decider-outputs.sdp.md +++ b/specs/behavior/platform-decider/decider-outputs.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: The Decider pattern uses discriminated unions to represent command outcomes: - success: Command executed, event emitted, state updated - rejected: Business rule violation, no event, clear error code - failed: Unexpected failure, audit event, context preserved (test carrier: packages/platform-decider/tests/features/behavior/decider-outputs.feature) +- outcome: Decider Output Helpers and Type Guards diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md index 796c6205..cc57c06e 100644 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "FSM is created with correct initial state" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature +- outcome: Executable scenario: FSM is created with correct initial state + +```gwt +Given a test FSM with states: draft, submitted, confirmed, cancelled +And initial state is "draft" +And transitions are defined as: +When the FSM is defined +Then the initial state should be "draft" +And the FSM definition should be accessible +``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-002-valid-transitions-are-allowed.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-002-valid-transitions-are-allowed.sdp.md index 32fe3264..c8902f2a 100644 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-002-valid-transitions-are-allowed.sdp.md +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-002-valid-transitions-are-allowed.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Valid transitions are allowed" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature +- outcome: Executable scenario: Valid transitions are allowed + +```gwt +Given a test FSM with states: draft, submitted, confirmed, cancelled +And initial state is "draft" +And transitions are defined as: +When checking if transition from "value" to "value" is valid +Then canTransition should return true +``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-003-assert-transition-does-not-throw-for-valid-transitions.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-003-assert-transition-does-not-throw-for-valid-transitions.sdp.md index 4bf0ae6e..de230cdc 100644 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-003-assert-transition-does-not-throw-for-valid-transitions.sdp.md +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-003-assert-transition-does-not-throw-for-valid-transitions.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "assertTransition does not throw for valid transitions" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature +- outcome: Executable scenario: assertTransition does not throw for valid transitions + +```gwt +Given a test FSM with states: draft, submitted, confirmed, cancelled +And initial state is "draft" +And transitions are defined as: +When asserting transition from "value" to "value" +Then no error should be thrown +``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-004-invalid-transitions-are-detected.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-004-invalid-transitions-are-detected.sdp.md index fd1ef669..45e116f2 100644 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-004-invalid-transitions-are-detected.sdp.md +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-004-invalid-transitions-are-detected.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Invalid transitions are detected" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature +- outcome: Executable scenario: Invalid transitions are detected + +```gwt +Given a test FSM with states: draft, submitted, confirmed, cancelled +And initial state is "draft" +And transitions are defined as: +When checking if transition from "value" to "value" is valid +Then canTransition should return false +``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-005-assert-transition-throws-fsm-transition-error-for-invalid-transitions.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-005-assert-transition-throws-fsm-transition-error-for-invalid-transitions.sdp.md index 32195910..db95bc97 100644 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-005-assert-transition-throws-fsm-transition-error-for-invalid-transitions.sdp.md +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-005-assert-transition-throws-fsm-transition-error-for-invalid-transitions.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Executable scenario "assertTransition throws FSMTransitionError for invalid transitions" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature +- outcome: Executable scenario: assertTransition throws FSMTransitionError for invalid transitions + +```gwt +Given a test FSM with states: draft, submitted, confirmed, cancelled +And initial state is "draft" +And transitions are defined as: +When asserting transition from "draft" to "confirmed" +Then an FSMTransitionError should be thrown +And the error should have from state "draft" +And the error should have to state "confirmed" +And the error should have valid transitions "submitted, cancelled" +And the error code should be "FSM_INVALID_TRANSITION" +``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-006-terminal-states-are-correctly-identified.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-006-terminal-states-are-correctly-identified.sdp.md index b88e86a6..9a1e42eb 100644 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-006-terminal-states-are-correctly-identified.sdp.md +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-006-terminal-states-are-correctly-identified.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Terminal states are correctly identified" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature +- outcome: Executable scenario: Terminal states are correctly identified + +```gwt +Given a test FSM with states: draft, submitted, confirmed, cancelled +And initial state is "draft" +And transitions are defined as: +When checking if "value" is terminal +Then isTerminal should return "value" +``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-007-terminal-state-error-message-indicates-no-valid-transitions.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-007-terminal-state-error-message-indicates-no-valid-transitions.sdp.md index f1f42c57..111206c4 100644 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-007-terminal-state-error-message-indicates-no-valid-transitions.sdp.md +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-007-terminal-state-error-message-indicates-no-valid-transitions.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "Terminal state error message indicates no valid transitions" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature +- outcome: Executable scenario: Terminal state error message indicates no valid transitions + +```gwt +Given a test FSM with states: draft, submitted, confirmed, cancelled +And initial state is "draft" +And transitions are defined as: +And the FSM is in state "confirmed" +When asserting transition from "confirmed" to "draft" +Then an FSMTransitionError should be thrown +And the error message should contain "(none - terminal state)" +``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-008-state-validity-is-correctly-checked.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-008-state-validity-is-correctly-checked.sdp.md index aca9e166..7fa9cf2b 100644 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-008-state-validity-is-correctly-checked.sdp.md +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-008-state-validity-is-correctly-checked.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "State validity is correctly checked" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature +- outcome: Executable scenario: State validity is correctly checked + +```gwt +Given a test FSM with states: draft, submitted, confirmed, cancelled +And initial state is "draft" +And transitions are defined as: +When checking if "value" is a valid state +Then isValidState should return "value" +``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-009-valid-transitions-can-be-queried-for-any-state.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-009-valid-transitions-can-be-queried-for-any-state.sdp.md index 3bc02fac..b42205a3 100644 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-009-valid-transitions-can-be-queried-for-any-state.sdp.md +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-009-valid-transitions-can-be-queried-for-any-state.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Valid transitions can be queried for any state" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature +- outcome: Executable scenario: Valid transitions can be queried for any state + +```gwt +Given a test FSM with states: draft, submitted, confirmed, cancelled +And initial state is "draft" +And transitions are defined as: +When querying valid transitions from "value" +Then the result should be "value" +``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-010-standalone-functions-work-identically-to-fsm-methods.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-010-standalone-functions-work-identically-to-fsm-methods.sdp.md index 5c389969..94c938ab 100644 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-010-standalone-functions-work-identically-to-fsm-methods.sdp.md +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-010-standalone-functions-work-identically-to-fsm-methods.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Standalone functions work identically to FSM methods" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature +- outcome: Executable scenario: Standalone functions work identically to FSM methods + +```gwt +Given a test FSM with states: draft, submitted, confirmed, cancelled +And initial state is "draft" +And transitions are defined as: +And the standalone canTransition function +When checking "value" to "value" with standalone function +Then the result should be "value" +``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-011-standalone-assert-transition-throws-same-errors.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-011-standalone-assert-transition-throws-same-errors.sdp.md index 5db99f1b..86ab1963 100644 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-011-standalone-assert-transition-throws-same-errors.sdp.md +++ b/specs/behavior/platform-fsm/fsm-transitions.examples/s-011-standalone-assert-transition-throws-same-errors.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Standalone assertTransition throws same errors" from packages/platform-fsm/tests/features/behavior/fsm-transitions.feature +- outcome: Executable scenario: Standalone assertTransition throws same errors + +```gwt +Given a test FSM with states: draft, submitted, confirmed, cancelled +And initial state is "draft" +And transitions are defined as: +And the standalone assertTransition function +When asserting "draft" to "confirmed" with standalone function +Then an FSMTransitionError should be thrown +``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.sdp.md index 33750e48..f3eb702c 100644 --- a/specs/behavior/platform-fsm/fsm-transitions.sdp.md +++ b/specs/behavior/platform-fsm/fsm-transitions.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: The FSM (Finite State Machine) module provides type-safe state management with explicit transition rules. It prevents invalid state transitions at runtime while providing clear error messages. This is a core infrastructure pattern used by aggregates to enforce (test carrier: packages/platform-fsm/tests/features/behavior/fsm-transitions.feature) +- outcome: FSM State Transitions diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-001-event-store-client-exposes-no-event-update-api.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-001-event-store-client-exposes-no-event-update-api.sdp.md index 04de96e5..3261ec94 100644 --- a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-001-event-store-client-exposes-no-event-update-api.sdp.md +++ b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-001-event-store-client-exposes-no-event-update-api.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Event Store client exposes no event-update API" from packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature +- outcome: Executable scenario: Event Store client exposes no event-update API + +```gwt +Given the platform-store EventStore client is available +And the EventStore client surface +When inspecting its exported operations +Then no operation mutates a previously-appended event +``` diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-002-event-store-client-exposes-no-event-delete-api.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-002-event-store-client-exposes-no-event-delete-api.sdp.md index 95956330..f4fb5e63 100644 --- a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-002-event-store-client-exposes-no-event-delete-api.sdp.md +++ b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-002-event-store-client-exposes-no-event-delete-api.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Event Store client exposes no event-delete API" from packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature +- outcome: Executable scenario: Event Store client exposes no event-delete API + +```gwt +Given the platform-store EventStore client is available +And the EventStore client surface +When inspecting its exported operations +Then no operation deletes a previously-appended event +``` diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-003-first-append-to-a-new-stream-produces-version-1.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-003-first-append-to-a-new-stream-produces-version-1.sdp.md index 119b6bf2..4b2f9256 100644 --- a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-003-first-append-to-a-new-stream-produces-version-1.sdp.md +++ b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-003-first-append-to-a-new-stream-produces-version-1.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "First append to a new stream produces version 1" from packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature +- outcome: Executable scenario: First append to a new stream produces version 1 + +```gwt +Given the platform-store EventStore client is available +And a stream "Order" with id "ord-stub-1" that does not exist +When appending an event with expectedVersion 0 +Then the new stream version is 1 +``` diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-004-subsequent-appends-increment-the-stream-version-monotonically.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-004-subsequent-appends-increment-the-stream-version-monotonically.sdp.md index 8c88d188..aab581cc 100644 --- a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-004-subsequent-appends-increment-the-stream-version-monotonically.sdp.md +++ b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-004-subsequent-appends-increment-the-stream-version-monotonically.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "Subsequent appends increment the stream version monotonically" from packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature +- outcome: Executable scenario: Subsequent appends increment the stream version monotonically + +```gwt +Given the platform-store EventStore client is available +And a stream "Order" with id "ord-stub-1" at version 1 +When appending another event with expectedVersion 1 +Then the new stream version is 2 +``` diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-005-global-position-is-unique-across-two-streams.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-005-global-position-is-unique-across-two-streams.sdp.md index c03d51ae..5414f26c 100644 --- a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-005-global-position-is-unique-across-two-streams.sdp.md +++ b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-005-global-position-is-unique-across-two-streams.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "globalPosition is unique across two streams" from packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature +- outcome: Executable scenario: globalPosition is unique across two streams + +```gwt +Given the platform-store EventStore client is available +And an event appended to stream "Order/ord-A" +And an event appended to stream "Order/ord-B" +When the scenario runs +Then both events have distinct globalPosition values +``` diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-006-global-position-increases-monotonically-within-a-stream.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-006-global-position-increases-monotonically-within-a-stream.sdp.md index e3b9b3b3..486475d8 100644 --- a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-006-global-position-increases-monotonically-within-a-stream.sdp.md +++ b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-006-global-position-increases-monotonically-within-a-stream.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Executable scenario "globalPosition increases monotonically within a stream" from packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature +- outcome: Executable scenario: globalPosition increases monotonically within a stream + +```gwt +Given the platform-store EventStore client is available +And two events appended sequentially to stream "Order/ord-C" +When the scenario runs +Then the second event's globalPosition is greater than the first +``` diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-007-successful-append-with-matching-version.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-007-successful-append-with-matching-version.sdp.md index 073c2218..c5d95da5 100644 --- a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-007-successful-append-with-matching-version.sdp.md +++ b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-007-successful-append-with-matching-version.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "Successful append with matching version" from packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature +- outcome: Executable scenario: Successful append with matching version + +```gwt +Given the platform-store EventStore client is available +And a stream "Order" with id "ord-123" at version 5 +When appending an event with expectedVersion 5 +Then the append succeeds +And the stream version becomes 6 +And the event receives a globalPosition +``` diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-008-conflict-on-version-mismatch.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-008-conflict-on-version-mismatch.sdp.md index e1a10f9b..839e6bec 100644 --- a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-008-conflict-on-version-mismatch.sdp.md +++ b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-008-conflict-on-version-mismatch.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Conflict on version mismatch" from packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature +- outcome: Executable scenario: Conflict on version mismatch + +```gwt +Given the platform-store EventStore client is available +And a stream "Order" with id "ord-123" at version 5 +When appending an event with expectedVersion 3 +Then the append returns status "conflict" +And the response includes currentVersion 5 +``` diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-009-projection-resumes-from-checkpoint.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-009-projection-resumes-from-checkpoint.sdp.md index 814d1e52..733311b8 100644 --- a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-009-projection-resumes-from-checkpoint.sdp.md +++ b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-009-projection-resumes-from-checkpoint.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "Projection resumes from checkpoint" from packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature +- outcome: Executable scenario: Projection resumes from checkpoint + +```gwt +Given the platform-store EventStore client is available +And a projection with lastProcessedPosition 1000 +When reading events from position 1001 +Then only events with globalPosition > 1000 are returned +And events are ordered by globalPosition ascending +``` diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.sdp.md index d4661c4e..219b75cc 100644 --- a/specs/behavior/platform-store/event-store-foundation-executable-tests.sdp.md +++ b/specs/behavior/platform-store/event-store-foundation-executable-tests.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: **Provenance:** This file was authored under the refactoring carve-out to expose EventStoreFoundation in the PatternGraph. The pattern was originally implemented before the `@architect-implements:` convention. Rule invariants and rationales below are transferred verbatim from (test carrier: packages/platform-store/tests/features/behavior/event-store-foundation-executable-tests.feature) +- outcome: EventStoreFoundation Executable Tests + +## Behavior + +- rule: Events are immutable once appended +- rule: Streams provide per-entity ordering via version numbers +- rule: globalPosition enables total ordering across all streams +- rule: OCC prevents concurrent modification conflicts +- rule: Checkpoints enable projection resumption with exactly-once semantics diff --git a/specs/behavior/platform-store/event-store-types.examples/s-001-event-category-supports-all-taxonomy-values.sdp.md b/specs/behavior/platform-store/event-store-types.examples/s-001-event-category-supports-all-taxonomy-values.sdp.md index 917f4fa6..b6298dc6 100644 --- a/specs/behavior/platform-store/event-store-types.examples/s-001-event-category-supports-all-taxonomy-values.sdp.md +++ b/specs/behavior/platform-store/event-store-types.examples/s-001-event-category-supports-all-taxonomy-values.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Executable scenario "EventCategory supports all taxonomy values" from packages/platform-store/tests/features/behavior/event-store-types.feature +- outcome: Executable scenario: EventCategory supports all taxonomy values + +```gwt +Given the event store type definitions are available +When validating EventCategory type values +Then all Phase 9 taxonomy values should be valid: +``` diff --git a/specs/behavior/platform-store/event-store-types.examples/s-002-event-input-requires-core-event-fields.sdp.md b/specs/behavior/platform-store/event-store-types.examples/s-002-event-input-requires-core-event-fields.sdp.md index d13fc3f0..f3a56bcb 100644 --- a/specs/behavior/platform-store/event-store-types.examples/s-002-event-input-requires-core-event-fields.sdp.md +++ b/specs/behavior/platform-store/event-store-types.examples/s-002-event-input-requires-core-event-fields.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "EventInput requires core event fields" from packages/platform-store/tests/features/behavior/event-store-types.feature +- outcome: Executable scenario: EventInput requires core event fields + +```gwt +Given the event store type definitions are available +And an EventInput with required fields: +When the EventInput structure is validated +Then the EventInput should have eventId "evt-123" +And the EventInput should have eventType "OrderCreated" +And the EventInput should have a payload object +``` diff --git a/specs/behavior/platform-store/event-store-types.examples/s-003-event-input-supports-optional-category-and-schema-version.sdp.md b/specs/behavior/platform-store/event-store-types.examples/s-003-event-input-supports-optional-category-and-schema-version.sdp.md index 0407dea8..9d302a69 100644 --- a/specs/behavior/platform-store/event-store-types.examples/s-003-event-input-supports-optional-category-and-schema-version.sdp.md +++ b/specs/behavior/platform-store/event-store-types.examples/s-003-event-input-supports-optional-category-and-schema-version.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "EventInput supports optional category and schemaVersion" from packages/platform-store/tests/features/behavior/event-store-types.feature +- outcome: Executable scenario: EventInput supports optional category and schemaVersion + +```gwt +Given the event store type definitions are available +And an EventInput with optional Phase 9 fields: +When the EventInput structure is validated +Then the EventInput should have category "domain" +And the EventInput should have schemaVersion 2 +``` diff --git a/specs/behavior/platform-store/event-store-types.examples/s-004-event-input-supports-metadata-with-correlation-tracking.sdp.md b/specs/behavior/platform-store/event-store-types.examples/s-004-event-input-supports-metadata-with-correlation-tracking.sdp.md index 8137655d..427e7028 100644 --- a/specs/behavior/platform-store/event-store-types.examples/s-004-event-input-supports-metadata-with-correlation-tracking.sdp.md +++ b/specs/behavior/platform-store/event-store-types.examples/s-004-event-input-supports-metadata-with-correlation-tracking.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "EventInput supports metadata with correlation tracking" from packages/platform-store/tests/features/behavior/event-store-types.feature +- outcome: Executable scenario: EventInput supports metadata with correlation tracking + +```gwt +Given the event store type definitions are available +And an EventInput with metadata: +When the EventInput structure is validated +Then the EventInput metadata should have correlationId "corr-abc" +And the EventInput metadata should have causationId "cmd-def" +And the EventInput metadata should have userId "user-123" +``` diff --git a/specs/behavior/platform-store/event-store-types.examples/s-005-stored-event-includes-all-required-storage-fields.sdp.md b/specs/behavior/platform-store/event-store-types.examples/s-005-stored-event-includes-all-required-storage-fields.sdp.md index 1441c48d..3938afd2 100644 --- a/specs/behavior/platform-store/event-store-types.examples/s-005-stored-event-includes-all-required-storage-fields.sdp.md +++ b/specs/behavior/platform-store/event-store-types.examples/s-005-stored-event-includes-all-required-storage-fields.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Executable scenario "StoredEvent includes all required storage fields" from packages/platform-store/tests/features/behavior/event-store-types.feature +- outcome: Executable scenario: StoredEvent includes all required storage fields + +```gwt +Given the event store type definitions are available +And a StoredEvent with all required fields +When the StoredEvent structure is validated +Then the StoredEvent should have stream identity fields: +And the StoredEvent should have version tracking fields: +And the StoredEvent should have Phase 9 taxonomy fields: +And the StoredEvent should have correlation tracking: +``` diff --git a/specs/behavior/platform-store/event-store-types.examples/s-006-append-result-success-includes-event-positions.sdp.md b/specs/behavior/platform-store/event-store-types.examples/s-006-append-result-success-includes-event-positions.sdp.md index 6117d6a8..d4b40212 100644 --- a/specs/behavior/platform-store/event-store-types.examples/s-006-append-result-success-includes-event-positions.sdp.md +++ b/specs/behavior/platform-store/event-store-types.examples/s-006-append-result-success-includes-event-positions.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Executable scenario "AppendResult success includes event positions" from packages/platform-store/tests/features/behavior/event-store-types.feature +- outcome: Executable scenario: AppendResult success includes event positions + +```gwt +Given the event store type definitions are available +And an AppendResult with status "success" +When the AppendResult structure is validated +Then the result should have eventIds array +And the result should have globalPositions array +And the result should have newVersion number +``` diff --git a/specs/behavior/platform-store/event-store-types.examples/s-007-append-result-conflict-includes-current-version.sdp.md b/specs/behavior/platform-store/event-store-types.examples/s-007-append-result-conflict-includes-current-version.sdp.md index 5c48ba25..5931b183 100644 --- a/specs/behavior/platform-store/event-store-types.examples/s-007-append-result-conflict-includes-current-version.sdp.md +++ b/specs/behavior/platform-store/event-store-types.examples/s-007-append-result-conflict-includes-current-version.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Executable scenario "AppendResult conflict includes current version" from packages/platform-store/tests/features/behavior/event-store-types.feature +- outcome: Executable scenario: AppendResult conflict includes current version + +```gwt +Given the event store type definitions are available +And an AppendResult with status "conflict" +When the AppendResult structure is validated +Then the result should have currentVersion number +And the result should not have eventIds +``` diff --git a/specs/behavior/platform-store/event-store-types.sdp.md b/specs/behavior/platform-store/event-store-types.sdp.md index c5295666..07d79079 100644 --- a/specs/behavior/platform-store/event-store-types.sdp.md +++ b/specs/behavior/platform-store/event-store-types.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: The platform-store package exports type definitions for event store operations. These types define the contract between the EventStore client and consuming applications. Type contracts ensure: - EventInput captures all data needed to append an event (test carrier: packages/platform-store/tests/features/behavior/event-store-types.feature) +- outcome: Event Store Type Contracts diff --git a/specs/codec-driven-reference-generation.sdp.md b/specs/codec-driven-reference-generation.sdp.md index 033ec3f2..818cbfbc 100644 --- a/specs/codec-driven-reference-generation.sdp.md +++ b/specs/codec-driven-reference-generation.sdp.md @@ -5,8 +5,20 @@ altitude: feature readiness: idea relations: {} --- -# Codec-driven reference generation +# Codec-Driven Reference Generation ## Intent -- outcome: Generate API/reference docs from codecs and source annotations so documentation tracks the live contract. +- outcome: Reference documentation is specified via 11 recipe '.feature' files in 'architect/recipes/'. Each recipe contains a Source Mapping table (static configuration) and Rule blocks (durable content). But recipes are configuration masquerading as feature files — no scenarios execute, no BDD benefit exists. The Source Mapping is static and the Rule blocks are durable knowledge that belongs in decision records. +- problem: Reference documentation is specified via 11 recipe '.feature' files in 'architect/recipes/'. Each recipe contains a Source Mapping table (static configuration) and Rule blocks (durable content). But recipes are configuration masquerading as feature files — no scenarios execute, no BDD benefit exists. The Source Mapping is static and the Rule blocks are durable knowledge that belongs in decision records. +- value: Replace recipe files with a parameterized 'ReferenceDocumentCodec' that composes reference documents from convention-tagged decision records, TypeScript shape extractions, and behavior spec content. The Source Mapping becomes a TypeScript config object registered in the existing 'GeneratorRegistry'. Recipe Rule blocks migrate to decision records tagged '@architect-convention'. + +## Behavior + +- rule: Reference documents are generated by a parameterized codec +- rule: Convention content is extracted from tagged decision records +- rule: Reference codec handles missing or empty sources gracefully +- rule: Each reference generator produces dual output via DetailLevel +- rule: Reference generators are discovered via the existing registry +- rule: Convention tag values classify decision records by topic +- rule: Recipe Rule blocks are migrated to convention-tagged decision records diff --git a/specs/decisions/pdr-001-process-decisions-folder.sdp.md b/specs/decisions/pdr-001-process-decisions-folder.sdp.md index 62365d67..d0bdacc4 100644 --- a/specs/decisions/pdr-001-process-decisions-folder.sdp.md +++ b/specs/decisions/pdr-001-process-decisions-folder.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-001 Process decisions live in a dedicated decisions folder +# PDR-001 - Process Decisions Live in /libar-platform/architect/decisions/ ## Intent -- outcome: Keep monorepo process decisions (PDRs) separate from package ADRs in a dedicated decisions corpus. +- outcome: PDR-001 - Process Decisions Live in /libar-platform/architect/decisions/ ## Decision -- decision: Process Decision Records for the monorepo live as first-class decision Specs (historically under architect/decisions/ as pdr-NNN-*.feature). +- decision: PDR-001 - Process Decisions Live in /libar-platform/architect/decisions/ diff --git a/specs/decisions/pdr-002-release-management-architecture.sdp.md b/specs/decisions/pdr-002-release-management-architecture.sdp.md index 6691063b..219c68b7 100644 --- a/specs/decisions/pdr-002-release-management-architecture.sdp.md +++ b/specs/decisions/pdr-002-release-management-architecture.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-002 Release management architecture +# PDR-002 - Release Management Architecture ## Intent -- outcome: Organize delivery around releases as the external unit of ship, not internal phases. +- outcome: PDR-002 - Release Management Architecture ## Decision -- decision: Adopt a minimal release-management architecture: release Specs name shipped/unreleased scope; release authority stays explicit; phases map many-to-one onto releases. +- decision: PDR-002 - Release Management Architecture diff --git a/specs/decisions/pdr-003-behavior-feature-file-structure.sdp.md b/specs/decisions/pdr-003-behavior-feature-file-structure.sdp.md index fc2208e6..650be18f 100644 --- a/specs/decisions/pdr-003-behavior-feature-file-structure.sdp.md +++ b/specs/decisions/pdr-003-behavior-feature-file-structure.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-003 Behavior Spec structure +# PDR-003 - Behavior Feature File Structure ## Intent -- outcome: Separate durable requirements from release/process tracking metadata. +- outcome: PDR-003 - Behavior Feature File Structure ## Decision -- decision: Specs carry WHAT (requirements and acceptance intent); release association and process metadata live elsewhere so Specs can evolve independently. +- decision: PDR-003 - Behavior Feature File Structure diff --git a/specs/decisions/pdr-004-unified-tag-prefix-architecture.sdp.md b/specs/decisions/pdr-004-unified-tag-prefix-architecture.sdp.md index 1954cda3..d40728a4 100644 --- a/specs/decisions/pdr-004-unified-tag-prefix-architecture.sdp.md +++ b/specs/decisions/pdr-004-unified-tag-prefix-architecture.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-004 Unified tag prefix architecture +# PDR-004 - Unified Tag Prefix Architecture ## Intent -- outcome: Eliminate dual tag-prefix mental models for process and docs metadata. +- outcome: PDR-004 - Unified Tag Prefix Architecture ## Decision -- decision: All architect-era process tags use a unified @architect-* prefix; unprefixed BDD tags remain for acceptance/happy-path style markers. +- decision: PDR-004 - Unified Tag Prefix Architecture diff --git a/specs/decisions/pdr-005-mvp-workflow.sdp.md b/specs/decisions/pdr-005-mvp-workflow.sdp.md index 0bf11c77..76f335b0 100644 --- a/specs/decisions/pdr-005-mvp-workflow.sdp.md +++ b/specs/decisions/pdr-005-mvp-workflow.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-005 MVP workflow state machine +# PDR-005 - MVP Workflow State Machine ## Intent -- outcome: Give work-item status one enforceable lifecycle instead of overlapping free-text statuses. +- outcome: PDR-005 - MVP Workflow State Machine ## Decision -- decision: Adopt a phase-state-machine with Decider enforcement: roadmap → active → completed, with deferred as an explicit park state and validated transitions only. +- decision: PDR-005 - MVP Workflow State Machine diff --git a/specs/decisions/pdr-006-typescript-sourced-taxonomy.sdp.md b/specs/decisions/pdr-006-typescript-sourced-taxonomy.sdp.md index fccfa745..b30fae2b 100644 --- a/specs/decisions/pdr-006-typescript-sourced-taxonomy.sdp.md +++ b/specs/decisions/pdr-006-typescript-sourced-taxonomy.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-006 TypeScript-sourced taxonomy +# PDR-006 - TypeScript-Sourced Taxonomy ## Intent -- outcome: Make taxonomy compile-time truth instead of hand-edited JSON registries. +- outcome: PDR-006 - TypeScript-Sourced Taxonomy ## Decision -- decision: TypeScript modules are the source of truth for tag/category taxonomy; generated docs and registries are projections. +- decision: PDR-006 - TypeScript-Sourced Taxonomy diff --git a/specs/decisions/pdr-007-two-tier-spec-architecture.sdp.md b/specs/decisions/pdr-007-two-tier-spec-architecture.sdp.md index 51829b0b..d7ed68b0 100644 --- a/specs/decisions/pdr-007-two-tier-spec-architecture.sdp.md +++ b/specs/decisions/pdr-007-two-tier-spec-architecture.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-007 Two-tier Spec architecture +# PDR-007 Two-Tier Spec Architecture ## Intent -- outcome: Separate planning Specs from implementation-proof Specs without conflating the two jobs. +- outcome: PDR-007 Two-Tier Spec Architecture ## Decision -- decision: Establish two tiers: plan/tracking Specs for what to build, and implementation-proof carriers for how it works under test — with clear ownership boundaries. +- decision: PDR-007 Two-Tier Spec Architecture diff --git a/specs/decisions/pdr-008-example-app-purpose.sdp.md b/specs/decisions/pdr-008-example-app-purpose.sdp.md index 12895c8b..9429f304 100644 --- a/specs/decisions/pdr-008-example-app-purpose.sdp.md +++ b/specs/decisions/pdr-008-example-app-purpose.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-008 Example app purpose and guidelines +# PDR-008 Example App Purpose and Guidelines ## Intent -- outcome: Keep the example app oriented to platform development, not a standalone product roadmap. +- outcome: PDR-008 Example App Purpose and Guidelines ## Decision -- decision: The example app exists to serve platform development: features demonstrate platform capabilities; completeness is secondary to demonstration value. +- decision: PDR-008 Example App Purpose and Guidelines diff --git a/specs/decisions/pdr-009-design-session-methodology.sdp.md b/specs/decisions/pdr-009-design-session-methodology.sdp.md index 19212a8b..a57dde6a 100644 --- a/specs/decisions/pdr-009-design-session-methodology.sdp.md +++ b/specs/decisions/pdr-009-design-session-methodology.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-009 Design session methodology +# PDR-009 Design Session Methodology ## Intent -- outcome: Bridge plan-level Specs to implementation via design-session outputs without breaking the main tree. +- outcome: PDR-009 Design Session Methodology ## Decision -- decision: Design sessions produce HOW decisions and interface contracts; stubs live outside production source folders so compilation and lint stay green. +- decision: PDR-009 Design Session Methodology diff --git a/specs/decisions/pdr-010-cross-component-argument-injection.sdp.md b/specs/decisions/pdr-010-cross-component-argument-injection.sdp.md index 2a624d48..c64ee689 100644 --- a/specs/decisions/pdr-010-cross-component-argument-injection.sdp.md +++ b/specs/decisions/pdr-010-cross-component-argument-injection.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-010 Cross-component argument injection +# PDR-010 Cross-Component Argument Injection Pattern ## Intent -- outcome: Preserve Convex component isolation when handlers need data from outside their boundary. +- outcome: PDR-010 Cross-Component Argument Injection Pattern ## Decision -- decision: App-level callers load cross-boundary data and pass it as arguments into component handlers; handlers never reach into another component's tables. +- decision: PDR-010 Cross-Component Argument Injection Pattern diff --git a/specs/decisions/pdr-011-agent-action-handler-architecture.sdp.md b/specs/decisions/pdr-011-agent-action-handler-architecture.sdp.md index b596f790..4daf7dfc 100644 --- a/specs/decisions/pdr-011-agent-action-handler-architecture.sdp.md +++ b/specs/decisions/pdr-011-agent-action-handler-architecture.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-011 Agent action handler architecture +# PDR-011 Agent Action Handler Architecture ## Intent -- outcome: Allow agent handlers to call LLMs without violating Convex mutation constraints. +- outcome: PDR-011 Agent Action Handler Architecture ## Decision -- decision: Agent event processing splits into an action phase (analysis/LLM, no DB writes) and an onComplete mutation (atomic persistence with OCC); supersedes single-mutation handlers. +- decision: PDR-011 Agent Action Handler Architecture diff --git a/specs/decisions/pdr-012-agent-command-routing.sdp.md b/specs/decisions/pdr-012-agent-command-routing.sdp.md index dc7b386c..efa3200a 100644 --- a/specs/decisions/pdr-012-agent-command-routing.sdp.md +++ b/specs/decisions/pdr-012-agent-command-routing.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-012 Agent command routing and pattern unification +# PDR-012 Agent Command Routing & Pattern Unification ## Intent -- outcome: Route agent-emitted commands through the CommandOrchestrator and unify pattern detection. +- outcome: PDR-012 Agent Command Routing & Pattern Unification ## Decision -- decision: Agent commands bridge via Workpool from onComplete into CommandOrchestrator; PatternDefinition is the single source of truth for trigger and analysis. +- decision: PDR-012 Agent Command Routing & Pattern Unification diff --git a/specs/decisions/pdr-013-agent-lifecycle-fsm.sdp.md b/specs/decisions/pdr-013-agent-lifecycle-fsm.sdp.md index 4ecfc226..0d7eff01 100644 --- a/specs/decisions/pdr-013-agent-lifecycle-fsm.sdp.md +++ b/specs/decisions/pdr-013-agent-lifecycle-fsm.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-013 Agent lifecycle FSM +# PDR-013 Agent Lifecycle FSM ## Intent -- outcome: Govern agent start/pause/resume/stop/reconfigure with a formal lifecycle FSM. +- outcome: PDR-013 Agent Lifecycle FSM ## Decision -- decision: Lifecycle transitions follow the event-driven Map pattern with checkpoint status as source of truth; lifecycle commands are infrastructure mutations, not CommandOrchestrator traffic. +- decision: PDR-013 Agent Lifecycle FSM diff --git a/specs/decisions/pdr-014-component-boundary-authentication-convention.sdp.md b/specs/decisions/pdr-014-component-boundary-authentication-convention.sdp.md index e7555ad4..01be321d 100644 --- a/specs/decisions/pdr-014-component-boundary-authentication-convention.sdp.md +++ b/specs/decisions/pdr-014-component-boundary-authentication-convention.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-014 Component-boundary authentication convention +# PDR-014 - Component-Boundary Authentication Convention ## Intent -- outcome: Close the trust gap when Convex does not carry ctx.auth across component boundaries. +- outcome: PDR-014 - Component-Boundary Authentication Convention ## Decision -- decision: Every identity-bearing component mutation accepts a canonical verificationProof and calls verifyActor() inside the component before reading or writing component state. +- decision: PDR-014 - Component-Boundary Authentication Convention diff --git a/specs/decisions/pdr-015-global-position-numeric-representation.sdp.md b/specs/decisions/pdr-015-global-position-numeric-representation.sdp.md index ca794624..4a8e055e 100644 --- a/specs/decisions/pdr-015-global-position-numeric-representation.sdp.md +++ b/specs/decisions/pdr-015-global-position-numeric-representation.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-015 globalPosition numeric representation +# PDR-015 - globalPosition Numeric Representation ## Intent -- outcome: Keep event ordering exact without exceeding Number.MAX_SAFE_INTEGER. +- outcome: PDR-015 - globalPosition Numeric Representation ## Decision -- decision: Adopt a canonical safe numeric (or otherwise exact) representation for globalPosition so checkpoint and replay comparisons stay lossless. +- decision: PDR-015 - globalPosition Numeric Representation diff --git a/specs/decisions/pdr-016-projection-pool-split-named-pools-per-concern.sdp.md b/specs/decisions/pdr-016-projection-pool-split-named-pools-per-concern.sdp.md index b61ff6e3..3f67240b 100644 --- a/specs/decisions/pdr-016-projection-pool-split-named-pools-per-concern.sdp.md +++ b/specs/decisions/pdr-016-projection-pool-split-named-pools-per-concern.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-016 Projection pool split into named pools +# PDR-016 - projectionPool Split into Named Pools per Concern ## Intent -- outcome: Isolate async traffic classes so projection work does not contend as one shared pool. +- outcome: PDR-016 - projectionPool Split into Named Pools per Concern ## Decision -- decision: Split projectionPool into named pools per concern so tranche-2 async traffic classes stay isolated and operable. +- decision: PDR-016 - projectionPool Split into Named Pools per Concern diff --git a/specs/decisions/pdr-017-tranche-3-platform-architecture-gate.sdp.md b/specs/decisions/pdr-017-tranche-3-platform-architecture-gate.sdp.md index 7b8ca30e..3b6d93e6 100644 --- a/specs/decisions/pdr-017-tranche-3-platform-architecture-gate.sdp.md +++ b/specs/decisions/pdr-017-tranche-3-platform-architecture-gate.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-017 Tranche 3 platform architecture gate +# PDR-017 - Tranche 3 Platform Architecture Gate ## Intent -- outcome: Gate tranche-3 remediation behind explicit architecture answers before implementation sprawls. +- outcome: PDR-017 - Tranche 3 Platform Architecture Gate ## Decision -- decision: Tranche-3 work proceeds only after design-gate answers for the three remediation kinds are recorded and accepted. +- decision: PDR-017 - Tranche 3 Platform Architecture Gate diff --git a/specs/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.sdp.md b/specs/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.sdp.md index 38c5c990..13fb8333 100644 --- a/specs/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.sdp.md +++ b/specs/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-018 Idempotency enforcement for appendToStream +# PDR-018 - Idempotency Enforcement for appendToStream ## Intent -- outcome: Make advertised event idempotency real on the append path. +- outcome: PDR-018 - Idempotency Enforcement for appendToStream ## Decision -- decision: For every event with an idempotencyKey, appendToStream enforces a semantic fingerprint and rejects or deduplicates conflicting appends instead of treating the key as write-only metadata. +- decision: PDR-018 - Idempotency Enforcement for appendToStream diff --git a/specs/decisions/pdr-019-v-any-vs-v-unknown-boundary-policy.sdp.md b/specs/decisions/pdr-019-v-any-vs-v-unknown-boundary-policy.sdp.md index 632602d1..5dbf975e 100644 --- a/specs/decisions/pdr-019-v-any-vs-v-unknown-boundary-policy.sdp.md +++ b/specs/decisions/pdr-019-v-any-vs-v-unknown-boundary-policy.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-019 v.any() vs v.unknown() boundary policy +# PDR-019 - v.any() vs v.unknown() Boundary Policy ## Intent -- outcome: Constrain flexible payload boundaries without pretending they are fully typed. +- outcome: PDR-019 - v.any() vs v.unknown() Boundary Policy ## Decision -- decision: Payload-like component boundaries follow an explicit v.any()/v.unknown() policy that rejects malformed or unbounded inputs before they become a scalability problem. +- decision: PDR-019 - v.any() vs v.unknown() Boundary Policy diff --git a/specs/decisions/pdr-020-events-table-index-policy.sdp.md b/specs/decisions/pdr-020-events-table-index-policy.sdp.md index ca86a25b..c325023b 100644 --- a/specs/decisions/pdr-020-events-table-index-policy.sdp.md +++ b/specs/decisions/pdr-020-events-table-index-policy.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-020 events table index policy +# PDR-020 - events Table Index Policy ## Intent -- outcome: Align events-table indexes with active read paths without premature breaking removals. +- outcome: PDR-020 - events Table Index Policy ## Decision -- decision: Replace or retire unused events indexes on a recorded policy so append cost drops only after consumers no longer depend on the old shapes. +- decision: PDR-020 - events Table Index Policy diff --git a/specs/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.sdp.md b/specs/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.sdp.md index 5504343b..2ac5073a 100644 --- a/specs/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.sdp.md +++ b/specs/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-021 platform-store runtime dependency on platform-core +# PDR-021 - platform-store Runtime Dependency on platform-core Accepted with Constraints ## Intent -- outcome: Accept a constrained platform-store → platform-core dependency instead of denying package-manager reality. +- outcome: PDR-021 - platform-store Runtime Dependency on platform-core Accepted with Constraints ## Decision -- decision: platform-store may depend on platform-core only through an approved import set; live imports stay inside that set and are guarded. +- decision: PDR-021 - platform-store Runtime Dependency on platform-core Accepted with Constraints diff --git a/specs/decisions/pdr-022-value-transfer-doctrine-adoption.sdp.md b/specs/decisions/pdr-022-value-transfer-doctrine-adoption.sdp.md index b7ddf1dd..c516f972 100644 --- a/specs/decisions/pdr-022-value-transfer-doctrine-adoption.sdp.md +++ b/specs/decisions/pdr-022-value-transfer-doctrine-adoption.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-022 Value-transfer doctrine adoption +# PDR-022 Value-Transfer Doctrine Adoption and Naming Contract ## Intent -- outcome: End split-brain doctrine that lived only on off-branch paths. +- outcome: PDR-022 Value-Transfer Doctrine Adoption and Naming Contract ## Decision -- decision: Adopt the in-repo architect/_shared doctrine set as authoritative for value transfer, annotation ownership, pattern-carrier relationships, maturity, and FSM interpretation. +- decision: PDR-022 Value-Transfer Doctrine Adoption and Naming Contract diff --git a/specs/decisions/pdr-023-bulk-doctrine-rollback-and-recovery.sdp.md b/specs/decisions/pdr-023-bulk-doctrine-rollback-and-recovery.sdp.md index 0eb958b8..89ac09e6 100644 --- a/specs/decisions/pdr-023-bulk-doctrine-rollback-and-recovery.sdp.md +++ b/specs/decisions/pdr-023-bulk-doctrine-rollback-and-recovery.sdp.md @@ -5,12 +5,12 @@ altitude: feature readiness: idea relations: {} --- -# PDR-023 Bulk doctrine rollback and recovery governance +# PDR-023 Bulk Doctrine Rollback and Recovery Governance ## Intent -- outcome: Recover safely after a bulk doctrine cleanup that deleted live Specs and left transitional carve-outs. +- outcome: PDR-023 Bulk Doctrine Rollback and Recovery Governance ## Decision -- decision: Recovery restores gate-passing design Specs deliberately, records exemptions, and forbids silent bulk deletion without recovery governance. +- decision: PDR-023 Bulk Doctrine Rollback and Recovery Governance diff --git a/specs/epic-process-enhancements.sdp.md b/specs/epic-process-enhancements.sdp.md index 18f6268c..1ed2da72 100644 --- a/specs/epic-process-enhancements.sdp.md +++ b/specs/epic-process-enhancements.sdp.md @@ -5,8 +5,10 @@ altitude: epic readiness: idea relations: {} --- -# Epic process enhancements +# Process Enhancements - Unified Software Delivery Process ## Intent -- outcome: Improve delivery-process epic tooling and workflows that sit above individual platform feature Specs. +- outcome: Current delivery process capabilities are limited to document generation. The convergence roadmap identified 8 opportunities: Process Views as Projections, DoD as Machine-Checkable, Earned-Value Tracking, Requirements-Tests Traceability, Architecture Change Control, Progressive Governance, and Living Roadmap. +- problem: Current delivery process capabilities are limited to document generation. The convergence roadmap identified 8 opportunities: Process Views as Projections, DoD as Machine-Checkable, Earned-Value Tracking, Requirements-Tests Traceability, Architecture Change Control, Progressive Governance, and Living Roadmap. +- value: Incrementally implement convergence opportunities, starting with foundation work (metadata tags) and progressing to validators, generators, and eventually Convex-native live projections. diff --git a/specs/example-app/agent-admin-frontend.sdp.md b/specs/example-app/agent-admin-frontend.sdp.md index cd5cd436..bc0ded60 100644 --- a/specs/example-app/agent-admin-frontend.sdp.md +++ b/specs/example-app/agent-admin-frontend.sdp.md @@ -5,8 +5,18 @@ altitude: feature readiness: idea relations: {} --- -# Agent admin frontend +# Agent Admin Frontend - Complete Management UI with Multi-Agent Support ## Intent -- outcome: Give operators an admin UI for approvals, monitoring, decision history, and dead letters over the Agent BC APIs. +- outcome: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. +- problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. +- value: Complete the agent admin frontend with multi-agent support: 1. + +## Behavior + +- rule: Dead letters are visible and actionable +- rule: Decision history supports multi-agent filtering +- rule: Actions provide feedback via toast +- rule: High-value order agent functions end-to-end +- rule: Dashboard reflects multi-agent state diff --git a/specs/platform/admin-tooling-consolidation.sdp.md b/specs/platform/admin-tooling-consolidation.sdp.md index d770f84f..5443c6dd 100644 --- a/specs/platform/admin-tooling-consolidation.sdp.md +++ b/specs/platform/admin-tooling-consolidation.sdp.md @@ -5,8 +5,17 @@ altitude: feature readiness: idea relations: {} --- -# Admin tooling consolidation +# Admin Tooling Consolidation - Unified Operations Interface ## Intent -- outcome: Consolidate cross-cutting admin operations into one discoverable admin surface with uniform auth and diagnostics. +- outcome: Admin functionality is scattered across the codebase: - Dead letter queue at 'convex/projections/deadLetters.ts' - Saga admin at 'convex/sagas/admin.ts' - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. +- problem: Admin functionality is scattered across the codebase: - Dead letter queue at 'convex/projections/deadLetters.ts' - Saga admin at 'convex/sagas/admin.ts' - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. +- value: Consolidate admin functionality into 'convex/admin/' directory: - **projections.ts** - Rebuild triggers, status, checkpoint management - **deadLetters.ts** - DLQ inspection, retry, ignore (refactored from current location) - **diagnostics.ts** - Event flow trace, system state snapshot - **durableFunctions.ts** - Workpool/Workflow run inspection + +## Behavior + +- rule: Admin directory provides unified location for operational endpoints +- rule: DLQ endpoints provide inspection, retry, and ignore operations +- rule: System state snapshot provides full health picture +- rule: Admin endpoints require authorization diff --git a/specs/platform/agent-bc-component-isolation.sdp.md b/specs/platform/agent-bc-component-isolation.sdp.md index 5025e7f0..744a4dae 100644 --- a/specs/platform/agent-bc-component-isolation.sdp.md +++ b/specs/platform/agent-bc-component-isolation.sdp.md @@ -5,8 +5,10 @@ altitude: feature readiness: idea relations: {} --- -# Agent BC component isolation +# Agent BC Component Isolation - Physical Bounded Context Enforcement ## Intent -- outcome: Enforce Agent BC as a Convex component with private tables and a public API so agent state is not shared-schema writable. +- outcome: Agent BC tables ('agentCheckpoints', 'agentAuditEvents', 'agentDeadLetters', 'agentCommands', 'pendingApprovals') reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. +- problem: Agent BC tables ('agentCheckpoints', 'agentAuditEvents', 'agentDeadLetters', 'agentCommands', 'pendingApprovals') reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. +- value: Implement agent as a proper Convex component: 1. **'defineComponent("agent")'** with isolated schema and private tables 2. diff --git a/specs/platform/agent-command-infrastructure.sdp.md b/specs/platform/agent-command-infrastructure.sdp.md index a002a22d..4788dd3a 100644 --- a/specs/platform/agent-command-infrastructure.sdp.md +++ b/specs/platform/agent-command-infrastructure.sdp.md @@ -5,8 +5,16 @@ altitude: feature readiness: idea relations: {} --- -# Agent command infrastructure +# Agent Command Infrastructure - Routing, Lifecycle, and Pattern Unification ## Intent -- outcome: Complete agent command routing, lifecycle control, and a unified pattern registry so agent decisions have effect and operators can control agents. +- outcome: Three interconnected gaps in agent command infrastructure: 1. +- problem: Three interconnected gaps in agent command infrastructure: 1. +- value: Complete agent command infrastructure: 1. + +## Behavior + +- rule: Emitted commands are routed to handlers +- rule: Agent lifecycle is controlled via commands +- rule: Pattern definitions are the single source of truth diff --git a/specs/platform/agent-llm-integration.sdp.md b/specs/platform/agent-llm-integration.sdp.md index 1b37a2ce..d41e6fba 100644 --- a/specs/platform/agent-llm-integration.sdp.md +++ b/specs/platform/agent-llm-integration.sdp.md @@ -5,8 +5,15 @@ altitude: feature readiness: idea relations: {} --- -# Agent LLM integration +# Agent LLM Integration - Action/Mutation Split and Cost Control ## Intent -- outcome: Integrate LLM analysis into agent pattern detection via a hybrid action/mutation flow while the platform owns EventBus, checkpoints, and rate limits. +- outcome: The agent event handler ('handleChurnRiskEvent') is a Convex mutation that cannot call external APIs. The LLM runtime ('_llm/runtime.ts') exists with OpenRouter integration but is never invoked because mutations cannot make HTTP calls. Additionally, rate limiting config exists as types only — no runtime enforcement protects against runaway LLM costs. +- problem: The agent event handler ('handleChurnRiskEvent') is a Convex mutation that cannot call external APIs. The LLM runtime ('_llm/runtime.ts') exists with OpenRouter integration but is never invoked because mutations cannot make HTTP calls. Additionally, rate limiting config exists as types only — no runtime enforcement protects against runaway LLM costs. +- value: Implement hybrid action/mutation handler pattern: 1. + +## Behavior + +- rule: Rate limiting is enforced before LLM calls +- rule: Agent subscriptions support onComplete callbacks diff --git a/specs/platform/circuit-breaker-pattern.sdp.md b/specs/platform/circuit-breaker-pattern.sdp.md index 23de9f48..91f82527 100644 --- a/specs/platform/circuit-breaker-pattern.sdp.md +++ b/specs/platform/circuit-breaker-pattern.sdp.md @@ -5,8 +5,15 @@ altitude: feature readiness: idea relations: {} --- -# Circuit breaker pattern for external service resilience +# Circuit Breaker Pattern - External Service Resilience ## Intent -- outcome: Isolate failing external APIs with a database-backed CLOSED/OPEN/HALF_OPEN circuit breaker so failures fail fast instead of cascading. +- outcome: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back +- problem: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back +- value: Database-backed circuit breaker with state machine: - + +## Behavior + +- rule: Circuit breaker follows three-state machine +- rule: Half-open probes use Action Retrier with zero retries diff --git a/specs/platform/component-boundary-authentication-convention.sdp.md b/specs/platform/component-boundary-authentication-convention.sdp.md index 63f78fd2..2fd7473b 100644 --- a/specs/platform/component-boundary-authentication-convention.sdp.md +++ b/specs/platform/component-boundary-authentication-convention.sdp.md @@ -5,8 +5,15 @@ altitude: feature readiness: idea relations: {} --- -# Atomic component-boundary authentication convention +# Atomic Component-Boundary Authentication Convention ## Intent -- outcome: Migrate identity-bearing component mutations atomically onto the PDR-014 verificationProof and verifyActor() contract. +- outcome: Identity-bearing component mutations still trust caller-provided actor fields without a canonical component-side proof contract. Fixing the affected mutations piecemeal would create drift and leave a mixed-trust window across approvals, audit, and event append flows. +- problem: Identity-bearing component mutations still trust caller-provided actor fields without a canonical component-side proof contract. Fixing the affected mutations piecemeal would create drift and leave a mixed-trust window across approvals, audit, and event append flows. +- value: Plan P11 as one atomic remediation packet: PDR-014 defines the canonical 'verificationProof' contract, the 'verifyActor()' helper becomes the default component-side gate, and all listed mutation sites migrate in the same implementation session. + +## Behavior + +- rule: P11 ships as one atomic packet +- rule: Verification is component-side and defaults to deny diff --git a/specs/platform/confirmed-order-cancellation.sdp.md b/specs/platform/confirmed-order-cancellation.sdp.md index f68d9a4f..993c20d1 100644 --- a/specs/platform/confirmed-order-cancellation.sdp.md +++ b/specs/platform/confirmed-order-cancellation.sdp.md @@ -5,8 +5,15 @@ altitude: feature readiness: idea relations: {} --- -# Confirmed order cancellation with reservation release +# Confirmed Order Cancellation with Reservation Release ## Intent -- outcome: Allow confirmed orders to cancel with coordinated reservation release so agent demos can exercise multi-cancellation churn patterns. +- outcome: The Order FSM treats 'confirmed' as terminal. Orders cannot be cancelled after saga confirmation, blocking the Agent BC demo which requires 3+ cancellations to trigger churn risk detection. The Reservation FSM already supports 'confirmed -) released', but no coordination exists to release reservations when confirmed orders are cancelled. +- problem: The Order FSM treats 'confirmed' as terminal. Orders cannot be cancelled after saga confirmation, blocking the Agent BC demo which requires 3+ cancellations to trigger churn risk detection. The Reservation FSM already supports 'confirmed -) released', but no coordination exists to release reservations when confirmed orders are cancelled. +- value: Enable cancellation of confirmed orders with automatic reservation release: 1. + +## Behavior + +- rule: Confirmed orders can be cancelled +- rule: Reservation is released when confirmed order is cancelled diff --git a/specs/platform/deterministic-id-hashing.sdp.md b/specs/platform/deterministic-id-hashing.sdp.md index e36000a3..f027b335 100644 --- a/specs/platform/deterministic-id-hashing.sdp.md +++ b/specs/platform/deterministic-id-hashing.sdp.md @@ -5,8 +5,17 @@ altitude: feature readiness: idea relations: {} --- -# Deterministic ID hashing for OCC-based uniqueness +# Deterministic ID Hashing - OCC-Based Uniqueness Without TTL ## Intent -- outcome: Derive stream IDs from business keys via deterministic hashing so concurrent creates collide under OCC without TTL reservations. +- outcome: TTL-based reservations work well for multi-step flows (registration wizards), but add overhead for simple "create if unique" operations. Need a lighter-weight alternative. +- problem: TTL-based reservations work well for multi-step flows (registration wizards), but add overhead for simple "create if unique" operations. Need a lighter-weight alternative. +- value: Generate entity stream ID from unique business key via deterministic hash. Concurrent creates target the same stream ID; OCC detects conflict automatically. + +## Behavior + +- rule: Stream ID is deterministic from business key +- rule: OCC prevents duplicate creation +- rule: Hash algorithm is collision-resistant +- rule: Pattern complements Reservation Pattern diff --git a/specs/platform/event-correctness-migration.sdp.md b/specs/platform/event-correctness-migration.sdp.md index 7a84f532..5dba1753 100644 --- a/specs/platform/event-correctness-migration.sdp.md +++ b/specs/platform/event-correctness-migration.sdp.md @@ -5,8 +5,15 @@ altitude: feature readiness: idea relations: {} --- -# Atomic event correctness migration +# Atomic Event Correctness Migration ## Intent -- outcome: Land idempotency, globalPosition precision, and process-manager lifecycle parity as one correctness packet so event-store guarantees stay consistent. +- outcome: 'appendToStream' idempotency semantics, 'globalPosition' precision, and process-manager lifecycle parity are coupled correctness concerns. Splitting them would create inconsistent event-store guarantees and leave downstream consumers migrating against moving contracts. +- problem: 'appendToStream' idempotency semantics, 'globalPosition' precision, and process-manager lifecycle parity are coupled correctness concerns. Splitting them would create inconsistent event-store guarantees and leave downstream consumers migrating against moving contracts. +- value: Plan P14, P17, and P18 as one correctness packet. Implementation starts with a full consumer inventory, lands PDR-018 and PDR-015 first, then migrates idempotency, 'globalPosition', and canonical process-manager transitions together. + +## Behavior + +- rule: P14, P17, and P18 remain one correctness packet +- rule: Compatibility and ordering remain explicit diff --git a/specs/platform/health-observability.sdp.md b/specs/platform/health-observability.sdp.md index da7b9578..c06f2ed3 100644 --- a/specs/platform/health-observability.sdp.md +++ b/specs/platform/health-observability.sdp.md @@ -5,8 +5,15 @@ altitude: feature readiness: idea relations: {} --- -# Health endpoints and metrics collection +# Health Endpoints and Metrics Collection ## Intent -- outcome: Expose readiness/liveness health endpoints and structured metrics so operators can detect degradation before outage. +- outcome: No Kubernetes integration (readiness/liveness probes), no metrics for projection lag, event throughput, or system health. Operations team has no visibility into system state, cannot detect degradation before it becomes an outage, and cannot integrate with standard orchestration platforms. +- problem: No Kubernetes integration (readiness/liveness probes), no metrics for projection lag, event throughput, or system health. Operations team has no visibility into system state, cannot detect degradation before it becomes an outage, and cannot integrate with standard orchestration platforms. +- value: Production-ready observability infrastructure: - + +## Behavior + +- rule: Health endpoints support Kubernetes probes +- rule: Projection lag tracks distance from Event Store head diff --git a/specs/platform/integration-patterns-21a.sdp.md b/specs/platform/integration-patterns-21a.sdp.md index 5949be4f..0b1c88b5 100644 --- a/specs/platform/integration-patterns-21a.sdp.md +++ b/specs/platform/integration-patterns-21a.sdp.md @@ -5,8 +5,16 @@ altitude: feature readiness: idea relations: {} --- -# Integration patterns (21a) — registry and core patterns +# Integration Patterns (21a) - Registry & Core Patterns ## Intent -- outcome: Make cross-context communication explicit via context maps, published language, and an integration-pattern registry. +- outcome: Cross-context communication is ad-hoc. Domain events are used directly for integration without explicit contracts, leading to tight coupling. +- problem: Cross-context communication is ad-hoc. Domain events are used directly for integration without explicit contracts, leading to tight coupling. +- value: Foundational patterns for cross-context communication: - + +## Behavior + +- rule: Context Map documents BC relationships +- rule: Published Language defines stable contracts +- rule: ACL translates external models diff --git a/specs/platform/integration-patterns-21b.sdp.md b/specs/platform/integration-patterns-21b.sdp.md index 19979178..3a9dea61 100644 --- a/specs/platform/integration-patterns-21b.sdp.md +++ b/specs/platform/integration-patterns-21b.sdp.md @@ -5,8 +5,15 @@ altitude: feature readiness: idea relations: {} --- -# Integration patterns (21b) — schema evolution and contract testing +# Integration Patterns (21b) - Schema Evolution & Contract Testing ## Intent -- outcome: Support schema evolution with upcasters/downcasters and contract testing so producer/consumer compatibility is validated before runtime failures. +- outcome: Schema evolution breaks consumers. No tooling validates producer-consumer compatibility, leading to runtime failures and integration bugs. +- problem: Schema evolution breaks consumers. No tooling validates producer-consumer compatibility, leading to runtime failures and integration bugs. +- value: Schema evolution and contract testing patterns: - + +## Behavior + +- rule: Schema versioning enables evolution +- rule: Contract tests validate integration diff --git a/specs/platform/package-architecture.sdp.md b/specs/platform/package-architecture.sdp.md index 4dbe3cf0..ea40624a 100644 --- a/specs/platform/package-architecture.sdp.md +++ b/specs/platform/package-architecture.sdp.md @@ -5,8 +5,18 @@ altitude: epic readiness: idea relations: {} --- -# Package architecture — extraction and naming strategy +# Package Architecture - Extraction and Naming Strategy ## Intent -- outcome: Extract focused @libar-dev/platform-* packages with layered dependency direction instead of one oversized core package. +- outcome: The original @convex-es/core package grew to 25+ modules, creating issues: - Large bundle size for consumers who only need specific patterns - Unclear API surface (what's core vs experimental?) - Testing sprawl (decider tests in example app, not package) - Difficult to release patterns independently +- problem: The original @convex-es/core package grew to 25+ modules, creating issues: - Large bundle size for consumers who only need specific patterns - Unclear API surface (what's core vs experimental?) - Testing sprawl (decider tests in example app, not package) - Difficult to release patterns independently +- value: Extract focused pattern packages under @libar-dev/platform-* namespace with a layered architecture enforcing strict dependency direction. Naming rationale: - "Libar" means book/library, repository of knowledge/wisdom - Events ARE the institutional memory - the "libar" of the system - "Platform" indicates infrastructure for building applications + +## Behavior + +- rule: Layer 0 packages have no framework dependencies +- rule: Consumers can install individual packages +- rule: Tests ship with framework packages +- rule: Backward compatibility is maintained +- rule: No naming conflicts with libar-ai project diff --git a/specs/platform/patterns/bounded-context-foundation-executable-tests.sdp.md b/specs/platform/patterns/bounded-context-foundation-executable-tests.sdp.md index 7146a1ce..b2939873 100644 --- a/specs/platform/patterns/bounded-context-foundation-executable-tests.sdp.md +++ b/specs/platform/patterns/bounded-context-foundation-executable-tests.sdp.md @@ -5,8 +5,16 @@ altitude: feature readiness: idea relations: {} --- -# BoundedContextFoundationExecutableTests +# BoundedContextFoundation Executable Tests ## Intent -- outcome: Preserve the former architect pattern "BoundedContextFoundationExecutableTests" as an SDP Spec for delivery binding. +- outcome: BoundedContextFoundation Executable Tests + +## Behavior + +- rule: Components have isolated databases that parent cannot query directly +- rule: Sub-transactions are atomic within components +- rule: ctx.auth does not cross component boundaries +- rule: Id inside component becomes string at API boundary +- rule: DualWriteContextContract formalizes the bounded context API diff --git a/specs/platform/patterns/cms-repository.sdp.md b/specs/platform/patterns/cms-repository.sdp.md index ef2bee01..cdc6fedf 100644 --- a/specs/platform/patterns/cms-repository.sdp.md +++ b/specs/platform/patterns/cms-repository.sdp.md @@ -5,8 +5,19 @@ altitude: feature readiness: idea relations: {} --- -# CMSRepository +# CMS Repository ## Intent -- outcome: Preserve the former architect pattern "CMSRepository" as an SDP Spec for delivery binding. +- outcome: CMS Repository + +## Behavior + +- rule: load retrieves and upcasts a CMS entity by ID +- rule: tryLoad returns null instead of throwing for missing entities +- rule: exists checks entity presence without upcast overhead +- rule: loadMany retrieves multiple entities in parallel with null for missing +- rule: insert persists a new CMS record and returns the document ID +- rule: update patches CMS with optimistic concurrency control +- rule: NotFoundError has correct properties and type guard +- rule: VersionConflictError has correct properties and type guard diff --git a/specs/platform/patterns/command-bus-foundation-executable-tests.sdp.md b/specs/platform/patterns/command-bus-foundation-executable-tests.sdp.md index ffdb84f1..3bd84106 100644 --- a/specs/platform/patterns/command-bus-foundation-executable-tests.sdp.md +++ b/specs/platform/patterns/command-bus-foundation-executable-tests.sdp.md @@ -5,8 +5,16 @@ altitude: feature readiness: idea relations: {} --- -# CommandBusFoundationExecutableTests +# CommandBusFoundation Executable Tests ## Intent -- outcome: Preserve the former architect pattern "CommandBusFoundationExecutableTests" as an SDP Spec for delivery binding. +- outcome: CommandBusFoundation Executable Tests + +## Behavior + +- rule: Commands are idempotent via commandId deduplication +- rule: Status tracks the complete command lifecycle +- rule: The CommandOrchestrator is the only command execution path +- rule: correlationId links commands, events, and projections +- rule: Middleware provides composable cross-cutting concerns diff --git a/specs/platform/patterns/command-orchestrator.sdp.md b/specs/platform/patterns/command-orchestrator.sdp.md index ca39a7bd..0ef866d0 100644 --- a/specs/platform/patterns/command-orchestrator.sdp.md +++ b/specs/platform/patterns/command-orchestrator.sdp.md @@ -5,8 +5,15 @@ altitude: feature readiness: idea relations: {} --- -# CommandOrchestrator +# CommandOrchestrator partition key structure ## Intent -- outcome: Preserve the former architect pattern "CommandOrchestrator" as an SDP Spec for delivery binding. +- outcome: CommandOrchestrator partition key structure + +## Behavior + +- rule: Primary projection receives structured partition key +- rule: Secondary projections receive structured partition key +- rule: Failed projection receives structured partition key +- rule: Saga routing uses sagaPool diff --git a/specs/platform/patterns/command-registry.sdp.md b/specs/platform/patterns/command-registry.sdp.md index a52d6bfc..4af2548a 100644 --- a/specs/platform/patterns/command-registry.sdp.md +++ b/specs/platform/patterns/command-registry.sdp.md @@ -9,4 +9,23 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "CommandRegistry" as an SDP Spec for delivery binding. +- actor: a platform developer +- outcome: a central registry for command definitions so that commands can be looked up, validated, and filtered at runtime + +## Behavior + +- rule: CommandRegistry implements the singleton pattern +- rule: Commands can be registered and duplicate registration is rejected +- rule: Commands can be unregistered from the registry +- rule: getConfig returns the command configuration or undefined +- rule: getRegistration returns the full registration or undefined +- rule: has checks whether a command is registered +- rule: validate checks command payloads against registered Zod schemas +- rule: list returns all registered commands as CommandInfo objects +- rule: listByCategory filters commands by their category +- rule: listByContext filters commands by bounded context +- rule: listByTag filters commands by tag +- rule: groupByContext groups commands by their bounded context +- rule: size returns the number of registered commands +- rule: clear removes all registrations +- rule: globalRegistry is a functional singleton instance diff --git a/specs/platform/patterns/data-table-parsing.sdp.md b/specs/platform/patterns/data-table-parsing.sdp.md index fbe705de..8b355972 100644 --- a/specs/platform/patterns/data-table-parsing.sdp.md +++ b/specs/platform/patterns/data-table-parsing.sdp.md @@ -5,8 +5,9 @@ altitude: feature readiness: idea relations: {} --- -# DataTableParsing +# Gherkin DataTable Parsing Utilities ## Intent -- outcome: Preserve the former architect pattern "DataTableParsing" as an SDP Spec for delivery binding. +- actor: a BDD test author +- outcome: DataTable parsing helpers so that I can easily extract structured data from Gherkin tables diff --git a/specs/platform/patterns/dcb-multi-product-reservation.sdp.md b/specs/platform/patterns/dcb-multi-product-reservation.sdp.md index 06957e6d..63dd89cf 100644 --- a/specs/platform/patterns/dcb-multi-product-reservation.sdp.md +++ b/specs/platform/patterns/dcb-multi-product-reservation.sdp.md @@ -5,8 +5,13 @@ altitude: feature readiness: idea relations: {} --- -# DCBMultiProductReservation +# DCB Multi-Product Reservation ## Intent -- outcome: Preserve the former architect pattern "DCBMultiProductReservation" as an SDP Spec for delivery binding. +- actor: a platform developer +- outcome: to see DCB demonstrated in the order submission flow so that I understand how to use executeWithDCB for multi-entity operations + +## Behavior + +- rule: Order submission uses DCB for atomic multi-product reservation diff --git a/specs/platform/patterns/decider-assertions.sdp.md b/specs/platform/patterns/decider-assertions.sdp.md index 550045f5..abba10ec 100644 --- a/specs/platform/patterns/decider-assertions.sdp.md +++ b/specs/platform/patterns/decider-assertions.sdp.md @@ -5,8 +5,9 @@ altitude: feature readiness: idea relations: {} --- -# DeciderAssertions +# Decider Testing Assertions ## Intent -- outcome: Preserve the former architect pattern "DeciderAssertions" as an SDP Spec for delivery binding. +- actor: a developer testing deciders +- outcome: assertion helpers for DeciderOutput results so that I can write clear, consistent test assertions diff --git a/specs/platform/patterns/decider-outputs.sdp.md b/specs/platform/patterns/decider-outputs.sdp.md index d67eb44c..a81c57e0 100644 --- a/specs/platform/patterns/decider-outputs.sdp.md +++ b/specs/platform/patterns/decider-outputs.sdp.md @@ -5,8 +5,8 @@ altitude: feature readiness: idea relations: {} --- -# DeciderOutputs +# Decider Output Helpers and Type Guards ## Intent -- outcome: Preserve the former architect pattern "DeciderOutputs" as an SDP Spec for delivery binding. +- outcome: Decider Output Helpers and Type Guards diff --git a/specs/platform/patterns/event-store-foundation-executable-tests.sdp.md b/specs/platform/patterns/event-store-foundation-executable-tests.sdp.md index a9bd412e..10b148d9 100644 --- a/specs/platform/patterns/event-store-foundation-executable-tests.sdp.md +++ b/specs/platform/patterns/event-store-foundation-executable-tests.sdp.md @@ -5,8 +5,16 @@ altitude: feature readiness: idea relations: {} --- -# EventStoreFoundationExecutableTests +# EventStoreFoundation Executable Tests ## Intent -- outcome: Preserve the former architect pattern "EventStoreFoundationExecutableTests" as an SDP Spec for delivery binding. +- outcome: EventStoreFoundation Executable Tests + +## Behavior + +- rule: Events are immutable once appended +- rule: Streams provide per-entity ordering via version numbers +- rule: globalPosition enables total ordering across all streams +- rule: OCC prevents concurrent modification conflicts +- rule: Checkpoints enable projection resumption with exactly-once semantics diff --git a/specs/platform/patterns/fsm-assertions.sdp.md b/specs/platform/patterns/fsm-assertions.sdp.md index 21baf91d..f6c80992 100644 --- a/specs/platform/patterns/fsm-assertions.sdp.md +++ b/specs/platform/patterns/fsm-assertions.sdp.md @@ -5,8 +5,9 @@ altitude: feature readiness: idea relations: {} --- -# FSMAssertions +# FSM Testing Assertions ## Intent -- outcome: Preserve the former architect pattern "FSMAssertions" as an SDP Spec for delivery binding. +- actor: a developer testing finite state machines +- outcome: FSM-specific assertion helpers so that I can verify transition validity concisely diff --git a/specs/platform/patterns/fsm-transitions.sdp.md b/specs/platform/patterns/fsm-transitions.sdp.md index 1602b800..e7a27ead 100644 --- a/specs/platform/patterns/fsm-transitions.sdp.md +++ b/specs/platform/patterns/fsm-transitions.sdp.md @@ -5,8 +5,8 @@ altitude: feature readiness: idea relations: {} --- -# FSMTransitions +# FSM State Transitions ## Intent -- outcome: Preserve the former architect pattern "FSMTransitions" as an SDP Spec for delivery binding. +- outcome: FSM State Transitions diff --git a/specs/platform/patterns/middleware-pipeline.sdp.md b/specs/platform/patterns/middleware-pipeline.sdp.md index 5b649ec6..1bd78c0e 100644 --- a/specs/platform/patterns/middleware-pipeline.sdp.md +++ b/specs/platform/patterns/middleware-pipeline.sdp.md @@ -5,8 +5,27 @@ altitude: feature readiness: idea relations: {} --- -# MiddlewarePipeline +# MiddlewarePipeline orchestration ## Intent -- outcome: Preserve the former architect pattern "MiddlewarePipeline" as an SDP Spec for delivery binding. +- outcome: MiddlewarePipeline orchestration + +## Behavior + +- rule: use() adds middleware and supports chaining +- rule: remove() removes middleware by name +- rule: has() checks middleware existence +- rule: getMiddlewareNames returns names sorted by order +- rule: execute() runs handler when no middlewares are registered +- rule: Before hooks execute in ascending order +- rule: After hooks execute in reverse order +- rule: Before hook short-circuits on continue false +- rule: Context passes between before hooks +- rule: Before hook errors produce MIDDLEWARE_ERROR rejection +- rule: Handler errors produce HANDLER_ERROR rejection +- rule: After hook errors do not prevent other after hooks or change result +- rule: Short-circuit runs after hooks only for already-executed middlewares +- rule: clear() removes all middlewares +- rule: clone() creates an independent copy +- rule: createMiddlewarePipeline factory creates instances diff --git a/specs/platform/patterns/projection-categories.sdp.md b/specs/platform/patterns/projection-categories.sdp.md index d324d4a4..d5f0f55c 100644 --- a/specs/platform/patterns/projection-categories.sdp.md +++ b/specs/platform/patterns/projection-categories.sdp.md @@ -5,8 +5,8 @@ altitude: feature readiness: idea relations: {} --- -# ProjectionCategories +# Projection Categories ## Intent -- outcome: Preserve the former architect pattern "ProjectionCategories" as an SDP Spec for delivery binding. +- outcome: Projection Categories diff --git a/specs/platform/patterns/saga-orchestration-executable-tests.sdp.md b/specs/platform/patterns/saga-orchestration-executable-tests.sdp.md index 99e2df62..7a569d77 100644 --- a/specs/platform/patterns/saga-orchestration-executable-tests.sdp.md +++ b/specs/platform/patterns/saga-orchestration-executable-tests.sdp.md @@ -5,8 +5,16 @@ altitude: feature readiness: idea relations: {} --- -# SagaOrchestrationExecutableTests +# SagaOrchestration Executable Tests ## Intent -- outcome: Preserve the former architect pattern "SagaOrchestrationExecutableTests" as an SDP Spec for delivery binding. +- outcome: SagaOrchestration Executable Tests + +## Behavior + +- rule: Sagas orchestrate operations across multiple bounded contexts +- rule: @convex-dev/workflow provides durability across server restarts +- rule: Compensation reverses partial operations on failure +- rule: Saga idempotency prevents duplicate workflows via sagaId +- rule: Saga status is updated via onComplete callback, not inside workflow diff --git a/specs/platform/patterns/test-isolation.sdp.md b/specs/platform/patterns/test-isolation.sdp.md index 58540276..144fb22d 100644 --- a/specs/platform/patterns/test-isolation.sdp.md +++ b/specs/platform/patterns/test-isolation.sdp.md @@ -5,8 +5,9 @@ altitude: feature readiness: idea relations: {} --- -# TestIsolation +# Test Isolation via Namespace Prefixing ## Intent -- outcome: Preserve the former architect pattern "TestIsolation" as an SDP Spec for delivery binding. +- actor: a test author +- outcome: automatic namespace isolation for test data so that tests don't interfere with each other diff --git a/specs/platform/production-hardening.sdp.md b/specs/platform/production-hardening.sdp.md index 6082ac2e..d83ea80a 100644 --- a/specs/platform/production-hardening.sdp.md +++ b/specs/platform/production-hardening.sdp.md @@ -5,8 +5,16 @@ altitude: feature readiness: idea relations: {} --- -# Production hardening — observability and operational tooling +# Production Hardening - Observability and Operational Tooling ## Intent -- outcome: Add metrics, tracing, health checks, and admin tooling so production operations do not require direct database access. +- outcome: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. +- problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. +- value: Comprehensive production-ready infrastructure: - + +## Behavior + +- rule: Metrics track system health indicators +- rule: Distributed tracing visualizes event flow +- rule: Health endpoints support Kubernetes probes diff --git a/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.sdp.md b/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.sdp.md index 2afb956d..5965b9fd 100644 --- a/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.sdp.md +++ b/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.sdp.md @@ -5,8 +5,15 @@ altitude: feature readiness: idea relations: {} --- -# Tranche 0 readiness harness and dependency hardening +# Tranche 0 Readiness Harness and Dependency Hardening ## Intent -- outcome: Land store/bus backend integration harnesses and strict package validation baselines before security or correctness remediation starts. +- outcome: The remediation program cannot safely begin security or correctness migrations while 'platform-store' lacks a real backend integration harness, 'platform-bus' relies on thin backend coverage, and package validation posture still permits configuration drift. +- problem: The remediation program cannot safely begin security or correctness migrations while 'platform-store' lacks a real backend integration harness, 'platform-bus' relies on thin backend coverage, and package validation posture still permits configuration drift. +- value: Land the tranche-0 readiness packet first so later packets inherit a trustworthy backend test surface, aligned package scripts, and strict validation baselines. + +## Behavior + +- rule: Tranche 0 readiness is a hard gate +- rule: Validation posture must fail closed diff --git a/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.sdp.md b/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.sdp.md index 38ba0e96..b131ab81 100644 --- a/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.sdp.md +++ b/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.sdp.md @@ -5,8 +5,15 @@ altitude: feature readiness: idea relations: {} --- -# Tranche 0 release, CI, and docs/process guardrails +# Tranche 0 Release, CI, and Docs/Process Guardrails ## Intent -- outcome: Align release automation and docs/process CI with release authority so governance and docs-only work cannot bypass validation. +- outcome: 'test.yml' ignores markdown and docs-only changes, release automation is not yet normalized around architect release metadata, and new remediation contracts need an explicit advertised-vs-enforced convention before runtime fixes start landing. +- problem: 'test.yml' ignores markdown and docs-only changes, release automation is not yet normalized around architect release metadata, and new remediation contracts need an explicit advertised-vs-enforced convention before runtime fixes start landing. +- value: Ship a tranche-0 governance packet that mirrors release metadata from 'pdr-002-release-management-architecture.feature', adds docs/process CI coverage, and makes contract-status and rename-guard policy enforceable before behavior-changing remediation work. + +## Behavior + +- rule: PDR-002 is the only release authority +- rule: Docs and process changes must have a non-skipped CI lane diff --git a/specs/platform/tranche-1-supporting-security-and-contract-sweep.sdp.md b/specs/platform/tranche-1-supporting-security-and-contract-sweep.sdp.md index c34a5a14..666f7380 100644 --- a/specs/platform/tranche-1-supporting-security-and-contract-sweep.sdp.md +++ b/specs/platform/tranche-1-supporting-security-and-contract-sweep.sdp.md @@ -5,8 +5,15 @@ altitude: feature readiness: idea relations: {} --- -# Tranche 1 supporting security and contract sweep +# Tranche 1 Supporting Security and Contract Sweep ## Intent -- outcome: Close remaining fail-open, correlation, authorization, lifecycle-stub, and store-dependency gaps after the auth keystone. +- outcome: Several tranche-1 gaps remain after the auth keystone: test-mode checks fail open, correlation IDs can be fabricated, reviewer authorization still needs default-deny cleanup, lifecycle stubs leak placeholder behavior, and 'platform-store' still lacks a recorded decision for its constrained 'platform-core' runtime dependency. +- problem: Several tranche-1 gaps remain after the auth keystone: test-mode checks fail open, correlation IDs can be fabricated, reviewer authorization still needs default-deny cleanup, lifecycle stubs leak placeholder behavior, and 'platform-store' still lacks a recorded decision for its constrained 'platform-core' runtime dependency. +- value: Plan P12, P13, P15, P16, P19, P20, and P21 as one supporting packet that executes after the component-boundary auth convention is established, but stays distinct from the P11 and event-correctness packets. + +## Behavior + +- rule: Supporting tranche-1 work follows the auth convention +- rule: Legacy shortcuts are removed, not documented as acceptable debt diff --git a/specs/releases/v0.1.0.sdp.md b/specs/releases/v0.1.0.sdp.md index d7e2a2f5..69c6a689 100644 --- a/specs/releases/v0.1.0.sdp.md +++ b/specs/releases/v0.1.0.sdp.md @@ -5,12 +5,12 @@ altitude: epic readiness: idea relations: {} --- -# v0.1.0 — Delivery process foundation +# v0.1.0 - Delivery Process Foundation ## Intent -- outcome: Ship the delivery-process foundation: decisions folder, release management, Spec structure, and unified tag prefix. +- outcome: v0.1.0 - Delivery Process Foundation ## Decision -- decision: Treat v0.1.0 as a release-scoped decision Spec summarizing the ship boundary for that release train. +- decision: v0.1.0 - Delivery Process Foundation diff --git a/specs/releases/v0.2.0.sdp.md b/specs/releases/v0.2.0.sdp.md index 1340d8a1..2b054736 100644 --- a/specs/releases/v0.2.0.sdp.md +++ b/specs/releases/v0.2.0.sdp.md @@ -5,12 +5,12 @@ altitude: epic readiness: idea relations: {} --- -# v0.2.0 — Platform roadmap (aggregate-less pivot) +# v0.2.0 - Platform Roadmap (Aggregate-Less Pivot) ## Intent -- outcome: Ship the aggregate-less platform roadmap release that repositions platform packages and example guidance. +- outcome: v0.2.0 - Platform Roadmap (Aggregate-Less Pivot) ## Decision -- decision: Treat v0.2.0 as a release-scoped decision Spec summarizing the ship boundary for that release train. +- decision: v0.2.0 - Platform Roadmap (Aggregate-Less Pivot) diff --git a/specs/releases/v0.3.0.sdp.md b/specs/releases/v0.3.0.sdp.md index fb75a1c7..92a0f3ec 100644 --- a/specs/releases/v0.3.0.sdp.md +++ b/specs/releases/v0.3.0.sdp.md @@ -5,12 +5,12 @@ altitude: epic readiness: idea relations: {} --- -# v0.3.0 — TypeScript taxonomy migration +# v0.3.0 - TypeScript Taxonomy Migration ## Intent -- outcome: Ship the TypeScript-sourced taxonomy migration and related process tooling updates. +- outcome: v0.3.0 - TypeScript Taxonomy Migration ## Decision -- decision: Treat v0.3.0 as a release-scoped decision Spec summarizing the ship boundary for that release train. +- decision: v0.3.0 - TypeScript Taxonomy Migration diff --git a/specs/releases/vNEXT.sdp.md b/specs/releases/vNEXT.sdp.md index 21c98ee7..6ba975f9 100644 --- a/specs/releases/vNEXT.sdp.md +++ b/specs/releases/vNEXT.sdp.md @@ -5,12 +5,12 @@ altitude: epic readiness: idea relations: {} --- -# vNEXT — Unreleased work +# vNEXT - Unreleased Work ## Intent -- outcome: Track unreleased platform and process work until it is cut into a named release. +- outcome: vNEXT - Unreleased Work ## Decision -- decision: Treat vNEXT as a release-scoped decision Spec summarizing the ship boundary for that release train. +- decision: vNEXT - Unreleased Work diff --git a/specs/test-content-blocks.sdp.md b/specs/test-content-blocks.sdp.md index f07dd3cb..025ef4b2 100644 --- a/specs/test-content-blocks.sdp.md +++ b/specs/test-content-blocks.sdp.md @@ -5,8 +5,8 @@ altitude: story readiness: idea relations: {} --- -# Test content blocks +# Test Content Blocks ## Intent -- outcome: Demonstrate which rich Markdown content blocks generators capture, as a reference for authoring Specs. +- outcome: Test Content Blocks diff --git a/specs/themed-decision-architecture.sdp.md b/specs/themed-decision-architecture.sdp.md index 168d97de..24bec89d 100644 --- a/specs/themed-decision-architecture.sdp.md +++ b/specs/themed-decision-architecture.sdp.md @@ -5,8 +5,16 @@ altitude: feature readiness: idea relations: {} --- -# Themed decision architecture +# Themed Decision Architecture ## Intent -- outcome: Generate themed decision documents and dependency graphs so decision structure reflects conceptual architecture, not only chronology. +- outcome: Themed Decision Architecture + +## Behavior + +- rule: Decisions are grouped by theme +- rule: Decisions declare dependencies +- rule: Decisions are layered by evolution phase +- rule: Existing ADRs are migrated with review +- rule: Multiple output formats are generated diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-001-admin-directory-is-created-with-correct-structure.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-001-admin-directory-is-created-with-correct-structure.sdp.md index d0d7ee6f..89e050e9 100644 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-001-admin-directory-is-created-with-correct-structure.sdp.md +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-001-admin-directory-is-created-with-correct-structure.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Admin directory is created with correct structure" from architect/specs/platform/admin-tooling-consolidation.feature +- outcome: Executable scenario: Admin directory is created with correct structure + +```gwt +Given the following deliverables: +And the example app has no admin/ directory +When admin tooling consolidation is implemented +Then convex/admin/ directory should exist +And it should contain projections.ts, deadLetters.ts, diagnostics.ts, durableFunctions.ts +And _auth.ts should provide authorization wrapper +``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-002-backward-compatibility-for-dlq-imports.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-002-backward-compatibility-for-dlq-imports.sdp.md index 5b6ba545..c886ff0e 100644 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-002-backward-compatibility-for-dlq-imports.sdp.md +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-002-backward-compatibility-for-dlq-imports.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Backward compatibility for DLQ imports" from architect/specs/platform/admin-tooling-consolidation.feature +- outcome: Executable scenario: Backward compatibility for DLQ imports + +```gwt +Given the following deliverables: +And code imports from "convex/projections/deadLetters" +When admin tooling consolidation is complete +Then old import path should still work via re-export +And deprecation warning should be logged +``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-003-get-dead-letter-statistics.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-003-get-dead-letter-statistics.sdp.md index 13dc024b..fbad0dcb 100644 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-003-get-dead-letter-statistics.sdp.md +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-003-get-dead-letter-statistics.sdp.md @@ -6,8 +6,21 @@ readiness: idea relations: refines: spec:platform.admin-tooling-consolidation --- -# Get dead letter statistics +# Trace complete event flow ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Get dead letter statistics" from architect/specs/platform/admin-tooling-consolidation.feature +- outcome: Executable scenario: Trace complete event flow + +```gwt +Given the following deliverables: +And a SubmitOrder command with correlationId "corr-123" +And the command produced OrderSubmitted and OrderConfirmed events +And both events were processed by orderSummary projection +And a saga was triggered +When getEventFlowTrace is called with "corr-123" +Then response should include the command +And response should include 2 events +And response should include projection updates +And response should include saga information +``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-004-bulk-retry-pending-dead-letters.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-004-bulk-retry-pending-dead-letters.sdp.md index 015358ab..45a07e6a 100644 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-004-bulk-retry-pending-dead-letters.sdp.md +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-004-bulk-retry-pending-dead-letters.sdp.md @@ -6,8 +6,17 @@ readiness: idea relations: refines: spec:platform.admin-tooling-consolidation --- -# Bulk retry pending dead letters +# Trace shows failure point ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Bulk retry pending dead letters" from architect/specs/platform/admin-tooling-consolidation.feature +- outcome: Executable scenario: Trace shows failure point + +```gwt +Given the following deliverables: +And a command that produced an event +And the event failed projection processing +When getEventFlowTrace is called +Then deadLetters array should include the failure +And error message should be visible +``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-005-trace-complete-event-flow.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-005-trace-complete-event-flow.sdp.md index 65e52bcd..ffd0297b 100644 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-005-trace-complete-event-flow.sdp.md +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-005-trace-complete-event-flow.sdp.md @@ -6,8 +6,16 @@ readiness: idea relations: refines: spec:platform.admin-tooling-consolidation --- -# Trace complete event flow +# Query Workpool item status ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Trace complete event flow" from architect/specs/platform/admin-tooling-consolidation.feature +- outcome: Executable scenario: Query Workpool item status + +```gwt +Given the following deliverables: +And a Workpool item with ID "work-123" in "pending" state +When getWorkpoolItem is called with "work-123" +Then response should include state "pending" +And response should include previousAttempts count +``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-006-trace-shows-failure-point.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-006-trace-shows-failure-point.sdp.md index 05ac7345..41eb2b43 100644 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-006-trace-shows-failure-point.sdp.md +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-006-trace-shows-failure-point.sdp.md @@ -6,8 +6,17 @@ readiness: idea relations: refines: spec:platform.admin-tooling-consolidation --- -# Trace shows failure point +# Query Workflow execution with steps ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Trace shows failure point" from architect/specs/platform/admin-tooling-consolidation.feature +- outcome: Executable scenario: Query Workflow execution with steps + +```gwt +Given the following deliverables: +And a Workflow with ID "wf-456" that has completed 3 steps +When getWorkflowExecution is called with "wf-456" +Then response should include workflow status +And response.steps should have 3 entries +And each step should include name, status, and duration +``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-007-system-state-provides-complete-overview.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-007-system-state-provides-complete-overview.sdp.md index ebd0531d..114c212c 100644 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-007-system-state-provides-complete-overview.sdp.md +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-007-system-state-provides-complete-overview.sdp.md @@ -6,8 +6,16 @@ readiness: idea relations: refines: spec:platform.admin-tooling-consolidation --- -# System state provides complete overview +# Query non-existent durable function ## Intent -- outcome: Architect scenario (not an SDP test carrier) "System state provides complete overview" from architect/specs/platform/admin-tooling-consolidation.feature +- outcome: Executable scenario: Query non-existent durable function + +```gwt +Given the following deliverables: +And no Workpool item with ID "work-nonexistent" +When getWorkpoolItem is called +Then response should indicate item not found +And no error should be thrown +``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-008-query-workpool-item-status.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-008-query-workpool-item-status.sdp.md index 157b126c..6b855de5 100644 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-008-query-workpool-item-status.sdp.md +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-008-query-workpool-item-status.sdp.md @@ -6,8 +6,15 @@ readiness: idea relations: refines: spec:platform.admin-tooling-consolidation --- -# Query Workpool item status +# Unauthenticated request is rejected ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Query Workpool item status" from architect/specs/platform/admin-tooling-consolidation.feature +- outcome: Executable scenario: Unauthenticated request is rejected + +```gwt +Given the following deliverables: +And no authentication token is provided +When an admin endpoint is called +Then error should be "UNAUTHENTICATED" +``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-009-query-workflow-execution-with-steps.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-009-query-workflow-execution-with-steps.sdp.md index 1d9aeac9..86a40041 100644 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-009-query-workflow-execution-with-steps.sdp.md +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-009-query-workflow-execution-with-steps.sdp.md @@ -6,8 +6,15 @@ readiness: idea relations: refines: spec:platform.admin-tooling-consolidation --- -# Query Workflow execution with steps +# Non-admin user is rejected ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Query Workflow execution with steps" from architect/specs/platform/admin-tooling-consolidation.feature +- outcome: Executable scenario: Non-admin user is rejected + +```gwt +Given the following deliverables: +And a user without admin role +When an admin endpoint is called +Then error should be "UNAUTHORIZED: Admin role required" +``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-010-query-non-existent-durable-function.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-010-query-non-existent-durable-function.sdp.md index 8a608b84..029fcd69 100644 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-010-query-non-existent-durable-function.sdp.md +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-010-query-non-existent-durable-function.sdp.md @@ -6,8 +6,16 @@ readiness: idea relations: refines: spec:platform.admin-tooling-consolidation --- -# Query non-existent durable function +# Admin action is logged ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Query non-existent durable function" from architect/specs/platform/admin-tooling-consolidation.feature +- outcome: Executable scenario: Admin action is logged + +```gwt +Given the following deliverables: +And an admin user triggers a projection rebuild +When the action completes +Then an entry should be added to adminAuditLog +And entry should include action, args, userId, and timestamp +``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-011-unauthenticated-request-is-rejected.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-011-unauthenticated-request-is-rejected.sdp.md index 3a621916..6a71a2b3 100644 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-011-unauthenticated-request-is-rejected.sdp.md +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-011-unauthenticated-request-is-rejected.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Unauthenticated request is rejected" from architect/specs/platform/admin-tooling-consolidation.feature +- outcome: Executable scenario: Unauthenticated request is rejected + +```gwt +Given the following deliverables: +And no authentication token is provided +When an admin endpoint is called +Then error should be "UNAUTHENTICATED" +``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-012-non-admin-user-is-rejected.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-012-non-admin-user-is-rejected.sdp.md index 4891adde..56a814d9 100644 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-012-non-admin-user-is-rejected.sdp.md +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-012-non-admin-user-is-rejected.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Non-admin user is rejected" from architect/specs/platform/admin-tooling-consolidation.feature +- outcome: Executable scenario: Non-admin user is rejected + +```gwt +Given the following deliverables: +And a user without admin role +When an admin endpoint is called +Then error should be "UNAUTHORIZED: Admin role required" +``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-013-admin-action-is-logged.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-013-admin-action-is-logged.sdp.md index 52963658..97247265 100644 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-013-admin-action-is-logged.sdp.md +++ b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-013-admin-action-is-logged.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Admin action is logged" from architect/specs/platform/admin-tooling-consolidation.feature +- outcome: Executable scenario: Admin action is logged + +```gwt +Given the following deliverables: +And an admin user triggers a projection rebuild +When the action completes +Then an entry should be added to adminAuditLog +And entry should include action, args, userId, and timestamp +``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-001-dead-letter-list-displays-failed-events-from-both-agents.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-001-dead-letter-list-displays-failed-events-from-both-agents.sdp.md index ba24388e..eedfd8ef 100644 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-001-dead-letter-list-displays-failed-events-from-both-agents.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-001-dead-letter-list-displays-failed-events-from-both-agents.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Dead letter list displays failed events from both agents" from architect/specs/example-app/agent-admin-frontend.feature +- outcome: Executable scenario: Dead letter list displays failed events from both agents + +```gwt +Given the following deliverables: +And 2 dead letter entries exist for the churn-risk agent +And 1 dead letter entry exists for the high-value-order agent +When I navigate to the Monitoring tab +Then I see a "Dead Letters" section with 3 entries +And each entry shows agent ID, event type, error, and timestamp +And each entry has "Replay" and "Ignore" action buttons +``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-002-replay-action-triggers-backend-mutation-with-toast-feedback.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-002-replay-action-triggers-backend-mutation-with-toast-feedback.sdp.md index cb9a968d..194c4c19 100644 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-002-replay-action-triggers-backend-mutation-with-toast-feedback.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-002-replay-action-triggers-backend-mutation-with-toast-feedback.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Replay action triggers backend mutation with toast feedback" from architect/specs/example-app/agent-admin-frontend.feature +- outcome: Executable scenario: Replay action triggers backend mutation with toast feedback + +```gwt +Given the following deliverables: +And a dead letter entry for the churn-risk agent +When I click the "Replay" button +Then the replayDeadLetter mutation is called +And a success toast shows "Dead letter replayed successfully" +And the entry status updates to "replayed" +And the Replay button is replaced with a "Replayed" status indicator +``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-003-ignore-action-with-reason-provides-confirmation.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-003-ignore-action-with-reason-provides-confirmation.sdp.md index 5b859ad9..15f6832f 100644 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-003-ignore-action-with-reason-provides-confirmation.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-003-ignore-action-with-reason-provides-confirmation.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Ignore action with reason provides confirmation" from architect/specs/example-app/agent-admin-frontend.feature +- outcome: Executable scenario: Ignore action with reason provides confirmation + +```gwt +Given the following deliverables: +And a dead letter entry for event "evt_456" +When I click "Ignore" and enter reason "Duplicate event, already processed" +Then the ignoreDeadLetter mutation is called with the reason +And a success toast shows "Dead letter ignored" +And the entry status updates to "ignored" +``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-004-replay-failure-shows-error-toast.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-004-replay-failure-shows-error-toast.sdp.md index 3c514cb0..c2a817d1 100644 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-004-replay-failure-shows-error-toast.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-004-replay-failure-shows-error-toast.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Replay failure shows error toast" from architect/specs/example-app/agent-admin-frontend.feature +- outcome: Executable scenario: Replay failure shows error toast + +```gwt +Given the following deliverables: +And a dead letter entry whose original event no longer exists +When I click the "Replay" button +Then the mutation fails with an error +And an error toast shows a descriptive message +And the entry remains in "pending" status +``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-005-filter-dead-letters-by-agent.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-005-filter-dead-letters-by-agent.sdp.md index af82137e..1f18b203 100644 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-005-filter-dead-letters-by-agent.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-005-filter-dead-letters-by-agent.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Filter dead letters by agent" from architect/specs/example-app/agent-admin-frontend.feature +- outcome: Executable scenario: Filter dead letters by agent + +```gwt +Given the following deliverables: +And dead letters exist for both churn-risk and high-value-order agents +When I select "high-value-order-agent" in the agent filter +Then only dead letters for the high-value-order agent are shown +``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-006-view-decision-history-with-decisions-from-both-agents.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-006-view-decision-history-with-decisions-from-both-agents.sdp.md index 2802b40a..1591b639 100644 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-006-view-decision-history-with-decisions-from-both-agents.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-006-view-decision-history-with-decisions-from-both-agents.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "View decision history with decisions from both agents" from architect/specs/example-app/agent-admin-frontend.feature +- outcome: Executable scenario: View decision history with decisions from both agents + +```gwt +Given the following deliverables: +And the churn-risk agent has detected 3 patterns +And the high-value-order agent has flagged 2 orders +When I click the "Decision History" tab +Then I see 5 audit entries in chronological order +And entries from both agents are interleaved by timestamp +``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-007-filter-decision-history-by-agent.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-007-filter-decision-history-by-agent.sdp.md index 457ca9ee..05040b33 100644 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-007-filter-decision-history-by-agent.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-007-filter-decision-history-by-agent.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Filter decision history by agent" from architect/specs/example-app/agent-admin-frontend.feature +- outcome: Executable scenario: Filter decision history by agent + +```gwt +Given the following deliverables: +And decisions exist for "churn-risk-agent" and "high-value-order-agent" +When I select "churn-risk-agent" in the agent filter +Then only churn-risk agent decisions are displayed +And the entry count updates to reflect the filter +``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-008-filter-decision-history-by-action-type.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-008-filter-decision-history-by-action-type.sdp.md index dc74d3e1..d78f40b7 100644 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-008-filter-decision-history-by-action-type.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-008-filter-decision-history-by-action-type.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Filter decision history by action type" from architect/specs/example-app/agent-admin-frontend.feature +- outcome: Executable scenario: Filter decision history by action type + +```gwt +Given the following deliverables: +And decisions with actions "SuggestCustomerOutreach" and "FlagForVIPReview" +When I select "FlagForVIPReview" in the action filter +Then only FlagForVIPReview decisions are displayed +``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-009-view-decision-detail-with-full-reasoning.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-009-view-decision-detail-with-full-reasoning.sdp.md index b8b79bb5..a2702bda 100644 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-009-view-decision-detail-with-full-reasoning.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-009-view-decision-detail-with-full-reasoning.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "View decision detail with full reasoning" from architect/specs/example-app/agent-admin-frontend.feature +- outcome: Executable scenario: View decision detail with full reasoning + +```gwt +Given the following deliverables: +And the churn-risk agent has made a decision with confidence 0.87 +When I click on the decision entry +Then I see the full LLM reasoning text +And I see the triggering event IDs +And I see whether a command was emitted +And I see whether approval was required +``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-010-empty-decision-history-shows-guidance-message.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-010-empty-decision-history-shows-guidance-message.sdp.md index fc35a067..f9ff001e 100644 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-010-empty-decision-history-shows-guidance-message.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-010-empty-decision-history-shows-guidance-message.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Empty decision history shows guidance message" from architect/specs/example-app/agent-admin-frontend.feature +- outcome: Executable scenario: Empty decision history shows guidance message + +```gwt +Given the following deliverables: +And no agents have made any decisions yet +When I view the "Decision History" tab +Then I see a message explaining what will appear here +And the message mentions both active agents by name +``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-011-approve-action-shows-success-toast.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-011-approve-action-shows-success-toast.sdp.md index a3a864f5..01910095 100644 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-011-approve-action-shows-success-toast.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-011-approve-action-shows-success-toast.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Approve action shows success toast" from architect/specs/example-app/agent-admin-frontend.feature +- outcome: Executable scenario: Approve action shows success toast + +```gwt +Given the following deliverables: +And a pending approval for the churn-risk agent +When I click "Approve" +Then a success toast appears with "Approval recorded" +And the toast auto-dismisses after 5 seconds +And the approval list refreshes +``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-012-reject-action-shows-success-toast.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-012-reject-action-shows-success-toast.sdp.md index a48789e0..d49552f5 100644 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-012-reject-action-shows-success-toast.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-012-reject-action-shows-success-toast.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Reject action shows success toast" from architect/specs/example-app/agent-admin-frontend.feature +- outcome: Executable scenario: Reject action shows success toast + +```gwt +Given the following deliverables: +And a pending approval for the high-value-order agent +When I click "Reject" and provide a note +Then a success toast appears with "Action rejected" +And the approval is removed from the pending list +``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-013-error-action-shows-descriptive-error-toast.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-013-error-action-shows-descriptive-error-toast.sdp.md index 27e08297..e2820f08 100644 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-013-error-action-shows-descriptive-error-toast.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-013-error-action-shows-descriptive-error-toast.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Error action shows descriptive error toast" from architect/specs/example-app/agent-admin-frontend.feature +- outcome: Executable scenario: Error action shows descriptive error toast + +```gwt +Given the following deliverables: +And a pending approval that has already been expired +When I attempt to approve it +Then an error toast appears with "Approval has expired" +And the toast has role="alert" for accessibility +And the approval status shows "expired" +``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-014-multiple-rapid-actions-show-stacked-toasts.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-014-multiple-rapid-actions-show-stacked-toasts.sdp.md index 257c4cea..e3245938 100644 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-014-multiple-rapid-actions-show-stacked-toasts.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-014-multiple-rapid-actions-show-stacked-toasts.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Multiple rapid actions show stacked toasts" from architect/specs/example-app/agent-admin-frontend.feature +- outcome: Executable scenario: Multiple rapid actions show stacked toasts + +```gwt +Given the following deliverables: +And 3 pending approvals from different agents +When I quickly approve all 3 +Then 3 success toasts appear in sequence +And each toast is individually dismissable +And they auto-dismiss in order +``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-015-high-value-order-detected-and-surfaces-as-vip-approval.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-015-high-value-order-detected-and-surfaces-as-vip-approval.sdp.md index 4eafe1da..71194f23 100644 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-015-high-value-order-detected-and-surfaces-as-vip-approval.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-015-high-value-order-detected-and-surfaces-as-vip-approval.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "High-value order detected and surfaces as VIP approval" from architect/specs/example-app/agent-admin-frontend.feature +- outcome: Executable scenario: High-value order detected and surfaces as VIP approval + +```gwt +Given the following deliverables: +And a product exists with price $200 per unit +And the product has sufficient stock +When a customer creates an order with 3 units (total $600) and the order is submitted and confirmed by the saga +Then the high-value-order-agent detects the OrderConfirmed event +And the LLM analyzes the order for VIP treatment +And a FlagForVIPReview approval appears in the admin dashboard +And the approval shows confidence, reasoning, and order details +``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-016-low-value-order-does-not-trigger-agent.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-016-low-value-order-does-not-trigger-agent.sdp.md index 2c31464b..8fb574f3 100644 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-016-low-value-order-does-not-trigger-agent.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-016-low-value-order-does-not-trigger-agent.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Low-value order does not trigger agent" from architect/specs/example-app/agent-admin-frontend.feature +- outcome: Executable scenario: Low-value order does not trigger agent + +```gwt +Given the following deliverables: +And a product exists with price $10 per unit +When a customer creates an order with 2 units (total $20) and the order is submitted and confirmed +Then the high-value-order-agent receives the event +And the pattern trigger does not fire (totalAmount < $500) +And no approval is created +``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-017-admin-approves-vip-flag-for-high-value-order.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-017-admin-approves-vip-flag-for-high-value-order.sdp.md index c608cbb1..1a669f64 100644 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-017-admin-approves-vip-flag-for-high-value-order.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-017-admin-approves-vip-flag-for-high-value-order.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Admin approves VIP flag for high-value order" from architect/specs/example-app/agent-admin-frontend.feature +- outcome: Executable scenario: Admin approves VIP flag for high-value order + +```gwt +Given the following deliverables: +And there is a pending FlagForVIPReview approval +And the approval shows order total $1,200 with confidence 0.91 +When the admin reviews the reasoning and clicks "Approve" +Then a success toast shows "Approval recorded for high-value-order-agent" +And the FlagForVIPReview command is routed to the VIP handler +And the decision appears in the decision history tab +``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-018-both-agents-trigger-from-same-customer-activity.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-018-both-agents-trigger-from-same-customer-activity.sdp.md index 1f93eb90..b283be50 100644 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-018-both-agents-trigger-from-same-customer-activity.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-018-both-agents-trigger-from-same-customer-activity.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Both agents trigger from same customer activity" from architect/specs/example-app/agent-admin-frontend.feature +- outcome: Executable scenario: Both agents trigger from same customer activity + +```gwt +Given the following deliverables: +And a customer has cancelled 2 orders previously +And the customer places a new high-value order ($800) +When the customer cancels the high-value order (3rd cancellation) +Then the churn-risk agent detects the 3+ cancellation pattern +And the high-value-order agent had previously flagged the order +And both decisions appear in the decision history +And the admin can filter by agent to see each agent's perspective +``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-019-dashboard-shows-both-active-agents.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-019-dashboard-shows-both-active-agents.sdp.md index 0cca734b..0774df89 100644 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-019-dashboard-shows-both-active-agents.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-019-dashboard-shows-both-active-agents.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Dashboard shows both active agents" from architect/specs/example-app/agent-admin-frontend.feature +- outcome: Executable scenario: Dashboard shows both active agents + +```gwt +Given the following deliverables: +And the churn-risk agent has processed 100 events +And the high-value-order agent has processed 50 events +When I view the agents dashboard +Then the Active Agents count shows "2" +And the Events Processed count shows "150" +And both agent names are visible +``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-020-pending-approvals-count-includes-both-agents.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-020-pending-approvals-count-includes-both-agents.sdp.md index 002da331..4801fd74 100644 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-020-pending-approvals-count-includes-both-agents.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-020-pending-approvals-count-includes-both-agents.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Pending approvals count includes both agents" from architect/specs/example-app/agent-admin-frontend.feature +- outcome: Executable scenario: Pending approvals count includes both agents + +```gwt +Given the following deliverables: +And there are 2 pending approvals from churn-risk agent +And there is 1 pending approval from high-value-order agent +When I view the agents dashboard +Then the Pending Approvals count shows "3" +And the Pending Approvals tab badge shows "3" +``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-021-one-agent-stopped-one-active.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-021-one-agent-stopped-one-active.sdp.md index 28beb2ec..742f5de0 100644 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-021-one-agent-stopped-one-active.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-021-one-agent-stopped-one-active.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "One agent stopped, one active" from architect/specs/example-app/agent-admin-frontend.feature +- outcome: Executable scenario: One agent stopped, one active + +```gwt +Given the following deliverables: +And the churn-risk agent is in "active" status +And the high-value-order agent is in "stopped" status +When I view the monitoring tab +Then I see the churn-risk agent with "Active" badge +And I see the high-value-order agent with "Stopped" badge +And the Active Agents count on dashboard shows "1" +``` diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-001-agent-component-registers-with-isolated-schema.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-001-agent-component-registers-with-isolated-schema.sdp.md index af2e574c..9a900f80 100644 --- a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-001-agent-component-registers-with-isolated-schema.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-001-agent-component-registers-with-isolated-schema.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Agent component registers with isolated schema" from architect/specs/platform/agent-bc-component-isolation.feature +- outcome: Architect scenario: Agent component registers with isolated schema + +```gwt +Given the agent component is defined with defineComponent +When the app mounts the agent component via app.use +Then the agent's tables are isolated from the app schema +And the app cannot directly query agentCheckpoints +And all access goes through components.agent.* handlers +``` diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-002-component-api-provides-full-crud-for-checkpoints.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-002-component-api-provides-full-crud-for-checkpoints.sdp.md index 4bc9388b..266ebd17 100644 --- a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-002-component-api-provides-full-crud-for-checkpoints.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-002-component-api-provides-full-crud-for-checkpoints.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Component API provides full CRUD for checkpoints" from architect/specs/platform/agent-bc-component-isolation.feature +- outcome: Architect scenario: Component API provides full CRUD for checkpoints + +```gwt +Given the agent component is mounted +When a checkpoint is created via components.agent.checkpoints.load +Then the checkpoint is stored in the component's isolated database +And it can be updated via components.agent.checkpoints.update +And it can be queried via components.agent.checkpoints.load +``` diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-003-direct-table-access-is-not-possible-from-parent.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-003-direct-table-access-is-not-possible-from-parent.sdp.md index 675f5f24..2f2543e4 100644 --- a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-003-direct-table-access-is-not-possible-from-parent.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-003-direct-table-access-is-not-possible-from-parent.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Direct table access is not possible from parent" from architect/specs/platform/agent-bc-component-isolation.feature +- outcome: Architect scenario: Direct table access is not possible from parent + +```gwt +Given the agent component is mounted +When the parent app attempts ctx.db.query("agentCheckpoints") +Then the query returns no results +And agent data is only accessible through component API handlers +``` diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-004-component-sub-transactions-provide-isolation.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-004-component-sub-transactions-provide-isolation.sdp.md index 5ba733e3..099cb2a0 100644 --- a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-004-component-sub-transactions-provide-isolation.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-004-component-sub-transactions-provide-isolation.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Component sub-transactions provide isolation" from architect/specs/platform/agent-bc-component-isolation.feature +- outcome: Architect scenario: Component sub-transactions provide isolation + +```gwt +Given a parent mutation that calls agent component handlers +When the agent component handler throws an error and the parent catches the exception +Then only the agent component write is rolled back +And the parent mutation's other writes succeed +``` diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-005-agent-handler-receives-projection-data-as-argument.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-005-agent-handler-receives-projection-data-as-argument.sdp.md index 2ff190ee..643f38f4 100644 --- a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-005-agent-handler-receives-projection-data-as-argument.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-005-agent-handler-receives-projection-data-as-argument.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Agent handler receives projection data as argument" from architect/specs/platform/agent-bc-component-isolation.feature +- outcome: Architect scenario: Agent handler receives projection data as argument + +```gwt +Given the agent event handler is triggered by an OrderCancelled event +When the handler needs customer cancellation history +Then it receives the history as a pre-loaded argument +And it does not directly query customerCancellations table +``` diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-006-missing-projection-data-returns-empty-result.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-006-missing-projection-data-returns-empty-result.sdp.md index 86afb446..0985fd89 100644 --- a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-006-missing-projection-data-returns-empty-result.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-006-missing-projection-data-returns-empty-result.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Missing projection data returns empty result" from architect/specs/platform/agent-bc-component-isolation.feature +- outcome: Architect scenario: Missing projection data returns empty result + +```gwt +Given a new customer with no cancellation history +When the agent handler receives an event for this customer +Then the cancellation history argument is an empty array +And the handler proceeds with rule-based analysis +And no error is thrown +``` diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-007-agent-handler-cannot-directly-access-app-level-projection-tables.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-007-agent-handler-cannot-directly-access-app-level-projection-tables.sdp.md index a1bb5126..aba4ed7e 100644 --- a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-007-agent-handler-cannot-directly-access-app-level-projection-tables.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-007-agent-handler-cannot-directly-access-app-level-projection-tables.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Agent handler cannot directly access app-level projection tables" from architect/specs/platform/agent-bc-component-isolation.feature +- outcome: Architect scenario: Agent handler cannot directly access app-level projection tables + +```gwt +Given the agent component is processing an event +When the handler attempts to query customerCancellations directly +Then the query is not available inside the component context +And the handler must use the injected data argument instead +``` diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-008-app-level-queries-can-access-agent-data-via-component-api.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-008-app-level-queries-can-access-agent-data-via-component-api.sdp.md index 439f735b..014d51ee 100644 --- a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-008-app-level-queries-can-access-agent-data-via-component-api.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-008-app-level-queries-can-access-agent-data-via-component-api.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "App-level queries can access agent data via component API" from architect/specs/platform/agent-bc-component-isolation.feature +- outcome: Architect scenario: App-level queries can access agent data via component API + +```gwt +Given the admin UI needs to display agent audit events +When it queries via components.agent.audit.queryAuditEvents +Then it receives the audit events for the requested agent +And the query respects agent component boundaries +``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-001-agent-command-routes-through-command-orchestrator-to-handler.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-001-agent-command-routes-through-command-orchestrator-to-handler.sdp.md index 6251da3a..046a3f7e 100644 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-001-agent-command-routes-through-command-orchestrator-to-handler.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-001-agent-command-routes-through-command-orchestrator-to-handler.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Agent command routes through CommandOrchestrator to handler" from architect/specs/platform/agent-command-infrastructure.feature +- outcome: Executable scenario: Agent command routes through CommandOrchestrator to handler + +```gwt +Given the following deliverables: +And an agent has emitted a SuggestCustomerOutreach command +When the command is routed via CommandOrchestrator +Then the registered handler for SuggestCustomerOutreach is called +And the command status transitions pending -> processing -> completed +And an audit event records the command execution +``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-002-unknown-command-type-is-rejected-with-validation-error.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-002-unknown-command-type-is-rejected-with-validation-error.sdp.md index a7491bb2..595d0c4f 100644 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-002-unknown-command-type-is-rejected-with-validation-error.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-002-unknown-command-type-is-rejected-with-validation-error.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Unknown command type is rejected with validation error" from architect/specs/platform/agent-command-infrastructure.feature +- outcome: Executable scenario: Unknown command type is rejected with validation error + +```gwt +Given the following deliverables: +And an agent emits a command with unregistered type "UnknownAction" +When the command routing attempts to find a handler +Then the routing fails with UNKNOWN_COMMAND_TYPE error +And the command status transitions to "failed" +And an audit event records the failure +``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-003-command-idempotency-prevents-duplicate-processing.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-003-command-idempotency-prevents-duplicate-processing.sdp.md index 7beaa3a0..dbbd616f 100644 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-003-command-idempotency-prevents-duplicate-processing.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-003-command-idempotency-prevents-duplicate-processing.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Command idempotency prevents duplicate processing" from architect/specs/platform/agent-command-infrastructure.feature +- outcome: Executable scenario: Command idempotency prevents duplicate processing + +```gwt +Given the following deliverables: +And an agent emits a SuggestCustomerOutreach command with commandId "cmd_123" +And the command has already been processed successfully +When the same commandId is submitted again +Then the Command Bus rejects it as a duplicate +And no handler is called +``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-004-pause-agent-transitions-active-agent-to-paused.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-004-pause-agent-transitions-active-agent-to-paused.sdp.md index 4a365531..71b05c08 100644 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-004-pause-agent-transitions-active-agent-to-paused.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-004-pause-agent-transitions-active-agent-to-paused.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "PauseAgent transitions active agent to paused" from architect/specs/platform/agent-command-infrastructure.feature +- outcome: Executable scenario: PauseAgent transitions active agent to paused + +```gwt +Given the following deliverables: +And a churn-risk agent in "active" state +When a PauseAgent command is executed +Then the agent state transitions to "paused" +And the checkpoint is preserved at current position +And new events are not processed while paused +And an AgentPaused audit event is recorded +``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-005-resume-agent-resumes-from-checkpoint-position.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-005-resume-agent-resumes-from-checkpoint-position.sdp.md index 139a927a..6a48b41c 100644 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-005-resume-agent-resumes-from-checkpoint-position.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-005-resume-agent-resumes-from-checkpoint-position.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "ResumeAgent resumes from checkpoint position" from architect/specs/platform/agent-command-infrastructure.feature +- outcome: Executable scenario: ResumeAgent resumes from checkpoint position + +```gwt +Given the following deliverables: +And a churn-risk agent in "paused" state +And the checkpoint is at position 42 +When a ResumeAgent command is executed +Then the agent state transitions to "active" +And event processing resumes from position 43 +And an AgentResumed audit event is recorded +``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-006-invalid-lifecycle-transition-is-rejected.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-006-invalid-lifecycle-transition-is-rejected.sdp.md index 0d756fad..35b7d9d4 100644 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-006-invalid-lifecycle-transition-is-rejected.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-006-invalid-lifecycle-transition-is-rejected.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Invalid lifecycle transition is rejected" from architect/specs/platform/agent-command-infrastructure.feature +- outcome: Executable scenario: Invalid lifecycle transition is rejected + +```gwt +Given the following deliverables: +And a churn-risk agent in "stopped" state +When a PauseAgent command is executed +Then the command is rejected with INVALID_LIFECYCLE_TRANSITION +And the agent remains in "stopped" state +And the rejection is recorded in audit trail +``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-007-reconfigure-agent-updates-configuration-without-losing-state.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-007-reconfigure-agent-updates-configuration-without-losing-state.sdp.md index 42d315d5..42abd4c4 100644 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-007-reconfigure-agent-updates-configuration-without-losing-state.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-007-reconfigure-agent-updates-configuration-without-losing-state.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "ReconfigureAgent updates configuration without losing state" from architect/specs/platform/agent-command-infrastructure.feature +- outcome: Executable scenario: ReconfigureAgent updates configuration without losing state + +```gwt +Given the following deliverables: +And an active churn-risk agent with confidenceThreshold 0.8 +When a ReconfigureAgent command changes threshold to 0.7 +Then the agent continues from its current checkpoint +And future analysis uses the new threshold +And the config change is recorded in audit trail +``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-008-agent-config-references-patterns-from-registry.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-008-agent-config-references-patterns-from-registry.sdp.md index ca0e8b0b..7d2ffd9a 100644 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-008-agent-config-references-patterns-from-registry.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-008-agent-config-references-patterns-from-registry.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Agent config references patterns from registry" from architect/specs/platform/agent-command-infrastructure.feature +- outcome: Executable scenario: Agent config references patterns from registry + +```gwt +Given the following deliverables: +And a pattern "churn-risk" registered in the pattern registry +When configuring a churn-risk agent +Then the agent config references patterns by name +And the handler loads pattern definitions from registry at startup +``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-009-handler-uses-pattern-trigger-for-cheap-detection.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-009-handler-uses-pattern-trigger-for-cheap-detection.sdp.md index 642b4e11..a2258047 100644 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-009-handler-uses-pattern-trigger-for-cheap-detection.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-009-handler-uses-pattern-trigger-for-cheap-detection.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Handler uses pattern trigger for cheap detection" from architect/specs/platform/agent-command-infrastructure.feature +- outcome: Executable scenario: Handler uses pattern trigger for cheap detection + +```gwt +Given the following deliverables: +And an event delivered to the agent handler +When the handler evaluates patterns +Then it calls pattern.trigger(eventHistory) first +And only proceeds to pattern.analyze() if trigger returns true +And this avoids unnecessary LLM calls for non-matching events +``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-010-handler-uses-pattern-analyze-for-llm-analysis.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-010-handler-uses-pattern-analyze-for-llm-analysis.sdp.md index 11608c4b..07c9670e 100644 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-010-handler-uses-pattern-analyze-for-llm-analysis.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-010-handler-uses-pattern-analyze-for-llm-analysis.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Handler uses pattern analyze for LLM analysis" from architect/specs/platform/agent-command-infrastructure.feature +- outcome: Executable scenario: Handler uses pattern analyze for LLM analysis + +```gwt +Given the following deliverables: +And a pattern trigger has fired for 3+ cancellations +When the handler calls pattern.analyze(eventHistory, agentContext) +Then the LLM analysis provides confidence, reasoning, and suggested action +And the result is wrapped in an AgentDecision +And the analysis method is recorded as "llm" in the audit trail +``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-011-unknown-pattern-name-in-config-fails-validation.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-011-unknown-pattern-name-in-config-fails-validation.sdp.md index 20c5066c..bcc21408 100644 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-011-unknown-pattern-name-in-config-fails-validation.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-011-unknown-pattern-name-in-config-fails-validation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Unknown pattern name in config fails validation" from architect/specs/platform/agent-command-infrastructure.feature +- outcome: Executable scenario: Unknown pattern name in config fails validation + +```gwt +Given the following deliverables: +And an agent config referencing pattern "nonexistent-pattern" +When the agent is initialized +Then initialization fails with PATTERN_NOT_FOUND error +And the error includes the pattern name for debugging +``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-001-agent-action-handler-calls-llm-and-returns-decision.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-001-agent-action-handler-calls-llm-and-returns-decision.sdp.md index 77a89213..7492d0d8 100644 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-001-agent-action-handler-calls-llm-and-returns-decision.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-001-agent-action-handler-calls-llm-and-returns-decision.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Agent action handler calls LLM and returns decision" from architect/specs/platform/agent-llm-integration.feature +- outcome: Executable scenario: Agent action handler calls LLM and returns decision + +```gwt +Given an agent configured with LLM runtime +And an OrderCancelled event is delivered via EventBus +When the action handler processes the event +Then it loads the checkpoint via runQuery +And it loads event history via cross-component query +And it calls the LLM for pattern analysis +And it returns an AgentDecision with confidence and reasoning +``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-002-on-complete-mutation-persists-decision-atomically.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-002-on-complete-mutation-persists-decision-atomically.sdp.md index 02718872..b0739345 100644 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-002-on-complete-mutation-persists-decision-atomically.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-002-on-complete-mutation-persists-decision-atomically.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "onComplete mutation persists decision atomically" from architect/specs/platform/agent-llm-integration.feature +- outcome: Executable scenario: onComplete mutation persists decision atomically + +```gwt +Given an agent action returned a successful AgentDecision +When the onComplete handler fires with result.kind "success" +Then the decision is recorded as an audit event in agent component +And the command is emitted to agent component commands table +And the checkpoint is updated with new position +And all writes happen in a single atomic mutation +``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-003-action-handler-rejects-invalid-agent-configuration.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-003-action-handler-rejects-invalid-agent-configuration.sdp.md index 3f0c050e..64a74fcf 100644 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-003-action-handler-rejects-invalid-agent-configuration.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-003-action-handler-rejects-invalid-agent-configuration.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Action handler rejects invalid agent configuration" from architect/specs/platform/agent-llm-integration.feature +- outcome: Executable scenario: Action handler rejects invalid agent configuration + +```gwt +Given an agent action handler with missing LLM runtime config +And no fallback to rule-based analysis is configured +When the handler is initialized +Then it fails with AGENT_RUNTIME_REQUIRED error +And the error message indicates LLM runtime or fallback must be configured +``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-004-llm-unavailable-propagates-error-through-retries-to-dead-letter.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-004-llm-unavailable-propagates-error-through-retries-to-dead-letter.sdp.md index 5304ec55..5b56f039 100644 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-004-llm-unavailable-propagates-error-through-retries-to-dead-letter.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-004-llm-unavailable-propagates-error-through-retries-to-dead-letter.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "LLM unavailable propagates error through retries to dead letter" from architect/specs/platform/agent-llm-integration.feature +- outcome: Executable scenario: LLM unavailable propagates error through retries to dead letter + +```gwt +Given an agent configured with LLM runtime +And the LLM API returns an error or times out +When the action handler processes the event +Then the error propagates to the Workpool for retry +And after retries exhausted the event is dead-lettered +And a DeadLetterRecorded audit event is created +``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-005-action-failure-triggers-dead-letter-via-on-complete.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-005-action-failure-triggers-dead-letter-via-on-complete.sdp.md index f2910efa..ff5cadc1 100644 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-005-action-failure-triggers-dead-letter-via-on-complete.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-005-action-failure-triggers-dead-letter-via-on-complete.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Action failure triggers dead letter via onComplete" from architect/specs/platform/agent-llm-integration.feature +- outcome: Executable scenario: Action failure triggers dead letter via onComplete + +```gwt +Given an agent action that throws an unrecoverable error +When the onComplete handler fires with result.kind "failed" +Then a dead letter entry is created in agent component +And the checkpoint is NOT advanced +And an AgentAnalysisFailed audit event is recorded +``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-006-rate-limiter-allows-llm-call-within-limits.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-006-rate-limiter-allows-llm-call-within-limits.sdp.md index f38fd7bc..49474752 100644 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-006-rate-limiter-allows-llm-call-within-limits.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-006-rate-limiter-allows-llm-call-within-limits.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Rate limiter allows LLM call within limits" from architect/specs/platform/agent-llm-integration.feature +- outcome: Executable scenario: Rate limiter allows LLM call within limits + +```gwt +Given an agent with rate limit of 60 requests per minute +And 30 requests have been made this minute +When a new event triggers LLM analysis +Then the rate limiter allows the call +And the LLM analysis proceeds normally +``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-007-rate-limiter-blocks-llm-call-when-exceeded.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-007-rate-limiter-blocks-llm-call-when-exceeded.sdp.md index d83250ea..b29515db 100644 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-007-rate-limiter-blocks-llm-call-when-exceeded.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-007-rate-limiter-blocks-llm-call-when-exceeded.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Rate limiter blocks LLM call when exceeded" from architect/specs/platform/agent-llm-integration.feature +- outcome: Executable scenario: Rate limiter blocks LLM call when exceeded + +```gwt +Given an agent with rate limit of 60 requests per minute +And 60 requests have already been made this minute +When a new event triggers LLM analysis +Then the rate limiter denies the call +And the event is requeued for later processing +And an AgentRateLimited audit event is recorded +``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-008-cost-budget-exceeded-pauses-agent.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-008-cost-budget-exceeded-pauses-agent.sdp.md index 1ca8985a..a9b613be 100644 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-008-cost-budget-exceeded-pauses-agent.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-008-cost-budget-exceeded-pauses-agent.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Cost budget exceeded pauses agent" from architect/specs/platform/agent-llm-integration.feature +- outcome: Executable scenario: Cost budget exceeded pauses agent + +```gwt +Given an agent with daily cost budget of 10.00 USD +And 9.50 USD has been spent today +When a new LLM call would cost approximately 0.60 USD +Then the agent is paused automatically +And an AgentBudgetExceeded audit event is recorded +And the event is dead-lettered with reason "budget_exceeded" +``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-009-queue-overflow-triggers-dead-letter.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-009-queue-overflow-triggers-dead-letter.sdp.md index 1c077266..05b4960d 100644 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-009-queue-overflow-triggers-dead-letter.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-009-queue-overflow-triggers-dead-letter.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Queue overflow triggers dead letter" from architect/specs/platform/agent-llm-integration.feature +- outcome: Executable scenario: Queue overflow triggers dead letter + +```gwt +Given an agent with queue depth of 100 +And 100 events are already queued +When another event is rate-limited +Then it is sent to dead letter with reason "queue_overflow" +And an AgentQueueOverflow audit event is recorded +``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-010-agent-subscription-with-on-complete-receives-completion-callbacks.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-010-agent-subscription-with-on-complete-receives-completion-callbacks.sdp.md index 50b84eb7..2f712592 100644 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-010-agent-subscription-with-on-complete-receives-completion-callbacks.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-010-agent-subscription-with-on-complete-receives-completion-callbacks.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Agent subscription with onComplete receives completion callbacks" from architect/specs/platform/agent-llm-integration.feature +- outcome: Executable scenario: Agent subscription with onComplete receives completion callbacks + +```gwt +Given an agent subscription configured with custom onComplete handler +When the agent action completes successfully +Then the custom onComplete handler fires with result.kind "success" +And the handler can update the agent checkpoint +And the handler can record agent-specific audit events +``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-011-failed-agent-jobs-create-dead-letters-via-on-complete.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-011-failed-agent-jobs-create-dead-letters-via-on-complete.sdp.md index 1952bba5..4ac67f77 100644 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-011-failed-agent-jobs-create-dead-letters-via-on-complete.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-011-failed-agent-jobs-create-dead-letters-via-on-complete.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Failed agent jobs create dead letters via onComplete" from architect/specs/platform/agent-llm-integration.feature +- outcome: Executable scenario: Failed agent jobs create dead letters via onComplete + +```gwt +Given an agent subscription configured with custom onComplete handler +When the agent action fails with an error +Then the custom onComplete handler fires with result.kind "failed" +And a dead letter entry is created in the agent component +And the checkpoint is not advanced past the failed event +``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-012-agent-subscription-without-on-complete-uses-global-default.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-012-agent-subscription-without-on-complete-uses-global-default.sdp.md index 18a79a53..0971c4c9 100644 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-012-agent-subscription-without-on-complete-uses-global-default.sdp.md +++ b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-012-agent-subscription-without-on-complete-uses-global-default.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Agent subscription without onComplete uses global default" from architect/specs/platform/agent-llm-integration.feature +- outcome: Executable scenario: Agent subscription without onComplete uses global default + +```gwt +Given an agent subscription without a custom onComplete handler +When the agent action fails +Then the EventBus defaultOnComplete handler fires +And the global dead letter handler processes the failure +``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-001-circuit-remains-closed-on-success.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-001-circuit-remains-closed-on-success.sdp.md index 830a2f1d..96a787f6 100644 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-001-circuit-remains-closed-on-success.sdp.md +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-001-circuit-remains-closed-on-success.sdp.md @@ -6,8 +6,16 @@ readiness: idea relations: refines: spec:platform.circuit-breaker-pattern --- -# Circuit remains closed on success +# Timeout transitions open to half-open ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Circuit remains closed on success" from architect/specs/platform/circuit-breaker-pattern.feature +- outcome: Executable scenario: Timeout transitions open to half-open + +```gwt +Given the following deliverables: +And a circuit "stripe-api" opened at timestamp 1000 +And resetTimeoutMs is 30000 +When timeout fires at timestamp 31000 +Then circuit should transition to "half_open" +``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-002-circuit-opens-after-threshold-failures.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-002-circuit-opens-after-threshold-failures.sdp.md index 98e47a68..0e4c2878 100644 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-002-circuit-opens-after-threshold-failures.sdp.md +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-002-circuit-opens-after-threshold-failures.sdp.md @@ -6,8 +6,18 @@ readiness: idea relations: refines: spec:platform.circuit-breaker-pattern --- -# Circuit opens after threshold failures +# Stale timeout is ignored ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Circuit opens after threshold failures" from architect/specs/platform/circuit-breaker-pattern.feature +- outcome: Executable scenario: Stale timeout is ignored + +```gwt +Given the following deliverables: +And a circuit "stripe-api" was opened at timestamp 1000 +And circuit was manually closed at timestamp 10000 +And circuit opened again at timestamp 20000 +When stale timeout fires with openedAt=1000 +Then timeout should be skipped +And circuit should remain in current state +``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-003-circuit-transitions-to-half-open-after-timeout.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-003-circuit-transitions-to-half-open-after-timeout.sdp.md index 2d258f53..d9bc4d58 100644 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-003-circuit-transitions-to-half-open-after-timeout.sdp.md +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-003-circuit-transitions-to-half-open-after-timeout.sdp.md @@ -6,8 +6,15 @@ readiness: idea relations: refines: spec:platform.circuit-breaker-pattern --- -# Circuit transitions to half-open after timeout +# Payment circuit opens after 3 failures ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Circuit transitions to half-open after timeout" from architect/specs/platform/circuit-breaker-pattern.feature +- outcome: Executable scenario: Payment circuit opens after 3 failures + +```gwt +Given the following deliverables: +And a circuit "stripe-api" with failureThreshold 3 +When 3 consecutive failures occur +Then circuit should be "open" +``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-004-successful-probe-closes-circuit.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-004-successful-probe-closes-circuit.sdp.md index f260bf18..7df1aabd 100644 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-004-successful-probe-closes-circuit.sdp.md +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-004-successful-probe-closes-circuit.sdp.md @@ -6,8 +6,16 @@ readiness: idea relations: refines: spec:platform.circuit-breaker-pattern --- -# Successful probe closes circuit +# Email circuit tolerates more failures ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Successful probe closes circuit" from architect/specs/platform/circuit-breaker-pattern.feature +- outcome: Executable scenario: Email circuit tolerates more failures + +```gwt +Given the following deliverables: +And a circuit "sendgrid" with failureThreshold 10 +When 5 failures occur +Then circuit should still be "closed" +And failureCount should be 5 +``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-005-failed-probe-reopens-circuit.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-005-failed-probe-reopens-circuit.sdp.md index 6c42faf8..c63a43a2 100644 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-005-failed-probe-reopens-circuit.sdp.md +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-005-failed-probe-reopens-circuit.sdp.md @@ -6,8 +6,17 @@ readiness: idea relations: refines: spec:platform.circuit-breaker-pattern --- -# Failed probe reopens circuit +# Different services have independent circuits ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Failed probe reopens circuit" from architect/specs/platform/circuit-breaker-pattern.feature +- outcome: Executable scenario: Different services have independent circuits + +```gwt +Given the following deliverables: +And circuit "stripe-api" is "open" +And circuit "sendgrid" is "closed" +When a Stripe request is made and a SendGrid request is made +Then it should fail fast +And it should execute normally +``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-006-circuit-state-persists-across-function-calls.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-006-circuit-state-persists-across-function-calls.sdp.md index d6b8fae5..3a7106d3 100644 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-006-circuit-state-persists-across-function-calls.sdp.md +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-006-circuit-state-persists-across-function-calls.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Circuit state persists across function calls" from architect/specs/platform/circuit-breaker-pattern.feature +- outcome: Architect scenario: Circuit state persists across function calls + +```gwt +Given a circuit "stripe-api" in "closed" state +When two concurrent requests fail +Then both failures should be recorded +And failureCount should be 2 (not 1) +``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-007-non-existent-circuit-defaults-to-closed.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-007-non-existent-circuit-defaults-to-closed.sdp.md index 0189fc84..7b6dffa6 100644 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-007-non-existent-circuit-defaults-to-closed.sdp.md +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-007-non-existent-circuit-defaults-to-closed.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Non-existent circuit defaults to closed" from architect/specs/platform/circuit-breaker-pattern.feature +- outcome: Architect scenario: Non-existent circuit defaults to closed + +```gwt +Given no circuit entry for "new-service" +When loading circuit state +Then state should be "closed" +And failureCount should be 0 +And default config should be applied +``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-008-timeout-transitions-open-to-half-open.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-008-timeout-transitions-open-to-half-open.sdp.md index 6556f71d..a49cad66 100644 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-008-timeout-transitions-open-to-half-open.sdp.md +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-008-timeout-transitions-open-to-half-open.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Timeout transitions open to half-open" from architect/specs/platform/circuit-breaker-pattern.feature +- outcome: Executable scenario: Timeout transitions open to half-open + +```gwt +Given the following deliverables: +And a circuit "stripe-api" opened at timestamp 1000 +And resetTimeoutMs is 30000 +When timeout fires at timestamp 31000 +Then circuit should transition to "half_open" +``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-009-stale-timeout-is-ignored.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-009-stale-timeout-is-ignored.sdp.md index 50886d00..07941374 100644 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-009-stale-timeout-is-ignored.sdp.md +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-009-stale-timeout-is-ignored.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Stale timeout is ignored" from architect/specs/platform/circuit-breaker-pattern.feature +- outcome: Executable scenario: Stale timeout is ignored + +```gwt +Given the following deliverables: +And a circuit "stripe-api" was opened at timestamp 1000 +And circuit was manually closed at timestamp 10000 +And circuit opened again at timestamp 20000 +When stale timeout fires with openedAt=1000 +Then timeout should be skipped +And circuit should remain in current state +``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-010-half-open-probe-closes-circuit-on-success.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-010-half-open-probe-closes-circuit-on-success.sdp.md index ff215a49..5d45c551 100644 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-010-half-open-probe-closes-circuit-on-success.sdp.md +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-010-half-open-probe-closes-circuit-on-success.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Half-open probe closes circuit on success" from architect/specs/platform/circuit-breaker-pattern.feature +- outcome: Architect scenario: Half-open probe closes circuit on success + +```gwt +Given a circuit "stripe-api" in "half_open" state +When a probe request succeeds +Then onProbeComplete should receive success result +And circuit should transition to "closed" +And probeRunId should be cleared +``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-011-half-open-probe-reopens-circuit-on-failure.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-011-half-open-probe-reopens-circuit-on-failure.sdp.md index 3ae8f964..b3ab549a 100644 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-011-half-open-probe-reopens-circuit-on-failure.sdp.md +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-011-half-open-probe-reopens-circuit-on-failure.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Half-open probe reopens circuit on failure" from architect/specs/platform/circuit-breaker-pattern.feature +- outcome: Architect scenario: Half-open probe reopens circuit on failure + +```gwt +Given a circuit "stripe-api" in "half_open" state +When a probe request fails +Then onProbeComplete should receive failed result +And circuit should transition to "open" +And a new timeout should be scheduled +``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-012-open-circuit-returns-fast-failure.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-012-open-circuit-returns-fast-failure.sdp.md index c2d51773..b9cafd0f 100644 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-012-open-circuit-returns-fast-failure.sdp.md +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-012-open-circuit-returns-fast-failure.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Open circuit returns fast failure" from architect/specs/platform/circuit-breaker-pattern.feature +- outcome: Architect scenario: Open circuit returns fast failure + +```gwt +Given a circuit "stripe-api" in "open" state +And circuit opened 10 seconds ago +And resetTimeoutMs is 30000 +When a request is attempted +Then request should fail immediately with "CIRCUIT_OPEN:stripe-api" +And retryAfterMs should be approximately 20000 +``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-013-payment-circuit-opens-after-3-failures.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-013-payment-circuit-opens-after-3-failures.sdp.md index a7f9cbe7..272dd4a4 100644 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-013-payment-circuit-opens-after-3-failures.sdp.md +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-013-payment-circuit-opens-after-3-failures.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Payment circuit opens after 3 failures" from architect/specs/platform/circuit-breaker-pattern.feature +- outcome: Executable scenario: Payment circuit opens after 3 failures + +```gwt +Given the following deliverables: +And a circuit "stripe-api" with failureThreshold 3 +When 3 consecutive failures occur +Then circuit should be "open" +``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-014-email-circuit-tolerates-more-failures.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-014-email-circuit-tolerates-more-failures.sdp.md index 93a4974e..5f898103 100644 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-014-email-circuit-tolerates-more-failures.sdp.md +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-014-email-circuit-tolerates-more-failures.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Email circuit tolerates more failures" from architect/specs/platform/circuit-breaker-pattern.feature +- outcome: Executable scenario: Email circuit tolerates more failures + +```gwt +Given the following deliverables: +And a circuit "sendgrid" with failureThreshold 10 +When 5 failures occur +Then circuit should still be "closed" +And failureCount should be 5 +``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-015-different-services-have-independent-circuits.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-015-different-services-have-independent-circuits.sdp.md index ed90f4ac..a8e09ebb 100644 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-015-different-services-have-independent-circuits.sdp.md +++ b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-015-different-services-have-independent-circuits.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Different services have independent circuits" from architect/specs/platform/circuit-breaker-pattern.feature +- outcome: Executable scenario: Different services have independent circuits + +```gwt +Given the following deliverables: +And circuit "stripe-api" is "open" +And circuit "sendgrid" is "closed" +When a Stripe request is made and a SendGrid request is made +Then it should fail fast +And it should execute normally +``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-001-generate-process-guard-reference-at-standard-detail-level.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-001-generate-process-guard-reference-at-standard-detail-level.sdp.md index f54fafd6..e6cf225b 100644 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-001-generate-process-guard-reference-at-standard-detail-level.sdp.md +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-001-generate-process-guard-reference-at-standard-detail-level.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Generate process guard reference at standard detail level" from architect/specs/codec-driven-reference-generation.feature +- outcome: Executable scenario: Generate process guard reference at standard detail level + +```gwt +Given the following deliverables: +And a ReferenceDocConfig for "Process Guard" +And convention-tagged decision records exist for "fsm-rules" +And TypeScript shapes are extracted from "src/lint/*.ts" +When the reference codec decodes the MasterDataset +Then a RenderableDocument is produced with Process Guard content +And sections include convention content, API types, and validation rules +``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-002-generate-process-guard-reference-at-summary-detail-level.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-002-generate-process-guard-reference-at-summary-detail-level.sdp.md index 81e5dfbf..a008e357 100644 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-002-generate-process-guard-reference-at-summary-detail-level.sdp.md +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-002-generate-process-guard-reference-at-summary-detail-level.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Generate process guard reference at summary detail level" from architect/specs/codec-driven-reference-generation.feature +- outcome: Executable scenario: Generate process guard reference at summary detail level + +```gwt +Given the following deliverables: +And a ReferenceDocConfig for "Process Guard" with detailLevel "summary" +When the reference codec decodes the MasterDataset +Then the output uses tables over prose +And type names are listed without full definitions +And no duplicate sections appear +And output is under 100 lines +``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-003-extract-conventions-by-tag-value.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-003-extract-conventions-by-tag-value.sdp.md index f4736ee0..691269e5 100644 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-003-extract-conventions-by-tag-value.sdp.md +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-003-extract-conventions-by-tag-value.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Extract conventions by tag value" from architect/specs/codec-driven-reference-generation.feature +- outcome: Executable scenario: Extract conventions by tag value + +```gwt +Given the following deliverables: +And ADR-006 is tagged with "@architect-convention:fsm-rules" +And ADR-004 is tagged with "@architect-convention:testing-policy" +When extracting conventions for "fsm-rules" +Then only ADR-006 Rule block content is returned +And ADR-004 content is not included +``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-004-convention-content-preserves-rule-block-structure.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-004-convention-content-preserves-rule-block-structure.sdp.md index ed6614ed..fa2d06d8 100644 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-004-convention-content-preserves-rule-block-structure.sdp.md +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-004-convention-content-preserves-rule-block-structure.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Convention content preserves Rule block structure" from architect/specs/codec-driven-reference-generation.feature +- outcome: Executable scenario: Convention content preserves Rule block structure + +```gwt +Given the following deliverables: +And a decision record with Rule blocks containing tables and context +When extracting convention content +Then tables are preserved as structured data +And Invariant/Rationale/Verified-by metadata is preserved +``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-005-no-conventions-found-for-requested-tag-values.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-005-no-conventions-found-for-requested-tag-values.sdp.md index a498fa32..fd8c3852 100644 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-005-no-conventions-found-for-requested-tag-values.sdp.md +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-005-no-conventions-found-for-requested-tag-values.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "No conventions found for requested tag values" from architect/specs/codec-driven-reference-generation.feature +- outcome: Executable scenario: No conventions found for requested tag values + +```gwt +Given the following deliverables: +And a MasterDataset with no decision records tagged "fsm-rules" +When the reference codec decodes for "Process Guard" +Then the output omits the conventions section +And the document is still valid with shape and behavior content +``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-006-no-shape-sources-match-any-pattern-file-paths.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-006-no-shape-sources-match-any-pattern-file-paths.sdp.md index 61b8e23e..be1d1d58 100644 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-006-no-shape-sources-match-any-pattern-file-paths.sdp.md +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-006-no-shape-sources-match-any-pattern-file-paths.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "No shape sources match any pattern file paths" from architect/specs/codec-driven-reference-generation.feature +- outcome: Executable scenario: No shape sources match any pattern file paths + +```gwt +Given the following deliverables: +And a ReferenceDocConfig with shapeSources "src/nonexistent/*.ts" +When the reference codec decodes the MasterDataset +Then the output omits the type definitions section +And no error is raised +``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-007-convention-tag-matches-multiple-decision-records.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-007-convention-tag-matches-multiple-decision-records.sdp.md index 95549837..4f266a6a 100644 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-007-convention-tag-matches-multiple-decision-records.sdp.md +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-007-convention-tag-matches-multiple-decision-records.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Convention tag matches multiple decision records" from architect/specs/codec-driven-reference-generation.feature +- outcome: Executable scenario: Convention tag matches multiple decision records + +```gwt +Given the following deliverables: +And ADR-006 and ADR-012 are both tagged "fsm-rules" +When extracting conventions for "fsm-rules" +Then both decision records contribute Rule block content +And content is ordered by source decision record +``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-008-dual-output-generation.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-008-dual-output-generation.sdp.md index 62fe3f40..9a44114f 100644 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-008-dual-output-generation.sdp.md +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-008-dual-output-generation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Dual output generation" from architect/specs/codec-driven-reference-generation.feature +- outcome: Executable scenario: Dual output generation + +```gwt +Given the following deliverables: +And a ReferenceDocConfig with claudeMdSection "validation" +When the reference generator runs +Then "docs/PROCESS-GUARD-REFERENCE.md" is generated at "detailed" level +And "_claude-md/validation/process-guard.md" is generated at "summary" level +``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-009-summary-compaction-quality.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-009-summary-compaction-quality.sdp.md index db16796c..ef21654d 100644 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-009-summary-compaction-quality.sdp.md +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-009-summary-compaction-quality.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Summary compaction quality" from architect/specs/codec-driven-reference-generation.feature +- outcome: Executable scenario: Summary compaction quality + +```gwt +Given the following deliverables: +And a reference codec output at "summary" detail level +When the scenario runs +Then the output follows modular-claude-md conventions +And headings start at H3 level +And tables are preferred over prose +And total output is under 100 lines +``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-010-reference-generators-appear-in-available-generators-list.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-010-reference-generators-appear-in-available-generators-list.sdp.md index 33364d00..bda76c8b 100644 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-010-reference-generators-appear-in-available-generators-list.sdp.md +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-010-reference-generators-appear-in-available-generators-list.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Reference generators appear in available generators list" from architect/specs/codec-driven-reference-generation.feature +- outcome: Executable scenario: Reference generators appear in available generators list + +```gwt +Given the following deliverables: +And reference generators are registered +When querying GeneratorRegistry.available() +Then "process-guard-reference" is listed +And "session-guides-reference" is listed +And all 11 reference types are available +``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-011-cli-invocation-generates-reference-docs.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-011-cli-invocation-generates-reference-docs.sdp.md index 7509ab9b..bc41ae10 100644 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-011-cli-invocation-generates-reference-docs.sdp.md +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-011-cli-invocation-generates-reference-docs.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "CLI invocation generates reference docs" from architect/specs/codec-driven-reference-generation.feature +- outcome: Executable scenario: CLI invocation generates reference docs + +```gwt +Given the following deliverables: +And the generate-docs CLI +When running with "--generators process-guard-reference" +Then dual output is produced for process guard +``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-012-convention-tag-is-registered-in-taxonomy.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-012-convention-tag-is-registered-in-taxonomy.sdp.md index 2a4ebe17..127aacce 100644 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-012-convention-tag-is-registered-in-taxonomy.sdp.md +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-012-convention-tag-is-registered-in-taxonomy.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Convention tag is registered in taxonomy" from architect/specs/codec-driven-reference-generation.feature +- outcome: Executable scenario: Convention tag is registered in taxonomy + +```gwt +Given the following deliverables: +And the tag registry +When checking for "@architect-convention" +Then it exists with format "csv" +And it accepts the defined convention values +``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-013-recipe-rule-block-content-preserved-in-decision-record.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-013-recipe-rule-block-content-preserved-in-decision-record.sdp.md index 4696e2a1..eaa1ee0e 100644 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-013-recipe-rule-block-content-preserved-in-decision-record.sdp.md +++ b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-013-recipe-rule-block-content-preserved-in-decision-record.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Recipe Rule block content preserved in decision record" from architect/specs/codec-driven-reference-generation.feature +- outcome: Executable scenario: Recipe Rule block content preserved in decision record + +```gwt +Given the following deliverables: +And recipe "process-guard-reference.feature" has Rule "Escape Hatches" +And the Rule contains a table with "Situation", "Solution", "Example" columns +When the Rule is migrated to a decision record tagged "fsm-rules" +Then the decision record Rule block contains the same table +And Invariant/Rationale metadata is preserved +``` diff --git a/specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-001-auth-remediation-is-not-split-by-mutation-family.sdp.md b/specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-001-auth-remediation-is-not-split-by-mutation-family.sdp.md index 8bd03675..25c813ed 100644 --- a/specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-001-auth-remediation-is-not-split-by-mutation-family.sdp.md +++ b/specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-001-auth-remediation-is-not-split-by-mutation-family.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Auth remediation is not split by mutation family" from architect/specs/platform/component-boundary-authentication-convention.feature +- outcome: Executable scenario: Auth remediation is not split by mutation family + +```gwt +Given the following deliverables: +And the component-boundary auth packet is in roadmap state +When implementation begins +Then all identity-bearing mutation sites listed in the remediation plan are in the same packet +And PDR-014 is committed before the packet can complete +``` diff --git a/specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-by-default.sdp.md b/specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-by-default.sdp.md index de472ee2..69ab7899 100644 --- a/specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-by-default.sdp.md +++ b/specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-by-default.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Missing or forged proof is rejected by default" from architect/specs/platform/component-boundary-authentication-convention.feature +- outcome: Executable scenario: Missing or forged proof is rejected by default + +```gwt +Given the following deliverables: +And a component mutation requiring actor identity +When the proof is missing, expired, mismatched, or forged +Then the mutation is rejected before any write occurs +``` diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-001-cancel-a-confirmed-order.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-001-cancel-a-confirmed-order.sdp.md index edd1869b..bee8d36d 100644 --- a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-001-cancel-a-confirmed-order.sdp.md +++ b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-001-cancel-a-confirmed-order.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Cancel a confirmed order" from architect/specs/platform/confirmed-order-cancellation.feature +- outcome: Executable scenario: Cancel a confirmed order + +```gwt +Given the following deliverables: +And an order "ord-conf-cancel-01" exists with status "confirmed" +When I send a CancelOrder command for "ord-conf-cancel-01" with reason "Customer changed mind" +Then the command should succeed +And the order "ord-conf-cancel-01" status should be "cancelled" +``` diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-002-cannot-cancel-already-cancelled-order-unchanged-behavior.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-002-cannot-cancel-already-cancelled-order-unchanged-behavior.sdp.md index 7fa02e4b..0817c4f9 100644 --- a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-002-cannot-cancel-already-cancelled-order-unchanged-behavior.sdp.md +++ b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-002-cannot-cancel-already-cancelled-order-unchanged-behavior.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Cannot cancel already cancelled order (unchanged behavior)" from architect/specs/platform/confirmed-order-cancellation.feature +- outcome: Executable scenario: Cannot cancel already cancelled order (unchanged behavior) + +```gwt +Given the following deliverables: +And an order "ord-conf-cancel-02" exists with status "cancelled" +When I send a CancelOrder command for "ord-conf-cancel-02" with reason "Double cancel attempt" +Then the command should be rejected with code "ORDER_ALREADY_CANCELLED" +``` diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-003-order-cancelled-evolves-confirmed-state-to-cancelled.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-003-order-cancelled-evolves-confirmed-state-to-cancelled.sdp.md index 988a6b75..3c72608e 100644 --- a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-003-order-cancelled-evolves-confirmed-state-to-cancelled.sdp.md +++ b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-003-order-cancelled-evolves-confirmed-state-to-cancelled.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "OrderCancelled evolves confirmed state to cancelled" from architect/specs/platform/confirmed-order-cancellation.feature +- outcome: Executable scenario: OrderCancelled evolves confirmed state to cancelled + +```gwt +Given the following deliverables: +And an order state with status "confirmed" +When OrderCancelled event is applied +Then state should have status "cancelled" +``` diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-004-reservation-is-released-after-confirmed-order-cancellation.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-004-reservation-is-released-after-confirmed-order-cancellation.sdp.md index 522a4b4d..418bdc6d 100644 --- a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-004-reservation-is-released-after-confirmed-order-cancellation.sdp.md +++ b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-004-reservation-is-released-after-confirmed-order-cancellation.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Reservation is released after confirmed order cancellation" from architect/specs/platform/confirmed-order-cancellation.feature +- outcome: Architect scenario: Reservation is released after confirmed order cancellation + +```gwt +Given a product "prod-rel-01" exists with 10 available and 5 reserved stock +And a confirmed order "ord-rel-01" with a confirmed reservation for 5 units +When I cancel order "ord-rel-01" with reason "Customer changed mind" +Then the order "ord-rel-01" should have status "cancelled" +And I wait for projections to process +And the reservation for order "ord-rel-01" should have status "released" +And the product "prod-rel-01" should have 15 available and 0 reserved stock +``` diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-005-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-005-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md index 1fec22f1..216d6ae6 100644 --- a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-005-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md +++ b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-005-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Cancelling draft order does not trigger reservation release" from architect/specs/platform/confirmed-order-cancellation.feature +- outcome: Architect scenario: Cancelling draft order does not trigger reservation release + +```gwt +Given a draft order "ord-rel-02" exists +When I cancel order "ord-rel-02" with reason "Changed mind early" +Then the order "ord-rel-02" should have status "cancelled" +And no ReleaseReservation command should be emitted +``` diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-006-cancelling-submitted-order-with-pending-reservation-releases-it.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-006-cancelling-submitted-order-with-pending-reservation-releases-it.sdp.md index a6fe6f38..0511c940 100644 --- a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-006-cancelling-submitted-order-with-pending-reservation-releases-it.sdp.md +++ b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-006-cancelling-submitted-order-with-pending-reservation-releases-it.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Cancelling submitted order with pending reservation releases it" from architect/specs/platform/confirmed-order-cancellation.feature +- outcome: Architect scenario: Cancelling submitted order with pending reservation releases it + +```gwt +Given a submitted order "ord-rel-03" with a pending reservation +When I cancel order "ord-rel-03" with reason "Changed mind before confirmation" +Then the order "ord-rel-03" should have status "cancelled" +And the reservation for order "ord-rel-03" should have status "released" +``` diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-007-pm-is-idempotent-for-duplicate-order-cancelled-events.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-007-pm-is-idempotent-for-duplicate-order-cancelled-events.sdp.md index ac82624e..0c747160 100644 --- a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-007-pm-is-idempotent-for-duplicate-order-cancelled-events.sdp.md +++ b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-007-pm-is-idempotent-for-duplicate-order-cancelled-events.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "PM is idempotent for duplicate OrderCancelled events" from architect/specs/platform/confirmed-order-cancellation.feature +- outcome: Architect scenario: PM is idempotent for duplicate OrderCancelled events + +```gwt +Given a confirmed order "ord-rel-04" with a confirmed reservation +When OrderCancelled event is delivered twice for "ord-rel-04" +Then the reservation should only be released once +``` diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-008-three-cancellations-trigger-churn-risk-agent.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-008-three-cancellations-trigger-churn-risk-agent.sdp.md index 55f43312..1e539d2b 100644 --- a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-008-three-cancellations-trigger-churn-risk-agent.sdp.md +++ b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-008-three-cancellations-trigger-churn-risk-agent.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Three cancellations trigger churn risk agent" from architect/specs/platform/confirmed-order-cancellation.feature +- outcome: Architect scenario: Three cancellations trigger churn risk agent + +```gwt +Given a customer "cust-churn-01" exists +And 3 confirmed orders for customer "cust-churn-01" +When I cancel all 3 orders for customer "cust-churn-01" +Then the churn risk agent should detect the pattern +And an approval request should be created for customer outreach +``` diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-001-same-email-produces-same-stream-id.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-001-same-email-produces-same-stream-id.sdp.md index 5aadfe7f..d44bb2a2 100644 --- a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-001-same-email-produces-same-stream-id.sdp.md +++ b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-001-same-email-produces-same-stream-id.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Same email produces same stream ID" from architect/specs/platform/deterministic-id-hashing.feature +- outcome: Executable scenario: Same email produces same stream ID + +```gwt +Given the following deliverables: +And entity type "User" +And business key "alice@example.com" +When deterministicStreamId is called twice +Then both calls return identical stream ID +And stream ID format is "User:{hash}" +``` diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-002-composite-key-produces-consistent-hash.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-002-composite-key-produces-consistent-hash.sdp.md index 292b966b..17fd447b 100644 --- a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-002-composite-key-produces-consistent-hash.sdp.md +++ b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-002-composite-key-produces-consistent-hash.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Composite key produces consistent hash" from architect/specs/platform/deterministic-id-hashing.feature +- outcome: Executable scenario: Composite key produces consistent hash + +```gwt +Given the following deliverables: +And entity type "TenantUser" +And composite key ["tenant_123", "alice@example.com"] +When deterministicStreamId is called +Then stream ID is deterministic +And changing key order produces different hash +``` diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-003-different-emails-produce-different-stream-i-ds.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-003-different-emails-produce-different-stream-i-ds.sdp.md index af4a03d7..20828777 100644 --- a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-003-different-emails-produce-different-stream-i-ds.sdp.md +++ b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-003-different-emails-produce-different-stream-i-ds.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Different emails produce different stream IDs" from architect/specs/platform/deterministic-id-hashing.feature +- outcome: Executable scenario: Different emails produce different stream IDs + +```gwt +Given the following deliverables: +And entity type "User" +When deterministicStreamId is called with "alice@example.com" and deterministicStreamId is called with "bob@example.com" +Then the stream IDs are different +``` diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-004-first-create-succeeds.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-004-first-create-succeeds.sdp.md index 9aeb5d11..545d703c 100644 --- a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-004-first-create-succeeds.sdp.md +++ b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-004-first-create-succeeds.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "First create succeeds" from architect/specs/platform/deterministic-id-hashing.feature +- outcome: Executable scenario: First create succeeds + +```gwt +Given the following deliverables: +And no existing stream for email "alice@example.com" +When User creation is attempted +Then UserCreated event is appended +And stream version becomes 1 +``` diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-005-second-create-fails-with-conflict.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-005-second-create-fails-with-conflict.sdp.md index 3b72801b..ee3bd9a5 100644 --- a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-005-second-create-fails-with-conflict.sdp.md +++ b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-005-second-create-fails-with-conflict.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Second create fails with conflict" from architect/specs/platform/deterministic-id-hashing.feature +- outcome: Executable scenario: Second create fails with conflict + +```gwt +Given the following deliverables: +And existing stream for email "alice@example.com" +When second User creation is attempted with same email +Then VERSION_CONFLICT error is thrown +And error is translated to UniqueConstraintViolation +``` diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-006-concurrent-creates-exactly-one-succeeds.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-006-concurrent-creates-exactly-one-succeeds.sdp.md index 6ccbad24..00e8b091 100644 --- a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-006-concurrent-creates-exactly-one-succeeds.sdp.md +++ b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-006-concurrent-creates-exactly-one-succeeds.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Concurrent creates - exactly one succeeds" from architect/specs/platform/deterministic-id-hashing.feature +- outcome: Executable scenario: Concurrent creates - exactly one succeeds + +```gwt +Given the following deliverables: +And no existing stream for email "alice@example.com" +When two concurrent User creations are attempted +Then exactly one succeeds +And the other fails with UniqueConstraintViolation +``` diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-007-hash-output-is-url-safe.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-007-hash-output-is-url-safe.sdp.md index 6b31ffef..a7e80c3a 100644 --- a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-007-hash-output-is-url-safe.sdp.md +++ b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-007-hash-output-is-url-safe.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Hash output is URL-safe" from architect/specs/platform/deterministic-id-hashing.feature +- outcome: Executable scenario: Hash output is URL-safe + +```gwt +Given the following deliverables: +And any business key input +When hash is computed +Then output contains only alphanumeric characters +And output is fixed length (e.g., 16 characters) +``` diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-008-hash-is-not-reversible.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-008-hash-is-not-reversible.sdp.md index 8365b173..83c609c4 100644 --- a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-008-hash-is-not-reversible.sdp.md +++ b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-008-hash-is-not-reversible.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Hash is not reversible" from architect/specs/platform/deterministic-id-hashing.feature +- outcome: Executable scenario: Hash is not reversible + +```gwt +Given the following deliverables: +And a computed hash +When the scenario runs +Then original business key cannot be derived +And this protects sensitive keys like email +``` diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-009-pattern-selection-by-use-case.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-009-pattern-selection-by-use-case.sdp.md index c436f20d..9b10d739 100644 --- a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-009-pattern-selection-by-use-case.sdp.md +++ b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-009-pattern-selection-by-use-case.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Pattern selection by use case" from architect/specs/platform/deterministic-id-hashing.feature +- outcome: Executable scenario: Pattern selection by use case + +```gwt +Given the following deliverables: +And a uniqueness requirement for "value" +And the field is "value" +And the flow is "value" +When selecting uniqueness pattern +Then recommended pattern is "value" +``` diff --git a/specs/unimplemented/architect-scenarios/epic-process-enhancements/s-001-specs-can-evolve-independently-of-phases.sdp.md b/specs/unimplemented/architect-scenarios/epic-process-enhancements/s-001-specs-can-evolve-independently-of-phases.sdp.md index b887177e..b1ca3c3e 100644 --- a/specs/unimplemented/architect-scenarios/epic-process-enhancements/s-001-specs-can-evolve-independently-of-phases.sdp.md +++ b/specs/unimplemented/architect-scenarios/epic-process-enhancements/s-001-specs-can-evolve-independently-of-phases.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Specs can evolve independently of phases" from architect/specs/epic-process-enhancements.feature +- outcome: Executable scenario: Specs can evolve independently of phases + +```gwt +Given the following specs in this epic: +And a spec file in libar-platform/architect/specs/ +When the spec is refined, split, or combined +Then TypeScript phase files maintain release association +And no phase metadata needs updating in the spec +``` diff --git a/specs/unimplemented/architect-scenarios/epic-process-enhancements/s-002-type-script-phase-files-link-specs-to-releases.sdp.md b/specs/unimplemented/architect-scenarios/epic-process-enhancements/s-002-type-script-phase-files-link-specs-to-releases.sdp.md index fe1be132..30e8d454 100644 --- a/specs/unimplemented/architect-scenarios/epic-process-enhancements/s-002-type-script-phase-files-link-specs-to-releases.sdp.md +++ b/specs/unimplemented/architect-scenarios/epic-process-enhancements/s-002-type-script-phase-files-link-specs-to-releases.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "TypeScript phase files link specs to releases" from architect/specs/epic-process-enhancements.feature +- outcome: Executable scenario: TypeScript phase files link specs to releases + +```gwt +Given the following specs in this epic: +And a TypeScript phase file in architect/src/phases/ +When the scenario runs +Then it references the spec by pattern name +And contains minimal metadata (phase, status, quarter, effort) +And centralized location enables consistent release tracking +``` diff --git a/specs/unimplemented/architect-scenarios/event-correctness-migration/s-001-event-correctness-packet-starts-from-decisions-and-inventory.sdp.md b/specs/unimplemented/architect-scenarios/event-correctness-migration/s-001-event-correctness-packet-starts-from-decisions-and-inventory.sdp.md index f3a95813..49f6a507 100644 --- a/specs/unimplemented/architect-scenarios/event-correctness-migration/s-001-event-correctness-packet-starts-from-decisions-and-inventory.sdp.md +++ b/specs/unimplemented/architect-scenarios/event-correctness-migration/s-001-event-correctness-packet-starts-from-decisions-and-inventory.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Event correctness packet starts from decisions and inventory" from architect/specs/platform/event-correctness-migration.feature +- outcome: Executable scenario: Event correctness packet starts from decisions and inventory + +```gwt +Given the following deliverables: +And the correctness packet is planned +When implementation begins +Then PDR-018 and PDR-015 are committed before runtime changes complete +And a consumer inventory exists before 'globalPosition' migration work starts +``` diff --git a/specs/unimplemented/architect-scenarios/event-correctness-migration/s-002-old-and-new-checkpoint-formats-are-handled-explicitly.sdp.md b/specs/unimplemented/architect-scenarios/event-correctness-migration/s-002-old-and-new-checkpoint-formats-are-handled-explicitly.sdp.md index 7830e640..45859b45 100644 --- a/specs/unimplemented/architect-scenarios/event-correctness-migration/s-002-old-and-new-checkpoint-formats-are-handled-explicitly.sdp.md +++ b/specs/unimplemented/architect-scenarios/event-correctness-migration/s-002-old-and-new-checkpoint-formats-are-handled-explicitly.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Old and new checkpoint formats are handled explicitly" from architect/specs/platform/event-correctness-migration.feature +- outcome: Executable scenario: Old and new checkpoint formats are handled explicitly + +```gwt +Given the following deliverables: +And historical checkpoint formats exist +When the new 'globalPosition' representation lands +Then old checkpoints are read through a compat path +And new checkpoints cannot be misread as old +``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-001-readiness-probe-returns-healthy-when-all-components-ok.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-001-readiness-probe-returns-healthy-when-all-components-ok.sdp.md index 8911c1a3..a577254e 100644 --- a/specs/unimplemented/architect-scenarios/health-observability/s-001-readiness-probe-returns-healthy-when-all-components-ok.sdp.md +++ b/specs/unimplemented/architect-scenarios/health-observability/s-001-readiness-probe-returns-healthy-when-all-components-ok.sdp.md @@ -6,8 +6,19 @@ readiness: idea relations: refines: spec:platform.health-observability --- -# Readiness probe returns healthy when all components OK +# Workpool backlog fails readiness ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Readiness probe returns healthy when all components OK" from architect/specs/platform/health-observability.feature +- outcome: Executable scenario: Workpool backlog fails readiness + +```gwt +Given the following deliverables: +And projectionPool maxParallelism is 10 +And projectionPool queue depth is 25 +And threshold is 20 (2x maxParallelism) +When GET /health/ready is called +Then HTTP status should be 503 +And response should identify "workpool_backlog" as degraded +And suggested action should be "reduce traffic or scale" +``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-002-readiness-probe-returns-unhealthy-on-projection-lag.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-002-readiness-probe-returns-unhealthy-on-projection-lag.sdp.md index 850f3836..b109aac4 100644 --- a/specs/unimplemented/architect-scenarios/health-observability/s-002-readiness-probe-returns-unhealthy-on-projection-lag.sdp.md +++ b/specs/unimplemented/architect-scenarios/health-observability/s-002-readiness-probe-returns-unhealthy-on-projection-lag.sdp.md @@ -6,8 +6,16 @@ readiness: idea relations: refines: spec:platform.health-observability --- -# Readiness probe returns unhealthy on projection lag +# Normal queue depth passes readiness ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Readiness probe returns unhealthy on projection lag" from architect/specs/platform/health-observability.feature +- outcome: Executable scenario: Normal queue depth passes readiness + +```gwt +Given the following deliverables: +And projectionPool queue depth is 15 +And threshold is 20 +When GET /health/ready is called +Then workpool component should be "healthy" +``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-003-liveness-probe-always-returns-alive.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-003-liveness-probe-always-returns-alive.sdp.md index 0f3ec0cd..a930092b 100644 --- a/specs/unimplemented/architect-scenarios/health-observability/s-003-liveness-probe-always-returns-alive.sdp.md +++ b/specs/unimplemented/architect-scenarios/health-observability/s-003-liveness-probe-always-returns-alive.sdp.md @@ -6,8 +6,20 @@ readiness: idea relations: refines: spec:platform.health-observability --- -# Liveness probe always returns alive +# All components healthy yields healthy system ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Liveness probe always returns alive" from architect/specs/platform/health-observability.feature +- outcome: Executable scenario: All components healthy yields healthy system + +```gwt +Given the following deliverables: +And Event Store responds successfully +And all projections have lag < 100 +And all Workpool depths are below threshold +And DLQ has < 10 pending items +When system health is aggregated +Then system status should be "healthy" +And summary.healthy should be 4 +And summary.unhealthy should be 0 +``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-004-workpool-backlog-fails-readiness.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-004-workpool-backlog-fails-readiness.sdp.md index 91b45517..acf496ec 100644 --- a/specs/unimplemented/architect-scenarios/health-observability/s-004-workpool-backlog-fails-readiness.sdp.md +++ b/specs/unimplemented/architect-scenarios/health-observability/s-004-workpool-backlog-fails-readiness.sdp.md @@ -6,8 +6,18 @@ readiness: idea relations: refines: spec:platform.health-observability --- -# Workpool backlog fails readiness +# Single unhealthy component makes system unhealthy ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Workpool backlog fails readiness" from architect/specs/platform/health-observability.feature +- outcome: Executable scenario: Single unhealthy component makes system unhealthy + +```gwt +Given the following deliverables: +And Event Store responds successfully +And projection "orderSummary" has lag of 5000 (critical) +And Workpool depths are normal +When system health is aggregated +Then system status should be "unhealthy" +And components should identify "projections" as unhealthy +``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-005-normal-queue-depth-passes-readiness.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-005-normal-queue-depth-passes-readiness.sdp.md index e0e3372e..8da4ede1 100644 --- a/specs/unimplemented/architect-scenarios/health-observability/s-005-normal-queue-depth-passes-readiness.sdp.md +++ b/specs/unimplemented/architect-scenarios/health-observability/s-005-normal-queue-depth-passes-readiness.sdp.md @@ -6,8 +6,18 @@ readiness: idea relations: refines: spec:platform.health-observability --- -# Normal queue depth passes readiness +# Degraded component yields degraded system ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Normal queue depth passes readiness" from architect/specs/platform/health-observability.feature +- outcome: Executable scenario: Degraded component yields degraded system + +```gwt +Given the following deliverables: +And Event Store responds successfully +And projection "orderSummary" has lag of 150 (warning) +And all other components are healthy +When system health is aggregated +Then system status should be "degraded" +And components should identify "projections" as degraded +``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-006-projection-lag-is-calculated-correctly.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-006-projection-lag-is-calculated-correctly.sdp.md index 3d7203dd..35313b0c 100644 --- a/specs/unimplemented/architect-scenarios/health-observability/s-006-projection-lag-is-calculated-correctly.sdp.md +++ b/specs/unimplemented/architect-scenarios/health-observability/s-006-projection-lag-is-calculated-correctly.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Projection lag is calculated correctly" from architect/specs/platform/health-observability.feature +- outcome: Architect scenario: Projection lag is calculated correctly + +```gwt +Given Event Store max globalPosition is 1000 +And projection "orderSummary" checkpoint is at position 950 +When calculating projection lag +Then lag should be 50 +And status should be "warning" +``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-007-missing-checkpoint-treated-as-maximum-lag.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-007-missing-checkpoint-treated-as-maximum-lag.sdp.md index f744ee79..79a3b4e7 100644 --- a/specs/unimplemented/architect-scenarios/health-observability/s-007-missing-checkpoint-treated-as-maximum-lag.sdp.md +++ b/specs/unimplemented/architect-scenarios/health-observability/s-007-missing-checkpoint-treated-as-maximum-lag.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Missing checkpoint treated as maximum lag" from architect/specs/platform/health-observability.feature +- outcome: Architect scenario: Missing checkpoint treated as maximum lag + +```gwt +Given Event Store max globalPosition is 1000 +And projection "newProjection" has no checkpoint entry +When calculating projection lag +Then lag should be 1000 +And a warning should be logged "no checkpoint for newProjection" +``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-008-zero-lag-is-healthy.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-008-zero-lag-is-healthy.sdp.md index 347f4819..30433839 100644 --- a/specs/unimplemented/architect-scenarios/health-observability/s-008-zero-lag-is-healthy.sdp.md +++ b/specs/unimplemented/architect-scenarios/health-observability/s-008-zero-lag-is-healthy.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Zero lag is healthy" from architect/specs/platform/health-observability.feature +- outcome: Architect scenario: Zero lag is healthy + +```gwt +Given Event Store max globalPosition is 1000 +And projection "orderSummary" checkpoint is at position 1000 +When calculating projection lag +Then lag should be 0 +And status should be "healthy" +``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-009-metrics-collection-gathers-all-dimensions.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-009-metrics-collection-gathers-all-dimensions.sdp.md index 55ea9892..aa918c52 100644 --- a/specs/unimplemented/architect-scenarios/health-observability/s-009-metrics-collection-gathers-all-dimensions.sdp.md +++ b/specs/unimplemented/architect-scenarios/health-observability/s-009-metrics-collection-gathers-all-dimensions.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Metrics collection gathers all dimensions" from architect/specs/platform/health-observability.feature +- outcome: Architect scenario: Metrics collection gathers all dimensions + +```gwt +Given the feature fixture is in place +When system metrics are collected +Then response should include projectionLags for all projections +And response should include dlqSizes +And response should include workpoolDepths for all pools +And response should include timestamp +``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-010-metrics-emitted-as-json-for-log-streams.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-010-metrics-emitted-as-json-for-log-streams.sdp.md index 82bfd67c..9482ecb4 100644 --- a/specs/unimplemented/architect-scenarios/health-observability/s-010-metrics-emitted-as-json-for-log-streams.sdp.md +++ b/specs/unimplemented/architect-scenarios/health-observability/s-010-metrics-emitted-as-json-for-log-streams.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Metrics emitted as JSON for Log Streams" from architect/specs/platform/health-observability.feature +- outcome: Architect scenario: Metrics emitted as JSON for Log Streams + +```gwt +Given the feature fixture is in place +When emitMetrics mutation runs +Then a JSON log entry should be written at REPORT level +And log entry should have type "METRICS" +And log entry should be parseable by Log Streams +``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-011-metrics-collection-handles-empty-state.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-011-metrics-collection-handles-empty-state.sdp.md index acde1bf2..c9f0ea34 100644 --- a/specs/unimplemented/architect-scenarios/health-observability/s-011-metrics-collection-handles-empty-state.sdp.md +++ b/specs/unimplemented/architect-scenarios/health-observability/s-011-metrics-collection-handles-empty-state.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Metrics collection handles empty state" from architect/specs/platform/health-observability.feature +- outcome: Architect scenario: Metrics collection handles empty state + +```gwt +Given no events have been processed +And no dead letters exist +When system metrics are collected +Then projectionLags should be empty object or zeros +And dlqSizes should be empty object or zeros +And collection should not fail +``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-012-all-components-healthy-yields-healthy-system.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-012-all-components-healthy-yields-healthy-system.sdp.md index 48afa1d8..69a173f4 100644 --- a/specs/unimplemented/architect-scenarios/health-observability/s-012-all-components-healthy-yields-healthy-system.sdp.md +++ b/specs/unimplemented/architect-scenarios/health-observability/s-012-all-components-healthy-yields-healthy-system.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "All components healthy yields healthy system" from architect/specs/platform/health-observability.feature +- outcome: Executable scenario: All components healthy yields healthy system + +```gwt +Given the following deliverables: +And Event Store responds successfully +And all projections have lag < 100 +And all Workpool depths are below threshold +And DLQ has < 10 pending items +When system health is aggregated +Then system status should be "healthy" +And summary.healthy should be 4 +And summary.unhealthy should be 0 +``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-013-single-unhealthy-component-makes-system-unhealthy.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-013-single-unhealthy-component-makes-system-unhealthy.sdp.md index df1b232d..32f26f41 100644 --- a/specs/unimplemented/architect-scenarios/health-observability/s-013-single-unhealthy-component-makes-system-unhealthy.sdp.md +++ b/specs/unimplemented/architect-scenarios/health-observability/s-013-single-unhealthy-component-makes-system-unhealthy.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Single unhealthy component makes system unhealthy" from architect/specs/platform/health-observability.feature +- outcome: Executable scenario: Single unhealthy component makes system unhealthy + +```gwt +Given the following deliverables: +And Event Store responds successfully +And projection "orderSummary" has lag of 5000 (critical) +And Workpool depths are normal +When system health is aggregated +Then system status should be "unhealthy" +And components should identify "projections" as unhealthy +``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-014-degraded-component-yields-degraded-system.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-014-degraded-component-yields-degraded-system.sdp.md index c689630a..68cf4561 100644 --- a/specs/unimplemented/architect-scenarios/health-observability/s-014-degraded-component-yields-degraded-system.sdp.md +++ b/specs/unimplemented/architect-scenarios/health-observability/s-014-degraded-component-yields-degraded-system.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Degraded component yields degraded system" from architect/specs/platform/health-observability.feature +- outcome: Executable scenario: Degraded component yields degraded system + +```gwt +Given the following deliverables: +And Event Store responds successfully +And projection "orderSummary" has lag of 150 (warning) +And all other components are healthy +When system health is aggregated +Then system status should be "degraded" +And components should identify "projections" as degraded +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-001-context-map-shows-bc-topology.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-001-context-map-shows-bc-topology.sdp.md index 11fae569..dd21a624 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-001-context-map-shows-bc-topology.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-001-context-map-shows-bc-topology.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Context Map shows BC topology" from architect/specs/platform/integration-patterns-21a.feature +- outcome: Executable scenario: Context Map shows BC topology + +```gwt +Given the following deliverables: +And the platform Context Map +When viewing relationships +Then ProducerContext → ConsumerContext should be "upstream-downstream" +And ExternalSystem → IntegrationContext should be "anti-corruption-layer" +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-002-register-partnership-relationship.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-002-register-partnership-relationship.sdp.md index 41e67c33..88b12fab 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-002-register-partnership-relationship.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-002-register-partnership-relationship.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Register Partnership relationship" from architect/specs/platform/integration-patterns-21a.feature +- outcome: Executable scenario: Register Partnership relationship + +```gwt +Given the following deliverables: +And BC "ProducerContext" and BC "ConsumerContext" collaborate on shared model +When I register the relationship as "partnership" +Then Context Map shows bidirectional partnership +And both BCs are listed as collaborators +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-003-register-shared-kernel-relationship.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-003-register-shared-kernel-relationship.sdp.md index a28b17a7..98d89ff8 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-003-register-shared-kernel-relationship.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-003-register-shared-kernel-relationship.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Register Shared Kernel relationship" from architect/specs/platform/integration-patterns-21a.feature +- outcome: Executable scenario: Register Shared Kernel relationship + +```gwt +Given the following deliverables: +And BC "SharedKernel" provides shared types to "ProducerContext" and "ConsumerContext" +When I register the relationships as "shared-kernel" +Then Context Map shows SharedKernel as shared kernel provider +And dependents include ProducerContext and ConsumerContext +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-004-register-open-host-service-relationship.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-004-register-open-host-service-relationship.sdp.md index 00c96678..7e65e277 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-004-register-open-host-service-relationship.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-004-register-open-host-service-relationship.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Register Open Host Service relationship" from architect/specs/platform/integration-patterns-21a.feature +- outcome: Executable scenario: Register Open Host Service relationship + +```gwt +Given the following deliverables: +And BC "ProducerContext" exposes public API for external consumers +When I register the relationship as "open-host-service" +Then Context Map shows ProducerContext as OHS provider +And external consumers are listed +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-005-duplicate-relationship-is-rejected.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-005-duplicate-relationship-is-rejected.sdp.md index b6d62a2b..584e8f4c 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-005-duplicate-relationship-is-rejected.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-005-duplicate-relationship-is-rejected.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Duplicate relationship is rejected" from architect/specs/platform/integration-patterns-21a.feature +- outcome: Executable scenario: Duplicate relationship is rejected + +```gwt +Given the following deliverables: +And relationship "ProducerContext → ConsumerContext" already exists +When I attempt to register "ProducerContext → ConsumerContext" again +Then an error is thrown with code "DUPLICATE_RELATIONSHIP" +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-006-self-referential-relationship-is-rejected.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-006-self-referential-relationship-is-rejected.sdp.md index 67790a6d..32280746 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-006-self-referential-relationship-is-rejected.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-006-self-referential-relationship-is-rejected.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Self-referential relationship is rejected" from architect/specs/platform/integration-patterns-21a.feature +- outcome: Executable scenario: Self-referential relationship is rejected + +```gwt +Given the following deliverables: +And the platform Context Map +When I attempt to register "ProducerContext → ProducerContext" +Then an error is thrown with code "SELF_REFERENCE" +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-007-integration-event-uses-published-language.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-007-integration-event-uses-published-language.sdp.md index 8eac4cd1..f31f9ab9 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-007-integration-event-uses-published-language.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-007-integration-event-uses-published-language.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Integration event uses Published Language" from architect/specs/platform/integration-patterns-21a.feature +- outcome: Executable scenario: Integration event uses Published Language + +```gwt +Given the following deliverables: +And an EntityCreated domain event +When converting for integration +Then toPublishedLanguage() should be called +And result should have schemaVersion field +And schema should be from publishedLanguage registry +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-008-event-tagging-for-routing-and-dcb.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-008-event-tagging-for-routing-and-dcb.sdp.md index da4f5b8a..e3dcc317 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-008-event-tagging-for-routing-and-dcb.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-008-event-tagging-for-routing-and-dcb.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Event tagging for routing and DCB" from architect/specs/platform/integration-patterns-21a.feature +- outcome: Executable scenario: Event tagging for routing and DCB + +```gwt +Given the following deliverables: +And a registered schema for "EntityCreated" v1.0.0 +And a domain event with principalId "principal_456" +When I call toPublishedLanguage with tags { principalId: "principal_456" } +Then result.metadata.tags contains principalId +And tags can be used for DCB consistency queries +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-009-schema-compatibility-mode-is-enforced.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-009-schema-compatibility-mode-is-enforced.sdp.md index f5020138..58bdc4aa 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-009-schema-compatibility-mode-is-enforced.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-009-schema-compatibility-mode-is-enforced.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Schema compatibility mode is enforced" from architect/specs/platform/integration-patterns-21a.feature +- outcome: Executable scenario: Schema compatibility mode is enforced + +```gwt +Given the following deliverables: +And "EntityCreated" v1.0.0 with compatibility "backward" +When I register "EntityCreated" v2.0.0 with compatibility "full" +Then v2.0.0 must support both forward and backward compatibility +And consumers on v1.0.0 can still process v2.0.0 events +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-010-register-schema-with-compatibility-mode.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-010-register-schema-with-compatibility-mode.sdp.md index 9816623a..9136fd57 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-010-register-schema-with-compatibility-mode.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-010-register-schema-with-compatibility-mode.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Register schema with compatibility mode" from architect/specs/platform/integration-patterns-21a.feature +- outcome: Executable scenario: Register schema with compatibility mode + +```gwt +Given the following deliverables: +And a new integration event type "ResourceAllocated" +When I call registerIntegrationSchema with version "1.0.0" and compatibility "backward" +Then the schema is available in the registry +And compatibility mode is stored with the schema +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-011-unregistered-event-type-fails-conversion.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-011-unregistered-event-type-fails-conversion.sdp.md index b9d846a8..a9fe7f1e 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-011-unregistered-event-type-fails-conversion.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-011-unregistered-event-type-fails-conversion.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Unregistered event type fails conversion" from architect/specs/platform/integration-patterns-21a.feature +- outcome: Executable scenario: Unregistered event type fails conversion + +```gwt +Given the following deliverables: +And no schema registered for "UnknownEvent" +When I call toPublishedLanguage('UnknownEvent', payload) +Then an error is thrown with code "SCHEMA_NOT_FOUND" +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-012-invalid-payload-fails-schema-validation.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-012-invalid-payload-fails-schema-validation.sdp.md index 988cb12a..7020d8f3 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-012-invalid-payload-fails-schema-validation.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-012-invalid-payload-fails-schema-validation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Invalid payload fails schema validation" from architect/specs/platform/integration-patterns-21a.feature +- outcome: Executable scenario: Invalid payload fails schema validation + +```gwt +Given the following deliverables: +And a registered schema requiring "entityId" field +When I call toPublishedLanguage('EntityCreated', {}) +Then an error is thrown with code "SCHEMA_VALIDATION_FAILED" +And error details mention missing "entityId" +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-013-acl-translates-external-system-response.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-013-acl-translates-external-system-response.sdp.md index 155d7ace..3618c81f 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-013-acl-translates-external-system-response.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-013-acl-translates-external-system-response.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "ACL translates external system response" from architect/specs/platform/integration-patterns-21a.feature +- outcome: Architect scenario: ACL translates external system response + +```gwt +Given an external system response with { ext_ref, amount, unit } +When ACL processes the response +Then domain model should have { referenceId, value: { amount, unit } } +And external model details should not leak to domain +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-014-acl-handles-bidirectional-translation.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-014-acl-handles-bidirectional-translation.sdp.md index 002063a8..3beaa74f 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-014-acl-handles-bidirectional-translation.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-014-acl-handles-bidirectional-translation.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "ACL handles bidirectional translation" from architect/specs/platform/integration-patterns-21a.feature +- outcome: Architect scenario: ACL handles bidirectional translation + +```gwt +Given a domain ExternalRequest model +When I call externalACL.toExternal(domainModel) +Then result has external format { ext_ref, amount, unit } +And calling fromExternal() returns equivalent domain model +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-015-acl-validates-external-input.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-015-acl-validates-external-input.sdp.md index 6452107b..bbd90640 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-015-acl-validates-external-input.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-015-acl-validates-external-input.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "ACL validates external input" from architect/specs/platform/integration-patterns-21a.feature +- outcome: Architect scenario: ACL validates external input + +```gwt +Given an external response missing required field "ext_ref" +When ACL processes the response +Then an error is thrown with code "INVALID_EXTERNAL_RESPONSE" +And the error identifies the missing field +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-016-acl-rejects-unmapped-values.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-016-acl-rejects-unmapped-values.sdp.md index a24c2bd5..70e01d70 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-016-acl-rejects-unmapped-values.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-016-acl-rejects-unmapped-values.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "ACL rejects unmapped values" from architect/specs/platform/integration-patterns-21a.feature +- outcome: Architect scenario: ACL rejects unmapped values + +```gwt +Given an external response with status: "unknown_external_status" +When ACL processes the response +Then an error is thrown with code "UNMAPPED_VALUE" +And error.field equals "status" +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-001-v1-consumer-receives-v2-event.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-001-v1-consumer-receives-v2-event.sdp.md index d481cec1..7385660b 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-001-v1-consumer-receives-v2-event.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-001-v1-consumer-receives-v2-event.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "V1 consumer receives V2 event" from architect/specs/platform/integration-patterns-21b.feature +- outcome: Executable scenario: V1 consumer receives V2 event + +```gwt +Given the following deliverables: +And a consumer expecting EntityCreatedV1 +And producer emits EntityCreatedV2 +When event is delivered +Then downcaster should transform to V1 format +And consumer should process successfully +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-002-upcast-historical-events.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-002-upcast-historical-events.sdp.md index 2ad17e5a..f5a32757 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-002-upcast-historical-events.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-002-upcast-historical-events.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Upcast historical events" from architect/specs/platform/integration-patterns-21b.feature +- outcome: Executable scenario: Upcast historical events + +```gwt +Given the following deliverables: +And historical events stored as V1 +When loading events for V2 consumer +Then all events are upcasted to V2 +And default values are applied for missing fields +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-003-chain-upcasters-for-multi-version-migration.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-003-chain-upcasters-for-multi-version-migration.sdp.md index 0aed7653..8259b1a0 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-003-chain-upcasters-for-multi-version-migration.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-003-chain-upcasters-for-multi-version-migration.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Chain upcasters for multi-version migration" from architect/specs/platform/integration-patterns-21b.feature +- outcome: Executable scenario: Chain upcasters for multi-version migration + +```gwt +Given the following deliverables: +And versions V1, V2, V3 with upcasters V1→V2 and V2→V3 +When I upcast a V1 event to V3 +Then both upcasters are applied in sequence +And final result is valid V3 +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-004-upcast-adds-computed-field.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-004-upcast-adds-computed-field.sdp.md index 9bc5e500..bb294327 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-004-upcast-adds-computed-field.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-004-upcast-adds-computed-field.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Upcast adds computed field" from architect/specs/platform/integration-patterns-21b.feature +- outcome: Executable scenario: Upcast adds computed field + +```gwt +Given the following deliverables: +And V1 has { entries } array +And V2 adds computed { entryCount } +When upcasting V1 to V2 +Then entryCount equals entries.length +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-005-incompatible-schema-change-is-rejected.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-005-incompatible-schema-change-is-rejected.sdp.md index 7f060178..ffc2dac7 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-005-incompatible-schema-change-is-rejected.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-005-incompatible-schema-change-is-rejected.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Incompatible schema change is rejected" from architect/specs/platform/integration-patterns-21b.feature +- outcome: Executable scenario: Incompatible schema change is rejected + +```gwt +Given the following deliverables: +And a V3 schema with breaking changes +And no migration path from V2 +When attempting to register V3 +Then registration fails with code "NO_MIGRATION_PATH" +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-006-breaking-change-without-migration.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-006-breaking-change-without-migration.sdp.md index bb200d73..979858ff 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-006-breaking-change-without-migration.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-006-breaking-change-without-migration.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Breaking change without migration" from architect/specs/platform/integration-patterns-21b.feature +- outcome: Executable scenario: Breaking change without migration + +```gwt +Given the following deliverables: +And V2 removes required V1 field "entityId" +When attempting to register V2 as backwardCompatible with V1 +Then an error is thrown with code "BREAKING_CHANGE" +And error suggests registering migration function +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-007-contract-test-validates-schema-compatibility.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-007-contract-test-validates-schema-compatibility.sdp.md index fbfb94fd..911a452f 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-007-contract-test-validates-schema-compatibility.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-007-contract-test-validates-schema-compatibility.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Contract test validates schema compatibility" from architect/specs/platform/integration-patterns-21b.feature +- outcome: Executable scenario: Contract test validates schema compatibility + +```gwt +Given the following deliverables: +And EntityCreatedV1 contract +When running contract tests +Then producer should emit valid V1 events +And consumer should accept valid V1 events +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-008-contract-sample-generation.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-008-contract-sample-generation.sdp.md index 236f1c4d..c26c95fc 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-008-contract-sample-generation.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-008-contract-sample-generation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Contract sample generation" from architect/specs/platform/integration-patterns-21b.feature +- outcome: Executable scenario: Contract sample generation + +```gwt +Given the following deliverables: +And a registered schema "EntityCreatedV1" +When I call createContractSample('EntityCreatedV1') +Then a valid sample event is generated +And it passes schema validation +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-009-generate-multiple-unique-samples.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-009-generate-multiple-unique-samples.sdp.md index ffbf7445..9f39eb5a 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-009-generate-multiple-unique-samples.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-009-generate-multiple-unique-samples.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Generate multiple unique samples" from architect/specs/platform/integration-patterns-21b.feature +- outcome: Executable scenario: Generate multiple unique samples + +```gwt +Given the following deliverables: +And a registered schema "EntityCreatedV1" +When I call createContractSamples('EntityCreatedV1', 10) +Then I receive 10 unique sample events +And all pass schema validation +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-010-producer-contract-test-utility.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-010-producer-contract-test-utility.sdp.md index 8635430c..22d82b81 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-010-producer-contract-test-utility.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-010-producer-contract-test-utility.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Producer contract test utility" from architect/specs/platform/integration-patterns-21b.feature +- outcome: Executable scenario: Producer contract test utility + +```gwt +Given the following deliverables: +And a producer function that creates EntityCreated events +When I run createProducerContractTest('EntityCreatedV1', producer) +Then test passes when producer emits valid V1 events +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-011-consumer-contract-test-utility.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-011-consumer-contract-test-utility.sdp.md index dc1317ce..c8b427ab 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-011-consumer-contract-test-utility.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-011-consumer-contract-test-utility.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Consumer contract test utility" from architect/specs/platform/integration-patterns-21b.feature +- outcome: Executable scenario: Consumer contract test utility + +```gwt +Given the following deliverables: +And a consumer handler for EntityCreated +When I run createConsumerContractTest('EntityCreatedV1', consumer) +Then test passes when consumer processes sample events +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-012-compatible-producer-and-consumer-verified.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-012-compatible-producer-and-consumer-verified.sdp.md index d3f25bd9..4f7d8f47 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-012-compatible-producer-and-consumer-verified.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-012-compatible-producer-and-consumer-verified.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Compatible producer and consumer verified" from architect/specs/platform/integration-patterns-21b.feature +- outcome: Executable scenario: Compatible producer and consumer verified + +```gwt +Given the following deliverables: +And producer emitting EntityCreatedV1 +And consumer expecting EntityCreatedV1 +When I run verifyContractCompatibility(producer, consumer, 'EntityCreatedV1') +Then verification passes +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-013-compatible-with-downcaster.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-013-compatible-with-downcaster.sdp.md index c904ca13..ad025dcb 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-013-compatible-with-downcaster.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-013-compatible-with-downcaster.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Compatible with downcaster" from architect/specs/platform/integration-patterns-21b.feature +- outcome: Executable scenario: Compatible with downcaster + +```gwt +Given the following deliverables: +And producer emitting EntityCreatedV2 +And consumer expecting EntityCreatedV1 +And downcaster V2 → V1 is registered +When I run verifyContractCompatibility(producer, consumer) +Then verification passes +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-014-detect-producer-consumer-mismatch.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-014-detect-producer-consumer-mismatch.sdp.md index 5eda6da4..d4562251 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-014-detect-producer-consumer-mismatch.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-014-detect-producer-consumer-mismatch.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Detect producer-consumer mismatch" from architect/specs/platform/integration-patterns-21b.feature +- outcome: Executable scenario: Detect producer-consumer mismatch + +```gwt +Given the following deliverables: +And producer emitting EntityCreatedV2 +And consumer expecting EntityCreatedV1 +And no downcaster registered +When running contract tests +Then test fails with "SCHEMA_MISMATCH" +And suggested fix mentions "register downcaster" +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-015-contract-violation-is-recorded.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-015-contract-violation-is-recorded.sdp.md index 844b01c6..8af6a387 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-015-contract-violation-is-recorded.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-015-contract-violation-is-recorded.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Contract violation is recorded" from architect/specs/platform/integration-patterns-21b.feature +- outcome: Executable scenario: Contract violation is recorded + +```gwt +Given the following deliverables: +And a schema mismatch detected at runtime +When violation detection processes the mismatch +Then a ContractViolation is created +And it includes eventType, versions, and timestamp +And it is passed to ContractMetrics.recordViolation() +``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-016-contract-violations-are-queryable.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-016-contract-violations-are-queryable.sdp.md index 283aebe6..f71d26af 100644 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-016-contract-violations-are-queryable.sdp.md +++ b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-016-contract-violations-are-queryable.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Contract violations are queryable" from architect/specs/platform/integration-patterns-21b.feature +- outcome: Executable scenario: Contract violations are queryable + +```gwt +Given the following deliverables: +And multiple contract violations have been recorded +When I call contractMetrics.getViolations(since: oneHourAgo) +Then I receive violations from the last hour +And they are sorted by timestamp descending +``` diff --git a/specs/unimplemented/architect-scenarios/package-architecture/s-001-platform-fsm-has-no-dependencies.sdp.md b/specs/unimplemented/architect-scenarios/package-architecture/s-001-platform-fsm-has-no-dependencies.sdp.md index 6be7b567..a3ffa1f6 100644 --- a/specs/unimplemented/architect-scenarios/package-architecture/s-001-platform-fsm-has-no-dependencies.sdp.md +++ b/specs/unimplemented/architect-scenarios/package-architecture/s-001-platform-fsm-has-no-dependencies.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "platform-fsm has no dependencies" from architect/specs/platform/package-architecture.feature +- outcome: Executable scenario: platform-fsm has no dependencies + +```gwt +Given the following deliverables: +And the @libar-dev/platform-fsm package +When checking its dependencies +Then it should have zero @libar-dev dependencies +And it should have zero convex dependencies +And it should be usable in pure Node.js/browser environments +``` diff --git a/specs/unimplemented/architect-scenarios/package-architecture/s-002-platform-decider-depends-only-on-platform-fsm.sdp.md b/specs/unimplemented/architect-scenarios/package-architecture/s-002-platform-decider-depends-only-on-platform-fsm.sdp.md index 5a24d03f..c471c61c 100644 --- a/specs/unimplemented/architect-scenarios/package-architecture/s-002-platform-decider-depends-only-on-platform-fsm.sdp.md +++ b/specs/unimplemented/architect-scenarios/package-architecture/s-002-platform-decider-depends-only-on-platform-fsm.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "platform-decider depends only on platform-fsm" from architect/specs/platform/package-architecture.feature +- outcome: Executable scenario: platform-decider depends only on platform-fsm + +```gwt +Given the following deliverables: +And the @libar-dev/platform-decider package +When checking its dependencies +Then it should only depend on @libar-dev/platform-fsm +And it should have zero convex dependencies +``` diff --git a/specs/unimplemented/architect-scenarios/package-architecture/s-003-decider-package-is-independently-usable.sdp.md b/specs/unimplemented/architect-scenarios/package-architecture/s-003-decider-package-is-independently-usable.sdp.md index 272329bd..5e298bdc 100644 --- a/specs/unimplemented/architect-scenarios/package-architecture/s-003-decider-package-is-independently-usable.sdp.md +++ b/specs/unimplemented/architect-scenarios/package-architecture/s-003-decider-package-is-independently-usable.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Decider package is independently usable" from architect/specs/platform/package-architecture.feature +- outcome: Executable scenario: Decider package is independently usable + +```gwt +Given the following deliverables: +And a consumer wants to use only the decider pattern +When they install @libar-dev/platform-decider +Then they get decider types and factory functions +And they do NOT get event-store, command-bus, or orchestration code +And bundle size is minimal +``` diff --git a/specs/unimplemented/architect-scenarios/package-architecture/s-004-packages-are-independently-publishable.sdp.md b/specs/unimplemented/architect-scenarios/package-architecture/s-004-packages-are-independently-publishable.sdp.md index 571cda0d..fda5e73a 100644 --- a/specs/unimplemented/architect-scenarios/package-architecture/s-004-packages-are-independently-publishable.sdp.md +++ b/specs/unimplemented/architect-scenarios/package-architecture/s-004-packages-are-independently-publishable.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Packages are independently publishable" from architect/specs/platform/package-architecture.feature +- outcome: Executable scenario: Packages are independently publishable + +```gwt +Given the following deliverables: +And all @libar-dev/platform-* packages +When publishing to NPM +Then each package can be versioned independently +And consumers can install individual packages +``` diff --git a/specs/unimplemented/architect-scenarios/package-architecture/s-005-framework-tests-live-in-framework-packages.sdp.md b/specs/unimplemented/architect-scenarios/package-architecture/s-005-framework-tests-live-in-framework-packages.sdp.md index e63eba81..fc8bab9d 100644 --- a/specs/unimplemented/architect-scenarios/package-architecture/s-005-framework-tests-live-in-framework-packages.sdp.md +++ b/specs/unimplemented/architect-scenarios/package-architecture/s-005-framework-tests-live-in-framework-packages.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Framework tests live in framework packages" from architect/specs/platform/package-architecture.feature +- outcome: Executable scenario: Framework tests live in framework packages + +```gwt +Given the following deliverables: +And the @libar-dev/platform-decider package +When checking the package contents +Then tests/features/behavior/ contains BDD feature files +And tests/steps/ contains step definitions +And consumers can run tests to validate their environment +``` diff --git a/specs/unimplemented/architect-scenarios/package-architecture/s-006-existing-imports-continue-to-work.sdp.md b/specs/unimplemented/architect-scenarios/package-architecture/s-006-existing-imports-continue-to-work.sdp.md index 369ca71a..50b4a7c3 100644 --- a/specs/unimplemented/architect-scenarios/package-architecture/s-006-existing-imports-continue-to-work.sdp.md +++ b/specs/unimplemented/architect-scenarios/package-architecture/s-006-existing-imports-continue-to-work.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Existing imports continue to work" from architect/specs/platform/package-architecture.feature +- outcome: Executable scenario: Existing imports continue to work + +```gwt +Given the following deliverables: +And existing code importing from @libar-dev/platform-core +When platform-core re-exports from platform-fsm and platform-decider +Then existing imports continue to work +And no code changes required for consumers +``` diff --git a/specs/unimplemented/architect-scenarios/package-architecture/s-007-platform-namespace-avoids-conflicts.sdp.md b/specs/unimplemented/architect-scenarios/package-architecture/s-007-platform-namespace-avoids-conflicts.sdp.md index 23968707..c3e75ad3 100644 --- a/specs/unimplemented/architect-scenarios/package-architecture/s-007-platform-namespace-avoids-conflicts.sdp.md +++ b/specs/unimplemented/architect-scenarios/package-architecture/s-007-platform-namespace-avoids-conflicts.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Platform namespace avoids conflicts" from architect/specs/platform/package-architecture.feature +- outcome: Executable scenario: Platform namespace avoids conflicts + +```gwt +Given the following deliverables: +And the @libar-dev namespace +When the scenario runs +Then @libar-dev/platform-* does not conflict with @libar-dev/core +And @libar-dev/platform-* does not conflict with @libar-dev/convex-* +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-001-pd-rs-appear-in-generated-decisions-md.sdp.md b/specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-001-pd-rs-appear-in-generated-decisions-md.sdp.md index 70ef14ec..e06a2aab 100644 --- a/specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-001-pd-rs-appear-in-generated-decisions-md.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-001-pd-rs-appear-in-generated-decisions-md.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "PDRs appear in generated DECISIONS.md" from architect/decisions/pdr-001-process-decisions-folder.feature +- outcome: Executable scenario: PDRs appear in generated DECISIONS.md + +```gwt +Given the following deliverables: +And a Gherkin feature file with @architect-adr:001 tag +And the file is in libar-platform/architect/decisions/ +When running pnpm docs:pdrs +Then the decision appears in docs-living/DECISIONS.md +And the header shows "Process Decision Records" (not "Architecture Decision Records") +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-002-pdr-numbering-is-independent-from-package-ad-rs.sdp.md b/specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-002-pdr-numbering-is-independent-from-package-ad-rs.sdp.md index fce066aa..0c90b60b 100644 --- a/specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-002-pdr-numbering-is-independent-from-package-ad-rs.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-002-pdr-numbering-is-independent-from-package-ad-rs.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "PDR numbering is independent from package ADRs" from architect/decisions/pdr-001-process-decisions-folder.feature +- outcome: Executable scenario: PDR numbering is independent from package ADRs + +```gwt +Given the following deliverables: +And package-level ADRs numbered ADR-001 through ADR-004 +And repo-level PDRs numbered PDR-001 through PDR-003 +When the scenario runs +Then there is no conflict in numbering +And each scope maintains its own sequence +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-001-minimal-release-file-structure.sdp.md b/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-001-minimal-release-file-structure.sdp.md index a5659d70..c4af3e57 100644 --- a/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-001-minimal-release-file-structure.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-001-minimal-release-file-structure.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Minimal release file structure" from architect/decisions/pdr-002-release-management-architecture.feature +- outcome: Executable scenario: Minimal release file structure + +```gwt +Given the following deliverables: +And a release definition file +When checking its contents +Then it contains version, status, and highlights +And it does NOT contain deliverable DataTables +And deliverables are discovered by scanning +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-002-pdr-tagged-with-release-version.sdp.md b/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-002-pdr-tagged-with-release-version.sdp.md index fe91d9dd..33c5bffb 100644 --- a/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-002-pdr-tagged-with-release-version.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-002-pdr-tagged-with-release-version.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "PDR tagged with release version" from architect/decisions/pdr-002-release-management-architecture.feature +- outcome: Executable scenario: PDR tagged with release version + +```gwt +Given the following deliverables: +And a Process Decision Record feature file +When it includes "@architect-release:v0.1.0" +Then the scanner extracts the release field +And the changelog generator groups it under v0.1.0 +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-003-changelog-generation-from-scattered-tags.sdp.md b/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-003-changelog-generation-from-scattered-tags.sdp.md index e1fce995..834120bc 100644 --- a/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-003-changelog-generation-from-scattered-tags.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-003-changelog-generation-from-scattered-tags.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Changelog generation from scattered tags" from architect/decisions/pdr-002-release-management-architecture.feature +- outcome: Executable scenario: Changelog generation from scattered tags + +```gwt +Given the following deliverables: +And multiple files tagged with "@architect-release:v0.1.0" +When running the changelog generator +Then all tagged deliverables appear under "## v0.1.0" +And the release file highlights appear as header +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-001-specs-and-type-script-phase-files-are-separate.sdp.md b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-001-specs-and-type-script-phase-files-are-separate.sdp.md index d4a61a40..aa23991c 100644 --- a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-001-specs-and-type-script-phase-files-are-separate.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-001-specs-and-type-script-phase-files-are-separate.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Specs and TypeScript phase files are separate" from architect/decisions/pdr-003-behavior-feature-file-structure.feature +- outcome: Executable scenario: Specs and TypeScript phase files are separate + +```gwt +Given the following deliverables: +And the libar-platform/architect/ directory structure +When the scenario runs +Then specs/ contains only pure requirement feature files +And src/phases/ contains TypeScript files with release annotations +And specs have NO libar-process-* tags +And TypeScript files reference specs by pattern name +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-002-spec-files-use-semantic-tags-only.sdp.md b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-002-spec-files-use-semantic-tags-only.sdp.md index f35de2be..969fa4a9 100644 --- a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-002-spec-files-use-semantic-tags-only.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-002-spec-files-use-semantic-tags-only.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Spec files use semantic tags only" from architect/decisions/pdr-003-behavior-feature-file-structure.feature +- outcome: Executable scenario: Spec files use semantic tags only + +```gwt +Given the following deliverables: +And a feature file in libar-platform/architect/specs/ +When the scenario runs +Then the file should have semantic tags (acceptance-criteria, opportunity-N, etc.) +And the file should have Background with deliverables DataTable +And the DataTable should NOT include Release column +And the file should NOT have libar-process-* tags +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-003-type-script-phase-files-centralize-release-information.sdp.md b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-003-type-script-phase-files-centralize-release-information.sdp.md index 522818ac..3741f705 100644 --- a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-003-type-script-phase-files-centralize-release-information.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-003-type-script-phase-files-centralize-release-information.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "TypeScript phase files centralize release information" from architect/decisions/pdr-003-behavior-feature-file-structure.feature +- outcome: Executable scenario: TypeScript phase files centralize release information + +```gwt +Given the following deliverables: +And a TypeScript file in libar-platform/architect/src/phases/vX.Y.Z/ +When the scenario runs +Then the file should have @architect-pattern annotation +And the file should have @architect-phase annotation +And the file should have @architect-status annotation +And the file should reference the spec via comment or matching @architect-pattern metadata +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-004-specs-can-evolve-independently-of-phases.sdp.md b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-004-specs-can-evolve-independently-of-phases.sdp.md index 800314fb..3fe25714 100644 --- a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-004-specs-can-evolve-independently-of-phases.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-004-specs-can-evolve-independently-of-phases.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Specs can evolve independently of phases" from architect/decisions/pdr-003-behavior-feature-file-structure.feature +- outcome: Executable scenario: Specs can evolve independently of phases + +```gwt +Given the following deliverables: +And a spec file in libar-platform/architect/specs/ +When the spec is refined, split, or combined +Then only the TypeScript phase file needs updating +And no phase/release metadata exists in the spec to update +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-005-no-release-references-in-spec-data-tables.sdp.md b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-005-no-release-references-in-spec-data-tables.sdp.md index 8ce8257e..17f16697 100644 --- a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-005-no-release-references-in-spec-data-tables.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-005-no-release-references-in-spec-data-tables.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "No release references in spec DataTables" from architect/decisions/pdr-003-behavior-feature-file-structure.feature +- outcome: Executable scenario: No release references in spec DataTables + +```gwt +Given the following deliverables: +And a spec feature file with a DataTable +When the DataTable includes a Release column +Then this violates PDR-003 conventions +And the Release column must be removed +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-006-type-script-phase-files-support-process-metadata.sdp.md b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-006-type-script-phase-files-support-process-metadata.sdp.md index eea8cbd1..28cbb209 100644 --- a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-006-type-script-phase-files-support-process-metadata.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-006-type-script-phase-files-support-process-metadata.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "TypeScript phase files support process metadata" from architect/decisions/pdr-003-behavior-feature-file-structure.feature +- outcome: Executable scenario: TypeScript phase files support process metadata + +```gwt +Given the following deliverables: +And a TypeScript file in libar-platform/architect/src/phases/ +When the scenario runs +Then the file may include @architect-effort for planned effort +And the file may include @architect-effort-actual for variance tracking +And the file may include @architect-workflow for time distribution analysis +And the file may include @architect-priority for backlog ordering +And the file may include @architect-risk for progressive governance +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-007-type-script-phase-files-support-dependency-tracking.sdp.md b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-007-type-script-phase-files-support-dependency-tracking.sdp.md index 54e70bfb..faee933d 100644 --- a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-007-type-script-phase-files-support-dependency-tracking.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-007-type-script-phase-files-support-dependency-tracking.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "TypeScript phase files support dependency tracking" from architect/decisions/pdr-003-behavior-feature-file-structure.feature +- outcome: Executable scenario: TypeScript phase files support dependency tracking + +```gwt +Given the following deliverables: +And a TypeScript file in libar-platform/architect/src/phases/ +When the scenario runs +Then the file may include @architect-depends-on for dependencies +And the file may include @architect-enables for downstream patterns +And dependency information enables critical path analysis +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-001-all-metadata-uses-architect-prefix.sdp.md b/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-001-all-metadata-uses-architect-prefix.sdp.md index a6a1fab4..099d09d0 100644 --- a/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-001-all-metadata-uses-architect-prefix.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-001-all-metadata-uses-architect-prefix.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "All metadata uses @architect-* prefix" from architect/decisions/pdr-004-unified-tag-prefix-architecture.feature +- outcome: Executable scenario: All metadata uses @architect-* prefix + +```gwt +Given the unified tag prefix "@architect-*" is established +And any documentation or process metadata tag +When applying the tag to source code or feature files +Then the tag must use @architect- prefix +And the file must begin with bare @architect opt-in tag +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-002-bdd-tags-remain-unprefixed.sdp.md b/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-002-bdd-tags-remain-unprefixed.sdp.md index 239ad203..f7cba121 100644 --- a/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-002-bdd-tags-remain-unprefixed.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-002-bdd-tags-remain-unprefixed.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "BDD tags remain unprefixed" from architect/decisions/pdr-004-unified-tag-prefix-architecture.feature +- outcome: Executable scenario: BDD tags remain unprefixed + +```gwt +Given the unified tag prefix "@architect-*" is established +And a Gherkin scenario with tag "acceptance-criteria" +When the feature file is scanned +Then the tag is recognized as BDD category tag +And it is NOT prefixed with @architect- +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-003-scanner-accepts-deprecated-prefix-during-migration.sdp.md b/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-003-scanner-accepts-deprecated-prefix-during-migration.sdp.md index ad98cd90..026e88da 100644 --- a/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-003-scanner-accepts-deprecated-prefix-during-migration.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-003-scanner-accepts-deprecated-prefix-during-migration.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Scanner accepts deprecated prefix during migration" from architect/decisions/pdr-004-unified-tag-prefix-architecture.feature +- outcome: Executable scenario: Scanner accepts deprecated prefix during migration + +```gwt +Given the unified tag prefix "@architect-*" is established +And a feature file with "libar-process-phase:42" +When the scanner parses the file +Then it extracts phase number 42 +And logs deprecation warning suggesting "@architect-phase:42" +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-001-compiler-enforces-taxonomy-values.sdp.md b/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-001-compiler-enforces-taxonomy-values.sdp.md index 59d918e9..12e67416 100644 --- a/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-001-compiler-enforces-taxonomy-values.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-001-compiler-enforces-taxonomy-values.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Compiler enforces taxonomy values" from architect/decisions/pdr-006-typescript-sourced-taxonomy.feature +- outcome: Executable scenario: Compiler enforces taxonomy values + +```gwt +Given the taxonomy is defined in TypeScript files +When I reference a status value in code +Then the compiler enforces it matches defined values +And IDE provides autocomplete for valid options +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-002-zod-schemas-derive-from-type-script-constants.sdp.md b/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-002-zod-schemas-derive-from-type-script-constants.sdp.md index 1d96a841..4299920a 100644 --- a/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-002-zod-schemas-derive-from-type-script-constants.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-002-zod-schemas-derive-from-type-script-constants.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Zod schemas derive from TypeScript constants" from architect/decisions/pdr-006-typescript-sourced-taxonomy.feature +- outcome: Executable scenario: Zod schemas derive from TypeScript constants + +```gwt +Given the TypeScript constant "PROCESS_STATUS_VALUES" +When the Zod schema is defined +Then it uses z.enum(PROCESS_STATUS_VALUES) not z.array(z.string()) +And invalid values are rejected at both compile and runtime +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-003-registry-builder-creates-valid-tag-registry.sdp.md b/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-003-registry-builder-creates-valid-tag-registry.sdp.md index 84c46c10..7f327a8c 100644 --- a/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-003-registry-builder-creates-valid-tag-registry.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-003-registry-builder-creates-valid-tag-registry.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Registry builder creates valid TagRegistry" from architect/decisions/pdr-006-typescript-sourced-taxonomy.feature +- outcome: Executable scenario: Registry builder creates valid TagRegistry + +```gwt +Given the TypeScript taxonomy definitions +When buildDefaultRegistry() is called +Then a TagRegistry object is returned +And the registry matches the TypeScript definitions exactly +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-004-type-inference-from-constants.sdp.md b/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-004-type-inference-from-constants.sdp.md index e5908f7a..cf75d0d4 100644 --- a/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-004-type-inference-from-constants.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-004-type-inference-from-constants.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Type inference from constants" from architect/decisions/pdr-006-typescript-sourced-taxonomy.feature +- outcome: Executable scenario: Type inference from constants + +```gwt +Given the constant "PROCESS_STATUS_VALUES = ['roadmap', 'active', 'completed', 'deferred'] as const" +When ProcessStatusValue type is defined +Then it infers to "roadmap" "active" "completed" "deferred" +And no type duplication is required +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-001-roadmap-spec-structure.sdp.md b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-001-roadmap-spec-structure.sdp.md index e6da8ed9..053a6381 100644 --- a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-001-roadmap-spec-structure.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-001-roadmap-spec-structure.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Roadmap spec structure" from architect/decisions/pdr-007-two-tier-spec-architecture.feature +- outcome: Executable scenario: Roadmap spec structure + +```gwt +Given the following deliverables: +And a pattern requiring implementation +When creating the roadmap spec +Then it should be in libar-platform/architect/specs/{product-area}/ +And it should have @architect-pattern tag +And it should have Background with deliverables table +And it should have high-level Rule blocks (not granular scenarios) +And it should NOT have step definitions +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-002-package-spec-structure.sdp.md b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-002-package-spec-structure.sdp.md index b05bcc6a..36936431 100644 --- a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-002-package-spec-structure.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-002-package-spec-structure.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Package spec structure" from architect/decisions/pdr-007-two-tier-spec-architecture.feature +- outcome: Executable scenario: Package spec structure + +```gwt +Given the following deliverables: +And implemented functionality in a package +When creating executable specs +Then they should be in libar-platform/packages/{package}/tests/features/behavior/ +And they should have @architect-pattern tag linking to roadmap +And they should have step definitions +And they should cover edge cases and error scenarios +And they should run via vitest-cucumber +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-003-linking-roadmap-to-package-specs.sdp.md b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-003-linking-roadmap-to-package-specs.sdp.md index 85f2fbd4..019384eb 100644 --- a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-003-linking-roadmap-to-package-specs.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-003-linking-roadmap-to-package-specs.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Linking roadmap to package specs" from architect/decisions/pdr-007-two-tier-spec-architecture.feature +- outcome: Executable scenario: Linking roadmap to package specs + +```gwt +Given the following deliverables: +And a completed roadmap spec "DeciderPattern" +And package specs exist at platform-decider/tests/features/ +When adding traceability +Then roadmap spec should have @architect-executable-specs tag +And deliverables table should include "Executable Spec" column +And package spec should have @architect-roadmap-spec:DeciderPattern +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-004-completed-pattern-roadmap-spec.sdp.md b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-004-completed-pattern-roadmap-spec.sdp.md index dae77d20..0675ee70 100644 --- a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-004-completed-pattern-roadmap-spec.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-004-completed-pattern-roadmap-spec.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Completed pattern roadmap spec" from architect/decisions/pdr-007-two-tier-spec-architecture.feature +- outcome: Executable scenario: Completed pattern roadmap spec + +```gwt +Given the following deliverables: +And roadmap spec with @architect-status:completed +When the scenario runs +Then detailed scenarios should NOT be in roadmap spec +And high-level Rule descriptions should remain +And deliverables table should have all items "complete" +And @architect-executable-specs should point to package tests +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-005-active-pattern-with-acceptance-criteria.sdp.md b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-005-active-pattern-with-acceptance-criteria.sdp.md index 22bf47fc..4b460b9a 100644 --- a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-005-active-pattern-with-acceptance-criteria.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-005-active-pattern-with-acceptance-criteria.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Active pattern with acceptance criteria" from architect/decisions/pdr-007-two-tier-spec-architecture.feature +- outcome: Executable scenario: Active pattern with acceptance criteria + +```gwt +Given the following deliverables: +And roadmap spec with @architect-status:active +When defining acceptance criteria +Then high-level scenarios can exist in roadmap spec +And they guide implementation (not executable) +And they are replaced with links when complete +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-001-evaluating-a-platform-demonstration-change.sdp.md b/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-001-evaluating-a-platform-demonstration-change.sdp.md index 7df5cc4a..4ffeca8a 100644 --- a/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-001-evaluating-a-platform-demonstration-change.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-001-evaluating-a-platform-demonstration-change.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Evaluating a platform demonstration change" from architect/decisions/pdr-008-example-app-purpose.feature +- outcome: Executable scenario: Evaluating a platform demonstration change + +```gwt +Given the following deliverables: +And a proposed change to add DCB multi-product reservation +When evaluating against the guidelines +Then it should be approved because it demonstrates DCB pattern +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-002-evaluating-a-business-feature-change.sdp.md b/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-002-evaluating-a-business-feature-change.sdp.md index 443557bb..2263c803 100644 --- a/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-002-evaluating-a-business-feature-change.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-002-evaluating-a-business-feature-change.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Evaluating a business feature change" from architect/decisions/pdr-008-example-app-purpose.feature +- outcome: Executable scenario: Evaluating a business feature change + +```gwt +Given the following deliverables: +And a proposed change to add discount code system +When evaluating against the guidelines +Then it should be rejected as business feature unrelated to platform +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-003-evaluating-an-uncertain-change.sdp.md b/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-003-evaluating-an-uncertain-change.sdp.md index b7b21e7d..6fb1d769 100644 --- a/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-003-evaluating-an-uncertain-change.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-003-evaluating-an-uncertain-change.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Evaluating an uncertain change" from architect/decisions/pdr-008-example-app-purpose.feature +- outcome: Executable scenario: Evaluating an uncertain change + +```gwt +Given the following deliverables: +And a proposed change to add a new bounded context +When evaluating against the guidelines +Then it should be evaluated based on whether it demonstrates integration patterns +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-001-design-session-produces-decision-specs-not-documents.sdp.md b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-001-design-session-produces-decision-specs-not-documents.sdp.md index 09367b5b..e62ee134 100644 --- a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-001-design-session-produces-decision-specs-not-documents.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-001-design-session-produces-decision-specs-not-documents.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Design session produces decision specs not documents" from architect/decisions/pdr-009-design-session-methodology.feature +- outcome: Executable scenario: Design session produces decision specs not documents + +```gwt +Given the following deliverables: +And a design session for a new bounded context component +When architectural decisions are made during the session +Then each lasting decision is recorded as a PDR in libar-platform/architect/decisions/ +And no markdown design documents are created in docs/ +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-002-design-session-produces-code-stubs.sdp.md b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-002-design-session-produces-code-stubs.sdp.md index 15cafdac..82ce5b96 100644 --- a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-002-design-session-produces-code-stubs.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-002-design-session-produces-code-stubs.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Design session produces code stubs" from architect/decisions/pdr-009-design-session-methodology.feature +- outcome: Executable scenario: Design session produces code stubs + +```gwt +Given the following deliverables: +And a design session that defines API contracts +When handler signatures and schemas are specified +Then code stubs are created in libar-platform/architect/stubs/{pattern-name}/ +And each stub has @architect-implements linking to the parent pattern +And the real destination is indicated by an @architect-target tag in the JSDoc +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-003-stub-file-has-target-annotation.sdp.md b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-003-stub-file-has-target-annotation.sdp.md index a0ab1351..0169fdbd 100644 --- a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-003-stub-file-has-target-annotation.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-003-stub-file-has-target-annotation.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Stub file has target annotation" from architect/decisions/pdr-009-design-session-methodology.feature +- outcome: Executable scenario: Stub file has target annotation + +```gwt +Given the following deliverables: +And a code stub in libar-platform/architect/stubs/agent-component-isolation/ +When reviewing the stub file +Then @architect-* tags appear first in the JSDoc block +And it contains @architect-implements linking to the parent pattern +And the real destination is indicated by an @architect-target tag +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-004-stubs-use-pattern-based-folder-naming.sdp.md b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-004-stubs-use-pattern-based-folder-naming.sdp.md index ff7eb366..7ed9301d 100644 --- a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-004-stubs-use-pattern-based-folder-naming.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-004-stubs-use-pattern-based-folder-naming.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Stubs use pattern-based folder naming" from architect/decisions/pdr-009-design-session-methodology.feature +- outcome: Executable scenario: Stubs use pattern-based folder naming + +```gwt +Given the following deliverables: +And a design session for agent handler architecture +When creating stubs +Then the folder is named "agent-handler-architecture" not "ds-2-handler-architecture" +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-005-design-session-decision-uses-design-category.sdp.md b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-005-design-session-decision-uses-design-category.sdp.md index e18bcbed..cb5f07d9 100644 --- a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-005-design-session-decision-uses-design-category.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-005-design-session-decision-uses-design-category.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Design-session decision uses design category" from architect/decisions/pdr-009-design-session-methodology.feature +- outcome: Executable scenario: Design-session decision uses design category + +```gwt +Given the following deliverables: +And a PDR recording an API shape decision from a design session +When creating the decision record +Then it uses @architect-adr-category:design +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-001-agent-handler-receives-projection-data-as-argument.sdp.md b/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-001-agent-handler-receives-projection-data-as-argument.sdp.md index 0ebd12cb..b5fa11f4 100644 --- a/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-001-agent-handler-receives-projection-data-as-argument.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-001-agent-handler-receives-projection-data-as-argument.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Agent handler receives projection data as argument" from architect/decisions/pdr-010-cross-component-argument-injection.feature +- outcome: Executable scenario: Agent handler receives projection data as argument + +```gwt +Given the following deliverables: +And the agent component needs customer cancellation history +And the customerCancellations projection lives at the app level +When the app-level subscription handler triggers the agent +Then it pre-loads cancellation data from the projection +And passes it as an argument to the agent component handler +And the agent handler does not query any app-level tables +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-002-missing-external-data-is-handled-gracefully.sdp.md b/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-002-missing-external-data-is-handled-gracefully.sdp.md index 0a2939f4..3e37f87e 100644 --- a/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-002-missing-external-data-is-handled-gracefully.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-002-missing-external-data-is-handled-gracefully.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Missing external data is handled gracefully" from architect/decisions/pdr-010-cross-component-argument-injection.feature +- outcome: Executable scenario: Missing external data is handled gracefully + +```gwt +Given the following deliverables: +And a new customer with no cancellation history in the projection +When the agent handler receives an event for this customer +Then the injected customerHistory field is undefined +And the handler proceeds with available data +And no error is thrown +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-003-injected-data-interface-is-extensible.sdp.md b/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-003-injected-data-interface-is-extensible.sdp.md index f1776b93..e7d37c55 100644 --- a/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-003-injected-data-interface-is-extensible.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-003-injected-data-interface-is-extensible.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "InjectedData interface is extensible" from architect/decisions/pdr-010-cross-component-argument-injection.feature +- outcome: Executable scenario: InjectedData interface is extensible + +```gwt +Given the following deliverables: +And the agent component currently only needs cancellation history +When a future pattern requires order frequency data +Then a new optional field is added to AgentEventHandlerInjectedData +And existing handlers continue to work without changes +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-001-action-handler-performs-analysis-without-persistence.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-001-action-handler-performs-analysis-without-persistence.sdp.md index e4c7c305..f9dbc71e 100644 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-001-action-handler-performs-analysis-without-persistence.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-001-action-handler-performs-analysis-without-persistence.sdp.md @@ -6,8 +6,17 @@ readiness: idea relations: refines: spec:decisions.pdr-011-agent-action-handler-architecture --- -# Action handler performs analysis without persistence +# EventBus uses subscription-specific pool when available ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Action handler performs analysis without persistence" from architect/decisions/pdr-011-agent-action-handler-architecture.feature +- outcome: Executable scenario: EventBus uses subscription-specific pool when available + +```gwt +Given the following deliverables: +And an ActionSubscription with a dedicated agentPool +And a MutationSubscription with no pool specified +When EventBus dispatches to the ActionSubscription and EventBus dispatches to the MutationSubscription +Then it uses agentPool.enqueueAction +And it uses the default shared workpool.enqueueMutation +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-003-llm-unavailable-falls-back-to-rule-based-analysis.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-003-llm-unavailable-falls-back-to-rule-based-analysis.sdp.md index 3c9a470b..84aa65d8 100644 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-003-llm-unavailable-falls-back-to-rule-based-analysis.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-003-llm-unavailable-falls-back-to-rule-based-analysis.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "LLM unavailable falls back to rule-based analysis" from architect/decisions/pdr-011-agent-action-handler-architecture.feature +- outcome: Architect scenario: LLM unavailable falls back to rule-based analysis + +```gwt +Given an agent action handler configured with LLM runtime +And the LLM API returns an error or times out +When the action handler catches the LLM error +Then it falls back to rule-based confidence scoring via config.onEvent +And the AgentActionResult has analysisMethod "rule-based-fallback" +And processing continues without failure +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-004-action-failure-triggers-dead-letter-via-on-complete.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-004-action-failure-triggers-dead-letter-via-on-complete.sdp.md index b6839928..ae7c7a10 100644 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-004-action-failure-triggers-dead-letter-via-on-complete.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-004-action-failure-triggers-dead-letter-via-on-complete.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Action failure triggers dead letter via onComplete" from architect/decisions/pdr-011-agent-action-handler-architecture.feature +- outcome: Architect scenario: Action failure triggers dead letter via onComplete + +```gwt +Given an agent action that throws an unrecoverable error +And Workpool exhausts retry attempts +When the onComplete handler fires with result.kind "failed" +Then a dead letter entry is created via agent component deadLetters API +And the checkpoint is NOT advanced past the failed event +And an AgentAnalysisFailed audit event is recorded +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-005-null-decision-advances-checkpoint-without-side-effects.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-005-null-decision-advances-checkpoint-without-side-effects.sdp.md index d13c1711..fbca4f60 100644 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-005-null-decision-advances-checkpoint-without-side-effects.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-005-null-decision-advances-checkpoint-without-side-effects.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Null decision advances checkpoint without side effects" from architect/decisions/pdr-011-agent-action-handler-architecture.feature +- outcome: Architect scenario: Null decision advances checkpoint without side effects + +```gwt +Given an agent action processes an event +And the onEvent handler returns null (no pattern detected) +When the onComplete handler fires with result.kind "success" +Then no audit event, command, or approval is recorded +And the checkpoint IS advanced to the events globalPosition +And processing continues normally +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-007-existing-mutation-subscriptions-remain-unchanged.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-007-existing-mutation-subscriptions-remain-unchanged.sdp.md index de2ca6c8..25997dcb 100644 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-007-existing-mutation-subscriptions-remain-unchanged.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-007-existing-mutation-subscriptions-remain-unchanged.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Existing mutation subscriptions remain unchanged" from architect/decisions/pdr-011-agent-action-handler-architecture.feature +- outcome: Architect scenario: Existing mutation subscriptions remain unchanged + +```gwt +Given an EventSubscription with handlerType "mutation" +When EventBus.publish matches this subscription +Then it calls workpool.enqueueMutation with the mutation handler +And existing projections and process managers continue to work +And onComplete is optional as before +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-009-sequential-events-process-correctly.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-009-sequential-events-process-correctly.sdp.md index 92976d79..03a7ad73 100644 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-009-sequential-events-process-correctly.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-009-sequential-events-process-correctly.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Sequential events process correctly" from architect/decisions/pdr-011-agent-action-handler-architecture.feature +- outcome: Architect scenario: Sequential events process correctly + +```gwt +Given an agent with checkpoint at globalPosition 10 +And event E11 with globalPosition 11 arrives +When the action handler loads checkpoint and checks position +Then it processes E11 because 11 exceeds 10 +And the onComplete handler advances checkpoint to 11 +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-010-concurrent-actions-for-same-entity-are-serialized-at-on-complete.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-010-concurrent-actions-for-same-entity-are-serialized-at-on-complete.sdp.md index 35a547af..72cb710b 100644 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-010-concurrent-actions-for-same-entity-are-serialized-at-on-complete.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-010-concurrent-actions-for-same-entity-are-serialized-at-on-complete.sdp.md @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Concurrent actions for same entity are serialized at onComplete" from architect/decisions/pdr-011-agent-action-handler-architecture.feature +- outcome: Architect scenario: Concurrent actions for same entity are serialized at onComplete + +```gwt +Given an agent with checkpoint at globalPosition 10 +And events E11 and E12 are dispatched concurrently by Workpool +When both action handlers load checkpoint (both see position 10) and both pass the position check and return decisions +Then the first onComplete advances checkpoint to 11 +And the second onComplete retries via OCC +And the second onComplete sees checkpoint at 11 +And the second onComplete advances checkpoint to 12 +And no duplicate audit events or commands are created +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-011-already-processed-event-is-skipped-in-action.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-011-already-processed-event-is-skipped-in-action.sdp.md index d3feef96..f4777968 100644 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-011-already-processed-event-is-skipped-in-action.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-011-already-processed-event-is-skipped-in-action.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Already-processed event is skipped in action" from architect/decisions/pdr-011-agent-action-handler-architecture.feature +- outcome: Architect scenario: Already-processed event is skipped in action + +```gwt +Given an agent with checkpoint at globalPosition 15 +And a retried event with globalPosition 12 arrives +When the action handler loads checkpoint and checks position +Then it skips processing because 12 does not exceed 15 +And it returns a null decision +And no LLM call is made (performance optimization) +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-013-event-bus-uses-subscription-specific-pool-when-available.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-013-event-bus-uses-subscription-specific-pool-when-available.sdp.md index 40f6a429..b618442d 100644 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-013-event-bus-uses-subscription-specific-pool-when-available.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-013-event-bus-uses-subscription-specific-pool-when-available.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "EventBus uses subscription-specific pool when available" from architect/decisions/pdr-011-agent-action-handler-architecture.feature +- outcome: Executable scenario: EventBus uses subscription-specific pool when available + +```gwt +Given the following deliverables: +And an ActionSubscription with a dedicated agentPool +And a MutationSubscription with no pool specified +When EventBus dispatches to the ActionSubscription and EventBus dispatches to the MutationSubscription +Then it uses agentPool.enqueueAction +And it uses the default shared workpool.enqueueMutation +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-001-command-routes-through-orchestrator-to-domain-handler.sdp.md b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-001-command-routes-through-orchestrator-to-domain-handler.sdp.md index 87bacb9e..3c834125 100644 --- a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-001-command-routes-through-orchestrator-to-domain-handler.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-001-command-routes-through-orchestrator-to-domain-handler.sdp.md @@ -10,4 +10,17 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Command routes through orchestrator to domain handler" from architect/decisions/pdr-012-agent-command-routing.feature +- outcome: Architect scenario: Command routes through orchestrator to domain handler + +```gwt +Given an agent emits a SuggestCustomerOutreach command +And the command is recorded in the agent component with status "pending" +And a route is registered mapping SuggestCustomerOutreach to the outreach handler +When the routeAgentCommand mutation executes +Then it loads the command from the agent component by decisionId +And it looks up the route in AgentCommandRouter +And it transforms the agent command payload to orchestrator args format +And it calls CommandOrchestrator.execute with the matching CommandConfig +And the command status transitions from "pending" to "processing" to "completed" +And an audit event records the successful routing +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-002-unknown-command-type-fails-with-routing-error.sdp.md b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-002-unknown-command-type-fails-with-routing-error.sdp.md index 48515962..62a61bd3 100644 --- a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-002-unknown-command-type-fails-with-routing-error.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-002-unknown-command-type-fails-with-routing-error.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Unknown command type fails with routing error" from architect/decisions/pdr-012-agent-command-routing.feature +- outcome: Architect scenario: Unknown command type fails with routing error + +```gwt +Given an agent emits a command with type "UnknownCommand" +And no route is registered for "UnknownCommand" +When the routeAgentCommand mutation executes +Then the command status is updated to "failed" +And the error message includes "No route registered for command type: UnknownCommand" +And an AgentCommandRoutingFailed audit event is recorded with the command type +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-003-duplicate-command-rejected-by-command-orchestrator-idempotency.sdp.md b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-003-duplicate-command-rejected-by-command-orchestrator-idempotency.sdp.md index dbaaa9eb..a9fdf9ba 100644 --- a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-003-duplicate-command-rejected-by-command-orchestrator-idempotency.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-003-duplicate-command-rejected-by-command-orchestrator-idempotency.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Duplicate command rejected by CommandOrchestrator idempotency" from architect/decisions/pdr-012-agent-command-routing.feature +- outcome: Architect scenario: Duplicate command rejected by CommandOrchestrator idempotency + +```gwt +Given an agent emits a command that has already been processed +And the CommandOrchestrator detects duplicate via Command Bus commandId +When the routeAgentCommand mutation executes +Then CommandOrchestrator rejects the command as duplicate +And the command status remains "completed" from the first processing +And no duplicate domain handler invocation occurs +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-004-handler-uses-trigger-for-cheap-detection-before-llm.sdp.md b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-004-handler-uses-trigger-for-cheap-detection-before-llm.sdp.md index 51437821..0b0ee64c 100644 --- a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-004-handler-uses-trigger-for-cheap-detection-before-llm.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-004-handler-uses-trigger-for-cheap-detection-before-llm.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Handler uses trigger for cheap detection before LLM" from architect/decisions/pdr-012-agent-command-routing.feature +- outcome: Architect scenario: Handler uses trigger for cheap detection before LLM + +```gwt +Given a pattern with trigger requiring 3+ OrderCancelled events +And an event stream with 2 OrderCancelled events +When the PatternExecutor evaluates this pattern +Then pattern.trigger returns false (only 2 events) +And pattern.analyze is NOT called (no unnecessary LLM cost) +And the executor moves to the next pattern +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-005-handler-uses-analyze-for-llm-powered-detection.sdp.md b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-005-handler-uses-analyze-for-llm-powered-detection.sdp.md index e17df40f..dd165f0c 100644 --- a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-005-handler-uses-analyze-for-llm-powered-detection.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-005-handler-uses-analyze-for-llm-powered-detection.sdp.md @@ -10,4 +10,16 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Handler uses analyze for LLM-powered detection" from architect/decisions/pdr-012-agent-command-routing.feature +- outcome: Architect scenario: Handler uses analyze for LLM-powered detection + +```gwt +Given a pattern with trigger requiring 3+ OrderCancelled events +And a pattern.analyze function that calls agent.analyze with an LLM prompt +And an event stream with 5 OrderCancelled events +When the PatternExecutor evaluates this pattern +Then pattern.trigger returns true (5 events exceed threshold) +And pattern.analyze is called with the filtered events and agent interface +And the LLM returns a confidence of 0.92 +And the result is wrapped in an AgentDecision with analysisMethod "llm" +And the executor short-circuits (no further patterns evaluated) +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-001-invalid-lifecycle-transition-is-rejected.sdp.md b/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-001-invalid-lifecycle-transition-is-rejected.sdp.md index b775e825..1b158b16 100644 --- a/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-001-invalid-lifecycle-transition-is-rejected.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-001-invalid-lifecycle-transition-is-rejected.sdp.md @@ -6,8 +6,17 @@ readiness: idea relations: refines: spec:decisions.pdr-013-agent-lifecycle-fsm --- -# Invalid lifecycle transition is rejected +# ReconfigureAgent updates configuration without losing state ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Invalid lifecycle transition is rejected" from architect/decisions/pdr-013-agent-lifecycle-fsm.feature +- outcome: Executable scenario: ReconfigureAgent updates configuration without losing state + +```gwt +Given the following deliverables: +And an active churn-risk agent with confidenceThreshold 0.8 +When a ReconfigureAgent command changes threshold to 0.7 +Then the agent continues from its current checkpoint +And future analysis uses the new threshold +And the config change is recorded in audit trail +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-005-reconfigure-agent-updates-configuration-without-losing-state.sdp.md b/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-005-reconfigure-agent-updates-configuration-without-losing-state.sdp.md index 00d0e543..da208302 100644 --- a/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-005-reconfigure-agent-updates-configuration-without-losing-state.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-005-reconfigure-agent-updates-configuration-without-losing-state.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "ReconfigureAgent updates configuration without losing state" from architect/decisions/pdr-013-agent-lifecycle-fsm.feature +- outcome: Executable scenario: ReconfigureAgent updates configuration without losing state + +```gwt +Given the following deliverables: +And an active churn-risk agent with confidenceThreshold 0.8 +When a ReconfigureAgent command changes threshold to 0.7 +Then the agent continues from its current checkpoint +And future analysis uses the new threshold +And the config change is recorded in audit trail +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-001-valid-proof-allows-a-legitimate-component-boundary-action.sdp.md b/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-001-valid-proof-allows-a-legitimate-component-boundary-action.sdp.md index 11c869a4..6927e57f 100644 --- a/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-001-valid-proof-allows-a-legitimate-component-boundary-action.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-001-valid-proof-allows-a-legitimate-component-boundary-action.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Valid proof allows a legitimate component-boundary action" from architect/decisions/pdr-014-component-boundary-authentication-convention.feature +- outcome: Executable scenario: Valid proof allows a legitimate component-boundary action + +```gwt +Given the following deliverables: +And a parent mutation mints a verificationProof for the target component boundary +And the proof subject, boundedContext, and optional tenant binding match the requested action +When the component mutation calls verifyActor() before any write +Then the proof is accepted +And the mutation proceeds using the verified values as the trusted actor/context +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-before-any-write.sdp.md b/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-before-any-write.sdp.md index 586a58d0..bcb97aba 100644 --- a/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-before-any-write.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-before-any-write.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Missing or forged proof is rejected before any write" from architect/decisions/pdr-014-component-boundary-authentication-convention.feature +- outcome: Executable scenario: Missing or forged proof is rejected before any write + +```gwt +Given the following deliverables: +And a component mutation receives no verificationProof or a tampered signature +When verifyActor() runs at the mutation boundary +Then the mutation is rejected +And no component state is written on that path +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-003-targeted-mutation-family-migrates-in-one-packet.sdp.md b/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-003-targeted-mutation-family-migrates-in-one-packet.sdp.md index d3f7d7e7..1ee10ccb 100644 --- a/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-003-targeted-mutation-family-migrates-in-one-packet.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-003-targeted-mutation-family-migrates-in-one-packet.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Targeted mutation family migrates in one packet" from architect/decisions/pdr-014-component-boundary-authentication-convention.feature +- outcome: Executable scenario: Targeted mutation family migrates in one packet + +```gwt +Given the following deliverables: +And the P11 keystone packet is in review +When the targeted component mutations are inspected together +Then each of approve, reject, audit.record, agentCommands.record, and appendToStream requires verificationProof +And each calls verifyActor() inside the component mutation boundary +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-001-sequential-appends-remain-strictly-monotonic-at-real-timestamps.sdp.md b/specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-001-sequential-appends-remain-strictly-monotonic-at-real-timestamps.sdp.md index 05a4cfa7..4bc727ac 100644 --- a/specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-001-sequential-appends-remain-strictly-monotonic-at-real-timestamps.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-001-sequential-appends-remain-strictly-monotonic-at-real-timestamps.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Sequential appends remain strictly monotonic at real timestamps" from architect/decisions/pdr-015-global-position-numeric-representation.feature +- outcome: Executable scenario: Sequential appends remain strictly monotonic at real timestamps + +```gwt +Given the following deliverables: +And the store allocates positions using timestamp plus per-millisecond sequence +When 1000 sequential appends are allocated at a real 'Date.now()' scale +Then every later position is strictly greater than the prior position +And equality checks remain exact because the runtime representation is bigint +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-002-legacy-numeric-checkpoints-are-read-safely-by-the-new-code.sdp.md b/specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-002-legacy-numeric-checkpoints-are-read-safely-by-the-new-code.sdp.md index 77b0f0ff..c9f86a05 100644 --- a/specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-002-legacy-numeric-checkpoints-are-read-safely-by-the-new-code.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-002-legacy-numeric-checkpoints-are-read-safely-by-the-new-code.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Legacy numeric checkpoints are read safely by the new code" from architect/decisions/pdr-015-global-position-numeric-representation.feature +- outcome: Executable scenario: Legacy numeric checkpoints are read safely by the new code + +```gwt +Given the following deliverables: +And a historical checkpoint stores 'lastGlobalPosition' as a number +When the new checkpoint helper reads that document +Then the value is normalized through the compat path before comparison +And new bigint checkpoints are not misread as legacy numeric checkpoints +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-001-secondary-fanout-and-saga-routing-no-longer-share-the-primary-projection-p.sdp.md b/specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-001-secondary-fanout-and-saga-routing-no-longer-share-the-primary-projection-p.sdp.md index a2287913..6de7ea75 100644 --- a/specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-001-secondary-fanout-and-saga-routing-no-longer-share-the-primary-projection-p.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-001-secondary-fanout-and-saga-routing-no-longer-share-the-primary-projection-p.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Secondary fanout and saga routing no longer share the primary projection pool" from architect/decisions/pdr-016-projection-pool-split-named-pools-per-concern.feature +- outcome: Executable scenario: Secondary fanout and saga routing no longer share the primary projection pool + +```gwt +Given the following deliverables: +And the orchestrator is configured with projectionPool, sagaPool, and fanoutPool +When a command triggers a primary projection, a secondary projection, and a saga route +Then the primary projection stays on projectionPool +And the secondary projection runs on fanoutPool +And the saga route runs on sagaPool +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-002-the-pool-split-does-not-claim-nonexistent-workpool-ordering-behavior.sdp.md b/specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-002-the-pool-split-does-not-claim-nonexistent-workpool-ordering-behavior.sdp.md index 04ac9435..a777db04 100644 --- a/specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-002-the-pool-split-does-not-claim-nonexistent-workpool-ordering-behavior.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-002-the-pool-split-does-not-claim-nonexistent-workpool-ordering-behavior.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "The pool split does not claim nonexistent Workpool ordering behavior" from architect/decisions/pdr-016-projection-pool-split-named-pools-per-concern.feature +- outcome: Executable scenario: The pool split does not claim nonexistent Workpool ordering behavior + +```gwt +Given the following deliverables: +And upstream Workpool still lacks the general native 'key:' ordering feature for projections +When the pool split is documented and implemented +Then no fake FIFO guarantee is added around projectionPool, sagaPool, or fanoutPool +And ordering expectations remain limited to the capabilities actually provided upstream +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-001-tranche-3-gate-chooses-the-low-blast-radius-path.sdp.md b/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-001-tranche-3-gate-chooses-the-low-blast-radius-path.sdp.md index 58a9f2d5..12c30865 100644 --- a/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-001-tranche-3-gate-chooses-the-low-blast-radius-path.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-001-tranche-3-gate-chooses-the-low-blast-radius-path.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Tranche-3 gate chooses the low-blast-radius path" from architect/decisions/pdr-017-tranche-3-platform-architecture-gate.feature +- outcome: Executable scenario: Tranche-3 gate chooses the low-blast-radius path + +```gwt +Given the following deliverables: +And tranche-3 packet 9 starts with the design gate +When PDR-017 is reviewed +Then it accepts the shared-contract extraction +And it rejects the platform-core and platform-store full split for this packet +And it keeps tranche-3 on the non-split execution path +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-002-optional-package-splits-are-not-silently-started.sdp.md b/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-002-optional-package-splits-are-not-silently-started.sdp.md index 60efc4da..1be2f6df 100644 --- a/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-002-optional-package-splits-are-not-silently-started.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-002-optional-package-splits-are-not-silently-started.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Optional package splits are not silently started" from architect/decisions/pdr-017-tranche-3-platform-architecture-gate.feature +- outcome: Executable scenario: Optional package splits are not silently started + +```gwt +Given the following deliverables: +And PDR-017 does not approve P42 or P43 +When tranche-3 packet 9 is executed +Then no package-split migration work is started in this packet +And any follow-on cleanup remains explicitly sequenced after the shared-contract extraction +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-003-shared-contracts-package-centralizes-the-non-split-contract-surfaces.sdp.md b/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-003-shared-contracts-package-centralizes-the-non-split-contract-surfaces.sdp.md index d930f24f..91900011 100644 --- a/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-003-shared-contracts-package-centralizes-the-non-split-contract-surfaces.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-003-shared-contracts-package-centralizes-the-non-split-contract-surfaces.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Shared contracts package centralizes the non-split contract surfaces" from architect/decisions/pdr-017-tranche-3-platform-architecture-gate.feature +- outcome: Executable scenario: Shared contracts package centralizes the non-split contract surfaces + +```gwt +Given the following deliverables: +And the non-split tranche-3 path is approved +When the shared contracts package is inspected +Then EventCategory, ProcessManagerStatus, and DCB scope-key contracts live there +And platform-core, platform-store, and platform-bc consume the shared definitions instead of maintaining separate copies +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-004-layering-command-enforces-the-tranche-3-non-split-boundary-rules.sdp.md b/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-004-layering-command-enforces-the-tranche-3-non-split-boundary-rules.sdp.md index d6be9dde..73dcc626 100644 --- a/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-004-layering-command-enforces-the-tranche-3-non-split-boundary-rules.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-004-layering-command-enforces-the-tranche-3-non-split-boundary-rules.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Layering command enforces the tranche-3 non-split boundary rules" from architect/decisions/pdr-017-tranche-3-platform-architecture-gate.feature +- outcome: Executable scenario: Layering command enforces the tranche-3 non-split boundary rules + +```gwt +Given the following deliverables: +And packet 9 stays on the non-split PDR-017 path +When pnpm lint:layers runs +Then it validates the allowed package dependency matrix +And it rejects new cross-package reach-through imports beyond the acknowledged transitional allowlist +And it exits 0 for the current approved architecture state +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-001-same-key-plus-same-payload-returns-the-original-append-result.sdp.md b/specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-001-same-key-plus-same-payload-returns-the-original-append-result.sdp.md index d8e5ef40..506af58e 100644 --- a/specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-001-same-key-plus-same-payload-returns-the-original-append-result.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-001-same-key-plus-same-payload-returns-the-original-append-result.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Same key plus same payload returns the original append result" from architect/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.feature +- outcome: Executable scenario: Same key plus same payload returns the original append result + +```gwt +Given the following deliverables: +And an event already exists with idempotency key "payment:ord-123" +And a retry submits the same semantic payload for that key +When 'appendToStream' evaluates the request +Then it returns 'duplicate' +And the returned eventIds, globalPositions, and newVersion match the original append result +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-002-same-key-plus-different-payload-is-rejected-and-audited.sdp.md b/specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-002-same-key-plus-different-payload-is-rejected-and-audited.sdp.md index 1cb2a23c..62e68a79 100644 --- a/specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-002-same-key-plus-different-payload-is-rejected-and-audited.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-002-same-key-plus-different-payload-is-rejected-and-audited.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Same key plus different payload is rejected and audited" from architect/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.feature +- outcome: Executable scenario: Same key plus different payload is rejected and audited + +```gwt +Given the following deliverables: +And an event already exists with idempotency key "payment:ord-123" +And a second append reuses that key with a different semantic payload +When 'appendToStream' evaluates the request +Then it returns 'idempotency_conflict' +And an audit record is persisted with both payload fingerprints and the existing event identity +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-001-payload-below-the-configured-cap-passes-the-component-boundary.sdp.md b/specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-001-payload-below-the-configured-cap-passes-the-component-boundary.sdp.md index bf17fa36..12edd5ef 100644 --- a/specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-001-payload-below-the-configured-cap-passes-the-component-boundary.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-001-payload-below-the-configured-cap-passes-the-component-boundary.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Payload below the configured cap passes the component boundary" from architect/decisions/pdr-019-v-any-vs-v-unknown-boundary-policy.feature +- outcome: Executable scenario: Payload below the configured cap passes the component boundary + +```gwt +Given the following deliverables: +And a boundary field is validated with 'v.unknown()' +And the serialized value stays below the configured byte cap +When the component mutation validates the request +Then the call proceeds +And the stored value retains its original flexible structure +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-002-oversized-payload-is-rejected-before-persistence.sdp.md b/specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-002-oversized-payload-is-rejected-before-persistence.sdp.md index deb93476..f9990c8f 100644 --- a/specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-002-oversized-payload-is-rejected-before-persistence.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-002-oversized-payload-is-rejected-before-persistence.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Oversized payload is rejected before persistence" from architect/decisions/pdr-019-v-any-vs-v-unknown-boundary-policy.feature +- outcome: Executable scenario: Oversized payload is rejected before persistence + +```gwt +Given the following deliverables: +And a boundary field is validated with 'v.unknown()' +And its serialized size exceeds the configured byte cap +When the component mutation validates the request +Then the mutation throws 'PAYLOAD_TOO_LARGE' +And no component state is written for that request +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-001-event-type-catch-up-uses-the-replacement-compound-index.sdp.md b/specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-001-event-type-catch-up-uses-the-replacement-compound-index.sdp.md index 20bc0ed4..a681200e 100644 --- a/specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-001-event-type-catch-up-uses-the-replacement-compound-index.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-001-event-type-catch-up-uses-the-replacement-compound-index.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Event-type catch-up uses the replacement compound index" from architect/decisions/pdr-020-events-table-index-policy.feature +- outcome: Executable scenario: Event-type catch-up uses the replacement compound index + +```gwt +Given the following deliverables: +And the event store exposes 'readFromPosition' +When a caller filters by event type after a global position +Then the query uses the 'by_event_type_and_global_position' replacement index +And it returns '{ events, nextPosition, hasMore }' for continued paging +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-002-removed-indexes-stay-absent-after-the-audit-driven-cleanup.sdp.md b/specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-002-removed-indexes-stay-absent-after-the-audit-driven-cleanup.sdp.md index e113c7e0..829469f4 100644 --- a/specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-002-removed-indexes-stay-absent-after-the-audit-driven-cleanup.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-002-removed-indexes-stay-absent-after-the-audit-driven-cleanup.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Removed indexes stay absent after the audit-driven cleanup" from architect/decisions/pdr-020-events-table-index-policy.feature +- outcome: Executable scenario: Removed indexes stay absent after the audit-driven cleanup + +```gwt +Given the following deliverables: +And the index audit is complete +When the events-table schema is inspected +Then 'by_event_type', 'by_bounded_context', 'by_event_id', and 'by_category' are absent +And the replacement compound index remains present +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-001-ac4-is-closed-by-a-constrained-dependency-decision-rather-than-a-package-r.sdp.md b/specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-001-ac4-is-closed-by-a-constrained-dependency-decision-rather-than-a-package-r.sdp.md index 8a12b906..44e1da6d 100644 --- a/specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-001-ac4-is-closed-by-a-constrained-dependency-decision-rather-than-a-package-r.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-001-ac4-is-closed-by-a-constrained-dependency-decision-rather-than-a-package-r.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "AC4 is closed by a constrained dependency decision rather than a package rewrite" from architect/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.feature +- outcome: Executable scenario: AC4 is closed by a constrained dependency decision rather than a package rewrite + +```gwt +Given the following deliverables: +And '@libar-dev/platform-store' still declares '@libar-dev/platform-core' +When the live imports are audited +Then only the approved public subpaths are allowed +And the dependency is accepted with constraints instead of being described as phantom +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-002-the-constrained-dependency-does-not-reopen-the-deferred-platform-core-spli.sdp.md b/specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-002-the-constrained-dependency-does-not-reopen-the-deferred-platform-core-spli.sdp.md index e64894c6..963e06a5 100644 --- a/specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-002-the-constrained-dependency-does-not-reopen-the-deferred-platform-core-spli.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-002-the-constrained-dependency-does-not-reopen-the-deferred-platform-core-spli.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "The constrained dependency does not reopen the deferred platform-core split" from architect/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.feature +- outcome: Executable scenario: The constrained dependency does not reopen the deferred platform-core split + +```gwt +Given the following deliverables: +And AC2 remains a tranche-3 architecture concern +When the remediation sources are reviewed +Then AC4 is recorded as 'resolved-via-PDR-021' +And AC2 is recorded as 'deferred-to-Tranche-3-PDR-017' +And no approval is implied for agent, orchestration, reservations, DCB, monitoring, testing, or other new platform-core imports +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-001-bare-names-remain-canonical-across-roadmap-and-decision-sources.sdp.md b/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-001-bare-names-remain-canonical-across-roadmap-and-decision-sources.sdp.md index 431bf059..76e12944 100644 --- a/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-001-bare-names-remain-canonical-across-roadmap-and-decision-sources.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-001-bare-names-remain-canonical-across-roadmap-and-decision-sources.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Bare names remain canonical across roadmap and decision sources" from architect/decisions/pdr-022-value-transfer-doctrine-adoption.feature +- outcome: Executable scenario: Bare names remain canonical across roadmap and decision sources + +```gwt +Given the following deliverables: +And a semantic pattern named 'EventStoreFoundation' +When roadmap specs or decisions refer to that pattern +Then they should use the bare name 'EventStoreFoundation' +And they should not rename the concept to 'EventStoreFoundationExecutableTests' +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-002-executable-tests-names-identify-carrier-artifacts-only.sdp.md b/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-002-executable-tests-names-identify-carrier-artifacts-only.sdp.md index 0706d1c4..7543ead4 100644 --- a/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-002-executable-tests-names-identify-carrier-artifacts-only.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-002-executable-tests-names-identify-carrier-artifacts-only.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "ExecutableTests names identify carrier artifacts only" from architect/decisions/pdr-022-value-transfer-doctrine-adoption.feature +- outcome: Executable scenario: ExecutableTests names identify carrier artifacts only + +```gwt +Given the following deliverables: +And an executable feature created to preserve a shipped pattern +When it is named in the repo +Then the carrier may use the suffix 'ExecutableTests' +And that suffix should describe the proving artifact rather than the semantic pattern itself +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-003-architect-implements-carries-the-continuity-edge.sdp.md b/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-003-architect-implements-carries-the-continuity-edge.sdp.md index 487df722..190b2d2e 100644 --- a/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-003-architect-implements-carries-the-continuity-edge.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-003-architect-implements-carries-the-continuity-edge.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "`@architect-implements` carries the continuity edge" from architect/decisions/pdr-022-value-transfer-doctrine-adoption.feature +- outcome: Executable scenario: '@architect-implements' carries the continuity edge + +```gwt +Given the following deliverables: +And a carrier tagged '@architect-pattern:CommandBusFoundationExecutableTests' +When the repo needs continuity back to the semantic concept +Then the carrier should include '@architect-implements:CommandBusFoundation' +And graph consumers should treat that tag as the durable link to the bare pattern name +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-001-selective-rollback-restores-one-semantic-pattern-without-undoing-the-whole.sdp.md b/specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-001-selective-rollback-restores-one-semantic-pattern-without-undoing-the-whole.sdp.md index 643ae77d..59663196 100644 --- a/specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-001-selective-rollback-restores-one-semantic-pattern-without-undoing-the-whole.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-001-selective-rollback-restores-one-semantic-pattern-without-undoing-the-whole.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Selective rollback restores one semantic pattern without undoing the whole packet" from architect/decisions/pdr-023-bulk-doctrine-rollback-and-recovery.feature +- outcome: Executable scenario: Selective rollback restores one semantic pattern without undoing the whole packet + +```gwt +Given the following deliverables: +And a deleted doctrine pattern needs to come back +When the maintainer restores that pattern +Then the maintainer should restore the source spec and its paired continuity evidence together +And the maintainer should not restore unrelated deleted specs by default +And validation should rerun before the selective recovery is considered complete +``` diff --git a/specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-002-whole-packet-rollback-keeps-enforcement-in-the-normal-ci-lanes.sdp.md b/specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-002-whole-packet-rollback-keeps-enforcement-in-the-normal-ci-lanes.sdp.md index 7933ed48..3c0164e0 100644 --- a/specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-002-whole-packet-rollback-keeps-enforcement-in-the-normal-ci-lanes.sdp.md +++ b/specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-002-whole-packet-rollback-keeps-enforcement-in-the-normal-ci-lanes.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Whole-packet rollback keeps enforcement in the normal CI lanes" from architect/decisions/pdr-023-bulk-doctrine-rollback-and-recovery.feature +- outcome: Executable scenario: Whole-packet rollback keeps enforcement in the normal CI lanes + +```gwt +Given the following deliverables: +And the bulk doctrine packet must be reverted entirely +When the maintainer performs the revert +Then generated docs should be rebuilt +And hard enforcement should still run through the existing 'test.yml' lanes +And release governance should remain a summary and artifact surface only +``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-001-projection-lag-is-tracked.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-001-projection-lag-is-tracked.sdp.md index b33c096b..fd20de6e 100644 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-001-projection-lag-is-tracked.sdp.md +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-001-projection-lag-is-tracked.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Projection lag is tracked" from architect/specs/platform/production-hardening.feature +- outcome: Executable scenario: Projection lag is tracked + +```gwt +Given the following deliverables: +And a projection with checkpoint at position 100 +And the latest event is at position 150 +When metrics are collected +Then projection.lag_events should be 50 +And the metric should include projection name label +``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-002-metrics-collection-handles-missing-checkpoints.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-002-metrics-collection-handles-missing-checkpoints.sdp.md index 97a04a72..3cd98f78 100644 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-002-metrics-collection-handles-missing-checkpoints.sdp.md +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-002-metrics-collection-handles-missing-checkpoints.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Metrics collection handles missing checkpoints" from architect/specs/platform/production-hardening.feature +- outcome: Executable scenario: Metrics collection handles missing checkpoints + +```gwt +Given the following deliverables: +And a projection without a checkpoint entry +When metrics are collected +Then projection.lag_events should default to current global position +And a warning should be logged +``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-003-trace-spans-command-to-projection-flow.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-003-trace-spans-command-to-projection-flow.sdp.md index bc5122eb..b31021a0 100644 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-003-trace-spans-command-to-projection-flow.sdp.md +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-003-trace-spans-command-to-projection-flow.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Trace spans command-to-projection flow" from architect/specs/platform/production-hardening.feature +- outcome: Executable scenario: Trace spans command-to-projection flow + +```gwt +Given the following deliverables: +And a SubmitOrder command with trace context +When the command is processed and OrderSubmitted event is published and projection is updated +Then all log entries should share the same trace ID +And logs should show parent-child relationships via spanId +``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-004-missing-trace-context-uses-default.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-004-missing-trace-context-uses-default.sdp.md index 7632de77..cb7c388b 100644 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-004-missing-trace-context-uses-default.sdp.md +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-004-missing-trace-context-uses-default.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Missing trace context uses default" from architect/specs/platform/production-hardening.feature +- outcome: Executable scenario: Missing trace context uses default + +```gwt +Given the following deliverables: +And a command without trace context +When the command is processed +Then a new trace ID should be generated +And all downstream operations should use the generated trace +``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-005-readiness-probe-checks-dependencies.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-005-readiness-probe-checks-dependencies.sdp.md index a3f5fb8d..61a069fc 100644 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-005-readiness-probe-checks-dependencies.sdp.md +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-005-readiness-probe-checks-dependencies.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Readiness probe checks dependencies" from architect/specs/platform/production-hardening.feature +- outcome: Architect scenario: Readiness probe checks dependencies + +```gwt +Given the health endpoint is configured +When event store is reachable and projections are within lag threshold +Then /health/ready should return 200 +And response body should include component statuses +``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-006-unhealthy-dependency-fails-readiness.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-006-unhealthy-dependency-fails-readiness.sdp.md index 451895dd..c533101e 100644 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-006-unhealthy-dependency-fails-readiness.sdp.md +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-006-unhealthy-dependency-fails-readiness.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Unhealthy dependency fails readiness" from architect/specs/platform/production-hardening.feature +- outcome: Architect scenario: Unhealthy dependency fails readiness + +```gwt +Given event store is unreachable +When /health/ready is called +Then response should be 503 +And response body should identify failed component +``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-007-liveness-probe-always-succeeds.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-007-liveness-probe-always-succeeds.sdp.md index b9e0ff51..ef936cbb 100644 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-007-liveness-probe-always-succeeds.sdp.md +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-007-liveness-probe-always-succeeds.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Liveness probe always succeeds" from architect/specs/platform/production-hardening.feature +- outcome: Architect scenario: Liveness probe always succeeds + +```gwt +Given the health endpoint is configured +When /health/live is called +Then response should be 200 +And no dependency checks should be performed +``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-008-workpool-backlog-fails-readiness.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-008-workpool-backlog-fails-readiness.sdp.md index bf43d258..c4bd2354 100644 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-008-workpool-backlog-fails-readiness.sdp.md +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-008-workpool-backlog-fails-readiness.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Workpool backlog fails readiness" from architect/specs/platform/production-hardening.feature +- outcome: Architect scenario: Workpool backlog fails readiness + +```gwt +Given the health endpoint is configured +And workpool maxParallelism is 10 +And workpool queue depth is 25 +When /health/ready is called +Then response should be 503 +And response body should identify "workpool_backlog" as degraded +And suggested action should be "reduce traffic or scale" +``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-009-circuit-opens-after-repeated-failures.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-009-circuit-opens-after-repeated-failures.sdp.md index b009419b..89c04dd7 100644 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-009-circuit-opens-after-repeated-failures.sdp.md +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-009-circuit-opens-after-repeated-failures.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Circuit opens after repeated failures" from architect/specs/platform/production-hardening.feature +- outcome: Architect scenario: Circuit opens after repeated failures + +```gwt +Given a circuit breaker with threshold 5 +When 5 consecutive failures occur +Then circuit state should be "OPEN" +And subsequent calls should fail fast with "CIRCUIT_OPEN" +``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-010-circuit-transitions-to-half-open-after-timeout.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-010-circuit-transitions-to-half-open-after-timeout.sdp.md index c0e46e37..3e1d08c9 100644 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-010-circuit-transitions-to-half-open-after-timeout.sdp.md +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-010-circuit-transitions-to-half-open-after-timeout.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Circuit transitions to half-open after timeout" from architect/specs/platform/production-hardening.feature +- outcome: Architect scenario: Circuit transitions to half-open after timeout + +```gwt +Given a circuit in "OPEN" state +When the reset timeout expires (via scheduled function) +Then circuit state should be "HALF_OPEN" +And one test request should be allowed through +``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-011-successful-half-open-request-closes-circuit.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-011-successful-half-open-request-closes-circuit.sdp.md index 3f994ea6..588c9216 100644 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-011-successful-half-open-request-closes-circuit.sdp.md +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-011-successful-half-open-request-closes-circuit.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Successful half-open request closes circuit" from architect/specs/platform/production-hardening.feature +- outcome: Architect scenario: Successful half-open request closes circuit + +```gwt +Given a circuit in "HALF_OPEN" state +When a request succeeds +Then circuit state should be "CLOSED" +And normal traffic should resume +``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-012-failed-half-open-request-reopens-circuit.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-012-failed-half-open-request-reopens-circuit.sdp.md index d43cf757..8826368e 100644 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-012-failed-half-open-request-reopens-circuit.sdp.md +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-012-failed-half-open-request-reopens-circuit.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Failed half-open request reopens circuit" from architect/specs/platform/production-hardening.feature +- outcome: Architect scenario: Failed half-open request reopens circuit + +```gwt +Given a circuit in "HALF_OPEN" state +When a request fails +Then circuit state should return to "OPEN" +And timeout timer should reset +``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-013-projection-rebuild-re-processes-events.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-013-projection-rebuild-re-processes-events.sdp.md index 742eef73..1d789b52 100644 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-013-projection-rebuild-re-processes-events.sdp.md +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-013-projection-rebuild-re-processes-events.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Projection rebuild re-processes events" from architect/specs/platform/production-hardening.feature +- outcome: Architect scenario: Projection rebuild re-processes events + +```gwt +Given a corrupted projection at position 500 +When admin triggers rebuild from position 0 +Then checkpoint should reset to position 0 +And projection status should be "rebuilding" +And workpool should re-process all events +``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-014-dead-letter-retry-re-enqueues-event.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-014-dead-letter-retry-re-enqueues-event.sdp.md index 220492c2..8e7ac169 100644 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-014-dead-letter-retry-re-enqueues-event.sdp.md +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-014-dead-letter-retry-re-enqueues-event.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Dead letter retry re-enqueues event" from architect/specs/platform/production-hardening.feature +- outcome: Architect scenario: Dead letter retry re-enqueues event + +```gwt +Given a dead letter with status "pending" +When admin retries the dead letter +Then dead letter status should be "retrying" +And event should be re-enqueued to workpool +``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-015-event-flow-trace-returns-full-history.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-015-event-flow-trace-returns-full-history.sdp.md index c9ec6558..3baa8895 100644 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-015-event-flow-trace-returns-full-history.sdp.md +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-015-event-flow-trace-returns-full-history.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Event flow trace returns full history" from architect/specs/platform/production-hardening.feature +- outcome: Architect scenario: Event flow trace returns full history + +```gwt +Given events with correlation ID "corr-123" +When admin requests event flow trace +Then response should include command, events, and projection updates +And entries should be ordered by timestamp +``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-016-durable-function-run-diagnostics.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-016-durable-function-run-diagnostics.sdp.md index c72b6f52..ed0c752f 100644 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-016-durable-function-run-diagnostics.sdp.md +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-016-durable-function-run-diagnostics.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Durable function run diagnostics" from architect/specs/platform/production-hardening.feature +- outcome: Architect scenario: Durable function run diagnostics + +```gwt +Given an Action Retrier run with ID "run-abc123" +When admin requests durable function run status +Then response should include run state (pending, running, completed, failed) +And response should include attempt count and last error if failed +And response should include associated context (eventId, projectionName, etc.) +``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-017-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-017-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md index 347b3cbd..d0d67dce 100644 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-017-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-017-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Circuit breaker uses action retrier for half-open probe" from architect/specs/platform/production-hardening.feature +- outcome: Architect scenario: Circuit breaker uses action retrier for half-open probe + +```gwt +Given a circuit breaker "payment-api" in "HALF_OPEN" state +When a test request is initiated +Then action retrier should execute with maxFailures=0 +And circuit state should update to "CLOSED" on success +``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-018-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-018-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md index 54a3b361..9d663590 100644 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-018-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-018-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Failed half-open probe reopens circuit via action retrier" from architect/specs/platform/production-hardening.feature +- outcome: Architect scenario: Failed half-open probe reopens circuit via action retrier + +```gwt +Given a circuit breaker "payment-api" in "HALF_OPEN" state +When the probe action fails +Then onCircuitProbeComplete should transition to "OPEN" +And timeout should be rescheduled for next half-open transition +``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-019-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-019-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md index d788b326..b5352636 100644 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-019-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-019-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Dead letter retry uses action retrier for external calls" from architect/specs/platform/production-hardening.feature +- outcome: Architect scenario: Dead letter retry uses action retrier for external calls + +```gwt +Given a dead letter with status "pending" and eventId "evt-123" +When admin triggers retry +Then action retrier should execute processEvent action +And dead letter status should be "retrying" +And retryRunId should track the action run +``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-020-failed-dlq-retry-returns-to-pending-status.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-020-failed-dlq-retry-returns-to-pending-status.sdp.md index c6131da9..97ec1dff 100644 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-020-failed-dlq-retry-returns-to-pending-status.sdp.md +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-020-failed-dlq-retry-returns-to-pending-status.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Failed DLQ retry returns to pending status" from architect/specs/platform/production-hardening.feature +- outcome: Architect scenario: Failed DLQ retry returns to pending status + +```gwt +Given a dead letter in "retrying" status +When action retrier exhausts all retry attempts +Then onDLQRetryComplete should update status to "pending" +And lastError should contain the failure reason +And item should be available for manual review +``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-021-durable-function-calls-propagate-trace-context.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-021-durable-function-calls-propagate-trace-context.sdp.md index c5972e00..6e9e0bf2 100644 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-021-durable-function-calls-propagate-trace-context.sdp.md +++ b/specs/unimplemented/architect-scenarios/production-hardening/s-021-durable-function-calls-propagate-trace-context.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Durable function calls propagate trace context" from architect/specs/platform/production-hardening.feature +- outcome: Architect scenario: Durable function calls propagate trace context + +```gwt +Given an operation with traceContext { traceId: "trace-abc", spanId: "span-001" } +When action retrier executes the operation +Then the operation args should include traceContext +And retry attempts should preserve the same traceId +And logs from retries should be correlatable via traceId +``` diff --git a/specs/unimplemented/architect-scenarios/test-content-blocks/s-001-scenario-with-doc-string-for-rich-content.sdp.md b/specs/unimplemented/architect-scenarios/test-content-blocks/s-001-scenario-with-doc-string-for-rich-content.sdp.md index 0e24be19..3e4646b8 100644 --- a/specs/unimplemented/architect-scenarios/test-content-blocks/s-001-scenario-with-doc-string-for-rich-content.sdp.md +++ b/specs/unimplemented/architect-scenarios/test-content-blocks/s-001-scenario-with-doc-string-for-rich-content.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Scenario with DocString for rich content" from architect/specs/test-content-blocks.feature +- outcome: Executable scenario: Scenario with DocString for rich content + +```gwt +Given the following deliverables: +And a system in initial state +When the user provides the following configuration: +Then the expected outcome holds +``` diff --git a/specs/unimplemented/architect-scenarios/test-content-blocks/s-003-simple-scenario-under-second-rule.sdp.md b/specs/unimplemented/architect-scenarios/test-content-blocks/s-003-simple-scenario-under-second-rule.sdp.md index 37d71dfc..291d2d02 100644 --- a/specs/unimplemented/architect-scenarios/test-content-blocks/s-003-simple-scenario-under-second-rule.sdp.md +++ b/specs/unimplemented/architect-scenarios/test-content-blocks/s-003-simple-scenario-under-second-rule.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Simple scenario under second rule" from architect/specs/test-content-blocks.feature +- outcome: Architect scenario: Simple scenario under second rule + +```gwt +Given a precondition +When an action occurs +Then the expected outcome happens +``` diff --git a/specs/unimplemented/architect-scenarios/test-content-blocks/s-004-scenario-with-examples-table.sdp.md b/specs/unimplemented/architect-scenarios/test-content-blocks/s-004-scenario-with-examples-table.sdp.md index fc7ab965..9f2bb44d 100644 --- a/specs/unimplemented/architect-scenarios/test-content-blocks/s-004-scenario-with-examples-table.sdp.md +++ b/specs/unimplemented/architect-scenarios/test-content-blocks/s-004-scenario-with-examples-table.sdp.md @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Scenario with examples table" from architect/specs/test-content-blocks.feature +- outcome: Architect scenario: Scenario with examples table + +```gwt +Given a value of value +When processed +Then the result is value +``` diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-001-generate-themed-decision-document.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-001-generate-themed-decision-document.sdp.md index 6148104a..93af5e70 100644 --- a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-001-generate-themed-decision-document.sdp.md +++ b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-001-generate-themed-decision-document.sdp.md @@ -10,4 +10,13 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Generate themed decision document" from architect/specs/themed-decision-architecture.feature +- outcome: Executable scenario: Generate themed decision document + +```gwt +Given the following deliverables: +And decisions tagged with "@architect-adr-theme:persistence" +When running the themed-decisions generator +Then output file "docs-living/decisions/PERSISTENCE.md" is created +And it contains ADRs 001, 002, 010, 011 grouped together +And the theme description appears as header +``` diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-002-theme-tag-in-decision-file.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-002-theme-tag-in-decision-file.sdp.md index 8464cb79..67bcbfe2 100644 --- a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-002-theme-tag-in-decision-file.sdp.md +++ b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-002-theme-tag-in-decision-file.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Theme tag in decision file" from architect/specs/themed-decision-architecture.feature +- outcome: Executable scenario: Theme tag in decision file + +```gwt +Given the following deliverables: +And an ADR feature file +When adding theme classification +Then it includes "@architect-adr-theme:value" +And theme-name is one of: persistence, isolation, commands, projections, coordination, taxonomy, testing +``` diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-003-adr-with-dependency-declaration.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-003-adr-with-dependency-declaration.sdp.md index 3b43fc5c..32ae561d 100644 --- a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-003-adr-with-dependency-declaration.sdp.md +++ b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-003-adr-with-dependency-declaration.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "ADR with dependency declaration" from architect/specs/themed-decision-architecture.feature +- outcome: Executable scenario: ADR with dependency declaration + +```gwt +Given the following deliverables: +And ADR-016 (Checkpoint) depends on ADR-002 (Event Store) +When the ADR file includes "@architect-depends-on:002" +Then the dependency graph shows ADR-002 → ADR-016 +``` diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-004-generate-dependency-graph.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-004-generate-dependency-graph.sdp.md index fa370c53..f7a854c4 100644 --- a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-004-generate-dependency-graph.sdp.md +++ b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-004-generate-dependency-graph.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Generate dependency graph" from architect/specs/themed-decision-architecture.feature +- outcome: Executable scenario: Generate dependency graph + +```gwt +Given the following deliverables: +And all ADRs are tagged with their dependencies +When running the dependency-graph generator +Then output includes ASCII or Mermaid diagram +And the diagram shows the dependency tree: +``` diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-005-layer-information-in-generated-docs.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-005-layer-information-in-generated-docs.sdp.md index 19079c4d..22917a07 100644 --- a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-005-layer-information-in-generated-docs.sdp.md +++ b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-005-layer-information-in-generated-docs.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Layer information in generated docs" from architect/specs/themed-decision-architecture.feature +- outcome: Executable scenario: Layer information in generated docs + +```gwt +Given the following deliverables: +And a themed decision document +When it renders ADR entries +Then each entry shows its layer badge (Foundation/Infrastructure/Refinement) +And the layer provides context for the decision's maturity +``` diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-006-port-adr-from-old-format-to-feature-file.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-006-port-adr-from-old-format-to-feature-file.sdp.md index 3ea877ad..1187a8d6 100644 --- a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-006-port-adr-from-old-format-to-feature-file.sdp.md +++ b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-006-port-adr-from-old-format-to-feature-file.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Port ADR from old format to feature file" from architect/specs/themed-decision-architecture.feature +- outcome: Executable scenario: Port ADR from old format to feature file + +```gwt +Given the following deliverables: +And an existing ADR in "docs/architecture/decisions/adr-001-*.md" +When migrating to architect format +Then create "deps/libar-dev-packages/packages/tooling/architect/tests/features/decisions/adr-001-*.feature" +And include original decision content in Gherkin format +And add theme, layer, and dependency tags +And mark status (active, superseded, deprecated) +``` diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-007-review-for-validity-during-migration.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-007-review-for-validity-during-migration.sdp.md index becac5f6..1d370c91 100644 --- a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-007-review-for-validity-during-migration.sdp.md +++ b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-007-review-for-validity-during-migration.sdp.md @@ -10,4 +10,14 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Review for validity during migration" from architect/specs/themed-decision-architecture.feature +- outcome: Executable scenario: Review for validity during migration + +```gwt +Given the following deliverables: +And an ADR being migrated +When the content is reviewed +Then check if decision is still accurate +And check if it has been superseded by newer decisions +And check if implementation matches the decision +And update status accordingly +``` diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-008-generate-all-decision-artifacts.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-008-generate-all-decision-artifacts.sdp.md index 20e2fdcd..0c3aef59 100644 --- a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-008-generate-all-decision-artifacts.sdp.md +++ b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-008-generate-all-decision-artifacts.sdp.md @@ -10,4 +10,11 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Generate all decision artifacts" from architect/specs/themed-decision-architecture.feature +- outcome: Executable scenario: Generate all decision artifacts + +```gwt +Given the following deliverables: +And all decisions are tagged with theme, layer, and dependencies +When running "pnpm docs:decisions" +Then the following are generated: +``` diff --git a/specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-001-store-and-bus-readiness-harnesses-exist-before-tranche-1-implementation.sdp.md b/specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-001-store-and-bus-readiness-harnesses-exist-before-tranche-1-implementation.sdp.md index 6a9815f3..78f3419b 100644 --- a/specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-001-store-and-bus-readiness-harnesses-exist-before-tranche-1-implementation.sdp.md +++ b/specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-001-store-and-bus-readiness-harnesses-exist-before-tranche-1-implementation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Store and bus readiness harnesses exist before tranche 1 implementation" from architect/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.feature +- outcome: Executable scenario: Store and bus readiness harnesses exist before tranche 1 implementation + +```gwt +Given the following deliverables: +And the tranche-0 readiness packet is planned +When implementation begins +Then store and bus backend integration harnesses are both in scope +And later security and correctness packets treat them as prerequisites +``` diff --git a/specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-002-readiness-validation-remains-machine-verifiable.sdp.md b/specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-002-readiness-validation-remains-machine-verifiable.sdp.md index 00d73fd6..3a88eb4e 100644 --- a/specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-002-readiness-validation-remains-machine-verifiable.sdp.md +++ b/specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-002-readiness-validation-remains-machine-verifiable.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Readiness validation remains machine-verifiable" from architect/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.feature +- outcome: Executable scenario: Readiness validation remains machine-verifiable + +```gwt +Given the following deliverables: +And the readiness packet deliverables +When the packet is validated +Then 'pnpm typecheck' and 'pnpm lint' remain required gates +And 'pnpm test:integration' includes the new store and bus harnesses +``` diff --git a/specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-001-release-governance-points-to-pdr-002.sdp.md b/specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-001-release-governance-points-to-pdr-002.sdp.md index 25cb6141..ac1cb03f 100644 --- a/specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-001-release-governance-points-to-pdr-002.sdp.md +++ b/specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-001-release-governance-points-to-pdr-002.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Release governance points to PDR-002" from architect/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.feature +- outcome: Executable scenario: Release governance points to PDR-002 + +```gwt +Given the following deliverables: +And a remediation packet under tranche 0 +When its release-governance source is documented +Then it points to 'libar-platform/architect/decisions/pdr-002-release-management-architecture.feature' +And no alternate release authority is introduced +``` diff --git a/specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-002-docs-only-changes-still-run-architect-guard-and-docs-generation.sdp.md b/specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-002-docs-only-changes-still-run-architect-guard-and-docs-generation.sdp.md index e567fcce..9992c721 100644 --- a/specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-002-docs-only-changes-still-run-architect-guard-and-docs-generation.sdp.md +++ b/specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-002-docs-only-changes-still-run-architect-guard-and-docs-generation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Docs-only changes still run architect guard and docs generation" from architect/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.feature +- outcome: Executable scenario: Docs-only changes still run architect guard and docs generation + +```gwt +Given the following deliverables: +And a docs-or-spec-only remediation change +When CI evaluates the change +Then a dedicated workflow runs 'pnpm architect-guard --all --strict' +And the same workflow runs 'pnpm docs:all' +``` diff --git a/specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-001-supporting-cleanup-does-not-bypass-the-auth-keystone.sdp.md b/specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-001-supporting-cleanup-does-not-bypass-the-auth-keystone.sdp.md index a0ddb926..82b503f4 100644 --- a/specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-001-supporting-cleanup-does-not-bypass-the-auth-keystone.sdp.md +++ b/specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-001-supporting-cleanup-does-not-bypass-the-auth-keystone.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Supporting cleanup does not bypass the auth keystone" from architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature +- outcome: Executable scenario: Supporting cleanup does not bypass the auth keystone + +```gwt +Given the following deliverables: +And the supporting tranche-1 packet is planned +When implementation begins +Then it assumes the component-boundary auth convention already exists +And it does not introduce alternate trust or correlation shortcuts +``` diff --git a/specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-002-supporting-contract-gaps-fail-closed-after-remediation.sdp.md b/specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-002-supporting-contract-gaps-fail-closed-after-remediation.sdp.md index 5024d466..b662852b 100644 --- a/specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-002-supporting-contract-gaps-fail-closed-after-remediation.sdp.md +++ b/specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-002-supporting-contract-gaps-fail-closed-after-remediation.sdp.md @@ -10,4 +10,12 @@ relations: ## Intent -- outcome: Architect scenario (not an SDP test carrier) "Supporting contract gaps fail closed after remediation" from architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature +- outcome: Executable scenario: Supporting contract gaps fail closed after remediation + +```gwt +Given the following deliverables: +And the supporting tranche-1 packet is implemented +When legacy shortcut paths are exercised +Then each path fails with the expected error or rejection +And 'pnpm test:packages' plus 'pnpm test:integration' remain required gates +``` diff --git a/specs/unimplemented/current/phase-100-codec-driven-reference-generation.sdp.md b/specs/unimplemented/current/phase-100-codec-driven-reference-generation.sdp.md index 4215c799..f21fff26 100644 --- a/specs/unimplemented/current/phase-100-codec-driven-reference-generation.sdp.md +++ b/specs/unimplemented/current/phase-100-codec-driven-reference-generation.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent +CodecDrivenReferenceGeneration Purpose: Active work details for CodecDrivenReferenceGeneration --- Progress Progress: [█████░░░░░░░░░░░░░░░] 1/4 (25%) --- 🚧 Active Work 🚧 Process Enhancements Vision: Transform the delivery process from a documentation tool into a delivery operating system. Enable code-driven, multi-workflow documentation where code + .feature files are authoritative sources, and all artifacts are generated projections. Problem: Current delivery process capabilities are limited to document generation. The convergence roadmap identified 8 opportunities: Process Views as Projections, DoD as Machine-Checkable, Earned-Value Tracking, Requirements-Tests Traceability, Architecture Change Control, Progressive Governance, and Living Roadmap. Solution: Incrementally implement conve… + - outcome: Non-implemented or in-flight work captured from docs-living/current/phase-100-codec-driven-reference-generation.md. diff --git a/specs/unimplemented/current/phase-100-themed-decision-architecture.sdp.md b/specs/unimplemented/current/phase-100-themed-decision-architecture.sdp.md index b5e59cda..2bfbf8b0 100644 --- a/specs/unimplemented/current/phase-100-themed-decision-architecture.sdp.md +++ b/specs/unimplemented/current/phase-100-themed-decision-architecture.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent +ThemedDecisionArchitecture Purpose: Active work details for ThemedDecisionArchitecture --- Progress Progress: [█████░░░░░░░░░░░░░░░] 1/4 (25%) --- 🚧 Active Work 🚧 Process Enhancements Vision: Transform the delivery process from a documentation tool into a delivery operating system. Enable code-driven, multi-workflow documentation where code + .feature files are authoritative sources, and all artifacts are generated projections. Problem: Current delivery process capabilities are limited to document generation. The convergence roadmap identified 8 opportunities: Process Views as Projections, DoD as Machine-Checkable, Earned-Value Tracking, Requirements-Tests Traceability, Architecture Change Control, Progressive Governance, and Living Roadmap. Solution: Incrementally implement convergence o… + - outcome: Non-implemented or in-flight work captured from docs-living/current/phase-100-themed-decision-architecture.md. diff --git a/specs/unimplemented/current/phase-15-projection-categories-executable-tests.sdp.md b/specs/unimplemented/current/phase-15-projection-categories-executable-tests.sdp.md index 7716906a..2e62d441 100644 --- a/specs/unimplemented/current/phase-15-projection-categories-executable-tests.sdp.md +++ b/specs/unimplemented/current/phase-15-projection-categories-executable-tests.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent +ProjectionCategoriesExecutableTests Purpose: Active work details for ProjectionCategoriesExecutableTests --- Progress Progress: [░░░░░░░░░░░░░░░░░░░░] 0/3 (0%) --- 🚧 Active Work 🚧 Projection Categories Executable Tests As a platform developer I want projections classified into four distinct categories So that I can route queries and optimize projection behavior Acceptance Criteria PROJECTION_CATEGORIES tuple contains all valid categories - When I access PROJECTION_CATEGORIES - Then it contains exactly "logic", "view", "reporting", "integration" - And it is a readonly tuple isProjectionCategory validates category strings - When I call isProjectionCategory with " " - Then I receive Category helper functions identify correct categories - Given a projection category " " - Then isLogicProjecti… + - outcome: Non-implemented or in-flight work captured from docs-living/current/phase-15-projection-categories-executable-tests.md. diff --git a/specs/unimplemented/current/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md b/specs/unimplemented/current/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md index 111db6de..251e0314 100644 --- a/specs/unimplemented/current/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md +++ b/specs/unimplemented/current/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent +Agent as Bounded Context - AI-Driven Event Reactors Purpose: Active work details for Agent as Bounded Context - AI-Driven Event Reactors --- Progress Progress: [███░░░░░░░░░░░░░░░░░] 1/6 (17%) --- 🚧 Active Work 🚧 Agent as Bounded Context - AI-Driven Event Reactors Agent as Bounded Context - AI-Driven Event Reactors Demonstrates the Agent as Bounded Context pattern where AI agents subscribe to domain events via EventBus and emit commands based on pattern detection. Architecture Overview ┌─────────────────────────────────────────────────────────────────────────┐ │ EventBus │ │ (publishes OrderCancelled, OrderRefunded, OrderComplaintFiled, etc.) │ └────────────────────────────────┬────────────────────────────────────────┘ │ subscribe ▼ ┌───────────────────────────────────────────────────────… + - outcome: Non-implemented or in-flight work captured from docs-living/current/phase-22-agent-as-bounded-context-ai-driven-event-reactors.md. diff --git a/specs/unimplemented/current/phase-22-agent-as-bounded-context.sdp.md b/specs/unimplemented/current/phase-22-agent-as-bounded-context.sdp.md index 8fb8d255..9856c94f 100644 --- a/specs/unimplemented/current/phase-22-agent-as-bounded-context.sdp.md +++ b/specs/unimplemented/current/phase-22-agent-as-bounded-context.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent +AgentAsBoundedContext Purpose: Active work details for AgentAsBoundedContext --- Progress Progress: [░░░░░░░░░░░░░░░░░░░░] 0/1 (0%) --- 🚧 Active Work 🚧 Agent As Bounded Context Problem: AI agents are invoked manually without integration into the event-driven architecture. No pattern for agents to react to business events. Solution: AI agents implemented as bounded contexts that: 1. Subscribe to event streams via EventBus 2. Detect patterns across events using LLM or rules 3. Emit commands based on detected patterns This is the culminating pattern demonstrating full platform integration. Why It Matters for Convex-Native ES: Architectural Decisions: @convex-dev/agent Integration: Agent BC uses @convex-dev/agent for LLM reasoning while maintaining its own state model. Integration Pattern: ""… + - outcome: Non-implemented or in-flight work captured from docs-living/current/phase-22-agent-as-bounded-context.md. diff --git a/specs/unimplemented/current/phase-22-agent-churn-risk-completion.sdp.md b/specs/unimplemented/current/phase-22-agent-churn-risk-completion.sdp.md index 8872b7f2..844f1304 100644 --- a/specs/unimplemented/current/phase-22-agent-churn-risk-completion.sdp.md +++ b/specs/unimplemented/current/phase-22-agent-churn-risk-completion.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent +AgentChurnRiskCompletion Purpose: Active work details for AgentChurnRiskCompletion --- Progress Progress: [██████████░░░░░░░░░░] 3/6 (50%) --- 🚧 Active Work 🚧 Agent BC Component Isolation Problem: Agent BC tables ( agentCheckpoints , agentAuditEvents , agentDeadLetters , agentCommands , pendingApprovals ) reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. Solution: Implement agent as a proper Convex component: 1. defineComponent("agent") with isolated schema and private tables 2. Public API handlers for checkpoint, audit, dead letter, and command operations 3. Cross-component query pattern for… + - outcome: Non-implemented or in-flight work captured from docs-living/current/phase-22-agent-churn-risk-completion.md. diff --git a/specs/unimplemented/current/phase-22-confirmed-order-cancellation.sdp.md b/specs/unimplemented/current/phase-22-confirmed-order-cancellation.sdp.md index a70675e5..68790a39 100644 --- a/specs/unimplemented/current/phase-22-confirmed-order-cancellation.sdp.md +++ b/specs/unimplemented/current/phase-22-confirmed-order-cancellation.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent +ConfirmedOrderCancellation Purpose: Active work details for ConfirmedOrderCancellation --- Progress Progress: [██████████░░░░░░░░░░] 3/6 (50%) --- 🚧 Active Work 🚧 Agent BC Component Isolation Problem: Agent BC tables ( agentCheckpoints , agentAuditEvents , agentDeadLetters , agentCommands , pendingApprovals ) reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. Solution: Implement agent as a proper Convex component: 1. defineComponent("agent") with isolated schema and private tables 2. Public API handlers for checkpoint, audit, dead letter, and command operations 3. Cross-component query pattern… + - outcome: Non-implemented or in-flight work captured from docs-living/current/phase-22-confirmed-order-cancellation.md. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-001-create-admin-directory.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-001-create-admin-directory.sdp.md index a2b9051f..dacf309c 100644 --- a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-001-create-admin-directory.sdp.md +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-001-create-admin-directory.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Create admin/ directory" from architect/specs/platform/admin-tooling-consolidation.feature at examples/order-management/convex/admin/. +- outcome: Unimplemented deliverable: Create admin/ directory at examples/order-management/convex/admin/ +- problem: Admin functionality is scattered across the codebase: - Dead letter queue at 'convex/projections/deadLetters.ts' - Saga admin at 'convex/sagas/admin.ts' - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-002-projection-admin-endpoints.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-002-projection-admin-endpoints.sdp.md index 6468b62b..eccc4b82 100644 --- a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-002-projection-admin-endpoints.sdp.md +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-002-projection-admin-endpoints.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Projection admin endpoints" from architect/specs/platform/admin-tooling-consolidation.feature at examples/order-management/convex/admin/projections.ts. +- outcome: Unimplemented deliverable: Projection admin endpoints at examples/order-management/convex/admin/projections +- problem: Admin functionality is scattered across the codebase: - Dead letter queue at 'convex/projections/deadLetters.ts' - Saga admin at 'convex/sagas/admin.ts' - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-003-refactored-dlq-endpoints.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-003-refactored-dlq-endpoints.sdp.md index fbec8489..34ebe5a5 100644 --- a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-003-refactored-dlq-endpoints.sdp.md +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-003-refactored-dlq-endpoints.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Refactored DLQ endpoints" from architect/specs/platform/admin-tooling-consolidation.feature at examples/order-management/convex/admin/deadLetters.ts. +- outcome: Unimplemented deliverable: Refactored DLQ endpoints at examples/order-management/convex/admin/deadLetters +- problem: Admin functionality is scattered across the codebase: - Dead letter queue at 'convex/projections/deadLetters.ts' - Saga admin at 'convex/sagas/admin.ts' - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-004-event-flow-trace-query.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-004-event-flow-trace-query.sdp.md index f42624d1..c08c67f9 100644 --- a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-004-event-flow-trace-query.sdp.md +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-004-event-flow-trace-query.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Event flow trace query" from architect/specs/platform/admin-tooling-consolidation.feature at examples/order-management/convex/admin/diagnostics.ts. +- outcome: Unimplemented deliverable: Event flow trace query at examples/order-management/convex/admin/diagnostics +- problem: Admin functionality is scattered across the codebase: - Dead letter queue at 'convex/projections/deadLetters.ts' - Saga admin at 'convex/sagas/admin.ts' - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-005-system-state-snapshot-query.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-005-system-state-snapshot-query.sdp.md index 79d3e744..47b81089 100644 --- a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-005-system-state-snapshot-query.sdp.md +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-005-system-state-snapshot-query.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "System state snapshot query" from architect/specs/platform/admin-tooling-consolidation.feature at examples/order-management/convex/admin/diagnostics.ts. +- outcome: Unimplemented deliverable: System state snapshot query at examples/order-management/convex/admin/diagnostics +- problem: Admin functionality is scattered across the codebase: - Dead letter queue at 'convex/projections/deadLetters.ts' - Saga admin at 'convex/sagas/admin.ts' - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-006-durable-function-run-queries.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-006-durable-function-run-queries.sdp.md index e33e1f68..76ae6d0c 100644 --- a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-006-durable-function-run-queries.sdp.md +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-006-durable-function-run-queries.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Durable function run queries" from architect/specs/platform/admin-tooling-consolidation.feature at examples/order-management/convex/admin/durableFunctions.ts. +- outcome: Unimplemented deliverable: Durable function run queries at examples/order-management/convex/admin/durableFunctions +- problem: Admin functionality is scattered across the codebase: - Dead letter queue at 'convex/projections/deadLetters.ts' - Saga admin at 'convex/sagas/admin.ts' - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-007-admin-authorization-wrapper.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-007-admin-authorization-wrapper.sdp.md index 1ef2339b..f227b197 100644 --- a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-007-admin-authorization-wrapper.sdp.md +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-007-admin-authorization-wrapper.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Admin authorization wrapper" from architect/specs/platform/admin-tooling-consolidation.feature at examples/order-management/convex/admin/_auth.ts. +- outcome: Unimplemented deliverable: Admin authorization wrapper at examples/order-management/convex/admin/_auth +- problem: Admin functionality is scattered across the codebase: - Dead letter queue at 'convex/projections/deadLetters.ts' - Saga admin at 'convex/sagas/admin.ts' - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-008-admin-api-documentation.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-008-admin-api-documentation.sdp.md index ce9c8019..f4593186 100644 --- a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-008-admin-api-documentation.sdp.md +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-008-admin-api-documentation.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Admin API documentation" from architect/specs/platform/admin-tooling-consolidation.feature at docs/operations/ADMIN-API.md. +- outcome: Unimplemented deliverable: Admin API documentation at docs/operations/ADMIN-API +- problem: Admin functionality is scattered across the codebase: - Dead letter queue at 'convex/projections/deadLetters.ts' - Saga admin at 'convex/sagas/admin.ts' - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-001-high-value-agent-config.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-001-high-value-agent-config.sdp.md index 4ef1060a..874d4528 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-001-high-value-agent-config.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-001-high-value-agent-config.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "High-value agent config" from architect/specs/example-app/agent-admin-frontend.feature at order-management/convex/contexts/agent/high-value/_config.ts. +- outcome: Unimplemented deliverable: High-value agent config at order-management/convex/contexts/agent/high-value/_config +- problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-002-high-value-pattern-definition.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-002-high-value-pattern-definition.sdp.md index c529bfda..df18abf0 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-002-high-value-pattern-definition.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-002-high-value-pattern-definition.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "High-value pattern definition" from architect/specs/example-app/agent-admin-frontend.feature at order-management/convex/contexts/agent/high-value/_patterns/highValueOrder.ts. +- outcome: Unimplemented deliverable: High-value pattern definition at order-management/convex/contexts/agent/high-value/_patterns/highValueOrder +- problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-003-high-value-action-handler.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-003-high-value-action-handler.sdp.md index 0d38da80..66eb009f 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-003-high-value-action-handler.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-003-high-value-action-handler.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "High-value action handler" from architect/specs/example-app/agent-admin-frontend.feature at order-management/convex/contexts/agent/high-value/handlers/analyzeEvent.ts. +- outcome: Unimplemented deliverable: High-value action handler at order-management/convex/contexts/agent/high-value/handlers/analyzeEvent +- problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-004-high-value-on-complete-handler.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-004-high-value-on-complete-handler.sdp.md index b3a877d9..f6b01184 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-004-high-value-on-complete-handler.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-004-high-value-on-complete-handler.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "High-value onComplete handler" from architect/specs/example-app/agent-admin-frontend.feature at order-management/convex/contexts/agent/high-value/handlers/onComplete.ts. +- outcome: Unimplemented deliverable: High-value onComplete handler at order-management/convex/contexts/agent/high-value/handlers/onComplete +- problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-005-high-value-command-route.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-005-high-value-command-route.sdp.md index f42d8a15..ead93f47 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-005-high-value-command-route.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-005-high-value-command-route.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "High-value command route" from architect/specs/example-app/agent-admin-frontend.feature at order-management/convex/contexts/agent/high-value/handlers/routeCommand.ts. +- outcome: Unimplemented deliverable: High-value command route at order-management/convex/contexts/agent/high-value/handlers/routeCommand +- problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-006-high-value-event-bus-subscription.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-006-high-value-event-bus-subscription.sdp.md index b30f05e1..1afa37f2 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-006-high-value-event-bus-subscription.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-006-high-value-event-bus-subscription.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "High-value EventBus subscription" from architect/specs/example-app/agent-admin-frontend.feature at order-management/convex/eventSubscriptions.ts. +- outcome: Unimplemented deliverable: High-value EventBus subscription at order-management/convex/eventSubscriptions +- problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-007-high-value-integration-test-real-llm.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-007-high-value-integration-test-real-llm.sdp.md index 4df73b7d..417d9f41 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-007-high-value-integration-test-real-llm.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-007-high-value-integration-test-real-llm.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "High-value integration test (real LLM)" from architect/specs/example-app/agent-admin-frontend.feature at order-management/tests/integration/agent/high-value-order.integration.test.ts. +- outcome: Unimplemented deliverable: High-value integration test (real LLM) at order-management/tests/integration/agent/high-value-order +- problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-008-dead-letter-management-section-in-monitoring.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-008-dead-letter-management-section-in-monitoring.sdp.md index 60342a47..dc31f53c 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-008-dead-letter-management-section-in-monitoring.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-008-dead-letter-management-section-in-monitoring.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Dead letter management section in Monitoring" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/app/admin/agents.tsx (Monitoring tab extension). +- outcome: Unimplemented deliverable: Dead letter management section in Monitoring at apps/frontend/app/admin/agents +- problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-009-use-dead-letters-hook.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-009-use-dead-letters-hook.sdp.md index 44168929..a2c34c31 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-009-use-dead-letters-hook.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-009-use-dead-letters-hook.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "useDeadLetters hook" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/hooks/use-dead-letters.ts. +- outcome: Unimplemented deliverable: useDeadLetters hook at apps/frontend/hooks/use-dead-letters +- problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-010-use-dead-letter-actions-hook.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-010-use-dead-letter-actions-hook.sdp.md index 97397ba1..0d75bbb3 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-010-use-dead-letter-actions-hook.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-010-use-dead-letter-actions-hook.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "useDeadLetterActions hook" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/hooks/use-dead-letter-actions.ts. +- outcome: Unimplemented deliverable: useDeadLetterActions hook at apps/frontend/hooks/use-dead-letter-actions +- problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-011-decision-history-tab.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-011-decision-history-tab.sdp.md index bad374e4..2503bae4 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-011-decision-history-tab.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-011-decision-history-tab.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Decision history tab" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/app/admin/agents.tsx (new tab). +- outcome: Unimplemented deliverable: Decision history tab at apps/frontend/app/admin/agents +- problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-012-use-decision-history-hook-with-filters.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-012-use-decision-history-hook-with-filters.sdp.md index db30fa71..8affc589 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-012-use-decision-history-hook-with-filters.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-012-use-decision-history-hook-with-filters.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "useDecisionHistory hook with filters" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/hooks/use-decision-history.ts. +- outcome: Unimplemented deliverable: useDecisionHistory hook with filters at apps/frontend/hooks/use-decision-history +- problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-013-toast-notification-integration-sonner.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-013-toast-notification-integration-sonner.sdp.md index f3ebfdf3..ada9f18b 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-013-toast-notification-integration-sonner.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-013-toast-notification-integration-sonner.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Toast notification integration (Sonner)" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/components/toast-provider.tsx. +- outcome: Unimplemented deliverable: Toast notification integration (Sonner) at apps/frontend/components/toast-provider +- problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-014-action-feedback-toasts.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-014-action-feedback-toasts.sdp.md index 307ad81f..a4959884 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-014-action-feedback-toasts.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-014-action-feedback-toasts.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Action feedback toasts" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/hooks/use-approval-actions.ts (enhance). +- outcome: Unimplemented deliverable: Action feedback toasts at apps/frontend/hooks/use-approval-actions +- problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-015-dashboard-update-for-multi-agent.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-015-dashboard-update-for-multi-agent.sdp.md index 98e6477c..f1be8c22 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-015-dashboard-update-for-multi-agent.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-015-dashboard-update-for-multi-agent.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Dashboard update for multi-agent" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/app/admin/agents.tsx. +- outcome: Unimplemented deliverable: Dashboard update for multi-agent at apps/frontend/app/admin/agents +- problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-016-e2-e-step-definitions.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-016-e2-e-step-definitions.sdp.md index b4ff2b70..89342635 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-016-e2-e-step-definitions.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-016-e2-e-step-definitions.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "E2E step definitions" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/tests/e2e/steps/agent.steps.ts. +- outcome: Unimplemented deliverable: E2E step definitions at apps/frontend/tests/e2e/steps/agent +- problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-017-agent-admin-page-page-object.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-017-agent-admin-page-page-object.sdp.md index 477aec6a..8d2740c0 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-017-agent-admin-page-page-object.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-017-agent-admin-page-page-object.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "AgentAdminPage page object" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/tests/e2e/support/pages/AgentAdminPage.ts. +- outcome: Unimplemented deliverable: AgentAdminPage page object at apps/frontend/tests/e2e/support/pages/AgentAdminPage +- problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-018-tag-unimplemented-agent-e2e-scenarios-skip.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-018-tag-unimplemented-agent-e2e-scenarios-skip.sdp.md index a923e377..6e582a37 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-018-tag-unimplemented-agent-e2e-scenarios-skip.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-018-tag-unimplemented-agent-e2e-scenarios-skip.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Tag unimplemented agent e2e scenarios @skip" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/tests/e2e/features/admin/agent-approvals.feature. +- outcome: Unimplemented deliverable: Tag unimplemented agent e2e scenarios @skip at apps/frontend/tests/e2e/features/admin/agent-approvals +- problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-019-auth-integration-documentation.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-019-auth-integration-documentation.sdp.md index cf20757e..919e21d5 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-019-auth-integration-documentation.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-019-auth-integration-documentation.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Auth integration documentation" from architect/specs/example-app/agent-admin-frontend.feature at apps/frontend/hooks/use-reviewer-id.ts (JSDoc). +- outcome: Unimplemented deliverable: Auth integration documentation at apps/frontend/hooks/use-reviewer-id +- problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-001-agent-component-definition.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-001-agent-component-definition.sdp.md index 7857f84e..7c1d23e7 100644 --- a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-001-agent-component-definition.sdp.md +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-001-agent-component-definition.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Agent component definition" from architect/specs/platform/agent-bc-component-isolation.feature at @libar-dev/platform-core/src/agent/component/convex.config.ts. +- outcome: Unimplemented deliverable: Agent component definition at @libar-dev/platform-core/src/agent/component/convex +- problem: Agent BC tables ('agentCheckpoints', 'agentAuditEvents', 'agentDeadLetters', 'agentCommands', 'pendingApprovals') reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-002-agent-component-schema.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-002-agent-component-schema.sdp.md index c5f96d8d..1db79545 100644 --- a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-002-agent-component-schema.sdp.md +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-002-agent-component-schema.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Agent component schema" from architect/specs/platform/agent-bc-component-isolation.feature at @libar-dev/platform-core/src/agent/component/schema.ts. +- outcome: Unimplemented deliverable: Agent component schema at @libar-dev/platform-core/src/agent/component/schema +- problem: Agent BC tables ('agentCheckpoints', 'agentAuditEvents', 'agentDeadLetters', 'agentCommands', 'pendingApprovals') reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-003-checkpoint-public-api.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-003-checkpoint-public-api.sdp.md index ab3f8203..da78921b 100644 --- a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-003-checkpoint-public-api.sdp.md +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-003-checkpoint-public-api.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Checkpoint public API" from architect/specs/platform/agent-bc-component-isolation.feature at @libar-dev/platform-core/src/agent/component/checkpoints.ts. +- outcome: Unimplemented deliverable: Checkpoint public API at @libar-dev/platform-core/src/agent/component/checkpoints +- problem: Agent BC tables ('agentCheckpoints', 'agentAuditEvents', 'agentDeadLetters', 'agentCommands', 'pendingApprovals') reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-004-audit-public-api.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-004-audit-public-api.sdp.md index 7c7c4de0..8acdf79f 100644 --- a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-004-audit-public-api.sdp.md +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-004-audit-public-api.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Audit public API" from architect/specs/platform/agent-bc-component-isolation.feature at @libar-dev/platform-core/src/agent/component/audit.ts. +- outcome: Unimplemented deliverable: Audit public API at @libar-dev/platform-core/src/agent/component/audit +- problem: Agent BC tables ('agentCheckpoints', 'agentAuditEvents', 'agentDeadLetters', 'agentCommands', 'pendingApprovals') reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-005-dead-letter-public-api.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-005-dead-letter-public-api.sdp.md index 69e0d5f1..47bba4c5 100644 --- a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-005-dead-letter-public-api.sdp.md +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-005-dead-letter-public-api.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Dead letter public API" from architect/specs/platform/agent-bc-component-isolation.feature at @libar-dev/platform-core/src/agent/component/deadLetters.ts. +- outcome: Unimplemented deliverable: Dead letter public API at @libar-dev/platform-core/src/agent/component/deadLetters +- problem: Agent BC tables ('agentCheckpoints', 'agentAuditEvents', 'agentDeadLetters', 'agentCommands', 'pendingApprovals') reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-006-command-public-api.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-006-command-public-api.sdp.md index 51f60892..7a0e1218 100644 --- a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-006-command-public-api.sdp.md +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-006-command-public-api.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Command public API" from architect/specs/platform/agent-bc-component-isolation.feature at @libar-dev/platform-core/src/agent/component/commands.ts. +- outcome: Unimplemented deliverable: Command public API at @libar-dev/platform-core/src/agent/component/commands +- problem: Agent BC tables ('agentCheckpoints', 'agentAuditEvents', 'agentDeadLetters', 'agentCommands', 'pendingApprovals') reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-007-approval-public-api.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-007-approval-public-api.sdp.md index f6e7f072..065f3c02 100644 --- a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-007-approval-public-api.sdp.md +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-007-approval-public-api.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Approval public API" from architect/specs/platform/agent-bc-component-isolation.feature at @libar-dev/platform-core/src/agent/component/approvals.ts. +- outcome: Unimplemented deliverable: Approval public API at @libar-dev/platform-core/src/agent/component/approvals +- problem: Agent BC tables ('agentCheckpoints', 'agentAuditEvents', 'agentDeadLetters', 'agentCommands', 'pendingApprovals') reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-008-cross-component-query-pattern.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-008-cross-component-query-pattern.sdp.md index d74e0ad9..3a9c4cc3 100644 --- a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-008-cross-component-query-pattern.sdp.md +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-008-cross-component-query-pattern.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Cross-component query pattern" from architect/specs/platform/agent-bc-component-isolation.feature at @libar-dev/platform-core/src/agent/cross-bc-query.ts. +- outcome: Unimplemented deliverable: Cross-component query pattern at @libar-dev/platform-core/src/agent/cross-bc-query +- problem: Agent BC tables ('agentCheckpoints', 'agentAuditEvents', 'agentDeadLetters', 'agentCommands', 'pendingApprovals') reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-001-agent-action-handler-factory.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-001-agent-action-handler-factory.sdp.md index 583764a7..29ccf4e1 100644 --- a/specs/unimplemented/deliverables/agent-llm-integration/d-001-agent-action-handler-factory.sdp.md +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-001-agent-action-handler-factory.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Agent action handler factory" from architect/specs/platform/agent-llm-integration.feature at @libar-dev/platform-core/src/agent/action-handler.ts. +- outcome: Unimplemented deliverable: Agent action handler factory at @libar-dev/platform-core/src/agent/action-handler +- problem: The agent event handler ('handleChurnRiskEvent') is a Convex mutation that cannot call external APIs. The LLM runtime ('_llm/runtime.ts') exists with OpenRouter integration but is never invoked because mutations cannot make HTTP calls. Additionally, rate limiting config exists as types only — no runtime enforcement protects against runaway LLM costs. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-002-llm-integrated-on-complete-handler.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-002-llm-integrated-on-complete-handler.sdp.md index cc15d0d7..90ade634 100644 --- a/specs/unimplemented/deliverables/agent-llm-integration/d-002-llm-integrated-on-complete-handler.sdp.md +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-002-llm-integrated-on-complete-handler.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "LLM-integrated onComplete handler" from architect/specs/platform/agent-llm-integration.feature at @libar-dev/platform-core/src/agent/oncomplete-handler.ts. +- outcome: Unimplemented deliverable: LLM-integrated onComplete handler at @libar-dev/platform-core/src/agent/oncomplete-handler +- problem: The agent event handler ('handleChurnRiskEvent') is a Convex mutation that cannot call external APIs. The LLM runtime ('_llm/runtime.ts') exists with OpenRouter integration but is never invoked because mutations cannot make HTTP calls. Additionally, rate limiting config exists as types only — no runtime enforcement protects against runaway LLM costs. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-003-rate-limiter-integration.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-003-rate-limiter-integration.sdp.md index f7e06af3..4cb577c2 100644 --- a/specs/unimplemented/deliverables/agent-llm-integration/d-003-rate-limiter-integration.sdp.md +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-003-rate-limiter-integration.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Rate limiter integration" from architect/specs/platform/agent-llm-integration.feature at @libar-dev/platform-core/src/agent/rate-limiter.ts. +- outcome: Unimplemented deliverable: Rate limiter integration at @libar-dev/platform-core/src/agent/rate-limiter +- problem: The agent event handler ('handleChurnRiskEvent') is a Convex mutation that cannot call external APIs. The LLM runtime ('_llm/runtime.ts') exists with OpenRouter integration but is never invoked because mutations cannot make HTTP calls. Additionally, rate limiting config exists as types only — no runtime enforcement protects against runaway LLM costs. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-004-cost-budget-tracking.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-004-cost-budget-tracking.sdp.md index 153780d2..8cf36dc1 100644 --- a/specs/unimplemented/deliverables/agent-llm-integration/d-004-cost-budget-tracking.sdp.md +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-004-cost-budget-tracking.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Cost budget tracking" from architect/specs/platform/agent-llm-integration.feature at @libar-dev/platform-core/src/agent/cost-budget.ts. +- outcome: Unimplemented deliverable: Cost budget tracking at @libar-dev/platform-core/src/agent/cost-budget +- problem: The agent event handler ('handleChurnRiskEvent') is a Convex mutation that cannot call external APIs. The LLM runtime ('_llm/runtime.ts') exists with OpenRouter integration but is never invoked because mutations cannot make HTTP calls. Additionally, rate limiting config exists as types only — no runtime enforcement protects against runaway LLM costs. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-005-convex-dev-agent-thread-adapter.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-005-convex-dev-agent-thread-adapter.sdp.md index 15a892c3..a370f4e2 100644 --- a/specs/unimplemented/deliverables/agent-llm-integration/d-005-convex-dev-agent-thread-adapter.sdp.md +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-005-convex-dev-agent-thread-adapter.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "@convex-dev/agent thread adapter" from architect/specs/platform/agent-llm-integration.feature at @libar-dev/platform-core/src/agent/thread-adapter.ts. +- outcome: Unimplemented deliverable: @convex-dev/agent thread adapter at @libar-dev/platform-core/src/agent/thread-adapter +- problem: The agent event handler ('handleChurnRiskEvent') is a Convex mutation that cannot call external APIs. The LLM runtime ('_llm/runtime.ts') exists with OpenRouter integration but is never invoked because mutations cannot make HTTP calls. Additionally, rate limiting config exists as types only — no runtime enforcement protects against runaway LLM costs. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-006-on-complete-in-create-agent-subscription-options.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-006-on-complete-in-create-agent-subscription-options.sdp.md index ba09e18e..8ef26a25 100644 --- a/specs/unimplemented/deliverables/agent-llm-integration/d-006-on-complete-in-create-agent-subscription-options.sdp.md +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-006-on-complete-in-create-agent-subscription-options.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "onComplete in CreateAgentSubscriptionOptions" from architect/specs/platform/agent-llm-integration.feature at @libar-dev/platform-bus/src/agent-subscription.ts. +- outcome: Unimplemented deliverable: onComplete in CreateAgentSubscriptionOptions at @libar-dev/platform-bus/src/agent-subscription +- problem: The agent event handler ('handleChurnRiskEvent') is a Convex mutation that cannot call external APIs. The LLM runtime ('_llm/runtime.ts') exists with OpenRouter integration but is never invoked because mutations cannot make HTTP calls. Additionally, rate limiting config exists as types only — no runtime enforcement protects against runaway LLM costs. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-007-circuit-breaker-for-llm.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-007-circuit-breaker-for-llm.sdp.md index 8a598f44..ff3f89f4 100644 --- a/specs/unimplemented/deliverables/agent-llm-integration/d-007-circuit-breaker-for-llm.sdp.md +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-007-circuit-breaker-for-llm.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Circuit breaker for LLM" from architect/specs/platform/agent-llm-integration.feature at @libar-dev/platform-core/src/agent/circuit-breaker.ts. +- outcome: Unimplemented deliverable: Circuit breaker for LLM at @libar-dev/platform-core/src/agent/circuit-breaker +- problem: The agent event handler ('handleChurnRiskEvent') is a Convex mutation that cannot call external APIs. The LLM runtime ('_llm/runtime.ts') exists with OpenRouter integration but is never invoked because mutations cannot make HTTP calls. Additionally, rate limiting config exists as types only — no runtime enforcement protects against runaway LLM costs. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-008-agent-workpool-configuration.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-008-agent-workpool-configuration.sdp.md index bbe42b0a..3f7e2fe6 100644 --- a/specs/unimplemented/deliverables/agent-llm-integration/d-008-agent-workpool-configuration.sdp.md +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-008-agent-workpool-configuration.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Agent workpool configuration" from architect/specs/platform/agent-llm-integration.feature at examples/order-management/convex/convex.config.ts. +- outcome: Unimplemented deliverable: Agent workpool configuration at examples/order-management/convex/convex +- problem: The agent event handler ('handleChurnRiskEvent') is a Convex mutation that cannot call external APIs. The LLM runtime ('_llm/runtime.ts') exists with OpenRouter integration but is never invoked because mutations cannot make HTTP calls. Additionally, rate limiting config exists as types only — no runtime enforcement protects against runaway LLM costs. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-009-action-mutation-integration-test.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-009-action-mutation-integration-test.sdp.md index d0615fc4..886eca58 100644 --- a/specs/unimplemented/deliverables/agent-llm-integration/d-009-action-mutation-integration-test.sdp.md +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-009-action-mutation-integration-test.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Action/mutation integration test" from architect/specs/platform/agent-llm-integration.feature at platform-core/tests/integration/agent/action-split.test.ts. +- outcome: Unimplemented deliverable: Action/mutation integration test at platform-core/tests/integration/agent/action-split +- problem: The agent event handler ('handleChurnRiskEvent') is a Convex mutation that cannot call external APIs. The LLM runtime ('_llm/runtime.ts') exists with OpenRouter integration but is never invoked because mutations cannot make HTTP calls. Additionally, rate limiting config exists as types only — no runtime enforcement protects against runaway LLM costs. diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-001-circuit-breaker-state-machine-pure.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-001-circuit-breaker-state-machine-pure.sdp.md index 210f3e0c..a5da0306 100644 --- a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-001-circuit-breaker-state-machine-pure.sdp.md +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-001-circuit-breaker-state-machine-pure.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Circuit breaker state machine (pure)" from architect/specs/platform/circuit-breaker-pattern.feature at @libar-dev/platform-core/src/monitoring/circuit-breaker/stateMachine.ts. +- outcome: Unimplemented deliverable: Circuit breaker state machine (pure) at @libar-dev/platform-core/src/monitoring/circuit-breaker/stateMachine +- problem: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-002-circuit-breaker-types.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-002-circuit-breaker-types.sdp.md index 5c9e2d29..56c5369e 100644 --- a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-002-circuit-breaker-types.sdp.md +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-002-circuit-breaker-types.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Circuit breaker types" from architect/specs/platform/circuit-breaker-pattern.feature at @libar-dev/platform-core/src/monitoring/circuit-breaker/types.ts. +- outcome: Unimplemented deliverable: Circuit breaker types at @libar-dev/platform-core/src/monitoring/circuit-breaker/types +- problem: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-003-circuit-breakers-table-schema.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-003-circuit-breakers-table-schema.sdp.md index f9718e63..a29f2291 100644 --- a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-003-circuit-breakers-table-schema.sdp.md +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-003-circuit-breakers-table-schema.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "circuitBreakers table schema" from architect/specs/platform/circuit-breaker-pattern.feature at examples/order-management/convex/schema.ts. +- outcome: Unimplemented deliverable: circuitBreakers table schema at examples/order-management/convex/schema +- problem: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-004-with-circuit-breaker-wrapper.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-004-with-circuit-breaker-wrapper.sdp.md index 10775a7d..e89283bd 100644 --- a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-004-with-circuit-breaker-wrapper.sdp.md +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-004-with-circuit-breaker-wrapper.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "withCircuitBreaker wrapper" from architect/specs/platform/circuit-breaker-pattern.feature at @libar-dev/platform-core/src/monitoring/circuit-breaker/withCircuitBreaker.ts. +- outcome: Unimplemented deliverable: withCircuitBreaker wrapper at @libar-dev/platform-core/src/monitoring/circuit-breaker/withCircuitBreaker +- problem: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-005-load-circuit-state-query.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-005-load-circuit-state-query.sdp.md index 05dad513..3a3c1e9b 100644 --- a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-005-load-circuit-state-query.sdp.md +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-005-load-circuit-state-query.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "loadCircuitState query" from architect/specs/platform/circuit-breaker-pattern.feature at examples/order-management/convex/monitoring/circuitBreakers.ts. +- outcome: Unimplemented deliverable: loadCircuitState query at examples/order-management/convex/monitoring/circuitBreakers +- problem: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-006-record-success-mutation.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-006-record-success-mutation.sdp.md index 481e7629..483cf911 100644 --- a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-006-record-success-mutation.sdp.md +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-006-record-success-mutation.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "recordSuccess mutation" from architect/specs/platform/circuit-breaker-pattern.feature at examples/order-management/convex/monitoring/circuitBreakers.ts. +- outcome: Unimplemented deliverable: recordSuccess mutation at examples/order-management/convex/monitoring/circuitBreakers +- problem: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-007-record-failure-mutation.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-007-record-failure-mutation.sdp.md index a6ac7051..e4512d13 100644 --- a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-007-record-failure-mutation.sdp.md +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-007-record-failure-mutation.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "recordFailure mutation" from architect/specs/platform/circuit-breaker-pattern.feature at examples/order-management/convex/monitoring/circuitBreakers.ts. +- outcome: Unimplemented deliverable: recordFailure mutation at examples/order-management/convex/monitoring/circuitBreakers +- problem: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-008-check-half-open-scheduled-mutation.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-008-check-half-open-scheduled-mutation.sdp.md index a87ddf74..d14a8f92 100644 --- a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-008-check-half-open-scheduled-mutation.sdp.md +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-008-check-half-open-scheduled-mutation.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "checkHalfOpen scheduled mutation" from architect/specs/platform/circuit-breaker-pattern.feature at examples/order-management/convex/monitoring/circuitBreakers.ts. +- outcome: Unimplemented deliverable: checkHalfOpen scheduled mutation at examples/order-management/convex/monitoring/circuitBreakers +- problem: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-009-on-circuit-probe-complete-handler.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-009-on-circuit-probe-complete-handler.sdp.md index d9852535..f8f8a1af 100644 --- a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-009-on-circuit-probe-complete-handler.sdp.md +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-009-on-circuit-probe-complete-handler.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "onCircuitProbeComplete handler" from architect/specs/platform/circuit-breaker-pattern.feature at examples/order-management/convex/monitoring/circuitBreakers.ts. +- outcome: Unimplemented deliverable: onCircuitProbeComplete handler at examples/order-management/convex/monitoring/circuitBreakers +- problem: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-010-circuit-breaker-metrics.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-010-circuit-breaker-metrics.sdp.md index 5e27c00e..15dbeb85 100644 --- a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-010-circuit-breaker-metrics.sdp.md +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-010-circuit-breaker-metrics.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Circuit breaker metrics" from architect/specs/platform/circuit-breaker-pattern.feature at examples/order-management/convex/monitoring/circuitBreakers.ts. +- outcome: Unimplemented deliverable: Circuit breaker metrics at examples/order-management/convex/monitoring/circuitBreakers +- problem: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back diff --git a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-001-pdr-014-placeholder.sdp.md b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-001-pdr-014-placeholder.sdp.md index 3751897e..b9cb3747 100644 --- a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-001-pdr-014-placeholder.sdp.md +++ b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-001-pdr-014-placeholder.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "PDR-014 placeholder" from architect/specs/platform/component-boundary-authentication-convention.feature at libar-platform/architect/decisions/pdr-014-component-boundary-authentication-convention.feature. +- outcome: Unimplemented deliverable: PDR-014 placeholder at libar-platform/architect/decisions/pdr-014-component-boundary-authentication-convention +- problem: Identity-bearing component mutations still trust caller-provided actor fields without a canonical component-side proof contract. Fixing the affected mutations piecemeal would create drift and leave a mixed-trust window across approvals, audit, and event append flows. diff --git a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-002-canonical-verification-proof-contract.sdp.md b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-002-canonical-verification-proof-contract.sdp.md index ceecc2cc..e346cf37 100644 --- a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-002-canonical-verification-proof-contract.sdp.md +++ b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-002-canonical-verification-proof-contract.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Canonical verificationProof contract" from architect/specs/platform/component-boundary-authentication-convention.feature at PDR-014 and platform-core security surfaces. +- outcome: Unimplemented deliverable: Canonical verificationProof contract at PDR-014 and platform-core security surfaces +- problem: Identity-bearing component mutations still trust caller-provided actor fields without a canonical component-side proof contract. Fixing the affected mutations piecemeal would create drift and leave a mixed-trust window across approvals, audit, and event append flows. diff --git a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-003-verify-actor-helper.sdp.md b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-003-verify-actor-helper.sdp.md index f512199a..df0d5d47 100644 --- a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-003-verify-actor-helper.sdp.md +++ b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-003-verify-actor-helper.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "verifyActor helper" from architect/specs/platform/component-boundary-authentication-convention.feature at libar-platform/packages/platform-core/. +- outcome: Unimplemented deliverable: verifyActor helper at libar-platform/packages/platform-core/ +- problem: Identity-bearing component mutations still trust caller-provided actor fields without a canonical component-side proof contract. Fixing the affected mutations piecemeal would create drift and leave a mixed-trust window across approvals, audit, and event append flows. diff --git a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-004-identity-bearing-mutation-migration.sdp.md b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-004-identity-bearing-mutation-migration.sdp.md index 2ffe3ba6..4930d5f8 100644 --- a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-004-identity-bearing-mutation-migration.sdp.md +++ b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-004-identity-bearing-mutation-migration.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Identity-bearing mutation migration" from architect/specs/platform/component-boundary-authentication-convention.feature at approve, reject, audit.record, agentCommands.record, appendToStream. +- outcome: Unimplemented deliverable: Identity-bearing mutation migration at approve, reject, audit +- problem: Identity-bearing component mutations still trust caller-provided actor fields without a canonical component-side proof contract. Fixing the affected mutations piecemeal would create drift and leave a mixed-trust window across approvals, audit, and event append flows. diff --git a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-005-contract-status-tagging-for-system-only-exceptions.sdp.md b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-005-contract-status-tagging-for-system-only-exceptions.sdp.md index 614544a2..af24c7ed 100644 --- a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-005-contract-status-tagging-for-system-only-exceptions.sdp.md +++ b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-005-contract-status-tagging-for-system-only-exceptions.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Contract-status tagging for system-only exceptions" from architect/specs/platform/component-boundary-authentication-convention.feature at mutated component surfaces. +- outcome: Unimplemented deliverable: Contract-status tagging for system-only exceptions at mutated component surfaces +- problem: Identity-bearing component mutations still trust caller-provided actor fields without a canonical component-side proof contract. Fixing the affected mutations piecemeal would create drift and leave a mixed-trust window across approvals, audit, and event append flows. diff --git a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-006-component-boundary-auth-integration-suite.sdp.md b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-006-component-boundary-auth-integration-suite.sdp.md index efcce202..c40b1d64 100644 --- a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-006-component-boundary-auth-integration-suite.sdp.md +++ b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-006-component-boundary-auth-integration-suite.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Component-boundary auth integration suite" from architect/specs/platform/component-boundary-authentication-convention.feature at libar-platform/packages/platform-core/tests/integration/security/component-boundary-auth.integration.test.ts. +- outcome: Unimplemented deliverable: Component-boundary auth integration suite at libar-platform/packages/platform-core/tests/integration/security/component-boundary-auth +- problem: Identity-bearing component mutations still trust caller-provided actor fields without a canonical component-side proof contract. Fixing the affected mutations piecemeal would create drift and leave a mixed-trust window across approvals, audit, and event append flows. diff --git a/specs/unimplemented/deliverables/deterministic-id-hashing/d-001-deterministic-stream-id-function.sdp.md b/specs/unimplemented/deliverables/deterministic-id-hashing/d-001-deterministic-stream-id-function.sdp.md index ed600fda..65d7db94 100644 --- a/specs/unimplemented/deliverables/deterministic-id-hashing/d-001-deterministic-stream-id-function.sdp.md +++ b/specs/unimplemented/deliverables/deterministic-id-hashing/d-001-deterministic-stream-id-function.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "deterministicStreamId() function" from architect/specs/platform/deterministic-id-hashing.feature at @libar-dev/platform-core/src/uniqueness/deterministic-id.ts. +- outcome: Unimplemented deliverable: deterministicStreamId() function at @libar-dev/platform-core/src/uniqueness/deterministic-id +- problem: TTL-based reservations work well for multi-step flows (registration wizards), but add overhead for simple "create if unique" operations. Need a lighter-weight alternative. diff --git a/specs/unimplemented/deliverables/deterministic-id-hashing/d-002-hash-algorithm-selection.sdp.md b/specs/unimplemented/deliverables/deterministic-id-hashing/d-002-hash-algorithm-selection.sdp.md index 8aa640ae..7f34f3bf 100644 --- a/specs/unimplemented/deliverables/deterministic-id-hashing/d-002-hash-algorithm-selection.sdp.md +++ b/specs/unimplemented/deliverables/deterministic-id-hashing/d-002-hash-algorithm-selection.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Hash algorithm selection" from architect/specs/platform/deterministic-id-hashing.feature at @libar-dev/platform-core/src/uniqueness/hash.ts. +- outcome: Unimplemented deliverable: Hash algorithm selection at @libar-dev/platform-core/src/uniqueness/hash +- problem: TTL-based reservations work well for multi-step flows (registration wizards), but add overhead for simple "create if unique" operations. Need a lighter-weight alternative. diff --git a/specs/unimplemented/deliverables/deterministic-id-hashing/d-003-conflict-error-handling.sdp.md b/specs/unimplemented/deliverables/deterministic-id-hashing/d-003-conflict-error-handling.sdp.md index 5f6a527d..21792ea9 100644 --- a/specs/unimplemented/deliverables/deterministic-id-hashing/d-003-conflict-error-handling.sdp.md +++ b/specs/unimplemented/deliverables/deterministic-id-hashing/d-003-conflict-error-handling.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Conflict error handling" from architect/specs/platform/deterministic-id-hashing.feature at @libar-dev/platform-core/src/uniqueness/errors.ts. +- outcome: Unimplemented deliverable: Conflict error handling at @libar-dev/platform-core/src/uniqueness/errors +- problem: TTL-based reservations work well for multi-step flows (registration wizards), but add overhead for simple "create if unique" operations. Need a lighter-weight alternative. diff --git a/specs/unimplemented/deliverables/deterministic-id-hashing/d-004-pattern-documentation.sdp.md b/specs/unimplemented/deliverables/deterministic-id-hashing/d-004-pattern-documentation.sdp.md index 6240b0de..6658a0f4 100644 --- a/specs/unimplemented/deliverables/deterministic-id-hashing/d-004-pattern-documentation.sdp.md +++ b/specs/unimplemented/deliverables/deterministic-id-hashing/d-004-pattern-documentation.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Pattern documentation" from architect/specs/platform/deterministic-id-hashing.feature at docs/architecture/UNIQUENESS-PATTERNS.md. +- outcome: Unimplemented deliverable: Pattern documentation at docs/architecture/UNIQUENESS-PATTERNS +- problem: TTL-based reservations work well for multi-step flows (registration wizards), but add overhead for simple "create if unique" operations. Need a lighter-weight alternative. diff --git a/specs/unimplemented/deliverables/event-correctness-migration/d-001-global-position-consumer-inventory.sdp.md b/specs/unimplemented/deliverables/event-correctness-migration/d-001-global-position-consumer-inventory.sdp.md index c9ebbf61..3ca82659 100644 --- a/specs/unimplemented/deliverables/event-correctness-migration/d-001-global-position-consumer-inventory.sdp.md +++ b/specs/unimplemented/deliverables/event-correctness-migration/d-001-global-position-consumer-inventory.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "globalPosition consumer inventory" from architect/specs/platform/event-correctness-migration.feature at packet artifacts and implementation notes. +- outcome: Unimplemented deliverable: globalPosition consumer inventory at packet artifacts and implementation notes +- problem: 'appendToStream' idempotency semantics, 'globalPosition' precision, and process-manager lifecycle parity are coupled correctness concerns. Splitting them would create inconsistent event-store guarantees and leave downstream consumers migrating against moving contracts. diff --git a/specs/unimplemented/deliverables/event-correctness-migration/d-002-pdr-018-placeholder.sdp.md b/specs/unimplemented/deliverables/event-correctness-migration/d-002-pdr-018-placeholder.sdp.md index 5a59ba7a..59b63d25 100644 --- a/specs/unimplemented/deliverables/event-correctness-migration/d-002-pdr-018-placeholder.sdp.md +++ b/specs/unimplemented/deliverables/event-correctness-migration/d-002-pdr-018-placeholder.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "PDR-018 placeholder" from architect/specs/platform/event-correctness-migration.feature at libar-platform/architect/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.feature. +- outcome: Unimplemented deliverable: PDR-018 placeholder at libar-platform/architect/decisions/pdr-018-idempotency-enforcement-for-append-to-stream +- problem: 'appendToStream' idempotency semantics, 'globalPosition' precision, and process-manager lifecycle parity are coupled correctness concerns. Splitting them would create inconsistent event-store guarantees and leave downstream consumers migrating against moving contracts. diff --git a/specs/unimplemented/deliverables/event-correctness-migration/d-003-pdr-015-placeholder.sdp.md b/specs/unimplemented/deliverables/event-correctness-migration/d-003-pdr-015-placeholder.sdp.md index 50019b30..e55472cc 100644 --- a/specs/unimplemented/deliverables/event-correctness-migration/d-003-pdr-015-placeholder.sdp.md +++ b/specs/unimplemented/deliverables/event-correctness-migration/d-003-pdr-015-placeholder.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "PDR-015 placeholder" from architect/specs/platform/event-correctness-migration.feature at libar-platform/architect/decisions/pdr-015-global-position-numeric-representation.feature. +- outcome: Unimplemented deliverable: PDR-015 placeholder at libar-platform/architect/decisions/pdr-015-global-position-numeric-representation +- problem: 'appendToStream' idempotency semantics, 'globalPosition' precision, and process-manager lifecycle parity are coupled correctness concerns. Splitting them would create inconsistent event-store guarantees and leave downstream consumers migrating against moving contracts. diff --git a/specs/unimplemented/deliverables/event-correctness-migration/d-004-append-to-stream-idempotency-migration.sdp.md b/specs/unimplemented/deliverables/event-correctness-migration/d-004-append-to-stream-idempotency-migration.sdp.md index 5df9d14d..1447f404 100644 --- a/specs/unimplemented/deliverables/event-correctness-migration/d-004-append-to-stream-idempotency-migration.sdp.md +++ b/specs/unimplemented/deliverables/event-correctness-migration/d-004-append-to-stream-idempotency-migration.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "appendToStream idempotency migration" from architect/specs/platform/event-correctness-migration.feature at libar-platform/packages/platform-core/ and platform-store/. +- outcome: Unimplemented deliverable: appendToStream idempotency migration at libar-platform/packages/platform-core/ and platform-store/ +- problem: 'appendToStream' idempotency semantics, 'globalPosition' precision, and process-manager lifecycle parity are coupled correctness concerns. Splitting them would create inconsistent event-store guarantees and leave downstream consumers migrating against moving contracts. diff --git a/specs/unimplemented/deliverables/event-correctness-migration/d-005-global-position-representation-migration-and-compat-reader.sdp.md b/specs/unimplemented/deliverables/event-correctness-migration/d-005-global-position-representation-migration-and-compat-reader.sdp.md index 1a76d408..8afb1fd5 100644 --- a/specs/unimplemented/deliverables/event-correctness-migration/d-005-global-position-representation-migration-and-compat-reader.sdp.md +++ b/specs/unimplemented/deliverables/event-correctness-migration/d-005-global-position-representation-migration-and-compat-reader.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "globalPosition representation migration and compat reader" from architect/specs/platform/event-correctness-migration.feature at libar-platform/packages/platform-store/ and downstream consumers. +- outcome: Unimplemented deliverable: globalPosition representation migration and compat reader at libar-platform/packages/platform-store/ and downstream consumers +- problem: 'appendToStream' idempotency semantics, 'globalPosition' precision, and process-manager lifecycle parity are coupled correctness concerns. Splitting them would create inconsistent event-store guarantees and leave downstream consumers migrating against moving contracts. diff --git a/specs/unimplemented/deliverables/event-correctness-migration/d-006-canonical-pm-transition-map-parity.sdp.md b/specs/unimplemented/deliverables/event-correctness-migration/d-006-canonical-pm-transition-map-parity.sdp.md index a9f60051..0cdf82cf 100644 --- a/specs/unimplemented/deliverables/event-correctness-migration/d-006-canonical-pm-transition-map-parity.sdp.md +++ b/specs/unimplemented/deliverables/event-correctness-migration/d-006-canonical-pm-transition-map-parity.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Canonical PM transition map parity" from architect/specs/platform/event-correctness-migration.feature at processManager/lifecycle.ts and parity tests. +- outcome: Unimplemented deliverable: Canonical PM transition map parity at processManager/lifecycle +- problem: 'appendToStream' idempotency semantics, 'globalPosition' precision, and process-manager lifecycle parity are coupled correctness concerns. Splitting them would create inconsistent event-store guarantees and leave downstream consumers migrating against moving contracts. diff --git a/specs/unimplemented/deliverables/event-correctness-migration/d-007-event-correctness-integration-suite.sdp.md b/specs/unimplemented/deliverables/event-correctness-migration/d-007-event-correctness-integration-suite.sdp.md index a656f4d0..62b79d43 100644 --- a/specs/unimplemented/deliverables/event-correctness-migration/d-007-event-correctness-integration-suite.sdp.md +++ b/specs/unimplemented/deliverables/event-correctness-migration/d-007-event-correctness-integration-suite.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Event correctness integration suite" from architect/specs/platform/event-correctness-migration.feature at libar-platform/packages/platform-store/tests/integration/event-correctness.integration.test.ts. +- outcome: Unimplemented deliverable: Event correctness integration suite at libar-platform/packages/platform-store/tests/integration/event-correctness +- problem: 'appendToStream' idempotency semantics, 'globalPosition' precision, and process-manager lifecycle parity are coupled correctness concerns. Splitting them would create inconsistent event-store guarantees and leave downstream consumers migrating against moving contracts. diff --git a/specs/unimplemented/deliverables/health-observability/d-001-health-check-types.sdp.md b/specs/unimplemented/deliverables/health-observability/d-001-health-check-types.sdp.md index 46e573ee..08147532 100644 --- a/specs/unimplemented/deliverables/health-observability/d-001-health-check-types.sdp.md +++ b/specs/unimplemented/deliverables/health-observability/d-001-health-check-types.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Health check types" from architect/specs/platform/health-observability.feature at @libar-dev/platform-core/src/monitoring/health/types.ts. +- outcome: Unimplemented deliverable: Health check types at @libar-dev/platform-core/src/monitoring/health/types +- problem: No Kubernetes integration (readiness/liveness probes), no metrics for projection lag, event throughput, or system health. Operations team has no visibility into system state, cannot detect degradation before it becomes an outage, and cannot integrate with standard orchestration platforms. diff --git a/specs/unimplemented/deliverables/health-observability/d-002-check-readiness-query.sdp.md b/specs/unimplemented/deliverables/health-observability/d-002-check-readiness-query.sdp.md index d6659424..962a77aa 100644 --- a/specs/unimplemented/deliverables/health-observability/d-002-check-readiness-query.sdp.md +++ b/specs/unimplemented/deliverables/health-observability/d-002-check-readiness-query.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "checkReadiness query" from architect/specs/platform/health-observability.feature at examples/order-management/convex/health.ts. +- outcome: Unimplemented deliverable: checkReadiness query at examples/order-management/convex/health +- problem: No Kubernetes integration (readiness/liveness probes), no metrics for projection lag, event throughput, or system health. Operations team has no visibility into system state, cannot detect degradation before it becomes an outage, and cannot integrate with standard orchestration platforms. diff --git a/specs/unimplemented/deliverables/health-observability/d-003-check-liveness-query.sdp.md b/specs/unimplemented/deliverables/health-observability/d-003-check-liveness-query.sdp.md index 66265516..929906f1 100644 --- a/specs/unimplemented/deliverables/health-observability/d-003-check-liveness-query.sdp.md +++ b/specs/unimplemented/deliverables/health-observability/d-003-check-liveness-query.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "checkLiveness query" from architect/specs/platform/health-observability.feature at examples/order-management/convex/health.ts. +- outcome: Unimplemented deliverable: checkLiveness query at examples/order-management/convex/health +- problem: No Kubernetes integration (readiness/liveness probes), no metrics for projection lag, event throughput, or system health. Operations team has no visibility into system state, cannot detect degradation before it becomes an outage, and cannot integrate with standard orchestration platforms. diff --git a/specs/unimplemented/deliverables/health-observability/d-004-http-router-with-health-routes.sdp.md b/specs/unimplemented/deliverables/health-observability/d-004-http-router-with-health-routes.sdp.md index b5508739..fd1df783 100644 --- a/specs/unimplemented/deliverables/health-observability/d-004-http-router-with-health-routes.sdp.md +++ b/specs/unimplemented/deliverables/health-observability/d-004-http-router-with-health-routes.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "HTTP router with /health/* routes" from architect/specs/platform/health-observability.feature at examples/order-management/convex/http.ts. +- outcome: Unimplemented deliverable: HTTP router with /health/* routes at examples/order-management/convex/http +- problem: No Kubernetes integration (readiness/liveness probes), no metrics for projection lag, event throughput, or system health. Operations team has no visibility into system state, cannot detect degradation before it becomes an outage, and cannot integrate with standard orchestration platforms. diff --git a/specs/unimplemented/deliverables/health-observability/d-005-metrics-types.sdp.md b/specs/unimplemented/deliverables/health-observability/d-005-metrics-types.sdp.md index 4591fb71..40ee7924 100644 --- a/specs/unimplemented/deliverables/health-observability/d-005-metrics-types.sdp.md +++ b/specs/unimplemented/deliverables/health-observability/d-005-metrics-types.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Metrics types" from architect/specs/platform/health-observability.feature at @libar-dev/platform-core/src/monitoring/metrics/types.ts. +- outcome: Unimplemented deliverable: Metrics types at @libar-dev/platform-core/src/monitoring/metrics/types +- problem: No Kubernetes integration (readiness/liveness probes), no metrics for projection lag, event throughput, or system health. Operations team has no visibility into system state, cannot detect degradation before it becomes an outage, and cannot integrate with standard orchestration platforms. diff --git a/specs/unimplemented/deliverables/health-observability/d-006-metrics-collector.sdp.md b/specs/unimplemented/deliverables/health-observability/d-006-metrics-collector.sdp.md index 92d34508..7fbdfa17 100644 --- a/specs/unimplemented/deliverables/health-observability/d-006-metrics-collector.sdp.md +++ b/specs/unimplemented/deliverables/health-observability/d-006-metrics-collector.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "MetricsCollector" from architect/specs/platform/health-observability.feature at @libar-dev/platform-core/src/monitoring/metrics/collector.ts. +- outcome: Unimplemented deliverable: MetricsCollector at @libar-dev/platform-core/src/monitoring/metrics/collector +- problem: No Kubernetes integration (readiness/liveness probes), no metrics for projection lag, event throughput, or system health. Operations team has no visibility into system state, cannot detect degradation before it becomes an outage, and cannot integrate with standard orchestration platforms. diff --git a/specs/unimplemented/deliverables/health-observability/d-007-projection-lag-calculator.sdp.md b/specs/unimplemented/deliverables/health-observability/d-007-projection-lag-calculator.sdp.md index ea1fd7bc..d3c51b8d 100644 --- a/specs/unimplemented/deliverables/health-observability/d-007-projection-lag-calculator.sdp.md +++ b/specs/unimplemented/deliverables/health-observability/d-007-projection-lag-calculator.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Projection lag calculator" from architect/specs/platform/health-observability.feature at @libar-dev/platform-core/src/monitoring/metrics/projectionLag.ts. +- outcome: Unimplemented deliverable: Projection lag calculator at @libar-dev/platform-core/src/monitoring/metrics/projectionLag +- problem: No Kubernetes integration (readiness/liveness probes), no metrics for projection lag, event throughput, or system health. Operations team has no visibility into system state, cannot detect degradation before it becomes an outage, and cannot integrate with standard orchestration platforms. diff --git a/specs/unimplemented/deliverables/health-observability/d-008-workpool-depth-query.sdp.md b/specs/unimplemented/deliverables/health-observability/d-008-workpool-depth-query.sdp.md index 46a4b95b..3b538726 100644 --- a/specs/unimplemented/deliverables/health-observability/d-008-workpool-depth-query.sdp.md +++ b/specs/unimplemented/deliverables/health-observability/d-008-workpool-depth-query.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Workpool depth query" from architect/specs/platform/health-observability.feature at examples/order-management/convex/health.ts. +- outcome: Unimplemented deliverable: Workpool depth query at examples/order-management/convex/health +- problem: No Kubernetes integration (readiness/liveness probes), no metrics for projection lag, event throughput, or system health. Operations team has no visibility into system state, cannot detect degradation before it becomes an outage, and cannot integrate with standard orchestration platforms. diff --git a/specs/unimplemented/deliverables/health-observability/d-009-system-health-aggregator.sdp.md b/specs/unimplemented/deliverables/health-observability/d-009-system-health-aggregator.sdp.md index e6a70f3d..e871bcf0 100644 --- a/specs/unimplemented/deliverables/health-observability/d-009-system-health-aggregator.sdp.md +++ b/specs/unimplemented/deliverables/health-observability/d-009-system-health-aggregator.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "System health aggregator" from architect/specs/platform/health-observability.feature at @libar-dev/platform-core/src/monitoring/health/aggregator.ts. +- outcome: Unimplemented deliverable: System health aggregator at @libar-dev/platform-core/src/monitoring/health/aggregator +- problem: No Kubernetes integration (readiness/liveness probes), no metrics for projection lag, event throughput, or system health. Operations team has no visibility into system state, cannot detect degradation before it becomes an outage, and cannot integrate with standard orchestration platforms. diff --git a/specs/unimplemented/deliverables/integration-patterns-21a/d-001-context-map-registry.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21a/d-001-context-map-registry.sdp.md index c1eccdde..2f319943 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21a/d-001-context-map-registry.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21a/d-001-context-map-registry.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Context Map registry" from architect/specs/platform/integration-patterns-21a.feature at @libar-dev/platform-core/src/integration/context-map.ts. +- outcome: Unimplemented deliverable: Context Map registry at @libar-dev/platform-core/src/integration/context-map +- problem: Cross-context communication is ad-hoc. Domain events are used directly for integration without explicit contracts, leading to tight coupling. diff --git a/specs/unimplemented/deliverables/integration-patterns-21a/d-002-context-map-documentation.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21a/d-002-context-map-documentation.sdp.md index 4390d888..1a19db9f 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21a/d-002-context-map-documentation.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21a/d-002-context-map-documentation.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Context Map documentation" from architect/specs/platform/integration-patterns-21a.feature at docs/architecture/CONTEXT-MAP.md. +- outcome: Unimplemented deliverable: Context Map documentation at docs/architecture/CONTEXT-MAP +- problem: Cross-context communication is ad-hoc. Domain events are used directly for integration without explicit contracts, leading to tight coupling. diff --git a/specs/unimplemented/deliverables/integration-patterns-21a/d-003-published-language-registry.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21a/d-003-published-language-registry.sdp.md index f5022aef..881eae1e 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21a/d-003-published-language-registry.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21a/d-003-published-language-registry.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Published Language registry" from architect/specs/platform/integration-patterns-21a.feature at @libar-dev/platform-core/src/integration/published-language.ts. +- outcome: Unimplemented deliverable: Published Language registry at @libar-dev/platform-core/src/integration/published-language +- problem: Cross-context communication is ad-hoc. Domain events are used directly for integration without explicit contracts, leading to tight coupling. diff --git a/specs/unimplemented/deliverables/integration-patterns-21a/d-004-to-published-language-converter.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21a/d-004-to-published-language-converter.sdp.md index 35593745..27cbcf59 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21a/d-004-to-published-language-converter.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21a/d-004-to-published-language-converter.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "toPublishedLanguage() converter" from architect/specs/platform/integration-patterns-21a.feature at @libar-dev/platform-core/src/integration/converter.ts. +- outcome: Unimplemented deliverable: toPublishedLanguage() converter at @libar-dev/platform-core/src/integration/converter +- problem: Cross-context communication is ad-hoc. Domain events are used directly for integration without explicit contracts, leading to tight coupling. diff --git a/specs/unimplemented/deliverables/integration-patterns-21a/d-005-acl-builder-enhancement.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21a/d-005-acl-builder-enhancement.sdp.md index e091f132..b35c7314 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21a/d-005-acl-builder-enhancement.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21a/d-005-acl-builder-enhancement.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "ACL builder enhancement" from architect/specs/platform/integration-patterns-21a.feature at @libar-dev/platform-core/src/integration/acl.ts. +- outcome: Unimplemented deliverable: ACL builder enhancement at @libar-dev/platform-core/src/integration/acl +- problem: Cross-context communication is ad-hoc. Domain events are used directly for integration without explicit contracts, leading to tight coupling. diff --git a/specs/unimplemented/deliverables/integration-patterns-21a/d-006-integration-event-metadata-extension.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21a/d-006-integration-event-metadata-extension.sdp.md index f55f8100..1c08b703 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21a/d-006-integration-event-metadata-extension.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21a/d-006-integration-event-metadata-extension.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "IntegrationEventMetadata extension" from architect/specs/platform/integration-patterns-21a.feature at @libar-dev/platform-core/src/integration/types.ts. +- outcome: Unimplemented deliverable: IntegrationEventMetadata extension at @libar-dev/platform-core/src/integration/types +- problem: Cross-context communication is ad-hoc. Domain events are used directly for integration without explicit contracts, leading to tight coupling. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-001-upcaster-implementation.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-001-upcaster-implementation.sdp.md index 0fa1cc54..13048987 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21b/d-001-upcaster-implementation.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-001-upcaster-implementation.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Upcaster implementation" from architect/specs/platform/integration-patterns-21b.feature at @libar-dev/platform-core/src/integration/versioning.ts. +- outcome: Unimplemented deliverable: Upcaster implementation at @libar-dev/platform-core/src/integration/versioning +- problem: Schema evolution breaks consumers. No tooling validates producer-consumer compatibility, leading to runtime failures and integration bugs. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-002-downcaster-implementation.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-002-downcaster-implementation.sdp.md index ae047b64..b3f2fc2e 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21b/d-002-downcaster-implementation.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-002-downcaster-implementation.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Downcaster implementation" from architect/specs/platform/integration-patterns-21b.feature at @libar-dev/platform-core/src/integration/versioning.ts. +- outcome: Unimplemented deliverable: Downcaster implementation at @libar-dev/platform-core/src/integration/versioning +- problem: Schema evolution breaks consumers. No tooling validates producer-consumer compatibility, leading to runtime failures and integration bugs. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-003-migration-path-validation.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-003-migration-path-validation.sdp.md index 01354171..5848b698 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21b/d-003-migration-path-validation.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-003-migration-path-validation.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Migration path validation" from architect/specs/platform/integration-patterns-21b.feature at @libar-dev/platform-core/src/integration/versioning.ts. +- outcome: Unimplemented deliverable: Migration path validation at @libar-dev/platform-core/src/integration/versioning +- problem: Schema evolution breaks consumers. No tooling validates producer-consumer compatibility, leading to runtime failures and integration bugs. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-004-contract-sample-generation.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-004-contract-sample-generation.sdp.md index eb823c8e..a4dda964 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21b/d-004-contract-sample-generation.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-004-contract-sample-generation.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Contract sample generation" from architect/specs/platform/integration-patterns-21b.feature at @libar-dev/platform-core/src/integration/testing/samples.ts. +- outcome: Unimplemented deliverable: Contract sample generation at @libar-dev/platform-core/src/integration/testing/samples +- problem: Schema evolution breaks consumers. No tooling validates producer-consumer compatibility, leading to runtime failures and integration bugs. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-005-producer-contract-tests.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-005-producer-contract-tests.sdp.md index 30b91763..ecb56416 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21b/d-005-producer-contract-tests.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-005-producer-contract-tests.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Producer contract tests" from architect/specs/platform/integration-patterns-21b.feature at @libar-dev/platform-core/src/integration/testing/producer.ts. +- outcome: Unimplemented deliverable: Producer contract tests at @libar-dev/platform-core/src/integration/testing/producer +- problem: Schema evolution breaks consumers. No tooling validates producer-consumer compatibility, leading to runtime failures and integration bugs. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-006-consumer-contract-tests.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-006-consumer-contract-tests.sdp.md index 31d3faa2..479f9329 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21b/d-006-consumer-contract-tests.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-006-consumer-contract-tests.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Consumer contract tests" from architect/specs/platform/integration-patterns-21b.feature at @libar-dev/platform-core/src/integration/testing/consumer.ts. +- outcome: Unimplemented deliverable: Consumer contract tests at @libar-dev/platform-core/src/integration/testing/consumer +- problem: Schema evolution breaks consumers. No tooling validates producer-consumer compatibility, leading to runtime failures and integration bugs. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-007-compatibility-verification.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-007-compatibility-verification.sdp.md index 2d1f48c8..9dfc5ea8 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21b/d-007-compatibility-verification.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-007-compatibility-verification.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Compatibility verification" from architect/specs/platform/integration-patterns-21b.feature at @libar-dev/platform-core/src/integration/testing/compatibility.ts. +- outcome: Unimplemented deliverable: Compatibility verification at @libar-dev/platform-core/src/integration/testing/compatibility +- problem: Schema evolution breaks consumers. No tooling validates producer-consumer compatibility, leading to runtime failures and integration bugs. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-008-contract-violation-detection.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-008-contract-violation-detection.sdp.md index f26bab5f..c2953860 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21b/d-008-contract-violation-detection.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-008-contract-violation-detection.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Contract violation detection" from architect/specs/platform/integration-patterns-21b.feature at @libar-dev/platform-core/src/integration/testing/violations.ts. +- outcome: Unimplemented deliverable: Contract violation detection at @libar-dev/platform-core/src/integration/testing/violations +- problem: Schema evolution breaks consumers. No tooling validates producer-consumer compatibility, leading to runtime failures and integration bugs. diff --git a/specs/unimplemented/deliverables/production-hardening/d-001-metrics-collection-types.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-001-metrics-collection-types.sdp.md index a7bf613a..3d39b7ad 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-001-metrics-collection-types.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-001-metrics-collection-types.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Metrics collection types" from architect/specs/platform/production-hardening.feature at @libar-dev/platform-core/src/monitoring/metrics.ts. +- outcome: Unimplemented deliverable: Metrics collection types at @libar-dev/platform-core/src/monitoring/metrics +- problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-002-metrics-collector.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-002-metrics-collector.sdp.md index 0bc99da0..dbd7f1bd 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-002-metrics-collector.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-002-metrics-collector.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Metrics collector" from architect/specs/platform/production-hardening.feature at @libar-dev/platform-core/src/monitoring/collector.ts. +- outcome: Unimplemented deliverable: Metrics collector at @libar-dev/platform-core/src/monitoring/collector +- problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-003-health-check-queries.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-003-health-check-queries.sdp.md index c825e2e6..5ce19cf3 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-003-health-check-queries.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-003-health-check-queries.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Health check queries" from architect/specs/platform/production-hardening.feature at examples/order-management/convex/health.ts. +- outcome: Unimplemented deliverable: Health check queries at examples/order-management/convex/health +- problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-004-health-http-router.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-004-health-http-router.sdp.md index c3163fca..0c1ae62b 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-004-health-http-router.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-004-health-http-router.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Health HTTP router" from architect/specs/platform/production-hardening.feature at examples/order-management/convex/http.ts. +- outcome: Unimplemented deliverable: Health HTTP router at examples/order-management/convex/http +- problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-005-circuit-breaker-implementation.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-005-circuit-breaker-implementation.sdp.md index c291044b..a87b179b 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-005-circuit-breaker-implementation.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-005-circuit-breaker-implementation.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Circuit breaker implementation" from architect/specs/platform/production-hardening.feature at @libar-dev/platform-core/src/monitoring/circuit-breaker.ts. +- outcome: Unimplemented deliverable: Circuit breaker implementation at @libar-dev/platform-core/src/monitoring/circuit-breaker +- problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-006-admin-projection-endpoints.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-006-admin-projection-endpoints.sdp.md index efff0400..2bf46fd4 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-006-admin-projection-endpoints.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-006-admin-projection-endpoints.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Admin projection endpoints" from architect/specs/platform/production-hardening.feature at examples/order-management/convex/admin/projections.ts. +- outcome: Unimplemented deliverable: Admin projection endpoints at examples/order-management/convex/admin/projections +- problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-007-admin-dlq-endpoints.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-007-admin-dlq-endpoints.sdp.md index f568da2c..42987ec6 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-007-admin-dlq-endpoints.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-007-admin-dlq-endpoints.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Admin DLQ endpoints" from architect/specs/platform/production-hardening.feature at examples/order-management/convex/admin/deadLetters.ts. +- outcome: Unimplemented deliverable: Admin DLQ endpoints at examples/order-management/convex/admin/deadLetters +- problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-008-admin-diagnostics.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-008-admin-diagnostics.sdp.md index 69260c22..be0b4820 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-008-admin-diagnostics.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-008-admin-diagnostics.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Admin diagnostics" from architect/specs/platform/production-hardening.feature at examples/order-management/convex/admin/diagnostics.ts. +- outcome: Unimplemented deliverable: Admin diagnostics at examples/order-management/convex/admin/diagnostics +- problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-009-durable-function-run-diagnostics.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-009-durable-function-run-diagnostics.sdp.md index 444afa0e..10017cbe 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-009-durable-function-run-diagnostics.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-009-durable-function-run-diagnostics.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Durable function run diagnostics" from architect/specs/platform/production-hardening.feature at examples/order-management/convex/admin/durableFunctions.ts. +- outcome: Unimplemented deliverable: Durable function run diagnostics at examples/order-management/convex/admin/durableFunctions +- problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-010-contract-violation-types.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-010-contract-violation-types.sdp.md index b3873946..7952da87 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-010-contract-violation-types.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-010-contract-violation-types.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Contract violation types" from architect/specs/platform/production-hardening.feature at @libar-dev/platform-core/src/monitoring/contracts.ts. +- outcome: Unimplemented deliverable: Contract violation types at @libar-dev/platform-core/src/monitoring/contracts +- problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-011-grafana-dashboard-templates.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-011-grafana-dashboard-templates.sdp.md index c4dfab17..ec79de84 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-011-grafana-dashboard-templates.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-011-grafana-dashboard-templates.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Grafana dashboard templates" from architect/specs/platform/production-hardening.feature at infrastructure/grafana/. +- outcome: Unimplemented deliverable: Grafana dashboard templates at infrastructure/grafana/ +- problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-012-runbook-documentation.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-012-runbook-documentation.sdp.md index 1fbb8dc1..336fae22 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-012-runbook-documentation.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-012-runbook-documentation.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Runbook documentation" from architect/specs/platform/production-hardening.feature at docs/operations/RUNBOOK.md. +- outcome: Unimplemented deliverable: Runbook documentation at docs/operations/RUNBOOK +- problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-013-circuit-breaker-retrier-integration.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-013-circuit-breaker-retrier-integration.sdp.md index ca9fb7b2..db5c8009 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-013-circuit-breaker-retrier-integration.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-013-circuit-breaker-retrier-integration.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Circuit breaker retrier integration" from architect/specs/platform/production-hardening.feature at @libar-dev/platform-core/src/monitoring/withCircuitBreaker.ts. +- outcome: Unimplemented deliverable: Circuit breaker retrier integration at @libar-dev/platform-core/src/monitoring/withCircuitBreaker +- problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-014-dlq-action-retrier-pattern.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-014-dlq-action-retrier-pattern.sdp.md index b52b4bb2..04beaae7 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-014-dlq-action-retrier-pattern.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-014-dlq-action-retrier-pattern.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "DLQ action retrier pattern" from architect/specs/platform/production-hardening.feature at examples/order-management/convex/admin/dlqRetrier.ts. +- outcome: Unimplemented deliverable: DLQ action retrier pattern at examples/order-management/convex/admin/dlqRetrier +- problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-015-durable-function-decision-guide.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-015-durable-function-decision-guide.sdp.md index 320386c9..3d48bea0 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-015-durable-function-decision-guide.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-015-durable-function-decision-guide.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Durable function decision guide" from architect/specs/platform/production-hardening.feature at docs/architecture/DURABLE-FUNCTION-SELECTION.md. +- outcome: Unimplemented deliverable: Durable function decision guide at docs/architecture/DURABLE-FUNCTION-SELECTION +- problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/test-content-blocks/d-001-demo-item-1.sdp.md b/specs/unimplemented/deliverables/test-content-blocks/d-001-demo-item-1.sdp.md index a48b1cfd..4dd6532f 100644 --- a/specs/unimplemented/deliverables/test-content-blocks/d-001-demo-item-1.sdp.md +++ b/specs/unimplemented/deliverables/test-content-blocks/d-001-demo-item-1.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Demo item 1" from architect/specs/test-content-blocks.feature at No. +- outcome: Unimplemented deliverable: Demo item 1 at No diff --git a/specs/unimplemented/deliverables/themed-decision-architecture/d-001-add-adr-theme-tag-to-registry.sdp.md b/specs/unimplemented/deliverables/themed-decision-architecture/d-001-add-adr-theme-tag-to-registry.sdp.md index 7333db50..201f9db5 100644 --- a/specs/unimplemented/deliverables/themed-decision-architecture/d-001-add-adr-theme-tag-to-registry.sdp.md +++ b/specs/unimplemented/deliverables/themed-decision-architecture/d-001-add-adr-theme-tag-to-registry.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Add `adr-theme` tag to registry" from architect/specs/themed-decision-architecture.feature at No. +- outcome: Unimplemented deliverable: Add 'adr-theme' tag to registry at No diff --git a/specs/unimplemented/deliverables/themed-decision-architecture/d-002-theme-grouped-decision-generator.sdp.md b/specs/unimplemented/deliverables/themed-decision-architecture/d-002-theme-grouped-decision-generator.sdp.md index c1a0701d..7a89d924 100644 --- a/specs/unimplemented/deliverables/themed-decision-architecture/d-002-theme-grouped-decision-generator.sdp.md +++ b/specs/unimplemented/deliverables/themed-decision-architecture/d-002-theme-grouped-decision-generator.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Theme-grouped decision generator" from architect/specs/themed-decision-architecture.feature at No. +- outcome: Unimplemented deliverable: Theme-grouped decision generator at No diff --git a/specs/unimplemented/deliverables/themed-decision-architecture/d-003-dependency-graph-generator.sdp.md b/specs/unimplemented/deliverables/themed-decision-architecture/d-003-dependency-graph-generator.sdp.md index d562af5e..45deab40 100644 --- a/specs/unimplemented/deliverables/themed-decision-architecture/d-003-dependency-graph-generator.sdp.md +++ b/specs/unimplemented/deliverables/themed-decision-architecture/d-003-dependency-graph-generator.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Dependency graph generator" from architect/specs/themed-decision-architecture.feature at No. +- outcome: Unimplemented deliverable: Dependency graph generator at No diff --git a/specs/unimplemented/deliverables/themed-decision-architecture/d-004-adr-migration-scripts.sdp.md b/specs/unimplemented/deliverables/themed-decision-architecture/d-004-adr-migration-scripts.sdp.md index 1eda65cd..4178441d 100644 --- a/specs/unimplemented/deliverables/themed-decision-architecture/d-004-adr-migration-scripts.sdp.md +++ b/specs/unimplemented/deliverables/themed-decision-architecture/d-004-adr-migration-scripts.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Unimplemented deliverable "ADR migration scripts" from architect/specs/themed-decision-architecture.feature at No. +- outcome: Unimplemented deliverable: ADR migration scripts at No diff --git a/specs/unimplemented/deliverables/themed-decision-architecture/d-005-review-and-port-33-active-ad-rs.sdp.md b/specs/unimplemented/deliverables/themed-decision-architecture/d-005-review-and-port-33-active-ad-rs.sdp.md index 41e474c7..5fa288c4 100644 --- a/specs/unimplemented/deliverables/themed-decision-architecture/d-005-review-and-port-33-active-ad-rs.sdp.md +++ b/specs/unimplemented/deliverables/themed-decision-architecture/d-005-review-and-port-33-active-ad-rs.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Review and port 33 active ADRs" from architect/specs/themed-decision-architecture.feature at No. +- outcome: Unimplemented deliverable: Review and port 33 active ADRs at No diff --git a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-001-dependency-delta-memo.sdp.md b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-001-dependency-delta-memo.sdp.md index 6b56c431..55aa738e 100644 --- a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-001-dependency-delta-memo.sdp.md +++ b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-001-dependency-delta-memo.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Dependency delta memo" from architect/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.feature at .full-review/04a-dependency-delta.md. +- outcome: Unimplemented deliverable: Dependency delta memo +- problem: The remediation program cannot safely begin security or correctness migrations while 'platform-store' lacks a real backend integration harness, 'platform-bus' relies on thin backend coverage, and package validation posture still permits configuration drift. diff --git a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-002-store-backend-integration-harness.sdp.md b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-002-store-backend-integration-harness.sdp.md index 4148e486..e9fe4e0d 100644 --- a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-002-store-backend-integration-harness.sdp.md +++ b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-002-store-backend-integration-harness.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Store backend integration harness" from architect/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.feature at libar-platform/packages/platform-store/tests/integration/store-harness.integration.test.ts. +- outcome: Unimplemented deliverable: Store backend integration harness at libar-platform/packages/platform-store/tests/integration/store-harness +- problem: The remediation program cannot safely begin security or correctness migrations while 'platform-store' lacks a real backend integration harness, 'platform-bus' relies on thin backend coverage, and package validation posture still permits configuration drift. diff --git a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-003-bus-backend-integration-harness.sdp.md b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-003-bus-backend-integration-harness.sdp.md index 5f7f0648..6e6473f2 100644 --- a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-003-bus-backend-integration-harness.sdp.md +++ b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-003-bus-backend-integration-harness.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Bus backend integration harness" from architect/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.feature at libar-platform/packages/platform-bus/tests/integration/command-bus-harness.integration.test.ts. +- outcome: Unimplemented deliverable: Bus backend integration harness at libar-platform/packages/platform-bus/tests/integration/command-bus-harness +- problem: The remediation program cannot safely begin security or correctness migrations while 'platform-store' lacks a real backend integration harness, 'platform-bus' relies on thin backend coverage, and package validation posture still permits configuration drift. diff --git a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-004-typecheck-and-vitest-config-alignment.sdp.md b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-004-typecheck-and-vitest-config-alignment.sdp.md index 9d0cbbbd..b11a1681 100644 --- a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-004-typecheck-and-vitest-config-alignment.sdp.md +++ b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-004-typecheck-and-vitest-config-alignment.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Typecheck and Vitest config alignment" from architect/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.feature at libar-platform/packages/platform-*/package.json. +- outcome: Unimplemented deliverable: Typecheck and Vitest config alignment at libar-platform/packages/platform-*/package +- problem: The remediation program cannot safely begin security or correctness migrations while 'platform-store' lacks a real backend integration harness, 'platform-bus' relies on thin backend coverage, and package validation posture still permits configuration drift. diff --git a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-005-strict-ts-and-es-lint-hardening.sdp.md b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-005-strict-ts-and-es-lint-hardening.sdp.md index d7992039..ce66ddf3 100644 --- a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-005-strict-ts-and-es-lint-hardening.sdp.md +++ b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-005-strict-ts-and-es-lint-hardening.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Strict TS and ESLint hardening" from architect/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.feature at libar-platform/packages/platform-*/. +- outcome: Unimplemented deliverable: Strict TS and ESLint hardening at libar-platform/packages/platform-*/ +- problem: The remediation program cannot safely begin security or correctness migrations while 'platform-store' lacks a real backend integration harness, 'platform-bus' relies on thin backend coverage, and package validation posture still permits configuration drift. diff --git a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-001-release-automation-aligned-to-architect-releases.sdp.md b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-001-release-automation-aligned-to-architect-releases.sdp.md index ae7704d3..d0f3f49d 100644 --- a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-001-release-automation-aligned-to-architect-releases.sdp.md +++ b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-001-release-automation-aligned-to-architect-releases.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Release automation aligned to architect releases" from architect/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.feature at .github/ and package manifests. +- outcome: Unimplemented deliverable: Release automation aligned to architect releases +- problem: 'test.yml' ignores markdown and docs-only changes, release automation is not yet normalized around architect release metadata, and new remediation contracts need an explicit advertised-vs-enforced convention before runtime fixes start landing. diff --git a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-002-dependency-scanning-in-ci.sdp.md b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-002-dependency-scanning-in-ci.sdp.md index 32938b7b..c28fa4b0 100644 --- a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-002-dependency-scanning-in-ci.sdp.md +++ b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-002-dependency-scanning-in-ci.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Dependency scanning in CI" from architect/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.feature at .github/. +- outcome: Unimplemented deliverable: Dependency scanning in CI +- problem: 'test.yml' ignores markdown and docs-only changes, release automation is not yet normalized around architect release metadata, and new remediation contracts need an explicit advertised-vs-enforced convention before runtime fixes start landing. diff --git a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-003-contract-status-convention-and-linting.sdp.md b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-003-contract-status-convention-and-linting.sdp.md index 127b10ac..56f852c7 100644 --- a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-003-contract-status-convention-and-linting.sdp.md +++ b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-003-contract-status-convention-and-linting.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Contract-status convention and linting" from architect/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.feature at libar-platform/architect/ and lint config. +- outcome: Unimplemented deliverable: Contract-status convention and linting at libar-platform/architect/ and lint config +- problem: 'test.yml' ignores markdown and docs-only changes, release automation is not yet normalized around architect release metadata, and new remediation contracts need an explicit advertised-vs-enforced convention before runtime fixes start landing. diff --git a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-004-convex-es-rename-guard.sdp.md b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-004-convex-es-rename-guard.sdp.md index faf15803..7e8d688f 100644 --- a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-004-convex-es-rename-guard.sdp.md +++ b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-004-convex-es-rename-guard.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "@convex-es rename guard" from architect/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.feature at lint config and docs checks. +- outcome: Unimplemented deliverable: @convex-es rename guard at lint config and docs checks +- problem: 'test.yml' ignores markdown and docs-only changes, release automation is not yet normalized around architect release metadata, and new remediation contracts need an explicit advertised-vs-enforced convention before runtime fixes start landing. diff --git a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-005-docs-process-validation-workflow.sdp.md b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-005-docs-process-validation-workflow.sdp.md index b9ce2957..0a3354ac 100644 --- a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-005-docs-process-validation-workflow.sdp.md +++ b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-005-docs-process-validation-workflow.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Docs/process validation workflow" from architect/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.feature at .github/workflows/docs-process-validation.yml. +- outcome: Unimplemented deliverable: Docs/process validation workflow +- problem: 'test.yml' ignores markdown and docs-only changes, release automation is not yet normalized around architect release metadata, and new remediation contracts need an explicit advertised-vs-enforced convention before runtime fixes start landing. diff --git a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-001-ensure-test-environment-fail-closed.sdp.md b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-001-ensure-test-environment-fail-closed.sdp.md index 5f3328e7..eabe2bed 100644 --- a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-001-ensure-test-environment-fail-closed.sdp.md +++ b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-001-ensure-test-environment-fail-closed.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "ensureTestEnvironment fail-closed" from architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature at libar-platform/packages/platform-core/. +- outcome: Unimplemented deliverable: ensureTestEnvironment fail-closed at libar-platform/packages/platform-core/ +- problem: Several tranche-1 gaps remain after the auth keystone: test-mode checks fail open, correlation IDs can be fabricated, reviewer authorization still needs default-deny cleanup, lifecycle stubs leak placeholder behavior, and 'platform-store' still lacks a recorded decision for its constrained 'platform-core' runtime dependency. diff --git a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-002-correlation-id-required-at-validator-boundary.sdp.md b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-002-correlation-id-required-at-validator-boundary.sdp.md index ae1543e3..928a9418 100644 --- a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-002-correlation-id-required-at-validator-boundary.sdp.md +++ b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-002-correlation-id-required-at-validator-boundary.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "correlationId required at validator boundary" from architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature at appendToStream validators and callers. +- outcome: Unimplemented deliverable: correlationId required at validator boundary at validator boundary +- problem: Several tranche-1 gaps remain after the auth keystone: test-mode checks fail open, correlation IDs can be fabricated, reviewer authorization still needs default-deny cleanup, lifecycle stubs leak placeholder behavior, and 'platform-store' still lacks a recorded decision for its constrained 'platform-core' runtime dependency. diff --git a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-003-full-length-uui-dv7-helper-centralization.sdp.md b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-003-full-length-uui-dv7-helper-centralization.sdp.md index dd580f82..da3e9e48 100644 --- a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-003-full-length-uui-dv7-helper-centralization.sdp.md +++ b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-003-full-length-uui-dv7-helper-centralization.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Full-length UUIDv7 helper centralization" from architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature at ids/generator.ts and callers. +- outcome: Unimplemented deliverable: Full-length UUIDv7 helper centralization at ids/generator +- problem: Several tranche-1 gaps remain after the auth keystone: test-mode checks fail open, correlation IDs can be fabricated, reviewer authorization still needs default-deny cleanup, lifecycle stubs leak placeholder behavior, and 'platform-store' still lacks a recorded decision for its constrained 'platform-core' runtime dependency. diff --git a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-004-reviewer-authorization-default-deny-migration.sdp.md b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-004-reviewer-authorization-default-deny-migration.sdp.md index fccbbce4..1c9730e2 100644 --- a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-004-reviewer-authorization-default-deny-migration.sdp.md +++ b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-004-reviewer-authorization-default-deny-migration.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Reviewer authorization default-deny migration" from architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature at authorization middleware and call sites. +- outcome: Unimplemented deliverable: Reviewer authorization default-deny migration at authorization middleware and call sites +- problem: Several tranche-1 gaps remain after the auth keystone: test-mode checks fail open, correlation IDs can be fabricated, reviewer authorization still needs default-deny cleanup, lifecycle stubs leak placeholder behavior, and 'platform-store' still lacks a recorded decision for its constrained 'platform-core' runtime dependency. diff --git a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-005-approval-expiration-ordering-fix.sdp.md b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-005-approval-expiration-ordering-fix.sdp.md index 06e3f8b1..612a663f 100644 --- a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-005-approval-expiration-ordering-fix.sdp.md +++ b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-005-approval-expiration-ordering-fix.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Approval expiration ordering fix" from architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature at approveAction and rejectAction surfaces. +- outcome: Unimplemented deliverable: Approval expiration ordering fix at approveAction and rejectAction surfaces +- problem: Several tranche-1 gaps remain after the auth keystone: test-mode checks fail open, correlation IDs can be fabricated, reviewer authorization still needs default-deny cleanup, lifecycle stubs leak placeholder behavior, and 'platform-store' still lacks a recorded decision for its constrained 'platform-core' runtime dependency. diff --git a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-006-lifecycle-stubs-throw-or-are-removed.sdp.md b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-006-lifecycle-stubs-throw-or-are-removed.sdp.md index 89fe3cb2..c1b175b3 100644 --- a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-006-lifecycle-stubs-throw-or-are-removed.sdp.md +++ b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-006-lifecycle-stubs-throw-or-are-removed.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "Lifecycle stubs throw or are removed" from architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature at public lifecycle surfaces. +- outcome: Unimplemented deliverable: Lifecycle stubs throw or are removed at public lifecycle surfaces +- problem: Several tranche-1 gaps remain after the auth keystone: test-mode checks fail open, correlation IDs can be fabricated, reviewer authorization still needs default-deny cleanup, lifecycle stubs leak placeholder behavior, and 'platform-store' still lacks a recorded decision for its constrained 'platform-core' runtime dependency. diff --git a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-007-platform-store-dependency-decision-guardrails.sdp.md b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-007-platform-store-dependency-decision-guardrails.sdp.md index 61c13f23..ffe8e597 100644 --- a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-007-platform-store-dependency-decision-guardrails.sdp.md +++ b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-007-platform-store-dependency-decision-guardrails.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable "platform-store dependency decision + guardrails" from architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature at libar-platform/architect/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.feature and libar-platform/architect/remediation/REMEDIATION_PLAN.md. +- outcome: Unimplemented deliverable: platform-store dependency decision + guardrails at libar-platform/architect/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core +- problem: Several tranche-1 gaps remain after the auth keystone: test-mode checks fail open, correlation IDs can be fabricated, reviewer authorization still needs default-deny cleanup, lifecycle stubs leak placeholder behavior, and 'platform-store' still lacks a recorded decision for its constrained 'platform-core' runtime dependency. diff --git a/specs/unimplemented/remaining/phase-100-themed-decision-architecture.sdp.md b/specs/unimplemented/remaining/phase-100-themed-decision-architecture.sdp.md index dd74a5da..91d3f568 100644 --- a/specs/unimplemented/remaining/phase-100-themed-decision-architecture.sdp.md +++ b/specs/unimplemented/remaining/phase-100-themed-decision-architecture.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent +ThemedDecisionArchitecture - Remaining Work Purpose: Detailed remaining work for ThemedDecisionArchitecture --- Summary Progress: [██████████░░░░░░░░░░] 3/6 (50%) Remaining: 3 patterns (1 active, 2 planned) --- 🚧 In Progress --- ✅ Ready to Start These patterns can be started immediately: --- All Remaining Patterns 🚧 Process Enhancements Vision: Transform the delivery process from a documentation tool into a delivery operating system. Enable code-driven, multi-workflow documentation where code + .feature files are authoritative sources, and all artifacts are generated projections. Problem: Current delivery process capabilities are limited to document generation. The convergence roadmap identified 8 opportunities: Process Views as Projections, DoD as Machine-Checkable, Earned-Value Tracking… + - outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-100-themed-decision-architecture.md. diff --git a/specs/unimplemented/remaining/phase-18-production-hardening.sdp.md b/specs/unimplemented/remaining/phase-18-production-hardening.sdp.md index 563dba45..de42f24b 100644 --- a/specs/unimplemented/remaining/phase-18-production-hardening.sdp.md +++ b/specs/unimplemented/remaining/phase-18-production-hardening.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent +ProductionHardening - Remaining Work Purpose: Detailed remaining work for ProductionHardening --- Summary Progress: [█████████░░░░░░░░░░░] 3/7 (43%) Remaining: 4 patterns (0 active, 4 planned) --- ✅ Ready to Start These patterns can be started immediately: --- ⚠️ Blocked These patterns are waiting on dependencies: --- All Remaining Patterns 📋 Admin Tooling Consolidation Problem: Admin functionality is scattered across the codebase: - Dead letter queue at convex/projections/deadLetters.ts - Saga admin at convex/sagas/admin.ts - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. Solution: Consolidate admin functionality into convex/admin/ directory: - projections.ts - R… + - outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-18-production-hardening.md. diff --git a/specs/unimplemented/remaining/phase-18-workpool-partitioning-strategy.sdp.md b/specs/unimplemented/remaining/phase-18-workpool-partitioning-strategy.sdp.md index 47632ed6..e4a43f3d 100644 --- a/specs/unimplemented/remaining/phase-18-workpool-partitioning-strategy.sdp.md +++ b/specs/unimplemented/remaining/phase-18-workpool-partitioning-strategy.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent +WorkpoolPartitioningStrategy - Remaining Work Purpose: Detailed remaining work for WorkpoolPartitioningStrategy --- Summary Progress: [███████████░░░░░░░░░] 5/9 (56%) Remaining: 4 patterns (0 active, 4 planned) --- ✅ Ready to Start These patterns can be started immediately: --- ⚠️ Blocked These patterns are waiting on dependencies: --- All Remaining Patterns 📋 Admin Tooling Consolidation Problem: Admin functionality is scattered across the codebase: - Dead letter queue at convex/projections/deadLetters.ts - Saga admin at convex/sagas/admin.ts - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. Solution: Consolidate admin functionality into convex/admin/ directory: -… + - outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-18-workpool-partitioning-strategy.md. diff --git a/specs/unimplemented/remaining/phase-20-reservation-pattern.sdp.md b/specs/unimplemented/remaining/phase-20-reservation-pattern.sdp.md index 8e2af170..f3cf227c 100644 --- a/specs/unimplemented/remaining/phase-20-reservation-pattern.sdp.md +++ b/specs/unimplemented/remaining/phase-20-reservation-pattern.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent +ReservationPattern - Remaining Work Purpose: Detailed remaining work for ReservationPattern --- Summary Progress: [█████████████░░░░░░░] 2/3 (67%) Remaining: 1 patterns (0 active, 1 planned) --- ✅ Ready to Start These patterns can be started immediately: --- All Remaining Patterns 📋 Deterministic Id Hashing Problem: TTL-based reservations work well for multi-step flows (registration wizards), but add overhead for simple "create if unique" operations. Need a lighter-weight alternative. Solution: Generate entity stream ID from unique business key via deterministic hash. Concurrent creates target the same stream ID; OCC detects conflict automatically. When to Use Each Pattern: Example: typescript // Two concurrent "create user with email" requests const streamId = deterministicStreamId("User… + - outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-20-reservation-pattern.md. diff --git a/specs/unimplemented/remaining/phase-21-integration-patterns-21b.sdp.md b/specs/unimplemented/remaining/phase-21-integration-patterns-21b.sdp.md index 73907621..4da48ab0 100644 --- a/specs/unimplemented/remaining/phase-21-integration-patterns-21b.sdp.md +++ b/specs/unimplemented/remaining/phase-21-integration-patterns-21b.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent +IntegrationPatterns21b - Remaining Work Purpose: Detailed remaining work for IntegrationPatterns21b --- Summary Progress: [░░░░░░░░░░░░░░░░░░░░] 0/2 (0%) Remaining: 2 patterns (0 active, 2 planned) --- ✅ Ready to Start These patterns can be started immediately: --- ⚠️ Blocked These patterns are waiting on dependencies: --- All Remaining Patterns 📋 Integration Patterns21a Problem: Cross-context communication is ad-hoc. Domain events are used directly for integration without explicit contracts, leading to tight coupling. Solution: Foundational patterns for cross-context communication: - Context Map — Document relationships between BCs (including Partnership, Shared Kernel, Open Host Service) - Published Language — Stable schema for integration events with event tagging and compatibility mod… + - outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-21-integration-patterns-21b.md. diff --git a/specs/unimplemented/remaining/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md b/specs/unimplemented/remaining/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md index d76849ed..827215fd 100644 --- a/specs/unimplemented/remaining/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md +++ b/specs/unimplemented/remaining/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent +Agent as Bounded Context - AI-Driven Event Reactors - Remaining Work Purpose: Detailed remaining work for Agent as Bounded Context - AI-Driven Event Reactors --- Summary Progress: [░░░░░░░░░░░░░░░░░░░░] 0/1 (0%) Remaining: 1 patterns (1 active, 0 planned) --- 🚧 In Progress --- All Remaining Patterns 🚧 Agent as Bounded Context - AI-Driven Event Reactors Agent as Bounded Context - AI-Driven Event Reactors Demonstrates the Agent as Bounded Context pattern where AI agents subscribe to domain events via EventBus and emit commands based on pattern detection. Architecture Overview ┌─────────────────────────────────────────────────────────────────────────┐ │ EventBus │ │ (publishes OrderCancelled, OrderRefunded, OrderComplaintFiled, etc.) │ └────────────────────────────────┬──────────────────────… + - outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-22-agent-as-bounded-context-ai-driven-event-reactors.md. diff --git a/specs/unimplemented/remaining/phase-22-agent-as-bounded-context.sdp.md b/specs/unimplemented/remaining/phase-22-agent-as-bounded-context.sdp.md index 37f629e6..472b180a 100644 --- a/specs/unimplemented/remaining/phase-22-agent-as-bounded-context.sdp.md +++ b/specs/unimplemented/remaining/phase-22-agent-as-bounded-context.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent +AgentAsBoundedContext - Remaining Work Purpose: Detailed remaining work for AgentAsBoundedContext --- Summary Progress: [░░░░░░░░░░░░░░░░░░░░] 0/1 (0%) Remaining: 1 patterns (1 active, 0 planned) --- 🚧 In Progress --- All Remaining Patterns 🚧 Agent As Bounded Context Problem: AI agents are invoked manually without integration into the event-driven architecture. No pattern for agents to react to business events. Solution: AI agents implemented as bounded contexts that: 1. Subscribe to event streams via EventBus 2. Detect patterns across events using LLM or rules 3. Emit commands based on detected patterns This is the culminating pattern demonstrating full platform integration. Why It Matters for Convex-Native ES: Architectural Decisions: @convex-dev/agent Integration: Agent BC uses @convex… + - outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-22-agent-as-bounded-context.md. diff --git a/specs/unimplemented/remaining/phase-22-agent-churn-risk-completion.sdp.md b/specs/unimplemented/remaining/phase-22-agent-churn-risk-completion.sdp.md index 8942f312..73b8f806 100644 --- a/specs/unimplemented/remaining/phase-22-agent-churn-risk-completion.sdp.md +++ b/specs/unimplemented/remaining/phase-22-agent-churn-risk-completion.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent +AgentChurnRiskCompletion - Remaining Work Purpose: Detailed remaining work for AgentChurnRiskCompletion --- Summary Progress: [██████████░░░░░░░░░░] 3/6 (50%) Remaining: 3 patterns (3 active, 0 planned) --- 🚧 In Progress --- All Remaining Patterns 🚧 Agent BC Component Isolation Problem: Agent BC tables ( agentCheckpoints , agentAuditEvents , agentDeadLetters , agentCommands , pendingApprovals ) reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. Solution: Implement agent as a proper Convex component: 1. defineComponent("agent") with isolated schema and private tables 2. Public API handlers for… + - outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-22-agent-churn-risk-completion.md. diff --git a/specs/unimplemented/remaining/phase-22-confirmed-order-cancellation.sdp.md b/specs/unimplemented/remaining/phase-22-confirmed-order-cancellation.sdp.md index 1e0468e4..beaa9f60 100644 --- a/specs/unimplemented/remaining/phase-22-confirmed-order-cancellation.sdp.md +++ b/specs/unimplemented/remaining/phase-22-confirmed-order-cancellation.sdp.md @@ -10,4 +10,6 @@ relations: ## Intent +ConfirmedOrderCancellation - Remaining Work Purpose: Detailed remaining work for ConfirmedOrderCancellation --- Summary Progress: [██████████░░░░░░░░░░] 3/6 (50%) Remaining: 3 patterns (3 active, 0 planned) --- 🚧 In Progress --- All Remaining Patterns 🚧 Agent BC Component Isolation Problem: Agent BC tables ( agentCheckpoints , agentAuditEvents , agentDeadLetters , agentCommands , pendingApprovals ) reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. Solution: Implement agent as a proper Convex component: 1. defineComponent("agent") with isolated schema and private tables 2. Public API handlers… + - outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-22-confirmed-order-cancellation.md. diff --git a/test/sdp-migration-guard.test.ts b/test/sdp-migration-guard.test.ts index 70a4c4e1..f7268c2c 100644 --- a/test/sdp-migration-guard.test.ts +++ b/test/sdp-migration-guard.test.ts @@ -72,10 +72,12 @@ describe("SDP migration guard", () => { // Hundreds of executable scenarios plus unimplemented backlog Specs. expect(specs.length).toBeGreaterThanOrEqual(3000); - const examplesDirHit = walkFiles(join(ROOT, "specs", "behavior")).some((f) => - f.includes(".examples") && f.endsWith(".sdp.md"), + const exampleFiles = walkFiles(join(ROOT, "specs")).filter( + (f) => f.endsWith(".sdp.md") && (f.includes(".examples") || f.includes("architect-scenarios")), ); - expect(examplesDirHit).toBe(true); + expect(exampleFiles.length).toBeGreaterThanOrEqual(2000); + const withGwt = exampleFiles.filter((f) => readFileSync(f, "utf8").includes("```gwt")); + expect(withGwt.length).toBeGreaterThanOrEqual(2000); expect(existsSync(join(ROOT, "specs", "unimplemented"))).toBe(true); const bindings = join(specsRoot, "platform", "sdp-bindings.ts"); From ee3dd7aa4c17fa11a550412274a70184a864239e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darko=20Miji=C4=87?= Date: Thu, 20 Aug 2026 00:10:45 +0200 Subject: [PATCH 5/6] relocate architect Gherkin corpus to docs/lineage Move the former top-level architect/ specs, decisions, and releases out of the live tree so specs/ is the delivery corpus. Leave architect/README.md as a pointer. Cucumber tests stay in packages/examples/apps. --- README.md | 5 +++-- architect/README.md | 16 ++++++++++++++++ docs/lineage/README.md | 9 +++++++++ .../lineage/architect}/ARCHITECT-GUIDE.md | 6 +++--- .../lineage/architect}/DESIGN-SESSION-GUIDE.md | 0 .../lineage/architect}/SPEC-CLEANUP-REPORT.md | 0 .../architect}/_shared/annotation-ownership.md | 0 .../architect}/_shared/four-tier-ladder.md | 0 .../architect}/_shared/fsm-transitions.md | 0 .../_shared/spec-pattern-relationships.md | 0 .../lineage/architect}/_shared/value-transfer.md | 0 .../pdr-001-process-decisions-folder.feature | 0 ...r-002-release-management-architecture.feature | 0 ...r-003-behavior-feature-file-structure.feature | 0 ...r-004-unified-tag-prefix-architecture.feature | 0 .../decisions/pdr-005-mvp-workflow.feature | 0 .../pdr-006-typescript-sourced-taxonomy.feature | 0 .../pdr-007-two-tier-spec-architecture.feature | 0 .../pdr-008-example-app-purpose.feature | 0 .../pdr-009-design-session-methodology.feature | 0 ...10-cross-component-argument-injection.feature | 0 ...011-agent-action-handler-architecture.feature | 0 .../pdr-012-agent-command-routing.feature | 0 .../pdr-013-agent-lifecycle-fsm.feature | 0 ...nt-boundary-authentication-convention.feature | 0 ...lobal-position-numeric-representation.feature | 0 ...on-pool-split-named-pools-per-concern.feature | 0 ...-tranche-3-platform-architecture-gate.feature | 0 ...ency-enforcement-for-append-to-stream.feature | 0 ...19-v-any-vs-v-unknown-boundary-policy.feature | 0 .../pdr-020-events-table-index-policy.feature | 0 ...e-runtime-dependency-on-platform-core.feature | 0 ...-022-value-transfer-doctrine-adoption.feature | 0 ...3-bulk-doctrine-rollback-and-recovery.feature | 0 .../design-reviews/agent-as-bounded-context.md | 0 .../design-reviews/command-bus-foundation.md | 0 .../design-reviews/durable-function-adapters.md | 0 .../design-reviews/event-store-foundation.md | 0 .../design-reviews/saga-orchestration.md | 0 .../workpool-partitioning-strategy.md | 0 ...process-api-configuration-audit-HISTORICAL.md | 0 .../lineage/architect}/docs/tag-taxonomy.md | 0 .../lineage/architect}/metadata-schema-v2.md | 0 .../lineage/architect}/releases/v0.1.0.feature | 0 .../lineage/architect}/releases/v0.2.0.feature | 0 .../lineage/architect}/releases/v0.3.0.feature | 0 .../lineage/architect}/releases/vNEXT.feature | 0 .../architect}/remediation/REMEDIATION_PLAN.md | 0 .../codec-driven-reference-generation.feature | 0 .../specs/epic-process-enhancements.feature | 0 .../example-app/agent-admin-frontend.feature | 0 .../platform/admin-tooling-consolidation.feature | 0 .../agent-bc-component-isolation.feature | 0 .../agent-command-infrastructure.feature | 0 .../specs/platform/agent-llm-integration.feature | 0 .../platform/circuit-breaker-pattern.feature | 0 ...nt-boundary-authentication-convention.feature | 0 .../confirmed-order-cancellation.feature | 0 .../platform/deterministic-id-hashing.feature | 0 .../platform/event-correctness-migration.feature | 0 .../specs/platform/health-observability.feature | 0 .../platform/integration-patterns-21a.feature | 0 .../platform/integration-patterns-21b.feature | 0 .../specs/platform/package-architecture.feature | 0 .../specs/platform/production-hardening.feature | 0 ...ness-harness-and-dependency-hardening.feature | 0 ...elease-ci-and-docs-process-guardrails.feature | 0 ...upporting-security-and-contract-sweep.feature | 0 .../architect}/specs/test-content-blocks.feature | 0 .../specs/themed-decision-architecture.feature | 0 .../architect}/src/phases/_archive/README.md | 0 .../_archive/v0.1.0/phase-01-foundation.ts | 0 .../stubs/agent-action-handler/action-handler.ts | 0 .../agent-action-handler/agent-subscription.ts | 0 .../event-subscription-types.ts | 0 .../eventbus-publish-update.ts | 0 .../agent-action-handler/oncomplete-handler.ts | 0 .../agent-command-routing/agent-bc-config.ts | 0 .../agent-command-routing/command-bridge.ts | 0 .../agent-command-routing/command-router.ts | 0 .../agent-command-routing/pattern-executor.ts | 0 .../agent-command-routing/pattern-registry.ts | 0 .../component/approvals.ts | 0 .../agent-component-isolation/component/audit.ts | 0 .../component/checkpoints.ts | 0 .../component/commands.ts | 0 .../component/convex.config.ts | 0 .../component/deadLetters.ts | 0 .../component/schema.ts | 0 .../agent-component-isolation/cross-bc-query.ts | 0 .../checkpoint-status-extension.ts | 0 .../lifecycle-audit-events.ts | 0 .../lifecycle-command-handlers.ts | 0 .../lifecycle-command-types.ts | 0 .../stubs/agent-lifecycle-fsm/lifecycle-fsm.ts | 0 .../stubs/integration-patterns/patterns.ts | 0 .../production-hardening/monitoring-stubs.ts | 0 .../lineage/architect}/tsconfig.json | 0 scripts/migrate-architect-corpus.mjs | 2 +- scripts/migrate-scenarios-and-unimplemented.mjs | 4 ++-- test/sdp-migration-guard.test.ts | 4 ++++ 101 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 architect/README.md create mode 100644 docs/lineage/README.md rename {architect => docs/lineage/architect}/ARCHITECT-GUIDE.md (76%) rename {architect => docs/lineage/architect}/DESIGN-SESSION-GUIDE.md (100%) rename {architect => docs/lineage/architect}/SPEC-CLEANUP-REPORT.md (100%) rename {architect => docs/lineage/architect}/_shared/annotation-ownership.md (100%) rename {architect => docs/lineage/architect}/_shared/four-tier-ladder.md (100%) rename {architect => docs/lineage/architect}/_shared/fsm-transitions.md (100%) rename {architect => docs/lineage/architect}/_shared/spec-pattern-relationships.md (100%) rename {architect => docs/lineage/architect}/_shared/value-transfer.md (100%) rename {architect => docs/lineage/architect}/decisions/pdr-001-process-decisions-folder.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-002-release-management-architecture.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-003-behavior-feature-file-structure.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-004-unified-tag-prefix-architecture.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-005-mvp-workflow.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-006-typescript-sourced-taxonomy.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-007-two-tier-spec-architecture.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-008-example-app-purpose.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-009-design-session-methodology.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-010-cross-component-argument-injection.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-011-agent-action-handler-architecture.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-012-agent-command-routing.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-013-agent-lifecycle-fsm.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-014-component-boundary-authentication-convention.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-015-global-position-numeric-representation.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-016-projection-pool-split-named-pools-per-concern.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-017-tranche-3-platform-architecture-gate.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-019-v-any-vs-v-unknown-boundary-policy.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-020-events-table-index-policy.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-022-value-transfer-doctrine-adoption.feature (100%) rename {architect => docs/lineage/architect}/decisions/pdr-023-bulk-doctrine-rollback-and-recovery.feature (100%) rename {architect => docs/lineage/architect}/design-reviews/agent-as-bounded-context.md (100%) rename {architect => docs/lineage/architect}/design-reviews/command-bus-foundation.md (100%) rename {architect => docs/lineage/architect}/design-reviews/durable-function-adapters.md (100%) rename {architect => docs/lineage/architect}/design-reviews/event-store-foundation.md (100%) rename {architect => docs/lineage/architect}/design-reviews/saga-orchestration.md (100%) rename {architect => docs/lineage/architect}/design-reviews/workpool-partitioning-strategy.md (100%) rename {architect => docs/lineage/architect}/docs/process-api-configuration-audit-HISTORICAL.md (100%) rename {architect => docs/lineage/architect}/docs/tag-taxonomy.md (100%) rename {architect => docs/lineage/architect}/metadata-schema-v2.md (100%) rename {architect => docs/lineage/architect}/releases/v0.1.0.feature (100%) rename {architect => docs/lineage/architect}/releases/v0.2.0.feature (100%) rename {architect => docs/lineage/architect}/releases/v0.3.0.feature (100%) rename {architect => docs/lineage/architect}/releases/vNEXT.feature (100%) rename {architect => docs/lineage/architect}/remediation/REMEDIATION_PLAN.md (100%) rename {architect => docs/lineage/architect}/specs/codec-driven-reference-generation.feature (100%) rename {architect => docs/lineage/architect}/specs/epic-process-enhancements.feature (100%) rename {architect => docs/lineage/architect}/specs/example-app/agent-admin-frontend.feature (100%) rename {architect => docs/lineage/architect}/specs/platform/admin-tooling-consolidation.feature (100%) rename {architect => docs/lineage/architect}/specs/platform/agent-bc-component-isolation.feature (100%) rename {architect => docs/lineage/architect}/specs/platform/agent-command-infrastructure.feature (100%) rename {architect => docs/lineage/architect}/specs/platform/agent-llm-integration.feature (100%) rename {architect => docs/lineage/architect}/specs/platform/circuit-breaker-pattern.feature (100%) rename {architect => docs/lineage/architect}/specs/platform/component-boundary-authentication-convention.feature (100%) rename {architect => docs/lineage/architect}/specs/platform/confirmed-order-cancellation.feature (100%) rename {architect => docs/lineage/architect}/specs/platform/deterministic-id-hashing.feature (100%) rename {architect => docs/lineage/architect}/specs/platform/event-correctness-migration.feature (100%) rename {architect => docs/lineage/architect}/specs/platform/health-observability.feature (100%) rename {architect => docs/lineage/architect}/specs/platform/integration-patterns-21a.feature (100%) rename {architect => docs/lineage/architect}/specs/platform/integration-patterns-21b.feature (100%) rename {architect => docs/lineage/architect}/specs/platform/package-architecture.feature (100%) rename {architect => docs/lineage/architect}/specs/platform/production-hardening.feature (100%) rename {architect => docs/lineage/architect}/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.feature (100%) rename {architect => docs/lineage/architect}/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.feature (100%) rename {architect => docs/lineage/architect}/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature (100%) rename {architect => docs/lineage/architect}/specs/test-content-blocks.feature (100%) rename {architect => docs/lineage/architect}/specs/themed-decision-architecture.feature (100%) rename {architect => docs/lineage/architect}/src/phases/_archive/README.md (100%) rename {architect => docs/lineage/architect}/src/phases/_archive/v0.1.0/phase-01-foundation.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-action-handler/action-handler.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-action-handler/agent-subscription.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-action-handler/event-subscription-types.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-action-handler/eventbus-publish-update.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-action-handler/oncomplete-handler.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-command-routing/agent-bc-config.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-command-routing/command-bridge.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-command-routing/command-router.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-command-routing/pattern-executor.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-command-routing/pattern-registry.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-component-isolation/component/approvals.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-component-isolation/component/audit.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-component-isolation/component/checkpoints.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-component-isolation/component/commands.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-component-isolation/component/convex.config.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-component-isolation/component/deadLetters.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-component-isolation/component/schema.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-component-isolation/cross-bc-query.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-lifecycle-fsm/checkpoint-status-extension.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-lifecycle-fsm/lifecycle-audit-events.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-lifecycle-fsm/lifecycle-command-handlers.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-lifecycle-fsm/lifecycle-command-types.ts (100%) rename {architect => docs/lineage/architect}/stubs/agent-lifecycle-fsm/lifecycle-fsm.ts (100%) rename {architect => docs/lineage/architect}/stubs/integration-patterns/patterns.ts (100%) rename {architect => docs/lineage/architect}/stubs/production-hardening/monitoring-stubs.ts (100%) rename {architect => docs/lineage/architect}/tsconfig.json (100%) diff --git a/README.md b/README.md index 71cb8c0c..8210188c 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,9 @@ This directory contains the platform workspaces that power the Convex event sour - `packages/` contains the reusable platform packages. - `examples/order-management/` contains the reference bounded contexts and app wiring. - `apps/frontend/` contains the frontend, stories, and browser tests. -- `specs/` is the designated **Libar Software Delivery Protocol (SDP)** corpus root — Specs, Packs, and identity bindings (`*.sdp.md`, `*.pack.sdp.md`, `sdp-bindings.ts`). -- `architect/` retains historical Gherkin lineage only; it is not on the live delivery path. +- `specs/` is the designated **Libar Software Delivery Protocol (SDP)** corpus root — Specs, Packs, and identity bindings (`*.sdp.md`, `*.pack.sdp.md`, `sdp-bindings.ts`). Executable test scenarios live under `specs/behavior/`; unimplemented backlog under `specs/unimplemented/`. +- `architect/` is a pointer only. The former architect Gherkin corpus was moved to `docs/lineage/architect/`. +- Cucumber `.feature` files under `packages/`, `examples/`, and `apps/` remain runtime tests (not SDP carriers). - `docs-living/` retains archived generated projections from the retired architect workflow. ## Working rules diff --git a/architect/README.md b/architect/README.md new file mode 100644 index 00000000..c510512a --- /dev/null +++ b/architect/README.md @@ -0,0 +1,16 @@ +# architect/ (moved) + +The former architect delivery corpus (`specs/`, `decisions/`, `releases/`, stubs, and guides) +was relocated to [`docs/lineage/architect/`](../docs/lineage/architect/). + +**Live delivery corpus:** [`specs/`](../specs/) — Libar Software Delivery Protocol Specs and Packs. + +```sh +pnpm sdp:build +pnpm sdp:validate +pnpm sdp:view +``` + +Cucumber `.feature` files under `packages/`, `examples/`, and `apps/` remain **runtime tests**. +Each Feature/Scenario has an SDP Spec under `specs/behavior/`. +Non-implemented backlog lives under `specs/unimplemented/`. diff --git a/docs/lineage/README.md b/docs/lineage/README.md new file mode 100644 index 00000000..2d0be93c --- /dev/null +++ b/docs/lineage/README.md @@ -0,0 +1,9 @@ +# Lineage + +Historical design evidence, not the live delivery corpus. + +| Path | What it is | +| --- | --- | +| `architect/` | Former `@libar-dev/architect` Gherkin specs, decisions, releases, stubs, and guides | + +Live intent is authored under [`specs/`](../../specs/). Query it with `pnpm sdp:q`. diff --git a/architect/ARCHITECT-GUIDE.md b/docs/lineage/architect/ARCHITECT-GUIDE.md similarity index 76% rename from architect/ARCHITECT-GUIDE.md rename to docs/lineage/architect/ARCHITECT-GUIDE.md index e55b4e53..27984e81 100644 --- a/architect/ARCHITECT-GUIDE.md +++ b/docs/lineage/architect/ARCHITECT-GUIDE.md @@ -4,9 +4,9 @@ > package `@libar-dev/software-delivery-protocol`, CLI `sdp`. Live intent lives under `specs/`. > See the repo root `README.md` and `specs/README.md`. -This file previously documented `@libar-dev/architect` setup for this repo. The `architect/` tree -is retained as lineage only. Do not run `architect-generate`, `architect-guard`, -`architect-lint-patterns`, or `architect-validate` as the delivery workflow. +This file previously documented `@libar-dev/architect` setup for this repo. This tree is +`docs/lineage/architect/` — historical Gherkin only. Do not run `architect-generate`, +`architect-guard`, `architect-lint-patterns`, or `architect-validate` as the delivery workflow. ## Current commands diff --git a/architect/DESIGN-SESSION-GUIDE.md b/docs/lineage/architect/DESIGN-SESSION-GUIDE.md similarity index 100% rename from architect/DESIGN-SESSION-GUIDE.md rename to docs/lineage/architect/DESIGN-SESSION-GUIDE.md diff --git a/architect/SPEC-CLEANUP-REPORT.md b/docs/lineage/architect/SPEC-CLEANUP-REPORT.md similarity index 100% rename from architect/SPEC-CLEANUP-REPORT.md rename to docs/lineage/architect/SPEC-CLEANUP-REPORT.md diff --git a/architect/_shared/annotation-ownership.md b/docs/lineage/architect/_shared/annotation-ownership.md similarity index 100% rename from architect/_shared/annotation-ownership.md rename to docs/lineage/architect/_shared/annotation-ownership.md diff --git a/architect/_shared/four-tier-ladder.md b/docs/lineage/architect/_shared/four-tier-ladder.md similarity index 100% rename from architect/_shared/four-tier-ladder.md rename to docs/lineage/architect/_shared/four-tier-ladder.md diff --git a/architect/_shared/fsm-transitions.md b/docs/lineage/architect/_shared/fsm-transitions.md similarity index 100% rename from architect/_shared/fsm-transitions.md rename to docs/lineage/architect/_shared/fsm-transitions.md diff --git a/architect/_shared/spec-pattern-relationships.md b/docs/lineage/architect/_shared/spec-pattern-relationships.md similarity index 100% rename from architect/_shared/spec-pattern-relationships.md rename to docs/lineage/architect/_shared/spec-pattern-relationships.md diff --git a/architect/_shared/value-transfer.md b/docs/lineage/architect/_shared/value-transfer.md similarity index 100% rename from architect/_shared/value-transfer.md rename to docs/lineage/architect/_shared/value-transfer.md diff --git a/architect/decisions/pdr-001-process-decisions-folder.feature b/docs/lineage/architect/decisions/pdr-001-process-decisions-folder.feature similarity index 100% rename from architect/decisions/pdr-001-process-decisions-folder.feature rename to docs/lineage/architect/decisions/pdr-001-process-decisions-folder.feature diff --git a/architect/decisions/pdr-002-release-management-architecture.feature b/docs/lineage/architect/decisions/pdr-002-release-management-architecture.feature similarity index 100% rename from architect/decisions/pdr-002-release-management-architecture.feature rename to docs/lineage/architect/decisions/pdr-002-release-management-architecture.feature diff --git a/architect/decisions/pdr-003-behavior-feature-file-structure.feature b/docs/lineage/architect/decisions/pdr-003-behavior-feature-file-structure.feature similarity index 100% rename from architect/decisions/pdr-003-behavior-feature-file-structure.feature rename to docs/lineage/architect/decisions/pdr-003-behavior-feature-file-structure.feature diff --git a/architect/decisions/pdr-004-unified-tag-prefix-architecture.feature b/docs/lineage/architect/decisions/pdr-004-unified-tag-prefix-architecture.feature similarity index 100% rename from architect/decisions/pdr-004-unified-tag-prefix-architecture.feature rename to docs/lineage/architect/decisions/pdr-004-unified-tag-prefix-architecture.feature diff --git a/architect/decisions/pdr-005-mvp-workflow.feature b/docs/lineage/architect/decisions/pdr-005-mvp-workflow.feature similarity index 100% rename from architect/decisions/pdr-005-mvp-workflow.feature rename to docs/lineage/architect/decisions/pdr-005-mvp-workflow.feature diff --git a/architect/decisions/pdr-006-typescript-sourced-taxonomy.feature b/docs/lineage/architect/decisions/pdr-006-typescript-sourced-taxonomy.feature similarity index 100% rename from architect/decisions/pdr-006-typescript-sourced-taxonomy.feature rename to docs/lineage/architect/decisions/pdr-006-typescript-sourced-taxonomy.feature diff --git a/architect/decisions/pdr-007-two-tier-spec-architecture.feature b/docs/lineage/architect/decisions/pdr-007-two-tier-spec-architecture.feature similarity index 100% rename from architect/decisions/pdr-007-two-tier-spec-architecture.feature rename to docs/lineage/architect/decisions/pdr-007-two-tier-spec-architecture.feature diff --git a/architect/decisions/pdr-008-example-app-purpose.feature b/docs/lineage/architect/decisions/pdr-008-example-app-purpose.feature similarity index 100% rename from architect/decisions/pdr-008-example-app-purpose.feature rename to docs/lineage/architect/decisions/pdr-008-example-app-purpose.feature diff --git a/architect/decisions/pdr-009-design-session-methodology.feature b/docs/lineage/architect/decisions/pdr-009-design-session-methodology.feature similarity index 100% rename from architect/decisions/pdr-009-design-session-methodology.feature rename to docs/lineage/architect/decisions/pdr-009-design-session-methodology.feature diff --git a/architect/decisions/pdr-010-cross-component-argument-injection.feature b/docs/lineage/architect/decisions/pdr-010-cross-component-argument-injection.feature similarity index 100% rename from architect/decisions/pdr-010-cross-component-argument-injection.feature rename to docs/lineage/architect/decisions/pdr-010-cross-component-argument-injection.feature diff --git a/architect/decisions/pdr-011-agent-action-handler-architecture.feature b/docs/lineage/architect/decisions/pdr-011-agent-action-handler-architecture.feature similarity index 100% rename from architect/decisions/pdr-011-agent-action-handler-architecture.feature rename to docs/lineage/architect/decisions/pdr-011-agent-action-handler-architecture.feature diff --git a/architect/decisions/pdr-012-agent-command-routing.feature b/docs/lineage/architect/decisions/pdr-012-agent-command-routing.feature similarity index 100% rename from architect/decisions/pdr-012-agent-command-routing.feature rename to docs/lineage/architect/decisions/pdr-012-agent-command-routing.feature diff --git a/architect/decisions/pdr-013-agent-lifecycle-fsm.feature b/docs/lineage/architect/decisions/pdr-013-agent-lifecycle-fsm.feature similarity index 100% rename from architect/decisions/pdr-013-agent-lifecycle-fsm.feature rename to docs/lineage/architect/decisions/pdr-013-agent-lifecycle-fsm.feature diff --git a/architect/decisions/pdr-014-component-boundary-authentication-convention.feature b/docs/lineage/architect/decisions/pdr-014-component-boundary-authentication-convention.feature similarity index 100% rename from architect/decisions/pdr-014-component-boundary-authentication-convention.feature rename to docs/lineage/architect/decisions/pdr-014-component-boundary-authentication-convention.feature diff --git a/architect/decisions/pdr-015-global-position-numeric-representation.feature b/docs/lineage/architect/decisions/pdr-015-global-position-numeric-representation.feature similarity index 100% rename from architect/decisions/pdr-015-global-position-numeric-representation.feature rename to docs/lineage/architect/decisions/pdr-015-global-position-numeric-representation.feature diff --git a/architect/decisions/pdr-016-projection-pool-split-named-pools-per-concern.feature b/docs/lineage/architect/decisions/pdr-016-projection-pool-split-named-pools-per-concern.feature similarity index 100% rename from architect/decisions/pdr-016-projection-pool-split-named-pools-per-concern.feature rename to docs/lineage/architect/decisions/pdr-016-projection-pool-split-named-pools-per-concern.feature diff --git a/architect/decisions/pdr-017-tranche-3-platform-architecture-gate.feature b/docs/lineage/architect/decisions/pdr-017-tranche-3-platform-architecture-gate.feature similarity index 100% rename from architect/decisions/pdr-017-tranche-3-platform-architecture-gate.feature rename to docs/lineage/architect/decisions/pdr-017-tranche-3-platform-architecture-gate.feature diff --git a/architect/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.feature b/docs/lineage/architect/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.feature similarity index 100% rename from architect/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.feature rename to docs/lineage/architect/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.feature diff --git a/architect/decisions/pdr-019-v-any-vs-v-unknown-boundary-policy.feature b/docs/lineage/architect/decisions/pdr-019-v-any-vs-v-unknown-boundary-policy.feature similarity index 100% rename from architect/decisions/pdr-019-v-any-vs-v-unknown-boundary-policy.feature rename to docs/lineage/architect/decisions/pdr-019-v-any-vs-v-unknown-boundary-policy.feature diff --git a/architect/decisions/pdr-020-events-table-index-policy.feature b/docs/lineage/architect/decisions/pdr-020-events-table-index-policy.feature similarity index 100% rename from architect/decisions/pdr-020-events-table-index-policy.feature rename to docs/lineage/architect/decisions/pdr-020-events-table-index-policy.feature diff --git a/architect/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.feature b/docs/lineage/architect/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.feature similarity index 100% rename from architect/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.feature rename to docs/lineage/architect/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.feature diff --git a/architect/decisions/pdr-022-value-transfer-doctrine-adoption.feature b/docs/lineage/architect/decisions/pdr-022-value-transfer-doctrine-adoption.feature similarity index 100% rename from architect/decisions/pdr-022-value-transfer-doctrine-adoption.feature rename to docs/lineage/architect/decisions/pdr-022-value-transfer-doctrine-adoption.feature diff --git a/architect/decisions/pdr-023-bulk-doctrine-rollback-and-recovery.feature b/docs/lineage/architect/decisions/pdr-023-bulk-doctrine-rollback-and-recovery.feature similarity index 100% rename from architect/decisions/pdr-023-bulk-doctrine-rollback-and-recovery.feature rename to docs/lineage/architect/decisions/pdr-023-bulk-doctrine-rollback-and-recovery.feature diff --git a/architect/design-reviews/agent-as-bounded-context.md b/docs/lineage/architect/design-reviews/agent-as-bounded-context.md similarity index 100% rename from architect/design-reviews/agent-as-bounded-context.md rename to docs/lineage/architect/design-reviews/agent-as-bounded-context.md diff --git a/architect/design-reviews/command-bus-foundation.md b/docs/lineage/architect/design-reviews/command-bus-foundation.md similarity index 100% rename from architect/design-reviews/command-bus-foundation.md rename to docs/lineage/architect/design-reviews/command-bus-foundation.md diff --git a/architect/design-reviews/durable-function-adapters.md b/docs/lineage/architect/design-reviews/durable-function-adapters.md similarity index 100% rename from architect/design-reviews/durable-function-adapters.md rename to docs/lineage/architect/design-reviews/durable-function-adapters.md diff --git a/architect/design-reviews/event-store-foundation.md b/docs/lineage/architect/design-reviews/event-store-foundation.md similarity index 100% rename from architect/design-reviews/event-store-foundation.md rename to docs/lineage/architect/design-reviews/event-store-foundation.md diff --git a/architect/design-reviews/saga-orchestration.md b/docs/lineage/architect/design-reviews/saga-orchestration.md similarity index 100% rename from architect/design-reviews/saga-orchestration.md rename to docs/lineage/architect/design-reviews/saga-orchestration.md diff --git a/architect/design-reviews/workpool-partitioning-strategy.md b/docs/lineage/architect/design-reviews/workpool-partitioning-strategy.md similarity index 100% rename from architect/design-reviews/workpool-partitioning-strategy.md rename to docs/lineage/architect/design-reviews/workpool-partitioning-strategy.md diff --git a/architect/docs/process-api-configuration-audit-HISTORICAL.md b/docs/lineage/architect/docs/process-api-configuration-audit-HISTORICAL.md similarity index 100% rename from architect/docs/process-api-configuration-audit-HISTORICAL.md rename to docs/lineage/architect/docs/process-api-configuration-audit-HISTORICAL.md diff --git a/architect/docs/tag-taxonomy.md b/docs/lineage/architect/docs/tag-taxonomy.md similarity index 100% rename from architect/docs/tag-taxonomy.md rename to docs/lineage/architect/docs/tag-taxonomy.md diff --git a/architect/metadata-schema-v2.md b/docs/lineage/architect/metadata-schema-v2.md similarity index 100% rename from architect/metadata-schema-v2.md rename to docs/lineage/architect/metadata-schema-v2.md diff --git a/architect/releases/v0.1.0.feature b/docs/lineage/architect/releases/v0.1.0.feature similarity index 100% rename from architect/releases/v0.1.0.feature rename to docs/lineage/architect/releases/v0.1.0.feature diff --git a/architect/releases/v0.2.0.feature b/docs/lineage/architect/releases/v0.2.0.feature similarity index 100% rename from architect/releases/v0.2.0.feature rename to docs/lineage/architect/releases/v0.2.0.feature diff --git a/architect/releases/v0.3.0.feature b/docs/lineage/architect/releases/v0.3.0.feature similarity index 100% rename from architect/releases/v0.3.0.feature rename to docs/lineage/architect/releases/v0.3.0.feature diff --git a/architect/releases/vNEXT.feature b/docs/lineage/architect/releases/vNEXT.feature similarity index 100% rename from architect/releases/vNEXT.feature rename to docs/lineage/architect/releases/vNEXT.feature diff --git a/architect/remediation/REMEDIATION_PLAN.md b/docs/lineage/architect/remediation/REMEDIATION_PLAN.md similarity index 100% rename from architect/remediation/REMEDIATION_PLAN.md rename to docs/lineage/architect/remediation/REMEDIATION_PLAN.md diff --git a/architect/specs/codec-driven-reference-generation.feature b/docs/lineage/architect/specs/codec-driven-reference-generation.feature similarity index 100% rename from architect/specs/codec-driven-reference-generation.feature rename to docs/lineage/architect/specs/codec-driven-reference-generation.feature diff --git a/architect/specs/epic-process-enhancements.feature b/docs/lineage/architect/specs/epic-process-enhancements.feature similarity index 100% rename from architect/specs/epic-process-enhancements.feature rename to docs/lineage/architect/specs/epic-process-enhancements.feature diff --git a/architect/specs/example-app/agent-admin-frontend.feature b/docs/lineage/architect/specs/example-app/agent-admin-frontend.feature similarity index 100% rename from architect/specs/example-app/agent-admin-frontend.feature rename to docs/lineage/architect/specs/example-app/agent-admin-frontend.feature diff --git a/architect/specs/platform/admin-tooling-consolidation.feature b/docs/lineage/architect/specs/platform/admin-tooling-consolidation.feature similarity index 100% rename from architect/specs/platform/admin-tooling-consolidation.feature rename to docs/lineage/architect/specs/platform/admin-tooling-consolidation.feature diff --git a/architect/specs/platform/agent-bc-component-isolation.feature b/docs/lineage/architect/specs/platform/agent-bc-component-isolation.feature similarity index 100% rename from architect/specs/platform/agent-bc-component-isolation.feature rename to docs/lineage/architect/specs/platform/agent-bc-component-isolation.feature diff --git a/architect/specs/platform/agent-command-infrastructure.feature b/docs/lineage/architect/specs/platform/agent-command-infrastructure.feature similarity index 100% rename from architect/specs/platform/agent-command-infrastructure.feature rename to docs/lineage/architect/specs/platform/agent-command-infrastructure.feature diff --git a/architect/specs/platform/agent-llm-integration.feature b/docs/lineage/architect/specs/platform/agent-llm-integration.feature similarity index 100% rename from architect/specs/platform/agent-llm-integration.feature rename to docs/lineage/architect/specs/platform/agent-llm-integration.feature diff --git a/architect/specs/platform/circuit-breaker-pattern.feature b/docs/lineage/architect/specs/platform/circuit-breaker-pattern.feature similarity index 100% rename from architect/specs/platform/circuit-breaker-pattern.feature rename to docs/lineage/architect/specs/platform/circuit-breaker-pattern.feature diff --git a/architect/specs/platform/component-boundary-authentication-convention.feature b/docs/lineage/architect/specs/platform/component-boundary-authentication-convention.feature similarity index 100% rename from architect/specs/platform/component-boundary-authentication-convention.feature rename to docs/lineage/architect/specs/platform/component-boundary-authentication-convention.feature diff --git a/architect/specs/platform/confirmed-order-cancellation.feature b/docs/lineage/architect/specs/platform/confirmed-order-cancellation.feature similarity index 100% rename from architect/specs/platform/confirmed-order-cancellation.feature rename to docs/lineage/architect/specs/platform/confirmed-order-cancellation.feature diff --git a/architect/specs/platform/deterministic-id-hashing.feature b/docs/lineage/architect/specs/platform/deterministic-id-hashing.feature similarity index 100% rename from architect/specs/platform/deterministic-id-hashing.feature rename to docs/lineage/architect/specs/platform/deterministic-id-hashing.feature diff --git a/architect/specs/platform/event-correctness-migration.feature b/docs/lineage/architect/specs/platform/event-correctness-migration.feature similarity index 100% rename from architect/specs/platform/event-correctness-migration.feature rename to docs/lineage/architect/specs/platform/event-correctness-migration.feature diff --git a/architect/specs/platform/health-observability.feature b/docs/lineage/architect/specs/platform/health-observability.feature similarity index 100% rename from architect/specs/platform/health-observability.feature rename to docs/lineage/architect/specs/platform/health-observability.feature diff --git a/architect/specs/platform/integration-patterns-21a.feature b/docs/lineage/architect/specs/platform/integration-patterns-21a.feature similarity index 100% rename from architect/specs/platform/integration-patterns-21a.feature rename to docs/lineage/architect/specs/platform/integration-patterns-21a.feature diff --git a/architect/specs/platform/integration-patterns-21b.feature b/docs/lineage/architect/specs/platform/integration-patterns-21b.feature similarity index 100% rename from architect/specs/platform/integration-patterns-21b.feature rename to docs/lineage/architect/specs/platform/integration-patterns-21b.feature diff --git a/architect/specs/platform/package-architecture.feature b/docs/lineage/architect/specs/platform/package-architecture.feature similarity index 100% rename from architect/specs/platform/package-architecture.feature rename to docs/lineage/architect/specs/platform/package-architecture.feature diff --git a/architect/specs/platform/production-hardening.feature b/docs/lineage/architect/specs/platform/production-hardening.feature similarity index 100% rename from architect/specs/platform/production-hardening.feature rename to docs/lineage/architect/specs/platform/production-hardening.feature diff --git a/architect/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.feature b/docs/lineage/architect/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.feature similarity index 100% rename from architect/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.feature rename to docs/lineage/architect/specs/platform/tranche-0-readiness-harness-and-dependency-hardening.feature diff --git a/architect/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.feature b/docs/lineage/architect/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.feature similarity index 100% rename from architect/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.feature rename to docs/lineage/architect/specs/platform/tranche-0-release-ci-and-docs-process-guardrails.feature diff --git a/architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature b/docs/lineage/architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature similarity index 100% rename from architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature rename to docs/lineage/architect/specs/platform/tranche-1-supporting-security-and-contract-sweep.feature diff --git a/architect/specs/test-content-blocks.feature b/docs/lineage/architect/specs/test-content-blocks.feature similarity index 100% rename from architect/specs/test-content-blocks.feature rename to docs/lineage/architect/specs/test-content-blocks.feature diff --git a/architect/specs/themed-decision-architecture.feature b/docs/lineage/architect/specs/themed-decision-architecture.feature similarity index 100% rename from architect/specs/themed-decision-architecture.feature rename to docs/lineage/architect/specs/themed-decision-architecture.feature diff --git a/architect/src/phases/_archive/README.md b/docs/lineage/architect/src/phases/_archive/README.md similarity index 100% rename from architect/src/phases/_archive/README.md rename to docs/lineage/architect/src/phases/_archive/README.md diff --git a/architect/src/phases/_archive/v0.1.0/phase-01-foundation.ts b/docs/lineage/architect/src/phases/_archive/v0.1.0/phase-01-foundation.ts similarity index 100% rename from architect/src/phases/_archive/v0.1.0/phase-01-foundation.ts rename to docs/lineage/architect/src/phases/_archive/v0.1.0/phase-01-foundation.ts diff --git a/architect/stubs/agent-action-handler/action-handler.ts b/docs/lineage/architect/stubs/agent-action-handler/action-handler.ts similarity index 100% rename from architect/stubs/agent-action-handler/action-handler.ts rename to docs/lineage/architect/stubs/agent-action-handler/action-handler.ts diff --git a/architect/stubs/agent-action-handler/agent-subscription.ts b/docs/lineage/architect/stubs/agent-action-handler/agent-subscription.ts similarity index 100% rename from architect/stubs/agent-action-handler/agent-subscription.ts rename to docs/lineage/architect/stubs/agent-action-handler/agent-subscription.ts diff --git a/architect/stubs/agent-action-handler/event-subscription-types.ts b/docs/lineage/architect/stubs/agent-action-handler/event-subscription-types.ts similarity index 100% rename from architect/stubs/agent-action-handler/event-subscription-types.ts rename to docs/lineage/architect/stubs/agent-action-handler/event-subscription-types.ts diff --git a/architect/stubs/agent-action-handler/eventbus-publish-update.ts b/docs/lineage/architect/stubs/agent-action-handler/eventbus-publish-update.ts similarity index 100% rename from architect/stubs/agent-action-handler/eventbus-publish-update.ts rename to docs/lineage/architect/stubs/agent-action-handler/eventbus-publish-update.ts diff --git a/architect/stubs/agent-action-handler/oncomplete-handler.ts b/docs/lineage/architect/stubs/agent-action-handler/oncomplete-handler.ts similarity index 100% rename from architect/stubs/agent-action-handler/oncomplete-handler.ts rename to docs/lineage/architect/stubs/agent-action-handler/oncomplete-handler.ts diff --git a/architect/stubs/agent-command-routing/agent-bc-config.ts b/docs/lineage/architect/stubs/agent-command-routing/agent-bc-config.ts similarity index 100% rename from architect/stubs/agent-command-routing/agent-bc-config.ts rename to docs/lineage/architect/stubs/agent-command-routing/agent-bc-config.ts diff --git a/architect/stubs/agent-command-routing/command-bridge.ts b/docs/lineage/architect/stubs/agent-command-routing/command-bridge.ts similarity index 100% rename from architect/stubs/agent-command-routing/command-bridge.ts rename to docs/lineage/architect/stubs/agent-command-routing/command-bridge.ts diff --git a/architect/stubs/agent-command-routing/command-router.ts b/docs/lineage/architect/stubs/agent-command-routing/command-router.ts similarity index 100% rename from architect/stubs/agent-command-routing/command-router.ts rename to docs/lineage/architect/stubs/agent-command-routing/command-router.ts diff --git a/architect/stubs/agent-command-routing/pattern-executor.ts b/docs/lineage/architect/stubs/agent-command-routing/pattern-executor.ts similarity index 100% rename from architect/stubs/agent-command-routing/pattern-executor.ts rename to docs/lineage/architect/stubs/agent-command-routing/pattern-executor.ts diff --git a/architect/stubs/agent-command-routing/pattern-registry.ts b/docs/lineage/architect/stubs/agent-command-routing/pattern-registry.ts similarity index 100% rename from architect/stubs/agent-command-routing/pattern-registry.ts rename to docs/lineage/architect/stubs/agent-command-routing/pattern-registry.ts diff --git a/architect/stubs/agent-component-isolation/component/approvals.ts b/docs/lineage/architect/stubs/agent-component-isolation/component/approvals.ts similarity index 100% rename from architect/stubs/agent-component-isolation/component/approvals.ts rename to docs/lineage/architect/stubs/agent-component-isolation/component/approvals.ts diff --git a/architect/stubs/agent-component-isolation/component/audit.ts b/docs/lineage/architect/stubs/agent-component-isolation/component/audit.ts similarity index 100% rename from architect/stubs/agent-component-isolation/component/audit.ts rename to docs/lineage/architect/stubs/agent-component-isolation/component/audit.ts diff --git a/architect/stubs/agent-component-isolation/component/checkpoints.ts b/docs/lineage/architect/stubs/agent-component-isolation/component/checkpoints.ts similarity index 100% rename from architect/stubs/agent-component-isolation/component/checkpoints.ts rename to docs/lineage/architect/stubs/agent-component-isolation/component/checkpoints.ts diff --git a/architect/stubs/agent-component-isolation/component/commands.ts b/docs/lineage/architect/stubs/agent-component-isolation/component/commands.ts similarity index 100% rename from architect/stubs/agent-component-isolation/component/commands.ts rename to docs/lineage/architect/stubs/agent-component-isolation/component/commands.ts diff --git a/architect/stubs/agent-component-isolation/component/convex.config.ts b/docs/lineage/architect/stubs/agent-component-isolation/component/convex.config.ts similarity index 100% rename from architect/stubs/agent-component-isolation/component/convex.config.ts rename to docs/lineage/architect/stubs/agent-component-isolation/component/convex.config.ts diff --git a/architect/stubs/agent-component-isolation/component/deadLetters.ts b/docs/lineage/architect/stubs/agent-component-isolation/component/deadLetters.ts similarity index 100% rename from architect/stubs/agent-component-isolation/component/deadLetters.ts rename to docs/lineage/architect/stubs/agent-component-isolation/component/deadLetters.ts diff --git a/architect/stubs/agent-component-isolation/component/schema.ts b/docs/lineage/architect/stubs/agent-component-isolation/component/schema.ts similarity index 100% rename from architect/stubs/agent-component-isolation/component/schema.ts rename to docs/lineage/architect/stubs/agent-component-isolation/component/schema.ts diff --git a/architect/stubs/agent-component-isolation/cross-bc-query.ts b/docs/lineage/architect/stubs/agent-component-isolation/cross-bc-query.ts similarity index 100% rename from architect/stubs/agent-component-isolation/cross-bc-query.ts rename to docs/lineage/architect/stubs/agent-component-isolation/cross-bc-query.ts diff --git a/architect/stubs/agent-lifecycle-fsm/checkpoint-status-extension.ts b/docs/lineage/architect/stubs/agent-lifecycle-fsm/checkpoint-status-extension.ts similarity index 100% rename from architect/stubs/agent-lifecycle-fsm/checkpoint-status-extension.ts rename to docs/lineage/architect/stubs/agent-lifecycle-fsm/checkpoint-status-extension.ts diff --git a/architect/stubs/agent-lifecycle-fsm/lifecycle-audit-events.ts b/docs/lineage/architect/stubs/agent-lifecycle-fsm/lifecycle-audit-events.ts similarity index 100% rename from architect/stubs/agent-lifecycle-fsm/lifecycle-audit-events.ts rename to docs/lineage/architect/stubs/agent-lifecycle-fsm/lifecycle-audit-events.ts diff --git a/architect/stubs/agent-lifecycle-fsm/lifecycle-command-handlers.ts b/docs/lineage/architect/stubs/agent-lifecycle-fsm/lifecycle-command-handlers.ts similarity index 100% rename from architect/stubs/agent-lifecycle-fsm/lifecycle-command-handlers.ts rename to docs/lineage/architect/stubs/agent-lifecycle-fsm/lifecycle-command-handlers.ts diff --git a/architect/stubs/agent-lifecycle-fsm/lifecycle-command-types.ts b/docs/lineage/architect/stubs/agent-lifecycle-fsm/lifecycle-command-types.ts similarity index 100% rename from architect/stubs/agent-lifecycle-fsm/lifecycle-command-types.ts rename to docs/lineage/architect/stubs/agent-lifecycle-fsm/lifecycle-command-types.ts diff --git a/architect/stubs/agent-lifecycle-fsm/lifecycle-fsm.ts b/docs/lineage/architect/stubs/agent-lifecycle-fsm/lifecycle-fsm.ts similarity index 100% rename from architect/stubs/agent-lifecycle-fsm/lifecycle-fsm.ts rename to docs/lineage/architect/stubs/agent-lifecycle-fsm/lifecycle-fsm.ts diff --git a/architect/stubs/integration-patterns/patterns.ts b/docs/lineage/architect/stubs/integration-patterns/patterns.ts similarity index 100% rename from architect/stubs/integration-patterns/patterns.ts rename to docs/lineage/architect/stubs/integration-patterns/patterns.ts diff --git a/architect/stubs/production-hardening/monitoring-stubs.ts b/docs/lineage/architect/stubs/production-hardening/monitoring-stubs.ts similarity index 100% rename from architect/stubs/production-hardening/monitoring-stubs.ts rename to docs/lineage/architect/stubs/production-hardening/monitoring-stubs.ts diff --git a/architect/tsconfig.json b/docs/lineage/architect/tsconfig.json similarity index 100% rename from architect/tsconfig.json rename to docs/lineage/architect/tsconfig.json diff --git a/scripts/migrate-architect-corpus.mjs b/scripts/migrate-architect-corpus.mjs index a12c4159..8cda5c6c 100644 --- a/scripts/migrate-architect-corpus.mjs +++ b/scripts/migrate-architect-corpus.mjs @@ -10,7 +10,7 @@ import path from "node:path"; const ROOT = path.resolve(import.meta.dirname, ".."); const DRY_RUN = process.argv.includes("--dry-run"); -const ARCHITECT = path.join(ROOT, "architect"); +const ARCHITECT = path.join(ROOT, "docs", "lineage", "architect"); /** @param {string} name */ function toKebab(name) { diff --git a/scripts/migrate-scenarios-and-unimplemented.mjs b/scripts/migrate-scenarios-and-unimplemented.mjs index 4859976c..838c8147 100644 --- a/scripts/migrate-scenarios-and-unimplemented.mjs +++ b/scripts/migrate-scenarios-and-unimplemented.mjs @@ -219,7 +219,7 @@ for (const rootName of ["packages", "examples", "apps"]) { } // --- architect scenarios (design / often unimplemented) --- -for (const filePath of walk(path.join(ROOT, "architect"), (p, name) => +for (const filePath of walk(path.join(ROOT, "docs", "lineage", "architect"), (p, name) => name.endsWith(".feature"), ).sort()) { const stem = path.basename(filePath, ".feature"); @@ -229,7 +229,7 @@ for (const filePath of walk(path.join(ROOT, "architect"), (p, name) => } // --- pending deliverable rows --- -for (const filePath of walk(path.join(ROOT, "architect"), (p, name) => +for (const filePath of walk(path.join(ROOT, "docs", "lineage", "architect"), (p, name) => name.endsWith(".feature"), ).sort()) { const stem = path.basename(filePath, ".feature"); diff --git a/test/sdp-migration-guard.test.ts b/test/sdp-migration-guard.test.ts index f7268c2c..707c2e74 100644 --- a/test/sdp-migration-guard.test.ts +++ b/test/sdp-migration-guard.test.ts @@ -80,6 +80,10 @@ describe("SDP migration guard", () => { expect(withGwt.length).toBeGreaterThanOrEqual(2000); expect(existsSync(join(ROOT, "specs", "unimplemented"))).toBe(true); + // Live architect/ is a pointer; Gherkin corpus was relocated to lineage. + expect(existsSync(join(ROOT, "architect", "specs"))).toBe(false); + expect(existsSync(join(ROOT, "docs", "lineage", "architect"))).toBe(true); + const bindings = join(specsRoot, "platform", "sdp-bindings.ts"); expect(existsSync(bindings)).toBe(true); const bindingsText = readFileSync(bindings, "utf8"); From 04f1ac347c0e5cde77de34ac5a2dd924141ad770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darko=20Miji=C4=87?= Date: Thu, 20 Aug 2026 02:55:46 +0200 Subject: [PATCH 6/6] prune mechanical per-scenario spec mirrors, keep authored behavior examples Delete 3,378 low-value SDP carriers: title-echo example mirrors of unit-level Gherkin scenarios (platform-* and order-management deciders), all architect-scenario stubs, and docs-living status dumps under specs/unimplemented/{current,remaining}. Feature files remain the executable carriers; example Specs are kept only for user-facing frontend flows and cross-component order-management business flows (103 examples). Revert readiness to idea on parents whose only evidence was pruned, relax the migration-guard thresholds, and finish the protocol upgrade pass (verifies relations, authored outcomes) across the surviving corpus. Co-authored-by: Cursor --- .grok/workflows/migrate-specs-to-sdp.rhai | 323 ++++++++++++++++++ Justfile | 138 ++++++++ scripts/sdp-honesty-repair.mjs | 223 ++++++++++++ scripts/sdp-protocol-migrate.mjs | 289 ++++++++++++++++ scripts/sdp-prune-low-value.mjs | 86 +++++ specs/README.md | 8 +- .../s-001-add-stock-successfully.sdp.md | 18 +- .../s-002-add-stock-with-reason.sdp.md | 14 +- ...add-stock-without-selecting-product.sdp.md | 15 +- .../s-004-cannot-add-zero-quantity.sdp.md | 15 +- ...5-cannot-add-stock-without-quantity.sdp.md | 5 +- .../behavior/frontend/admin/add-stock.sdp.md | 4 +- ...ts-dashboard-with-pending-approvals.sdp.md | 5 +- ...dashboard-with-no-pending-approvals.sdp.md | 5 +- ...e-to-approval-detail-from-dashboard.sdp.md | 5 +- ...pproval-list-with-pending-approvals.sdp.md | 5 +- .../s-005-filter-approvals-by-status.sdp.md | 5 +- ...approval-card-to-navigate-to-detail.sdp.md | 5 +- .../s-007-view-pending-approval-detail.sdp.md | 5 +- ...-008-view-already-approved-approval.sdp.md | 5 +- ...-009-view-already-rejected-approval.sdp.md | 5 +- .../s-010-view-expired-approval.sdp.md | 5 +- ...-conveyed-via-text-label-wcag-1-4-1.sdp.md | 5 +- ...12-approve-pending-action-with-note.sdp.md | 5 +- ...013-reject-pending-action-with-note.sdp.md | 5 +- .../s-014-approve-without-note.sdp.md | 5 +- .../s-015-error-during-approve-action.sdp.md | 5 +- ...016-cannot-act-on-expired-approvals.sdp.md | 5 +- ...iew-active-agents-in-monitoring-tab.sdp.md | 5 +- ...s-018-view-agent-checkpoint-details.sdp.md | 5 +- .../s-019-no-active-agents.sdp.md | 5 +- .../s-020-view-agent-decision-history.sdp.md | 5 +- ...view-decision-detail-with-reasoning.sdp.md | 5 +- .../s-022-empty-decision-history.sdp.md | 5 +- ...stomers-approaching-churn-threshold.sdp.md | 5 +- ...24-customer-risk-progress-indicator.sdp.md | 5 +- ...-no-customers-approaching-threshold.sdp.md | 5 +- ...o-low-stock-restock-approval-detail.sdp.md | 5 +- ...alert-approval-with-product-context.sdp.md | 5 +- ...pprove-low-stock-restock-suggestion.sdp.md | 5 +- ...reject-low-stock-restock-suggestion.sdp.md | 5 +- ...ue-order-vip-review-approval-detail.sdp.md | 5 +- ...e-order-approval-with-order-context.sdp.md | 5 +- ...ove-vip-review-for-high-value-order.sdp.md | 5 +- .../s-033-reject-vip-review-flag.sdp.md | 5 +- ...lidation-suggestion-approval-detail.sdp.md | 5 +- ...solidation-approval-with-order-list.sdp.md | 5 +- ...rove-order-consolidation-suggestion.sdp.md | 5 +- ...ject-order-consolidation-suggestion.sdp.md | 5 +- ...sion-history-filtered-by-agent-type.sdp.md | 5 +- ...low-stock-agent-decision-in-history.sdp.md | 5 +- ...lue-order-agent-decision-in-history.sdp.md | 5 +- ...olidation-agent-decision-in-history.sdp.md | 5 +- ...cts-approaching-low-stock-threshold.sdp.md | 5 +- ...-043-stock-level-progress-indicator.sdp.md | 5 +- ...pproval-card-is-keyboard-accessible.sdp.md | 5 +- ...der-announces-action-status-changes.sdp.md | 5 +- ...el-conveyed-via-text-not-just-color.sdp.md | 5 +- .../s-047-focus-trap-in-action-buttons.sdp.md | 5 +- .../s-048-handle-approval-not-found.sdp.md | 5 +- ...dle-network-error-loading-approvals.sdp.md | 5 +- .../s-050-route-level-error-boundary.sdp.md | 5 +- .../frontend/admin/agent-approvals.sdp.md | 4 +- .../s-001-create-product-successfully.sdp.md | 17 +- ...002-validation-errors-on-empty-form.sdp.md | 16 +- .../s-003-invalid-sku-format.sdp.md | 14 +- .../s-004-invalid-price-zero-value.sdp.md | 13 +- ...s-005-invalid-price-exceeds-maximum.sdp.md | 5 +- .../frontend/admin/create-product.sdp.md | 4 +- .../s-001-view-dashboard-stats.sdp.md | 5 +- .../s-002-show-low-stock-warning.sdp.md | 5 +- ...ck-action-navigates-to-create-order.sdp.md | 5 +- .../frontend/dashboard/dashboard.sdp.md | 6 +- ...duct-creation-to-order-confirmation.sdp.md | 7 +- ...nsufficient-stock-saga-compensation.sdp.md | 7 +- .../s-003-order-with-multiple-items.sdp.md | 7 +- ...ly-when-one-product-lacks-stock-dcb.sdp.md | 7 +- ...rigger-journey-churn-risk-detection.sdp.md | 7 +- ...r-journey-low-stock-alert-detection.sdp.md | 7 +- ...-journey-high-value-order-detection.sdp.md | 7 +- ...rney-order-consolidation-suggestion.sdp.md | 7 +- .../e2e-journeys/full-order-journey.sdp.md | 4 +- ...reate-and-submit-order-successfully.sdp.md | 19 +- .../s-002-cannot-submit-empty-cart.sdp.md | 14 +- .../s-003-update-quantity-in-cart.sdp.md | 13 +- .../s-004-remove-item-from-cart.sdp.md | 5 +- .../frontend/orders/create-order.sdp.md | 4 +- .../s-001-view-confirmed-order.sdp.md | 5 +- .../s-002-view-cancelled-order.sdp.md | 5 +- ...tus-updates-via-reactive-projection.sdp.md | 7 +- .../s-004-cancel-a-submitted-order.sdp.md | 7 +- ...pears-only-for-cancellable-statuses.sdp.md | 5 +- ...og-prevents-accidental-cancellation.sdp.md | 7 +- .../frontend/orders/order-detail.sdp.md | 4 +- .../s-001-view-all-orders.sdp.md | 5 +- .../s-002-navigate-to-create-order.sdp.md | 5 +- .../frontend/orders/view-orders.sdp.md | 4 +- ...001-view-products-with-stock-levels.sdp.md | 5 +- .../s-002-loading-state.sdp.md | 5 +- .../frontend/products/browse-products.sdp.md | 18 +- specs/behavior/order-management/_epic.sdp.md | 2 +- .../s-001-no-dead-letter-on-success.sdp.md | 20 -- .../s-002-no-dead-letter-on-canceled.sdp.md | 19 -- ...-003-creates-dead-letter-on-failure.sdp.md | 20 -- ...s-attempt-count-on-repeated-failure.sdp.md | 21 -- ...pdate-dead-letter-in-terminal-state.sdp.md | 21 -- ...cron-expires-approval-after-timeout.sdp.md | 20 -- ...expired-approval-cannot-be-approved.sdp.md | 19 -- ...tes-outreach-record-and-emits-event.sdp.md | 21 -- .../order-management/agent/on-complete.sdp.md | 2 +- ...1-decide-to-add-item-to-draft-order.sdp.md | 23 -- ...add-item-when-order-is-not-in-draft.sdp.md | 21 -- ...ject-add-item-with-invalid-quantity.sdp.md | 21 -- ...umulate-items-and-recalculate-total.sdp.md | 22 -- .../deciders/add-order-item-decider.sdp.md | 2 +- ...-001-decide-to-add-stock-to-product.sdp.md | 23 -- .../s-002-add-stock-with-reason.sdp.md | 21 -- ...reject-add-stock-with-zero-quantity.sdp.md | 21 -- ...ct-add-stock-with-negative-quantity.sdp.md | 21 -- .../deciders/add-stock-decider.sdp.md | 2 +- ...-001-decide-to-cancel-a-draft-order.sdp.md | 23 -- ...-decide-to-cancel-a-submitted-order.sdp.md | 22 -- ...-decide-to-cancel-a-confirmed-order.sdp.md | 23 -- ...-cancel-for-already-cancelled-order.sdp.md | 21 -- .../deciders/cancel-order-decider.sdp.md | 16 +- ...decide-to-confirm-a-submitted-order.sdp.md | 23 -- ...t-confirm-for-order-in-draft-status.sdp.md | 21 -- ...confirm-for-already-confirmed-order.sdp.md | 21 -- ...-reject-confirm-for-cancelled-order.sdp.md | 21 -- .../deciders/confirm-order-decider.sdp.md | 16 +- ...de-to-confirm-a-pending-reservation.sdp.md | 22 -- ...en-reservation-is-already-confirmed.sdp.md | 21 -- ...onfirm-when-reservation-is-released.sdp.md | 21 -- ...confirm-when-reservation-is-expired.sdp.md | 21 -- ...tion-has-passed-its-expiration-time.sdp.md | 21 -- .../confirm-reservation-decider.sdp.md | 16 +- ...create-a-new-order-when-none-exists.sdp.md | 22 -- ...ct-create-when-order-already-exists.sdp.md | 21 -- .../deciders/create-order-decider.sdp.md | 16 +- ...eate-a-new-product-when-none-exists.sdp.md | 22 -- ...-create-when-product-already-exists.sdp.md | 21 -- ...ject-create-with-empty-product-name.sdp.md | 21 -- .../s-004-reject-create-with-empty-sku.sdp.md | 21 -- ...s-005-reject-create-with-zero-price.sdp.md | 21 -- ...6-reject-create-with-negative-price.sdp.md | 21 -- .../deciders/create-product-decider.sdp.md | 19 +- ...ding-reservation-that-has-timed-out.sdp.md | 22 -- ...n-reservation-has-not-timed-out-yet.sdp.md | 21 -- ...en-reservation-is-already-confirmed.sdp.md | 21 -- ...hen-reservation-is-already-released.sdp.md | 21 -- ...when-reservation-is-already-expired.sdp.md | 21 -- .../expire-reservation-decider.sdp.md | 16 +- ...ll-state-with-product-created-event.sdp.md | 26 -- ...entory-state-with-stock-added-event.sdp.md | 21 -- ...03-evolve-inventory-from-zero-stock.sdp.md | 20 -- ...ory-state-with-stock-reserved-event.sdp.md | 21 -- ...ate-when-product-not-in-reservation.sdp.md | 21 -- ...-reservation-failed-event-no-change.sdp.md | 21 -- .../deciders/inventory-evolve.sdp.md | 2 +- ...eated-evolves-null-to-initial-state.sdp.md | 24 -- ...m-added-appends-item-to-empty-order.sdp.md | 22 -- ...ded-accumulates-with-existing-items.sdp.md | 21 -- ...oved-removes-item-and-updates-total.sdp.md | 21 -- ...bmitted-changes-status-to-submitted.sdp.md | 20 -- ...nfirmed-changes-status-to-confirmed.sdp.md | 20 -- ...nges-status-from-draft-to-cancelled.sdp.md | 20 -- ...-status-from-submitted-to-cancelled.sdp.md | 20 -- ...-status-from-confirmed-to-cancelled.sdp.md | 20 -- .../deciders/order-evolve.sdp.md | 2 +- ...de-to-release-a-pending-reservation.sdp.md | 23 -- ...-to-release-a-confirmed-reservation.sdp.md | 22 -- ...hen-reservation-is-already-released.sdp.md | 21 -- ...release-when-reservation-is-expired.sdp.md | 21 -- .../release-reservation-decider.sdp.md | 16 +- ...move-existing-item-from-draft-order.sdp.md | 23 -- ...ove-item-when-order-is-not-in-draft.sdp.md | 21 -- ...ect-remove-when-item-does-not-exist.sdp.md | 21 -- .../deciders/remove-order-item-decider.sdp.md | 18 +- ...on-state-with-reservation-confirmed.sdp.md | 21 -- ...servation-with-reservation-released.sdp.md | 20 -- ...servation-with-reservation-released.sdp.md | 20 -- ...eservation-with-reservation-expired.sdp.md | 20 -- .../deciders/reservation-evolve.sdp.md | 2 +- ...oducts-have-sufficient-availability.sdp.md | 23 -- ...-one-product-has-insufficient-stock.sdp.md | 22 -- ...rvation-when-product-does-not-exist.sdp.md | 21 -- ...reject-reservation-with-empty-items.sdp.md | 21 -- .../deciders/reserve-stock-decider.sdp.md | 2 +- ...de-to-submit-draft-order-with-items.sdp.md | 23 -- ...ubmit-for-order-not-in-draft-status.sdp.md | 21 -- ...ject-submit-for-order-with-no-items.sdp.md | 21 -- .../deciders/submit-order-decider.sdp.md | 17 +- ...fully-add-stock-to-existing-product.sdp.md | 22 -- ...tock-to-product-with-existing-stock.sdp.md | 20 -- ...t-add-stock-to-non-existent-product.sdp.md | 20 -- ...-is-idempotent-with-same-command-id.sdp.md | 20 -- .../inventory/add-stock.sdp.md | 2 +- ...ssfully-confirm-pending-reservation.sdp.md | 21 -- ...ot-confirm-non-existent-reservation.sdp.md | 20 -- ...nfirm-already-confirmed-reservation.sdp.md | 20 -- ...-is-idempotent-with-same-command-id.sdp.md | 20 -- .../inventory/confirm-reservation.sdp.md | 2 +- ...1-successfully-create-a-new-product.sdp.md | 20 -- ...not-create-product-with-existing-id.sdp.md | 20 -- ...-is-idempotent-with-same-command-id.sdp.md | 19 -- .../inventory/create-product.sdp.md | 2 +- ...s-001-sum-of-available-and-reserved.sdp.md | 20 -- ...nly-available-when-reserved-is-zero.sdp.md | 20 -- ...nly-reserved-when-available-is-zero.sdp.md | 20 -- .../s-004-both-quantities-are-zero.sdp.md | 20 -- ...5-cms-fields-match-input-parameters.sdp.md | 19 -- ...ial-quantities-and-version-are-zero.sdp.md | 20 -- ...-timestamps-are-set-to-current-time.sdp.md | 21 -- ...08-current-version-cms-is-unchanged.sdp.md | 21 -- ...9-missing-state-version-is-upgraded.sdp.md | 22 -- .../s-010-version-0-is-upgraded.sdp.md | 21 -- ...-fields-are-preserved-during-upcast.sdp.md | 20 -- .../s-012-future-version-throws-error.sdp.md | 20 -- .../inventory/inventory-domain.sdp.md | 2 +- .../s-001-passes-for-a-valid-product.sdp.md | 19 -- ...ot-found-for-null-product-reference.sdp.md | 19 -- ...und-for-undefined-product-reference.sdp.md | 19 -- ...4-passes-for-null-product-reference.sdp.md | 19 -- ...ses-for-undefined-product-reference.sdp.md | 19 -- ...already-exists-for-existing-product.sdp.md | 20 -- .../s-007-passes-for-standard-sku.sdp.md | 19 -- ...ses-for-sku-with-special-characters.sdp.md | 19 -- ...09-throws-invalid-sku-for-empty-sku.sdp.md | 19 -- ...invalid-sku-for-whitespace-only-sku.sdp.md | 19 -- ...11-passes-for-standard-product-name.sdp.md | 19 -- ...asses-for-product-name-with-numbers.sdp.md | 19 -- ...product-name-for-empty-product-name.sdp.md | 19 -- ...me-for-whitespace-only-product-name.sdp.md | 19 -- ...-015-passes-for-positive-integer-10.sdp.md | 19 -- ...s-016-passes-for-positive-integer-1.sdp.md | 19 -- ...17-throws-invalid-quantity-for-zero.sdp.md | 19 -- ...nvalid-quantity-for-negative-number.sdp.md | 20 -- ...ws-invalid-quantity-for-non-integer.sdp.md | 19 -- ...des-context-string-in-error-message.sdp.md | 19 -- .../inventory/product-invariants.sdp.md | 2 +- ...ssfully-release-pending-reservation.sdp.md | 21 -- ...-reservation-for-order-cancellation.sdp.md | 20 -- ...-is-idempotent-with-same-command-id.sdp.md | 20 -- .../inventory/release-reservation.sdp.md | 2 +- ...item-reservation-returns-count-of-1.sdp.md | 19 -- ...s-reservation-returns-correct-count.sdp.md | 19 -- ...tems-reservation-returns-count-of-0.sdp.md | 19 -- ...items-returns-sum-of-all-quantities.sdp.md | 19 -- ...05-single-item-returns-its-quantity.sdp.md | 19 -- .../s-006-empty-items-returns-0.sdp.md | 19 -- ...correct-reservation-id-and-order-id.sdp.md | 19 -- ...8-initializes-items-array-correctly.sdp.md | 20 -- .../s-009-sets-status-to-pending.sdp.md | 19 -- ...10-sets-expires-at-with-default-ttl.sdp.md | 20 -- .../s-011-supports-custom-ttl.sdp.md | 20 -- .../s-012-initializes-version-to-0.sdp.md | 19 -- ...tializes-with-current-state-version.sdp.md | 19 -- ...and-updated-at-to-current-timestamp.sdp.md | 21 -- ...se-when-reservation-has-not-expired.sdp.md | 19 -- ...s-true-when-reservation-has-expired.sdp.md | 19 -- ...n-is-confirmed-regardless-of-expiry.sdp.md | 19 -- ...on-is-released-regardless-of-expiry.sdp.md | 19 -- ...les-exact-expiry-boundary-correctly.sdp.md | 21 -- ...cms-when-already-at-current-version.sdp.md | 20 -- ...ng-state-version-to-current-version.sdp.md | 20 -- ...22-throws-error-for-future-versions.sdp.md | 19 -- ...-preserves-all-fields-during-upcast.sdp.md | 20 -- .../inventory/reservation-domain.sdp.md | 2 +- ...s-not-throw-when-reservation-exists.sdp.md | 19 -- ...-not-found-when-reservation-is-null.sdp.md | 19 -- ...found-when-reservation-is-undefined.sdp.md | 19 -- ...-not-throw-when-reservation-is-null.sdp.md | 19 -- ...throw-when-reservation-is-undefined.sdp.md | 19 -- ...eady-exists-when-reservation-exists.sdp.md | 20 -- ...s-not-throw-when-items-has-one-item.sdp.md | 19 -- ...throw-when-items-has-multiple-items.sdp.md | 19 -- ...servation-when-items-array-is-empty.sdp.md | 19 -- ...hrow-for-valid-item-with-quantity-5.sdp.md | 19 -- ...-not-throw-for-item-with-quantity-1.sdp.md | 19 -- ...-invalid-quantity-for-zero-quantity.sdp.md | 19 -- ...alid-quantity-for-negative-quantity.sdp.md | 19 -- ...d-quantity-for-non-integer-quantity.sdp.md | 19 -- ...servation-item-for-empty-product-id.sdp.md | 19 -- ...oes-not-throw-for-valid-items-array.sdp.md | 19 -- ...s-empty-reservation-for-empty-array.sdp.md | 19 -- ...-when-one-item-has-invalid-quantity.sdp.md | 19 -- .../s-019-has-correct-name-property.sdp.md | 19 -- .../s-020-has-correct-code-property.sdp.md | 19 -- .../s-021-has-correct-message-property.sdp.md | 19 -- .../s-022-has-correct-context-property.sdp.md | 20 -- .../s-023-can-have-undefined-context.sdp.md | 19 -- .../s-024-is-instance-of-error.sdp.md | 19 -- ...eck-returns-true-for-pending-status.sdp.md | 19 -- ...urns-false-for-non-pending-statuses.sdp.md | 19 -- ...ng-assert-passes-for-pending-status.sdp.md | 19 -- ...servation-not-pending-for-confirmed.sdp.md | 21 -- ...eservation-not-pending-for-released.sdp.md | 19 -- ...-validate-returns-valid-for-pending.sdp.md | 19 -- ...lidate-returns-invalid-for-released.sdp.md | 20 -- ...true-for-pending-with-future-expiry.sdp.md | 19 -- ...true-for-confirmed-with-past-expiry.sdp.md | 19 -- ...-true-for-released-with-past-expiry.sdp.md | 19 -- ...-false-for-pending-with-past-expiry.sdp.md | 19 -- ...sses-for-pending-with-future-expiry.sdp.md | 19 -- ...sses-for-confirmed-with-past-expiry.sdp.md | 19 -- ...eservation-expired-for-pending-with.sdp.md | 21 -- ...s-valid-for-pending-with-future-exp.sdp.md | 19 -- ...s-invalid-for-pending-with-past-exp.sdp.md | 19 -- ...s-true-for-pending-with-past-expiry.sdp.md | 19 -- ...turns-true-for-non-pending-statuses.sdp.md | 19 -- ...alse-for-pending-with-future-expiry.sdp.md | 19 -- ...passes-for-pending-with-past-expiry.sdp.md | 19 -- ...-for-confirmed-regardless-of-expiry.sdp.md | 19 -- ...reservation-not-expired-for-pending.sdp.md | 22 -- ...turns-valid-for-expired-reservation.sdp.md | 19 -- ...s-invalid-for-pending-with-future-e.sdp.md | 21 -- ...ll-returns-true-for-pending-and-not.sdp.md | 19 -- ...l-returns-false-for-confirmed-and-n.sdp.md | 19 -- ...l-returns-false-for-pending-and-exp.sdp.md | 19 -- ...ll-passes-for-pending-and-not-expir.sdp.md | 19 -- ...ll-throws-reservation-not-pending-f.sdp.md | 19 -- ...ll-throws-reservation-expired-for-p.sdp.md | 19 -- ...e-all-returns-valid-for-pending-and.sdp.md | 19 -- ...-all-returns-single-violation-for-c.sdp.md | 20 -- ...e-all-returns-violation-for-pending.sdp.md | 20 -- ...-returns-true-for-pending-and-expir.sdp.md | 19 -- ...-returns-false-for-confirmed-and-ex.sdp.md | 19 -- ...l-returns-false-for-pending-and-not.sdp.md | 19 -- ...-all-passes-for-pending-and-expired.sdp.md | 19 -- ...l-throws-reservation-not-pending-fo.sdp.md | 19 -- ...l-throws-reservation-not-expired-fo.sdp.md | 19 -- ...all-returns-valid-for-pending-and-e.sdp.md | 19 -- ...all-returns-single-violation-for-re.sdp.md | 20 -- ...all-returns-single-violation-for-pe.sdp.md | 20 -- .../inventory/reservation-invariants.sdp.md | 2 +- ...uccessfully-reserve-available-stock.sdp.md | 20 -- ...2-reserve-multiple-items-atomically.sdp.md | 21 -- ...ation-fails-when-insufficient-stock.sdp.md | 20 -- ...-item-reservation-is-all-or-nothing.sdp.md | 21 -- ...cannot-reserve-non-existent-product.sdp.md | 20 -- ...-is-idempotent-with-same-command-id.sdp.md | 20 -- .../inventory/reserve-stock.sdp.md | 2 +- ...001-passes-when-stock-is-sufficient.sdp.md | 19 -- ...requesting-exact-available-quantity.sdp.md | 19 -- ...ient-stock-when-stock-is-not-enough.sdp.md | 22 -- ...sufficient-stock-when-stock-is-zero.sdp.md | 19 -- ...-available-when-stock-is-sufficient.sdp.md | 19 -- ...ilable-when-requesting-exact-amount.sdp.md | 19 -- ...-deficit-when-stock-is-insufficient.sdp.md | 20 -- ...urns-correct-deficit-for-zero-stock.sdp.md | 20 -- .../inventory/stock-invariants.sdp.md | 2 +- ...der-uses-dcb-for-atomic-reservation.sdp.md | 24 -- ...-product-rejects-entire-reservation.sdp.md | 24 -- ...es-concurrent-reservation-conflicts.sdp.md | 24 -- ...duplicate-product-i-ds-are-rejected.sdp.md | 22 -- .../dcb-multi-product-reservation.sdp.md | 2 +- ...ubmitted-includes-customer-snapshot.sdp.md | 23 -- ...ent-does-not-block-order-submission.sdp.md | 23 -- ...omer-snapshot-is-immutable-in-event.sdp.md | 22 -- ...ng-customer-data-handled-gracefully.sdp.md | 23 -- ...e-upcasted-to-v2-with-null-customer.sdp.md | 22 -- ...events-are-not-modified-by-upcaster.sdp.md | 23 -- .../fat-events-order-submitted.sdp.md | 2 +- ...r-detail-view-shows-instant-updates.sdp.md | 23 -- ...rapid-updates-are-applied-correctly.sdp.md | 23 -- ...istic-update-rolls-back-on-conflict.sdp.md | 23 -- ...-event-stream-is-handled-gracefully.sdp.md | 22 -- .../reactive-order-detail.sdp.md | 2 +- ...eference-implementation-designation.sdp.md | 21 -- ...demonstrated-patterns-are-cataloged.sdp.md | 20 -- .../s-003-pattern-links-are-valid.sdp.md | 21 -- ...004-architecture-diagram-is-present.sdp.md | 22 -- .../reference-documentation.sdp.md | 2 +- ...dd-single-item-to-empty-draft-order.sdp.md | 23 -- ...2-add-multiple-items-to-draft-order.sdp.md | 23 -- ...cannot-add-items-to-submitted-order.sdp.md | 20 -- ...cannot-add-items-to-cancelled-order.sdp.md | 20 -- ...-cannot-add-item-with-zero-quantity.sdp.md | 20 -- ...not-add-item-with-negative-quantity.sdp.md | 20 -- ...cannot-add-item-with-negative-price.sdp.md | 20 -- .../order-management/orders/add-items.sdp.md | 2 +- .../s-001-cancel-draft-order.sdp.md | 21 -- .../s-002-cancel-submitted-order.sdp.md | 21 -- ...nnot-cancel-already-cancelled-order.sdp.md | 20 -- .../s-004-cancel-confirmed-order.sdp.md | 21 -- ...05-cannot-cancel-non-existent-order.sdp.md | 20 -- ...-is-idempotent-with-same-command-id.sdp.md | 20 -- .../orders/cancel-order.sdp.md | 2 +- ...cessfully-confirm-a-submitted-order.sdp.md | 21 -- .../s-002-cannot-confirm-a-draft-order.sdp.md | 21 -- ...-confirm-an-already-confirmed-order.sdp.md | 20 -- ...04-cannot-confirm-a-cancelled-order.sdp.md | 20 -- ...cannot-confirm-a-non-existent-order.sdp.md | 20 -- ...-is-idempotent-with-same-command-id.sdp.md | 20 -- .../orders/confirm-order.sdp.md | 2 +- ...001-successfully-create-a-new-order.sdp.md | 20 -- ...annot-create-order-with-existing-id.sdp.md | 20 -- ...-is-idempotent-with-same-command-id.sdp.md | 19 -- .../orders/create-order.sdp.md | 2 +- ...-001-empty-items-array-returns-zero.sdp.md | 19 -- .../s-002-single-item-total.sdp.md | 19 -- .../s-003-multiple-items-total.sdp.md | 19 -- ...antity-results-in-zero-contribution.sdp.md | 19 -- ...-price-results-in-zero-contribution.sdp.md | 19 -- ...ecimal-prices-are-handled-correctly.sdp.md | 19 -- ...e-provided-order-id-and-customer-id.sdp.md | 19 -- ...8-cms-initializes-with-draft-status.sdp.md | 19 -- ...-initializes-with-empty-items-array.sdp.md | 19 -- ...-initializes-with-zero-total-amount.sdp.md | 19 -- ...-011-cms-initializes-with-version-0.sdp.md | 19 -- ...tializes-with-current-state-version.sdp.md | 19 -- ...and-updated-at-to-current-timestamp.sdp.md | 21 -- ...rrent-version-is-returned-unchanged.sdp.md | 20 -- ...h-missing-state-version-is-upgraded.sdp.md | 20 -- ...ms-with-state-version-0-is-upgraded.sdp.md | 23 -- ...-fields-are-preserved-during-upcast.sdp.md | 21 -- .../orders/order-domain.sdp.md | 2 +- ...rns-true-for-draft-order-with-items.sdp.md | 19 -- ...alse-for-non-draft-order-with-items.sdp.md | 19 -- ...false-for-draft-order-without-items.sdp.md | 19 -- ...ow-for-valid-draft-order-with-items.sdp.md | 19 -- ...draft-for-submitted-order-fail-fast.sdp.md | 19 -- ...items-for-draft-order-with-no-items.sdp.md | 19 -- ...d-result-for-draft-order-with-items.sdp.md | 19 -- ...s-for-submitted-order-with-no-items.sdp.md | 20 -- ...ue-for-draft-order-under-item-limit.sdp.md | 19 -- ...l-returns-false-for-non-draft-order.sdp.md | 19 -- ...lse-for-draft-order-at-max-capacity.sdp.md | 19 -- ...w-for-valid-draft-order-under-limit.sdp.md | 19 -- ...draft-for-submitted-order-fail-fast.sdp.md | 19 -- ...xceeded-for-draft-order-at-capacity.sdp.md | 19 -- ...-result-for-draft-order-under-limit.sdp.md | 19 -- ...ons-for-submitted-order-at-capacity.sdp.md | 20 -- ...l-returns-expected-for-status-order.sdp.md | 19 -- ...-all-does-not-throw-for-draft-order.sdp.md | 19 -- ...-does-not-throw-for-submitted-order.sdp.md | 19 -- ...ready-confirmed-for-confirmed-order.sdp.md | 19 -- ...ready-cancelled-for-cancelled-order.sdp.md | 19 -- ...eturns-valid-result-for-draft-order.sdp.md | 19 -- ...ingle-violation-for-confirmed-order.sdp.md | 20 -- ...ingle-violation-for-cancelled-order.sdp.md | 20 -- .../orders/order-invariant-sets.sdp.md | 2 +- .../s-001-passes-for-a-valid-order.sdp.md | 19 -- ...-not-found-for-null-order-reference.sdp.md | 19 -- ...found-for-undefined-order-reference.sdp.md | 19 -- ...004-passes-for-null-order-reference.sdp.md | 19 -- ...asses-for-undefined-order-reference.sdp.md | 19 -- ...r-already-exists-for-existing-order.sdp.md | 20 -- ...-check-returns-true-for-draft-order.sdp.md | 19 -- ...k-returns-false-for-submitted-order.sdp.md | 19 -- ...s-009-assert-passes-for-draft-order.sdp.md | 19 -- ...not-in-draft-for-non-draft-statuses.sdp.md | 20 -- ...ck-returns-true-for-submitted-order.sdp.md | 19 -- ...check-returns-false-for-draft-order.sdp.md | 19 -- ...3-assert-passes-for-submitted-order.sdp.md | 19 -- ...ubmitted-for-non-submitted-statuses.sdp.md | 19 -- ...-check-returns-true-for-draft-order.sdp.md | 19 -- ...ck-returns-true-for-submitted-order.sdp.md | 19 -- ...k-returns-false-for-cancelled-order.sdp.md | 19 -- ...asses-for-draft-order-not-cancelled.sdp.md | 19 -- ...s-for-confirmed-order-not-cancelled.sdp.md | 19 -- ...ready-cancelled-for-cancelled-order.sdp.md | 20 -- ...-true-for-draft-order-not-confirmed.sdp.md | 19 -- ...e-for-submitted-order-not-confirmed.sdp.md | 19 -- ...k-returns-false-for-confirmed-order.sdp.md | 19 -- ...asses-for-draft-order-not-confirmed.sdp.md | 19 -- ...s-for-cancelled-order-not-confirmed.sdp.md | 19 -- ...ready-confirmed-for-confirmed-order.sdp.md | 20 -- ...k-returns-true-when-order-has-items.sdp.md | 19 -- ...turns-false-when-order-has-no-items.sdp.md | 19 -- ...-assert-passes-when-order-has-items.sdp.md | 19 -- ...asses-when-order-has-multiple-items.sdp.md | 19 -- ...-order-has-no-items-for-empty-order.sdp.md | 20 -- ...-true-when-order-has-room-for-items.sdp.md | 19 -- ...false-when-order-is-at-max-capacity.sdp.md | 19 -- ...asses-when-order-has-room-for-items.sdp.md | 19 -- ...hen-order-is-one-under-max-capacity.sdp.md | 19 -- ...-max-items-exceeded-at-max-capacity.sdp.md | 20 -- ...37-passes-when-item-exists-in-order.sdp.md | 19 -- ...038-passes-when-item-is-one-of-many.sdp.md | 19 -- ...-not-found-when-item-does-not-exist.sdp.md | 21 -- ...not-found-when-items-array-is-empty.sdp.md | 19 -- .../s-041-passes-for-valid-item.sdp.md | 19 -- ...-passes-for-item-with-decimal-price.sdp.md | 19 -- ...-for-item-with-zero-price-free-item.sdp.md | 19 -- ...alid-quantity-for-negative-quantity.sdp.md | 19 -- ...-invalid-quantity-for-zero-quantity.sdp.md | 19 -- ...d-quantity-for-non-integer-quantity.sdp.md | 19 -- ...ws-invalid-price-for-negative-price.sdp.md | 19 -- ...alid-item-data-for-empty-product-id.sdp.md | 19 -- ...id-item-data-for-empty-product-name.sdp.md | 19 -- ...050-error-has-correct-name-property.sdp.md | 19 -- ...051-error-has-correct-code-property.sdp.md | 19 -- ...-error-has-correct-message-property.sdp.md | 19 -- ...-error-has-correct-context-property.sdp.md | 19 -- ...54-error-can-have-undefined-context.sdp.md | 19 -- ...s-055-error-is-an-instance-of-error.sdp.md | 19 -- .../orders/order-invariants.sdp.md | 2 +- ...rom-draft-order-with-multiple-items.sdp.md | 23 -- ...2-remove-last-item-from-draft-order.sdp.md | 23 -- ...ot-remove-item-from-submitted-order.sdp.md | 21 -- ...ot-remove-item-from-cancelled-order.sdp.md | 21 -- ...ot-remove-item-from-confirmed-order.sdp.md | 21 -- ...006-cannot-remove-non-existent-item.sdp.md | 21 -- ...-is-idempotent-with-same-command-id.sdp.md | 23 -- .../orders/remove-order-item.sdp.md | 2 +- ...uccessfully-submit-order-with-items.sdp.md | 13 +- .../s-002-cannot-submit-empty-order.sdp.md | 13 +- .../orders/submit-order.sdp.md | 19 +- ...c-projection-for-command-validation.sdp.md | 21 -- ...ne-a-view-projection-for-ui-queries.sdp.md | 21 -- ...-reporting-projection-for-analytics.sdp.md | 21 -- ...n-projection-for-cross-context-sync.sdp.md | 21 -- ...s-005-query-projections-by-category.sdp.md | 20 -- ...-006-query-all-reactive-projections.sdp.md | 20 -- ...nt-client-query-on-logic-projection.sdp.md | 20 -- ...ion-is-not-optimized-for-reactivity.sdp.md | 21 -- ...ng-projection-to-categorized-system.sdp.md | 21 -- .../roadmap/projection-categories.sdp.md | 2 +- ...urns-zero-counts-for-empty-database.sdp.md | 19 -- ...02-counts-sagas-by-status-correctly.sdp.md | 20 -- .../s-003-filters-by-saga-type.sdp.md | 21 -- ...rns-empty-array-when-no-sagas-exist.sdp.md | 19 -- ...-running-sagas-older-than-threshold.sdp.md | 23 -- .../s-006-respects-custom-threshold.sdp.md | 21 -- ...ns-empty-array-when-no-failed-sagas.sdp.md | 20 -- .../s-008-returns-only-failed-sagas.sdp.md | 21 -- .../s-009-respects-limit-parameter.sdp.md | 20 -- ...-valid-source-status-saga-as-failed.sdp.md | 20 -- ...nvalid-source-status-saga-as-failed.sdp.md | 21 -- ...rns-not-found-for-non-existent-saga.sdp.md | 19 -- ...-marking-failed-saga-as-compensated.sdp.md | 20 -- ...king-non-failed-saga-as-compensated.sdp.md | 21 -- .../s-015-allows-retrying-failed-saga.sdp.md | 20 -- ...16-rejects-retrying-non-failed-saga.sdp.md | 21 -- .../order-management/sagas/admin.sdp.md | 2 +- ...parse-vertical-data-table-to-object.sdp.md | 20 -- ...a-table-preserves-all-string-values.sdp.md | 21 -- ...003-parse-integer-value-from-string.sdp.md | 19 -- ...s-004-parse-float-value-from-string.sdp.md | 19 -- ...-005-parse-boolean-true-from-string.sdp.md | 19 -- ...006-parse-boolean-false-from-string.sdp.md | 19 -- ...-parse-invalid-integer-throws-error.sdp.md | 19 -- ...equired-field-succeeds-when-present.sdp.md | 20 -- ...ired-field-throws-for-missing-field.sdp.md | 21 -- ...al-field-returns-value-when-present.sdp.md | 20 -- ...field-returns-undefined-for-missing.sdp.md | 20 -- ...t-optional-field-with-default-value.sdp.md | 20 -- .../data-table-parsing.sdp.md | 2 +- .../s-001-assert-decision-success.sdp.md | 20 -- ...n-success-fails-for-rejected-result.sdp.md | 22 -- ...3-extract-success-event-from-result.sdp.md | 21 -- ...04-extract-success-data-from-result.sdp.md | 20 -- ...05-extract-state-update-from-result.sdp.md | 21 -- .../s-006-assert-event-type-matches.sdp.md | 20 -- ...ert-event-type-fails-for-wrong-type.sdp.md | 21 -- .../s-008-assert-event-payload-field.sdp.md | 20 -- .../s-009-assert-state-update-field.sdp.md | 20 -- .../s-010-assert-decision-rejected.sdp.md | 20 -- ...s-011-assert-rejection-code-matches.sdp.md | 20 -- ...rejection-code-fails-for-wrong-code.sdp.md | 21 -- ...ert-rejection-message-contains-text.sdp.md | 20 -- .../s-014-assert-decision-failed.sdp.md | 20 -- ...s-015-assert-failure-reason-matches.sdp.md | 20 -- .../decider-assertions.sdp.md | 2 +- .../s-001-assert-valid-transition.sdp.md | 20 -- ...002-assert-invalid-transition-fails.sdp.md | 21 -- ...03-assert-transition-is-not-allowed.sdp.md | 20 -- ...ansition-fails-for-valid-transition.sdp.md | 21 -- .../s-005-assert-terminal-state.sdp.md | 20 -- ...rminal-state-fails-for-non-terminal.sdp.md | 21 -- .../s-007-assert-non-terminal-state.sdp.md | 20 -- .../s-008-assert-initial-state.sdp.md | 20 -- .../s-009-assert-valid-state.sdp.md | 20 -- .../s-010-assert-invalid-state-fails.sdp.md | 20 -- .../s-011-get-all-valid-transitions.sdp.md | 24 -- .../s-012-get-all-states.sdp.md | 20 -- .../s-013-get-terminal-states.sdp.md | 20 -- .../s-014-get-non-terminal-states.sdp.md | 21 -- ...sert-valid-transitions-from-a-state.sdp.md | 20 -- .../fsm-assertions.sdp.md | 2 +- .../s-001-generate-unique-test-run-id.sdp.md | 20 -- ...-run-id-is-stable-within-a-test-run.sdp.md | 20 -- ...entity-i-ds-with-test-run-namespace.sdp.md | 22 -- ...ustom-prefix-for-specific-isolation.sdp.md | 19 -- ...ation-prevents-cross-test-pollution.sdp.md | 21 -- .../test-isolation.sdp.md | 2 +- ...mmand-records-intent-and-completion.sdp.md | 24 -- ...nt-record-captures-command-metadata.sdp.md | 23 -- ...ess-rejection-records-failed-intent.sdp.md | 23 -- ...nical-failure-records-failed-intent.sdp.md | 22 -- ...tent-statistics-show-correct-counts.sdp.md | 22 -- .../durability/durable-commands.sdp.md | 2 +- ...tes-records-for-each-target-context.sdp.md | 20 -- ...tion-records-contain-event-metadata.sdp.md | 19 -- ...sh-result-contains-publication-i-ds.sdp.md | 22 -- ...-004-query-publications-by-event-id.sdp.md | 22 -- ...ery-returns-empty-for-unknown-event.sdp.md | 22 -- .../s-006-query-publications-by-status.sdp.md | 21 -- .../s-007-stats-show-counts-by-status.sdp.md | 21 -- ...s-for-different-events-are-isolated.sdp.md | 19 -- .../durability/durable-publication.sdp.md | 2 +- ...ate-a-running-checkpoint-for-replay.sdp.md | 21 -- .../s-002-update-checkpoint-progress.sdp.md | 21 -- ...play-for-already-running-projection.sdp.md | 20 -- ...s-004-query-checkpoint-by-replay-id.sdp.md | 20 -- .../s-005-list-checkpoints-by-status.sdp.md | 20 -- .../durability/event-replay.sdp.md | 2 +- ...ith-unique-idempotency-key-succeeds.sdp.md | 19 -- ...potency-keys-create-separate-events.sdp.md | 19 -- ...e-idempotency-key-returns-duplicate.sdp.md | 19 -- ...-with-different-payload-is-rejected.sdp.md | 19 -- ...ent-streams-creates-separate-events.sdp.md | 20 -- .../durability/idempotent-append.sdp.md | 2 +- ...ing-timeout-is-flagged-as-abandoned.sdp.md | 23 -- ...ntent-within-timeout-is-not-flagged.sdp.md | 22 -- ...d-intent-is-not-flagged-even-if-old.sdp.md | 21 -- ...d-intent-is-not-flagged-even-if-old.sdp.md | 21 -- ...abandoned-intents-for-investigation.sdp.md | 22 -- ...r-marks-pending-intent-as-abandoned.sdp.md | 22 -- ...handler-no-ops-for-completed-intent.sdp.md | 22 -- .../durability/orphan-detection.sdp.md | 2 +- ...ilure-creates-pending-poison-record.sdp.md | 20 -- ...nd-failure-increments-attempt-count.sdp.md | 21 -- ...-event-quarantined-after-3-failures.sdp.md | 20 -- ...4-quarantine-captures-error-details.sdp.md | 20 -- ...d-event-bypasses-handler-completely.sdp.md | 19 -- ...nquarantine-resets-status-for-retry.sdp.md | 19 -- ...tined-event-returns-not-quarantined.sdp.md | 19 -- ...rantined-event-counts-by-projection.sdp.md | 19 -- .../durability/poison-event.sdp.md | 2 +- ...operation-succeeds-on-first-attempt.sdp.md | 23 -- ...ted-result-passes-through-unchanged.sdp.md | 22 -- ...retry-metadata-with-updated-version.sdp.md | 23 -- ...x-retries-exceeded-returns-rejected.sdp.md | 21 -- ...e-conflict-rolls-back-state-updates.sdp.md | 25 -- ...006-backoff-increases-exponentially.sdp.md | 20 -- .../s-007-backoff-is-capped-at-maximum.sdp.md | 20 -- ...etries-use-consistent-partition-key.sdp.md | 21 -- .../durable-adapters/dcb-retry.sdp.md | 2 +- ...-normal-requests-pass-rate-limiting.sdp.md | 23 -- ...xhausted-rate-limit-rejects-request.sdp.md | 23 -- ...erent-users-have-independent-limits.sdp.md | 22 -- ...mmand-types-have-independent-limits.sdp.md | 23 -- ...-command-returns-standard-rejection.sdp.md | 23 -- ...check-commands-bypass-rate-limiting.sdp.md | 23 -- ...me-rate-limit-uses-sharded-counting.sdp.md | 22 -- .../durable-adapters/rate-limiting.sdp.md | 2 +- ...fully-add-stock-to-existing-product.sdp.md | 22 -- ...dding-stock-to-non-existent-product.sdp.md | 19 -- ...-is-idempotent-with-same-command-id.sdp.md | 20 -- .../inventory/add-stock.sdp.md | 2 +- .../s-001-confirm-pending-reservation.sdp.md | 13 +- ...rming-already-confirmed-reservation.sdp.md | 13 +- ...confirming-non-existent-reservation.sdp.md | 9 +- .../inventory/confirm-reservation.sdp.md | 18 +- ...a-new-product-and-verify-projection.sdp.md | 22 -- .../s-002-reject-duplicate-product-id.sdp.md | 20 -- .../s-003-reject-duplicate-sku.sdp.md | 20 -- ...-is-idempotent-with-same-command-id.sdp.md | 19 -- .../inventory/create-product.sdp.md | 2 +- ...-list-products-returns-all-products.sdp.md | 23 -- ...-get-stock-availability-for-product.sdp.md | 20 -- ...eck-availability-for-multiple-items.sdp.md | 21 -- .../s-004-get-reservation-by-order-id.sdp.md | 22 -- .../inventory/query-inventory.sdp.md | 2 +- .../s-001-release-pending-reservation.sdp.md | 15 +- ...t-releasing-non-pending-reservation.sdp.md | 13 +- .../inventory/release-reservation.sdp.md | 19 +- ...xpire-pending-reservations-past-ttl.sdp.md | 24 -- .../s-002-skip-confirmed-reservations.sdp.md | 22 -- ...3-skip-reservations-not-yet-expired.sdp.md | 22 -- ...expiration-of-multiple-reservations.sdp.md | 28 -- .../inventory/reservation-expiration.sdp.md | 2 +- .../s-001-reserve-stock-successfully.sdp.md | 23 -- ...02-reserve-stock-for-multiple-items.sdp.md | 24 -- ...-003-reject-when-insufficient-stock.sdp.md | 21 -- ...ing-reservation-when-one-item-fails.sdp.md | 23 -- ...005-reject-for-non-existent-product.sdp.md | 19 -- ...ailed-status-when-reservation-fails.sdp.md | 21 -- ...007-idempotent-with-same-command-id.sdp.md | 22 -- .../inventory/reserve-stock.sdp.md | 2 +- ...o-draft-order-and-verify-projection.sdp.md | 13 +- ...ject-adding-item-to-submitted-order.sdp.md | 11 +- .../orders/add-order-item.sdp.md | 18 +- ...dd-multiple-items-to-order-in-batch.sdp.md | 24 -- ...2-batch-respects-order-of-execution.sdp.md | 23 -- ...ops-on-first-failure-in-atomic-mode.sdp.md | 22 -- .../orders/batch-operations.sdp.md | 2 +- ...l-draft-order-and-verify-projection.sdp.md | 22 -- ...bmitted-order-and-verify-projection.sdp.md | 22 -- ...-cancelling-already-cancelled-order.sdp.md | 20 -- ...nfirmed-order-and-verify-projection.sdp.md | 22 -- ...d-when-confirmed-order-is-cancelled.sdp.md | 29 -- ...oes-not-trigger-reservation-release.sdp.md | 23 -- ...completion-releases-pending-reserva.sdp.md | 28 -- ...ady-released-reservation-gracefully.sdp.md | 28 -- ...reservation-when-order-is-cancelled.sdp.md | 29 -- .../orders/cancel-order.sdp.md | 2 +- ...e-a-new-order-and-verify-projection.sdp.md | 22 -- .../s-002-reject-duplicate-order-id.sdp.md | 20 -- ...-is-idempotent-with-same-command-id.sdp.md | 19 -- .../orders/create-order.sdp.md | 2 +- .../s-001-query-orders-by-customer-id.sdp.md | 21 -- .../s-002-query-orders-by-status.sdp.md | 22 -- ...m-draft-order-and-verify-projection.sdp.md | 23 -- .../orders/query-orders.sdp.md | 2 +- ...er-with-items-and-verify-projection.sdp.md | 13 +- ...s-002-reject-submitting-empty-order.sdp.md | 11 +- ...-submitting-already-submitted-order.sdp.md | 11 +- .../orders/submit-order.sdp.md | 19 +- ...-is-available-for-single-item-order.sdp.md | 17 +- ...k-is-available-for-multi-item-order.sdp.md | 15 +- ...-insufficient-stock-for-single-item.sdp.md | 15 +- ...i-item-order-has-insufficient-stock.sdp.md | 17 +- ...s-005-saga-runs-only-once-per-order.sdp.md | 15 +- ...pleted-after-successful-fulfillment.sdp.md | 24 -- ...tus-is-completed-after-compensation.sdp.md | 23 -- ...leted-at-timestamp-after-completion.sdp.md | 11 +- .../sagas/order-fulfillment.sdp.md | 23 +- ...urns-workflow-id-for-completed-saga.sdp.md | 25 -- ...get-saga-steps-returns-step-history.sdp.md | 25 -- ...-returns-null-for-non-existent-saga.sdp.md | 19 -- ...ompleted-saga-returns-invalid-state.sdp.md | 23 -- ...non-existent-saga-returns-not-found.sdp.md | 19 -- ...006-cleanup-completed-saga-workflow.sdp.md | 23 -- .../sagas/saga-admin.sdp.md | 2 +- .../timeline/phase-00-initialization.sdp.md | 2 +- .../phase-01-core-infrastructure.sdp.md | 2 +- .../phase-02-event-store-orchestration.sdp.md | 2 +- .../timeline/phase-03-command-bus.sdp.md | 2 +- .../timeline/phase-04-orders-bc.sdp.md | 2 +- .../timeline/phase-05-inventory-bc.sdp.md | 2 +- .../phase-06-cross-context-integration.sdp.md | 2 +- .../phase-07-projection-engine.sdp.md | 2 +- .../phase-08-documentation-polish.sdp.md | 2 +- .../timeline/phase-09-event-system.sdp.md | 2 +- .../timeline/phase-10-command-system.sdp.md | 2 +- .../timeline/phase-11-bc-formalization.sdp.md | 2 +- .../phase-12-repository-read-model.sdp.md | 2 +- .../timeline/phase-13-process-manager.sdp.md | 2 +- .../phase-14-decider-formalization.sdp.md | 2 +- .../phase-15-projection-categories.sdp.md | 2 +- .../timeline/phase-16-dcb.sdp.md | 2 +- .../phase-17-reactive-projections.sdp.md | 2 +- .../phase-18-production-hardening.sdp.md | 2 +- .../phase-19-testing-infrastructure.sdp.md | 2 +- .../phase-20-service-independence.sdp.md | 2 +- .../phase-21-integration-patterns.sdp.md | 2 +- .../timeline/phase-22-agent-as-bc.sdp.md | 2 +- ...eature-files-pass-schema-validation.sdp.md | 21 -- ...-roadmap-md-reflects-planned-phases.sdp.md | 22 -- .../timeline/phase-23-process-setup.sdp.md | 2 +- ...storical-deliverables-are-preserved.sdp.md | 22 -- ...plete-phases-deferred-appropriately.sdp.md | 22 -- .../phase-24-old-roadmap-porting.sdp.md | 2 +- ...e-accessible-through-generated-docs.sdp.md | 22 -- ...ity-is-assessed-against-new-roadmap.sdp.md | 21 -- .../timeline/phase-25-adr-porting.sdp.md | 2 +- ...nning-sessions-have-defined-outputs.sdp.md | 21 -- ...002-non-code-sessions-are-supported.sdp.md | 21 -- ...003-configuration-inheritance-works.sdp.md | 22 -- .../phase-26-workflow-configuration.sdp.md | 2 +- ...are-documented-for-roadmap-planning.sdp.md | 21 -- ...ve-annotation-policy-is-sustainable.sdp.md | 21 -- ...se-27-pattern-annotation-priorities.sdp.md | 2 +- ...claude-md-is-generated-from-modules.sdp.md | 23 -- ...ariations-produce-different-outputs.sdp.md | 21 -- ...3-pattern-content-is-auto-generated.sdp.md | 21 -- ...04-session-templates-are-includable.sdp.md | 21 -- .../phase-28-modular-claude-md.sdp.md | 2 +- ...mand-preserves-literal-command-type.sdp.md | 20 -- ...ommand-includes-all-metadata-fields.sdp.md | 20 -- ...-event-preserves-literal-event-type.sdp.md | 20 -- ...event-supports-all-event-categories.sdp.md | 19 -- ...n-preserves-literal-projection-name.sdp.md | 20 -- ...preserves-event-subscriptions-tuple.sdp.md | 19 -- ...category-validates-category-strings.sdp.md | 19 -- ...eturns-true-only-for-logic-category.sdp.md | 19 -- ...returns-true-only-for-view-category.sdp.md | 19 -- ...returns-true-only-for-view-category.sdp.md | 19 -- ...turns-false-for-non-view-categories.sdp.md | 19 -- ...time-triggered-requires-cron-config.sdp.md | 19 -- ...nt-triggered-requires-subscriptions.sdp.md | 19 -- .../behavior/platform-bc/bc-contracts.sdp.md | 3 +- ...ery-fails-across-component-boundary.sdp.md | 20 -- ...s-002-component-api-access-succeeds.sdp.md | 20 -- ...writes-commit-atomically-on-success.sdp.md | 20 -- ...olls-back-only-the-component-writes.sdp.md | 21 -- ...r-id-passed-explicitly-to-component.sdp.md | 21 -- .../s-006-id-conversion-at-boundary.sdp.md | 21 -- ...t-provides-type-safety-for-commands.sdp.md | 21 -- ...context-foundation-executable-tests.sdp.md | 4 +- ...first-command-execution-is-recorded.sdp.md | 22 -- ...icate-command-returns-cached-result.sdp.md | 22 -- ...ful-command-transitions-to-executed.sdp.md | 22 -- ...s-rejection-transitions-to-rejected.sdp.md | 22 -- ...xpected-error-transitions-to-failed.sdp.md | 22 -- ...mmand-runs-all-7-orchestrator-steps.sdp.md | 26 -- ...-short-circuits-before-event-append.sdp.md | 22 -- ...ropagated-to-emitted-event-metadata.sdp.md | 21 -- ...on-returns-the-events-for-a-command.sdp.md | 21 -- ...-registered-middleware-run-in-order.sdp.md | 21 -- ...ddleware-failure-halts-the-pipeline.sdp.md | 22 -- ...and-bus-foundation-executable-tests.sdp.md | 4 +- ...irst-command-submission-is-recorded.sdp.md | 24 -- ...urns-existing-status-when-completed.sdp.md | 22 -- ...g-processing-returns-pending-status.sdp.md | 22 -- ...ection-via-post-insert-verification.sdp.md | 22 -- .../behavior/platform-bus/idempotency.sdp.md | 3 +- ...oint-position-equals-event-position.sdp.md | 20 -- ...int-position-exceeds-event-position.sdp.md | 20 -- ...ns-null-when-agent-status-is-paused.sdp.md | 20 -- ...s-null-when-agent-status-is-stopped.sdp.md | 20 -- ...when-agent-status-is-error-recovery.sdp.md | 20 -- ...when-checkpoint-is-null-first-event.sdp.md | 22 -- ...hen-pattern-has-no-analyze-function.sdp.md | 22 -- ...-throws-when-pattern-trigger-throws.sdp.md | 20 -- ...oad-state-errors-for-workpool-retry.sdp.md | 20 -- ...d-from-agent-id-and-global-position.sdp.md | 21 -- ...on-id-for-same-inputs-deterministic.sdp.md | 20 -- ...ased-decision-when-pattern-triggers.sdp.md | 23 -- ...d-when-pattern-has-analyze-function.sdp.md | 23 -- ...-pattern-id-when-no-pattern-matches.sdp.md | 22 -- ...t-invoke-llm-enrichment-via-runtime.sdp.md | 22 -- ...-throws-when-pattern-executor-fails.sdp.md | 20 -- .../platform-core/agent/action-handler.sdp.md | 47 ++- ...and-result-is-returned-when-allowed.sdp.md | 22 -- ...eration-is-not-executed-when-denied.sdp.md | 22 -- ...ate-limit-receives-agent-scoped-key.sdp.md | 19 -- ...peration-errors-propagate-to-caller.sdp.md | 20 -- ...propagate-without-calling-operation.sdp.md | 21 -- ...warning-is-logged-when-rate-limited.sdp.md | 19 -- ...logged-when-rate-limit-check-passes.sdp.md | 19 -- .../agent/agent-rate-limiter.sdp.md | 29 +- ...ion-has-correct-type-and-references.sdp.md | 20 -- ...ject-retry-config-is-passed-through.sdp.md | 20 -- ...lean-retry-config-is-passed-through.sdp.md | 20 -- ...-field-is-absent-when-not-specified.sdp.md | 20 -- ...context-returns-all-required-fields.sdp.md | 22 -- ...sation-id-equals-the-event-event-id.sdp.md | 22 -- ...iption-uses-default-priority-of-250.sdp.md | 20 -- ...8-subscription-uses-custom-priority.sdp.md | 20 -- ...name-includes-context-when-provided.sdp.md | 20 -- ...ame-omits-context-when-not-provided.sdp.md | 20 -- ...contains-all-configured-event-types.sdp.md | 21 -- ...es-correct-agent-event-handler-args.sdp.md | 22 -- ...y-returns-stream-id-based-partition.sdp.md | 22 -- .../agent/agent-subscription-action.sdp.md | 5 +- ...ption-with-context-has-correct-name.sdp.md | 20 -- ...on-without-context-has-correct-name.sdp.md | 20 -- ...iption-uses-default-priority-of-250.sdp.md | 20 -- ...4-subscription-uses-custom-priority.sdp.md | 20 -- ...filter-contains-correct-event-types.sdp.md | 21 -- ...tion-attaches-the-handler-reference.sdp.md | 20 -- ...es-correct-agent-event-handler-args.sdp.md | 22 -- ...gs-includes-payload-in-handler-args.sdp.md | 23 -- ...orm-wraps-non-object-payload-in-raw.sdp.md | 21 -- ...to-handler-args-transformer-is-used.sdp.md | 22 -- ...-partitions-by-stream-id-by-default.sdp.md | 22 -- ...tom-partition-key-extractor-is-used.sdp.md | 22 -- ...s-subscriptions-for-multiple-agents.sdp.md | 22 -- ...-if-handler-is-missing-for-an-agent.sdp.md | 21 -- ...common-options-to-all-subscriptions.sdp.md | 21 -- ...-for-multiple-to-handler-args-calls.sdp.md | 22 -- ...-handler-args-and-get-partition-key.sdp.md | 22 -- ...ypes-and-rejects-unsubscribed-types.sdp.md | 21 -- ...es-array-starts-with-correct-length.sdp.md | 20 -- ...ll-published-event-fields-correctly.sdp.md | 21 -- .../s-021-handles-null-payload.sdp.md | 21 -- .../s-022-handles-array-payload.sdp.md | 21 -- .../agent/agent-subscription.sdp.md | 5 +- ...001-all-six-error-codes-are-present.sdp.md | 19 -- ...contains-all-four-statuses-in-order.sdp.md | 19 -- ...roval-statuses-is-a-4-element-array.sdp.md | 19 -- ...turns-true-for-valid-status-strings.sdp.md | 19 -- ...5-returns-false-for-invalid-strings.sdp.md | 19 -- ...-returns-false-for-non-string-types.sdp.md | 19 -- ...007-accepts-all-four-valid-statuses.sdp.md | 19 -- ...s-008-rejects-invalid-status-values.sdp.md | 19 -- ...009-accepts-a-valid-approval-object.sdp.md | 20 -- ...proval-with-missing-required-fields.sdp.md | 19 -- ...ts-approval-with-confidence-above-1.sdp.md | 20 -- ...s-approval-with-negative-confidence.sdp.md | 20 -- ...alid-auth-context-with-user-id-only.sdp.md | 19 -- ...014-accepts-auth-context-with-roles.sdp.md | 19 -- ...accepts-auth-context-with-agent-ids.sdp.md | 19 -- ...cts-auth-context-with-empty-user-id.sdp.md | 19 -- ...s-017-parses-valid-duration-strings.sdp.md | 19 -- ...18-returns-null-for-invalid-formats.sdp.md | 19 -- .../s-019-returns-null-for-zero-values.sdp.md | 19 -- ...urns-true-for-valid-timeout-formats.sdp.md | 19 -- ...s-false-for-invalid-timeout-formats.sdp.md | 19 -- ...2-uses-explicit-timeout-from-config.sdp.md | 20 -- ...-default-timeout-when-not-specified.sdp.md | 20 -- ...-default-timeout-for-invalid-format.sdp.md | 20 -- ...-when-confidence-is-below-threshold.sdp.md | 20 -- ...nfidence-equals-threshold-inclusive.sdp.md | 20 -- ...-when-confidence-is-above-threshold.sdp.md | 20 -- ...threshold-of-0-9-when-not-specified.sdp.md | 21 -- ...ed-action-even-with-high-confidence.sdp.md | 21 -- ...nlisted-action-with-high-confidence.sdp.md | 20 -- ...approved-action-with-low-confidence.sdp.md | 21 -- ...akes-precedence-over-low-confidence.sdp.md | 20 -- ...l-wins-when-action-is-in-both-lists.sdp.md | 20 -- ...o-confidence-check-with-empty-lists.sdp.md | 21 -- ...nfidence-check-with-undefined-lists.sdp.md | 20 -- .../s-036-handles-confidence-of-0.sdp.md | 20 -- .../s-037-handles-confidence-of-1.sdp.md | 20 -- ...ent-id-is-in-auth-context-agent-ids.sdp.md | 21 -- ...id-is-not-in-auth-context-agent-ids.sdp.md | 21 -- ...s-false-when-agent-ids-is-undefined.sdp.md | 21 -- ...turns-false-when-agent-ids-is-empty.sdp.md | 21 -- ...rue-when-user-has-at-least-one-role.sdp.md | 21 -- ...turns-false-when-roles-is-undefined.sdp.md | 21 -- ...4-returns-false-when-roles-is-empty.sdp.md | 21 -- ...ds-check-fails-even-with-admin-role.sdp.md | 21 -- ...s-046-both-agent-ids-and-roles-pass.sdp.md | 21 -- ...-with-apr-prefix-and-correct-format.sdp.md | 21 -- ...tes-unique-i-ds-over-multiple-calls.sdp.md | 19 -- ...9-sets-correct-initial-field-values.sdp.md | 20 -- ...ue-approval-ids-over-multiple-calls.sdp.md | 19 -- ...1-sets-requested-at-to-current-time.sdp.md | 20 -- ...-expires-at-based-on-config-timeout.sdp.md | 20 -- ...t-include-optional-fields-initially.sdp.md | 20 -- ...itions-pending-approval-to-approved.sdp.md | 23 -- ...-includes-review-note-when-provided.sdp.md | 21 -- ...clude-review-note-when-not-provided.sdp.md | 21 -- ...rows-error-for-non-pending-statuses.sdp.md | 19 -- ...error-for-expired-pending-approvals.sdp.md | 20 -- ...eserves-other-fields-after-approval.sdp.md | 21 -- ...ng-approval-to-rejected-with-reason.sdp.md | 23 -- ...wed-at-to-current-time-on-rejection.sdp.md | 21 -- ...when-rejecting-non-pending-approval.sdp.md | 19 -- ...-rejecting-expired-pending-approval.sdp.md | 20 -- ...sitions-pending-approval-to-expired.sdp.md | 21 -- ...-when-expiring-non-pending-approval.sdp.md | 19 -- ...es-original-fields-after-expiration.sdp.md | 21 -- ...-success-for-valid-pending-approval.sdp.md | 23 -- ...orized-reviewer-when-not-authorized.sdp.md | 22 -- ...s-transition-when-already-processed.sdp.md | 22 -- ...proval-expired-when-past-expiration.sdp.md | 23 -- ...returns-success-for-valid-rejection.sdp.md | 23 -- ...nauthorized-reviewer-on-safe-reject.sdp.md | 22 -- ...rns-approval-expired-on-safe-reject.sdp.md | 23 -- ...nding-returns-true-only-for-pending.sdp.md | 20 -- ...oved-returns-true-only-for-approved.sdp.md | 20 -- ...cted-returns-true-only-for-rejected.sdp.md | 20 -- ...ed-status-and-time-based-expiration.sdp.md | 22 -- ...able-checks-pending-and-not-expired.sdp.md | 21 -- ...remaining-time-for-pending-approval.sdp.md | 19 -- ...-080-returns-0-for-expired-approval.sdp.md | 19 -- ...81-returns-0-for-non-pending-status.sdp.md | 19 -- .../s-082-formats-hours-and-minutes.sdp.md | 19 -- .../s-083-formats-minutes-only.sdp.md | 19 -- ...returns-expired-for-past-expiration.sdp.md | 19 -- ...085-returns-true-for-valid-approval.sdp.md | 20 -- ...86-returns-false-for-invalid-inputs.sdp.md | 19 -- ...eturns-false-for-invalid-confidence.sdp.md | 19 -- .../platform-core/agent/approval.sdp.md | 60 ++-- ...s-001-record-pattern-detected-event.sdp.md | 22 -- ...02-audit-includes-triggering-events.sdp.md | 21 -- ...s-003-audit-includes-execution-mode.sdp.md | 22 -- .../s-004-audit-includes-llm-metadata.sdp.md | 21 -- .../s-005-audit-llm-failures.sdp.md | 22 -- .../s-006-record-auto-executed-action.sdp.md | 22 -- .../s-007-record-approved-action.sdp.md | 22 -- .../s-008-record-rejected-action.sdp.md | 22 -- .../s-009-record-expired-action.sdp.md | 22 -- ...10-query-all-decisions-for-an-agent.sdp.md | 21 -- ...011-query-decisions-by-pattern-type.sdp.md | 21 -- ...s-012-query-decisions-by-time-range.sdp.md | 21 -- ...-013-query-decision-with-full-trace.sdp.md | 21 -- ...-contains-all-ds-1-base-event-types.sdp.md | 19 -- ...ll-ds-4-command-routing-event-types.sdp.md | 19 -- ...ains-all-ds-5-lifecycle-event-types.sdp.md | 19 -- ...ns-ds-6-failure-tracking-event-type.sdp.md | 19 -- .../s-005-has-exactly-17-event-types.sdp.md | 19 -- ...ue-for-all-valid-event-type-strings.sdp.md | 19 -- ...07-returns-false-for-invalid-values.sdp.md | 19 -- ...returns-false-for-non-string-values.sdp.md | 19 -- ...s-009-accepts-all-valid-event-types.sdp.md | 19 -- .../s-010-rejects-invalid-event-types.sdp.md | 19 -- ...1-rejects-non-string-values-via-zod.sdp.md | 19 -- .../s-012-accepts-valid-llm-context.sdp.md | 20 -- .../s-013-rejects-negative-tokens.sdp.md | 20 -- .../s-014-rejects-negative-duration.sdp.md | 20 -- .../s-015-rejects-non-integer-tokens.sdp.md | 20 -- .../s-016-accepts-zero-values.sdp.md | 20 -- ...s-valid-action-with-flag-for-review.sdp.md | 20 -- ...epts-valid-action-with-auto-execute.sdp.md | 20 -- ...-019-rejects-action-with-empty-type.sdp.md | 20 -- ...-action-with-invalid-execution-mode.sdp.md | 20 -- ...on-with-extra-fields-in-strict-mode.sdp.md | 20 -- ...2-accepts-valid-payload-with-action.sdp.md | 20 -- ...-payload-with-null-pattern-detected.sdp.md | 20 -- ...24-accepts-payload-with-null-action.sdp.md | 20 -- ...25-accepts-payload-with-llm-context.sdp.md | 20 -- ...cts-payload-with-confidence-below-0.sdp.md | 20 -- ...cts-payload-with-confidence-above-1.sdp.md | 20 -- ...epts-valid-approval-granted-payload.sdp.md | 20 -- ...29-accepts-payload-with-review-note.sdp.md | 20 -- ...ejects-payload-with-empty-action-id.sdp.md | 20 -- ...pts-valid-approval-rejected-payload.sdp.md | 20 -- ...llows-empty-rejection-reason-string.sdp.md | 20 -- ...epts-valid-approval-expired-payload.sdp.md | 20 -- ...ejects-payload-with-empty-action-id.sdp.md | 20 -- .../s-035-accepts-valid-audit-event.sdp.md | 20 -- ...6-rejects-event-with-empty-agent-id.sdp.md | 20 -- ...ejects-event-with-empty-decision-id.sdp.md | 20 -- ...-038-generates-i-ds-with-dec-prefix.sdp.md | 19 -- ...generates-i-ds-with-expected-format.sdp.md | 21 -- ...tes-unique-i-ds-over-multiple-calls.sdp.md | 19 -- ...41-uses-a-uui-dv7-payload-in-the-id.sdp.md | 19 -- ...es-event-with-pattern-detected-type.sdp.md | 19 -- .../s-043-includes-all-required-fields.sdp.md | 26 -- ...-includes-llm-context-when-provided.sdp.md | 22 -- ...clude-llm-context-when-not-provided.sdp.md | 19 -- ...s-046-handles-null-pattern-detected.sdp.md | 19 -- .../s-047-handles-null-action.sdp.md | 19 -- ...es-event-with-approval-granted-type.sdp.md | 19 -- ...equired-fields-for-approval-granted.sdp.md | 24 -- ...-includes-review-note-when-provided.sdp.md | 19 -- ...clude-review-note-when-not-provided.sdp.md | 19 -- ...s-event-with-approval-rejected-type.sdp.md | 19 -- ...quired-fields-for-approval-rejected.sdp.md | 24 -- ...es-event-with-approval-expired-type.sdp.md | 19 -- ...equired-fields-for-approval-expired.sdp.md | 24 -- ...6-creates-event-with-specified-type.sdp.md | 19 -- ...l-required-fields-for-generic-event.sdp.md | 21 -- ...d-to-empty-object-when-not-provided.sdp.md | 19 -- ...rks-with-ds-4-command-routing-types.sdp.md | 19 -- ...060-works-with-ds-5-lifecycle-types.sdp.md | 19 -- ...rns-true-for-pattern-detected-event.sdp.md | 19 -- ...anted-event-via-is-pattern-detected.sdp.md | 19 -- ...ected-event-via-is-pattern-detected.sdp.md | 19 -- ...rns-true-for-approval-granted-event.sdp.md | 19 -- ...ected-event-via-is-approval-granted.sdp.md | 19 -- ...ected-event-via-is-approval-granted.sdp.md | 19 -- ...ns-true-for-approval-rejected-event.sdp.md | 19 -- ...nted-event-via-is-approval-rejected.sdp.md | 19 -- ...cted-event-via-is-approval-rejected.sdp.md | 19 -- ...-valid-pattern-detected-audit-event.sdp.md | 19 -- ...-valid-approval-granted-audit-event.sdp.md | 19 -- ...valid-approval-rejected-audit-event.sdp.md | 19 -- ...-valid-approval-expired-audit-event.sdp.md | 19 -- .../s-074-returns-false-for-null.sdp.md | 19 -- .../s-075-returns-false-for-undefined.sdp.md | 19 -- ...-076-returns-false-for-empty-object.sdp.md | 19 -- ...eturns-false-for-invalid-event-type.sdp.md | 19 -- ...s-false-for-missing-required-fields.sdp.md | 19 -- ...ete-audit-trail-for-approved-action.sdp.md | 23 -- ...ete-audit-trail-for-rejected-action.sdp.md | 21 -- ...ates-audit-trail-for-expired-action.sdp.md | 21 -- .../behavior/platform-core/agent/audit.sdp.md | 47 +-- ...urns-true-for-error-recovery-status.sdp.md | 19 -- ...002-returns-false-for-active-status.sdp.md | 19 -- ...003-returns-false-for-paused-status.sdp.md | 19 -- ...04-returns-false-for-stopped-status.sdp.md | 19 -- ...values-when-overrides-are-undefined.sdp.md | 20 -- ...-base-rate-limits-when-no-overrides.sdp.md | 19 -- ...when-base-has-none-and-no-overrides.sdp.md | 19 -- ...-preserving-pattern-window-duration.sdp.md | 20 -- ...ile-preserving-confidence-threshold.sdp.md | 20 -- ...minute-while-preserving-base-cost-b.sdp.md | 19 -- ...serving-cost-budget-alert-threshold.sdp.md | 19 -- ...-while-preserving-cost-budget-daily.sdp.md | 19 -- ...3-fully-overrides-all-config-values.sdp.md | 19 -- ...ts-via-overrides-when-base-has-none.sdp.md | 19 -- ...s-object-returns-base-config-values.sdp.md | 21 -- ...eckpoint-without-existing-overrides.sdp.md | 19 -- ...g-overrides-with-existing-overrides.sdp.md | 19 -- ...rides-take-precedence-over-existing.sdp.md | 19 -- ...rrides-when-update-has-no-overrides.sdp.md | 20 -- ...cost-budget-in-checkpoint-overrides.sdp.md | 19 -- .../s-021-updates-updated-at-timestamp.sdp.md | 19 -- ...2-increments-events-processed-count.sdp.md | 19 -- ...rocessed-when-no-increment-provided.sdp.md | 19 -- ...neither-existing-nor-update-have-th.sdp.md | 19 -- ...ntinel-last-processed-position-of-1.sdp.md | 19 -- ...eates-checkpoint-with-active-status.sdp.md | 19 -- ...eckpoint-with-zero-events-processed.sdp.md | 19 -- ...checkpoint-with-empty-last-event-id.sdp.md | 19 -- ...029-sets-updated-at-to-current-time.sdp.md | 19 -- ...serves-agent-id-and-subscription-id.sdp.md | 19 -- ...1-does-not-include-config-overrides.sdp.md | 19 -- .../agent/checkpoint-extension.sdp.md | 5 +- .../s-001-contains-all-four-statuses.sdp.md | 19 -- ...is-a-readonly-tuple-with-4-elements.sdp.md | 20 -- .../s-003-accepts-all-valid-statuses.sdp.md | 19 -- .../s-004-rejects-invalid-statuses.sdp.md | 19 -- ...5-accepts-a-valid-checkpoint-object.sdp.md | 20 -- ...checkpoint-with-sentinel-position-1.sdp.md | 20 -- ...ts-checkpoint-with-position-below-1.sdp.md | 20 -- ...oint-with-negative-events-processed.sdp.md | 20 -- ...ects-checkpoint-with-empty-agent-id.sdp.md | 20 -- ...eckpoint-with-empty-subscription-id.sdp.md | 20 -- ...kpoint-with-missing-required-fields.sdp.md | 20 -- ...orrect-agent-id-and-subscription-id.sdp.md | 19 -- ...osition-and-event-tracking-defaults.sdp.md | 20 -- .../s-014-initializes-status-to-active.sdp.md | 19 -- ...015-sets-updated-at-to-current-time.sdp.md | 19 -- ...point-that-passes-schema-validation.sdp.md | 19 -- ...017-updates-last-processed-position.sdp.md | 20 -- .../s-018-updates-last-event-id.sdp.md | 20 -- .../s-019-updates-status.sdp.md | 20 -- ...vents-processed-by-specified-amount.sdp.md | 20 -- ...nts-processed-by-1-for-single-event.sdp.md | 20 -- ...events-processed-when-not-specified.sdp.md | 20 -- .../s-023-preserves-unchanged-fields.sdp.md | 20 -- ...-updates-updated-at-to-current-time.sdp.md | 21 -- ...25-applies-multiple-updates-at-once.sdp.md | 21 -- ...y-update-by-only-updating-timestamp.sdp.md | 20 -- ...position-is-greater-than-checkpoint.sdp.md | 19 -- ...or-duplicate-event-at-same-position.sdp.md | 19 -- ...s-false-for-already-processed-event.sdp.md | 19 -- ...-against-sentinel-1-for-a-new-agent.sdp.md | 19 -- ...e-for-position-1-against-sentinel-1.sdp.md | 19 -- ...ositive-position-against-sentinel-1.sdp.md | 19 -- ...for-position-1-against-checkpoint-0.sdp.md | 19 -- ...for-position-0-against-checkpoint-0.sdp.md | 19 -- ...s-035-handles-large-position-values.sdp.md | 20 -- ...ocesses-sequential-events-correctly.sdp.md | 19 -- ...037-handles-gaps-in-event-positions.sdp.md | 20 -- ...returns-true-only-for-active-status.sdp.md | 19 -- ...returns-true-only-for-paused-status.sdp.md | 19 -- ...eturns-true-only-for-stopped-status.sdp.md | 19 -- ...returns-true-for-a-valid-checkpoint.sdp.md | 20 -- ...r-checkpoint-with-sentinel-position.sdp.md | 20 -- ...for-null-undefined-and-empty-object.sdp.md | 19 -- ...returns-false-for-non-object-values.sdp.md | 19 -- ...-for-checkpoint-with-invalid-status.sdp.md | 20 -- ...or-checkpoint-with-position-below-1.sdp.md | 20 -- ...oint-with-negative-events-processed.sdp.md | 20 -- ...48-new-agent-processes-first-events.sdp.md | 25 -- ...pause-and-resume-preserves-position.sdp.md | 24 -- ...very-skips-already-processed-events.sdp.md | 22 -- ...licate-event-delivery-is-idempotent.sdp.md | 22 -- .../platform-core/agent/checkpoint.sdp.md | 5 +- ...rator-records-audit-and-updates-sta.sdp.md | 25 -- ...dit-and-sets-status-to-failed-for-u.sdp.md | 26 -- ...en-registry-does-not-contain-the-co.sdp.md | 27 -- ...or-when-to-orchestrator-args-throws.sdp.md | 28 -- ...dit-and-sets-status-to-failed-on-or.sdp.md | 26 -- ...dit-recording-fails-on-success-path.sdp.md | 27 -- ...atus-mutation-fails-on-success-path.sdp.md | 26 -- ...update-status-is-undefined-on-succe.sdp.md | 26 -- ...ure-when-update-status-is-undefined.sdp.md | 25 -- ...-event-payload-when-present-in-args.sdp.md | 23 -- ...audit-payload-when-absent-from-args.sdp.md | 23 -- .../platform-core/agent/command-bridge.sdp.md | 5 +- .../s-001-emit-recommendation-command.sdp.md | 22 -- ...002-command-includes-correlation-id.sdp.md | 21 -- ...ommand-includes-agent-bc-identifier.sdp.md | 21 -- .../s-004-command-includes-reason.sdp.md | 21 -- .../s-005-command-includes-confidence.sdp.md | 21 -- ...-command-includes-triggering-events.sdp.md | 21 -- .../s-007-command-includes-llm-context.sdp.md | 21 -- ...s-008-reject-command-without-reason.sdp.md | 21 -- ...9-reject-command-without-confidence.sdp.md | 21 -- ...ject-confidence-outside-valid-range.sdp.md | 22 -- ...is-handled-with-exponential-backoff.sdp.md | 24 -- ...t-falls-back-to-rule-based-emission.sdp.md | 23 -- .../s-013-emit-notification-command.sdp.md | 21 -- .../s-014-emit-action-command.sdp.md | 21 -- .../s-015-emit-escalation-command.sdp.md | 21 -- .../agent/command-emission.sdp.md | 5 +- ...when-command-type-exists-in-the-map.sdp.md | 21 -- ...mand-type-does-not-exist-in-the-map.sdp.md | 19 -- ...turns-undefined-for-empty-route-map.sdp.md | 19 -- ...es-success-results-for-valid-routes.sdp.md | 21 -- ...ered-error-for-missing-command-type.sdp.md | 22 -- ...e-error-for-missing-bounded-context.sdp.md | 22 -- ...or-for-missing-to-orchestrator-args.sdp.md | 22 -- ...rns-empty-array-for-empty-route-map.sdp.md | 19 -- ...id-and-invalid-routes-independently.sdp.md | 21 -- ...0-contains-all-expected-error-codes.sdp.md | 19 -- .../s-011-has-exactly-4-error-codes.sdp.md | 19 -- ...tring-constants-matching-their-keys.sdp.md | 19 -- .../platform-core/agent/command-router.sdp.md | 5 +- ...1-contains-all-expected-error-codes.sdp.md | 19 -- .../s-002-has-exactly-5-error-codes.sdp.md | 19 -- .../s-003-accepts-valid-metadata.sdp.md | 19 -- ...s-metadata-with-optional-pattern-id.sdp.md | 19 -- ...pts-metadata-with-optional-analysis.sdp.md | 19 -- ...ejects-metadata-with-empty-agent-id.sdp.md | 19 -- ...cts-metadata-with-empty-decision-id.sdp.md | 19 -- ...ts-metadata-with-confidence-below-0.sdp.md | 19 -- ...ts-metadata-with-confidence-above-1.sdp.md | 19 -- ...-rejects-metadata-with-empty-reason.sdp.md | 19 -- ...metadata-with-empty-event-ids-array.sdp.md | 19 -- ...ts-confidence-at-boundaries-0-and-1.sdp.md | 20 -- .../s-013-accepts-valid-command.sdp.md | 19 -- ...014-rejects-command-with-empty-type.sdp.md | 19 -- ...cepts-command-with-any-payload-type.sdp.md | 19 -- ...jects-command-with-invalid-metadata.sdp.md | 19 -- ...urns-invalid-when-type-is-undefined.sdp.md | 20 -- ...s-invalid-when-type-is-empty-string.sdp.md | 19 -- ...nvalid-when-type-is-whitespace-only.sdp.md | 19 -- ...nvalid-when-confidence-is-undefined.sdp.md | 20 -- ...-invalid-when-confidence-is-below-0.sdp.md | 20 -- ...-invalid-when-confidence-is-above-1.sdp.md | 19 -- ...cepts-confidence-at-boundary-values.sdp.md | 19 -- ...ns-invalid-when-reason-is-undefined.sdp.md | 19 -- ...invalid-when-reason-is-empty-string.sdp.md | 19 -- ...alid-when-reason-is-whitespace-only.sdp.md | 19 -- ...invalid-when-event-ids-is-undefined.sdp.md | 20 -- ...valid-when-event-ids-is-empty-array.sdp.md | 19 -- .../s-029-accepts-single-event-id.sdp.md | 19 -- .../s-030-accepts-multiple-event-i-ds.sdp.md | 19 -- ...rns-valid-for-complete-command-args.sdp.md | 19 -- ...es-command-with-all-required-fields.sdp.md | 19 -- .../s-033-generates-unique-decision-id.sdp.md | 19 -- ...pattern-id-when-provided-in-options.sdp.md | 19 -- ...nclude-pattern-id-when-not-provided.sdp.md | 19 -- ...s-analysis-when-provided-in-options.sdp.md | 19 -- ...-include-analysis-when-not-provided.sdp.md | 19 -- ...ttern-id-and-analysis-when-provided.sdp.md | 20 -- ...ids-array-without-reference-sharing.sdp.md | 19 -- .../s-040-throws-error-for-empty-type.sdp.md | 19 -- ...throws-error-for-invalid-confidence.sdp.md | 19 -- ...s-042-throws-error-for-empty-reason.sdp.md | 19 -- ...43-throws-error-for-empty-event-ids.sdp.md | 19 -- ...cludes-error-code-in-thrown-message.sdp.md | 19 -- ...-command-from-decision-with-command.sdp.md | 19 -- ...s-null-when-decision-has-no-command.sdp.md | 19 -- ...7-includes-pattern-id-when-provided.sdp.md | 19 -- ...048-includes-analysis-when-provided.sdp.md | 19 -- ...-maps-all-decision-fields-correctly.sdp.md | 19 -- ...-050-returns-true-for-valid-command.sdp.md | 19 -- ...ue-for-command-with-optional-fields.sdp.md | 19 -- ...eturns-false-for-non-command-values.sdp.md | 19 -- ...ns-true-when-command-has-pattern-id.sdp.md | 19 -- ...alse-when-command-has-no-pattern-id.sdp.md | 19 -- ...-pattern-id-is-undefined-explicitly.sdp.md | 19 -- ...urns-true-when-command-has-analysis.sdp.md | 19 -- ...-false-when-command-has-no-analysis.sdp.md | 19 -- ...en-analysis-is-undefined-explicitly.sdp.md | 19 -- ...-059-returns-true-for-null-analysis.sdp.md | 19 -- ...idates-creates-and-verifies-command.sdp.md | 19 -- ...-command-from-decision-and-verifies.sdp.md | 19 -- .../platform-core/agent/commands.sdp.md | 5 +- ...plus-estimated-cost-is-under-budget.sdp.md | 20 -- ...-estimated-cost-would-exceed-budget.sdp.md | 20 -- ...current-spend-already-equals-budget.sdp.md | 19 -- ...timated-cost-exactly-reaches-budget.sdp.md | 20 -- ...-when-spend-exceeds-alert-threshold.sdp.md | 20 -- ...lert-threshold-when-below-threshold.sdp.md | 20 -- ...reshold-at-exact-threshold-boundary.sdp.md | 20 -- ...cation-of-tokens-and-cost-per-token.sdp.md | 19 -- .../s-009-returns-0-for-0-tokens.sdp.md | 19 -- .../s-010-handles-large-token-counts.sdp.md | 19 -- ...1-handles-very-small-cost-per-token.sdp.md | 19 -- ...nd-output-costs-with-output-greater.sdp.md | 22 -- ...has-positive-input-and-output-costs.sdp.md | 21 -- ...-model-entry-is-cheaper-than-gpt-4o.sdp.md | 22 -- .../platform-core/agent/cost-budget.sdp.md | 5 +- ...1-contains-all-expected-error-codes.sdp.md | 19 -- .../s-002-has-exactly-3-error-codes.sdp.md | 19 -- ...ontains-all-three-statuses-in-order.sdp.md | 19 -- ...is-a-readonly-tuple-with-3-elements.sdp.md | 19 -- ...5-type-guard-accepts-valid-statuses.sdp.md | 19 -- ...6-type-guard-rejects-invalid-values.sdp.md | 19 -- ...type-guard-rejects-non-string-types.sdp.md | 19 -- .../s-008-accepts-all-valid-statuses.sdp.md | 19 -- ...s-009-rejects-invalid-status-values.sdp.md | 19 -- ...cepts-valid-context-with-all-fields.sdp.md | 20 -- ...ts-context-with-only-correlation-id.sdp.md | 20 -- ...ccepts-context-with-only-error-code.sdp.md | 20 -- .../s-013-accepts-empty-context-object.sdp.md | 20 -- ...-with-unknown-fields-in-strict-mode.sdp.md | 20 -- .../s-015-accepts-valid-dead-letter.sdp.md | 20 -- ...16-accepts-dead-letter-with-context.sdp.md | 20 -- ...cts-dead-letter-with-empty-agent-id.sdp.md | 20 -- ...d-letter-with-empty-subscription-id.sdp.md | 20 -- ...cts-dead-letter-with-empty-event-id.sdp.md | 20 -- ...etter-with-negative-global-position.sdp.md | 20 -- ...ad-letter-with-global-position-of-0.sdp.md | 20 -- ...ter-with-non-positive-attempt-count.sdp.md | 20 -- ...letter-with-missing-required-fields.sdp.md | 20 -- ...-when-followed-by-path-like-content.sdp.md | 20 -- ...025-removes-multi-line-stack-traces.sdp.md | 20 -- ...-preserves-the-error-message-itself.sdp.md | 19 -- ...pe-script-file-paths-with-at-prefix.sdp.md | 19 -- ...-without-at-prefix-with-path-marker.sdp.md | 19 -- ...-esm-file-paths-when-preceded-by-at.sdp.md | 19 -- ...path-marker-when-not-preceded-by-at.sdp.md | 19 -- ...-paths-with-line-and-column-numbers.sdp.md | 19 -- ...500-characters-ending-with-ellipsis.sdp.md | 20 -- ...ncate-messages-under-500-characters.sdp.md | 20 -- ...-messages-of-exactly-500-characters.sdp.md | 20 -- .../s-035-handles-error-objects.sdp.md | 19 -- .../s-036-handles-string-errors.sdp.md | 19 -- ...ndles-objects-with-message-property.sdp.md | 19 -- .../s-038-handles-unknown-error-types.sdp.md | 19 -- .../s-039-handles-null.sdp.md | 19 -- .../s-040-handles-undefined.sdp.md | 19 -- .../s-041-handles-empty-string.sdp.md | 19 -- .../s-042-collapses-multiple-spaces.sdp.md | 19 -- ...ims-leading-and-trailing-whitespace.sdp.md | 19 -- .../s-044-handles-newlines.sdp.md | 19 -- ...es-dead-letter-with-required-fields.sdp.md | 20 -- ...tes-dead-letter-with-pending-status.sdp.md | 20 -- .../s-047-sets-attempt-count-to-1.sdp.md | 20 -- ...-048-sets-failed-at-to-current-time.sdp.md | 20 -- ...-049-includes-context-when-provided.sdp.md | 20 -- ...t-include-context-when-not-provided.sdp.md | 20 -- ...bjects-removing-stack-like-patterns.sdp.md | 21 -- .../s-052-sanitizes-string-errors.sdp.md | 20 -- ...s-paths-in-errors-without-at-prefix.sdp.md | 20 -- ...laces-paths-with-line-column-suffix.sdp.md | 20 -- ...s-055-sanitizes-unknown-error-types.sdp.md | 20 -- .../s-056-increments-attempt-count.sdp.md | 21 -- .../s-057-updates-error-message.sdp.md | 21 -- ...s-new-error-message-with-at-pattern.sdp.md | 21 -- ...error-message-with-path-replacement.sdp.md | 21 -- ...0-updates-failed-at-to-current-time.sdp.md | 22 -- ...erves-other-fields-during-increment.sdp.md | 21 -- .../s-062-handles-multiple-increments.sdp.md | 22 -- ...063-transitions-pending-to-replayed.sdp.md | 20 -- ...elds-when-transitioning-to-replayed.sdp.md | 20 -- ...ng-replayed-dead-letter-as-replayed.sdp.md | 20 -- ...ing-ignored-dead-letter-as-replayed.sdp.md | 20 -- ...-067-transitions-pending-to-ignored.sdp.md | 20 -- ...ields-when-transitioning-to-ignored.sdp.md | 20 -- ...ing-replayed-dead-letter-as-ignored.sdp.md | 20 -- ...eady-ignored-dead-letter-as-ignored.sdp.md | 20 -- ...nding-returns-true-only-for-pending.sdp.md | 22 -- ...ayed-returns-true-only-for-replayed.sdp.md | 22 -- ...nored-returns-true-only-for-ignored.sdp.md | 22 -- ...-returns-true-for-valid-dead-letter.sdp.md | 20 -- ...s-true-for-dead-letter-with-context.sdp.md | 20 -- .../s-076-returns-false-for-null.sdp.md | 19 -- .../s-077-returns-false-for-undefined.sdp.md | 19 -- ...-078-returns-false-for-empty-object.sdp.md | 19 -- ...-returns-false-for-non-object-types.sdp.md | 19 -- ...for-dead-letter-with-invalid-status.sdp.md | 20 -- ...for-dead-letter-with-missing-fields.sdp.md | 20 -- ...ent-processing-and-replay-lifecycle.sdp.md | 29 -- ...olete-event-being-ignored-lifecycle.sdp.md | 23 -- .../platform-core/agent/dead-letter.sdp.md | 5 +- ...-001-subscribe-to-single-event-type.sdp.md | 22 -- ...2-subscribe-to-multiple-event-types.sdp.md | 21 -- ...oes-not-receive-unsubscribed-events.sdp.md | 21 -- .../s-004-filter-by-payload-field.sdp.md | 21 -- .../s-005-filter-by-customer-segment.sdp.md | 21 -- ...ents-delivered-in-publication-order.sdp.md | 21 -- ...nts-from-same-stream-maintain-order.sdp.md | 21 -- ...st-processed-position-after-restart.sdp.md | 24 -- ...t-updated-after-successful-analysis.sdp.md | 24 -- ...letter-without-advancing-checkpoint.sdp.md | 24 -- ...t-persists-agent-subscription-state.sdp.md | 22 -- .../s-012-pause-subscription.sdp.md | 21 -- .../s-013-resume-subscription.sdp.md | 21 -- ...nsubscribe-stops-all-event-delivery.sdp.md | 21 -- .../agent/event-subscription.sdp.md | 5 +- ...-execution-mode-based-on-confidence.sdp.md | 22 -- .../s-002-custom-threshold-per-agent.sdp.md | 23 -- ...pproval-action-with-high-confidence.sdp.md | 22 -- ...-approve-action-with-low-confidence.sdp.md | 22 -- ...gure-multiple-approval-requirements.sdp.md | 21 -- .../s-006-create-review-task.sdp.md | 23 -- .../s-007-approve-pending-action.sdp.md | 22 -- .../s-008-reject-pending-action.sdp.md | 23 -- .../s-009-action-expires-after-timeout.sdp.md | 23 -- ...-010-custom-timeout-per-action-type.sdp.md | 22 -- .../s-011-approve-action-near-timeout.sdp.md | 23 -- .../platform-core/agent/human-in-loop.sdp.md | 13 +- .../s-001-rejects-empty-string-id.sdp.md | 19 -- .../s-002-rejects-undefined-id.sdp.md | 19 -- .../s-003-rejects-whitespace-only-id.sdp.md | 19 -- ...4-rejects-empty-subscriptions-array.sdp.md | 19 -- ...005-rejects-undefined-subscriptions.sdp.md | 19 -- .../s-006-rejects-negative-threshold.sdp.md | 19 -- ...07-rejects-threshold-greater-than-1.sdp.md | 19 -- ...jects-empty-pattern-window-duration.sdp.md | 19 -- ...espace-only-pattern-window-duration.sdp.md | 19 -- ...-requires-approval-and-auto-approve.sdp.md | 20 -- ...jects-config-with-no-patterns-array.sdp.md | 19 -- ...ts-config-with-empty-patterns-array.sdp.md | 19 -- ...-accepts-valid-config-with-patterns.sdp.md | 19 -- ...config-without-confidence-threshold.sdp.md | 19 -- ...ansforms-a-standard-event-correctly.sdp.md | 20 -- ...-wraps-array-payload-in-raw-wrapper.sdp.md | 19 -- ...7-wraps-null-payload-in-raw-wrapper.sdp.md | 19 -- ...gh-object-payloads-without-wrapping.sdp.md | 19 -- ...d-from-the-chain-not-from-the-event.sdp.md | 19 -- ...scription-id-starts-with-sub-prefix.sdp.md | 19 -- ...bscription-id-contains-the-agent-id.sdp.md | 19 -- ...cription-id-contains-a-uuid-segment.sdp.md | 19 -- ...fferent-i-ds-when-timestamp-differs.sdp.md | 19 -- ...cess-with-handle-for-a-valid-config.sdp.md | 21 -- ...alid-config-code-for-invalid-config.sdp.md | 20 -- ...s-existing-checkpoint-when-provided.sdp.md | 23 -- ...hen-no-existing-checkpoint-provided.sdp.md | 24 -- .../behavior/platform-core/agent/init.sdp.md | 31 +- ...nd-carries-type-and-required-fields.sdp.md | 19 -- ...rries-optional-reason-when-provided.sdp.md | 20 -- ...d-has-undefined-reason-when-omitted.sdp.md | 19 -- ...-agent-command-carries-correct-type.sdp.md | 19 -- ...rries-optional-reason-when-provided.sdp.md | 20 -- ...config-overrides-with-nested-fields.sdp.md | 20 -- ...on-narrows-by-type-field-at-runtime.sdp.md | 20 -- ...-optional-in-agent-config-overrides.sdp.md | 19 -- ...s-with-only-max-requests-per-minute.sdp.md | 21 -- ...st-budget-overrides-with-only-daily.sdp.md | 20 -- ...s-contain-expected-values-and-count.sdp.md | 20 -- ...ult-carries-state-transition-fields.sdp.md | 19 -- ...rror-code-carries-message-and-state.sdp.md | 21 -- ...t-current-state-for-agent-not-found.sdp.md | 19 -- ...ted-union-narrows-to-success-branch.sdp.md | 19 -- ...ted-union-narrows-to-failure-branch.sdp.md | 19 -- ...l-lifecycle-validators-are-exported.sdp.md | 19 -- .../agent/lifecycle-commands.sdp.md | 5 +- ...cle-states-contains-all-four-states.sdp.md | 20 -- ...le-events-contains-all-seven-events.sdp.md | 20 -- ...t-target-for-every-valid-transition.sdp.md | 19 -- ...n-returns-true-for-every-valid-pair.sdp.md | 19 -- ...ll-for-representative-invalid-pairs.sdp.md | 19 -- ...id-pairs-exist-and-all-return-false.sdp.md | 20 -- ...rn-null-from-transition-agent-state.sdp.md | 20 -- ...ns-next-state-for-valid-transitions.sdp.md | 19 -- ...ition-throws-for-invalid-transition.sdp.md | 19 -- ...tion-error-message-includes-details.sdp.md | 19 -- ...-returns-correct-events-for-stopped.sdp.md | 19 -- ...m-returns-correct-events-for-active.sdp.md | 19 -- ...m-returns-correct-events-for-paused.sdp.md | 19 -- ...s-correct-events-for-error-recovery.sdp.md | 19 -- ...ions-returns-exactly-10-transitions.sdp.md | 19 -- ...sition-has-from-event-and-to-fields.sdp.md | 19 -- ...tions-contains-specific-transitions.sdp.md | 19 -- ...ns-returns-same-reference-each-call.sdp.md | 19 -- ...rrect-classification-for-all-states.sdp.md | 19 -- ...rrect-classification-for-all-states.sdp.md | 19 -- ...mmands-and-returns-null-for-unknown.sdp.md | 19 -- .../platform-core/agent/lifecycle-fsm.sdp.md | 5 +- ...-to-active-with-agent-started-audit.sdp.md | 24 -- ...002-rejects-start-from-active-state.sdp.md | 23 -- ...003-rejects-start-from-paused-state.sdp.md | 21 -- ...-with-agent-paused-audit-and-reason.sdp.md | 23 -- ...05-rejects-pause-from-stopped-state.sdp.md | 22 -- ...-to-active-with-agent-resumed-audit.sdp.md | 23 -- ...7-rejects-resume-from-stopped-state.sdp.md | 22 -- ...to-stopped-with-agent-stopped-audit.sdp.md | 23 -- ...o-stopped-as-universal-escape-hatch.sdp.md | 21 -- ...appy-path-error-recovery-to-stopped.sdp.md | 20 -- ...cts-stop-from-already-stopped-state.sdp.md | 22 -- ...-active-agent-with-merged-overrides.sdp.md | 23 -- ...aused-agent-transitioning-to-active.sdp.md | 22 -- ...ects-reconfigure-from-stopped-state.sdp.md | 22 -- ...-overrides-when-checkpoint-has-none.sdp.md | 22 -- ...ory-returns-all-5-handler-functions.sdp.md | 19 -- ...plete-a-start-pause-stop-round-trip.sdp.md | 19 -- ...ses-no-op-logger-when-none-provided.sdp.md | 20 -- ...-logs-warning-on-invalid-transition.sdp.md | 21 -- .../agent/lifecycle-handlers.sdp.md | 5 +- ...ately-without-calling-any-mutations.sdp.md | 21 -- ...ent-but-does-not-advance-checkpoint.sdp.md | 24 -- ...heckpoint-when-return-value-is-null.sdp.md | 25 -- ...rder-when-requires-approval-is-true.sdp.md | 21 -- ...pdates-checkpoint-with-correct-args.sdp.md | 21 -- ...24h-timeout-for-approval-expires-at.sdp.md | 21 -- ...val-when-requires-approval-is-false.sdp.md | 22 -- ...approval-is-true-but-command-is-nul.sdp.md | 23 -- ...-timeout-ms-for-approval-expires-at.sdp.md | 21 -- ...oint-but-skips-command-and-approval.sdp.md | 24 -- ...oint-position-equals-event-position.sdp.md | 26 -- ...tes-dead-letter-instead-of-throwing.sdp.md | 24 -- ...kpoint-when-audit-persistence-fails.sdp.md | 29 -- ...oint-when-command-persistence-fails.sdp.md | 27 -- ...int-when-approval-persistence-fails.sdp.md | 28 -- ...e-calls-include-verification-proofs.sdp.md | 23 -- ...en-dead-letter-recording-also-fails.sdp.md | 25 -- ...-result-dead-letter-recording-fails.sdp.md | 23 -- .../agent/oncomplete-handler.sdp.md | 71 +++- .../s-001-define-rule-based-pattern.sdp.md | 23 -- .../s-002-define-llm-analyzed-pattern.sdp.md | 22 -- ...s-003-window-respects-time-boundary.sdp.md | 22 -- .../s-004-window-respects-event-limit.sdp.md | 22 -- ...05-empty-window-returns-no-patterns.sdp.md | 22 -- ...events-lazily-for-memory-efficiency.sdp.md | 24 -- ...etect-churn-risk-from-cancellations.sdp.md | 22 -- ...t-fraud-risk-from-frequency-anomaly.sdp.md | 23 -- ...9-no-pattern-when-threshold-not-met.sdp.md | 21 -- .../s-010-llm-analyzes-event-sequence.sdp.md | 23 -- ...-response-includes-suggested-action.sdp.md | 22 -- ...-012-llm-timeout-handled-gracefully.sdp.md | 22 -- .../agent/pattern-detection.sdp.md | 13 +- ...l-decision-for-empty-patterns-array.sdp.md | 22 -- ...trigger-returns-true-and-no-analyze.sdp.md | 25 -- ...-pattern-when-trigger-returns-false.sdp.md | 22 -- ...ision-when-analyze-returns-detected.sdp.md | 26 -- ...n-when-analyze-returns-not-detected.sdp.md | 23 -- ...ropagates-error-when-analyze-throws.sdp.md | 21 -- ...-stops-after-first-matching-pattern.sdp.md | 23 -- ...pattern-when-first-trigger-is-false.sdp.md | 23 -- ...-pattern-when-min-events-is-not-met.sdp.md | 23 -- ...sses-pattern-when-min-events-is-met.sdp.md | 21 -- ...s-events-outside-the-pattern-window.sdp.md | 23 -- ...n-all-events-are-outside-the-window.sdp.md | 22 -- ...s-command-type-from-analysis-result.sdp.md | 24 -- ...ull-command-when-no-command-present.sdp.md | 20 -- ...and-payload-when-command-is-present.sdp.md | 20 -- ...-as-payload-when-no-command-present.sdp.md | 20 -- ...-when-confidence-is-below-threshold.sdp.md | 20 -- ...val-when-confidence-meets-threshold.sdp.md | 20 -- ...al-when-confidence-equals-threshold.sdp.md | 20 -- ...approval-when-no-command-is-present.sdp.md | 20 -- ...ommand-is-in-requires-approval-list.sdp.md | 20 -- ...hen-command-is-in-auto-approve-list.sdp.md | 20 -- ...-over-auto-approve-for-same-command.sdp.md | 20 -- ...l-command-for-trigger-only-decision.sdp.md | 22 -- ...-approval-for-trigger-only-decision.sdp.md | 21 -- ...ern-name-in-trigger-decision-reason.sdp.md | 21 -- ...nt-count-in-trigger-decision-reason.sdp.md | 21 -- ...all-event-i-ds-in-triggering-events.sdp.md | 21 -- ...-returns-0-6-confidence-for-1-event.sdp.md | 21 -- ...returns-0-7-confidence-for-2-events.sdp.md | 21 -- ...returns-0-8-confidence-for-3-events.sdp.md | 21 -- .../s-032-caps-at-0-85-for-4-events.sdp.md | 21 -- .../s-033-caps-at-0-85-for-10-events.sdp.md | 21 -- ...-returns-0-5-for-0-events-edge-case.sdp.md | 21 -- .../agent/pattern-executor.sdp.md | 31 +- ...-object-contains-all-expected-codes.sdp.md | 20 -- .../s-002-single-valid-pattern-passes.sdp.md | 19 -- ...ple-patterns-with-unique-names-pass.sdp.md | 19 -- ...ifferent-window-configurations-pass.sdp.md | 20 -- ...attern-with-analyze-function-passes.sdp.md | 19 -- .../s-006-empty-array-returns-valid.sdp.md | 19 -- ...07-two-patterns-with-same-name-fail.sdp.md | 20 -- ...plicate-detected-in-middle-of-array.sdp.md | 20 -- ...t-circuits-on-first-duplicate-found.sdp.md | 20 -- ...me-fails-with-pattern-name-required.sdp.md | 19 -- ...me-fails-with-pattern-name-required.sdp.md | 19 -- ...ort-circuits-before-duplicate-check.sdp.md | 19 -- ...tern-without-trigger-function-fails.sdp.md | 19 -- ...ern-with-non-function-trigger-fails.sdp.md | 19 -- ...s-to-registry-pattern-name-required.sdp.md | 19 -- ...d-maps-to-registry-trigger-required.sdp.md | 19 -- ...-error-codes-map-to-invalid-pattern.sdp.md | 19 -- .../s-018-accepts-readonly-array-input.sdp.md | 19 -- ...s-correct-discriminated-union-shape.sdp.md | 20 -- .../agent/pattern-registry.sdp.md | 21 +- ...r-codes-contain-all-expected-values.sdp.md | 20 -- ...pts-valid-window-with-duration-only.sdp.md | 19 -- ...pts-window-with-all-optional-fields.sdp.md | 19 -- ...-rejects-window-with-empty-duration.sdp.md | 19 -- ...ejects-window-with-missing-duration.sdp.md | 19 -- ...indow-with-non-positive-event-limit.sdp.md | 19 -- ...ts-window-with-negative-event-limit.sdp.md | 19 -- ...window-with-non-positive-min-events.sdp.md | 19 -- ...w-with-non-positive-load-batch-size.sdp.md | 19 -- ...window-with-non-integer-event-limit.sdp.md | 19 -- .../s-011-parses-days-format-correctly.sdp.md | 19 -- ...s-012-parses-hours-format-correctly.sdp.md | 19 -- ...013-parses-minutes-format-correctly.sdp.md | 19 -- .../s-014-handles-uppercase-units.sdp.md | 19 -- ...15-returns-null-for-invalid-formats.sdp.md | 19 -- ...ims-leading-and-trailing-whitespace.sdp.md | 19 -- ...rns-true-for-valid-duration-formats.sdp.md | 19 -- ...-false-for-invalid-duration-formats.sdp.md | 19 -- ...eturns-invalid-when-name-is-missing.sdp.md | 19 -- ...s-invalid-when-name-is-empty-string.sdp.md | 19 -- ...nvalid-when-name-is-whitespace-only.sdp.md | 19 -- ...rns-invalid-when-trigger-is-missing.sdp.md | 19 -- ...alid-when-trigger-is-not-a-function.sdp.md | 19 -- ...lid-when-duration-format-is-invalid.sdp.md | 19 -- ...urns-invalid-when-duration-is-empty.sdp.md | 19 -- ...id-when-event-limit-is-non-positive.sdp.md | 19 -- ...nvalid-when-event-limit-is-negative.sdp.md | 19 -- ...-when-event-limit-is-not-an-integer.sdp.md | 19 -- ...lid-when-min-events-is-non-positive.sdp.md | 19 -- ...hen-load-batch-size-is-non-positive.sdp.md | 19 -- ...eturns-valid-for-minimal-definition.sdp.md | 19 -- ...turns-valid-for-complete-definition.sdp.md | 19 -- ...-definition-with-all-window-options.sdp.md | 19 -- ...4-returns-the-definition-when-valid.sdp.md | 19 -- ...5-throws-error-when-name-is-missing.sdp.md | 19 -- ...hrows-error-when-trigger-is-missing.sdp.md | 19 -- ...rows-error-when-duration-is-invalid.sdp.md | 19 -- ...-error-code-in-thrown-error-message.sdp.md | 19 -- .../s-039-calculates-boundary-for-days.sdp.md | 19 -- ...s-040-calculates-boundary-for-hours.sdp.md | 19 -- ...041-calculates-boundary-for-minutes.sdp.md | 19 -- ...s-date-now-when-now-is-not-provided.sdp.md | 19 -- ...s-error-for-invalid-duration-format.sdp.md | 19 -- ...4-includes-events-within-the-window.sdp.md | 20 -- ...-excludes-events-outside-the-window.sdp.md | 20 -- ...udes-events-exactly-at-the-boundary.sdp.md | 20 -- ...s-event-limit-and-takes-most-recent.sdp.md | 20 -- ...es-not-limit-when-under-event-limit.sdp.md | 20 -- ...ns-empty-array-when-no-events-match.sdp.md | 20 -- .../s-050-handles-empty-events-array.sdp.md | 19 -- ...-when-events-count-meets-min-events.sdp.md | 19 -- ...hen-events-count-exceeds-min-events.sdp.md | 19 -- ...en-events-count-is-below-min-events.sdp.md | 19 -- .../s-054-defaults-to-min-events-of-1.sdp.md | 19 -- ...y-events-when-min-events-is-default.sdp.md | 19 -- ...ue-when-event-count-meets-threshold.sdp.md | 19 -- ...-when-event-count-exceeds-threshold.sdp.md | 19 -- ...when-event-count-is-below-threshold.sdp.md | 19 -- ...rns-true-when-event-type-is-present.sdp.md | 20 -- ...alse-when-event-type-is-not-present.sdp.md | 20 -- ...-of-multiple-event-types-is-present.sdp.md | 20 -- .../s-062-respects-min-count-parameter.sdp.md | 20 -- ...-returns-true-when-min-count-is-met.sdp.md | 20 -- ...ue-when-minimum-streams-are-present.sdp.md | 20 -- ...ns-false-when-below-minimum-streams.sdp.md | 20 -- ...066-counts-unique-streams-correctly.sdp.md | 20 -- ...eturns-true-when-all-triggers-match.sdp.md | 19 -- ...lse-when-any-trigger-does-not-match.sdp.md | 19 -- ...eturns-false-when-no-triggers-match.sdp.md | 19 -- ...turns-true-for-empty-triggers-array.sdp.md | 19 -- ...s-071-passes-events-to-each-trigger.sdp.md | 19 -- ...turns-true-when-any-trigger-matches.sdp.md | 19 -- ...eturns-true-when-all-triggers-match.sdp.md | 19 -- ...eturns-false-when-no-triggers-match.sdp.md | 19 -- ...urns-false-for-empty-triggers-array.sdp.md | 19 -- ...s-076-short-circuits-on-first-match.sdp.md | 19 -- ...threshold-with-event-type-using-all.sdp.md | 20 -- ...vent-type-missing-despite-count-met.sdp.md | 20 -- ...with-count-thresholds-alert-present.sdp.md | 20 -- ...nt-thresholds-neither-condition-met.sdp.md | 20 -- .../platform-core/agent/patterns.sdp.md | 5 +- ...des-are-present-with-correct-values.sdp.md | 19 -- ...-codes-object-has-exactly-8-entries.sdp.md | 19 -- .../s-003-accepts-valid-cost-budget.sdp.md | 19 -- ...-004-rejects-budget-with-zero-daily.sdp.md | 19 -- ...-rejects-budget-with-negative-daily.sdp.md | 19 -- ...budget-with-alert-threshold-above-1.sdp.md | 19 -- ...udget-with-negative-alert-threshold.sdp.md | 19 -- ...cepts-alert-threshold-at-boundary-0.sdp.md | 19 -- ...cepts-alert-threshold-at-boundary-1.sdp.md | 19 -- ...id-config-with-required-fields-only.sdp.md | 19 -- ...pts-config-with-all-optional-fields.sdp.md | 19 -- ...g-with-zero-max-requests-per-minute.sdp.md | 19 -- ...th-negative-max-requests-per-minute.sdp.md | 19 -- ...non-integer-max-requests-per-minute.sdp.md | 19 -- ...cts-config-with-zero-max-concurrent.sdp.md | 19 -- ...ejects-config-with-zero-queue-depth.sdp.md | 19 -- ...ax-requests-per-minute-is-undefined.sdp.md | 21 -- ...hen-max-requests-per-minute-is-zero.sdp.md | 19 -- ...max-requests-per-minute-is-negative.sdp.md | 19 -- ...quests-per-minute-is-not-an-integer.sdp.md | 19 -- ...ive-integer-max-requests-per-minute.sdp.md | 19 -- ...invalid-when-max-concurrent-is-zero.sdp.md | 20 -- ...lid-when-max-concurrent-is-negative.sdp.md | 19 -- ...en-max-concurrent-is-not-an-integer.sdp.md | 19 -- ...id-when-max-concurrent-is-undefined.sdp.md | 19 -- ...ns-invalid-when-queue-depth-is-zero.sdp.md | 20 -- ...nvalid-when-queue-depth-is-negative.sdp.md | 19 -- ...-when-queue-depth-is-not-an-integer.sdp.md | 19 -- ...alid-when-cost-budget-daily-is-zero.sdp.md | 20 -- ...-when-cost-budget-daily-is-negative.sdp.md | 19 -- ...t-budget-alert-threshold-is-below-0.sdp.md | 20 -- ...t-budget-alert-threshold-is-above-1.sdp.md | 19 -- ...rns-valid-when-cost-budget-is-valid.sdp.md | 19 -- ...rns-valid-for-complete-valid-config.sdp.md | 19 -- ...ult-config-has-correct-field-values.sdp.md | 22 -- ...36-default-config-passes-validation.sdp.md | 19 -- ...-config-with-specified-daily-budget.sdp.md | 19 -- ...-alert-threshold-when-not-specified.sdp.md | 19 -- ...-039-uses-specified-alert-threshold.sdp.md | 19 -- ...s-specified-max-requests-per-minute.sdp.md | 19 -- ...uests-per-minute-when-not-specified.sdp.md | 19 -- .../s-042-includes-all-optional-fields.sdp.md | 19 -- ...creates-error-with-code-and-message.sdp.md | 20 -- ...t-optional-fields-when-not-provided.sdp.md | 20 -- ...r-with-retry-after-ms-when-provided.sdp.md | 19 -- ...es-error-with-context-when-provided.sdp.md | 19 -- ...ith-both-retry-after-ms-and-context.sdp.md | 20 -- ...rns-true-for-valid-rate-limit-error.sdp.md | 19 -- ...urns-true-for-all-known-error-codes.sdp.md | 19 -- ...-returns-false-for-non-error-values.sdp.md | 19 -- .../s-051-retryable-error-codes.sdp.md | 19 -- ...rns-false-for-non-rate-limit-errors.sdp.md | 19 -- .../s-053-permanent-error-codes.sdp.md | 19 -- ...rns-false-for-non-rate-limit-errors.sdp.md | 19 -- ...attern-with-math-random-mocked-to-0.sdp.md | 19 -- ...aps-at-default-max-delay-of-60000ms.sdp.md | 19 -- .../s-057-caps-at-custom-max-delay.sdp.md | 19 -- ...oes-not-cap-when-delay-is-below-max.sdp.md | 19 -- ...s-059-adds-jitter-up-to-25-of-delay.sdp.md | 19 -- ...s-max-jitter-of-25-when-random-is-1.sdp.md | 19 -- ...1-uses-default-base-delay-of-1000ms.sdp.md | 19 -- ...2-uses-default-max-delay-of-60000ms.sdp.md | 19 -- .../s-063-returns-floored-integer.sdp.md | 19 -- ...urns-true-when-total-exceeds-budget.sdp.md | 19 -- ...ns-false-when-total-is-under-budget.sdp.md | 19 -- ...se-when-total-equals-budget-exactly.sdp.md | 19 -- ...urrent-spend-already-exceeds-budget.sdp.md | 19 -- ...les-zero-current-spend-under-budget.sdp.md | 19 -- ...dles-zero-current-spend-over-budget.sdp.md | 19 -- ...s-small-decimal-values-under-budget.sdp.md | 19 -- ...es-small-decimal-values-over-budget.sdp.md | 19 -- ...-spend-reaches-threshold-percentage.sdp.md | 19 -- ...s-true-when-spend-exceeds-threshold.sdp.md | 19 -- ...false-when-spend-is-below-threshold.sdp.md | 19 -- ...handles-threshold-of-0-always-alert.sdp.md | 19 -- ...es-threshold-of-1-below-full-budget.sdp.md | 19 -- ...ndles-threshold-of-1-at-full-budget.sdp.md | 19 -- ...ns-defaults-when-no-config-provided.sdp.md | 19 -- ...ults-when-undefined-config-provided.sdp.md | 19 -- ...es-provided-max-requests-per-minute.sdp.md | 19 -- ...lt-max-concurrent-when-not-provided.sdp.md | 19 -- .../s-082-uses-provided-max-concurrent.sdp.md | 19 -- ...fault-queue-depth-when-not-provided.sdp.md | 19 -- .../s-084-uses-provided-queue-depth.sdp.md | 19 -- ...preserves-cost-budget-when-provided.sdp.md | 19 -- ...clude-cost-budget-when-not-provided.sdp.md | 19 -- .../platform-core/agent/rate-limit.sdp.md | 5 +- ...xt-and-parses-a-valid-json-response.sdp.md | 21 -- ...les-non-json-response-with-defaults.sdp.md | 19 -- ...3-handles-malformed-json-gracefully.sdp.md | 19 -- ...-004-re-throws-generate-text-errors.sdp.md | 19 -- .../s-005-tracks-timing-in-llm-context.sdp.md | 19 -- ...read-id-in-llm-context-when-present.sdp.md | 19 -- ...d-from-llm-context-when-not-present.sdp.md | 19 -- ...dles-missing-usage-with-zero-tokens.sdp.md | 19 -- ...and-parses-json-response-for-reason.sdp.md | 19 -- ...-raw-text-when-response-is-not-json.sdp.md | 19 -- ...ws-generate-text-errors-from-reason.sdp.md | 19 -- ...logs-reasoning-start-and-completion.sdp.md | 20 -- .../platform-core/agent/thread-adapter.sdp.md | 25 +- ...ommands-sequentially-in-atomic-mode.sdp.md | 23 -- ...-and-skips-remaining-in-atomic-mode.sdp.md | 23 -- ...s-aggregate-commands-in-atomic-mode.sdp.md | 23 -- ...hared-correlation-id-in-atomic-mode.sdp.md | 22 -- ...relation-id-override-in-atomic-mode.sdp.md | 22 -- ...-even-with-failures-in-partial-mode.sdp.md | 23 -- ...ll-commands-succeed-in-partial-mode.sdp.md | 22 -- ...-aggregate-commands-in-partial-mode.sdp.md | 22 -- ...cts-max-concurrency-in-partial-mode.sdp.md | 22 -- ...e-on-error-is-false-in-partial-mode.sdp.md | 22 -- ...1-tracks-individual-command-results.sdp.md | 23 -- ...-includes-duration-for-each-command.sdp.md | 21 -- ...s-error-message-for-failed-commands.sdp.md | 21 -- ...lculates-correct-summary-statistics.sdp.md | 22 -- ...15-handles-executor-throwing-errors.sdp.md | 23 -- ...-016-handles-empty-batch-gracefully.sdp.md | 21 -- ...-max-command-count-before-execution.sdp.md | 23 -- ...-batch-exactly-at-max-command-count.sdp.md | 22 -- ...xactly-at-default-max-command-count.sdp.md | 22 -- ...-max-command-count-before-execution.sdp.md | 23 -- ...commands-from-wrong-bounded-context.sdp.md | 23 -- ...batch-executor-instance-via-factory.sdp.md | 19 -- .../platform-core/batch/batch-executor.sdp.md | 5 +- .../s-001-rejects-empty-batch.sdp.md | 19 -- ...2-accepts-batch-exactly-at-max-size.sdp.md | 19 -- ...03-rejects-batch-exceeding-max-size.sdp.md | 19 -- ...s-batch-exactly-at-default-max-size.sdp.md | 19 -- ...ts-batch-exceeding-default-max-size.sdp.md | 19 -- ...pts-valid-commands-without-registry.sdp.md | 19 -- ...mands-in-different-bounded-contexts.sdp.md | 20 -- .../s-008-requires-aggregate-id-option.sdp.md | 19 -- ...-requires-aggregate-id-field-option.sdp.md | 19 -- ...-all-commands-target-same-aggregate.sdp.md | 19 -- ...ommands-target-different-aggregates.sdp.md | 19 -- ...ggregate-with-explicit-aggregate-id.sdp.md | 20 -- ...om-first-command-when-not-specified.sdp.md | 20 -- ...arget-different-aggregate-instances.sdp.md | 20 -- ...ds-target-different-aggregate-types.sdp.md | 20 -- ...n-aggregate-commands-in-atomic-mode.sdp.md | 20 -- ...s-017-rejects-unregistered-commands.sdp.md | 20 -- ...-matching-specified-bounded-context.sdp.md | 20 -- ...commands-from-wrong-bounded-context.sdp.md | 20 -- ...s-020-extracts-id-from-command-args.sdp.md | 19 -- ...returns-undefined-for-missing-field.sdp.md | 19 -- ...urns-undefined-for-non-string-value.sdp.md | 19 -- ...023-groups-commands-by-aggregate-id.sdp.md | 21 -- ...4-uses-placeholder-for-missing-i-ds.sdp.md | 21 -- .../platform-core/batch/validation.sdp.md | 5 +- ...t-current-version-is-returned-as-is.sdp.md | 23 -- ...002-state-is-migrated-from-v1-to-v2.sdp.md | 24 -- ...003-state-is-migrated-from-v1-to-v3.sdp.md | 25 -- ...ate-version-is-treated-as-version-0.sdp.md | 23 -- ...ull-input-throws-cms-upcaster-error.sdp.md | 21 -- ...ned-input-throws-cms-upcaster-error.sdp.md | 21 -- ...ation-chain-throws-at-creation-time.sdp.md | 19 -- ...e-version-throws-cms-upcaster-error.sdp.md | 20 -- ...function-error-propagates-mid-chain.sdp.md | 21 -- ...migration-function-error-propagates.sdp.md | 21 -- ...returned-as-is-via-upcast-if-needed.sdp.md | 22 -- ...te-is-migrated-via-upcast-if-needed.sdp.md | 23 -- ...lidation-passes-when-state-is-valid.sdp.md | 21 -- ...idation-fails-when-state-is-invalid.sdp.md | 21 -- ...upcaster-error-via-upcast-if-needed.sdp.md | 22 -- .../s-016-error-has-correct-name.sdp.md | 20 -- .../s-017-error-has-correct-code.sdp.md | 20 -- .../s-018-error-has-correct-message.sdp.md | 20 -- ...-error-stores-context-when-provided.sdp.md | 20 -- ...undefined-context-when-not-provided.sdp.md | 20 -- .../s-021-error-is-instanceof-error.sdp.md | 20 -- ...on-passes-for-current-version-state.sdp.md | 22 -- ...ersion-state-with-empty-description.sdp.md | 22 -- ...tion-passes-after-upcasting-from-v1.sdp.md | 22 -- ...er-upcasting-produces-invalid-state.sdp.md | 22 -- ...s-026-static-default-value-is-added.sdp.md | 23 -- ...027-computed-default-value-is-added.sdp.md | 22 -- ...028-computed-default-accesses-state.sdp.md | 21 -- ...s-029-existing-fields-are-preserved.sdp.md | 23 -- .../s-030-field-is-renamed.sdp.md | 24 -- ...-fields-are-preserved-when-renaming.sdp.md | 23 -- ...d-value-in-renamed-field-is-handled.sdp.md | 22 -- .../s-033-specified-field-is-removed.sdp.md | 23 -- ...-fields-are-preserved-when-removing.sdp.md | 24 -- ...xistent-field-is-handled-gracefully.sdp.md | 22 -- ...-migration-works-in-migration-chain.sdp.md | 23 -- ...tiple-helper-migrations-are-chained.sdp.md | 26 -- .../platform-core/cms/upcaster.sdp.md | 6 +- ...y-four-entries-in-the-correct-order.sdp.md | 20 -- ...hema-accepts-valid-category-strings.sdp.md | 19 -- ...ema-rejects-invalid-category-values.sdp.md | 19 -- ...fault-command-category-is-aggregate.sdp.md | 19 -- ...-guard-accepts-all-valid-categories.sdp.md | 19 -- ...6-type-guard-rejects-invalid-values.sdp.md | 19 -- ...d-categories-are-returned-unchanged.sdp.md | 19 -- ...valid-values-normalize-to-aggregate.sdp.md | 19 -- ...fication-of-categories-as-aggregate.sdp.md | 19 -- ...sification-of-categories-as-process.sdp.md | 19 -- ...ssification-of-categories-as-system.sdp.md | 19 -- ...assification-of-categories-as-batch.sdp.md | 19 -- ...ema-accepts-valid-aggregate-targets.sdp.md | 19 -- ...a-rejects-invalid-aggregate-targets.sdp.md | 19 -- .../platform-core/commands/categories.sdp.md | 6 +- ...ly-four-entries-with-correct-values.sdp.md | 20 -- ...-members-have-correct-string-values.sdp.md | 19 -- ...uard-accepts-valid-error-categories.sdp.md | 19 -- ...4-type-guard-rejects-invalid-values.sdp.md | 19 -- ...rror-is-created-with-all-properties.sdp.md | 20 -- ...mmand-error-is-an-instance-of-error.sdp.md | 19 -- ...ns-existing-command-error-unchanged.sdp.md | 19 -- ...nd-error-from-wraps-a-regular-error.sdp.md | 20 -- ...and-error-from-wraps-a-string-value.sdp.md | 19 -- ...d-error-from-wraps-an-unknown-value.sdp.md | 19 -- ...-json-serializes-error-with-context.sdp.md | 20 -- ...2-to-json-handles-undefined-context.sdp.md | 19 -- .../s-013-factory-creates-domain-error.sdp.md | 19 -- ...14-factory-creates-validation-error.sdp.md | 19 -- ...5-factory-creates-concurrency-error.sdp.md | 19 -- ...actory-creates-infrastructure-error.sdp.md | 19 -- ...017-factory-creates-not-found-error.sdp.md | 20 -- ...actory-creates-already-exists-error.sdp.md | 19 -- ...factory-creates-invalid-state-error.sdp.md | 20 -- ...-factory-creates-unauthorized-error.sdp.md | 19 -- ...-factory-creates-rate-limited-error.sdp.md | 19 -- ...-returns-true-for-matching-category.sdp.md | 19 -- ...rns-false-for-non-matching-category.sdp.md | 19 -- ...returns-false-for-non-command-error.sdp.md | 19 -- ...ble-errors-are-identified-correctly.sdp.md | 21 -- ...n-recoverable-error-gets-delay-of-1.sdp.md | 19 -- ...ency-error-delays-escalate-then-cap.sdp.md | 19 -- ...ture-error-delays-escalate-then-cap.sdp.md | 19 -- ...ror-gets-infrastructure-style-delay.sdp.md | 19 -- .../platform-core/commands/errors.sdp.md | 6 +- ...category-and-preserves-command-type.sdp.md | 20 -- ...target-is-present-on-parsed-command.sdp.md | 19 -- ...et-is-undefined-when-not-configured.sdp.md | 19 -- ...a-rejects-a-mismatched-command-type.sdp.md | 19 -- ...ts-commands-missing-required-fields.sdp.md | 19 -- ...category-and-preserves-command-type.sdp.md | 20 -- ...s-type-is-present-on-parsed-command.sdp.md | 19 -- ...pe-is-undefined-when-not-configured.sdp.md | 19 -- ...category-and-preserves-command-type.sdp.md | 20 -- ...uires-idempotency-defaults-to-false.sdp.md | 19 -- ...ires-idempotency-can-be-set-to-true.sdp.md | 19 -- ...a-assigns-batch-category-with-items.sdp.md | 20 -- ...config-is-present-on-parsed-command.sdp.md | 19 -- ...ms-that-fail-item-schema-validation.sdp.md | 19 -- ...s-015-empty-items-array-is-accepted.sdp.md | 19 -- ...-extracted-from-each-factory-schema.sdp.md | 19 -- ...on-command-schemas-return-undefined.sdp.md | 19 -- .../platform-core/commands/factories.sdp.md | 6 +- ...ixes-includes-all-standard-prefixes.sdp.md | 19 -- ...accepts-valid-create-prefixed-names.sdp.md | 19 -- ...rn-accepts-valid-add-prefixed-names.sdp.md | 19 -- ...s-update-change-and-modify-prefixes.sdp.md | 19 -- ...05-valid-command-names-are-accepted.sdp.md | 19 -- ...-invalid-command-names-are-rejected.sdp.md | 19 -- ...eturn-matched-prefix-and-valid-flag.sdp.md | 20 -- ...turns-suggestions-and-error-message.sdp.md | 21 -- ...-name-receives-corrected-suggestion.sdp.md | 19 -- ...uggestions-are-limited-to-at-most-3.sdp.md | 19 -- ...011-known-names-return-their-prefix.sdp.md | 19 -- ...lid-or-empty-names-return-undefined.sdp.md | 19 -- ...s-produce-correct-pascal-case-names.sdp.md | 19 -- .../platform-core/commands/naming.sdp.md | 6 +- ...ion-id-and-generates-correlation-id.sdp.md | 23 -- ...-chain-uses-provided-correlation-id.sdp.md | 20 -- .../s-003-chain-uses-provided-user-id.sdp.md | 20 -- .../s-004-chain-uses-provided-context.sdp.md | 20 -- ...05-chain-uses-provided-initiated-at.sdp.md | 19 -- ...-chain-accepts-all-options-together.sdp.md | 20 -- ...d-and-uses-event-id-as-causation-id.sdp.md | 22 -- ...-chain-inherits-user-id-from-source.sdp.md | 21 -- ...-chain-inherits-context-from-source.sdp.md | 21 -- ...n-merges-source-and-option-contexts.sdp.md | 21 -- ...akes-precedence-over-source-context.sdp.md | 21 -- ...served-when-options-have-no-context.sdp.md | 21 -- ...ext-used-when-source-has-no-context.sdp.md | 21 -- ...her-source-nor-options-have-context.sdp.md | 21 -- ...mpty-contexts-merge-to-empty-object.sdp.md | 21 -- ...erved-when-options-context-is-empty.sdp.md | 21 -- ...t-used-when-source-context-is-empty.sdp.md | 21 -- ...ived-chain-uses-provided-command-id.sdp.md | 21 -- ...ed-chain-uses-provided-initiated-at.sdp.md | 21 -- ...cts-correlation-id-and-causation-id.sdp.md | 20 -- ...s-021-includes-user-id-when-present.sdp.md | 20 -- ...022-excludes-user-id-when-undefined.sdp.md | 20 -- .../s-023-merges-additional-metadata.sdp.md | 21 -- ...itiated-at-or-command-id-from-chain.sdp.md | 20 -- ...for-chains-with-same-correlation-id.sdp.md | 21 -- ...ains-with-different-correlation-ids.sdp.md | 21 -- ...sation-id-matches-parent-command-id.sdp.md | 21 -- ...n-child-causation-id-does-not-match.sdp.md | 21 -- ...hain-where-command-is-its-own-cause.sdp.md | 20 -- ...-user-command-through-saga-reaction.sdp.md | 27 -- ...s-correlation-id-across-three-links.sdp.md | 23 -- .../platform-core/correlation/chain.sdp.md | 6 +- .../s-001-record-a-new-correlation.sdp.md | 20 -- ...event-i-ds-for-existing-correlation.sdp.md | 19 -- ...eturn-null-for-non-existent-command.sdp.md | 19 -- ...rn-correlation-for-existing-command.sdp.md | 20 -- .../s-005-filter-by-bounded-context.sdp.md | 19 -- ...row-when-bounded-context-is-missing.sdp.md | 19 -- .../s-007-respect-limit-parameter.sdp.md | 19 -- ...return-true-for-command-with-events.sdp.md | 19 -- ...turn-false-for-non-existent-command.sdp.md | 19 -- ...rn-event-count-for-existing-command.sdp.md | 19 -- ...1-return-0-for-non-existent-command.sdp.md | 19 -- ...eate-a-correlation-service-instance.sdp.md | 19 -- .../correlation/correlation-service.sdp.md | 6 +- ...-execution-without-scope-operations.sdp.md | 25 -- ...hema-version-and-category-in-events.sdp.md | 26 -- ...ed-decider-result-returns-rejection.sdp.md | 24 -- ...r-result-returns-failure-with-event.sdp.md | 24 -- ...ected-version-matches-scope-version.sdp.md | 25 -- ...heck-detects-stale-expected-version.sdp.md | 24 -- ...e-not-found-when-expected-version-0.sdp.md | 24 -- ...s-new-scope-with-expected-version-0.sdp.md | 25 -- ...mit-detects-concurrent-modification.sdp.md | 26 -- ...c-commit-tracks-updated-stream-i-ds.sdp.md | 25 -- ...invalid-scope-key-returns-rejection.sdp.md | 23 -- ...-missing-entities-returns-rejection.sdp.md | 24 -- .../behavior/platform-core/dcb/execute.sdp.md | 40 ++- ...ate-valid-scope-key-from-components.sdp.md | 21 -- ...in-colons-for-composite-identifiers.sdp.md | 20 -- ...e-scope-key-throws-on-invalid-input.sdp.md | 20 -- ...y-returns-scope-key-for-valid-input.sdp.md | 20 -- ...-key-returns-null-for-invalid-input.sdp.md | 20 -- ...rse-valid-scope-key-into-components.sdp.md | 20 -- ...omposite-scope-id-containing-colons.sdp.md | 20 -- ...key-returns-null-for-invalid-format.sdp.md | 20 -- ...ey-returns-null-for-valid-scope-key.sdp.md | 20 -- ...pe-key-empty-error-for-empty-string.sdp.md | 21 -- ...rns-error-for-missing-tenant-prefix.sdp.md | 21 -- ...turns-error-for-malformed-scope-key.sdp.md | 20 -- ...s-013-is-valid-scope-key-type-guard.sdp.md | 20 -- ...d-scope-key-throws-on-invalid-input.sdp.md | 20 -- ...d-scope-key-succeeds-on-valid-input.sdp.md | 20 -- ...ope-tenant-checks-tenant-membership.sdp.md | 21 -- ...id-returns-tenant-id-from-scope-key.sdp.md | 21 -- ...e-returns-scope-type-from-scope-key.sdp.md | 21 -- ...-id-returns-scope-id-from-scope-key.sdp.md | 21 -- .../platform-core/dcb/scope-key.sdp.md | 4 +- ...s-load-state-with-correct-entity-id.sdp.md | 20 -- ...ith-state-command-input-and-context.sdp.md | 22 -- ...pply-update-with-correct-parameters.sdp.md | 20 -- ...ccess-result-with-correct-structure.sdp.md | 21 -- ...ion-correctly-from-existing-version.sdp.md | 21 -- ...result-without-calling-apply-update.sdp.md | 21 -- ...d-result-includes-rejection-details.sdp.md | 21 -- ...result-without-calling-apply-update.sdp.md | 21 -- ...-includes-failure-event-and-details.sdp.md | 21 -- ...andler-propagates-load-state-errors.sdp.md | 20 -- ...-custom-error-handler-when-provided.sdp.md | 22 -- ...ustom-error-handler-returns-nothing.sdp.md | 20 -- ...s-013-handler-logs-debug-on-success.sdp.md | 20 -- ...014-handler-logs-debug-on-rejection.sdp.md | 20 -- ...015-handler-logs-error-on-exception.sdp.md | 20 -- ...ates-unique-event-id-per-invocation.sdp.md | 20 -- ...es-schema-version-in-event-metadata.sdp.md | 20 -- ...ds-correct-stream-id-from-entity-id.sdp.md | 20 -- ...y-load-state-with-correct-entity-id.sdp.md | 20 -- ...ll-state-when-entity-does-not-exist.sdp.md | 22 -- ...ndler-calls-insert-for-new-entities.sdp.md | 20 -- ...ess-with-version-1-for-new-entities.sdp.md | 21 -- ...ect-event-metadata-for-new-entities.sdp.md | 20 -- ...h-existing-state-when-entity-exists.sdp.md | 21 -- ...ejection-when-entity-already-exists.sdp.md | 21 -- ...l-insert-when-entity-already-exists.sdp.md | 20 -- ...th-version-0-for-non-existent-entit.sdp.md | 22 -- ...not-call-insert-on-business-failure.sdp.md | 20 -- ...er-propagates-try-load-state-errors.sdp.md | 20 -- ...ty-handler-propagates-insert-errors.sdp.md | 21 -- ...-custom-error-handler-when-provided.sdp.md | 22 -- ...gs-debug-on-entity-creation-success.sdp.md | 20 -- ...ity-handler-logs-debug-on-rejection.sdp.md | 20 -- ...s-unique-event-id-for-each-creation.sdp.md | 20 -- ...includes-schema-version-in-metadata.sdp.md | 20 -- ...te-rejection-short-circuits-handler.sdp.md | 23 -- ...urning-undefined-allows-normal-flow.sdp.md | 23 -- ...validate-receives-correct-arguments.sdp.md | 20 -- ...-039-pre-validate-failure-is-logged.sdp.md | 19 -- ...lly-without-pre-validate-configured.sdp.md | 21 -- .../platform-core/decider/factory.sdp.md | 5 +- ...s-001-dcb-succeeds-on-first-attempt.sdp.md | 23 -- ...ted-result-passes-through-unchanged.sdp.md | 21 -- ...triggers-retry-with-updated-version.sdp.md | 23 -- ...x-retries-exceeded-returns-rejected.sdp.md | 22 -- ...e-aware-scheduling-key-is-preserved.sdp.md | 20 -- ...retry-calls-on-complete-with-result.sdp.md | 22 -- ...version-advances-during-retry-delay.sdp.md | 23 -- ...008-backoff-increases-exponentially.sdp.md | 20 -- .../s-009-backoff-is-capped-at-maximum.sdp.md | 20 -- ...ndomness-to-prevent-thundering-herd.sdp.md | 20 -- ...-injectable-for-deterministic-tests.sdp.md | 20 -- .../dcb-conflict-retry.sdp.md | 5 +- ...pter-plugs-into-existing-middleware.sdp.md | 22 -- ...-command-returns-standard-rejection.sdp.md | 22 -- ...03-dcb-retry-uses-separate-workpool.sdp.md | 22 -- ...mutation-receives-correct-arguments.sdp.md | 22 -- ...th-on-complete-callback-integration.sdp.md | 22 -- ...t-retry-dcb-mutations-clarification.sdp.md | 22 -- ...te-limiter-component-creates-tables.sdp.md | 21 -- ...-008-multiple-workpools-can-coexist.sdp.md | 22 -- .../integration-patterns.sdp.md | 5 +- ...er-allows-request-within-rate-limit.sdp.md | 21 -- ...ejects-request-exceeding-rate-limit.sdp.md | 21 -- ...ferent-keys-have-independent-limits.sdp.md | 20 -- ...mmand-types-have-independent-limits.sdp.md | 20 -- .../rate-limit-adapter.sdp.md | 18 +- .../s-001-create-basic-fat-event.sdp.md | 27 -- ...te-fat-event-with-schema-definition.sdp.md | 23 -- .../s-003-schema-validation-failure.sdp.md | 24 -- ...reate-fat-event-with-correlation-id.sdp.md | 24 -- .../s-005-embed-selected-entity-fields.sdp.md | 23 -- .../s-006-embed-all-fields.sdp.md | 22 -- .../s-007-embed-non-existent-field.sdp.md | 22 -- .../s-008-embed-collection-of-items.sdp.md | 23 -- ...bed-collection-with-field-selection.sdp.md | 23 -- .../s-010-embed-empty-collection.sdp.md | 22 -- .../ecst/fat-event-builder.sdp.md | 5 +- ...vent-type-for-integration-scenarios.sdp.md | 22 -- ...002-inventory-updated-as-thin-event.sdp.md | 22 -- .../s-003-order-submitted-as-fat-event.sdp.md | 23 -- ...004-published-language-event-is-fat.sdp.md | 23 -- .../s-005-category-suggests-event-type.sdp.md | 21 -- .../ecst/fat-vs-thin-selection.sdp.md | 5 +- ...001-mark-single-field-for-shredding.sdp.md | 22 -- ...-mark-multiple-fields-for-shredding.sdp.md | 21 -- ...s-003-non-pii-fields-are-not-marked.sdp.md | 21 -- ...find-all-shreddable-fields-in-event.sdp.md | 22 -- ...-no-shreddable-fields-returns-empty.sdp.md | 21 -- ...006-mark-fields-in-collection-items.sdp.md | 22 -- .../s-007-shred-all-marked-fields.sdp.md | 24 -- ...008-non-marked-fields-are-preserved.sdp.md | 22 -- ...009-shred-event-returns-audit-trail.sdp.md | 24 -- ...-if-event-has-any-shreddable-fields.sdp.md | 21 -- ...eck-event-without-shreddable-fields.sdp.md | 21 -- .../s-012-count-shreddable-fields.sdp.md | 21 -- .../s-013-cannot-shred-required-fields.sdp.md | 21 -- ...ping-shred-and-required-fields-work.sdp.md | 22 -- .../platform-core/ecst/privacy-markers.sdp.md | 5 +- ...a-version-is-included-automatically.sdp.md | 22 -- ...s-002-custom-schema-version-is-used.sdp.md | 21 -- ...003-valid-payload-passes-validation.sdp.md | 22 -- ...ing-required-field-fails-validation.sdp.md | 23 -- ...5-wrong-field-type-fails-validation.sdp.md | 23 -- ...s-006-migrate-v1-event-to-v2-format.sdp.md | 24 -- ...igration-needed-for-current-version.sdp.md | 22 -- ...nown-source-version-fails-migration.sdp.md | 22 -- ...pare-older-version-to-newer-version.sdp.md | 21 -- ...pare-newer-version-to-older-version.sdp.md | 21 -- .../s-011-compare-equal-versions.sdp.md | 21 -- ...mpare-versions-with-different-minor.sdp.md | 21 -- ...3-invalid-semver-format-is-rejected.sdp.md | 21 -- ...-negative-major-version-is-rejected.sdp.md | 21 -- ...-negative-minor-version-is-rejected.sdp.md | 21 -- ...nt-needs-migration-to-newer-version.sdp.md | 22 -- ...not-need-migration-for-same-version.sdp.md | 22 -- ...not-need-migration-for-older-target.sdp.md | 22 -- .../ecst/schema-versioning.sdp.md | 5 +- ...ge-is-50-when-half-events-processed.sdp.md | 19 -- ...ge-is-100-when-all-events-processed.sdp.md | 19 -- ...ge-is-100-when-total-events-is-zero.sdp.md | 19 -- ...age-has-one-decimal-place-precision.sdp.md | 19 -- ...ning-time-estimated-from-throughput.sdp.md | 19 -- ...-undefined-when-no-events-processed.sdp.md | 19 -- ...undefined-when-elapsed-time-is-zero.sdp.md | 19 -- ...e-is-zero-when-all-events-processed.sdp.md | 19 -- ...lculate-progress-for-running-replay.sdp.md | 22 -- ...ulate-progress-for-completed-replay.sdp.md | 21 -- ...ss-includes-error-for-failed-replay.sdp.md | 20 -- .../s-012-running-status-is-active.sdp.md | 19 -- .../s-013-paused-status-is-active.sdp.md | 19 -- ...-014-completed-status-is-not-active.sdp.md | 19 -- .../s-015-failed-status-is-not-active.sdp.md | 19 -- .../s-016-completed-status-is-terminal.sdp.md | 19 -- .../s-017-failed-status-is-terminal.sdp.md | 19 -- .../s-018-cancelled-status-is-terminal.sdp.md | 19 -- ...-019-running-status-is-not-terminal.sdp.md | 19 -- ...s-020-paused-status-is-not-terminal.sdp.md | 19 -- .../event-replay/replay-progress.sdp.md | 3 +- ...tition-key-generates-correct-format.sdp.md | 20 -- ...on-key-handles-various-stream-types.sdp.md | 19 -- ...d-event-enqueues-action-to-workpool.sdp.md | 21 -- ...event-returns-work-id-from-workpool.sdp.md | 19 -- ...vent-passes-on-complete-to-workpool.sdp.md | 19 -- ...includes-idempotency-key-in-context.sdp.md | 19 -- ...d-action-handler-returns-a-function.sdp.md | 19 -- ...ler-invokes-idempotent-append-event.sdp.md | 19 -- .../durable-append.sdp.md | 3 +- ...y-format-is-event-id-target-context.sdp.md | 20 -- ...events-get-different-partition-keys.sdp.md | 19 -- ...es-tracking-records-for-each-target.sdp.md | 22 -- ...ueues-delivery-actions-via-workpool.sdp.md | 22 -- ...ns-publication-i-ds-for-each-target.sdp.md | 21 -- ...-passed-through-to-tracking-records.sdp.md | 21 -- ...-status-returns-all-target-contexts.sdp.md | 21 -- ...turns-empty-array-for-unknown-event.sdp.md | 19 -- ...ication-re-enqueues-delivery-action.sdp.md | 22 -- ...s-not-found-for-unknown-publication.sdp.md | 19 -- ...delivered-for-delivered-publication.sdp.md | 20 -- ...-increments-attempt-count-correctly.sdp.md | 20 -- ...ates-status-to-delivered-on-success.sdp.md | 21 -- ...increments-attempt-count-on-failure.sdp.md | 21 -- ...eates-dead-letter-after-max-retries.sdp.md | 21 -- .../durable-publication.sdp.md | 3 +- ...nd-type-entity-id-command-id-format.sdp.md | 19 -- ...y-uses-action-type-entity-id-format.sdp.md | 19 -- ...-uses-saga-type-saga-id-step-format.sdp.md | 19 -- ...b-type-schedule-id-timestamp-format.sdp.md | 19 -- ...ppend-with-idempotency-key-succeeds.sdp.md | 20 -- ...icate-append-returns-existing-event.sdp.md | 20 -- ...-with-different-payload-is-rejected.sdp.md | 20 -- ...potency-keys-create-separate-events.sdp.md | 19 -- ...licate-on-recheck-returns-duplicate.sdp.md | 19 -- ...-010-true-occ-conflict-throws-error.sdp.md | 19 -- .../idempotent-append.sdp.md | 3 +- ...intent-key-generates-correct-format.sdp.md | 19 -- ...key-handles-various-operation-types.sdp.md | 19 -- ...ates-intent-event-with-correct-type.sdp.md | 20 -- ...cord-intent-schedules-timeout-check.sdp.md | 19 -- ...ent-returns-intent-key-and-event-id.sdp.md | 19 -- ...rd-completion-creates-success-event.sdp.md | 19 -- ...on-creates-failure-event-with-error.sdp.md | 20 -- ...ompletion-creates-abandonment-event.sdp.md | 19 -- ...ady-resolved-when-completion-exists.sdp.md | 20 -- ...ates-abandonment-when-no-completion.sdp.md | 20 -- ...-check-intent-timeout-is-idempotent.sdp.md | 19 -- ...-returns-intents-without-completion.sdp.md | 20 -- ...d-intents-filters-by-operation-type.sdp.md | 19 -- .../intent-completion.sdp.md | 3 +- ...handler-returns-a-callable-function.sdp.md | 19 -- ...tracts-idempotency-key-from-context.sdp.md | 19 -- ...completed-event-from-success-result.sdp.md | 20 -- ...nt-failed-event-from-failure-result.sdp.md | 20 -- ...-idempotent-append-event-internally.sdp.md | 20 -- ...pletes-without-error-for-duplicates.sdp.md | 19 -- .../outbox-handler.sdp.md | 3 +- ...processing-creates-no-poison-record.sdp.md | 20 -- ...rds-attempt-but-does-not-quarantine.sdp.md | 21 -- ...comes-quarantined-after-max-retries.sdp.md | 20 -- ...arantined-event-is-silently-skipped.sdp.md | 20 -- ...ed-when-alert-on-quarantine-is-true.sdp.md | 19 -- ...d-when-alert-on-quarantine-is-false.sdp.md | 19 -- ...-returns-true-for-quarantined-event.sdp.md | 19 -- ...rns-false-for-non-quarantined-event.sdp.md | 19 -- ...nt-record-returns-normalized-record.sdp.md | 19 -- ...returns-null-for-non-existent-event.sdp.md | 19 -- ...tine-event-clears-quarantine-status.sdp.md | 20 -- ...returns-not-found-for-missing-event.sdp.md | 19 -- ...s-not-quarantined-for-pending-event.sdp.md | 19 -- ...-events-returns-quarantined-records.sdp.md | 19 -- ...ntined-events-filters-by-projection.sdp.md | 19 -- ...stats-returns-aggregated-statistics.sdp.md | 20 -- .../poison-event.sdp.md | 3 +- ...reates-bus-with-empty-subscriptions.sdp.md | 20 -- ...th-subscriptions-sorted-by-priority.sdp.md | 20 -- ...-result-when-no-subscriptions-match.sdp.md | 23 -- ...matching-subscriptions-via-workpool.sdp.md | 23 -- ...ues-multiple-matching-subscriptions.sdp.md | 22 -- ...passes-transformed-args-to-workpool.sdp.md | 20 -- ...s-partition-key-in-workpool-context.sdp.md | 24 -- ...ion-level-on-complete-when-provided.sdp.md | 20 -- ...m-config-when-subscription-has-none.sdp.md | 20 -- ...-subscription-nor-config-provides-i.sdp.md | 20 -- ...ype-and-false-for-unsubscribed-type.sdp.md | 21 -- ...e-when-wildcard-subscription-exists.sdp.md | 21 -- ...s-false-when-no-subscriptions-exist.sdp.md | 20 -- .../s-014-returns-all-subscriptions.sdp.md | 21 -- ...s-empty-array-when-no-subscriptions.sdp.md | 20 -- ...riptions-matching-event-type-filter.sdp.md | 20 -- ...scriptions-matching-category-filter.sdp.md | 20 -- ...-to-subscriptions-in-priority-order.sdp.md | 20 -- ...-workpool-errors-when-enqueue-fails.sdp.md | 20 -- ...scriptions-if-earlier-enqueue-fails.sdp.md | 21 -- ...-subscriptions-match-any-event-type.sdp.md | 20 -- ...xt-filter-only-matches-that-context.sdp.md | 20 -- ...s-instance-with-empty-subscriptions.sdp.md | 20 -- ...s-024-creates-event-bus-with-config.sdp.md | 19 -- .../eventbus/convex-event-bus.sdp.md | 5 +- ...-subscription-with-name-and-handler.sdp.md | 19 -- ...02-builder-defaults-to-empty-filter.sdp.md | 19 -- ...03-builder-defaults-to-priority-100.sdp.md | 19 -- ...defaults-partition-key-to-stream-id.sdp.md | 19 -- ...-event-types-sets-event-type-filter.sdp.md | 19 -- ...for-categories-sets-category-filter.sdp.md | 19 -- ...ontexts-sets-bounded-context-filter.sdp.md | 19 -- ...tream-types-sets-stream-type-filter.sdp.md | 19 -- ...ning-multiple-filters-composes-them.sdp.md | 19 -- ...mplete-sets-the-on-complete-handler.sdp.md | 19 -- .../s-011-with-priority-sets-priority.sdp.md | 19 -- ...h-transform-sets-custom-transformer.sdp.md | 19 -- ...sets-custom-partition-key-extractor.sdp.md | 19 -- ...adds-a-subscription-to-the-registry.sdp.md | 19 -- .../s-015-add-supports-chaining.sdp.md | 19 -- ...rows-on-duplicate-subscription-name.sdp.md | 19 -- ...lder-that-adds-to-registry-on-build.sdp.md | 19 -- ...ns-returns-configured-subscriptions.sdp.md | 19 -- ...duplicate-names-via-subscribe-build.sdp.md | 19 -- ...s-throws-on-duplicate-names-via-add.sdp.md | 19 -- ...cription-creates-standalone-builder.sdp.md | 19 -- ...-022-empty-filter-matches-any-event.sdp.md | 20 -- ...ches-when-event-type-is-in-the-list.sdp.md | 20 -- ...-when-event-type-is-not-in-the-list.sdp.md | 19 -- ...atches-when-category-is-in-the-list.sdp.md | 20 -- ...ch-when-category-is-not-in-the-list.sdp.md | 19 -- ...when-bounded-context-is-in-the-list.sdp.md | 19 -- ...-bounded-context-is-not-in-the-list.sdp.md | 19 -- ...hes-when-stream-type-is-in-the-list.sdp.md | 19 -- ...when-stream-type-is-not-in-the-list.sdp.md | 19 -- ...1-all-filters-matching-returns-true.sdp.md | 19 -- ...returns-false-with-combined-filters.sdp.md | 19 -- ...returns-false-with-combined-filters.sdp.md | 19 -- .../platform-core/eventbus/registry.sdp.md | 5 +- ...vent-id-with-bounded-context-prefix.sdp.md | 19 -- ...02-copies-all-core-fields-correctly.sdp.md | 19 -- .../s-003-copies-payload-correctly.sdp.md | 19 -- ...ion-id-and-causation-id-in-metadata.sdp.md | 19 -- ...-ids-for-different-bounded-contexts.sdp.md | 19 -- ...s-complete-new-event-data-structure.sdp.md | 20 -- ...ent-id-without-generating-a-new-one.sdp.md | 19 -- ...ext-from-event-id-when-not-provided.sdp.md | 19 -- ...bounded-context-when-explicitly-set.sdp.md | 19 -- ...-context-when-no-underscore-present.sdp.md | 19 -- ...rrectly-with-pre-generated-event-id.sdp.md | 19 -- ...with-multiple-underscores-correctly.sdp.md | 19 -- ...ructure-with-pre-generated-event-id.sdp.md | 20 -- .../platform-core/events/builder.sdp.md | 5 +- ...y-four-entries-in-the-correct-order.sdp.md | 20 -- ...hema-accepts-valid-category-strings.sdp.md | 19 -- ...ema-rejects-invalid-category-values.sdp.md | 19 -- ...04-default-event-category-is-domain.sdp.md | 19 -- .../s-005-default-schema-version-is-1.sdp.md | 19 -- ...-guard-accepts-all-valid-categories.sdp.md | 19 -- ...7-type-guard-rejects-invalid-values.sdp.md | 19 -- ...d-categories-are-returned-unchanged.sdp.md | 19 -- ...-invalid-values-normalize-to-domain.sdp.md | 19 -- ...ive-integers-are-returned-unchanged.sdp.md | 19 -- ...s-011-invalid-values-normalize-to-1.sdp.md | 19 -- ...-categories-as-external-or-internal.sdp.md | 19 -- ...tion-of-categories-as-cross-context.sdp.md | 19 -- .../platform-core/events/category.sdp.md | 5 +- ...s-accepted-and-fields-are-preserved.sdp.md | 19 -- ...issing-required-fields-are-rejected.sdp.md | 19 -- ...data-with-only-event-id-is-rejected.sdp.md | 19 -- ...-optional-causation-id-is-supported.sdp.md | 20 -- ...invalid-version-values-are-rejected.sdp.md | 19 -- ...06-zero-global-position-is-accepted.sdp.md | 19 -- ...ncludes-category-and-schema-version.sdp.md | 20 -- ...efaults-to-domain-when-not-provided.sdp.md | 19 -- ...ion-defaults-to-1-when-not-provided.sdp.md | 19 -- ...0-all-valid-categories-are-accepted.sdp.md | 19 -- ...011-invalid-categories-are-rejected.sdp.md | 19 -- ...tching-event-type-and-valid-payload.sdp.md | 21 -- ...ejects-events-with-wrong-event-type.sdp.md | 19 -- ...chema-validates-payload-constraints.sdp.md | 19 -- ...ptional-metadata-field-is-supported.sdp.md | 20 -- ...vent-schema-sets-category-to-domain.sdp.md | 22 -- ...efaults-to-domain-when-not-in-input.sdp.md | 19 -- ...on-defaults-to-1-when-not-in-config.sdp.md | 19 -- ...chema-version-in-config-is-enforced.sdp.md | 19 -- ...20-wrong-schema-version-is-rejected.sdp.md | 19 -- ...schema-sets-category-to-integration.sdp.md | 21 -- ...ts-to-integration-when-not-in-input.sdp.md | 19 -- ...efaults-to-1-for-integration-events.sdp.md | 19 -- ...y-to-trigger-with-entity-id-payload.sdp.md | 21 -- ...ger-event-rejects-missing-entity-id.sdp.md | 20 -- ...faults-to-trigger-when-not-in-input.sdp.md | 19 -- ...m-schema-version-for-trigger-events.sdp.md | 19 -- ...s-category-to-fat-with-full-payload.sdp.md | 23 -- ...y-defaults-to-fat-when-not-in-input.sdp.md | 19 -- ...d-payload-with-valid-positive-value.sdp.md | 19 -- ...sted-payload-rejects-negative-value.sdp.md | 19 -- ...ustom-schema-version-for-fat-events.sdp.md | 19 -- ...nt-schema-accepts-any-payload-shape.sdp.md | 19 -- ...main-event-schema-includes-defaults.sdp.md | 21 -- ...ent-schema-allows-optional-metadata.sdp.md | 19 -- .../platform-core/events/schemas.sdp.md | 5 +- ...t-current-version-is-returned-as-is.sdp.md | 23 -- ...002-event-is-migrated-from-v1-to-v2.sdp.md | 23 -- ...003-event-is-migrated-from-v1-to-v3.sdp.md | 24 -- ...ation-chain-throws-at-creation-time.sdp.md | 19 -- ...version-throws-future-version-error.sdp.md | 21 -- ...6-validation-passes-after-migration.sdp.md | 21 -- ...07-validation-fails-after-migration.sdp.md | 21 -- ...stered-and-unregistered-event-types.sdp.md | 20 -- ...-returns-all-registered-event-types.sdp.md | 20 -- ...nd-registration-overrides-the-first.sdp.md | 23 -- ...1-registered-event-type-is-upcasted.sdp.md | 21 -- ...stered-event-type-is-returned-as-is.sdp.md | 22 -- ...s-013-static-default-value-is-added.sdp.md | 21 -- ...value-is-added-from-event-timestamp.sdp.md | 21 -- ...015-field-is-renamed-in-the-payload.sdp.md | 22 -- ...r-has-correct-name-code-and-message.sdp.md | 20 -- ...-error-stores-context-when-provided.sdp.md | 19 -- ...undefined-context-when-not-provided.sdp.md | 19 -- .../s-019-error-is-instanceof-error.sdp.md | 19 -- ...rror-preserves-specific-code-values.sdp.md | 19 -- ...-021-error-preserves-custom-message.sdp.md | 19 -- .../platform-core/events/upcaster.sdp.md | 5 +- ...-created-with-correct-initial-state.sdp.md | 19 -- .../s-002-fsm-preserves-the-definition.sdp.md | 20 -- ...s-003-valid-transitions-return-true.sdp.md | 19 -- ...04-invalid-transitions-return-false.sdp.md | 19 -- ...alone-can-transition-function-works.sdp.md | 20 -- ...-006-valid-transitions-do-not-throw.sdp.md | 19 -- ...nsition-throws-fsm-transition-error.sdp.md | 19 -- ...n-error-includes-transition-details.sdp.md | 21 -- ...ne-assert-transition-function-works.sdp.md | 20 -- ...ns-valid-transitions-for-each-state.sdp.md | 19 -- ...ne-valid-transitions-function-works.sdp.md | 19 -- ...-012-terminal-states-are-identified.sdp.md | 19 -- ...-non-terminal-states-are-identified.sdp.md | 19 -- ...andalone-is-terminal-function-works.sdp.md | 20 -- .../s-015-valid-states-return-true.sdp.md | 19 -- .../s-016-invalid-states-return-false.sdp.md | 19 -- ...alone-is-valid-state-function-works.sdp.md | 20 -- .../s-018-error-has-correct-properties.sdp.md | 24 -- ...-handles-terminal-states-in-message.sdp.md | 19 -- specs/behavior/platform-core/fsm/fsm.sdp.md | 5 +- ...uccess-result-has-correct-structure.sdp.md | 22 -- ...success-result-preserves-typed-data.sdp.md | 20 -- ...sult-returns-status-as-literal-type.sdp.md | 20 -- ...rejected-result-has-code-and-reason.sdp.md | 19 -- ...sult-includes-context-when-provided.sdp.md | 22 -- ...ult-omits-context-when-not-provided.sdp.md | 19 -- ...sult-returns-status-as-literal-type.sdp.md | 19 -- .../s-008-failed-result-has-event-data.sdp.md | 20 -- ...udes-expected-version-when-provided.sdp.md | 20 -- ...sult-includes-context-when-provided.sdp.md | 19 -- ...s-both-expected-version-and-context.sdp.md | 20 -- ...tional-properties-when-not-provided.sdp.md | 20 -- ...sult-returns-status-as-literal-type.sdp.md | 19 -- .../platform-core/handlers/result.sdp.md | 5 +- ...ded-i-ds-preserving-the-input-value.sdp.md | 20 -- ...ssignable-to-plain-string-variables.sdp.md | 19 -- ...-ds-support-standard-string-methods.sdp.md | 21 -- ...uce-correctly-prefixed-branded-i-ds.sdp.md | 19 -- ...-produce-valid-uuid-v7-after-prefix.sdp.md | 20 -- ...-returns-true-for-non-empty-strings.sdp.md | 19 -- ...ring-returns-false-for-empty-string.sdp.md | 19 -- ...returns-false-for-non-string-values.sdp.md | 19 -- ...string-narrows-type-for-type-script.sdp.md | 19 -- ...enerated-command-ids-are-all-unique.sdp.md | 19 -- ...ated-correlation-ids-are-all-unique.sdp.md | 19 -- .../behavior/platform-core/ids/branded.sdp.md | 5 +- ...ated-id-matches-the-expected-format.sdp.md | 19 -- ...-002-each-call-produces-a-unique-id.sdp.md | 19 -- ...-with-the-provided-context-and-type.sdp.md | 19 -- ...s-are-accepted-for-context-and-type.sdp.md | 19 -- ...pty-context-or-type-throws-an-error.sdp.md | 19 -- ...sallowed-characters-throws-an-error.sdp.md | 19 -- ...ype-with-underscore-throws-an-error.sdp.md | 19 -- ...ed-id-is-parsed-into-its-components.sdp.md | 19 -- ...roduced-by-generate-id-is-parseable.sdp.md | 21 -- ...containing-underscores-is-preserved.sdp.md | 19 -- ...-fewer-than-three-parts-return-null.sdp.md | 19 -- ...h-empty-context-or-type-return-null.sdp.md | 19 -- ...ected-format-and-is-unique-per-call.sdp.md | 20 -- ...ected-format-and-is-unique-per-call.sdp.md | 20 -- ...ormat-and-uses-the-provided-context.sdp.md | 20 -- ...-016-event-i-ds-are-unique-per-call.sdp.md | 19 -- ...s-017-empty-context-throws-an-error.sdp.md | 19 -- ...ected-format-and-is-unique-per-call.sdp.md | 20 -- ...uid-portion-has-version-7-indicator.sdp.md | 19 -- ...l-i-ds-are-lexicographically-sorted.sdp.md | 19 -- .../platform-core/ids/generator.sdp.md | 7 +- ...-001-define-acl-for-payment-gateway.sdp.md | 22 -- .../s-002-acl-translates-field-names.sdp.md | 22 -- .../s-003-acl-transforms-field-values.sdp.md | 22 -- ...4-acl-translates-domain-to-external.sdp.md | 22 -- ...und-trip-translation-preserves-data.sdp.md | 21 -- ...006-missing-required-external-field.sdp.md | 22 -- .../s-007-invalid-external-field-type.sdp.md | 22 -- .../s-008-unknown-external-status.sdp.md | 22 -- ...ent-gateways-with-different-schemas.sdp.md | 22 -- .../integration/anti-corruption-layer.sdp.md | 5 +- ...er-upstream-downstream-relationship.sdp.md | 23 -- ...ster-customer-supplier-relationship.sdp.md | 23 -- ...03-register-conformist-relationship.sdp.md | 21 -- .../s-004-register-acl-relationship.sdp.md | 21 -- ...5-register-partnership-relationship.sdp.md | 22 -- ...register-shared-kernel-relationship.sdp.md | 22 -- ...ster-open-host-service-relationship.sdp.md | 22 -- ...08-query-all-relationships-for-a-bc.sdp.md | 22 -- .../s-009-query-upstream-b-cs.sdp.md | 21 -- ...-010-query-bc-with-no-relationships.sdp.md | 21 -- ...-duplicate-relationship-is-rejected.sdp.md | 21 -- ...eferential-relationship-is-rejected.sdp.md | 20 -- .../integration/context-map.sdp.md | 5 +- .../s-001-generate-sample-from-schema.sdp.md | 22 -- ...-002-generate-sample-with-overrides.sdp.md | 22 -- .../s-003-generate-multiple-samples.sdp.md | 22 -- .../s-004-producer-emits-valid-event.sdp.md | 21 -- .../s-005-producer-emits-invalid-event.sdp.md | 22 -- .../s-006-producer-emits-wrong-version.sdp.md | 21 -- ...-007-consumer-processes-valid-event.sdp.md | 21 -- ...sumer-handles-all-sample-variations.sdp.md | 21 -- .../s-009-consumer-rejects-valid-event.sdp.md | 21 -- ...10-compatible-producer-and-consumer.sdp.md | 22 -- ...-011-incompatible-versions-detected.sdp.md | 24 -- .../s-012-compatible-with-downcaster.sdp.md | 23 -- ...-013-contract-violation-is-recorded.sdp.md | 24 -- .../s-014-query-contract-violations.sdp.md | 22 -- ...15-query-violations-since-timestamp.sdp.md | 21 -- ...6-no-violations-returns-empty-array.sdp.md | 21 -- .../integration/contract-testing.sdp.md | 5 +- .../s-001-upcast-v1-event-to-v2.sdp.md | 22 -- ...ain-upcasters-for-multiple-versions.sdp.md | 22 -- .../s-003-upcast-adds-computed-field.sdp.md | 22 -- .../s-004-downcast-v2-event-to-v1.sdp.md | 22 -- ...ncast-removes-required-in-new-field.sdp.md | 23 -- ...-006-register-schema-with-migration.sdp.md | 21 -- .../s-007-missing-migration-path.sdp.md | 22 -- ...8-breaking-change-without-migration.sdp.md | 22 -- ...-detect-version-from-event-metadata.sdp.md | 21 -- ...10-infer-version-from-payload-shape.sdp.md | 22 -- .../integration/event-versioning.sdp.md | 5 +- ...-create-publisher-with-empty-routes.sdp.md | 20 -- ...002-create-publisher-with-one-route.sdp.md | 21 -- ...-duplicate-source-event-type-routes.sdp.md | 22 -- ...r-registered-and-unregistered-types.sdp.md | 23 -- ...-005-retrieve-all-registered-routes.sdp.md | 22 -- ...6-return-null-when-no-route-matches.sdp.md | 23 -- ...ranslate-and-publish-a-domain-event.sdp.md | 24 -- .../s-008-enqueue-multiple-handlers.sdp.md | 23 -- ...y-integration-event-metadata-fields.sdp.md | 23 -- ...clude-user-id-when-present-in-chain.sdp.md | 22 -- ...omit-user-id-when-absent-from-chain.sdp.md | 22 -- ...ass-on-complete-handler-to-workpool.sdp.md | 23 -- .../s-013-propagate-translator-error.sdp.md | 23 -- ...-014-verify-workpool-context-fields.sdp.md | 22 -- ...ld-a-route-with-all-required-fields.sdp.md | 22 -- ...t-schema-version-via-version-method.sdp.md | 19 -- ...17-pass-multiple-handlers-to-notify.sdp.md | 19 -- ...or-function-transforms-source-event.sdp.md | 19 -- ...19-reject-missing-source-event-type.sdp.md | 19 -- ...20-reject-missing-target-event-type.sdp.md | 19 -- .../s-021-reject-missing-translator.sdp.md | 19 -- .../s-022-reject-missing-handlers.sdp.md | 19 -- ...ia-define-integration-route-factory.sdp.md | 20 -- ...eate-publisher-via-factory-function.sdp.md | 21 -- ...-integration-route-error-properties.sdp.md | 20 -- ...ntegration-route-error-with-context.sdp.md | 19 -- ...ration-route-error-instanceof-chain.sdp.md | 20 -- .../integration-event-publisher.sdp.md | 5 +- ...1-register-integration-event-schema.sdp.md | 23 -- .../s-002-register-multiple-versions.sdp.md | 22 -- ...s-003-duplicate-version-is-rejected.sdp.md | 21 -- ...t-domain-event-to-integration-event.sdp.md | 25 -- ...s-005-convert-with-explicit-version.sdp.md | 21 -- ...s-006-unregistered-event-type-fails.sdp.md | 21 -- ...lid-payload-fails-schema-validation.sdp.md | 22 -- ...8-event-tagging-for-routing-and-dcb.sdp.md | 23 -- .../s-009-multiple-tags-for-routing.sdp.md | 21 -- ...ster-schema-with-compatibility-mode.sdp.md | 22 -- ...011-query-schema-compatibility-mode.sdp.md | 21 -- .../s-012-list-all-event-types.sdp.md | 21 -- .../s-013-list-versions-for-event-type.sdp.md | 21 -- .../integration/published-language.sdp.md | 5 +- ...et-contains-all-provided-invariants.sdp.md | 19 -- ...rray-is-immutable-and-a-frozen-copy.sdp.md | 20 -- ...turns-true-when-all-invariants-pass.sdp.md | 19 -- ...ns-false-when-first-invariant-fails.sdp.md | 19 -- ...s-false-when-second-invariant-fails.sdp.md | 19 -- ...urns-false-when-all-invariants-fail.sdp.md | 19 -- ...-not-throw-when-all-invariants-pass.sdp.md | 19 -- ...ows-on-first-failure-with-fail-fast.sdp.md | 19 -- ...sert-all-throws-correct-error-class.sdp.md | 19 -- ...ws-error-with-context-when-provided.sdp.md | 19 -- ...urns-valid-when-all-invariants-pass.sdp.md | 19 -- ...idate-all-collects-single-violation.sdp.md | 20 -- ...violations-without-short-circuiting.sdp.md | 20 -- ...ations-from-non-adjacent-invariants.sdp.md | 20 -- ...n-invariant-has-no-context-function.sdp.md | 20 -- ...016-empty-set-passes-all-operations.sdp.md | 21 -- ...ses-all-operations-with-valid-state.sdp.md | 21 -- .../invariants/create-invariant-set.sdp.md | 5 +- ...invariant-has-correct-name-and-code.sdp.md | 19 -- ...-when-state-satisfies-the-predicate.sdp.md | 19 -- ...e-when-state-violates-the-predicate.sdp.md | 19 -- ...-does-not-throw-when-state-is-valid.sdp.md | 19 -- ...variant-error-when-state-is-invalid.sdp.md | 19 -- ...-has-correct-code-for-invalid-state.sdp.md | 19 -- ...s-correct-message-for-invalid-state.sdp.md | 19 -- ...s-correct-context-for-invalid-state.sdp.md | 19 -- ...eturns-valid-result-for-valid-state.sdp.md | 19 -- ...violation-details-for-invalid-state.sdp.md | 19 -- ...ed-context-when-no-context-function.sdp.md | 19 -- ...ed-context-when-no-context-function.sdp.md | 19 -- ...ses-parameter-to-find-matching-item.sdp.md | 20 -- ...false-when-parameter-does-not-match.sdp.md | 20 -- ...ameter-in-error-message-and-context.sdp.md | 21 -- ...6-validate-uses-parameter-in-result.sdp.md | 20 -- ...s-error-of-the-correct-custom-class.sdp.md | 21 -- .../invariants/create-invariant.sdp.md | 5 +- ...ting-an-error-with-code-and-message.sdp.md | 21 -- ...002-including-context-when-provided.sdp.md | 19 -- ...text-is-undefined-when-not-provided.sdp.md | 19 -- .../s-004-error-has-proper-stack-trace.sdp.md | 20 -- ...ting-a-context-specific-error-class.sdp.md | 20 -- ...-contexts-produce-different-classes.sdp.md | 22 -- ...007-typed-error-codes-are-supported.sdp.md | 19 -- ...pecific-errors-include-context-data.sdp.md | 19 -- ...c-class-has-proper-constructor-name.sdp.md | 19 -- ...-true-for-invariant-error-instances.sdp.md | 19 -- ...or-context-specific-error-instances.sdp.md | 19 -- ...s-false-for-regular-error-instances.sdp.md | 19 -- ...-returns-false-for-non-error-values.sdp.md | 19 -- ...e-when-error-has-the-specified-code.sdp.md | 19 -- ...lse-when-error-has-a-different-code.sdp.md | 19 -- ...alse-for-non-invariant-error-values.sdp.md | 19 -- ...-works-with-context-specific-errors.sdp.md | 20 -- .../invariants/invariant-error.sdp.md | 5 +- ...mmand-start-is-logged-at-info-level.sdp.md | 20 -- ...elds-are-included-in-start-log-data.sdp.md | 19 -- ...is-logged-at-info-level-with-result.sdp.md | 19 -- ...e-preserved-alongside-result-fields.sdp.md | 19 -- ...d-rejection-is-logged-at-warn-level.sdp.md | 19 -- ...ed-field-names-not-raw-code-message.sdp.md | 20 -- ...ess-failure-is-logged-at-warn-level.sdp.md | 19 -- ...lure-uses-failure-reason-not-reason.sdp.md | 20 -- ...-error-level-with-message-and-stack.sdp.md | 21 -- ...010-string-error-is-logged-directly.sdp.md | 20 -- ...ng-non-error-values-are-stringified.sdp.md | 19 -- .../s-012-null-error-is-stringified.sdp.md | 19 -- ...-013-undefined-error-is-stringified.sdp.md | 19 -- ...ck-trace-is-preserved-for-debugging.sdp.md | 19 -- ...cle-produces-start-and-success-logs.sdp.md | 19 -- ...fecycle-produces-info-and-warn-logs.sdp.md | 20 -- ...ecycle-produces-info-and-error-logs.sdp.md | 20 -- .../platform-core/logging/commands.sdp.md | 17 +- ...01-messages-are-prefixed-with-scope.sdp.md | 19 -- ...002-data-object-is-appended-as-json.sdp.md | 19 -- ...-data-object-is-omitted-from-output.sdp.md | 19 -- ...4-debug-level-allows-debug-messages.sdp.md | 19 -- ...nfo-level-suppresses-debug-messages.sdp.md | 19 -- ...006-info-level-allows-info-messages.sdp.md | 19 -- ...007-info-level-allows-warn-messages.sdp.md | 19 -- ...8-error-level-allows-error-messages.sdp.md | 19 -- ...lt-level-is-info-when-not-specified.sdp.md | 20 -- ...es-its-corresponding-console-method.sdp.md | 19 -- ...uts-structured-json-via-console-log.sdp.md | 19 -- ...-012-timing-start-uses-console-time.sdp.md | 19 -- ...13-timing-end-uses-console-time-end.sdp.md | 19 -- ...e-without-timing-uses-console-debug.sdp.md | 21 -- ...r-does-not-call-any-console-methods.sdp.md | 19 -- ...mplements-the-full-logger-interface.sdp.md | 19 -- ...logger-prefixes-with-combined-scope.sdp.md | 19 -- ...-logger-respects-provided-log-level.sdp.md | 20 -- ...child-logger-defaults-to-info-level.sdp.md | 20 -- .../platform-core/logging/scoped.sdp.md | 17 +- ...l-six-log-method-calls-are-captured.sdp.md | 19 -- ...-call-records-the-correct-log-level.sdp.md | 19 -- ...-message-text-is-captured-correctly.sdp.md | 19 -- ...ructured-data-is-captured-correctly.sdp.md | 19 -- ...data-is-undefined-when-not-provided.sdp.md | 19 -- ...timestamp-is-captured-within-bounds.sdp.md | 19 -- ...-007-clearing-resets-calls-to-empty.sdp.md | 19 -- ...lls-are-filtered-by-level-correctly.sdp.md | 19 -- ...-partial-and-exact-message-matching.sdp.md | 19 -- .../s-010-exact-message-match-works.sdp.md | 19 -- ...1-level-and-message-must-both-match.sdp.md | 19 -- ...urns-the-last-call-at-a-given-level.sdp.md | 19 -- ...ns-undefined-when-no-calls-at-level.sdp.md | 19 -- ...ltiple-accesses-return-equal-arrays.sdp.md | 19 -- ...aptures-info-report-warn-error-only.sdp.md | 20 -- ...debug-minimum-captures-all-6-levels.sdp.md | 19 -- ...7-error-minimum-captures-only-error.sdp.md | 20 -- ...arn-minimum-captures-warn-and-error.sdp.md | 20 -- .../s-019-clear-resets-filtered-calls.sdp.md | 19 -- ...essage-only-searches-filtered-calls.sdp.md | 19 -- .../platform-core/logging/testing.sdp.md | 23 +- ...values-increase-from-debug-to-error.sdp.md | 19 -- ...6-log-levels-are-defined-as-numbers.sdp.md | 19 -- .../s-003-default-log-level-is-info.sdp.md | 19 -- ...or-above-info-level-pass-the-filter.sdp.md | 19 -- ...s-below-info-level-are-filtered-out.sdp.md | 19 -- ...onfigured-level-allows-all-messages.sdp.md | 19 -- ...-configured-level-only-allows-error.sdp.md | 20 -- ...ed-level-allows-warn-and-error-only.sdp.md | 20 -- .../platform-core/logging/types.sdp.md | 11 +- ...e-and-returns-pipeline-for-chaining.sdp.md | 21 -- ...are-returns-true-and-decreases-size.sdp.md | 22 -- ...n-existent-middleware-returns-false.sdp.md | 19 -- ...eturns-true-for-existing-middleware.sdp.md | 20 -- ...s-false-for-non-existent-middleware.sdp.md | 19 -- ...-names-are-returned-sorted-by-order.sdp.md | 22 -- ...ecutes-directly-with-empty-pipeline.sdp.md | 19 -- ...efore-hooks-run-in-order-10-then-20.sdp.md | 21 -- ...after-hooks-run-in-order-20-then-10.sdp.md | 21 -- ...nts-subsequent-middleware-execution.sdp.md | 22 -- ...om-context-to-subsequent-middleware.sdp.md | 21 -- ...fore-hook-produces-middleware-error.sdp.md | 22 -- ...wing-handler-produces-handler-error.sdp.md | 21 -- ...-does-not-prevent-other-after-hooks.sdp.md | 22 -- ...-circuit-middleware-after-hooks-run.sdp.md | 22 -- .../s-016-clear-empties-the-pipeline.sdp.md | 21 -- ...same-middlewares-but-is-independent.sdp.md | 24 -- ...ry-creates-pipeline-without-options.sdp.md | 19 -- ...-creates-pipeline-with-debug-option.sdp.md | 19 -- .../middleware/middleware-pipeline.sdp.md | 6 +- ...ucture-validation-has-correct-order.sdp.md | 19 -- ...payload-passes-structure-validation.sdp.md | 19 -- ...is-rejected-by-structure-validation.sdp.md | 20 -- ...-command-skips-structure-validation.sdp.md | 19 -- ...n-validates-against-registry-schema.sdp.md | 19 -- ...idation-skips-unregistered-commands.sdp.md | 19 -- ...domain-validation-has-correct-order.sdp.md | 19 -- ...es-when-validator-returns-undefined.sdp.md | 19 -- ...hen-validator-returns-error-message.sdp.md | 21 -- ...n-skips-commands-without-validators.sdp.md | 19 -- ...bined-validators-return-first-error.sdp.md | 19 -- ...tors-return-undefined-when-all-pass.sdp.md | 19 -- ...-string-validates-non-empty-strings.sdp.md | 19 -- ...e-number-validates-positive-numbers.sdp.md | 19 -- ...number-range-validates-within-range.sdp.md | 19 -- ...starts-with-prefix-validates-prefix.sdp.md | 19 -- ...017-authorization-has-correct-order.sdp.md | 19 -- ...s-when-checker-returns-allowed-true.sdp.md | 19 -- ...-when-checker-returns-allowed-false.sdp.md | 22 -- ...orization-skips-configured-commands.sdp.md | 20 -- ...cker-allows-user-with-required-role.sdp.md | 19 -- ...-rejects-user-without-required-role.sdp.md | 19 -- ...sed-checker-requires-authentication.sdp.md | 20 -- ...cker-allows-when-no-roles-specified.sdp.md | 19 -- .../s-025-logging-has-correct-order.sdp.md | 19 -- ...are-logs-before-and-after-execution.sdp.md | 20 -- ...are-logs-errors-for-failed-commands.sdp.md | 19 -- ...-logger-does-not-throw-on-any-level.sdp.md | 19 -- ...er-outputs-correctly-formatted-logs.sdp.md | 19 -- ...-includes-timestamp-when-configured.sdp.md | 19 -- .../s-031-rate-limit-has-correct-order.sdp.md | 19 -- ...rate-limit-allows-when-not-exceeded.sdp.md | 19 -- ...33-rate-limit-rejects-when-exceeded.sdp.md | 21 -- ...ate-limit-skips-configured-commands.sdp.md | 20 -- ...35-by-user-id-generates-correct-key.sdp.md | 19 -- ...-by-user-id-handles-anonymous-users.sdp.md | 19 -- ...-command-type-generates-correct-key.sdp.md | 19 -- ...and-command-generates-composite-key.sdp.md | 19 -- ...ware-orders-follow-correct-sequence.sdp.md | 19 -- .../middleware/middlewares.sdp.md | 6 +- ...xecutes-normally-and-returns-result.sdp.md | 21 -- ...mains-closed-after-a-single-failure.sdp.md | 20 -- ...ult-failure-threshold-of-5-failures.sdp.md | 20 -- ...nsitions-to-half-open-after-timeout.sdp.md | 20 -- ...loses-on-success-in-half-open-state.sdp.md | 20 -- ...opens-on-failure-in-half-open-state.sdp.md | 20 -- ...esses-in-half-open-to-close-circuit.sdp.md | 20 -- ...-returns-closed-for-unknown-circuit.sdp.md | 19 -- ...-state-after-a-successful-operation.sdp.md | 19 -- ...ears-an-open-circuit-back-to-closed.sdp.md | 20 -- ...1-respects-custom-failure-threshold.sdp.md | 19 -- .../s-012-respects-custom-timeout.sdp.md | 20 -- ...t-resets-on-success-in-closed-state.sdp.md | 19 -- .../monitoring/circuit-breaker.sdp.md | 7 +- ...ctured-field-for-primary-projection.sdp.md | 23 -- ...red-field-for-secondary-projections.sdp.md | 25 -- ...uctured-field-for-failed-projection.sdp.md | 23 -- ...-routes-saga-work-to-saga-pool-only.sdp.md | 22 -- .../orchestration/command-orchestrator.sdp.md | 25 +- ...ccessful-cross-context-coordination.sdp.md | 22 -- .../s-002-compensation-on-step-failure.sdp.md | 22 -- ...e-last-completed-step-after-restart.sdp.md | 20 -- ...in-reverse-order-of-completed-steps.sdp.md | 20 -- .../s-005-first-trigger-starts-saga.sdp.md | 22 -- ...icate-trigger-returns-existing-saga.sdp.md | 22 -- ...saga-status-after-workflow-finishes.sdp.md | 20 -- ...saga-orchestration-executable-tests.sdp.md | 2 +- ...ses-pm-name-and-event-subscriptions.sdp.md | 20 -- ...d-and-false-for-unsubscribed-events.sdp.md | 19 -- ...-processes-event-and-emits-commands.sdp.md | 22 -- ...ed-event-with-not-subscribed-reason.sdp.md | 21 -- ...-005-passes-custom-state-to-handler.sdp.md | 20 -- ...es-stream-id-as-default-instance-id.sdp.md | 19 -- ...07-uses-custom-instance-id-resolver.sdp.md | 19 -- ...s-failed-status-when-handler-throws.sdp.md | 21 -- ...-status-when-command-emitter-throws.sdp.md | 20 -- .../s-010-returns-all-pm-names.sdp.md | 19 -- ...s-011-finds-executors-by-event-type.sdp.md | 19 -- ...vent-through-all-matching-executors.sdp.md | 22 -- ...-empty-array-for-unsubscribed-event.sdp.md | 20 -- ...-processes-single-matching-executor.sdp.md | 21 -- ...ptions-so-other-executors-still-run.sdp.md | 24 -- ...s-016-handles-empty-executors-array.sdp.md | 21 -- .../process-manager/executor.sdp.md | 5 +- .../s-001-idle-state-allows-start.sdp.md | 19 -- ...2-idle-state-rejects-invalid-events.sdp.md | 19 -- ...ssing-state-allows-success-and-fail.sdp.md | 19 -- ...essing-state-rejects-invalid-events.sdp.md | 19 -- .../s-005-completed-state-allows-reset.sdp.md | 19 -- ...pleted-state-rejects-invalid-events.sdp.md | 19 -- ...failed-state-allows-retry-and-reset.sdp.md | 19 -- ...failed-state-rejects-invalid-events.sdp.md | 19 -- ...sitions-return-correct-target-state.sdp.md | 19 -- ...010-invalid-transitions-return-null.sdp.md | 19 -- ...e-state-has-exactly-one-valid-event.sdp.md | 20 -- ...-state-has-exactly-two-valid-events.sdp.md | 20 -- ...d-state-has-exactly-one-valid-event.sdp.md | 20 -- ...-state-has-exactly-two-valid-events.sdp.md | 20 -- ...transitions-with-correct-properties.sdp.md | 20 -- ...ll-expected-transitions-are-present.sdp.md | 19 -- ...e-array-reference-on-repeated-calls.sdp.md | 19 -- ...-valid-transition-returns-new-state.sdp.md | 19 -- ...throws-with-pm-name-and-instance-id.sdp.md | 19 -- .../s-020-completed-is-terminal.sdp.md | 19 -- ...21-non-terminal-states-return-false.sdp.md | 19 -- .../s-022-failed-is-an-error-state.sdp.md | 19 -- ...s-023-non-error-states-return-false.sdp.md | 19 -- ...tates-have-at-least-one-valid-event.sdp.md | 19 -- ...5-critical-reachability-paths-exist.sdp.md | 19 -- ...ath-idle-to-processing-to-completed.sdp.md | 19 -- ...e-path-idle-to-processing-to-failed.sdp.md | 19 -- ...o-failed-to-processing-to-completed.sdp.md | 19 -- ...-to-processing-to-completed-to-idle.sdp.md | 19 -- ...dle-to-processing-to-failed-to-idle.sdp.md | 19 -- .../process-manager/lifecycle.sdp.md | 5 +- ...1-register-a-single-process-manager.sdp.md | 20 -- ...-register-multiple-process-managers.sdp.md | 19 -- ...licate-registration-throws-an-error.sdp.md | 19 -- .../s-004-get-returns-pm-by-name.sdp.md | 20 -- ...et-returns-undefined-for-unknown-pm.sdp.md | 19 -- ...-has-returns-true-for-registered-pm.sdp.md | 19 -- ...s-returns-false-for-unregistered-pm.sdp.md | 19 -- ...urns-empty-array-for-empty-registry.sdp.md | 19 -- ...09-list-returns-all-registered-p-ms.sdp.md | 20 -- .../s-010-size-is-0-for-empty-registry.sdp.md | 19 -- ...11-size-reflects-registration-count.sdp.md | 19 -- ...s-pm-subscribed-to-a-specific-event.sdp.md | 20 -- ...m-for-shared-event-across-hybrid-pm.sdp.md | 20 -- ...eturns-empty-for-unknown-event-type.sdp.md | 19 -- ...for-event-matching-no-subscriptions.sdp.md | 19 -- ...urns-empty-array-for-empty-registry.sdp.md | 19 -- ...7-returns-unique-sorted-event-types.sdp.md | 20 -- ...ray-for-empty-registry-for-commands.sdp.md | 19 -- ...returns-unique-sorted-command-types.sdp.md | 20 -- .../s-020-filters-by-orders-context.sdp.md | 20 -- .../s-021-filters-by-inventory-context.sdp.md | 20 -- ...2-returns-empty-for-unknown-context.sdp.md | 19 -- ...s-023-filters-by-event-trigger-type.sdp.md | 20 -- .../s-024-filters-by-time-trigger-type.sdp.md | 20 -- ...-025-filters-by-hybrid-trigger-type.sdp.md | 20 -- ...urns-time-and-hybrid-triggered-p-ms.sdp.md | 20 -- ...-excludes-event-only-triggered-p-ms.sdp.md | 19 -- ...ime-triggered-p-ms-have-cron-config.sdp.md | 19 -- ...ll-handlers-for-order-shipped-event.sdp.md | 20 -- ...-triggered-p-ms-for-cron-scheduling.sdp.md | 21 -- ...s-and-commands-is-handled-correctly.sdp.md | 25 -- ...d-p-ms-where-some-have-empty-arrays.sdp.md | 20 -- .../process-manager/registry.sdp.md | 5 +- ...correlation-strategy-uses-stream-id.sdp.md | 19 -- ...-property-is-extracted-from-payload.sdp.md | 19 -- ...correlation-property-not-in-payload.sdp.md | 19 -- ...orrelation-property-is-not-a-string.sdp.md | 19 -- ...d-when-correlation-property-is-null.sdp.md | 19 -- ...n-correlation-property-is-undefined.sdp.md | 19 -- ...lation-property-value-is-used-as-is.sdp.md | 19 -- ...lation-property-value-is-used-as-is.sdp.md | 19 -- ...elation-strategy-extracts-correctly.sdp.md | 19 -- ...0-subscription-name-without-context.sdp.md | 19 -- ...-011-subscription-name-with-context.sdp.md | 19 -- .../s-012-default-priority-is-200.sdp.md | 20 -- ...3-custom-priority-overrides-default.sdp.md | 19 -- ...s-by-event-types-from-pm-definition.sdp.md | 19 -- ...creates-mutable-copy-of-event-types.sdp.md | 19 -- ...andler-args-produces-correct-output.sdp.md | 22 -- ...stance-id-from-correlation-strategy.sdp.md | 21 -- ...to-handler-args-transformer-is-used.sdp.md | 22 -- ...19-default-partition-by-instance-id.sdp.md | 21 -- ...tion-strategy-affects-partition-key.sdp.md | 21 -- ...21-custom-get-partition-key-is-used.sdp.md | 22 -- ...handler-reference-is-passed-through.sdp.md | 19 -- ...produces-correct-subscription-names.sdp.md | 20 -- .../s-024-missing-handler-throws-error.sdp.md | 19 -- ...iority-applies-to-all-subscriptions.sdp.md | 19 -- ...bscription-has-correct-event-filter.sdp.md | 20 -- ...itions-produces-empty-subscriptions.sdp.md | 19 -- ...28-handlers-match-their-definitions.sdp.md | 20 -- ...29-default-priority-constant-is-200.sdp.md | 19 -- ...-after-projections-and-before-sagas.sdp.md | 20 -- .../process-manager/subscription.sdp.md | 5 +- ...-all-valid-pm-statuses-are-accepted.sdp.md | 19 -- ...s-manager-statuses-passes-the-guard.sdp.md | 19 -- ...invalid-status-strings-are-rejected.sdp.md | 19 -- ...jected-by-is-process-manager-status.sdp.md | 19 -- ...jected-by-is-process-manager-status.sdp.md | 19 -- ...ss-manager-status-is-case-sensitive.sdp.md | 19 -- ...ype-narrowing-works-in-conditionals.sdp.md | 19 -- ...ard-works-as-array-filter-predicate.sdp.md | 19 -- ...ontains-exactly-4-statuses-in-order.sdp.md | 19 -- ...-readonly-array-with-correct-bounds.sdp.md | 20 -- ...tuses-contains-all-lifecycle-states.sdp.md | 19 -- ...tuses-is-in-logical-lifecycle-order.sdp.md | 19 -- ...d-dead-letter-statuses-are-accepted.sdp.md | 19 -- ...ad-letter-statuses-passes-the-guard.sdp.md | 19 -- ...e-rejected-by-is-dead-letter-status.sdp.md | 19 -- ...e-rejected-by-is-dead-letter-status.sdp.md | 19 -- ...e-rejected-by-is-dead-letter-status.sdp.md | 19 -- ...ning-valid-dl-statuses-are-rejected.sdp.md | 19 -- ...ead-letter-status-is-case-sensitive.sdp.md | 19 -- ...ype-narrowing-works-in-conditionals.sdp.md | 19 -- ...ard-works-as-array-filter-predicate.sdp.md | 19 -- ...ontains-exactly-3-statuses-in-order.sdp.md | 19 -- ...-readonly-array-with-correct-bounds.sdp.md | 20 -- ...ses-contains-all-dead-letter-states.sdp.md | 19 -- ...atuses-is-in-logical-workflow-order.sdp.md | 19 -- ...th-all-fields-has-correct-structure.sdp.md | 28 -- ...ired-fields-has-undefined-optionals.sdp.md | 21 -- ...r-supports-each-status-individually.sdp.md | 19 -- ...es-command-type-and-complex-payload.sdp.md | 22 -- ...failed-command-allows-empty-payload.sdp.md | 19 -- ...d-letter-handles-high-attempt-count.sdp.md | 19 -- ...-letter-handles-long-error-messages.sdp.md | 19 -- ...ter-handles-complex-context-objects.sdp.md | 21 -- .../process-manager/types.sdp.md | 5 +- ...ocess-event-when-no-pm-state-exists.sdp.md | 23 -- ...-global-position-exceeds-checkpoint.sdp.md | 20 -- ...m-state-is-updated-after-processing.sdp.md | 19 -- ...n-global-position-equals-checkpoint.sdp.md | 22 -- ...al-position-is-less-than-checkpoint.sdp.md | 21 -- ...event-when-pm-is-in-completed-state.sdp.md | 21 -- ...stances-are-processed-independently.sdp.md | 21 -- ...ucceeds-after-emit-commands-failure.sdp.md | 24 -- ...hen-pm-is-stuck-in-processing-state.sdp.md | 21 -- ...010-reject-negative-global-position.sdp.md | 23 -- ...ero-is-treated-as-already-processed.sdp.md | 20 -- ...t-after-initialization-is-processed.sdp.md | 20 -- ...letter-recorded-when-process-throws.sdp.md | 23 -- ...-recorded-when-emit-commands-throws.sdp.md | 21 -- ...d-counter-is-incremented-on-failure.sdp.md | 19 -- ...ed-counter-tracks-multiple-commands.sdp.md | 19 -- ...sult-contains-emitted-command-types.sdp.md | 20 -- ...ist-produces-no-op-processed-result.sdp.md | 21 -- ...r-processes-event-and-updates-state.sdp.md | 21 -- ...-maintains-pm-idempotency-semantics.sdp.md | 21 -- .../process-manager/with-pm-checkpoint.sdp.md | 5 +- ...jection-rebuild-re-processes-events.sdp.md | 23 -- ...dead-letter-retry-re-enqueues-event.sdp.md | 22 -- ...ent-flow-trace-returns-full-history.sdp.md | 22 -- ...s-004-rebuild-status-shows-progress.sdp.md | 23 -- ...-letter-retry-processes-all-pending.sdp.md | 22 -- ...nostics-returns-comprehensive-state.sdp.md | 24 -- .../production-hardening/admin-tooling.sdp.md | 3 +- ...rcuit-opens-after-repeated-failures.sdp.md | 22 -- ...nsitions-to-half-open-after-timeout.sdp.md | 22 -- ...ul-half-open-request-closes-circuit.sdp.md | 22 -- ...d-half-open-request-reopens-circuit.sdp.md | 22 -- ...ersists-across-function-invocations.sdp.md | 22 -- ...cuit-breakers-operate-independently.sdp.md | 23 -- .../circuit-breakers.sdp.md | 3 +- ...ce-spans-command-to-projection-flow.sdp.md | 22 -- ...-missing-trace-context-uses-default.sdp.md | 22 -- ...text-is-preserved-in-event-metadata.sdp.md | 22 -- ...ltiple-projections-share-same-trace.sdp.md | 21 -- .../distributed-tracing.sdp.md | 3 +- ...-action-retrier-for-half-open-probe.sdp.md | 23 -- ...-reopens-circuit-via-action-retrier.sdp.md | 23 -- ...ion-retrier-with-configured-retries.sdp.md | 24 -- ...flict-triggers-workpool-based-retry.sdp.md | 25 -- ...cts-exponential-backoff-with-jitter.sdp.md | 24 -- ...-uses-latest-version-after-conflict.sdp.md | 23 -- ...ion-key-prevents-concurrent-retries.sdp.md | 23 -- ...s-action-retrier-for-external-calls.sdp.md | 24 -- ...dlq-retry-returns-to-pending-status.sdp.md | 24 -- ...ssful-dlq-retry-marks-item-resolved.sdp.md | 23 -- .../s-011-dlq-retry-tracks-retry-count.sdp.md | 23 -- .../durable-function-integration.sdp.md | 3 +- ...readiness-probe-checks-dependencies.sdp.md | 22 -- ...nhealthy-dependency-fails-readiness.sdp.md | 22 -- ...-003-liveness-probe-always-succeeds.sdp.md | 22 -- ...ion-lag-threshold-determines-health.sdp.md | 22 -- ...nse-includes-all-component-statuses.sdp.md | 23 -- .../health-endpoints.sdp.md | 3 +- .../s-001-projection-lag-is-tracked.sdp.md | 23 -- ...lection-handles-missing-checkpoints.sdp.md | 22 -- ...-003-event-throughput-is-calculated.sdp.md | 21 -- ...4-dead-letter-queue-size-is-tracked.sdp.md | 22 -- .../metrics-collection.sdp.md | 22 +- ...-requests-within-rate-limit-succeed.sdp.md | 23 -- ...s-exceeding-rate-limit-are-rejected.sdp.md | 23 -- ...-003-token-bucket-refills-over-time.sdp.md | 22 -- ...04-rate-limit-key-isolation-by-user.sdp.md | 23 -- ...admin-rebuild-respects-hourly-limit.sdp.md | 23 -- ...rebuild-blocked-when-limit-exceeded.sdp.md | 23 -- ...onent-response-to-rate-limit-result.sdp.md | 22 -- ...handles-component-errors-gracefully.sdp.md | 22 -- .../production-hardening/rate-limiting.sdp.md | 3 +- ...tuple-contains-all-valid-categories.sdp.md | 20 -- ...category-validates-category-strings.sdp.md | 19 -- ...nctions-identify-correct-categories.sdp.md | 23 -- ...sed-returns-correct-exposure-status.sdp.md | 20 -- .../category-definitions.sdp.md | 13 +- ...ory-returns-category-required-error.sdp.md | 23 -- ...ory-returns-category-required-error.sdp.md | 22 -- ...03-valid-category-passes-validation.sdp.md | 21 -- ...ory-returns-category-on-valid-input.sdp.md | 21 -- ...gory-returns-invalid-category-error.sdp.md | 23 -- ...id-category-throws-on-invalid-input.sdp.md | 21 -- .../explicit-declaration.sdp.md | 12 +- ...tegory-returns-all-view-projections.sdp.md | 21 -- ...egory-returns-all-logic-projections.sdp.md | 20 -- ...y-returns-all-reporting-projections.sdp.md | 20 -- ...returns-all-integration-projections.sdp.md | 20 -- ...ay-for-category-with-no-projections.sdp.md | 20 -- ...view-projections-for-reactive-layer.sdp.md | 20 -- ...n-projections-for-event-bus-routing.sdp.md | 20 -- .../registry-lookup.sdp.md | 25 +- ...schema-accepts-all-valid-categories.sdp.md | 19 -- ...egory-schema-rejects-invalid-values.sdp.md | 19 -- ...ory-schema-rejects-non-string-types.sdp.md | 20 -- ...projection-category-rejects-objects.sdp.md | 19 -- ...-projection-category-rejects-arrays.sdp.md | 19 -- ...rojection-category-rejects-booleans.sdp.md | 19 -- ...y-rejects-whitespace-padded-strings.sdp.md | 19 -- ...ion-errors-has-expected-error-codes.sdp.md | 20 -- ...n-category-rejects-non-string-types.sdp.md | 19 -- ...ows-category-required-for-undefined.sdp.md | 19 -- .../projections/categories.sdp.md | 5 +- ...lowed-transitions-from-active-state.sdp.md | 19 -- ...ected-transitions-from-active-state.sdp.md | 19 -- ...d-transitions-from-rebuilding-state.sdp.md | 19 -- ...d-transitions-from-rebuilding-state.sdp.md | 19 -- ...lowed-transitions-from-paused-state.sdp.md | 19 -- ...ected-transitions-from-paused-state.sdp.md | 19 -- ...llowed-transitions-from-error-state.sdp.md | 19 -- ...jected-transitions-from-error-state.sdp.md | 19 -- ...tions-produce-correct-target-states.sdp.md | 19 -- ...010-invalid-transitions-return-null.sdp.md | 19 -- ...-011-valid-events-from-active-state.sdp.md | 20 -- ...-valid-events-from-rebuilding-state.sdp.md | 20 -- ...-013-valid-events-from-paused-state.sdp.md | 20 -- ...s-014-valid-events-from-error-state.sdp.md | 20 -- ...-transitions-with-correct-structure.sdp.md | 20 -- ...l-expected-transitions-are-included.sdp.md | 19 -- ...turns-same-array-reference-memoized.sdp.md | 19 -- ...urns-new-state-for-valid-transition.sdp.md | 19 -- ...lid-transition-with-projection-name.sdp.md | 19 -- ...hable-from-at-least-one-other-state.sdp.md | 19 -- ...ve-at-least-one-outgoing-transition.sdp.md | 19 -- ...ry-path-exists-from-error-to-active.sdp.md | 19 -- ...s-023-error-path-exists-from-active.sdp.md | 19 -- ...ebuild-retry-path-exists-from-error.sdp.md | 19 -- ...sing-active-state-allows-fail-event.sdp.md | 19 -- ...flow-active-to-rebuilding-to-active.sdp.md | 20 -- ...-workflow-active-to-error-to-active.sdp.md | 20 -- ...ve-to-error-to-rebuilding-to-active.sdp.md | 21 -- ...workflow-active-to-paused-to-active.sdp.md | 20 -- ...ve-to-rebuilding-to-error-to-active.sdp.md | 21 -- ...e-to-paused-to-rebuilding-to-active.sdp.md | 21 -- ...active-to-paused-to-error-to-active.sdp.md | 21 -- .../projections/lifecycle.sdp.md | 5 +- .../s-001-register-a-single-projection.sdp.md | 20 -- ...s-002-register-multiple-projections.sdp.md | 19 -- ...licate-projection-name-throws-error.sdp.md | 19 -- ...-004-get-returns-projection-by-name.sdp.md | 20 -- ...ns-undefined-for-unknown-projection.sdp.md | 19 -- ...urns-true-for-registered-projection.sdp.md | 19 -- ...s-false-for-unregistered-projection.sdp.md | 19 -- ...urns-empty-array-for-empty-registry.sdp.md | 19 -- ...-returns-all-registered-projections.sdp.md | 20 -- .../s-010-size-is-0-for-empty-registry.sdp.md | 19 -- ...11-size-reflects-registration-count.sdp.md | 19 -- ...turns-multiple-matching-projections.sdp.md | 20 -- ...-single-context-specific-projection.sdp.md | 20 -- ...ype-returns-empty-for-unknown-event.sdp.md | 19 -- ...es-returns-empty-for-empty-registry.sdp.md | 19 -- ...s-returns-sorted-unique-event-types.sdp.md | 21 -- ...y-context-filters-by-orders-context.sdp.md | 20 -- ...ontext-filters-by-inventory-context.sdp.md | 20 -- ...by-context-filters-by-cross-context.sdp.md | 20 -- ...t-returns-empty-for-unknown-context.sdp.md | 19 -- ...er-returns-empty-for-empty-registry.sdp.md | 19 -- ...places-primary-before-cross-context.sdp.md | 21 -- ...y-category-returns-view-projections.sdp.md | 20 -- ...-category-returns-logic-projections.sdp.md | 20 -- ...egory-returns-reporting-projections.sdp.md | 20 -- ...ory-returns-integration-projections.sdp.md | 20 -- ...rns-empty-when-no-projections-match.sdp.md | 19 -- ...all-results-have-requested-category.sdp.md | 19 -- ...ks-regardless-of-registration-order.sdp.md | 20 -- ...y-index-is-maintained-incrementally.sdp.md | 21 -- .../platform-core/projections/registry.sdp.md | 5 +- ...ess-event-when-no-checkpoint-exists.sdp.md | 22 -- ...-global-position-exceeds-checkpoint.sdp.md | 20 -- ...ckpoint-is-updated-after-processing.sdp.md | 20 -- ...n-global-position-equals-checkpoint.sdp.md | 21 -- ...al-position-is-less-than-checkpoint.sdp.md | 20 -- ...-separate-checkpoints-per-partition.sdp.md | 22 -- ...rent-partitions-does-not-cause-skip.sdp.md | 20 -- ...int-not-updated-when-process-throws.sdp.md | 21 -- ...etry-succeeds-after-process-failure.sdp.md | 22 -- ...-checkpoint-fields-stored-correctly.sdp.md | 19 -- ...per-processes-and-stores-checkpoint.sdp.md | 21 -- ...s-checkpoint-semantics-across-calls.sdp.md | 20 -- ...-process-event-position-comparisons.sdp.md | 19 -- ...tial-checkpoint-has-sentinel-values.sdp.md | 20 -- ...checkpoint-gets-a-unique-updated-at.sdp.md | 19 -- .../projections/with-checkpoint.sdp.md | 5 +- ...-has-correct-result-type-and-config.sdp.md | 20 -- ...-descriptor-has-correct-result-type.sdp.md | 20 -- ...-descriptor-has-correct-result-type.sdp.md | 20 -- ...-descriptor-uses-default-page-sizes.sdp.md | 22 -- ...y-descriptor-uses-custom-page-sizes.sdp.md | 19 -- ...-receives-default-pagination-values.sdp.md | 19 -- ...-has-correct-context-and-projection.sdp.md | 21 -- ...tiple-queries-provides-keyed-access.sdp.md | 20 -- ...cess-to-registered-query-descriptor.sdp.md | 19 -- ...options-returns-descriptor-defaults.sdp.md | 20 -- ...ded-page-size-within-limits-is-used.sdp.md | 19 -- ...-page-size-exceeding-max-is-clamped.sdp.md | 19 -- ...egative-page-sizes-are-clamped-to-1.sdp.md | 19 -- ...cursor-is-passed-through-to-options.sdp.md | 19 -- ...rsor-is-undefined-when-not-provided.sdp.md | 19 -- ...d-descriptors-preserve-result-types.sdp.md | 21 -- .../platform-core/queries/factory.sdp.md | 5 +- ...tion-constants-have-expected-values.sdp.md | 19 -- ...s-defaults-when-no-options-provided.sdp.md | 20 -- ...es-provided-page-size-within-limits.sdp.md | 19 -- .../s-004-caps-page-size-at-max.sdp.md | 19 -- ...-page-size-of-1-for-boundary-values.sdp.md | 19 -- .../s-006-passes-through-cursor.sdp.md | 19 -- ...007-works-with-custom-config-values.sdp.md | 19 -- ...unds-floating-point-page-sizes-down.sdp.md | 19 -- ...n-empty-page-with-correct-structure.sdp.md | 21 -- ...s-type-information-with-empty-array.sdp.md | 19 -- ...reates-a-page-with-items-and-cursor.sdp.md | 21 -- ...tes-a-done-page-when-cursor-is-null.sdp.md | 21 -- ...-empty-items-array-with-null-cursor.sdp.md | 20 -- ...es-and-decodes-simple-position-data.sdp.md | 19 -- ...s-and-decodes-complex-position-data.sdp.md | 19 -- ...-016-produces-base64-encoded-string.sdp.md | 19 -- ...017-round-trips-various-data-shapes.sdp.md | 19 -- ...urns-null-for-invalid-cursor-inputs.sdp.md | 19 -- ...invalid-characters-in-middle-or-end.sdp.md | 19 -- ...-null-for-truncated-utf-8-sequences.sdp.md | 19 -- ...1-returns-true-for-valid-page-sizes.sdp.md | 19 -- ...eturns-false-for-invalid-page-sizes.sdp.md | 19 -- ...s-023-respects-custom-max-page-size.sdp.md | 20 -- ...4-returns-requested-size-when-valid.sdp.md | 19 -- ...-returns-default-when-not-specified.sdp.md | 19 -- ...26-caps-at-max-and-enforces-minimum.sdp.md | 19 -- ...7-uses-custom-default-and-max-sizes.sdp.md | 19 -- ...28-rounds-floating-point-sizes-down.sdp.md | 19 -- ...-simulates-complete-pagination-flow.sdp.md | 22 -- .../s-030-handles-empty-result-set.sdp.md | 20 -- ...t-page-size-match-with-continuation.sdp.md | 20 -- .../platform-core/queries/pagination.sdp.md | 5 +- ...ng-optimistic-update-is-rolled-back.sdp.md | 23 -- ...detection-handles-network-partition.sdp.md | 22 -- ...when-optimistic-is-ahead-of-durable.sdp.md | 23 -- ...4-rollback-triggers-ui-notification.sdp.md | 22 -- ...earing-preserves-unconfirmed-events.sdp.md | 21 -- .../conflict-detection.sdp.md | 3 +- ...nt-update-then-durable-confirmation.sdp.md | 23 -- ...pdate-works-during-workpool-backlog.sdp.md | 23 -- ...-takes-precedence-after-convergence.sdp.md | 23 -- .../reactive-projections/hybrid-model.sdp.md | 3 +- ...ory-determines-reactive-eligibility.sdp.md | 21 -- ...ction-rejects-reactive-subscription.sdp.md | 22 -- ...enables-full-reactive-functionality.sdp.md | 23 -- ...ive-result-represents-loading-state.sdp.md | 25 -- .../reactive-eligibility.sdp.md | 3 +- ...ntical-results-on-client-and-server.sdp.md | 21 -- ...dles-unknown-event-types-gracefully.sdp.md | 22 -- ...-multiple-events-evolve-in-sequence.sdp.md | 22 -- ...evolve-error-includes-event-context.sdp.md | 23 -- .../reactive-projections/shared-evolve.sdp.md | 3 +- ...the-same-instance-on-multiple-calls.sdp.md | 19 -- .../s-002-reset-creates-a-new-instance.sdp.md | 19 -- ...003-register-a-command-successfully.sdp.md | 19 -- ...licate-registration-throws-an-error.sdp.md | 20 -- ...ent-command-types-can-be-registered.sdp.md | 19 -- ...gister-removes-a-registered-command.sdp.md | 21 -- ...urns-false-for-non-existent-command.sdp.md | 19 -- ...rns-config-for-a-registered-command.sdp.md | 20 -- ...ndefined-for-a-non-existent-command.sdp.md | 19 -- ...gistration-for-a-registered-command.sdp.md | 20 -- ...ndefined-for-a-non-existent-command.sdp.md | 19 -- ...turns-true-for-a-registered-command.sdp.md | 20 -- ...ns-false-for-a-non-existent-command.sdp.md | 19 -- ...e-returns-valid-for-correct-payload.sdp.md | 20 -- ...turns-invalid-for-incorrect-payload.sdp.md | 20 -- ...wn-command-for-non-existent-command.sdp.md | 19 -- ...ray-when-no-commands-are-registered.sdp.md | 19 -- ...ist-returns-all-registered-commands.sdp.md | 20 -- ...and-info-objects-with-correct-shape.sdp.md | 20 -- .../s-020-filter-commands-by-category.sdp.md | 20 -- ...-filter-commands-by-bounded-context.sdp.md | 21 -- .../s-022-filter-commands-by-tag.sdp.md | 22 -- ...3-group-commands-by-bounded-context.sdp.md | 22 -- ...-returns-empty-map-when-no-commands.sdp.md | 19 -- ...e-reflects-registered-command-count.sdp.md | 20 -- ...026-clear-removes-all-registrations.sdp.md | 20 -- ...y-is-a-functional-registry-instance.sdp.md | 20 -- .../registry/command-registry.sdp.md | 5 +- ...bounded-context-and-projection-name.sdp.md | 21 -- ...-with-command-id-and-correlation-id.sdp.md | 20 -- ...rtition-key-uses-aggregate-id-field.sdp.md | 20 -- ...partition-key-overrides-the-default.sdp.md | 20 -- ...gregate-category-and-custom-options.sdp.md | 23 -- ...mmand-is-auto-registered-by-default.sdp.md | 19 -- ...istered-when-auto-register-is-false.sdp.md | 19 -- ...-projections-are-included-in-config.sdp.md | 20 -- ...09-saga-route-is-included-in-config.sdp.md | 20 -- ...saga-route-on-complete-is-preserved.sdp.md | 19 -- ...ed-projection-is-included-in-config.sdp.md | 20 -- .../s-012-schema-version-defaults-to-1.sdp.md | 19 -- ...and-has-correct-category-and-target.sdp.md | 21 -- ...partition-key-uses-process-id-field.sdp.md | 20 -- ...sters-with-category-and-target-info.sdp.md | 20 -- ...-category-subsystem-and-description.sdp.md | 21 -- ...-with-command-id-and-correlation-id.sdp.md | 20 -- ...ojection-has-no-projection-property.sdp.md | 20 -- ...th-projection-includes-it-in-config.sdp.md | 19 -- ...key-defaults-to-system-command-type.sdp.md | 20 -- ...t-registered-even-with-auto-registe.sdp.md | 20 -- ...system-schema-version-defaults-to-1.sdp.md | 19 -- .../registry/define-command.sdp.md | 5 +- ...01-load-and-upcast-cms-by-entity-id.sdp.md | 21 -- ...-not-found-error-for-missing-entity.sdp.md | 19 -- .../s-003-load-returns-upcast-metadata.sdp.md | 21 -- ...s-004-load-propagates-upcast-errors.sdp.md | 20 -- ...load-returns-cms-when-entity-exists.sdp.md | 20 -- ...rns-null-when-entity-does-not-exist.sdp.md | 19 -- ...d-resolves-to-null-without-throwing.sdp.md | 19 -- ...8-try-load-propagates-upcast-errors.sdp.md | 20 -- ...sts-returns-true-when-entity-exists.sdp.md | 20 -- ...ns-false-when-entity-does-not-exist.sdp.md | 19 -- ...xists-does-not-call-upcast-function.sdp.md | 19 -- ...loads-multiple-entities-in-parallel.sdp.md | 20 -- ...y-returns-null-for-missing-entities.sdp.md | 22 -- ...returns-empty-array-for-empty-input.sdp.md | 20 -- ...ad-many-upcasts-all-loaded-entities.sdp.md | 19 -- ...-many-preserves-order-of-input-i-ds.sdp.md | 19 -- ...agates-upcast-errors-for-any-entity.sdp.md | 20 -- ...-cms-record-and-returns-document-id.sdp.md | 20 -- ...te-patches-cms-when-version-matches.sdp.md | 19 -- ...ot-found-error-for-missing-document.sdp.md | 19 -- ...-conflict-error-on-version-mismatch.sdp.md | 19 -- ...-found-error-has-correct-properties.sdp.md | 19 -- ...not-found-error-is-instanceof-error.sdp.md | 19 -- ...rd-returns-true-for-not-found-error.sdp.md | 19 -- ...alse-for-non-not-found-error-values.sdp.md | 19 -- ...nflict-error-has-correct-properties.sdp.md | 19 -- ...-conflict-error-is-instanceof-error.sdp.md | 19 -- ...turns-true-for-version-conflict-err.sdp.md | 19 -- ...uard-returns-false-for-other-errors.sdp.md | 19 -- .../repository/cms-repository.sdp.md | 5 +- ...-confirm-reservation-with-entity-id.sdp.md | 24 -- ...-confirmed-reservation-is-permanent.sdp.md | 22 -- ...-cannot-confirm-expired-reservation.sdp.md | 21 -- ...nfirm-already-confirmed-reservation.sdp.md | 21 -- ...ot-confirm-non-existent-reservation.sdp.md | 20 -- ...cannot-confirm-released-reservation.sdp.md | 21 -- .../s-007-entity-id-is-required.sdp.md | 21 -- ...ity-id-can-be-any-string-identifier.sdp.md | 22 -- .../reservation/confirm-operation.sdp.md | 5 +- .../s-001-release-active-reservation.sdp.md | 23 -- ...d-value-can-be-immediately-reserved.sdp.md | 21 -- ...annot-release-confirmed-reservation.sdp.md | 21 -- ...elease-already-released-reservation.sdp.md | 21 -- ...-cannot-release-expired-reservation.sdp.md | 21 -- ...ot-release-non-existent-reservation.sdp.md | 20 -- ...red-reservations-are-marked-by-cron.sdp.md | 22 -- ...does-not-affect-active-reservations.sdp.md | 21 -- ...s-not-affect-confirmed-reservations.sdp.md | 21 -- .../reservation/release-operation.sdp.md | 5 +- .../s-001-email-reservation-key-format.sdp.md | 19 -- ...002-username-reservation-key-format.sdp.md | 19 -- ...-custom-type-reservation-key-format.sdp.md | 19 -- .../s-004-same-value-different-types.sdp.md | 21 -- .../s-005-independent-type-uniqueness.sdp.md | 21 -- .../s-006-type-is-required.sdp.md | 19 -- .../s-007-value-is-required.sdp.md | 19 -- .../s-008-empty-type-is-invalid.sdp.md | 19 -- .../s-009-empty-value-is-invalid.sdp.md | 19 -- .../s-010-find-reservation-by-key.sdp.md | 20 -- ...-find-reservation-by-type-and-value.sdp.md | 20 -- ...s-012-non-existent-key-returns-null.sdp.md | 19 -- ...3-type-containing-colon-is-rejected.sdp.md | 19 -- ...lue-can-contain-colon-url-with-port.sdp.md | 20 -- .../reservation/reservation-key.sdp.md | 5 +- .../s-001-reserve-an-email-address.sdp.md | 24 -- .../s-002-reserve-with-correlation-id.sdp.md | 22 -- .../s-003-first-reservation-wins.sdp.md | 22 -- ...eserved-value-cannot-be-re-reserved.sdp.md | 22 -- .../s-005-different-ttl-values.sdp.md | 21 -- .../s-006-ttl-must-be-positive.sdp.md | 20 -- .../s-007-ttl-has-maximum-limit.sdp.md | 21 -- .../s-008-negative-ttl-is-rejected.sdp.md | 20 -- ...09-ttl-at-minimum-boundary-succeeds.sdp.md | 20 -- ...-ttl-just-below-minimum-is-rejected.sdp.md | 20 -- .../s-011-na-n-ttl-is-rejected.sdp.md | 20 -- .../s-012-infinity-ttl-is-rejected.sdp.md | 20 -- ...013-whitespace-only-type-is-invalid.sdp.md | 20 -- ...14-whitespace-only-value-is-invalid.sdp.md | 20 -- .../reservation/reserve-operation.sdp.md | 5 +- ...s-001-complete-metadata-is-accepted.sdp.md | 19 -- ...a-with-optional-user-id-is-accepted.sdp.md | 19 -- ...with-invalid-timestamps-is-rejected.sdp.md | 19 -- ...missing-required-fields-is-rejected.sdp.md | 19 -- .../s-005-complete-command-is-accepted.sdp.md | 19 -- ...optional-payload-fields-is-accepted.sdp.md | 19 -- ...ng-command-type-literal-is-rejected.sdp.md | 19 -- ...th-invalid-payload-type-is-rejected.sdp.md | 19 -- ...-required-payload-field-is-rejected.sdp.md | 19 -- ...-missing-target-context-is-rejected.sdp.md | 19 -- ...-inference-for-command-type-literal.sdp.md | 19 -- ...s-with-version-and-data-is-accepted.sdp.md | 19 -- ...ess-with-undefined-data-is-accepted.sdp.md | 19 -- ...success-without-version-is-rejected.sdp.md | 19 -- ...ed-with-code-and-reason-is-accepted.sdp.md | 19 -- ...d-with-optional-context-is-accepted.sdp.md | 19 -- ...rejected-without-reason-is-rejected.sdp.md | 19 -- ...rrent-modification-code-is-accepted.sdp.md | 19 -- ...onflict-with-wrong-code-is-rejected.sdp.md | 19 -- ...without-current-version-is-rejected.sdp.md | 19 -- ...-021-error-with-message-is-accepted.sdp.md | 19 -- ...2-error-without-message-is-rejected.sdp.md | 19 -- ...nates-success-and-preserves-version.sdp.md | 20 -- ...ected-and-preserves-code-and-reason.sdp.md | 20 -- ...flict-and-preserves-current-version.sdp.md | 20 -- ...minates-error-and-preserves-message.sdp.md | 20 -- .../s-027-union-rejects-unknown-status.sdp.md | 19 -- .../schemas/command-schemas.sdp.md | 44 ++- ...ution-when-convex-test-mode-is-true.sdp.md | 21 -- ...w-execution-when-is-test-env-is-set.sdp.md | 21 -- ...untime-without-explicit-test-signal.sdp.md | 24 -- ...block-execution-in-cloud-production.sdp.md | 24 -- ...vironment-returns-true-in-test-mode.sdp.md | 21 -- ...nment-returns-true-with-is-test-env.sdp.md | 21 -- ...ronment-returns-false-in-production.sdp.md | 22 -- ...environment-is-a-safe-boolean-check.sdp.md | 21 -- .../platform-core/testing/guards.sdp.md | 3 +- ...01-fresh-state-after-docker-restart.sdp.md | 23 -- ...ect-state-pollution-without-restart.sdp.md | 23 -- .../s-003-unique-namespace-per-test.sdp.md | 24 -- ...mespace-applied-to-correlation-i-ds.sdp.md | 22 -- ...-from-previous-test-don-t-interfere.sdp.md | 23 -- ...functions-use-test-specific-context.sdp.md | 22 -- .../testing/integration-isolation.sdp.md | 5 +- ...has-feature-directory-platform-core.sdp.md | 22 -- ...-feature-directory-platform-decider.sdp.md | 22 -- ...-has-feature-directory-platform-fsm.sdp.md | 22 -- ...as-feature-directory-platform-store.sdp.md | 22 -- ...-has-feature-directory-platform-bus.sdp.md | 22 -- ...e-has-feature-directory-platform-bc.sdp.md | 22 -- ...orted-function-has-feature-coverage.sdp.md | 22 -- .../s-008-missing-coverage-is-detected.sdp.md | 22 -- ...efinitions-follow-naming-convention.sdp.md | 23 -- ...-010-step-file-matches-feature-file.sdp.md | 21 -- .../testing/platform-coverage.sdp.md | 5 +- .../s-001-sleep-for-specified-duration.sdp.md | 21 -- .../s-002-sleep-returns-a-promise.sdp.md | 21 -- ...l-returns-truthy-result-immediately.sdp.md | 22 -- ...-until-polls-until-condition-is-met.sdp.md | 22 -- .../s-005-wait-until-throws-on-timeout.sdp.md | 21 -- ...t-until-uses-custom-timeout-message.sdp.md | 21 -- ...ait-until-respects-poll-interval-ms.sdp.md | 21 -- ...esolves-when-predicate-returns-true.sdp.md | 22 -- .../s-009-wait-for-throws-on-timeout.sdp.md | 21 -- ...s-010-default-timeout-is-30-seconds.sdp.md | 20 -- ...-011-default-poll-interval-is-100ms.sdp.md | 20 -- .../platform-core/testing/polling.sdp.md | 3 +- .../s-001-create-base-unit-test-world.sdp.md | 25 -- ...est-world-supports-scenario-context.sdp.md | 21 -- ...-unit-test-world-tracks-last-result.sdp.md | 21 -- ...4-unit-test-world-tracks-last-error.sdp.md | 21 -- ...-create-base-integration-test-world.sdp.md | 23 -- ...-test-world-uses-custom-backend-url.sdp.md | 21 -- ...on-test-world-defaults-to-localhost.sdp.md | 22 -- ...reset-world-state-clears-all-fields.sdp.md | 23 -- ...et-preserves-test-backend-reference.sdp.md | 21 -- .../platform-core/testing/world.sdp.md | 3 +- ...ojections-recommend-entity-strategy.sdp.md | 20 -- ...rojections-return-simple-complexity.sdp.md | 20 -- ...s-include-rationale-about-stream-id.sdp.md | 21 -- ...-to-entity-when-all-flags-are-false.sdp.md | 20 -- ...ojections-recommend-global-strategy.sdp.md | 20 -- ...ojections-return-complex-complexity.sdp.md | 20 -- ...clude-rationale-about-occ-conflicts.sdp.md | 20 -- ...rategy-prioritizes-over-other-flags.sdp.md | 20 -- ...projections-recommend-saga-strategy.sdp.md | 20 -- ...ojections-return-complex-complexity.sdp.md | 20 -- ...lude-rationale-about-correlation-id.sdp.md | 21 -- ...rioritizes-over-customer-and-entity.sdp.md | 20 -- ...ections-recommend-customer-strategy.sdp.md | 20 -- ...jections-return-moderate-complexity.sdp.md | 20 -- ...include-rationale-about-customer-id.sdp.md | 21 -- ...er-strategy-prioritizes-over-entity.sdp.md | 20 -- ...riority-global-saga-customer-entity.sdp.md | 26 -- .../s-018-strategy-parallelism-values.sdp.md | 19 -- ...recommended-parallelism-by-strategy.sdp.md | 19 -- .../complexity-classifier.sdp.md | 14 +- ...lobal-partition-key-has-name-global.sdp.md | 19 -- ...obal-partition-key-has-value-global.sdp.md | 19 -- ...y-uses-stream-type-stream-id-format.sdp.md | 19 -- ...izes-stream-id-over-other-id-fields.sdp.md | 19 -- ...y-falls-back-to-alternate-id-fields.sdp.md | 19 -- ...ey-throws-when-no-id-field-provided.sdp.md | 19 -- ...des-available-keys-in-error-message.sdp.md | 19 -- ...-uses-provided-stream-type-in-value.sdp.md | 19 -- ...r-partition-key-returns-customer-id.sdp.md | 19 -- ...ition-key-ignores-additional-fields.sdp.md | 19 -- ...hrows-when-customer-id-is-undefined.sdp.md | 19 -- ...-throws-when-customer-id-is-missing.sdp.md | 19 -- ...ws-when-customer-id-is-empty-string.sdp.md | 19 -- ...artition-key-returns-correlation-id.sdp.md | 19 -- ...ition-key-ignores-additional-fields.sdp.md | 19 -- ...ws-when-correlation-id-is-undefined.sdp.md | 19 -- ...rows-when-correlation-id-is-missing.sdp.md | 19 -- ...when-correlation-id-is-empty-string.sdp.md | 19 -- ...on-key-returns-global-partition-key.sdp.md | 19 -- ...partition-key-ignores-any-arguments.sdp.md | 19 -- ...ns-same-reference-on-multiple-calls.sdp.md | 19 -- ...-022-dcb-partition-key-has-name-dcb.sdp.md | 19 -- ...rtition-key-uses-scope-key-as-value.sdp.md | 19 -- ...y-handles-various-scope-key-formats.sdp.md | 19 -- .../partition-key-helpers.sdp.md | 14 +- ...t-for-config-with-get-partition-key.sdp.md | 21 -- ...t-for-inline-partition-key-function.sdp.md | 20 -- ...-projections-with-get-partition-key.sdp.md | 21 -- ...d-projection-with-get-partition-key.sdp.md | 21 -- ...error-for-missing-get-partition-key.sdp.md | 22 -- ...6-includes-projection-name-in-error.sdp.md | 20 -- ...s-007-includes-config-path-in-error.sdp.md | 20 -- ...s-helper-functions-in-error-message.sdp.md | 23 -- ...ition-key-shape-when-returning-null.sdp.md | 21 -- ...key-shape-when-returning-wrong-type.sdp.md | 21 -- ...rtition-key-shape-when-missing-name.sdp.md | 21 -- ...tition-key-shape-when-missing-value.sdp.md | 21 -- ...tion-key-shape-when-value-is-number.sdp.md | 21 -- ...ty-partition-value-for-empty-string.sdp.md | 21 -- ...on-value-for-whitespace-only-string.sdp.md | 21 -- ...ollects-errors-from-all-projections.sdp.md | 20 -- ...fig-paths-for-secondary-projections.sdp.md | 22 -- ...t-config-path-for-failed-projection.sdp.md | 21 -- ...s-not-throw-for-valid-configs-array.sdp.md | 20 -- ...-020-does-not-throw-for-empty-array.sdp.md | 20 -- ...-021-throws-on-first-invalid-config.sdp.md | 20 -- ...cludes-all-errors-in-thrown-message.sdp.md | 20 -- ...ludes-error-codes-in-thrown-message.sdp.md | 20 -- ...ludes-config-path-in-thrown-message.sdp.md | 20 -- .../partition-validation.sdp.md | 13 +- specs/behavior/platform-decider/_epic.sdp.md | 3 +- ...-creates-output-with-correct-status.sdp.md | 25 -- ...ss-includes-all-required-properties.sdp.md | 21 -- ...reates-output-with-code-and-message.sdp.md | 24 -- ...cted-includes-context-when-provided.sdp.md | 22 -- ...reates-output-with-reason-and-event.sdp.md | 25 -- ...iled-includes-context-when-provided.sdp.md | 22 -- ...ess-returns-true-for-success-output.sdp.md | 22 -- ...s-returns-false-for-rejected-output.sdp.md | 22 -- ...ess-returns-false-for-failed-output.sdp.md | 22 -- ...0-is-success-enables-type-narrowing.sdp.md | 22 -- ...ed-returns-true-for-rejected-output.sdp.md | 22 -- ...ed-returns-false-for-success-output.sdp.md | 22 -- ...ted-returns-false-for-failed-output.sdp.md | 22 -- ...-is-rejected-enables-type-narrowing.sdp.md | 22 -- ...iled-returns-true-for-failed-output.sdp.md | 22 -- ...ed-returns-false-for-success-output.sdp.md | 22 -- ...d-returns-false-for-rejected-output.sdp.md | 22 -- ...18-is-failed-enables-type-narrowing.sdp.md | 22 -- ...-type-guards-are-mutually-exclusive.sdp.md | 22 -- .../platform-decider/decider-outputs.sdp.md | 10 +- specs/behavior/platform-fsm/_epic.sdp.md | 3 +- ...-created-with-correct-initial-state.sdp.md | 22 -- ...s-002-valid-transitions-are-allowed.sdp.md | 21 -- ...oes-not-throw-for-valid-transitions.sdp.md | 21 -- ...04-invalid-transitions-are-detected.sdp.md | 21 -- ...ition-error-for-invalid-transitions.sdp.md | 25 -- ...nal-states-are-correctly-identified.sdp.md | 21 -- ...sage-indicates-no-valid-transitions.sdp.md | 23 -- ...state-validity-is-correctly-checked.sdp.md | 21 -- ...itions-can-be-queried-for-any-state.sdp.md | 21 -- ...ons-work-identically-to-fsm-methods.sdp.md | 22 -- ...ssert-transition-throws-same-errors.sdp.md | 22 -- .../platform-fsm/fsm-transitions.sdp.md | 15 +- specs/behavior/platform-store/_epic.sdp.md | 3 +- ...-client-exposes-no-event-update-api.sdp.md | 20 -- ...-client-exposes-no-event-delete-api.sdp.md | 20 -- ...-to-a-new-stream-produces-version-1.sdp.md | 20 -- ...nt-the-stream-version-monotonically.sdp.md | 20 -- ...sition-is-unique-across-two-streams.sdp.md | 21 -- ...eases-monotonically-within-a-stream.sdp.md | 20 -- ...essful-append-with-matching-version.sdp.md | 22 -- .../s-008-conflict-on-version-mismatch.sdp.md | 21 -- ...-projection-resumes-from-checkpoint.sdp.md | 21 -- ...t-store-foundation-executable-tests.sdp.md | 4 +- ...tegory-supports-all-taxonomy-values.sdp.md | 19 -- ...nt-input-requires-core-event-fields.sdp.md | 22 -- ...ptional-category-and-schema-version.sdp.md | 21 -- ...-metadata-with-correlation-tracking.sdp.md | 22 -- ...ncludes-all-required-storage-fields.sdp.md | 23 -- ...lt-success-includes-event-positions.sdp.md | 22 -- ...t-conflict-includes-current-version.sdp.md | 21 -- .../platform-store/event-store-types.sdp.md | 3 +- specs/decisions.pack.sdp.md | 1 + specs/decisions/_epic.sdp.md | 16 + .../pdr-001-process-decisions-folder.sdp.md | 13 +- ...002-release-management-architecture.sdp.md | 15 +- ...003-behavior-feature-file-structure.sdp.md | 13 +- ...004-unified-tag-prefix-architecture.sdp.md | 13 +- specs/decisions/pdr-005-mvp-workflow.sdp.md | 13 +- ...pdr-006-typescript-sourced-taxonomy.sdp.md | 13 +- .../pdr-007-two-tier-spec-architecture.sdp.md | 13 +- .../pdr-008-example-app-purpose.sdp.md | 13 +- .../pdr-009-design-session-methodology.sdp.md | 13 +- ...-cross-component-argument-injection.sdp.md | 16 +- ...1-agent-action-handler-architecture.sdp.md | 13 +- .../pdr-012-agent-command-routing.sdp.md | 13 +- .../pdr-013-agent-lifecycle-fsm.sdp.md | 13 +- ...-boundary-authentication-convention.sdp.md | 15 +- ...bal-position-numeric-representation.sdp.md | 16 +- ...-pool-split-named-pools-per-concern.sdp.md | 13 +- ...ranche-3-platform-architecture-gate.sdp.md | 13 +- ...cy-enforcement-for-append-to-stream.sdp.md | 13 +- ...-v-any-vs-v-unknown-boundary-policy.sdp.md | 13 +- .../pdr-020-events-table-index-policy.sdp.md | 13 +- ...runtime-dependency-on-platform-core.sdp.md | 13 +- ...22-value-transfer-doctrine-adoption.sdp.md | 13 +- ...bulk-doctrine-rollback-and-recovery.sdp.md | 13 +- specs/platform.pack.sdp.md | 1 - .../active-reservations-projection.sdp.md | 2 +- .../patterns/agent-action-handler.sdp.md | 2 +- .../patterns/agent-as-bounded-context.sdp.md | 4 +- ...rn-risk-completion-executable-tests.sdp.md | 3 +- .../agent-churn-risk-completion.sdp.md | 4 +- .../patterns/agent-on-complete-handler.sdp.md | 2 +- .../patterns/app-composition-root.sdp.md | 2 +- ...ing-infrastructure-executable-tests.sdp.md | 3 +- .../bdd-testing-infrastructure.sdp.md | 4 +- specs/platform/patterns/bdd-world.sdp.md | 3 +- ...context-foundation-executable-tests.sdp.md | 2 +- .../bounded-context-foundation.sdp.md | 12 +- .../patterns/bounded-context-identity.sdp.md | 2 +- specs/platform/patterns/cms-dual-write.sdp.md | 2 +- specs/platform/patterns/cms-repository.sdp.md | 2 +- ...and-bus-foundation-executable-tests.sdp.md | 2 +- .../patterns/command-bus-foundation.sdp.md | 12 +- .../patterns/command-bus-idempotency.sdp.md | 2 +- specs/platform/patterns/command-bus.sdp.md | 2 +- .../patterns/command-orchestrator.sdp.md | 2 +- ...order-cancellation-executable-tests.sdp.md | 3 +- .../patterns/correlation-chain-system.sdp.md | 2 +- .../patterns/cross-context-read-model.sdp.md | 2 +- .../customer-cancellations-projection.sdp.md | 2 +- .../dcb-multi-product-reservation.sdp.md | 2 +- .../patterns/dcb-retry-execution.sdp.md | 2 +- .../patterns/dcb-scope-key-utilities.sdp.md | 2 +- specs/platform/patterns/dcb-types.sdp.md | 2 +- .../platform/patterns/decider-outputs.sdp.md | 2 +- .../platform/patterns/decider-pattern.sdp.md | 12 +- .../patterns/dual-write-contract.sdp.md | 2 +- .../patterns/durable-append-action.sdp.md | 2 +- ...events-integration-executable-tests.sdp.md | 3 +- .../durable-events-integration.sdp.md | 4 +- .../patterns/durable-function-adapters.sdp.md | 4 +- .../dynamic-consistency-boundaries.sdp.md | 4 +- .../platform/patterns/ecst-fat-events.sdp.md | 4 +- .../patterns/event-bus-abstraction.sdp.md | 2 +- .../event-replay-infrastructure.sdp.md | 4 +- .../patterns/event-store-durability.sdp.md | 2 +- ...t-store-foundation-executable-tests.sdp.md | 2 +- .../patterns/event-store-foundation.sdp.md | 12 +- specs/platform/patterns/event-store.sdp.md | 2 +- .../event-subscription-registry.sdp.md | 2 +- .../platform/patterns/event-upcasting.sdp.md | 2 +- .../patterns/example-app-architecture.sdp.md | 2 +- ...-app-modernization-executable-tests.sdp.md | 3 +- .../patterns/example-app-modernization.sdp.md | 4 +- .../platform/patterns/fsm-transitions.sdp.md | 2 +- .../patterns/handler-factories.sdp.md | 2 +- .../patterns/integration-dead-letters.sdp.md | 2 +- .../integration-event-handlers.sdp.md | 2 +- .../patterns/integration-event-schemas.sdp.md | 2 +- .../patterns/integration-patterns-21-a.sdp.md | 4 +- .../patterns/integration-patterns-21-b.sdp.md | 4 +- .../patterns/integration-routes.sdp.md | 2 +- .../patterns/invariant-framework.sdp.md | 2 +- .../patterns/inventory-command-configs.sdp.md | 2 +- .../inventory-command-handlers.sdp.md | 2 +- .../patterns/inventory-deciders.sdp.md | 2 +- .../patterns/inventory-domain-events.sdp.md | 2 +- .../inventory-internal-mutations.sdp.md | 2 +- .../patterns/inventory-public-api.sdp.md | 2 +- .../patterns/logging-infrastructure.sdp.md | 2 +- .../patterns/mock-payment-actions.sdp.md | 2 +- .../patterns/order-command-configs.sdp.md | 2 +- .../patterns/order-command-handlers.sdp.md | 2 +- specs/platform/patterns/order-deciders.sdp.md | 2 +- .../patterns/order-domain-events.sdp.md | 2 +- .../patterns/order-fulfillment-saga.sdp.md | 2 +- .../patterns/order-items-projection.sdp.md | 2 +- .../order-management-infrastructure.sdp.md | 2 +- .../patterns/order-notification-pm.sdp.md | 2 +- .../platform/patterns/order-public-api.sdp.md | 2 +- .../patterns/order-summary-projection.sdp.md | 2 +- .../order-with-inventory-projection.sdp.md | 2 +- .../patterns/payment-outbox-handler.sdp.md | 2 +- .../patterns/polling-utilities.sdp.md | 3 +- .../patterns/process-manager-lifecycle.sdp.md | 2 +- .../platform/patterns/process-manager.sdp.md | 2 +- .../product-catalog-projection.sdp.md | 2 +- ...jection-categories-executable-tests.sdp.md | 3 +- .../patterns/projection-categories.sdp.md | 4 +- .../patterns/projection-checkpointing.sdp.md | 2 +- .../patterns/projection-dead-letters.sdp.md | 2 +- .../patterns/projection-definitions.sdp.md | 2 +- .../patterns/query-abstraction.sdp.md | 2 +- .../patterns/rate-limit-definitions.sdp.md | 2 +- ...ctive-projection-conflict-detection.sdp.md | 3 +- .../reactive-projection-eligibility.sdp.md | 3 +- .../reactive-projection-hybrid-model.sdp.md | 3 +- .../reactive-projection-shared-evolve.sdp.md | 3 +- .../patterns/reactive-projections.sdp.md | 4 +- .../patterns/reservation-pattern.sdp.md | 12 +- .../patterns/reservation-release-pm.sdp.md | 2 +- .../patterns/saga-completion-handler.sdp.md | 2 +- ...saga-orchestration-executable-tests.sdp.md | 2 +- .../patterns/saga-orchestration.sdp.md | 12 +- specs/platform/patterns/saga-registry.sdp.md | 2 +- specs/platform/patterns/saga-router.sdp.md | 2 +- .../patterns/test-environment-guards.sdp.md | 3 +- .../workpool-partitioning-strategy.sdp.md | 2 +- specs/releases.pack.sdp.md | 1 + specs/releases/_epic.sdp.md | 16 + specs/releases/v0.1.0.sdp.md | 12 +- specs/releases/v0.2.0.sdp.md | 14 +- specs/releases/v0.3.0.sdp.md | 12 +- specs/releases/vNEXT.sdp.md | 12 +- specs/test-content-blocks.sdp.md | 12 - specs/unimplemented.pack.sdp.md | 19 +- ...y-is-created-with-correct-structure.sdp.md | 22 -- ...kward-compatibility-for-dlq-imports.sdp.md | 21 -- .../s-003-get-dead-letter-statistics.sdp.md | 26 -- ...004-bulk-retry-pending-dead-letters.sdp.md | 22 -- .../s-005-trace-complete-event-flow.sdp.md | 21 -- .../s-006-trace-shows-failure-point.sdp.md | 22 -- ...em-state-provides-complete-overview.sdp.md | 21 -- .../s-008-query-workpool-item-status.sdp.md | 20 -- ...query-workflow-execution-with-steps.sdp.md | 20 -- ...query-non-existent-durable-function.sdp.md | 21 -- ...unauthenticated-request-is-rejected.sdp.md | 20 -- .../s-012-non-admin-user-is-rejected.sdp.md | 20 -- .../s-013-admin-action-is-logged.sdp.md | 21 -- ...lays-failed-events-from-both-agents.sdp.md | 23 -- ...ackend-mutation-with-toast-feedback.sdp.md | 23 -- ...n-with-reason-provides-confirmation.sdp.md | 22 -- ...04-replay-failure-shows-error-toast.sdp.md | 22 -- .../s-005-filter-dead-letters-by-agent.sdp.md | 20 -- ...ory-with-decisions-from-both-agents.sdp.md | 22 -- ...07-filter-decision-history-by-agent.sdp.md | 21 -- ...ter-decision-history-by-action-type.sdp.md | 20 -- ...decision-detail-with-full-reasoning.sdp.md | 23 -- ...sion-history-shows-guidance-message.sdp.md | 21 -- ...-approve-action-shows-success-toast.sdp.md | 22 -- ...2-reject-action-shows-success-toast.sdp.md | 21 -- ...ction-shows-descriptive-error-toast.sdp.md | 22 -- ...e-rapid-actions-show-stacked-toasts.sdp.md | 22 -- ...tected-and-surfaces-as-vip-approval.sdp.md | 24 -- ...-value-order-does-not-trigger-agent.sdp.md | 22 -- ...roves-vip-flag-for-high-value-order.sdp.md | 23 -- ...trigger-from-same-customer-activity.sdp.md | 24 -- ...-dashboard-shows-both-active-agents.sdp.md | 23 -- ...pprovals-count-includes-both-agents.sdp.md | 22 -- .../s-021-one-agent-stopped-one-active.sdp.md | 23 -- ...nent-registers-with-isolated-schema.sdp.md | 21 -- ...-provides-full-crud-for-checkpoints.sdp.md | 21 -- ...-access-is-not-possible-from-parent.sdp.md | 20 -- ...-sub-transactions-provide-isolation.sdp.md | 20 -- ...eceives-projection-data-as-argument.sdp.md | 20 -- ...rojection-data-returns-empty-result.sdp.md | 21 -- ...-access-app-level-projection-tables.sdp.md | 20 -- ...access-agent-data-via-component-api.sdp.md | 20 -- ...ugh-command-orchestrator-to-handler.sdp.md | 22 -- ...e-is-rejected-with-validation-error.sdp.md | 22 -- ...tency-prevents-duplicate-processing.sdp.md | 22 -- ...-transitions-active-agent-to-paused.sdp.md | 23 -- ...nt-resumes-from-checkpoint-position.sdp.md | 23 -- ...id-lifecycle-transition-is-rejected.sdp.md | 22 -- ...-configuration-without-losing-state.sdp.md | 22 -- ...g-references-patterns-from-registry.sdp.md | 21 -- ...pattern-trigger-for-cheap-detection.sdp.md | 22 -- ...es-pattern-analyze-for-llm-analysis.sdp.md | 22 -- ...ern-name-in-config-fails-validation.sdp.md | 21 -- ...dler-calls-llm-and-returns-decision.sdp.md | 23 -- ...tation-persists-decision-atomically.sdp.md | 22 -- ...rejects-invalid-agent-configuration.sdp.md | 21 -- ...rror-through-retries-to-dead-letter.sdp.md | 22 -- ...riggers-dead-letter-via-on-complete.sdp.md | 21 -- ...miter-allows-llm-call-within-limits.sdp.md | 21 -- ...miter-blocks-llm-call-when-exceeded.sdp.md | 22 -- ...8-cost-budget-exceeded-pauses-agent.sdp.md | 22 -- ...queue-overflow-triggers-dead-letter.sdp.md | 21 -- ...plete-receives-completion-callbacks.sdp.md | 21 -- ...create-dead-letters-via-on-complete.sdp.md | 21 -- ...out-on-complete-uses-global-default.sdp.md | 20 -- ...1-circuit-remains-closed-on-success.sdp.md | 21 -- ...cuit-opens-after-threshold-failures.sdp.md | 23 -- ...nsitions-to-half-open-after-timeout.sdp.md | 20 -- ...004-successful-probe-closes-circuit.sdp.md | 21 -- .../s-005-failed-probe-reopens-circuit.sdp.md | 22 -- ...tate-persists-across-function-calls.sdp.md | 20 -- ...existent-circuit-defaults-to-closed.sdp.md | 21 -- ...meout-transitions-open-to-half-open.sdp.md | 21 -- .../s-009-stale-timeout-is-ignored.sdp.md | 23 -- ...pen-probe-closes-circuit-on-success.sdp.md | 21 -- ...en-probe-reopens-circuit-on-failure.sdp.md | 21 -- ...2-open-circuit-returns-fast-failure.sdp.md | 22 -- ...ment-circuit-opens-after-3-failures.sdp.md | 20 -- ...ail-circuit-tolerates-more-failures.sdp.md | 21 -- ...-services-have-independent-circuits.sdp.md | 22 -- ...-reference-at-standard-detail-level.sdp.md | 23 -- ...d-reference-at-summary-detail-level.sdp.md | 23 -- ...03-extract-conventions-by-tag-value.sdp.md | 22 -- ...tent-preserves-rule-block-structure.sdp.md | 21 -- ...ions-found-for-requested-tag-values.sdp.md | 21 -- ...ources-match-any-pattern-file-paths.sdp.md | 21 -- ...g-matches-multiple-decision-records.sdp.md | 21 -- .../s-008-dual-output-generation.sdp.md | 21 -- .../s-009-summary-compaction-quality.sdp.md | 23 -- ...appear-in-available-generators-list.sdp.md | 22 -- ...invocation-generates-reference-docs.sdp.md | 20 -- ...ntion-tag-is-registered-in-taxonomy.sdp.md | 21 -- ...ontent-preserved-in-decision-record.sdp.md | 22 -- ...ion-is-not-split-by-mutation-family.sdp.md | 21 -- ...forged-proof-is-rejected-by-default.sdp.md | 20 -- .../s-001-cancel-a-confirmed-order.sdp.md | 21 -- ...-cancelled-order-unchanged-behavior.sdp.md | 20 -- ...volves-confirmed-state-to-cancelled.sdp.md | 20 -- ...-after-confirmed-order-cancellation.sdp.md | 23 -- ...oes-not-trigger-reservation-release.sdp.md | 20 -- ...ith-pending-reservation-releases-it.sdp.md | 20 -- ...or-duplicate-order-cancelled-events.sdp.md | 19 -- ...cellations-trigger-churn-risk-agent.sdp.md | 21 -- ...-same-email-produces-same-stream-id.sdp.md | 22 -- ...posite-key-produces-consistent-hash.sdp.md | 22 -- ...mails-produce-different-stream-i-ds.sdp.md | 20 -- .../s-004-first-create-succeeds.sdp.md | 21 -- ...5-second-create-fails-with-conflict.sdp.md | 21 -- ...urrent-creates-exactly-one-succeeds.sdp.md | 21 -- .../s-007-hash-output-is-url-safe.sdp.md | 21 -- .../s-008-hash-is-not-reversible.sdp.md | 21 -- ...s-009-pattern-selection-by-use-case.sdp.md | 22 -- ...-can-evolve-independently-of-phases.sdp.md | 21 -- ...-phase-files-link-specs-to-releases.sdp.md | 22 -- ...starts-from-decisions-and-inventory.sdp.md | 21 -- ...oint-formats-are-handled-explicitly.sdp.md | 21 -- ...urns-healthy-when-all-components-ok.sdp.md | 24 -- ...returns-unhealthy-on-projection-lag.sdp.md | 21 -- ...liveness-probe-always-returns-alive.sdp.md | 25 -- ...04-workpool-backlog-fails-readiness.sdp.md | 23 -- ...normal-queue-depth-passes-readiness.sdp.md | 23 -- ...jection-lag-is-calculated-correctly.sdp.md | 21 -- ...g-checkpoint-treated-as-maximum-lag.sdp.md | 21 -- .../s-008-zero-lag-is-healthy.sdp.md | 21 -- ...s-collection-gathers-all-dimensions.sdp.md | 22 -- ...ics-emitted-as-json-for-log-streams.sdp.md | 21 -- ...rics-collection-handles-empty-state.sdp.md | 22 -- ...nents-healthy-yields-healthy-system.sdp.md | 25 -- ...hy-component-makes-system-unhealthy.sdp.md | 23 -- ...ed-component-yields-degraded-system.sdp.md | 23 -- ...s-001-context-map-shows-bc-topology.sdp.md | 21 -- ...2-register-partnership-relationship.sdp.md | 21 -- ...register-shared-kernel-relationship.sdp.md | 21 -- ...ster-open-host-service-relationship.sdp.md | 21 -- ...-duplicate-relationship-is-rejected.sdp.md | 20 -- ...eferential-relationship-is-rejected.sdp.md | 20 -- ...ation-event-uses-published-language.sdp.md | 22 -- ...8-event-tagging-for-routing-and-dcb.sdp.md | 22 -- ...hema-compatibility-mode-is-enforced.sdp.md | 21 -- ...ster-schema-with-compatibility-mode.sdp.md | 21 -- ...istered-event-type-fails-conversion.sdp.md | 20 -- ...lid-payload-fails-schema-validation.sdp.md | 21 -- ...translates-external-system-response.sdp.md | 20 -- ...l-handles-bidirectional-translation.sdp.md | 20 -- .../s-015-acl-validates-external-input.sdp.md | 20 -- .../s-016-acl-rejects-unmapped-values.sdp.md | 20 -- ...s-001-v1-consumer-receives-v2-event.sdp.md | 22 -- .../s-002-upcast-historical-events.sdp.md | 21 -- ...casters-for-multi-version-migration.sdp.md | 21 -- .../s-004-upcast-adds-computed-field.sdp.md | 21 -- ...ompatible-schema-change-is-rejected.sdp.md | 21 -- ...6-breaking-change-without-migration.sdp.md | 21 -- ...test-validates-schema-compatibility.sdp.md | 21 -- .../s-008-contract-sample-generation.sdp.md | 21 -- ...09-generate-multiple-unique-samples.sdp.md | 21 -- ...-010-producer-contract-test-utility.sdp.md | 20 -- ...-011-consumer-contract-test-utility.sdp.md | 20 -- ...ible-producer-and-consumer-verified.sdp.md | 21 -- .../s-013-compatible-with-downcaster.sdp.md | 22 -- ...4-detect-producer-consumer-mismatch.sdp.md | 23 -- ...-015-contract-violation-is-recorded.sdp.md | 22 -- ...6-contract-violations-are-queryable.sdp.md | 21 -- ...01-platform-fsm-has-no-dependencies.sdp.md | 22 -- ...ecider-depends-only-on-platform-fsm.sdp.md | 21 -- ...der-package-is-independently-usable.sdp.md | 22 -- ...kages-are-independently-publishable.sdp.md | 21 -- ...rk-tests-live-in-framework-packages.sdp.md | 22 -- ...6-existing-imports-continue-to-work.sdp.md | 21 -- ...platform-namespace-avoids-conflicts.sdp.md | 21 -- ...rs-appear-in-generated-decisions-md.sdp.md | 22 -- ...g-is-independent-from-package-ad-rs.sdp.md | 22 -- ...-001-minimal-release-file-structure.sdp.md | 22 -- ...002-pdr-tagged-with-release-version.sdp.md | 21 -- ...elog-generation-from-scattered-tags.sdp.md | 21 -- ...ype-script-phase-files-are-separate.sdp.md | 23 -- ...2-spec-files-use-semantic-tags-only.sdp.md | 23 -- ...iles-centralize-release-information.sdp.md | 23 -- ...-can-evolve-independently-of-phases.sdp.md | 21 -- ...ease-references-in-spec-data-tables.sdp.md | 21 -- ...hase-files-support-process-metadata.sdp.md | 24 -- ...e-files-support-dependency-tracking.sdp.md | 22 -- ...-all-metadata-uses-architect-prefix.sdp.md | 21 -- .../s-002-bdd-tags-remain-unprefixed.sdp.md | 21 -- ...-deprecated-prefix-during-migration.sdp.md | 21 -- ...1-compiler-enforces-taxonomy-values.sdp.md | 20 -- ...s-derive-from-type-script-constants.sdp.md | 20 -- ...-builder-creates-valid-tag-registry.sdp.md | 20 -- ...s-004-type-inference-from-constants.sdp.md | 20 -- .../s-001-roadmap-spec-structure.sdp.md | 24 -- .../s-002-package-spec-structure.sdp.md | 24 -- ...03-linking-roadmap-to-package-specs.sdp.md | 23 -- ...-004-completed-pattern-roadmap-spec.sdp.md | 23 -- ...ve-pattern-with-acceptance-criteria.sdp.md | 22 -- ...ing-a-platform-demonstration-change.sdp.md | 20 -- ...valuating-a-business-feature-change.sdp.md | 20 -- ...-003-evaluating-an-uncertain-change.sdp.md | 20 -- ...oduces-decision-specs-not-documents.sdp.md | 21 -- ...-design-session-produces-code-stubs.sdp.md | 22 -- ...003-stub-file-has-target-annotation.sdp.md | 22 -- ...ubs-use-pattern-based-folder-naming.sdp.md | 20 -- ...ssion-decision-uses-design-category.sdp.md | 20 -- ...eceives-projection-data-as-argument.sdp.md | 23 -- ...external-data-is-handled-gracefully.sdp.md | 22 -- ...jected-data-interface-is-extensible.sdp.md | 21 -- ...rforms-analysis-without-persistence.sdp.md | 22 -- ...tation-persists-decision-atomically.sdp.md | 13 - ...e-falls-back-to-rule-based-analysis.sdp.md | 22 -- ...riggers-dead-letter-via-on-complete.sdp.md | 22 -- ...ces-checkpoint-without-side-effects.sdp.md | 22 -- ...ion-subscription-via-enqueue-action.sdp.md | 13 - ...tion-subscriptions-remain-unchanged.sdp.md | 21 -- ...uires-on-complete-at-the-type-level.sdp.md | 13 - ...sequential-events-process-correctly.sdp.md | 21 -- ...ntity-are-serialized-at-on-complete.sdp.md | 24 -- ...rocessed-event-is-skipped-in-action.sdp.md | 22 -- ...-on-complete-failure-replays-safely.sdp.md | 13 - ...iption-specific-pool-when-available.sdp.md | 22 -- ...ough-orchestrator-to-domain-handler.sdp.md | 26 -- ...mmand-type-fails-with-routing-error.sdp.md | 22 -- ...by-command-orchestrator-idempotency.sdp.md | 22 -- ...gger-for-cheap-detection-before-llm.sdp.md | 22 -- ...s-analyze-for-llm-powered-detection.sdp.md | 25 -- ...id-lifecycle-transition-is-rejected.sdp.md | 22 -- ...nt-works-from-any-non-stopped-state.sdp.md | 13 - ...-transitions-active-agent-to-paused.sdp.md | 13 - ...nt-resumes-from-checkpoint-position.sdp.md | 13 - ...-configuration-without-losing-state.sdp.md | 22 -- ...egitimate-component-boundary-action.sdp.md | 22 -- ...-proof-is-rejected-before-any-write.sdp.md | 21 -- ...ation-family-migrates-in-one-packet.sdp.md | 21 -- ...rictly-monotonic-at-real-timestamps.sdp.md | 21 -- ...nts-are-read-safely-by-the-new-code.sdp.md | 21 -- ...nger-share-the-primary-projection-p.sdp.md | 22 -- ...existent-workpool-ordering-behavior.sdp.md | 21 -- ...e-chooses-the-low-blast-radius-path.sdp.md | 22 -- ...age-splits-are-not-silently-started.sdp.md | 21 -- ...zes-the-non-split-contract-surfaces.sdp.md | 21 -- ...-tranche-3-non-split-boundary-rules.sdp.md | 22 -- ...-returns-the-original-append-result.sdp.md | 22 -- ...ent-payload-is-rejected-and-audited.sdp.md | 22 -- ...d-cap-passes-the-component-boundary.sdp.md | 22 -- ...load-is-rejected-before-persistence.sdp.md | 22 -- ...uses-the-replacement-compound-index.sdp.md | 21 -- ...sent-after-the-audit-driven-cleanup.sdp.md | 21 -- ...cy-decision-rather-than-a-package-r.sdp.md | 21 -- ...pen-the-deferred-platform-core-spli.sdp.md | 22 -- ...across-roadmap-and-decision-sources.sdp.md | 21 -- ...mes-identify-carrier-artifacts-only.sdp.md | 21 -- ...lements-carries-the-continuity-edge.sdp.md | 21 -- ...c-pattern-without-undoing-the-whole.sdp.md | 22 -- ...-enforcement-in-the-normal-ci-lanes.sdp.md | 22 -- .../s-001-projection-lag-is-tracked.sdp.md | 22 -- ...lection-handles-missing-checkpoints.sdp.md | 21 -- ...ce-spans-command-to-projection-flow.sdp.md | 21 -- ...-missing-trace-context-uses-default.sdp.md | 21 -- ...readiness-probe-checks-dependencies.sdp.md | 20 -- ...nhealthy-dependency-fails-readiness.sdp.md | 20 -- ...-007-liveness-probe-always-succeeds.sdp.md | 20 -- ...08-workpool-backlog-fails-readiness.sdp.md | 23 -- ...rcuit-opens-after-repeated-failures.sdp.md | 20 -- ...nsitions-to-half-open-after-timeout.sdp.md | 20 -- ...ul-half-open-request-closes-circuit.sdp.md | 20 -- ...d-half-open-request-reopens-circuit.sdp.md | 20 -- ...jection-rebuild-re-processes-events.sdp.md | 21 -- ...dead-letter-retry-re-enqueues-event.sdp.md | 20 -- ...ent-flow-trace-returns-full-history.sdp.md | 20 -- ...16-durable-function-run-diagnostics.sdp.md | 21 -- ...-action-retrier-for-half-open-probe.sdp.md | 20 -- ...-reopens-circuit-via-action-retrier.sdp.md | 20 -- ...s-action-retrier-for-external-calls.sdp.md | 21 -- ...dlq-retry-returns-to-pending-status.sdp.md | 21 -- ...ction-calls-propagate-trace-context.sdp.md | 21 -- ...io-with-doc-string-for-rich-content.sdp.md | 20 -- ...with-data-table-for-structured-data.sdp.md | 13 - ...3-simple-scenario-under-second-rule.sdp.md | 19 -- .../s-004-scenario-with-examples-table.sdp.md | 19 -- ...1-generate-themed-decision-document.sdp.md | 22 -- .../s-002-theme-tag-in-decision-file.sdp.md | 21 -- ...003-adr-with-dependency-declaration.sdp.md | 20 -- .../s-004-generate-dependency-graph.sdp.md | 21 -- ...layer-information-in-generated-docs.sdp.md | 21 -- ...adr-from-old-format-to-feature-file.sdp.md | 23 -- ...eview-for-validity-during-migration.sdp.md | 23 -- ...008-generate-all-decision-artifacts.sdp.md | 20 -- ...ist-before-tranche-1-implementation.sdp.md | 21 -- ...lidation-remains-machine-verifiable.sdp.md | 21 -- ...elease-governance-points-to-pdr-002.sdp.md | 21 -- ...architect-guard-and-docs-generation.sdp.md | 21 -- ...p-does-not-bypass-the-auth-keystone.sdp.md | 21 -- ...-gaps-fail-closed-after-remediation.sdp.md | 21 -- ...0-codec-driven-reference-generation.sdp.md | 15 - ...se-100-themed-decision-architecture.sdp.md | 15 - ...jection-categories-executable-tests.sdp.md | 15 - ...ed-context-ai-driven-event-reactors.sdp.md | 15 - .../phase-22-agent-as-bounded-context.sdp.md | 15 - ...hase-22-agent-churn-risk-completion.sdp.md | 15 - ...ase-22-confirmed-order-cancellation.sdp.md | 15 - .../d-001-create-admin-directory.sdp.md | 2 +- .../d-002-projection-admin-endpoints.sdp.md | 2 +- .../d-003-refactored-dlq-endpoints.sdp.md | 2 +- .../d-004-event-flow-trace-query.sdp.md | 2 +- .../d-005-system-state-snapshot-query.sdp.md | 2 +- .../d-006-durable-function-run-queries.sdp.md | 2 +- .../d-007-admin-authorization-wrapper.sdp.md | 2 +- .../d-008-admin-api-documentation.sdp.md | 2 +- .../d-001-high-value-agent-config.sdp.md | 2 +- ...d-002-high-value-pattern-definition.sdp.md | 2 +- .../d-003-high-value-action-handler.sdp.md | 2 +- ...-004-high-value-on-complete-handler.sdp.md | 2 +- .../d-005-high-value-command-route.sdp.md | 2 +- ...6-high-value-event-bus-subscription.sdp.md | 2 +- ...igh-value-integration-test-real-llm.sdp.md | 2 +- ...er-management-section-in-monitoring.sdp.md | 2 +- .../d-009-use-dead-letters-hook.sdp.md | 2 +- .../d-010-use-dead-letter-actions-hook.sdp.md | 2 +- .../d-011-decision-history-tab.sdp.md | 2 +- ...-decision-history-hook-with-filters.sdp.md | 2 +- ...ast-notification-integration-sonner.sdp.md | 2 +- .../d-014-action-feedback-toasts.sdp.md | 2 +- ...15-dashboard-update-for-multi-agent.sdp.md | 2 +- .../d-016-e2-e-step-definitions.sdp.md | 2 +- .../d-017-agent-admin-page-page-object.sdp.md | 2 +- ...mplemented-agent-e2e-scenarios-skip.sdp.md | 2 +- ...-019-auth-integration-documentation.sdp.md | 2 +- .../d-001-agent-component-definition.sdp.md | 2 +- .../d-002-agent-component-schema.sdp.md | 2 +- .../d-003-checkpoint-public-api.sdp.md | 2 +- .../d-004-audit-public-api.sdp.md | 2 +- .../d-005-dead-letter-public-api.sdp.md | 2 +- .../d-006-command-public-api.sdp.md | 2 +- .../d-007-approval-public-api.sdp.md | 2 +- ...d-008-cross-component-query-pattern.sdp.md | 2 +- .../d-001-agent-action-handler-factory.sdp.md | 2 +- ...-llm-integrated-on-complete-handler.sdp.md | 2 +- .../d-003-rate-limiter-integration.sdp.md | 2 +- .../d-004-cost-budget-tracking.sdp.md | 2 +- ...005-convex-dev-agent-thread-adapter.sdp.md | 2 +- ...n-create-agent-subscription-options.sdp.md | 2 +- .../d-007-circuit-breaker-for-llm.sdp.md | 2 +- .../d-008-agent-workpool-configuration.sdp.md | 2 +- ...09-action-mutation-integration-test.sdp.md | 2 +- ...-circuit-breaker-state-machine-pure.sdp.md | 2 +- .../d-002-circuit-breaker-types.sdp.md | 2 +- ...d-003-circuit-breakers-table-schema.sdp.md | 2 +- .../d-004-with-circuit-breaker-wrapper.sdp.md | 2 +- .../d-005-load-circuit-state-query.sdp.md | 2 +- .../d-006-record-success-mutation.sdp.md | 2 +- .../d-007-record-failure-mutation.sdp.md | 2 +- ...-check-half-open-scheduled-mutation.sdp.md | 2 +- ...9-on-circuit-probe-complete-handler.sdp.md | 2 +- .../d-010-circuit-breaker-metrics.sdp.md | 2 +- .../d-001-pdr-014-placeholder.sdp.md | 2 +- ...nonical-verification-proof-contract.sdp.md | 2 +- .../d-003-verify-actor-helper.sdp.md | 2 +- ...identity-bearing-mutation-migration.sdp.md | 2 +- ...-tagging-for-system-only-exceptions.sdp.md | 2 +- ...ent-boundary-auth-integration-suite.sdp.md | 2 +- ...01-deterministic-stream-id-function.sdp.md | 2 +- .../d-002-hash-algorithm-selection.sdp.md | 2 +- .../d-003-conflict-error-handling.sdp.md | 2 +- .../d-004-pattern-documentation.sdp.md | 2 +- ...-global-position-consumer-inventory.sdp.md | 2 +- .../d-002-pdr-018-placeholder.sdp.md | 2 +- .../d-003-pdr-015-placeholder.sdp.md | 2 +- ...end-to-stream-idempotency-migration.sdp.md | 2 +- ...ntation-migration-and-compat-reader.sdp.md | 2 +- ...-canonical-pm-transition-map-parity.sdp.md | 2 +- ...event-correctness-integration-suite.sdp.md | 2 +- .../d-001-health-check-types.sdp.md | 2 +- .../d-002-check-readiness-query.sdp.md | 2 +- .../d-003-check-liveness-query.sdp.md | 2 +- ...-004-http-router-with-health-routes.sdp.md | 2 +- .../d-005-metrics-types.sdp.md | 2 +- .../d-006-metrics-collector.sdp.md | 2 +- .../d-007-projection-lag-calculator.sdp.md | 2 +- .../d-008-workpool-depth-query.sdp.md | 2 +- .../d-009-system-health-aggregator.sdp.md | 2 +- .../d-001-context-map-registry.sdp.md | 2 +- .../d-002-context-map-documentation.sdp.md | 2 +- .../d-003-published-language-registry.sdp.md | 2 +- ...004-to-published-language-converter.sdp.md | 2 +- .../d-005-acl-builder-enhancement.sdp.md | 2 +- ...ntegration-event-metadata-extension.sdp.md | 2 +- .../d-001-upcaster-implementation.sdp.md | 2 +- .../d-002-downcaster-implementation.sdp.md | 2 +- .../d-003-migration-path-validation.sdp.md | 2 +- .../d-004-contract-sample-generation.sdp.md | 2 +- .../d-005-producer-contract-tests.sdp.md | 2 +- .../d-006-consumer-contract-tests.sdp.md | 2 +- .../d-007-compatibility-verification.sdp.md | 2 +- .../d-008-contract-violation-detection.sdp.md | 2 +- .../d-001-metrics-collection-types.sdp.md | 2 +- .../d-002-metrics-collector.sdp.md | 2 +- .../d-003-health-check-queries.sdp.md | 2 +- .../d-004-health-http-router.sdp.md | 2 +- ...-005-circuit-breaker-implementation.sdp.md | 2 +- .../d-006-admin-projection-endpoints.sdp.md | 2 +- .../d-007-admin-dlq-endpoints.sdp.md | 2 +- .../d-008-admin-diagnostics.sdp.md | 2 +- ...09-durable-function-run-diagnostics.sdp.md | 2 +- .../d-010-contract-violation-types.sdp.md | 2 +- .../d-011-grafana-dashboard-templates.sdp.md | 2 +- .../d-012-runbook-documentation.sdp.md | 2 +- ...circuit-breaker-retrier-integration.sdp.md | 2 +- .../d-014-dlq-action-retrier-pattern.sdp.md | 2 +- ...015-durable-function-decision-guide.sdp.md | 2 +- .../d-001-demo-item-1.sdp.md | 13 - ...d-001-add-adr-theme-tag-to-registry.sdp.md | 2 +- ...02-theme-grouped-decision-generator.sdp.md | 2 +- .../d-003-dependency-graph-generator.sdp.md | 2 +- .../d-004-adr-migration-scripts.sdp.md | 2 +- ...005-review-and-port-33-active-ad-rs.sdp.md | 2 +- .../d-001-dependency-delta-memo.sdp.md | 2 +- ...2-store-backend-integration-harness.sdp.md | 2 +- ...003-bus-backend-integration-harness.sdp.md | 2 +- ...pecheck-and-vitest-config-alignment.sdp.md | 2 +- ...005-strict-ts-and-es-lint-hardening.sdp.md | 2 +- ...ation-aligned-to-architect-releases.sdp.md | 2 +- .../d-002-dependency-scanning-in-ci.sdp.md | 2 +- ...tract-status-convention-and-linting.sdp.md | 2 +- .../d-004-convex-es-rename-guard.sdp.md | 2 +- ...05-docs-process-validation-workflow.sdp.md | 2 +- ...ensure-test-environment-fail-closed.sdp.md | 2 +- ...n-id-required-at-validator-boundary.sdp.md | 2 +- ...ength-uui-dv7-helper-centralization.sdp.md | 2 +- ...uthorization-default-deny-migration.sdp.md | 2 +- ...05-approval-expiration-ordering-fix.sdp.md | 2 +- ...ifecycle-stubs-throw-or-are-removed.sdp.md | 2 +- ...tore-dependency-decision-guardrails.sdp.md | 2 +- ...se-100-themed-decision-architecture.sdp.md | 15 - .../phase-18-production-hardening.sdp.md | 15 - ...e-18-workpool-partitioning-strategy.sdp.md | 15 - .../phase-20-reservation-pattern.sdp.md | 15 - .../phase-21-integration-patterns-21b.sdp.md | 15 - ...ed-context-ai-driven-event-reactors.sdp.md | 15 - .../phase-22-agent-as-bounded-context.sdp.md | 15 - ...hase-22-agent-churn-risk-completion.sdp.md | 15 - ...ase-22-confirmed-order-cancellation.sdp.md | 15 - test/sdp-migration-guard.test.ts | 10 +- 3995 files changed, 3321 insertions(+), 69893 deletions(-) create mode 100644 .grok/workflows/migrate-specs-to-sdp.rhai create mode 100644 Justfile create mode 100644 scripts/sdp-honesty-repair.mjs create mode 100644 scripts/sdp-protocol-migrate.mjs create mode 100644 scripts/sdp-prune-low-value.mjs delete mode 100644 specs/behavior/order-management/agent/on-complete.examples/s-001-no-dead-letter-on-success.sdp.md delete mode 100644 specs/behavior/order-management/agent/on-complete.examples/s-002-no-dead-letter-on-canceled.sdp.md delete mode 100644 specs/behavior/order-management/agent/on-complete.examples/s-003-creates-dead-letter-on-failure.sdp.md delete mode 100644 specs/behavior/order-management/agent/on-complete.examples/s-004-increments-attempt-count-on-repeated-failure.sdp.md delete mode 100644 specs/behavior/order-management/agent/on-complete.examples/s-005-does-not-update-dead-letter-in-terminal-state.sdp.md delete mode 100644 specs/behavior/order-management/agent/on-complete.examples/s-006-cron-expires-approval-after-timeout.sdp.md delete mode 100644 specs/behavior/order-management/agent/on-complete.examples/s-007-expired-approval-cannot-be-approved.sdp.md delete mode 100644 specs/behavior/order-management/agent/on-complete.examples/s-008-suggest-customer-outreach-creates-outreach-record-and-emits-event.sdp.md delete mode 100644 specs/behavior/order-management/deciders/add-order-item-decider.examples/s-001-decide-to-add-item-to-draft-order.sdp.md delete mode 100644 specs/behavior/order-management/deciders/add-order-item-decider.examples/s-002-reject-add-item-when-order-is-not-in-draft.sdp.md delete mode 100644 specs/behavior/order-management/deciders/add-order-item-decider.examples/s-003-reject-add-item-with-invalid-quantity.sdp.md delete mode 100644 specs/behavior/order-management/deciders/add-order-item-decider.examples/s-004-accumulate-items-and-recalculate-total.sdp.md delete mode 100644 specs/behavior/order-management/deciders/add-stock-decider.examples/s-001-decide-to-add-stock-to-product.sdp.md delete mode 100644 specs/behavior/order-management/deciders/add-stock-decider.examples/s-002-add-stock-with-reason.sdp.md delete mode 100644 specs/behavior/order-management/deciders/add-stock-decider.examples/s-003-reject-add-stock-with-zero-quantity.sdp.md delete mode 100644 specs/behavior/order-management/deciders/add-stock-decider.examples/s-004-reject-add-stock-with-negative-quantity.sdp.md delete mode 100644 specs/behavior/order-management/deciders/cancel-order-decider.examples/s-001-decide-to-cancel-a-draft-order.sdp.md delete mode 100644 specs/behavior/order-management/deciders/cancel-order-decider.examples/s-002-decide-to-cancel-a-submitted-order.sdp.md delete mode 100644 specs/behavior/order-management/deciders/cancel-order-decider.examples/s-003-decide-to-cancel-a-confirmed-order.sdp.md delete mode 100644 specs/behavior/order-management/deciders/cancel-order-decider.examples/s-004-reject-cancel-for-already-cancelled-order.sdp.md delete mode 100644 specs/behavior/order-management/deciders/confirm-order-decider.examples/s-001-decide-to-confirm-a-submitted-order.sdp.md delete mode 100644 specs/behavior/order-management/deciders/confirm-order-decider.examples/s-002-reject-confirm-for-order-in-draft-status.sdp.md delete mode 100644 specs/behavior/order-management/deciders/confirm-order-decider.examples/s-003-reject-confirm-for-already-confirmed-order.sdp.md delete mode 100644 specs/behavior/order-management/deciders/confirm-order-decider.examples/s-004-reject-confirm-for-cancelled-order.sdp.md delete mode 100644 specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-001-decide-to-confirm-a-pending-reservation.sdp.md delete mode 100644 specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-002-reject-confirm-when-reservation-is-already-confirmed.sdp.md delete mode 100644 specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-003-reject-confirm-when-reservation-is-released.sdp.md delete mode 100644 specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-004-reject-confirm-when-reservation-is-expired.sdp.md delete mode 100644 specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-005-reject-confirm-when-reservation-has-passed-its-expiration-time.sdp.md delete mode 100644 specs/behavior/order-management/deciders/create-order-decider.examples/s-001-decide-to-create-a-new-order-when-none-exists.sdp.md delete mode 100644 specs/behavior/order-management/deciders/create-order-decider.examples/s-002-reject-create-when-order-already-exists.sdp.md delete mode 100644 specs/behavior/order-management/deciders/create-product-decider.examples/s-001-decide-to-create-a-new-product-when-none-exists.sdp.md delete mode 100644 specs/behavior/order-management/deciders/create-product-decider.examples/s-002-reject-create-when-product-already-exists.sdp.md delete mode 100644 specs/behavior/order-management/deciders/create-product-decider.examples/s-003-reject-create-with-empty-product-name.sdp.md delete mode 100644 specs/behavior/order-management/deciders/create-product-decider.examples/s-004-reject-create-with-empty-sku.sdp.md delete mode 100644 specs/behavior/order-management/deciders/create-product-decider.examples/s-005-reject-create-with-zero-price.sdp.md delete mode 100644 specs/behavior/order-management/deciders/create-product-decider.examples/s-006-reject-create-with-negative-price.sdp.md delete mode 100644 specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-001-decide-to-expire-a-pending-reservation-that-has-timed-out.sdp.md delete mode 100644 specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-002-reject-expire-when-reservation-has-not-timed-out-yet.sdp.md delete mode 100644 specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-003-reject-expire-when-reservation-is-already-confirmed.sdp.md delete mode 100644 specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-004-reject-expire-when-reservation-is-already-released.sdp.md delete mode 100644 specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-005-reject-expire-when-reservation-is-already-expired.sdp.md delete mode 100644 specs/behavior/order-management/deciders/inventory-evolve.examples/s-001-evolve-null-state-with-product-created-event.sdp.md delete mode 100644 specs/behavior/order-management/deciders/inventory-evolve.examples/s-002-evolve-inventory-state-with-stock-added-event.sdp.md delete mode 100644 specs/behavior/order-management/deciders/inventory-evolve.examples/s-003-evolve-inventory-from-zero-stock.sdp.md delete mode 100644 specs/behavior/order-management/deciders/inventory-evolve.examples/s-004-evolve-inventory-state-with-stock-reserved-event.sdp.md delete mode 100644 specs/behavior/order-management/deciders/inventory-evolve.examples/s-005-evolve-inventory-state-when-product-not-in-reservation.sdp.md delete mode 100644 specs/behavior/order-management/deciders/inventory-evolve.examples/s-006-evolve-inventory-state-with-reservation-failed-event-no-change.sdp.md delete mode 100644 specs/behavior/order-management/deciders/order-evolve.examples/s-001-order-created-evolves-null-to-initial-state.sdp.md delete mode 100644 specs/behavior/order-management/deciders/order-evolve.examples/s-002-order-item-added-appends-item-to-empty-order.sdp.md delete mode 100644 specs/behavior/order-management/deciders/order-evolve.examples/s-003-order-item-added-accumulates-with-existing-items.sdp.md delete mode 100644 specs/behavior/order-management/deciders/order-evolve.examples/s-004-order-item-removed-removes-item-and-updates-total.sdp.md delete mode 100644 specs/behavior/order-management/deciders/order-evolve.examples/s-005-order-submitted-changes-status-to-submitted.sdp.md delete mode 100644 specs/behavior/order-management/deciders/order-evolve.examples/s-006-order-confirmed-changes-status-to-confirmed.sdp.md delete mode 100644 specs/behavior/order-management/deciders/order-evolve.examples/s-007-order-cancelled-changes-status-from-draft-to-cancelled.sdp.md delete mode 100644 specs/behavior/order-management/deciders/order-evolve.examples/s-008-order-cancelled-changes-status-from-submitted-to-cancelled.sdp.md delete mode 100644 specs/behavior/order-management/deciders/order-evolve.examples/s-009-order-cancelled-changes-status-from-confirmed-to-cancelled.sdp.md delete mode 100644 specs/behavior/order-management/deciders/release-reservation-decider.examples/s-001-decide-to-release-a-pending-reservation.sdp.md delete mode 100644 specs/behavior/order-management/deciders/release-reservation-decider.examples/s-002-decide-to-release-a-confirmed-reservation.sdp.md delete mode 100644 specs/behavior/order-management/deciders/release-reservation-decider.examples/s-003-reject-release-when-reservation-is-already-released.sdp.md delete mode 100644 specs/behavior/order-management/deciders/release-reservation-decider.examples/s-004-reject-release-when-reservation-is-expired.sdp.md delete mode 100644 specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-001-decide-to-remove-existing-item-from-draft-order.sdp.md delete mode 100644 specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-002-reject-remove-item-when-order-is-not-in-draft.sdp.md delete mode 100644 specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-003-reject-remove-when-item-does-not-exist.sdp.md delete mode 100644 specs/behavior/order-management/deciders/reservation-evolve.examples/s-001-evolve-reservation-state-with-reservation-confirmed.sdp.md delete mode 100644 specs/behavior/order-management/deciders/reservation-evolve.examples/s-002-evolve-pending-reservation-with-reservation-released.sdp.md delete mode 100644 specs/behavior/order-management/deciders/reservation-evolve.examples/s-003-evolve-confirmed-reservation-with-reservation-released.sdp.md delete mode 100644 specs/behavior/order-management/deciders/reservation-evolve.examples/s-004-evolve-pending-reservation-with-reservation-expired.sdp.md delete mode 100644 specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-001-decide-to-reserve-stock-when-all-products-have-sufficient-availability.sdp.md delete mode 100644 specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-002-fail-reservation-when-one-product-has-insufficient-stock.sdp.md delete mode 100644 specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-003-fail-reservation-when-product-does-not-exist.sdp.md delete mode 100644 specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-004-reject-reservation-with-empty-items.sdp.md delete mode 100644 specs/behavior/order-management/deciders/submit-order-decider.examples/s-001-decide-to-submit-draft-order-with-items.sdp.md delete mode 100644 specs/behavior/order-management/deciders/submit-order-decider.examples/s-002-reject-submit-for-order-not-in-draft-status.sdp.md delete mode 100644 specs/behavior/order-management/deciders/submit-order-decider.examples/s-003-reject-submit-for-order-with-no-items.sdp.md delete mode 100644 specs/behavior/order-management/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md delete mode 100644 specs/behavior/order-management/inventory/add-stock.examples/s-002-add-stock-to-product-with-existing-stock.sdp.md delete mode 100644 specs/behavior/order-management/inventory/add-stock.examples/s-003-cannot-add-stock-to-non-existent-product.sdp.md delete mode 100644 specs/behavior/order-management/inventory/add-stock.examples/s-004-add-stock-is-idempotent-with-same-command-id.sdp.md delete mode 100644 specs/behavior/order-management/inventory/confirm-reservation.examples/s-001-successfully-confirm-pending-reservation.sdp.md delete mode 100644 specs/behavior/order-management/inventory/confirm-reservation.examples/s-002-cannot-confirm-non-existent-reservation.sdp.md delete mode 100644 specs/behavior/order-management/inventory/confirm-reservation.examples/s-003-cannot-confirm-already-confirmed-reservation.sdp.md delete mode 100644 specs/behavior/order-management/inventory/confirm-reservation.examples/s-004-confirm-reservation-is-idempotent-with-same-command-id.sdp.md delete mode 100644 specs/behavior/order-management/inventory/create-product.examples/s-001-successfully-create-a-new-product.sdp.md delete mode 100644 specs/behavior/order-management/inventory/create-product.examples/s-002-cannot-create-product-with-existing-id.sdp.md delete mode 100644 specs/behavior/order-management/inventory/create-product.examples/s-003-create-product-is-idempotent-with-same-command-id.sdp.md delete mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-001-sum-of-available-and-reserved.sdp.md delete mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-002-only-available-when-reserved-is-zero.sdp.md delete mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-003-only-reserved-when-available-is-zero.sdp.md delete mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-004-both-quantities-are-zero.sdp.md delete mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-005-cms-fields-match-input-parameters.sdp.md delete mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-006-initial-quantities-and-version-are-zero.sdp.md delete mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-007-timestamps-are-set-to-current-time.sdp.md delete mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-008-current-version-cms-is-unchanged.sdp.md delete mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-009-missing-state-version-is-upgraded.sdp.md delete mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-010-version-0-is-upgraded.sdp.md delete mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-011-all-fields-are-preserved-during-upcast.sdp.md delete mode 100644 specs/behavior/order-management/inventory/inventory-domain.examples/s-012-future-version-throws-error.sdp.md delete mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-001-passes-for-a-valid-product.sdp.md delete mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-002-throws-product-not-found-for-null-product-reference.sdp.md delete mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-003-throws-product-not-found-for-undefined-product-reference.sdp.md delete mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-004-passes-for-null-product-reference.sdp.md delete mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-005-passes-for-undefined-product-reference.sdp.md delete mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-006-throws-product-already-exists-for-existing-product.sdp.md delete mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-007-passes-for-standard-sku.sdp.md delete mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-008-passes-for-sku-with-special-characters.sdp.md delete mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-009-throws-invalid-sku-for-empty-sku.sdp.md delete mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-010-throws-invalid-sku-for-whitespace-only-sku.sdp.md delete mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-011-passes-for-standard-product-name.sdp.md delete mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-012-passes-for-product-name-with-numbers.sdp.md delete mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-013-throws-invalid-product-name-for-empty-product-name.sdp.md delete mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-014-throws-invalid-product-name-for-whitespace-only-product-name.sdp.md delete mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-015-passes-for-positive-integer-10.sdp.md delete mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-016-passes-for-positive-integer-1.sdp.md delete mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-017-throws-invalid-quantity-for-zero.sdp.md delete mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-018-throws-invalid-quantity-for-negative-number.sdp.md delete mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-019-throws-invalid-quantity-for-non-integer.sdp.md delete mode 100644 specs/behavior/order-management/inventory/product-invariants.examples/s-020-includes-context-string-in-error-message.sdp.md delete mode 100644 specs/behavior/order-management/inventory/release-reservation.examples/s-001-successfully-release-pending-reservation.sdp.md delete mode 100644 specs/behavior/order-management/inventory/release-reservation.examples/s-002-can-release-confirmed-reservation-for-order-cancellation.sdp.md delete mode 100644 specs/behavior/order-management/inventory/release-reservation.examples/s-003-release-reservation-is-idempotent-with-same-command-id.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-001-single-item-reservation-returns-count-of-1.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-002-multiple-items-reservation-returns-correct-count.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-003-empty-items-reservation-returns-count-of-0.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-004-multiple-items-returns-sum-of-all-quantities.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-005-single-item-returns-its-quantity.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-006-empty-items-returns-0.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-007-creates-cms-with-correct-reservation-id-and-order-id.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-008-initializes-items-array-correctly.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-009-sets-status-to-pending.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-010-sets-expires-at-with-default-ttl.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-011-supports-custom-ttl.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-012-initializes-version-to-0.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-013-initializes-with-current-state-version.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-014-sets-created-at-and-updated-at-to-current-timestamp.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-015-returns-false-when-reservation-has-not-expired.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-016-returns-true-when-reservation-has-expired.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-017-returns-false-when-reservation-is-confirmed-regardless-of-expiry.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-018-returns-false-when-reservation-is-released-regardless-of-expiry.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-019-handles-exact-expiry-boundary-correctly.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-020-returns-unchanged-cms-when-already-at-current-version.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-021-upgrades-cms-with-missing-state-version-to-current-version.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-022-throws-error-for-future-versions.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-domain.examples/s-023-preserves-all-fields-during-upcast.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-001-does-not-throw-when-reservation-exists.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-002-throws-reservation-not-found-when-reservation-is-null.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-003-throws-reservation-not-found-when-reservation-is-undefined.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-004-does-not-throw-when-reservation-is-null.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-005-does-not-throw-when-reservation-is-undefined.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-006-throws-reservation-already-exists-when-reservation-exists.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-007-does-not-throw-when-items-has-one-item.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-008-does-not-throw-when-items-has-multiple-items.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-009-throws-empty-reservation-when-items-array-is-empty.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-010-does-not-throw-for-valid-item-with-quantity-5.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-011-does-not-throw-for-item-with-quantity-1.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-012-throws-invalid-quantity-for-zero-quantity.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-013-throws-invalid-quantity-for-negative-quantity.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-014-throws-invalid-quantity-for-non-integer-quantity.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-015-throws-invalid-reservation-item-for-empty-product-id.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-016-does-not-throw-for-valid-items-array.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-017-throws-empty-reservation-for-empty-array.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-018-throws-invalid-quantity-when-one-item-has-invalid-quantity.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-019-has-correct-name-property.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-020-has-correct-code-property.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-021-has-correct-message-property.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-022-has-correct-context-property.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-023-can-have-undefined-context.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-024-is-instance-of-error.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-025-reservation-is-pending-check-returns-true-for-pending-status.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-026-reservation-is-pending-check-returns-false-for-non-pending-statuses.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-027-reservation-is-pending-assert-passes-for-pending-status.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-028-reservation-is-pending-assert-throws-reservation-not-pending-for-confirmed.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-029-reservation-is-pending-assert-throws-reservation-not-pending-for-released.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-030-reservation-is-pending-validate-returns-valid-for-pending.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-031-reservation-is-pending-validate-returns-invalid-for-released.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-032-reservation-not-expired-check-returns-true-for-pending-with-future-expiry.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-033-reservation-not-expired-check-returns-true-for-confirmed-with-past-expiry.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-034-reservation-not-expired-check-returns-true-for-released-with-past-expiry.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-035-reservation-not-expired-check-returns-false-for-pending-with-past-expiry.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-036-reservation-not-expired-assert-passes-for-pending-with-future-expiry.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-037-reservation-not-expired-assert-passes-for-confirmed-with-past-expiry.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-038-reservation-not-expired-assert-throws-reservation-expired-for-pending-with.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-039-reservation-not-expired-validate-returns-valid-for-pending-with-future-exp.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-040-reservation-not-expired-validate-returns-invalid-for-pending-with-past-exp.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-041-reservation-has-expired-check-returns-true-for-pending-with-past-expiry.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-042-reservation-has-expired-check-returns-true-for-non-pending-statuses.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-043-reservation-has-expired-check-returns-false-for-pending-with-future-expiry.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-044-reservation-has-expired-assert-passes-for-pending-with-past-expiry.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-045-reservation-has-expired-assert-passes-for-confirmed-regardless-of-expiry.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-046-reservation-has-expired-assert-throws-reservation-not-expired-for-pending.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-047-reservation-has-expired-validate-returns-valid-for-expired-reservation.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-048-reservation-has-expired-validate-returns-invalid-for-pending-with-future-e.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-049-confirm-reservation-invariants-check-all-returns-true-for-pending-and-not.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-050-confirm-reservation-invariants-check-all-returns-false-for-confirmed-and-n.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-051-confirm-reservation-invariants-check-all-returns-false-for-pending-and-exp.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-052-confirm-reservation-invariants-assert-all-passes-for-pending-and-not-expir.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-053-confirm-reservation-invariants-assert-all-throws-reservation-not-pending-f.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-054-confirm-reservation-invariants-assert-all-throws-reservation-expired-for-p.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-055-confirm-reservation-invariants-validate-all-returns-valid-for-pending-and.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-056-confirm-reservation-invariants-validate-all-returns-single-violation-for-c.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-057-confirm-reservation-invariants-validate-all-returns-violation-for-pending.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-058-expire-reservation-invariants-check-all-returns-true-for-pending-and-expir.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-059-expire-reservation-invariants-check-all-returns-false-for-confirmed-and-ex.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-060-expire-reservation-invariants-check-all-returns-false-for-pending-and-not.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-061-expire-reservation-invariants-assert-all-passes-for-pending-and-expired.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-062-expire-reservation-invariants-assert-all-throws-reservation-not-pending-fo.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-063-expire-reservation-invariants-assert-all-throws-reservation-not-expired-fo.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-064-expire-reservation-invariants-validate-all-returns-valid-for-pending-and-e.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-065-expire-reservation-invariants-validate-all-returns-single-violation-for-re.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reservation-invariants.examples/s-066-expire-reservation-invariants-validate-all-returns-single-violation-for-pe.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reserve-stock.examples/s-001-successfully-reserve-available-stock.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reserve-stock.examples/s-002-reserve-multiple-items-atomically.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reserve-stock.examples/s-003-reservation-fails-when-insufficient-stock.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reserve-stock.examples/s-004-multi-item-reservation-is-all-or-nothing.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reserve-stock.examples/s-005-cannot-reserve-non-existent-product.sdp.md delete mode 100644 specs/behavior/order-management/inventory/reserve-stock.examples/s-006-reserve-stock-is-idempotent-with-same-command-id.sdp.md delete mode 100644 specs/behavior/order-management/inventory/stock-invariants.examples/s-001-passes-when-stock-is-sufficient.sdp.md delete mode 100644 specs/behavior/order-management/inventory/stock-invariants.examples/s-002-passes-when-requesting-exact-available-quantity.sdp.md delete mode 100644 specs/behavior/order-management/inventory/stock-invariants.examples/s-003-throws-insufficient-stock-when-stock-is-not-enough.sdp.md delete mode 100644 specs/behavior/order-management/inventory/stock-invariants.examples/s-004-throws-insufficient-stock-when-stock-is-zero.sdp.md delete mode 100644 specs/behavior/order-management/inventory/stock-invariants.examples/s-005-returns-available-when-stock-is-sufficient.sdp.md delete mode 100644 specs/behavior/order-management/inventory/stock-invariants.examples/s-006-returns-available-when-requesting-exact-amount.sdp.md delete mode 100644 specs/behavior/order-management/inventory/stock-invariants.examples/s-007-returns-unavailable-with-deficit-when-stock-is-insufficient.sdp.md delete mode 100644 specs/behavior/order-management/inventory/stock-invariants.examples/s-008-returns-correct-deficit-for-zero-stock.sdp.md delete mode 100644 specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-001-multi-product-order-uses-dcb-for-atomic-reservation.sdp.md delete mode 100644 specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-002-insufficient-inventory-for-one-product-rejects-entire-reservation.sdp.md delete mode 100644 specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-003-dcb-handles-concurrent-reservation-conflicts.sdp.md delete mode 100644 specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-004-duplicate-product-i-ds-are-rejected.sdp.md delete mode 100644 specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-001-order-submitted-includes-customer-snapshot.sdp.md delete mode 100644 specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-002-event-enrichment-does-not-block-order-submission.sdp.md delete mode 100644 specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-003-customer-snapshot-is-immutable-in-event.sdp.md delete mode 100644 specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-004-missing-customer-data-handled-gracefully.sdp.md delete mode 100644 specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-005-v1-events-are-upcasted-to-v2-with-null-customer.sdp.md delete mode 100644 specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-006-v2-events-are-not-modified-by-upcaster.sdp.md delete mode 100644 specs/behavior/order-management/modernization/reactive-order-detail.examples/s-001-order-detail-view-shows-instant-updates.sdp.md delete mode 100644 specs/behavior/order-management/modernization/reactive-order-detail.examples/s-002-multiple-rapid-updates-are-applied-correctly.sdp.md delete mode 100644 specs/behavior/order-management/modernization/reactive-order-detail.examples/s-003-optimistic-update-rolls-back-on-conflict.sdp.md delete mode 100644 specs/behavior/order-management/modernization/reactive-order-detail.examples/s-004-stale-event-stream-is-handled-gracefully.sdp.md delete mode 100644 specs/behavior/order-management/modernization/reference-documentation.examples/s-001-readme-has-reference-implementation-designation.sdp.md delete mode 100644 specs/behavior/order-management/modernization/reference-documentation.examples/s-002-all-demonstrated-patterns-are-cataloged.sdp.md delete mode 100644 specs/behavior/order-management/modernization/reference-documentation.examples/s-003-pattern-links-are-valid.sdp.md delete mode 100644 specs/behavior/order-management/modernization/reference-documentation.examples/s-004-architecture-diagram-is-present.sdp.md delete mode 100644 specs/behavior/order-management/orders/add-items.examples/s-001-add-single-item-to-empty-draft-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/add-items.examples/s-002-add-multiple-items-to-draft-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/add-items.examples/s-003-cannot-add-items-to-submitted-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/add-items.examples/s-004-cannot-add-items-to-cancelled-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/add-items.examples/s-005-cannot-add-item-with-zero-quantity.sdp.md delete mode 100644 specs/behavior/order-management/orders/add-items.examples/s-006-cannot-add-item-with-negative-quantity.sdp.md delete mode 100644 specs/behavior/order-management/orders/add-items.examples/s-007-cannot-add-item-with-negative-price.sdp.md delete mode 100644 specs/behavior/order-management/orders/cancel-order.examples/s-001-cancel-draft-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/cancel-order.examples/s-002-cancel-submitted-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/cancel-order.examples/s-003-cannot-cancel-already-cancelled-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/cancel-order.examples/s-004-cancel-confirmed-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/cancel-order.examples/s-005-cannot-cancel-non-existent-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/cancel-order.examples/s-006-cancel-order-is-idempotent-with-same-command-id.sdp.md delete mode 100644 specs/behavior/order-management/orders/confirm-order.examples/s-001-successfully-confirm-a-submitted-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/confirm-order.examples/s-002-cannot-confirm-a-draft-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/confirm-order.examples/s-003-cannot-confirm-an-already-confirmed-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/confirm-order.examples/s-004-cannot-confirm-a-cancelled-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/confirm-order.examples/s-005-cannot-confirm-a-non-existent-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/confirm-order.examples/s-006-confirm-order-is-idempotent-with-same-command-id.sdp.md delete mode 100644 specs/behavior/order-management/orders/create-order.examples/s-001-successfully-create-a-new-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/create-order.examples/s-002-cannot-create-order-with-existing-id.sdp.md delete mode 100644 specs/behavior/order-management/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-001-empty-items-array-returns-zero.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-002-single-item-total.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-003-multiple-items-total.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-004-zero-quantity-results-in-zero-contribution.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-005-zero-price-results-in-zero-contribution.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-006-decimal-prices-are-handled-correctly.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-007-cms-is-created-with-the-provided-order-id-and-customer-id.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-008-cms-initializes-with-draft-status.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-009-cms-initializes-with-empty-items-array.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-010-cms-initializes-with-zero-total-amount.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-011-cms-initializes-with-version-0.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-012-cms-initializes-with-current-state-version.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-013-cms-sets-created-at-and-updated-at-to-current-timestamp.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-014-cms-already-at-current-version-is-returned-unchanged.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-015-cms-with-missing-state-version-is-upgraded.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-016-cms-with-state-version-0-is-upgraded.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-domain.examples/s-017-all-fields-are-preserved-during-upcast.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-001-check-all-returns-true-for-draft-order-with-items.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-002-check-all-returns-false-for-non-draft-order-with-items.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-003-check-all-returns-false-for-draft-order-without-items.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-004-assert-all-does-not-throw-for-valid-draft-order-with-items.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-005-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-006-assert-all-throws-order-has-no-items-for-draft-order-with-no-items.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-007-validate-all-returns-valid-result-for-draft-order-with-items.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-008-validate-all-returns-both-violations-for-submitted-order-with-no-items.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-009-check-all-returns-true-for-draft-order-under-item-limit.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-010-check-all-returns-false-for-non-draft-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-011-check-all-returns-false-for-draft-order-at-max-capacity.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-012-assert-all-does-not-throw-for-valid-draft-order-under-limit.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-013-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-014-assert-all-throws-max-items-exceeded-for-draft-order-at-capacity.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-015-validate-all-returns-valid-result-for-draft-order-under-limit.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-016-validate-all-returns-both-violations-for-submitted-order-at-capacity.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-017-check-all-returns-expected-for-status-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-018-assert-all-does-not-throw-for-draft-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-019-assert-all-does-not-throw-for-submitted-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-020-assert-all-throws-order-already-confirmed-for-confirmed-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-021-assert-all-throws-order-already-cancelled-for-cancelled-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-022-validate-all-returns-valid-result-for-draft-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-023-validate-all-returns-single-violation-for-confirmed-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariant-sets.examples/s-024-validate-all-returns-single-violation-for-cancelled-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-001-passes-for-a-valid-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-002-throws-order-not-found-for-null-order-reference.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-003-throws-order-not-found-for-undefined-order-reference.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-004-passes-for-null-order-reference.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-005-passes-for-undefined-order-reference.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-006-throws-order-already-exists-for-existing-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-007-check-returns-true-for-draft-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-008-check-returns-false-for-submitted-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-009-assert-passes-for-draft-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-010-assert-throws-order-not-in-draft-for-non-draft-statuses.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-011-check-returns-true-for-submitted-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-012-check-returns-false-for-draft-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-013-assert-passes-for-submitted-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-014-assert-throws-order-not-submitted-for-non-submitted-statuses.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-015-check-returns-true-for-draft-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-016-check-returns-true-for-submitted-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-017-check-returns-false-for-cancelled-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-018-assert-passes-for-draft-order-not-cancelled.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-019-assert-passes-for-confirmed-order-not-cancelled.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-020-assert-throws-order-already-cancelled-for-cancelled-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-021-check-returns-true-for-draft-order-not-confirmed.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-022-check-returns-true-for-submitted-order-not-confirmed.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-023-check-returns-false-for-confirmed-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-024-assert-passes-for-draft-order-not-confirmed.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-025-assert-passes-for-cancelled-order-not-confirmed.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-026-assert-throws-order-already-confirmed-for-confirmed-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-027-check-returns-true-when-order-has-items.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-028-check-returns-false-when-order-has-no-items.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-029-assert-passes-when-order-has-items.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-030-assert-passes-when-order-has-multiple-items.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-031-assert-throws-order-has-no-items-for-empty-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-032-check-returns-true-when-order-has-room-for-items.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-033-check-returns-false-when-order-is-at-max-capacity.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-034-assert-passes-when-order-has-room-for-items.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-035-assert-passes-when-order-is-one-under-max-capacity.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-036-assert-throws-max-items-exceeded-at-max-capacity.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-037-passes-when-item-exists-in-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-038-passes-when-item-is-one-of-many.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-039-throws-item-not-found-when-item-does-not-exist.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-040-throws-item-not-found-when-items-array-is-empty.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-041-passes-for-valid-item.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-042-passes-for-item-with-decimal-price.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-043-passes-for-item-with-zero-price-free-item.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-044-throws-invalid-quantity-for-negative-quantity.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-045-throws-invalid-quantity-for-zero-quantity.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-046-throws-invalid-quantity-for-non-integer-quantity.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-047-throws-invalid-price-for-negative-price.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-048-throws-invalid-item-data-for-empty-product-id.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-049-throws-invalid-item-data-for-empty-product-name.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-050-error-has-correct-name-property.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-051-error-has-correct-code-property.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-052-error-has-correct-message-property.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-053-error-has-correct-context-property.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-054-error-can-have-undefined-context.sdp.md delete mode 100644 specs/behavior/order-management/orders/order-invariants.examples/s-055-error-is-an-instance-of-error.sdp.md delete mode 100644 specs/behavior/order-management/orders/remove-order-item.examples/s-001-remove-item-from-draft-order-with-multiple-items.sdp.md delete mode 100644 specs/behavior/order-management/orders/remove-order-item.examples/s-002-remove-last-item-from-draft-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/remove-order-item.examples/s-003-cannot-remove-item-from-submitted-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/remove-order-item.examples/s-004-cannot-remove-item-from-cancelled-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/remove-order-item.examples/s-005-cannot-remove-item-from-confirmed-order.sdp.md delete mode 100644 specs/behavior/order-management/orders/remove-order-item.examples/s-006-cannot-remove-non-existent-item.sdp.md delete mode 100644 specs/behavior/order-management/orders/remove-order-item.examples/s-007-remove-order-item-is-idempotent-with-same-command-id.sdp.md delete mode 100644 specs/behavior/order-management/roadmap/projection-categories.examples/s-001-define-a-logic-projection-for-command-validation.sdp.md delete mode 100644 specs/behavior/order-management/roadmap/projection-categories.examples/s-002-define-a-view-projection-for-ui-queries.sdp.md delete mode 100644 specs/behavior/order-management/roadmap/projection-categories.examples/s-003-define-a-reporting-projection-for-analytics.sdp.md delete mode 100644 specs/behavior/order-management/roadmap/projection-categories.examples/s-004-define-an-integration-projection-for-cross-context-sync.sdp.md delete mode 100644 specs/behavior/order-management/roadmap/projection-categories.examples/s-005-query-projections-by-category.sdp.md delete mode 100644 specs/behavior/order-management/roadmap/projection-categories.examples/s-006-query-all-reactive-projections.sdp.md delete mode 100644 specs/behavior/order-management/roadmap/projection-categories.examples/s-007-prevent-client-query-on-logic-projection.sdp.md delete mode 100644 specs/behavior/order-management/roadmap/projection-categories.examples/s-008-warn-when-view-projection-is-not-optimized-for-reactivity.sdp.md delete mode 100644 specs/behavior/order-management/roadmap/projection-categories.examples/s-009-migrate-existing-projection-to-categorized-system.sdp.md delete mode 100644 specs/behavior/order-management/sagas/admin.examples/s-001-returns-zero-counts-for-empty-database.sdp.md delete mode 100644 specs/behavior/order-management/sagas/admin.examples/s-002-counts-sagas-by-status-correctly.sdp.md delete mode 100644 specs/behavior/order-management/sagas/admin.examples/s-003-filters-by-saga-type.sdp.md delete mode 100644 specs/behavior/order-management/sagas/admin.examples/s-004-returns-empty-array-when-no-sagas-exist.sdp.md delete mode 100644 specs/behavior/order-management/sagas/admin.examples/s-005-returns-running-sagas-older-than-threshold.sdp.md delete mode 100644 specs/behavior/order-management/sagas/admin.examples/s-006-respects-custom-threshold.sdp.md delete mode 100644 specs/behavior/order-management/sagas/admin.examples/s-007-returns-empty-array-when-no-failed-sagas.sdp.md delete mode 100644 specs/behavior/order-management/sagas/admin.examples/s-008-returns-only-failed-sagas.sdp.md delete mode 100644 specs/behavior/order-management/sagas/admin.examples/s-009-respects-limit-parameter.sdp.md delete mode 100644 specs/behavior/order-management/sagas/admin.examples/s-010-allows-marking-valid-source-status-saga-as-failed.sdp.md delete mode 100644 specs/behavior/order-management/sagas/admin.examples/s-011-rejects-marking-invalid-source-status-saga-as-failed.sdp.md delete mode 100644 specs/behavior/order-management/sagas/admin.examples/s-012-returns-not-found-for-non-existent-saga.sdp.md delete mode 100644 specs/behavior/order-management/sagas/admin.examples/s-013-allows-marking-failed-saga-as-compensated.sdp.md delete mode 100644 specs/behavior/order-management/sagas/admin.examples/s-014-rejects-marking-non-failed-saga-as-compensated.sdp.md delete mode 100644 specs/behavior/order-management/sagas/admin.examples/s-015-allows-retrying-failed-saga.sdp.md delete mode 100644 specs/behavior/order-management/sagas/admin.examples/s-016-rejects-retrying-non-failed-saga.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-001-parse-vertical-data-table-to-object.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-002-parse-data-table-preserves-all-string-values.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-003-parse-integer-value-from-string.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-004-parse-float-value-from-string.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-005-parse-boolean-true-from-string.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-006-parse-boolean-false-from-string.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-007-parse-invalid-integer-throws-error.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-008-get-required-field-succeeds-when-present.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-009-get-required-field-throws-for-missing-field.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-010-get-optional-field-returns-value-when-present.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-011-get-optional-field-returns-undefined-for-missing.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-012-get-optional-field-with-default-value.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-001-assert-decision-success.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-002-assert-decision-success-fails-for-rejected-result.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-003-extract-success-event-from-result.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-004-extract-success-data-from-result.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-005-extract-state-update-from-result.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-006-assert-event-type-matches.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-007-assert-event-type-fails-for-wrong-type.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-008-assert-event-payload-field.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-009-assert-state-update-field.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-010-assert-decision-rejected.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-011-assert-rejection-code-matches.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-012-assert-rejection-code-fails-for-wrong-code.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-013-assert-rejection-message-contains-text.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-014-assert-decision-failed.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-015-assert-failure-reason-matches.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-001-assert-valid-transition.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-002-assert-invalid-transition-fails.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-003-assert-transition-is-not-allowed.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-004-assert-cannot-transition-fails-for-valid-transition.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-005-assert-terminal-state.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-006-assert-terminal-state-fails-for-non-terminal.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-007-assert-non-terminal-state.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-008-assert-initial-state.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-009-assert-valid-state.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-010-assert-invalid-state-fails.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-011-get-all-valid-transitions.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-012-get-all-states.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-013-get-terminal-states.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-014-get-non-terminal-states.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-015-assert-valid-transitions-from-a-state.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-001-generate-unique-test-run-id.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-002-module-level-test-run-id-is-stable-within-a-test-run.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-003-prefix-entity-i-ds-with-test-run-namespace.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-004-custom-prefix-for-specific-isolation.sdp.md delete mode 100644 specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-005-test-isolation-prevents-cross-test-pollution.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-001-successful-command-records-intent-and-completion.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-002-intent-record-captures-command-metadata.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-003-business-rejection-records-failed-intent.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-004-technical-failure-records-failed-intent.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-005-intent-statistics-show-correct-counts.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-001-publishing-creates-records-for-each-target-context.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-002-publication-records-contain-event-metadata.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-003-publish-result-contains-publication-i-ds.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-004-query-publications-by-event-id.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-005-query-returns-empty-for-unknown-event.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-006-query-publications-by-status.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-007-stats-show-counts-by-status.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-008-publications-for-different-events-are-isolated.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-001-create-a-running-checkpoint-for-replay.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-002-update-checkpoint-progress.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-003-cannot-start-replay-for-already-running-projection.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-004-query-checkpoint-by-replay-id.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-005-list-checkpoints-by-status.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-001-append-event-with-unique-idempotency-key-succeeds.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-002-different-idempotency-keys-create-separate-events.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-003-second-append-with-same-idempotency-key-returns-duplicate.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-004-same-key-with-different-payload-is-rejected.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-005-same-idempotency-key-on-different-streams-creates-separate-events.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-001-intent-exceeding-timeout-is-flagged-as-abandoned.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-002-intent-within-timeout-is-not-flagged.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-003-completed-intent-is-not-flagged-even-if-old.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-004-failed-intent-is-not-flagged-even-if-old.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-005-list-abandoned-intents-for-investigation.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-006-timeout-handler-marks-pending-intent-as-abandoned.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-007-timeout-handler-no-ops-for-completed-intent.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-001-first-failure-creates-pending-poison-record.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-002-second-failure-increments-attempt-count.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-003-event-quarantined-after-3-failures.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-004-quarantine-captures-error-details.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-005-quarantined-event-bypasses-handler-completely.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-006-unquarantine-resets-status-for-retry.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-007-unquarantine-of-non-quarantined-event-returns-not-quarantined.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-008-stats-show-quarantined-event-counts-by-projection.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-001-dcb-operation-succeeds-on-first-attempt.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-002-dcb-rejected-result-passes-through-unchanged.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-003-dcb-conflict-returns-retry-metadata-with-updated-version.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-005-final-scope-conflict-rolls-back-state-updates.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-006-backoff-increases-exponentially.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-007-backoff-is-capped-at-maximum.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-008-retries-use-consistent-partition-key.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-001-normal-requests-pass-rate-limiting.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-002-exhausted-rate-limit-rejects-request.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-003-different-users-have-independent-limits.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-005-rate-limited-command-returns-standard-rejection.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-006-health-check-commands-bypass-rate-limiting.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-007-high-volume-rate-limit-uses-sharded-counting.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-002-reject-adding-stock-to-non-existent-product.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-003-add-stock-is-idempotent-with-same-command-id.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-001-successfully-create-a-new-product-and-verify-projection.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-002-reject-duplicate-product-id.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-003-reject-duplicate-sku.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-004-create-product-is-idempotent-with-same-command-id.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-001-list-products-returns-all-products.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-002-get-stock-availability-for-product.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-003-check-availability-for-multiple-items.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-004-get-reservation-by-order-id.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-001-expire-pending-reservations-past-ttl.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-002-skip-confirmed-reservations.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-003-skip-reservations-not-yet-expired.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-004-batch-expiration-of-multiple-reservations.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-001-reserve-stock-successfully.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-002-reserve-stock-for-multiple-items.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-003-reject-when-insufficient-stock.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-004-all-or-nothing-reservation-when-one-item-fails.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-005-reject-for-non-existent-product.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-006-return-failed-status-when-reservation-fails.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-007-idempotent-with-same-command-id.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-001-add-multiple-items-to-order-in-batch.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-002-batch-respects-order-of-execution.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-003-batch-stops-on-first-failure-in-atomic-mode.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-001-cancel-draft-order-and-verify-projection.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-002-cancel-submitted-order-and-verify-projection.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-003-reject-cancelling-already-cancelled-order.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-004-cancel-confirmed-order-and-verify-projection.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-005-reservation-is-released-when-confirmed-order-is-cancelled.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-006-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-007-cancelling-submitted-order-before-saga-completion-releases-pending-reserva.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-008-pm-handles-already-released-reservation-gracefully.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-009-pm-skips-expired-reservation-when-order-is-cancelled.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-001-successfully-create-a-new-order-and-verify-projection.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-002-reject-duplicate-order-id.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-001-query-orders-by-customer-id.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-002-query-orders-by-status.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-003-remove-item-from-draft-order-and-verify-projection.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-006-saga-status-is-completed-after-successful-fulfillment.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-007-saga-status-is-completed-after-compensation.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-001-get-saga-details-returns-workflow-id-for-completed-saga.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-002-get-saga-steps-returns-step-history.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-003-get-saga-steps-returns-null-for-non-existent-saga.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-004-cancel-completed-saga-returns-invalid-state.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-005-cancel-non-existent-saga-returns-not-found.sdp.md delete mode 100644 specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-006-cleanup-completed-saga-workflow.sdp.md delete mode 100644 specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-001-all-feature-files-pass-schema-validation.sdp.md delete mode 100644 specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-002-roadmap-md-reflects-planned-phases.sdp.md delete mode 100644 specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-001-historical-deliverables-are-preserved.sdp.md delete mode 100644 specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-002-incomplete-phases-deferred-appropriately.sdp.md delete mode 100644 specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-001-ad-rs-are-accessible-through-generated-docs.sdp.md delete mode 100644 specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-002-adr-validity-is-assessed-against-new-roadmap.sdp.md delete mode 100644 specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-001-planning-sessions-have-defined-outputs.sdp.md delete mode 100644 specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-002-non-code-sessions-are-supported.sdp.md delete mode 100644 specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-003-configuration-inheritance-works.sdp.md delete mode 100644 specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-001-core-patterns-are-documented-for-roadmap-planning.sdp.md delete mode 100644 specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-002-progressive-annotation-policy-is-sustainable.sdp.md delete mode 100644 specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-001-claude-md-is-generated-from-modules.sdp.md delete mode 100644 specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-002-variations-produce-different-outputs.sdp.md delete mode 100644 specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-003-pattern-content-is-auto-generated.sdp.md delete mode 100644 specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-004-session-templates-are-includable.sdp.md delete mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-001-define-command-preserves-literal-command-type.sdp.md delete mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-002-define-command-includes-all-metadata-fields.sdp.md delete mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-003-define-event-preserves-literal-event-type.sdp.md delete mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-004-define-event-supports-all-event-categories.sdp.md delete mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-005-define-projection-preserves-literal-projection-name.sdp.md delete mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-006-define-projection-preserves-event-subscriptions-tuple.sdp.md delete mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-007-is-projection-category-validates-category-strings.sdp.md delete mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-008-is-logic-projection-returns-true-only-for-logic-category.sdp.md delete mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-009-is-view-projection-returns-true-only-for-view-category.sdp.md delete mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-010-is-client-exposed-returns-true-only-for-view-category.sdp.md delete mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-011-is-client-exposed-returns-false-for-non-view-categories.sdp.md delete mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-012-define-process-manager-validates-time-triggered-requires-cron-config.sdp.md delete mode 100644 specs/behavior/platform-bc/bc-contracts.examples/s-013-define-process-manager-validates-event-triggered-requires-subscriptions.sdp.md delete mode 100644 specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-001-direct-table-query-fails-across-component-boundary.sdp.md delete mode 100644 specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-002-component-api-access-succeeds.sdp.md delete mode 100644 specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-003-component-handler-writes-commit-atomically-on-success.sdp.md delete mode 100644 specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-004-caught-component-failure-rolls-back-only-the-component-writes.sdp.md delete mode 100644 specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-005-user-id-passed-explicitly-to-component.sdp.md delete mode 100644 specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-006-id-conversion-at-boundary.sdp.md delete mode 100644 specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-007-contract-provides-type-safety-for-commands.sdp.md delete mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-001-first-command-execution-is-recorded.sdp.md delete mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-002-duplicate-command-returns-cached-result.sdp.md delete mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-003-successful-command-transitions-to-executed.sdp.md delete mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-004-business-rejection-transitions-to-rejected.sdp.md delete mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-005-unexpected-error-transitions-to-failed.sdp.md delete mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-006-successful-command-runs-all-7-orchestrator-steps.sdp.md delete mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-007-rejected-command-short-circuits-before-event-append.sdp.md delete mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-008-correlation-id-is-propagated-to-emitted-event-metadata.sdp.md delete mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-009-get-by-correlation-returns-the-events-for-a-command.sdp.md delete mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-010-registered-middleware-run-in-order.sdp.md delete mode 100644 specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-011-middleware-failure-halts-the-pipeline.sdp.md delete mode 100644 specs/behavior/platform-bus/idempotency.examples/s-001-first-command-submission-is-recorded.sdp.md delete mode 100644 specs/behavior/platform-bus/idempotency.examples/s-002-duplicate-command-returns-existing-status-when-completed.sdp.md delete mode 100644 specs/behavior/platform-bus/idempotency.examples/s-003-duplicate-command-during-processing-returns-pending-status.sdp.md delete mode 100644 specs/behavior/platform-bus/idempotency.examples/s-004-concurrent-duplicate-detection-via-post-insert-verification.sdp.md delete mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-001-returns-null-when-checkpoint-position-equals-event-position.sdp.md delete mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-002-returns-null-when-checkpoint-position-exceeds-event-position.sdp.md delete mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-003-returns-null-when-agent-status-is-paused.sdp.md delete mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-004-returns-null-when-agent-status-is-stopped.sdp.md delete mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-005-returns-null-when-agent-status-is-error-recovery.sdp.md delete mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-006-processes-normally-when-checkpoint-is-null-first-event.sdp.md delete mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-007-returns-rule-based-analysis-when-pattern-has-no-analyze-function.sdp.md delete mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-008-re-throws-when-pattern-trigger-throws.sdp.md delete mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-009-propagates-load-state-errors-for-workpool-retry.sdp.md delete mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-010-generates-deterministic-decision-id-from-agent-id-and-global-position.sdp.md delete mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-011-generates-same-decision-id-for-same-inputs-deterministic.sdp.md delete mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-012-returns-pattern-id-and-rule-based-decision-when-pattern-triggers.sdp.md delete mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-013-returns-llm-analysis-method-when-pattern-has-analyze-function.sdp.md delete mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-014-returns-no-pattern-id-when-no-pattern-matches.sdp.md delete mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-015-does-not-invoke-llm-enrichment-via-runtime.sdp.md delete mode 100644 specs/behavior/platform-core/agent/action-handler.examples/s-016-re-throws-when-pattern-executor-fails.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-001-operation-executes-and-result-is-returned-when-allowed.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-002-operation-is-not-executed-when-denied.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-003-check-rate-limit-receives-agent-scoped-key.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-004-operation-errors-propagate-to-caller.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-005-check-rate-limit-callback-errors-propagate-without-calling-operation.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-006-warning-is-logged-when-rate-limited.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-007-debug-is-logged-when-rate-limit-check-passes.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-001-action-subscription-has-correct-type-and-references.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-002-object-retry-config-is-passed-through.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-003-boolean-retry-config-is-passed-through.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-004-retry-field-is-absent-when-not-specified.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-005-to-workpool-context-returns-all-required-fields.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-006-causation-id-equals-the-event-event-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-007-subscription-uses-default-priority-of-250.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-008-subscription-uses-custom-priority.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-009-name-includes-context-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-010-name-omits-context-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-011-filter-contains-all-configured-event-types.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-012-to-handler-args-produces-correct-agent-event-handler-args.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription-action.examples/s-013-get-partition-key-returns-stream-id-based-partition.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-001-subscription-with-context-has-correct-name.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-002-subscription-without-context-has-correct-name.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-003-subscription-uses-default-priority-of-250.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-004-subscription-uses-custom-priority.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-005-subscription-filter-contains-correct-event-types.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-006-subscription-attaches-the-handler-reference.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-007-to-handler-args-produces-correct-agent-event-handler-args.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-008-to-handler-args-includes-payload-in-handler-args.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-009-default-agent-transform-wraps-non-object-payload-in-raw.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-010-custom-to-handler-args-transformer-is-used.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-011-partitions-by-stream-id-by-default.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-012-custom-partition-key-extractor-is-used.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-013-creates-subscriptions-for-multiple-agents.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-014-throws-if-handler-is-missing-for-an-agent.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-015-applies-common-options-to-all-subscriptions.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-016-same-agent-id-for-multiple-to-handler-args-calls.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-017-same-agent-id-for-to-handler-args-and-get-partition-key.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-018-filter-matches-subscribed-types-and-rejects-unsubscribed-types.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-019-event-types-array-starts-with-correct-length.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-020-transforms-all-published-event-fields-correctly.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-021-handles-null-payload.sdp.md delete mode 100644 specs/behavior/platform-core/agent/agent-subscription.examples/s-022-handles-array-payload.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-001-all-six-error-codes-are-present.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-002-approval-statuses-contains-all-four-statuses-in-order.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-003-approval-statuses-is-a-4-element-array.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-004-returns-true-for-valid-status-strings.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-005-returns-false-for-invalid-strings.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-006-returns-false-for-non-string-types.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-007-accepts-all-four-valid-statuses.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-008-rejects-invalid-status-values.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-009-accepts-a-valid-approval-object.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-010-rejects-approval-with-missing-required-fields.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-011-rejects-approval-with-confidence-above-1.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-012-rejects-approval-with-negative-confidence.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-013-accepts-valid-auth-context-with-user-id-only.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-014-accepts-auth-context-with-roles.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-015-accepts-auth-context-with-agent-ids.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-016-rejects-auth-context-with-empty-user-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-017-parses-valid-duration-strings.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-018-returns-null-for-invalid-formats.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-019-returns-null-for-zero-values.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-020-returns-true-for-valid-timeout-formats.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-021-returns-false-for-invalid-timeout-formats.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-022-uses-explicit-timeout-from-config.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-023-uses-default-timeout-when-not-specified.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-024-uses-default-timeout-for-invalid-format.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-025-returns-true-when-confidence-is-below-threshold.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-026-returns-true-when-confidence-equals-threshold-inclusive.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-027-returns-false-when-confidence-is-above-threshold.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-028-uses-default-threshold-of-0-9-when-not-specified.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-029-returns-true-for-listed-action-even-with-high-confidence.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-030-returns-false-for-unlisted-action-with-high-confidence.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-031-returns-false-for-auto-approved-action-with-low-confidence.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-032-auto-approve-takes-precedence-over-low-confidence.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-033-requires-approval-wins-when-action-is-in-both-lists.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-034-falls-through-to-confidence-check-with-empty-lists.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-035-falls-through-to-confidence-check-with-undefined-lists.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-036-handles-confidence-of-0.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-037-handles-confidence-of-1.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-038-returns-true-when-agent-id-is-in-auth-context-agent-ids.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-039-returns-false-when-agent-id-is-not-in-auth-context-agent-ids.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-040-returns-false-when-agent-ids-is-undefined.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-041-returns-false-when-agent-ids-is-empty.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-042-returns-true-when-user-has-at-least-one-role.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-043-returns-false-when-roles-is-undefined.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-044-returns-false-when-roles-is-empty.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-045-agent-ids-check-fails-even-with-admin-role.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-046-both-agent-ids-and-roles-pass.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-047-generates-id-with-apr-prefix-and-correct-format.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-048-generates-unique-i-ds-over-multiple-calls.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-049-sets-correct-initial-field-values.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-050-generates-unique-approval-ids-over-multiple-calls.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-051-sets-requested-at-to-current-time.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-052-calculates-expires-at-based-on-config-timeout.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-053-does-not-include-optional-fields-initially.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-054-transitions-pending-approval-to-approved.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-055-includes-review-note-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-056-does-not-include-review-note-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-057-throws-error-for-non-pending-statuses.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-058-throws-error-for-expired-pending-approvals.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-059-preserves-other-fields-after-approval.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-060-transitions-pending-approval-to-rejected-with-reason.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-061-sets-reviewed-at-to-current-time-on-rejection.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-062-throws-error-when-rejecting-non-pending-approval.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-063-throws-error-when-rejecting-expired-pending-approval.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-064-transitions-pending-approval-to-expired.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-065-throws-error-when-expiring-non-pending-approval.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-066-preserves-original-fields-after-expiration.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-067-returns-success-for-valid-pending-approval.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-068-returns-unauthorized-reviewer-when-not-authorized.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-069-returns-invalid-status-transition-when-already-processed.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-070-returns-approval-expired-when-past-expiration.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-071-returns-success-for-valid-rejection.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-072-returns-unauthorized-reviewer-on-safe-reject.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-073-returns-approval-expired-on-safe-reject.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-074-is-approval-pending-returns-true-only-for-pending.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-075-is-approval-approved-returns-true-only-for-approved.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-076-is-approval-rejected-returns-true-only-for-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-077-is-approval-expired-detects-expired-status-and-time-based-expiration.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-078-is-approval-actionable-checks-pending-and-not-expired.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-079-returns-remaining-time-for-pending-approval.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-080-returns-0-for-expired-approval.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-081-returns-0-for-non-pending-status.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-082-formats-hours-and-minutes.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-083-formats-minutes-only.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-084-returns-expired-for-past-expiration.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-085-returns-true-for-valid-approval.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-086-returns-false-for-invalid-inputs.sdp.md delete mode 100644 specs/behavior/platform-core/agent/approval.examples/s-087-returns-false-for-invalid-confidence.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-001-record-pattern-detected-event.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-002-audit-includes-triggering-events.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-003-audit-includes-execution-mode.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-004-audit-includes-llm-metadata.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-005-audit-llm-failures.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-006-record-auto-executed-action.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-007-record-approved-action.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-008-record-rejected-action.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-009-record-expired-action.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-010-query-all-decisions-for-an-agent.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-011-query-decisions-by-pattern-type.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-012-query-decisions-by-time-range.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit-trail.examples/s-013-query-decision-with-full-trace.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-001-contains-all-ds-1-base-event-types.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-002-contains-all-ds-4-command-routing-event-types.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-003-contains-all-ds-5-lifecycle-event-types.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-004-contains-ds-6-failure-tracking-event-type.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-005-has-exactly-17-event-types.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-006-returns-true-for-all-valid-event-type-strings.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-007-returns-false-for-invalid-values.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-008-returns-false-for-non-string-values.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-009-accepts-all-valid-event-types.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-010-rejects-invalid-event-types.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-011-rejects-non-string-values-via-zod.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-012-accepts-valid-llm-context.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-013-rejects-negative-tokens.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-014-rejects-negative-duration.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-015-rejects-non-integer-tokens.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-016-accepts-zero-values.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-017-accepts-valid-action-with-flag-for-review.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-018-accepts-valid-action-with-auto-execute.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-019-rejects-action-with-empty-type.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-020-rejects-action-with-invalid-execution-mode.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-021-rejects-action-with-extra-fields-in-strict-mode.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-022-accepts-valid-payload-with-action.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-023-accepts-payload-with-null-pattern-detected.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-024-accepts-payload-with-null-action.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-025-accepts-payload-with-llm-context.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-026-rejects-payload-with-confidence-below-0.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-027-rejects-payload-with-confidence-above-1.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-028-accepts-valid-approval-granted-payload.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-029-accepts-payload-with-review-note.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-030-rejects-payload-with-empty-action-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-031-accepts-valid-approval-rejected-payload.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-032-allows-empty-rejection-reason-string.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-033-accepts-valid-approval-expired-payload.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-034-rejects-payload-with-empty-action-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-035-accepts-valid-audit-event.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-036-rejects-event-with-empty-agent-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-037-rejects-event-with-empty-decision-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-038-generates-i-ds-with-dec-prefix.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-039-generates-i-ds-with-expected-format.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-040-generates-unique-i-ds-over-multiple-calls.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-041-uses-a-uui-dv7-payload-in-the-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-042-creates-event-with-pattern-detected-type.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-043-includes-all-required-fields.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-044-includes-llm-context-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-045-does-not-include-llm-context-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-046-handles-null-pattern-detected.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-047-handles-null-action.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-048-creates-event-with-approval-granted-type.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-049-includes-all-required-fields-for-approval-granted.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-050-includes-review-note-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-051-does-not-include-review-note-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-052-creates-event-with-approval-rejected-type.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-053-includes-all-required-fields-for-approval-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-054-creates-event-with-approval-expired-type.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-055-includes-all-required-fields-for-approval-expired.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-056-creates-event-with-specified-type.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-057-includes-all-required-fields-for-generic-event.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-058-defaults-payload-to-empty-object-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-059-works-with-ds-4-command-routing-types.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-060-works-with-ds-5-lifecycle-types.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-061-returns-true-for-pattern-detected-event.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-062-returns-false-for-approval-granted-event-via-is-pattern-detected.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-063-returns-false-for-approval-rejected-event-via-is-pattern-detected.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-064-returns-true-for-approval-granted-event.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-065-returns-false-for-pattern-detected-event-via-is-approval-granted.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-066-returns-false-for-approval-rejected-event-via-is-approval-granted.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-067-returns-true-for-approval-rejected-event.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-068-returns-false-for-approval-granted-event-via-is-approval-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-069-returns-false-for-pattern-detected-event-via-is-approval-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-070-returns-true-for-valid-pattern-detected-audit-event.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-071-returns-true-for-valid-approval-granted-audit-event.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-072-returns-true-for-valid-approval-rejected-audit-event.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-073-returns-true-for-valid-approval-expired-audit-event.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-074-returns-false-for-null.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-075-returns-false-for-undefined.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-076-returns-false-for-empty-object.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-077-returns-false-for-invalid-event-type.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-078-returns-false-for-missing-required-fields.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-079-creates-complete-audit-trail-for-approved-action.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-080-creates-complete-audit-trail-for-rejected-action.sdp.md delete mode 100644 specs/behavior/platform-core/agent/audit.examples/s-081-creates-audit-trail-for-expired-action.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-001-returns-true-for-error-recovery-status.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-002-returns-false-for-active-status.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-003-returns-false-for-paused-status.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-004-returns-false-for-stopped-status.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-005-returns-base-config-values-when-overrides-are-undefined.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-006-passes-through-base-rate-limits-when-no-overrides.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-007-omits-rate-limits-when-base-has-none-and-no-overrides.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-008-overrides-confidence-threshold-while-preserving-pattern-window-duration.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-009-overrides-pattern-window-duration-while-preserving-confidence-threshold.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-010-overrides-rate-limits-max-requests-per-minute-while-preserving-base-cost-b.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-011-deep-merges-cost-budget-daily-while-preserving-cost-budget-alert-threshold.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-012-deep-merges-cost-budget-alert-threshold-while-preserving-cost-budget-daily.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-013-fully-overrides-all-config-values.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-014-adds-rate-limits-via-overrides-when-base-has-none.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-015-empty-overrides-object-returns-base-config-values.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-016-applies-config-overrides-to-a-checkpoint-without-existing-overrides.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-017-merges-new-config-overrides-with-existing-overrides.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-018-update-overrides-take-precedence-over-existing.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-019-preserves-existing-config-overrides-when-update-has-no-overrides.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-020-deep-merges-rate-limits-cost-budget-in-checkpoint-overrides.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-021-updates-updated-at-timestamp.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-022-increments-events-processed-count.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-023-preserves-events-processed-when-no-increment-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-024-does-not-add-config-overrides-key-when-neither-existing-nor-update-have-th.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-025-creates-checkpoint-with-sentinel-last-processed-position-of-1.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-026-creates-checkpoint-with-active-status.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-027-creates-checkpoint-with-zero-events-processed.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-028-creates-checkpoint-with-empty-last-event-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-029-sets-updated-at-to-current-time.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-030-preserves-agent-id-and-subscription-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint-extension.examples/s-031-does-not-include-config-overrides.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-001-contains-all-four-statuses.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-002-is-a-readonly-tuple-with-4-elements.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-003-accepts-all-valid-statuses.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-004-rejects-invalid-statuses.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-005-accepts-a-valid-checkpoint-object.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-006-accepts-checkpoint-with-sentinel-position-1.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-007-rejects-checkpoint-with-position-below-1.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-008-rejects-checkpoint-with-negative-events-processed.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-009-rejects-checkpoint-with-empty-agent-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-010-rejects-checkpoint-with-empty-subscription-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-011-rejects-checkpoint-with-missing-required-fields.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-012-creates-checkpoint-with-correct-agent-id-and-subscription-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-013-initializes-position-and-event-tracking-defaults.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-014-initializes-status-to-active.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-015-sets-updated-at-to-current-time.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-016-creates-a-checkpoint-that-passes-schema-validation.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-017-updates-last-processed-position.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-018-updates-last-event-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-019-updates-status.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-020-increments-events-processed-by-specified-amount.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-021-increments-events-processed-by-1-for-single-event.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-022-does-not-increment-events-processed-when-not-specified.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-023-preserves-unchanged-fields.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-024-updates-updated-at-to-current-time.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-025-applies-multiple-updates-at-once.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-026-handles-empty-update-by-only-updating-timestamp.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-027-returns-true-when-event-position-is-greater-than-checkpoint.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-028-returns-false-for-duplicate-event-at-same-position.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-029-returns-false-for-already-processed-event.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-030-returns-true-for-position-0-against-sentinel-1-for-a-new-agent.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-031-returns-true-for-position-1-against-sentinel-1.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-032-returns-true-for-any-positive-position-against-sentinel-1.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-033-returns-true-for-position-1-against-checkpoint-0.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-034-returns-false-for-position-0-against-checkpoint-0.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-035-handles-large-position-values.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-036-processes-sequential-events-correctly.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-037-handles-gaps-in-event-positions.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-038-is-agent-active-returns-true-only-for-active-status.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-039-is-agent-paused-returns-true-only-for-paused-status.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-040-is-agent-stopped-returns-true-only-for-stopped-status.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-041-returns-true-for-a-valid-checkpoint.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-042-returns-true-for-checkpoint-with-sentinel-position.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-043-returns-false-for-null-undefined-and-empty-object.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-044-returns-false-for-non-object-values.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-045-returns-false-for-checkpoint-with-invalid-status.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-046-returns-false-for-checkpoint-with-position-below-1.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-047-returns-false-for-checkpoint-with-negative-events-processed.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-048-new-agent-processes-first-events.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-049-agent-pause-and-resume-preserves-position.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-050-agent-restart-recovery-skips-already-processed-events.sdp.md delete mode 100644 specs/behavior/platform-core/agent/checkpoint.examples/s-051-duplicate-event-delivery-is-idempotent.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-001-routes-command-through-registry-orchestrator-records-audit-and-updates-sta.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-002-records-agent-command-routing-failed-audit-and-sets-status-to-failed-for-u.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-003-records-command-not-registered-error-when-registry-does-not-contain-the-co.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-004-records-invalid-transform-error-when-to-orchestrator-args-throws.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-005-records-agent-command-routing-failed-audit-and-sets-status-to-failed-on-or.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-006-does-not-throw-when-audit-recording-fails-on-success-path.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-007-does-not-throw-when-update-status-mutation-fails-on-success-path.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-008-skips-status-update-without-error-when-update-status-is-undefined-on-succe.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-009-skips-status-update-on-routing-failure-when-update-status-is-undefined.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-010-includes-pattern-id-in-audit-event-payload-when-present-in-args.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-bridge.examples/s-011-does-not-include-pattern-id-in-audit-payload-when-absent-from-args.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-001-emit-recommendation-command.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-002-command-includes-correlation-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-003-command-includes-agent-bc-identifier.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-004-command-includes-reason.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-005-command-includes-confidence.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-006-command-includes-triggering-events.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-007-command-includes-llm-context.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-008-reject-command-without-reason.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-009-reject-command-without-confidence.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-010-reject-confidence-outside-valid-range.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-011-llm-rate-limit-is-handled-with-exponential-backoff.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-012-llm-timeout-falls-back-to-rule-based-emission.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-013-emit-notification-command.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-014-emit-action-command.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-emission.examples/s-015-emit-escalation-command.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-001-returns-the-route-when-command-type-exists-in-the-map.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-002-returns-undefined-when-command-type-does-not-exist-in-the-map.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-003-returns-undefined-for-empty-route-map.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-004-produces-success-results-for-valid-routes.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-005-returns-command-not-registered-error-for-missing-command-type.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-006-returns-unknown-route-error-for-missing-bounded-context.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-007-returns-invalid-transform-error-for-missing-to-orchestrator-args.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-008-returns-empty-array-for-empty-route-map.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-009-validates-mixed-valid-and-invalid-routes-independently.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-010-contains-all-expected-error-codes.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-011-has-exactly-4-error-codes.sdp.md delete mode 100644 specs/behavior/platform-core/agent/command-router.examples/s-012-values-are-string-constants-matching-their-keys.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-001-contains-all-expected-error-codes.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-002-has-exactly-5-error-codes.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-003-accepts-valid-metadata.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-004-accepts-metadata-with-optional-pattern-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-005-accepts-metadata-with-optional-analysis.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-006-rejects-metadata-with-empty-agent-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-007-rejects-metadata-with-empty-decision-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-008-rejects-metadata-with-confidence-below-0.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-009-rejects-metadata-with-confidence-above-1.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-010-rejects-metadata-with-empty-reason.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-011-rejects-metadata-with-empty-event-ids-array.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-012-accepts-confidence-at-boundaries-0-and-1.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-013-accepts-valid-command.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-014-rejects-command-with-empty-type.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-015-accepts-command-with-any-payload-type.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-016-rejects-command-with-invalid-metadata.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-017-returns-invalid-when-type-is-undefined.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-018-returns-invalid-when-type-is-empty-string.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-019-returns-invalid-when-type-is-whitespace-only.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-020-returns-invalid-when-confidence-is-undefined.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-021-returns-invalid-when-confidence-is-below-0.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-022-returns-invalid-when-confidence-is-above-1.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-023-accepts-confidence-at-boundary-values.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-024-returns-invalid-when-reason-is-undefined.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-025-returns-invalid-when-reason-is-empty-string.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-026-returns-invalid-when-reason-is-whitespace-only.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-027-returns-invalid-when-event-ids-is-undefined.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-028-returns-invalid-when-event-ids-is-empty-array.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-029-accepts-single-event-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-030-accepts-multiple-event-i-ds.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-031-returns-valid-for-complete-command-args.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-032-creates-command-with-all-required-fields.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-033-generates-unique-decision-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-034-includes-pattern-id-when-provided-in-options.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-035-does-not-include-pattern-id-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-036-includes-analysis-when-provided-in-options.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-037-does-not-include-analysis-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-038-includes-both-pattern-id-and-analysis-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-039-copies-event-ids-array-without-reference-sharing.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-040-throws-error-for-empty-type.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-041-throws-error-for-invalid-confidence.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-042-throws-error-for-empty-reason.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-043-throws-error-for-empty-event-ids.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-044-includes-error-code-in-thrown-message.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-045-creates-command-from-decision-with-command.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-046-returns-null-when-decision-has-no-command.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-047-includes-pattern-id-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-048-includes-analysis-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-049-maps-all-decision-fields-correctly.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-050-returns-true-for-valid-command.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-051-returns-true-for-command-with-optional-fields.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-052-returns-false-for-non-command-values.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-053-returns-true-when-command-has-pattern-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-054-returns-false-when-command-has-no-pattern-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-055-returns-false-when-pattern-id-is-undefined-explicitly.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-056-returns-true-when-command-has-analysis.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-057-returns-false-when-command-has-no-analysis.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-058-returns-false-when-analysis-is-undefined-explicitly.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-059-returns-true-for-null-analysis.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-060-validates-creates-and-verifies-command.sdp.md delete mode 100644 specs/behavior/platform-core/agent/commands.examples/s-061-creates-command-from-decision-and-verifies.sdp.md delete mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-001-allowed-when-current-spend-plus-estimated-cost-is-under-budget.sdp.md delete mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-002-denied-when-estimated-cost-would-exceed-budget.sdp.md delete mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-003-denied-when-current-spend-already-equals-budget.sdp.md delete mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-004-allowed-when-estimated-cost-exactly-reaches-budget.sdp.md delete mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-005-sets-at-alert-threshold-when-spend-exceeds-alert-threshold.sdp.md delete mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-006-does-not-set-at-alert-threshold-when-below-threshold.sdp.md delete mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-007-sets-at-alert-threshold-at-exact-threshold-boundary.sdp.md delete mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-008-simple-multiplication-of-tokens-and-cost-per-token.sdp.md delete mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-009-returns-0-for-0-tokens.sdp.md delete mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-010-handles-large-token-counts.sdp.md delete mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-011-handles-very-small-cost-per-token.sdp.md delete mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-012-claude-model-entry-has-positive-input-and-output-costs-with-output-greater.sdp.md delete mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-013-gpt-4o-model-entry-has-positive-input-and-output-costs.sdp.md delete mode 100644 specs/behavior/platform-core/agent/cost-budget.examples/s-014-gpt-4o-mini-model-entry-is-cheaper-than-gpt-4o.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-001-contains-all-expected-error-codes.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-002-has-exactly-3-error-codes.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-003-contains-all-three-statuses-in-order.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-004-is-a-readonly-tuple-with-3-elements.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-005-type-guard-accepts-valid-statuses.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-006-type-guard-rejects-invalid-values.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-007-type-guard-rejects-non-string-types.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-008-accepts-all-valid-statuses.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-009-rejects-invalid-status-values.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-010-accepts-valid-context-with-all-fields.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-011-accepts-context-with-only-correlation-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-012-accepts-context-with-only-error-code.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-013-accepts-empty-context-object.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-014-rejects-context-with-unknown-fields-in-strict-mode.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-015-accepts-valid-dead-letter.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-016-accepts-dead-letter-with-context.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-017-rejects-dead-letter-with-empty-agent-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-018-rejects-dead-letter-with-empty-subscription-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-019-rejects-dead-letter-with-empty-event-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-020-rejects-dead-letter-with-negative-global-position.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-021-accepts-dead-letter-with-global-position-of-0.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-022-rejects-dead-letter-with-non-positive-attempt-count.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-023-rejects-dead-letter-with-missing-required-fields.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-024-removes-content-after-at-when-followed-by-path-like-content.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-025-removes-multi-line-stack-traces.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-026-preserves-the-error-message-itself.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-027-removes-type-script-file-paths-with-at-prefix.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-028-replaces-file-paths-without-at-prefix-with-path-marker.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-029-removes-esm-file-paths-when-preceded-by-at.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-030-replaces-cjs-file-paths-with-path-marker-when-not-preceded-by-at.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-031-removes-paths-with-line-and-column-numbers.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-032-truncates-long-messages-to-500-characters-ending-with-ellipsis.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-033-does-not-truncate-messages-under-500-characters.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-034-does-not-truncate-messages-of-exactly-500-characters.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-035-handles-error-objects.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-036-handles-string-errors.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-037-handles-objects-with-message-property.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-038-handles-unknown-error-types.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-039-handles-null.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-040-handles-undefined.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-041-handles-empty-string.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-042-collapses-multiple-spaces.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-043-trims-leading-and-trailing-whitespace.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-044-handles-newlines.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-045-creates-dead-letter-with-required-fields.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-046-creates-dead-letter-with-pending-status.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-047-sets-attempt-count-to-1.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-048-sets-failed-at-to-current-time.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-049-includes-context-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-050-does-not-include-context-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-051-sanitizes-error-objects-removing-stack-like-patterns.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-052-sanitizes-string-errors.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-053-replaces-paths-in-errors-without-at-prefix.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-054-replaces-paths-with-line-column-suffix.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-055-sanitizes-unknown-error-types.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-056-increments-attempt-count.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-057-updates-error-message.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-058-sanitizes-new-error-message-with-at-pattern.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-059-sanitizes-new-error-message-with-path-replacement.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-060-updates-failed-at-to-current-time.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-061-preserves-other-fields-during-increment.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-062-handles-multiple-increments.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-063-transitions-pending-to-replayed.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-064-preserves-all-other-fields-when-transitioning-to-replayed.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-065-throws-when-marking-replayed-dead-letter-as-replayed.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-066-throws-when-marking-ignored-dead-letter-as-replayed.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-067-transitions-pending-to-ignored.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-068-preserves-all-other-fields-when-transitioning-to-ignored.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-069-throws-when-marking-replayed-dead-letter-as-ignored.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-070-throws-when-marking-already-ignored-dead-letter-as-ignored.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-071-is-dead-letter-pending-returns-true-only-for-pending.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-072-is-dead-letter-replayed-returns-true-only-for-replayed.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-073-is-dead-letter-ignored-returns-true-only-for-ignored.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-074-returns-true-for-valid-dead-letter.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-075-returns-true-for-dead-letter-with-context.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-076-returns-false-for-null.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-077-returns-false-for-undefined.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-078-returns-false-for-empty-object.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-079-returns-false-for-non-object-types.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-080-returns-false-for-dead-letter-with-invalid-status.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-081-returns-false-for-dead-letter-with-missing-fields.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-082-failed-event-processing-and-replay-lifecycle.sdp.md delete mode 100644 specs/behavior/platform-core/agent/dead-letter.examples/s-083-obsolete-event-being-ignored-lifecycle.sdp.md delete mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-001-subscribe-to-single-event-type.sdp.md delete mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-002-subscribe-to-multiple-event-types.sdp.md delete mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-003-agent-does-not-receive-unsubscribed-events.sdp.md delete mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-004-filter-by-payload-field.sdp.md delete mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-005-filter-by-customer-segment.sdp.md delete mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-006-events-delivered-in-publication-order.sdp.md delete mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-007-events-from-same-stream-maintain-order.sdp.md delete mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-008-agent-resumes-from-last-processed-position-after-restart.sdp.md delete mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-009-checkpoint-updated-after-successful-analysis.sdp.md delete mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-010-failed-analysis-records-to-dead-letter-without-advancing-checkpoint.sdp.md delete mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-011-checkpoint-persists-agent-subscription-state.sdp.md delete mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-012-pause-subscription.sdp.md delete mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-013-resume-subscription.sdp.md delete mode 100644 specs/behavior/platform-core/agent/event-subscription.examples/s-014-unsubscribe-stops-all-event-delivery.sdp.md delete mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-001-execution-mode-based-on-confidence.sdp.md delete mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-002-custom-threshold-per-agent.sdp.md delete mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-003-requires-approval-action-with-high-confidence.sdp.md delete mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-004-auto-approve-action-with-low-confidence.sdp.md delete mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-005-configure-multiple-approval-requirements.sdp.md delete mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-006-create-review-task.sdp.md delete mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-007-approve-pending-action.sdp.md delete mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-008-reject-pending-action.sdp.md delete mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-009-action-expires-after-timeout.sdp.md delete mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-010-custom-timeout-per-action-type.sdp.md delete mode 100644 specs/behavior/platform-core/agent/human-in-loop.examples/s-011-approve-action-near-timeout.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-001-rejects-empty-string-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-002-rejects-undefined-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-003-rejects-whitespace-only-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-004-rejects-empty-subscriptions-array.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-005-rejects-undefined-subscriptions.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-006-rejects-negative-threshold.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-007-rejects-threshold-greater-than-1.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-008-rejects-empty-pattern-window-duration.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-009-rejects-whitespace-only-pattern-window-duration.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-010-rejects-action-in-both-requires-approval-and-auto-approve.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-011-rejects-config-with-no-patterns-array.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-012-rejects-config-with-empty-patterns-array.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-013-accepts-valid-config-with-patterns.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-014-accepts-config-without-confidence-threshold.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-015-transforms-a-standard-event-correctly.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-016-wraps-array-payload-in-raw-wrapper.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-017-wraps-null-payload-in-raw-wrapper.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-018-passes-through-object-payloads-without-wrapping.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-019-uses-correlation-id-from-the-chain-not-from-the-event.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-020-subscription-id-starts-with-sub-prefix.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-021-subscription-id-contains-the-agent-id.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-022-subscription-id-contains-a-uuid-segment.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-023-produces-different-i-ds-when-timestamp-differs.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-024-returns-success-with-handle-for-a-valid-config.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-025-returns-error-with-invalid-config-code-for-invalid-config.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-026-uses-existing-checkpoint-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/init.examples/s-027-creates-a-new-checkpoint-when-no-existing-checkpoint-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-001-start-agent-command-carries-type-and-required-fields.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-002-pause-agent-command-carries-optional-reason-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-003-pause-agent-command-has-undefined-reason-when-omitted.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-004-resume-agent-command-carries-correct-type.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-005-stop-agent-command-carries-optional-reason-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-006-reconfigure-agent-command-carries-config-overrides-with-nested-fields.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-007-discriminated-union-narrows-by-type-field-at-runtime.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-008-all-fields-are-optional-in-agent-config-overrides.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-009-partial-rate-limits-with-only-max-requests-per-minute.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-010-nested-cost-budget-overrides-with-only-daily.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-011-error-codes-contain-expected-values-and-count.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-012-success-result-carries-state-transition-fields.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-013-failure-result-with-error-code-carries-message-and-state.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-014-failure-result-without-current-state-for-agent-not-found.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-015-discriminated-union-narrows-to-success-branch.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-016-discriminated-union-narrows-to-failure-branch.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-commands.examples/s-017-all-lifecycle-validators-are-exported.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-001-agent-lifecycle-states-contains-all-four-states.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-002-agent-lifecycle-events-contains-all-seven-events.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-003-transition-agent-state-returns-correct-target-for-every-valid-transition.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-004-is-valid-agent-transition-returns-true-for-every-valid-pair.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-005-transition-agent-state-returns-null-for-representative-invalid-pairs.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-006-exactly-18-invalid-pairs-exist-and-all-return-false.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-007-exactly-18-invalid-pairs-return-null-from-transition-agent-state.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-008-assert-valid-agent-transition-returns-next-state-for-valid-transitions.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-009-assert-valid-agent-transition-throws-for-invalid-transition.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-010-assert-valid-agent-transition-error-message-includes-details.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-011-get-valid-agent-events-from-returns-correct-events-for-stopped.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-012-get-valid-agent-events-from-returns-correct-events-for-active.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-013-get-valid-agent-events-from-returns-correct-events-for-paused.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-014-get-valid-agent-events-from-returns-correct-events-for-error-recovery.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-015-get-all-agent-transitions-returns-exactly-10-transitions.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-016-each-transition-has-from-event-and-to-fields.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-017-get-all-agent-transitions-contains-specific-transitions.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-018-get-all-agent-transitions-returns-same-reference-each-call.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-019-is-agent-error-state-returns-correct-classification-for-all-states.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-020-is-agent-processing-state-returns-correct-classification-for-all-states.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-021-command-to-event-maps-known-commands-and-returns-null-for-unknown.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-001-happy-path-stopped-to-active-with-agent-started-audit.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-002-rejects-start-from-active-state.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-003-rejects-start-from-paused-state.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-004-happy-path-active-to-paused-with-agent-paused-audit-and-reason.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-005-rejects-pause-from-stopped-state.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-006-happy-path-paused-to-active-with-agent-resumed-audit.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-007-rejects-resume-from-stopped-state.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-008-happy-path-active-to-stopped-with-agent-stopped-audit.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-009-happy-path-paused-to-stopped-as-universal-escape-hatch.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-010-happy-path-error-recovery-to-stopped.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-011-rejects-stop-from-already-stopped-state.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-012-reconfigures-active-agent-with-merged-overrides.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-013-reconfigures-paused-agent-transitioning-to-active.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-014-rejects-reconfigure-from-stopped-state.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-015-handles-first-time-config-overrides-when-checkpoint-has-none.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-016-factory-returns-all-5-handler-functions.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-017-factory-handlers-complete-a-start-pause-stop-round-trip.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-018-uses-no-op-logger-when-none-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-019-logs-warning-on-invalid-transition.sdp.md delete mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-001-returns-immediately-without-calling-any-mutations.sdp.md delete mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-002-records-dead-letter-and-audit-event-but-does-not-advance-checkpoint.sdp.md delete mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-003-advances-checkpoint-when-return-value-is-null.sdp.md delete mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-004-persists-in-correct-order-when-requires-approval-is-true.sdp.md delete mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-005-updates-checkpoint-with-correct-args.sdp.md delete mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-006-uses-default-24h-timeout-for-approval-expires-at.sdp.md delete mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-007-records-command-but-not-approval-when-requires-approval-is-false.sdp.md delete mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-008-does-not-create-approval-when-requires-approval-is-true-but-command-is-nul.sdp.md delete mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-009-uses-custom-approval-timeout-ms-for-approval-expires-at.sdp.md delete mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-010-records-audit-and-checkpoint-but-skips-command-and-approval.sdp.md delete mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-011-skips-when-checkpoint-position-equals-event-position.sdp.md delete mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-012-catches-checkpoint-error-and-creates-dead-letter-instead-of-throwing.sdp.md delete mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-013-dead-letters-and-skips-checkpoint-when-audit-persistence-fails.sdp.md delete mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-014-dead-letters-and-skips-checkpoint-when-command-persistence-fails.sdp.md delete mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-015-dead-letters-and-skips-checkpoint-when-approval-persistence-fails.sdp.md delete mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-016-success-persistence-calls-include-verification-proofs.sdp.md delete mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-017-does-not-throw-even-when-dead-letter-recording-also-fails.sdp.md delete mode 100644 specs/behavior/platform-core/agent/oncomplete-handler.examples/s-018-does-not-throw-when-failed-result-dead-letter-recording-fails.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-001-define-rule-based-pattern.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-002-define-llm-analyzed-pattern.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-003-window-respects-time-boundary.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-004-window-respects-event-limit.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-005-empty-window-returns-no-patterns.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-006-pattern-window-loads-events-lazily-for-memory-efficiency.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-007-detect-churn-risk-from-cancellations.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-008-detect-fraud-risk-from-frequency-anomaly.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-009-no-pattern-when-threshold-not-met.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-010-llm-analyzes-event-sequence.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-011-llm-response-includes-suggested-action.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-detection.examples/s-012-llm-timeout-handled-gracefully.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-001-returns-null-matched-pattern-and-null-decision-for-empty-patterns-array.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-002-returns-rule-based-decision-when-trigger-returns-true-and-no-analyze.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-003-skips-pattern-when-trigger-returns-false.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-004-returns-llm-decision-when-analyze-returns-detected.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-005-continues-to-next-pattern-when-analyze-returns-not-detected.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-006-propagates-error-when-analyze-throws.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-007-stops-after-first-matching-pattern.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-008-falls-through-to-second-pattern-when-first-trigger-is-false.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-009-skips-pattern-when-min-events-is-not-met.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-010-processes-pattern-when-min-events-is-met.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-011-excludes-events-outside-the-pattern-window.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-012-returns-no-match-when-all-events-are-outside-the-window.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-013-extracts-command-type-from-analysis-result.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-014-returns-null-command-when-no-command-present.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-015-uses-command-payload-when-command-is-present.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-016-uses-result-data-as-payload-when-no-command-present.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-017-requires-approval-when-confidence-is-below-threshold.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-018-does-not-require-approval-when-confidence-meets-threshold.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-019-does-not-require-approval-when-confidence-equals-threshold.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-020-always-requires-approval-when-no-command-is-present.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-021-forces-approval-when-command-is-in-requires-approval-list.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-022-skips-approval-when-command-is-in-auto-approve-list.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-023-requires-approval-takes-precedence-over-auto-approve-for-same-command.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-024-returns-null-command-for-trigger-only-decision.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-025-always-requires-approval-for-trigger-only-decision.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-026-includes-pattern-name-in-trigger-decision-reason.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-027-includes-event-count-in-trigger-decision-reason.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-028-includes-all-event-i-ds-in-triggering-events.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-029-returns-0-6-confidence-for-1-event.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-030-returns-0-7-confidence-for-2-events.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-031-returns-0-8-confidence-for-3-events.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-032-caps-at-0-85-for-4-events.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-033-caps-at-0-85-for-10-events.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-executor.examples/s-034-returns-0-5-for-0-events-edge-case.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-001-error-codes-object-contains-all-expected-codes.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-002-single-valid-pattern-passes.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-003-multiple-patterns-with-unique-names-pass.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-004-patterns-with-different-window-configurations-pass.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-005-pattern-with-analyze-function-passes.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-006-empty-array-returns-valid.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-007-two-patterns-with-same-name-fail.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-008-duplicate-detected-in-middle-of-array.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-009-short-circuits-on-first-duplicate-found.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-010-empty-name-fails-with-pattern-name-required.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-011-whitespace-only-name-fails-with-pattern-name-required.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-012-invalid-pattern-short-circuits-before-duplicate-check.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-013-pattern-without-trigger-function-fails.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-014-pattern-with-non-function-trigger-fails.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-015-pattern-name-required-maps-to-registry-pattern-name-required.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-016-trigger-required-maps-to-registry-trigger-required.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-017-unknown-pattern-error-codes-map-to-invalid-pattern.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-018-accepts-readonly-array-input.sdp.md delete mode 100644 specs/behavior/platform-core/agent/pattern-registry.examples/s-019-error-result-has-correct-discriminated-union-shape.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-001-error-codes-contain-all-expected-values.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-002-accepts-valid-window-with-duration-only.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-003-accepts-window-with-all-optional-fields.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-004-rejects-window-with-empty-duration.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-005-rejects-window-with-missing-duration.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-006-rejects-window-with-non-positive-event-limit.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-007-rejects-window-with-negative-event-limit.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-008-rejects-window-with-non-positive-min-events.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-009-rejects-window-with-non-positive-load-batch-size.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-010-rejects-window-with-non-integer-event-limit.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-011-parses-days-format-correctly.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-012-parses-hours-format-correctly.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-013-parses-minutes-format-correctly.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-014-handles-uppercase-units.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-015-returns-null-for-invalid-formats.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-016-trims-leading-and-trailing-whitespace.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-017-returns-true-for-valid-duration-formats.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-018-returns-false-for-invalid-duration-formats.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-019-returns-invalid-when-name-is-missing.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-020-returns-invalid-when-name-is-empty-string.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-021-returns-invalid-when-name-is-whitespace-only.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-022-returns-invalid-when-trigger-is-missing.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-023-returns-invalid-when-trigger-is-not-a-function.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-024-returns-invalid-when-duration-format-is-invalid.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-025-returns-invalid-when-duration-is-empty.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-026-returns-invalid-when-event-limit-is-non-positive.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-027-returns-invalid-when-event-limit-is-negative.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-028-returns-invalid-when-event-limit-is-not-an-integer.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-029-returns-invalid-when-min-events-is-non-positive.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-030-returns-invalid-when-load-batch-size-is-non-positive.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-031-returns-valid-for-minimal-definition.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-032-returns-valid-for-complete-definition.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-033-returns-valid-for-definition-with-all-window-options.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-034-returns-the-definition-when-valid.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-035-throws-error-when-name-is-missing.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-036-throws-error-when-trigger-is-missing.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-037-throws-error-when-duration-is-invalid.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-038-includes-error-code-in-thrown-error-message.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-039-calculates-boundary-for-days.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-040-calculates-boundary-for-hours.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-041-calculates-boundary-for-minutes.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-042-uses-date-now-when-now-is-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-043-throws-error-for-invalid-duration-format.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-044-includes-events-within-the-window.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-045-excludes-events-outside-the-window.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-046-includes-events-exactly-at-the-boundary.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-047-applies-event-limit-and-takes-most-recent.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-048-does-not-limit-when-under-event-limit.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-049-returns-empty-array-when-no-events-match.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-050-handles-empty-events-array.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-051-returns-true-when-events-count-meets-min-events.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-052-returns-true-when-events-count-exceeds-min-events.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-053-returns-false-when-events-count-is-below-min-events.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-054-defaults-to-min-events-of-1.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-055-returns-false-for-empty-events-when-min-events-is-default.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-056-returns-true-when-event-count-meets-threshold.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-057-returns-true-when-event-count-exceeds-threshold.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-058-returns-false-when-event-count-is-below-threshold.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-059-returns-true-when-event-type-is-present.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-060-returns-false-when-event-type-is-not-present.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-061-returns-true-when-any-of-multiple-event-types-is-present.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-062-respects-min-count-parameter.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-063-returns-true-when-min-count-is-met.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-064-returns-true-when-minimum-streams-are-present.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-065-returns-false-when-below-minimum-streams.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-066-counts-unique-streams-correctly.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-067-returns-true-when-all-triggers-match.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-068-returns-false-when-any-trigger-does-not-match.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-069-returns-false-when-no-triggers-match.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-070-returns-true-for-empty-triggers-array.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-071-passes-events-to-each-trigger.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-072-returns-true-when-any-trigger-matches.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-073-returns-true-when-all-triggers-match.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-074-returns-false-when-no-triggers-match.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-075-returns-false-for-empty-triggers-array.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-076-short-circuits-on-first-match.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-077-combines-count-threshold-with-event-type-using-all.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-078-fails-all-when-event-type-missing-despite-count-met.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-079-combines-any-with-count-thresholds-alert-present.sdp.md delete mode 100644 specs/behavior/platform-core/agent/patterns.examples/s-080-combines-any-with-count-thresholds-neither-condition-met.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-001-all-expected-error-codes-are-present-with-correct-values.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-002-error-codes-object-has-exactly-8-entries.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-003-accepts-valid-cost-budget.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-004-rejects-budget-with-zero-daily.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-005-rejects-budget-with-negative-daily.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-006-rejects-budget-with-alert-threshold-above-1.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-007-rejects-budget-with-negative-alert-threshold.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-008-accepts-alert-threshold-at-boundary-0.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-009-accepts-alert-threshold-at-boundary-1.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-010-accepts-valid-config-with-required-fields-only.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-011-accepts-config-with-all-optional-fields.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-012-rejects-config-with-zero-max-requests-per-minute.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-013-rejects-config-with-negative-max-requests-per-minute.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-014-rejects-config-with-non-integer-max-requests-per-minute.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-015-rejects-config-with-zero-max-concurrent.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-016-rejects-config-with-zero-queue-depth.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-017-returns-invalid-when-max-requests-per-minute-is-undefined.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-018-returns-invalid-when-max-requests-per-minute-is-zero.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-019-returns-invalid-when-max-requests-per-minute-is-negative.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-020-returns-invalid-when-max-requests-per-minute-is-not-an-integer.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-021-returns-valid-for-positive-integer-max-requests-per-minute.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-022-returns-invalid-when-max-concurrent-is-zero.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-023-returns-invalid-when-max-concurrent-is-negative.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-024-returns-invalid-when-max-concurrent-is-not-an-integer.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-025-returns-valid-when-max-concurrent-is-undefined.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-026-returns-invalid-when-queue-depth-is-zero.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-027-returns-invalid-when-queue-depth-is-negative.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-028-returns-invalid-when-queue-depth-is-not-an-integer.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-029-returns-invalid-when-cost-budget-daily-is-zero.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-030-returns-invalid-when-cost-budget-daily-is-negative.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-031-returns-invalid-when-cost-budget-alert-threshold-is-below-0.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-032-returns-invalid-when-cost-budget-alert-threshold-is-above-1.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-033-returns-valid-when-cost-budget-is-valid.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-034-returns-valid-for-complete-valid-config.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-035-default-config-has-correct-field-values.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-036-default-config-passes-validation.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-037-creates-config-with-specified-daily-budget.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-038-uses-default-alert-threshold-when-not-specified.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-039-uses-specified-alert-threshold.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-040-uses-specified-max-requests-per-minute.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-041-uses-default-max-requests-per-minute-when-not-specified.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-042-includes-all-optional-fields.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-043-creates-error-with-code-and-message.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-044-creates-error-without-optional-fields-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-045-creates-error-with-retry-after-ms-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-046-creates-error-with-context-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-047-creates-error-with-both-retry-after-ms-and-context.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-048-returns-true-for-valid-rate-limit-error.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-049-returns-true-for-all-known-error-codes.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-050-returns-false-for-non-error-values.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-051-retryable-error-codes.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-052-returns-false-for-non-rate-limit-errors.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-053-permanent-error-codes.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-054-returns-false-for-non-rate-limit-errors.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-055-exponential-2-n-growth-pattern-with-math-random-mocked-to-0.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-056-caps-at-default-max-delay-of-60000ms.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-057-caps-at-custom-max-delay.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-058-does-not-cap-when-delay-is-below-max.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-059-adds-jitter-up-to-25-of-delay.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-060-adds-max-jitter-of-25-when-random-is-1.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-061-uses-default-base-delay-of-1000ms.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-062-uses-default-max-delay-of-60000ms.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-063-returns-floored-integer.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-064-returns-true-when-total-exceeds-budget.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-065-returns-false-when-total-is-under-budget.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-066-returns-false-when-total-equals-budget-exactly.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-067-returns-true-when-current-spend-already-exceeds-budget.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-068-handles-zero-current-spend-under-budget.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-069-handles-zero-current-spend-over-budget.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-070-handles-small-decimal-values-under-budget.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-071-handles-small-decimal-values-over-budget.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-072-returns-true-when-spend-reaches-threshold-percentage.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-073-returns-true-when-spend-exceeds-threshold.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-074-returns-false-when-spend-is-below-threshold.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-075-handles-threshold-of-0-always-alert.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-076-handles-threshold-of-1-below-full-budget.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-077-handles-threshold-of-1-at-full-budget.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-078-returns-defaults-when-no-config-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-079-returns-defaults-when-undefined-config-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-080-uses-provided-max-requests-per-minute.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-081-uses-default-max-concurrent-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-082-uses-provided-max-concurrent.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-083-uses-default-queue-depth-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-084-uses-provided-queue-depth.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-085-preserves-cost-budget-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/rate-limit.examples/s-086-does-not-include-cost-budget-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-001-calls-generate-text-and-parses-a-valid-json-response.sdp.md delete mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-002-handles-non-json-response-with-defaults.sdp.md delete mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-003-handles-malformed-json-gracefully.sdp.md delete mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-004-re-throws-generate-text-errors.sdp.md delete mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-005-tracks-timing-in-llm-context.sdp.md delete mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-006-includes-thread-id-in-llm-context-when-present.sdp.md delete mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-007-omits-thread-id-from-llm-context-when-not-present.sdp.md delete mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-008-handles-missing-usage-with-zero-tokens.sdp.md delete mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-009-calls-generate-text-and-parses-json-response-for-reason.sdp.md delete mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-010-returns-raw-text-when-response-is-not-json.sdp.md delete mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-011-re-throws-generate-text-errors-from-reason.sdp.md delete mode 100644 specs/behavior/platform-core/agent/thread-adapter.examples/s-012-logs-reasoning-start-and-completion.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-001-executes-commands-sequentially-in-atomic-mode.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-002-stops-on-first-failure-and-skips-remaining-in-atomic-mode.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-003-rejects-batch-for-cross-aggregate-commands-in-atomic-mode.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-004-uses-shared-correlation-id-in-atomic-mode.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-005-allows-command-level-correlation-id-override-in-atomic-mode.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-006-executes-all-commands-even-with-failures-in-partial-mode.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-007-returns-success-when-all-commands-succeed-in-partial-mode.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-008-allows-cross-aggregate-commands-in-partial-mode.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-009-respects-max-concurrency-in-partial-mode.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-010-stops-on-failure-when-continue-on-error-is-false-in-partial-mode.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-011-tracks-individual-command-results.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-012-includes-duration-for-each-command.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-013-includes-error-message-for-failed-commands.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-014-calculates-correct-summary-statistics.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-015-handles-executor-throwing-errors.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-016-handles-empty-batch-gracefully.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-017-rejects-batch-exceeding-max-command-count-before-execution.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-018-accepts-batch-exactly-at-max-command-count.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-019-accepts-batch-exactly-at-default-max-command-count.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-020-rejects-batch-exceeding-default-max-command-count-before-execution.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-021-rejects-commands-from-wrong-bounded-context.sdp.md delete mode 100644 specs/behavior/platform-core/batch/batch-executor.examples/s-022-creates-a-batch-executor-instance-via-factory.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-001-rejects-empty-batch.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-002-accepts-batch-exactly-at-max-size.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-003-rejects-batch-exceeding-max-size.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-004-accepts-batch-exactly-at-default-max-size.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-005-rejects-batch-exceeding-default-max-size.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-006-accepts-valid-commands-without-registry.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-007-accepts-commands-in-different-bounded-contexts.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-008-requires-aggregate-id-option.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-009-requires-aggregate-id-field-option.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-010-accepts-when-all-commands-target-same-aggregate.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-011-rejects-when-commands-target-different-aggregates.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-012-accepts-commands-targeting-same-aggregate-with-explicit-aggregate-id.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-013-infers-aggregate-id-from-first-command-when-not-specified.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-014-rejects-when-commands-target-different-aggregate-instances.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-015-rejects-when-commands-target-different-aggregate-types.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-016-rejects-non-aggregate-commands-in-atomic-mode.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-017-rejects-unregistered-commands.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-018-accepts-commands-matching-specified-bounded-context.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-019-rejects-commands-from-wrong-bounded-context.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-020-extracts-id-from-command-args.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-021-returns-undefined-for-missing-field.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-022-returns-undefined-for-non-string-value.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-023-groups-commands-by-aggregate-id.sdp.md delete mode 100644 specs/behavior/platform-core/batch/validation.examples/s-024-uses-placeholder-for-missing-i-ds.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-001-state-at-current-version-is-returned-as-is.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-002-state-is-migrated-from-v1-to-v2.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-003-state-is-migrated-from-v1-to-v3.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-004-legacy-state-without-state-version-is-treated-as-version-0.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-005-null-input-throws-cms-upcaster-error.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-006-undefined-input-throws-cms-upcaster-error.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-007-incomplete-migration-chain-throws-at-creation-time.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-008-future-state-version-throws-cms-upcaster-error.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-009-migration-function-error-propagates-mid-chain.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-010-first-migration-function-error-propagates.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-011-state-at-current-version-is-returned-as-is-via-upcast-if-needed.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-012-state-is-migrated-via-upcast-if-needed.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-013-validation-passes-when-state-is-valid.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-014-validation-fails-when-state-is-invalid.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-015-future-state-version-throws-cms-upcaster-error-via-upcast-if-needed.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-016-error-has-correct-name.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-017-error-has-correct-code.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-018-error-has-correct-message.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-019-error-stores-context-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-020-error-has-undefined-context-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-021-error-is-instanceof-error.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-022-validation-passes-for-current-version-state.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-023-validation-fails-for-current-version-state-with-empty-description.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-024-validation-passes-after-upcasting-from-v1.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-025-validation-fails-after-upcasting-produces-invalid-state.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-026-static-default-value-is-added.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-027-computed-default-value-is-added.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-028-computed-default-accesses-state.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-029-existing-fields-are-preserved.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-030-field-is-renamed.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-031-other-fields-are-preserved-when-renaming.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-032-undefined-value-in-renamed-field-is-handled.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-033-specified-field-is-removed.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-034-other-fields-are-preserved-when-removing.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-035-non-existent-field-is-handled-gracefully.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-036-add-cms-field-migration-works-in-migration-chain.sdp.md delete mode 100644 specs/behavior/platform-core/cms/upcaster.examples/s-037-multiple-helper-migrations-are-chained.sdp.md delete mode 100644 specs/behavior/platform-core/commands/categories.examples/s-001-command-categories-has-exactly-four-entries-in-the-correct-order.sdp.md delete mode 100644 specs/behavior/platform-core/commands/categories.examples/s-002-schema-accepts-valid-category-strings.sdp.md delete mode 100644 specs/behavior/platform-core/commands/categories.examples/s-003-schema-rejects-invalid-category-values.sdp.md delete mode 100644 specs/behavior/platform-core/commands/categories.examples/s-004-default-command-category-is-aggregate.sdp.md delete mode 100644 specs/behavior/platform-core/commands/categories.examples/s-005-type-guard-accepts-all-valid-categories.sdp.md delete mode 100644 specs/behavior/platform-core/commands/categories.examples/s-006-type-guard-rejects-invalid-values.sdp.md delete mode 100644 specs/behavior/platform-core/commands/categories.examples/s-007-valid-categories-are-returned-unchanged.sdp.md delete mode 100644 specs/behavior/platform-core/commands/categories.examples/s-008-invalid-values-normalize-to-aggregate.sdp.md delete mode 100644 specs/behavior/platform-core/commands/categories.examples/s-009-classification-of-categories-as-aggregate.sdp.md delete mode 100644 specs/behavior/platform-core/commands/categories.examples/s-010-classification-of-categories-as-process.sdp.md delete mode 100644 specs/behavior/platform-core/commands/categories.examples/s-011-classification-of-categories-as-system.sdp.md delete mode 100644 specs/behavior/platform-core/commands/categories.examples/s-012-classification-of-categories-as-batch.sdp.md delete mode 100644 specs/behavior/platform-core/commands/categories.examples/s-013-schema-accepts-valid-aggregate-targets.sdp.md delete mode 100644 specs/behavior/platform-core/commands/categories.examples/s-014-schema-rejects-invalid-aggregate-targets.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-001-error-categories-has-exactly-four-entries-with-correct-values.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-002-error-category-members-have-correct-string-values.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-003-type-guard-accepts-valid-error-categories.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-004-type-guard-rejects-invalid-values.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-005-command-error-is-created-with-all-properties.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-006-command-error-is-an-instance-of-error.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-007-command-error-from-returns-existing-command-error-unchanged.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-008-command-error-from-wraps-a-regular-error.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-009-command-error-from-wraps-a-string-value.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-010-command-error-from-wraps-an-unknown-value.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-011-to-json-serializes-error-with-context.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-012-to-json-handles-undefined-context.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-013-factory-creates-domain-error.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-014-factory-creates-validation-error.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-015-factory-creates-concurrency-error.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-016-factory-creates-infrastructure-error.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-017-factory-creates-not-found-error.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-018-factory-creates-already-exists-error.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-019-factory-creates-invalid-state-error.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-020-factory-creates-unauthorized-error.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-021-factory-creates-rate-limited-error.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-022-returns-true-for-matching-category.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-023-returns-false-for-non-matching-category.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-024-returns-false-for-non-command-error.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-025-recoverable-errors-are-identified-correctly.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-026-non-recoverable-error-gets-delay-of-1.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-027-concurrency-error-delays-escalate-then-cap.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-028-infrastructure-error-delays-escalate-then-cap.sdp.md delete mode 100644 specs/behavior/platform-core/commands/errors.examples/s-029-unknown-error-gets-infrastructure-style-delay.sdp.md delete mode 100644 specs/behavior/platform-core/commands/factories.examples/s-001-schema-assigns-aggregate-category-and-preserves-command-type.sdp.md delete mode 100644 specs/behavior/platform-core/commands/factories.examples/s-002-aggregate-target-is-present-on-parsed-command.sdp.md delete mode 100644 specs/behavior/platform-core/commands/factories.examples/s-003-aggregate-target-is-undefined-when-not-configured.sdp.md delete mode 100644 specs/behavior/platform-core/commands/factories.examples/s-004-schema-rejects-a-mismatched-command-type.sdp.md delete mode 100644 specs/behavior/platform-core/commands/factories.examples/s-005-schema-rejects-commands-missing-required-fields.sdp.md delete mode 100644 specs/behavior/platform-core/commands/factories.examples/s-006-schema-assigns-process-category-and-preserves-command-type.sdp.md delete mode 100644 specs/behavior/platform-core/commands/factories.examples/s-007-process-type-is-present-on-parsed-command.sdp.md delete mode 100644 specs/behavior/platform-core/commands/factories.examples/s-008-process-type-is-undefined-when-not-configured.sdp.md delete mode 100644 specs/behavior/platform-core/commands/factories.examples/s-009-schema-assigns-system-category-and-preserves-command-type.sdp.md delete mode 100644 specs/behavior/platform-core/commands/factories.examples/s-010-requires-idempotency-defaults-to-false.sdp.md delete mode 100644 specs/behavior/platform-core/commands/factories.examples/s-011-requires-idempotency-can-be-set-to-true.sdp.md delete mode 100644 specs/behavior/platform-core/commands/factories.examples/s-012-schema-assigns-batch-category-with-items.sdp.md delete mode 100644 specs/behavior/platform-core/commands/factories.examples/s-013-batch-config-is-present-on-parsed-command.sdp.md delete mode 100644 specs/behavior/platform-core/commands/factories.examples/s-014-schema-rejects-items-that-fail-item-schema-validation.sdp.md delete mode 100644 specs/behavior/platform-core/commands/factories.examples/s-015-empty-items-array-is-accepted.sdp.md delete mode 100644 specs/behavior/platform-core/commands/factories.examples/s-016-category-is-extracted-from-each-factory-schema.sdp.md delete mode 100644 specs/behavior/platform-core/commands/factories.examples/s-017-non-command-schemas-return-undefined.sdp.md delete mode 100644 specs/behavior/platform-core/commands/naming.examples/s-001-command-name-prefixes-includes-all-standard-prefixes.sdp.md delete mode 100644 specs/behavior/platform-core/commands/naming.examples/s-002-create-pattern-accepts-valid-create-prefixed-names.sdp.md delete mode 100644 specs/behavior/platform-core/commands/naming.examples/s-003-add-pattern-accepts-valid-add-prefixed-names.sdp.md delete mode 100644 specs/behavior/platform-core/commands/naming.examples/s-004-update-pattern-accepts-update-change-and-modify-prefixes.sdp.md delete mode 100644 specs/behavior/platform-core/commands/naming.examples/s-005-valid-command-names-are-accepted.sdp.md delete mode 100644 specs/behavior/platform-core/commands/naming.examples/s-006-invalid-command-names-are-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/commands/naming.examples/s-007-valid-names-return-matched-prefix-and-valid-flag.sdp.md delete mode 100644 specs/behavior/platform-core/commands/naming.examples/s-008-invalid-name-returns-suggestions-and-error-message.sdp.md delete mode 100644 specs/behavior/platform-core/commands/naming.examples/s-009-inverted-name-receives-corrected-suggestion.sdp.md delete mode 100644 specs/behavior/platform-core/commands/naming.examples/s-010-suggestions-are-limited-to-at-most-3.sdp.md delete mode 100644 specs/behavior/platform-core/commands/naming.examples/s-011-known-names-return-their-prefix.sdp.md delete mode 100644 specs/behavior/platform-core/commands/naming.examples/s-012-invalid-or-empty-names-return-undefined.sdp.md delete mode 100644 specs/behavior/platform-core/commands/naming.examples/s-013-various-input-formats-produce-correct-pascal-case-names.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-001-chain-uses-command-id-as-causation-id-and-generates-correlation-id.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-002-chain-uses-provided-correlation-id.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-003-chain-uses-provided-user-id.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-004-chain-uses-provided-context.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-005-chain-uses-provided-initiated-at.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-006-chain-accepts-all-options-together.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-007-derived-chain-preserves-correlation-id-and-uses-event-id-as-causation-id.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-008-derived-chain-inherits-user-id-from-source.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-009-derived-chain-inherits-context-from-source.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-010-derived-chain-merges-source-and-option-contexts.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-011-option-context-takes-precedence-over-source-context.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-012-source-context-preserved-when-options-have-no-context.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-013-options-context-used-when-source-has-no-context.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-014-context-is-undefined-when-neither-source-nor-options-have-context.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-015-both-empty-contexts-merge-to-empty-object.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-016-source-context-preserved-when-options-context-is-empty.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-017-options-context-used-when-source-context-is-empty.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-018-derived-chain-uses-provided-command-id.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-019-derived-chain-uses-provided-initiated-at.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-020-extracts-correlation-id-and-causation-id.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-021-includes-user-id-when-present.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-022-excludes-user-id-when-undefined.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-023-merges-additional-metadata.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-024-does-not-include-context-initiated-at-or-command-id-from-chain.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-025-returns-true-for-chains-with-same-correlation-id.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-026-returns-false-for-chains-with-different-correlation-ids.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-027-returns-true-when-child-causation-id-matches-parent-command-id.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-028-returns-false-when-child-causation-id-does-not-match.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-029-returns-true-for-same-chain-where-command-is-its-own-cause.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-030-full-request-flow-tracing-from-user-command-through-saga-reaction.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/chain.examples/s-031-multi-step-saga-preserves-correlation-id-across-three-links.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-001-record-a-new-correlation.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-002-merge-event-i-ds-for-existing-correlation.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-003-return-null-for-non-existent-command.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-004-return-correlation-for-existing-command.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-005-filter-by-bounded-context.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-006-throw-when-bounded-context-is-missing.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-007-respect-limit-parameter.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-008-return-true-for-command-with-events.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-009-return-false-for-non-existent-command.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-010-return-event-count-for-existing-command.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-011-return-0-for-non-existent-command.sdp.md delete mode 100644 specs/behavior/platform-core/correlation/correlation-service.examples/s-012-create-a-correlation-service-instance.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-001-successful-execution-without-scope-operations.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-002-successful-execution-includes-schema-version-and-category-in-events.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-003-rejected-decider-result-returns-rejection.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-004-failed-decider-result-returns-failure-with-event.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-005-occ-pre-check-passes-when-expected-version-matches-scope-version.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-006-occ-pre-check-detects-stale-expected-version.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-007-occ-pre-check-detects-scope-not-found-when-expected-version-0.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-008-occ-pre-check-allows-new-scope-with-expected-version-0.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-009-occ-commit-detects-concurrent-modification.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-010-occ-commit-tracks-updated-stream-i-ds.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-011-invalid-scope-key-returns-rejection.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/execute.examples/s-012-missing-entities-returns-rejection.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-001-create-valid-scope-key-from-components.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-002-scope-id-may-contain-colons-for-composite-identifiers.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-003-create-scope-key-throws-on-invalid-input.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-004-try-create-scope-key-returns-scope-key-for-valid-input.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-005-try-create-scope-key-returns-null-for-invalid-input.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-006-parse-valid-scope-key-into-components.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-007-parse-scope-key-with-composite-scope-id-containing-colons.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-008-parse-scope-key-returns-null-for-invalid-format.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-009-validate-scope-key-returns-null-for-valid-scope-key.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-010-validate-scope-key-returns-scope-key-empty-error-for-empty-string.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-011-validate-scope-key-returns-error-for-missing-tenant-prefix.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-012-validate-scope-key-returns-error-for-malformed-scope-key.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-013-is-valid-scope-key-type-guard.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-014-assert-valid-scope-key-throws-on-invalid-input.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-015-assert-valid-scope-key-succeeds-on-valid-input.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-016-is-scope-tenant-checks-tenant-membership.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-017-extract-tenant-id-returns-tenant-id-from-scope-key.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-018-extract-scope-type-returns-scope-type-from-scope-key.sdp.md delete mode 100644 specs/behavior/platform-core/dcb/scope-key.examples/s-019-extract-scope-id-returns-scope-id-from-scope-key.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-001-handler-calls-load-state-with-correct-entity-id.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-002-handler-calls-decider-with-state-command-input-and-context.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-003-handler-calls-apply-update-with-correct-parameters.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-004-handler-returns-success-result-with-correct-structure.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-005-handler-increments-version-correctly-from-existing-version.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-006-handler-returns-rejected-result-without-calling-apply-update.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-007-rejected-result-includes-rejection-details.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-008-handler-returns-failed-result-without-calling-apply-update.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-009-failed-result-includes-failure-event-and-details.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-010-handler-propagates-load-state-errors.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-011-handler-uses-custom-error-handler-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-012-handler-rethrows-when-custom-error-handler-returns-nothing.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-013-handler-logs-debug-on-success.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-014-handler-logs-debug-on-rejection.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-015-handler-logs-error-on-exception.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-016-handler-generates-unique-event-id-per-invocation.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-017-handler-includes-schema-version-in-event-metadata.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-018-handler-builds-correct-stream-id-from-entity-id.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-019-entity-handler-calls-try-load-state-with-correct-entity-id.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-020-entity-handler-calls-decider-with-null-state-when-entity-does-not-exist.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-021-entity-handler-calls-insert-for-new-entities.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-022-entity-handler-returns-success-with-version-1-for-new-entities.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-023-entity-handler-generates-correct-event-metadata-for-new-entities.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-024-entity-handler-calls-decider-with-existing-state-when-entity-exists.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-025-entity-handler-returns-rejection-when-entity-already-exists.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-026-entity-handler-does-not-call-insert-when-entity-already-exists.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-027-entity-handler-returns-failed-result-with-version-0-for-non-existent-entit.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-028-entity-handler-does-not-call-insert-on-business-failure.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-029-entity-handler-propagates-try-load-state-errors.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-030-entity-handler-propagates-insert-errors.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-031-entity-handler-uses-custom-error-handler-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-032-entity-handler-logs-debug-on-entity-creation-success.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-033-entity-handler-logs-debug-on-rejection.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-034-entity-handler-generates-unique-event-id-for-each-creation.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-035-entity-handler-includes-schema-version-in-metadata.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-036-pre-validate-rejection-short-circuits-handler.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-037-pre-validate-returning-undefined-allows-normal-flow.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-038-pre-validate-receives-correct-arguments.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-039-pre-validate-failure-is-logged.sdp.md delete mode 100644 specs/behavior/platform-core/decider/factory.examples/s-040-handler-works-normally-without-pre-validate-configured.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-001-dcb-succeeds-on-first-attempt.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-002-rejected-result-passes-through-unchanged.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-003-conflict-triggers-retry-with-updated-version.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-005-scope-aware-scheduling-key-is-preserved.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-006-successful-retry-calls-on-complete-with-result.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-007-version-advances-during-retry-delay.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-008-backoff-increases-exponentially.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-009-backoff-is-capped-at-maximum.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-010-jitter-adds-randomness-to-prevent-thundering-herd.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-011-jitter-function-is-injectable-for-deterministic-tests.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-001-adapter-plugs-into-existing-middleware.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-002-rate-limited-command-returns-standard-rejection.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-003-dcb-retry-uses-separate-workpool.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-004-retry-mutation-receives-correct-arguments.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-005-dcb-retry-with-on-complete-callback-integration.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-006-workpool-does-not-retry-dcb-mutations-clarification.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-007-rate-limiter-component-creates-tables.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-008-multiple-workpools-can-coexist.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-001-adapter-allows-request-within-rate-limit.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-002-adapter-rejects-request-exceeding-rate-limit.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-003-different-keys-have-independent-limits.sdp.md delete mode 100644 specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/fat-event-builder.examples/s-001-create-basic-fat-event.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/fat-event-builder.examples/s-002-create-fat-event-with-schema-definition.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/fat-event-builder.examples/s-003-schema-validation-failure.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/fat-event-builder.examples/s-004-create-fat-event-with-correlation-id.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/fat-event-builder.examples/s-005-embed-selected-entity-fields.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/fat-event-builder.examples/s-006-embed-all-fields.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/fat-event-builder.examples/s-007-embed-non-existent-field.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/fat-event-builder.examples/s-008-embed-collection-of-items.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/fat-event-builder.examples/s-009-embed-collection-with-field-selection.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/fat-event-builder.examples/s-010-embed-empty-collection.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-001-event-type-for-integration-scenarios.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-002-inventory-updated-as-thin-event.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-003-order-submitted-as-fat-event.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-004-published-language-event-is-fat.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-005-category-suggests-event-type.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-001-mark-single-field-for-shredding.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-002-mark-multiple-fields-for-shredding.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-003-non-pii-fields-are-not-marked.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-004-find-all-shreddable-fields-in-event.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-005-no-shreddable-fields-returns-empty.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-006-mark-fields-in-collection-items.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-007-shred-all-marked-fields.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-008-non-marked-fields-are-preserved.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-009-shred-event-returns-audit-trail.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-010-check-if-event-has-any-shreddable-fields.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-011-check-event-without-shreddable-fields.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-012-count-shreddable-fields.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-013-cannot-shred-required-fields.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/privacy-markers.examples/s-014-non-overlapping-shred-and-required-fields-work.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-001-schema-version-is-included-automatically.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-002-custom-schema-version-is-used.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-003-valid-payload-passes-validation.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-004-missing-required-field-fails-validation.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-005-wrong-field-type-fails-validation.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-006-migrate-v1-event-to-v2-format.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-007-no-migration-needed-for-current-version.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-008-unknown-source-version-fails-migration.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-009-compare-older-version-to-newer-version.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-010-compare-newer-version-to-older-version.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-011-compare-equal-versions.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-012-compare-versions-with-different-minor.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-013-invalid-semver-format-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-014-negative-major-version-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-015-negative-minor-version-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-016-event-needs-migration-to-newer-version.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-017-event-does-not-need-migration-for-same-version.sdp.md delete mode 100644 specs/behavior/platform-core/ecst/schema-versioning.examples/s-018-event-does-not-need-migration-for-older-target.sdp.md delete mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-001-percentage-is-50-when-half-events-processed.sdp.md delete mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-002-percentage-is-100-when-all-events-processed.sdp.md delete mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-003-percentage-is-100-when-total-events-is-zero.sdp.md delete mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-004-percentage-has-one-decimal-place-precision.sdp.md delete mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-005-remaining-time-estimated-from-throughput.sdp.md delete mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-006-remaining-time-is-undefined-when-no-events-processed.sdp.md delete mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-007-remaining-time-is-undefined-when-elapsed-time-is-zero.sdp.md delete mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-008-remaining-time-is-zero-when-all-events-processed.sdp.md delete mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-009-calculate-progress-for-running-replay.sdp.md delete mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-010-calculate-progress-for-completed-replay.sdp.md delete mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-011-calculate-progress-includes-error-for-failed-replay.sdp.md delete mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-012-running-status-is-active.sdp.md delete mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-013-paused-status-is-active.sdp.md delete mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-014-completed-status-is-not-active.sdp.md delete mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-015-failed-status-is-not-active.sdp.md delete mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-016-completed-status-is-terminal.sdp.md delete mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-017-failed-status-is-terminal.sdp.md delete mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-018-cancelled-status-is-terminal.sdp.md delete mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-019-running-status-is-not-terminal.sdp.md delete mode 100644 specs/behavior/platform-core/event-replay/replay-progress.examples/s-020-paused-status-is-not-terminal.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-append.examples/s-001-create-append-partition-key-generates-correct-format.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-append.examples/s-002-partition-key-handles-various-stream-types.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-append.examples/s-003-durable-append-event-enqueues-action-to-workpool.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-append.examples/s-004-durable-append-event-returns-work-id-from-workpool.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-append.examples/s-005-durable-append-event-passes-on-complete-to-workpool.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-append.examples/s-006-durable-append-event-includes-idempotency-key-in-context.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-append.examples/s-007-create-durable-append-action-handler-returns-a-function.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-append.examples/s-008-action-handler-invokes-idempotent-append-event.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-001-partition-key-format-is-event-id-target-context.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-002-different-events-get-different-partition-keys.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-003-publishing-event-creates-tracking-records-for-each-target.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-004-publishing-event-enqueues-delivery-actions-via-workpool.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-005-publish-result-contains-publication-i-ds-for-each-target.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-006-correlation-id-is-passed-through-to-tracking-records.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-007-get-publication-status-returns-all-target-contexts.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-008-get-publication-status-returns-empty-array-for-unknown-event.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-009-retry-publication-re-enqueues-delivery-action.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-010-retry-publication-returns-not-found-for-unknown-publication.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-011-retry-publication-returns-already-delivered-for-delivered-publication.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-012-retry-increments-attempt-count-correctly.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-013-on-complete-updates-status-to-delivered-on-success.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-014-on-complete-increments-attempt-count-on-failure.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-015-on-complete-creates-dead-letter-after-max-retries.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-001-command-idempotency-key-uses-command-type-entity-id-command-id-format.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-002-action-idempotency-key-uses-action-type-entity-id-format.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-003-saga-step-idempotency-key-uses-saga-type-saga-id-step-format.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-004-scheduled-job-idempotency-key-uses-job-type-schedule-id-timestamp-format.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-005-first-append-with-idempotency-key-succeeds.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-006-duplicate-append-returns-existing-event.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-007-same-key-with-different-payload-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-008-different-idempotency-keys-create-separate-events.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-009-occ-conflict-with-duplicate-on-recheck-returns-duplicate.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-010-true-occ-conflict-throws-error.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-001-build-intent-key-generates-correct-format.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-002-intent-key-handles-various-operation-types.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-003-record-intent-creates-intent-event-with-correct-type.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-004-record-intent-schedules-timeout-check.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-005-record-intent-returns-intent-key-and-event-id.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-006-record-completion-creates-success-event.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-007-record-completion-creates-failure-event-with-error.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-008-record-completion-creates-abandonment-event.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-009-check-intent-timeout-returns-already-resolved-when-completion-exists.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-010-check-intent-timeout-creates-abandonment-when-no-completion.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-011-check-intent-timeout-is-idempotent.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-012-query-orphaned-intents-returns-intents-without-completion.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-013-query-orphaned-intents-filters-by-operation-type.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-001-create-outbox-handler-returns-a-callable-function.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-002-outbox-handler-extracts-idempotency-key-from-context.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-003-outbox-handler-builds-payment-completed-event-from-success-result.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-004-outbox-handler-builds-payment-failed-event-from-failure-result.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-005-outbox-handler-calls-idempotent-append-event-internally.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-006-outbox-handler-completes-without-error-for-duplicates.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-001-successful-processing-creates-no-poison-record.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-002-first-failure-records-attempt-but-does-not-quarantine.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-003-event-becomes-quarantined-after-max-retries.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-004-quarantined-event-is-silently-skipped.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-005-on-quarantine-callback-invoked-when-alert-on-quarantine-is-true.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-006-on-quarantine-not-invoked-when-alert-on-quarantine-is-false.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-007-is-event-quarantined-returns-true-for-quarantined-event.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-008-is-event-quarantined-returns-false-for-non-quarantined-event.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-009-get-poison-event-record-returns-normalized-record.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-010-get-poison-event-record-returns-null-for-non-existent-event.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-011-unquarantine-event-clears-quarantine-status.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-012-unquarantine-event-returns-not-found-for-missing-event.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-013-unquarantine-event-returns-not-quarantined-for-pending-event.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-014-list-quarantined-events-returns-quarantined-records.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-015-list-quarantined-events-filters-by-projection.sdp.md delete mode 100644 specs/behavior/platform-core/event-store-durability/poison-event.examples/s-016-get-poison-event-stats-returns-aggregated-statistics.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-001-creates-bus-with-empty-subscriptions.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-002-creates-bus-with-subscriptions-sorted-by-priority.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-003-returns-empty-result-when-no-subscriptions-match.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-004-enqueues-matching-subscriptions-via-workpool.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-005-enqueues-multiple-matching-subscriptions.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-006-passes-transformed-args-to-workpool.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-007-includes-partition-key-in-workpool-context.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-008-uses-subscription-level-on-complete-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-009-uses-default-on-complete-from-config-when-subscription-has-none.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-010-does-not-include-on-complete-if-neither-subscription-nor-config-provides-i.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-011-returns-true-for-indexed-event-type-and-false-for-unsubscribed-type.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-012-returns-true-for-any-event-type-when-wildcard-subscription-exists.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-013-returns-false-when-no-subscriptions-exist.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-014-returns-all-subscriptions.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-015-returns-empty-array-when-no-subscriptions.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-016-returns-subscriptions-matching-event-type-filter.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-017-returns-subscriptions-matching-category-filter.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-018-publishes-to-subscriptions-in-priority-order.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-019-propagates-workpool-errors-when-enqueue-fails.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-020-does-not-enqueue-subsequent-subscriptions-if-earlier-enqueue-fails.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-021-wildcard-subscriptions-match-any-event-type.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-022-wildcard-with-bounded-context-filter-only-matches-that-context.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-023-creates-event-bus-instance-with-empty-subscriptions.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-024-creates-event-bus-with-config.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-001-builder-creates-subscription-with-name-and-handler.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-002-builder-defaults-to-empty-filter.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-003-builder-defaults-to-priority-100.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-004-builder-defaults-partition-key-to-stream-id.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-005-for-event-types-sets-event-type-filter.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-006-for-categories-sets-category-filter.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-007-for-bounded-contexts-sets-bounded-context-filter.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-008-for-stream-types-sets-stream-type-filter.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-009-chaining-multiple-filters-composes-them.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-010-with-on-complete-sets-the-on-complete-handler.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-011-with-priority-sets-priority.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-012-with-transform-sets-custom-transformer.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-013-with-partition-key-sets-custom-partition-key-extractor.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-014-add-adds-a-subscription-to-the-registry.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-015-add-supports-chaining.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-016-add-throws-on-duplicate-subscription-name.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-017-subscribe-returns-builder-that-adds-to-registry-on-build.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-018-define-subscriptions-returns-configured-subscriptions.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-019-define-subscriptions-throws-on-duplicate-names-via-subscribe-build.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-020-define-subscriptions-throws-on-duplicate-names-via-add.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-021-create-subscription-creates-standalone-builder.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-022-empty-filter-matches-any-event.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-023-matches-when-event-type-is-in-the-list.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-024-does-not-match-when-event-type-is-not-in-the-list.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-025-matches-when-category-is-in-the-list.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-026-does-not-match-when-category-is-not-in-the-list.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-027-matches-when-bounded-context-is-in-the-list.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-028-does-not-match-when-bounded-context-is-not-in-the-list.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-029-matches-when-stream-type-is-in-the-list.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-030-does-not-match-when-stream-type-is-not-in-the-list.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-031-all-filters-matching-returns-true.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-032-non-matching-event-type-returns-false-with-combined-filters.sdp.md delete mode 100644 specs/behavior/platform-core/eventbus/registry.examples/s-033-non-matching-category-returns-false-with-combined-filters.sdp.md delete mode 100644 specs/behavior/platform-core/events/builder.examples/s-001-generates-event-id-with-bounded-context-prefix.sdp.md delete mode 100644 specs/behavior/platform-core/events/builder.examples/s-002-copies-all-core-fields-correctly.sdp.md delete mode 100644 specs/behavior/platform-core/events/builder.examples/s-003-copies-payload-correctly.sdp.md delete mode 100644 specs/behavior/platform-core/events/builder.examples/s-004-includes-correlation-id-and-causation-id-in-metadata.sdp.md delete mode 100644 specs/behavior/platform-core/events/builder.examples/s-005-generates-different-event-ids-for-different-bounded-contexts.sdp.md delete mode 100644 specs/behavior/platform-core/events/builder.examples/s-006-returns-complete-new-event-data-structure.sdp.md delete mode 100644 specs/behavior/platform-core/events/builder.examples/s-007-uses-provided-event-id-without-generating-a-new-one.sdp.md delete mode 100644 specs/behavior/platform-core/events/builder.examples/s-008-extracts-bounded-context-from-event-id-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/events/builder.examples/s-009-uses-provided-bounded-context-when-explicitly-set.sdp.md delete mode 100644 specs/behavior/platform-core/events/builder.examples/s-010-uses-full-event-id-as-bounded-context-when-no-underscore-present.sdp.md delete mode 100644 specs/behavior/platform-core/events/builder.examples/s-011-copies-all-other-fields-correctly-with-pre-generated-event-id.sdp.md delete mode 100644 specs/behavior/platform-core/events/builder.examples/s-012-handles-event-id-with-multiple-underscores-correctly.sdp.md delete mode 100644 specs/behavior/platform-core/events/builder.examples/s-013-returns-complete-new-event-data-structure-with-pre-generated-event-id.sdp.md delete mode 100644 specs/behavior/platform-core/events/category.examples/s-001-event-categories-has-exactly-four-entries-in-the-correct-order.sdp.md delete mode 100644 specs/behavior/platform-core/events/category.examples/s-002-schema-accepts-valid-category-strings.sdp.md delete mode 100644 specs/behavior/platform-core/events/category.examples/s-003-schema-rejects-invalid-category-values.sdp.md delete mode 100644 specs/behavior/platform-core/events/category.examples/s-004-default-event-category-is-domain.sdp.md delete mode 100644 specs/behavior/platform-core/events/category.examples/s-005-default-schema-version-is-1.sdp.md delete mode 100644 specs/behavior/platform-core/events/category.examples/s-006-type-guard-accepts-all-valid-categories.sdp.md delete mode 100644 specs/behavior/platform-core/events/category.examples/s-007-type-guard-rejects-invalid-values.sdp.md delete mode 100644 specs/behavior/platform-core/events/category.examples/s-008-valid-categories-are-returned-unchanged.sdp.md delete mode 100644 specs/behavior/platform-core/events/category.examples/s-009-invalid-values-normalize-to-domain.sdp.md delete mode 100644 specs/behavior/platform-core/events/category.examples/s-010-positive-integers-are-returned-unchanged.sdp.md delete mode 100644 specs/behavior/platform-core/events/category.examples/s-011-invalid-values-normalize-to-1.sdp.md delete mode 100644 specs/behavior/platform-core/events/category.examples/s-012-classification-of-categories-as-external-or-internal.sdp.md delete mode 100644 specs/behavior/platform-core/events/category.examples/s-013-classification-of-categories-as-cross-context.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-001-valid-event-metadata-is-accepted-and-fields-are-preserved.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-002-missing-required-fields-are-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-003-partial-metadata-with-only-event-id-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-004-optional-causation-id-is-supported.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-005-invalid-version-values-are-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-006-zero-global-position-is-accepted.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-007-enhanced-metadata-includes-category-and-schema-version.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-008-category-defaults-to-domain-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-009-schema-version-defaults-to-1-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-010-all-valid-categories-are-accepted.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-011-invalid-categories-are-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-012-schema-accepts-events-with-matching-event-type-and-valid-payload.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-013-schema-rejects-events-with-wrong-event-type.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-014-schema-validates-payload-constraints.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-015-optional-metadata-field-is-supported.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-016-domain-event-schema-sets-category-to-domain.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-017-category-defaults-to-domain-when-not-in-input.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-018-schema-version-defaults-to-1-when-not-in-config.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-019-custom-schema-version-in-config-is-enforced.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-020-wrong-schema-version-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-021-integration-event-schema-sets-category-to-integration.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-022-category-defaults-to-integration-when-not-in-input.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-023-schema-version-defaults-to-1-for-integration-events.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-024-trigger-event-schema-sets-category-to-trigger-with-entity-id-payload.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-025-trigger-event-rejects-missing-entity-id.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-026-category-defaults-to-trigger-when-not-in-input.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-027-custom-schema-version-for-trigger-events.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-028-fat-event-schema-sets-category-to-fat-with-full-payload.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-029-category-defaults-to-fat-when-not-in-input.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-030-complex-nested-payload-with-valid-positive-value.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-031-complex-nested-payload-rejects-negative-value.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-032-custom-schema-version-for-fat-events.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-033-domain-event-schema-accepts-any-payload-shape.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-034-enhanced-domain-event-schema-includes-defaults.sdp.md delete mode 100644 specs/behavior/platform-core/events/schemas.examples/s-035-enhanced-domain-event-schema-allows-optional-metadata.sdp.md delete mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-001-event-at-current-version-is-returned-as-is.sdp.md delete mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-002-event-is-migrated-from-v1-to-v2.sdp.md delete mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-003-event-is-migrated-from-v1-to-v3.sdp.md delete mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-004-incomplete-migration-chain-throws-at-creation-time.sdp.md delete mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-005-future-schema-version-throws-future-version-error.sdp.md delete mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-006-validation-passes-after-migration.sdp.md delete mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-007-validation-fails-after-migration.sdp.md delete mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-008-registry-reports-registered-and-unregistered-event-types.sdp.md delete mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-009-registry-returns-all-registered-event-types.sdp.md delete mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-010-second-registration-overrides-the-first.sdp.md delete mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-011-registered-event-type-is-upcasted.sdp.md delete mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-012-unregistered-event-type-is-returned-as-is.sdp.md delete mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-013-static-default-value-is-added.sdp.md delete mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-014-computed-default-value-is-added-from-event-timestamp.sdp.md delete mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-015-field-is-renamed-in-the-payload.sdp.md delete mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-016-error-has-correct-name-code-and-message.sdp.md delete mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-017-error-stores-context-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-018-error-has-undefined-context-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-019-error-is-instanceof-error.sdp.md delete mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-020-error-preserves-specific-code-values.sdp.md delete mode 100644 specs/behavior/platform-core/events/upcaster.examples/s-021-error-preserves-custom-message.sdp.md delete mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md delete mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-002-fsm-preserves-the-definition.sdp.md delete mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-003-valid-transitions-return-true.sdp.md delete mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-004-invalid-transitions-return-false.sdp.md delete mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-005-standalone-can-transition-function-works.sdp.md delete mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-006-valid-transitions-do-not-throw.sdp.md delete mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-007-invalid-transition-throws-fsm-transition-error.sdp.md delete mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-008-fsm-transition-error-includes-transition-details.sdp.md delete mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-009-standalone-assert-transition-function-works.sdp.md delete mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-010-returns-valid-transitions-for-each-state.sdp.md delete mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-011-standalone-valid-transitions-function-works.sdp.md delete mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-012-terminal-states-are-identified.sdp.md delete mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-013-non-terminal-states-are-identified.sdp.md delete mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-014-standalone-is-terminal-function-works.sdp.md delete mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-015-valid-states-return-true.sdp.md delete mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-016-invalid-states-return-false.sdp.md delete mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-017-standalone-is-valid-state-function-works.sdp.md delete mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-018-error-has-correct-properties.sdp.md delete mode 100644 specs/behavior/platform-core/fsm/fsm.examples/s-019-error-handles-terminal-states-in-message.sdp.md delete mode 100644 specs/behavior/platform-core/handlers/result.examples/s-001-success-result-has-correct-structure.sdp.md delete mode 100644 specs/behavior/platform-core/handlers/result.examples/s-002-success-result-preserves-typed-data.sdp.md delete mode 100644 specs/behavior/platform-core/handlers/result.examples/s-003-success-result-returns-status-as-literal-type.sdp.md delete mode 100644 specs/behavior/platform-core/handlers/result.examples/s-004-rejected-result-has-code-and-reason.sdp.md delete mode 100644 specs/behavior/platform-core/handlers/result.examples/s-005-rejected-result-includes-context-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/handlers/result.examples/s-006-rejected-result-omits-context-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/handlers/result.examples/s-007-rejected-result-returns-status-as-literal-type.sdp.md delete mode 100644 specs/behavior/platform-core/handlers/result.examples/s-008-failed-result-has-event-data.sdp.md delete mode 100644 specs/behavior/platform-core/handlers/result.examples/s-009-failed-result-includes-expected-version-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/handlers/result.examples/s-010-failed-result-includes-context-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/handlers/result.examples/s-011-failed-result-includes-both-expected-version-and-context.sdp.md delete mode 100644 specs/behavior/platform-core/handlers/result.examples/s-012-failed-result-omits-optional-properties-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/handlers/result.examples/s-013-failed-result-returns-status-as-literal-type.sdp.md delete mode 100644 specs/behavior/platform-core/ids/branded.examples/s-001-factory-functions-produce-branded-i-ds-preserving-the-input-value.sdp.md delete mode 100644 specs/behavior/platform-core/ids/branded.examples/s-002-branded-i-ds-are-assignable-to-plain-string-variables.sdp.md delete mode 100644 specs/behavior/platform-core/ids/branded.examples/s-003-branded-i-ds-support-standard-string-methods.sdp.md delete mode 100644 specs/behavior/platform-core/ids/branded.examples/s-004-generators-produce-correctly-prefixed-branded-i-ds.sdp.md delete mode 100644 specs/behavior/platform-core/ids/branded.examples/s-005-command-and-correlation-generators-produce-valid-uuid-v7-after-prefix.sdp.md delete mode 100644 specs/behavior/platform-core/ids/branded.examples/s-006-is-valid-id-string-returns-true-for-non-empty-strings.sdp.md delete mode 100644 specs/behavior/platform-core/ids/branded.examples/s-007-is-valid-id-string-returns-false-for-empty-string.sdp.md delete mode 100644 specs/behavior/platform-core/ids/branded.examples/s-008-is-valid-id-string-returns-false-for-non-string-values.sdp.md delete mode 100644 specs/behavior/platform-core/ids/branded.examples/s-009-is-valid-id-string-narrows-type-for-type-script.sdp.md delete mode 100644 specs/behavior/platform-core/ids/branded.examples/s-010-n-100-generated-command-ids-are-all-unique.sdp.md delete mode 100644 specs/behavior/platform-core/ids/branded.examples/s-011-n-100-generated-correlation-ids-are-all-unique.sdp.md delete mode 100644 specs/behavior/platform-core/ids/generator.examples/s-001-generated-id-matches-the-expected-format.sdp.md delete mode 100644 specs/behavior/platform-core/ids/generator.examples/s-002-each-call-produces-a-unique-id.sdp.md delete mode 100644 specs/behavior/platform-core/ids/generator.examples/s-003-generated-id-starts-with-the-provided-context-and-type.sdp.md delete mode 100644 specs/behavior/platform-core/ids/generator.examples/s-004-lowercase-alphanumeric-values-are-accepted-for-context-and-type.sdp.md delete mode 100644 specs/behavior/platform-core/ids/generator.examples/s-005-empty-context-or-type-throws-an-error.sdp.md delete mode 100644 specs/behavior/platform-core/ids/generator.examples/s-006-context-with-disallowed-characters-throws-an-error.sdp.md delete mode 100644 specs/behavior/platform-core/ids/generator.examples/s-007-type-with-underscore-throws-an-error.sdp.md delete mode 100644 specs/behavior/platform-core/ids/generator.examples/s-008-a-well-formed-id-is-parsed-into-its-components.sdp.md delete mode 100644 specs/behavior/platform-core/ids/generator.examples/s-009-an-id-produced-by-generate-id-is-parseable.sdp.md delete mode 100644 specs/behavior/platform-core/ids/generator.examples/s-010-uuid-portion-containing-underscores-is-preserved.sdp.md delete mode 100644 specs/behavior/platform-core/ids/generator.examples/s-011-i-ds-with-fewer-than-three-parts-return-null.sdp.md delete mode 100644 specs/behavior/platform-core/ids/generator.examples/s-012-i-ds-with-empty-context-or-type-return-null.sdp.md delete mode 100644 specs/behavior/platform-core/ids/generator.examples/s-013-correlation-id-has-the-expected-format-and-is-unique-per-call.sdp.md delete mode 100644 specs/behavior/platform-core/ids/generator.examples/s-014-command-id-has-the-expected-format-and-is-unique-per-call.sdp.md delete mode 100644 specs/behavior/platform-core/ids/generator.examples/s-015-event-id-has-the-expected-format-and-uses-the-provided-context.sdp.md delete mode 100644 specs/behavior/platform-core/ids/generator.examples/s-016-event-i-ds-are-unique-per-call.sdp.md delete mode 100644 specs/behavior/platform-core/ids/generator.examples/s-017-empty-context-throws-an-error.sdp.md delete mode 100644 specs/behavior/platform-core/ids/generator.examples/s-018-integration-event-id-has-the-expected-format-and-is-unique-per-call.sdp.md delete mode 100644 specs/behavior/platform-core/ids/generator.examples/s-019-uuid-portion-has-version-7-indicator.sdp.md delete mode 100644 specs/behavior/platform-core/ids/generator.examples/s-020-ten-sequential-i-ds-are-lexicographically-sorted.sdp.md delete mode 100644 specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-001-define-acl-for-payment-gateway.sdp.md delete mode 100644 specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-002-acl-translates-field-names.sdp.md delete mode 100644 specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-003-acl-transforms-field-values.sdp.md delete mode 100644 specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-004-acl-translates-domain-to-external.sdp.md delete mode 100644 specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-005-round-trip-translation-preserves-data.sdp.md delete mode 100644 specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-006-missing-required-external-field.sdp.md delete mode 100644 specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-007-invalid-external-field-type.sdp.md delete mode 100644 specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-008-unknown-external-status.sdp.md delete mode 100644 specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-009-multiple-payment-gateways-with-different-schemas.sdp.md delete mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-001-register-upstream-downstream-relationship.sdp.md delete mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-002-register-customer-supplier-relationship.sdp.md delete mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-003-register-conformist-relationship.sdp.md delete mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-004-register-acl-relationship.sdp.md delete mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-005-register-partnership-relationship.sdp.md delete mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-006-register-shared-kernel-relationship.sdp.md delete mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-007-register-open-host-service-relationship.sdp.md delete mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-008-query-all-relationships-for-a-bc.sdp.md delete mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-009-query-upstream-b-cs.sdp.md delete mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-010-query-bc-with-no-relationships.sdp.md delete mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-011-duplicate-relationship-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/integration/context-map.examples/s-012-self-referential-relationship-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-001-generate-sample-from-schema.sdp.md delete mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-002-generate-sample-with-overrides.sdp.md delete mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-003-generate-multiple-samples.sdp.md delete mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-004-producer-emits-valid-event.sdp.md delete mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-005-producer-emits-invalid-event.sdp.md delete mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-006-producer-emits-wrong-version.sdp.md delete mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-007-consumer-processes-valid-event.sdp.md delete mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-008-consumer-handles-all-sample-variations.sdp.md delete mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-009-consumer-rejects-valid-event.sdp.md delete mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-010-compatible-producer-and-consumer.sdp.md delete mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-011-incompatible-versions-detected.sdp.md delete mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-012-compatible-with-downcaster.sdp.md delete mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-013-contract-violation-is-recorded.sdp.md delete mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-014-query-contract-violations.sdp.md delete mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-015-query-violations-since-timestamp.sdp.md delete mode 100644 specs/behavior/platform-core/integration/contract-testing.examples/s-016-no-violations-returns-empty-array.sdp.md delete mode 100644 specs/behavior/platform-core/integration/event-versioning.examples/s-001-upcast-v1-event-to-v2.sdp.md delete mode 100644 specs/behavior/platform-core/integration/event-versioning.examples/s-002-chain-upcasters-for-multiple-versions.sdp.md delete mode 100644 specs/behavior/platform-core/integration/event-versioning.examples/s-003-upcast-adds-computed-field.sdp.md delete mode 100644 specs/behavior/platform-core/integration/event-versioning.examples/s-004-downcast-v2-event-to-v1.sdp.md delete mode 100644 specs/behavior/platform-core/integration/event-versioning.examples/s-005-downcast-removes-required-in-new-field.sdp.md delete mode 100644 specs/behavior/platform-core/integration/event-versioning.examples/s-006-register-schema-with-migration.sdp.md delete mode 100644 specs/behavior/platform-core/integration/event-versioning.examples/s-007-missing-migration-path.sdp.md delete mode 100644 specs/behavior/platform-core/integration/event-versioning.examples/s-008-breaking-change-without-migration.sdp.md delete mode 100644 specs/behavior/platform-core/integration/event-versioning.examples/s-009-detect-version-from-event-metadata.sdp.md delete mode 100644 specs/behavior/platform-core/integration/event-versioning.examples/s-010-infer-version-from-payload-shape.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-001-create-publisher-with-empty-routes.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-002-create-publisher-with-one-route.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-003-reject-duplicate-source-event-type-routes.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-004-check-route-existence-for-registered-and-unregistered-types.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-005-retrieve-all-registered-routes.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-006-return-null-when-no-route-matches.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-007-translate-and-publish-a-domain-event.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-008-enqueue-multiple-handlers.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-009-verify-integration-event-metadata-fields.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-010-include-user-id-when-present-in-chain.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-011-omit-user-id-when-absent-from-chain.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-012-pass-on-complete-handler-to-workpool.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-013-propagate-translator-error.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-014-verify-workpool-context-fields.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-015-build-a-route-with-all-required-fields.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-016-set-schema-version-via-version-method.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-017-pass-multiple-handlers-to-notify.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-018-translator-function-transforms-source-event.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-019-reject-missing-source-event-type.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-020-reject-missing-target-event-type.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-021-reject-missing-translator.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-022-reject-missing-handlers.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-023-build-route-via-define-integration-route-factory.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-024-create-publisher-via-factory-function.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-025-verify-integration-route-error-properties.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-026-verify-integration-route-error-with-context.sdp.md delete mode 100644 specs/behavior/platform-core/integration/integration-event-publisher.examples/s-027-verify-integration-route-error-instanceof-chain.sdp.md delete mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-001-register-integration-event-schema.sdp.md delete mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-002-register-multiple-versions.sdp.md delete mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-003-duplicate-version-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-004-convert-domain-event-to-integration-event.sdp.md delete mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-005-convert-with-explicit-version.sdp.md delete mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-006-unregistered-event-type-fails.sdp.md delete mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-007-invalid-payload-fails-schema-validation.sdp.md delete mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-008-event-tagging-for-routing-and-dcb.sdp.md delete mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-009-multiple-tags-for-routing.sdp.md delete mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-010-register-schema-with-compatibility-mode.sdp.md delete mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-011-query-schema-compatibility-mode.sdp.md delete mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-012-list-all-event-types.sdp.md delete mode 100644 specs/behavior/platform-core/integration/published-language.examples/s-013-list-versions-for-event-type.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-001-set-contains-all-provided-invariants.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-002-invariants-array-is-immutable-and-a-frozen-copy.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-003-check-all-returns-true-when-all-invariants-pass.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-004-check-all-returns-false-when-first-invariant-fails.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-005-check-all-returns-false-when-second-invariant-fails.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-006-check-all-returns-false-when-all-invariants-fail.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-007-assert-all-does-not-throw-when-all-invariants-pass.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-008-assert-all-throws-on-first-failure-with-fail-fast.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-009-assert-all-throws-correct-error-class.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-010-assert-all-throws-error-with-context-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-011-validate-all-returns-valid-when-all-invariants-pass.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-012-validate-all-collects-single-violation.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-013-validate-all-collects-multiple-violations-without-short-circuiting.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-014-validate-all-collects-violations-from-non-adjacent-invariants.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-015-validate-all-omits-context-when-invariant-has-no-context-function.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-016-empty-set-passes-all-operations.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant-set.examples/s-017-single-invariant-set-passes-all-operations-with-valid-state.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-001-invariant-has-correct-name-and-code.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-002-check-returns-true-when-state-satisfies-the-predicate.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-003-check-returns-false-when-state-violates-the-predicate.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-004-assert-does-not-throw-when-state-is-valid.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-005-assert-throws-invariant-error-when-state-is-invalid.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-006-assert-error-has-correct-code-for-invalid-state.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-007-assert-error-has-correct-message-for-invalid-state.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-008-assert-error-has-correct-context-for-invalid-state.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-009-validate-returns-valid-result-for-valid-state.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-010-validate-returns-violation-details-for-invalid-state.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-011-assert-error-has-undefined-context-when-no-context-function.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-012-validate-result-has-undefined-context-when-no-context-function.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-013-check-uses-parameter-to-find-matching-item.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-014-check-returns-false-when-parameter-does-not-match.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-015-assert-uses-parameter-in-error-message-and-context.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-016-validate-uses-parameter-in-result.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/create-invariant.examples/s-017-assert-throws-error-of-the-correct-custom-class.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-001-creating-an-error-with-code-and-message.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-002-including-context-when-provided.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-003-context-is-undefined-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-004-error-has-proper-stack-trace.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-005-creating-a-context-specific-error-class.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-006-different-contexts-produce-different-classes.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-007-typed-error-codes-are-supported.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-008-context-specific-errors-include-context-data.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-009-context-specific-class-has-proper-constructor-name.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-010-returns-true-for-invariant-error-instances.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-011-returns-true-for-context-specific-error-instances.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-012-returns-false-for-regular-error-instances.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-013-returns-false-for-non-error-values.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-014-returns-true-when-error-has-the-specified-code.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-015-returns-false-when-error-has-a-different-code.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-016-returns-false-for-non-invariant-error-values.sdp.md delete mode 100644 specs/behavior/platform-core/invariants/invariant-error.examples/s-017-works-with-context-specific-errors.sdp.md delete mode 100644 specs/behavior/platform-core/logging/commands.examples/s-001-command-start-is-logged-at-info-level.sdp.md delete mode 100644 specs/behavior/platform-core/logging/commands.examples/s-002-entity-specific-fields-are-included-in-start-log-data.sdp.md delete mode 100644 specs/behavior/platform-core/logging/commands.examples/s-003-command-success-is-logged-at-info-level-with-result.sdp.md delete mode 100644 specs/behavior/platform-core/logging/commands.examples/s-004-context-fields-are-preserved-alongside-result-fields.sdp.md delete mode 100644 specs/behavior/platform-core/logging/commands.examples/s-005-command-rejection-is-logged-at-warn-level.sdp.md delete mode 100644 specs/behavior/platform-core/logging/commands.examples/s-006-rejection-uses-prefixed-field-names-not-raw-code-message.sdp.md delete mode 100644 specs/behavior/platform-core/logging/commands.examples/s-007-business-failure-is-logged-at-warn-level.sdp.md delete mode 100644 specs/behavior/platform-core/logging/commands.examples/s-008-business-failure-uses-failure-reason-not-reason.sdp.md delete mode 100644 specs/behavior/platform-core/logging/commands.examples/s-009-error-object-is-logged-at-error-level-with-message-and-stack.sdp.md delete mode 100644 specs/behavior/platform-core/logging/commands.examples/s-010-string-error-is-logged-directly.sdp.md delete mode 100644 specs/behavior/platform-core/logging/commands.examples/s-011-non-string-non-error-values-are-stringified.sdp.md delete mode 100644 specs/behavior/platform-core/logging/commands.examples/s-012-null-error-is-stringified.sdp.md delete mode 100644 specs/behavior/platform-core/logging/commands.examples/s-013-undefined-error-is-stringified.sdp.md delete mode 100644 specs/behavior/platform-core/logging/commands.examples/s-014-stack-trace-is-preserved-for-debugging.sdp.md delete mode 100644 specs/behavior/platform-core/logging/commands.examples/s-015-full-success-lifecycle-produces-start-and-success-logs.sdp.md delete mode 100644 specs/behavior/platform-core/logging/commands.examples/s-016-rejection-lifecycle-produces-info-and-warn-logs.sdp.md delete mode 100644 specs/behavior/platform-core/logging/commands.examples/s-017-error-lifecycle-produces-info-and-error-logs.sdp.md delete mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-001-messages-are-prefixed-with-scope.sdp.md delete mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-002-data-object-is-appended-as-json.sdp.md delete mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-003-empty-data-object-is-omitted-from-output.sdp.md delete mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-004-debug-level-allows-debug-messages.sdp.md delete mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-005-info-level-suppresses-debug-messages.sdp.md delete mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-006-info-level-allows-info-messages.sdp.md delete mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-007-info-level-allows-warn-messages.sdp.md delete mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-008-error-level-allows-error-messages.sdp.md delete mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-009-default-level-is-info-when-not-specified.sdp.md delete mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-010-each-log-level-uses-its-corresponding-console-method.sdp.md delete mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-011-report-level-outputs-structured-json-via-console-log.sdp.md delete mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-012-timing-start-uses-console-time.sdp.md delete mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-013-timing-end-uses-console-time-end.sdp.md delete mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-014-regular-trace-without-timing-uses-console-debug.sdp.md delete mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-015-no-op-logger-does-not-call-any-console-methods.sdp.md delete mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-016-no-op-logger-implements-the-full-logger-interface.sdp.md delete mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-017-child-logger-prefixes-with-combined-scope.sdp.md delete mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-018-child-logger-respects-provided-log-level.sdp.md delete mode 100644 specs/behavior/platform-core/logging/scoped.examples/s-019-child-logger-defaults-to-info-level.sdp.md delete mode 100644 specs/behavior/platform-core/logging/testing.examples/s-001-all-six-log-method-calls-are-captured.sdp.md delete mode 100644 specs/behavior/platform-core/logging/testing.examples/s-002-each-call-records-the-correct-log-level.sdp.md delete mode 100644 specs/behavior/platform-core/logging/testing.examples/s-003-message-text-is-captured-correctly.sdp.md delete mode 100644 specs/behavior/platform-core/logging/testing.examples/s-004-structured-data-is-captured-correctly.sdp.md delete mode 100644 specs/behavior/platform-core/logging/testing.examples/s-005-data-is-undefined-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/logging/testing.examples/s-006-timestamp-is-captured-within-bounds.sdp.md delete mode 100644 specs/behavior/platform-core/logging/testing.examples/s-007-clearing-resets-calls-to-empty.sdp.md delete mode 100644 specs/behavior/platform-core/logging/testing.examples/s-008-calls-are-filtered-by-level-correctly.sdp.md delete mode 100644 specs/behavior/platform-core/logging/testing.examples/s-009-partial-and-exact-message-matching.sdp.md delete mode 100644 specs/behavior/platform-core/logging/testing.examples/s-010-exact-message-match-works.sdp.md delete mode 100644 specs/behavior/platform-core/logging/testing.examples/s-011-level-and-message-must-both-match.sdp.md delete mode 100644 specs/behavior/platform-core/logging/testing.examples/s-012-returns-the-last-call-at-a-given-level.sdp.md delete mode 100644 specs/behavior/platform-core/logging/testing.examples/s-013-returns-undefined-when-no-calls-at-level.sdp.md delete mode 100644 specs/behavior/platform-core/logging/testing.examples/s-014-multiple-accesses-return-equal-arrays.sdp.md delete mode 100644 specs/behavior/platform-core/logging/testing.examples/s-015-info-minimum-captures-info-report-warn-error-only.sdp.md delete mode 100644 specs/behavior/platform-core/logging/testing.examples/s-016-debug-minimum-captures-all-6-levels.sdp.md delete mode 100644 specs/behavior/platform-core/logging/testing.examples/s-017-error-minimum-captures-only-error.sdp.md delete mode 100644 specs/behavior/platform-core/logging/testing.examples/s-018-warn-minimum-captures-warn-and-error.sdp.md delete mode 100644 specs/behavior/platform-core/logging/testing.examples/s-019-clear-resets-filtered-calls.sdp.md delete mode 100644 specs/behavior/platform-core/logging/testing.examples/s-020-has-logged-message-only-searches-filtered-calls.sdp.md delete mode 100644 specs/behavior/platform-core/logging/types.examples/s-001-priority-values-increase-from-debug-to-error.sdp.md delete mode 100644 specs/behavior/platform-core/logging/types.examples/s-002-all-6-log-levels-are-defined-as-numbers.sdp.md delete mode 100644 specs/behavior/platform-core/logging/types.examples/s-003-default-log-level-is-info.sdp.md delete mode 100644 specs/behavior/platform-core/logging/types.examples/s-004-messages-at-or-above-info-level-pass-the-filter.sdp.md delete mode 100644 specs/behavior/platform-core/logging/types.examples/s-005-messages-below-info-level-are-filtered-out.sdp.md delete mode 100644 specs/behavior/platform-core/logging/types.examples/s-006-debug-configured-level-allows-all-messages.sdp.md delete mode 100644 specs/behavior/platform-core/logging/types.examples/s-007-error-configured-level-only-allows-error.sdp.md delete mode 100644 specs/behavior/platform-core/logging/types.examples/s-008-warn-configured-level-allows-warn-and-error-only.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-001-adding-middleware-increases-size-and-returns-pipeline-for-chaining.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-002-removing-an-existing-middleware-returns-true-and-decreases-size.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-003-removing-a-non-existent-middleware-returns-false.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-004-has-returns-true-for-existing-middleware.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-005-has-returns-false-for-non-existent-middleware.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-006-names-are-returned-sorted-by-order.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-007-handler-executes-directly-with-empty-pipeline.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-008-before-hooks-run-in-order-10-then-20.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-009-after-hooks-run-in-order-20-then-10.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-010-short-circuit-prevents-subsequent-middleware-execution.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-011-enricher-middleware-passes-custom-context-to-subsequent-middleware.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-012-throwing-before-hook-produces-middleware-error.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-013-throwing-handler-produces-handler-error.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-014-failing-after-hook-does-not-prevent-other-after-hooks.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-015-only-pre-short-circuit-middleware-after-hooks-run.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-016-clear-empties-the-pipeline.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-017-clone-has-same-middlewares-but-is-independent.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-018-factory-creates-pipeline-without-options.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-019-factory-creates-pipeline-with-debug-option.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-001-structure-validation-has-correct-order.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-002-valid-payload-passes-structure-validation.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-003-invalid-payload-is-rejected-by-structure-validation.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-004-unregistered-command-skips-structure-validation.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-005-registry-validation-validates-against-registry-schema.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-006-registry-validation-skips-unregistered-commands.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-007-domain-validation-has-correct-order.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-008-domain-validation-passes-when-validator-returns-undefined.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-009-domain-validation-rejects-when-validator-returns-error-message.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-010-domain-validation-skips-commands-without-validators.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-011-combined-validators-return-first-error.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-012-combined-validators-return-undefined-when-all-pass.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-013-required-string-validates-non-empty-strings.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-014-positive-number-validates-positive-numbers.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-015-number-range-validates-within-range.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-016-starts-with-prefix-validates-prefix.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-017-authorization-has-correct-order.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-018-authorization-allows-when-checker-returns-allowed-true.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-019-authorization-rejects-when-checker-returns-allowed-false.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-020-authorization-skips-configured-commands.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-021-role-based-checker-allows-user-with-required-role.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-022-role-based-checker-rejects-user-without-required-role.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-023-role-based-checker-requires-authentication.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-024-role-based-checker-allows-when-no-roles-specified.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-025-logging-has-correct-order.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-026-logging-middleware-logs-before-and-after-execution.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-027-logging-middleware-logs-errors-for-failed-commands.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-028-no-op-logger-does-not-throw-on-any-level.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-029-json-logger-outputs-correctly-formatted-logs.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-030-json-logger-includes-timestamp-when-configured.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-031-rate-limit-has-correct-order.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-032-rate-limit-allows-when-not-exceeded.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-033-rate-limit-rejects-when-exceeded.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-034-rate-limit-skips-configured-commands.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-035-by-user-id-generates-correct-key.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-036-by-user-id-handles-anonymous-users.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-037-by-command-type-generates-correct-key.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-038-by-user-and-command-generates-composite-key.sdp.md delete mode 100644 specs/behavior/platform-core/middleware/middlewares.examples/s-039-all-middleware-orders-follow-correct-sequence.sdp.md delete mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-001-operation-executes-normally-and-returns-result.sdp.md delete mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-002-circuit-remains-closed-after-a-single-failure.sdp.md delete mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-003-circuit-opens-after-default-failure-threshold-of-5-failures.sdp.md delete mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-004-circuit-transitions-to-half-open-after-timeout.sdp.md delete mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-005-circuit-closes-on-success-in-half-open-state.sdp.md delete mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-006-circuit-re-opens-on-failure-in-half-open-state.sdp.md delete mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-007-requires-3-consecutive-successes-in-half-open-to-close-circuit.sdp.md delete mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-008-returns-closed-for-unknown-circuit.sdp.md delete mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-009-reflects-current-state-after-a-successful-operation.sdp.md delete mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-010-reset-clears-an-open-circuit-back-to-closed.sdp.md delete mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-011-respects-custom-failure-threshold.sdp.md delete mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-012-respects-custom-timeout.sdp.md delete mode 100644 specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-013-failure-count-resets-on-success-in-closed-state.sdp.md delete mode 100644 specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-001-wraps-partition-key-in-structured-field-for-primary-projection.sdp.md delete mode 100644 specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-002-wraps-partition-key-in-structured-field-for-secondary-projections.sdp.md delete mode 100644 specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-003-wraps-partition-key-in-structured-field-for-failed-projection.sdp.md delete mode 100644 specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-004-routes-saga-work-to-saga-pool-only.sdp.md delete mode 100644 specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-001-successful-cross-context-coordination.sdp.md delete mode 100644 specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-002-compensation-on-step-failure.sdp.md delete mode 100644 specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-003-workflow-resumes-from-the-last-completed-step-after-restart.sdp.md delete mode 100644 specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-004-compensation-executes-in-reverse-order-of-completed-steps.sdp.md delete mode 100644 specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-005-first-trigger-starts-saga.sdp.md delete mode 100644 specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-006-duplicate-trigger-returns-existing-saga.sdp.md delete mode 100644 specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-007-on-complete-updates-saga-status-after-workflow-finishes.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-001-executor-exposes-pm-name-and-event-subscriptions.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-002-handles-returns-true-for-subscribed-and-false-for-unsubscribed-events.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-003-processes-event-and-emits-commands.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-004-skips-unsubscribed-event-with-not-subscribed-reason.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-005-passes-custom-state-to-handler.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-006-uses-stream-id-as-default-instance-id.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-007-uses-custom-instance-id-resolver.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-008-returns-failed-status-when-handler-throws.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-009-returns-failed-status-when-command-emitter-throws.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-010-returns-all-pm-names.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-011-finds-executors-by-event-type.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-012-processes-event-through-all-matching-executors.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-013-returns-empty-array-for-unsubscribed-event.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-014-processes-single-matching-executor.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-015-isolates-exceptions-so-other-executors-still-run.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/executor.examples/s-016-handles-empty-executors-array.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-001-idle-state-allows-start.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-002-idle-state-rejects-invalid-events.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-003-processing-state-allows-success-and-fail.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-004-processing-state-rejects-invalid-events.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-005-completed-state-allows-reset.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-006-completed-state-rejects-invalid-events.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-007-failed-state-allows-retry-and-reset.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-008-failed-state-rejects-invalid-events.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-009-valid-transitions-return-correct-target-state.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-011-idle-state-has-exactly-one-valid-event.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-012-processing-state-has-exactly-two-valid-events.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-013-completed-state-has-exactly-one-valid-event.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-014-failed-state-has-exactly-two-valid-events.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-015-returns-exactly-6-transitions-with-correct-properties.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-016-all-expected-transitions-are-present.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-017-returns-same-array-reference-on-repeated-calls.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-018-valid-transition-returns-new-state.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-019-invalid-transition-throws-with-pm-name-and-instance-id.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-020-completed-is-terminal.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-021-non-terminal-states-return-false.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-022-failed-is-an-error-state.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-023-non-error-states-return-false.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-024-all-non-terminal-states-have-at-least-one-valid-event.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-025-critical-reachability-paths-exist.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-026-happy-path-idle-to-processing-to-completed.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-027-failure-path-idle-to-processing-to-failed.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-028-retry-workflow-idle-to-processing-to-failed-to-processing-to-completed.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-029-time-triggered-pm-workflow-idle-to-processing-to-completed-to-idle.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/lifecycle.examples/s-030-failed-reset-workflow-idle-to-processing-to-failed-to-idle.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-001-register-a-single-process-manager.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-002-register-multiple-process-managers.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-003-duplicate-registration-throws-an-error.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-004-get-returns-pm-by-name.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-005-get-returns-undefined-for-unknown-pm.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-006-has-returns-true-for-registered-pm.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-007-has-returns-false-for-unregistered-pm.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-009-list-returns-all-registered-p-ms.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-011-size-reflects-registration-count.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-012-returns-pm-subscribed-to-a-specific-event.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-013-returns-pm-for-shared-event-across-hybrid-pm.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-014-returns-empty-for-unknown-event-type.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-015-returns-empty-for-event-matching-no-subscriptions.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-016-returns-empty-array-for-empty-registry.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-017-returns-unique-sorted-event-types.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-018-returns-empty-array-for-empty-registry-for-commands.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-019-returns-unique-sorted-command-types.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-020-filters-by-orders-context.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-021-filters-by-inventory-context.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-022-returns-empty-for-unknown-context.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-023-filters-by-event-trigger-type.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-024-filters-by-time-trigger-type.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-025-filters-by-hybrid-trigger-type.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-026-returns-time-and-hybrid-triggered-p-ms.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-027-excludes-event-only-triggered-p-ms.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-028-all-time-triggered-p-ms-have-cron-config.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-029-find-all-handlers-for-order-shipped-event.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-030-get-all-time-triggered-p-ms-for-cron-scheduling.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-031-pm-with-empty-subscriptions-and-commands-is-handled-correctly.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/registry.examples/s-032-mixed-p-ms-where-some-have-empty-arrays.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-001-no-correlation-strategy-uses-stream-id.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-002-correlation-property-is-extracted-from-payload.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-003-falls-back-to-stream-id-when-correlation-property-not-in-payload.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-004-falls-back-to-stream-id-when-correlation-property-is-not-a-string.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-005-falls-back-to-stream-id-when-correlation-property-is-null.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-006-falls-back-to-stream-id-when-correlation-property-is-undefined.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-007-empty-string-correlation-property-value-is-used-as-is.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-008-whitespace-only-correlation-property-value-is-used-as-is.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-009-order-id-correlation-strategy-extracts-correctly.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-010-subscription-name-without-context.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-011-subscription-name-with-context.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-012-default-priority-is-200.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-013-custom-priority-overrides-default.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-014-filters-by-event-types-from-pm-definition.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-015-creates-mutable-copy-of-event-types.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-016-default-to-handler-args-produces-correct-output.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-017-instance-id-from-correlation-strategy.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-018-custom-to-handler-args-transformer-is-used.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-019-default-partition-by-instance-id.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-020-correlation-strategy-affects-partition-key.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-021-custom-get-partition-key-is-used.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-022-handler-reference-is-passed-through.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-023-bulk-creation-produces-correct-subscription-names.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-024-missing-handler-throws-error.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-025-common-priority-applies-to-all-subscriptions.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-026-each-subscription-has-correct-event-filter.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-027-empty-definitions-produces-empty-subscriptions.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-028-handlers-match-their-definitions.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-029-default-priority-constant-is-200.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/subscription.examples/s-030-priority-is-after-projections-and-before-sagas.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-001-all-valid-pm-statuses-are-accepted.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-002-every-entry-in-process-manager-statuses-passes-the-guard.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-003-invalid-status-strings-are-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-004-non-string-values-are-rejected-by-is-process-manager-status.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-005-arrays-containing-valid-statuses-are-rejected-by-is-process-manager-status.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-006-is-process-manager-status-is-case-sensitive.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-007-type-narrowing-works-in-conditionals.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-008-type-guard-works-as-array-filter-predicate.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-009-process-manager-statuses-contains-exactly-4-statuses-in-order.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-010-process-manager-statuses-is-a-readonly-array-with-correct-bounds.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-011-process-manager-statuses-contains-all-lifecycle-states.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-012-process-manager-statuses-is-in-logical-lifecycle-order.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-013-all-valid-dead-letter-statuses-are-accepted.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-014-every-entry-in-dead-letter-statuses-passes-the-guard.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-015-invalid-status-strings-are-rejected-by-is-dead-letter-status.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-016-pm-statuses-are-rejected-by-is-dead-letter-status.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-017-non-string-values-are-rejected-by-is-dead-letter-status.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-018-arrays-containing-valid-dl-statuses-are-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-019-is-dead-letter-status-is-case-sensitive.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-020-dl-type-narrowing-works-in-conditionals.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-021-dl-type-guard-works-as-array-filter-predicate.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-022-dead-letter-statuses-contains-exactly-3-statuses-in-order.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-023-dead-letter-statuses-is-a-readonly-array-with-correct-bounds.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-024-dead-letter-statuses-contains-all-dead-letter-states.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-025-dead-letter-statuses-is-in-logical-workflow-order.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-026-full-dead-letter-with-all-fields-has-correct-structure.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-027-dead-letter-with-only-required-fields-has-undefined-optionals.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-028-dead-letter-supports-each-status-individually.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-029-failed-command-captures-command-type-and-complex-payload.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-030-failed-command-allows-empty-payload.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-031-dead-letter-handles-high-attempt-count.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-032-dead-letter-handles-long-error-messages.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/types.examples/s-033-dead-letter-handles-complex-context-objects.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-001-process-event-when-no-pm-state-exists.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-003-pm-state-is-updated-after-processing.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-006-skip-event-when-pm-is-in-completed-state.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-007-separate-instances-are-processed-independently.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-008-retry-succeeds-after-emit-commands-failure.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-009-retry-succeeds-when-pm-is-stuck-in-processing-state.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-010-reject-negative-global-position.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-011-global-position-zero-is-treated-as-already-processed.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-012-first-real-event-after-initialization-is-processed.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-013-dead-letter-recorded-when-process-throws.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-014-dead-letter-recorded-when-emit-commands-throws.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-015-commands-failed-counter-is-incremented-on-failure.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-016-commands-emitted-counter-tracks-multiple-commands.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-017-result-contains-emitted-command-types.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-018-empty-command-list-produces-no-op-processed-result.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-019-helper-processes-event-and-updates-state.sdp.md delete mode 100644 specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-020-helper-maintains-pm-idempotency-semantics.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-001-projection-rebuild-re-processes-events.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-002-dead-letter-retry-re-enqueues-event.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-003-event-flow-trace-returns-full-history.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-004-rebuild-status-shows-progress.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-005-bulk-dead-letter-retry-processes-all-pending.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-006-system-diagnostics-returns-comprehensive-state.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-001-circuit-opens-after-repeated-failures.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-002-circuit-transitions-to-half-open-after-timeout.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-003-successful-half-open-request-closes-circuit.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-004-failed-half-open-request-reopens-circuit.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-005-circuit-state-persists-across-function-invocations.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-006-multiple-circuit-breakers-operate-independently.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-001-trace-spans-command-to-projection-flow.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-002-missing-trace-context-uses-default.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-003-trace-context-is-preserved-in-event-metadata.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-004-multiple-projections-share-same-trace.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-001-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-002-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-003-closed-circuit-uses-action-retrier-with-configured-retries.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-004-dcb-conflict-triggers-workpool-based-retry.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-005-dcb-retry-respects-exponential-backoff-with-jitter.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-006-dcb-retry-uses-latest-version-after-conflict.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-007-dcb-retry-partition-key-prevents-concurrent-retries.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-008-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-009-failed-dlq-retry-returns-to-pending-status.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-010-successful-dlq-retry-marks-item-resolved.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-011-dlq-retry-tracks-retry-count.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-001-readiness-probe-checks-dependencies.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-002-unhealthy-dependency-fails-readiness.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-003-liveness-probe-always-succeeds.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-004-projection-lag-threshold-determines-health.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-005-health-response-includes-all-component-statuses.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-001-projection-lag-is-tracked.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-002-metrics-collection-handles-missing-checkpoints.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-003-event-throughput-is-calculated.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-004-dead-letter-queue-size-is-tracked.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-001-requests-within-rate-limit-succeed.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-002-requests-exceeding-rate-limit-are-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-003-token-bucket-refills-over-time.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-004-rate-limit-key-isolation-by-user.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-005-admin-rebuild-respects-hourly-limit.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-006-admin-rebuild-blocked-when-limit-exceeded.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-007-adapter-converts-component-response-to-rate-limit-result.sdp.md delete mode 100644 specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-008-adapter-handles-component-errors-gracefully.sdp.md delete mode 100644 specs/behavior/platform-core/projection-categories/category-definitions.examples/s-001-projection-categories-tuple-contains-all-valid-categories.sdp.md delete mode 100644 specs/behavior/platform-core/projection-categories/category-definitions.examples/s-002-is-projection-category-validates-category-strings.sdp.md delete mode 100644 specs/behavior/platform-core/projection-categories/category-definitions.examples/s-003-category-helper-functions-identify-correct-categories.sdp.md delete mode 100644 specs/behavior/platform-core/projection-categories/category-definitions.examples/s-004-is-client-exposed-returns-correct-exposure-status.sdp.md delete mode 100644 specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-001-missing-category-returns-category-required-error.sdp.md delete mode 100644 specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-002-null-category-returns-category-required-error.sdp.md delete mode 100644 specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-003-valid-category-passes-validation.sdp.md delete mode 100644 specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-004-assert-valid-category-returns-category-on-valid-input.sdp.md delete mode 100644 specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-005-invalid-category-returns-invalid-category-error.sdp.md delete mode 100644 specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-006-assert-valid-category-throws-on-invalid-input.sdp.md delete mode 100644 specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-001-get-by-category-returns-all-view-projections.sdp.md delete mode 100644 specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-002-get-by-category-returns-all-logic-projections.sdp.md delete mode 100644 specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-003-get-by-category-returns-all-reporting-projections.sdp.md delete mode 100644 specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-004-get-by-category-returns-all-integration-projections.sdp.md delete mode 100644 specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-005-get-by-category-returns-empty-array-for-category-with-no-projections.sdp.md delete mode 100644 specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-006-target-view-projections-for-reactive-layer.sdp.md delete mode 100644 specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-007-target-integration-projections-for-event-bus-routing.sdp.md delete mode 100644 specs/behavior/platform-core/projections/categories.examples/s-001-projection-category-schema-accepts-all-valid-categories.sdp.md delete mode 100644 specs/behavior/platform-core/projections/categories.examples/s-002-projection-category-schema-rejects-invalid-values.sdp.md delete mode 100644 specs/behavior/platform-core/projections/categories.examples/s-003-projection-category-schema-rejects-non-string-types.sdp.md delete mode 100644 specs/behavior/platform-core/projections/categories.examples/s-004-is-projection-category-rejects-objects.sdp.md delete mode 100644 specs/behavior/platform-core/projections/categories.examples/s-005-is-projection-category-rejects-arrays.sdp.md delete mode 100644 specs/behavior/platform-core/projections/categories.examples/s-006-is-projection-category-rejects-booleans.sdp.md delete mode 100644 specs/behavior/platform-core/projections/categories.examples/s-007-is-projection-category-rejects-whitespace-padded-strings.sdp.md delete mode 100644 specs/behavior/platform-core/projections/categories.examples/s-008-projection-validation-errors-has-expected-error-codes.sdp.md delete mode 100644 specs/behavior/platform-core/projections/categories.examples/s-009-validate-projection-category-rejects-non-string-types.sdp.md delete mode 100644 specs/behavior/platform-core/projections/categories.examples/s-010-assert-valid-category-throws-category-required-for-undefined.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-001-allowed-transitions-from-active-state.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-002-rejected-transitions-from-active-state.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-003-allowed-transitions-from-rebuilding-state.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-004-rejected-transitions-from-rebuilding-state.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-005-allowed-transitions-from-paused-state.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-006-rejected-transitions-from-paused-state.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-007-allowed-transitions-from-error-state.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-008-rejected-transitions-from-error-state.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-009-valid-transitions-produce-correct-target-states.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-011-valid-events-from-active-state.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-012-valid-events-from-rebuilding-state.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-013-valid-events-from-paused-state.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-014-valid-events-from-error-state.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-015-returns-all-10-valid-transitions-with-correct-structure.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-016-all-expected-transitions-are-included.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-017-returns-same-array-reference-memoized.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-018-returns-new-state-for-valid-transition.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-019-throws-for-invalid-transition-with-projection-name.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-020-all-states-are-reachable-from-at-least-one-other-state.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-021-all-states-have-at-least-one-outgoing-transition.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-022-recovery-path-exists-from-error-to-active.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-023-error-path-exists-from-active.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-024-rebuild-retry-path-exists-from-error.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-025-normal-processing-active-state-allows-fail-event.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-026-rebuild-workflow-active-to-rebuilding-to-active.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-027-error-recovery-workflow-active-to-error-to-active.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-028-error-rebuild-workflow-active-to-error-to-rebuilding-to-active.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-029-pause-and-resume-workflow-active-to-paused-to-active.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-030-rebuild-failure-workflow-active-to-rebuilding-to-error-to-active.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-031-paused-rebuild-workflow-active-to-paused-to-rebuilding-to-active.sdp.md delete mode 100644 specs/behavior/platform-core/projections/lifecycle.examples/s-032-paused-error-workflow-active-to-paused-to-error-to-active.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-001-register-a-single-projection.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-002-register-multiple-projections.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-003-duplicate-projection-name-throws-error.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-004-get-returns-projection-by-name.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-005-get-returns-undefined-for-unknown-projection.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-006-has-returns-true-for-registered-projection.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-007-has-returns-false-for-unregistered-projection.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-009-list-returns-all-registered-projections.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-011-size-reflects-registration-count.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-012-get-by-event-type-returns-multiple-matching-projections.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-013-get-by-event-type-returns-single-context-specific-projection.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-014-get-by-event-type-returns-empty-for-unknown-event.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-015-get-all-event-types-returns-empty-for-empty-registry.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-016-get-all-event-types-returns-sorted-unique-event-types.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-017-get-by-context-filters-by-orders-context.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-018-get-by-context-filters-by-inventory-context.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-019-get-by-context-filters-by-cross-context.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-020-get-by-context-returns-empty-for-unknown-context.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-021-get-rebuild-order-returns-empty-for-empty-registry.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-022-get-rebuild-order-places-primary-before-cross-context.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-023-get-by-category-returns-view-projections.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-024-get-by-category-returns-logic-projections.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-025-get-by-category-returns-reporting-projections.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-026-get-by-category-returns-integration-projections.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-027-get-by-category-returns-empty-when-no-projections-match.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-028-get-by-category-verifies-all-results-have-requested-category.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-029-get-by-category-works-regardless-of-registration-order.sdp.md delete mode 100644 specs/behavior/platform-core/projections/registry.examples/s-030-category-index-is-maintained-incrementally.sdp.md delete mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-001-process-event-when-no-checkpoint-exists.sdp.md delete mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md delete mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-003-checkpoint-is-updated-after-processing.sdp.md delete mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md delete mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md delete mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-006-separate-checkpoints-per-partition.sdp.md delete mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-007-same-position-in-different-partitions-does-not-cause-skip.sdp.md delete mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-008-checkpoint-not-updated-when-process-throws.sdp.md delete mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-009-retry-succeeds-after-process-failure.sdp.md delete mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-010-all-checkpoint-fields-stored-correctly.sdp.md delete mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-011-helper-processes-and-stores-checkpoint.sdp.md delete mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-012-helper-maintains-checkpoint-semantics-across-calls.sdp.md delete mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-013-should-process-event-position-comparisons.sdp.md delete mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-014-initial-checkpoint-has-sentinel-values.sdp.md delete mode 100644 specs/behavior/platform-core/projections/with-checkpoint.examples/s-015-each-initial-checkpoint-gets-a-unique-updated-at.sdp.md delete mode 100644 specs/behavior/platform-core/queries/factory.examples/s-001-single-result-query-descriptor-has-correct-result-type-and-config.sdp.md delete mode 100644 specs/behavior/platform-core/queries/factory.examples/s-002-list-result-query-descriptor-has-correct-result-type.sdp.md delete mode 100644 specs/behavior/platform-core/queries/factory.examples/s-003-count-result-query-descriptor-has-correct-result-type.sdp.md delete mode 100644 specs/behavior/platform-core/queries/factory.examples/s-004-paginated-query-descriptor-uses-default-page-sizes.sdp.md delete mode 100644 specs/behavior/platform-core/queries/factory.examples/s-005-paginated-query-descriptor-uses-custom-page-sizes.sdp.md delete mode 100644 specs/behavior/platform-core/queries/factory.examples/s-006-config-receives-default-pagination-values.sdp.md delete mode 100644 specs/behavior/platform-core/queries/factory.examples/s-007-empty-registry-has-correct-context-and-projection.sdp.md delete mode 100644 specs/behavior/platform-core/queries/factory.examples/s-008-registry-with-multiple-queries-provides-keyed-access.sdp.md delete mode 100644 specs/behavior/platform-core/queries/factory.examples/s-009-type-safe-access-to-registered-query-descriptor.sdp.md delete mode 100644 specs/behavior/platform-core/queries/factory.examples/s-010-no-options-returns-descriptor-defaults.sdp.md delete mode 100644 specs/behavior/platform-core/queries/factory.examples/s-011-provided-page-size-within-limits-is-used.sdp.md delete mode 100644 specs/behavior/platform-core/queries/factory.examples/s-012-page-size-exceeding-max-is-clamped.sdp.md delete mode 100644 specs/behavior/platform-core/queries/factory.examples/s-013-zero-and-negative-page-sizes-are-clamped-to-1.sdp.md delete mode 100644 specs/behavior/platform-core/queries/factory.examples/s-014-cursor-is-passed-through-to-options.sdp.md delete mode 100644 specs/behavior/platform-core/queries/factory.examples/s-015-cursor-is-undefined-when-not-provided.sdp.md delete mode 100644 specs/behavior/platform-core/queries/factory.examples/s-016-read-model-and-paginated-descriptors-preserve-result-types.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-001-pagination-constants-have-expected-values.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-002-returns-defaults-when-no-options-provided.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-003-uses-provided-page-size-within-limits.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-004-caps-page-size-at-max.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-005-enforces-minimum-page-size-of-1-for-boundary-values.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-006-passes-through-cursor.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-007-works-with-custom-config-values.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-008-rounds-floating-point-page-sizes-down.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-009-creates-an-empty-page-with-correct-structure.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-010-preserves-type-information-with-empty-array.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-011-creates-a-page-with-items-and-cursor.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-012-creates-a-done-page-when-cursor-is-null.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-013-handles-empty-items-array-with-null-cursor.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-014-encodes-and-decodes-simple-position-data.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-015-encodes-and-decodes-complex-position-data.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-016-produces-base64-encoded-string.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-017-round-trips-various-data-shapes.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-018-returns-null-for-invalid-cursor-inputs.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-019-returns-null-for-base64-with-invalid-characters-in-middle-or-end.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-020-returns-null-for-truncated-utf-8-sequences.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-021-returns-true-for-valid-page-sizes.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-022-returns-false-for-invalid-page-sizes.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-023-respects-custom-max-page-size.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-024-returns-requested-size-when-valid.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-025-returns-default-when-not-specified.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-026-caps-at-max-and-enforces-minimum.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-027-uses-custom-default-and-max-sizes.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-028-rounds-floating-point-sizes-down.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-029-simulates-complete-pagination-flow.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-030-handles-empty-result-set.sdp.md delete mode 100644 specs/behavior/platform-core/queries/pagination.examples/s-031-handles-exact-page-size-match-with-continuation.sdp.md delete mode 100644 specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-001-conflicting-optimistic-update-is-rolled-back.sdp.md delete mode 100644 specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-002-conflict-detection-handles-network-partition.sdp.md delete mode 100644 specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-003-no-conflict-when-optimistic-is-ahead-of-durable.sdp.md delete mode 100644 specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-004-rollback-triggers-ui-notification.sdp.md delete mode 100644 specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-005-partial-clearing-preserves-unconfirmed-events.sdp.md delete mode 100644 specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-001-client-receives-instant-update-then-durable-confirmation.sdp.md delete mode 100644 specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-002-optimistic-update-works-during-workpool-backlog.sdp.md delete mode 100644 specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-003-durable-state-takes-precedence-after-convergence.sdp.md delete mode 100644 specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-001-category-determines-reactive-eligibility.sdp.md delete mode 100644 specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-002-non-view-projection-rejects-reactive-subscription.sdp.md delete mode 100644 specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-003-view-projection-enables-full-reactive-functionality.sdp.md delete mode 100644 specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-004-initial-reactive-result-represents-loading-state.sdp.md delete mode 100644 specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-001-evolve-produces-identical-results-on-client-and-server.sdp.md delete mode 100644 specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-002-evolve-handles-unknown-event-types-gracefully.sdp.md delete mode 100644 specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-003-multiple-events-evolve-in-sequence.sdp.md delete mode 100644 specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-004-evolve-error-includes-event-context.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-001-get-instance-returns-the-same-instance-on-multiple-calls.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-002-reset-creates-a-new-instance.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-003-register-a-command-successfully.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-004-duplicate-registration-throws-an-error.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-005-different-command-types-can-be-registered.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-006-unregister-removes-a-registered-command.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-007-unregister-returns-false-for-non-existent-command.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-008-get-config-returns-config-for-a-registered-command.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-009-get-config-returns-undefined-for-a-non-existent-command.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-010-get-registration-returns-full-registration-for-a-registered-command.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-011-get-registration-returns-undefined-for-a-non-existent-command.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-012-has-returns-true-for-a-registered-command.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-013-has-returns-false-for-a-non-existent-command.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-014-validate-returns-valid-for-correct-payload.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-015-validate-returns-invalid-for-incorrect-payload.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-016-validate-returns-unknown-command-for-non-existent-command.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-017-list-returns-empty-array-when-no-commands-are-registered.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-018-list-returns-all-registered-commands.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-019-list-returns-command-info-objects-with-correct-shape.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-020-filter-commands-by-category.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-021-filter-commands-by-bounded-context.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-022-filter-commands-by-tag.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-023-group-commands-by-bounded-context.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-024-group-by-context-returns-empty-map-when-no-commands.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-025-size-reflects-registered-command-count.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-026-clear-removes-all-registrations.sdp.md delete mode 100644 specs/behavior/platform-core/registry/command-registry.examples/s-027-global-registry-is-a-functional-registry-instance.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-001-config-has-correct-command-type-bounded-context-and-projection-name.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-002-to-handler-args-merges-original-args-with-command-id-and-correlation-id.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-003-default-partition-key-uses-aggregate-id-field.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-004-custom-partition-key-overrides-the-default.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-005-metadata-reflects-aggregate-category-and-custom-options.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-006-command-is-auto-registered-by-default.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-007-command-is-not-registered-when-auto-register-is-false.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-008-secondary-projections-are-included-in-config.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-009-saga-route-is-included-in-config.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-010-saga-route-on-complete-is-preserved.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-011-failed-projection-is-included-in-config.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-012-schema-version-defaults-to-1.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-013-process-command-has-correct-category-and-target.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-014-partition-key-uses-process-id-field.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-015-process-command-auto-registers-with-category-and-target-info.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-016-system-command-has-correct-category-subsystem-and-description.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-017-system-to-handler-args-merges-args-with-command-id-and-correlation-id.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-018-system-command-without-projection-has-no-projection-property.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-019-system-command-with-projection-includes-it-in-config.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-020-system-partition-key-defaults-to-system-command-type.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-021-system-command-without-projection-is-not-registered-even-with-auto-registe.sdp.md delete mode 100644 specs/behavior/platform-core/registry/define-command.examples/s-022-system-schema-version-defaults-to-1.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-001-load-and-upcast-cms-by-entity-id.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-002-load-throws-not-found-error-for-missing-entity.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-003-load-returns-upcast-metadata.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-004-load-propagates-upcast-errors.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-005-try-load-returns-cms-when-entity-exists.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-006-try-load-returns-null-when-entity-does-not-exist.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-007-try-load-resolves-to-null-without-throwing.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-008-try-load-propagates-upcast-errors.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-009-exists-returns-true-when-entity-exists.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-010-exists-returns-false-when-entity-does-not-exist.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-011-exists-does-not-call-upcast-function.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-012-load-many-loads-multiple-entities-in-parallel.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-013-load-many-returns-null-for-missing-entities.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-014-load-many-returns-empty-array-for-empty-input.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-015-load-many-upcasts-all-loaded-entities.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-016-load-many-preserves-order-of-input-i-ds.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-017-load-many-propagates-upcast-errors-for-any-entity.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-018-insert-creates-cms-record-and-returns-document-id.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-019-update-patches-cms-when-version-matches.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-020-update-throws-not-found-error-for-missing-document.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-021-update-throws-version-conflict-error-on-version-mismatch.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-022-not-found-error-has-correct-properties.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-023-not-found-error-is-instanceof-error.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-024-is-not-found-error-type-guard-returns-true-for-not-found-error.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-025-is-not-found-error-type-guard-returns-false-for-non-not-found-error-values.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-026-version-conflict-error-has-correct-properties.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-027-version-conflict-error-is-instanceof-error.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-028-is-version-conflict-error-type-guard-returns-true-for-version-conflict-err.sdp.md delete mode 100644 specs/behavior/platform-core/repository/cms-repository.examples/s-029-is-version-conflict-error-type-guard-returns-false-for-other-errors.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/confirm-operation.examples/s-001-confirm-reservation-with-entity-id.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/confirm-operation.examples/s-002-confirmed-reservation-is-permanent.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/confirm-operation.examples/s-003-cannot-confirm-expired-reservation.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/confirm-operation.examples/s-004-cannot-confirm-already-confirmed-reservation.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/confirm-operation.examples/s-005-cannot-confirm-non-existent-reservation.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/confirm-operation.examples/s-006-cannot-confirm-released-reservation.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/confirm-operation.examples/s-007-entity-id-is-required.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/confirm-operation.examples/s-008-entity-id-can-be-any-string-identifier.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/release-operation.examples/s-001-release-active-reservation.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/release-operation.examples/s-002-released-value-can-be-immediately-reserved.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/release-operation.examples/s-003-cannot-release-confirmed-reservation.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/release-operation.examples/s-004-cannot-release-already-released-reservation.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/release-operation.examples/s-005-cannot-release-expired-reservation.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/release-operation.examples/s-006-cannot-release-non-existent-reservation.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/release-operation.examples/s-007-expired-reservations-are-marked-by-cron.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/release-operation.examples/s-008-cron-does-not-affect-active-reservations.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/release-operation.examples/s-009-cron-does-not-affect-confirmed-reservations.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-001-email-reservation-key-format.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-002-username-reservation-key-format.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-003-custom-type-reservation-key-format.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-004-same-value-different-types.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-005-independent-type-uniqueness.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-006-type-is-required.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-007-value-is-required.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-008-empty-type-is-invalid.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-009-empty-value-is-invalid.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-010-find-reservation-by-key.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-011-find-reservation-by-type-and-value.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-012-non-existent-key-returns-null.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-013-type-containing-colon-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reservation-key.examples/s-014-value-can-contain-colon-url-with-port.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-001-reserve-an-email-address.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-002-reserve-with-correlation-id.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-003-first-reservation-wins.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-004-reserved-value-cannot-be-re-reserved.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-005-different-ttl-values.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-006-ttl-must-be-positive.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-007-ttl-has-maximum-limit.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-008-negative-ttl-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-009-ttl-at-minimum-boundary-succeeds.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-010-ttl-just-below-minimum-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-011-na-n-ttl-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-012-infinity-ttl-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-013-whitespace-only-type-is-invalid.sdp.md delete mode 100644 specs/behavior/platform-core/reservation/reserve-operation.examples/s-014-whitespace-only-value-is-invalid.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-001-complete-metadata-is-accepted.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-002-metadata-with-optional-user-id-is-accepted.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-003-metadata-with-invalid-timestamps-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-004-metadata-missing-required-fields-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-005-complete-command-is-accepted.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-006-command-with-optional-payload-fields-is-accepted.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-007-command-with-wrong-command-type-literal-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-008-command-with-invalid-payload-type-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-009-command-with-missing-required-payload-field-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-010-command-missing-target-context-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-011-schema-provides-type-inference-for-command-type-literal.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-012-success-with-version-and-data-is-accepted.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-013-success-with-undefined-data-is-accepted.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-014-success-without-version-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-015-rejected-with-code-and-reason-is-accepted.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-016-rejected-with-optional-context-is-accepted.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-017-rejected-without-reason-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-018-conflict-with-concurrent-modification-code-is-accepted.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-019-conflict-with-wrong-code-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-020-conflict-without-current-version-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-021-error-with-message-is-accepted.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-022-error-without-message-is-rejected.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-023-union-discriminates-success-and-preserves-version.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-024-union-discriminates-rejected-and-preserves-code-and-reason.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-025-union-discriminates-conflict-and-preserves-current-version.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-026-union-discriminates-error-and-preserves-message.sdp.md delete mode 100644 specs/behavior/platform-core/schemas/command-schemas.examples/s-027-union-rejects-unknown-status.sdp.md delete mode 100644 specs/behavior/platform-core/testing/guards.examples/s-001-allow-execution-when-convex-test-mode-is-true.sdp.md delete mode 100644 specs/behavior/platform-core/testing/guards.examples/s-002-allow-execution-when-is-test-env-is-set.sdp.md delete mode 100644 specs/behavior/platform-core/testing/guards.examples/s-003-allow-execution-on-self-hosted-runtime-without-explicit-test-signal.sdp.md delete mode 100644 specs/behavior/platform-core/testing/guards.examples/s-004-block-execution-in-cloud-production.sdp.md delete mode 100644 specs/behavior/platform-core/testing/guards.examples/s-005-is-test-environment-returns-true-in-test-mode.sdp.md delete mode 100644 specs/behavior/platform-core/testing/guards.examples/s-006-is-test-environment-returns-true-with-is-test-env.sdp.md delete mode 100644 specs/behavior/platform-core/testing/guards.examples/s-007-is-test-environment-returns-false-in-production.sdp.md delete mode 100644 specs/behavior/platform-core/testing/guards.examples/s-008-is-test-environment-is-a-safe-boolean-check.sdp.md delete mode 100644 specs/behavior/platform-core/testing/integration-isolation.examples/s-001-fresh-state-after-docker-restart.sdp.md delete mode 100644 specs/behavior/platform-core/testing/integration-isolation.examples/s-002-detect-state-pollution-without-restart.sdp.md delete mode 100644 specs/behavior/platform-core/testing/integration-isolation.examples/s-003-unique-namespace-per-test.sdp.md delete mode 100644 specs/behavior/platform-core/testing/integration-isolation.examples/s-004-namespace-applied-to-correlation-i-ds.sdp.md delete mode 100644 specs/behavior/platform-core/testing/integration-isolation.examples/s-005-workpool-jobs-from-previous-test-don-t-interfere.sdp.md delete mode 100644 specs/behavior/platform-core/testing/integration-isolation.examples/s-006-scheduled-functions-use-test-specific-context.sdp.md delete mode 100644 specs/behavior/platform-core/testing/platform-coverage.examples/s-001-package-has-feature-directory-platform-core.sdp.md delete mode 100644 specs/behavior/platform-core/testing/platform-coverage.examples/s-002-package-has-feature-directory-platform-decider.sdp.md delete mode 100644 specs/behavior/platform-core/testing/platform-coverage.examples/s-003-package-has-feature-directory-platform-fsm.sdp.md delete mode 100644 specs/behavior/platform-core/testing/platform-coverage.examples/s-004-package-has-feature-directory-platform-store.sdp.md delete mode 100644 specs/behavior/platform-core/testing/platform-coverage.examples/s-005-package-has-feature-directory-platform-bus.sdp.md delete mode 100644 specs/behavior/platform-core/testing/platform-coverage.examples/s-006-package-has-feature-directory-platform-bc.sdp.md delete mode 100644 specs/behavior/platform-core/testing/platform-coverage.examples/s-007-exported-function-has-feature-coverage.sdp.md delete mode 100644 specs/behavior/platform-core/testing/platform-coverage.examples/s-008-missing-coverage-is-detected.sdp.md delete mode 100644 specs/behavior/platform-core/testing/platform-coverage.examples/s-009-step-definitions-follow-naming-convention.sdp.md delete mode 100644 specs/behavior/platform-core/testing/platform-coverage.examples/s-010-step-file-matches-feature-file.sdp.md delete mode 100644 specs/behavior/platform-core/testing/polling.examples/s-001-sleep-for-specified-duration.sdp.md delete mode 100644 specs/behavior/platform-core/testing/polling.examples/s-002-sleep-returns-a-promise.sdp.md delete mode 100644 specs/behavior/platform-core/testing/polling.examples/s-003-wait-until-returns-truthy-result-immediately.sdp.md delete mode 100644 specs/behavior/platform-core/testing/polling.examples/s-004-wait-until-polls-until-condition-is-met.sdp.md delete mode 100644 specs/behavior/platform-core/testing/polling.examples/s-005-wait-until-throws-on-timeout.sdp.md delete mode 100644 specs/behavior/platform-core/testing/polling.examples/s-006-wait-until-uses-custom-timeout-message.sdp.md delete mode 100644 specs/behavior/platform-core/testing/polling.examples/s-007-wait-until-respects-poll-interval-ms.sdp.md delete mode 100644 specs/behavior/platform-core/testing/polling.examples/s-008-wait-for-resolves-when-predicate-returns-true.sdp.md delete mode 100644 specs/behavior/platform-core/testing/polling.examples/s-009-wait-for-throws-on-timeout.sdp.md delete mode 100644 specs/behavior/platform-core/testing/polling.examples/s-010-default-timeout-is-30-seconds.sdp.md delete mode 100644 specs/behavior/platform-core/testing/polling.examples/s-011-default-poll-interval-is-100ms.sdp.md delete mode 100644 specs/behavior/platform-core/testing/world.examples/s-001-create-base-unit-test-world.sdp.md delete mode 100644 specs/behavior/platform-core/testing/world.examples/s-002-unit-test-world-supports-scenario-context.sdp.md delete mode 100644 specs/behavior/platform-core/testing/world.examples/s-003-unit-test-world-tracks-last-result.sdp.md delete mode 100644 specs/behavior/platform-core/testing/world.examples/s-004-unit-test-world-tracks-last-error.sdp.md delete mode 100644 specs/behavior/platform-core/testing/world.examples/s-005-create-base-integration-test-world.sdp.md delete mode 100644 specs/behavior/platform-core/testing/world.examples/s-006-integration-test-world-uses-custom-backend-url.sdp.md delete mode 100644 specs/behavior/platform-core/testing/world.examples/s-007-integration-test-world-defaults-to-localhost.sdp.md delete mode 100644 specs/behavior/platform-core/testing/world.examples/s-008-reset-world-state-clears-all-fields.sdp.md delete mode 100644 specs/behavior/platform-core/testing/world.examples/s-009-reset-preserves-test-backend-reference.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-001-single-entity-projections-recommend-entity-strategy.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-002-single-entity-projections-return-simple-complexity.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-003-single-entity-projections-include-rationale-about-stream-id.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-004-classification-defaults-to-entity-when-all-flags-are-false.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-005-global-rollup-projections-recommend-global-strategy.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-006-global-rollup-projections-return-complex-complexity.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-007-global-rollup-projections-include-rationale-about-occ-conflicts.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-008-global-strategy-prioritizes-over-other-flags.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-009-cross-context-projections-recommend-saga-strategy.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-010-cross-context-projections-return-complex-complexity.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-011-cross-context-projections-include-rationale-about-correlation-id.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-012-saga-strategy-prioritizes-over-customer-and-entity.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-013-customer-scoped-projections-recommend-customer-strategy.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-014-customer-scoped-projections-return-moderate-complexity.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-015-customer-scoped-projections-include-rationale-about-customer-id.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-016-customer-strategy-prioritizes-over-entity.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-017-decision-tree-follows-priority-global-saga-customer-entity.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-018-strategy-parallelism-values.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-019-get-recommended-parallelism-by-strategy.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-001-global-partition-key-has-name-global.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-002-global-partition-key-has-value-global.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-003-entity-partition-key-uses-stream-type-stream-id-format.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-004-entity-partition-key-prioritizes-stream-id-over-other-id-fields.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-005-entity-partition-key-falls-back-to-alternate-id-fields.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-006-entity-partition-key-throws-when-no-id-field-provided.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-007-entity-partition-key-includes-available-keys-in-error-message.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-008-entity-partition-key-uses-provided-stream-type-in-value.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-009-customer-partition-key-returns-customer-id.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-010-customer-partition-key-ignores-additional-fields.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-011-customer-partition-key-throws-when-customer-id-is-undefined.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-012-customer-partition-key-throws-when-customer-id-is-missing.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-013-customer-partition-key-throws-when-customer-id-is-empty-string.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-014-saga-partition-key-returns-correlation-id.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-015-saga-partition-key-ignores-additional-fields.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-016-saga-partition-key-throws-when-correlation-id-is-undefined.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-017-saga-partition-key-throws-when-correlation-id-is-missing.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-018-saga-partition-key-throws-when-correlation-id-is-empty-string.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-019-global-partition-key-returns-global-partition-key.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-020-global-partition-key-ignores-any-arguments.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-021-global-partition-key-returns-same-reference-on-multiple-calls.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-022-dcb-partition-key-has-name-dcb.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-023-dcb-partition-key-uses-scope-key-as-value.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-024-dcb-partition-key-handles-various-scope-key-formats.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-001-valid-result-for-config-with-get-partition-key.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-002-valid-result-for-inline-partition-key-function.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-003-validates-secondary-projections-with-get-partition-key.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-004-validates-failed-projection-with-get-partition-key.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-005-returns-missing-partition-key-error-for-missing-get-partition-key.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-006-includes-projection-name-in-error.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-007-includes-config-path-in-error.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-008-suggests-helper-functions-in-error-message.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-009-returns-invalid-partition-key-shape-when-returning-null.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-010-returns-invalid-partition-key-shape-when-returning-wrong-type.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-011-returns-invalid-partition-key-shape-when-missing-name.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-012-returns-invalid-partition-key-shape-when-missing-value.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-013-returns-invalid-partition-key-shape-when-value-is-number.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-014-returns-empty-partition-value-for-empty-string.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-015-returns-empty-partition-value-for-whitespace-only-string.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-016-collects-errors-from-all-projections.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-017-reports-correct-config-paths-for-secondary-projections.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-018-reports-correct-config-path-for-failed-projection.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-019-does-not-throw-for-valid-configs-array.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-020-does-not-throw-for-empty-array.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-021-throws-on-first-invalid-config.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-022-includes-all-errors-in-thrown-message.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-023-includes-error-codes-in-thrown-message.sdp.md delete mode 100644 specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-024-includes-config-path-in-thrown-message.sdp.md delete mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-001-success-creates-output-with-correct-status.sdp.md delete mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-002-success-includes-all-required-properties.sdp.md delete mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-003-rejected-creates-output-with-code-and-message.sdp.md delete mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-004-rejected-includes-context-when-provided.sdp.md delete mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-005-failed-creates-output-with-reason-and-event.sdp.md delete mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-006-failed-includes-context-when-provided.sdp.md delete mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-007-is-success-returns-true-for-success-output.sdp.md delete mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-008-is-success-returns-false-for-rejected-output.sdp.md delete mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-009-is-success-returns-false-for-failed-output.sdp.md delete mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-010-is-success-enables-type-narrowing.sdp.md delete mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-011-is-rejected-returns-true-for-rejected-output.sdp.md delete mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-012-is-rejected-returns-false-for-success-output.sdp.md delete mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-013-is-rejected-returns-false-for-failed-output.sdp.md delete mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-014-is-rejected-enables-type-narrowing.sdp.md delete mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-015-is-failed-returns-true-for-failed-output.sdp.md delete mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-016-is-failed-returns-false-for-success-output.sdp.md delete mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-017-is-failed-returns-false-for-rejected-output.sdp.md delete mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-018-is-failed-enables-type-narrowing.sdp.md delete mode 100644 specs/behavior/platform-decider/decider-outputs.examples/s-019-type-guards-are-mutually-exclusive.sdp.md delete mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md delete mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-002-valid-transitions-are-allowed.sdp.md delete mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-003-assert-transition-does-not-throw-for-valid-transitions.sdp.md delete mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-004-invalid-transitions-are-detected.sdp.md delete mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-005-assert-transition-throws-fsm-transition-error-for-invalid-transitions.sdp.md delete mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-006-terminal-states-are-correctly-identified.sdp.md delete mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-007-terminal-state-error-message-indicates-no-valid-transitions.sdp.md delete mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-008-state-validity-is-correctly-checked.sdp.md delete mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-009-valid-transitions-can-be-queried-for-any-state.sdp.md delete mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-010-standalone-functions-work-identically-to-fsm-methods.sdp.md delete mode 100644 specs/behavior/platform-fsm/fsm-transitions.examples/s-011-standalone-assert-transition-throws-same-errors.sdp.md delete mode 100644 specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-001-event-store-client-exposes-no-event-update-api.sdp.md delete mode 100644 specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-002-event-store-client-exposes-no-event-delete-api.sdp.md delete mode 100644 specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-003-first-append-to-a-new-stream-produces-version-1.sdp.md delete mode 100644 specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-004-subsequent-appends-increment-the-stream-version-monotonically.sdp.md delete mode 100644 specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-005-global-position-is-unique-across-two-streams.sdp.md delete mode 100644 specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-006-global-position-increases-monotonically-within-a-stream.sdp.md delete mode 100644 specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-007-successful-append-with-matching-version.sdp.md delete mode 100644 specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-008-conflict-on-version-mismatch.sdp.md delete mode 100644 specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-009-projection-resumes-from-checkpoint.sdp.md delete mode 100644 specs/behavior/platform-store/event-store-types.examples/s-001-event-category-supports-all-taxonomy-values.sdp.md delete mode 100644 specs/behavior/platform-store/event-store-types.examples/s-002-event-input-requires-core-event-fields.sdp.md delete mode 100644 specs/behavior/platform-store/event-store-types.examples/s-003-event-input-supports-optional-category-and-schema-version.sdp.md delete mode 100644 specs/behavior/platform-store/event-store-types.examples/s-004-event-input-supports-metadata-with-correlation-tracking.sdp.md delete mode 100644 specs/behavior/platform-store/event-store-types.examples/s-005-stored-event-includes-all-required-storage-fields.sdp.md delete mode 100644 specs/behavior/platform-store/event-store-types.examples/s-006-append-result-success-includes-event-positions.sdp.md delete mode 100644 specs/behavior/platform-store/event-store-types.examples/s-007-append-result-conflict-includes-current-version.sdp.md create mode 100644 specs/decisions/_epic.sdp.md create mode 100644 specs/releases/_epic.sdp.md delete mode 100644 specs/test-content-blocks.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-001-admin-directory-is-created-with-correct-structure.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-002-backward-compatibility-for-dlq-imports.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-003-get-dead-letter-statistics.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-004-bulk-retry-pending-dead-letters.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-005-trace-complete-event-flow.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-006-trace-shows-failure-point.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-007-system-state-provides-complete-overview.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-008-query-workpool-item-status.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-009-query-workflow-execution-with-steps.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-010-query-non-existent-durable-function.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-011-unauthenticated-request-is-rejected.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-012-non-admin-user-is-rejected.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-013-admin-action-is-logged.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-001-dead-letter-list-displays-failed-events-from-both-agents.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-002-replay-action-triggers-backend-mutation-with-toast-feedback.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-003-ignore-action-with-reason-provides-confirmation.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-004-replay-failure-shows-error-toast.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-005-filter-dead-letters-by-agent.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-006-view-decision-history-with-decisions-from-both-agents.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-007-filter-decision-history-by-agent.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-008-filter-decision-history-by-action-type.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-009-view-decision-detail-with-full-reasoning.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-010-empty-decision-history-shows-guidance-message.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-011-approve-action-shows-success-toast.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-012-reject-action-shows-success-toast.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-013-error-action-shows-descriptive-error-toast.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-014-multiple-rapid-actions-show-stacked-toasts.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-015-high-value-order-detected-and-surfaces-as-vip-approval.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-016-low-value-order-does-not-trigger-agent.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-017-admin-approves-vip-flag-for-high-value-order.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-018-both-agents-trigger-from-same-customer-activity.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-019-dashboard-shows-both-active-agents.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-020-pending-approvals-count-includes-both-agents.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-admin-frontend/s-021-one-agent-stopped-one-active.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-001-agent-component-registers-with-isolated-schema.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-002-component-api-provides-full-crud-for-checkpoints.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-003-direct-table-access-is-not-possible-from-parent.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-004-component-sub-transactions-provide-isolation.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-005-agent-handler-receives-projection-data-as-argument.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-006-missing-projection-data-returns-empty-result.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-007-agent-handler-cannot-directly-access-app-level-projection-tables.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-008-app-level-queries-can-access-agent-data-via-component-api.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-001-agent-command-routes-through-command-orchestrator-to-handler.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-002-unknown-command-type-is-rejected-with-validation-error.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-003-command-idempotency-prevents-duplicate-processing.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-004-pause-agent-transitions-active-agent-to-paused.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-005-resume-agent-resumes-from-checkpoint-position.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-006-invalid-lifecycle-transition-is-rejected.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-007-reconfigure-agent-updates-configuration-without-losing-state.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-008-agent-config-references-patterns-from-registry.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-009-handler-uses-pattern-trigger-for-cheap-detection.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-010-handler-uses-pattern-analyze-for-llm-analysis.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-011-unknown-pattern-name-in-config-fails-validation.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-001-agent-action-handler-calls-llm-and-returns-decision.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-002-on-complete-mutation-persists-decision-atomically.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-003-action-handler-rejects-invalid-agent-configuration.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-004-llm-unavailable-propagates-error-through-retries-to-dead-letter.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-005-action-failure-triggers-dead-letter-via-on-complete.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-006-rate-limiter-allows-llm-call-within-limits.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-007-rate-limiter-blocks-llm-call-when-exceeded.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-008-cost-budget-exceeded-pauses-agent.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-009-queue-overflow-triggers-dead-letter.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-010-agent-subscription-with-on-complete-receives-completion-callbacks.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-011-failed-agent-jobs-create-dead-letters-via-on-complete.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/agent-llm-integration/s-012-agent-subscription-without-on-complete-uses-global-default.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-001-circuit-remains-closed-on-success.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-002-circuit-opens-after-threshold-failures.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-003-circuit-transitions-to-half-open-after-timeout.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-004-successful-probe-closes-circuit.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-005-failed-probe-reopens-circuit.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-006-circuit-state-persists-across-function-calls.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-007-non-existent-circuit-defaults-to-closed.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-008-timeout-transitions-open-to-half-open.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-009-stale-timeout-is-ignored.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-010-half-open-probe-closes-circuit-on-success.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-011-half-open-probe-reopens-circuit-on-failure.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-012-open-circuit-returns-fast-failure.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-013-payment-circuit-opens-after-3-failures.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-014-email-circuit-tolerates-more-failures.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-015-different-services-have-independent-circuits.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-001-generate-process-guard-reference-at-standard-detail-level.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-002-generate-process-guard-reference-at-summary-detail-level.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-003-extract-conventions-by-tag-value.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-004-convention-content-preserves-rule-block-structure.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-005-no-conventions-found-for-requested-tag-values.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-006-no-shape-sources-match-any-pattern-file-paths.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-007-convention-tag-matches-multiple-decision-records.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-008-dual-output-generation.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-009-summary-compaction-quality.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-010-reference-generators-appear-in-available-generators-list.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-011-cli-invocation-generates-reference-docs.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-012-convention-tag-is-registered-in-taxonomy.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-013-recipe-rule-block-content-preserved-in-decision-record.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-001-auth-remediation-is-not-split-by-mutation-family.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-by-default.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-001-cancel-a-confirmed-order.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-002-cannot-cancel-already-cancelled-order-unchanged-behavior.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-003-order-cancelled-evolves-confirmed-state-to-cancelled.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-004-reservation-is-released-after-confirmed-order-cancellation.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-005-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-006-cancelling-submitted-order-with-pending-reservation-releases-it.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-007-pm-is-idempotent-for-duplicate-order-cancelled-events.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-008-three-cancellations-trigger-churn-risk-agent.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-001-same-email-produces-same-stream-id.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-002-composite-key-produces-consistent-hash.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-003-different-emails-produce-different-stream-i-ds.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-004-first-create-succeeds.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-005-second-create-fails-with-conflict.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-006-concurrent-creates-exactly-one-succeeds.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-007-hash-output-is-url-safe.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-008-hash-is-not-reversible.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-009-pattern-selection-by-use-case.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/epic-process-enhancements/s-001-specs-can-evolve-independently-of-phases.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/epic-process-enhancements/s-002-type-script-phase-files-link-specs-to-releases.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/event-correctness-migration/s-001-event-correctness-packet-starts-from-decisions-and-inventory.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/event-correctness-migration/s-002-old-and-new-checkpoint-formats-are-handled-explicitly.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-001-readiness-probe-returns-healthy-when-all-components-ok.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-002-readiness-probe-returns-unhealthy-on-projection-lag.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-003-liveness-probe-always-returns-alive.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-004-workpool-backlog-fails-readiness.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-005-normal-queue-depth-passes-readiness.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-006-projection-lag-is-calculated-correctly.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-007-missing-checkpoint-treated-as-maximum-lag.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-008-zero-lag-is-healthy.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-009-metrics-collection-gathers-all-dimensions.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-010-metrics-emitted-as-json-for-log-streams.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-011-metrics-collection-handles-empty-state.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-012-all-components-healthy-yields-healthy-system.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-013-single-unhealthy-component-makes-system-unhealthy.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/health-observability/s-014-degraded-component-yields-degraded-system.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-001-context-map-shows-bc-topology.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-002-register-partnership-relationship.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-003-register-shared-kernel-relationship.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-004-register-open-host-service-relationship.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-005-duplicate-relationship-is-rejected.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-006-self-referential-relationship-is-rejected.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-007-integration-event-uses-published-language.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-008-event-tagging-for-routing-and-dcb.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-009-schema-compatibility-mode-is-enforced.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-010-register-schema-with-compatibility-mode.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-011-unregistered-event-type-fails-conversion.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-012-invalid-payload-fails-schema-validation.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-013-acl-translates-external-system-response.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-014-acl-handles-bidirectional-translation.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-015-acl-validates-external-input.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21a/s-016-acl-rejects-unmapped-values.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-001-v1-consumer-receives-v2-event.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-002-upcast-historical-events.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-003-chain-upcasters-for-multi-version-migration.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-004-upcast-adds-computed-field.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-005-incompatible-schema-change-is-rejected.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-006-breaking-change-without-migration.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-007-contract-test-validates-schema-compatibility.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-008-contract-sample-generation.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-009-generate-multiple-unique-samples.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-010-producer-contract-test-utility.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-011-consumer-contract-test-utility.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-012-compatible-producer-and-consumer-verified.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-013-compatible-with-downcaster.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-014-detect-producer-consumer-mismatch.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-015-contract-violation-is-recorded.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/integration-patterns-21b/s-016-contract-violations-are-queryable.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/package-architecture/s-001-platform-fsm-has-no-dependencies.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/package-architecture/s-002-platform-decider-depends-only-on-platform-fsm.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/package-architecture/s-003-decider-package-is-independently-usable.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/package-architecture/s-004-packages-are-independently-publishable.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/package-architecture/s-005-framework-tests-live-in-framework-packages.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/package-architecture/s-006-existing-imports-continue-to-work.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/package-architecture/s-007-platform-namespace-avoids-conflicts.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-001-pd-rs-appear-in-generated-decisions-md.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-002-pdr-numbering-is-independent-from-package-ad-rs.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-001-minimal-release-file-structure.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-002-pdr-tagged-with-release-version.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-003-changelog-generation-from-scattered-tags.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-001-specs-and-type-script-phase-files-are-separate.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-002-spec-files-use-semantic-tags-only.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-003-type-script-phase-files-centralize-release-information.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-004-specs-can-evolve-independently-of-phases.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-005-no-release-references-in-spec-data-tables.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-006-type-script-phase-files-support-process-metadata.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-007-type-script-phase-files-support-dependency-tracking.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-001-all-metadata-uses-architect-prefix.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-002-bdd-tags-remain-unprefixed.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-003-scanner-accepts-deprecated-prefix-during-migration.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-001-compiler-enforces-taxonomy-values.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-002-zod-schemas-derive-from-type-script-constants.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-003-registry-builder-creates-valid-tag-registry.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-004-type-inference-from-constants.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-001-roadmap-spec-structure.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-002-package-spec-structure.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-003-linking-roadmap-to-package-specs.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-004-completed-pattern-roadmap-spec.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-005-active-pattern-with-acceptance-criteria.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-001-evaluating-a-platform-demonstration-change.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-002-evaluating-a-business-feature-change.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-003-evaluating-an-uncertain-change.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-001-design-session-produces-decision-specs-not-documents.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-002-design-session-produces-code-stubs.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-003-stub-file-has-target-annotation.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-004-stubs-use-pattern-based-folder-naming.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-005-design-session-decision-uses-design-category.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-001-agent-handler-receives-projection-data-as-argument.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-002-missing-external-data-is-handled-gracefully.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-003-injected-data-interface-is-extensible.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-001-action-handler-performs-analysis-without-persistence.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-002-on-complete-mutation-persists-decision-atomically.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-003-llm-unavailable-falls-back-to-rule-based-analysis.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-004-action-failure-triggers-dead-letter-via-on-complete.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-005-null-decision-advances-checkpoint-without-side-effects.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-006-event-bus-dispatches-action-subscription-via-enqueue-action.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-007-existing-mutation-subscriptions-remain-unchanged.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-008-action-subscription-requires-on-complete-at-the-type-level.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-009-sequential-events-process-correctly.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-010-concurrent-actions-for-same-entity-are-serialized-at-on-complete.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-011-already-processed-event-is-skipped-in-action.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-012-partial-on-complete-failure-replays-safely.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-013-event-bus-uses-subscription-specific-pool-when-available.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-001-command-routes-through-orchestrator-to-domain-handler.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-002-unknown-command-type-fails-with-routing-error.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-003-duplicate-command-rejected-by-command-orchestrator-idempotency.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-004-handler-uses-trigger-for-cheap-detection-before-llm.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-005-handler-uses-analyze-for-llm-powered-detection.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-001-invalid-lifecycle-transition-is-rejected.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-002-stop-agent-works-from-any-non-stopped-state.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-003-pause-agent-transitions-active-agent-to-paused.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-004-resume-agent-resumes-from-checkpoint-position.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-005-reconfigure-agent-updates-configuration-without-losing-state.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-001-valid-proof-allows-a-legitimate-component-boundary-action.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-before-any-write.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-003-targeted-mutation-family-migrates-in-one-packet.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-001-sequential-appends-remain-strictly-monotonic-at-real-timestamps.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-002-legacy-numeric-checkpoints-are-read-safely-by-the-new-code.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-001-secondary-fanout-and-saga-routing-no-longer-share-the-primary-projection-p.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-002-the-pool-split-does-not-claim-nonexistent-workpool-ordering-behavior.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-001-tranche-3-gate-chooses-the-low-blast-radius-path.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-002-optional-package-splits-are-not-silently-started.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-003-shared-contracts-package-centralizes-the-non-split-contract-surfaces.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-004-layering-command-enforces-the-tranche-3-non-split-boundary-rules.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-001-same-key-plus-same-payload-returns-the-original-append-result.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-002-same-key-plus-different-payload-is-rejected-and-audited.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-001-payload-below-the-configured-cap-passes-the-component-boundary.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-002-oversized-payload-is-rejected-before-persistence.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-001-event-type-catch-up-uses-the-replacement-compound-index.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-002-removed-indexes-stay-absent-after-the-audit-driven-cleanup.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-001-ac4-is-closed-by-a-constrained-dependency-decision-rather-than-a-package-r.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-002-the-constrained-dependency-does-not-reopen-the-deferred-platform-core-spli.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-001-bare-names-remain-canonical-across-roadmap-and-decision-sources.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-002-executable-tests-names-identify-carrier-artifacts-only.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-003-architect-implements-carries-the-continuity-edge.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-001-selective-rollback-restores-one-semantic-pattern-without-undoing-the-whole.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-002-whole-packet-rollback-keeps-enforcement-in-the-normal-ci-lanes.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-001-projection-lag-is-tracked.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-002-metrics-collection-handles-missing-checkpoints.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-003-trace-spans-command-to-projection-flow.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-004-missing-trace-context-uses-default.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-005-readiness-probe-checks-dependencies.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-006-unhealthy-dependency-fails-readiness.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-007-liveness-probe-always-succeeds.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-008-workpool-backlog-fails-readiness.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-009-circuit-opens-after-repeated-failures.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-010-circuit-transitions-to-half-open-after-timeout.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-011-successful-half-open-request-closes-circuit.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-012-failed-half-open-request-reopens-circuit.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-013-projection-rebuild-re-processes-events.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-014-dead-letter-retry-re-enqueues-event.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-015-event-flow-trace-returns-full-history.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-016-durable-function-run-diagnostics.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-017-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-018-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-019-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-020-failed-dlq-retry-returns-to-pending-status.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/production-hardening/s-021-durable-function-calls-propagate-trace-context.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/test-content-blocks/s-001-scenario-with-doc-string-for-rich-content.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/test-content-blocks/s-002-scenario-with-data-table-for-structured-data.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/test-content-blocks/s-003-simple-scenario-under-second-rule.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/test-content-blocks/s-004-scenario-with-examples-table.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/themed-decision-architecture/s-001-generate-themed-decision-document.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/themed-decision-architecture/s-002-theme-tag-in-decision-file.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/themed-decision-architecture/s-003-adr-with-dependency-declaration.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/themed-decision-architecture/s-004-generate-dependency-graph.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/themed-decision-architecture/s-005-layer-information-in-generated-docs.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/themed-decision-architecture/s-006-port-adr-from-old-format-to-feature-file.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/themed-decision-architecture/s-007-review-for-validity-during-migration.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/themed-decision-architecture/s-008-generate-all-decision-artifacts.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-001-store-and-bus-readiness-harnesses-exist-before-tranche-1-implementation.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-002-readiness-validation-remains-machine-verifiable.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-001-release-governance-points-to-pdr-002.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-002-docs-only-changes-still-run-architect-guard-and-docs-generation.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-001-supporting-cleanup-does-not-bypass-the-auth-keystone.sdp.md delete mode 100644 specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-002-supporting-contract-gaps-fail-closed-after-remediation.sdp.md delete mode 100644 specs/unimplemented/current/phase-100-codec-driven-reference-generation.sdp.md delete mode 100644 specs/unimplemented/current/phase-100-themed-decision-architecture.sdp.md delete mode 100644 specs/unimplemented/current/phase-15-projection-categories-executable-tests.sdp.md delete mode 100644 specs/unimplemented/current/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md delete mode 100644 specs/unimplemented/current/phase-22-agent-as-bounded-context.sdp.md delete mode 100644 specs/unimplemented/current/phase-22-agent-churn-risk-completion.sdp.md delete mode 100644 specs/unimplemented/current/phase-22-confirmed-order-cancellation.sdp.md delete mode 100644 specs/unimplemented/deliverables/test-content-blocks/d-001-demo-item-1.sdp.md delete mode 100644 specs/unimplemented/remaining/phase-100-themed-decision-architecture.sdp.md delete mode 100644 specs/unimplemented/remaining/phase-18-production-hardening.sdp.md delete mode 100644 specs/unimplemented/remaining/phase-18-workpool-partitioning-strategy.sdp.md delete mode 100644 specs/unimplemented/remaining/phase-20-reservation-pattern.sdp.md delete mode 100644 specs/unimplemented/remaining/phase-21-integration-patterns-21b.sdp.md delete mode 100644 specs/unimplemented/remaining/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md delete mode 100644 specs/unimplemented/remaining/phase-22-agent-as-bounded-context.sdp.md delete mode 100644 specs/unimplemented/remaining/phase-22-agent-churn-risk-completion.sdp.md delete mode 100644 specs/unimplemented/remaining/phase-22-confirmed-order-cancellation.sdp.md diff --git a/.grok/workflows/migrate-specs-to-sdp.rhai b/.grok/workflows/migrate-specs-to-sdp.rhai new file mode 100644 index 00000000..af196c9a --- /dev/null +++ b/.grok/workflows/migrate-specs-to-sdp.rhai @@ -0,0 +1,323 @@ +let meta = #{ + name: "migrate-specs-to-sdp", + description: "Upgrade the specs/ corpus from mechanical SDP carriers to lawful Libar Software Delivery Protocol authoring", + when_to_use: "When libar-platform Specs need verifies, example spaces, decision bodies, or honest readiness against SDP law", + phases: [ + #{ title: "Mechanical", detail: "add verifies, rewrite stub outcomes, fill decision bodies from lineage" }, + #{ title: "Discover", detail: "group remaining protocol gaps into non-overlapping shards" }, + #{ title: "Migrate", detail: "one writer per shard authors example spaces and remaining kind evidence" }, + #{ title: "Verify", detail: "rebuild the graph and re-measure findings" }, + #{ title: "Repair", detail: "fix shards that still fail extraction or honesty" }, + ], +}; + +let mechanical_schema = #{ + "type": "object", "required": ["ok", "summary"], + "properties": #{ + "ok": #{ "type": "boolean" }, + "summary": #{ "type": "string" }, + }, +}; + +let shards_schema = #{ + "type": "object", "required": ["shards"], + "properties": #{ + "shards": #{ "type": "array", "maxItems": 40, "items": #{ + "type": "object", "required": ["id", "root", "kind"], + "properties": #{ + "id": #{ "type": "string" }, + "root": #{ "type": "string" }, + "kind": #{ "type": "string" }, + "note": #{ "type": "string" }, + }, + }}, + }, +}; + +let migrate_schema = #{ + "type": "object", "required": ["root", "edited", "ok"], + "properties": #{ + "root": #{ "type": "string" }, + "edited": #{ "type": "number" }, + "ok": #{ "type": "boolean" }, + "errors": #{ "type": "array", "items": #{ "type": "string" }, "maxItems": 8 }, + }, +}; + +let verify_schema = #{ + "type": "object", "required": ["ok", "specCount", "errorCount", "missingExampleSpaces", "examplesWithoutVerifies", "notes"], + "properties": #{ + "ok": #{ "type": "boolean" }, + "specCount": #{ "type": "number" }, + "errorCount": #{ "type": "number" }, + "missingExampleSpaces": #{ "type": "number" }, + "examplesWithoutVerifies": #{ "type": "number" }, + "notes": #{ "type": "string" }, + "brokenRoots": #{ "type": "array", "items": #{ "type": "string" }, "maxItems": 16 }, + }, +}; + +fn in_specs(root) { + if type_of(root) != "string" { return false; } + if root == "" { return false; } + if root.contains("..") { return false; } + root == "specs" || root.starts_with("specs/") +} + +fn fallback_shards() { + [ + #{ id: "behavior-frontend", root: "specs/behavior/frontend", kind: "behavior" }, + #{ id: "behavior-order-management", root: "specs/behavior/order-management", kind: "behavior" }, + #{ id: "behavior-platform-bc", root: "specs/behavior/platform-bc", kind: "behavior" }, + #{ id: "behavior-platform-bus", root: "specs/behavior/platform-bus", kind: "behavior" }, + #{ id: "behavior-platform-core", root: "specs/behavior/platform-core", kind: "behavior" }, + #{ id: "behavior-platform-decider", root: "specs/behavior/platform-decider", kind: "behavior" }, + #{ id: "behavior-platform-fsm", root: "specs/behavior/platform-fsm", kind: "behavior" }, + #{ id: "behavior-platform-store", root: "specs/behavior/platform-store", kind: "behavior" }, + #{ id: "decisions", root: "specs/decisions", kind: "decision" }, + #{ id: "platform", root: "specs/platform", kind: "platform" }, + #{ id: "unimplemented", root: "specs/unimplemented", kind: "unimplemented" }, + #{ id: "releases", root: "specs/releases", kind: "other" }, + #{ id: "example-app", root: "specs/example-app", kind: "other" }, + ] +} + +fn roots_overlap(left, right) { + if left == right { return true; } + left.starts_with(right + "/") || right.starts_with(left + "/") +} + +fn exclusive_shards(raw) { + let accepted = []; + for s in raw { + if s == () || !in_specs(s.root) { continue; } + let clash = false; + for a in accepted { + if roots_overlap(s.root, a.root) { clash = true; } + } + if clash { + log("Dropped overlapping shard root: " + s.root); + } else { + accepted.push(s); + } + } + accepted +} + +fn migrate_prompt(root, kind) { + let p = ""; + p += "You are migrating already-extracted Libar SDP Markdown carriers under "; + p += root; + p += " (shard kind "; + p += kind; + p += ") up to the Libar Software Delivery Protocol authoring law.\n\n"; + p += "Workspace is /home/darkomijic/dev-libar/libar-platform. Use read_file, grep, and StrReplace/write. "; + p += "Read every file you will edit. Do not answer from memory.\n\n"; + p += "LAW (do not paraphrase into a second model):\n"; + p += "1. Keep every existing Spec id, kind, altitude, and file path. One kind per Spec. Never invent ids.\n"; + p += "2. Envelope YAML uses camelCase relation keys: refines, dependsOn, constrainedBy, decidedBy, verifies, supersedes.\n"; + p += "3. Lawful headings only: Intent, Behavior, Rule, Workflow, Contract, Example space, Constraints, Model, Design, Decision, UI, Verification — executable|manual|reviewed|contract.\n"; + p += "4. Example Specs: add `verifies: ` beside existing `refines` if missing. Intent outcome must be a real sentence, not 'Executable scenario:'.\n"; + p += "5. Example space is OPTIONAL and dangerous: a Markdown ```gwt-vocabulary fence MUST have Given+, exactly one When, and Then+. "; + p += "Add ## Example space on a behavior parent ONLY if every example child under that parent can be expressed against that single When "; + p += "(lift shared literals to {name:type} on the parent and {name: value} on children). "; + p += "If children have genuinely different actions, leave example space off and do not break vocabulary matching.\n"; + p += "6. Child ```gwt fences stay under Intent, immediately after the outcome block, with no trailing prose after the fence.\n"; + p += "7. Never state readiness: ready. You may set defined when the kind's evidence is complete; otherwise keep idea or scoped.\n"; + p += "8. Decision Specs: fill ## Decision with context / decision / rationale / consequence from docs/lineage/architect/decisions when the live body is a title echo. Update architect/ paths to specs/ only when the decision itself is about corpus location.\n"; + p += "9. Unimplemented Specs stay idea. Write an honest outcome; do not pretend they are implemented.\n"; + p += "10. Platform pattern Specs: replace 'Preserve the former architect pattern' stubs with the actual outcome/problem from the matching lineage feature or docs-living pattern. Add a Behavior rule only when the source already states it.\n"; + p += "11. Do not edit specs/generated, pack manifests unless a member id would break, or any file outside this shard root.\n"; + p += "12. Do not invent behavior, slots, or relations you cannot point to in the current file or its lineage source.\n\n"; + p += "Gold-standard shape to copy: /home/darkomijic/dev-libar/software-delivery-protocol/examples/checkout-v1/specs/orders/create-order.sdp.md and create-order-valid-cart.sdp.md.\n"; + p += "Return {root, edited, ok, errors}. ok=true only if you inspected the shard and left valid Markdown carriers.\n"; + p +} + +let scope = if args == () { "all" } else { args.scope }; +if scope == () { scope = "all"; } + +phase("Mechanical"); +let mech_prompt = ""; +mech_prompt += "Run the mechanical Libar SDP migrator in /home/darkomijic/dev-libar/libar-platform.\n"; +mech_prompt += "1. Read scripts/sdp-protocol-migrate.mjs so you know what it changes.\n"; +mech_prompt += "2. Execute: node scripts/sdp-protocol-migrate.mjs\n"; +mech_prompt += "3. Return ok=true and a one-line summary of the JSON the script printed.\n"; +mech_prompt += "If the script fails, return ok=false and put the error in summary. Do not revert files.\n"; +let mechanical = agent(mech_prompt, #{ + label: "mechanical-migrate", + capability_mode: "all", + output_schema: mechanical_schema, +}); +if mechanical == () || !mechanical.success { + pause("infra", "Mechanical migrator agent did not return."); +} +let mech_ok = mechanical.output != () && mechanical.output.ok == true; +if mech_ok && mechanical.output.summary != () && mechanical.output.summary != "" { + log(mechanical.output.summary); +} else { + log("Mechanical migrator reported failure or empty output; continuing to discovery so remaining work is still sharded."); +} + +phase("Discover"); +let discover_prompt = ""; +discover_prompt += "Inventory remaining Libar SDP protocol gaps in /home/darkomijic/dev-libar/libar-platform/specs.\n"; +discover_prompt += "Use grep/read_file (do not parse generated/). Group work into at most 40 non-overlapping shards.\n"; +discover_prompt += "A shard root must be a specs/ directory prefix. Never emit paths with .. or outside specs/.\n"; +discover_prompt += "Prefer grouping a behavior parent *.sdp.md with its sibling .examples/ directory. "; +discover_prompt += "Split platform-core/agent by parent file when a folder exceeds ~80 spec files.\n"; +discover_prompt += "Include: behavior parents still missing ## Example space; decisions with title-echo ## Decision; "; +discover_prompt += "platform/unimplemented stubs whose outcome still starts with Preserve the former / Unimplemented deliverable.\n"; +discover_prompt += "Skip specs/generated. Return {shards:[{id,root,kind,note}]}. An empty list is valid only after you searched.\n"; +let discovered = agent(discover_prompt, #{ + label: "discover-shards", + capability_mode: "read-only", + output_schema: shards_schema, +}); + +let raw_shards = []; +if discovered != () && discovered.success && discovered.output != () && discovered.output.shards != () { + for s in discovered.output.shards { + if s != () && in_specs(s.root) { + raw_shards.push(s); + } else if s != () && s.root != () { + log("Dropped out-of-scope shard root: " + s.root); + } + } +} +let shards = exclusive_shards(raw_shards); +if shards.len() == 0 { + log("Discovery returned no in-scope shards; using the built-in family fallback list."); + shards = fallback_shards(); +} +log("Migrating " + shards.len().to_string() + " shards"); + +phase("Migrate"); +const BATCH = 12; +let migrate_ok = 0; +let migrate_fail = 0; +let edited_total = 0; +let i = 0; +while i < shards.len() { + let jobs = []; + let j = 0; + while j < BATCH && i + j < shards.len() { + let s = shards[i + j]; + let kind = if s.kind == () { "behavior" } else { s.kind }; + jobs.push(#{ + prompt: migrate_prompt(s.root, kind), + label: "migrate:" + s.id, + capability_mode: "read-write", + output_schema: migrate_schema, + }); + j += 1; + } + let results = parallel(jobs); + for r in results { + if r != () && r.success && r.output != () && r.output.ok == true { + migrate_ok += 1; + if r.output.edited != () { edited_total += r.output.edited; } + } else { + migrate_fail += 1; + } + } + i += BATCH; +} +log(migrate_ok.to_string() + " shards ok, " + migrate_fail.to_string() + " failed, edited=" + edited_total.to_string()); + +phase("Verify"); +let verify_prompt = ""; +verify_prompt += "Re-measure the Libar SDP corpus at /home/darkomijic/dev-libar/libar-platform.\n"; +verify_prompt += "Run these commands and use their output, not memory:\n"; +verify_prompt += "1. pnpm sdp:validate\n"; +verify_prompt += "2. pnpm --silent sdp:q --json 'return { specs: g.specs().length, packs: g.packs().length, errors: report.findings.filter((f) => f.severity === \"error\").length, warns: report.findings.filter((f) => f.severity === \"warn\").length }'\n"; +verify_prompt += "3. Count behavior parents that have example children but no Example space heading (grep).\n"; +verify_prompt += "4. Count example Specs whose frontmatter lacks verifies: (grep).\n"; +verify_prompt += "Set ok=true only when errorCount is 0 and the graph still derives. "; +verify_prompt += "brokenRoots: up to 16 specs/ prefixes that still look broken. notes: one short paragraph.\n"; +let verified = agent(verify_prompt, #{ + label: "verify-sdp", + capability_mode: "all", + output_schema: verify_schema, +}); + +let verify_ok = verified != () && verified.success && verified.output != () && verified.output.ok == true; +let broken = []; +if verified != () && verified.success && verified.output != () && verified.output.brokenRoots != () { + for b in verified.output.brokenRoots { + if in_specs(b) { broken.push(b); } + } +} + +if !verify_ok && broken.len() > 0 { + phase("Repair"); + let fixes = []; + for b in broken { + let fp = ""; + fp += "sdp validate reported remaining problems under "; + fp += b; + fp += " in /home/darkomijic/dev-libar/libar-platform. "; + fp += "Read the carriers, run pnpm --silent sdp:q against the affected ids if useful, and fix only files under that root. "; + fp += "Keep ids stable. Never state ready. Prefer removing an illegal Example space over leaving a broken fence. "; + fp += "Return {root, edited, ok, errors}.\n"; + fixes.push(#{ + prompt: fp, + label: "repair:" + b, + capability_mode: "read-write", + output_schema: migrate_schema, + }); + } + let repaired = parallel(fixes); + let repair_ok = 0; + for r in repaired { + if r != () && r.success && r.output != () && r.output.ok == true { repair_ok += 1; } + } + log(repair_ok.to_string() + "/" + broken.len().to_string() + " repair shards succeeded"); + verified = agent(verify_prompt, #{ + label: "verify-sdp-after-repair", + capability_mode: "all", + output_schema: verify_schema, + }); + verify_ok = verified != () && verified.success && verified.output != () && verified.output.ok == true; +} else if !verify_ok { + phase("Repair"); + log("Verify failed without a bounded brokenRoots list; skipping unscoped repair."); +} + +let spec_count = 0; +let error_count = -1; +let missing_spaces = -1; +let missing_verifies = -1; +let notes = ""; +if verified != () && verified.success && verified.output != () { + if verified.output.specCount != () { spec_count = verified.output.specCount; } + if verified.output.errorCount != () { error_count = verified.output.errorCount; } + if verified.output.missingExampleSpaces != () { missing_spaces = verified.output.missingExampleSpaces; } + if verified.output.examplesWithoutVerifies != () { missing_verifies = verified.output.examplesWithoutVerifies; } + if verified.output.notes != () { notes = verified.output.notes; } +} + +let report = ""; +report += "# SDP protocol migration\n\n"; +report += "- shards: " + shards.len().to_string() + "\n"; +report += "- migrate ok/fail: " + migrate_ok.to_string() + "/" + migrate_fail.to_string() + "\n"; +report += "- files agents reported edited: " + edited_total.to_string() + "\n"; +report += "- graph specCount: " + spec_count.to_string() + "\n"; +report += "- validate errorCount: " + error_count.to_string() + "\n"; +report += "- behavior parents still missing example space: " + missing_spaces.to_string() + "\n"; +report += "- examples still missing verifies: " + missing_verifies.to_string() + "\n"; +report += "- verify_ok: "; +if verify_ok { report += "true\n\n"; } else { report += "false\n\n"; } +report += notes; +let report_path = write_scratch_file("sdp-migration-report.md", report); + +complete(#{ + path: report_path, + report: report, + verifyOk: verify_ok, + shards: shards.len(), + migrateOk: migrate_ok, + migrateFail: migrate_fail, + specCount: spec_count, + errorCount: error_count, +}); diff --git a/Justfile b/Justfile new file mode 100644 index 00000000..f6671a5f --- /dev/null +++ b/Justfile @@ -0,0 +1,138 @@ +# Local Docker helpers for Convex self-hosted backends used by integration tests. +# Ports: +# 3210 = app integration (order-management) +# 3215 = infrastructure integration (platform-*) +# 3220 = interactive development (docker-compose.dev.yml) + +set shell := ["bash", "-eu", "-o", "pipefail", "-c"] + +convex_image := "ghcr.io/get-convex/convex-backend:c34b8eca2d740de3cde3f6a3ab7d1dc9e98ee7d6" +instance_secret := env_var_or_default("CONVEX_INSTANCE_SECRET", "0135d8598650f8f5cb0f30c34ec2e2bb62793bc28717c8eb6fb577996d50be5f") + +# Start app integration backend on port 3210 +start: + #!/usr/bin/env bash + set -euo pipefail + name="convex-es-test-backend" + if docker ps --filter "name=^${name}$" --format '{{{{.Names}}' | grep -qx "$name"; then + echo "Backend already running: $name" + exit 0 + fi + docker rm -f "$name" >/dev/null 2>&1 || true + docker run -d \ + --name "$name" \ + -p 3210:3210 \ + -p 3211:3211 \ + --shm-size=256m \ + --tmpfs /convex/data:rw,size=512m,mode=1777 \ + --tmpfs /tmp:rw,size=512m,mode=1777 \ + -e INSTANCE_SECRET="{{instance_secret}}" \ + -e IS_TEST=true \ + -e CONVEX_CLOUD_ORIGIN=http://127.0.0.1:3210 \ + -e CONVEX_SITE_ORIGIN=http://127.0.0.1:3211 \ + "{{convex_image}}" + just _wait-healthy http://127.0.0.1:3210 + +# Start infrastructure integration backend on port 3215 +start-infra: + #!/usr/bin/env bash + set -euo pipefail + name="convex-es-infra-backend" + if docker ps --filter "name=^${name}$" --format '{{{{.Names}}' | grep -qx "$name"; then + echo "Infra backend already running: $name" + exit 0 + fi + docker rm -f "$name" >/dev/null 2>&1 || true + docker run -d \ + --name "$name" \ + -p 3215:3210 \ + -p 3216:3211 \ + --shm-size=256m \ + --tmpfs /convex/data:rw,size=512m,mode=1777 \ + --tmpfs /tmp:rw,size=512m,mode=1777 \ + -e INSTANCE_SECRET="{{instance_secret}}" \ + -e IS_TEST=true \ + -e CONVEX_CLOUD_ORIGIN=http://127.0.0.1:3215 \ + -e CONVEX_SITE_ORIGIN=http://127.0.0.1:3216 \ + "{{convex_image}}" + just _wait-healthy http://127.0.0.1:3215 + +# Stop app integration backend +stop: + docker rm -f convex-es-test-backend >/dev/null 2>&1 || true + +# Stop infrastructure backend +stop-infra: + docker rm -f convex-es-infra-backend >/dev/null 2>&1 || true + +# Restart app integration backend with fresh tmpfs state +restart: stop start + +# Deploy order-management functions to the app integration backend +deploy-local: + #!/usr/bin/env bash + set -euo pipefail + admin_key="$(docker exec convex-es-test-backend /convex/generate_admin_key.sh | awk '/^convex-self-hosted\|/{print; exit} /^Admin key:/{getline; print; exit}')" + if [[ -z "$admin_key" ]]; then + admin_key="$(docker exec convex-es-test-backend /convex/generate_admin_key.sh | tr -d '\r' | awk 'NF{line=$0} END{print line}')" + fi + cd examples/order-management + CONVEX_DEPLOYMENT= \ + CONVEX_SELF_HOSTED_URL=http://127.0.0.1:3210 \ + CONVEX_SELF_HOSTED_ADMIN_KEY="$admin_key" \ + pnpm exec convex deploy -y --url http://127.0.0.1:3210 --admin-key "$admin_key" + # Container env is not visible to Convex app code; set deployment env explicitly. + CONVEX_DEPLOYMENT= \ + CONVEX_SELF_HOSTED_URL=http://127.0.0.1:3210 \ + CONVEX_SELF_HOSTED_ADMIN_KEY="$admin_key" \ + pnpm exec convex env set IS_TEST true --url http://127.0.0.1:3210 --admin-key "$admin_key" + +# Deploy order-management functions to the infrastructure backend +deploy-infra: + #!/usr/bin/env bash + set -euo pipefail + admin_key="$(docker exec convex-es-infra-backend /convex/generate_admin_key.sh | awk '/^convex-self-hosted\|/{print; exit} /^Admin key:/{getline; print; exit}')" + if [[ -z "$admin_key" ]]; then + admin_key="$(docker exec convex-es-infra-backend /convex/generate_admin_key.sh | tr -d '\r' | awk 'NF{line=$0} END{print line}')" + fi + cd examples/order-management + CONVEX_DEPLOYMENT= \ + CONVEX_SELF_HOSTED_URL=http://127.0.0.1:3215 \ + CONVEX_SELF_HOSTED_ADMIN_KEY="$admin_key" \ + pnpm exec convex deploy -y --url http://127.0.0.1:3215 --admin-key "$admin_key" + CONVEX_DEPLOYMENT= \ + CONVEX_SELF_HOSTED_URL=http://127.0.0.1:3215 \ + CONVEX_SELF_HOSTED_ADMIN_KEY="$admin_key" \ + pnpm exec convex env set IS_TEST true --url http://127.0.0.1:3215 --admin-key "$admin_key" + +# Full app integration cycle +test-integration: start deploy-local + pnpm --filter order-management test:integration:ci + +# Full infrastructure integration cycle (port 3215) +test-infrastructure-isolated: start-infra deploy-infra + CONVEX_URL=http://127.0.0.1:3215 pnpm --filter @libar-dev/platform-core test:integration:ci + CONVEX_URL=http://127.0.0.1:3215 pnpm --filter @libar-dev/platform-store test:integration:ci + CONVEX_URL=http://127.0.0.1:3215 pnpm --filter @libar-dev/platform-bus test:integration:ci + +# Start docker-compose.dev.yml (interactive development) +dev-start: + docker compose -f docker/docker-compose.dev.yml up -d + +dev-stop: + docker compose -f docker/docker-compose.dev.yml down + +_wait-healthy url: + #!/usr/bin/env bash + set -euo pipefail + url="{{url}}" + echo "Waiting for backend at $url ..." + for i in $(seq 1 60); do + if curl -sf "$url" >/dev/null 2>&1 || curl -sf "$url/version" >/dev/null 2>&1; then + echo "Backend healthy: $url" + exit 0 + fi + sleep 1 + done + echo "Backend failed to become healthy: $url" >&2 + exit 1 diff --git a/scripts/sdp-honesty-repair.mjs b/scripts/sdp-honesty-repair.mjs new file mode 100644 index 00000000..43cf843c --- /dev/null +++ b/scripts/sdp-honesty-repair.mjs @@ -0,0 +1,223 @@ +#!/usr/bin/env node +/** + * Repair honesty-floor errors left by the migrate-specs-to-sdp run: + * - 64 examples stated defined but derived only scoped (unbound/malformed slots) + * - 27 decisions stated defined with no authored relation + */ +import fs from "node:fs"; +import path from "node:path"; + +const ROOT = path.resolve(import.meta.dirname, ".."); +const SPECS = path.join(ROOT, "specs"); + +const EXAMPLE_IDS = new Set([ + "spec:behavior.frontend.admin.agent-approvals.click-approval-card-to-navigate-to-detail", + "spec:behavior.platform-core.dcb.scope-key.create-valid-scope-key-from-components", + "spec:behavior.platform-core.dcb.scope-key.scope-id-may-contain-colons-for-composite-identifiers", + "spec:behavior.platform-core.dcb.scope-key.create-scope-key-throws-on-invalid-input", + "spec:behavior.platform-core.dcb.scope-key.try-create-scope-key-returns-scope-key-for-valid-input", + "spec:behavior.platform-core.dcb.scope-key.try-create-scope-key-returns-null-for-invalid-input", + "spec:behavior.platform-core.dcb.scope-key.parse-valid-scope-key-into-components", + "spec:behavior.platform-core.dcb.scope-key.parse-scope-key-with-composite-scope-id-containing-colons", + "spec:behavior.platform-core.dcb.scope-key.parse-scope-key-returns-null-for-invalid-format", + "spec:behavior.platform-core.dcb.scope-key.validate-scope-key-returns-null-for-valid-scope-key", + "spec:behavior.platform-core.dcb.scope-key.validate-scope-key-returns-scope-key-empty-error-for-empty-string", + "spec:behavior.platform-core.dcb.scope-key.validate-scope-key-returns-error-for-missing-tenant-prefix", + "spec:behavior.platform-core.dcb.scope-key.validate-scope-key-returns-error-for-malformed-scope-key", + "spec:behavior.platform-core.dcb.scope-key.is-valid-scope-key-type-guard", + "spec:behavior.platform-core.dcb.scope-key.assert-valid-scope-key-throws-on-invalid-input", + "spec:behavior.platform-core.dcb.scope-key.assert-valid-scope-key-succeeds-on-valid-input", + "spec:behavior.platform-core.dcb.scope-key.is-scope-tenant-checks-tenant-membership", + "spec:behavior.platform-core.dcb.scope-key.extract-tenant-id-returns-tenant-id-from-scope-key", + "spec:behavior.platform-core.dcb.scope-key.extract-scope-type-returns-scope-type-from-scope-key", + "spec:behavior.platform-core.dcb.scope-key.extract-scope-id-returns-scope-id-from-scope-key", + "spec:behavior.platform-core.ecst.fat-event-builder.create-fat-event-with-schema-definition", + "spec:behavior.platform-core.ecst.fat-event-builder.schema-validation-failure", + "spec:behavior.platform-core.ecst.fat-event-builder.create-fat-event-with-correlation-id", + "spec:behavior.platform-core.ecst.privacy-markers.mark-single-field-for-shredding", + "spec:behavior.platform-core.ecst.privacy-markers.mark-multiple-fields-for-shredding", + "spec:behavior.platform-core.ecst.privacy-markers.non-pii-fields-are-not-marked", + "spec:behavior.platform-core.ecst.privacy-markers.mark-fields-in-collection-items", + "spec:behavior.platform-core.reservation.confirm-operation.confirm-reservation-with-entity-id", + "spec:behavior.platform-core.reservation.confirm-operation.cannot-confirm-expired-reservation", + "spec:behavior.platform-core.reservation.confirm-operation.cannot-confirm-already-confirmed-reservation", + "spec:behavior.platform-core.reservation.confirm-operation.cannot-confirm-non-existent-reservation", + "spec:behavior.platform-core.reservation.confirm-operation.cannot-confirm-released-reservation", + "spec:behavior.platform-core.reservation.confirm-operation.entity-id-is-required", + "spec:behavior.platform-core.reservation.confirm-operation.entity-id-can-be-any-string-identifier", + "spec:behavior.platform-core.reservation.release-operation.release-active-reservation", + "spec:behavior.platform-core.reservation.release-operation.released-value-can-be-immediately-reserved", + "spec:behavior.platform-core.reservation.release-operation.cannot-release-confirmed-reservation", + "spec:behavior.platform-core.reservation.release-operation.cannot-release-already-released-reservation", + "spec:behavior.platform-core.reservation.release-operation.cannot-release-expired-reservation", + "spec:behavior.platform-core.reservation.release-operation.cannot-release-non-existent-reservation", + "spec:behavior.platform-core.reservation.reservation-key.email-reservation-key-format", + "spec:behavior.platform-core.reservation.reservation-key.username-reservation-key-format", + "spec:behavior.platform-core.reservation.reservation-key.custom-type-reservation-key-format", + "spec:behavior.platform-core.reservation.reservation-key.same-value-different-types", + "spec:behavior.platform-core.reservation.reservation-key.independent-type-uniqueness", + "spec:behavior.platform-core.reservation.reservation-key.type-is-required", + "spec:behavior.platform-core.reservation.reservation-key.value-is-required", + "spec:behavior.platform-core.reservation.reservation-key.empty-type-is-invalid", + "spec:behavior.platform-core.reservation.reservation-key.empty-value-is-invalid", + "spec:behavior.platform-core.reservation.reservation-key.find-reservation-by-key", + "spec:behavior.platform-core.reservation.reservation-key.find-reservation-by-type-and-value", + "spec:behavior.platform-core.reservation.reservation-key.non-existent-key-returns-null", + "spec:behavior.platform-core.reservation.reservation-key.type-containing-colon-is-rejected", + "spec:behavior.platform-core.reservation.reservation-key.value-can-contain-colon-url-with-port", + "spec:behavior.platform-core.reservation.reserve-operation.reserve-an-email-address", + "spec:behavior.platform-core.reservation.reserve-operation.reserve-with-correlation-id", + "spec:behavior.platform-core.reservation.reserve-operation.reserved-value-cannot-be-re-reserved", + "spec:behavior.platform-core.reservation.reserve-operation.ttl-must-be-positive", + "spec:behavior.platform-core.reservation.reserve-operation.ttl-has-maximum-limit", + "spec:behavior.platform-core.reservation.reserve-operation.negative-ttl-is-rejected", + "spec:behavior.platform-core.reservation.reserve-operation.ttl-at-minimum-boundary-succeeds", + "spec:behavior.platform-core.reservation.reserve-operation.ttl-just-below-minimum-is-rejected", + "spec:behavior.platform-core.reservation.reserve-operation.whitespace-only-type-is-invalid", + "spec:behavior.platform-core.reservation.reserve-operation.whitespace-only-value-is-invalid", +]); + +function walk(dir, out = []) { + for (const name of fs.readdirSync(dir)) { + if (name === "generated" || name === "node_modules") continue; + const full = path.join(dir, name); + const st = fs.statSync(full); + if (st.isDirectory()) walk(full, out); + else if (name.endsWith(".sdp.md") && !name.endsWith(".pack.sdp.md")) out.push(full); + } + return out; +} + +function split(text) { + if (!text.startsWith("---\n")) return null; + const end = text.indexOf("\n---\n", 4); + if (end === -1) return null; + return { fm: text.slice(4, end), body: text.slice(end + 5) }; +} + +function field(fm, name) { + const m = fm.match(new RegExp(`^${name}:\\s*(.*)$`, "m")); + return m ? m[1].trim() : ""; +} + +function setField(fm, name, value) { + return fm.replace(new RegExp(`^${name}:\\s*.*$`, "m"), `${name}: ${value}`); +} + +function upsertRelation(fm, name, value) { + if (new RegExp(`^\\s+${name}:\\s+\\S`, "m").test(fm)) return fm; + if (/^relations:\s*\{\}\s*$/m.test(fm)) { + return fm.replace(/^relations:\s*\{\}\s*$/m, `relations:\n ${name}: ${value}`); + } + if (/^relations:\s*$/m.test(fm)) { + return fm.replace(/^relations:\s*$/m, `relations:\n ${name}: ${value}`); + } + return fm.replace(/^(relations:\n)/m, `$1 ${name}: ${value}\n`); +} + +const decisionsEpic = path.join(SPECS, "decisions", "_epic.sdp.md"); +fs.writeFileSync( + decisionsEpic, + `--- +id: spec:decisions.process +kind: decision +altitude: epic +readiness: idea +relations: {} +--- +# Process decision registry + +## Intent + +- outcome: Hold the monorepo Process Decision Records as a single refinement parent so each PDR can declare a relation without inventing a second decision. + +## Decision + +- decision: Every PDR under specs/decisions/ refines spec:decisions.process. +`, +); + +const releasesEpic = path.join(SPECS, "releases", "_epic.sdp.md"); +fs.writeFileSync( + releasesEpic, + `--- +id: spec:releases.line +kind: decision +altitude: epic +readiness: idea +relations: {} +--- +# Release boundary registry + +## Intent + +- outcome: Hold numbered and vNEXT release-boundary Specs as a single refinement parent. + +## Decision + +- decision: Every release Spec under specs/releases/ refines spec:releases.line. +`, +); + +let edited = 0; +for (const file of walk(SPECS)) { + const text = fs.readFileSync(file, "utf8"); + const parts = split(text); + if (!parts) continue; + let { fm, body } = parts; + const id = field(fm, "id"); + let changed = false; + + if (EXAMPLE_IDS.has(id) && field(fm, "readiness") === "defined") { + fm = setField(fm, "readiness", "scoped"); + changed = true; + } + + if (id.startsWith("spec:decisions.pdr-")) { + const next = upsertRelation(fm, "refines", "spec:decisions.process"); + if (next !== fm) { + fm = next; + changed = true; + } + } + + if (id.startsWith("spec:releases.v")) { + const next = upsertRelation(fm, "refines", "spec:releases.line"); + if (next !== fm) { + fm = next; + changed = true; + } + } + + if (id === "spec:platform.test-content-blocks" && field(fm, "kind") === "example") { + fm = setField(fm, "kind", "behavior"); + fm = setField(fm, "altitude", "feature"); + changed = true; + } + + if (!changed) continue; + fs.writeFileSync(file, `---\n${fm}\n---\n${body.startsWith("\n") ? body : body}`); + edited += 1; +} + +const decisionsPack = path.join(SPECS, "decisions.pack.sdp.md"); +let pack = fs.readFileSync(decisionsPack, "utf8"); +if (!pack.includes("spec:decisions.process")) { + pack = pack.replace( + "specs:\n - spec:decisions.pdr-001", + "specs:\n - spec:decisions.process\n - spec:decisions.pdr-001", + ); + fs.writeFileSync(decisionsPack, pack); +} + +const releasesPack = path.join(SPECS, "releases.pack.sdp.md"); +let rpack = fs.readFileSync(releasesPack, "utf8"); +if (!rpack.includes("spec:releases.line")) { + rpack = rpack.replace( + "specs:\n - spec:releases.v0.1.0", + "specs:\n - spec:releases.line\n - spec:releases.v0.1.0", + ); + fs.writeFileSync(releasesPack, rpack); +} + +console.log(JSON.stringify({ edited, decisionsEpic: true, releasesEpic: true }, null, 2)); diff --git a/scripts/sdp-protocol-migrate.mjs b/scripts/sdp-protocol-migrate.mjs new file mode 100644 index 00000000..4d72295b --- /dev/null +++ b/scripts/sdp-protocol-migrate.mjs @@ -0,0 +1,289 @@ +#!/usr/bin/env node +/** + * Mechanical Libar SDP protocol upgrade for the already-extracted specs/ corpus. + * + * Safe / idempotent: + * - adds example `verifies` to the refining parent + * - rewrites title-echo Decision stubs from lineage PDR features + * - rewrites "Executable scenario:" / "Unimplemented deliverable:" outcome stubs + * - never invents example-space (Markdown gwt-vocabulary allows exactly one When) + * - never states `ready` + * + * Usage: node scripts/sdp-protocol-migrate.mjs [--dry-run] + */ +import fs from "node:fs"; +import path from "node:path"; + +const ROOT = path.resolve(import.meta.dirname, ".."); +const SPECS = path.join(ROOT, "specs"); +const LINEAGE_DECISIONS = path.join( + ROOT, + "docs", + "lineage", + "architect", + "decisions", +); +const DRY_RUN = process.argv.includes("--dry-run"); +const SKIP = new Set(["node_modules", "dist", "generated", "coverage", ".git"]); + +function walk(dir, pred, out = []) { + if (!fs.existsSync(dir)) return out; + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + if (entry.name.startsWith(".")) continue; + const full = path.join(dir, entry.name); + if (entry.isDirectory()) { + if (SKIP.has(entry.name)) continue; + walk(full, pred, out); + continue; + } + if (entry.isFile() && pred(full, entry.name)) out.push(full); + } + return out; +} + +function splitFrontmatter(text) { + if (!text.startsWith("---\n")) return null; + const end = text.indexOf("\n---\n", 4); + if (end === -1) return null; + return { + fm: text.slice(4, end), + body: text.slice(end + 5), + }; +} + +function field(fm, name) { + const m = fm.match(new RegExp(`^${name}:\\s*(.*)$`, "m")); + return m ? m[1].trim() : ""; +} + +function hasRelation(fm, name) { + return new RegExp(`^\\s+${name}:\\s+\\S`, "m").test(fm); +} + +function relationValue(fm, name) { + const m = fm.match(new RegExp(`^\\s+${name}:\\s+(\\S+)`, "m")); + return m ? m[1].trim() : ""; +} + +function upsertRelation(fm, name, value) { + if (hasRelation(fm, name)) return fm; + if (/^relations:\s*\{\}\s*$/m.test(fm)) { + return fm.replace( + /^relations:\s*\{\}\s*$/m, + `relations:\n ${name}: ${value}`, + ); + } + if (/^relations:\s*$/m.test(fm)) { + return fm.replace(/^relations:\s*$/m, `relations:\n ${name}: ${value}`); + } + return fm.replace(/^(relations:\n)/m, `$1 ${name}: ${value}\n`); +} + +function setField(fm, name, value) { + if (new RegExp(`^${name}:\\s*`, "m").test(fm)) { + return fm.replace(new RegExp(`^${name}:\\s*.*$`, "m"), `${name}: ${value}`); + } + return fm; +} + +function sanitizeLine(text, limit = 500) { + return text.replace(/\s+/g, " ").trim().slice(0, limit); +} + +function extractRule(featureText, headingRe) { + const lines = featureText.split("\n"); + let capturing = false; + const buf = []; + for (const line of lines) { + const trimmed = line.trim(); + if (/^Rule:/.test(trimmed)) { + if (capturing) break; + capturing = headingRe.test(trimmed); + continue; + } + if (capturing) { + if ( + /^(Background:|Scenario:|Scenario Outline:|Example:|@)/.test(trimmed) + ) { + break; + } + if (trimmed) buf.push(trimmed); + } + } + return sanitizeLine(buf.join(" "), 700); +} + +function decisionSource(stem) { + const direct = path.join(LINEAGE_DECISIONS, `${stem}.feature`); + if (fs.existsSync(direct)) return fs.readFileSync(direct, "utf8"); + const matches = walk( + LINEAGE_DECISIONS, + (_full, name) => name.startsWith(stem) && name.endsWith(".feature"), + ); + return matches[0] ? fs.readFileSync(matches[0], "utf8") : ""; +} + +function replaceKeyed(body, heading, key, value) { + const headingRe = new RegExp(`^## ${heading}\\s*$`, "m"); + if (!headingRe.test(body)) { + return `${body.trimEnd()}\n\n## ${heading}\n\n- ${key}: ${value}\n`; + } + const keyRe = new RegExp(`^(- ${key}: ).*$`, "m"); + if (keyRe.test(body)) return body.replace(keyRe, `$1${value}`); + return body.replace(headingRe, `## ${heading}\n\n- ${key}: ${value}`); +} + +function ensureDecisionFields(body, fields) { + let next = body; + for (const [key, value] of Object.entries(fields)) { + if (!value) continue; + next = replaceKeyed(next, "Decision", key, value); + } + return next; +} + +function rewriteOutcome(body, outcome) { + if (!outcome) return body; + if (/^- outcome: /m.test(body)) { + return body.replace(/^- outcome: .*$/m, `- outcome: ${outcome}`); + } + return body.replace( + /^## Intent\s*$/m, + `## Intent\n\n- outcome: ${outcome}`, + ); +} + +const files = walk( + SPECS, + (_full, name) => name.endsWith(".sdp.md") && !name.endsWith(".pack.sdp.md"), +); + +/** @type {Map} */ +const byFile = new Map(); +/** @type {Map} */ +const idToFile = new Map(); + +for (const file of files) { + const text = fs.readFileSync(file, "utf8"); + const parts = splitFrontmatter(text); + if (!parts) continue; + const id = field(parts.fm, "id"); + const rec = { file, ...parts, text }; + byFile.set(file, rec); + if (id) idToFile.set(id, file); +} + +let edited = 0; +const counts = { + verifies: 0, + outcomes: 0, + decisions: 0, +}; + +for (const rec of byFile.values()) { + let { fm, body } = rec; + const kind = field(fm, "kind"); + const id = field(fm, "id"); + const title = (body.match(/^# (.+)$/m) || [, ""])[1].trim(); + let changed = false; + + if (kind === "example") { + const parent = relationValue(fm, "refines"); + if (parent && !hasRelation(fm, "verifies")) { + fm = upsertRelation(fm, "verifies", parent); + counts.verifies += 1; + changed = true; + } + + const outcomeMatch = body.match(/^- outcome:\s*(.*)$/m); + const outcome = outcomeMatch ? outcomeMatch[1].trim() : ""; + if (/^Executable scenario:/i.test(outcome)) { + const rest = outcome.replace(/^Executable scenario:\s*/i, "").trim(); + const next = sanitizeLine( + rest ? `Show that ${rest.replace(/\.$/, "")}.` : `Show that ${title}.`, + ); + body = rewriteOutcome(body, next); + counts.outcomes += 1; + changed = true; + } + } + + if (kind === "decision") { + const outcomeMatch = body.match(/^- outcome:\s*(.*)$/m); + const outcome = outcomeMatch ? outcomeMatch[1].trim() : ""; + const decisionMatch = body.match(/^- decision:\s*(.*)$/m); + const decision = decisionMatch ? decisionMatch[1].trim() : ""; + const stubby = + !decision || + decision === title || + decision === outcome || + decision.length < 40; + + if (stubby) { + const stem = path.basename(rec.file, ".sdp.md"); + const source = decisionSource(stem); + if (source) { + const context = extractRule(source, /Context/i); + const chosen = extractRule(source, /Decision/i); + const consequences = extractRule(source, /Consequence/i); + if (chosen) { + const nextOutcome = sanitizeLine( + `Record the process decision: ${title.replace(/^PDR-\d+\s*-?\s*/i, "")}.`, + ); + body = rewriteOutcome(body, nextOutcome); + body = ensureDecisionFields(body, { + context: context || undefined, + decision: chosen, + consequence: consequences || undefined, + }); + counts.decisions += 1; + changed = true; + } + } + } + } + + if (kind === "behavior") { + const outcomeMatch = body.match(/^- outcome:\s*(.*)$/m); + const outcome = outcomeMatch ? outcomeMatch[1].trim() : ""; + if (/^Unimplemented deliverable:/i.test(outcome)) { + const rest = outcome + .replace(/^Unimplemented deliverable:\s*/i, "") + .replace(/\s+at\s+\S.*$/, "") + .trim(); + const next = sanitizeLine( + `Capture the still-unimplemented deliverable "${rest || title}" until it is authored to a higher readiness rung.`, + ); + body = rewriteOutcome(body, next); + counts.outcomes += 1; + changed = true; + } else if ( + /^Preserve the former architect pattern /i.test(outcome) && + title + ) { + const next = sanitizeLine( + `Preserve the former architect pattern "${title}" as a delivery Spec so implementation can bind to a stable identity.`, + ); + if (next !== outcome) { + body = rewriteOutcome(body, next); + counts.outcomes += 1; + changed = true; + } + } + } + + void id; + if (!changed) continue; + const next = `---\n${fm}\n---\n${body.startsWith("\n") ? body : body}`; + if (next === rec.text) continue; + edited += 1; + if (!DRY_RUN) fs.writeFileSync(rec.file, next); +} + +const summary = { + files: files.length, + edited, + ...counts, + dryRun: DRY_RUN, +}; +console.log(JSON.stringify(summary, null, 2)); diff --git a/scripts/sdp-prune-low-value.mjs b/scripts/sdp-prune-low-value.mjs new file mode 100644 index 00000000..fd6c8350 --- /dev/null +++ b/scripts/sdp-prune-low-value.mjs @@ -0,0 +1,86 @@ +#!/usr/bin/env node +/** + * Remove Specs that add no unique intent after a file-by-file check. + * + * Kept on purpose: + * - unimplemented/deliverables/** except the demo fixture (named remaining work) + * - specs/platform/patterns/** (authored outcomes + codeAnchor surface) + * + * Removed: + * - unimplemented/current and unimplemented/remaining: docs-living status dumps + * whose durable intent already lives on specs/platform/* and deliverable children + * - the test-content-blocks demo fixture and its title-echo parent + */ +import fs from "node:fs"; +import path from "node:path"; + +const ROOT = path.resolve(import.meta.dirname, ".."); +const SPECS = path.join(ROOT, "specs"); + +const DELETE_PATHS = [ + path.join(SPECS, "unimplemented", "current"), + path.join(SPECS, "unimplemented", "remaining"), + path.join( + SPECS, + "unimplemented", + "deliverables", + "test-content-blocks", + ), + path.join(SPECS, "test-content-blocks.sdp.md"), +]; + +const DROP_IDS = new Set([ + "spec:unimplemented.current.phase-100-codec-driven-reference-generation", + "spec:unimplemented.current.phase-100-themed-decision-architecture", + "spec:unimplemented.current.phase-15-projection-categories-executable-tests", + "spec:unimplemented.current.phase-22-agent-as-bounded-context", + "spec:unimplemented.current.phase-22-agent-as-bounded-context-ai-driven-event-reactors", + "spec:unimplemented.current.phase-22-agent-churn-risk-completion", + "spec:unimplemented.current.phase-22-confirmed-order-cancellation", + "spec:unimplemented.remaining.phase-100-themed-decision-architecture", + "spec:unimplemented.remaining.phase-18-production-hardening", + "spec:unimplemented.remaining.phase-18-workpool-partitioning-strategy", + "spec:unimplemented.remaining.phase-20-reservation-pattern", + "spec:unimplemented.remaining.phase-21-integration-patterns-21b", + "spec:unimplemented.remaining.phase-22-agent-as-bounded-context", + "spec:unimplemented.remaining.phase-22-agent-as-bounded-context-ai-driven-event-reactors", + "spec:unimplemented.remaining.phase-22-agent-churn-risk-completion", + "spec:unimplemented.remaining.phase-22-confirmed-order-cancellation", + "spec:unimplemented.test-content-blocks.demo-item-1", + "spec:platform.test-content-blocks", +]); + +function rm(target) { + if (!fs.existsSync(target)) return false; + fs.rmSync(target, { recursive: true, force: true }); + return true; +} + +function rewritePack(file, drop) { + const text = fs.readFileSync(file, "utf8"); + const lines = text.split("\n"); + const next = lines.filter((line) => { + const m = line.match(/^\s+-\s+(spec:\S+)\s*$/); + return !(m && drop.has(m[1])); + }); + let body = next.join("\n"); + if (file.endsWith("unimplemented.pack.sdp.md")) { + body = body.replace( + "Non-implemented architect deliverables, remaining-work items, and in-flight docs-living rows.", + "Named remaining-work items that refine a live platform Spec. Status dumps from docs-living are not carriers.", + ); + } + fs.writeFileSync(file, body); +} + +const removed = DELETE_PATHS.filter(rm); +rewritePack(path.join(SPECS, "unimplemented.pack.sdp.md"), DROP_IDS); +rewritePack(path.join(SPECS, "platform.pack.sdp.md"), DROP_IDS); + +console.log( + JSON.stringify( + { removed, droppedIds: [...DROP_IDS].sort() }, + null, + 2, + ), +); diff --git a/specs/README.md b/specs/README.md index dadf1ffc..675c88fa 100644 --- a/specs/README.md +++ b/specs/README.md @@ -9,9 +9,11 @@ Carriers are Markdown: Specs as `*.sdp.md`, Packs as `*.pack.sdp.md`. Identity b SDP extraction and validation. - Feature files under `packages/`, `examples/`, and `apps/` remain Cucumber test carriers; each - Feature has a behavior Spec and each Scenario has an example Spec under `specs/behavior/**/**.examples/`. -- Non-implemented architect deliverables, architect design scenarios, and docs-living remaining/current - work live under `specs/unimplemented/`. + Feature has a behavior Spec, and Scenarios with authored intent have example Specs under + `specs/behavior/**/**.examples/`. Pure title-echo scenario mirrors were pruned; the `.feature` + files are the source of truth for those scenarios. +- Named remaining-work items live under `specs/unimplemented/deliverables/` and refine a live + platform Spec. Retired docs-living status dumps are not carriers. - The `architect/` tree may still exist as lineage; bare `.feature` files are not SDP carriers. ## Packs diff --git a/specs/behavior/frontend/admin/add-stock.examples/s-001-add-stock-successfully.sdp.md b/specs/behavior/frontend/admin/add-stock.examples/s-001-add-stock-successfully.sdp.md index 0320bf99..3f108dc7 100644 --- a/specs/behavior/frontend/admin/add-stock.examples/s-001-add-stock-successfully.sdp.md +++ b/specs/behavior/frontend/admin/add-stock.examples/s-001-add-stock-successfully.sdp.md @@ -2,21 +2,21 @@ id: spec:behavior.frontend.admin.add-stock.add-stock-successfully kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.add-stock + verifies: spec:behavior.frontend.admin.add-stock --- -# Successfully add stock to existing product +# Add stock successfully ## Intent -- outcome: Executable scenario: Successfully add stock to existing product +- outcome: Show that adding stock to a selected product increases available units after the command succeeds. ```gwt -Given the backend is running and clean -And a product "prod-stock-01" exists with 0 stock -When I add stock to product "prod-stock-01": -Then the command should succeed -And I wait for projections to process -And the product "prod-stock-01" should have 50 available stock +Given a product "Stock Test Widget" with SKU "STW-001" exists +And I am on the admin products page +When I switch to the "Add Stock" tab and I select the product "Stock Test Widget" and I enter quantity 50 and I click "Add Stock" +Then I should see a success message containing "Stock added successfully" +And eventually the product "Stock Test Widget" should show 50 units in stock ``` diff --git a/specs/behavior/frontend/admin/add-stock.examples/s-002-add-stock-with-reason.sdp.md b/specs/behavior/frontend/admin/add-stock.examples/s-002-add-stock-with-reason.sdp.md index c8174653..e3065fd1 100644 --- a/specs/behavior/frontend/admin/add-stock.examples/s-002-add-stock-with-reason.sdp.md +++ b/specs/behavior/frontend/admin/add-stock.examples/s-002-add-stock-with-reason.sdp.md @@ -2,18 +2,20 @@ id: spec:behavior.frontend.admin.add-stock.add-stock-with-reason kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.add-stock + verifies: spec:behavior.frontend.admin.add-stock --- -# Reject adding stock to non-existent product +# Add stock with reason ## Intent -- outcome: Executable scenario: Reject adding stock to non-existent product +- outcome: Show that adding stock can include a restock reason on the same submit. ```gwt -Given the backend is running and clean -When I add stock to product "prod-nonexistent": -Then the command should be rejected with code "PRODUCT_NOT_FOUND" +Given a product "Stock Test Widget" with SKU "STW-001" exists +And I am on the admin products page +When I switch to the "Add Stock" tab and I select the product "Stock Test Widget" and I enter quantity 25 and I enter reason "Restocking from supplier shipment" and I click "Add Stock" +Then I should see a success message containing "Stock added successfully" ``` diff --git a/specs/behavior/frontend/admin/add-stock.examples/s-003-cannot-add-stock-without-selecting-product.sdp.md b/specs/behavior/frontend/admin/add-stock.examples/s-003-cannot-add-stock-without-selecting-product.sdp.md index b8dd0181..48280040 100644 --- a/specs/behavior/frontend/admin/add-stock.examples/s-003-cannot-add-stock-without-selecting-product.sdp.md +++ b/specs/behavior/frontend/admin/add-stock.examples/s-003-cannot-add-stock-without-selecting-product.sdp.md @@ -2,19 +2,20 @@ id: spec:behavior.frontend.admin.add-stock.cannot-add-stock-without-selecting-product kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.add-stock + verifies: spec:behavior.frontend.admin.add-stock --- -# AddStock is idempotent with same commandId +# Cannot add stock without selecting product ## Intent -- outcome: Executable scenario: AddStock is idempotent with same commandId +- outcome: Show that add-stock is rejected when no product is selected. ```gwt -Given the backend is running and clean -And a product "prod-stock-02" exists with 10 stock -When I add stock with commandId "cmd-stock-idem-01" to product "prod-stock-02": and I repeat adding stock with commandId "cmd-stock-idem-01" to product "prod-stock-02": -Then the second command should return duplicate status +Given a product "Stock Test Widget" with SKU "STW-001" exists +And I am on the admin products page +When I switch to the "Add Stock" tab and I enter quantity 50 and I click "Add Stock" +Then I should see validation error "Please select a product" ``` diff --git a/specs/behavior/frontend/admin/add-stock.examples/s-004-cannot-add-zero-quantity.sdp.md b/specs/behavior/frontend/admin/add-stock.examples/s-004-cannot-add-zero-quantity.sdp.md index 89110aa0..fc2acb71 100644 --- a/specs/behavior/frontend/admin/add-stock.examples/s-004-cannot-add-zero-quantity.sdp.md +++ b/specs/behavior/frontend/admin/add-stock.examples/s-004-cannot-add-zero-quantity.sdp.md @@ -2,19 +2,20 @@ id: spec:behavior.frontend.admin.add-stock.cannot-add-zero-quantity kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.add-stock + verifies: spec:behavior.frontend.admin.add-stock --- -# AddStock is idempotent with same commandId +# Cannot add zero quantity ## Intent -- outcome: Executable scenario: AddStock is idempotent with same commandId +- outcome: Show that add-stock is rejected when the quantity is zero. ```gwt -Given the system is ready -And a product "prod_stock_003" exists with stock -When I send an AddStock command twice with the same commandId for product "prod_stock_003" -Then the second command should return duplicate status +Given a product "Stock Test Widget" with SKU "STW-001" exists +And I am on the admin products page +When I switch to the "Add Stock" tab and I select the product "Stock Test Widget" and I enter quantity 0 and I click "Add Stock" +Then I should see validation error "Quantity must be at least 1" ``` diff --git a/specs/behavior/frontend/admin/add-stock.examples/s-005-cannot-add-stock-without-quantity.sdp.md b/specs/behavior/frontend/admin/add-stock.examples/s-005-cannot-add-stock-without-quantity.sdp.md index acb0c28f..53c19fab 100644 --- a/specs/behavior/frontend/admin/add-stock.examples/s-005-cannot-add-stock-without-quantity.sdp.md +++ b/specs/behavior/frontend/admin/add-stock.examples/s-005-cannot-add-stock-without-quantity.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.add-stock.cannot-add-stock-without-quantity kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.add-stock + verifies: spec:behavior.frontend.admin.add-stock --- # Cannot add stock without quantity ## Intent -- outcome: Executable scenario: Cannot add stock without quantity +- outcome: Show that add-stock is rejected when quantity is omitted. ```gwt Given a product "Stock Test Widget" with SKU "STW-001" exists diff --git a/specs/behavior/frontend/admin/add-stock.sdp.md b/specs/behavior/frontend/admin/add-stock.sdp.md index 07192ce0..06d11a3c 100644 --- a/specs/behavior/frontend/admin/add-stock.sdp.md +++ b/specs/behavior/frontend/admin/add-stock.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.frontend.admin.add-stock kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend --- @@ -11,4 +11,4 @@ relations: ## Intent - actor: an inventory manager -- outcome: to add stock to existing products so that products are available for sale +- outcome: Add stock to existing products so those products are available for sale. diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-001-view-agents-dashboard-with-pending-approvals.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-001-view-agents-dashboard-with-pending-approvals.sdp.md index 77b8d874..f7d48b24 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-001-view-agents-dashboard-with-pending-approvals.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-001-view-agents-dashboard-with-pending-approvals.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.view-agents-dashboard-with-pending-approvals kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # View agents dashboard with pending approvals ## Intent -- outcome: Executable scenario: View agents dashboard with pending approvals +- outcome: Show that the agents dashboard displays pending-approval, active-agent, and events-processed counts. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-002-view-agents-dashboard-with-no-pending-approvals.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-002-view-agents-dashboard-with-no-pending-approvals.sdp.md index 6ad6ac49..f1f0d013 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-002-view-agents-dashboard-with-no-pending-approvals.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-002-view-agents-dashboard-with-no-pending-approvals.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.view-agents-dashboard-with-no-pending-approvals kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # View agents dashboard with no pending approvals ## Intent -- outcome: Executable scenario: View agents dashboard with no pending approvals +- outcome: Show that the agents dashboard reports zero pending approvals and hides the pending badge. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-003-navigate-to-approval-detail-from-dashboard.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-003-navigate-to-approval-detail-from-dashboard.sdp.md index 67276459..f298505c 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-003-navigate-to-approval-detail-from-dashboard.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-003-navigate-to-approval-detail-from-dashboard.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.navigate-to-approval-detail-from-dashboard kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Navigate to approval detail from dashboard ## Intent -- outcome: Executable scenario: Navigate to approval detail from dashboard +- outcome: Show that clicking an approval card from the dashboard opens that approval's detail page. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-004-view-approval-list-with-pending-approvals.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-004-view-approval-list-with-pending-approvals.sdp.md index 87fcbbc3..684b5445 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-004-view-approval-list-with-pending-approvals.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-004-view-approval-list-with-pending-approvals.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.view-approval-list-with-pending-approvals kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # View approval list with pending approvals ## Intent -- outcome: Executable scenario: View approval list with pending approvals +- outcome: Show that the pending-approvals tab lists cards with action type, agent, confidence text, and expiration. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-005-filter-approvals-by-status.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-005-filter-approvals-by-status.sdp.md index d3c6c496..bb8dd708 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-005-filter-approvals-by-status.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-005-filter-approvals-by-status.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.filter-approvals-by-status kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Filter approvals by status ## Intent -- outcome: Executable scenario: Filter approvals by status +- outcome: Show that filtering approvals by approved status shows only approved badges. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-006-click-approval-card-to-navigate-to-detail.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-006-click-approval-card-to-navigate-to-detail.sdp.md index 3b716eeb..34a868ed 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-006-click-approval-card-to-navigate-to-detail.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-006-click-approval-card-to-navigate-to-detail.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.click-approval-card-to-navigate-to-detail kind: example altitude: story -readiness: idea +readiness: scoped relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Click approval card to navigate to detail ## Intent -- outcome: Executable scenario: Click approval card to navigate to detail +- outcome: Show that clicking an approval card navigates to that approval's detail route. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-007-view-pending-approval-detail.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-007-view-pending-approval-detail.sdp.md index 8805bf46..036d6466 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-007-view-pending-approval-detail.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-007-view-pending-approval-detail.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.view-pending-approval-detail kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # View pending approval detail ## Intent -- outcome: Executable scenario: View pending approval detail +- outcome: Show that a pending approval detail includes action, agent, confidence text, payload, and expiration. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-008-view-already-approved-approval.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-008-view-already-approved-approval.sdp.md index 0afe5bae..4d7f639d 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-008-view-already-approved-approval.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-008-view-already-approved-approval.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.view-already-approved-approval kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # View already approved approval ## Intent -- outcome: Executable scenario: View already approved approval +- outcome: Show that an already-approved approval shows reviewer details and hides the action panel. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-009-view-already-rejected-approval.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-009-view-already-rejected-approval.sdp.md index 20ae1f57..33dace9d 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-009-view-already-rejected-approval.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-009-view-already-rejected-approval.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.view-already-rejected-approval kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # View already rejected approval ## Intent -- outcome: Executable scenario: View already rejected approval +- outcome: Show that an already-rejected approval shows rejected status and hides the action panel. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-010-view-expired-approval.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-010-view-expired-approval.sdp.md index c93db51f..df4807db 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-010-view-expired-approval.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-010-view-expired-approval.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.view-expired-approval kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # View expired approval ## Intent -- outcome: Executable scenario: View expired approval +- outcome: Show that an expired approval shows expired status and blocks further action. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-011-confidence-conveyed-via-text-label-wcag-1-4-1.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-011-confidence-conveyed-via-text-label-wcag-1-4-1.sdp.md index 5cf6ea49..b34d8fcc 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-011-confidence-conveyed-via-text-label-wcag-1-4-1.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-011-confidence-conveyed-via-text-label-wcag-1-4-1.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.confidence-conveyed-via-text-label-wcag-1-4-1 kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Confidence conveyed via text label (WCAG 1.4.1) ## Intent -- outcome: Executable scenario: Confidence conveyed via text label (WCAG 1.4.1) +- outcome: Show that confidence is conveyed as a text label such as Low: 55%, not color alone. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-012-approve-pending-action-with-note.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-012-approve-pending-action-with-note.sdp.md index 631e4c6f..d9d61411 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-012-approve-pending-action-with-note.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-012-approve-pending-action-with-note.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.approve-pending-action-with-note kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Approve pending action with note ## Intent -- outcome: Executable scenario: Approve pending action with note +- outcome: Show that approving a pending action with a note disables the buttons and returns to the list. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-013-reject-pending-action-with-note.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-013-reject-pending-action-with-note.sdp.md index 1f5eea57..d1049e45 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-013-reject-pending-action-with-note.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-013-reject-pending-action-with-note.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.reject-pending-action-with-note kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Reject pending action with note ## Intent -- outcome: Executable scenario: Reject pending action with note +- outcome: Show that rejecting a pending action with a note returns the admin to the approvals list. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-014-approve-without-note.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-014-approve-without-note.sdp.md index 52185bd9..6c8efaf8 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-014-approve-without-note.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-014-approve-without-note.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.approve-without-note kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Approve without note ## Intent -- outcome: Executable scenario: Approve without note +- outcome: Show that approving without a note still succeeds and records an empty review note. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-015-error-during-approve-action.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-015-error-during-approve-action.sdp.md index 836f2048..293fb6ec 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-015-error-during-approve-action.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-015-error-during-approve-action.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.error-during-approve-action kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Error during approve action ## Intent -- outcome: Executable scenario: Error during approve action +- outcome: Show that an approve error surfaces an alert and re-enables the action buttons. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-016-cannot-act-on-expired-approvals.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-016-cannot-act-on-expired-approvals.sdp.md index 282f0a3d..65b234d7 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-016-cannot-act-on-expired-approvals.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-016-cannot-act-on-expired-approvals.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.cannot-act-on-expired-approvals kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Cannot act on expired approvals ## Intent -- outcome: Executable scenario: Cannot act on expired approvals +- outcome: Show that an expired approval detail hides the take-action panel. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-017-view-active-agents-in-monitoring-tab.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-017-view-active-agents-in-monitoring-tab.sdp.md index a4dd812f..4bfe3bab 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-017-view-active-agents-in-monitoring-tab.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-017-view-active-agents-in-monitoring-tab.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.view-active-agents-in-monitoring-tab kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # View active agents in monitoring tab ## Intent -- outcome: Executable scenario: View active agents in monitoring tab +- outcome: Show that the monitoring tab lists active agent checkpoint cards. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-018-view-agent-checkpoint-details.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-018-view-agent-checkpoint-details.sdp.md index a6751aa7..f05a2b37 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-018-view-agent-checkpoint-details.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-018-view-agent-checkpoint-details.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.view-agent-checkpoint-details kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # View agent checkpoint details ## Intent -- outcome: Executable scenario: View agent checkpoint details +- outcome: Show that a checkpoint card reports events processed and active status for the named agent. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-019-no-active-agents.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-019-no-active-agents.sdp.md index 24122344..6e42f5d8 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-019-no-active-agents.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-019-no-active-agents.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.no-active-agents kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # No active agents ## Intent -- outcome: Executable scenario: No active agents +- outcome: Show that the monitoring tab shows an empty state when no agents have checkpoints. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-020-view-agent-decision-history.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-020-view-agent-decision-history.sdp.md index db856928..1ee5b48d 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-020-view-agent-decision-history.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-020-view-agent-decision-history.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.view-agent-decision-history kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # View agent decision history ## Intent -- outcome: Executable scenario: View agent decision history +- outcome: Show that decision history lists past agent decisions with type, time, confidence, and action. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-021-view-decision-detail-with-reasoning.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-021-view-decision-detail-with-reasoning.sdp.md index 65a8bf18..fe4c3a62 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-021-view-decision-detail-with-reasoning.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-021-view-decision-detail-with-reasoning.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.view-decision-detail-with-reasoning kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # View decision detail with reasoning ## Intent -- outcome: Executable scenario: View decision detail with reasoning +- outcome: Show that opening a history decision reveals reasoning, triggering events, and approval need. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-022-empty-decision-history.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-022-empty-decision-history.sdp.md index 387ee8f0..57fa7cdf 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-022-empty-decision-history.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-022-empty-decision-history.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.empty-decision-history kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Empty decision history ## Intent -- outcome: Executable scenario: Empty decision history +- outcome: Show that empty decision history explains what will appear when the agent decides. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-023-view-customers-approaching-churn-threshold.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-023-view-customers-approaching-churn-threshold.sdp.md index 38b739be..e49b51c9 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-023-view-customers-approaching-churn-threshold.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-023-view-customers-approaching-churn-threshold.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.view-customers-approaching-churn-threshold kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # View customers approaching churn threshold ## Intent -- outcome: Executable scenario: View customers approaching churn threshold +- outcome: Show that risk preview lists customers approaching the churn-cancellation threshold. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-024-customer-risk-progress-indicator.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-024-customer-risk-progress-indicator.sdp.md index 23a03cd1..ce94102e 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-024-customer-risk-progress-indicator.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-024-customer-risk-progress-indicator.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.customer-risk-progress-indicator kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Customer risk progress indicator ## Intent -- outcome: Executable scenario: Customer risk progress indicator +- outcome: Show that a customer risk progress indicator is accessible and not color-only. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-025-no-customers-approaching-threshold.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-025-no-customers-approaching-threshold.sdp.md index 8b132deb..2867b56b 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-025-no-customers-approaching-threshold.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-025-no-customers-approaching-threshold.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.no-customers-approaching-threshold kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # No customers approaching threshold ## Intent -- outcome: Executable scenario: No customers approaching threshold +- outcome: Show that risk preview explains when no customers are approaching the threshold. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-026-navigate-to-low-stock-restock-approval-detail.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-026-navigate-to-low-stock-restock-approval-detail.sdp.md index 2260c595..be5f5ba6 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-026-navigate-to-low-stock-restock-approval-detail.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-026-navigate-to-low-stock-restock-approval-detail.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.navigate-to-low-stock-restock-approval-detail kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Navigate to low stock restock approval detail ## Intent -- outcome: Executable scenario: Navigate to low stock restock approval detail +- outcome: Show that a SuggestRestock approval card opens detail with product and restock quantity. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-027-view-low-stock-alert-approval-with-product-context.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-027-view-low-stock-alert-approval-with-product-context.sdp.md index 25936e6f..dcb6fe22 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-027-view-low-stock-alert-approval-with-product-context.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-027-view-low-stock-alert-approval-with-product-context.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.view-low-stock-alert-approval-with-product-context kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # View low stock alert approval with product context ## Intent -- outcome: Executable scenario: View low stock alert approval with product context +- outcome: Show that a low-stock approval detail includes product quantity, threshold, and high confidence text. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-028-approve-low-stock-restock-suggestion.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-028-approve-low-stock-restock-suggestion.sdp.md index b4e9906e..f078674e 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-028-approve-low-stock-restock-suggestion.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-028-approve-low-stock-restock-suggestion.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.approve-low-stock-restock-suggestion kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Approve low stock restock suggestion ## Intent -- outcome: Executable scenario: Approve low stock restock suggestion +- outcome: Show that approving a restock suggestion returns the admin to the approvals list. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-029-reject-low-stock-restock-suggestion.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-029-reject-low-stock-restock-suggestion.sdp.md index 5764d073..6a309d21 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-029-reject-low-stock-restock-suggestion.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-029-reject-low-stock-restock-suggestion.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.reject-low-stock-restock-suggestion kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Reject low stock restock suggestion ## Intent -- outcome: Executable scenario: Reject low stock restock suggestion +- outcome: Show that rejecting a restock suggestion returns the admin to the approvals list. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-030-navigate-to-high-value-order-vip-review-approval-detail.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-030-navigate-to-high-value-order-vip-review-approval-detail.sdp.md index 17159162..b3e2f07a 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-030-navigate-to-high-value-order-vip-review-approval-detail.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-030-navigate-to-high-value-order-vip-review-approval-detail.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.navigate-to-high-value-order-vip-review-approval-detail kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Navigate to high-value order VIP review approval detail ## Intent -- outcome: Executable scenario: Navigate to high-value order VIP review approval detail +- outcome: Show that a FlagForVIPReview approval card opens detail with order id and total. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-031-view-high-value-order-approval-with-order-context.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-031-view-high-value-order-approval-with-order-context.sdp.md index 7b3c5215..1c94361c 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-031-view-high-value-order-approval-with-order-context.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-031-view-high-value-order-approval-with-order-context.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.view-high-value-order-approval-with-order-context kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # View high-value order approval with order context ## Intent -- outcome: Executable scenario: View high-value order approval with order context +- outcome: Show that a high-value order approval detail includes order total, threshold, and high confidence text. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-032-approve-vip-review-for-high-value-order.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-032-approve-vip-review-for-high-value-order.sdp.md index d0ab5625..3d710988 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-032-approve-vip-review-for-high-value-order.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-032-approve-vip-review-for-high-value-order.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.approve-vip-review-for-high-value-order kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Approve VIP review for high-value order ## Intent -- outcome: Executable scenario: Approve VIP review for high-value order +- outcome: Show that approving a VIP review flag returns the admin to the approvals list. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-033-reject-vip-review-flag.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-033-reject-vip-review-flag.sdp.md index 7262c90b..fb9fa24a 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-033-reject-vip-review-flag.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-033-reject-vip-review-flag.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.reject-vip-review-flag kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Reject VIP review flag ## Intent -- outcome: Executable scenario: Reject VIP review flag +- outcome: Show that rejecting a VIP review flag returns the admin to the approvals list. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-034-navigate-to-order-consolidation-suggestion-approval-detail.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-034-navigate-to-order-consolidation-suggestion-approval-detail.sdp.md index 1745fa57..8b8bdc23 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-034-navigate-to-order-consolidation-suggestion-approval-detail.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-034-navigate-to-order-consolidation-suggestion-approval-detail.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.navigate-to-order-consolidation-suggestion-approval-detail kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Navigate to order consolidation suggestion approval detail ## Intent -- outcome: Executable scenario: Navigate to order consolidation suggestion approval detail +- outcome: Show that a consolidation approval card opens detail with customer and order ids. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-035-view-order-consolidation-approval-with-order-list.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-035-view-order-consolidation-approval-with-order-list.sdp.md index 2d910a62..ef83e0c1 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-035-view-order-consolidation-approval-with-order-list.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-035-view-order-consolidation-approval-with-order-list.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.view-order-consolidation-approval-with-order-list kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # View order consolidation approval with order list ## Intent -- outcome: Executable scenario: View order consolidation approval with order list +- outcome: Show that a consolidation approval detail includes order count, window, and potential savings. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-036-approve-order-consolidation-suggestion.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-036-approve-order-consolidation-suggestion.sdp.md index ed79e093..8e28ccc6 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-036-approve-order-consolidation-suggestion.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-036-approve-order-consolidation-suggestion.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.approve-order-consolidation-suggestion kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Approve order consolidation suggestion ## Intent -- outcome: Executable scenario: Approve order consolidation suggestion +- outcome: Show that approving a consolidation suggestion returns the admin to the approvals list. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-037-reject-order-consolidation-suggestion.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-037-reject-order-consolidation-suggestion.sdp.md index 3aba0618..cab1d404 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-037-reject-order-consolidation-suggestion.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-037-reject-order-consolidation-suggestion.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.reject-order-consolidation-suggestion kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Reject order consolidation suggestion ## Intent -- outcome: Executable scenario: Reject order consolidation suggestion +- outcome: Show that rejecting a consolidation suggestion returns the admin to the approvals list. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-038-view-decision-history-filtered-by-agent-type.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-038-view-decision-history-filtered-by-agent-type.sdp.md index ba096914..88149982 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-038-view-decision-history-filtered-by-agent-type.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-038-view-decision-history-filtered-by-agent-type.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.view-decision-history-filtered-by-agent-type kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # View decision history filtered by agent type ## Intent -- outcome: Executable scenario: View decision history filtered by agent type +- outcome: Show that decision history can list and filter decisions from every agent type. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-039-view-low-stock-agent-decision-in-history.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-039-view-low-stock-agent-decision-in-history.sdp.md index d9235a4a..8e3c2a10 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-039-view-low-stock-agent-decision-in-history.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-039-view-low-stock-agent-decision-in-history.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.view-low-stock-agent-decision-in-history kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # View low stock agent decision in history ## Intent -- outcome: Executable scenario: View low stock agent decision in history +- outcome: Show that a SuggestRestock history decision includes product id and whether approval was required. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-040-view-high-value-order-agent-decision-in-history.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-040-view-high-value-order-agent-decision-in-history.sdp.md index 22a962ea..895e8297 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-040-view-high-value-order-agent-decision-in-history.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-040-view-high-value-order-agent-decision-in-history.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.view-high-value-order-agent-decision-in-history kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # View high-value order agent decision in history ## Intent -- outcome: Executable scenario: View high-value order agent decision in history +- outcome: Show that a FlagForVIPReview history decision includes the triggering order total. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-041-view-order-consolidation-agent-decision-in-history.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-041-view-order-consolidation-agent-decision-in-history.sdp.md index f0dbbba0..ffce62fd 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-041-view-order-consolidation-agent-decision-in-history.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-041-view-order-consolidation-agent-decision-in-history.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.view-order-consolidation-agent-decision-in-history kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # View order consolidation agent decision in history ## Intent -- outcome: Executable scenario: View order consolidation agent decision in history +- outcome: Show that a SuggestOrderConsolidation history decision includes the order count in the window. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-042-view-products-approaching-low-stock-threshold.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-042-view-products-approaching-low-stock-threshold.sdp.md index 4462c589..9449e2e5 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-042-view-products-approaching-low-stock-threshold.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-042-view-products-approaching-low-stock-threshold.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.view-products-approaching-low-stock-threshold kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # View products approaching low stock threshold ## Intent -- outcome: Executable scenario: View products approaching low stock threshold +- outcome: Show that stock preview lists products approaching the low-stock threshold. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-043-stock-level-progress-indicator.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-043-stock-level-progress-indicator.sdp.md index a851e5de..83c564a8 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-043-stock-level-progress-indicator.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-043-stock-level-progress-indicator.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.stock-level-progress-indicator kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Stock level progress indicator ## Intent -- outcome: Executable scenario: Stock level progress indicator +- outcome: Show that a stock-level progress indicator is accessible and not color-only. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-044-approval-card-is-keyboard-accessible.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-044-approval-card-is-keyboard-accessible.sdp.md index 428c9099..adb63f2f 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-044-approval-card-is-keyboard-accessible.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-044-approval-card-is-keyboard-accessible.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.approval-card-is-keyboard-accessible kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Approval card is keyboard accessible ## Intent -- outcome: Executable scenario: Approval card is keyboard accessible +- outcome: Show that an approval card is reachable by keyboard with visible focus. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-045-screen-reader-announces-action-status-changes.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-045-screen-reader-announces-action-status-changes.sdp.md index 6d7ae4de..899be8be 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-045-screen-reader-announces-action-status-changes.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-045-screen-reader-announces-action-status-changes.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.screen-reader-announces-action-status-changes kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Screen reader announces action status changes ## Intent -- outcome: Executable scenario: Screen reader announces action status changes +- outcome: Show that a screen reader announces approve progress on the approval detail page. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-046-confidence-level-conveyed-via-text-not-just-color.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-046-confidence-level-conveyed-via-text-not-just-color.sdp.md index 1497a3b8..b6265597 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-046-confidence-level-conveyed-via-text-not-just-color.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-046-confidence-level-conveyed-via-text-not-just-color.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.confidence-level-conveyed-via-text-not-just-color kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Confidence level conveyed via text not just color ## Intent -- outcome: Executable scenario: Confidence level conveyed via text not just color +- outcome: Show that confidence badges include High, Medium, or Low text rather than color alone. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-047-focus-trap-in-action-buttons.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-047-focus-trap-in-action-buttons.sdp.md index 6720c76b..565e4a54 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-047-focus-trap-in-action-buttons.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-047-focus-trap-in-action-buttons.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.focus-trap-in-action-buttons kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Focus trap in action buttons ## Intent -- outcome: Executable scenario: Focus trap in action buttons +- outcome: Show that tabbing the action panel moves through note, Reject, and Approve. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-048-handle-approval-not-found.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-048-handle-approval-not-found.sdp.md index 09046e9b..512afd83 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-048-handle-approval-not-found.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-048-handle-approval-not-found.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.handle-approval-not-found kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Handle approval not found ## Intent -- outcome: Executable scenario: Handle approval not found +- outcome: Show that a missing approval route shows an approval-not-found message with a back link. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-049-handle-network-error-loading-approvals.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-049-handle-network-error-loading-approvals.sdp.md index af3c90c8..6cfe59d6 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-049-handle-network-error-loading-approvals.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-049-handle-network-error-loading-approvals.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.handle-network-error-loading-approvals kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Handle network error loading approvals ## Intent -- outcome: Executable scenario: Handle network error loading approvals +- outcome: Show that a network error on the approvals list offers retry and recovers when the backend returns. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.examples/s-050-route-level-error-boundary.sdp.md b/specs/behavior/frontend/admin/agent-approvals.examples/s-050-route-level-error-boundary.sdp.md index 595270cb..c160c12e 100644 --- a/specs/behavior/frontend/admin/agent-approvals.examples/s-050-route-level-error-boundary.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.examples/s-050-route-level-error-boundary.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.agent-approvals.route-level-error-boundary kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.agent-approvals + verifies: spec:behavior.frontend.admin.agent-approvals --- # Route-level error boundary ## Intent -- outcome: Executable scenario: Route-level error boundary +- outcome: Show that a route-level error boundary shows a user-friendly message and a way back. ```gwt Given I am logged in as an admin diff --git a/specs/behavior/frontend/admin/agent-approvals.sdp.md b/specs/behavior/frontend/admin/agent-approvals.sdp.md index bf166d1a..164a59e8 100644 --- a/specs/behavior/frontend/admin/agent-approvals.sdp.md +++ b/specs/behavior/frontend/admin/agent-approvals.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.frontend.admin.agent-approvals kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend --- @@ -11,4 +11,4 @@ relations: ## Intent - actor: an admin user -- outcome: to review and act on AI agent recommendations so that automated actions require human oversight before execution +- outcome: Review and act on AI agent recommendations so automated actions require human oversight before execution. diff --git a/specs/behavior/frontend/admin/create-product.examples/s-001-create-product-successfully.sdp.md b/specs/behavior/frontend/admin/create-product.examples/s-001-create-product-successfully.sdp.md index 18f6ecfa..82e78665 100644 --- a/specs/behavior/frontend/admin/create-product.examples/s-001-create-product-successfully.sdp.md +++ b/specs/behavior/frontend/admin/create-product.examples/s-001-create-product-successfully.sdp.md @@ -2,21 +2,20 @@ id: spec:behavior.frontend.admin.create-product.create-product-successfully kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.create-product + verifies: spec:behavior.frontend.admin.create-product --- -# Successfully create a new product and verify projection +# Create product successfully ## Intent -- outcome: Executable scenario: Successfully create a new product and verify projection +- outcome: Show that filling valid product details creates the product and lists it in inventory. ```gwt -Given the backend is running and clean -When I create a product with: -Then the command should succeed -And I wait for projections to process -And the product "prod-int-01" should exist with name "Test Widget" -And the product "prod-int-01" should have 0 available stock +Given I am on the admin products page +When I fill in the product name "Test Widget" and I fill in the SKU "WDG-001" and I fill in the price "49.99" and I click "Create Product" +Then I should see a success message containing "created successfully" +And eventually the product "Test Widget" should appear in the inventory list ``` diff --git a/specs/behavior/frontend/admin/create-product.examples/s-002-validation-errors-on-empty-form.sdp.md b/specs/behavior/frontend/admin/create-product.examples/s-002-validation-errors-on-empty-form.sdp.md index e55389c7..8aa11dea 100644 --- a/specs/behavior/frontend/admin/create-product.examples/s-002-validation-errors-on-empty-form.sdp.md +++ b/specs/behavior/frontend/admin/create-product.examples/s-002-validation-errors-on-empty-form.sdp.md @@ -2,19 +2,21 @@ id: spec:behavior.frontend.admin.create-product.validation-errors-on-empty-form kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.create-product + verifies: spec:behavior.frontend.admin.create-product --- -# Reject duplicate product ID +# Validation errors on empty form ## Intent -- outcome: Executable scenario: Reject duplicate product ID +- outcome: Show that creating a product with an empty form reports name, SKU, and unit-price errors. ```gwt -Given the backend is running and clean -And a product "prod-int-02" exists -When I create a product with: -Then the command should be rejected with code "PRODUCT_ALREADY_EXISTS" +Given I am on the admin products page +When I click "Create Product" without filling the form +Then I should see validation error "Product name is required" +And I should see validation error "SKU is required" +And I should see validation error "Unit price is required" ``` diff --git a/specs/behavior/frontend/admin/create-product.examples/s-003-invalid-sku-format.sdp.md b/specs/behavior/frontend/admin/create-product.examples/s-003-invalid-sku-format.sdp.md index 705043c6..17a21550 100644 --- a/specs/behavior/frontend/admin/create-product.examples/s-003-invalid-sku-format.sdp.md +++ b/specs/behavior/frontend/admin/create-product.examples/s-003-invalid-sku-format.sdp.md @@ -2,19 +2,19 @@ id: spec:behavior.frontend.admin.create-product.invalid-sku-format kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.create-product + verifies: spec:behavior.frontend.admin.create-product --- -# Reject duplicate SKU +# Invalid SKU format ## Intent -- outcome: Executable scenario: Reject duplicate SKU +- outcome: Show that a SKU with spaces or punctuation is rejected. ```gwt -Given the backend is running and clean -And a product with SKU "SKU-DUP-001" exists -When I create a product with: -Then the command should be rejected with code "SKU_ALREADY_EXISTS" +Given I am on the admin products page +When I fill in the product name "Invalid SKU Product" and I fill in the SKU "invalid sku!" and I fill in the price "29.99" and I click "Create Product" +Then I should see validation error "SKU should contain only letters, numbers, and hyphens" ``` diff --git a/specs/behavior/frontend/admin/create-product.examples/s-004-invalid-price-zero-value.sdp.md b/specs/behavior/frontend/admin/create-product.examples/s-004-invalid-price-zero-value.sdp.md index c1c81621..85ed3610 100644 --- a/specs/behavior/frontend/admin/create-product.examples/s-004-invalid-price-zero-value.sdp.md +++ b/specs/behavior/frontend/admin/create-product.examples/s-004-invalid-price-zero-value.sdp.md @@ -2,18 +2,19 @@ id: spec:behavior.frontend.admin.create-product.invalid-price-zero-value kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.create-product + verifies: spec:behavior.frontend.admin.create-product --- -# CreateProduct is idempotent with same commandId +# Invalid price - zero value ## Intent -- outcome: Executable scenario: CreateProduct is idempotent with same commandId +- outcome: Show that a zero unit price is rejected. ```gwt -Given the backend is running and clean -When I create a product with commandId "cmd-prod-idem-01": and I repeat creating a product with commandId "cmd-prod-idem-01": -Then the second command should return duplicate status +Given I am on the admin products page +When I fill in the product name "Zero Price Product" and I fill in the SKU "ZPP-001" and I fill in the price "0" and I click "Create Product" +Then I should see validation error "Unit price must be a positive number" ``` diff --git a/specs/behavior/frontend/admin/create-product.examples/s-005-invalid-price-exceeds-maximum.sdp.md b/specs/behavior/frontend/admin/create-product.examples/s-005-invalid-price-exceeds-maximum.sdp.md index 5dfd6c7f..b625597d 100644 --- a/specs/behavior/frontend/admin/create-product.examples/s-005-invalid-price-exceeds-maximum.sdp.md +++ b/specs/behavior/frontend/admin/create-product.examples/s-005-invalid-price-exceeds-maximum.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.admin.create-product.invalid-price-exceeds-maximum kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.admin.create-product + verifies: spec:behavior.frontend.admin.create-product --- # Invalid price - exceeds maximum ## Intent -- outcome: Executable scenario: Invalid price - exceeds maximum +- outcome: Show that a unit price above the catalog maximum is rejected. ```gwt Given I am on the admin products page diff --git a/specs/behavior/frontend/admin/create-product.sdp.md b/specs/behavior/frontend/admin/create-product.sdp.md index 1e6f9440..0378724b 100644 --- a/specs/behavior/frontend/admin/create-product.sdp.md +++ b/specs/behavior/frontend/admin/create-product.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.frontend.admin.create-product kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend --- @@ -11,4 +11,4 @@ relations: ## Intent - actor: an inventory manager -- outcome: to create new products in the catalog so that they can be sold and tracked +- outcome: Create new products in the catalog so they can be sold and tracked. diff --git a/specs/behavior/frontend/dashboard/dashboard.examples/s-001-view-dashboard-stats.sdp.md b/specs/behavior/frontend/dashboard/dashboard.examples/s-001-view-dashboard-stats.sdp.md index 1f0c8836..fcf2652c 100644 --- a/specs/behavior/frontend/dashboard/dashboard.examples/s-001-view-dashboard-stats.sdp.md +++ b/specs/behavior/frontend/dashboard/dashboard.examples/s-001-view-dashboard-stats.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.dashboard.dashboard.view-dashboard-stats kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.dashboard.dashboard + verifies: spec:behavior.frontend.dashboard.dashboard --- # View dashboard stats ## Intent -- outcome: Executable scenario: View dashboard stats +- outcome: Show that the dashboard displays product, order, and pending-order counts. ```gwt Given products and orders exist in the system diff --git a/specs/behavior/frontend/dashboard/dashboard.examples/s-002-show-low-stock-warning.sdp.md b/specs/behavior/frontend/dashboard/dashboard.examples/s-002-show-low-stock-warning.sdp.md index 7e9a9de1..2df072d9 100644 --- a/specs/behavior/frontend/dashboard/dashboard.examples/s-002-show-low-stock-warning.sdp.md +++ b/specs/behavior/frontend/dashboard/dashboard.examples/s-002-show-low-stock-warning.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.dashboard.dashboard.show-low-stock-warning kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.dashboard.dashboard + verifies: spec:behavior.frontend.dashboard.dashboard --- # Show low stock warning ## Intent -- outcome: Executable scenario: Show low stock warning +- outcome: Show that the dashboard warns when a product has low stock. ```gwt Given a product with low stock exists diff --git a/specs/behavior/frontend/dashboard/dashboard.examples/s-003-quick-action-navigates-to-create-order.sdp.md b/specs/behavior/frontend/dashboard/dashboard.examples/s-003-quick-action-navigates-to-create-order.sdp.md index 85624292..73ba52f6 100644 --- a/specs/behavior/frontend/dashboard/dashboard.examples/s-003-quick-action-navigates-to-create-order.sdp.md +++ b/specs/behavior/frontend/dashboard/dashboard.examples/s-003-quick-action-navigates-to-create-order.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.dashboard.dashboard.quick-action-navigates-to-create-order kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.dashboard.dashboard + verifies: spec:behavior.frontend.dashboard.dashboard --- # Quick action navigates to create order ## Intent -- outcome: Executable scenario: Quick action navigates to create order +- outcome: Show that the dashboard New Order action opens the create-order page. ```gwt Given the feature fixture is in place diff --git a/specs/behavior/frontend/dashboard/dashboard.sdp.md b/specs/behavior/frontend/dashboard/dashboard.sdp.md index b82eafb8..cda648f1 100644 --- a/specs/behavior/frontend/dashboard/dashboard.sdp.md +++ b/specs/behavior/frontend/dashboard/dashboard.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.frontend.dashboard.dashboard kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend --- @@ -10,5 +10,5 @@ relations: ## Intent -- actor: a user I want to see system overview -- outcome: Dashboard +- actor: a user +- outcome: Show a system overview with product, order, and pending-order counts. diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-001-complete-flow-product-creation-to-order-confirmation.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-001-complete-flow-product-creation-to-order-confirmation.sdp.md index f3424fcc..15caba1a 100644 --- a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-001-complete-flow-product-creation-to-order-confirmation.sdp.md +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-001-complete-flow-product-creation-to-order-confirmation.sdp.md @@ -2,19 +2,20 @@ id: spec:behavior.frontend.e2e-journeys.full-order-journey.complete-flow-product-creation-to-order-confirmation kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.e2e-journeys.full-order-journey + verifies: spec:behavior.frontend.e2e-journeys.full-order-journey --- # Complete flow - Product creation to order confirmation ## Intent -- outcome: Executable scenario: Complete flow - Product creation to order confirmation +- outcome: Show that creating a product, stocking it, and submitting an order confirms the order and reduces stock. ```gwt Given I am on the admin products page -When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Journey Widget" and I enter quantity 100 and I click "Add Stock" and I navigate to the products page and I navigate to th… +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Journey Widget" and I enter quantity 100 and I click "Add Stock" and I navigate to the products page and I navigate to the create order page and I add "Journey Widget" to the cart with quantity 5 and I submit the order and I navigate to the products page Then I should see a success message containing "created successfully" And I should see a success message containing "Stock added successfully" And eventually I should see "Journey Widget" in the product list diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-002-order-fails-due-to-insufficient-stock-saga-compensation.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-002-order-fails-due-to-insufficient-stock-saga-compensation.sdp.md index bb47eb62..e616f248 100644 --- a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-002-order-fails-due-to-insufficient-stock-saga-compensation.sdp.md +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-002-order-fails-due-to-insufficient-stock-saga-compensation.sdp.md @@ -2,19 +2,20 @@ id: spec:behavior.frontend.e2e-journeys.full-order-journey.order-fails-due-to-insufficient-stock-saga-compensation kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.e2e-journeys.full-order-journey + verifies: spec:behavior.frontend.e2e-journeys.full-order-journey --- # Order fails due to insufficient stock - Saga compensation ## Intent -- outcome: Executable scenario: Order fails due to insufficient stock - Saga compensation +- outcome: Show that ordering more units than available cancels the order and leaves stock unchanged. ```gwt Given I am on the admin products page -When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Limited Item" and I enter quantity 3 and I click "Add Stock" and I navigate to the create order page and I add "Limited I… +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Limited Item" and I enter quantity 3 and I click "Add Stock" and I navigate to the create order page and I add "Limited Item" to the cart with quantity 10 and I submit the order and I navigate to the products page Then I should see a success message containing "created successfully" And I should see a success message containing "Stock added successfully" And I should be redirected to the order detail page diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-003-order-with-multiple-items.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-003-order-with-multiple-items.sdp.md index 92c350ff..7017b5c9 100644 --- a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-003-order-with-multiple-items.sdp.md +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-003-order-with-multiple-items.sdp.md @@ -2,19 +2,20 @@ id: spec:behavior.frontend.e2e-journeys.full-order-journey.order-with-multiple-items kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.e2e-journeys.full-order-journey + verifies: spec:behavior.frontend.e2e-journeys.full-order-journey --- # Order with multiple items ## Intent -- outcome: Executable scenario: Order with multiple items +- outcome: Show that a multi-product order confirms and reduces stock for every line. ```gwt Given I am on the admin products page -When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Product A" and I enter quantity 50 and I click "Add Stock" and I switch to the "Create Product" tab and I fill in product… +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Product A" and I enter quantity 50 and I click "Add Stock" and I switch to the "Create Product" tab and I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Product B" and I enter quantity 30 and I click "Add Stock" and I navigate to the create order page and I add "Product A" to the cart with quantity 2 and I add "Product B" to the cart with quantity 3 and I submit the order and I navigate to the products page Then I should see a success message containing "created successfully" And I should see a success message containing "Stock added" And I should see a success message containing "created successfully" diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-004-multi-product-order-rejected-atomically-when-one-product-lacks-stock-dcb.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-004-multi-product-order-rejected-atomically-when-one-product-lacks-stock-dcb.sdp.md index 6df9a5b7..c135358a 100644 --- a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-004-multi-product-order-rejected-atomically-when-one-product-lacks-stock-dcb.sdp.md +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-004-multi-product-order-rejected-atomically-when-one-product-lacks-stock-dcb.sdp.md @@ -2,19 +2,20 @@ id: spec:behavior.frontend.e2e-journeys.full-order-journey.multi-product-order-rejected-atomically-when-one-product-lacks-stock-dcb kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.e2e-journeys.full-order-journey + verifies: spec:behavior.frontend.e2e-journeys.full-order-journey --- # Multi-product order rejected atomically when one product lacks stock (DCB) ## Intent -- outcome: Executable scenario: Multi-product order rejected atomically when one product lacks stock (DCB) +- outcome: Show that a multi-product order is rejected atomically when one line lacks stock. ```gwt Given I am on the admin products page -When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "DCB Product High" and I enter quantity 100 and I click "Add Stock" and I switch to the "Create Product" tab and I fill in… +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "DCB Product High" and I enter quantity 100 and I click "Add Stock" and I switch to the "Create Product" tab and I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "DCB Product Low" and I enter quantity 5 and I click "Add Stock" and I navigate to the create order page and I add "DCB Product High" to the cart with quantity 10 and I add "DCB Product Low" to the cart with quantity 10 and I submit the order and I navigate to the products page Then I should see a success message containing "created successfully" And I should see a success message containing "Stock added" And I should see a success message containing "created successfully" diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-005-full-agent-trigger-journey-churn-risk-detection.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-005-full-agent-trigger-journey-churn-risk-detection.sdp.md index a3118b71..8831be79 100644 --- a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-005-full-agent-trigger-journey-churn-risk-detection.sdp.md +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-005-full-agent-trigger-journey-churn-risk-detection.sdp.md @@ -2,19 +2,20 @@ id: spec:behavior.frontend.e2e-journeys.full-order-journey.full-agent-trigger-journey-churn-risk-detection kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.e2e-journeys.full-order-journey + verifies: spec:behavior.frontend.e2e-journeys.full-order-journey --- # Full agent trigger journey - Churn risk detection ## Intent -- outcome: Executable scenario: Full agent trigger journey - Churn risk detection +- outcome: Show that repeated cancellations create a SuggestCustomerOutreach approval that an admin can accept. ```gwt Given I am on the admin products page -When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Agent Test Widget" and I enter quantity 100 and I click "Add Stock" and I navigate to the create order page and I add "Ag… +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Agent Test Widget" and I enter quantity 100 and I click "Add Stock" and I navigate to the create order page and I add "Agent Test Widget" to the cart with quantity 1 and I submit the order and I click "Cancel Order" and I confirm the cancellation in the dialog and I navigate to the create order page and I add "Agent Test Widget" to the cart with quantity 1 and I submit the order and I click "Cancel Order" and I confirm the cancellation in the dialog and I navigate to the create order page and I add "Agent Test Widget" to the cart with quantity 1 and I submit the order and I click "Cancel Order" and I confirm the cancellation in the dialog and I navigate to the agents admin page and I click on the pending approval and I enter review note "Verified customer history - proceeding with outreach" and I click "Approve" and I click the "Decision History" tab Then I should see a success message containing "created successfully" And I should see a success message containing "Stock added" And I should be redirected to the order detail page diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-006-full-agent-trigger-journey-low-stock-alert-detection.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-006-full-agent-trigger-journey-low-stock-alert-detection.sdp.md index ecebfacf..15dea69f 100644 --- a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-006-full-agent-trigger-journey-low-stock-alert-detection.sdp.md +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-006-full-agent-trigger-journey-low-stock-alert-detection.sdp.md @@ -2,19 +2,20 @@ id: spec:behavior.frontend.e2e-journeys.full-order-journey.full-agent-trigger-journey-low-stock-alert-detection kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.e2e-journeys.full-order-journey + verifies: spec:behavior.frontend.e2e-journeys.full-order-journey --- # Full agent trigger journey - Low stock alert detection ## Intent -- outcome: Executable scenario: Full agent trigger journey - Low stock alert detection +- outcome: Show that orders that drop stock below the threshold create a SuggestRestock approval. ```gwt Given I am on the admin products page -When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Low Stock Test Item" and I enter quantity 10 and I click "Add Stock" and I navigate to the create order page and I add "L… +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Low Stock Test Item" and I enter quantity 10 and I click "Add Stock" and I navigate to the create order page and I add "Low Stock Test Item" to the cart with quantity 3 and I submit the order and I navigate to the create order page and I add "Low Stock Test Item" to the cart with quantity 3 and I submit the order and I navigate to the agents admin page and I click on the pending approval and I enter review note "Low stock confirmed - ordering 20 units from supplier" and I click "Approve" and I click the "Decision History" tab Then I should see a success message containing "created successfully" And I should see a success message containing "Stock added" And I should be redirected to the order detail page diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-007-full-agent-trigger-journey-high-value-order-detection.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-007-full-agent-trigger-journey-high-value-order-detection.sdp.md index 5abf8e26..3f6863fa 100644 --- a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-007-full-agent-trigger-journey-high-value-order-detection.sdp.md +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-007-full-agent-trigger-journey-high-value-order-detection.sdp.md @@ -2,19 +2,20 @@ id: spec:behavior.frontend.e2e-journeys.full-order-journey.full-agent-trigger-journey-high-value-order-detection kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.e2e-journeys.full-order-journey + verifies: spec:behavior.frontend.e2e-journeys.full-order-journey --- # Full agent trigger journey - High-value order detection ## Intent -- outcome: Executable scenario: Full agent trigger journey - High-value order detection +- outcome: Show that a high-value order creates a FlagForVIPReview approval that an admin can accept. ```gwt Given I am on the admin products page -When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Premium VIP Widget" and I enter quantity 50 and I click "Add Stock" and I navigate to the create order page and I add "Pr… +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Premium VIP Widget" and I enter quantity 50 and I click "Add Stock" and I navigate to the create order page and I add "Premium VIP Widget" to the cart with quantity 6 and I submit the order and I navigate to the agents admin page and I click on the pending approval and I enter review note "VIP customer - priority handling approved" and I click "Approve" and I click the "Decision History" tab Then I should see a success message containing "created successfully" And I should see a success message containing "Stock added" And the cart total should be "$600.00" diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-008-full-agent-trigger-journey-order-consolidation-suggestion.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-008-full-agent-trigger-journey-order-consolidation-suggestion.sdp.md index 1d8bde64..c85c52ba 100644 --- a/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-008-full-agent-trigger-journey-order-consolidation-suggestion.sdp.md +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.examples/s-008-full-agent-trigger-journey-order-consolidation-suggestion.sdp.md @@ -2,19 +2,20 @@ id: spec:behavior.frontend.e2e-journeys.full-order-journey.full-agent-trigger-journey-order-consolidation-suggestion kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.e2e-journeys.full-order-journey + verifies: spec:behavior.frontend.e2e-journeys.full-order-journey --- # Full agent trigger journey - Order consolidation suggestion ## Intent -- outcome: Executable scenario: Full agent trigger journey - Order consolidation suggestion +- outcome: Show that several same-customer orders create a SuggestOrderConsolidation approval. ```gwt Given I am on the admin products page -When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Consolidation Widget" and I enter quantity 100 and I click "Add Stock" and I navigate to the create order page and I add… +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Consolidation Widget" and I enter quantity 100 and I click "Add Stock" and I navigate to the create order page and I add "Consolidation Widget" to the cart with quantity 1 and I submit the order and I navigate to the create order page and I add "Consolidation Widget" to the cart with quantity 2 and I submit the order and I navigate to the create order page and I add "Consolidation Widget" to the cart with quantity 1 and I submit the order and I navigate to the agents admin page and I click on the pending approval and I enter review note "Customer agreed - combining into single shipment" and I click "Approve" and I click the "Decision History" tab Then I should see a success message containing "created successfully" And I should see a success message containing "Stock added" And I should be redirected to the order detail page diff --git a/specs/behavior/frontend/e2e-journeys/full-order-journey.sdp.md b/specs/behavior/frontend/e2e-journeys/full-order-journey.sdp.md index b3ba5af3..c0daed48 100644 --- a/specs/behavior/frontend/e2e-journeys/full-order-journey.sdp.md +++ b/specs/behavior/frontend/e2e-journeys/full-order-journey.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.frontend.e2e-journeys.full-order-journey kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend --- @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Full Order Journey +- outcome: Walk the catalog from product creation through order confirmation, including stock, saga compensation, and agent triggers. diff --git a/specs/behavior/frontend/orders/create-order.examples/s-001-create-and-submit-order-successfully.sdp.md b/specs/behavior/frontend/orders/create-order.examples/s-001-create-and-submit-order-successfully.sdp.md index f0c9bdc4..b2677c64 100644 --- a/specs/behavior/frontend/orders/create-order.examples/s-001-create-and-submit-order-successfully.sdp.md +++ b/specs/behavior/frontend/orders/create-order.examples/s-001-create-and-submit-order-successfully.sdp.md @@ -2,21 +2,22 @@ id: spec:behavior.frontend.orders.create-order.create-and-submit-order-successfully kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.orders.create-order + verifies: spec:behavior.frontend.orders.create-order --- -# Successfully create a new order and verify projection +# Create and submit order successfully ## Intent -- outcome: Executable scenario: Successfully create a new order and verify projection +- outcome: Show that a stocked cart can be submitted and the order becomes confirmed. ```gwt -Given the backend is running and clean -When I create an order with: -Then the command should succeed -And I wait for projections to process -And the order "ord-int-01" should exist with status "draft" -And the order "ord-int-01" should have 0 items +Given products exist with stock +When I navigate to the create order page and I add "Test Product" to cart with quantity 2 and I click "Create Order" +Then the cart total should be correct +And I should be redirected to order detail +And the order status should be "submitted" +And eventually the order status should be "confirmed" ``` diff --git a/specs/behavior/frontend/orders/create-order.examples/s-002-cannot-submit-empty-cart.sdp.md b/specs/behavior/frontend/orders/create-order.examples/s-002-cannot-submit-empty-cart.sdp.md index c3f7f84e..899bc586 100644 --- a/specs/behavior/frontend/orders/create-order.examples/s-002-cannot-submit-empty-cart.sdp.md +++ b/specs/behavior/frontend/orders/create-order.examples/s-002-cannot-submit-empty-cart.sdp.md @@ -2,19 +2,19 @@ id: spec:behavior.frontend.orders.create-order.cannot-submit-empty-cart kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.orders.create-order + verifies: spec:behavior.frontend.orders.create-order --- -# Reject duplicate order ID +# Cannot submit empty cart ## Intent -- outcome: Executable scenario: Reject duplicate order ID +- outcome: Show that Create Order stays disabled when the cart is empty. ```gwt -Given the backend is running and clean -And an order "ord-int-02" exists -When I create an order with: -Then the command should be rejected with code "ORDER_ALREADY_EXISTS" +Given products exist with stock +When I navigate to the create order page +Then the Create Order button should be disabled ``` diff --git a/specs/behavior/frontend/orders/create-order.examples/s-003-update-quantity-in-cart.sdp.md b/specs/behavior/frontend/orders/create-order.examples/s-003-update-quantity-in-cart.sdp.md index 9a31927e..84602483 100644 --- a/specs/behavior/frontend/orders/create-order.examples/s-003-update-quantity-in-cart.sdp.md +++ b/specs/behavior/frontend/orders/create-order.examples/s-003-update-quantity-in-cart.sdp.md @@ -2,18 +2,19 @@ id: spec:behavior.frontend.orders.create-order.update-quantity-in-cart kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.orders.create-order + verifies: spec:behavior.frontend.orders.create-order --- -# CreateOrder is idempotent with same commandId +# Update quantity in cart ## Intent -- outcome: Executable scenario: CreateOrder is idempotent with same commandId +- outcome: Show that changing a cart line quantity updates the cart total. ```gwt -Given the backend is running and clean -When I create an order with commandId "cmd-idem-01": and I repeat creating an order with commandId "cmd-idem-01": -Then the second command should return duplicate status +Given products exist with stock +When I add a product to cart and I change the quantity to 3 +Then the cart total should update ``` diff --git a/specs/behavior/frontend/orders/create-order.examples/s-004-remove-item-from-cart.sdp.md b/specs/behavior/frontend/orders/create-order.examples/s-004-remove-item-from-cart.sdp.md index 6926fe89..28ffa945 100644 --- a/specs/behavior/frontend/orders/create-order.examples/s-004-remove-item-from-cart.sdp.md +++ b/specs/behavior/frontend/orders/create-order.examples/s-004-remove-item-from-cart.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.orders.create-order.remove-item-from-cart kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.orders.create-order + verifies: spec:behavior.frontend.orders.create-order --- # Remove item from cart ## Intent -- outcome: Executable scenario: Remove item from cart +- outcome: Show that removing one of two cart lines leaves a single product. ```gwt Given products exist with stock diff --git a/specs/behavior/frontend/orders/create-order.sdp.md b/specs/behavior/frontend/orders/create-order.sdp.md index 57a11e4e..c57d456c 100644 --- a/specs/behavior/frontend/orders/create-order.sdp.md +++ b/specs/behavior/frontend/orders/create-order.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.frontend.orders.create-order kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend --- @@ -11,4 +11,4 @@ relations: ## Intent - actor: a customer -- outcome: to create new orders so that I can purchase products +- outcome: Create new orders from a stocked cart so the customer can purchase products. diff --git a/specs/behavior/frontend/orders/order-detail.examples/s-001-view-confirmed-order.sdp.md b/specs/behavior/frontend/orders/order-detail.examples/s-001-view-confirmed-order.sdp.md index 0c4898d9..70fb8ae1 100644 --- a/specs/behavior/frontend/orders/order-detail.examples/s-001-view-confirmed-order.sdp.md +++ b/specs/behavior/frontend/orders/order-detail.examples/s-001-view-confirmed-order.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.orders.order-detail.view-confirmed-order kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.orders.order-detail + verifies: spec:behavior.frontend.orders.order-detail --- # View confirmed order ## Intent -- outcome: Executable scenario: View confirmed order +- outcome: Show that a confirmed order detail page reports confirmed status and reserved stock. ```gwt Given a confirmed order exists diff --git a/specs/behavior/frontend/orders/order-detail.examples/s-002-view-cancelled-order.sdp.md b/specs/behavior/frontend/orders/order-detail.examples/s-002-view-cancelled-order.sdp.md index 31bd8775..8ae392e0 100644 --- a/specs/behavior/frontend/orders/order-detail.examples/s-002-view-cancelled-order.sdp.md +++ b/specs/behavior/frontend/orders/order-detail.examples/s-002-view-cancelled-order.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.orders.order-detail.view-cancelled-order kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.orders.order-detail + verifies: spec:behavior.frontend.orders.order-detail --- # View cancelled order ## Intent -- outcome: Executable scenario: View cancelled order +- outcome: Show that a cancelled order detail page reports cancelled status and the cancellation reason. ```gwt Given a cancelled order exists diff --git a/specs/behavior/frontend/orders/order-detail.examples/s-003-order-detail-shows-instant-status-updates-via-reactive-projection.sdp.md b/specs/behavior/frontend/orders/order-detail.examples/s-003-order-detail-shows-instant-status-updates-via-reactive-projection.sdp.md index 55afa334..7a63824c 100644 --- a/specs/behavior/frontend/orders/order-detail.examples/s-003-order-detail-shows-instant-status-updates-via-reactive-projection.sdp.md +++ b/specs/behavior/frontend/orders/order-detail.examples/s-003-order-detail-shows-instant-status-updates-via-reactive-projection.sdp.md @@ -2,19 +2,20 @@ id: spec:behavior.frontend.orders.order-detail.order-detail-shows-instant-status-updates-via-reactive-projection kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.orders.order-detail + verifies: spec:behavior.frontend.orders.order-detail --- # Order detail shows instant status updates via reactive projection ## Intent -- outcome: Executable scenario: Order detail shows instant status updates via reactive projection +- outcome: Show that order detail moves from submitted to confirmed through the reactive projection. ```gwt Given I am on the admin products page -When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Reactive Widget" and I enter quantity 50 and I click "Add Stock" and I navigate to the create order page and I add "React… +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Reactive Widget" and I enter quantity 50 and I click "Add Stock" and I navigate to the create order page and I add "Reactive Widget" to the cart with quantity 2 and I submit the order and I navigate to the products page Then I should see a success message containing "created successfully" And I should see a success message containing "Stock added" And I should be redirected to the order detail page diff --git a/specs/behavior/frontend/orders/order-detail.examples/s-004-cancel-a-submitted-order.sdp.md b/specs/behavior/frontend/orders/order-detail.examples/s-004-cancel-a-submitted-order.sdp.md index 00672676..e93d0e78 100644 --- a/specs/behavior/frontend/orders/order-detail.examples/s-004-cancel-a-submitted-order.sdp.md +++ b/specs/behavior/frontend/orders/order-detail.examples/s-004-cancel-a-submitted-order.sdp.md @@ -2,19 +2,20 @@ id: spec:behavior.frontend.orders.order-detail.cancel-a-submitted-order kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.orders.order-detail + verifies: spec:behavior.frontend.orders.order-detail --- # Cancel a submitted order ## Intent -- outcome: Executable scenario: Cancel a submitted order +- outcome: Show that confirming Cancel Order moves a submitted order to cancelled. ```gwt Given I am on the admin products page -When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Cancel Widget" and I enter quantity 20 and I click "Add Stock" and I navigate to the create order page and I add "Cancel… +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Cancel Widget" and I enter quantity 20 and I click "Add Stock" and I navigate to the create order page and I add "Cancel Widget" to the cart with quantity 1 and I submit the order and I click "Cancel Order" and I confirm the cancellation in the dialog Then I should see a success message containing "created successfully" And I should see a success message containing "Stock added" And I should be redirected to the order detail page diff --git a/specs/behavior/frontend/orders/order-detail.examples/s-005-cancel-button-appears-only-for-cancellable-statuses.sdp.md b/specs/behavior/frontend/orders/order-detail.examples/s-005-cancel-button-appears-only-for-cancellable-statuses.sdp.md index aebd9998..189e7f1d 100644 --- a/specs/behavior/frontend/orders/order-detail.examples/s-005-cancel-button-appears-only-for-cancellable-statuses.sdp.md +++ b/specs/behavior/frontend/orders/order-detail.examples/s-005-cancel-button-appears-only-for-cancellable-statuses.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.orders.order-detail.cancel-button-appears-only-for-cancellable-statuses kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.orders.order-detail + verifies: spec:behavior.frontend.orders.order-detail --- # Cancel button appears only for cancellable statuses ## Intent -- outcome: Executable scenario: Cancel button appears only for cancellable statuses +- outcome: Show that confirmed and cancelled orders hide the Cancel Order button. ```gwt Given a confirmed order exists diff --git a/specs/behavior/frontend/orders/order-detail.examples/s-006-cancel-confirmation-dialog-prevents-accidental-cancellation.sdp.md b/specs/behavior/frontend/orders/order-detail.examples/s-006-cancel-confirmation-dialog-prevents-accidental-cancellation.sdp.md index 8463cbc1..8979c0bf 100644 --- a/specs/behavior/frontend/orders/order-detail.examples/s-006-cancel-confirmation-dialog-prevents-accidental-cancellation.sdp.md +++ b/specs/behavior/frontend/orders/order-detail.examples/s-006-cancel-confirmation-dialog-prevents-accidental-cancellation.sdp.md @@ -2,19 +2,20 @@ id: spec:behavior.frontend.orders.order-detail.cancel-confirmation-dialog-prevents-accidental-cancellation kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.orders.order-detail + verifies: spec:behavior.frontend.orders.order-detail --- # Cancel confirmation dialog prevents accidental cancellation ## Intent -- outcome: Executable scenario: Cancel confirmation dialog prevents accidental cancellation +- outcome: Show that dismissing the cancel dialog leaves the order confirmed. ```gwt Given I am on the admin products page -When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Dialog Widget" and I enter quantity 10 and I click "Add Stock" and I navigate to the create order page and I add "Dialog… +When I fill in product details: and I click "Create Product" and I switch to the "Add Stock" tab and I select the product "Dialog Widget" and I enter quantity 10 and I click "Add Stock" and I navigate to the create order page and I add "Dialog Widget" to the cart with quantity 1 and I submit the order and I click "Cancel Order" and I click "Keep Order" in the dialog Then I should see a success message containing "created successfully" And I should see a success message containing "Stock added" And I should be redirected to the order detail page diff --git a/specs/behavior/frontend/orders/order-detail.sdp.md b/specs/behavior/frontend/orders/order-detail.sdp.md index cfefde64..3113465e 100644 --- a/specs/behavior/frontend/orders/order-detail.sdp.md +++ b/specs/behavior/frontend/orders/order-detail.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.frontend.orders.order-detail kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend --- @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Order Detail +- outcome: Show an order's status and allow cancellation only while the order is still cancellable. diff --git a/specs/behavior/frontend/orders/view-orders.examples/s-001-view-all-orders.sdp.md b/specs/behavior/frontend/orders/view-orders.examples/s-001-view-all-orders.sdp.md index 7a30568a..f43047a8 100644 --- a/specs/behavior/frontend/orders/view-orders.examples/s-001-view-all-orders.sdp.md +++ b/specs/behavior/frontend/orders/view-orders.examples/s-001-view-all-orders.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.orders.view-orders.view-all-orders kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.orders.view-orders + verifies: spec:behavior.frontend.orders.view-orders --- # View all orders ## Intent -- outcome: Executable scenario: View all orders +- outcome: Show that the orders page lists every order with its status badge. ```gwt Given orders exist with different statuses diff --git a/specs/behavior/frontend/orders/view-orders.examples/s-002-navigate-to-create-order.sdp.md b/specs/behavior/frontend/orders/view-orders.examples/s-002-navigate-to-create-order.sdp.md index f8bf7425..e5ae6b04 100644 --- a/specs/behavior/frontend/orders/view-orders.examples/s-002-navigate-to-create-order.sdp.md +++ b/specs/behavior/frontend/orders/view-orders.examples/s-002-navigate-to-create-order.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.orders.view-orders.navigate-to-create-order kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.orders.view-orders + verifies: spec:behavior.frontend.orders.view-orders --- # Navigate to create order ## Intent -- outcome: Executable scenario: Navigate to create order +- outcome: Show that New Order on the orders page opens the create-order page. ```gwt Given the feature fixture is in place diff --git a/specs/behavior/frontend/orders/view-orders.sdp.md b/specs/behavior/frontend/orders/view-orders.sdp.md index 0be0a36a..4f3bb954 100644 --- a/specs/behavior/frontend/orders/view-orders.sdp.md +++ b/specs/behavior/frontend/orders/view-orders.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.frontend.orders.view-orders kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend --- @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: View Orders List +- outcome: Show the orders list with a status badge for every order. diff --git a/specs/behavior/frontend/products/browse-products.examples/s-001-view-products-with-stock-levels.sdp.md b/specs/behavior/frontend/products/browse-products.examples/s-001-view-products-with-stock-levels.sdp.md index 836923c4..b0cab5f4 100644 --- a/specs/behavior/frontend/products/browse-products.examples/s-001-view-products-with-stock-levels.sdp.md +++ b/specs/behavior/frontend/products/browse-products.examples/s-001-view-products-with-stock-levels.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.products.browse-products.view-products-with-stock-levels kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.products.browse-products + verifies: spec:behavior.frontend.products.browse-products --- # View products with stock levels ## Intent -- outcome: Executable scenario: View products with stock levels +- outcome: Show that the product catalog displays stock badges for in-stock, low-stock, and out-of-stock products. ```gwt Given products exist with various stock levels diff --git a/specs/behavior/frontend/products/browse-products.examples/s-002-loading-state.sdp.md b/specs/behavior/frontend/products/browse-products.examples/s-002-loading-state.sdp.md index 8c45d55b..93da4f98 100644 --- a/specs/behavior/frontend/products/browse-products.examples/s-002-loading-state.sdp.md +++ b/specs/behavior/frontend/products/browse-products.examples/s-002-loading-state.sdp.md @@ -2,15 +2,16 @@ id: spec:behavior.frontend.products.browse-products.loading-state kind: example altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend.products.browse-products + verifies: spec:behavior.frontend.products.browse-products --- # Loading state ## Intent -- outcome: Executable scenario: Loading state +- outcome: Show that the products page shows loading skeletons until the catalog appears. ```gwt Given the feature fixture is in place diff --git a/specs/behavior/frontend/products/browse-products.sdp.md b/specs/behavior/frontend/products/browse-products.sdp.md index 276c9d58..3e5bfd11 100644 --- a/specs/behavior/frontend/products/browse-products.sdp.md +++ b/specs/behavior/frontend/products/browse-products.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.frontend.products.browse-products kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.frontend --- @@ -10,4 +10,18 @@ relations: ## Intent -- outcome: Browse Product Catalog +- outcome: Browse the product catalog so stock levels are visible before ordering. + +## Example space + +```gwt-vocabulary +Given products exist with various stock levels +And the feature fixture is in place +When I navigate to the products page +Then I should see products with their stock badges +And in-stock products should show green badge +And low-stock products should show yellow badge +And out-of-stock products should show red badge +And I should see loading skeletons +And eventually products should appear +``` diff --git a/specs/behavior/order-management/_epic.sdp.md b/specs/behavior/order-management/_epic.sdp.md index 26783d08..00356ff1 100644 --- a/specs/behavior/order-management/_epic.sdp.md +++ b/specs/behavior/order-management/_epic.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Hold the executable Gherkin behavior Specs migrated from the order-management test corpus. +- outcome: The order-management example app holds the executable Gherkin behavior Specs migrated from its test corpus. diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-001-no-dead-letter-on-success.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-001-no-dead-letter-on-success.sdp.md deleted file mode 100644 index ab3dbc04..00000000 --- a/specs/behavior/order-management/agent/on-complete.examples/s-001-no-dead-letter-on-success.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.agent.on-complete.no-dead-letter-on-success -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.agent.on-complete ---- -# No dead letter on success - -## Intent - -- outcome: Executable scenario: No dead letter on success - -```gwt -Given a fresh unit test context -When the onComplete handler receives a success result -Then the dead letter count should be 0 -And the checkpoint should advance to the event global position -``` diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-002-no-dead-letter-on-canceled.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-002-no-dead-letter-on-canceled.sdp.md deleted file mode 100644 index 3752a0cd..00000000 --- a/specs/behavior/order-management/agent/on-complete.examples/s-002-no-dead-letter-on-canceled.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.agent.on-complete.no-dead-letter-on-canceled -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.agent.on-complete ---- -# No dead letter on canceled - -## Intent - -- outcome: Executable scenario: No dead letter on canceled - -```gwt -Given a fresh unit test context -When the onComplete handler receives a canceled result -Then the dead letter count should be 0 -``` diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-003-creates-dead-letter-on-failure.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-003-creates-dead-letter-on-failure.sdp.md deleted file mode 100644 index ab42fb54..00000000 --- a/specs/behavior/order-management/agent/on-complete.examples/s-003-creates-dead-letter-on-failure.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.agent.on-complete.creates-dead-letter-on-failure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.agent.on-complete ---- -# Creates dead letter on failure - -## Intent - -- outcome: Executable scenario: Creates dead letter on failure - -```gwt -Given a fresh unit test context -When the onComplete handler receives a failed result with error "Test error" -Then the dead letter count should be 1 -And the dead letter for the event should have: -``` diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-004-increments-attempt-count-on-repeated-failure.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-004-increments-attempt-count-on-repeated-failure.sdp.md deleted file mode 100644 index 28d1b0d9..00000000 --- a/specs/behavior/order-management/agent/on-complete.examples/s-004-increments-attempt-count-on-repeated-failure.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.agent.on-complete.increments-attempt-count-on-repeated-failure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.agent.on-complete ---- -# Increments attemptCount on repeated failure - -## Intent - -- outcome: Executable scenario: Increments attemptCount on repeated failure - -```gwt -Given a fresh unit test context -And a first failure with error "First error" -When the onComplete handler receives a failed result with error "Second error" -Then the dead letter count should be 1 -And the dead letter for the event should have: -``` diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-005-does-not-update-dead-letter-in-terminal-state.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-005-does-not-update-dead-letter-in-terminal-state.sdp.md deleted file mode 100644 index 437bbcaa..00000000 --- a/specs/behavior/order-management/agent/on-complete.examples/s-005-does-not-update-dead-letter-in-terminal-state.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.agent.on-complete.does-not-update-dead-letter-in-terminal-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.agent.on-complete ---- -# Does not update dead letter in terminal state - -## Intent - -- outcome: Executable scenario: Does not update dead letter in terminal state - -```gwt -Given a fresh unit test context -And a first failure with error "Original error" -And the dead letter is marked as ignored with reason "Test ignore" -When the onComplete handler receives a failed result with error "Should not overwrite" -Then the dead letter for the event should have: -``` diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-006-cron-expires-approval-after-timeout.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-006-cron-expires-approval-after-timeout.sdp.md deleted file mode 100644 index 310904e3..00000000 --- a/specs/behavior/order-management/agent/on-complete.examples/s-006-cron-expires-approval-after-timeout.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.agent.on-complete.cron-expires-approval-after-timeout -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.agent.on-complete ---- -# Cron expires approval after timeout - -## Intent - -- outcome: Executable scenario: Cron expires approval after timeout - -```gwt -Given a fresh unit test context -When the onComplete handler records a pending approval for customer "cust_expired" and approval expiration runs after the timeout elapses -Then the pending approval should have: -And an "ApprovalExpired" audit event should exist for the pending approval -``` diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-007-expired-approval-cannot-be-approved.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-007-expired-approval-cannot-be-approved.sdp.md deleted file mode 100644 index 519ceaed..00000000 --- a/specs/behavior/order-management/agent/on-complete.examples/s-007-expired-approval-cannot-be-approved.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.agent.on-complete.expired-approval-cannot-be-approved -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.agent.on-complete ---- -# Expired approval cannot be approved - -## Intent - -- outcome: Executable scenario: Expired approval cannot be approved - -```gwt -Given a fresh unit test context -When the onComplete handler records a pending approval for customer "cust_expired_review" and approval expiration runs after the timeout elapses and reviewer "reviewer_late" attempts to approve the expired action -Then the approval action should fail with error "INVALID_STATUS_TRANSITION" -``` diff --git a/specs/behavior/order-management/agent/on-complete.examples/s-008-suggest-customer-outreach-creates-outreach-record-and-emits-event.sdp.md b/specs/behavior/order-management/agent/on-complete.examples/s-008-suggest-customer-outreach-creates-outreach-record-and-emits-event.sdp.md deleted file mode 100644 index 012d4531..00000000 --- a/specs/behavior/order-management/agent/on-complete.examples/s-008-suggest-customer-outreach-creates-outreach-record-and-emits-event.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.agent.on-complete.suggest-customer-outreach-creates-outreach-record-and-emits-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.agent.on-complete ---- -# SuggestCustomerOutreach creates outreach record and emits event - -## Intent - -- outcome: Executable scenario: SuggestCustomerOutreach creates outreach record and emits event - -```gwt -Given a fresh unit test context -When the onComplete handler auto-executes a SuggestCustomerOutreach command for customer "cust_outreach_123" and scheduled command routing completes -Then the recorded command should have: -And the outreach task should have: -And an "OutreachCreated" event should be emitted for the outreach task -``` diff --git a/specs/behavior/order-management/agent/on-complete.sdp.md b/specs/behavior/order-management/agent/on-complete.sdp.md index 6ef7722c..96d4b41b 100644 --- a/specs/behavior/order-management/agent/on-complete.sdp.md +++ b/specs/behavior/order-management/agent/on-complete.sdp.md @@ -11,7 +11,7 @@ relations: ## Intent - actor: a system operator -- outcome: agent failures to create dead letters for retry so that no events are silently lost during processing +- outcome: Agent failures create dead letters for retry so that no events are silently lost during processing. ## Behavior diff --git a/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-001-decide-to-add-item-to-draft-order.sdp.md b/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-001-decide-to-add-item-to-draft-order.sdp.md deleted file mode 100644 index 967da085..00000000 --- a/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-001-decide-to-add-item-to-draft-order.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.add-order-item-decider.decide-to-add-item-to-draft-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.add-order-item-decider ---- -# Decide to add item to draft order - -## Intent - -- outcome: Executable scenario: Decide to add item to draft order - -```gwt -Given a decider context -And an order state: -When I decide to add item: -Then the decision should be "success" -And the event type should be "OrderItemAdded" -And the data should have itemCount 1 -And the data should have totalAmount "20.0" -``` diff --git a/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-002-reject-add-item-when-order-is-not-in-draft.sdp.md b/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-002-reject-add-item-when-order-is-not-in-draft.sdp.md deleted file mode 100644 index ebe41b03..00000000 --- a/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-002-reject-add-item-when-order-is-not-in-draft.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.add-order-item-decider.reject-add-item-when-order-is-not-in-draft -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.add-order-item-decider ---- -# Reject add item when order is not in draft - -## Intent - -- outcome: Executable scenario: Reject add item when order is not in draft - -```gwt -Given a decider context -And an order state: -When I decide to add any item -Then the decision should be "rejected" -And the rejection code should be "ORDER_NOT_IN_DRAFT" -``` diff --git a/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-003-reject-add-item-with-invalid-quantity.sdp.md b/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-003-reject-add-item-with-invalid-quantity.sdp.md deleted file mode 100644 index 8f26febe..00000000 --- a/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-003-reject-add-item-with-invalid-quantity.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.add-order-item-decider.reject-add-item-with-invalid-quantity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.add-order-item-decider ---- -# Reject add item with invalid quantity - -## Intent - -- outcome: Executable scenario: Reject add item with invalid quantity - -```gwt -Given a decider context -And an order state: -When I decide to add item with negative quantity: -Then the decision should be "rejected" -And the rejection code should be "INVALID_ORDER_ITEM" -``` diff --git a/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-004-accumulate-items-and-recalculate-total.sdp.md b/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-004-accumulate-items-and-recalculate-total.sdp.md deleted file mode 100644 index 97331a86..00000000 --- a/specs/behavior/order-management/deciders/add-order-item-decider.examples/s-004-accumulate-items-and-recalculate-total.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.add-order-item-decider.accumulate-items-and-recalculate-total -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.add-order-item-decider ---- -# Accumulate items and recalculate total - -## Intent - -- outcome: Executable scenario: Accumulate items and recalculate total - -```gwt -Given a decider context -And an order state with existing items: -When I decide to add item: -Then the decision should be "success" -And the data should have itemCount 2 -And the data should have totalAmount "40.0" -``` diff --git a/specs/behavior/order-management/deciders/add-order-item-decider.sdp.md b/specs/behavior/order-management/deciders/add-order-item-decider.sdp.md index 1a44f7b3..904e5a7c 100644 --- a/specs/behavior/order-management/deciders/add-order-item-decider.sdp.md +++ b/specs/behavior/order-management/deciders/add-order-item-decider.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Add Order Item Decider +- outcome: The AddOrderItem decider validates draft status and quantity, then emits OrderItemAdded. diff --git a/specs/behavior/order-management/deciders/add-stock-decider.examples/s-001-decide-to-add-stock-to-product.sdp.md b/specs/behavior/order-management/deciders/add-stock-decider.examples/s-001-decide-to-add-stock-to-product.sdp.md deleted file mode 100644 index 699470a1..00000000 --- a/specs/behavior/order-management/deciders/add-stock-decider.examples/s-001-decide-to-add-stock-to-product.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.add-stock-decider.decide-to-add-stock-to-product -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.add-stock-decider ---- -# Decide to add stock to product - -## Intent - -- outcome: Executable scenario: Decide to add stock to product - -```gwt -Given a decider context -And an inventory state: -When I decide to add stock with quantity 25 -Then the decision should be "success" -And the event type should be "StockAdded" -And the data should have newAvailableQuantity 75 -And the data should have quantity 25 -``` diff --git a/specs/behavior/order-management/deciders/add-stock-decider.examples/s-002-add-stock-with-reason.sdp.md b/specs/behavior/order-management/deciders/add-stock-decider.examples/s-002-add-stock-with-reason.sdp.md deleted file mode 100644 index a9b03210..00000000 --- a/specs/behavior/order-management/deciders/add-stock-decider.examples/s-002-add-stock-with-reason.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.add-stock-decider.add-stock-with-reason -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.add-stock-decider ---- -# Add stock with reason - -## Intent - -- outcome: Executable scenario: Add stock with reason - -```gwt -Given a decider context -And an inventory state: -When I decide to add stock with quantity 50 and reason "Restocking from supplier" -Then the decision should be "success" -And the event payload should have reason "Restocking from supplier" -``` diff --git a/specs/behavior/order-management/deciders/add-stock-decider.examples/s-003-reject-add-stock-with-zero-quantity.sdp.md b/specs/behavior/order-management/deciders/add-stock-decider.examples/s-003-reject-add-stock-with-zero-quantity.sdp.md deleted file mode 100644 index 87facea3..00000000 --- a/specs/behavior/order-management/deciders/add-stock-decider.examples/s-003-reject-add-stock-with-zero-quantity.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.add-stock-decider.reject-add-stock-with-zero-quantity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.add-stock-decider ---- -# Reject add stock with zero quantity - -## Intent - -- outcome: Executable scenario: Reject add stock with zero quantity - -```gwt -Given a decider context -And an inventory state: -When I decide to add stock with quantity 0 -Then the decision should be "rejected" -And the rejection code should be "INVALID_QUANTITY" -``` diff --git a/specs/behavior/order-management/deciders/add-stock-decider.examples/s-004-reject-add-stock-with-negative-quantity.sdp.md b/specs/behavior/order-management/deciders/add-stock-decider.examples/s-004-reject-add-stock-with-negative-quantity.sdp.md deleted file mode 100644 index 986e12f5..00000000 --- a/specs/behavior/order-management/deciders/add-stock-decider.examples/s-004-reject-add-stock-with-negative-quantity.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.add-stock-decider.reject-add-stock-with-negative-quantity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.add-stock-decider ---- -# Reject add stock with negative quantity - -## Intent - -- outcome: Executable scenario: Reject add stock with negative quantity - -```gwt -Given a decider context -And an inventory state: -When I decide to add stock with quantity -10 -Then the decision should be "rejected" -And the rejection code should be "INVALID_QUANTITY" -``` diff --git a/specs/behavior/order-management/deciders/add-stock-decider.sdp.md b/specs/behavior/order-management/deciders/add-stock-decider.sdp.md index 26638c85..3bd16f0c 100644 --- a/specs/behavior/order-management/deciders/add-stock-decider.sdp.md +++ b/specs/behavior/order-management/deciders/add-stock-decider.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Add Stock Decider +- outcome: The AddStock decider validates a positive quantity and emits StockAdded. diff --git a/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-001-decide-to-cancel-a-draft-order.sdp.md b/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-001-decide-to-cancel-a-draft-order.sdp.md deleted file mode 100644 index 452c05a8..00000000 --- a/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-001-decide-to-cancel-a-draft-order.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.cancel-order-decider.decide-to-cancel-a-draft-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.cancel-order-decider ---- -# Decide to cancel a draft order - -## Intent - -- outcome: Executable scenario: Decide to cancel a draft order - -```gwt -Given a decider context -And an order state: -When I decide to cancel the order with reason "Customer changed mind" -Then the decision should be "success" -And the event type should be "OrderCancelled" -And the state update should set status to "cancelled" -And the data should contain reason "Customer changed mind" -``` diff --git a/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-002-decide-to-cancel-a-submitted-order.sdp.md b/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-002-decide-to-cancel-a-submitted-order.sdp.md deleted file mode 100644 index 4b88318b..00000000 --- a/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-002-decide-to-cancel-a-submitted-order.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.cancel-order-decider.decide-to-cancel-a-submitted-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.cancel-order-decider ---- -# Decide to cancel a submitted order - -## Intent - -- outcome: Executable scenario: Decide to cancel a submitted order - -```gwt -Given a decider context -And an order state: -When I decide to cancel the order with reason "Out of stock" -Then the decision should be "success" -And the event type should be "OrderCancelled" -And the state update should set status to "cancelled" -``` diff --git a/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-003-decide-to-cancel-a-confirmed-order.sdp.md b/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-003-decide-to-cancel-a-confirmed-order.sdp.md deleted file mode 100644 index 6f14f5b1..00000000 --- a/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-003-decide-to-cancel-a-confirmed-order.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.cancel-order-decider.decide-to-cancel-a-confirmed-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.cancel-order-decider ---- -# Decide to cancel a confirmed order - -## Intent - -- outcome: Executable scenario: Decide to cancel a confirmed order - -```gwt -Given a decider context -And an order state: -When I decide to cancel the order with reason "Changed mind after confirmation" -Then the decision should be "success" -And the event type should be "OrderCancelled" -And the state update should set status to "cancelled" -And the data should contain reason "Changed mind after confirmation" -``` diff --git a/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-004-reject-cancel-for-already-cancelled-order.sdp.md b/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-004-reject-cancel-for-already-cancelled-order.sdp.md deleted file mode 100644 index b5cd652d..00000000 --- a/specs/behavior/order-management/deciders/cancel-order-decider.examples/s-004-reject-cancel-for-already-cancelled-order.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.cancel-order-decider.reject-cancel-for-already-cancelled-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.cancel-order-decider ---- -# Reject cancel for already cancelled order - -## Intent - -- outcome: Executable scenario: Reject cancel for already cancelled order - -```gwt -Given a decider context -And an order state: -When I decide to cancel the order with reason "Double cancel" -Then the decision should be "rejected" -And the rejection code should be "ORDER_ALREADY_CANCELLED" -``` diff --git a/specs/behavior/order-management/deciders/cancel-order-decider.sdp.md b/specs/behavior/order-management/deciders/cancel-order-decider.sdp.md index 94962ac8..e1a32952 100644 --- a/specs/behavior/order-management/deciders/cancel-order-decider.sdp.md +++ b/specs/behavior/order-management/deciders/cancel-order-decider.sdp.md @@ -10,4 +10,18 @@ relations: ## Intent -- outcome: Cancel Order Decider +- outcome: The CancelOrder decider validates cancellable status and emits OrderCancelled. + +## Example space + +```gwt-vocabulary +Given a decider context +And an order state: +When I decide to cancel the order with reason {reason:string} +Then the decision should be "success" +And the event type should be "OrderCancelled" +And the state update should set status to "cancelled" +And the data should contain reason {reason:string} +And the decision should be "rejected" +And the rejection code should be "ORDER_ALREADY_CANCELLED" +``` diff --git a/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-001-decide-to-confirm-a-submitted-order.sdp.md b/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-001-decide-to-confirm-a-submitted-order.sdp.md deleted file mode 100644 index 294fe897..00000000 --- a/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-001-decide-to-confirm-a-submitted-order.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.confirm-order-decider.decide-to-confirm-a-submitted-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.confirm-order-decider ---- -# Decide to confirm a submitted order - -## Intent - -- outcome: Executable scenario: Decide to confirm a submitted order - -```gwt -Given a decider context with timestamp 1704067200000 -And an order state: -When I decide to confirm the order -Then the decision should be "success" -And the event type should be "OrderConfirmed" -And the event payload should contain "confirmedAt" with value 1704067200000 -And the state update should set status to "confirmed" -``` diff --git a/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-002-reject-confirm-for-order-in-draft-status.sdp.md b/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-002-reject-confirm-for-order-in-draft-status.sdp.md deleted file mode 100644 index 87c3f37e..00000000 --- a/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-002-reject-confirm-for-order-in-draft-status.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.confirm-order-decider.reject-confirm-for-order-in-draft-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.confirm-order-decider ---- -# Reject confirm for order in draft status - -## Intent - -- outcome: Executable scenario: Reject confirm for order in draft status - -```gwt -Given a decider context with timestamp 1704067200000 -And an order state: -When I decide to confirm the order -Then the decision should be "rejected" -And the rejection code should be "ORDER_NOT_SUBMITTED" -``` diff --git a/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-003-reject-confirm-for-already-confirmed-order.sdp.md b/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-003-reject-confirm-for-already-confirmed-order.sdp.md deleted file mode 100644 index fec9c94e..00000000 --- a/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-003-reject-confirm-for-already-confirmed-order.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.confirm-order-decider.reject-confirm-for-already-confirmed-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.confirm-order-decider ---- -# Reject confirm for already confirmed order - -## Intent - -- outcome: Executable scenario: Reject confirm for already confirmed order - -```gwt -Given a decider context with timestamp 1704067200000 -And an order state: -When I decide to confirm the order -Then the decision should be "rejected" -And the rejection code should be "ORDER_NOT_SUBMITTED" -``` diff --git a/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-004-reject-confirm-for-cancelled-order.sdp.md b/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-004-reject-confirm-for-cancelled-order.sdp.md deleted file mode 100644 index 5451c489..00000000 --- a/specs/behavior/order-management/deciders/confirm-order-decider.examples/s-004-reject-confirm-for-cancelled-order.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.confirm-order-decider.reject-confirm-for-cancelled-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.confirm-order-decider ---- -# Reject confirm for cancelled order - -## Intent - -- outcome: Executable scenario: Reject confirm for cancelled order - -```gwt -Given a decider context with timestamp 1704067200000 -And an order state: -When I decide to confirm the order -Then the decision should be "rejected" -And the rejection code should be "ORDER_NOT_SUBMITTED" -``` diff --git a/specs/behavior/order-management/deciders/confirm-order-decider.sdp.md b/specs/behavior/order-management/deciders/confirm-order-decider.sdp.md index 9c4778af..4416be2a 100644 --- a/specs/behavior/order-management/deciders/confirm-order-decider.sdp.md +++ b/specs/behavior/order-management/deciders/confirm-order-decider.sdp.md @@ -10,4 +10,18 @@ relations: ## Intent -- outcome: Confirm Order Decider +- outcome: The ConfirmOrder decider validates submitted status and emits OrderConfirmed. + +## Example space + +```gwt-vocabulary +Given a decider context with timestamp 1704067200000 +And an order state: +When I decide to confirm the order +Then the decision should be "success" +And the event type should be "OrderConfirmed" +And the event payload should contain "confirmedAt" with value 1704067200000 +And the state update should set status to "confirmed" +And the decision should be "rejected" +And the rejection code should be "ORDER_NOT_SUBMITTED" +``` diff --git a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-001-decide-to-confirm-a-pending-reservation.sdp.md b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-001-decide-to-confirm-a-pending-reservation.sdp.md deleted file mode 100644 index cd4b1b8c..00000000 --- a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-001-decide-to-confirm-a-pending-reservation.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.confirm-reservation-decider.decide-to-confirm-a-pending-reservation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.confirm-reservation-decider ---- -# Decide to confirm a pending reservation - -## Intent - -- outcome: Executable scenario: Decide to confirm a pending reservation - -```gwt -Given a decider context -And a reservation state: -When I decide to confirm the reservation -Then the decision should be "success" -And the event type should be "ReservationConfirmed" -And the state update should have status "confirmed" -``` diff --git a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-002-reject-confirm-when-reservation-is-already-confirmed.sdp.md b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-002-reject-confirm-when-reservation-is-already-confirmed.sdp.md deleted file mode 100644 index a838dac4..00000000 --- a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-002-reject-confirm-when-reservation-is-already-confirmed.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.confirm-reservation-decider.reject-confirm-when-reservation-is-already-confirmed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.confirm-reservation-decider ---- -# Reject confirm when reservation is already confirmed - -## Intent - -- outcome: Executable scenario: Reject confirm when reservation is already confirmed - -```gwt -Given a decider context -And a reservation state: -When I decide to confirm the reservation -Then the decision should be "rejected" -And the rejection code should be "RESERVATION_NOT_PENDING" -``` diff --git a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-003-reject-confirm-when-reservation-is-released.sdp.md b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-003-reject-confirm-when-reservation-is-released.sdp.md deleted file mode 100644 index de7feee7..00000000 --- a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-003-reject-confirm-when-reservation-is-released.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.confirm-reservation-decider.reject-confirm-when-reservation-is-released -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.confirm-reservation-decider ---- -# Reject confirm when reservation is released - -## Intent - -- outcome: Executable scenario: Reject confirm when reservation is released - -```gwt -Given a decider context -And a reservation state: -When I decide to confirm the reservation -Then the decision should be "rejected" -And the rejection code should be "RESERVATION_NOT_PENDING" -``` diff --git a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-004-reject-confirm-when-reservation-is-expired.sdp.md b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-004-reject-confirm-when-reservation-is-expired.sdp.md deleted file mode 100644 index ed5a4fc6..00000000 --- a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-004-reject-confirm-when-reservation-is-expired.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.confirm-reservation-decider.reject-confirm-when-reservation-is-expired -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.confirm-reservation-decider ---- -# Reject confirm when reservation is expired - -## Intent - -- outcome: Executable scenario: Reject confirm when reservation is expired - -```gwt -Given a decider context -And a reservation state: -When I decide to confirm the reservation -Then the decision should be "rejected" -And the rejection code should be "RESERVATION_NOT_PENDING" -``` diff --git a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-005-reject-confirm-when-reservation-has-passed-its-expiration-time.sdp.md b/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-005-reject-confirm-when-reservation-has-passed-its-expiration-time.sdp.md deleted file mode 100644 index 474d916d..00000000 --- a/specs/behavior/order-management/deciders/confirm-reservation-decider.examples/s-005-reject-confirm-when-reservation-has-passed-its-expiration-time.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.confirm-reservation-decider.reject-confirm-when-reservation-has-passed-its-expiration-time -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.confirm-reservation-decider ---- -# Reject confirm when reservation has passed its expiration time - -## Intent - -- outcome: Executable scenario: Reject confirm when reservation has passed its expiration time - -```gwt -Given a decider context -And a reservation state: -When I decide to confirm the reservation -Then the decision should be "rejected" -And the rejection code should be "RESERVATION_EXPIRED" -``` diff --git a/specs/behavior/order-management/deciders/confirm-reservation-decider.sdp.md b/specs/behavior/order-management/deciders/confirm-reservation-decider.sdp.md index 372f3ab1..5b11d986 100644 --- a/specs/behavior/order-management/deciders/confirm-reservation-decider.sdp.md +++ b/specs/behavior/order-management/deciders/confirm-reservation-decider.sdp.md @@ -10,4 +10,18 @@ relations: ## Intent -- outcome: Confirm Reservation Decider +- outcome: The ConfirmReservation decider validates pending unexpired status and emits ReservationConfirmed. + +## Example space + +```gwt-vocabulary +Given a decider context +And a reservation state: +When I decide to confirm the reservation +Then the decision should be "success" +And the event type should be "ReservationConfirmed" +And the state update should have status "confirmed" +And the decision should be "rejected" +And the rejection code should be "RESERVATION_NOT_PENDING" +And the rejection code should be "RESERVATION_EXPIRED" +``` diff --git a/specs/behavior/order-management/deciders/create-order-decider.examples/s-001-decide-to-create-a-new-order-when-none-exists.sdp.md b/specs/behavior/order-management/deciders/create-order-decider.examples/s-001-decide-to-create-a-new-order-when-none-exists.sdp.md deleted file mode 100644 index b8ff6706..00000000 --- a/specs/behavior/order-management/deciders/create-order-decider.examples/s-001-decide-to-create-a-new-order-when-none-exists.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.create-order-decider.decide-to-create-a-new-order-when-none-exists -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.create-order-decider ---- -# Decide to create a new order when none exists - -## Intent - -- outcome: Executable scenario: Decide to create a new order when none exists - -```gwt -Given a decider context -And no existing order state -When I decide to create order with orderId "ord_new_001" and customerId "cust_001" -Then the decision should be "success" -And the event type should be "OrderCreated" -And the data should contain orderId "ord_new_001" -``` diff --git a/specs/behavior/order-management/deciders/create-order-decider.examples/s-002-reject-create-when-order-already-exists.sdp.md b/specs/behavior/order-management/deciders/create-order-decider.examples/s-002-reject-create-when-order-already-exists.sdp.md deleted file mode 100644 index e0bf6e04..00000000 --- a/specs/behavior/order-management/deciders/create-order-decider.examples/s-002-reject-create-when-order-already-exists.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.create-order-decider.reject-create-when-order-already-exists -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.create-order-decider ---- -# Reject create when order already exists - -## Intent - -- outcome: Executable scenario: Reject create when order already exists - -```gwt -Given a decider context -And an existing order state with orderId "ord_existing" -When I decide to create order with orderId "ord_existing" and customerId "cust_002" -Then the decision should be "rejected" -And the rejection code should be "ORDER_ALREADY_EXISTS" -``` diff --git a/specs/behavior/order-management/deciders/create-order-decider.sdp.md b/specs/behavior/order-management/deciders/create-order-decider.sdp.md index 6794b3d7..611e0e8d 100644 --- a/specs/behavior/order-management/deciders/create-order-decider.sdp.md +++ b/specs/behavior/order-management/deciders/create-order-decider.sdp.md @@ -10,4 +10,18 @@ relations: ## Intent -- outcome: Create Order Decider +- outcome: The CreateOrder decider validates that no order with the same ID exists, then emits OrderCreated. + +## Example space + +```gwt-vocabulary +Given a decider context +And no existing order state +And an existing order state with orderId {orderId:string} +When I decide to create order with orderId {orderId:string} and customerId {customerId:string} +Then the decision should be "success" +And the event type should be "OrderCreated" +And the data should contain orderId {orderId:string} +And the decision should be "rejected" +And the rejection code should be "ORDER_ALREADY_EXISTS" +``` diff --git a/specs/behavior/order-management/deciders/create-product-decider.examples/s-001-decide-to-create-a-new-product-when-none-exists.sdp.md b/specs/behavior/order-management/deciders/create-product-decider.examples/s-001-decide-to-create-a-new-product-when-none-exists.sdp.md deleted file mode 100644 index 5b964bc0..00000000 --- a/specs/behavior/order-management/deciders/create-product-decider.examples/s-001-decide-to-create-a-new-product-when-none-exists.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.create-product-decider.decide-to-create-a-new-product-when-none-exists -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.create-product-decider ---- -# Decide to create a new product when none exists - -## Intent - -- outcome: Executable scenario: Decide to create a new product when none exists - -```gwt -Given a decider context -And no existing inventory state -When I decide to create product with: -Then the decision should be "success" -And the event type should be "ProductCreated" -And the data should contain productId "prod_new_001" -``` diff --git a/specs/behavior/order-management/deciders/create-product-decider.examples/s-002-reject-create-when-product-already-exists.sdp.md b/specs/behavior/order-management/deciders/create-product-decider.examples/s-002-reject-create-when-product-already-exists.sdp.md deleted file mode 100644 index b4788d79..00000000 --- a/specs/behavior/order-management/deciders/create-product-decider.examples/s-002-reject-create-when-product-already-exists.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.create-product-decider.reject-create-when-product-already-exists -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.create-product-decider ---- -# Reject create when product already exists - -## Intent - -- outcome: Executable scenario: Reject create when product already exists - -```gwt -Given a decider context -And an existing inventory state with productId "prod_existing" -When I decide to create product with: -Then the decision should be "rejected" -And the rejection code should be "PRODUCT_ALREADY_EXISTS" -``` diff --git a/specs/behavior/order-management/deciders/create-product-decider.examples/s-003-reject-create-with-empty-product-name.sdp.md b/specs/behavior/order-management/deciders/create-product-decider.examples/s-003-reject-create-with-empty-product-name.sdp.md deleted file mode 100644 index 3bd2ef64..00000000 --- a/specs/behavior/order-management/deciders/create-product-decider.examples/s-003-reject-create-with-empty-product-name.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.create-product-decider.reject-create-with-empty-product-name -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.create-product-decider ---- -# Reject create with empty product name - -## Intent - -- outcome: Executable scenario: Reject create with empty product name - -```gwt -Given a decider context -And no existing inventory state -When I decide to create product with: -Then the decision should be "rejected" -And the rejection code should be "INVALID_PRODUCT_NAME" -``` diff --git a/specs/behavior/order-management/deciders/create-product-decider.examples/s-004-reject-create-with-empty-sku.sdp.md b/specs/behavior/order-management/deciders/create-product-decider.examples/s-004-reject-create-with-empty-sku.sdp.md deleted file mode 100644 index 6fc2ba82..00000000 --- a/specs/behavior/order-management/deciders/create-product-decider.examples/s-004-reject-create-with-empty-sku.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.create-product-decider.reject-create-with-empty-sku -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.create-product-decider ---- -# Reject create with empty SKU - -## Intent - -- outcome: Executable scenario: Reject create with empty SKU - -```gwt -Given a decider context -And no existing inventory state -When I decide to create product with: -Then the decision should be "rejected" -And the rejection code should be "INVALID_SKU" -``` diff --git a/specs/behavior/order-management/deciders/create-product-decider.examples/s-005-reject-create-with-zero-price.sdp.md b/specs/behavior/order-management/deciders/create-product-decider.examples/s-005-reject-create-with-zero-price.sdp.md deleted file mode 100644 index 3ed1eb41..00000000 --- a/specs/behavior/order-management/deciders/create-product-decider.examples/s-005-reject-create-with-zero-price.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.create-product-decider.reject-create-with-zero-price -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.create-product-decider ---- -# Reject create with zero price - -## Intent - -- outcome: Executable scenario: Reject create with zero price - -```gwt -Given a decider context -And no existing inventory state -When I decide to create product with: -Then the decision should be "rejected" -And the rejection code should be "INVALID_UNIT_PRICE" -``` diff --git a/specs/behavior/order-management/deciders/create-product-decider.examples/s-006-reject-create-with-negative-price.sdp.md b/specs/behavior/order-management/deciders/create-product-decider.examples/s-006-reject-create-with-negative-price.sdp.md deleted file mode 100644 index de39f266..00000000 --- a/specs/behavior/order-management/deciders/create-product-decider.examples/s-006-reject-create-with-negative-price.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.create-product-decider.reject-create-with-negative-price -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.create-product-decider ---- -# Reject create with negative price - -## Intent - -- outcome: Executable scenario: Reject create with negative price - -```gwt -Given a decider context -And no existing inventory state -When I decide to create product with: -Then the decision should be "rejected" -And the rejection code should be "INVALID_UNIT_PRICE" -``` diff --git a/specs/behavior/order-management/deciders/create-product-decider.sdp.md b/specs/behavior/order-management/deciders/create-product-decider.sdp.md index 595eee7c..f131a80c 100644 --- a/specs/behavior/order-management/deciders/create-product-decider.sdp.md +++ b/specs/behavior/order-management/deciders/create-product-decider.sdp.md @@ -10,4 +10,21 @@ relations: ## Intent -- outcome: Create Product Decider +- outcome: The CreateProduct decider validates uniqueness, name, SKU, and positive price, then emits ProductCreated. + +## Example space + +```gwt-vocabulary +Given a decider context +And no existing inventory state +And an existing inventory state with productId "prod_existing" +When I decide to create product with: +Then the decision should be "success" +And the event type should be "ProductCreated" +And the data should contain productId "prod_new_001" +And the decision should be "rejected" +And the rejection code should be "PRODUCT_ALREADY_EXISTS" +And the rejection code should be "INVALID_PRODUCT_NAME" +And the rejection code should be "INVALID_SKU" +And the rejection code should be "INVALID_UNIT_PRICE" +``` diff --git a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-001-decide-to-expire-a-pending-reservation-that-has-timed-out.sdp.md b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-001-decide-to-expire-a-pending-reservation-that-has-timed-out.sdp.md deleted file mode 100644 index 67e4693e..00000000 --- a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-001-decide-to-expire-a-pending-reservation-that-has-timed-out.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.expire-reservation-decider.decide-to-expire-a-pending-reservation-that-has-timed-out -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.expire-reservation-decider ---- -# Decide to expire a pending reservation that has timed out - -## Intent - -- outcome: Executable scenario: Decide to expire a pending reservation that has timed out - -```gwt -Given a decider context -And a reservation state: -When I decide to expire the reservation -Then the decision should be "success" -And the event type should be "ReservationExpired" -And the state update should have status "expired" -``` diff --git a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-002-reject-expire-when-reservation-has-not-timed-out-yet.sdp.md b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-002-reject-expire-when-reservation-has-not-timed-out-yet.sdp.md deleted file mode 100644 index 07a7c767..00000000 --- a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-002-reject-expire-when-reservation-has-not-timed-out-yet.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.expire-reservation-decider.reject-expire-when-reservation-has-not-timed-out-yet -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.expire-reservation-decider ---- -# Reject expire when reservation has not timed out yet - -## Intent - -- outcome: Executable scenario: Reject expire when reservation has not timed out yet - -```gwt -Given a decider context -And a reservation state: -When I decide to expire the reservation -Then the decision should be "rejected" -And the rejection code should be "RESERVATION_NOT_EXPIRED" -``` diff --git a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-003-reject-expire-when-reservation-is-already-confirmed.sdp.md b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-003-reject-expire-when-reservation-is-already-confirmed.sdp.md deleted file mode 100644 index 2809dfcb..00000000 --- a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-003-reject-expire-when-reservation-is-already-confirmed.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.expire-reservation-decider.reject-expire-when-reservation-is-already-confirmed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.expire-reservation-decider ---- -# Reject expire when reservation is already confirmed - -## Intent - -- outcome: Executable scenario: Reject expire when reservation is already confirmed - -```gwt -Given a decider context -And a reservation state: -When I decide to expire the reservation -Then the decision should be "rejected" -And the rejection code should be "RESERVATION_NOT_PENDING" -``` diff --git a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-004-reject-expire-when-reservation-is-already-released.sdp.md b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-004-reject-expire-when-reservation-is-already-released.sdp.md deleted file mode 100644 index 541ceaca..00000000 --- a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-004-reject-expire-when-reservation-is-already-released.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.expire-reservation-decider.reject-expire-when-reservation-is-already-released -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.expire-reservation-decider ---- -# Reject expire when reservation is already released - -## Intent - -- outcome: Executable scenario: Reject expire when reservation is already released - -```gwt -Given a decider context -And a reservation state: -When I decide to expire the reservation -Then the decision should be "rejected" -And the rejection code should be "RESERVATION_NOT_PENDING" -``` diff --git a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-005-reject-expire-when-reservation-is-already-expired.sdp.md b/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-005-reject-expire-when-reservation-is-already-expired.sdp.md deleted file mode 100644 index 8b8504a0..00000000 --- a/specs/behavior/order-management/deciders/expire-reservation-decider.examples/s-005-reject-expire-when-reservation-is-already-expired.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.expire-reservation-decider.reject-expire-when-reservation-is-already-expired -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.expire-reservation-decider ---- -# Reject expire when reservation is already expired - -## Intent - -- outcome: Executable scenario: Reject expire when reservation is already expired - -```gwt -Given a decider context -And a reservation state: -When I decide to expire the reservation -Then the decision should be "rejected" -And the rejection code should be "RESERVATION_NOT_PENDING" -``` diff --git a/specs/behavior/order-management/deciders/expire-reservation-decider.sdp.md b/specs/behavior/order-management/deciders/expire-reservation-decider.sdp.md index 3be31f6a..f2e573ef 100644 --- a/specs/behavior/order-management/deciders/expire-reservation-decider.sdp.md +++ b/specs/behavior/order-management/deciders/expire-reservation-decider.sdp.md @@ -10,4 +10,18 @@ relations: ## Intent -- outcome: Expire Reservation Decider +- outcome: The ExpireReservation decider validates pending status and elapsed TTL, then emits ReservationExpired. + +## Example space + +```gwt-vocabulary +Given a decider context +And a reservation state: +When I decide to expire the reservation +Then the decision should be "success" +And the event type should be "ReservationExpired" +And the state update should have status "expired" +And the decision should be "rejected" +And the rejection code should be "RESERVATION_NOT_EXPIRED" +And the rejection code should be "RESERVATION_NOT_PENDING" +``` diff --git a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-001-evolve-null-state-with-product-created-event.sdp.md b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-001-evolve-null-state-with-product-created-event.sdp.md deleted file mode 100644 index f357fc2f..00000000 --- a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-001-evolve-null-state-with-product-created-event.sdp.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.inventory-evolve.evolve-null-state-with-product-created-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.inventory-evolve ---- -# Evolve null state with ProductCreated event - -## Intent - -- outcome: Executable scenario: Evolve null state with ProductCreated event - -```gwt -Given a decider context -And no existing inventory state -When I evolve with ProductCreated event: -Then the evolved state should have productId "prod_001" -And the evolved state should have productName "Test Widget" -And the evolved state should have sku "SKU-001" -And the evolved state should have unitPrice "29.99" -And the evolved state should have availableQuantity 0 -And the evolved state should have reservedQuantity 0 -And the evolved state should have version 1 -``` diff --git a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-002-evolve-inventory-state-with-stock-added-event.sdp.md b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-002-evolve-inventory-state-with-stock-added-event.sdp.md deleted file mode 100644 index 84bad5ff..00000000 --- a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-002-evolve-inventory-state-with-stock-added-event.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.inventory-evolve.evolve-inventory-state-with-stock-added-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.inventory-evolve ---- -# Evolve inventory state with StockAdded event - -## Intent - -- outcome: Executable scenario: Evolve inventory state with StockAdded event - -```gwt -Given a decider context -And an inventory state: -When I evolve with StockAdded event with quantity 25 -Then the evolved state should have availableQuantity 75 -And the evolved state should have reservedQuantity 10 -``` diff --git a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-003-evolve-inventory-from-zero-stock.sdp.md b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-003-evolve-inventory-from-zero-stock.sdp.md deleted file mode 100644 index 1e7bb277..00000000 --- a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-003-evolve-inventory-from-zero-stock.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.inventory-evolve.evolve-inventory-from-zero-stock -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.inventory-evolve ---- -# Evolve inventory from zero stock - -## Intent - -- outcome: Executable scenario: Evolve inventory from zero stock - -```gwt -Given a decider context -And an inventory state: -When I evolve with StockAdded event with quantity 100 -Then the evolved state should have availableQuantity 100 -``` diff --git a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-004-evolve-inventory-state-with-stock-reserved-event.sdp.md b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-004-evolve-inventory-state-with-stock-reserved-event.sdp.md deleted file mode 100644 index 24e9837c..00000000 --- a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-004-evolve-inventory-state-with-stock-reserved-event.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.inventory-evolve.evolve-inventory-state-with-stock-reserved-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.inventory-evolve ---- -# Evolve inventory state with StockReserved event - -## Intent - -- outcome: Executable scenario: Evolve inventory state with StockReserved event - -```gwt -Given a decider context -And an inventory state: -When I evolve with StockReserved event for productId "prod_001" with quantity 25 -Then the evolved state should have availableQuantity 75 -And the evolved state should have reservedQuantity 25 -``` diff --git a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-005-evolve-inventory-state-when-product-not-in-reservation.sdp.md b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-005-evolve-inventory-state-when-product-not-in-reservation.sdp.md deleted file mode 100644 index 2b036301..00000000 --- a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-005-evolve-inventory-state-when-product-not-in-reservation.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.inventory-evolve.evolve-inventory-state-when-product-not-in-reservation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.inventory-evolve ---- -# Evolve inventory state when product not in reservation - -## Intent - -- outcome: Executable scenario: Evolve inventory state when product not in reservation - -```gwt -Given a decider context -And an inventory state: -When I evolve with StockReserved event for productId "prod_001" with quantity 25 -Then the evolved state should have availableQuantity 50 -And the evolved state should have reservedQuantity 10 -``` diff --git a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-006-evolve-inventory-state-with-reservation-failed-event-no-change.sdp.md b/specs/behavior/order-management/deciders/inventory-evolve.examples/s-006-evolve-inventory-state-with-reservation-failed-event-no-change.sdp.md deleted file mode 100644 index f4756983..00000000 --- a/specs/behavior/order-management/deciders/inventory-evolve.examples/s-006-evolve-inventory-state-with-reservation-failed-event-no-change.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.inventory-evolve.evolve-inventory-state-with-reservation-failed-event-no-change -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.inventory-evolve ---- -# Evolve inventory state with ReservationFailed event (no change) - -## Intent - -- outcome: Executable scenario: Evolve inventory state with ReservationFailed event (no change) - -```gwt -Given a decider context -And an inventory state: -When I evolve with ReservationFailed event -Then the evolved state should have availableQuantity 100 -And the evolved state should have reservedQuantity 0 -``` diff --git a/specs/behavior/order-management/deciders/inventory-evolve.sdp.md b/specs/behavior/order-management/deciders/inventory-evolve.sdp.md index 420e7ed8..fab7cdbc 100644 --- a/specs/behavior/order-management/deciders/inventory-evolve.sdp.md +++ b/specs/behavior/order-management/deciders/inventory-evolve.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Inventory Evolve Functions +- outcome: Evolve inventory state from domain events without side effects. diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-001-order-created-evolves-null-to-initial-state.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-001-order-created-evolves-null-to-initial-state.sdp.md deleted file mode 100644 index 4f958757..00000000 --- a/specs/behavior/order-management/deciders/order-evolve.examples/s-001-order-created-evolves-null-to-initial-state.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.order-evolve.order-created-evolves-null-to-initial-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.order-evolve ---- -# OrderCreated evolves null to initial state - -## Intent - -- outcome: Executable scenario: OrderCreated evolves null to initial state - -```gwt -Given the evolve functions are available -And no prior order state -When OrderCreated event is applied: -Then state should have orderId "ord_001" -And state should have customerId "cust_001" -And state should have status "draft" -And state should have empty items -And state should have totalAmount 0 -``` diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-002-order-item-added-appends-item-to-empty-order.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-002-order-item-added-appends-item-to-empty-order.sdp.md deleted file mode 100644 index 4fb6a1e2..00000000 --- a/specs/behavior/order-management/deciders/order-evolve.examples/s-002-order-item-added-appends-item-to-empty-order.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.order-evolve.order-item-added-appends-item-to-empty-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.order-evolve ---- -# OrderItemAdded appends item to empty order - -## Intent - -- outcome: Executable scenario: OrderItemAdded appends item to empty order - -```gwt -Given the evolve functions are available -And an order state with: -When OrderItemAdded event is applied: -Then state should have 1 items -And state should have totalAmount "50.00" -And state should have item with productId "prod_001" -``` diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-003-order-item-added-accumulates-with-existing-items.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-003-order-item-added-accumulates-with-existing-items.sdp.md deleted file mode 100644 index 96b6c1a9..00000000 --- a/specs/behavior/order-management/deciders/order-evolve.examples/s-003-order-item-added-accumulates-with-existing-items.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.order-evolve.order-item-added-accumulates-with-existing-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.order-evolve ---- -# OrderItemAdded accumulates with existing items - -## Intent - -- outcome: Executable scenario: OrderItemAdded accumulates with existing items - -```gwt -Given the evolve functions are available -And an order state with: -When OrderItemAdded event is applied: -Then state should have 2 items -And state should have totalAmount "50.00" -``` diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-004-order-item-removed-removes-item-and-updates-total.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-004-order-item-removed-removes-item-and-updates-total.sdp.md deleted file mode 100644 index 34d8a72e..00000000 --- a/specs/behavior/order-management/deciders/order-evolve.examples/s-004-order-item-removed-removes-item-and-updates-total.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.order-evolve.order-item-removed-removes-item-and-updates-total -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.order-evolve ---- -# OrderItemRemoved removes item and updates total - -## Intent - -- outcome: Executable scenario: OrderItemRemoved removes item and updates total - -```gwt -Given the evolve functions are available -And an order state with item: -When OrderItemRemoved event is applied: -Then state should have 0 items -And state should have totalAmount 0 -``` diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-005-order-submitted-changes-status-to-submitted.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-005-order-submitted-changes-status-to-submitted.sdp.md deleted file mode 100644 index 775fbc22..00000000 --- a/specs/behavior/order-management/deciders/order-evolve.examples/s-005-order-submitted-changes-status-to-submitted.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.order-evolve.order-submitted-changes-status-to-submitted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.order-evolve ---- -# OrderSubmitted changes status to submitted - -## Intent - -- outcome: Executable scenario: OrderSubmitted changes status to submitted - -```gwt -Given the evolve functions are available -And an order state with: -When OrderSubmitted event is applied -Then state should have status "submitted" -``` diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-006-order-confirmed-changes-status-to-confirmed.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-006-order-confirmed-changes-status-to-confirmed.sdp.md deleted file mode 100644 index 86e14088..00000000 --- a/specs/behavior/order-management/deciders/order-evolve.examples/s-006-order-confirmed-changes-status-to-confirmed.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.order-evolve.order-confirmed-changes-status-to-confirmed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.order-evolve ---- -# OrderConfirmed changes status to confirmed - -## Intent - -- outcome: Executable scenario: OrderConfirmed changes status to confirmed - -```gwt -Given the evolve functions are available -And an order state with: -When OrderConfirmed event is applied -Then state should have status "confirmed" -``` diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-007-order-cancelled-changes-status-from-draft-to-cancelled.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-007-order-cancelled-changes-status-from-draft-to-cancelled.sdp.md deleted file mode 100644 index ef0b44b8..00000000 --- a/specs/behavior/order-management/deciders/order-evolve.examples/s-007-order-cancelled-changes-status-from-draft-to-cancelled.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.order-evolve.order-cancelled-changes-status-from-draft-to-cancelled -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.order-evolve ---- -# OrderCancelled changes status from draft to cancelled - -## Intent - -- outcome: Executable scenario: OrderCancelled changes status from draft to cancelled - -```gwt -Given the evolve functions are available -And an order state with: -When OrderCancelled event is applied -Then state should have status "cancelled" -``` diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-008-order-cancelled-changes-status-from-submitted-to-cancelled.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-008-order-cancelled-changes-status-from-submitted-to-cancelled.sdp.md deleted file mode 100644 index 49104c66..00000000 --- a/specs/behavior/order-management/deciders/order-evolve.examples/s-008-order-cancelled-changes-status-from-submitted-to-cancelled.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.order-evolve.order-cancelled-changes-status-from-submitted-to-cancelled -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.order-evolve ---- -# OrderCancelled changes status from submitted to cancelled - -## Intent - -- outcome: Executable scenario: OrderCancelled changes status from submitted to cancelled - -```gwt -Given the evolve functions are available -And an order state with: -When OrderCancelled event is applied -Then state should have status "cancelled" -``` diff --git a/specs/behavior/order-management/deciders/order-evolve.examples/s-009-order-cancelled-changes-status-from-confirmed-to-cancelled.sdp.md b/specs/behavior/order-management/deciders/order-evolve.examples/s-009-order-cancelled-changes-status-from-confirmed-to-cancelled.sdp.md deleted file mode 100644 index d7ae6215..00000000 --- a/specs/behavior/order-management/deciders/order-evolve.examples/s-009-order-cancelled-changes-status-from-confirmed-to-cancelled.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.order-evolve.order-cancelled-changes-status-from-confirmed-to-cancelled -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.order-evolve ---- -# OrderCancelled changes status from confirmed to cancelled - -## Intent - -- outcome: Executable scenario: OrderCancelled changes status from confirmed to cancelled - -```gwt -Given the evolve functions are available -And an order state with: -When OrderCancelled event is applied -Then state should have status "cancelled" -``` diff --git a/specs/behavior/order-management/deciders/order-evolve.sdp.md b/specs/behavior/order-management/deciders/order-evolve.sdp.md index e80ffb84..bfb2fbf0 100644 --- a/specs/behavior/order-management/deciders/order-evolve.sdp.md +++ b/specs/behavior/order-management/deciders/order-evolve.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Order State Evolution +- outcome: Evolve order state from domain events without side effects. diff --git a/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-001-decide-to-release-a-pending-reservation.sdp.md b/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-001-decide-to-release-a-pending-reservation.sdp.md deleted file mode 100644 index 3a10ee69..00000000 --- a/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-001-decide-to-release-a-pending-reservation.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.release-reservation-decider.decide-to-release-a-pending-reservation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.release-reservation-decider ---- -# Decide to release a pending reservation - -## Intent - -- outcome: Executable scenario: Decide to release a pending reservation - -```gwt -Given a decider context -And a reservation state: -When I decide to release the reservation with reason "Order cancelled" -Then the decision should be "success" -And the event type should be "ReservationReleased" -And the event payload should have reason "Order cancelled" -And the state update should have status "released" -``` diff --git a/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-002-decide-to-release-a-confirmed-reservation.sdp.md b/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-002-decide-to-release-a-confirmed-reservation.sdp.md deleted file mode 100644 index b4c0bd7f..00000000 --- a/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-002-decide-to-release-a-confirmed-reservation.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.release-reservation-decider.decide-to-release-a-confirmed-reservation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.release-reservation-decider ---- -# Decide to release a confirmed reservation - -## Intent - -- outcome: Executable scenario: Decide to release a confirmed reservation - -```gwt -Given a decider context -And a reservation state: -When I decide to release the reservation with reason "Order cancelled after confirmation" -Then the decision should be "success" -And the event type should be "ReservationReleased" -And the state update should have status "released" -``` diff --git a/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-003-reject-release-when-reservation-is-already-released.sdp.md b/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-003-reject-release-when-reservation-is-already-released.sdp.md deleted file mode 100644 index 0f28f3c0..00000000 --- a/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-003-reject-release-when-reservation-is-already-released.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.release-reservation-decider.reject-release-when-reservation-is-already-released -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.release-reservation-decider ---- -# Reject release when reservation is already released - -## Intent - -- outcome: Executable scenario: Reject release when reservation is already released - -```gwt -Given a decider context -And a reservation state: -When I decide to release the reservation with reason "Duplicate release" -Then the decision should be "rejected" -And the rejection code should be "RESERVATION_NOT_PENDING" -``` diff --git a/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-004-reject-release-when-reservation-is-expired.sdp.md b/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-004-reject-release-when-reservation-is-expired.sdp.md deleted file mode 100644 index 5c93fd96..00000000 --- a/specs/behavior/order-management/deciders/release-reservation-decider.examples/s-004-reject-release-when-reservation-is-expired.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.release-reservation-decider.reject-release-when-reservation-is-expired -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.release-reservation-decider ---- -# Reject release when reservation is expired - -## Intent - -- outcome: Executable scenario: Reject release when reservation is expired - -```gwt -Given a decider context -And a reservation state: -When I decide to release the reservation with reason "Too late" -Then the decision should be "rejected" -And the rejection code should be "RESERVATION_NOT_PENDING" -``` diff --git a/specs/behavior/order-management/deciders/release-reservation-decider.sdp.md b/specs/behavior/order-management/deciders/release-reservation-decider.sdp.md index 62b5db20..84ccce15 100644 --- a/specs/behavior/order-management/deciders/release-reservation-decider.sdp.md +++ b/specs/behavior/order-management/deciders/release-reservation-decider.sdp.md @@ -10,4 +10,18 @@ relations: ## Intent -- outcome: Release Reservation Decider +- outcome: The ReleaseReservation decider validates pending or confirmed status and emits ReservationReleased. + +## Example space + +```gwt-vocabulary +Given a decider context +And a reservation state: +When I decide to release the reservation with reason {reason:string} +Then the decision should be "success" +And the event type should be "ReservationReleased" +And the event payload should have reason {reason:string} +And the state update should have status "released" +And the decision should be "rejected" +And the rejection code should be "RESERVATION_NOT_PENDING" +``` diff --git a/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-001-decide-to-remove-existing-item-from-draft-order.sdp.md b/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-001-decide-to-remove-existing-item-from-draft-order.sdp.md deleted file mode 100644 index dfa9a2e4..00000000 --- a/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-001-decide-to-remove-existing-item-from-draft-order.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.remove-order-item-decider.decide-to-remove-existing-item-from-draft-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.remove-order-item-decider ---- -# Decide to remove existing item from draft order - -## Intent - -- outcome: Executable scenario: Decide to remove existing item from draft order - -```gwt -Given a decider context -And an order state with item: -When I decide to remove item with productId "prod_001" -Then the decision should be "success" -And the event type should be "OrderItemRemoved" -And the data should have itemCount 0 -And the data should have totalAmount "0.0" -``` diff --git a/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-002-reject-remove-item-when-order-is-not-in-draft.sdp.md b/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-002-reject-remove-item-when-order-is-not-in-draft.sdp.md deleted file mode 100644 index 34ae3933..00000000 --- a/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-002-reject-remove-item-when-order-is-not-in-draft.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.remove-order-item-decider.reject-remove-item-when-order-is-not-in-draft -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.remove-order-item-decider ---- -# Reject remove item when order is not in draft - -## Intent - -- outcome: Executable scenario: Reject remove item when order is not in draft - -```gwt -Given a decider context -And an order state: -When I decide to remove item with productId "prod_001" -Then the decision should be "rejected" -And the rejection code should be "ORDER_NOT_IN_DRAFT" -``` diff --git a/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-003-reject-remove-when-item-does-not-exist.sdp.md b/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-003-reject-remove-when-item-does-not-exist.sdp.md deleted file mode 100644 index 65da7aa7..00000000 --- a/specs/behavior/order-management/deciders/remove-order-item-decider.examples/s-003-reject-remove-when-item-does-not-exist.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.remove-order-item-decider.reject-remove-when-item-does-not-exist -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.remove-order-item-decider ---- -# Reject remove when item does not exist - -## Intent - -- outcome: Executable scenario: Reject remove when item does not exist - -```gwt -Given a decider context -And an order state: -When I decide to remove item with productId "nonexistent" -Then the decision should be "rejected" -And the rejection code should be "ITEM_NOT_FOUND" -``` diff --git a/specs/behavior/order-management/deciders/remove-order-item-decider.sdp.md b/specs/behavior/order-management/deciders/remove-order-item-decider.sdp.md index cf1ef91e..2171feb0 100644 --- a/specs/behavior/order-management/deciders/remove-order-item-decider.sdp.md +++ b/specs/behavior/order-management/deciders/remove-order-item-decider.sdp.md @@ -10,4 +10,20 @@ relations: ## Intent -- outcome: Remove Order Item Decider +- outcome: The RemoveOrderItem decider validates draft status and item presence, then emits OrderItemRemoved. + +## Example space + +```gwt-vocabulary +Given a decider context +And an order state with item: +And an order state: +When I decide to remove item with productId {productId:string} +Then the decision should be "success" +And the event type should be "OrderItemRemoved" +And the data should have itemCount 0 +And the data should have totalAmount "0.0" +And the decision should be "rejected" +And the rejection code should be "ORDER_NOT_IN_DRAFT" +And the rejection code should be "ITEM_NOT_FOUND" +``` diff --git a/specs/behavior/order-management/deciders/reservation-evolve.examples/s-001-evolve-reservation-state-with-reservation-confirmed.sdp.md b/specs/behavior/order-management/deciders/reservation-evolve.examples/s-001-evolve-reservation-state-with-reservation-confirmed.sdp.md deleted file mode 100644 index 995bde65..00000000 --- a/specs/behavior/order-management/deciders/reservation-evolve.examples/s-001-evolve-reservation-state-with-reservation-confirmed.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.reservation-evolve.evolve-reservation-state-with-reservation-confirmed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.reservation-evolve ---- -# Evolve reservation state with ReservationConfirmed - -## Intent - -- outcome: Executable scenario: Evolve reservation state with ReservationConfirmed - -```gwt -Given a decider context -And a reservation state: -When I evolve with ReservationConfirmed event -Then the evolved reservation should have status "confirmed" -And the evolved reservation should have reservationId "res_001" -``` diff --git a/specs/behavior/order-management/deciders/reservation-evolve.examples/s-002-evolve-pending-reservation-with-reservation-released.sdp.md b/specs/behavior/order-management/deciders/reservation-evolve.examples/s-002-evolve-pending-reservation-with-reservation-released.sdp.md deleted file mode 100644 index 065671aa..00000000 --- a/specs/behavior/order-management/deciders/reservation-evolve.examples/s-002-evolve-pending-reservation-with-reservation-released.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.reservation-evolve.evolve-pending-reservation-with-reservation-released -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.reservation-evolve ---- -# Evolve pending reservation with ReservationReleased - -## Intent - -- outcome: Executable scenario: Evolve pending reservation with ReservationReleased - -```gwt -Given a decider context -And a reservation state: -When I evolve with ReservationReleased event -Then the evolved reservation should have status "released" -``` diff --git a/specs/behavior/order-management/deciders/reservation-evolve.examples/s-003-evolve-confirmed-reservation-with-reservation-released.sdp.md b/specs/behavior/order-management/deciders/reservation-evolve.examples/s-003-evolve-confirmed-reservation-with-reservation-released.sdp.md deleted file mode 100644 index f11de991..00000000 --- a/specs/behavior/order-management/deciders/reservation-evolve.examples/s-003-evolve-confirmed-reservation-with-reservation-released.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.reservation-evolve.evolve-confirmed-reservation-with-reservation-released -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.reservation-evolve ---- -# Evolve confirmed reservation with ReservationReleased - -## Intent - -- outcome: Executable scenario: Evolve confirmed reservation with ReservationReleased - -```gwt -Given a decider context -And a reservation state: -When I evolve with ReservationReleased event -Then the evolved reservation should have status "released" -``` diff --git a/specs/behavior/order-management/deciders/reservation-evolve.examples/s-004-evolve-pending-reservation-with-reservation-expired.sdp.md b/specs/behavior/order-management/deciders/reservation-evolve.examples/s-004-evolve-pending-reservation-with-reservation-expired.sdp.md deleted file mode 100644 index a43d47b1..00000000 --- a/specs/behavior/order-management/deciders/reservation-evolve.examples/s-004-evolve-pending-reservation-with-reservation-expired.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.reservation-evolve.evolve-pending-reservation-with-reservation-expired -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.reservation-evolve ---- -# Evolve pending reservation with ReservationExpired - -## Intent - -- outcome: Executable scenario: Evolve pending reservation with ReservationExpired - -```gwt -Given a decider context -And a reservation state: -When I evolve with ReservationExpired event -Then the evolved reservation should have status "expired" -``` diff --git a/specs/behavior/order-management/deciders/reservation-evolve.sdp.md b/specs/behavior/order-management/deciders/reservation-evolve.sdp.md index 9d67640c..cabd7924 100644 --- a/specs/behavior/order-management/deciders/reservation-evolve.sdp.md +++ b/specs/behavior/order-management/deciders/reservation-evolve.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Reservation Evolve Functions +- outcome: Evolve reservation state from domain events without side effects. diff --git a/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-001-decide-to-reserve-stock-when-all-products-have-sufficient-availability.sdp.md b/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-001-decide-to-reserve-stock-when-all-products-have-sufficient-availability.sdp.md deleted file mode 100644 index 957d050e..00000000 --- a/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-001-decide-to-reserve-stock-when-all-products-have-sufficient-availability.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.reserve-stock-decider.decide-to-reserve-stock-when-all-products-have-sufficient-availability -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.reserve-stock-decider ---- -# Decide to reserve stock when all products have sufficient availability - -## Intent - -- outcome: Executable scenario: Decide to reserve stock when all products have sufficient availability - -```gwt -Given a decider context -And products with available stock: -When I decide to reserve stock for order "ord_001" with items: -Then the decision should be "success" -And the event type should be "StockReserved" -And the data should have orderId "ord_001" -And the data should have itemCount 2 -``` diff --git a/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-002-fail-reservation-when-one-product-has-insufficient-stock.sdp.md b/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-002-fail-reservation-when-one-product-has-insufficient-stock.sdp.md deleted file mode 100644 index 11f3fc04..00000000 --- a/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-002-fail-reservation-when-one-product-has-insufficient-stock.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.reserve-stock-decider.fail-reservation-when-one-product-has-insufficient-stock -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.reserve-stock-decider ---- -# Fail reservation when one product has insufficient stock - -## Intent - -- outcome: Executable scenario: Fail reservation when one product has insufficient stock - -```gwt -Given a decider context -And products with available stock: -When I decide to reserve stock for order "ord_002" with items: -Then the decision should be "failed" -And the failure reason should contain "INSUFFICIENT_STOCK" -And the failure event type should be "ReservationFailed" -``` diff --git a/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-003-fail-reservation-when-product-does-not-exist.sdp.md b/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-003-fail-reservation-when-product-does-not-exist.sdp.md deleted file mode 100644 index 3aaca10d..00000000 --- a/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-003-fail-reservation-when-product-does-not-exist.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.reserve-stock-decider.fail-reservation-when-product-does-not-exist -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.reserve-stock-decider ---- -# Fail reservation when product does not exist - -## Intent - -- outcome: Executable scenario: Fail reservation when product does not exist - -```gwt -Given a decider context -And products with available stock: -When I decide to reserve stock for order "ord_003" with items: -Then the decision should be "failed" -And the failure reason should contain "INSUFFICIENT_STOCK" -``` diff --git a/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-004-reject-reservation-with-empty-items.sdp.md b/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-004-reject-reservation-with-empty-items.sdp.md deleted file mode 100644 index 81c36b93..00000000 --- a/specs/behavior/order-management/deciders/reserve-stock-decider.examples/s-004-reject-reservation-with-empty-items.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.reserve-stock-decider.reject-reservation-with-empty-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.reserve-stock-decider ---- -# Reject reservation with empty items - -## Intent - -- outcome: Executable scenario: Reject reservation with empty items - -```gwt -Given a decider context -And products with available stock: -When I decide to reserve stock for order "ord_004" with empty items -Then the decision should be "rejected" -And the rejection code should be "EMPTY_RESERVATION" -``` diff --git a/specs/behavior/order-management/deciders/reserve-stock-decider.sdp.md b/specs/behavior/order-management/deciders/reserve-stock-decider.sdp.md index 0be6be05..344649ff 100644 --- a/specs/behavior/order-management/deciders/reserve-stock-decider.sdp.md +++ b/specs/behavior/order-management/deciders/reserve-stock-decider.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Reserve Stock Decider +- outcome: The ReserveStock decider validates product availability and emits StockReserved or ReservationFailed. diff --git a/specs/behavior/order-management/deciders/submit-order-decider.examples/s-001-decide-to-submit-draft-order-with-items.sdp.md b/specs/behavior/order-management/deciders/submit-order-decider.examples/s-001-decide-to-submit-draft-order-with-items.sdp.md deleted file mode 100644 index 5973b4c2..00000000 --- a/specs/behavior/order-management/deciders/submit-order-decider.examples/s-001-decide-to-submit-draft-order-with-items.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.submit-order-decider.decide-to-submit-draft-order-with-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.submit-order-decider ---- -# Decide to submit draft order with items - -## Intent - -- outcome: Executable scenario: Decide to submit draft order with items - -```gwt -Given a decider context with timestamp 1704067200000 -And an order state: -When I decide to submit the order -Then the decision should be "success" -And the event type should be "OrderSubmitted" -And the event payload should contain "submittedAt" with value 1704067200000 -And the state update should set status to "submitted" -``` diff --git a/specs/behavior/order-management/deciders/submit-order-decider.examples/s-002-reject-submit-for-order-not-in-draft-status.sdp.md b/specs/behavior/order-management/deciders/submit-order-decider.examples/s-002-reject-submit-for-order-not-in-draft-status.sdp.md deleted file mode 100644 index 333a7419..00000000 --- a/specs/behavior/order-management/deciders/submit-order-decider.examples/s-002-reject-submit-for-order-not-in-draft-status.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.submit-order-decider.reject-submit-for-order-not-in-draft-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.submit-order-decider ---- -# Reject submit for order not in draft status - -## Intent - -- outcome: Executable scenario: Reject submit for order not in draft status - -```gwt -Given a decider context with timestamp 1704067200000 -And an order state: -When I decide to submit the order -Then the decision should be "rejected" -And the rejection code should be "ORDER_NOT_IN_DRAFT" -``` diff --git a/specs/behavior/order-management/deciders/submit-order-decider.examples/s-003-reject-submit-for-order-with-no-items.sdp.md b/specs/behavior/order-management/deciders/submit-order-decider.examples/s-003-reject-submit-for-order-with-no-items.sdp.md deleted file mode 100644 index 63b3b496..00000000 --- a/specs/behavior/order-management/deciders/submit-order-decider.examples/s-003-reject-submit-for-order-with-no-items.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.deciders.submit-order-decider.reject-submit-for-order-with-no-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.deciders.submit-order-decider ---- -# Reject submit for order with no items - -## Intent - -- outcome: Executable scenario: Reject submit for order with no items - -```gwt -Given a decider context with timestamp 1704067200000 -And an order state: -When I decide to submit the order -Then the decision should be "rejected" -And the rejection code should be "ORDER_HAS_NO_ITEMS" -``` diff --git a/specs/behavior/order-management/deciders/submit-order-decider.sdp.md b/specs/behavior/order-management/deciders/submit-order-decider.sdp.md index cb2d1a80..b0360848 100644 --- a/specs/behavior/order-management/deciders/submit-order-decider.sdp.md +++ b/specs/behavior/order-management/deciders/submit-order-decider.sdp.md @@ -10,4 +10,19 @@ relations: ## Intent -- outcome: Submit Order Decider +- outcome: The SubmitOrder decider validates draft status and item presence, then emits OrderSubmitted. + +## Example space + +```gwt-vocabulary +Given a decider context with timestamp 1704067200000 +And an order state: +When I decide to submit the order +Then the decision should be "success" +And the event type should be "OrderSubmitted" +And the event payload should contain "submittedAt" with value 1704067200000 +And the state update should set status to "submitted" +And the decision should be "rejected" +And the rejection code should be "ORDER_NOT_IN_DRAFT" +And the rejection code should be "ORDER_HAS_NO_ITEMS" +``` diff --git a/specs/behavior/order-management/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md b/specs/behavior/order-management/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md deleted file mode 100644 index b13b92bb..00000000 --- a/specs/behavior/order-management/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.add-stock.successfully-add-stock-to-existing-product -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.add-stock ---- -# Successfully add stock to existing product - -## Intent - -- outcome: Executable scenario: Successfully add stock to existing product - -```gwt -Given the backend is running and clean -And a product "prod-stock-01" exists with 0 stock -When I add stock to product "prod-stock-01": -Then the command should succeed -And I wait for projections to process -And the product "prod-stock-01" should have 50 available stock -``` diff --git a/specs/behavior/order-management/inventory/add-stock.examples/s-002-add-stock-to-product-with-existing-stock.sdp.md b/specs/behavior/order-management/inventory/add-stock.examples/s-002-add-stock-to-product-with-existing-stock.sdp.md deleted file mode 100644 index 5058fbfe..00000000 --- a/specs/behavior/order-management/inventory/add-stock.examples/s-002-add-stock-to-product-with-existing-stock.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.add-stock.add-stock-to-product-with-existing-stock -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.add-stock ---- -# Add stock to product with existing stock - -## Intent - -- outcome: Executable scenario: Add stock to product with existing stock - -```gwt -Given the system is ready -And a product "prod_stock_002" exists with stock -When I send an AddStock command with: -Then the command should succeed -``` diff --git a/specs/behavior/order-management/inventory/add-stock.examples/s-003-cannot-add-stock-to-non-existent-product.sdp.md b/specs/behavior/order-management/inventory/add-stock.examples/s-003-cannot-add-stock-to-non-existent-product.sdp.md deleted file mode 100644 index f083f510..00000000 --- a/specs/behavior/order-management/inventory/add-stock.examples/s-003-cannot-add-stock-to-non-existent-product.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.add-stock.cannot-add-stock-to-non-existent-product -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.add-stock ---- -# Cannot add stock to non-existent product - -## Intent - -- outcome: Executable scenario: Cannot add stock to non-existent product - -```gwt -Given the system is ready -And no product exists with ID "prod_nonexistent" -When I send an AddStock command with: -Then the command should be rejected with code "PRODUCT_NOT_FOUND" -``` diff --git a/specs/behavior/order-management/inventory/add-stock.examples/s-004-add-stock-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/inventory/add-stock.examples/s-004-add-stock-is-idempotent-with-same-command-id.sdp.md deleted file mode 100644 index 9498b3dc..00000000 --- a/specs/behavior/order-management/inventory/add-stock.examples/s-004-add-stock-is-idempotent-with-same-command-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.add-stock.add-stock-is-idempotent-with-same-command-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.add-stock ---- -# AddStock is idempotent with same commandId - -## Intent - -- outcome: Executable scenario: AddStock is idempotent with same commandId - -```gwt -Given the backend is running and clean -And a product "prod-stock-02" exists with 10 stock -When I add stock with commandId "cmd-stock-idem-01" to product "prod-stock-02": and I repeat adding stock with commandId "cmd-stock-idem-01" to product "prod-stock-02": -Then the second command should return duplicate status -``` diff --git a/specs/behavior/order-management/inventory/add-stock.sdp.md b/specs/behavior/order-management/inventory/add-stock.sdp.md index d03d0436..85d5517d 100644 --- a/specs/behavior/order-management/inventory/add-stock.sdp.md +++ b/specs/behavior/order-management/inventory/add-stock.sdp.md @@ -11,4 +11,4 @@ relations: ## Intent - actor: an inventory manager -- outcome: to add stock to existing products so that products are available for sale +- outcome: An inventory manager adds stock to existing products so that products are available for sale. diff --git a/specs/behavior/order-management/inventory/confirm-reservation.examples/s-001-successfully-confirm-pending-reservation.sdp.md b/specs/behavior/order-management/inventory/confirm-reservation.examples/s-001-successfully-confirm-pending-reservation.sdp.md deleted file mode 100644 index 368ad6f5..00000000 --- a/specs/behavior/order-management/inventory/confirm-reservation.examples/s-001-successfully-confirm-pending-reservation.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.confirm-reservation.successfully-confirm-pending-reservation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.confirm-reservation ---- -# Successfully confirm pending reservation - -## Intent - -- outcome: Executable scenario: Successfully confirm pending reservation - -```gwt -Given the system is ready -And a product "prod_confirm_001" exists with 50 available and 10 reserved stock -And a pending reservation "res_confirm_001" exists for order "ord_confirm_001" -When I send a ConfirmReservation command for "res_confirm_001" -Then the command should succeed -``` diff --git a/specs/behavior/order-management/inventory/confirm-reservation.examples/s-002-cannot-confirm-non-existent-reservation.sdp.md b/specs/behavior/order-management/inventory/confirm-reservation.examples/s-002-cannot-confirm-non-existent-reservation.sdp.md deleted file mode 100644 index 385ccad9..00000000 --- a/specs/behavior/order-management/inventory/confirm-reservation.examples/s-002-cannot-confirm-non-existent-reservation.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.confirm-reservation.cannot-confirm-non-existent-reservation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.confirm-reservation ---- -# Cannot confirm non-existent reservation - -## Intent - -- outcome: Executable scenario: Cannot confirm non-existent reservation - -```gwt -Given the system is ready -And no reservation exists with ID "res_ghost" -When I send a ConfirmReservation command for "res_ghost" -Then the command should be rejected with code "RESERVATION_NOT_FOUND" -``` diff --git a/specs/behavior/order-management/inventory/confirm-reservation.examples/s-003-cannot-confirm-already-confirmed-reservation.sdp.md b/specs/behavior/order-management/inventory/confirm-reservation.examples/s-003-cannot-confirm-already-confirmed-reservation.sdp.md deleted file mode 100644 index dc632538..00000000 --- a/specs/behavior/order-management/inventory/confirm-reservation.examples/s-003-cannot-confirm-already-confirmed-reservation.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.confirm-reservation.cannot-confirm-already-confirmed-reservation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.confirm-reservation ---- -# Cannot confirm already confirmed reservation - -## Intent - -- outcome: Executable scenario: Cannot confirm already confirmed reservation - -```gwt -Given the system is ready -And a confirmed reservation "res_confirm_002" exists for order "ord_confirm_002" -When I send a ConfirmReservation command for "res_confirm_002" -Then the command should be rejected with code "RESERVATION_NOT_PENDING" -``` diff --git a/specs/behavior/order-management/inventory/confirm-reservation.examples/s-004-confirm-reservation-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/inventory/confirm-reservation.examples/s-004-confirm-reservation-is-idempotent-with-same-command-id.sdp.md deleted file mode 100644 index 8115540e..00000000 --- a/specs/behavior/order-management/inventory/confirm-reservation.examples/s-004-confirm-reservation-is-idempotent-with-same-command-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.confirm-reservation.confirm-reservation-is-idempotent-with-same-command-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.confirm-reservation ---- -# ConfirmReservation is idempotent with same commandId - -## Intent - -- outcome: Executable scenario: ConfirmReservation is idempotent with same commandId - -```gwt -Given the system is ready -And a pending reservation "res_confirm_003" exists for order "ord_confirm_003" -When I send a ConfirmReservation command twice with the same commandId for "res_confirm_003" -Then the second command should return duplicate status -``` diff --git a/specs/behavior/order-management/inventory/confirm-reservation.sdp.md b/specs/behavior/order-management/inventory/confirm-reservation.sdp.md index e3e81ab1..05db2d8f 100644 --- a/specs/behavior/order-management/inventory/confirm-reservation.sdp.md +++ b/specs/behavior/order-management/inventory/confirm-reservation.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: to confirm stock reservations so that reserved stock is permanently allocated to orders +- outcome: Stock reservations are confirmed so that reserved stock is permanently allocated to orders. diff --git a/specs/behavior/order-management/inventory/create-product.examples/s-001-successfully-create-a-new-product.sdp.md b/specs/behavior/order-management/inventory/create-product.examples/s-001-successfully-create-a-new-product.sdp.md deleted file mode 100644 index abd05510..00000000 --- a/specs/behavior/order-management/inventory/create-product.examples/s-001-successfully-create-a-new-product.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.create-product.successfully-create-a-new-product -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.create-product ---- -# Successfully create a new product - -## Intent - -- outcome: Executable scenario: Successfully create a new product - -```gwt -Given the system is ready -And no product exists with ID "prod_test_001" -When I send a CreateProduct command with: -Then the command should succeed -``` diff --git a/specs/behavior/order-management/inventory/create-product.examples/s-002-cannot-create-product-with-existing-id.sdp.md b/specs/behavior/order-management/inventory/create-product.examples/s-002-cannot-create-product-with-existing-id.sdp.md deleted file mode 100644 index 54b11f46..00000000 --- a/specs/behavior/order-management/inventory/create-product.examples/s-002-cannot-create-product-with-existing-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.create-product.cannot-create-product-with-existing-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.create-product ---- -# Cannot create product with existing ID - -## Intent - -- outcome: Executable scenario: Cannot create product with existing ID - -```gwt -Given the system is ready -And a product "prod_test_002" already exists -When I send a CreateProduct command with: -Then the command should be rejected with code "PRODUCT_ALREADY_EXISTS" -``` diff --git a/specs/behavior/order-management/inventory/create-product.examples/s-003-create-product-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/inventory/create-product.examples/s-003-create-product-is-idempotent-with-same-command-id.sdp.md deleted file mode 100644 index 51eb73b7..00000000 --- a/specs/behavior/order-management/inventory/create-product.examples/s-003-create-product-is-idempotent-with-same-command-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.create-product.create-product-is-idempotent-with-same-command-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.create-product ---- -# CreateProduct is idempotent with same commandId - -## Intent - -- outcome: Executable scenario: CreateProduct is idempotent with same commandId - -```gwt -Given the backend is running and clean -When I create a product with commandId "cmd-prod-idem-01": and I repeat creating a product with commandId "cmd-prod-idem-01": -Then the second command should return duplicate status -``` diff --git a/specs/behavior/order-management/inventory/create-product.sdp.md b/specs/behavior/order-management/inventory/create-product.sdp.md index 4e80e60c..2264747c 100644 --- a/specs/behavior/order-management/inventory/create-product.sdp.md +++ b/specs/behavior/order-management/inventory/create-product.sdp.md @@ -11,4 +11,4 @@ relations: ## Intent - actor: an inventory manager -- outcome: to create new products in the catalog so that they can be sold and tracked +- outcome: An inventory manager creates new products in the catalog so that they can be sold and tracked. diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-001-sum-of-available-and-reserved.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-001-sum-of-available-and-reserved.sdp.md deleted file mode 100644 index 05edbb06..00000000 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-001-sum-of-available-and-reserved.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.inventory-domain.sum-of-available-and-reserved -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.inventory-domain ---- -# Sum of available and reserved - -## Intent - -- outcome: Executable scenario: Sum of available and reserved - -```gwt -Given the inventory domain module is imported -And an inventory CMS with availableQuantity 100 and reservedQuantity 25 -When I calculate the total quantity -Then the total quantity is 125 -``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-002-only-available-when-reserved-is-zero.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-002-only-available-when-reserved-is-zero.sdp.md deleted file mode 100644 index 1431e3ca..00000000 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-002-only-available-when-reserved-is-zero.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.inventory-domain.only-available-when-reserved-is-zero -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.inventory-domain ---- -# Only available when reserved is zero - -## Intent - -- outcome: Executable scenario: Only available when reserved is zero - -```gwt -Given the inventory domain module is imported -And an inventory CMS with availableQuantity 50 and reservedQuantity 0 -When I calculate the total quantity -Then the total quantity is 50 -``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-003-only-reserved-when-available-is-zero.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-003-only-reserved-when-available-is-zero.sdp.md deleted file mode 100644 index bc7e6bb9..00000000 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-003-only-reserved-when-available-is-zero.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.inventory-domain.only-reserved-when-available-is-zero -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.inventory-domain ---- -# Only reserved when available is zero - -## Intent - -- outcome: Executable scenario: Only reserved when available is zero - -```gwt -Given the inventory domain module is imported -And an inventory CMS with availableQuantity 0 and reservedQuantity 30 -When I calculate the total quantity -Then the total quantity is 30 -``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-004-both-quantities-are-zero.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-004-both-quantities-are-zero.sdp.md deleted file mode 100644 index d9a42048..00000000 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-004-both-quantities-are-zero.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.inventory-domain.both-quantities-are-zero -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.inventory-domain ---- -# Both quantities are zero - -## Intent - -- outcome: Executable scenario: Both quantities are zero - -```gwt -Given the inventory domain module is imported -And an inventory CMS with availableQuantity 0 and reservedQuantity 0 -When I calculate the total quantity -Then the total quantity is 0 -``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-005-cms-fields-match-input-parameters.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-005-cms-fields-match-input-parameters.sdp.md deleted file mode 100644 index 651fbbe9..00000000 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-005-cms-fields-match-input-parameters.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.inventory-domain.cms-fields-match-input-parameters -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.inventory-domain ---- -# CMS fields match input parameters - -## Intent - -- outcome: Executable scenario: CMS fields match input parameters - -```gwt -Given the inventory domain module is imported -When I create an initial inventory CMS with productId "prod_123", productName "Test Widget", sku "SKU-TEST-001", and unitPrice 29.99 -Then the CMS has the following field values: -``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-006-initial-quantities-and-version-are-zero.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-006-initial-quantities-and-version-are-zero.sdp.md deleted file mode 100644 index 5c7739ab..00000000 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-006-initial-quantities-and-version-are-zero.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.inventory-domain.initial-quantities-and-version-are-zero -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.inventory-domain ---- -# Initial quantities and version are zero - -## Intent - -- outcome: Executable scenario: Initial quantities and version are zero - -```gwt -Given the inventory domain module is imported -When I create an initial inventory CMS with productId "prod_123", productName "Test", sku "SKU-001", and unitPrice 10.00 -Then the CMS has the following numeric field values: -And the CMS stateVersion equals the current inventory CMS version -``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-007-timestamps-are-set-to-current-time.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-007-timestamps-are-set-to-current-time.sdp.md deleted file mode 100644 index 9959852a..00000000 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-007-timestamps-are-set-to-current-time.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.inventory-domain.timestamps-are-set-to-current-time -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.inventory-domain ---- -# Timestamps are set to current time - -## Intent - -- outcome: Executable scenario: Timestamps are set to current time - -```gwt -Given the inventory domain module is imported -And I record the current time -When I create an initial inventory CMS with productId "prod_123", productName "Test", sku "SKU-001", and unitPrice 10.00 -Then the CMS createdAt is between the recorded time and now -And the CMS updatedAt equals createdAt -``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-008-current-version-cms-is-unchanged.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-008-current-version-cms-is-unchanged.sdp.md deleted file mode 100644 index 2eac122a..00000000 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-008-current-version-cms-is-unchanged.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.inventory-domain.current-version-cms-is-unchanged -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.inventory-domain ---- -# Current version CMS is unchanged - -## Intent - -- outcome: Executable scenario: Current version CMS is unchanged - -```gwt -Given the inventory domain module is imported -And an inventory CMS at the current stateVersion with productId "prod_123" and availableQuantity 100 -When I upcast the inventory CMS -Then the upcasted CMS equals the original CMS -And the upcasted CMS stateVersion equals the current inventory CMS version -``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-009-missing-state-version-is-upgraded.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-009-missing-state-version-is-upgraded.sdp.md deleted file mode 100644 index 5e6dd23f..00000000 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-009-missing-state-version-is-upgraded.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.inventory-domain.missing-state-version-is-upgraded -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.inventory-domain ---- -# Missing stateVersion is upgraded - -## Intent - -- outcome: Executable scenario: Missing stateVersion is upgraded - -```gwt -Given the inventory domain module is imported -And an inventory CMS without a stateVersion field and with productId "prod_123" and availableQuantity 50 -When I upcast the inventory CMS -Then the upcasted CMS stateVersion equals the current inventory CMS version -And the upcasted CMS productId is "prod_123" -And the upcasted CMS availableQuantity is 50 -``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-010-version-0-is-upgraded.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-010-version-0-is-upgraded.sdp.md deleted file mode 100644 index 9f241f10..00000000 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-010-version-0-is-upgraded.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.inventory-domain.version-0-is-upgraded -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.inventory-domain ---- -# Version 0 is upgraded - -## Intent - -- outcome: Executable scenario: Version 0 is upgraded - -```gwt -Given the inventory domain module is imported -And an inventory CMS with stateVersion 0, productId "prod_123", availableQuantity 75, and reservedQuantity 15 -When I upcast the inventory CMS -Then the upcasted CMS stateVersion equals the current inventory CMS version -And the upcasted CMS has the following preserved fields: -``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-011-all-fields-are-preserved-during-upcast.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-011-all-fields-are-preserved-during-upcast.sdp.md deleted file mode 100644 index cbba0d86..00000000 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-011-all-fields-are-preserved-during-upcast.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.inventory-domain.all-fields-are-preserved-during-upcast -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.inventory-domain ---- -# All fields are preserved during upcast - -## Intent - -- outcome: Executable scenario: All fields are preserved during upcast - -```gwt -Given the inventory domain module is imported -And an inventory CMS with stateVersion 0 and the following fields: -When I upcast the inventory CMS -Then the upcasted CMS has the following preserved fields: -``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.examples/s-012-future-version-throws-error.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.examples/s-012-future-version-throws-error.sdp.md deleted file mode 100644 index 48e7c690..00000000 --- a/specs/behavior/order-management/inventory/inventory-domain.examples/s-012-future-version-throws-error.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.inventory-domain.future-version-throws-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.inventory-domain ---- -# Future version throws error - -## Intent - -- outcome: Executable scenario: Future version throws error - -```gwt -Given the inventory domain module is imported -And an inventory CMS with a stateVersion 10 higher than the current version -When I attempt to upcast the inventory CMS -Then an error is thrown mentioning "newer than supported version" -``` diff --git a/specs/behavior/order-management/inventory/inventory-domain.sdp.md b/specs/behavior/order-management/inventory/inventory-domain.sdp.md index 46e09643..f5e8b151 100644 --- a/specs/behavior/order-management/inventory/inventory-domain.sdp.md +++ b/specs/behavior/order-management/inventory/inventory-domain.sdp.md @@ -11,7 +11,7 @@ relations: ## Intent - actor: a developer working with the Inventory bounded context -- outcome: pure domain functions to behave correctly so that inventory state is calculated, initialized, and upcasted reliably +- outcome: Pure domain functions calculate, initialize, and upcast inventory state reliably. ## Behavior diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-001-passes-for-a-valid-product.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-001-passes-for-a-valid-product.sdp.md deleted file mode 100644 index 51b70ca3..00000000 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-001-passes-for-a-valid-product.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.product-invariants.passes-for-a-valid-product -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.product-invariants ---- -# passes for a valid product - -## Intent - -- outcome: Executable scenario: passes for a valid product - -```gwt -Given a valid product -When I call assertProductExists -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-002-throws-product-not-found-for-null-product-reference.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-002-throws-product-not-found-for-null-product-reference.sdp.md deleted file mode 100644 index c367abd6..00000000 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-002-throws-product-not-found-for-null-product-reference.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.product-invariants.throws-product-not-found-for-null-product-reference -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.product-invariants ---- -# throws PRODUCT_NOT_FOUND for null product reference - -## Intent - -- outcome: Executable scenario: throws PRODUCT_NOT_FOUND for null product reference - -```gwt -Given a null product reference -When I call assertProductExists -Then an InventoryInvariantError is thrown with code "PRODUCT_NOT_FOUND" -``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-003-throws-product-not-found-for-undefined-product-reference.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-003-throws-product-not-found-for-undefined-product-reference.sdp.md deleted file mode 100644 index a2abeee3..00000000 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-003-throws-product-not-found-for-undefined-product-reference.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.product-invariants.throws-product-not-found-for-undefined-product-reference -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.product-invariants ---- -# throws PRODUCT_NOT_FOUND for undefined product reference - -## Intent - -- outcome: Executable scenario: throws PRODUCT_NOT_FOUND for undefined product reference - -```gwt -Given an undefined product reference -When I call assertProductExists -Then an InventoryInvariantError is thrown with code "PRODUCT_NOT_FOUND" -``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-004-passes-for-null-product-reference.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-004-passes-for-null-product-reference.sdp.md deleted file mode 100644 index 16b58d5b..00000000 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-004-passes-for-null-product-reference.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.product-invariants.passes-for-null-product-reference -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.product-invariants ---- -# passes for null product reference - -## Intent - -- outcome: Executable scenario: passes for null product reference - -```gwt -Given a null product reference -When I call assertProductDoesNotExist -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-005-passes-for-undefined-product-reference.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-005-passes-for-undefined-product-reference.sdp.md deleted file mode 100644 index 41da7615..00000000 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-005-passes-for-undefined-product-reference.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.product-invariants.passes-for-undefined-product-reference -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.product-invariants ---- -# passes for undefined product reference - -## Intent - -- outcome: Executable scenario: passes for undefined product reference - -```gwt -Given an undefined product reference -When I call assertProductDoesNotExist -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-006-throws-product-already-exists-for-existing-product.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-006-throws-product-already-exists-for-existing-product.sdp.md deleted file mode 100644 index 2b1e35fd..00000000 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-006-throws-product-already-exists-for-existing-product.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.product-invariants.throws-product-already-exists-for-existing-product -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.product-invariants ---- -# throws PRODUCT_ALREADY_EXISTS for existing product - -## Intent - -- outcome: Executable scenario: throws PRODUCT_ALREADY_EXISTS for existing product - -```gwt -Given an existing product with productId "prod_existing" -When I call assertProductDoesNotExist -Then an InventoryInvariantError is thrown with code "PRODUCT_ALREADY_EXISTS" -And the error context contains productId "prod_existing" -``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-007-passes-for-standard-sku.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-007-passes-for-standard-sku.sdp.md deleted file mode 100644 index 13cb7d0b..00000000 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-007-passes-for-standard-sku.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.product-invariants.passes-for-standard-sku -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.product-invariants ---- -# passes for standard SKU - -## Intent - -- outcome: Executable scenario: passes for standard SKU - -```gwt -Given the SKU value "SKU-123" -When I call assertValidSku -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-008-passes-for-sku-with-special-characters.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-008-passes-for-sku-with-special-characters.sdp.md deleted file mode 100644 index f7a3a5fb..00000000 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-008-passes-for-sku-with-special-characters.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.product-invariants.passes-for-sku-with-special-characters -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.product-invariants ---- -# passes for SKU with special characters - -## Intent - -- outcome: Executable scenario: passes for SKU with special characters - -```gwt -Given the SKU value "SKU_ABC-123/XYZ" -When I call assertValidSku -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-009-throws-invalid-sku-for-empty-sku.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-009-throws-invalid-sku-for-empty-sku.sdp.md deleted file mode 100644 index 9e97b4ee..00000000 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-009-throws-invalid-sku-for-empty-sku.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.product-invariants.throws-invalid-sku-for-empty-sku -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.product-invariants ---- -# throws INVALID_SKU for empty SKU - -## Intent - -- outcome: Executable scenario: throws INVALID_SKU for empty SKU - -```gwt -Given an empty SKU value -When I call assertValidSku -Then an InventoryInvariantError is thrown with code "INVALID_SKU" -``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-010-throws-invalid-sku-for-whitespace-only-sku.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-010-throws-invalid-sku-for-whitespace-only-sku.sdp.md deleted file mode 100644 index 0494d2b5..00000000 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-010-throws-invalid-sku-for-whitespace-only-sku.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.product-invariants.throws-invalid-sku-for-whitespace-only-sku -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.product-invariants ---- -# throws INVALID_SKU for whitespace-only SKU - -## Intent - -- outcome: Executable scenario: throws INVALID_SKU for whitespace-only SKU - -```gwt -Given a whitespace-only SKU value -When I call assertValidSku -Then an InventoryInvariantError is thrown with code "INVALID_SKU" -``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-011-passes-for-standard-product-name.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-011-passes-for-standard-product-name.sdp.md deleted file mode 100644 index 36539bdc..00000000 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-011-passes-for-standard-product-name.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.product-invariants.passes-for-standard-product-name -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.product-invariants ---- -# passes for standard product name - -## Intent - -- outcome: Executable scenario: passes for standard product name - -```gwt -Given the product name "Test Product" -When I call assertValidProductName -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-012-passes-for-product-name-with-numbers.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-012-passes-for-product-name-with-numbers.sdp.md deleted file mode 100644 index 3c7d311f..00000000 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-012-passes-for-product-name-with-numbers.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.product-invariants.passes-for-product-name-with-numbers -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.product-invariants ---- -# passes for product name with numbers - -## Intent - -- outcome: Executable scenario: passes for product name with numbers - -```gwt -Given the product name "Widget 2000" -When I call assertValidProductName -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-013-throws-invalid-product-name-for-empty-product-name.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-013-throws-invalid-product-name-for-empty-product-name.sdp.md deleted file mode 100644 index 09c1cdcf..00000000 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-013-throws-invalid-product-name-for-empty-product-name.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.product-invariants.throws-invalid-product-name-for-empty-product-name -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.product-invariants ---- -# throws INVALID_PRODUCT_NAME for empty product name - -## Intent - -- outcome: Executable scenario: throws INVALID_PRODUCT_NAME for empty product name - -```gwt -Given an empty product name -When I call assertValidProductName -Then an InventoryInvariantError is thrown with code "INVALID_PRODUCT_NAME" -``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-014-throws-invalid-product-name-for-whitespace-only-product-name.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-014-throws-invalid-product-name-for-whitespace-only-product-name.sdp.md deleted file mode 100644 index 0fc6bc34..00000000 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-014-throws-invalid-product-name-for-whitespace-only-product-name.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.product-invariants.throws-invalid-product-name-for-whitespace-only-product-name -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.product-invariants ---- -# throws INVALID_PRODUCT_NAME for whitespace-only product name - -## Intent - -- outcome: Executable scenario: throws INVALID_PRODUCT_NAME for whitespace-only product name - -```gwt -Given a whitespace-only product name -When I call assertValidProductName -Then an InventoryInvariantError is thrown with code "INVALID_PRODUCT_NAME" -``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-015-passes-for-positive-integer-10.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-015-passes-for-positive-integer-10.sdp.md deleted file mode 100644 index 8ade3b5f..00000000 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-015-passes-for-positive-integer-10.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.product-invariants.passes-for-positive-integer-10 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.product-invariants ---- -# passes for positive integer 10 - -## Intent - -- outcome: Executable scenario: passes for positive integer 10 - -```gwt -Given the quantity value 10 -When I call assertPositiveQuantity -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-016-passes-for-positive-integer-1.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-016-passes-for-positive-integer-1.sdp.md deleted file mode 100644 index 568a762b..00000000 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-016-passes-for-positive-integer-1.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.product-invariants.passes-for-positive-integer-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.product-invariants ---- -# passes for positive integer 1 - -## Intent - -- outcome: Executable scenario: passes for positive integer 1 - -```gwt -Given the quantity value 1 -When I call assertPositiveQuantity -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-017-throws-invalid-quantity-for-zero.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-017-throws-invalid-quantity-for-zero.sdp.md deleted file mode 100644 index 674a3fe5..00000000 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-017-throws-invalid-quantity-for-zero.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.product-invariants.throws-invalid-quantity-for-zero -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.product-invariants ---- -# throws INVALID_QUANTITY for zero - -## Intent - -- outcome: Executable scenario: throws INVALID_QUANTITY for zero - -```gwt -Given the quantity value 0 -When I call assertPositiveQuantity -Then an InventoryInvariantError is thrown with code "INVALID_QUANTITY" -``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-018-throws-invalid-quantity-for-negative-number.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-018-throws-invalid-quantity-for-negative-number.sdp.md deleted file mode 100644 index fad26dea..00000000 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-018-throws-invalid-quantity-for-negative-number.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.product-invariants.throws-invalid-quantity-for-negative-number -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.product-invariants ---- -# throws INVALID_QUANTITY for negative number - -## Intent - -- outcome: Executable scenario: throws INVALID_QUANTITY for negative number - -```gwt -Given the quantity value -5 -When I call assertPositiveQuantity -Then an InventoryInvariantError is thrown with code "INVALID_QUANTITY" -And the error context contains quantity -5 -``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-019-throws-invalid-quantity-for-non-integer.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-019-throws-invalid-quantity-for-non-integer.sdp.md deleted file mode 100644 index 49975350..00000000 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-019-throws-invalid-quantity-for-non-integer.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.product-invariants.throws-invalid-quantity-for-non-integer -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.product-invariants ---- -# throws INVALID_QUANTITY for non-integer - -## Intent - -- outcome: Executable scenario: throws INVALID_QUANTITY for non-integer - -```gwt -Given the quantity value 1.5 -When I call assertPositiveQuantity -Then an InventoryInvariantError is thrown with code "INVALID_QUANTITY" -``` diff --git a/specs/behavior/order-management/inventory/product-invariants.examples/s-020-includes-context-string-in-error-message.sdp.md b/specs/behavior/order-management/inventory/product-invariants.examples/s-020-includes-context-string-in-error-message.sdp.md deleted file mode 100644 index 25ef7859..00000000 --- a/specs/behavior/order-management/inventory/product-invariants.examples/s-020-includes-context-string-in-error-message.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.product-invariants.includes-context-string-in-error-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.product-invariants ---- -# includes context string in error message - -## Intent - -- outcome: Executable scenario: includes context string in error message - -```gwt -Given the quantity value 0 with context "adding stock" -When I call assertPositiveQuantity with context -Then the error message contains "adding stock" -``` diff --git a/specs/behavior/order-management/inventory/product-invariants.sdp.md b/specs/behavior/order-management/inventory/product-invariants.sdp.md index 14ae5e1b..a96b825b 100644 --- a/specs/behavior/order-management/inventory/product-invariants.sdp.md +++ b/specs/behavior/order-management/inventory/product-invariants.sdp.md @@ -11,7 +11,7 @@ relations: ## Intent - actor: a developer working with the Inventory aggregate -- outcome: pure invariant functions that validate product state so that invalid state transitions are prevented with structured error information +- outcome: Pure invariant functions validate product state so that invalid transitions are prevented with structured errors. ## Behavior diff --git a/specs/behavior/order-management/inventory/release-reservation.examples/s-001-successfully-release-pending-reservation.sdp.md b/specs/behavior/order-management/inventory/release-reservation.examples/s-001-successfully-release-pending-reservation.sdp.md deleted file mode 100644 index 092fb21a..00000000 --- a/specs/behavior/order-management/inventory/release-reservation.examples/s-001-successfully-release-pending-reservation.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.release-reservation.successfully-release-pending-reservation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.release-reservation ---- -# Successfully release pending reservation - -## Intent - -- outcome: Executable scenario: Successfully release pending reservation - -```gwt -Given the system is ready -And a product "prod_release_001" exists with 50 available and 10 reserved stock -And a pending reservation "res_release_001" exists for order "ord_release_001" with: -When I send a ReleaseReservation command for "res_release_001" with reason "Order cancelled" -Then the command should succeed -``` diff --git a/specs/behavior/order-management/inventory/release-reservation.examples/s-002-can-release-confirmed-reservation-for-order-cancellation.sdp.md b/specs/behavior/order-management/inventory/release-reservation.examples/s-002-can-release-confirmed-reservation-for-order-cancellation.sdp.md deleted file mode 100644 index 09d7a52a..00000000 --- a/specs/behavior/order-management/inventory/release-reservation.examples/s-002-can-release-confirmed-reservation-for-order-cancellation.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.release-reservation.can-release-confirmed-reservation-for-order-cancellation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.release-reservation ---- -# Can release confirmed reservation (for order cancellation) - -## Intent - -- outcome: Executable scenario: Can release confirmed reservation (for order cancellation) - -```gwt -Given the system is ready -And a confirmed reservation "res_release_002" exists for order "ord_release_002" -When I send a ReleaseReservation command for "res_release_002" with reason "Order cancelled after confirmation" -Then the command should succeed -``` diff --git a/specs/behavior/order-management/inventory/release-reservation.examples/s-003-release-reservation-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/inventory/release-reservation.examples/s-003-release-reservation-is-idempotent-with-same-command-id.sdp.md deleted file mode 100644 index b24be1fc..00000000 --- a/specs/behavior/order-management/inventory/release-reservation.examples/s-003-release-reservation-is-idempotent-with-same-command-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.release-reservation.release-reservation-is-idempotent-with-same-command-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.release-reservation ---- -# ReleaseReservation is idempotent with same commandId - -## Intent - -- outcome: Executable scenario: ReleaseReservation is idempotent with same commandId - -```gwt -Given the system is ready -And a pending reservation "res_release_003" exists for order "ord_release_003" -When I send a ReleaseReservation command twice with the same commandId for "res_release_003" -Then the second command should return duplicate status -``` diff --git a/specs/behavior/order-management/inventory/release-reservation.sdp.md b/specs/behavior/order-management/inventory/release-reservation.sdp.md index 52c46522..5ad5d1d0 100644 --- a/specs/behavior/order-management/inventory/release-reservation.sdp.md +++ b/specs/behavior/order-management/inventory/release-reservation.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: to release stock reservations so that stock returns to available when orders are cancelled +- outcome: Stock reservations are released so that stock returns to available when orders are cancelled. diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-001-single-item-reservation-returns-count-of-1.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-001-single-item-reservation-returns-count-of-1.sdp.md deleted file mode 100644 index 2203a73f..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-001-single-item-reservation-returns-count-of-1.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.single-item-reservation-returns-count-of-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Single item reservation returns count of 1 - -## Intent - -- outcome: Executable scenario: Single item reservation returns count of 1 - -```gwt -Given a reservation with 1 item -When I calculate the reservation item count -Then the item count is 1 -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-002-multiple-items-reservation-returns-correct-count.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-002-multiple-items-reservation-returns-correct-count.sdp.md deleted file mode 100644 index 874ecc61..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-002-multiple-items-reservation-returns-correct-count.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.multiple-items-reservation-returns-correct-count -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Multiple items reservation returns correct count - -## Intent - -- outcome: Executable scenario: Multiple items reservation returns correct count - -```gwt -Given a reservation with 3 items -When I calculate the reservation item count -Then the item count is 3 -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-003-empty-items-reservation-returns-count-of-0.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-003-empty-items-reservation-returns-count-of-0.sdp.md deleted file mode 100644 index 25917f53..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-003-empty-items-reservation-returns-count-of-0.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.empty-items-reservation-returns-count-of-0 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Empty items reservation returns count of 0 - -## Intent - -- outcome: Executable scenario: Empty items reservation returns count of 0 - -```gwt -Given a reservation with 0 items -When I calculate the reservation item count -Then the item count is 0 -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-004-multiple-items-returns-sum-of-all-quantities.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-004-multiple-items-returns-sum-of-all-quantities.sdp.md deleted file mode 100644 index d526e214..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-004-multiple-items-returns-sum-of-all-quantities.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.multiple-items-returns-sum-of-all-quantities -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Multiple items returns sum of all quantities - -## Intent - -- outcome: Executable scenario: Multiple items returns sum of all quantities - -```gwt -Given reservation items with quantities 5, 3, and 10 -When I calculate the total reserved quantity -Then the total reserved quantity is 18 -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-005-single-item-returns-its-quantity.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-005-single-item-returns-its-quantity.sdp.md deleted file mode 100644 index af035089..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-005-single-item-returns-its-quantity.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.single-item-returns-its-quantity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Single item returns its quantity - -## Intent - -- outcome: Executable scenario: Single item returns its quantity - -```gwt -Given reservation items with quantity 7 -When I calculate the total reserved quantity -Then the total reserved quantity is 7 -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-006-empty-items-returns-0.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-006-empty-items-returns-0.sdp.md deleted file mode 100644 index 0566834d..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-006-empty-items-returns-0.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.empty-items-returns-0 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Empty items returns 0 - -## Intent - -- outcome: Executable scenario: Empty items returns 0 - -```gwt -Given no reservation items -When I calculate the total reserved quantity -Then the total reserved quantity is 0 -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-007-creates-cms-with-correct-reservation-id-and-order-id.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-007-creates-cms-with-correct-reservation-id-and-order-id.sdp.md deleted file mode 100644 index 3367da47..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-007-creates-cms-with-correct-reservation-id-and-order-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.creates-cms-with-correct-reservation-id-and-order-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Creates CMS with correct reservationId and orderId - -## Intent - -- outcome: Executable scenario: Creates CMS with correct reservationId and orderId - -```gwt -Given reservation ID "res_123" and order ID "ord_456" -When I create an initial reservation CMS with 1 item -Then the CMS has the following properties: -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-008-initializes-items-array-correctly.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-008-initializes-items-array-correctly.sdp.md deleted file mode 100644 index fb57859a..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-008-initializes-items-array-correctly.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.initializes-items-array-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Initializes items array correctly - -## Intent - -- outcome: Executable scenario: Initializes items array correctly - -```gwt -Given reservation ID "res_123" and order ID "ord_456" -When I create an initial reservation CMS with 2 items -Then the CMS items array has length 2 -And the CMS items match the input items -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-009-sets-status-to-pending.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-009-sets-status-to-pending.sdp.md deleted file mode 100644 index b8505384..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-009-sets-status-to-pending.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.sets-status-to-pending -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Sets status to pending - -## Intent - -- outcome: Executable scenario: Sets status to pending - -```gwt -Given reservation ID "res_123" and order ID "ord_456" -When I create an initial reservation CMS with 1 item -Then the CMS status is "pending" -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-010-sets-expires-at-with-default-ttl.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-010-sets-expires-at-with-default-ttl.sdp.md deleted file mode 100644 index 18f65202..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-010-sets-expires-at-with-default-ttl.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.sets-expires-at-with-default-ttl -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Sets expiresAt with default TTL - -## Intent - -- outcome: Executable scenario: Sets expiresAt with default TTL - -```gwt -Given reservation ID "res_123" and order ID "ord_456" -And the current timestamp is captured -When I create an initial reservation CMS with 1 item using default TTL -Then the CMS expiresAt is approximately now plus the default TTL -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-011-supports-custom-ttl.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-011-supports-custom-ttl.sdp.md deleted file mode 100644 index 3a38f1b6..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-011-supports-custom-ttl.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.supports-custom-ttl -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Supports custom TTL - -## Intent - -- outcome: Executable scenario: Supports custom TTL - -```gwt -Given reservation ID "res_123" and order ID "ord_456" -And the current timestamp is captured -When I create an initial reservation CMS with 1 item using custom TTL of 1800000 ms -Then the CMS expiresAt is approximately now plus 1800000 ms -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-012-initializes-version-to-0.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-012-initializes-version-to-0.sdp.md deleted file mode 100644 index af1719bf..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-012-initializes-version-to-0.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.initializes-version-to-0 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Initializes version to 0 - -## Intent - -- outcome: Executable scenario: Initializes version to 0 - -```gwt -Given reservation ID "res_123" and order ID "ord_456" -When I create an initial reservation CMS with 1 item -Then the CMS version is 0 -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-013-initializes-with-current-state-version.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-013-initializes-with-current-state-version.sdp.md deleted file mode 100644 index 9afd6ec2..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-013-initializes-with-current-state-version.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.initializes-with-current-state-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Initializes with current state version - -## Intent - -- outcome: Executable scenario: Initializes with current state version - -```gwt -Given reservation ID "res_123" and order ID "ord_456" -When I create an initial reservation CMS with 1 item -Then the CMS stateVersion equals the current reservation CMS version constant -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-014-sets-created-at-and-updated-at-to-current-timestamp.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-014-sets-created-at-and-updated-at-to-current-timestamp.sdp.md deleted file mode 100644 index 2eb297ff..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-014-sets-created-at-and-updated-at-to-current-timestamp.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.sets-created-at-and-updated-at-to-current-timestamp -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Sets createdAt and updatedAt to current timestamp - -## Intent - -- outcome: Executable scenario: Sets createdAt and updatedAt to current timestamp - -```gwt -Given reservation ID "res_123" and order ID "ord_456" -And the current timestamp is captured -When I create an initial reservation CMS with 1 item -Then the CMS createdAt is between the before and after timestamps -And the CMS updatedAt equals createdAt -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-015-returns-false-when-reservation-has-not-expired.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-015-returns-false-when-reservation-has-not-expired.sdp.md deleted file mode 100644 index 81c63bb5..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-015-returns-false-when-reservation-has-not-expired.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.returns-false-when-reservation-has-not-expired -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Returns false when reservation has not expired - -## Intent - -- outcome: Executable scenario: Returns false when reservation has not expired - -```gwt -Given a pending reservation expiring 1 hour in the future -When I check if the reservation is expired -Then the reservation is not expired -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-016-returns-true-when-reservation-has-expired.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-016-returns-true-when-reservation-has-expired.sdp.md deleted file mode 100644 index 19674bcf..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-016-returns-true-when-reservation-has-expired.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.returns-true-when-reservation-has-expired -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Returns true when reservation has expired - -## Intent - -- outcome: Executable scenario: Returns true when reservation has expired - -```gwt -Given a pending reservation that expired 1 second ago -When I check if the reservation is expired -Then the reservation is expired -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-017-returns-false-when-reservation-is-confirmed-regardless-of-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-017-returns-false-when-reservation-is-confirmed-regardless-of-expiry.sdp.md deleted file mode 100644 index eec1c65e..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-017-returns-false-when-reservation-is-confirmed-regardless-of-expiry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.returns-false-when-reservation-is-confirmed-regardless-of-expiry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Returns false when reservation is confirmed regardless of expiry - -## Intent - -- outcome: Executable scenario: Returns false when reservation is confirmed regardless of expiry - -```gwt -Given a confirmed reservation that expired 1 hour ago -When I check if the reservation is expired -Then the reservation is not expired -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-018-returns-false-when-reservation-is-released-regardless-of-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-018-returns-false-when-reservation-is-released-regardless-of-expiry.sdp.md deleted file mode 100644 index 5c4d2f9a..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-018-returns-false-when-reservation-is-released-regardless-of-expiry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.returns-false-when-reservation-is-released-regardless-of-expiry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Returns false when reservation is released regardless of expiry - -## Intent - -- outcome: Executable scenario: Returns false when reservation is released regardless of expiry - -```gwt -Given a released reservation that expired 1 hour ago -When I check if the reservation is expired -Then the reservation is not expired -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-019-handles-exact-expiry-boundary-correctly.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-019-handles-exact-expiry-boundary-correctly.sdp.md deleted file mode 100644 index d8de7cfa..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-019-handles-exact-expiry-boundary-correctly.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.handles-exact-expiry-boundary-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Handles exact expiry boundary correctly - -## Intent - -- outcome: Executable scenario: Handles exact expiry boundary correctly - -```gwt -Given a pending reservation expiring at exactly the current time -When I check if the reservation is expired -Then the reservation is not expired -And when 1 millisecond passes and I check again -And the reservation is expired -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-020-returns-unchanged-cms-when-already-at-current-version.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-020-returns-unchanged-cms-when-already-at-current-version.sdp.md deleted file mode 100644 index 4cff4fd2..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-020-returns-unchanged-cms-when-already-at-current-version.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.returns-unchanged-cms-when-already-at-current-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Returns unchanged CMS when already at current version - -## Intent - -- outcome: Executable scenario: Returns unchanged CMS when already at current version - -```gwt -Given a reservation CMS at the current state version -When I upcast the reservation CMS -Then the result equals the original CMS -And the result stateVersion equals the current version constant -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-021-upgrades-cms-with-missing-state-version-to-current-version.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-021-upgrades-cms-with-missing-state-version-to-current-version.sdp.md deleted file mode 100644 index 63fd316e..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-021-upgrades-cms-with-missing-state-version-to-current-version.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.upgrades-cms-with-missing-state-version-to-current-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Upgrades CMS with missing stateVersion to current version - -## Intent - -- outcome: Executable scenario: Upgrades CMS with missing stateVersion to current version - -```gwt -Given a reservation CMS with missing stateVersion -When I upcast the reservation CMS -Then the result stateVersion equals the current version constant -And the result preserves the original reservationId and items -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-022-throws-error-for-future-versions.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-022-throws-error-for-future-versions.sdp.md deleted file mode 100644 index d7eac643..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-022-throws-error-for-future-versions.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.throws-error-for-future-versions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Throws error for future versions - -## Intent - -- outcome: Executable scenario: Throws error for future versions - -```gwt -Given a reservation CMS with stateVersion far above current -When I attempt to upcast the reservation CMS -Then an error is thrown matching "newer than supported version" -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.examples/s-023-preserves-all-fields-during-upcast.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.examples/s-023-preserves-all-fields-during-upcast.sdp.md deleted file mode 100644 index ce6df986..00000000 --- a/specs/behavior/order-management/inventory/reservation-domain.examples/s-023-preserves-all-fields-during-upcast.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-domain.preserves-all-fields-during-upcast -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-domain ---- -# Preserves all fields during upcast - -## Intent - -- outcome: Executable scenario: Preserves all fields during upcast - -```gwt -Given a reservation CMS at state version 0 with specific field values -When I upcast the reservation CMS -Then all original fields are preserved in the result: -And the result items match the original items -``` diff --git a/specs/behavior/order-management/inventory/reservation-domain.sdp.md b/specs/behavior/order-management/inventory/reservation-domain.sdp.md index d7cda7d7..590468ae 100644 --- a/specs/behavior/order-management/inventory/reservation-domain.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-domain.sdp.md @@ -11,7 +11,7 @@ relations: ## Intent - actor: a developer working with the inventory context -- outcome: pure reservation domain functions to behave correctly so that reservation CMS state is managed reliably +- outcome: Pure reservation domain functions manage reservation CMS state reliably. ## Behavior diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-001-does-not-throw-when-reservation-exists.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-001-does-not-throw-when-reservation-exists.sdp.md deleted file mode 100644 index e48bab19..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-001-does-not-throw-when-reservation-exists.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.does-not-throw-when-reservation-exists -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Does not throw when reservation exists - -## Intent - -- outcome: Executable scenario: Does not throw when reservation exists - -```gwt -Given a valid reservation CMS -When I call assertReservationExists -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-002-throws-reservation-not-found-when-reservation-is-null.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-002-throws-reservation-not-found-when-reservation-is-null.sdp.md deleted file mode 100644 index 683e301b..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-002-throws-reservation-not-found-when-reservation-is-null.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.throws-reservation-not-found-when-reservation-is-null -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Throws RESERVATION_NOT_FOUND when reservation is null - -## Intent - -- outcome: Executable scenario: Throws RESERVATION_NOT_FOUND when reservation is null - -```gwt -Given a null reservation reference -When I call assertReservationExists -Then an InventoryInvariantError is thrown with code "RESERVATION_NOT_FOUND" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-003-throws-reservation-not-found-when-reservation-is-undefined.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-003-throws-reservation-not-found-when-reservation-is-undefined.sdp.md deleted file mode 100644 index 6730f1c8..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-003-throws-reservation-not-found-when-reservation-is-undefined.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.throws-reservation-not-found-when-reservation-is-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Throws RESERVATION_NOT_FOUND when reservation is undefined - -## Intent - -- outcome: Executable scenario: Throws RESERVATION_NOT_FOUND when reservation is undefined - -```gwt -Given an undefined reservation reference -When I call assertReservationExists -Then an InventoryInvariantError is thrown with code "RESERVATION_NOT_FOUND" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-004-does-not-throw-when-reservation-is-null.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-004-does-not-throw-when-reservation-is-null.sdp.md deleted file mode 100644 index 6d69df81..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-004-does-not-throw-when-reservation-is-null.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.does-not-throw-when-reservation-is-null -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Does not throw when reservation is null - -## Intent - -- outcome: Executable scenario: Does not throw when reservation is null - -```gwt -Given a null reservation reference -When I call assertReservationDoesNotExist -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-005-does-not-throw-when-reservation-is-undefined.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-005-does-not-throw-when-reservation-is-undefined.sdp.md deleted file mode 100644 index 15664ea0..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-005-does-not-throw-when-reservation-is-undefined.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.does-not-throw-when-reservation-is-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Does not throw when reservation is undefined - -## Intent - -- outcome: Executable scenario: Does not throw when reservation is undefined - -```gwt -Given an undefined reservation reference -When I call assertReservationDoesNotExist -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-006-throws-reservation-already-exists-when-reservation-exists.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-006-throws-reservation-already-exists-when-reservation-exists.sdp.md deleted file mode 100644 index d5923fcb..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-006-throws-reservation-already-exists-when-reservation-exists.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.throws-reservation-already-exists-when-reservation-exists -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Throws RESERVATION_ALREADY_EXISTS when reservation exists - -## Intent - -- outcome: Executable scenario: Throws RESERVATION_ALREADY_EXISTS when reservation exists - -```gwt -Given a valid reservation CMS with reservationId "res_existing" -When I call assertReservationDoesNotExist -Then an InventoryInvariantError is thrown with code "RESERVATION_ALREADY_EXISTS" -And the error context reservationId is "res_existing" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-007-does-not-throw-when-items-has-one-item.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-007-does-not-throw-when-items-has-one-item.sdp.md deleted file mode 100644 index d4fb9493..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-007-does-not-throw-when-items-has-one-item.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.does-not-throw-when-items-has-one-item -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Does not throw when items has one item - -## Intent - -- outcome: Executable scenario: Does not throw when items has one item - -```gwt -Given reservation items with 1 item -When I call assertReservationHasItems -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-008-does-not-throw-when-items-has-multiple-items.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-008-does-not-throw-when-items-has-multiple-items.sdp.md deleted file mode 100644 index 56ea2d9a..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-008-does-not-throw-when-items-has-multiple-items.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.does-not-throw-when-items-has-multiple-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Does not throw when items has multiple items - -## Intent - -- outcome: Executable scenario: Does not throw when items has multiple items - -```gwt -Given reservation items with 2 items -When I call assertReservationHasItems -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-009-throws-empty-reservation-when-items-array-is-empty.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-009-throws-empty-reservation-when-items-array-is-empty.sdp.md deleted file mode 100644 index c177b2b7..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-009-throws-empty-reservation-when-items-array-is-empty.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.throws-empty-reservation-when-items-array-is-empty -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Throws EMPTY_RESERVATION when items array is empty - -## Intent - -- outcome: Executable scenario: Throws EMPTY_RESERVATION when items array is empty - -```gwt -Given an empty reservation items array -When I call assertReservationHasItems -Then an InventoryInvariantError is thrown with code "EMPTY_RESERVATION" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-010-does-not-throw-for-valid-item-with-quantity-5.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-010-does-not-throw-for-valid-item-with-quantity-5.sdp.md deleted file mode 100644 index 05b145ee..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-010-does-not-throw-for-valid-item-with-quantity-5.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.does-not-throw-for-valid-item-with-quantity-5 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Does not throw for valid item with quantity 5 - -## Intent - -- outcome: Executable scenario: Does not throw for valid item with quantity 5 - -```gwt -Given a reservation item with productId "prod_1" and quantity 5 -When I call validateReservationItem -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-011-does-not-throw-for-item-with-quantity-1.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-011-does-not-throw-for-item-with-quantity-1.sdp.md deleted file mode 100644 index e865bd43..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-011-does-not-throw-for-item-with-quantity-1.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.does-not-throw-for-item-with-quantity-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Does not throw for item with quantity 1 - -## Intent - -- outcome: Executable scenario: Does not throw for item with quantity 1 - -```gwt -Given a reservation item with productId "prod_1" and quantity 1 -When I call validateReservationItem -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-012-throws-invalid-quantity-for-zero-quantity.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-012-throws-invalid-quantity-for-zero-quantity.sdp.md deleted file mode 100644 index ddb8e932..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-012-throws-invalid-quantity-for-zero-quantity.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.throws-invalid-quantity-for-zero-quantity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Throws INVALID_QUANTITY for zero quantity - -## Intent - -- outcome: Executable scenario: Throws INVALID_QUANTITY for zero quantity - -```gwt -Given a reservation item with productId "prod_1" and quantity 0 -When I call validateReservationItem -Then an InventoryInvariantError is thrown with code "INVALID_QUANTITY" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-013-throws-invalid-quantity-for-negative-quantity.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-013-throws-invalid-quantity-for-negative-quantity.sdp.md deleted file mode 100644 index 92388e42..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-013-throws-invalid-quantity-for-negative-quantity.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.throws-invalid-quantity-for-negative-quantity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Throws INVALID_QUANTITY for negative quantity - -## Intent - -- outcome: Executable scenario: Throws INVALID_QUANTITY for negative quantity - -```gwt -Given a reservation item with productId "prod_1" and quantity -5 -When I call validateReservationItem -Then an InventoryInvariantError is thrown with code "INVALID_QUANTITY" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-014-throws-invalid-quantity-for-non-integer-quantity.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-014-throws-invalid-quantity-for-non-integer-quantity.sdp.md deleted file mode 100644 index 273aab77..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-014-throws-invalid-quantity-for-non-integer-quantity.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.throws-invalid-quantity-for-non-integer-quantity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Throws INVALID_QUANTITY for non-integer quantity - -## Intent - -- outcome: Executable scenario: Throws INVALID_QUANTITY for non-integer quantity - -```gwt -Given a reservation item with productId "prod_1" and quantity 1.5 -When I call validateReservationItem -Then an InventoryInvariantError is thrown with code "INVALID_QUANTITY" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-015-throws-invalid-reservation-item-for-empty-product-id.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-015-throws-invalid-reservation-item-for-empty-product-id.sdp.md deleted file mode 100644 index 34991794..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-015-throws-invalid-reservation-item-for-empty-product-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.throws-invalid-reservation-item-for-empty-product-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Throws INVALID_RESERVATION_ITEM for empty productId - -## Intent - -- outcome: Executable scenario: Throws INVALID_RESERVATION_ITEM for empty productId - -```gwt -Given a reservation item with productId "" and quantity 5 -When I call validateReservationItem -Then an InventoryInvariantError is thrown with code "INVALID_RESERVATION_ITEM" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-016-does-not-throw-for-valid-items-array.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-016-does-not-throw-for-valid-items-array.sdp.md deleted file mode 100644 index 34be7570..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-016-does-not-throw-for-valid-items-array.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.does-not-throw-for-valid-items-array -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Does not throw for valid items array - -## Intent - -- outcome: Executable scenario: Does not throw for valid items array - -```gwt -Given a reservation items array with 2 valid items -When I call validateReservationItems -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-017-throws-empty-reservation-for-empty-array.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-017-throws-empty-reservation-for-empty-array.sdp.md deleted file mode 100644 index 82672b85..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-017-throws-empty-reservation-for-empty-array.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.throws-empty-reservation-for-empty-array -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Throws EMPTY_RESERVATION for empty array - -## Intent - -- outcome: Executable scenario: Throws EMPTY_RESERVATION for empty array - -```gwt -Given an empty reservation items array -When I call validateReservationItems -Then an InventoryInvariantError is thrown with code "EMPTY_RESERVATION" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-018-throws-invalid-quantity-when-one-item-has-invalid-quantity.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-018-throws-invalid-quantity-when-one-item-has-invalid-quantity.sdp.md deleted file mode 100644 index c6bbed2f..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-018-throws-invalid-quantity-when-one-item-has-invalid-quantity.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.throws-invalid-quantity-when-one-item-has-invalid-quantity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Throws INVALID_QUANTITY when one item has invalid quantity - -## Intent - -- outcome: Executable scenario: Throws INVALID_QUANTITY when one item has invalid quantity - -```gwt -Given a reservation items array where the second item has quantity 0 -When I call validateReservationItems -Then an InventoryInvariantError is thrown with code "INVALID_QUANTITY" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-019-has-correct-name-property.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-019-has-correct-name-property.sdp.md deleted file mode 100644 index bd5cdcc3..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-019-has-correct-name-property.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.has-correct-name-property -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Has correct name property - -## Intent - -- outcome: Executable scenario: Has correct name property - -```gwt -Given an InventoryInvariantError with code "INSUFFICIENT_STOCK" and message "Custom message" -When the scenario runs -Then the error name is "InventoryInvariantError" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-020-has-correct-code-property.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-020-has-correct-code-property.sdp.md deleted file mode 100644 index 1e427957..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-020-has-correct-code-property.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.has-correct-code-property -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Has correct code property - -## Intent - -- outcome: Executable scenario: Has correct code property - -```gwt -Given an InventoryInvariantError with code "INSUFFICIENT_STOCK" and message "Custom message" -When the scenario runs -Then the error code is "INSUFFICIENT_STOCK" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-021-has-correct-message-property.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-021-has-correct-message-property.sdp.md deleted file mode 100644 index 61c9baea..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-021-has-correct-message-property.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.has-correct-message-property -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Has correct message property - -## Intent - -- outcome: Executable scenario: Has correct message property - -```gwt -Given an InventoryInvariantError with code "INSUFFICIENT_STOCK" and message "Custom message" -When the scenario runs -Then the error message is "Custom message" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-022-has-correct-context-property.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-022-has-correct-context-property.sdp.md deleted file mode 100644 index 1ff94f3c..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-022-has-correct-context-property.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.has-correct-context-property -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Has correct context property - -## Intent - -- outcome: Executable scenario: Has correct context property - -```gwt -Given an InventoryInvariantError with code "INSUFFICIENT_STOCK" and context -When the scenario runs -Then the error context contains productId "prod_123" -And the error context contains extra "data" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-023-can-have-undefined-context.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-023-can-have-undefined-context.sdp.md deleted file mode 100644 index a69aabd6..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-023-can-have-undefined-context.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.can-have-undefined-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Can have undefined context - -## Intent - -- outcome: Executable scenario: Can have undefined context - -```gwt -Given an InventoryInvariantError with code "INSUFFICIENT_STOCK" and no context -When the scenario runs -Then the error context is undefined -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-024-is-instance-of-error.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-024-is-instance-of-error.sdp.md deleted file mode 100644 index 19eb5eb1..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-024-is-instance-of-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.is-instance-of-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# Is instance of Error - -## Intent - -- outcome: Executable scenario: Is instance of Error - -```gwt -Given an InventoryInvariantError with code "INSUFFICIENT_STOCK" and message "Custom message" -When the scenario runs -Then the error is an instance of Error -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-025-reservation-is-pending-check-returns-true-for-pending-status.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-025-reservation-is-pending-check-returns-true-for-pending-status.sdp.md deleted file mode 100644 index 58b99460..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-025-reservation-is-pending-check-returns-true-for-pending-status.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-is-pending-check-returns-true-for-pending-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationIsPending.check returns true for pending status - -## Intent - -- outcome: Executable scenario: reservationIsPending.check returns true for pending status - -```gwt -Given a reservation in "pending" status -When I call reservationIsPending.check -Then the check result is true -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-026-reservation-is-pending-check-returns-false-for-non-pending-statuses.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-026-reservation-is-pending-check-returns-false-for-non-pending-statuses.sdp.md deleted file mode 100644 index ff3f013b..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-026-reservation-is-pending-check-returns-false-for-non-pending-statuses.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-is-pending-check-returns-false-for-non-pending-statuses -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationIsPending.check returns false for non-pending statuses - -## Intent - -- outcome: Executable scenario: reservationIsPending.check returns false for non-pending statuses - -```gwt -Given a reservation in "value" status -When I call reservationIsPending.check -Then the check result is false -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-027-reservation-is-pending-assert-passes-for-pending-status.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-027-reservation-is-pending-assert-passes-for-pending-status.sdp.md deleted file mode 100644 index d551bc7e..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-027-reservation-is-pending-assert-passes-for-pending-status.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-is-pending-assert-passes-for-pending-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationIsPending.assert passes for pending status - -## Intent - -- outcome: Executable scenario: reservationIsPending.assert passes for pending status - -```gwt -Given a reservation in "pending" status -When I call reservationIsPending.assert -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-028-reservation-is-pending-assert-throws-reservation-not-pending-for-confirmed.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-028-reservation-is-pending-assert-throws-reservation-not-pending-for-confirmed.sdp.md deleted file mode 100644 index dd141937..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-028-reservation-is-pending-assert-throws-reservation-not-pending-for-confirmed.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-is-pending-assert-throws-reservation-not-pending-for-confirmed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationIsPending.assert throws RESERVATION_NOT_PENDING for confirmed - -## Intent - -- outcome: Executable scenario: reservationIsPending.assert throws RESERVATION_NOT_PENDING for confirmed - -```gwt -Given a reservation in "confirmed" status with reservationId "res_test" -When I call reservationIsPending.assert -Then an InventoryInvariantError is thrown with code "RESERVATION_NOT_PENDING" -And the error context reservationId is "res_test" -And the error context currentStatus is "confirmed" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-029-reservation-is-pending-assert-throws-reservation-not-pending-for-released.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-029-reservation-is-pending-assert-throws-reservation-not-pending-for-released.sdp.md deleted file mode 100644 index cdb805d9..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-029-reservation-is-pending-assert-throws-reservation-not-pending-for-released.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-is-pending-assert-throws-reservation-not-pending-for-released -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationIsPending.assert throws RESERVATION_NOT_PENDING for released - -## Intent - -- outcome: Executable scenario: reservationIsPending.assert throws RESERVATION_NOT_PENDING for released - -```gwt -Given a reservation in "released" status -When I call reservationIsPending.assert -Then an InventoryInvariantError is thrown with code "RESERVATION_NOT_PENDING" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-030-reservation-is-pending-validate-returns-valid-for-pending.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-030-reservation-is-pending-validate-returns-valid-for-pending.sdp.md deleted file mode 100644 index a8d53166..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-030-reservation-is-pending-validate-returns-valid-for-pending.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-is-pending-validate-returns-valid-for-pending -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationIsPending.validate returns valid for pending - -## Intent - -- outcome: Executable scenario: reservationIsPending.validate returns valid for pending - -```gwt -Given a reservation in "pending" status -When I call reservationIsPending.validate -Then the validate result is valid -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-031-reservation-is-pending-validate-returns-invalid-for-released.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-031-reservation-is-pending-validate-returns-invalid-for-released.sdp.md deleted file mode 100644 index a30f1197..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-031-reservation-is-pending-validate-returns-invalid-for-released.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-is-pending-validate-returns-invalid-for-released -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationIsPending.validate returns invalid for released - -## Intent - -- outcome: Executable scenario: reservationIsPending.validate returns invalid for released - -```gwt -Given a reservation in "released" status -When I call reservationIsPending.validate -Then the validate result is invalid with code "RESERVATION_NOT_PENDING" -And the validate result context currentStatus is "released" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-032-reservation-not-expired-check-returns-true-for-pending-with-future-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-032-reservation-not-expired-check-returns-true-for-pending-with-future-expiry.sdp.md deleted file mode 100644 index e45535cc..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-032-reservation-not-expired-check-returns-true-for-pending-with-future-expiry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-not-expired-check-returns-true-for-pending-with-future-expiry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationNotExpired.check returns true for pending with future expiry - -## Intent - -- outcome: Executable scenario: reservationNotExpired.check returns true for pending with future expiry - -```gwt -Given a pending reservation expiring 1 hour from now -When I call reservationNotExpired.check -Then the check result is true -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-033-reservation-not-expired-check-returns-true-for-confirmed-with-past-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-033-reservation-not-expired-check-returns-true-for-confirmed-with-past-expiry.sdp.md deleted file mode 100644 index 914f8b0c..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-033-reservation-not-expired-check-returns-true-for-confirmed-with-past-expiry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-not-expired-check-returns-true-for-confirmed-with-past-expiry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationNotExpired.check returns true for confirmed with past expiry - -## Intent - -- outcome: Executable scenario: reservationNotExpired.check returns true for confirmed with past expiry - -```gwt -Given a confirmed reservation with past expiry -When I call reservationNotExpired.check -Then the check result is true -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-034-reservation-not-expired-check-returns-true-for-released-with-past-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-034-reservation-not-expired-check-returns-true-for-released-with-past-expiry.sdp.md deleted file mode 100644 index 35e2617a..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-034-reservation-not-expired-check-returns-true-for-released-with-past-expiry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-not-expired-check-returns-true-for-released-with-past-expiry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationNotExpired.check returns true for released with past expiry - -## Intent - -- outcome: Executable scenario: reservationNotExpired.check returns true for released with past expiry - -```gwt -Given a released reservation with past expiry -When I call reservationNotExpired.check -Then the check result is true -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-035-reservation-not-expired-check-returns-false-for-pending-with-past-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-035-reservation-not-expired-check-returns-false-for-pending-with-past-expiry.sdp.md deleted file mode 100644 index d2b48f00..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-035-reservation-not-expired-check-returns-false-for-pending-with-past-expiry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-not-expired-check-returns-false-for-pending-with-past-expiry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationNotExpired.check returns false for pending with past expiry - -## Intent - -- outcome: Executable scenario: reservationNotExpired.check returns false for pending with past expiry - -```gwt -Given a pending reservation that expired 1 second ago -When I call reservationNotExpired.check -Then the check result is false -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-036-reservation-not-expired-assert-passes-for-pending-with-future-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-036-reservation-not-expired-assert-passes-for-pending-with-future-expiry.sdp.md deleted file mode 100644 index 09fe8e17..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-036-reservation-not-expired-assert-passes-for-pending-with-future-expiry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-not-expired-assert-passes-for-pending-with-future-expiry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationNotExpired.assert passes for pending with future expiry - -## Intent - -- outcome: Executable scenario: reservationNotExpired.assert passes for pending with future expiry - -```gwt -Given a pending reservation expiring 1 hour from now -When I call reservationNotExpired.assert -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-037-reservation-not-expired-assert-passes-for-confirmed-with-past-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-037-reservation-not-expired-assert-passes-for-confirmed-with-past-expiry.sdp.md deleted file mode 100644 index 1a4661da..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-037-reservation-not-expired-assert-passes-for-confirmed-with-past-expiry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-not-expired-assert-passes-for-confirmed-with-past-expiry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationNotExpired.assert passes for confirmed with past expiry - -## Intent - -- outcome: Executable scenario: reservationNotExpired.assert passes for confirmed with past expiry - -```gwt -Given a confirmed reservation with past expiry -When I call reservationNotExpired.assert -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-038-reservation-not-expired-assert-throws-reservation-expired-for-pending-with.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-038-reservation-not-expired-assert-throws-reservation-expired-for-pending-with.sdp.md deleted file mode 100644 index f08b179d..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-038-reservation-not-expired-assert-throws-reservation-expired-for-pending-with.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-not-expired-assert-throws-reservation-expired-for-pending-with-past -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationNotExpired.assert throws RESERVATION_EXPIRED for pending with past expiry - -## Intent - -- outcome: Executable scenario: reservationNotExpired.assert throws RESERVATION_EXPIRED for pending with past expiry - -```gwt -Given a pending reservation that expired 1 second ago with reservationId "res_expired" -When I call reservationNotExpired.assert -Then an InventoryInvariantError is thrown with code "RESERVATION_EXPIRED" -And the error context reservationId is "res_expired" -And the error context includes expiresAt -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-039-reservation-not-expired-validate-returns-valid-for-pending-with-future-exp.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-039-reservation-not-expired-validate-returns-valid-for-pending-with-future-exp.sdp.md deleted file mode 100644 index b9e68091..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-039-reservation-not-expired-validate-returns-valid-for-pending-with-future-exp.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-not-expired-validate-returns-valid-for-pending-with-future-expiry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationNotExpired.validate returns valid for pending with future expiry - -## Intent - -- outcome: Executable scenario: reservationNotExpired.validate returns valid for pending with future expiry - -```gwt -Given a pending reservation expiring 1 hour from now -When I call reservationNotExpired.validate -Then the validate result is valid -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-040-reservation-not-expired-validate-returns-invalid-for-pending-with-past-exp.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-040-reservation-not-expired-validate-returns-invalid-for-pending-with-past-exp.sdp.md deleted file mode 100644 index 345f683a..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-040-reservation-not-expired-validate-returns-invalid-for-pending-with-past-exp.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-not-expired-validate-returns-invalid-for-pending-with-past-expiry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationNotExpired.validate returns invalid for pending with past expiry - -## Intent - -- outcome: Executable scenario: reservationNotExpired.validate returns invalid for pending with past expiry - -```gwt -Given a pending reservation that expired 1 second ago -When I call reservationNotExpired.validate -Then the validate result is invalid with code "RESERVATION_EXPIRED" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-041-reservation-has-expired-check-returns-true-for-pending-with-past-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-041-reservation-has-expired-check-returns-true-for-pending-with-past-expiry.sdp.md deleted file mode 100644 index 723790be..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-041-reservation-has-expired-check-returns-true-for-pending-with-past-expiry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-has-expired-check-returns-true-for-pending-with-past-expiry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationHasExpired.check returns true for pending with past expiry - -## Intent - -- outcome: Executable scenario: reservationHasExpired.check returns true for pending with past expiry - -```gwt -Given a pending reservation that expired 1 second ago -When I call reservationHasExpired.check -Then the check result is true -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-042-reservation-has-expired-check-returns-true-for-non-pending-statuses.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-042-reservation-has-expired-check-returns-true-for-non-pending-statuses.sdp.md deleted file mode 100644 index 043de61c..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-042-reservation-has-expired-check-returns-true-for-non-pending-statuses.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-has-expired-check-returns-true-for-non-pending-statuses -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationHasExpired.check returns true for non-pending statuses - -## Intent - -- outcome: Executable scenario: reservationHasExpired.check returns true for non-pending statuses - -```gwt -Given a "value" reservation with future expiry -When I call reservationHasExpired.check -Then the check result is true -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-043-reservation-has-expired-check-returns-false-for-pending-with-future-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-043-reservation-has-expired-check-returns-false-for-pending-with-future-expiry.sdp.md deleted file mode 100644 index c17bd577..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-043-reservation-has-expired-check-returns-false-for-pending-with-future-expiry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-has-expired-check-returns-false-for-pending-with-future-expiry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationHasExpired.check returns false for pending with future expiry - -## Intent - -- outcome: Executable scenario: reservationHasExpired.check returns false for pending with future expiry - -```gwt -Given a pending reservation expiring 1 hour from now -When I call reservationHasExpired.check -Then the check result is false -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-044-reservation-has-expired-assert-passes-for-pending-with-past-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-044-reservation-has-expired-assert-passes-for-pending-with-past-expiry.sdp.md deleted file mode 100644 index 0d37871d..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-044-reservation-has-expired-assert-passes-for-pending-with-past-expiry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-has-expired-assert-passes-for-pending-with-past-expiry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationHasExpired.assert passes for pending with past expiry - -## Intent - -- outcome: Executable scenario: reservationHasExpired.assert passes for pending with past expiry - -```gwt -Given a pending reservation that expired 1 second ago -When I call reservationHasExpired.assert -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-045-reservation-has-expired-assert-passes-for-confirmed-regardless-of-expiry.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-045-reservation-has-expired-assert-passes-for-confirmed-regardless-of-expiry.sdp.md deleted file mode 100644 index a59e63fa..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-045-reservation-has-expired-assert-passes-for-confirmed-regardless-of-expiry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-has-expired-assert-passes-for-confirmed-regardless-of-expiry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationHasExpired.assert passes for confirmed regardless of expiry - -## Intent - -- outcome: Executable scenario: reservationHasExpired.assert passes for confirmed regardless of expiry - -```gwt -Given a confirmed reservation with future expiry -When I call reservationHasExpired.assert -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-046-reservation-has-expired-assert-throws-reservation-not-expired-for-pending.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-046-reservation-has-expired-assert-throws-reservation-not-expired-for-pending.sdp.md deleted file mode 100644 index d2c5bb14..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-046-reservation-has-expired-assert-throws-reservation-not-expired-for-pending.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-has-expired-assert-throws-reservation-not-expired-for-pending-with-f -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationHasExpired.assert throws RESERVATION_NOT_EXPIRED for pending with future expiry - -## Intent - -- outcome: Executable scenario: reservationHasExpired.assert throws RESERVATION_NOT_EXPIRED for pending with future expiry - -```gwt -Given a pending reservation expiring 1 hour from now with reservationId "res_active" -When I call reservationHasExpired.assert -Then an InventoryInvariantError is thrown with code "RESERVATION_NOT_EXPIRED" -And the error context reservationId is "res_active" -And the error context includes expiresAt -And the error context includes currentTime -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-047-reservation-has-expired-validate-returns-valid-for-expired-reservation.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-047-reservation-has-expired-validate-returns-valid-for-expired-reservation.sdp.md deleted file mode 100644 index fbac14a0..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-047-reservation-has-expired-validate-returns-valid-for-expired-reservation.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-has-expired-validate-returns-valid-for-expired-reservation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationHasExpired.validate returns valid for expired reservation - -## Intent - -- outcome: Executable scenario: reservationHasExpired.validate returns valid for expired reservation - -```gwt -Given a pending reservation that expired 1 second ago -When I call reservationHasExpired.validate -Then the validate result is valid -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-048-reservation-has-expired-validate-returns-invalid-for-pending-with-future-e.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-048-reservation-has-expired-validate-returns-invalid-for-pending-with-future-e.sdp.md deleted file mode 100644 index 5bd941eb..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-048-reservation-has-expired-validate-returns-invalid-for-pending-with-future-e.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.reservation-has-expired-validate-returns-invalid-for-pending-with-future-expiry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# reservationHasExpired.validate returns invalid for pending with future expiry - -## Intent - -- outcome: Executable scenario: reservationHasExpired.validate returns invalid for pending with future expiry - -```gwt -Given a pending reservation expiring 1 hour from now -When I call reservationHasExpired.validate -Then the validate result is invalid with code "RESERVATION_NOT_EXPIRED" -And the validate result context includes expiresAt -And the validate result context includes currentTime -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-049-confirm-reservation-invariants-check-all-returns-true-for-pending-and-not.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-049-confirm-reservation-invariants-check-all-returns-true-for-pending-and-not.sdp.md deleted file mode 100644 index 36ac31f9..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-049-confirm-reservation-invariants-check-all-returns-true-for-pending-and-not.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.confirm-reservation-invariants-check-all-returns-true-for-pending-and-not-expire -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# confirmReservationInvariants.checkAll returns true for pending and not expired - -## Intent - -- outcome: Executable scenario: confirmReservationInvariants.checkAll returns true for pending and not expired - -```gwt -Given a pending reservation expiring 1 hour from now -When I call confirmReservationInvariants.checkAll -Then the checkAll result is true -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-050-confirm-reservation-invariants-check-all-returns-false-for-confirmed-and-n.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-050-confirm-reservation-invariants-check-all-returns-false-for-confirmed-and-n.sdp.md deleted file mode 100644 index 1935add6..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-050-confirm-reservation-invariants-check-all-returns-false-for-confirmed-and-n.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.confirm-reservation-invariants-check-all-returns-false-for-confirmed-and-not-exp -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# confirmReservationInvariants.checkAll returns false for confirmed and not expired - -## Intent - -- outcome: Executable scenario: confirmReservationInvariants.checkAll returns false for confirmed and not expired - -```gwt -Given a confirmed reservation with future expiry -When I call confirmReservationInvariants.checkAll -Then the checkAll result is false -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-051-confirm-reservation-invariants-check-all-returns-false-for-pending-and-exp.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-051-confirm-reservation-invariants-check-all-returns-false-for-pending-and-exp.sdp.md deleted file mode 100644 index 3e759c6a..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-051-confirm-reservation-invariants-check-all-returns-false-for-pending-and-exp.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.confirm-reservation-invariants-check-all-returns-false-for-pending-and-expired -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# confirmReservationInvariants.checkAll returns false for pending and expired - -## Intent - -- outcome: Executable scenario: confirmReservationInvariants.checkAll returns false for pending and expired - -```gwt -Given a pending reservation that expired 1 second ago -When I call confirmReservationInvariants.checkAll -Then the checkAll result is false -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-052-confirm-reservation-invariants-assert-all-passes-for-pending-and-not-expir.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-052-confirm-reservation-invariants-assert-all-passes-for-pending-and-not-expir.sdp.md deleted file mode 100644 index d7082068..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-052-confirm-reservation-invariants-assert-all-passes-for-pending-and-not-expir.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.confirm-reservation-invariants-assert-all-passes-for-pending-and-not-expired -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# confirmReservationInvariants.assertAll passes for pending and not expired - -## Intent - -- outcome: Executable scenario: confirmReservationInvariants.assertAll passes for pending and not expired - -```gwt -Given a pending reservation expiring 1 hour from now -When I call confirmReservationInvariants.assertAll -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-053-confirm-reservation-invariants-assert-all-throws-reservation-not-pending-f.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-053-confirm-reservation-invariants-assert-all-throws-reservation-not-pending-f.sdp.md deleted file mode 100644 index 6a64d3b7..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-053-confirm-reservation-invariants-assert-all-throws-reservation-not-pending-f.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.confirm-reservation-invariants-assert-all-throws-reservation-not-pending-for-con -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# confirmReservationInvariants.assertAll throws RESERVATION_NOT_PENDING for confirmed - -## Intent - -- outcome: Executable scenario: confirmReservationInvariants.assertAll throws RESERVATION_NOT_PENDING for confirmed - -```gwt -Given a confirmed reservation with future expiry -When I call confirmReservationInvariants.assertAll -Then an InventoryInvariantError is thrown with code "RESERVATION_NOT_PENDING" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-054-confirm-reservation-invariants-assert-all-throws-reservation-expired-for-p.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-054-confirm-reservation-invariants-assert-all-throws-reservation-expired-for-p.sdp.md deleted file mode 100644 index 8940b1ea..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-054-confirm-reservation-invariants-assert-all-throws-reservation-expired-for-p.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.confirm-reservation-invariants-assert-all-throws-reservation-expired-for-pending -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# confirmReservationInvariants.assertAll throws RESERVATION_EXPIRED for pending and expired - -## Intent - -- outcome: Executable scenario: confirmReservationInvariants.assertAll throws RESERVATION_EXPIRED for pending and expired - -```gwt -Given a pending reservation that expired 1 second ago -When I call confirmReservationInvariants.assertAll -Then an InventoryInvariantError is thrown with code "RESERVATION_EXPIRED" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-055-confirm-reservation-invariants-validate-all-returns-valid-for-pending-and.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-055-confirm-reservation-invariants-validate-all-returns-valid-for-pending-and.sdp.md deleted file mode 100644 index 19c84530..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-055-confirm-reservation-invariants-validate-all-returns-valid-for-pending-and.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.confirm-reservation-invariants-validate-all-returns-valid-for-pending-and-not-ex -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# confirmReservationInvariants.validateAll returns valid for pending and not expired - -## Intent - -- outcome: Executable scenario: confirmReservationInvariants.validateAll returns valid for pending and not expired - -```gwt -Given a pending reservation expiring 1 hour from now -When I call confirmReservationInvariants.validateAll -Then the validateAll result is valid -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-056-confirm-reservation-invariants-validate-all-returns-single-violation-for-c.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-056-confirm-reservation-invariants-validate-all-returns-single-violation-for-c.sdp.md deleted file mode 100644 index 9219de78..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-056-confirm-reservation-invariants-validate-all-returns-single-violation-for-c.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.confirm-reservation-invariants-validate-all-returns-single-violation-for-confirm -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# confirmReservationInvariants.validateAll returns single violation for confirmed and not expired - -## Intent - -- outcome: Executable scenario: confirmReservationInvariants.validateAll returns single violation for confirmed and not expired - -```gwt -Given a confirmed reservation with future expiry -When I call confirmReservationInvariants.validateAll -Then the validateAll result is invalid -And the violations include code "RESERVATION_NOT_PENDING" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-057-confirm-reservation-invariants-validate-all-returns-violation-for-pending.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-057-confirm-reservation-invariants-validate-all-returns-violation-for-pending.sdp.md deleted file mode 100644 index 9402f3fe..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-057-confirm-reservation-invariants-validate-all-returns-violation-for-pending.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.confirm-reservation-invariants-validate-all-returns-violation-for-pending-and-ex -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# confirmReservationInvariants.validateAll returns violation for pending and expired - -## Intent - -- outcome: Executable scenario: confirmReservationInvariants.validateAll returns violation for pending and expired - -```gwt -Given a pending reservation that expired 1 second ago -When I call confirmReservationInvariants.validateAll -Then the validateAll result is invalid -And the violations include code "RESERVATION_EXPIRED" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-058-expire-reservation-invariants-check-all-returns-true-for-pending-and-expir.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-058-expire-reservation-invariants-check-all-returns-true-for-pending-and-expir.sdp.md deleted file mode 100644 index eaed282b..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-058-expire-reservation-invariants-check-all-returns-true-for-pending-and-expir.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.expire-reservation-invariants-check-all-returns-true-for-pending-and-expired -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# expireReservationInvariants.checkAll returns true for pending and expired - -## Intent - -- outcome: Executable scenario: expireReservationInvariants.checkAll returns true for pending and expired - -```gwt -Given a pending reservation that expired 1 second ago -When I call expireReservationInvariants.checkAll -Then the checkAll result is true -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-059-expire-reservation-invariants-check-all-returns-false-for-confirmed-and-ex.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-059-expire-reservation-invariants-check-all-returns-false-for-confirmed-and-ex.sdp.md deleted file mode 100644 index c6b29d51..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-059-expire-reservation-invariants-check-all-returns-false-for-confirmed-and-ex.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.expire-reservation-invariants-check-all-returns-false-for-confirmed-and-expired -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# expireReservationInvariants.checkAll returns false for confirmed and expired - -## Intent - -- outcome: Executable scenario: expireReservationInvariants.checkAll returns false for confirmed and expired - -```gwt -Given a confirmed reservation with past expiry -When I call expireReservationInvariants.checkAll -Then the checkAll result is false -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-060-expire-reservation-invariants-check-all-returns-false-for-pending-and-not.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-060-expire-reservation-invariants-check-all-returns-false-for-pending-and-not.sdp.md deleted file mode 100644 index 57a17c97..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-060-expire-reservation-invariants-check-all-returns-false-for-pending-and-not.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.expire-reservation-invariants-check-all-returns-false-for-pending-and-not-expire -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# expireReservationInvariants.checkAll returns false for pending and not expired - -## Intent - -- outcome: Executable scenario: expireReservationInvariants.checkAll returns false for pending and not expired - -```gwt -Given a pending reservation expiring 1 hour from now -When I call expireReservationInvariants.checkAll -Then the checkAll result is false -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-061-expire-reservation-invariants-assert-all-passes-for-pending-and-expired.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-061-expire-reservation-invariants-assert-all-passes-for-pending-and-expired.sdp.md deleted file mode 100644 index 021d3067..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-061-expire-reservation-invariants-assert-all-passes-for-pending-and-expired.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.expire-reservation-invariants-assert-all-passes-for-pending-and-expired -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# expireReservationInvariants.assertAll passes for pending and expired - -## Intent - -- outcome: Executable scenario: expireReservationInvariants.assertAll passes for pending and expired - -```gwt -Given a pending reservation that expired 1 second ago -When I call expireReservationInvariants.assertAll -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-062-expire-reservation-invariants-assert-all-throws-reservation-not-pending-fo.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-062-expire-reservation-invariants-assert-all-throws-reservation-not-pending-fo.sdp.md deleted file mode 100644 index e0448cde..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-062-expire-reservation-invariants-assert-all-throws-reservation-not-pending-fo.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.expire-reservation-invariants-assert-all-throws-reservation-not-pending-for-conf -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# expireReservationInvariants.assertAll throws RESERVATION_NOT_PENDING for confirmed - -## Intent - -- outcome: Executable scenario: expireReservationInvariants.assertAll throws RESERVATION_NOT_PENDING for confirmed - -```gwt -Given a confirmed reservation with past expiry -When I call expireReservationInvariants.assertAll -Then an InventoryInvariantError is thrown with code "RESERVATION_NOT_PENDING" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-063-expire-reservation-invariants-assert-all-throws-reservation-not-expired-fo.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-063-expire-reservation-invariants-assert-all-throws-reservation-not-expired-fo.sdp.md deleted file mode 100644 index 4d169855..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-063-expire-reservation-invariants-assert-all-throws-reservation-not-expired-fo.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.expire-reservation-invariants-assert-all-throws-reservation-not-expired-for-pend -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# expireReservationInvariants.assertAll throws RESERVATION_NOT_EXPIRED for pending and not expired - -## Intent - -- outcome: Executable scenario: expireReservationInvariants.assertAll throws RESERVATION_NOT_EXPIRED for pending and not expired - -```gwt -Given a pending reservation expiring 1 hour from now -When I call expireReservationInvariants.assertAll -Then an InventoryInvariantError is thrown with code "RESERVATION_NOT_EXPIRED" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-064-expire-reservation-invariants-validate-all-returns-valid-for-pending-and-e.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-064-expire-reservation-invariants-validate-all-returns-valid-for-pending-and-e.sdp.md deleted file mode 100644 index 7b091681..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-064-expire-reservation-invariants-validate-all-returns-valid-for-pending-and-e.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.expire-reservation-invariants-validate-all-returns-valid-for-pending-and-expired -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# expireReservationInvariants.validateAll returns valid for pending and expired - -## Intent - -- outcome: Executable scenario: expireReservationInvariants.validateAll returns valid for pending and expired - -```gwt -Given a pending reservation that expired 1 second ago -When I call expireReservationInvariants.validateAll -Then the validateAll result is valid -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-065-expire-reservation-invariants-validate-all-returns-single-violation-for-re.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-065-expire-reservation-invariants-validate-all-returns-single-violation-for-re.sdp.md deleted file mode 100644 index 0c17a5f7..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-065-expire-reservation-invariants-validate-all-returns-single-violation-for-re.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.expire-reservation-invariants-validate-all-returns-single-violation-for-released -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# expireReservationInvariants.validateAll returns single violation for released and expired - -## Intent - -- outcome: Executable scenario: expireReservationInvariants.validateAll returns single violation for released and expired - -```gwt -Given a released reservation with past expiry -When I call expireReservationInvariants.validateAll -Then the validateAll result is invalid -And the violations include code "RESERVATION_NOT_PENDING" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-066-expire-reservation-invariants-validate-all-returns-single-violation-for-pe.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.examples/s-066-expire-reservation-invariants-validate-all-returns-single-violation-for-pe.sdp.md deleted file mode 100644 index 9ba90380..00000000 --- a/specs/behavior/order-management/inventory/reservation-invariants.examples/s-066-expire-reservation-invariants-validate-all-returns-single-violation-for-pe.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reservation-invariants.expire-reservation-invariants-validate-all-returns-single-violation-for-pending -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reservation-invariants ---- -# expireReservationInvariants.validateAll returns single violation for pending and not expired - -## Intent - -- outcome: Executable scenario: expireReservationInvariants.validateAll returns single violation for pending and not expired - -```gwt -Given a pending reservation expiring 1 hour from now -When I call expireReservationInvariants.validateAll -Then the validateAll result is invalid -And the violations include code "RESERVATION_NOT_EXPIRED" -``` diff --git a/specs/behavior/order-management/inventory/reservation-invariants.sdp.md b/specs/behavior/order-management/inventory/reservation-invariants.sdp.md index 5c85dff6..04ac64a1 100644 --- a/specs/behavior/order-management/inventory/reservation-invariants.sdp.md +++ b/specs/behavior/order-management/inventory/reservation-invariants.sdp.md @@ -11,7 +11,7 @@ relations: ## Intent - actor: a developer working with the inventory context -- outcome: reservation invariant functions to enforce domain rules so that invalid reservation state is rejected consistently +- outcome: Reservation invariant functions enforce domain rules so that invalid reservation state is rejected consistently. ## Behavior diff --git a/specs/behavior/order-management/inventory/reserve-stock.examples/s-001-successfully-reserve-available-stock.sdp.md b/specs/behavior/order-management/inventory/reserve-stock.examples/s-001-successfully-reserve-available-stock.sdp.md deleted file mode 100644 index 0fd508a8..00000000 --- a/specs/behavior/order-management/inventory/reserve-stock.examples/s-001-successfully-reserve-available-stock.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reserve-stock.successfully-reserve-available-stock -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reserve-stock ---- -# Successfully reserve available stock - -## Intent - -- outcome: Executable scenario: Successfully reserve available stock - -```gwt -Given the system is ready -And a product "prod_reserve_001" exists with 100 available stock -When I send a ReserveStock command with: and the reservation includes: -Then the command should succeed -``` diff --git a/specs/behavior/order-management/inventory/reserve-stock.examples/s-002-reserve-multiple-items-atomically.sdp.md b/specs/behavior/order-management/inventory/reserve-stock.examples/s-002-reserve-multiple-items-atomically.sdp.md deleted file mode 100644 index 2141e1a4..00000000 --- a/specs/behavior/order-management/inventory/reserve-stock.examples/s-002-reserve-multiple-items-atomically.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reserve-stock.reserve-multiple-items-atomically -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reserve-stock ---- -# Reserve multiple items atomically - -## Intent - -- outcome: Executable scenario: Reserve multiple items atomically - -```gwt -Given the system is ready -And a product "prod_reserve_002" exists with 50 available stock -And another product "prod_reserve_003" exists with 30 available stock -When I send a ReserveStock command with: and the reservation includes: -Then the command should succeed -``` diff --git a/specs/behavior/order-management/inventory/reserve-stock.examples/s-003-reservation-fails-when-insufficient-stock.sdp.md b/specs/behavior/order-management/inventory/reserve-stock.examples/s-003-reservation-fails-when-insufficient-stock.sdp.md deleted file mode 100644 index 4a79c13a..00000000 --- a/specs/behavior/order-management/inventory/reserve-stock.examples/s-003-reservation-fails-when-insufficient-stock.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reserve-stock.reservation-fails-when-insufficient-stock -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reserve-stock ---- -# Reservation fails when insufficient stock - -## Intent - -- outcome: Executable scenario: Reservation fails when insufficient stock - -```gwt -Given the system is ready -And a product "prod_reserve_004" exists with 5 available stock -When I send a ReserveStock command with: and the reservation includes: -Then the command should fail with reason "Insufficient stock" -``` diff --git a/specs/behavior/order-management/inventory/reserve-stock.examples/s-004-multi-item-reservation-is-all-or-nothing.sdp.md b/specs/behavior/order-management/inventory/reserve-stock.examples/s-004-multi-item-reservation-is-all-or-nothing.sdp.md deleted file mode 100644 index 290028a2..00000000 --- a/specs/behavior/order-management/inventory/reserve-stock.examples/s-004-multi-item-reservation-is-all-or-nothing.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reserve-stock.multi-item-reservation-is-all-or-nothing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reserve-stock ---- -# Multi-item reservation is all-or-nothing - -## Intent - -- outcome: Executable scenario: Multi-item reservation is all-or-nothing - -```gwt -Given the system is ready -And a product "prod_reserve_005" exists with 100 available stock -And another product "prod_reserve_006" exists with 2 available stock -When I send a ReserveStock command with: and the reservation includes: -Then the command should fail with reason "Insufficient stock" -``` diff --git a/specs/behavior/order-management/inventory/reserve-stock.examples/s-005-cannot-reserve-non-existent-product.sdp.md b/specs/behavior/order-management/inventory/reserve-stock.examples/s-005-cannot-reserve-non-existent-product.sdp.md deleted file mode 100644 index 9030c2d7..00000000 --- a/specs/behavior/order-management/inventory/reserve-stock.examples/s-005-cannot-reserve-non-existent-product.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reserve-stock.cannot-reserve-non-existent-product -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reserve-stock ---- -# Cannot reserve non-existent product - -## Intent - -- outcome: Executable scenario: Cannot reserve non-existent product - -```gwt -Given the system is ready -And no product exists with ID "prod_ghost" -When I send a ReserveStock command with: and the reservation includes: -Then the command should fail with reason "Insufficient stock" -``` diff --git a/specs/behavior/order-management/inventory/reserve-stock.examples/s-006-reserve-stock-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/inventory/reserve-stock.examples/s-006-reserve-stock-is-idempotent-with-same-command-id.sdp.md deleted file mode 100644 index dbbcaf2e..00000000 --- a/specs/behavior/order-management/inventory/reserve-stock.examples/s-006-reserve-stock-is-idempotent-with-same-command-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.reserve-stock.reserve-stock-is-idempotent-with-same-command-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.reserve-stock ---- -# ReserveStock is idempotent with same commandId - -## Intent - -- outcome: Executable scenario: ReserveStock is idempotent with same commandId - -```gwt -Given the system is ready -And a product "prod_reserve_007" exists with 100 available stock -When I send a ReserveStock command twice with the same commandId for reservation "res_006" -Then the second command should return duplicate status -``` diff --git a/specs/behavior/order-management/inventory/reserve-stock.sdp.md b/specs/behavior/order-management/inventory/reserve-stock.sdp.md index 2868d119..7a4cc134 100644 --- a/specs/behavior/order-management/inventory/reserve-stock.sdp.md +++ b/specs/behavior/order-management/inventory/reserve-stock.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: to reserve stock for orders so that stock is held until order is confirmed or cancelled +- outcome: Stock is reserved for orders so that it is held until the order is confirmed or cancelled. diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-001-passes-when-stock-is-sufficient.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-001-passes-when-stock-is-sufficient.sdp.md deleted file mode 100644 index ca956e65..00000000 --- a/specs/behavior/order-management/inventory/stock-invariants.examples/s-001-passes-when-stock-is-sufficient.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.stock-invariants.passes-when-stock-is-sufficient -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.stock-invariants ---- -# passes when stock is sufficient - -## Intent - -- outcome: Executable scenario: passes when stock is sufficient - -```gwt -Given a product with available quantity 100 -When I assert sufficient stock for quantity 50 -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-002-passes-when-requesting-exact-available-quantity.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-002-passes-when-requesting-exact-available-quantity.sdp.md deleted file mode 100644 index cb86649d..00000000 --- a/specs/behavior/order-management/inventory/stock-invariants.examples/s-002-passes-when-requesting-exact-available-quantity.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.stock-invariants.passes-when-requesting-exact-available-quantity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.stock-invariants ---- -# passes when requesting exact available quantity - -## Intent - -- outcome: Executable scenario: passes when requesting exact available quantity - -```gwt -Given a product with available quantity 100 -When I assert sufficient stock for quantity 100 -Then no error is thrown -``` diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-003-throws-insufficient-stock-when-stock-is-not-enough.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-003-throws-insufficient-stock-when-stock-is-not-enough.sdp.md deleted file mode 100644 index beebe874..00000000 --- a/specs/behavior/order-management/inventory/stock-invariants.examples/s-003-throws-insufficient-stock-when-stock-is-not-enough.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.stock-invariants.throws-insufficient-stock-when-stock-is-not-enough -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.stock-invariants ---- -# throws INSUFFICIENT_STOCK when stock is not enough - -## Intent - -- outcome: Executable scenario: throws INSUFFICIENT_STOCK when stock is not enough - -```gwt -Given a product with available quantity 10 and productId "prod_low" -When I assert sufficient stock for quantity 20 -Then an InventoryInvariantError is thrown with code "INSUFFICIENT_STOCK" -And the error context productId is "prod_low" -And the error context availableQuantity is 10 -And the error context requestedQuantity is 20 -``` diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-004-throws-insufficient-stock-when-stock-is-zero.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-004-throws-insufficient-stock-when-stock-is-zero.sdp.md deleted file mode 100644 index ab861a02..00000000 --- a/specs/behavior/order-management/inventory/stock-invariants.examples/s-004-throws-insufficient-stock-when-stock-is-zero.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.stock-invariants.throws-insufficient-stock-when-stock-is-zero -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.stock-invariants ---- -# throws INSUFFICIENT_STOCK when stock is zero - -## Intent - -- outcome: Executable scenario: throws INSUFFICIENT_STOCK when stock is zero - -```gwt -Given a product with available quantity 0 -When I assert sufficient stock for quantity 1 -Then an InventoryInvariantError is thrown with code "INSUFFICIENT_STOCK" -``` diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-005-returns-available-when-stock-is-sufficient.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-005-returns-available-when-stock-is-sufficient.sdp.md deleted file mode 100644 index 393e6345..00000000 --- a/specs/behavior/order-management/inventory/stock-invariants.examples/s-005-returns-available-when-stock-is-sufficient.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.stock-invariants.returns-available-when-stock-is-sufficient -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.stock-invariants ---- -# returns available when stock is sufficient - -## Intent - -- outcome: Executable scenario: returns available when stock is sufficient - -```gwt -Given a product with available quantity 100 -When I check stock availability for quantity 50 -Then the result shows stock is available -``` diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-006-returns-available-when-requesting-exact-amount.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-006-returns-available-when-requesting-exact-amount.sdp.md deleted file mode 100644 index 64eaca4e..00000000 --- a/specs/behavior/order-management/inventory/stock-invariants.examples/s-006-returns-available-when-requesting-exact-amount.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.stock-invariants.returns-available-when-requesting-exact-amount -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.stock-invariants ---- -# returns available when requesting exact amount - -## Intent - -- outcome: Executable scenario: returns available when requesting exact amount - -```gwt -Given a product with available quantity 100 -When I check stock availability for quantity 100 -Then the result shows stock is available -``` diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-007-returns-unavailable-with-deficit-when-stock-is-insufficient.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-007-returns-unavailable-with-deficit-when-stock-is-insufficient.sdp.md deleted file mode 100644 index 2502d579..00000000 --- a/specs/behavior/order-management/inventory/stock-invariants.examples/s-007-returns-unavailable-with-deficit-when-stock-is-insufficient.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.stock-invariants.returns-unavailable-with-deficit-when-stock-is-insufficient -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.stock-invariants ---- -# returns unavailable with deficit when stock is insufficient - -## Intent - -- outcome: Executable scenario: returns unavailable with deficit when stock is insufficient - -```gwt -Given a product with available quantity 10 -When I check stock availability for quantity 25 -Then the result shows stock is not available -And the deficit is 15 -``` diff --git a/specs/behavior/order-management/inventory/stock-invariants.examples/s-008-returns-correct-deficit-for-zero-stock.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.examples/s-008-returns-correct-deficit-for-zero-stock.sdp.md deleted file mode 100644 index 58fe71cc..00000000 --- a/specs/behavior/order-management/inventory/stock-invariants.examples/s-008-returns-correct-deficit-for-zero-stock.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.inventory.stock-invariants.returns-correct-deficit-for-zero-stock -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.inventory.stock-invariants ---- -# returns correct deficit for zero stock - -## Intent - -- outcome: Executable scenario: returns correct deficit for zero stock - -```gwt -Given a product with available quantity 0 -When I check stock availability for quantity 10 -Then the result shows stock is not available -And the deficit is 10 -``` diff --git a/specs/behavior/order-management/inventory/stock-invariants.sdp.md b/specs/behavior/order-management/inventory/stock-invariants.sdp.md index 9ec638b4..91351e8e 100644 --- a/specs/behavior/order-management/inventory/stock-invariants.sdp.md +++ b/specs/behavior/order-management/inventory/stock-invariants.sdp.md @@ -11,7 +11,7 @@ relations: ## Intent - actor: a developer working with the Inventory bounded context -- outcome: pure stock invariant functions that validate quantity constraints so that stock over-allocation is prevented with structured error information +- outcome: Pure stock invariant functions validate quantity constraints so that over-allocation is prevented with structured errors. ## Behavior diff --git a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-001-multi-product-order-uses-dcb-for-atomic-reservation.sdp.md b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-001-multi-product-order-uses-dcb-for-atomic-reservation.sdp.md deleted file mode 100644 index ace4ceb7..00000000 --- a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-001-multi-product-order-uses-dcb-for-atomic-reservation.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.order-management.modernization.dcb-multi-product-reservation.multi-product-order-uses-dcb-for-atomic-reservation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.modernization.dcb-multi-product-reservation ---- -# Multi-product order uses DCB for atomic reservation - -## Intent - -- outcome: Executable scenario: Multi-product order uses DCB for atomic reservation - -```gwt -Given the inventory bounded context is initialized -And the test run has a unique namespace -And products exist with sufficient inventory: -And an order with the following items: -When the order is submitted using executeWithDCB -Then all inventory reservations should succeed atomically -And a single ReservationCreated event should be emitted -And each product's available quantity should be reduced -``` diff --git a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-002-insufficient-inventory-for-one-product-rejects-entire-reservation.sdp.md b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-002-insufficient-inventory-for-one-product-rejects-entire-reservation.sdp.md deleted file mode 100644 index 41007804..00000000 --- a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-002-insufficient-inventory-for-one-product-rejects-entire-reservation.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.order-management.modernization.dcb-multi-product-reservation.insufficient-inventory-for-one-product-rejects-entire-reservation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.modernization.dcb-multi-product-reservation ---- -# Insufficient inventory for one product rejects entire reservation - -## Intent - -- outcome: Executable scenario: Insufficient inventory for one product rejects entire reservation - -```gwt -Given the inventory bounded context is initialized -And the test run has a unique namespace -And products exist with inventory: -And an order with the following items: -When the order is submitted using executeWithDCB -Then the entire reservation should be rejected -And no inventory should be reserved for any product -And rejection reason should indicate "prod-002" has insufficient stock -``` diff --git a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-003-dcb-handles-concurrent-reservation-conflicts.sdp.md b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-003-dcb-handles-concurrent-reservation-conflicts.sdp.md deleted file mode 100644 index 0c0c5fc1..00000000 --- a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-003-dcb-handles-concurrent-reservation-conflicts.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.order-management.modernization.dcb-multi-product-reservation.dcb-handles-concurrent-reservation-conflicts -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.modernization.dcb-multi-product-reservation ---- -# DCB handles concurrent reservation conflicts - -## Intent - -- outcome: Executable scenario: DCB handles concurrent reservation conflicts - -```gwt -Given the inventory bounded context is initialized -And the test run has a unique namespace -And a product with available quantity 10 -And two concurrent orders each requesting quantity 8 -When both orders are submitted simultaneously -Then exactly one order should succeed -And one order should be rejected with conflict error -And total reserved should not exceed available -``` diff --git a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-004-duplicate-product-i-ds-are-rejected.sdp.md b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-004-duplicate-product-i-ds-are-rejected.sdp.md deleted file mode 100644 index 8c7ad0f7..00000000 --- a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.examples/s-004-duplicate-product-i-ds-are-rejected.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.modernization.dcb-multi-product-reservation.duplicate-product-i-ds-are-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.modernization.dcb-multi-product-reservation ---- -# Duplicate product IDs are rejected - -## Intent - -- outcome: Executable scenario: Duplicate product IDs are rejected - -```gwt -Given the inventory bounded context is initialized -And the test run has a unique namespace -And products exist with sufficient inventory: -When attempting to reserve with duplicate product IDs: -Then the reservation should be rejected with code "DUPLICATE_PRODUCT_IDS" -And the error context should include the duplicate product IDs -``` diff --git a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.sdp.md b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.sdp.md index 21e1f562..bfa34f3e 100644 --- a/specs/behavior/order-management/modernization/dcb-multi-product-reservation.sdp.md +++ b/specs/behavior/order-management/modernization/dcb-multi-product-reservation.sdp.md @@ -11,7 +11,7 @@ relations: ## Intent - actor: a platform developer -- outcome: to see DCB demonstrated in the order submission flow so that I understand how to use executeWithDCB for multi-entity operations +- outcome: Order submission demonstrates DCB so that developers can see how to use executeWithDCB for multi-entity operations. ## Behavior diff --git a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-001-order-submitted-includes-customer-snapshot.sdp.md b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-001-order-submitted-includes-customer-snapshot.sdp.md deleted file mode 100644 index 044e3564..00000000 --- a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-001-order-submitted-includes-customer-snapshot.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.modernization.fat-events-order-submitted.order-submitted-includes-customer-snapshot -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.modernization.fat-events-order-submitted ---- -# OrderSubmitted includes customer snapshot - -## Intent - -- outcome: Executable scenario: OrderSubmitted includes customer snapshot - -```gwt -Given the orders bounded context is initialized -And the test run has a unique namespace -And a customer exists: -And the customer has a draft order -When the customer submits the order -Then the OrderSubmitted event should include: -And the event schema version should be 2 -``` diff --git a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-002-event-enrichment-does-not-block-order-submission.sdp.md b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-002-event-enrichment-does-not-block-order-submission.sdp.md deleted file mode 100644 index c4641358..00000000 --- a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-002-event-enrichment-does-not-block-order-submission.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.modernization.fat-events-order-submitted.event-enrichment-does-not-block-order-submission -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.modernization.fat-events-order-submitted ---- -# Event enrichment does not block order submission - -## Intent - -- outcome: Executable scenario: Event enrichment does not block order submission - -```gwt -Given the orders bounded context is initialized -And the test run has a unique namespace -And a customer with complete profile -And a draft order ready for submission -When the order is submitted -Then the command should complete within acceptable latency -And the event should be enriched with customer data -``` diff --git a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-003-customer-snapshot-is-immutable-in-event.sdp.md b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-003-customer-snapshot-is-immutable-in-event.sdp.md deleted file mode 100644 index 58eacce0..00000000 --- a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-003-customer-snapshot-is-immutable-in-event.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.modernization.fat-events-order-submitted.customer-snapshot-is-immutable-in-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.modernization.fat-events-order-submitted ---- -# Customer snapshot is immutable in event - -## Intent - -- outcome: Executable scenario: Customer snapshot is immutable in event - -```gwt -Given the orders bounded context is initialized -And the test run has a unique namespace -And an OrderSubmitted event exists with customer name "John Doe" -When the customer updates their name to "John Smith" -Then querying the original event should still show "John Doe" -And new OrderSubmitted events should show "John Smith" -``` diff --git a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-004-missing-customer-data-handled-gracefully.sdp.md b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-004-missing-customer-data-handled-gracefully.sdp.md deleted file mode 100644 index 2c8ad8a2..00000000 --- a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-004-missing-customer-data-handled-gracefully.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.modernization.fat-events-order-submitted.missing-customer-data-handled-gracefully -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.modernization.fat-events-order-submitted ---- -# Missing customer data handled gracefully - -## Intent - -- outcome: Executable scenario: Missing customer data handled gracefully - -```gwt -Given the orders bounded context is initialized -And the test run has a unique namespace -And a customer with incomplete profile (missing email) -When the customer submits an order -Then the OrderSubmitted event should include available data -And missing fields should have null or default values -And the order submission should not fail -``` diff --git a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-005-v1-events-are-upcasted-to-v2-with-null-customer.sdp.md b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-005-v1-events-are-upcasted-to-v2-with-null-customer.sdp.md deleted file mode 100644 index 789c7199..00000000 --- a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-005-v1-events-are-upcasted-to-v2-with-null-customer.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.modernization.fat-events-order-submitted.v1-events-are-upcasted-to-v2-with-null-customer -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.modernization.fat-events-order-submitted ---- -# V1 events are upcasted to V2 with null customer - -## Intent - -- outcome: Executable scenario: V1 events are upcasted to V2 with null customer - -```gwt -Given the orders bounded context is initialized -And the test run has a unique namespace -And a legacy V1 OrderSubmitted event without customer data -When the event is read through the upcaster -Then the event should have schema version 2 -And the customer field should be null indicating a legacy event -``` diff --git a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-006-v2-events-are-not-modified-by-upcaster.sdp.md b/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-006-v2-events-are-not-modified-by-upcaster.sdp.md deleted file mode 100644 index 9e1fd134..00000000 --- a/specs/behavior/order-management/modernization/fat-events-order-submitted.examples/s-006-v2-events-are-not-modified-by-upcaster.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.modernization.fat-events-order-submitted.v2-events-are-not-modified-by-upcaster -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.modernization.fat-events-order-submitted ---- -# V2 events are not modified by upcaster - -## Intent - -- outcome: Executable scenario: V2 events are not modified by upcaster - -```gwt -Given the orders bounded context is initialized -And the test run has a unique namespace -And a V2 OrderSubmitted event with customer data -When the event is read through the upcaster -Then the event should have schema version 2 -And wasUpcasted should be false -And the customer snapshot should be preserved -``` diff --git a/specs/behavior/order-management/modernization/fat-events-order-submitted.sdp.md b/specs/behavior/order-management/modernization/fat-events-order-submitted.sdp.md index 6962a3e0..7a5a1b4a 100644 --- a/specs/behavior/order-management/modernization/fat-events-order-submitted.sdp.md +++ b/specs/behavior/order-management/modernization/fat-events-order-submitted.sdp.md @@ -11,7 +11,7 @@ relations: ## Intent - actor: an event consumer -- outcome: OrderSubmitted events to include customer snapshots so that I can process orders without additional customer queries +- outcome: OrderSubmitted events include customer snapshots so that consumers can process orders without additional customer queries. ## Behavior diff --git a/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-001-order-detail-view-shows-instant-updates.sdp.md b/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-001-order-detail-view-shows-instant-updates.sdp.md deleted file mode 100644 index 0162d2f4..00000000 --- a/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-001-order-detail-view-shows-instant-updates.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.modernization.reactive-order-detail.order-detail-view-shows-instant-updates -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.modernization.reactive-order-detail ---- -# Order detail view shows instant updates - -## Intent - -- outcome: Executable scenario: Order detail view shows instant updates - -```gwt -Given the orders bounded context is initialized -And the test run has a unique namespace -And an order exists with status "draft" -And a client is subscribed to the order detail view -When the order status changes to "submitted" -Then the UI should receive the update within 50ms -And no polling should have occurred -``` diff --git a/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-002-multiple-rapid-updates-are-applied-correctly.sdp.md b/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-002-multiple-rapid-updates-are-applied-correctly.sdp.md deleted file mode 100644 index 5233824b..00000000 --- a/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-002-multiple-rapid-updates-are-applied-correctly.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.modernization.reactive-order-detail.multiple-rapid-updates-are-applied-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.modernization.reactive-order-detail ---- -# Multiple rapid updates are applied correctly - -## Intent - -- outcome: Executable scenario: Multiple rapid updates are applied correctly - -```gwt -Given the orders bounded context is initialized -And the test run has a unique namespace -And an order exists with 2 items -And a client is subscribed to the order detail view -When 5 items are added in rapid succession -Then all items should appear in the view -And the final item count should be 7 -``` diff --git a/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-003-optimistic-update-rolls-back-on-conflict.sdp.md b/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-003-optimistic-update-rolls-back-on-conflict.sdp.md deleted file mode 100644 index fbd356dc..00000000 --- a/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-003-optimistic-update-rolls-back-on-conflict.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.modernization.reactive-order-detail.optimistic-update-rolls-back-on-conflict -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.modernization.reactive-order-detail ---- -# Optimistic update rolls back on conflict - -## Intent - -- outcome: Executable scenario: Optimistic update rolls back on conflict - -```gwt -Given the orders bounded context is initialized -And the test run has a unique namespace -And a client has an optimistic order total of $100 -And the server projection shows order total of $150 -When the conflict is detected -Then the optimistic state should be rolled back to $150 -And a conflict event should be logged -``` diff --git a/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-004-stale-event-stream-is-handled-gracefully.sdp.md b/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-004-stale-event-stream-is-handled-gracefully.sdp.md deleted file mode 100644 index 9f4b4536..00000000 --- a/specs/behavior/order-management/modernization/reactive-order-detail.examples/s-004-stale-event-stream-is-handled-gracefully.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.modernization.reactive-order-detail.stale-event-stream-is-handled-gracefully -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.modernization.reactive-order-detail ---- -# Stale event stream is handled gracefully - -## Intent - -- outcome: Executable scenario: Stale event stream is handled gracefully - -```gwt -Given the orders bounded context is initialized -And the test run has a unique namespace -And a client subscribed with an outdated event cursor -When the server has newer events -Then the client should catch up to current state -And no data loss should occur -``` diff --git a/specs/behavior/order-management/modernization/reactive-order-detail.sdp.md b/specs/behavior/order-management/modernization/reactive-order-detail.sdp.md index 89524c60..ad4b6ed4 100644 --- a/specs/behavior/order-management/modernization/reactive-order-detail.sdp.md +++ b/specs/behavior/order-management/modernization/reactive-order-detail.sdp.md @@ -11,7 +11,7 @@ relations: ## Intent - actor: a frontend developer -- outcome: to see useReactiveProjection demonstrated for order detail so that I understand how to build instant-updating UI components +- outcome: Order detail demonstrates useReactiveProjection so that developers can build instant-updating UI components. ## Behavior diff --git a/specs/behavior/order-management/modernization/reference-documentation.examples/s-001-readme-has-reference-implementation-designation.sdp.md b/specs/behavior/order-management/modernization/reference-documentation.examples/s-001-readme-has-reference-implementation-designation.sdp.md deleted file mode 100644 index 43419775..00000000 --- a/specs/behavior/order-management/modernization/reference-documentation.examples/s-001-readme-has-reference-implementation-designation.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.modernization.reference-documentation.readme-has-reference-implementation-designation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.modernization.reference-documentation ---- -# README has Reference Implementation designation - -## Intent - -- outcome: Executable scenario: README has Reference Implementation designation - -```gwt -Given the example app README exists at "examples/order-management/README.md" -And the example app README -When reading the document header -Then it should have a clear "Reference Implementation" badge or heading -And the purpose section should explain: -``` diff --git a/specs/behavior/order-management/modernization/reference-documentation.examples/s-002-all-demonstrated-patterns-are-cataloged.sdp.md b/specs/behavior/order-management/modernization/reference-documentation.examples/s-002-all-demonstrated-patterns-are-cataloged.sdp.md deleted file mode 100644 index 29c869ef..00000000 --- a/specs/behavior/order-management/modernization/reference-documentation.examples/s-002-all-demonstrated-patterns-are-cataloged.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.modernization.reference-documentation.all-demonstrated-patterns-are-cataloged -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.modernization.reference-documentation ---- -# All demonstrated patterns are cataloged - -## Intent - -- outcome: Executable scenario: All demonstrated patterns are cataloged - -```gwt -Given the example app README exists at "examples/order-management/README.md" -And the "Patterns Demonstrated" section in README -When the scenario runs -Then it should list the following patterns: -``` diff --git a/specs/behavior/order-management/modernization/reference-documentation.examples/s-003-pattern-links-are-valid.sdp.md b/specs/behavior/order-management/modernization/reference-documentation.examples/s-003-pattern-links-are-valid.sdp.md deleted file mode 100644 index 5db7c22c..00000000 --- a/specs/behavior/order-management/modernization/reference-documentation.examples/s-003-pattern-links-are-valid.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.modernization.reference-documentation.pattern-links-are-valid -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.modernization.reference-documentation ---- -# Pattern links are valid - -## Intent - -- outcome: Executable scenario: Pattern links are valid - -```gwt -Given the example app README exists at "examples/order-management/README.md" -And each pattern in the catalog has a code location link -When validating the links -Then all code links should point to existing files -And all documentation links should be valid -``` diff --git a/specs/behavior/order-management/modernization/reference-documentation.examples/s-004-architecture-diagram-is-present.sdp.md b/specs/behavior/order-management/modernization/reference-documentation.examples/s-004-architecture-diagram-is-present.sdp.md deleted file mode 100644 index 4cd7f09a..00000000 --- a/specs/behavior/order-management/modernization/reference-documentation.examples/s-004-architecture-diagram-is-present.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.modernization.reference-documentation.architecture-diagram-is-present -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.modernization.reference-documentation ---- -# Architecture diagram is present - -## Intent - -- outcome: Executable scenario: Architecture diagram is present - -```gwt -Given the example app README exists at "examples/order-management/README.md" -And the README -When looking for the Architecture Diagram section -Then it should include a visual diagram (Mermaid or image) -And the diagram should show Orders BC and Inventory BC -And the diagram should indicate where each platform pattern is used -``` diff --git a/specs/behavior/order-management/modernization/reference-documentation.sdp.md b/specs/behavior/order-management/modernization/reference-documentation.sdp.md index ffff2bc6..f072d03e 100644 --- a/specs/behavior/order-management/modernization/reference-documentation.sdp.md +++ b/specs/behavior/order-management/modernization/reference-documentation.sdp.md @@ -11,7 +11,7 @@ relations: ## Intent - actor: a platform user -- outcome: clear documentation designating this as a reference implementation so that I understand its purpose and how to learn from it +- outcome: Documentation designates this app as a reference implementation so that users understand its purpose and how to learn from it. ## Behavior diff --git a/specs/behavior/order-management/orders/add-items.examples/s-001-add-single-item-to-empty-draft-order.sdp.md b/specs/behavior/order-management/orders/add-items.examples/s-001-add-single-item-to-empty-draft-order.sdp.md deleted file mode 100644 index a554b589..00000000 --- a/specs/behavior/order-management/orders/add-items.examples/s-001-add-single-item-to-empty-draft-order.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.orders.add-items.add-single-item-to-empty-draft-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.add-items ---- -# Add single item to empty draft order - -## Intent - -- outcome: Executable scenario: Add single item to empty draft order - -```gwt -Given the system is ready -And an order "ord_items_001" exists with status "draft" -And the order has no items -When I add an item to order "ord_items_001": -Then the command should succeed -And the order should have 1 item -And the order total should be 30 -``` diff --git a/specs/behavior/order-management/orders/add-items.examples/s-002-add-multiple-items-to-draft-order.sdp.md b/specs/behavior/order-management/orders/add-items.examples/s-002-add-multiple-items-to-draft-order.sdp.md deleted file mode 100644 index c66da136..00000000 --- a/specs/behavior/order-management/orders/add-items.examples/s-002-add-multiple-items-to-draft-order.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.orders.add-items.add-multiple-items-to-draft-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.add-items ---- -# Add multiple items to draft order - -## Intent - -- outcome: Executable scenario: Add multiple items to draft order - -```gwt -Given the system is ready -And an order "ord_items_002" exists with status "draft" -And the order has no items -When I add items to order "ord_items_002": -Then the command should succeed -And the order should have 3 items -And the order total should be 60 -``` diff --git a/specs/behavior/order-management/orders/add-items.examples/s-003-cannot-add-items-to-submitted-order.sdp.md b/specs/behavior/order-management/orders/add-items.examples/s-003-cannot-add-items-to-submitted-order.sdp.md deleted file mode 100644 index 154c0420..00000000 --- a/specs/behavior/order-management/orders/add-items.examples/s-003-cannot-add-items-to-submitted-order.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.add-items.cannot-add-items-to-submitted-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.add-items ---- -# Cannot add items to submitted order - -## Intent - -- outcome: Executable scenario: Cannot add items to submitted order - -```gwt -Given the system is ready -And an order "ord_items_003" exists with status "submitted" -When I add an item to order "ord_items_003": -Then the command should be rejected with code "ORDER_NOT_IN_DRAFT" -``` diff --git a/specs/behavior/order-management/orders/add-items.examples/s-004-cannot-add-items-to-cancelled-order.sdp.md b/specs/behavior/order-management/orders/add-items.examples/s-004-cannot-add-items-to-cancelled-order.sdp.md deleted file mode 100644 index c884a425..00000000 --- a/specs/behavior/order-management/orders/add-items.examples/s-004-cannot-add-items-to-cancelled-order.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.add-items.cannot-add-items-to-cancelled-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.add-items ---- -# Cannot add items to cancelled order - -## Intent - -- outcome: Executable scenario: Cannot add items to cancelled order - -```gwt -Given the system is ready -And an order "ord_items_004" exists with status "cancelled" -When I add an item to order "ord_items_004": -Then the command should be rejected with code "ORDER_NOT_IN_DRAFT" -``` diff --git a/specs/behavior/order-management/orders/add-items.examples/s-005-cannot-add-item-with-zero-quantity.sdp.md b/specs/behavior/order-management/orders/add-items.examples/s-005-cannot-add-item-with-zero-quantity.sdp.md deleted file mode 100644 index 4570818a..00000000 --- a/specs/behavior/order-management/orders/add-items.examples/s-005-cannot-add-item-with-zero-quantity.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.add-items.cannot-add-item-with-zero-quantity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.add-items ---- -# Cannot add item with zero quantity - -## Intent - -- outcome: Executable scenario: Cannot add item with zero quantity - -```gwt -Given the system is ready -And an order "ord_items_005" exists with status "draft" -When I add an item to order "ord_items_005": -Then the command should be rejected -``` diff --git a/specs/behavior/order-management/orders/add-items.examples/s-006-cannot-add-item-with-negative-quantity.sdp.md b/specs/behavior/order-management/orders/add-items.examples/s-006-cannot-add-item-with-negative-quantity.sdp.md deleted file mode 100644 index 2e215666..00000000 --- a/specs/behavior/order-management/orders/add-items.examples/s-006-cannot-add-item-with-negative-quantity.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.add-items.cannot-add-item-with-negative-quantity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.add-items ---- -# Cannot add item with negative quantity - -## Intent - -- outcome: Executable scenario: Cannot add item with negative quantity - -```gwt -Given the system is ready -And an order "ord_items_006" exists with status "draft" -When I add an item to order "ord_items_006": -Then the command should be rejected -``` diff --git a/specs/behavior/order-management/orders/add-items.examples/s-007-cannot-add-item-with-negative-price.sdp.md b/specs/behavior/order-management/orders/add-items.examples/s-007-cannot-add-item-with-negative-price.sdp.md deleted file mode 100644 index cb7ac17e..00000000 --- a/specs/behavior/order-management/orders/add-items.examples/s-007-cannot-add-item-with-negative-price.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.add-items.cannot-add-item-with-negative-price -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.add-items ---- -# Cannot add item with negative price - -## Intent - -- outcome: Executable scenario: Cannot add item with negative price - -```gwt -Given the system is ready -And an order "ord_items_007" exists with status "draft" -When I add an item to order "ord_items_007": -Then the command should be rejected -``` diff --git a/specs/behavior/order-management/orders/add-items.sdp.md b/specs/behavior/order-management/orders/add-items.sdp.md index c6f3ee59..7f4d9b6e 100644 --- a/specs/behavior/order-management/orders/add-items.sdp.md +++ b/specs/behavior/order-management/orders/add-items.sdp.md @@ -11,4 +11,4 @@ relations: ## Intent - actor: a customer -- outcome: to add items to my order so that I can purchase multiple products +- outcome: A customer adds items to an order so that they can purchase multiple products. diff --git a/specs/behavior/order-management/orders/cancel-order.examples/s-001-cancel-draft-order.sdp.md b/specs/behavior/order-management/orders/cancel-order.examples/s-001-cancel-draft-order.sdp.md deleted file mode 100644 index 8bebd473..00000000 --- a/specs/behavior/order-management/orders/cancel-order.examples/s-001-cancel-draft-order.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.orders.cancel-order.cancel-draft-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.cancel-order ---- -# Cancel draft order - -## Intent - -- outcome: Executable scenario: Cancel draft order - -```gwt -Given the system is ready -And an order "ord_cancel_001" exists with status "draft" -When I send a CancelOrder command for "ord_cancel_001" with reason "Changed my mind" -Then the command should succeed -And the order "ord_cancel_001" status should be "cancelled" -``` diff --git a/specs/behavior/order-management/orders/cancel-order.examples/s-002-cancel-submitted-order.sdp.md b/specs/behavior/order-management/orders/cancel-order.examples/s-002-cancel-submitted-order.sdp.md deleted file mode 100644 index eb02c684..00000000 --- a/specs/behavior/order-management/orders/cancel-order.examples/s-002-cancel-submitted-order.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.orders.cancel-order.cancel-submitted-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.cancel-order ---- -# Cancel submitted order - -## Intent - -- outcome: Executable scenario: Cancel submitted order - -```gwt -Given the system is ready -And an order "ord_cancel_002" exists with status "submitted" -When I send a CancelOrder command for "ord_cancel_002" with reason "Found better price" -Then the command should succeed -And the order "ord_cancel_002" status should be "cancelled" -``` diff --git a/specs/behavior/order-management/orders/cancel-order.examples/s-003-cannot-cancel-already-cancelled-order.sdp.md b/specs/behavior/order-management/orders/cancel-order.examples/s-003-cannot-cancel-already-cancelled-order.sdp.md deleted file mode 100644 index 95343ce9..00000000 --- a/specs/behavior/order-management/orders/cancel-order.examples/s-003-cannot-cancel-already-cancelled-order.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.cancel-order.cannot-cancel-already-cancelled-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.cancel-order ---- -# Cannot cancel already cancelled order - -## Intent - -- outcome: Executable scenario: Cannot cancel already cancelled order - -```gwt -Given the system is ready -And an order "ord_cancel_003" exists with status "cancelled" -When I send a CancelOrder command for "ord_cancel_003" with reason "Double cancel" -Then the command should be rejected with code "ORDER_ALREADY_CANCELLED" -``` diff --git a/specs/behavior/order-management/orders/cancel-order.examples/s-004-cancel-confirmed-order.sdp.md b/specs/behavior/order-management/orders/cancel-order.examples/s-004-cancel-confirmed-order.sdp.md deleted file mode 100644 index 2aec2461..00000000 --- a/specs/behavior/order-management/orders/cancel-order.examples/s-004-cancel-confirmed-order.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.orders.cancel-order.cancel-confirmed-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.cancel-order ---- -# Cancel confirmed order - -## Intent - -- outcome: Executable scenario: Cancel confirmed order - -```gwt -Given the system is ready -And an order "ord_cancel_004" exists with status "confirmed" -When I send a CancelOrder command for "ord_cancel_004" with reason "Changed mind after confirmation" -Then the command should succeed -And the order "ord_cancel_004" status should be "cancelled" -``` diff --git a/specs/behavior/order-management/orders/cancel-order.examples/s-005-cannot-cancel-non-existent-order.sdp.md b/specs/behavior/order-management/orders/cancel-order.examples/s-005-cannot-cancel-non-existent-order.sdp.md deleted file mode 100644 index bfdafd71..00000000 --- a/specs/behavior/order-management/orders/cancel-order.examples/s-005-cannot-cancel-non-existent-order.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.cancel-order.cannot-cancel-non-existent-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.cancel-order ---- -# Cannot cancel non-existent order - -## Intent - -- outcome: Executable scenario: Cannot cancel non-existent order - -```gwt -Given the system is ready -And no order exists with ID "ord_cancel_nonexistent" -When I send a CancelOrder command for "ord_cancel_nonexistent" with reason "Test" -Then the command should be rejected with code "ORDER_NOT_FOUND" -``` diff --git a/specs/behavior/order-management/orders/cancel-order.examples/s-006-cancel-order-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/orders/cancel-order.examples/s-006-cancel-order-is-idempotent-with-same-command-id.sdp.md deleted file mode 100644 index 892e64c6..00000000 --- a/specs/behavior/order-management/orders/cancel-order.examples/s-006-cancel-order-is-idempotent-with-same-command-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.cancel-order.cancel-order-is-idempotent-with-same-command-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.cancel-order ---- -# CancelOrder is idempotent with same commandId - -## Intent - -- outcome: Executable scenario: CancelOrder is idempotent with same commandId - -```gwt -Given the system is ready -And an order "ord_cancel_005" exists with status "draft" -When I send a CancelOrder command twice with the same commandId for "ord_cancel_005" -Then the order should only be cancelled once -``` diff --git a/specs/behavior/order-management/orders/cancel-order.sdp.md b/specs/behavior/order-management/orders/cancel-order.sdp.md index 38038678..8e21e99e 100644 --- a/specs/behavior/order-management/orders/cancel-order.sdp.md +++ b/specs/behavior/order-management/orders/cancel-order.sdp.md @@ -11,4 +11,4 @@ relations: ## Intent - actor: a customer -- outcome: to cancel my order so that I don't have to complete the purchase +- outcome: A customer cancels an order so that they do not have to complete the purchase. diff --git a/specs/behavior/order-management/orders/confirm-order.examples/s-001-successfully-confirm-a-submitted-order.sdp.md b/specs/behavior/order-management/orders/confirm-order.examples/s-001-successfully-confirm-a-submitted-order.sdp.md deleted file mode 100644 index 9818c10e..00000000 --- a/specs/behavior/order-management/orders/confirm-order.examples/s-001-successfully-confirm-a-submitted-order.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.orders.confirm-order.successfully-confirm-a-submitted-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.confirm-order ---- -# Successfully confirm a submitted order - -## Intent - -- outcome: Executable scenario: Successfully confirm a submitted order - -```gwt -Given the system is ready -And an order "ord_confirm_001" exists with status "submitted" -When I send a ConfirmOrder command for "ord_confirm_001" -Then the command should succeed -And the order "ord_confirm_001" status should be "confirmed" -``` diff --git a/specs/behavior/order-management/orders/confirm-order.examples/s-002-cannot-confirm-a-draft-order.sdp.md b/specs/behavior/order-management/orders/confirm-order.examples/s-002-cannot-confirm-a-draft-order.sdp.md deleted file mode 100644 index e7c9e5d7..00000000 --- a/specs/behavior/order-management/orders/confirm-order.examples/s-002-cannot-confirm-a-draft-order.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.orders.confirm-order.cannot-confirm-a-draft-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.confirm-order ---- -# Cannot confirm a draft order - -## Intent - -- outcome: Executable scenario: Cannot confirm a draft order - -```gwt -Given the system is ready -And an order "ord_confirm_002" exists with status "draft" -When I send a ConfirmOrder command for "ord_confirm_002" -Then the command should be rejected with code "ORDER_NOT_SUBMITTED" -And the order "ord_confirm_002" status should remain "draft" -``` diff --git a/specs/behavior/order-management/orders/confirm-order.examples/s-003-cannot-confirm-an-already-confirmed-order.sdp.md b/specs/behavior/order-management/orders/confirm-order.examples/s-003-cannot-confirm-an-already-confirmed-order.sdp.md deleted file mode 100644 index 79c2a1c6..00000000 --- a/specs/behavior/order-management/orders/confirm-order.examples/s-003-cannot-confirm-an-already-confirmed-order.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.confirm-order.cannot-confirm-an-already-confirmed-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.confirm-order ---- -# Cannot confirm an already confirmed order - -## Intent - -- outcome: Executable scenario: Cannot confirm an already confirmed order - -```gwt -Given the system is ready -And an order "ord_confirm_003" exists with status "confirmed" -When I send a ConfirmOrder command for "ord_confirm_003" -Then the command should be rejected with code "ORDER_NOT_SUBMITTED" -``` diff --git a/specs/behavior/order-management/orders/confirm-order.examples/s-004-cannot-confirm-a-cancelled-order.sdp.md b/specs/behavior/order-management/orders/confirm-order.examples/s-004-cannot-confirm-a-cancelled-order.sdp.md deleted file mode 100644 index 0280def9..00000000 --- a/specs/behavior/order-management/orders/confirm-order.examples/s-004-cannot-confirm-a-cancelled-order.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.confirm-order.cannot-confirm-a-cancelled-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.confirm-order ---- -# Cannot confirm a cancelled order - -## Intent - -- outcome: Executable scenario: Cannot confirm a cancelled order - -```gwt -Given the system is ready -And an order "ord_confirm_004" exists with status "cancelled" -When I send a ConfirmOrder command for "ord_confirm_004" -Then the command should be rejected with code "ORDER_NOT_SUBMITTED" -``` diff --git a/specs/behavior/order-management/orders/confirm-order.examples/s-005-cannot-confirm-a-non-existent-order.sdp.md b/specs/behavior/order-management/orders/confirm-order.examples/s-005-cannot-confirm-a-non-existent-order.sdp.md deleted file mode 100644 index 626846f3..00000000 --- a/specs/behavior/order-management/orders/confirm-order.examples/s-005-cannot-confirm-a-non-existent-order.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.confirm-order.cannot-confirm-a-non-existent-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.confirm-order ---- -# Cannot confirm a non-existent order - -## Intent - -- outcome: Executable scenario: Cannot confirm a non-existent order - -```gwt -Given the system is ready -And no order exists with ID "ord_nonexistent_001" -When I send a ConfirmOrder command for "ord_nonexistent_001" -Then the command should be rejected with code "ORDER_NOT_FOUND" -``` diff --git a/specs/behavior/order-management/orders/confirm-order.examples/s-006-confirm-order-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/orders/confirm-order.examples/s-006-confirm-order-is-idempotent-with-same-command-id.sdp.md deleted file mode 100644 index e32a7630..00000000 --- a/specs/behavior/order-management/orders/confirm-order.examples/s-006-confirm-order-is-idempotent-with-same-command-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.confirm-order.confirm-order-is-idempotent-with-same-command-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.confirm-order ---- -# ConfirmOrder is idempotent with same commandId - -## Intent - -- outcome: Executable scenario: ConfirmOrder is idempotent with same commandId - -```gwt -Given the system is ready -And an order "ord_confirm_005" exists with status "submitted" -When I send a ConfirmOrder command twice with the same commandId for "ord_confirm_005" -Then the order should only be confirmed once -``` diff --git a/specs/behavior/order-management/orders/confirm-order.sdp.md b/specs/behavior/order-management/orders/confirm-order.sdp.md index b8431ad8..85d10798 100644 --- a/specs/behavior/order-management/orders/confirm-order.sdp.md +++ b/specs/behavior/order-management/orders/confirm-order.sdp.md @@ -11,4 +11,4 @@ relations: ## Intent - actor: a system administrator -- outcome: to confirm submitted orders so that they can be marked as confirmed +- outcome: A system administrator confirms submitted orders so that they can be marked as confirmed. diff --git a/specs/behavior/order-management/orders/create-order.examples/s-001-successfully-create-a-new-order.sdp.md b/specs/behavior/order-management/orders/create-order.examples/s-001-successfully-create-a-new-order.sdp.md deleted file mode 100644 index 6d71c78d..00000000 --- a/specs/behavior/order-management/orders/create-order.examples/s-001-successfully-create-a-new-order.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.create-order.successfully-create-a-new-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.create-order ---- -# Successfully create a new order - -## Intent - -- outcome: Executable scenario: Successfully create a new order - -```gwt -Given the system is ready -And no order exists with ID "ord_test_001" -When I send a CreateOrder command with: -Then the command should succeed -``` diff --git a/specs/behavior/order-management/orders/create-order.examples/s-002-cannot-create-order-with-existing-id.sdp.md b/specs/behavior/order-management/orders/create-order.examples/s-002-cannot-create-order-with-existing-id.sdp.md deleted file mode 100644 index d8dc08e2..00000000 --- a/specs/behavior/order-management/orders/create-order.examples/s-002-cannot-create-order-with-existing-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.create-order.cannot-create-order-with-existing-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.create-order ---- -# Cannot create order with existing ID - -## Intent - -- outcome: Executable scenario: Cannot create order with existing ID - -```gwt -Given the system is ready -And an order "ord_test_002" already exists -When I send a CreateOrder command with: -Then the command should be rejected with code "ORDER_ALREADY_EXISTS" -``` diff --git a/specs/behavior/order-management/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md deleted file mode 100644 index 689701e1..00000000 --- a/specs/behavior/order-management/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.create-order.create-order-is-idempotent-with-same-command-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.create-order ---- -# CreateOrder is idempotent with same commandId - -## Intent - -- outcome: Executable scenario: CreateOrder is idempotent with same commandId - -```gwt -Given the backend is running and clean -When I create an order with commandId "cmd-idem-01": and I repeat creating an order with commandId "cmd-idem-01": -Then the second command should return duplicate status -``` diff --git a/specs/behavior/order-management/orders/create-order.sdp.md b/specs/behavior/order-management/orders/create-order.sdp.md index 6413594a..c519db33 100644 --- a/specs/behavior/order-management/orders/create-order.sdp.md +++ b/specs/behavior/order-management/orders/create-order.sdp.md @@ -11,4 +11,4 @@ relations: ## Intent - actor: a customer -- outcome: to create a new order so that I can add items and submit it later +- outcome: A customer creates a new order so that they can add items and submit it later. diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-001-empty-items-array-returns-zero.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-001-empty-items-array-returns-zero.sdp.md deleted file mode 100644 index 8198abef..00000000 --- a/specs/behavior/order-management/orders/order-domain.examples/s-001-empty-items-array-returns-zero.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-domain.empty-items-array-returns-zero -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-domain ---- -# Empty items array returns zero - -## Intent - -- outcome: Executable scenario: Empty items array returns zero - -```gwt -Given an empty items array -When I calculate the total amount -Then the total amount is 0 -``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-002-single-item-total.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-002-single-item-total.sdp.md deleted file mode 100644 index 1f1d7120..00000000 --- a/specs/behavior/order-management/orders/order-domain.examples/s-002-single-item-total.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-domain.single-item-total -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-domain ---- -# Single item total - -## Intent - -- outcome: Executable scenario: Single item total - -```gwt -Given an items array with: -When I calculate the total amount -Then the total amount is 21 -``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-003-multiple-items-total.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-003-multiple-items-total.sdp.md deleted file mode 100644 index 4b105f07..00000000 --- a/specs/behavior/order-management/orders/order-domain.examples/s-003-multiple-items-total.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-domain.multiple-items-total -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-domain ---- -# Multiple items total - -## Intent - -- outcome: Executable scenario: Multiple items total - -```gwt -Given an items array with: -When I calculate the total amount -Then the total amount is 70 -``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-004-zero-quantity-results-in-zero-contribution.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-004-zero-quantity-results-in-zero-contribution.sdp.md deleted file mode 100644 index 2fb59862..00000000 --- a/specs/behavior/order-management/orders/order-domain.examples/s-004-zero-quantity-results-in-zero-contribution.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-domain.zero-quantity-results-in-zero-contribution -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-domain ---- -# Zero quantity results in zero contribution - -## Intent - -- outcome: Executable scenario: Zero quantity results in zero contribution - -```gwt -Given an items array with: -When I calculate the total amount -Then the total amount is 0 -``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-005-zero-price-results-in-zero-contribution.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-005-zero-price-results-in-zero-contribution.sdp.md deleted file mode 100644 index 3b5f5db8..00000000 --- a/specs/behavior/order-management/orders/order-domain.examples/s-005-zero-price-results-in-zero-contribution.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-domain.zero-price-results-in-zero-contribution -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-domain ---- -# Zero price results in zero contribution - -## Intent - -- outcome: Executable scenario: Zero price results in zero contribution - -```gwt -Given an items array with: -When I calculate the total amount -Then the total amount is 0 -``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-006-decimal-prices-are-handled-correctly.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-006-decimal-prices-are-handled-correctly.sdp.md deleted file mode 100644 index 68c22694..00000000 --- a/specs/behavior/order-management/orders/order-domain.examples/s-006-decimal-prices-are-handled-correctly.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-domain.decimal-prices-are-handled-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-domain ---- -# Decimal prices are handled correctly - -## Intent - -- outcome: Executable scenario: Decimal prices are handled correctly - -```gwt -Given an items array with: -When I calculate the total amount -Then the total amount is approximately 29.97 -``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-007-cms-is-created-with-the-provided-order-id-and-customer-id.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-007-cms-is-created-with-the-provided-order-id-and-customer-id.sdp.md deleted file mode 100644 index f3351a3e..00000000 --- a/specs/behavior/order-management/orders/order-domain.examples/s-007-cms-is-created-with-the-provided-order-id-and-customer-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-domain.cms-is-created-with-the-provided-order-id-and-customer-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-domain ---- -# CMS is created with the provided orderId and customerId - -## Intent - -- outcome: Executable scenario: CMS is created with the provided orderId and customerId - -```gwt -Given I create an initial order CMS with orderId "ord_123" and customerId "cust_456" -When the scenario runs -Then the CMS has the following field values: -``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-008-cms-initializes-with-draft-status.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-008-cms-initializes-with-draft-status.sdp.md deleted file mode 100644 index 6762448b..00000000 --- a/specs/behavior/order-management/orders/order-domain.examples/s-008-cms-initializes-with-draft-status.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-domain.cms-initializes-with-draft-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-domain ---- -# CMS initializes with draft status - -## Intent - -- outcome: Executable scenario: CMS initializes with draft status - -```gwt -Given I create an initial order CMS with orderId "ord_123" and customerId "cust_456" -When the scenario runs -Then the CMS status is "draft" -``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-009-cms-initializes-with-empty-items-array.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-009-cms-initializes-with-empty-items-array.sdp.md deleted file mode 100644 index 54d3fdc6..00000000 --- a/specs/behavior/order-management/orders/order-domain.examples/s-009-cms-initializes-with-empty-items-array.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-domain.cms-initializes-with-empty-items-array -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-domain ---- -# CMS initializes with empty items array - -## Intent - -- outcome: Executable scenario: CMS initializes with empty items array - -```gwt -Given I create an initial order CMS with orderId "ord_123" and customerId "cust_456" -When the scenario runs -Then the CMS items array is empty -``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-010-cms-initializes-with-zero-total-amount.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-010-cms-initializes-with-zero-total-amount.sdp.md deleted file mode 100644 index 02bc065d..00000000 --- a/specs/behavior/order-management/orders/order-domain.examples/s-010-cms-initializes-with-zero-total-amount.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-domain.cms-initializes-with-zero-total-amount -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-domain ---- -# CMS initializes with zero totalAmount - -## Intent - -- outcome: Executable scenario: CMS initializes with zero totalAmount - -```gwt -Given I create an initial order CMS with orderId "ord_123" and customerId "cust_456" -When the scenario runs -Then the CMS totalAmount is 0 -``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-011-cms-initializes-with-version-0.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-011-cms-initializes-with-version-0.sdp.md deleted file mode 100644 index 69898011..00000000 --- a/specs/behavior/order-management/orders/order-domain.examples/s-011-cms-initializes-with-version-0.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-domain.cms-initializes-with-version-0 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-domain ---- -# CMS initializes with version 0 - -## Intent - -- outcome: Executable scenario: CMS initializes with version 0 - -```gwt -Given I create an initial order CMS with orderId "ord_123" and customerId "cust_456" -When the scenario runs -Then the CMS version is 0 -``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-012-cms-initializes-with-current-state-version.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-012-cms-initializes-with-current-state-version.sdp.md deleted file mode 100644 index 3eccd5b0..00000000 --- a/specs/behavior/order-management/orders/order-domain.examples/s-012-cms-initializes-with-current-state-version.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-domain.cms-initializes-with-current-state-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-domain ---- -# CMS initializes with current state version - -## Intent - -- outcome: Executable scenario: CMS initializes with current state version - -```gwt -Given I create an initial order CMS with orderId "ord_123" and customerId "cust_456" -When the scenario runs -Then the CMS stateVersion equals CURRENT_ORDER_CMS_VERSION -``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-013-cms-sets-created-at-and-updated-at-to-current-timestamp.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-013-cms-sets-created-at-and-updated-at-to-current-timestamp.sdp.md deleted file mode 100644 index 9cc4e2c1..00000000 --- a/specs/behavior/order-management/orders/order-domain.examples/s-013-cms-sets-created-at-and-updated-at-to-current-timestamp.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-domain.cms-sets-created-at-and-updated-at-to-current-timestamp -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-domain ---- -# CMS sets createdAt and updatedAt to current timestamp - -## Intent - -- outcome: Executable scenario: CMS sets createdAt and updatedAt to current timestamp - -```gwt -Given a timestamp is captured before creation -And I create an initial order CMS with orderId "ord_123" and customerId "cust_456" -When the scenario runs -Then the CMS createdAt is between the before and after timestamps -And the CMS updatedAt equals createdAt -``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-014-cms-already-at-current-version-is-returned-unchanged.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-014-cms-already-at-current-version-is-returned-unchanged.sdp.md deleted file mode 100644 index f9466fd2..00000000 --- a/specs/behavior/order-management/orders/order-domain.examples/s-014-cms-already-at-current-version-is-returned-unchanged.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-domain.cms-already-at-current-version-is-returned-unchanged -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-domain ---- -# CMS already at current version is returned unchanged - -## Intent - -- outcome: Executable scenario: CMS already at current version is returned unchanged - -```gwt -Given an OrderCMS at the current stateVersion with: -When I upcast the OrderCMS -Then the result equals the original CMS -And the result stateVersion equals CURRENT_ORDER_CMS_VERSION -``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-015-cms-with-missing-state-version-is-upgraded.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-015-cms-with-missing-state-version-is-upgraded.sdp.md deleted file mode 100644 index 30cba36d..00000000 --- a/specs/behavior/order-management/orders/order-domain.examples/s-015-cms-with-missing-state-version-is-upgraded.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-domain.cms-with-missing-state-version-is-upgraded -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-domain ---- -# CMS with missing stateVersion is upgraded - -## Intent - -- outcome: Executable scenario: CMS with missing stateVersion is upgraded - -```gwt -Given an OrderCMS without stateVersion and with: -When I upcast the OrderCMS -Then the result stateVersion equals CURRENT_ORDER_CMS_VERSION -And the result preserves the original field values -``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-016-cms-with-state-version-0-is-upgraded.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-016-cms-with-state-version-0-is-upgraded.sdp.md deleted file mode 100644 index 4d144f7a..00000000 --- a/specs/behavior/order-management/orders/order-domain.examples/s-016-cms-with-state-version-0-is-upgraded.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-domain.cms-with-state-version-0-is-upgraded -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-domain ---- -# CMS with stateVersion 0 is upgraded - -## Intent - -- outcome: Executable scenario: CMS with stateVersion 0 is upgraded - -```gwt -Given an OrderCMS at stateVersion 0 with: -And the CMS has 1 item -When I upcast the OrderCMS -Then the result stateVersion equals CURRENT_ORDER_CMS_VERSION -And the result status is "submitted" -And the result has 1 item -And the result totalAmount is 10 -``` diff --git a/specs/behavior/order-management/orders/order-domain.examples/s-017-all-fields-are-preserved-during-upcast.sdp.md b/specs/behavior/order-management/orders/order-domain.examples/s-017-all-fields-are-preserved-during-upcast.sdp.md deleted file mode 100644 index 42d435a0..00000000 --- a/specs/behavior/order-management/orders/order-domain.examples/s-017-all-fields-are-preserved-during-upcast.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-domain.all-fields-are-preserved-during-upcast -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-domain ---- -# All fields are preserved during upcast - -## Intent - -- outcome: Executable scenario: All fields are preserved during upcast - -```gwt -Given an OrderCMS at stateVersion 0 with: -And the CMS has items: -When I upcast the OrderCMS -Then the upcast result preserves all fields: -And the result items match the original items -``` diff --git a/specs/behavior/order-management/orders/order-domain.sdp.md b/specs/behavior/order-management/orders/order-domain.sdp.md index 1d80c9a2..9b5a052c 100644 --- a/specs/behavior/order-management/orders/order-domain.sdp.md +++ b/specs/behavior/order-management/orders/order-domain.sdp.md @@ -11,7 +11,7 @@ relations: ## Intent - actor: a developer working with the Order aggregate -- outcome: pure domain functions for order calculations, initialization, and upcasting so that order state is computed correctly without side effects +- outcome: Pure domain functions compute order totals, initialize CMS, and upcast state without side effects. ## Behavior diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-001-check-all-returns-true-for-draft-order-with-items.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-001-check-all-returns-true-for-draft-order-with-items.sdp.md deleted file mode 100644 index 7dc44b09..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-001-check-all-returns-true-for-draft-order-with-items.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.check-all-returns-true-for-draft-order-with-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# checkAll returns true for draft order with items - -## Intent - -- outcome: Executable scenario: checkAll returns true for draft order with items - -```gwt -Given a draft order with items -When I call orderSubmitInvariants.checkAll() -Then the checkAll result is true -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-002-check-all-returns-false-for-non-draft-order-with-items.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-002-check-all-returns-false-for-non-draft-order-with-items.sdp.md deleted file mode 100644 index 284d9648..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-002-check-all-returns-false-for-non-draft-order-with-items.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.check-all-returns-false-for-non-draft-order-with-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# checkAll returns false for non-draft order with items - -## Intent - -- outcome: Executable scenario: checkAll returns false for non-draft order with items - -```gwt -Given a submitted order with items -When I call orderSubmitInvariants.checkAll() -Then the checkAll result is false -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-003-check-all-returns-false-for-draft-order-without-items.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-003-check-all-returns-false-for-draft-order-without-items.sdp.md deleted file mode 100644 index 815166e6..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-003-check-all-returns-false-for-draft-order-without-items.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.check-all-returns-false-for-draft-order-without-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# checkAll returns false for draft order without items - -## Intent - -- outcome: Executable scenario: checkAll returns false for draft order without items - -```gwt -Given a draft order with no items -When I call orderSubmitInvariants.checkAll() -Then the checkAll result is false -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-004-assert-all-does-not-throw-for-valid-draft-order-with-items.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-004-assert-all-does-not-throw-for-valid-draft-order-with-items.sdp.md deleted file mode 100644 index ad451de9..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-004-assert-all-does-not-throw-for-valid-draft-order-with-items.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.assert-all-does-not-throw-for-valid-draft-order-with-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# assertAll does not throw for valid draft order with items - -## Intent - -- outcome: Executable scenario: assertAll does not throw for valid draft order with items - -```gwt -Given a draft order with items -When I call orderSubmitInvariants.assertAll() -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-005-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-005-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md deleted file mode 100644 index 5d6f5cad..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-005-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# assertAll throws ORDER_NOT_IN_DRAFT for submitted order (fail-fast) - -## Intent - -- outcome: Executable scenario: assertAll throws ORDER_NOT_IN_DRAFT for submitted order (fail-fast) - -```gwt -Given a submitted order with items -When I call orderSubmitInvariants.assertAll() -Then an OrderInvariantError is thrown with code "ORDER_NOT_IN_DRAFT" -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-006-assert-all-throws-order-has-no-items-for-draft-order-with-no-items.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-006-assert-all-throws-order-has-no-items-for-draft-order-with-no-items.sdp.md deleted file mode 100644 index 0fda2223..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-006-assert-all-throws-order-has-no-items-for-draft-order-with-no-items.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.assert-all-throws-order-has-no-items-for-draft-order-with-no-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# assertAll throws ORDER_HAS_NO_ITEMS for draft order with no items - -## Intent - -- outcome: Executable scenario: assertAll throws ORDER_HAS_NO_ITEMS for draft order with no items - -```gwt -Given a draft order with no items -When I call orderSubmitInvariants.assertAll() -Then an OrderInvariantError is thrown with code "ORDER_HAS_NO_ITEMS" -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-007-validate-all-returns-valid-result-for-draft-order-with-items.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-007-validate-all-returns-valid-result-for-draft-order-with-items.sdp.md deleted file mode 100644 index 1366b48f..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-007-validate-all-returns-valid-result-for-draft-order-with-items.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.validate-all-returns-valid-result-for-draft-order-with-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# validateAll returns valid result for draft order with items - -## Intent - -- outcome: Executable scenario: validateAll returns valid result for draft order with items - -```gwt -Given a draft order with items -When I call orderSubmitInvariants.validateAll() -Then the validation result is valid -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-008-validate-all-returns-both-violations-for-submitted-order-with-no-items.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-008-validate-all-returns-both-violations-for-submitted-order-with-no-items.sdp.md deleted file mode 100644 index e72f2728..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-008-validate-all-returns-both-violations-for-submitted-order-with-no-items.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.validate-all-returns-both-violations-for-submitted-order-with-no-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# validateAll returns both violations for submitted order with no items - -## Intent - -- outcome: Executable scenario: validateAll returns both violations for submitted order with no items - -```gwt -Given a submitted order with no items -When I call orderSubmitInvariants.validateAll() -Then the validation result is invalid with 2 violations -And the violation codes include: -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-009-check-all-returns-true-for-draft-order-under-item-limit.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-009-check-all-returns-true-for-draft-order-under-item-limit.sdp.md deleted file mode 100644 index 8b73d11d..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-009-check-all-returns-true-for-draft-order-under-item-limit.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.check-all-returns-true-for-draft-order-under-item-limit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# checkAll returns true for draft order under item limit - -## Intent - -- outcome: Executable scenario: checkAll returns true for draft order under item limit - -```gwt -Given a draft order with items -When I call orderAddItemInvariants.checkAll() -Then the checkAll result is true -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-010-check-all-returns-false-for-non-draft-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-010-check-all-returns-false-for-non-draft-order.sdp.md deleted file mode 100644 index 8e2ae219..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-010-check-all-returns-false-for-non-draft-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.check-all-returns-false-for-non-draft-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# checkAll returns false for non-draft order - -## Intent - -- outcome: Executable scenario: checkAll returns false for non-draft order - -```gwt -Given a confirmed order with no items -When I call orderAddItemInvariants.checkAll() -Then the checkAll result is false -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-011-check-all-returns-false-for-draft-order-at-max-capacity.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-011-check-all-returns-false-for-draft-order-at-max-capacity.sdp.md deleted file mode 100644 index 349ace25..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-011-check-all-returns-false-for-draft-order-at-max-capacity.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.check-all-returns-false-for-draft-order-at-max-capacity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# checkAll returns false for draft order at max capacity - -## Intent - -- outcome: Executable scenario: checkAll returns false for draft order at max capacity - -```gwt -Given a draft order at max item capacity -When I call orderAddItemInvariants.checkAll() -Then the checkAll result is false -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-012-assert-all-does-not-throw-for-valid-draft-order-under-limit.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-012-assert-all-does-not-throw-for-valid-draft-order-under-limit.sdp.md deleted file mode 100644 index 1dac8f79..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-012-assert-all-does-not-throw-for-valid-draft-order-under-limit.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.assert-all-does-not-throw-for-valid-draft-order-under-limit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# assertAll does not throw for valid draft order under limit - -## Intent - -- outcome: Executable scenario: assertAll does not throw for valid draft order under limit - -```gwt -Given a draft order with no items -When I call orderAddItemInvariants.assertAll() -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-013-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-013-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md deleted file mode 100644 index dcd0dc5f..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-013-assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.assert-all-throws-order-not-in-draft-for-submitted-order-fail-fast-2 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# assertAll throws ORDER_NOT_IN_DRAFT for submitted order (fail-fast) - -## Intent - -- outcome: Executable scenario: assertAll throws ORDER_NOT_IN_DRAFT for submitted order (fail-fast) - -```gwt -Given a submitted order with no items -When I call orderAddItemInvariants.assertAll() -Then an OrderInvariantError is thrown with code "ORDER_NOT_IN_DRAFT" -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-014-assert-all-throws-max-items-exceeded-for-draft-order-at-capacity.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-014-assert-all-throws-max-items-exceeded-for-draft-order-at-capacity.sdp.md deleted file mode 100644 index 1e050698..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-014-assert-all-throws-max-items-exceeded-for-draft-order-at-capacity.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.assert-all-throws-max-items-exceeded-for-draft-order-at-capacity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# assertAll throws MAX_ITEMS_EXCEEDED for draft order at capacity - -## Intent - -- outcome: Executable scenario: assertAll throws MAX_ITEMS_EXCEEDED for draft order at capacity - -```gwt -Given a draft order at max item capacity -When I call orderAddItemInvariants.assertAll() -Then an OrderInvariantError is thrown with code "MAX_ITEMS_EXCEEDED" -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-015-validate-all-returns-valid-result-for-draft-order-under-limit.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-015-validate-all-returns-valid-result-for-draft-order-under-limit.sdp.md deleted file mode 100644 index 216ddb77..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-015-validate-all-returns-valid-result-for-draft-order-under-limit.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.validate-all-returns-valid-result-for-draft-order-under-limit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# validateAll returns valid result for draft order under limit - -## Intent - -- outcome: Executable scenario: validateAll returns valid result for draft order under limit - -```gwt -Given a draft order with no items -When I call orderAddItemInvariants.validateAll() -Then the validation result is valid -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-016-validate-all-returns-both-violations-for-submitted-order-at-capacity.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-016-validate-all-returns-both-violations-for-submitted-order-at-capacity.sdp.md deleted file mode 100644 index 03ac1555..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-016-validate-all-returns-both-violations-for-submitted-order-at-capacity.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.validate-all-returns-both-violations-for-submitted-order-at-capacity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# validateAll returns both violations for submitted order at capacity - -## Intent - -- outcome: Executable scenario: validateAll returns both violations for submitted order at capacity - -```gwt -Given a submitted order at max item capacity -When I call orderAddItemInvariants.validateAll() -Then the validation result is invalid with 2 violations -And the violation codes include: -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-017-check-all-returns-expected-for-status-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-017-check-all-returns-expected-for-status-order.sdp.md deleted file mode 100644 index f8ebe1c0..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-017-check-all-returns-expected-for-status-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.check-all-returns-expected-for-status-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# checkAll returns value for value order - -## Intent - -- outcome: Executable scenario: checkAll returns value for value order - -```gwt -Given an order in "value" status -When I call orderCancelInvariants.checkAll() -Then the checkAll result is value -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-018-assert-all-does-not-throw-for-draft-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-018-assert-all-does-not-throw-for-draft-order.sdp.md deleted file mode 100644 index 2b0fcfe2..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-018-assert-all-does-not-throw-for-draft-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.assert-all-does-not-throw-for-draft-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# assertAll does not throw for draft order - -## Intent - -- outcome: Executable scenario: assertAll does not throw for draft order - -```gwt -Given an order in "draft" status -When I call orderCancelInvariants.assertAll() -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-019-assert-all-does-not-throw-for-submitted-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-019-assert-all-does-not-throw-for-submitted-order.sdp.md deleted file mode 100644 index 43856926..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-019-assert-all-does-not-throw-for-submitted-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.assert-all-does-not-throw-for-submitted-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# assertAll does not throw for submitted order - -## Intent - -- outcome: Executable scenario: assertAll does not throw for submitted order - -```gwt -Given an order in "submitted" status -When I call orderCancelInvariants.assertAll() -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-020-assert-all-throws-order-already-confirmed-for-confirmed-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-020-assert-all-throws-order-already-confirmed-for-confirmed-order.sdp.md deleted file mode 100644 index 334d2c1c..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-020-assert-all-throws-order-already-confirmed-for-confirmed-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.assert-all-throws-order-already-confirmed-for-confirmed-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# assertAll throws ORDER_ALREADY_CONFIRMED for confirmed order - -## Intent - -- outcome: Executable scenario: assertAll throws ORDER_ALREADY_CONFIRMED for confirmed order - -```gwt -Given an order in "confirmed" status -When I call orderCancelInvariants.assertAll() -Then an OrderInvariantError is thrown with code "ORDER_ALREADY_CONFIRMED" -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-021-assert-all-throws-order-already-cancelled-for-cancelled-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-021-assert-all-throws-order-already-cancelled-for-cancelled-order.sdp.md deleted file mode 100644 index 2ce886e0..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-021-assert-all-throws-order-already-cancelled-for-cancelled-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.assert-all-throws-order-already-cancelled-for-cancelled-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# assertAll throws ORDER_ALREADY_CANCELLED for cancelled order - -## Intent - -- outcome: Executable scenario: assertAll throws ORDER_ALREADY_CANCELLED for cancelled order - -```gwt -Given an order in "cancelled" status -When I call orderCancelInvariants.assertAll() -Then an OrderInvariantError is thrown with code "ORDER_ALREADY_CANCELLED" -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-022-validate-all-returns-valid-result-for-draft-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-022-validate-all-returns-valid-result-for-draft-order.sdp.md deleted file mode 100644 index b968b1c7..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-022-validate-all-returns-valid-result-for-draft-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.validate-all-returns-valid-result-for-draft-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# validateAll returns valid result for draft order - -## Intent - -- outcome: Executable scenario: validateAll returns valid result for draft order - -```gwt -Given an order in "draft" status -When I call orderCancelInvariants.validateAll() -Then the validation result is valid -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-023-validate-all-returns-single-violation-for-confirmed-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-023-validate-all-returns-single-violation-for-confirmed-order.sdp.md deleted file mode 100644 index 0f360f89..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-023-validate-all-returns-single-violation-for-confirmed-order.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.validate-all-returns-single-violation-for-confirmed-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# validateAll returns single violation for confirmed order - -## Intent - -- outcome: Executable scenario: validateAll returns single violation for confirmed order - -```gwt -Given an order in "confirmed" status -When I call orderCancelInvariants.validateAll() -Then the validation result is invalid with 1 violation -And the violation codes include: -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-024-validate-all-returns-single-violation-for-cancelled-order.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.examples/s-024-validate-all-returns-single-violation-for-cancelled-order.sdp.md deleted file mode 100644 index f8462583..00000000 --- a/specs/behavior/order-management/orders/order-invariant-sets.examples/s-024-validate-all-returns-single-violation-for-cancelled-order.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariant-sets.validate-all-returns-single-violation-for-cancelled-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariant-sets ---- -# validateAll returns single violation for cancelled order - -## Intent - -- outcome: Executable scenario: validateAll returns single violation for cancelled order - -```gwt -Given an order in "cancelled" status -When I call orderCancelInvariants.validateAll() -Then the validation result is invalid with 1 violation -And the violation codes include: -``` diff --git a/specs/behavior/order-management/orders/order-invariant-sets.sdp.md b/specs/behavior/order-management/orders/order-invariant-sets.sdp.md index 2b7496d8..a51f05a2 100644 --- a/specs/behavior/order-management/orders/order-invariant-sets.sdp.md +++ b/specs/behavior/order-management/orders/order-invariant-sets.sdp.md @@ -11,7 +11,7 @@ relations: ## Intent - actor: a developer working with composed invariant sets -- outcome: checkAll, assertAll, and validateAll to enforce multiple invariants together so that command handlers get comprehensive validation with fail-fast or collect-all semantics +- outcome: checkAll, assertAll, and validateAll enforce multiple invariants together so command handlers get fail-fast or collect-all validation. ## Behavior diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-001-passes-for-a-valid-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-001-passes-for-a-valid-order.sdp.md deleted file mode 100644 index fa27908b..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-001-passes-for-a-valid-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.passes-for-a-valid-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# passes for a valid order - -## Intent - -- outcome: Executable scenario: passes for a valid order - -```gwt -Given a valid order -When I call assertOrderExists -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-002-throws-order-not-found-for-null-order-reference.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-002-throws-order-not-found-for-null-order-reference.sdp.md deleted file mode 100644 index 215d662a..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-002-throws-order-not-found-for-null-order-reference.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.throws-order-not-found-for-null-order-reference -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# throws ORDER_NOT_FOUND for null order reference - -## Intent - -- outcome: Executable scenario: throws ORDER_NOT_FOUND for null order reference - -```gwt -Given a null order reference -When I call assertOrderExists -Then an OrderInvariantError is thrown with code "ORDER_NOT_FOUND" -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-003-throws-order-not-found-for-undefined-order-reference.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-003-throws-order-not-found-for-undefined-order-reference.sdp.md deleted file mode 100644 index 25791188..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-003-throws-order-not-found-for-undefined-order-reference.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.throws-order-not-found-for-undefined-order-reference -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# throws ORDER_NOT_FOUND for undefined order reference - -## Intent - -- outcome: Executable scenario: throws ORDER_NOT_FOUND for undefined order reference - -```gwt -Given an undefined order reference -When I call assertOrderExists -Then an OrderInvariantError is thrown with code "ORDER_NOT_FOUND" -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-004-passes-for-null-order-reference.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-004-passes-for-null-order-reference.sdp.md deleted file mode 100644 index d154a87b..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-004-passes-for-null-order-reference.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.passes-for-null-order-reference -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# passes for null order reference - -## Intent - -- outcome: Executable scenario: passes for null order reference - -```gwt -Given a null order reference -When I call assertOrderDoesNotExist -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-005-passes-for-undefined-order-reference.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-005-passes-for-undefined-order-reference.sdp.md deleted file mode 100644 index 529964ad..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-005-passes-for-undefined-order-reference.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.passes-for-undefined-order-reference -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# passes for undefined order reference - -## Intent - -- outcome: Executable scenario: passes for undefined order reference - -```gwt -Given an undefined order reference -When I call assertOrderDoesNotExist -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-006-throws-order-already-exists-for-existing-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-006-throws-order-already-exists-for-existing-order.sdp.md deleted file mode 100644 index ca5d3227..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-006-throws-order-already-exists-for-existing-order.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.throws-order-already-exists-for-existing-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# throws ORDER_ALREADY_EXISTS for existing order - -## Intent - -- outcome: Executable scenario: throws ORDER_ALREADY_EXISTS for existing order - -```gwt -Given an existing order with orderId "ord_existing" -When I call assertOrderDoesNotExist -Then an OrderInvariantError is thrown with code "ORDER_ALREADY_EXISTS" -And the error context contains orderId "ord_existing" -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-007-check-returns-true-for-draft-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-007-check-returns-true-for-draft-order.sdp.md deleted file mode 100644 index 76b74084..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-007-check-returns-true-for-draft-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.check-returns-true-for-draft-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# check returns true for draft order - -## Intent - -- outcome: Executable scenario: check returns true for draft order - -```gwt -Given an order in "draft" status -When I call orderIsDraft.check() -Then the result is true -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-008-check-returns-false-for-submitted-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-008-check-returns-false-for-submitted-order.sdp.md deleted file mode 100644 index 465d34d2..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-008-check-returns-false-for-submitted-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.check-returns-false-for-submitted-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# check returns false for submitted order - -## Intent - -- outcome: Executable scenario: check returns false for submitted order - -```gwt -Given an order in "submitted" status -When I call orderIsDraft.check() -Then the result is false -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-009-assert-passes-for-draft-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-009-assert-passes-for-draft-order.sdp.md deleted file mode 100644 index a25ef99a..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-009-assert-passes-for-draft-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.assert-passes-for-draft-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# assert passes for draft order - -## Intent - -- outcome: Executable scenario: assert passes for draft order - -```gwt -Given an order in "draft" status -When I call orderIsDraft.assert() -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-010-assert-throws-order-not-in-draft-for-non-draft-statuses.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-010-assert-throws-order-not-in-draft-for-non-draft-statuses.sdp.md deleted file mode 100644 index a1f7adb1..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-010-assert-throws-order-not-in-draft-for-non-draft-statuses.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.assert-throws-order-not-in-draft-for-non-draft-statuses -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# assert throws ORDER_NOT_IN_DRAFT for non-draft statuses - -## Intent - -- outcome: Executable scenario: assert throws ORDER_NOT_IN_DRAFT for non-draft statuses - -```gwt -Given an order in "value" status -When I call orderIsDraft.assert() -Then an OrderInvariantError is thrown with code "ORDER_NOT_IN_DRAFT" -And the error context contains currentStatus "value" -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-011-check-returns-true-for-submitted-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-011-check-returns-true-for-submitted-order.sdp.md deleted file mode 100644 index ef2f931e..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-011-check-returns-true-for-submitted-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.check-returns-true-for-submitted-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# check returns true for submitted order - -## Intent - -- outcome: Executable scenario: check returns true for submitted order - -```gwt -Given an order in "submitted" status -When I call orderIsSubmitted.check() -Then the result is true -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-012-check-returns-false-for-draft-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-012-check-returns-false-for-draft-order.sdp.md deleted file mode 100644 index 4486db39..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-012-check-returns-false-for-draft-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.check-returns-false-for-draft-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# check returns false for draft order - -## Intent - -- outcome: Executable scenario: check returns false for draft order - -```gwt -Given an order in "draft" status -When I call orderIsSubmitted.check() -Then the result is false -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-013-assert-passes-for-submitted-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-013-assert-passes-for-submitted-order.sdp.md deleted file mode 100644 index 883e5498..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-013-assert-passes-for-submitted-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.assert-passes-for-submitted-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# assert passes for submitted order - -## Intent - -- outcome: Executable scenario: assert passes for submitted order - -```gwt -Given an order in "submitted" status -When I call orderIsSubmitted.assert() -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-014-assert-throws-order-not-submitted-for-non-submitted-statuses.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-014-assert-throws-order-not-submitted-for-non-submitted-statuses.sdp.md deleted file mode 100644 index b49da75b..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-014-assert-throws-order-not-submitted-for-non-submitted-statuses.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.assert-throws-order-not-submitted-for-non-submitted-statuses -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# assert throws ORDER_NOT_SUBMITTED for non-submitted statuses - -## Intent - -- outcome: Executable scenario: assert throws ORDER_NOT_SUBMITTED for non-submitted statuses - -```gwt -Given an order in "value" status -When I call orderIsSubmitted.assert() -Then an OrderInvariantError is thrown with code "ORDER_NOT_SUBMITTED" -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-015-check-returns-true-for-draft-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-015-check-returns-true-for-draft-order.sdp.md deleted file mode 100644 index 93e22e06..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-015-check-returns-true-for-draft-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.check-returns-true-for-draft-order-2 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# check returns true for draft order - -## Intent - -- outcome: Executable scenario: check returns true for draft order - -```gwt -Given an order in "draft" status -When I call orderNotCancelled.check() -Then the result is true -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-016-check-returns-true-for-submitted-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-016-check-returns-true-for-submitted-order.sdp.md deleted file mode 100644 index 60ff5c31..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-016-check-returns-true-for-submitted-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.check-returns-true-for-submitted-order-2 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# check returns true for submitted order - -## Intent - -- outcome: Executable scenario: check returns true for submitted order - -```gwt -Given an order in "submitted" status -When I call orderNotCancelled.check() -Then the result is true -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-017-check-returns-false-for-cancelled-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-017-check-returns-false-for-cancelled-order.sdp.md deleted file mode 100644 index 33386bd4..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-017-check-returns-false-for-cancelled-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.check-returns-false-for-cancelled-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# check returns false for cancelled order - -## Intent - -- outcome: Executable scenario: check returns false for cancelled order - -```gwt -Given an order in "cancelled" status -When I call orderNotCancelled.check() -Then the result is false -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-018-assert-passes-for-draft-order-not-cancelled.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-018-assert-passes-for-draft-order-not-cancelled.sdp.md deleted file mode 100644 index dc504610..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-018-assert-passes-for-draft-order-not-cancelled.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.assert-passes-for-draft-order-not-cancelled -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# assert passes for draft order (not cancelled) - -## Intent - -- outcome: Executable scenario: assert passes for draft order (not cancelled) - -```gwt -Given an order in "draft" status -When I call orderNotCancelled.assert() -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-019-assert-passes-for-confirmed-order-not-cancelled.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-019-assert-passes-for-confirmed-order-not-cancelled.sdp.md deleted file mode 100644 index 3ec3ed97..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-019-assert-passes-for-confirmed-order-not-cancelled.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.assert-passes-for-confirmed-order-not-cancelled -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# assert passes for confirmed order (not cancelled) - -## Intent - -- outcome: Executable scenario: assert passes for confirmed order (not cancelled) - -```gwt -Given an order in "confirmed" status -When I call orderNotCancelled.assert() -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-020-assert-throws-order-already-cancelled-for-cancelled-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-020-assert-throws-order-already-cancelled-for-cancelled-order.sdp.md deleted file mode 100644 index a4441e04..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-020-assert-throws-order-already-cancelled-for-cancelled-order.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.assert-throws-order-already-cancelled-for-cancelled-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# assert throws ORDER_ALREADY_CANCELLED for cancelled order - -## Intent - -- outcome: Executable scenario: assert throws ORDER_ALREADY_CANCELLED for cancelled order - -```gwt -Given a cancelled order with orderId "ord_cancelled" -When I call orderNotCancelled.assert() -Then an OrderInvariantError is thrown with code "ORDER_ALREADY_CANCELLED" -And the error context contains orderId "ord_cancelled" -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-021-check-returns-true-for-draft-order-not-confirmed.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-021-check-returns-true-for-draft-order-not-confirmed.sdp.md deleted file mode 100644 index 0c3a6f01..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-021-check-returns-true-for-draft-order-not-confirmed.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.check-returns-true-for-draft-order-not-confirmed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# check returns true for draft order (not confirmed) - -## Intent - -- outcome: Executable scenario: check returns true for draft order (not confirmed) - -```gwt -Given an order in "draft" status -When I call orderNotConfirmed.check() -Then the result is true -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-022-check-returns-true-for-submitted-order-not-confirmed.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-022-check-returns-true-for-submitted-order-not-confirmed.sdp.md deleted file mode 100644 index aea66d25..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-022-check-returns-true-for-submitted-order-not-confirmed.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.check-returns-true-for-submitted-order-not-confirmed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# check returns true for submitted order (not confirmed) - -## Intent - -- outcome: Executable scenario: check returns true for submitted order (not confirmed) - -```gwt -Given an order in "submitted" status -When I call orderNotConfirmed.check() -Then the result is true -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-023-check-returns-false-for-confirmed-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-023-check-returns-false-for-confirmed-order.sdp.md deleted file mode 100644 index 68b64be5..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-023-check-returns-false-for-confirmed-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.check-returns-false-for-confirmed-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# check returns false for confirmed order - -## Intent - -- outcome: Executable scenario: check returns false for confirmed order - -```gwt -Given an order in "confirmed" status -When I call orderNotConfirmed.check() -Then the result is false -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-024-assert-passes-for-draft-order-not-confirmed.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-024-assert-passes-for-draft-order-not-confirmed.sdp.md deleted file mode 100644 index d2f91b08..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-024-assert-passes-for-draft-order-not-confirmed.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.assert-passes-for-draft-order-not-confirmed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# assert passes for draft order (not confirmed) - -## Intent - -- outcome: Executable scenario: assert passes for draft order (not confirmed) - -```gwt -Given an order in "draft" status -When I call orderNotConfirmed.assert() -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-025-assert-passes-for-cancelled-order-not-confirmed.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-025-assert-passes-for-cancelled-order-not-confirmed.sdp.md deleted file mode 100644 index 50bfbf6e..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-025-assert-passes-for-cancelled-order-not-confirmed.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.assert-passes-for-cancelled-order-not-confirmed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# assert passes for cancelled order (not confirmed) - -## Intent - -- outcome: Executable scenario: assert passes for cancelled order (not confirmed) - -```gwt -Given an order in "cancelled" status -When I call orderNotConfirmed.assert() -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-026-assert-throws-order-already-confirmed-for-confirmed-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-026-assert-throws-order-already-confirmed-for-confirmed-order.sdp.md deleted file mode 100644 index 29054c2b..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-026-assert-throws-order-already-confirmed-for-confirmed-order.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.assert-throws-order-already-confirmed-for-confirmed-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# assert throws ORDER_ALREADY_CONFIRMED for confirmed order - -## Intent - -- outcome: Executable scenario: assert throws ORDER_ALREADY_CONFIRMED for confirmed order - -```gwt -Given a confirmed order with orderId "ord_confirmed" -When I call orderNotConfirmed.assert() -Then an OrderInvariantError is thrown with code "ORDER_ALREADY_CONFIRMED" -And the error context contains orderId "ord_confirmed" -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-027-check-returns-true-when-order-has-items.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-027-check-returns-true-when-order-has-items.sdp.md deleted file mode 100644 index e1086dc5..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-027-check-returns-true-when-order-has-items.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.check-returns-true-when-order-has-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# check returns true when order has items - -## Intent - -- outcome: Executable scenario: check returns true when order has items - -```gwt -Given an order with 1 item -When I call orderHasItems.check() -Then the result is true -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-028-check-returns-false-when-order-has-no-items.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-028-check-returns-false-when-order-has-no-items.sdp.md deleted file mode 100644 index b6439ee5..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-028-check-returns-false-when-order-has-no-items.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.check-returns-false-when-order-has-no-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# check returns false when order has no items - -## Intent - -- outcome: Executable scenario: check returns false when order has no items - -```gwt -Given an order with 0 items -When I call orderHasItems.check() -Then the result is false -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-029-assert-passes-when-order-has-items.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-029-assert-passes-when-order-has-items.sdp.md deleted file mode 100644 index 6ef4b5fe..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-029-assert-passes-when-order-has-items.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.assert-passes-when-order-has-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# assert passes when order has items - -## Intent - -- outcome: Executable scenario: assert passes when order has items - -```gwt -Given an order with 1 item -When I call orderHasItems.assert() -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-030-assert-passes-when-order-has-multiple-items.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-030-assert-passes-when-order-has-multiple-items.sdp.md deleted file mode 100644 index 80f3e10c..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-030-assert-passes-when-order-has-multiple-items.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.assert-passes-when-order-has-multiple-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# assert passes when order has multiple items - -## Intent - -- outcome: Executable scenario: assert passes when order has multiple items - -```gwt -Given an order with 2 items -When I call orderHasItems.assert() -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-031-assert-throws-order-has-no-items-for-empty-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-031-assert-throws-order-has-no-items-for-empty-order.sdp.md deleted file mode 100644 index 81db887c..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-031-assert-throws-order-has-no-items-for-empty-order.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.assert-throws-order-has-no-items-for-empty-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# assert throws ORDER_HAS_NO_ITEMS for empty order - -## Intent - -- outcome: Executable scenario: assert throws ORDER_HAS_NO_ITEMS for empty order - -```gwt -Given an order with 0 items and orderId "ord_empty" -When I call orderHasItems.assert() -Then an OrderInvariantError is thrown with code "ORDER_HAS_NO_ITEMS" -And the error context contains orderId "ord_empty" -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-032-check-returns-true-when-order-has-room-for-items.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-032-check-returns-true-when-order-has-room-for-items.sdp.md deleted file mode 100644 index 555cef1c..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-032-check-returns-true-when-order-has-room-for-items.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.check-returns-true-when-order-has-room-for-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# check returns true when order has room for items - -## Intent - -- outcome: Executable scenario: check returns true when order has room for items - -```gwt -Given an order with 0 items -When I call orderCanAddItem.check() -Then the result is true -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-033-check-returns-false-when-order-is-at-max-capacity.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-033-check-returns-false-when-order-is-at-max-capacity.sdp.md deleted file mode 100644 index 67b6e9d0..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-033-check-returns-false-when-order-is-at-max-capacity.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.check-returns-false-when-order-is-at-max-capacity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# check returns false when order is at max capacity - -## Intent - -- outcome: Executable scenario: check returns false when order is at max capacity - -```gwt -Given an order at max item capacity -When I call orderCanAddItem.check() -Then the result is false -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-034-assert-passes-when-order-has-room-for-items.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-034-assert-passes-when-order-has-room-for-items.sdp.md deleted file mode 100644 index a402abaa..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-034-assert-passes-when-order-has-room-for-items.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.assert-passes-when-order-has-room-for-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# assert passes when order has room for items - -## Intent - -- outcome: Executable scenario: assert passes when order has room for items - -```gwt -Given an order with 0 items -When I call orderCanAddItem.assert() -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-035-assert-passes-when-order-is-one-under-max-capacity.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-035-assert-passes-when-order-is-one-under-max-capacity.sdp.md deleted file mode 100644 index b6806e80..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-035-assert-passes-when-order-is-one-under-max-capacity.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.assert-passes-when-order-is-one-under-max-capacity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# assert passes when order is one under max capacity - -## Intent - -- outcome: Executable scenario: assert passes when order is one under max capacity - -```gwt -Given an order one under max item capacity -When I call orderCanAddItem.assert() -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-036-assert-throws-max-items-exceeded-at-max-capacity.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-036-assert-throws-max-items-exceeded-at-max-capacity.sdp.md deleted file mode 100644 index 1fb3b458..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-036-assert-throws-max-items-exceeded-at-max-capacity.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.assert-throws-max-items-exceeded-at-max-capacity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# assert throws MAX_ITEMS_EXCEEDED at max capacity - -## Intent - -- outcome: Executable scenario: assert throws MAX_ITEMS_EXCEEDED at max capacity - -```gwt -Given an order at max item capacity with orderId "ord_full" -When I call orderCanAddItem.assert() -Then an OrderInvariantError is thrown with code "MAX_ITEMS_EXCEEDED" -And the error context contains currentCount equal to MAX_ITEMS_PER_ORDER -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-037-passes-when-item-exists-in-order.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-037-passes-when-item-exists-in-order.sdp.md deleted file mode 100644 index 62d01a30..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-037-passes-when-item-exists-in-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.passes-when-item-exists-in-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# passes when item exists in order - -## Intent - -- outcome: Executable scenario: passes when item exists in order - -```gwt -Given an order with item productId "prod_target" -When I call assertItemExists with productId "prod_target" -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-038-passes-when-item-is-one-of-many.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-038-passes-when-item-is-one-of-many.sdp.md deleted file mode 100644 index 3b663c2f..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-038-passes-when-item-is-one-of-many.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.passes-when-item-is-one-of-many -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# passes when item is one of many - -## Intent - -- outcome: Executable scenario: passes when item is one of many - -```gwt -Given an order with items "prod_1", "prod_target", "prod_3" -When I call assertItemExists with productId "prod_target" -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-039-throws-item-not-found-when-item-does-not-exist.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-039-throws-item-not-found-when-item-does-not-exist.sdp.md deleted file mode 100644 index 9a5bcf4c..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-039-throws-item-not-found-when-item-does-not-exist.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.throws-item-not-found-when-item-does-not-exist -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# throws ITEM_NOT_FOUND when item does not exist - -## Intent - -- outcome: Executable scenario: throws ITEM_NOT_FOUND when item does not exist - -```gwt -Given an order with item productId "prod_other" and orderId "ord_test" -When I call assertItemExists with productId "prod_missing" -Then an OrderInvariantError is thrown with code "ITEM_NOT_FOUND" -And the error context contains productId "prod_missing" -And the error context contains orderId "ord_test" -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-040-throws-item-not-found-when-items-array-is-empty.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-040-throws-item-not-found-when-items-array-is-empty.sdp.md deleted file mode 100644 index 15303133..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-040-throws-item-not-found-when-items-array-is-empty.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.throws-item-not-found-when-items-array-is-empty -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# throws ITEM_NOT_FOUND when items array is empty - -## Intent - -- outcome: Executable scenario: throws ITEM_NOT_FOUND when items array is empty - -```gwt -Given an order with 0 items -When I call assertItemExists with productId "prod_any" -Then an OrderInvariantError is thrown with code "ITEM_NOT_FOUND" -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-041-passes-for-valid-item.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-041-passes-for-valid-item.sdp.md deleted file mode 100644 index 26794a4a..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-041-passes-for-valid-item.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.passes-for-valid-item -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# passes for valid item - -## Intent - -- outcome: Executable scenario: passes for valid item - -```gwt -Given a valid item with quantity 1 and unitPrice 10 -When I call validateItem -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-042-passes-for-item-with-decimal-price.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-042-passes-for-item-with-decimal-price.sdp.md deleted file mode 100644 index e4c2762d..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-042-passes-for-item-with-decimal-price.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.passes-for-item-with-decimal-price -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# passes for item with decimal price - -## Intent - -- outcome: Executable scenario: passes for item with decimal price - -```gwt -Given a valid item with quantity 1 and unitPrice 9.99 -When I call validateItem -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-043-passes-for-item-with-zero-price-free-item.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-043-passes-for-item-with-zero-price-free-item.sdp.md deleted file mode 100644 index 8d7badea..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-043-passes-for-item-with-zero-price-free-item.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.passes-for-item-with-zero-price-free-item -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# passes for item with zero price (free item) - -## Intent - -- outcome: Executable scenario: passes for item with zero price (free item) - -```gwt -Given a valid item with quantity 1 and unitPrice 0 -When I call validateItem -Then no error is thrown -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-044-throws-invalid-quantity-for-negative-quantity.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-044-throws-invalid-quantity-for-negative-quantity.sdp.md deleted file mode 100644 index ecadae9c..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-044-throws-invalid-quantity-for-negative-quantity.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.throws-invalid-quantity-for-negative-quantity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# throws INVALID_QUANTITY for negative quantity - -## Intent - -- outcome: Executable scenario: throws INVALID_QUANTITY for negative quantity - -```gwt -Given an item with quantity -1 -When I call validateItem -Then an OrderInvariantError is thrown with code "INVALID_QUANTITY" -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-045-throws-invalid-quantity-for-zero-quantity.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-045-throws-invalid-quantity-for-zero-quantity.sdp.md deleted file mode 100644 index cd09c891..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-045-throws-invalid-quantity-for-zero-quantity.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.throws-invalid-quantity-for-zero-quantity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# throws INVALID_QUANTITY for zero quantity - -## Intent - -- outcome: Executable scenario: throws INVALID_QUANTITY for zero quantity - -```gwt -Given an item with quantity 0 -When I call validateItem -Then an OrderInvariantError is thrown with code "INVALID_QUANTITY" -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-046-throws-invalid-quantity-for-non-integer-quantity.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-046-throws-invalid-quantity-for-non-integer-quantity.sdp.md deleted file mode 100644 index 6509773e..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-046-throws-invalid-quantity-for-non-integer-quantity.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.throws-invalid-quantity-for-non-integer-quantity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# throws INVALID_QUANTITY for non-integer quantity - -## Intent - -- outcome: Executable scenario: throws INVALID_QUANTITY for non-integer quantity - -```gwt -Given an item with quantity 1.5 -When I call validateItem -Then an OrderInvariantError is thrown with code "INVALID_QUANTITY" -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-047-throws-invalid-price-for-negative-price.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-047-throws-invalid-price-for-negative-price.sdp.md deleted file mode 100644 index 063e92d3..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-047-throws-invalid-price-for-negative-price.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.throws-invalid-price-for-negative-price -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# throws INVALID_PRICE for negative price - -## Intent - -- outcome: Executable scenario: throws INVALID_PRICE for negative price - -```gwt -Given an item with unitPrice -5 -When I call validateItem -Then an OrderInvariantError is thrown with code "INVALID_PRICE" -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-048-throws-invalid-item-data-for-empty-product-id.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-048-throws-invalid-item-data-for-empty-product-id.sdp.md deleted file mode 100644 index c107cb62..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-048-throws-invalid-item-data-for-empty-product-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.throws-invalid-item-data-for-empty-product-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# throws INVALID_ITEM_DATA for empty productId - -## Intent - -- outcome: Executable scenario: throws INVALID_ITEM_DATA for empty productId - -```gwt -Given an item with empty productId -When I call validateItem -Then an OrderInvariantError is thrown with code "INVALID_ITEM_DATA" -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-049-throws-invalid-item-data-for-empty-product-name.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-049-throws-invalid-item-data-for-empty-product-name.sdp.md deleted file mode 100644 index ffbf8349..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-049-throws-invalid-item-data-for-empty-product-name.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.throws-invalid-item-data-for-empty-product-name -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# throws INVALID_ITEM_DATA for empty productName - -## Intent - -- outcome: Executable scenario: throws INVALID_ITEM_DATA for empty productName - -```gwt -Given an item with empty productName -When I call validateItem -Then an OrderInvariantError is thrown with code "INVALID_ITEM_DATA" -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-050-error-has-correct-name-property.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-050-error-has-correct-name-property.sdp.md deleted file mode 100644 index ced0ed04..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-050-error-has-correct-name-property.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.error-has-correct-name-property -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# error has correct name property - -## Intent - -- outcome: Executable scenario: error has correct name property - -```gwt -Given the feature fixture is in place -When I create an OrderInvariantError with code "ORDER_NOT_FOUND" and message "Test message" -Then the error name is "OrderInvariantError" -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-051-error-has-correct-code-property.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-051-error-has-correct-code-property.sdp.md deleted file mode 100644 index 292b8744..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-051-error-has-correct-code-property.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.error-has-correct-code-property -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# error has correct code property - -## Intent - -- outcome: Executable scenario: error has correct code property - -```gwt -Given the feature fixture is in place -When I create an OrderInvariantError with code "ORDER_NOT_IN_DRAFT" and message "Test message" -Then the error code is "ORDER_NOT_IN_DRAFT" -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-052-error-has-correct-message-property.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-052-error-has-correct-message-property.sdp.md deleted file mode 100644 index 5ae5071b..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-052-error-has-correct-message-property.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.error-has-correct-message-property -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# error has correct message property - -## Intent - -- outcome: Executable scenario: error has correct message property - -```gwt -Given the feature fixture is in place -When I create an OrderInvariantError with code "ORDER_NOT_FOUND" and message "Custom message" -Then the error message is "Custom message" -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-053-error-has-correct-context-property.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-053-error-has-correct-context-property.sdp.md deleted file mode 100644 index e7d82cd6..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-053-error-has-correct-context-property.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.error-has-correct-context-property -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# error has correct context property - -## Intent - -- outcome: Executable scenario: error has correct context property - -```gwt -Given the feature fixture is in place -When I create an OrderInvariantError with code "ORDER_NOT_FOUND" and message "Message" and context: -Then the error context matches the provided context -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-054-error-can-have-undefined-context.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-054-error-can-have-undefined-context.sdp.md deleted file mode 100644 index 0209faf7..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-054-error-can-have-undefined-context.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.error-can-have-undefined-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# error can have undefined context - -## Intent - -- outcome: Executable scenario: error can have undefined context - -```gwt -Given the feature fixture is in place -When I create an OrderInvariantError with code "ORDER_NOT_FOUND" and message "Message" -Then the error context is undefined -``` diff --git a/specs/behavior/order-management/orders/order-invariants.examples/s-055-error-is-an-instance-of-error.sdp.md b/specs/behavior/order-management/orders/order-invariants.examples/s-055-error-is-an-instance-of-error.sdp.md deleted file mode 100644 index c3cfb76a..00000000 --- a/specs/behavior/order-management/orders/order-invariants.examples/s-055-error-is-an-instance-of-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.orders.order-invariants.error-is-an-instance-of-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.order-invariants ---- -# error is an instance of Error - -## Intent - -- outcome: Executable scenario: error is an instance of Error - -```gwt -Given the feature fixture is in place -When I create an OrderInvariantError with code "ORDER_NOT_FOUND" and message "Message" -Then the error is an instance of Error -``` diff --git a/specs/behavior/order-management/orders/order-invariants.sdp.md b/specs/behavior/order-management/orders/order-invariants.sdp.md index fc072c98..10c02bb2 100644 --- a/specs/behavior/order-management/orders/order-invariants.sdp.md +++ b/specs/behavior/order-management/orders/order-invariants.sdp.md @@ -11,7 +11,7 @@ relations: ## Intent - actor: a developer working with the Order aggregate -- outcome: pure invariant functions that validate order state so that invalid state transitions are prevented with structured error information +- outcome: Pure invariant functions validate order state so that invalid transitions are prevented with structured errors. ## Behavior diff --git a/specs/behavior/order-management/orders/remove-order-item.examples/s-001-remove-item-from-draft-order-with-multiple-items.sdp.md b/specs/behavior/order-management/orders/remove-order-item.examples/s-001-remove-item-from-draft-order-with-multiple-items.sdp.md deleted file mode 100644 index ffad42c4..00000000 --- a/specs/behavior/order-management/orders/remove-order-item.examples/s-001-remove-item-from-draft-order-with-multiple-items.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.orders.remove-order-item.remove-item-from-draft-order-with-multiple-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.remove-order-item ---- -# Remove item from draft order with multiple items - -## Intent - -- outcome: Executable scenario: Remove item from draft order with multiple items - -```gwt -Given the system is ready -And an order "ord_remove_001" exists with status "draft" -And the order has the following items: -When I remove item "prod_001" from order "ord_remove_001" -Then the command should succeed -And the order should have 1 item -And the order total should be 25 -``` diff --git a/specs/behavior/order-management/orders/remove-order-item.examples/s-002-remove-last-item-from-draft-order.sdp.md b/specs/behavior/order-management/orders/remove-order-item.examples/s-002-remove-last-item-from-draft-order.sdp.md deleted file mode 100644 index 9777e41c..00000000 --- a/specs/behavior/order-management/orders/remove-order-item.examples/s-002-remove-last-item-from-draft-order.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.orders.remove-order-item.remove-last-item-from-draft-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.remove-order-item ---- -# Remove last item from draft order - -## Intent - -- outcome: Executable scenario: Remove last item from draft order - -```gwt -Given the system is ready -And an order "ord_remove_002" exists with status "draft" -And the order has the following items: -When I remove item "prod_001" from order "ord_remove_002" -Then the command should succeed -And the order should have 0 items -And the order total should be 0 -``` diff --git a/specs/behavior/order-management/orders/remove-order-item.examples/s-003-cannot-remove-item-from-submitted-order.sdp.md b/specs/behavior/order-management/orders/remove-order-item.examples/s-003-cannot-remove-item-from-submitted-order.sdp.md deleted file mode 100644 index 205fe1df..00000000 --- a/specs/behavior/order-management/orders/remove-order-item.examples/s-003-cannot-remove-item-from-submitted-order.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.orders.remove-order-item.cannot-remove-item-from-submitted-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.remove-order-item ---- -# Cannot remove item from submitted order - -## Intent - -- outcome: Executable scenario: Cannot remove item from submitted order - -```gwt -Given the system is ready -And an order "ord_remove_003" exists with status "submitted" -And the order has the following items: -When I remove item "prod_001" from order "ord_remove_003" -Then the command should be rejected with code "ORDER_NOT_IN_DRAFT" -``` diff --git a/specs/behavior/order-management/orders/remove-order-item.examples/s-004-cannot-remove-item-from-cancelled-order.sdp.md b/specs/behavior/order-management/orders/remove-order-item.examples/s-004-cannot-remove-item-from-cancelled-order.sdp.md deleted file mode 100644 index ff86d4f3..00000000 --- a/specs/behavior/order-management/orders/remove-order-item.examples/s-004-cannot-remove-item-from-cancelled-order.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.orders.remove-order-item.cannot-remove-item-from-cancelled-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.remove-order-item ---- -# Cannot remove item from cancelled order - -## Intent - -- outcome: Executable scenario: Cannot remove item from cancelled order - -```gwt -Given the system is ready -And an order "ord_remove_004" exists with status "cancelled" -And the order has the following items: -When I remove item "prod_001" from order "ord_remove_004" -Then the command should be rejected with code "ORDER_NOT_IN_DRAFT" -``` diff --git a/specs/behavior/order-management/orders/remove-order-item.examples/s-005-cannot-remove-item-from-confirmed-order.sdp.md b/specs/behavior/order-management/orders/remove-order-item.examples/s-005-cannot-remove-item-from-confirmed-order.sdp.md deleted file mode 100644 index 7c9a1ef2..00000000 --- a/specs/behavior/order-management/orders/remove-order-item.examples/s-005-cannot-remove-item-from-confirmed-order.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.orders.remove-order-item.cannot-remove-item-from-confirmed-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.remove-order-item ---- -# Cannot remove item from confirmed order - -## Intent - -- outcome: Executable scenario: Cannot remove item from confirmed order - -```gwt -Given the system is ready -And an order "ord_remove_005" exists with status "confirmed" -And the order has the following items: -When I remove item "prod_001" from order "ord_remove_005" -Then the command should be rejected with code "ORDER_NOT_IN_DRAFT" -``` diff --git a/specs/behavior/order-management/orders/remove-order-item.examples/s-006-cannot-remove-non-existent-item.sdp.md b/specs/behavior/order-management/orders/remove-order-item.examples/s-006-cannot-remove-non-existent-item.sdp.md deleted file mode 100644 index 9eed4a0f..00000000 --- a/specs/behavior/order-management/orders/remove-order-item.examples/s-006-cannot-remove-non-existent-item.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.orders.remove-order-item.cannot-remove-non-existent-item -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.remove-order-item ---- -# Cannot remove non-existent item - -## Intent - -- outcome: Executable scenario: Cannot remove non-existent item - -```gwt -Given the system is ready -And an order "ord_remove_006" exists with status "draft" -And the order has the following items: -When I remove item "prod_nonexistent" from order "ord_remove_006" -Then the command should be rejected with code "ITEM_NOT_FOUND" -``` diff --git a/specs/behavior/order-management/orders/remove-order-item.examples/s-007-remove-order-item-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/orders/remove-order-item.examples/s-007-remove-order-item-is-idempotent-with-same-command-id.sdp.md deleted file mode 100644 index 6a819ed9..00000000 --- a/specs/behavior/order-management/orders/remove-order-item.examples/s-007-remove-order-item-is-idempotent-with-same-command-id.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.orders.remove-order-item.remove-order-item-is-idempotent-with-same-command-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.orders.remove-order-item ---- -# RemoveOrderItem is idempotent with same commandId - -## Intent - -- outcome: Executable scenario: RemoveOrderItem is idempotent with same commandId - -```gwt -Given the system is ready -And an order "ord_remove_007" exists with status "draft" -And the order has the following items: -When I remove item "prod_001" from order "ord_remove_007" with commandId "cmd_remove_007" -Then the command should succeed -And I retry removing item "prod_001" from order "ord_remove_007" with commandId "cmd_remove_007" -And the command should return duplicate result -``` diff --git a/specs/behavior/order-management/orders/remove-order-item.sdp.md b/specs/behavior/order-management/orders/remove-order-item.sdp.md index 15c6c37d..69b0809c 100644 --- a/specs/behavior/order-management/orders/remove-order-item.sdp.md +++ b/specs/behavior/order-management/orders/remove-order-item.sdp.md @@ -11,4 +11,4 @@ relations: ## Intent - actor: a customer -- outcome: to remove items from my order so that I can adjust my purchase before submitting +- outcome: A customer removes items from an order so that they can adjust the purchase before submitting. diff --git a/specs/behavior/order-management/orders/submit-order.examples/s-001-successfully-submit-order-with-items.sdp.md b/specs/behavior/order-management/orders/submit-order.examples/s-001-successfully-submit-order-with-items.sdp.md index 3a5471b1..9b343d91 100644 --- a/specs/behavior/order-management/orders/submit-order.examples/s-001-successfully-submit-order-with-items.sdp.md +++ b/specs/behavior/order-management/orders/submit-order.examples/s-001-successfully-submit-order-with-items.sdp.md @@ -2,22 +2,23 @@ id: spec:behavior.order-management.orders.submit-order.successfully-submit-order-with-items kind: example altitude: story -readiness: idea +readiness: defined relations: + verifies: spec:behavior.order-management.orders.submit-order refines: spec:behavior.order-management.orders.submit-order --- # Successfully submit order with items ## Intent -- outcome: Executable scenario: Successfully submit order with items +- outcome: Show that an order with items is submitted. ```gwt Given the system is ready -And an order "ord_submit_001" exists with status "draft" +And an order {orderId: "ord_submit_001"} exists with status {status: "draft"} And the order has the following items: -When I send a SubmitOrder command for "ord_submit_001" +When I send a SubmitOrder command for {orderId: "ord_submit_001"} Then the command should succeed -And the order "ord_submit_001" status should be "submitted" -And the order total should be 45 +And the order {orderId: "ord_submit_001"} status should be {status: "submitted"} +And the order total should be {total: 45} ``` diff --git a/specs/behavior/order-management/orders/submit-order.examples/s-002-cannot-submit-empty-order.sdp.md b/specs/behavior/order-management/orders/submit-order.examples/s-002-cannot-submit-empty-order.sdp.md index 2687b618..3396cddd 100644 --- a/specs/behavior/order-management/orders/submit-order.examples/s-002-cannot-submit-empty-order.sdp.md +++ b/specs/behavior/order-management/orders/submit-order.examples/s-002-cannot-submit-empty-order.sdp.md @@ -2,21 +2,22 @@ id: spec:behavior.order-management.orders.submit-order.cannot-submit-empty-order kind: example altitude: story -readiness: idea +readiness: defined relations: + verifies: spec:behavior.order-management.orders.submit-order refines: spec:behavior.order-management.orders.submit-order --- # Cannot submit empty order ## Intent -- outcome: Executable scenario: Cannot submit empty order +- outcome: Show that an empty order cannot be submitted. ```gwt Given the system is ready -And an order "ord_empty_001" exists with status "draft" +And an order {orderId: "ord_empty_001"} exists with status {status: "draft"} And the order has no items -When I send a SubmitOrder command for "ord_empty_001" -Then the command should be rejected with code "ORDER_HAS_NO_ITEMS" -And the order "ord_empty_001" status should remain "draft" +When I send a SubmitOrder command for {orderId: "ord_empty_001"} +Then the command should be rejected with code {rejectionCode: "ORDER_HAS_NO_ITEMS"} +And the order {orderId: "ord_empty_001"} status should remain {status: "draft"} ``` diff --git a/specs/behavior/order-management/orders/submit-order.sdp.md b/specs/behavior/order-management/orders/submit-order.sdp.md index 3aa75204..f4380607 100644 --- a/specs/behavior/order-management/orders/submit-order.sdp.md +++ b/specs/behavior/order-management/orders/submit-order.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.order-management.orders.submit-order kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.order-management --- @@ -11,4 +11,19 @@ relations: ## Intent - actor: a customer -- outcome: to submit my order so that it can be processed for fulfillment +- outcome: A customer submits an order so that it can be processed for fulfillment. + +## Example space + +```gwt-vocabulary +Given the system is ready +And an order {orderId:string} exists with status {status:string} +And the order has the following items: +And the order has no items +When I send a SubmitOrder command for {orderId:string} +Then the command should succeed +And the order {orderId:string} status should be {status:string} +And the order total should be {total:number} +And the command should be rejected with code {rejectionCode:string} +And the order {orderId:string} status should remain {status:string} +``` diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-001-define-a-logic-projection-for-command-validation.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-001-define-a-logic-projection-for-command-validation.sdp.md deleted file mode 100644 index 10d6116b..00000000 --- a/specs/behavior/order-management/roadmap/projection-categories.examples/s-001-define-a-logic-projection-for-command-validation.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.roadmap.projection-categories.define-a-logic-projection-for-command-validation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.roadmap.projection-categories ---- -# Define a Logic projection for command validation - -## Intent - -- outcome: Executable scenario: Define a Logic projection for command validation - -```gwt -Given the projection category system is available -When I define a projection with category "logic": -Then the projection should not be client-exposed -And the projection should not be reactive -And the projection should be minimal (validation-only fields) -``` diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-002-define-a-view-projection-for-ui-queries.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-002-define-a-view-projection-for-ui-queries.sdp.md deleted file mode 100644 index 26dc9c74..00000000 --- a/specs/behavior/order-management/roadmap/projection-categories.examples/s-002-define-a-view-projection-for-ui-queries.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.roadmap.projection-categories.define-a-view-projection-for-ui-queries -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.roadmap.projection-categories ---- -# Define a View projection for UI queries - -## Intent - -- outcome: Executable scenario: Define a View projection for UI queries - -```gwt -Given the projection category system is available -When I define a projection with category "view": -Then the projection should be client-exposed -And the projection should be reactive -And the projection should support denormalized data -``` diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-003-define-a-reporting-projection-for-analytics.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-003-define-a-reporting-projection-for-analytics.sdp.md deleted file mode 100644 index 607a0ce1..00000000 --- a/specs/behavior/order-management/roadmap/projection-categories.examples/s-003-define-a-reporting-projection-for-analytics.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.roadmap.projection-categories.define-a-reporting-projection-for-analytics -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.roadmap.projection-categories ---- -# Define a Reporting projection for analytics - -## Intent - -- outcome: Executable scenario: Define a Reporting projection for analytics - -```gwt -Given the projection category system is available -When I define a projection with category "reporting": -Then the projection should be admin-only exposed -And the projection should not be reactive -And the projection should support aggregations -``` diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-004-define-an-integration-projection-for-cross-context-sync.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-004-define-an-integration-projection-for-cross-context-sync.sdp.md deleted file mode 100644 index 80d4c70a..00000000 --- a/specs/behavior/order-management/roadmap/projection-categories.examples/s-004-define-an-integration-projection-for-cross-context-sync.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.roadmap.projection-categories.define-an-integration-projection-for-cross-context-sync -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.roadmap.projection-categories ---- -# Define an Integration projection for cross-context sync - -## Intent - -- outcome: Executable scenario: Define an Integration projection for cross-context sync - -```gwt -Given the projection category system is available -When I define a projection with category "integration": -Then the projection should not be client-exposed -And the projection should publish to EventBus -And the projection should define a contract schema -``` diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-005-query-projections-by-category.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-005-query-projections-by-category.sdp.md deleted file mode 100644 index c5a4e188..00000000 --- a/specs/behavior/order-management/roadmap/projection-categories.examples/s-005-query-projections-by-category.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.roadmap.projection-categories.query-projections-by-category -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.roadmap.projection-categories ---- -# Query projections by category - -## Intent - -- outcome: Executable scenario: Query projections by category - -```gwt -Given the projection category system is available -And projections exist: -When I query projections by category "view" -Then I should get ["orderSummaries"] -``` diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-006-query-all-reactive-projections.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-006-query-all-reactive-projections.sdp.md deleted file mode 100644 index dcb78cc1..00000000 --- a/specs/behavior/order-management/roadmap/projection-categories.examples/s-006-query-all-reactive-projections.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.roadmap.projection-categories.query-all-reactive-projections -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.roadmap.projection-categories ---- -# Query all reactive projections - -## Intent - -- outcome: Executable scenario: Query all reactive projections - -```gwt -Given the projection category system is available -And projections exist: -When I query all reactive projections -Then I should get ["orderSummaries", "productViews"] -``` diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-007-prevent-client-query-on-logic-projection.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-007-prevent-client-query-on-logic-projection.sdp.md deleted file mode 100644 index 02a0413e..00000000 --- a/specs/behavior/order-management/roadmap/projection-categories.examples/s-007-prevent-client-query-on-logic-projection.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.roadmap.projection-categories.prevent-client-query-on-logic-projection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.roadmap.projection-categories ---- -# Prevent client query on Logic projection - -## Intent - -- outcome: Executable scenario: Prevent client query on Logic projection - -```gwt -Given the projection category system is available -And a projection "orderExists" with category "logic" -When a client attempts to query "orderExists" -Then the query should be rejected with "Logic projections are not client-exposed" -``` diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-008-warn-when-view-projection-is-not-optimized-for-reactivity.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-008-warn-when-view-projection-is-not-optimized-for-reactivity.sdp.md deleted file mode 100644 index 9f8251fe..00000000 --- a/specs/behavior/order-management/roadmap/projection-categories.examples/s-008-warn-when-view-projection-is-not-optimized-for-reactivity.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.roadmap.projection-categories.warn-when-view-projection-is-not-optimized-for-reactivity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.roadmap.projection-categories ---- -# Warn when View projection is not optimized for reactivity - -## Intent - -- outcome: Executable scenario: Warn when View projection is not optimized for reactivity - -```gwt -Given the projection category system is available -And a projection "slowView" with category "view" -And the projection handler contains expensive computations -When the projection is validated -Then a warning should be raised about reactive performance -``` diff --git a/specs/behavior/order-management/roadmap/projection-categories.examples/s-009-migrate-existing-projection-to-categorized-system.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.examples/s-009-migrate-existing-projection-to-categorized-system.sdp.md deleted file mode 100644 index 667602be..00000000 --- a/specs/behavior/order-management/roadmap/projection-categories.examples/s-009-migrate-existing-projection-to-categorized-system.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.roadmap.projection-categories.migrate-existing-projection-to-categorized-system -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.roadmap.projection-categories ---- -# Migrate existing projection to categorized system - -## Intent - -- outcome: Executable scenario: Migrate existing projection to categorized system - -```gwt -Given the projection category system is available -And an uncategorized projection "orderSummaries" -When I apply category migration -Then the projection should have inferred category "view" -And the migration log should record the change -``` diff --git a/specs/behavior/order-management/roadmap/projection-categories.sdp.md b/specs/behavior/order-management/roadmap/projection-categories.sdp.md index e1b643e8..cae34235 100644 --- a/specs/behavior/order-management/roadmap/projection-categories.sdp.md +++ b/specs/behavior/order-management/roadmap/projection-categories.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Projection Categories +- outcome: Formalize projection taxonomy with explicit Logic, View, Reporting, and Integration categories. diff --git a/specs/behavior/order-management/sagas/admin.examples/s-001-returns-zero-counts-for-empty-database.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-001-returns-zero-counts-for-empty-database.sdp.md deleted file mode 100644 index 40902a0e..00000000 --- a/specs/behavior/order-management/sagas/admin.examples/s-001-returns-zero-counts-for-empty-database.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.sagas.admin.returns-zero-counts-for-empty-database -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.sagas.admin ---- -# Returns zero counts for empty database - -## Intent - -- outcome: Executable scenario: Returns zero counts for empty database - -```gwt -Given a fresh unit test context -When I query getSagaStats for saga type "OrderFulfillment" -Then the stats should have counts: -``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-002-counts-sagas-by-status-correctly.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-002-counts-sagas-by-status-correctly.sdp.md deleted file mode 100644 index c4e8e372..00000000 --- a/specs/behavior/order-management/sagas/admin.examples/s-002-counts-sagas-by-status-correctly.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.sagas.admin.counts-sagas-by-status-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.sagas.admin ---- -# Counts sagas by status correctly - -## Intent - -- outcome: Executable scenario: Counts sagas by status correctly - -```gwt -Given a fresh unit test context -And the following sagas exist: -When I query getSagaStats for saga type "OrderFulfillment" -Then the stats should have counts: -``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-003-filters-by-saga-type.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-003-filters-by-saga-type.sdp.md deleted file mode 100644 index 48e9d3e2..00000000 --- a/specs/behavior/order-management/sagas/admin.examples/s-003-filters-by-saga-type.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.sagas.admin.filters-by-saga-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.sagas.admin ---- -# Filters by saga type - -## Intent - -- outcome: Executable scenario: Filters by saga type - -```gwt -Given a fresh unit test context -And the following sagas exist: -When I query getSagaStats for saga type "OrderFulfillment" and I query getSagaStats for saga type "PaymentProcessing" -Then the stats should show completed count of 2 -And the stats should show completed count of 1 -``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-004-returns-empty-array-when-no-sagas-exist.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-004-returns-empty-array-when-no-sagas-exist.sdp.md deleted file mode 100644 index 10cf3ba7..00000000 --- a/specs/behavior/order-management/sagas/admin.examples/s-004-returns-empty-array-when-no-sagas-exist.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.sagas.admin.returns-empty-array-when-no-sagas-exist -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.sagas.admin ---- -# Returns empty array when no sagas exist - -## Intent - -- outcome: Executable scenario: Returns empty array when no sagas exist - -```gwt -Given a fresh unit test context -When I query getStuckSagas for saga type "OrderFulfillment" -Then the stuck sagas result is empty -``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-005-returns-running-sagas-older-than-threshold.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-005-returns-running-sagas-older-than-threshold.sdp.md deleted file mode 100644 index 2b3084a1..00000000 --- a/specs/behavior/order-management/sagas/admin.examples/s-005-returns-running-sagas-older-than-threshold.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.sagas.admin.returns-running-sagas-older-than-threshold -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.sagas.admin ---- -# Returns running sagas older than threshold - -## Intent - -- outcome: Executable scenario: Returns running sagas older than threshold - -```gwt -Given a fresh unit test context -And a saga "old-running" of type "OrderFulfillment" with status "running" updated 2 hours ago -And a saga "recent-running" of type "OrderFulfillment" with status "running" updated 30 minutes ago -And a saga "completed" of type "OrderFulfillment" with status "completed" updated 2 hours ago -When I query getStuckSagas for saga type "OrderFulfillment" -Then the stuck sagas result has 1 entry -And the stuck saga has sagaId "old-running" -``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-006-respects-custom-threshold.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-006-respects-custom-threshold.sdp.md deleted file mode 100644 index eeb691e4..00000000 --- a/specs/behavior/order-management/sagas/admin.examples/s-006-respects-custom-threshold.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.sagas.admin.respects-custom-threshold -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.sagas.admin ---- -# Respects custom threshold - -## Intent - -- outcome: Executable scenario: Respects custom threshold - -```gwt -Given a fresh unit test context -And a saga "ten-min-old" of type "OrderFulfillment" with status "running" updated 10 minutes ago -When I query getStuckSagas for saga type "OrderFulfillment" with threshold 5 minutes -Then the stuck sagas result has 1 entry -And the stuck saga has sagaId "ten-min-old" -``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-007-returns-empty-array-when-no-failed-sagas.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-007-returns-empty-array-when-no-failed-sagas.sdp.md deleted file mode 100644 index 31c3f28c..00000000 --- a/specs/behavior/order-management/sagas/admin.examples/s-007-returns-empty-array-when-no-failed-sagas.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.sagas.admin.returns-empty-array-when-no-failed-sagas -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.sagas.admin ---- -# Returns empty array when no failed sagas - -## Intent - -- outcome: Executable scenario: Returns empty array when no failed sagas - -```gwt -Given a fresh unit test context -And a saga "1" of type "OrderFulfillment" with status "completed" -When I query getFailedSagas for saga type "OrderFulfillment" -Then the failed sagas result is empty -``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-008-returns-only-failed-sagas.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-008-returns-only-failed-sagas.sdp.md deleted file mode 100644 index b924e0bf..00000000 --- a/specs/behavior/order-management/sagas/admin.examples/s-008-returns-only-failed-sagas.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.sagas.admin.returns-only-failed-sagas -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.sagas.admin ---- -# Returns only failed sagas - -## Intent - -- outcome: Executable scenario: Returns only failed sagas - -```gwt -Given a fresh unit test context -And the following sagas exist: -When I query getFailedSagas for saga type "OrderFulfillment" -Then the failed sagas result has 2 entries -And the failed saga IDs include: -``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-009-respects-limit-parameter.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-009-respects-limit-parameter.sdp.md deleted file mode 100644 index 7a5de4e9..00000000 --- a/specs/behavior/order-management/sagas/admin.examples/s-009-respects-limit-parameter.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.sagas.admin.respects-limit-parameter -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.sagas.admin ---- -# Respects limit parameter - -## Intent - -- outcome: Executable scenario: Respects limit parameter - -```gwt -Given a fresh unit test context -And 5 failed sagas of type "OrderFulfillment" -When I query getFailedSagas for saga type "OrderFulfillment" with limit 3 -Then the failed sagas result has 3 entries -``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-010-allows-marking-valid-source-status-saga-as-failed.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-010-allows-marking-valid-source-status-saga-as-failed.sdp.md deleted file mode 100644 index 10e02324..00000000 --- a/specs/behavior/order-management/sagas/admin.examples/s-010-allows-marking-valid-source-status-saga-as-failed.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.sagas.admin.allows-marking-valid-source-status-saga-as-failed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.sagas.admin ---- -# Allows marking valid-source-status saga as failed - -## Intent - -- outcome: Executable scenario: Allows marking valid-source-status saga as failed - -```gwt -Given a fresh unit test context -And a saga "test" of type "OrderFulfillment" with status "value" -When I call markSagaFailed for saga "test" of type "OrderFulfillment" with reason "value" -Then the mutation result status is "marked_failed" -``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-011-rejects-marking-invalid-source-status-saga-as-failed.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-011-rejects-marking-invalid-source-status-saga-as-failed.sdp.md deleted file mode 100644 index a041052b..00000000 --- a/specs/behavior/order-management/sagas/admin.examples/s-011-rejects-marking-invalid-source-status-saga-as-failed.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.sagas.admin.rejects-marking-invalid-source-status-saga-as-failed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.sagas.admin ---- -# Rejects marking invalid-source-status saga as failed - -## Intent - -- outcome: Executable scenario: Rejects marking invalid-source-status saga as failed - -```gwt -Given a fresh unit test context -And a saga "test" of type "OrderFulfillment" with status "value" -When I call markSagaFailed for saga "test" of type "OrderFulfillment" with reason "Should not work" -Then the mutation result status is "invalid_transition" -And the mutation result currentStatus is "value" -``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-012-returns-not-found-for-non-existent-saga.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-012-returns-not-found-for-non-existent-saga.sdp.md deleted file mode 100644 index 81cc0bca..00000000 --- a/specs/behavior/order-management/sagas/admin.examples/s-012-returns-not-found-for-non-existent-saga.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.sagas.admin.returns-not-found-for-non-existent-saga -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.sagas.admin ---- -# Returns not_found for non-existent saga - -## Intent - -- outcome: Executable scenario: Returns not_found for non-existent saga - -```gwt -Given a fresh unit test context -When I call markSagaFailed for saga "nonexistent" of type "OrderFulfillment" with reason "Should not work" -Then the mutation result status is "not_found" -``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-013-allows-marking-failed-saga-as-compensated.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-013-allows-marking-failed-saga-as-compensated.sdp.md deleted file mode 100644 index 7b85d873..00000000 --- a/specs/behavior/order-management/sagas/admin.examples/s-013-allows-marking-failed-saga-as-compensated.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.sagas.admin.allows-marking-failed-saga-as-compensated -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.sagas.admin ---- -# Allows marking failed saga as compensated - -## Intent - -- outcome: Executable scenario: Allows marking failed saga as compensated - -```gwt -Given a fresh unit test context -And a saga "test" of type "OrderFulfillment" with status "failed" -When I call markSagaCompensated for saga "test" of type "OrderFulfillment" -Then the mutation result status is "marked_compensated" -``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-014-rejects-marking-non-failed-saga-as-compensated.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-014-rejects-marking-non-failed-saga-as-compensated.sdp.md deleted file mode 100644 index 5cb3d942..00000000 --- a/specs/behavior/order-management/sagas/admin.examples/s-014-rejects-marking-non-failed-saga-as-compensated.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.sagas.admin.rejects-marking-non-failed-saga-as-compensated -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.sagas.admin ---- -# Rejects marking non-failed saga as compensated - -## Intent - -- outcome: Executable scenario: Rejects marking non-failed saga as compensated - -```gwt -Given a fresh unit test context -And a saga "test" of type "OrderFulfillment" with status "running" -When I call markSagaCompensated for saga "test" of type "OrderFulfillment" -Then the mutation result status is "invalid_transition" -And the mutation result currentStatus is "running" -``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-015-allows-retrying-failed-saga.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-015-allows-retrying-failed-saga.sdp.md deleted file mode 100644 index 5d5b419c..00000000 --- a/specs/behavior/order-management/sagas/admin.examples/s-015-allows-retrying-failed-saga.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.sagas.admin.allows-retrying-failed-saga -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.sagas.admin ---- -# Allows retrying failed saga - -## Intent - -- outcome: Executable scenario: Allows retrying failed saga - -```gwt -Given a fresh unit test context -And a saga "test" of type "OrderFulfillment" with status "failed" and error "Previous error" -When I call retrySaga for saga "test" of type "OrderFulfillment" -Then the mutation result status is "reset_to_pending" -``` diff --git a/specs/behavior/order-management/sagas/admin.examples/s-016-rejects-retrying-non-failed-saga.sdp.md b/specs/behavior/order-management/sagas/admin.examples/s-016-rejects-retrying-non-failed-saga.sdp.md deleted file mode 100644 index 21305684..00000000 --- a/specs/behavior/order-management/sagas/admin.examples/s-016-rejects-retrying-non-failed-saga.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.sagas.admin.rejects-retrying-non-failed-saga -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.sagas.admin ---- -# Rejects retrying non-failed saga - -## Intent - -- outcome: Executable scenario: Rejects retrying non-failed saga - -```gwt -Given a fresh unit test context -And a saga "test" of type "OrderFulfillment" with status "value" -When I call retrySaga for saga "test" of type "OrderFulfillment" -Then the mutation result status is "invalid_state" -And the mutation result currentStatus is "value" -``` diff --git a/specs/behavior/order-management/sagas/admin.sdp.md b/specs/behavior/order-management/sagas/admin.sdp.md index b52b38c5..25d44622 100644 --- a/specs/behavior/order-management/sagas/admin.sdp.md +++ b/specs/behavior/order-management/sagas/admin.sdp.md @@ -11,7 +11,7 @@ relations: ## Intent - actor: a system administrator -- outcome: to query and manage saga instances so that I can monitor and recover from saga failures +- outcome: A system administrator queries and manages saga instances so they can monitor and recover from saga failures. ## Behavior diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-001-parse-vertical-data-table-to-object.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-001-parse-vertical-data-table-to-object.sdp.md deleted file mode 100644 index f62093d5..00000000 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-001-parse-vertical-data-table-to-object.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.parse-vertical-data-table-to-object -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing ---- -# Parse vertical DataTable to object - -## Intent - -- outcome: Executable scenario: Parse vertical DataTable to object - -```gwt -Given the platform-core testing module is imported -And a DataTable with field-value rows -When I call tableRowsToObject(rows) -Then I receive an object with keys from field column and values from value column -``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-002-parse-data-table-preserves-all-string-values.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-002-parse-data-table-preserves-all-string-values.sdp.md deleted file mode 100644 index c717b360..00000000 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-002-parse-data-table-preserves-all-string-values.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.parse-data-table-preserves-all-string-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing ---- -# Parse DataTable preserves all string values - -## Intent - -- outcome: Executable scenario: Parse DataTable preserves all string values - -```gwt -Given the platform-core testing module is imported -And a DataTable with field-value rows including "isActive" as "true" -When I call tableRowsToObject(rows) -Then all values are strings -And isActive is the string "true" not boolean true -``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-003-parse-integer-value-from-string.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-003-parse-integer-value-from-string.sdp.md deleted file mode 100644 index dfe1954e..00000000 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-003-parse-integer-value-from-string.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.parse-integer-value-from-string -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing ---- -# Parse integer value from string - -## Intent - -- outcome: Executable scenario: Parse integer value from string - -```gwt -Given the platform-core testing module is imported -When I call parseTableValue("42", "int") -Then I receive the number 42 -``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-004-parse-float-value-from-string.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-004-parse-float-value-from-string.sdp.md deleted file mode 100644 index a3324c11..00000000 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-004-parse-float-value-from-string.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.parse-float-value-from-string -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing ---- -# Parse float value from string - -## Intent - -- outcome: Executable scenario: Parse float value from string - -```gwt -Given the platform-core testing module is imported -When I call parseTableValue("3.14", "float") -Then I receive the number 3.14 -``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-005-parse-boolean-true-from-string.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-005-parse-boolean-true-from-string.sdp.md deleted file mode 100644 index 856d8ecb..00000000 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-005-parse-boolean-true-from-string.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.parse-boolean-true-from-string -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing ---- -# Parse boolean true from string - -## Intent - -- outcome: Executable scenario: Parse boolean true from string - -```gwt -Given the platform-core testing module is imported -When I call parseTableValue("true", "boolean") -Then I receive the boolean true -``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-006-parse-boolean-false-from-string.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-006-parse-boolean-false-from-string.sdp.md deleted file mode 100644 index 60d801dd..00000000 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-006-parse-boolean-false-from-string.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.parse-boolean-false-from-string -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing ---- -# Parse boolean false from string - -## Intent - -- outcome: Executable scenario: Parse boolean false from string - -```gwt -Given the platform-core testing module is imported -When I call parseTableValue("false", "boolean") -Then I receive the boolean false -``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-007-parse-invalid-integer-throws-error.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-007-parse-invalid-integer-throws-error.sdp.md deleted file mode 100644 index 4270765a..00000000 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-007-parse-invalid-integer-throws-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.parse-invalid-integer-throws-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing ---- -# Parse invalid integer throws error - -## Intent - -- outcome: Executable scenario: Parse invalid integer throws error - -```gwt -Given the platform-core testing module is imported -When I call parseTableValue("not-a-number", "int") -Then an error is thrown with message containing "Invalid integer" -``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-008-get-required-field-succeeds-when-present.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-008-get-required-field-succeeds-when-present.sdp.md deleted file mode 100644 index 4ba526c4..00000000 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-008-get-required-field-succeeds-when-present.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.get-required-field-succeeds-when-present -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing ---- -# Get required field succeeds when present - -## Intent - -- outcome: Executable scenario: Get required field succeeds when present - -```gwt -Given the platform-core testing module is imported -And a parsed object with orderId "order-123" and status "draft" -When I call getRequiredField(obj, "orderId") -Then I receive "order-123" -``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-009-get-required-field-throws-for-missing-field.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-009-get-required-field-throws-for-missing-field.sdp.md deleted file mode 100644 index 3f6b76a9..00000000 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-009-get-required-field-throws-for-missing-field.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.get-required-field-throws-for-missing-field -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing ---- -# Get required field throws for missing field - -## Intent - -- outcome: Executable scenario: Get required field throws for missing field - -```gwt -Given the platform-core testing module is imported -And a parsed object with only status "draft" -When I call getRequiredField(obj, "orderId") -Then an error is thrown with message containing "orderId" -And the error message indicates the field is required -``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-010-get-optional-field-returns-value-when-present.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-010-get-optional-field-returns-value-when-present.sdp.md deleted file mode 100644 index bc860e64..00000000 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-010-get-optional-field-returns-value-when-present.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.get-optional-field-returns-value-when-present -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing ---- -# Get optional field returns value when present - -## Intent - -- outcome: Executable scenario: Get optional field returns value when present - -```gwt -Given the platform-core testing module is imported -And a parsed object with notes "Some notes" -When I call getOptionalField(obj, "notes") -Then I receive "Some notes" -``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-011-get-optional-field-returns-undefined-for-missing.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-011-get-optional-field-returns-undefined-for-missing.sdp.md deleted file mode 100644 index b8db70ef..00000000 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-011-get-optional-field-returns-undefined-for-missing.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.get-optional-field-returns-undefined-for-missing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing ---- -# Get optional field returns undefined for missing - -## Intent - -- outcome: Executable scenario: Get optional field returns undefined for missing - -```gwt -Given the platform-core testing module is imported -And a parsed object with only status "draft" -When I call getOptionalField(obj, "notes") -Then I receive undefined -``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-012-get-optional-field-with-default-value.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-012-get-optional-field-with-default-value.sdp.md deleted file mode 100644 index bace6578..00000000 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.examples/s-012-get-optional-field-with-default-value.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.data-table-parsing.get-optional-field-with-default-value -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.data-table-parsing ---- -# Get optional field with default value - -## Intent - -- outcome: Executable scenario: Get optional field with default value - -```gwt -Given the platform-core testing module is imported -And a parsed object with only status "draft" -When I call getOptionalField(obj, "priority", "normal") -Then I receive "normal" -``` diff --git a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.sdp.md b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.sdp.md index b246a167..bf2d72e3 100644 --- a/specs/behavior/order-management/testing-infrastructure/data-table-parsing.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/data-table-parsing.sdp.md @@ -11,4 +11,4 @@ relations: ## Intent - actor: a BDD test author -- outcome: DataTable parsing helpers so that I can easily extract structured data from Gherkin tables +- outcome: DataTable parsing helpers extract structured data from Gherkin tables. diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-001-assert-decision-success.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-001-assert-decision-success.sdp.md deleted file mode 100644 index c2e28333..00000000 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-001-assert-decision-success.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-decision-success -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.decider-assertions ---- -# Assert decision success - -## Intent - -- outcome: Executable scenario: Assert decision success - -```gwt -Given the platform-decider testing module is imported -And a DeciderOutput with status "success" -When I call assertDecisionSuccess(result) -Then the assertion passes -``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-002-assert-decision-success-fails-for-rejected-result.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-002-assert-decision-success-fails-for-rejected-result.sdp.md deleted file mode 100644 index 653a1890..00000000 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-002-assert-decision-success-fails-for-rejected-result.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-decision-success-fails-for-rejected-result -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.decider-assertions ---- -# Assert decision success fails for rejected result - -## Intent - -- outcome: Executable scenario: Assert decision success fails for rejected result - -```gwt -Given the platform-decider testing module is imported -And a DeciderOutput with status "rejected" and code "INVALID_STATE" -When I call assertDecisionSuccess(result) -Then the assertion fails -And the error message contains "success" -And the error message indicates the actual status was "rejected" -``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-003-extract-success-event-from-result.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-003-extract-success-event-from-result.sdp.md deleted file mode 100644 index 99b0533e..00000000 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-003-extract-success-event-from-result.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.decider-assertions.extract-success-event-from-result -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.decider-assertions ---- -# Extract success event from result - -## Intent - -- outcome: Executable scenario: Extract success event from result - -```gwt -Given the platform-decider testing module is imported -And a DeciderOutput with status "success" and event type "OrderCreated" -When I call getSuccessEvent(result) -Then I receive the event object -And the event type is "OrderCreated" -``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-004-extract-success-data-from-result.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-004-extract-success-data-from-result.sdp.md deleted file mode 100644 index 6a6dba96..00000000 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-004-extract-success-data-from-result.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.decider-assertions.extract-success-data-from-result -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.decider-assertions ---- -# Extract success data from result - -## Intent - -- outcome: Executable scenario: Extract success data from result - -```gwt -Given the platform-decider testing module is imported -And a DeciderOutput with status "success" and data containing orderId "ord-123" -When I call getSuccessData(result) -Then I receive an object with orderId "ord-123" -``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-005-extract-state-update-from-result.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-005-extract-state-update-from-result.sdp.md deleted file mode 100644 index 8a053b46..00000000 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-005-extract-state-update-from-result.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.decider-assertions.extract-state-update-from-result -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.decider-assertions ---- -# Extract state update from result - -## Intent - -- outcome: Executable scenario: Extract state update from result - -```gwt -Given the platform-decider testing module is imported -And a DeciderOutput with status "success" and state update setting status to "submitted" -When I call getSuccessStateUpdate(result) -Then I receive the state update object -And the status field is "submitted" -``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-006-assert-event-type-matches.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-006-assert-event-type-matches.sdp.md deleted file mode 100644 index 66e8e711..00000000 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-006-assert-event-type-matches.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-event-type-matches -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.decider-assertions ---- -# Assert event type matches - -## Intent - -- outcome: Executable scenario: Assert event type matches - -```gwt -Given the platform-decider testing module is imported -And a DeciderOutput with status "success" and event type "OrderCreated" -When I call assertEventType(result, "OrderCreated") -Then the assertion passes -``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-007-assert-event-type-fails-for-wrong-type.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-007-assert-event-type-fails-for-wrong-type.sdp.md deleted file mode 100644 index e797c715..00000000 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-007-assert-event-type-fails-for-wrong-type.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-event-type-fails-for-wrong-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.decider-assertions ---- -# Assert event type fails for wrong type - -## Intent - -- outcome: Executable scenario: Assert event type fails for wrong type - -```gwt -Given the platform-decider testing module is imported -And a DeciderOutput with status "success" and event type "OrderCreated" -When I call assertEventType(result, "OrderSubmitted") -Then the assertion fails -And the error message contains "OrderSubmitted" -``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-008-assert-event-payload-field.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-008-assert-event-payload-field.sdp.md deleted file mode 100644 index 3613c28f..00000000 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-008-assert-event-payload-field.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-event-payload-field -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.decider-assertions ---- -# Assert event payload field - -## Intent - -- outcome: Executable scenario: Assert event payload field - -```gwt -Given the platform-decider testing module is imported -And a DeciderOutput with success event containing customerId "cust-456" -When I call assertEventPayload(result, "customerId", "cust-456") -Then the assertion passes -``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-009-assert-state-update-field.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-009-assert-state-update-field.sdp.md deleted file mode 100644 index d16b47b7..00000000 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-009-assert-state-update-field.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-state-update-field -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.decider-assertions ---- -# Assert state update field - -## Intent - -- outcome: Executable scenario: Assert state update field - -```gwt -Given the platform-decider testing module is imported -And a DeciderOutput with status "success" and state update setting status to "confirmed" -When I call assertStateUpdate(result, "status", "confirmed") -Then the assertion passes -``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-010-assert-decision-rejected.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-010-assert-decision-rejected.sdp.md deleted file mode 100644 index 5e236ba0..00000000 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-010-assert-decision-rejected.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-decision-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.decider-assertions ---- -# Assert decision rejected - -## Intent - -- outcome: Executable scenario: Assert decision rejected - -```gwt -Given the platform-decider testing module is imported -And a DeciderOutput with status "rejected" and code "ORDER_NOT_FOUND" -When I call assertDecisionRejected(result) -Then the assertion passes -``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-011-assert-rejection-code-matches.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-011-assert-rejection-code-matches.sdp.md deleted file mode 100644 index 5c3c4435..00000000 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-011-assert-rejection-code-matches.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-rejection-code-matches -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.decider-assertions ---- -# Assert rejection code matches - -## Intent - -- outcome: Executable scenario: Assert rejection code matches - -```gwt -Given the platform-decider testing module is imported -And a DeciderOutput with status "rejected" and code "INVALID_STATE" -When I call assertRejectionCode(result, "INVALID_STATE") -Then the assertion passes -``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-012-assert-rejection-code-fails-for-wrong-code.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-012-assert-rejection-code-fails-for-wrong-code.sdp.md deleted file mode 100644 index 2048dac1..00000000 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-012-assert-rejection-code-fails-for-wrong-code.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-rejection-code-fails-for-wrong-code -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.decider-assertions ---- -# Assert rejection code fails for wrong code - -## Intent - -- outcome: Executable scenario: Assert rejection code fails for wrong code - -```gwt -Given the platform-decider testing module is imported -And a DeciderOutput with status "rejected" and code "INVALID_STATE" -When I call assertRejectionCode(result, "NOT_FOUND") -Then the assertion fails -And the error message contains "INVALID_STATE" -``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-013-assert-rejection-message-contains-text.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-013-assert-rejection-message-contains-text.sdp.md deleted file mode 100644 index f4e38db9..00000000 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-013-assert-rejection-message-contains-text.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-rejection-message-contains-text -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.decider-assertions ---- -# Assert rejection message contains text - -## Intent - -- outcome: Executable scenario: Assert rejection message contains text - -```gwt -Given the platform-decider testing module is imported -And a DeciderOutput with status "rejected" and message "Order must be in draft status" -When I call assertRejectionMessage(result, "draft status") -Then the assertion passes -``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-014-assert-decision-failed.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-014-assert-decision-failed.sdp.md deleted file mode 100644 index 93a70711..00000000 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-014-assert-decision-failed.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-decision-failed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.decider-assertions ---- -# Assert decision failed - -## Intent - -- outcome: Executable scenario: Assert decision failed - -```gwt -Given the platform-decider testing module is imported -And a DeciderOutput with status "failed" and reason "Database connection error" -When I call assertDecisionFailed(result) -Then the assertion passes -``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-015-assert-failure-reason-matches.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-015-assert-failure-reason-matches.sdp.md deleted file mode 100644 index 31c29dca..00000000 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.examples/s-015-assert-failure-reason-matches.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.decider-assertions.assert-failure-reason-matches -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.decider-assertions ---- -# Assert failure reason matches - -## Intent - -- outcome: Executable scenario: Assert failure reason matches - -```gwt -Given the platform-decider testing module is imported -And a DeciderOutput with status "failed" and reason "Validation failed" -When I call assertFailureReason(result, "Validation") -Then the assertion passes -``` diff --git a/specs/behavior/order-management/testing-infrastructure/decider-assertions.sdp.md b/specs/behavior/order-management/testing-infrastructure/decider-assertions.sdp.md index ca77e794..b7fb9368 100644 --- a/specs/behavior/order-management/testing-infrastructure/decider-assertions.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/decider-assertions.sdp.md @@ -11,4 +11,4 @@ relations: ## Intent - actor: a developer testing deciders -- outcome: assertion helpers for DeciderOutput results so that I can write clear, consistent test assertions +- outcome: Assertion helpers for DeciderOutput results support clear, consistent test assertions. diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-001-assert-valid-transition.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-001-assert-valid-transition.sdp.md deleted file mode 100644 index 732fb71a..00000000 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-001-assert-valid-transition.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-valid-transition -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions ---- -# Assert valid transition - -## Intent - -- outcome: Executable scenario: Assert valid transition - -```gwt -Given the platform-fsm testing module is imported -And an OrderStatus FSM with the following transitions: -When I call assertCanTransition(fsm, "draft", "submitted") -Then the assertion passes -``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-002-assert-invalid-transition-fails.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-002-assert-invalid-transition-fails.sdp.md deleted file mode 100644 index 1284fce0..00000000 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-002-assert-invalid-transition-fails.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-invalid-transition-fails -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions ---- -# Assert invalid transition fails - -## Intent - -- outcome: Executable scenario: Assert invalid transition fails - -```gwt -Given the platform-fsm testing module is imported -And an OrderStatus FSM with the following transitions: -When I call assertCanTransition(fsm, "cancelled", "confirmed") -Then the assertion fails -And the error message indicates the transition is not allowed -``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-003-assert-transition-is-not-allowed.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-003-assert-transition-is-not-allowed.sdp.md deleted file mode 100644 index 8dc1ebcf..00000000 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-003-assert-transition-is-not-allowed.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-transition-is-not-allowed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions ---- -# Assert transition is not allowed - -## Intent - -- outcome: Executable scenario: Assert transition is not allowed - -```gwt -Given the platform-fsm testing module is imported -And an OrderStatus FSM with the following transitions: -When I call assertCannotTransition(fsm, "draft", "confirmed") -Then the assertion passes -``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-004-assert-cannot-transition-fails-for-valid-transition.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-004-assert-cannot-transition-fails-for-valid-transition.sdp.md deleted file mode 100644 index aa47a1a3..00000000 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-004-assert-cannot-transition-fails-for-valid-transition.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-cannot-transition-fails-for-valid-transition -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions ---- -# Assert cannot transition fails for valid transition - -## Intent - -- outcome: Executable scenario: Assert cannot transition fails for valid transition - -```gwt -Given the platform-fsm testing module is imported -And an OrderStatus FSM with the following transitions: -When I call assertCannotTransition(fsm, "draft", "submitted") -Then the assertion fails -And the error message indicates the transition IS allowed -``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-005-assert-terminal-state.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-005-assert-terminal-state.sdp.md deleted file mode 100644 index 6b27884f..00000000 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-005-assert-terminal-state.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-terminal-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions ---- -# Assert terminal state - -## Intent - -- outcome: Executable scenario: Assert terminal state - -```gwt -Given the platform-fsm testing module is imported -And an OrderStatus FSM with the following transitions: -When I call assertIsTerminalState(fsm, "cancelled") -Then the assertion passes -``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-006-assert-terminal-state-fails-for-non-terminal.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-006-assert-terminal-state-fails-for-non-terminal.sdp.md deleted file mode 100644 index 4959a4f7..00000000 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-006-assert-terminal-state-fails-for-non-terminal.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-terminal-state-fails-for-non-terminal -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions ---- -# Assert terminal state fails for non-terminal - -## Intent - -- outcome: Executable scenario: Assert terminal state fails for non-terminal - -```gwt -Given the platform-fsm testing module is imported -And an OrderStatus FSM with the following transitions: -When I call assertIsTerminalState(fsm, "submitted") -Then the assertion fails -And the error message indicates "submitted" is not terminal -``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-007-assert-non-terminal-state.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-007-assert-non-terminal-state.sdp.md deleted file mode 100644 index ec1b245e..00000000 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-007-assert-non-terminal-state.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-non-terminal-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions ---- -# Assert non-terminal state - -## Intent - -- outcome: Executable scenario: Assert non-terminal state - -```gwt -Given the platform-fsm testing module is imported -And an OrderStatus FSM with the following transitions: -When I call assertIsNotTerminalState(fsm, "draft") -Then the assertion passes -``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-008-assert-initial-state.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-008-assert-initial-state.sdp.md deleted file mode 100644 index 50f39c13..00000000 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-008-assert-initial-state.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-initial-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions ---- -# Assert initial state - -## Intent - -- outcome: Executable scenario: Assert initial state - -```gwt -Given the platform-fsm testing module is imported -And an OrderStatus FSM with the following transitions: -When I call assertIsInitialState(fsm, "draft") -Then the assertion passes -``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-009-assert-valid-state.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-009-assert-valid-state.sdp.md deleted file mode 100644 index 6090e675..00000000 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-009-assert-valid-state.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-valid-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions ---- -# Assert valid state - -## Intent - -- outcome: Executable scenario: Assert valid state - -```gwt -Given the platform-fsm testing module is imported -And an OrderStatus FSM with the following transitions: -When I call assertIsValidState(fsm, "submitted") -Then the assertion passes -``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-010-assert-invalid-state-fails.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-010-assert-invalid-state-fails.sdp.md deleted file mode 100644 index ec3d8de0..00000000 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-010-assert-invalid-state-fails.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-invalid-state-fails -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions ---- -# Assert invalid state fails - -## Intent - -- outcome: Executable scenario: Assert invalid state fails - -```gwt -Given the platform-fsm testing module is imported -And an OrderStatus FSM with the following transitions: -When I call assertIsValidState(fsm, "nonexistent") -Then the assertion fails -``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-011-get-all-valid-transitions.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-011-get-all-valid-transitions.sdp.md deleted file mode 100644 index be03abe1..00000000 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-011-get-all-valid-transitions.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.get-all-valid-transitions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions ---- -# Get all valid transitions - -## Intent - -- outcome: Executable scenario: Get all valid transitions - -```gwt -Given the platform-fsm testing module is imported -And an OrderStatus FSM with the following transitions: -When I call getAllValidTransitions(fsm) -Then I receive a list of [from, to] state pairs -And the list includes ["draft", "submitted"] -And the list includes ["submitted", "confirmed"] -And the list includes ["submitted", "cancelled"] -And the list includes ["confirmed", "cancelled"] -``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-012-get-all-states.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-012-get-all-states.sdp.md deleted file mode 100644 index 70be6dce..00000000 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-012-get-all-states.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.get-all-states -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions ---- -# Get all states - -## Intent - -- outcome: Executable scenario: Get all states - -```gwt -Given the platform-fsm testing module is imported -And an OrderStatus FSM with the following transitions: -When I call getAllStates(fsm) -Then I receive a list containing "draft", "submitted", "confirmed", "cancelled" -``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-013-get-terminal-states.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-013-get-terminal-states.sdp.md deleted file mode 100644 index 3f38594c..00000000 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-013-get-terminal-states.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.get-terminal-states -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions ---- -# Get terminal states - -## Intent - -- outcome: Executable scenario: Get terminal states - -```gwt -Given the platform-fsm testing module is imported -And an OrderStatus FSM with the following transitions: -When I call getTerminalStates(fsm) -Then I receive a list containing only "cancelled" -``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-014-get-non-terminal-states.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-014-get-non-terminal-states.sdp.md deleted file mode 100644 index 54f6673c..00000000 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-014-get-non-terminal-states.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.get-non-terminal-states -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions ---- -# Get non-terminal states - -## Intent - -- outcome: Executable scenario: Get non-terminal states - -```gwt -Given the platform-fsm testing module is imported -And an OrderStatus FSM with the following transitions: -When I call getNonTerminalStates(fsm) -Then I receive a list containing "draft", "submitted", "confirmed" -And the list does not contain "cancelled" -``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-015-assert-valid-transitions-from-a-state.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-015-assert-valid-transitions-from-a-state.sdp.md deleted file mode 100644 index c7f0a649..00000000 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.examples/s-015-assert-valid-transitions-from-a-state.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.fsm-assertions.assert-valid-transitions-from-a-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.fsm-assertions ---- -# Assert valid transitions from a state - -## Intent - -- outcome: Executable scenario: Assert valid transitions from a state - -```gwt -Given the platform-fsm testing module is imported -And an OrderStatus FSM with the following transitions: -When I call assertValidTransitionsFrom(fsm, "submitted", ["confirmed", "cancelled"]) -Then the assertion passes -``` diff --git a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.sdp.md b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.sdp.md index b597d2df..e756b913 100644 --- a/specs/behavior/order-management/testing-infrastructure/fsm-assertions.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/fsm-assertions.sdp.md @@ -11,4 +11,4 @@ relations: ## Intent - actor: a developer testing finite state machines -- outcome: FSM-specific assertion helpers so that I can verify transition validity concisely +- outcome: FSM-specific assertion helpers verify transition validity concisely. diff --git a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-001-generate-unique-test-run-id.sdp.md b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-001-generate-unique-test-run-id.sdp.md deleted file mode 100644 index 51372f5f..00000000 --- a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-001-generate-unique-test-run-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.test-isolation.generate-unique-test-run-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.test-isolation ---- -# Generate unique test run ID - -## Intent - -- outcome: Executable scenario: Generate unique test run ID - -```gwt -Given the platform-core testing module is imported -When I call generateTestRunId() -Then I receive a unique string identifier -And subsequent calls return different IDs -``` diff --git a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-002-module-level-test-run-id-is-stable-within-a-test-run.sdp.md b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-002-module-level-test-run-id-is-stable-within-a-test-run.sdp.md deleted file mode 100644 index 1741386c..00000000 --- a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-002-module-level-test-run-id-is-stable-within-a-test-run.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.test-isolation.module-level-test-run-id-is-stable-within-a-test-run -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.test-isolation ---- -# Module-level testRunId is stable within a test run - -## Intent - -- outcome: Executable scenario: Module-level testRunId is stable within a test run - -```gwt -Given the platform-core testing module is imported -And a test run has started -When I access testRunId multiple times -Then the same value is returned each time -``` diff --git a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-003-prefix-entity-i-ds-with-test-run-namespace.sdp.md b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-003-prefix-entity-i-ds-with-test-run-namespace.sdp.md deleted file mode 100644 index 23d42ab6..00000000 --- a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-003-prefix-entity-i-ds-with-test-run-namespace.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.test-isolation.prefix-entity-i-ds-with-test-run-namespace -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.test-isolation ---- -# Prefix entity IDs with test run namespace - -## Intent - -- outcome: Executable scenario: Prefix entity IDs with test run namespace - -```gwt -Given the platform-core testing module is imported -And a testRunId has been generated -When I call withPrefix("order-123") -Then the result contains the testRunId prefix -And the original ID is preserved after the prefix -And the format is "{testRunId}_order-123" -``` diff --git a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-004-custom-prefix-for-specific-isolation.sdp.md b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-004-custom-prefix-for-specific-isolation.sdp.md deleted file mode 100644 index 5298bd93..00000000 --- a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-004-custom-prefix-for-specific-isolation.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.test-isolation.custom-prefix-for-specific-isolation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.test-isolation ---- -# Custom prefix for specific isolation - -## Intent - -- outcome: Executable scenario: Custom prefix for specific isolation - -```gwt -Given the platform-core testing module is imported -When I call withCustomPrefix("mytest", "order-123") -Then the result is "mytest_order-123" -``` diff --git a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-005-test-isolation-prevents-cross-test-pollution.sdp.md b/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-005-test-isolation-prevents-cross-test-pollution.sdp.md deleted file mode 100644 index 3292bd9a..00000000 --- a/specs/behavior/order-management/testing-infrastructure/test-isolation.examples/s-005-test-isolation-prevents-cross-test-pollution.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.testing-infrastructure.test-isolation.test-isolation-prevents-cross-test-pollution -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.testing-infrastructure.test-isolation ---- -# Test isolation prevents cross-test pollution - -## Intent - -- outcome: Executable scenario: Test isolation prevents cross-test pollution - -```gwt -Given the platform-core testing module is imported -And test A creates an entity with withPrefix("entity-1") -And test B has a different testRunId -When test B queries for entities -Then test B does not see test A's entity -``` diff --git a/specs/behavior/order-management/testing-infrastructure/test-isolation.sdp.md b/specs/behavior/order-management/testing-infrastructure/test-isolation.sdp.md index badf3b5f..43d2fdc2 100644 --- a/specs/behavior/order-management/testing-infrastructure/test-isolation.sdp.md +++ b/specs/behavior/order-management/testing-infrastructure/test-isolation.sdp.md @@ -11,4 +11,4 @@ relations: ## Intent - actor: a test author -- outcome: automatic namespace isolation for test data so that tests don't interfere with each other +- outcome: Automatic namespace isolation for test data keeps tests from interfering with each other. diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-001-successful-command-records-intent-and-completion.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-001-successful-command-records-intent-and-completion.sdp.md deleted file mode 100644 index b8d51d1e..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-001-successful-command-records-intent-and-completion.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.durable-commands.successful-command-records-intent-and-completion -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.durable-commands ---- -# Successful command records intent and completion - -## Intent - -- outcome: Executable scenario: Successful command records intent and completion - -```gwt -Given the backend is running and clean -And durable command execution is configured with timeoutMs 5000 -And a draft order exists for durable command test -When I submit the order using durable execution -Then an intent record should exist for the command -And the intent status should be "completed" -And the intent should have a completionEventId -And the order status should be "submitted" -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-002-intent-record-captures-command-metadata.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-002-intent-record-captures-command-metadata.sdp.md deleted file mode 100644 index 5b6feffd..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-002-intent-record-captures-command-metadata.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.durable-commands.intent-record-captures-command-metadata -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.durable-commands ---- -# Intent record captures command metadata - -## Intent - -- outcome: Executable scenario: Intent record captures command metadata - -```gwt -Given the backend is running and clean -And durable command execution is configured with timeoutMs 5000 -And a draft order exists for durable command test -When I submit the order using durable execution with correlationId "corr-dur-001" -Then the intent record should have correlationId "corr-dur-001" -And the intent record should have operationType "SubmitOrder" -And the intent record should have boundedContext "orders" -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-003-business-rejection-records-failed-intent.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-003-business-rejection-records-failed-intent.sdp.md deleted file mode 100644 index 95d2a23e..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-003-business-rejection-records-failed-intent.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.durable-commands.business-rejection-records-failed-intent -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.durable-commands ---- -# Business rejection records failed intent - -## Intent - -- outcome: Executable scenario: Business rejection records failed intent - -```gwt -Given the backend is running and clean -And durable command execution is configured with timeoutMs 5000 -And an empty draft order exists for durable command test -When I submit the order using durable execution -Then an intent record should exist for the command -And the intent status should be "failed" -And the intent error should contain "EMPTY_ORDER" -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-004-technical-failure-records-failed-intent.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-004-technical-failure-records-failed-intent.sdp.md deleted file mode 100644 index a016dbe9..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-004-technical-failure-records-failed-intent.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.durable-commands.technical-failure-records-failed-intent -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.durable-commands ---- -# Technical failure records failed intent - -## Intent - -- outcome: Executable scenario: Technical failure records failed intent - -```gwt -Given the backend is running and clean -And durable command execution is configured with timeoutMs 5000 -And a non-existent order for durable command test -When I attempt to submit the order using durable execution -Then an intent record should exist for the command -And the intent status should be "failed" -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-005-intent-statistics-show-correct-counts.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-005-intent-statistics-show-correct-counts.sdp.md deleted file mode 100644 index f9022d1b..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.examples/s-005-intent-statistics-show-correct-counts.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.durable-commands.intent-statistics-show-correct-counts -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.durable-commands ---- -# Intent statistics show correct counts - -## Intent - -- outcome: Executable scenario: Intent statistics show correct counts - -```gwt -Given the backend is running and clean -And durable command execution is configured with timeoutMs 5000 -And multiple durable commands have been executed -When I query intent stats -Then stats should show pending, completed, failed, and abandoned counts -And the total should match the sum of all statuses -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.sdp.md index ed91e10e..b6b3a9cf 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-commands.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-commands.sdp.md @@ -11,7 +11,7 @@ relations: ## Intent - actor: a developer using event sourcing -- outcome: commands to be tracked with intent/completion bracketing so that crashed or hung commands can be detected and recovered +- outcome: Commands are tracked with intent and completion bracketing so that crashed or hung commands can be detected and recovered. ## Behavior diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-001-publishing-creates-records-for-each-target-context.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-001-publishing-creates-records-for-each-target-context.sdp.md deleted file mode 100644 index 55cf9e87..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-001-publishing-creates-records-for-each-target-context.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.durable-publication.publishing-creates-records-for-each-target-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication ---- -# Partition key format is eventId:targetContext - -## Intent - -- outcome: Executable scenario: Partition key format is eventId:targetContext - -```gwt -Given an eventId "evt-123" and target context "inventory" -When creating a publication partition key -Then the partition key value should be "evt-123:inventory" -And the partition key name should be "publication" -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-002-publication-records-contain-event-metadata.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-002-publication-records-contain-event-metadata.sdp.md deleted file mode 100644 index 0820026e..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-002-publication-records-contain-event-metadata.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.durable-publication.publication-records-contain-event-metadata -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication ---- -# Different events get different partition keys - -## Intent - -- outcome: Executable scenario: Different events get different partition keys - -```gwt -Given an eventId "value" and target context "value" -When creating a publication partition key -Then the partition key value should be "value" -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-003-publish-result-contains-publication-i-ds.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-003-publish-result-contains-publication-i-ds.sdp.md deleted file mode 100644 index bb9602d6..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-003-publish-result-contains-publication-i-ds.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.durable-publication.publish-result-contains-publication-i-ds -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication ---- -# Publishing event creates tracking records for each target - -## Intent - -- outcome: Executable scenario: Publishing event creates tracking records for each target - -```gwt -Given a durable event publisher configured with maxAttempts 5 -And an event "evt-123" to publish to contexts "inventory" and "notifications" -When publishing the event -Then 2 publication tracking records should be created -And each record should have status "pending" -And each record should have attemptCount 0 -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-004-query-publications-by-event-id.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-004-query-publications-by-event-id.sdp.md deleted file mode 100644 index d22a8dba..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-004-query-publications-by-event-id.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.durable-publication.query-publications-by-event-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication ---- -# Publishing event enqueues delivery actions via Workpool - -## Intent - -- outcome: Executable scenario: Publishing event enqueues delivery actions via Workpool - -```gwt -Given a durable event publisher configured with maxAttempts 5 -And an event "evt-123" to publish to contexts "inventory" and "notifications" -When publishing the event -Then 2 delivery actions should be enqueued -And each action should have correct partition key -And each action should have onComplete handler set -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-005-query-returns-empty-for-unknown-event.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-005-query-returns-empty-for-unknown-event.sdp.md deleted file mode 100644 index cb4c1cc1..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-005-query-returns-empty-for-unknown-event.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.durable-publication.query-returns-empty-for-unknown-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication ---- -# Publish result contains publication IDs for each target - -## Intent - -- outcome: Executable scenario: Publish result contains publication IDs for each target - -```gwt -Given a durable event publisher -And an event "evt-123" to publish to contexts "inventory" and "notifications" -When publishing the event -Then the result should contain eventId "evt-123" -And the result should have 2 publications -And each publication should have a unique publicationId starting with "pub_" -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-006-query-publications-by-status.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-006-query-publications-by-status.sdp.md deleted file mode 100644 index 3185b7b2..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-006-query-publications-by-status.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.durable-publication.query-publications-by-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication ---- -# Correlation ID is passed through to tracking records - -## Intent - -- outcome: Executable scenario: Correlation ID is passed through to tracking records - -```gwt -Given a durable event publisher -And an event "evt-123" with correlationId "corr-456" -And target contexts "inventory" -When publishing the event -Then the tracking record should have correlationId "corr-456" -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-007-stats-show-counts-by-status.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-007-stats-show-counts-by-status.sdp.md deleted file mode 100644 index d4145675..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-007-stats-show-counts-by-status.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.durable-publication.stats-show-counts-by-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication ---- -# Get publication status returns all target contexts - -## Intent - -- outcome: Executable scenario: Get publication status returns all target contexts - -```gwt -Given publications exist for event "evt-123" to 3 targets -When getting publication status for event "evt-123" -Then the result should contain 3 publications -And the result should show inventory as delivered -And the result should show analytics as dead_letter -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-008-publications-for-different-events-are-isolated.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-008-publications-for-different-events-are-isolated.sdp.md deleted file mode 100644 index 264abd65..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.examples/s-008-publications-for-different-events-are-isolated.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.durable-publication.publications-for-different-events-are-isolated -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.durable-publication ---- -# Get publication status returns empty array for unknown event - -## Intent - -- outcome: Executable scenario: Get publication status returns empty array for unknown event - -```gwt -Given no publications exist for event "evt-unknown" -When getting publication status for event "evt-unknown" -Then the result should be an empty array -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.sdp.md index ffaf99ce..72fa2eb9 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/durable-publication.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/durable-publication.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Durable Cross-Context Event Publication +- outcome: Cross-context events are published durably so each target context can be tracked independently. diff --git a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-001-create-a-running-checkpoint-for-replay.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-001-create-a-running-checkpoint-for-replay.sdp.md deleted file mode 100644 index d067cf32..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-001-create-a-running-checkpoint-for-replay.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.event-replay.create-a-running-checkpoint-for-replay -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.event-replay ---- -# Create a running checkpoint for replay - -## Intent - -- outcome: Executable scenario: Create a running checkpoint for replay - -```gwt -Given the backend is running and clean -When creating a checkpoint for projection "orderSummary" -Then a checkpoint should exist in replayCheckpoints -And the checkpoint status should be "running" -And the checkpoint eventsProcessed should be 0 -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-002-update-checkpoint-progress.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-002-update-checkpoint-progress.sdp.md deleted file mode 100644 index 14993cce..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-002-update-checkpoint-progress.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.event-replay.update-checkpoint-progress -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.event-replay ---- -# Update checkpoint progress - -## Intent - -- outcome: Executable scenario: Update checkpoint progress - -```gwt -Given the backend is running and clean -And a running checkpoint for projection "testProjection" -When updating the checkpoint with 50 events processed -Then the checkpoint eventsProcessed should be 50 -And the updatedAt timestamp should be recent -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-003-cannot-start-replay-for-already-running-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-003-cannot-start-replay-for-already-running-projection.sdp.md deleted file mode 100644 index 654a8e8e..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-003-cannot-start-replay-for-already-running-projection.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.event-replay.cannot-start-replay-for-already-running-projection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.event-replay ---- -# Cannot start replay for already running projection - -## Intent - -- outcome: Executable scenario: Cannot start replay for already running projection - -```gwt -Given the backend is running and clean -And a running replay exists for projection "orderSummary" -When attempting to start another replay for "orderSummary" -Then the result should indicate REPLAY_ALREADY_ACTIVE -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-004-query-checkpoint-by-replay-id.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-004-query-checkpoint-by-replay-id.sdp.md deleted file mode 100644 index 89a0e5c1..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-004-query-checkpoint-by-replay-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.event-replay.query-checkpoint-by-replay-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.event-replay ---- -# Query checkpoint by replayId - -## Intent - -- outcome: Executable scenario: Query checkpoint by replayId - -```gwt -Given the backend is running and clean -And a checkpoint exists with replayId "replay-test-001" -When querying checkpoint by replayId -Then the checkpoint should be returned with correct details -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-005-list-checkpoints-by-status.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-005-list-checkpoints-by-status.sdp.md deleted file mode 100644 index 199a2c66..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/event-replay.examples/s-005-list-checkpoints-by-status.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.event-replay.list-checkpoints-by-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.event-replay ---- -# List checkpoints by status - -## Intent - -- outcome: Executable scenario: List checkpoints by status - -```gwt -Given the backend is running and clean -And multiple checkpoints with different statuses exist -When listing checkpoints with status "running" -Then only running checkpoints should be returned -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/event-replay.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/event-replay.sdp.md index 68c240ea..4953d5d7 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/event-replay.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/event-replay.sdp.md @@ -11,7 +11,7 @@ relations: ## Intent - actor: a developer maintaining projections -- outcome: to rebuild projections from event history so that I can recover from bugs or add new projections +- outcome: Projections are rebuilt from event history so that operators can recover from bugs or add new projections. ## Behavior diff --git a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-001-append-event-with-unique-idempotency-key-succeeds.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-001-append-event-with-unique-idempotency-key-succeeds.sdp.md deleted file mode 100644 index 56682567..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-001-append-event-with-unique-idempotency-key-succeeds.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.idempotent-append.append-event-with-unique-idempotency-key-succeeds -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.idempotent-append ---- -# Command idempotency key uses commandType:entityId:commandId format - -## Intent - -- outcome: Executable scenario: Command idempotency key uses commandType:entityId:commandId format - -```gwt -Given the feature fixture is in place -When building command idempotency key with type "SubmitOrder", entity "ord-123", command "cmd-456" -Then the idempotency key should be "SubmitOrder:ord-123:cmd-456" -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-002-different-idempotency-keys-create-separate-events.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-002-different-idempotency-keys-create-separate-events.sdp.md deleted file mode 100644 index 1897001c..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-002-different-idempotency-keys-create-separate-events.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.idempotent-append.different-idempotency-keys-create-separate-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.idempotent-append ---- -# Action idempotency key uses actionType:entityId format - -## Intent - -- outcome: Executable scenario: Action idempotency key uses actionType:entityId format - -```gwt -Given the feature fixture is in place -When building action idempotency key with type "payment" and entity "ord-123" -Then the idempotency key should be "payment:ord-123" -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-003-second-append-with-same-idempotency-key-returns-duplicate.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-003-second-append-with-same-idempotency-key-returns-duplicate.sdp.md deleted file mode 100644 index f6d2ebff..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-003-second-append-with-same-idempotency-key-returns-duplicate.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.idempotent-append.second-append-with-same-idempotency-key-returns-duplicate -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.idempotent-append ---- -# Saga step idempotency key uses sagaType:sagaId:step format - -## Intent - -- outcome: Executable scenario: Saga step idempotency key uses sagaType:sagaId:step format - -```gwt -Given the feature fixture is in place -When building saga step idempotency key with type "OrderFulfillment", id "saga-789", step "reserveStock" -Then the idempotency key should be "OrderFulfillment:saga-789:reserveStock" -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-004-same-key-with-different-payload-is-rejected.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-004-same-key-with-different-payload-is-rejected.sdp.md deleted file mode 100644 index fced5dab..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-004-same-key-with-different-payload-is-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.idempotent-append.same-key-with-different-payload-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.idempotent-append ---- -# Scheduled job idempotency key uses jobType:scheduleId:timestamp format - -## Intent - -- outcome: Executable scenario: Scheduled job idempotency key uses jobType:scheduleId:timestamp format - -```gwt -Given the feature fixture is in place -When building scheduled job idempotency key with type "expireReservations", schedule "job-001", timestamp 1704067200 -Then the idempotency key should be "expireReservations:job-001:1704067200" -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-005-same-idempotency-key-on-different-streams-creates-separate-events.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-005-same-idempotency-key-on-different-streams-creates-separate-events.sdp.md deleted file mode 100644 index 3d085b0e..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.examples/s-005-same-idempotency-key-on-different-streams-creates-separate-events.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.idempotent-append.same-idempotency-key-on-different-streams-creates-separate-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.idempotent-append ---- -# First append with idempotency key succeeds - -## Intent - -- outcome: Executable scenario: First append with idempotency key succeeds - -```gwt -Given no existing event for idempotency key "payment:ord-123" -When calling idempotentAppendEvent with key "payment:ord-123" -Then the append result status should be "appended" -And a new event ID should be generated -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.sdp.md index b142bcd8..f8e0ba4d 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/idempotent-append.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Idempotent Event Append +- outcome: Event append is idempotent so duplicate writes do not create duplicate events. diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-001-intent-exceeding-timeout-is-flagged-as-abandoned.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-001-intent-exceeding-timeout-is-flagged-as-abandoned.sdp.md deleted file mode 100644 index 8f6c492b..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-001-intent-exceeding-timeout-is-flagged-as-abandoned.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.orphan-detection.intent-exceeding-timeout-is-flagged-as-abandoned -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.orphan-detection ---- -# Intent exceeding timeout is flagged as abandoned - -## Intent - -- outcome: Executable scenario: Intent exceeding timeout is flagged as abandoned - -```gwt -Given the backend is running and clean -And orphan detection is configured -And a pending intent exists with timeout 100ms -And the intent was created more than 100ms ago -When the orphan detection runs -Then the intent should be marked as "abandoned" -And the intent should have an error message about timeout -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-002-intent-within-timeout-is-not-flagged.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-002-intent-within-timeout-is-not-flagged.sdp.md deleted file mode 100644 index 79dfb64d..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-002-intent-within-timeout-is-not-flagged.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.orphan-detection.intent-within-timeout-is-not-flagged -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.orphan-detection ---- -# Intent within timeout is not flagged - -## Intent - -- outcome: Executable scenario: Intent within timeout is not flagged - -```gwt -Given the backend is running and clean -And orphan detection is configured -And a pending intent exists with timeout 60000ms -And the intent was created recently -When the orphan detection runs -Then the intent should still be "pending" -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-003-completed-intent-is-not-flagged-even-if-old.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-003-completed-intent-is-not-flagged-even-if-old.sdp.md deleted file mode 100644 index ee29caff..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-003-completed-intent-is-not-flagged-even-if-old.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.orphan-detection.completed-intent-is-not-flagged-even-if-old -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.orphan-detection ---- -# Completed intent is not flagged even if old - -## Intent - -- outcome: Executable scenario: Completed intent is not flagged even if old - -```gwt -Given the backend is running and clean -And orphan detection is configured -And a completed intent exists from long ago -When the orphan detection runs -Then the intent should still be "completed" -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-004-failed-intent-is-not-flagged-even-if-old.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-004-failed-intent-is-not-flagged-even-if-old.sdp.md deleted file mode 100644 index caa5cd21..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-004-failed-intent-is-not-flagged-even-if-old.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.orphan-detection.failed-intent-is-not-flagged-even-if-old -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.orphan-detection ---- -# Failed intent is not flagged even if old - -## Intent - -- outcome: Executable scenario: Failed intent is not flagged even if old - -```gwt -Given the backend is running and clean -And orphan detection is configured -And a failed intent exists from long ago -When the orphan detection runs -Then the intent should still be "failed" -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-005-list-abandoned-intents-for-investigation.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-005-list-abandoned-intents-for-investigation.sdp.md deleted file mode 100644 index 844a8fb0..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-005-list-abandoned-intents-for-investigation.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.orphan-detection.list-abandoned-intents-for-investigation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.orphan-detection ---- -# List abandoned intents for investigation - -## Intent - -- outcome: Executable scenario: List abandoned intents for investigation - -```gwt -Given the backend is running and clean -And orphan detection is configured -And multiple intents have been abandoned -When I query abandoned intents -Then I should receive a list of abandoned intents -And each intent should have intentKey, operationType, and error -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-006-timeout-handler-marks-pending-intent-as-abandoned.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-006-timeout-handler-marks-pending-intent-as-abandoned.sdp.md deleted file mode 100644 index 359184ad..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-006-timeout-handler-marks-pending-intent-as-abandoned.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.orphan-detection.timeout-handler-marks-pending-intent-as-abandoned -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.orphan-detection ---- -# Timeout handler marks pending intent as abandoned - -## Intent - -- outcome: Executable scenario: Timeout handler marks pending intent as abandoned - -```gwt -Given the backend is running and clean -And orphan detection is configured -And a pending intent exists with intentKey "timeout-test-001" -When the timeout handler fires for intentKey "timeout-test-001" -Then the intent status should be "abandoned" -And the result should be "abandoned" -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-007-timeout-handler-no-ops-for-completed-intent.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-007-timeout-handler-no-ops-for-completed-intent.sdp.md deleted file mode 100644 index 445b2dfa..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.examples/s-007-timeout-handler-no-ops-for-completed-intent.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.orphan-detection.timeout-handler-no-ops-for-completed-intent -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.orphan-detection ---- -# Timeout handler no-ops for completed intent - -## Intent - -- outcome: Executable scenario: Timeout handler no-ops for completed intent - -```gwt -Given the backend is running and clean -And orphan detection is configured -And a completed intent exists with intentKey "timeout-test-002" -When the timeout handler fires for intentKey "timeout-test-002" -Then the intent status should still be "completed" -And the result should be "already_completed" -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.sdp.md index ec3e013b..0a9f4380 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/orphan-detection.sdp.md @@ -11,7 +11,7 @@ relations: ## Intent - actor: a developer using event sourcing -- outcome: orphaned intents to be detected and flagged so that stuck commands can be investigated and recovered +- outcome: Orphaned intents are detected and flagged so that stuck commands can be investigated and recovered. ## Behavior diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-001-first-failure-creates-pending-poison-record.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-001-first-failure-creates-pending-poison-record.sdp.md deleted file mode 100644 index 3a018334..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-001-first-failure-creates-pending-poison-record.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.poison-event.first-failure-creates-pending-poison-record -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.poison-event ---- -# Successful processing creates no poison record - -## Intent - -- outcome: Executable scenario: Successful processing creates no poison record - -```gwt -Given a poison event handler wrapping a successful projection -When processing an event -Then no poison record should be created -And the handler should complete successfully -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-002-second-failure-increments-attempt-count.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-002-second-failure-increments-attempt-count.sdp.md deleted file mode 100644 index bff863c7..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-002-second-failure-increments-attempt-count.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.poison-event.second-failure-increments-attempt-count -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.poison-event ---- -# First failure records attempt but does not quarantine - -## Intent - -- outcome: Executable scenario: First failure records attempt but does not quarantine - -```gwt -Given a poison event handler with maxAttempts 3 and no existing record -When processing an event that throws an error -Then a poison record should be created with attemptCount 1 -And the record status should be "pending" -And the original error should be re-thrown -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-003-event-quarantined-after-3-failures.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-003-event-quarantined-after-3-failures.sdp.md deleted file mode 100644 index 96413315..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-003-event-quarantined-after-3-failures.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.poison-event.event-quarantined-after-3-failures -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.poison-event ---- -# Event becomes quarantined after max retries - -## Intent - -- outcome: Executable scenario: Event becomes quarantined after max retries - -```gwt -Given a poison event handler with maxAttempts 3 and existing record with 2 attempts -When processing an event that throws an error -Then the poison record should be updated to status "quarantined" -And the error should NOT be re-thrown -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-004-quarantine-captures-error-details.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-004-quarantine-captures-error-details.sdp.md deleted file mode 100644 index baad50e6..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-004-quarantine-captures-error-details.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.poison-event.quarantine-captures-error-details -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.poison-event ---- -# Quarantined event is silently skipped - -## Intent - -- outcome: Executable scenario: Quarantined event is silently skipped - -```gwt -Given a poison event handler with a quarantined record for the event -When processing the quarantined event -Then the projection handler should NOT be called -And no error should be thrown -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-005-quarantined-event-bypasses-handler-completely.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-005-quarantined-event-bypasses-handler-completely.sdp.md deleted file mode 100644 index 9b2a37ec..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-005-quarantined-event-bypasses-handler-completely.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.poison-event.quarantined-event-bypasses-handler-completely -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.poison-event ---- -# onQuarantine callback invoked when alertOnQuarantine is true - -## Intent - -- outcome: Executable scenario: onQuarantine callback invoked when alertOnQuarantine is true - -```gwt -Given a poison handler with alertOnQuarantine true and onQuarantine callback -When an event becomes quarantined -Then the onQuarantine callback should be invoked with event details -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-006-unquarantine-resets-status-for-retry.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-006-unquarantine-resets-status-for-retry.sdp.md deleted file mode 100644 index ae345300..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-006-unquarantine-resets-status-for-retry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.poison-event.unquarantine-resets-status-for-retry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.poison-event ---- -# onQuarantine NOT invoked when alertOnQuarantine is false - -## Intent - -- outcome: Executable scenario: onQuarantine NOT invoked when alertOnQuarantine is false - -```gwt -Given a poison handler with alertOnQuarantine false -When an event becomes quarantined -Then the onQuarantine callback should NOT be invoked -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-007-unquarantine-of-non-quarantined-event-returns-not-quarantined.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-007-unquarantine-of-non-quarantined-event-returns-not-quarantined.sdp.md deleted file mode 100644 index ac3a9763..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-007-unquarantine-of-non-quarantined-event-returns-not-quarantined.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.poison-event.unquarantine-of-non-quarantined-event-returns-not-quarantined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.poison-event ---- -# isEventQuarantined returns true for quarantined event - -## Intent - -- outcome: Executable scenario: isEventQuarantined returns true for quarantined event - -```gwt -Given a quarantined poison record for event "evt-123" -When checking if event "evt-123" is quarantined for projection "orderSummary" -Then the result should be true -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-008-stats-show-quarantined-event-counts-by-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-008-stats-show-quarantined-event-counts-by-projection.sdp.md deleted file mode 100644 index a1296761..00000000 --- a/specs/behavior/order-management/tests/integration-features/durability/poison-event.examples/s-008-stats-show-quarantined-event-counts-by-projection.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durability.poison-event.stats-show-quarantined-event-counts-by-projection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durability.poison-event ---- -# isEventQuarantined returns false for non-quarantined event - -## Intent - -- outcome: Executable scenario: isEventQuarantined returns false for non-quarantined event - -```gwt -Given a pending poison record for event "evt-123" -When checking if event "evt-123" is quarantined for projection "orderSummary" -Then the result should be false -``` diff --git a/specs/behavior/order-management/tests/integration-features/durability/poison-event.sdp.md b/specs/behavior/order-management/tests/integration-features/durability/poison-event.sdp.md index d549c0d7..0d2e9ae9 100644 --- a/specs/behavior/order-management/tests/integration-features/durability/poison-event.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durability/poison-event.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Poison Event Handling +- outcome: Events that repeatedly fail processing are quarantined so projections can continue. diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-001-dcb-operation-succeeds-on-first-attempt.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-001-dcb-operation-succeeds-on-first-attempt.sdp.md deleted file mode 100644 index 1d0e0402..00000000 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-001-dcb-operation-succeeds-on-first-attempt.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry.dcb-operation-succeeds-on-first-attempt -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry ---- -# DCB operation succeeds on first attempt - -## Intent - -- outcome: Executable scenario: DCB operation succeeds on first attempt - -```gwt -Given the backend is running and clean -And a product "dcb-prod-01" exists with 100 available stock -When I reserve stock via DCB for order "dcb-ord-01" with: -Then the DCB result status should be "success" -And no retry should be scheduled -And I wait for projections to process -And the product "dcb-prod-01" should have 90 available and 10 reserved stock -``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-002-dcb-rejected-result-passes-through-unchanged.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-002-dcb-rejected-result-passes-through-unchanged.sdp.md deleted file mode 100644 index d902418d..00000000 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-002-dcb-rejected-result-passes-through-unchanged.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry.dcb-rejected-result-passes-through-unchanged -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry ---- -# DCB rejected result passes through unchanged - -## Intent - -- outcome: Executable scenario: DCB rejected result passes through unchanged - -```gwt -Given the backend is running and clean -And a product "dcb-prod-02" exists with 5 available stock -When I reserve stock via DCB for order "dcb-ord-02" with: -Then the DCB result status should be "failed" -And the result should include failure reason -And no retry should be scheduled -``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-003-dcb-conflict-returns-retry-metadata-with-updated-version.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-003-dcb-conflict-returns-retry-metadata-with-updated-version.sdp.md deleted file mode 100644 index 589c57be..00000000 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-003-dcb-conflict-returns-retry-metadata-with-updated-version.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry.dcb-conflict-returns-retry-metadata-with-updated-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry ---- -# DCB conflict returns retry metadata with updated version - -## Intent - -- outcome: Executable scenario: DCB conflict returns retry metadata with updated version - -```gwt -Given the backend is running and clean -And a DCB test scope "conflict-scope-01" is initialized -And the scope version is advanced to cause conflict -When I execute a DCB operation with expected version 0 -Then the DCB result status should be "deferred" -And retry metadata should include a DCB partition key -And the retry should use the updated expected version -``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md deleted file mode 100644 index d44c1ff1..00000000 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry.max-retries-exceeded-returns-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry ---- -# Max retries exceeded returns rejected - -## Intent - -- outcome: Executable scenario: Max retries exceeded returns rejected - -```gwt -Given the backend is running and clean -And a DCB test scope "max-retry-scope" is initialized -When I execute a DCB operation at max attempt count -Then the DCB result status should be "rejected" -And the result code should be "DCB_MAX_RETRIES_EXCEEDED" -``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-005-final-scope-conflict-rolls-back-state-updates.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-005-final-scope-conflict-rolls-back-state-updates.sdp.md deleted file mode 100644 index f20d1125..00000000 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-005-final-scope-conflict-rolls-back-state-updates.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry.final-scope-conflict-rolls-back-state-updates -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry ---- -# Final scope conflict rolls back state updates - -## Intent - -- outcome: Executable scenario: Final scope conflict rolls back state updates - -```gwt -Given the backend is running and clean -And a product "dcb-prod-final-conflict" exists with 100 available stock -When I execute a DCB operation that hits a final scope conflict for product "dcb-prod-final-conflict" -Then the DCB result status should be "conflict" -And the conflict result should report current version 1 -And the product "dcb-prod-final-conflict" should have 100 available and 0 reserved stock -And the DCB scope should exist at version 1 -And the DCB scope should only reference the competing stream -And no DCB success events should exist for the rollback correlation id -``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-006-backoff-increases-exponentially.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-006-backoff-increases-exponentially.sdp.md deleted file mode 100644 index 08180724..00000000 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-006-backoff-increases-exponentially.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry.backoff-increases-exponentially -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry ---- -# Backoff increases exponentially - -## Intent - -- outcome: Executable scenario: Backoff increases exponentially - -```gwt -Given the backend is running and clean -And backoff config with initialMs 100 and base 2 -When calculating backoff for attempts 0, 1, 2, 3 -Then the base delays should be 100, 200, 400, 800 respectively -``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-007-backoff-is-capped-at-maximum.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-007-backoff-is-capped-at-maximum.sdp.md deleted file mode 100644 index a52ae10d..00000000 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-007-backoff-is-capped-at-maximum.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry.backoff-is-capped-at-maximum -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry ---- -# Backoff is capped at maximum - -## Intent - -- outcome: Executable scenario: Backoff is capped at maximum - -```gwt -Given the backend is running and clean -And backoff config with maxMs 30000 -When calculating backoff for attempt 10 -Then total delay should not exceed 30000ms -``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-008-retries-use-consistent-partition-key.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-008-retries-use-consistent-partition-key.sdp.md deleted file mode 100644 index b2012ee6..00000000 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.examples/s-008-retries-use-consistent-partition-key.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry.retries-use-consistent-partition-key -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durable-adapters.dcb-retry ---- -# Retries use consistent partition key - -## Intent - -- outcome: Executable scenario: Retries use consistent partition key - -```gwt -Given the backend is running and clean -And a DCB test scope with key "tenant:t1:reservation:r1" -When conflict metadata is generated twice for that scope -Then the partition key should be "dcb:tenant:t1:reservation:r1" -And repeated metadata generation should return the same partition key -``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.sdp.md index d4520eeb..eac3f256 100644 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/dcb-retry.sdp.md @@ -11,7 +11,7 @@ relations: ## Intent - actor: a developer using the order-management app -- outcome: DCB operations to automatically retry on OCC conflicts so that concurrent modifications are handled gracefully without manual retry logic +- outcome: DCB operations automatically retry on OCC conflicts so concurrent modifications are handled without manual retry logic. ## Behavior diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-001-normal-requests-pass-rate-limiting.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-001-normal-requests-pass-rate-limiting.sdp.md deleted file mode 100644 index bf9c4b02..00000000 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-001-normal-requests-pass-rate-limiting.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting.normal-requests-pass-rate-limiting -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting ---- -# Requests within rate limit succeed - -## Intent - -- outcome: Executable scenario: Requests within rate limit succeed - -```gwt -Given the test environment is initialized -And rate limiter component is mounted -And rate limit "commandDispatch" allows 100 requests per minute -And 50 requests have been made in the current window -When a new command is dispatched -Then the command should proceed to handler -And rate limit bucket should show 51 consumed -``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-002-exhausted-rate-limit-rejects-request.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-002-exhausted-rate-limit-rejects-request.sdp.md deleted file mode 100644 index adc81500..00000000 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-002-exhausted-rate-limit-rejects-request.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting.exhausted-rate-limit-rejects-request -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting ---- -# Requests exceeding rate limit are rejected - -## Intent - -- outcome: Executable scenario: Requests exceeding rate limit are rejected - -```gwt -Given the test environment is initialized -And rate limiter component is mounted -And rate limit "commandDispatch" allows 100 requests per minute -And 100 requests have been made in the current window -When a new command is dispatched -Then the command should be rejected with "RATE_LIMITED" -And response should include "retryAfterMs" -``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-003-different-users-have-independent-limits.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-003-different-users-have-independent-limits.sdp.md deleted file mode 100644 index 322d3a48..00000000 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-003-different-users-have-independent-limits.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting.different-users-have-independent-limits -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting ---- -# Token bucket refills over time - -## Intent - -- outcome: Executable scenario: Token bucket refills over time - -```gwt -Given the test environment is initialized -And rate limiter component is mounted -And rate limit "commandDispatch" with rate 100/minute and capacity 150 -And bucket is depleted to 0 tokens -When 30 seconds pass -Then bucket should have approximately 50 tokens available -``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md deleted file mode 100644 index 7a4efa72..00000000 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting.same-user-different-command-types-have-independent-limits -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting ---- -# Rate limit key isolation by user - -## Intent - -- outcome: Executable scenario: Rate limit key isolation by user - -```gwt -Given the test environment is initialized -And rate limiter component is mounted -And rate limit key strategy is "byUserId" -And user "alice" has exhausted her rate limit -When user "bob" dispatches a command -Then "bob"'s command should proceed -And "alice" should remain rate limited -``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-005-rate-limited-command-returns-standard-rejection.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-005-rate-limited-command-returns-standard-rejection.sdp.md deleted file mode 100644 index b8f896ff..00000000 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-005-rate-limited-command-returns-standard-rejection.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting.rate-limited-command-returns-standard-rejection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting ---- -# Admin rebuild respects hourly limit - -## Intent - -- outcome: Executable scenario: Admin rebuild respects hourly limit - -```gwt -Given the test environment is initialized -And rate limiter component is mounted -And rate limit "adminRebuild" allows 10 rebuilds per hour -And 5 rebuilds have been triggered this hour -When admin triggers another rebuild -Then the rebuild should start -And rebuild count should be 6 -``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-006-health-check-commands-bypass-rate-limiting.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-006-health-check-commands-bypass-rate-limiting.sdp.md deleted file mode 100644 index 89d1e22c..00000000 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-006-health-check-commands-bypass-rate-limiting.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting.health-check-commands-bypass-rate-limiting -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting ---- -# Admin rebuild blocked when limit exceeded - -## Intent - -- outcome: Executable scenario: Admin rebuild blocked when limit exceeded - -```gwt -Given the test environment is initialized -And rate limiter component is mounted -And rate limit "adminRebuild" allows 10 rebuilds per hour -And 10 rebuilds have been triggered this hour -When admin triggers another rebuild -Then the operation should be rejected -And response should indicate "Rate limit exceeded for adminRebuild" -``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-007-high-volume-rate-limit-uses-sharded-counting.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-007-high-volume-rate-limit-uses-sharded-counting.sdp.md deleted file mode 100644 index 7d966513..00000000 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.examples/s-007-high-volume-rate-limit-uses-sharded-counting.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting.high-volume-rate-limit-uses-sharded-counting -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.durable-adapters.rate-limiting ---- -# Adapter converts component response to RateLimitResult - -## Intent - -- outcome: Executable scenario: Adapter converts component response to RateLimitResult - -```gwt -Given the test environment is initialized -And rate limiter component is mounted -And a rate limiter with "commandDispatch" limit configured -When createConvexRateLimitAdapter is called -Then it returns a function compatible with RateLimitChecker interface -And the function returns { allowed: boolean, retryAfterMs?: number } -``` diff --git a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.sdp.md b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.sdp.md index 7a96d884..5b634bae 100644 --- a/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/durable-adapters/rate-limiting.sdp.md @@ -11,7 +11,7 @@ relations: ## Intent - actor: a platform developer -- outcome: to rate limit commands and admin operations so that the system is protected from abuse and overload +- outcome: Commands and admin operations are rate limited so that the system is protected from abuse and overload. ## Behavior diff --git a/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md deleted file mode 100644 index 6ad49b0e..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-001-successfully-add-stock-to-existing-product.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.add-stock.successfully-add-stock-to-existing-product -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.add-stock ---- -# Successfully add stock to existing product - -## Intent - -- outcome: Executable scenario: Successfully add stock to existing product - -```gwt -Given the backend is running and clean -And a product "prod-stock-01" exists with 0 stock -When I add stock to product "prod-stock-01": -Then the command should succeed -And I wait for projections to process -And the product "prod-stock-01" should have 50 available stock -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-002-reject-adding-stock-to-non-existent-product.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-002-reject-adding-stock-to-non-existent-product.sdp.md deleted file mode 100644 index 1ae02128..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-002-reject-adding-stock-to-non-existent-product.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.add-stock.reject-adding-stock-to-non-existent-product -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.add-stock ---- -# Reject adding stock to non-existent product - -## Intent - -- outcome: Executable scenario: Reject adding stock to non-existent product - -```gwt -Given the backend is running and clean -When I add stock to product "prod-nonexistent": -Then the command should be rejected with code "PRODUCT_NOT_FOUND" -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-003-add-stock-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-003-add-stock-is-idempotent-with-same-command-id.sdp.md deleted file mode 100644 index 5337ea1e..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/add-stock.examples/s-003-add-stock-is-idempotent-with-same-command-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.add-stock.add-stock-is-idempotent-with-same-command-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.add-stock ---- -# AddStock is idempotent with same commandId - -## Intent - -- outcome: Executable scenario: AddStock is idempotent with same commandId - -```gwt -Given the backend is running and clean -And a product "prod-stock-02" exists with 10 stock -When I add stock with commandId "cmd-stock-idem-01" to product "prod-stock-02": and I repeat adding stock with commandId "cmd-stock-idem-01" to product "prod-stock-02": -Then the second command should return duplicate status -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/add-stock.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/add-stock.sdp.md index 94ce90cc..45bf8e33 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/add-stock.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/add-stock.sdp.md @@ -11,4 +11,4 @@ relations: ## Intent - actor: an inventory manager -- outcome: to add stock to existing products so that products are available for sale +- outcome: Stock is added to existing products so that products are available for sale. diff --git a/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-001-confirm-pending-reservation.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-001-confirm-pending-reservation.sdp.md index c675fd88..4ccbcf2b 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-001-confirm-pending-reservation.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-001-confirm-pending-reservation.sdp.md @@ -2,22 +2,23 @@ id: spec:behavior.order-management.tests.integration-features.inventory.confirm-reservation.confirm-pending-reservation kind: example altitude: story -readiness: idea +readiness: defined relations: + verifies: spec:behavior.order-management.tests.integration-features.inventory.confirm-reservation refines: spec:behavior.order-management.tests.integration-features.inventory.confirm-reservation --- # Confirm pending reservation ## Intent -- outcome: Executable scenario: Confirm pending reservation +- outcome: Show that a pending reservation is confirmed. ```gwt Given the backend is running and clean -And a product "prod-conf-int-01" exists with 20 available stock -And a pending reservation "res-conf-int-01" exists for order "ord-conf-int-01" with: -When I confirm the reservation "res-conf-int-01" +And a product {productId: "prod-conf-int-01"} exists with {stock: 20} available stock +And a pending reservation {reservationId: "res-conf-int-01"} exists for order {orderId: "ord-conf-int-01"} with: +When I confirm the reservation {reservationId: "res-conf-int-01"} Then the command should succeed And I wait for projections to process -And the reservation "res-conf-int-01" should have status "confirmed" +And the reservation {reservationId: "res-conf-int-01"} should have status {status: "confirmed"} ``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-002-reject-confirming-already-confirmed-reservation.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-002-reject-confirming-already-confirmed-reservation.sdp.md index 23cd443a..a5f375de 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-002-reject-confirming-already-confirmed-reservation.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-002-reject-confirming-already-confirmed-reservation.sdp.md @@ -2,20 +2,21 @@ id: spec:behavior.order-management.tests.integration-features.inventory.confirm-reservation.reject-confirming-already-confirmed-reservation kind: example altitude: story -readiness: idea +readiness: defined relations: + verifies: spec:behavior.order-management.tests.integration-features.inventory.confirm-reservation refines: spec:behavior.order-management.tests.integration-features.inventory.confirm-reservation --- # Reject confirming already confirmed reservation ## Intent -- outcome: Executable scenario: Reject confirming already confirmed reservation +- outcome: Show that confirming an already confirmed reservation is rejected. ```gwt Given the backend is running and clean -And a product "prod-conf-int-02" exists with 20 available stock -And a confirmed reservation "res-conf-int-02" exists for order "ord-conf-int-02" with: -When I confirm the reservation "res-conf-int-02" -Then the command should be rejected with code "RESERVATION_NOT_PENDING" +And a product {productId: "prod-conf-int-02"} exists with {stock: 20} available stock +And a confirmed reservation {reservationId: "res-conf-int-02"} exists for order {orderId: "ord-conf-int-02"} with: +When I confirm the reservation {reservationId: "res-conf-int-02"} +Then the command should be rejected with code {rejectionCode: "RESERVATION_NOT_PENDING"} ``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-003-reject-confirming-non-existent-reservation.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-003-reject-confirming-non-existent-reservation.sdp.md index d1be938f..b63de9e2 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-003-reject-confirming-non-existent-reservation.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.examples/s-003-reject-confirming-non-existent-reservation.sdp.md @@ -2,18 +2,19 @@ id: spec:behavior.order-management.tests.integration-features.inventory.confirm-reservation.reject-confirming-non-existent-reservation kind: example altitude: story -readiness: idea +readiness: defined relations: + verifies: spec:behavior.order-management.tests.integration-features.inventory.confirm-reservation refines: spec:behavior.order-management.tests.integration-features.inventory.confirm-reservation --- # Reject confirming non-existent reservation ## Intent -- outcome: Executable scenario: Reject confirming non-existent reservation +- outcome: Show that confirming a non-existent reservation is rejected. ```gwt Given the backend is running and clean -When I confirm the reservation "res-nonexistent-01" -Then the command should be rejected with code "RESERVATION_NOT_FOUND" +When I confirm the reservation {reservationId: "res-nonexistent-01"} +Then the command should be rejected with code {rejectionCode: "RESERVATION_NOT_FOUND"} ``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.sdp.md index aabf5b36..adc02df0 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/confirm-reservation.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.order-management.tests.integration-features.inventory.confirm-reservation kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.order-management --- @@ -10,4 +10,18 @@ relations: ## Intent -- outcome: to confirm stock reservations so that reserved stock becomes committed to the order +- outcome: A pending reservation is confirmed so that reserved stock becomes committed to the order. + +## Example space + +```gwt-vocabulary +Given the backend is running and clean +And a product {productId:string} exists with {stock:number} available stock +And a pending reservation {reservationId:string} exists for order {orderId:string} with: +And a confirmed reservation {reservationId:string} exists for order {orderId:string} with: +When I confirm the reservation {reservationId:string} +Then the command should succeed +And I wait for projections to process +And the reservation {reservationId:string} should have status {status:string} +And the command should be rejected with code {rejectionCode:string} +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-001-successfully-create-a-new-product-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-001-successfully-create-a-new-product-and-verify-projection.sdp.md deleted file mode 100644 index 9d2ff830..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-001-successfully-create-a-new-product-and-verify-projection.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.create-product.successfully-create-a-new-product-and-verify-projection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.create-product ---- -# Successfully create a new product and verify projection - -## Intent - -- outcome: Executable scenario: Successfully create a new product and verify projection - -```gwt -Given the backend is running and clean -When I create a product with: -Then the command should succeed -And I wait for projections to process -And the product "prod-int-01" should exist with name "Test Widget" -And the product "prod-int-01" should have 0 available stock -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-002-reject-duplicate-product-id.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-002-reject-duplicate-product-id.sdp.md deleted file mode 100644 index f179b744..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-002-reject-duplicate-product-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.create-product.reject-duplicate-product-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.create-product ---- -# Reject duplicate product ID - -## Intent - -- outcome: Executable scenario: Reject duplicate product ID - -```gwt -Given the backend is running and clean -And a product "prod-int-02" exists -When I create a product with: -Then the command should be rejected with code "PRODUCT_ALREADY_EXISTS" -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-003-reject-duplicate-sku.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-003-reject-duplicate-sku.sdp.md deleted file mode 100644 index f5f8095f..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-003-reject-duplicate-sku.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.create-product.reject-duplicate-sku -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.create-product ---- -# Reject duplicate SKU - -## Intent - -- outcome: Executable scenario: Reject duplicate SKU - -```gwt -Given the backend is running and clean -And a product with SKU "SKU-DUP-001" exists -When I create a product with: -Then the command should be rejected with code "SKU_ALREADY_EXISTS" -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-004-create-product-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-004-create-product-is-idempotent-with-same-command-id.sdp.md deleted file mode 100644 index db06a932..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/create-product.examples/s-004-create-product-is-idempotent-with-same-command-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.create-product.create-product-is-idempotent-with-same-command-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.create-product ---- -# CreateProduct is idempotent with same commandId - -## Intent - -- outcome: Executable scenario: CreateProduct is idempotent with same commandId - -```gwt -Given the backend is running and clean -When I create a product with commandId "cmd-prod-idem-01": and I repeat creating a product with commandId "cmd-prod-idem-01": -Then the second command should return duplicate status -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/create-product.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/create-product.sdp.md index 97f1c69e..44a5fa46 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/create-product.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/create-product.sdp.md @@ -11,4 +11,4 @@ relations: ## Intent - actor: an inventory manager -- outcome: to create new products in the catalog so that they can be sold and tracked +- outcome: New products are created in the catalog so that they can be sold and tracked. diff --git a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-001-list-products-returns-all-products.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-001-list-products-returns-all-products.sdp.md deleted file mode 100644 index 32710fc4..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-001-list-products-returns-all-products.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.query-inventory.list-products-returns-all-products -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.query-inventory ---- -# List products returns all products - -## Intent - -- outcome: Executable scenario: List products returns all products - -```gwt -Given the backend is running and clean -And the following products exist: -When I list all products -Then the result should contain at least 3 products -And the result should include product "prod-qry-01" with name "Widget A" -And the result should include product "prod-qry-02" with name "Widget B" -And the result should include product "prod-qry-03" with name "Widget C" -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-002-get-stock-availability-for-product.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-002-get-stock-availability-for-product.sdp.md deleted file mode 100644 index 6fa82dd6..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-002-get-stock-availability-for-product.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.query-inventory.get-stock-availability-for-product -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.query-inventory ---- -# Get stock availability for product - -## Intent - -- outcome: Executable scenario: Get stock availability for product - -```gwt -Given the backend is running and clean -And a product "prod-avail-01" exists with: -When I get stock availability for product "prod-avail-01" -Then the availability should show 50 available and 10 reserved -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-003-check-availability-for-multiple-items.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-003-check-availability-for-multiple-items.sdp.md deleted file mode 100644 index 02326863..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-003-check-availability-for-multiple-items.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.query-inventory.check-availability-for-multiple-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.query-inventory ---- -# Check availability for multiple items - -## Intent - -- outcome: Executable scenario: Check availability for multiple items - -```gwt -Given the backend is running and clean -And the following products exist: -When I check availability for items: and I check availability for items: -Then all items should be available -And not all items should be available -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-004-get-reservation-by-order-id.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-004-get-reservation-by-order-id.sdp.md deleted file mode 100644 index c670b2d6..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.examples/s-004-get-reservation-by-order-id.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.query-inventory.get-reservation-by-order-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.query-inventory ---- -# Get reservation by order ID - -## Intent - -- outcome: Executable scenario: Get reservation by order ID - -```gwt -Given the backend is running and clean -And a product "prod-res-01" exists with 20 stock -And a pending reservation exists for order "ord-qry-01" with: -When I get reservation by order ID "ord-qry-01" -Then the reservation should exist for order "ord-qry-01" -And the reservation status should be "pending" -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.sdp.md index b45d5417..fb451050 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/query-inventory.sdp.md @@ -11,4 +11,4 @@ relations: ## Intent - actor: a user -- outcome: to query inventory information so that I can view product availability and reservations +- outcome: Inventory information can be queried so that users can view product availability and reservations. diff --git a/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-001-release-pending-reservation.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-001-release-pending-reservation.sdp.md index b5966c64..3b9595f0 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-001-release-pending-reservation.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-001-release-pending-reservation.sdp.md @@ -2,23 +2,24 @@ id: spec:behavior.order-management.tests.integration-features.inventory.release-reservation.release-pending-reservation kind: example altitude: story -readiness: idea +readiness: defined relations: + verifies: spec:behavior.order-management.tests.integration-features.inventory.release-reservation refines: spec:behavior.order-management.tests.integration-features.inventory.release-reservation --- # Release pending reservation ## Intent -- outcome: Executable scenario: Release pending reservation +- outcome: Show that a pending reservation is released. ```gwt Given the backend is running and clean -And a product "prod-rel-int-01" exists with 20 available stock -And a pending reservation "res-rel-int-01" exists for order "ord-rel-int-01" with: -When I release the reservation "res-rel-int-01" with reason "Order cancelled" +And a product {productId: "prod-rel-int-01"} exists with {stock: 20} available stock +And a pending reservation {reservationId: "res-rel-int-01"} exists for order {orderId: "ord-rel-int-01"} with: +When I release the reservation {reservationId: "res-rel-int-01"} with reason {reason: "Order cancelled"} Then the command should succeed And I wait for projections to process -And the reservation "res-rel-int-01" should have status "released" -And the product "prod-rel-int-01" should have 20 available and 0 reserved stock +And the reservation {reservationId: "res-rel-int-01"} should have status {status: "released"} +And the product {productId: "prod-rel-int-01"} should have {available: 20} available and {reserved: 0} reserved stock ``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-002-reject-releasing-non-pending-reservation.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-002-reject-releasing-non-pending-reservation.sdp.md index 929dace0..95222334 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-002-reject-releasing-non-pending-reservation.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.examples/s-002-reject-releasing-non-pending-reservation.sdp.md @@ -2,20 +2,21 @@ id: spec:behavior.order-management.tests.integration-features.inventory.release-reservation.reject-releasing-non-pending-reservation kind: example altitude: story -readiness: idea +readiness: defined relations: + verifies: spec:behavior.order-management.tests.integration-features.inventory.release-reservation refines: spec:behavior.order-management.tests.integration-features.inventory.release-reservation --- # Reject releasing non-pending reservation ## Intent -- outcome: Executable scenario: Reject releasing non-pending reservation +- outcome: Show that releasing a non-pending reservation is rejected. ```gwt Given the backend is running and clean -And a product "prod-rel-int-02" exists with 20 available stock -And a confirmed reservation "res-rel-int-02" exists for order "ord-rel-int-02" with: -When I release the reservation "res-rel-int-02" with reason "Testing" -Then the command should be rejected with code "RESERVATION_NOT_PENDING" +And a product {productId: "prod-rel-int-02"} exists with {stock: 20} available stock +And a confirmed reservation {reservationId: "res-rel-int-02"} exists for order {orderId: "ord-rel-int-02"} with: +When I release the reservation {reservationId: "res-rel-int-02"} with reason {reason: "Testing"} +Then the command should be rejected with code {rejectionCode: "RESERVATION_NOT_PENDING"} ``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.sdp.md index eec178c6..0dbd6ee1 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/release-reservation.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.order-management.tests.integration-features.inventory.release-reservation kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.order-management --- @@ -10,4 +10,19 @@ relations: ## Intent -- outcome: to release stock reservations so that reserved stock becomes available again when orders are cancelled +- outcome: Stock reservations are released so that reserved stock becomes available again when orders are cancelled. + +## Example space + +```gwt-vocabulary +Given the backend is running and clean +And a product {productId:string} exists with {stock:number} available stock +And a pending reservation {reservationId:string} exists for order {orderId:string} with: +And a confirmed reservation {reservationId:string} exists for order {orderId:string} with: +When I release the reservation {reservationId:string} with reason {reason:string} +Then the command should succeed +And I wait for projections to process +And the reservation {reservationId:string} should have status {status:string} +And the product {productId:string} should have {available:number} available and {reserved:number} reserved stock +And the command should be rejected with code {rejectionCode:string} +``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-001-expire-pending-reservations-past-ttl.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-001-expire-pending-reservations-past-ttl.sdp.md deleted file mode 100644 index fc5ceafb..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-001-expire-pending-reservations-past-ttl.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.reservation-expiration.expire-pending-reservations-past-ttl -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.reservation-expiration ---- -# Expire pending reservations past TTL - -## Intent - -- outcome: Executable scenario: Expire pending reservations past TTL - -```gwt -Given the backend is running and clean -And a product "prod-exp-int-01" exists with 25 available stock -And an expired pending reservation "res-exp-int-01" exists for order "ord-exp-int-01" with: -When I trigger the reservation expiration process -Then the expiration process should have processed at least 1 reservation -And I wait for projections to process -And the reservation "res-exp-int-01" should have status "expired" -And the product "prod-exp-int-01" should have 25 available and 0 reserved stock -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-002-skip-confirmed-reservations.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-002-skip-confirmed-reservations.sdp.md deleted file mode 100644 index 60c47d38..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-002-skip-confirmed-reservations.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.reservation-expiration.skip-confirmed-reservations -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.reservation-expiration ---- -# Skip confirmed reservations - -## Intent - -- outcome: Executable scenario: Skip confirmed reservations - -```gwt -Given the backend is running and clean -And a product "prod-exp-int-02" exists with 25 available stock -And an expired confirmed reservation "res-exp-int-02" exists for order "ord-exp-int-02" with: -When I trigger the reservation expiration process and I wait for 1000 milliseconds -Then the reservation "res-exp-int-02" should have status "confirmed" -And the product "prod-exp-int-02" should have 20 available and 5 reserved stock -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-003-skip-reservations-not-yet-expired.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-003-skip-reservations-not-yet-expired.sdp.md deleted file mode 100644 index 7b42454c..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-003-skip-reservations-not-yet-expired.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.reservation-expiration.skip-reservations-not-yet-expired -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.reservation-expiration ---- -# Skip reservations not yet expired - -## Intent - -- outcome: Executable scenario: Skip reservations not yet expired - -```gwt -Given the backend is running and clean -And a product "prod-exp-int-03" exists with 25 available stock -And a future pending reservation "res-exp-int-03" exists for order "ord-exp-int-03" with: -When I trigger the reservation expiration process and I wait for 1000 milliseconds -Then the reservation "res-exp-int-03" should have status "pending" -And the product "prod-exp-int-03" should have 20 available and 5 reserved stock -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-004-batch-expiration-of-multiple-reservations.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-004-batch-expiration-of-multiple-reservations.sdp.md deleted file mode 100644 index 574b953d..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.examples/s-004-batch-expiration-of-multiple-reservations.sdp.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.reservation-expiration.batch-expiration-of-multiple-reservations -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.reservation-expiration ---- -# Batch expiration of multiple reservations - -## Intent - -- outcome: Executable scenario: Batch expiration of multiple reservations - -```gwt -Given the backend is running and clean -And a product "prod-exp-int-04" exists with 65 available stock -And an expired pending reservation "res-exp-int-04a" exists for order "ord-exp-int-04a" with: -And an expired pending reservation "res-exp-int-04b" exists for order "ord-exp-int-04b" with: -And an expired pending reservation "res-exp-int-04c" exists for order "ord-exp-int-04c" with: -When I trigger the reservation expiration process -Then the expiration process should have processed 3 reservations -And I wait for projections to process -And the reservation "res-exp-int-04a" should have status "expired" -And the reservation "res-exp-int-04b" should have status "expired" -And the reservation "res-exp-int-04c" should have status "expired" -And the product "prod-exp-int-04" should have 65 available and 0 reserved stock -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.sdp.md index 461cb996..e804f473 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/reservation-expiration.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: expired reservations to be automatically released so that reserved stock becomes available again when orders are not completed in time +- outcome: Expired reservations are automatically released so that reserved stock becomes available again when orders are not completed in time. diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-001-reserve-stock-successfully.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-001-reserve-stock-successfully.sdp.md deleted file mode 100644 index 591f638f..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-001-reserve-stock-successfully.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock.reserve-stock-successfully -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock ---- -# Reserve stock successfully - -## Intent - -- outcome: Executable scenario: Reserve stock successfully - -```gwt -Given the backend is running and clean -And a product "prod-res-int-01" exists with 100 available stock -When I reserve stock for order "ord-res-int-01" with: -Then the command should succeed -And I wait for projections to process -And the product "prod-res-int-01" should have 90 available and 10 reserved stock -And the reservation should have status "pending" -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-002-reserve-stock-for-multiple-items.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-002-reserve-stock-for-multiple-items.sdp.md deleted file mode 100644 index 38ae2566..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-002-reserve-stock-for-multiple-items.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock.reserve-stock-for-multiple-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock ---- -# Reserve stock for multiple items - -## Intent - -- outcome: Executable scenario: Reserve stock for multiple items - -```gwt -Given the backend is running and clean -And a product "prod-res-int-02" exists with 50 available stock -And another product "prod-res-int-03" exists with 30 available stock -When I reserve stock for order "ord-res-int-02" with: -Then the command should succeed -And I wait for projections to process -And the product "prod-res-int-02" should have 45 available and 5 reserved stock -And the product "prod-res-int-03" should have 27 available and 3 reserved stock -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-003-reject-when-insufficient-stock.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-003-reject-when-insufficient-stock.sdp.md deleted file mode 100644 index 114c7452..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-003-reject-when-insufficient-stock.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock.reject-when-insufficient-stock -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock ---- -# Reject when insufficient stock - -## Intent - -- outcome: Executable scenario: Reject when insufficient stock - -```gwt -Given the backend is running and clean -And a product "prod-res-int-04" exists with 5 available stock -When I reserve stock for order "ord-res-int-03" with: -Then the command should return failed status with reason "Insufficient stock" -And the product "prod-res-int-04" should have 5 available and 0 reserved stock -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-004-all-or-nothing-reservation-when-one-item-fails.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-004-all-or-nothing-reservation-when-one-item-fails.sdp.md deleted file mode 100644 index c2fa8e6d..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-004-all-or-nothing-reservation-when-one-item-fails.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock.all-or-nothing-reservation-when-one-item-fails -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock ---- -# All-or-nothing reservation when one item fails - -## Intent - -- outcome: Executable scenario: All-or-nothing reservation when one item fails - -```gwt -Given the backend is running and clean -And a product "prod-res-int-05" exists with 100 available stock -And another product "prod-res-int-06" exists with 2 available stock -When I reserve stock for order "ord-res-int-04" with: -Then the command should return failed status with reason "Insufficient stock" -And the product "prod-res-int-05" should have 100 available and 0 reserved stock -And the product "prod-res-int-06" should have 2 available and 0 reserved stock -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-005-reject-for-non-existent-product.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-005-reject-for-non-existent-product.sdp.md deleted file mode 100644 index 18393703..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-005-reject-for-non-existent-product.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock.reject-for-non-existent-product -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock ---- -# Reject for non-existent product - -## Intent - -- outcome: Executable scenario: Reject for non-existent product - -```gwt -Given the backend is running and clean -When I reserve stock for order "ord-res-int-05" with: -Then the command should return failed status with reason "Insufficient stock" -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-006-return-failed-status-when-reservation-fails.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-006-return-failed-status-when-reservation-fails.sdp.md deleted file mode 100644 index d5dea61b..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-006-return-failed-status-when-reservation-fails.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock.return-failed-status-when-reservation-fails -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock ---- -# Return failed status when reservation fails - -## Intent - -- outcome: Executable scenario: Return failed status when reservation fails - -```gwt -Given the backend is running and clean -And a product "prod-res-int-07" exists with 3 available stock -When I reserve stock for order "ord-res-int-06" with: -Then the command should return failed status -And the result should have an eventId for the failure event -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-007-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-007-idempotent-with-same-command-id.sdp.md deleted file mode 100644 index 86b41c5c..00000000 --- a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.examples/s-007-idempotent-with-same-command-id.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock.idempotent-with-same-command-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.inventory.reserve-stock ---- -# Idempotent with same commandId - -## Intent - -- outcome: Executable scenario: Idempotent with same commandId - -```gwt -Given the backend is running and clean -And a product "prod-res-int-08" exists with 100 available stock -When I reserve stock for order "ord-res-int-07" with commandId "cmd-res-idem-01": and I repeat reserving stock for order "ord-res-int-07" with commandId "cmd-res-idem-01": -Then the second command should return duplicate status -And I wait for projections to process -And the product "prod-res-int-08" should have 90 available and 10 reserved stock -``` diff --git a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.sdp.md b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.sdp.md index dfa6536f..2c958234 100644 --- a/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/inventory/reserve-stock.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: to reserve stock for orders so that stock is held until order is confirmed or cancelled +- outcome: Stock is reserved for orders so that it is held until the order is confirmed or cancelled. diff --git a/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-001-add-item-to-draft-order-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-001-add-item-to-draft-order-and-verify-projection.sdp.md index 06355437..fb5c4746 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-001-add-item-to-draft-order-and-verify-projection.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-001-add-item-to-draft-order-and-verify-projection.sdp.md @@ -2,22 +2,23 @@ id: spec:behavior.order-management.tests.integration-features.orders.add-order-item.add-item-to-draft-order-and-verify-projection kind: example altitude: story -readiness: idea +readiness: defined relations: + verifies: spec:behavior.order-management.tests.integration-features.orders.add-order-item refines: spec:behavior.order-management.tests.integration-features.orders.add-order-item --- # Add item to draft order and verify projection ## Intent -- outcome: Executable scenario: Add item to draft order and verify projection +- outcome: Show that adding an item to a draft order updates the projection. ```gwt Given the backend is running and clean -And an order "ord-add-item-01" exists in draft status -When I add an item to order "ord-add-item-01": +And an order {orderId: "ord-add-item-01"} exists in draft status +When I add an item to order {orderId: "ord-add-item-01"}: Then the command should succeed And I wait for projections to process -And the order "ord-add-item-01" should have 1 items -And the order "ord-add-item-01" total should be 30 +And the order {orderId: "ord-add-item-01"} should have {itemCount: 1} items +And the order {orderId: "ord-add-item-01"} total should be {total: 30} ``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-002-reject-adding-item-to-submitted-order.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-002-reject-adding-item-to-submitted-order.sdp.md index 43ec85b6..dcc48008 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-002-reject-adding-item-to-submitted-order.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/add-order-item.examples/s-002-reject-adding-item-to-submitted-order.sdp.md @@ -2,19 +2,20 @@ id: spec:behavior.order-management.tests.integration-features.orders.add-order-item.reject-adding-item-to-submitted-order kind: example altitude: story -readiness: idea +readiness: defined relations: + verifies: spec:behavior.order-management.tests.integration-features.orders.add-order-item refines: spec:behavior.order-management.tests.integration-features.orders.add-order-item --- # Reject adding item to submitted order ## Intent -- outcome: Executable scenario: Reject adding item to submitted order +- outcome: Show that adding an item to a submitted order is rejected. ```gwt Given the backend is running and clean -And a submitted order "ord-add-item-02" exists with items: -When I add an item to order "ord-add-item-02": -Then the command should be rejected with code "ORDER_NOT_IN_DRAFT" +And a submitted order {orderId: "ord-add-item-02"} exists with items: +When I add an item to order {orderId: "ord-add-item-02"}: +Then the command should be rejected with code {rejectionCode: "ORDER_NOT_IN_DRAFT"} ``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/add-order-item.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/add-order-item.sdp.md index 266adfe7..552fc7ff 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/add-order-item.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/add-order-item.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.order-management.tests.integration-features.orders.add-order-item kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.order-management --- @@ -11,4 +11,18 @@ relations: ## Intent - actor: a customer -- outcome: to add items to my order so that I can purchase multiple products +- outcome: A customer adds items to an order so that they can purchase multiple products. + +## Example space + +```gwt-vocabulary +Given the backend is running and clean +And an order {orderId:string} exists in draft status +And a submitted order {orderId:string} exists with items: +When I add an item to order {orderId:string}: +Then the command should succeed +And I wait for projections to process +And the order {orderId:string} should have {itemCount:number} items +And the order {orderId:string} total should be {total:number} +And the command should be rejected with code {rejectionCode:string} +``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-001-add-multiple-items-to-order-in-batch.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-001-add-multiple-items-to-order-in-batch.sdp.md deleted file mode 100644 index a1e4fc28..00000000 --- a/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-001-add-multiple-items-to-order-in-batch.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.orders.batch-operations.add-multiple-items-to-order-in-batch -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.orders.batch-operations ---- -# Add multiple items to order in batch - -## Intent - -- outcome: Executable scenario: Add multiple items to order in batch - -```gwt -Given the backend is running and clean -And a draft order "ord-batch-01" exists -When I add multiple items to order "ord-batch-01" in batch: -Then the batch should succeed with 3 items -And the batch should have 0 failures -And I wait for projections to process -And the order "ord-batch-01" should have 3 items -And the order "ord-batch-01" total should be 90 -``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-002-batch-respects-order-of-execution.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-002-batch-respects-order-of-execution.sdp.md deleted file mode 100644 index c6dacda5..00000000 --- a/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-002-batch-respects-order-of-execution.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.orders.batch-operations.batch-respects-order-of-execution -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.orders.batch-operations ---- -# Batch respects order of execution - -## Intent - -- outcome: Executable scenario: Batch respects order of execution - -```gwt -Given the backend is running and clean -And a draft order "ord-batch-02" exists with items: -When I remove multiple items from order "ord-batch-02" in batch: -Then the batch should succeed with 2 items -And I wait for projections to process -And the order "ord-batch-02" should have 1 item -And the order "ord-batch-02" total should be 10 -``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-003-batch-stops-on-first-failure-in-atomic-mode.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-003-batch-stops-on-first-failure-in-atomic-mode.sdp.md deleted file mode 100644 index a858eea4..00000000 --- a/specs/behavior/order-management/tests/integration-features/orders/batch-operations.examples/s-003-batch-stops-on-first-failure-in-atomic-mode.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.orders.batch-operations.batch-stops-on-first-failure-in-atomic-mode -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.orders.batch-operations ---- -# Batch stops on first failure in atomic mode - -## Intent - -- outcome: Executable scenario: Batch stops on first failure in atomic mode - -```gwt -Given the backend is running and clean -And a submitted order "ord-batch-03" exists with items: -When I add multiple items to order "ord-batch-03" in batch: -Then the batch should have 1 rejection -And the batch should have 1 skipped -And the batch should have 0 successes -``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/batch-operations.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/batch-operations.sdp.md index ce5a42bd..f7cc8598 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/batch-operations.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/batch-operations.sdp.md @@ -11,4 +11,4 @@ relations: ## Intent - actor: an order operator -- outcome: to add or remove multiple items from an order in a single batch so that I can efficiently manage order contents +- outcome: Multiple items can be added or removed from an order in a single batch so that order contents can be managed efficiently. diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-001-cancel-draft-order-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-001-cancel-draft-order-and-verify-projection.sdp.md deleted file mode 100644 index 3aee7250..00000000 --- a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-001-cancel-draft-order-and-verify-projection.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.orders.cancel-order.cancel-draft-order-and-verify-projection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.orders.cancel-order ---- -# Cancel draft order and verify projection - -## Intent - -- outcome: Executable scenario: Cancel draft order and verify projection - -```gwt -Given the backend is running and clean -And a draft order "ord-cancel-01" exists -When I cancel order "ord-cancel-01" with reason "Changed my mind" -Then the command should succeed -And I wait for projections to process -And the order "ord-cancel-01" should exist with status "cancelled" -``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-002-cancel-submitted-order-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-002-cancel-submitted-order-and-verify-projection.sdp.md deleted file mode 100644 index c6fba30b..00000000 --- a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-002-cancel-submitted-order-and-verify-projection.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.orders.cancel-order.cancel-submitted-order-and-verify-projection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.orders.cancel-order ---- -# Cancel submitted order and verify projection - -## Intent - -- outcome: Executable scenario: Cancel submitted order and verify projection - -```gwt -Given the backend is running and clean -And a submitted order "ord-cancel-02" exists with items: -When I cancel order "ord-cancel-02" with reason "Found better price" -Then the command should succeed -And I wait for projections to process -And the order "ord-cancel-02" should exist with status "cancelled" -``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-003-reject-cancelling-already-cancelled-order.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-003-reject-cancelling-already-cancelled-order.sdp.md deleted file mode 100644 index 728a6b76..00000000 --- a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-003-reject-cancelling-already-cancelled-order.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.orders.cancel-order.reject-cancelling-already-cancelled-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.orders.cancel-order ---- -# Reject cancelling already cancelled order - -## Intent - -- outcome: Executable scenario: Reject cancelling already cancelled order - -```gwt -Given the backend is running and clean -And a cancelled order "ord-cancel-03" exists -When I cancel order "ord-cancel-03" with reason "Double cancel" -Then the command should be rejected with code "ORDER_ALREADY_CANCELLED" -``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-004-cancel-confirmed-order-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-004-cancel-confirmed-order-and-verify-projection.sdp.md deleted file mode 100644 index 6ce4193f..00000000 --- a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-004-cancel-confirmed-order-and-verify-projection.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.orders.cancel-order.cancel-confirmed-order-and-verify-projection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.orders.cancel-order ---- -# Cancel confirmed order and verify projection - -## Intent - -- outcome: Executable scenario: Cancel confirmed order and verify projection - -```gwt -Given the backend is running and clean -And a confirmed order "ord-cancel-04" exists with items: -When I cancel order "ord-cancel-04" with reason "Changed mind after confirmation" -Then the command should succeed -And I wait for projections to process -And the order "ord-cancel-04" should exist with status "cancelled" -``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-005-reservation-is-released-when-confirmed-order-is-cancelled.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-005-reservation-is-released-when-confirmed-order-is-cancelled.sdp.md deleted file mode 100644 index 1de46f0f..00000000 --- a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-005-reservation-is-released-when-confirmed-order-is-cancelled.sdp.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.orders.cancel-order.reservation-is-released-when-confirmed-order-is-cancelled -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.orders.cancel-order ---- -# Reservation is released when confirmed order is cancelled - -## Intent - -- outcome: Executable scenario: Reservation is released when confirmed order is cancelled - -```gwt -Given the backend is running and clean -And a product "prod-cancel-res-01" exists with 100 available stock -And a draft order "ord-cancel-res-01" exists with items: -When I submit order "ord-cancel-res-01" and I cancel order "ord-cancel-res-01" with reason "Customer changed mind" -Then the command should succeed -And I wait for the saga to complete with timeout 60000 -And the order "ord-cancel-res-01" should have status "confirmed" -And the product "prod-cancel-res-01" should have 90 available and 10 reserved stock -And the command should succeed -And I wait for projections to process -And the order "ord-cancel-res-01" should have status "cancelled" -And the reservation for order "ord-cancel-res-01" should have status "released" -And the product "prod-cancel-res-01" should have 100 available and 0 reserved stock -``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-006-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-006-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md deleted file mode 100644 index 47c5c5c2..00000000 --- a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-006-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.orders.cancel-order.cancelling-draft-order-does-not-trigger-reservation-release -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.orders.cancel-order ---- -# Cancelling draft order does not trigger reservation release - -## Intent - -- outcome: Executable scenario: Cancelling draft order does not trigger reservation release - -```gwt -Given the backend is running and clean -And a draft order "ord-draft-pm-01" exists -When I cancel order "ord-draft-pm-01" with reason "Changed mind early" -Then the command should succeed -And I wait for projections to process -And the order "ord-draft-pm-01" should have status "cancelled" -And the order "ord-draft-pm-01" should have no reservation -``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-007-cancelling-submitted-order-before-saga-completion-releases-pending-reserva.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-007-cancelling-submitted-order-before-saga-completion-releases-pending-reserva.sdp.md deleted file mode 100644 index 0c0e1cf3..00000000 --- a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-007-cancelling-submitted-order-before-saga-completion-releases-pending-reserva.sdp.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.orders.cancel-order.cancelling-submitted-order-before-saga-completion-releases-pending-reservation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.orders.cancel-order ---- -# Cancelling submitted order before saga completion releases pending reservation - -## Intent - -- outcome: Executable scenario: Cancelling submitted order before saga completion releases pending reservation - -```gwt -Given the backend is running and clean -And a product "prod-pending-01" exists with 100 available stock -And a draft order "ord-pending-01" exists with items: -When I submit order "ord-pending-01" and I cancel order "ord-pending-01" with reason "Changed mind before confirmation" -Then the command should succeed -And I wait for reservation to be created for order "ord-pending-01" -And the product "prod-pending-01" should have reserved stock -And the command should succeed -And I wait for projections to process -And the order "ord-pending-01" should have status "cancelled" -And the reservation for order "ord-pending-01" should have status "released" -And the product "prod-pending-01" should have 100 available and 0 reserved stock -``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-008-pm-handles-already-released-reservation-gracefully.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-008-pm-handles-already-released-reservation-gracefully.sdp.md deleted file mode 100644 index 549fe790..00000000 --- a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-008-pm-handles-already-released-reservation-gracefully.sdp.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.orders.cancel-order.pm-handles-already-released-reservation-gracefully -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.orders.cancel-order ---- -# PM handles already released reservation gracefully - -## Intent - -- outcome: Executable scenario: PM handles already released reservation gracefully - -```gwt -Given the backend is running and clean -And a product "prod-idemp-01" exists with 100 available stock -And a draft order "ord-idemp-01" exists with items: -When I submit order "ord-idemp-01" and I cancel order "ord-idemp-01" with reason "First cancel" -Then the command should succeed -And I wait for the saga to complete with timeout 60000 -And the order "ord-idemp-01" should have status "confirmed" -And the product "prod-idemp-01" should have 90 available and 10 reserved stock -And the command should succeed -And I wait for projections to process -And the reservation for order "ord-idemp-01" should have status "released" -And the product "prod-idemp-01" should have 100 available and 0 reserved stock -``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-009-pm-skips-expired-reservation-when-order-is-cancelled.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-009-pm-skips-expired-reservation-when-order-is-cancelled.sdp.md deleted file mode 100644 index 90fc610b..00000000 --- a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.examples/s-009-pm-skips-expired-reservation-when-order-is-cancelled.sdp.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.orders.cancel-order.pm-skips-expired-reservation-when-order-is-cancelled -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.orders.cancel-order ---- -# PM skips expired reservation when order is cancelled - -## Intent - -- outcome: Executable scenario: PM skips expired reservation when order is cancelled - -```gwt -Given the backend is running and clean -And a product "prod-expired-01" exists with 100 available stock -And a draft order "ord-expired-01" exists with items: -When I submit order "ord-expired-01" and I cancel order "ord-expired-01" with reason "Cancel after expiration" -Then the command should succeed -And I wait for the saga to complete with timeout 60000 -And the order "ord-expired-01" should have status "confirmed" -And I set the reservation status to "expired" for order "ord-expired-01" -And the product "prod-expired-01" should have 90 available and 10 reserved stock -And the command should succeed -And I wait for projections to process -And the order "ord-expired-01" should have status "cancelled" -And the product "prod-expired-01" should have 90 available and 10 reserved stock -``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.sdp.md index 5a210fd1..98659227 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/cancel-order.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/cancel-order.sdp.md @@ -11,4 +11,4 @@ relations: ## Intent - actor: a customer -- outcome: to cancel my order so that I don't have to complete the purchase +- outcome: A customer cancels an order so that they do not have to complete the purchase. diff --git a/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-001-successfully-create-a-new-order-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-001-successfully-create-a-new-order-and-verify-projection.sdp.md deleted file mode 100644 index 04286289..00000000 --- a/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-001-successfully-create-a-new-order-and-verify-projection.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.orders.create-order.successfully-create-a-new-order-and-verify-projection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.orders.create-order ---- -# Successfully create a new order and verify projection - -## Intent - -- outcome: Executable scenario: Successfully create a new order and verify projection - -```gwt -Given the backend is running and clean -When I create an order with: -Then the command should succeed -And I wait for projections to process -And the order "ord-int-01" should exist with status "draft" -And the order "ord-int-01" should have 0 items -``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-002-reject-duplicate-order-id.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-002-reject-duplicate-order-id.sdp.md deleted file mode 100644 index f3a5bdb9..00000000 --- a/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-002-reject-duplicate-order-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.orders.create-order.reject-duplicate-order-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.orders.create-order ---- -# Reject duplicate order ID - -## Intent - -- outcome: Executable scenario: Reject duplicate order ID - -```gwt -Given the backend is running and clean -And an order "ord-int-02" exists -When I create an order with: -Then the command should be rejected with code "ORDER_ALREADY_EXISTS" -``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md deleted file mode 100644 index 4bf578b3..00000000 --- a/specs/behavior/order-management/tests/integration-features/orders/create-order.examples/s-003-create-order-is-idempotent-with-same-command-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.orders.create-order.create-order-is-idempotent-with-same-command-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.orders.create-order ---- -# CreateOrder is idempotent with same commandId - -## Intent - -- outcome: Executable scenario: CreateOrder is idempotent with same commandId - -```gwt -Given the backend is running and clean -When I create an order with commandId "cmd-idem-01": and I repeat creating an order with commandId "cmd-idem-01": -Then the second command should return duplicate status -``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/create-order.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/create-order.sdp.md index 12b419e2..00f20125 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/create-order.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/create-order.sdp.md @@ -11,4 +11,4 @@ relations: ## Intent - actor: a customer -- outcome: to create new orders so that I can purchase products +- outcome: A customer creates new orders so that they can purchase products. diff --git a/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-001-query-orders-by-customer-id.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-001-query-orders-by-customer-id.sdp.md deleted file mode 100644 index 842b4c35..00000000 --- a/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-001-query-orders-by-customer-id.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.orders.query-orders.query-orders-by-customer-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.orders.query-orders ---- -# Query orders by customer ID - -## Intent - -- outcome: Executable scenario: Query orders by customer ID - -```gwt -Given the backend is running and clean -And customer "cust-query-01" has multiple orders: -And I wait for projections to process -When I query orders for customer "cust-query-01" -Then I should receive 2 orders -``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-002-query-orders-by-status.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-002-query-orders-by-status.sdp.md deleted file mode 100644 index 0b0e1ef6..00000000 --- a/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-002-query-orders-by-status.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.orders.query-orders.query-orders-by-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.orders.query-orders ---- -# Query orders by status - -## Intent - -- outcome: Executable scenario: Query orders by status - -```gwt -Given the backend is running and clean -And orders with different statuses exist: -And I wait for projections to process -When I query orders with status "draft" and I query orders with status "submitted" -Then I should receive at least 1 order -And I should receive at least 1 order -``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-003-remove-item-from-draft-order-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-003-remove-item-from-draft-order-and-verify-projection.sdp.md deleted file mode 100644 index f4d3775e..00000000 --- a/specs/behavior/order-management/tests/integration-features/orders/query-orders.examples/s-003-remove-item-from-draft-order-and-verify-projection.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.orders.query-orders.remove-item-from-draft-order-and-verify-projection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.orders.query-orders ---- -# Remove item from draft order and verify projection - -## Intent - -- outcome: Executable scenario: Remove item from draft order and verify projection - -```gwt -Given the backend is running and clean -And a draft order "ord-remove-01" exists with items: -When I remove item "prod_001" from order "ord-remove-01" -Then the command should succeed -And I wait for projections to process -And the order "ord-remove-01" should have 1 items -And the order "ord-remove-01" total should be 25 -``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/query-orders.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/query-orders.sdp.md index e820da6d..662f9993 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/query-orders.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/query-orders.sdp.md @@ -11,4 +11,4 @@ relations: ## Intent - actor: a user -- outcome: to query orders by various criteria so that I can find and view order information +- outcome: Orders can be queried by various criteria so that users can find and view order information. diff --git a/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-001-submit-order-with-items-and-verify-projection.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-001-submit-order-with-items-and-verify-projection.sdp.md index 187922ef..75b992d8 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-001-submit-order-with-items-and-verify-projection.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-001-submit-order-with-items-and-verify-projection.sdp.md @@ -2,22 +2,23 @@ id: spec:behavior.order-management.tests.integration-features.orders.submit-order.submit-order-with-items-and-verify-projection kind: example altitude: story -readiness: idea +readiness: defined relations: + verifies: spec:behavior.order-management.tests.integration-features.orders.submit-order refines: spec:behavior.order-management.tests.integration-features.orders.submit-order --- # Submit order with items and verify projection ## Intent -- outcome: Executable scenario: Submit order with items and verify projection +- outcome: Show that submitting an order with items updates the projection. ```gwt Given the backend is running and clean -And a draft order "ord-submit-01" exists with items: -When I submit order "ord-submit-01" +And a draft order {orderId: "ord-submit-01"} exists with items: +When I submit order {orderId: "ord-submit-01"} Then the command should succeed And I wait for projections to process -And the order "ord-submit-01" should exist with status "submitted" -And the order "ord-submit-01" total should be 45 +And the order {orderId: "ord-submit-01"} should exist with status {status: "submitted"} +And the order {orderId: "ord-submit-01"} total should be {total: 45} ``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-002-reject-submitting-empty-order.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-002-reject-submitting-empty-order.sdp.md index 77b8a30d..ec68ba85 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-002-reject-submitting-empty-order.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-002-reject-submitting-empty-order.sdp.md @@ -2,19 +2,20 @@ id: spec:behavior.order-management.tests.integration-features.orders.submit-order.reject-submitting-empty-order kind: example altitude: story -readiness: idea +readiness: defined relations: + verifies: spec:behavior.order-management.tests.integration-features.orders.submit-order refines: spec:behavior.order-management.tests.integration-features.orders.submit-order --- # Reject submitting empty order ## Intent -- outcome: Executable scenario: Reject submitting empty order +- outcome: Show that submitting an empty order is rejected. ```gwt Given the backend is running and clean -And an empty draft order "ord-submit-02" exists -When I submit order "ord-submit-02" -Then the command should be rejected with code "ORDER_HAS_NO_ITEMS" +And an empty draft order {orderId: "ord-submit-02"} exists +When I submit order {orderId: "ord-submit-02"} +Then the command should be rejected with code {rejectionCode: "ORDER_HAS_NO_ITEMS"} ``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-003-reject-submitting-already-submitted-order.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-003-reject-submitting-already-submitted-order.sdp.md index 18125ec1..3567d8da 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-003-reject-submitting-already-submitted-order.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/submit-order.examples/s-003-reject-submitting-already-submitted-order.sdp.md @@ -2,19 +2,20 @@ id: spec:behavior.order-management.tests.integration-features.orders.submit-order.reject-submitting-already-submitted-order kind: example altitude: story -readiness: idea +readiness: defined relations: + verifies: spec:behavior.order-management.tests.integration-features.orders.submit-order refines: spec:behavior.order-management.tests.integration-features.orders.submit-order --- # Reject submitting already submitted order ## Intent -- outcome: Executable scenario: Reject submitting already submitted order +- outcome: Show that submitting an already submitted order is rejected. ```gwt Given the backend is running and clean -And a submitted order "ord-submit-03" exists with items: -When I submit order "ord-submit-03" -Then the command should be rejected with code "ORDER_NOT_IN_DRAFT" +And a submitted order {orderId: "ord-submit-03"} exists with items: +When I submit order {orderId: "ord-submit-03"} +Then the command should be rejected with code {rejectionCode: "ORDER_NOT_IN_DRAFT"} ``` diff --git a/specs/behavior/order-management/tests/integration-features/orders/submit-order.sdp.md b/specs/behavior/order-management/tests/integration-features/orders/submit-order.sdp.md index a780415e..5a42a33b 100644 --- a/specs/behavior/order-management/tests/integration-features/orders/submit-order.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/orders/submit-order.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.order-management.tests.integration-features.orders.submit-order kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.order-management --- @@ -11,4 +11,19 @@ relations: ## Intent - actor: a customer -- outcome: to submit my order so that it can be processed for fulfillment +- outcome: A customer submits an order so that it can be processed for fulfillment. + +## Example space + +```gwt-vocabulary +Given the backend is running and clean +And a draft order {orderId:string} exists with items: +And an empty draft order {orderId:string} exists +And a submitted order {orderId:string} exists with items: +When I submit order {orderId:string} +Then the command should succeed +And I wait for projections to process +And the order {orderId:string} should exist with status {status:string} +And the order {orderId:string} total should be {total:number} +And the command should be rejected with code {rejectionCode:string} +``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-001-complete-saga-when-stock-is-available-for-single-item-order.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-001-complete-saga-when-stock-is-available-for-single-item-order.sdp.md index 0675570d..4584e0bf 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-001-complete-saga-when-stock-is-available-for-single-item-order.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-001-complete-saga-when-stock-is-available-for-single-item-order.sdp.md @@ -2,25 +2,26 @@ id: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment.complete-saga-when-stock-is-available-for-single-item-order kind: example altitude: story -readiness: idea +readiness: defined relations: + verifies: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment refines: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment --- # Complete saga when stock is available for single item order ## Intent -- outcome: Executable scenario: Complete saga when stock is available for single item order +- outcome: Show that the saga completes when stock is available for a single-item order. ```gwt Given the backend is running and clean -And a product "prod-saga-01" exists with 100 available stock -And a draft order "order-saga-01" exists with items: -When I submit order "order-saga-01" +And a product {productId: "prod-saga-01"} exists with {stock: 100} available stock +And a draft order {orderId: "order-saga-01"} exists with items: +When I submit order {orderId: "order-saga-01"} Then the command should succeed And I wait for the saga to complete with timeout 60000 And the saga status should be "completed" -And the order "order-saga-01" should have status "confirmed" -And the reservation for order "order-saga-01" should have status "confirmed" -And the product "prod-saga-01" should have less than 100 available stock +And the order {orderId: "order-saga-01"} should have status {status: "confirmed"} +And the reservation for order {orderId: "order-saga-01"} should have status {status: "confirmed"} +And the product {productId: "prod-saga-01"} should have less than {stock: 100} available stock ``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-002-complete-saga-when-stock-is-available-for-multi-item-order.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-002-complete-saga-when-stock-is-available-for-multi-item-order.sdp.md index 4ae4b436..8c9e3850 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-002-complete-saga-when-stock-is-available-for-multi-item-order.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-002-complete-saga-when-stock-is-available-for-multi-item-order.sdp.md @@ -2,24 +2,25 @@ id: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment.complete-saga-when-stock-is-available-for-multi-item-order kind: example altitude: story -readiness: idea +readiness: defined relations: + verifies: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment refines: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment --- # Complete saga when stock is available for multi-item order ## Intent -- outcome: Executable scenario: Complete saga when stock is available for multi-item order +- outcome: Show that the saga completes when stock is available for a multi-item order. ```gwt Given the backend is running and clean -And a product "prod-saga-02a" exists with 50 available stock -And a product "prod-saga-02b" exists with 30 available stock -And a draft order "order-saga-02" exists with items: -When I submit order "order-saga-02" +And a product {productId: "prod-saga-02a"} exists with {stock: 50} available stock +And a product {productId: "prod-saga-02b"} exists with {stock: 30} available stock +And a draft order {orderId: "order-saga-02"} exists with items: +When I submit order {orderId: "order-saga-02"} Then the command should succeed And I wait for the saga to complete with timeout 60000 And the saga status should be "completed" -And the order "order-saga-02" should have status "confirmed" +And the order {orderId: "order-saga-02"} should have status {status: "confirmed"} ``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-003-cancel-order-when-insufficient-stock-for-single-item.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-003-cancel-order-when-insufficient-stock-for-single-item.sdp.md index 43138fd8..7a54eaa4 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-003-cancel-order-when-insufficient-stock-for-single-item.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-003-cancel-order-when-insufficient-stock-for-single-item.sdp.md @@ -2,24 +2,25 @@ id: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment.cancel-order-when-insufficient-stock-for-single-item kind: example altitude: story -readiness: idea +readiness: defined relations: + verifies: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment refines: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment --- # Cancel order when insufficient stock for single item ## Intent -- outcome: Executable scenario: Cancel order when insufficient stock for single item +- outcome: Show that the order is cancelled when stock is insufficient for a single item. ```gwt Given the backend is running and clean -And a product "prod-saga-03" exists with 3 available stock -And a draft order "order-saga-03" exists with items: -When I submit order "order-saga-03" +And a product {productId: "prod-saga-03"} exists with {stock: 3} available stock +And a draft order {orderId: "order-saga-03"} exists with items: +When I submit order {orderId: "order-saga-03"} Then the command should succeed And I wait for the saga to complete with timeout 60000 And the saga status should be "completed" -And the order "order-saga-03" should have status "cancelled" -And the product "prod-saga-03" should have 3 available and 0 reserved stock +And the order {orderId: "order-saga-03"} should have status {status: "cancelled"} +And the product {productId: "prod-saga-03"} should have {available: 3} available and {reserved: 0} reserved stock ``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-004-cancel-order-when-one-item-in-multi-item-order-has-insufficient-stock.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-004-cancel-order-when-one-item-in-multi-item-order-has-insufficient-stock.sdp.md index 9d810b63..09845a6b 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-004-cancel-order-when-one-item-in-multi-item-order-has-insufficient-stock.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-004-cancel-order-when-one-item-in-multi-item-order-has-insufficient-stock.sdp.md @@ -2,25 +2,26 @@ id: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment.cancel-order-when-one-item-in-multi-item-order-has-insufficient-stock kind: example altitude: story -readiness: idea +readiness: defined relations: + verifies: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment refines: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment --- # Cancel order when one item in multi-item order has insufficient stock ## Intent -- outcome: Executable scenario: Cancel order when one item in multi-item order has insufficient stock +- outcome: Show that the order is cancelled when one item in a multi-item order has insufficient stock. ```gwt Given the backend is running and clean -And a product "prod-saga-04a" exists with 100 available stock -And a product "prod-saga-04b" exists with 2 available stock -And a draft order "order-saga-04" exists with items: -When I submit order "order-saga-04" +And a product {productId: "prod-saga-04a"} exists with {stock: 100} available stock +And a product {productId: "prod-saga-04b"} exists with {stock: 2} available stock +And a draft order {orderId: "order-saga-04"} exists with items: +When I submit order {orderId: "order-saga-04"} Then the command should succeed And I wait for the saga to complete with timeout 60000 And the saga status should be "completed" -And the order "order-saga-04" should have status "cancelled" -And the product "prod-saga-04a" should have 100 available and 0 reserved stock +And the order {orderId: "order-saga-04"} should have status {status: "cancelled"} +And the product {productId: "prod-saga-04a"} should have {available: 100} available and {reserved: 0} reserved stock ``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-005-saga-runs-only-once-per-order.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-005-saga-runs-only-once-per-order.sdp.md index 98c85969..3d5fdfcc 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-005-saga-runs-only-once-per-order.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-005-saga-runs-only-once-per-order.sdp.md @@ -2,24 +2,25 @@ id: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment.saga-runs-only-once-per-order kind: example altitude: story -readiness: idea +readiness: defined relations: + verifies: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment refines: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment --- # Saga runs only once per order ## Intent -- outcome: Executable scenario: Saga runs only once per order +- outcome: Show that the saga runs only once per order. ```gwt Given the backend is running and clean -And a product "prod-saga-05" exists with 100 available stock -And a draft order "order-saga-05" exists with items: -When I submit order "order-saga-05" +And a product {productId: "prod-saga-05"} exists with {stock: 100} available stock +And a draft order {orderId: "order-saga-05"} exists with items: +When I submit order {orderId: "order-saga-05"} Then the command should succeed And I wait for the saga to complete with timeout 60000 And the saga status should be "completed" -And only one saga should exist for order "order-saga-05" -And the reservation for order "order-saga-05" should have status "confirmed" +And only one saga should exist for order {orderId: "order-saga-05"} +And the reservation for order {orderId: "order-saga-05"} should have status {status: "confirmed"} ``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-006-saga-status-is-completed-after-successful-fulfillment.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-006-saga-status-is-completed-after-successful-fulfillment.sdp.md deleted file mode 100644 index 9721b741..00000000 --- a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-006-saga-status-is-completed-after-successful-fulfillment.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment.saga-status-is-completed-after-successful-fulfillment -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment ---- -# Saga status is completed after successful fulfillment - -## Intent - -- outcome: Executable scenario: Saga status is completed after successful fulfillment - -```gwt -Given the backend is running and clean -And a product "prod-saga-06" exists with 100 available stock -And a draft order "order-saga-06" exists with items: -When I submit order "order-saga-06" -Then the command should succeed -And I wait for the saga to complete with timeout 60000 -And the saga status should be "completed" -And the saga should have a workflow ID -``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-007-saga-status-is-completed-after-compensation.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-007-saga-status-is-completed-after-compensation.sdp.md deleted file mode 100644 index a64d5f4b..00000000 --- a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-007-saga-status-is-completed-after-compensation.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment.saga-status-is-completed-after-compensation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment ---- -# Saga status is completed after compensation - -## Intent - -- outcome: Executable scenario: Saga status is completed after compensation - -```gwt -Given the backend is running and clean -And a product "prod-saga-07" exists with 2 available stock -And a draft order "order-saga-07" exists with items: -When I submit order "order-saga-07" -Then the command should succeed -And I wait for the saga to complete with timeout 60000 -And the saga status should be "completed" -``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-008-saga-has-completed-at-timestamp-after-completion.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-008-saga-has-completed-at-timestamp-after-completion.sdp.md index 95dfe023..6cf73dd2 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-008-saga-has-completed-at-timestamp-after-completion.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.examples/s-008-saga-has-completed-at-timestamp-after-completion.sdp.md @@ -2,21 +2,22 @@ id: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment.saga-has-completed-at-timestamp-after-completion kind: example altitude: story -readiness: idea +readiness: defined relations: + verifies: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment refines: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment --- # Saga has completedAt timestamp after completion ## Intent -- outcome: Executable scenario: Saga has completedAt timestamp after completion +- outcome: Show that the saga has a completedAt timestamp after completion. ```gwt Given the backend is running and clean -And a product "prod-saga-08" exists with 100 available stock -And a draft order "order-saga-08" exists with items: -When I submit order "order-saga-08" +And a product {productId: "prod-saga-08"} exists with {stock: 100} available stock +And a draft order {orderId: "order-saga-08"} exists with items: +When I submit order {orderId: "order-saga-08"} Then the command should succeed And I wait for the saga to complete with timeout 60000 And the saga status should be "completed" diff --git a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.sdp.md index ce008fae..76e1d56f 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/order-fulfillment.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.order-management.tests.integration-features.sagas.order-fulfillment kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.order-management --- @@ -11,4 +11,23 @@ relations: ## Intent - actor: an order management system -- outcome: to coordinate order fulfillment across bounded contexts so that orders are confirmed when stock is available and cancelled when not +- outcome: The system coordinates order fulfillment across bounded contexts so that orders are confirmed when stock is available and cancelled when not. + +## Example space + +```gwt-vocabulary +Given the backend is running and clean +And a product {productId:string} exists with {stock:number} available stock +And a draft order {orderId:string} exists with items: +When I submit order {orderId:string} +Then the command should succeed +And I wait for the saga to complete with timeout 60000 +And the saga status should be "completed" +And the order {orderId:string} should have status {status:string} +And the reservation for order {orderId:string} should have status {status:string} +And the product {productId:string} should have less than {stock:number} available stock +And the product {productId:string} should have {available:number} available and {reserved:number} reserved stock +And only one saga should exist for order {orderId:string} +And the saga should have a workflow ID +And the saga should have a completedAt timestamp +``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-001-get-saga-details-returns-workflow-id-for-completed-saga.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-001-get-saga-details-returns-workflow-id-for-completed-saga.sdp.md deleted file mode 100644 index 37391efb..00000000 --- a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-001-get-saga-details-returns-workflow-id-for-completed-saga.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.sagas.saga-admin.get-saga-details-returns-workflow-id-for-completed-saga -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.sagas.saga-admin ---- -# Get saga details returns workflow ID for completed saga - -## Intent - -- outcome: Executable scenario: Get saga details returns workflow ID for completed saga - -```gwt -Given the backend is running and clean -And a product "prod-admin-01" exists with 100 available stock -And a draft order "order-admin-01" exists with items: -And I submit order "order-admin-01" -And I wait for the saga to complete with timeout 60000 -When I get saga details for "OrderFulfillment" saga with ID "order-admin-01" -Then the saga details should not be null -And the saga details should have status "completed" -And the saga details should have a workflow ID -``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-002-get-saga-steps-returns-step-history.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-002-get-saga-steps-returns-step-history.sdp.md deleted file mode 100644 index f7ce4ffd..00000000 --- a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-002-get-saga-steps-returns-step-history.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.sagas.saga-admin.get-saga-steps-returns-step-history -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.sagas.saga-admin ---- -# Get saga steps returns step history - -## Intent - -- outcome: Executable scenario: Get saga steps returns step history - -```gwt -Given the backend is running and clean -And a product "prod-admin-02" exists with 20 available stock -And a draft order "order-admin-02" exists with items: -And I submit order "order-admin-02" -And I wait for the saga to complete with timeout 60000 -When I get saga steps for "OrderFulfillment" saga with ID "order-admin-02" -Then the saga steps should not be null -And the saga steps should have saga ID "order-admin-02" -And the saga steps should have a workflow ID -``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-003-get-saga-steps-returns-null-for-non-existent-saga.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-003-get-saga-steps-returns-null-for-non-existent-saga.sdp.md deleted file mode 100644 index 223725c8..00000000 --- a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-003-get-saga-steps-returns-null-for-non-existent-saga.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.sagas.saga-admin.get-saga-steps-returns-null-for-non-existent-saga -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.sagas.saga-admin ---- -# Get saga steps returns null for non-existent saga - -## Intent - -- outcome: Executable scenario: Get saga steps returns null for non-existent saga - -```gwt -Given the backend is running and clean -When I get saga steps for "OrderFulfillment" saga with ID "nonexistent" -Then the saga steps should be null -``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-004-cancel-completed-saga-returns-invalid-state.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-004-cancel-completed-saga-returns-invalid-state.sdp.md deleted file mode 100644 index 1c58782f..00000000 --- a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-004-cancel-completed-saga-returns-invalid-state.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.sagas.saga-admin.cancel-completed-saga-returns-invalid-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.sagas.saga-admin ---- -# Cancel completed saga returns invalid_state - -## Intent - -- outcome: Executable scenario: Cancel completed saga returns invalid_state - -```gwt -Given the backend is running and clean -And a product "prod-admin-03" exists with 100 available stock -And a draft order "order-admin-03" exists with items: -And I submit order "order-admin-03" -And I wait for the saga to complete with timeout 60000 -When I cancel the "OrderFulfillment" saga with ID "order-admin-03" with reason "Admin cancelled for testing" -Then the cancel result status should be "invalid_state" -``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-005-cancel-non-existent-saga-returns-not-found.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-005-cancel-non-existent-saga-returns-not-found.sdp.md deleted file mode 100644 index 281f9fe5..00000000 --- a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-005-cancel-non-existent-saga-returns-not-found.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.sagas.saga-admin.cancel-non-existent-saga-returns-not-found -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.sagas.saga-admin ---- -# Cancel non-existent saga returns not_found - -## Intent - -- outcome: Executable scenario: Cancel non-existent saga returns not_found - -```gwt -Given the backend is running and clean -When I cancel the "OrderFulfillment" saga with ID "nonexistent" with reason "Should not work" -Then the cancel result status should be "not_found" -``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-006-cleanup-completed-saga-workflow.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-006-cleanup-completed-saga-workflow.sdp.md deleted file mode 100644 index ed4841b3..00000000 --- a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.examples/s-006-cleanup-completed-saga-workflow.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.tests.integration-features.sagas.saga-admin.cleanup-completed-saga-workflow -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.tests.integration-features.sagas.saga-admin ---- -# Cleanup completed saga workflow - -## Intent - -- outcome: Executable scenario: Cleanup completed saga workflow - -```gwt -Given the backend is running and clean -And a product "prod-admin-04" exists with 100 available stock -And a draft order "order-admin-04" exists with items: -And I submit order "order-admin-04" -And I wait for the saga to complete with timeout 60000 -When I cleanup the "OrderFulfillment" saga workflow with ID "order-admin-04" -Then the cleanup result status should be one of "cleaned", "cleanup_failed" -``` diff --git a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.sdp.md b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.sdp.md index 762f17ee..1ac64407 100644 --- a/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.sdp.md +++ b/specs/behavior/order-management/tests/integration-features/sagas/saga-admin.sdp.md @@ -11,4 +11,4 @@ relations: ## Intent - actor: a system administrator -- outcome: to manage and monitor sagas so that I can troubleshoot and maintain saga workflows +- outcome: Administrators manage and monitor sagas so they can troubleshoot and maintain saga workflows. diff --git a/specs/behavior/order-management/timeline/phase-00-initialization.sdp.md b/specs/behavior/order-management/timeline/phase-00-initialization.sdp.md index 9f04b284..29eef98f 100644 --- a/specs/behavior/order-management/timeline/phase-00-initialization.sdp.md +++ b/specs/behavior/order-management/timeline/phase-00-initialization.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Project Initialization +- outcome: Set up repository structure and development tooling. diff --git a/specs/behavior/order-management/timeline/phase-01-core-infrastructure.sdp.md b/specs/behavior/order-management/timeline/phase-01-core-infrastructure.sdp.md index 57d53f5b..01221f6d 100644 --- a/specs/behavior/order-management/timeline/phase-01-core-infrastructure.sdp.md +++ b/specs/behavior/order-management/timeline/phase-01-core-infrastructure.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Core Infrastructure +- outcome: Build shared types, schemas, and utilities for the event sourcing platform. diff --git a/specs/behavior/order-management/timeline/phase-02-event-store-orchestration.sdp.md b/specs/behavior/order-management/timeline/phase-02-event-store-orchestration.sdp.md index 31d112fb..7ac72919 100644 --- a/specs/behavior/order-management/timeline/phase-02-event-store-orchestration.sdp.md +++ b/specs/behavior/order-management/timeline/phase-02-event-store-orchestration.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Event Store and Orchestration Infrastructure +- outcome: Provide centralized event storage with orchestration infrastructure for reliable projections. diff --git a/specs/behavior/order-management/timeline/phase-03-command-bus.sdp.md b/specs/behavior/order-management/timeline/phase-03-command-bus.sdp.md index c1b2060c..6834ac42 100644 --- a/specs/behavior/order-management/timeline/phase-03-command-bus.sdp.md +++ b/specs/behavior/order-management/timeline/phase-03-command-bus.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Command Bus Component +- outcome: Provide centralized command routing with middleware and idempotency. diff --git a/specs/behavior/order-management/timeline/phase-04-orders-bc.sdp.md b/specs/behavior/order-management/timeline/phase-04-orders-bc.sdp.md index e285edc3..f89c6770 100644 --- a/specs/behavior/order-management/timeline/phase-04-orders-bc.sdp.md +++ b/specs/behavior/order-management/timeline/phase-04-orders-bc.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Orders Bounded Context +- outcome: Deliver a complete Orders bounded context demonstrating DDD, event sourcing, and CQRS patterns. diff --git a/specs/behavior/order-management/timeline/phase-05-inventory-bc.sdp.md b/specs/behavior/order-management/timeline/phase-05-inventory-bc.sdp.md index b6128575..11c68b4b 100644 --- a/specs/behavior/order-management/timeline/phase-05-inventory-bc.sdp.md +++ b/specs/behavior/order-management/timeline/phase-05-inventory-bc.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Inventory Bounded Context +- outcome: Deliver multi-aggregate inventory management with stock tracking and reservations. diff --git a/specs/behavior/order-management/timeline/phase-06-cross-context-integration.sdp.md b/specs/behavior/order-management/timeline/phase-06-cross-context-integration.sdp.md index e8ad748a..d15836eb 100644 --- a/specs/behavior/order-management/timeline/phase-06-cross-context-integration.sdp.md +++ b/specs/behavior/order-management/timeline/phase-06-cross-context-integration.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Cross-Context Integration +- outcome: Coordinate Orders and Inventory bounded contexts through saga-based workflows. diff --git a/specs/behavior/order-management/timeline/phase-07-projection-engine.sdp.md b/specs/behavior/order-management/timeline/phase-07-projection-engine.sdp.md index 1942ddcd..0fcb43a9 100644 --- a/specs/behavior/order-management/timeline/phase-07-projection-engine.sdp.md +++ b/specs/behavior/order-management/timeline/phase-07-projection-engine.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Projection Engine (Deferred) +- outcome: Record that a dedicated projection engine was evaluated and deferred in favor of Workpool. diff --git a/specs/behavior/order-management/timeline/phase-08-documentation-polish.sdp.md b/specs/behavior/order-management/timeline/phase-08-documentation-polish.sdp.md index 52249ee8..fd6c6a91 100644 --- a/specs/behavior/order-management/timeline/phase-08-documentation-polish.sdp.md +++ b/specs/behavior/order-management/timeline/phase-08-documentation-polish.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Documentation & Knowledge Infrastructure +- outcome: Deliver knowledge management systems and a frontend MVP with comprehensive testing. diff --git a/specs/behavior/order-management/timeline/phase-09-event-system.sdp.md b/specs/behavior/order-management/timeline/phase-09-event-system.sdp.md index ec7533c6..98af55fb 100644 --- a/specs/behavior/order-management/timeline/phase-09-event-system.sdp.md +++ b/specs/behavior/order-management/timeline/phase-09-event-system.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Event System Enhancement +- outcome: Provide advanced event categorization, upcasting, and correlation tracking. diff --git a/specs/behavior/order-management/timeline/phase-10-command-system.sdp.md b/specs/behavior/order-management/timeline/phase-10-command-system.sdp.md index aeaec93a..5f587780 100644 --- a/specs/behavior/order-management/timeline/phase-10-command-system.sdp.md +++ b/specs/behavior/order-management/timeline/phase-10-command-system.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Command System Enhancement +- outcome: Provide command categorization, registry, middleware pipeline, and batch execution. diff --git a/specs/behavior/order-management/timeline/phase-11-bc-formalization.sdp.md b/specs/behavior/order-management/timeline/phase-11-bc-formalization.sdp.md index e76256f3..5d2a426c 100644 --- a/specs/behavior/order-management/timeline/phase-11-bc-formalization.sdp.md +++ b/specs/behavior/order-management/timeline/phase-11-bc-formalization.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Bounded Context Formalization +- outcome: Deliver contract-based bounded context infrastructure with declarative invariants. diff --git a/specs/behavior/order-management/timeline/phase-12-repository-read-model.sdp.md b/specs/behavior/order-management/timeline/phase-12-repository-read-model.sdp.md index 162a2e64..062f757a 100644 --- a/specs/behavior/order-management/timeline/phase-12-repository-read-model.sdp.md +++ b/specs/behavior/order-management/timeline/phase-12-repository-read-model.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Repository & Read Model Infrastructure +- outcome: Deliver projection registry, lifecycle management, and a query abstraction layer. diff --git a/specs/behavior/order-management/timeline/phase-13-process-manager.sdp.md b/specs/behavior/order-management/timeline/phase-13-process-manager.sdp.md index 32e673ad..ab6c5e29 100644 --- a/specs/behavior/order-management/timeline/phase-13-process-manager.sdp.md +++ b/specs/behavior/order-management/timeline/phase-13-process-manager.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Process Manager Abstraction +- outcome: Provide event-triggered process managers with idempotent processing and logging. diff --git a/specs/behavior/order-management/timeline/phase-14-decider-formalization.sdp.md b/specs/behavior/order-management/timeline/phase-14-decider-formalization.sdp.md index f74ac7df..1d912a90 100644 --- a/specs/behavior/order-management/timeline/phase-14-decider-formalization.sdp.md +++ b/specs/behavior/order-management/timeline/phase-14-decider-formalization.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Decider Formalization +- outcome: Extract pure decide functions from command handlers for testable domain logic. diff --git a/specs/behavior/order-management/timeline/phase-15-projection-categories.sdp.md b/specs/behavior/order-management/timeline/phase-15-projection-categories.sdp.md index 0bd8214a..76515934 100644 --- a/specs/behavior/order-management/timeline/phase-15-projection-categories.sdp.md +++ b/specs/behavior/order-management/timeline/phase-15-projection-categories.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Projection Categories +- outcome: Formalize projection taxonomy with explicit Logic, View, Reporting, and Integration categories. diff --git a/specs/behavior/order-management/timeline/phase-16-dcb.sdp.md b/specs/behavior/order-management/timeline/phase-16-dcb.sdp.md index b00e1e01..000cbc65 100644 --- a/specs/behavior/order-management/timeline/phase-16-dcb.sdp.md +++ b/specs/behavior/order-management/timeline/phase-16-dcb.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Dynamic Consistency Boundaries +- outcome: Enable cross-entity invariants within bounded contexts via scope-based optimistic concurrency. diff --git a/specs/behavior/order-management/timeline/phase-17-reactive-projections.sdp.md b/specs/behavior/order-management/timeline/phase-17-reactive-projections.sdp.md index ae830c33..0de6c709 100644 --- a/specs/behavior/order-management/timeline/phase-17-reactive-projections.sdp.md +++ b/specs/behavior/order-management/timeline/phase-17-reactive-projections.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Reactive Projections +- outcome: Combine Workpool with a reactive model so UI updates arrive in 10-50ms without polling. diff --git a/specs/behavior/order-management/timeline/phase-18-production-hardening.sdp.md b/specs/behavior/order-management/timeline/phase-18-production-hardening.sdp.md index 9ac58b50..f73b682c 100644 --- a/specs/behavior/order-management/timeline/phase-18-production-hardening.sdp.md +++ b/specs/behavior/order-management/timeline/phase-18-production-hardening.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Production Hardening +- outcome: Provide production-ready observability, monitoring, and operational tooling. diff --git a/specs/behavior/order-management/timeline/phase-19-testing-infrastructure.sdp.md b/specs/behavior/order-management/timeline/phase-19-testing-infrastructure.sdp.md index b5b9b90e..ea36ad32 100644 --- a/specs/behavior/order-management/timeline/phase-19-testing-infrastructure.sdp.md +++ b/specs/behavior/order-management/timeline/phase-19-testing-infrastructure.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Testing Infrastructure +- outcome: Complete BDD migration with Gherkin feature files for all domain logic. diff --git a/specs/behavior/order-management/timeline/phase-20-service-independence.sdp.md b/specs/behavior/order-management/timeline/phase-20-service-independence.sdp.md index 6261d4d7..28e00df1 100644 --- a/specs/behavior/order-management/timeline/phase-20-service-independence.sdp.md +++ b/specs/behavior/order-management/timeline/phase-20-service-independence.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Service Independence +- outcome: Enable bounded contexts to operate independently via ECST, fat events, and the reservation pattern. diff --git a/specs/behavior/order-management/timeline/phase-21-integration-patterns.sdp.md b/specs/behavior/order-management/timeline/phase-21-integration-patterns.sdp.md index 4b217e74..71f2e816 100644 --- a/specs/behavior/order-management/timeline/phase-21-integration-patterns.sdp.md +++ b/specs/behavior/order-management/timeline/phase-21-integration-patterns.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Integration Patterns +- outcome: Formalize cross-context communication with a context map, published language, and anti-corruption layer. diff --git a/specs/behavior/order-management/timeline/phase-22-agent-as-bc.sdp.md b/specs/behavior/order-management/timeline/phase-22-agent-as-bc.sdp.md index 3cd0cede..81185f32 100644 --- a/specs/behavior/order-management/timeline/phase-22-agent-as-bc.sdp.md +++ b/specs/behavior/order-management/timeline/phase-22-agent-as-bc.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Agent as Bounded Context +- outcome: Demonstrate an AI agent as an event-reactor bounded context that emits commands autonomously. diff --git a/specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-001-all-feature-files-pass-schema-validation.sdp.md b/specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-001-all-feature-files-pass-schema-validation.sdp.md deleted file mode 100644 index 8882b365..00000000 --- a/specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-001-all-feature-files-pass-schema-validation.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.timeline.phase-23-process-setup.all-feature-files-pass-schema-validation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.timeline.phase-23-process-setup ---- -# All feature files pass schema validation - -## Intent - -- outcome: Executable scenario: All feature files pass schema validation - -```gwt -Given the following deliverables: -And all timeline feature files have Background: Deliverables -When running docs:patterns command -Then no schema validation failures occur -And no parsing warnings appear -``` diff --git a/specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-002-roadmap-md-reflects-planned-phases.sdp.md b/specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-002-roadmap-md-reflects-planned-phases.sdp.md deleted file mode 100644 index aef0e8ab..00000000 --- a/specs/behavior/order-management/timeline/phase-23-process-setup.examples/s-002-roadmap-md-reflects-planned-phases.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.timeline.phase-23-process-setup.roadmap-md-reflects-planned-phases -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.timeline.phase-23-process-setup ---- -# ROADMAP.md reflects planned phases - -## Intent - -- outcome: Executable scenario: ROADMAP.md reflects planned phases - -```gwt -Given the following deliverables: -And docs:roadmap command is configured -When running pnpm docs:roadmap -Then docs-living/ROADMAP.md is generated -And it shows phases 15-22 as planned -And it shows dependency relationships -``` diff --git a/specs/behavior/order-management/timeline/phase-23-process-setup.sdp.md b/specs/behavior/order-management/timeline/phase-23-process-setup.sdp.md index b2a8c896..e8112933 100644 --- a/specs/behavior/order-management/timeline/phase-23-process-setup.sdp.md +++ b/specs/behavior/order-management/timeline/phase-23-process-setup.sdp.md @@ -10,6 +10,6 @@ relations: ## Intent -- outcome: - 23 feature files exist but lack Background: Deliverables DataTables - Schema validation fails on 9 files, warnings on others - Manual documentation in docs/project-management/ not connected to process - No ROADMAP.md, SESSION-CONTEXT.md, REMAINING-WORK.md generators wired - Generator configs exist in package but not exposed at monorepo level +- outcome: Wire deliverable DataTables and monorepo docs generators so the existing feature files validate. - problem: - 23 feature files exist but lack Background: Deliverables DataTables - Schema validation fails on 9 files, warnings on others - Manual documentation in docs/project-management/ not connected to process - No ROADMAP.md, SESSION-CONTEXT.md, REMAINING-WORK.md generators wired - Generator configs exist in package but not exposed at monorepo level - value: - Add Background: Deliverables DataTables to all 23 existing feature files - Wire existing generator configs to monorepo-level commands - Update root package.json with new docs:* commands - Ensure generators produce expected output with no validation errors diff --git a/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-001-historical-deliverables-are-preserved.sdp.md b/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-001-historical-deliverables-are-preserved.sdp.md deleted file mode 100644 index 8678c4fa..00000000 --- a/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-001-historical-deliverables-are-preserved.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.timeline.phase-24-old-roadmap-porting.historical-deliverables-are-preserved -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.timeline.phase-24-old-roadmap-porting ---- -# Historical deliverables are preserved - -## Intent - -- outcome: Executable scenario: Historical deliverables are preserved - -```gwt -Given the following deliverables: -And old roadmap phases have task tables -When porting to feature file DataTables -Then each task becomes a deliverable row -And Location matches actual code paths -And Release links to CHANGELOG entries -``` diff --git a/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-002-incomplete-phases-deferred-appropriately.sdp.md b/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-002-incomplete-phases-deferred-appropriately.sdp.md deleted file mode 100644 index 586c79b1..00000000 --- a/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.examples/s-002-incomplete-phases-deferred-appropriately.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.timeline.phase-24-old-roadmap-porting.incomplete-phases-deferred-appropriately -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.timeline.phase-24-old-roadmap-porting ---- -# Incomplete phases deferred appropriately - -## Intent - -- outcome: Executable scenario: Incomplete phases deferred appropriately - -```gwt -Given the following deliverables: -And Phase 7 (Projection Engine) is deferred -And Phase 11B has incomplete sessions -When reviewing at pivot midpoint -Then assess whether to port based on architecture needs -And document decision in ADR -``` diff --git a/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.sdp.md b/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.sdp.md index c09c7c18..76a8c423 100644 --- a/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.sdp.md +++ b/specs/behavior/order-management/timeline/phase-24-old-roadmap-porting.sdp.md @@ -10,6 +10,6 @@ relations: ## Intent -- outcome: - Rich detail in docs/project-management/roadmap/*.md (23 files) - Tasks, deliverables, verification steps not captured in feature files - Historical context needed for future work and pattern understanding - Manual docs will drift without connection to process +- outcome: Port completed-phase roadmap detail into feature-file DataTables so manual roadmap docs can be deprecated. - problem: - Rich detail in docs/project-management/roadmap/*.md (23 files) - Tasks, deliverables, verification steps not captured in feature files - Historical context needed for future work and pattern understanding - Manual docs will drift without connection to process - value: - Extract deliverables from each completed phase's .md file - Populate DataTables with Location, Tests, Release info - Link to CHANGELOG entries for version history - Mark manual roadmap docs as deprecated once ported diff --git a/specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-001-ad-rs-are-accessible-through-generated-docs.sdp.md b/specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-001-ad-rs-are-accessible-through-generated-docs.sdp.md deleted file mode 100644 index e2c2fc0f..00000000 --- a/specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-001-ad-rs-are-accessible-through-generated-docs.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.timeline.phase-25-adr-porting.ad-rs-are-accessible-through-generated-docs -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.timeline.phase-25-adr-porting ---- -# ADRs are accessible through generated docs - -## Intent - -- outcome: Executable scenario: ADRs are accessible through generated docs - -```gwt -Given the following deliverables: -And ADRs have been reviewed and ported -When running pnpm docs:adrs -Then docs-living/DECISIONS.md is generated -And it categorizes ADRs by domain (event-sourcing, projections, commands, etc.) -And superseded ADRs are clearly marked -``` diff --git a/specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-002-adr-validity-is-assessed-against-new-roadmap.sdp.md b/specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-002-adr-validity-is-assessed-against-new-roadmap.sdp.md deleted file mode 100644 index be104c0c..00000000 --- a/specs/behavior/order-management/timeline/phase-25-adr-porting.examples/s-002-adr-validity-is-assessed-against-new-roadmap.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.timeline.phase-25-adr-porting.adr-validity-is-assessed-against-new-roadmap -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.timeline.phase-25-adr-porting ---- -# ADR validity is assessed against new roadmap - -## Intent - -- outcome: Executable scenario: ADR validity is assessed against new roadmap - -```gwt -Given the following deliverables: -And the aggregate-less pivot changes architecture patterns -When reviewing each ADR -Then ADRs conflicting with new patterns are marked superseded -And valid ADRs reference which roadmap phases they support -``` diff --git a/specs/behavior/order-management/timeline/phase-25-adr-porting.sdp.md b/specs/behavior/order-management/timeline/phase-25-adr-porting.sdp.md index 9d710972..b63e103e 100644 --- a/specs/behavior/order-management/timeline/phase-25-adr-porting.sdp.md +++ b/specs/behavior/order-management/timeline/phase-25-adr-porting.sdp.md @@ -10,6 +10,6 @@ relations: ## Intent -- outcome: - 33 ADRs exist in docs/architecture/decisions/ as manual .md files - ADRs are disconnected from delivery process - Some ADRs may be outdated or superseded by aggregate-less pivot - No generated DECISIONS.md artifact for architectural overview +- outcome: Convert valid ADRs into process-connected feature files and generate a DECISIONS.md index. - problem: - 33 ADRs exist in docs/architecture/decisions/ as manual .md files - ADRs are disconnected from delivery process - Some ADRs may be outdated or superseded by aggregate-less pivot - No generated DECISIONS.md artifact for architectural overview - value: - Review each ADR against new aggregate-less roadmap for validity - Convert valid ADRs to .feature files with @architect-decision tag - Archive or supersede outdated ADRs with proper annotation - Wire docs:adrs generator to monorepo-level commands - Generate DECISIONS.md with categorized ADR index diff --git a/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-001-planning-sessions-have-defined-outputs.sdp.md b/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-001-planning-sessions-have-defined-outputs.sdp.md deleted file mode 100644 index 81438c58..00000000 --- a/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-001-planning-sessions-have-defined-outputs.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.timeline.phase-26-workflow-configuration.planning-sessions-have-defined-outputs -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.timeline.phase-26-workflow-configuration ---- -# Planning sessions have defined outputs - -## Intent - -- outcome: Executable scenario: Planning sessions have defined outputs - -```gwt -Given the following deliverables: -And workflow configuration is complete -When starting a planning session -Then the expected artifacts for that workflow type are clear -And session templates guide what to produce -``` diff --git a/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-002-non-code-sessions-are-supported.sdp.md b/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-002-non-code-sessions-are-supported.sdp.md deleted file mode 100644 index f564fe70..00000000 --- a/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-002-non-code-sessions-are-supported.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.timeline.phase-26-workflow-configuration.non-code-sessions-are-supported -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.timeline.phase-26-workflow-configuration ---- -# Non-code sessions are supported - -## Intent - -- outcome: Executable scenario: Non-code sessions are supported - -```gwt -Given the following deliverables: -And the delivery process supports multiple workflows -When running an Analysis or Design session -Then the process accommodates investigation and documentation -And does not require code commits -``` diff --git a/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-003-configuration-inheritance-works.sdp.md b/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-003-configuration-inheritance-works.sdp.md deleted file mode 100644 index 2ecbbe2c..00000000 --- a/specs/behavior/order-management/timeline/phase-26-workflow-configuration.examples/s-003-configuration-inheritance-works.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.order-management.timeline.phase-26-workflow-configuration.configuration-inheritance-works -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.timeline.phase-26-workflow-configuration ---- -# Configuration inheritance works - -## Intent - -- outcome: Executable scenario: Configuration inheritance works - -```gwt -Given the following deliverables: -And universal process definitions exist in package catalogue/ -When configuring monorepo instance in delivery-process/ -Then instance can reference package definitions by name -And instance can extend/override with repo-specific customizations -And templates can be included in session prompts -``` diff --git a/specs/behavior/order-management/timeline/phase-26-workflow-configuration.sdp.md b/specs/behavior/order-management/timeline/phase-26-workflow-configuration.sdp.md index c548f41c..9ce5937e 100644 --- a/specs/behavior/order-management/timeline/phase-26-workflow-configuration.sdp.md +++ b/specs/behavior/order-management/timeline/phase-26-workflow-configuration.sdp.md @@ -10,6 +10,6 @@ relations: ## Intent -- outcome: - Base process specs (PROCESS_MODEL.md, PROCESS_SETUP.md) define workflows - Monorepo needs customized workflow configuration for planning sessions - Not all sessions produce code - some produce designs, requirements, analysis - Need to define what each workflow type should output +- outcome: Configure monorepo-specific planning-session workflows and the artifacts each session type should produce. - problem: - Base process specs (PROCESS_MODEL.md, PROCESS_SETUP.md) define workflows - Monorepo needs customized workflow configuration for planning sessions - Not all sessions produce code - some produce designs, requirements, analysis - Need to define what each workflow type should output - value: - Review base process specs for default workflows - Configure monorepo-specific workflow phases (Inception, Elaboration, etc.) - Define session types with expected artifacts: - Requirements: Feature files, PRD content - Analysis: Investigation notes, gap identification - Design: ADRs, architecture decisions - Implementation: Code, tests - Validation: DoD verification, acceptance testing - Create reusable session templates for each workflow type diff --git a/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-001-core-patterns-are-documented-for-roadmap-planning.sdp.md b/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-001-core-patterns-are-documented-for-roadmap-planning.sdp.md deleted file mode 100644 index d50789ac..00000000 --- a/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-001-core-patterns-are-documented-for-roadmap-planning.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.timeline.phase-27-pattern-annotation-priorities.core-patterns-are-documented-for-roadmap-planning -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.timeline.phase-27-pattern-annotation-priorities ---- -# Core patterns are documented for roadmap planning - -## Intent - -- outcome: Executable scenario: Core patterns are documented for roadmap planning - -```gwt -Given the following deliverables: -And P0 and P1 patterns are annotated -When designing new roadmap phases -Then pattern docs provide architectural context -And relationships between patterns are visible -``` diff --git a/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-002-progressive-annotation-policy-is-sustainable.sdp.md b/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-002-progressive-annotation-policy-is-sustainable.sdp.md deleted file mode 100644 index 8935f516..00000000 --- a/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.examples/s-002-progressive-annotation-policy-is-sustainable.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.timeline.phase-27-pattern-annotation-priorities.progressive-annotation-policy-is-sustainable -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.timeline.phase-27-pattern-annotation-priorities ---- -# Progressive annotation policy is sustainable - -## Intent - -- outcome: Executable scenario: Progressive annotation policy is sustainable - -```gwt -Given the following deliverables: -And annotation policy is defined -When developers touch code -Then they annotate changed/related patterns -And annotation coverage grows organically -``` diff --git a/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.sdp.md b/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.sdp.md index 8a8c7668..793e8884 100644 --- a/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.sdp.md +++ b/specs/behavior/order-management/timeline/phase-27-pattern-annotation-priorities.sdp.md @@ -10,6 +10,6 @@ relations: ## Intent -- outcome: - PATTERNS.md needs annotations in @convex-es/* packages - New roadmap milestones require understanding core patterns first - Current annotation coverage is sparse - Need strategic prioritization, not exhaustive annotation +- outcome: Prioritize core infrastructure pattern annotations that inform roadmap decisions. - problem: - PATTERNS.md needs annotations in @convex-es/* packages - New roadmap milestones require understanding core patterns first - Current annotation coverage is sparse - Need strategic prioritization, not exhaustive annotation - value: - Prioritize core infrastructure patterns that inform roadmap decisions: 1. Middleware (command/event flow) 2. Event Bus (event delivery mechanism) 3. Command Orchestrator (7-step lifecycle) 4. CMS (Command Model State) 5. Handlers (command/event handling) - Annotate foundational patterns before advanced ones - Use @architect-roadmap tag for patterns relevant to planned phases - Progressive annotation: annotate per PR as code is touched diff --git a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-001-claude-md-is-generated-from-modules.sdp.md b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-001-claude-md-is-generated-from-modules.sdp.md deleted file mode 100644 index 56494e0e..00000000 --- a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-001-claude-md-is-generated-from-modules.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.order-management.timeline.phase-28-modular-claude-md.claude-md-is-generated-from-modules -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.timeline.phase-28-modular-claude-md ---- -# CLAUDE.md is generated from modules - -## Intent - -- outcome: Executable scenario: CLAUDE.md is generated from modules - -```gwt -Given the following deliverables: -And metadata.json defines sections and variations -And modules exist in manual/ and generated/ directories -When running pnpm docs:claude-md -Then CLAUDE.md is compiled from modules -And section numbering is automatic -And token count is reported -``` diff --git a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-002-variations-produce-different-outputs.sdp.md b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-002-variations-produce-different-outputs.sdp.md deleted file mode 100644 index 6258f2d8..00000000 --- a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-002-variations-produce-different-outputs.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.timeline.phase-28-modular-claude-md.variations-produce-different-outputs -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.timeline.phase-28-modular-claude-md ---- -# Variations produce different outputs - -## Intent - -- outcome: Executable scenario: Variations produce different outputs - -```gwt -Given the following deliverables: -And multiple variations are configured (default, patterns, process) -When building each variation -Then each produces appropriately filtered content -And token budgets are respected per variation -``` diff --git a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-003-pattern-content-is-auto-generated.sdp.md b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-003-pattern-content-is-auto-generated.sdp.md deleted file mode 100644 index 8fa8a2bb..00000000 --- a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-003-pattern-content-is-auto-generated.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.timeline.phase-28-modular-claude-md.pattern-content-is-auto-generated -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.timeline.phase-28-modular-claude-md ---- -# Pattern content is auto-generated - -## Intent - -- outcome: Executable scenario: Pattern content is auto-generated - -```gwt -Given the following deliverables: -And @architect-pattern annotations exist in code -When running docs:claude-md -Then pattern modules are generated in generated/patterns/ -And changes to code annotations update CLAUDE.md -``` diff --git a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-004-session-templates-are-includable.sdp.md b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-004-session-templates-are-includable.sdp.md deleted file mode 100644 index c5322d2f..00000000 --- a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.examples/s-004-session-templates-are-includable.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.order-management.timeline.phase-28-modular-claude-md.session-templates-are-includable -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.order-management.timeline.phase-28-modular-claude-md ---- -# Session templates are includable - -## Intent - -- outcome: Executable scenario: Session templates are includable - -```gwt -Given the following deliverables: -And session templates exist in catalogue/templates/ -When starting a specific session type (inception, elaboration, etc.) -Then appropriate templates can be included in session prompt -And templates reference current CLAUDE.md content -``` diff --git a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.sdp.md b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.sdp.md index 9581a26e..18d0690f 100644 --- a/specs/behavior/order-management/timeline/phase-28-modular-claude-md.sdp.md +++ b/specs/behavior/order-management/timeline/phase-28-modular-claude-md.sdp.md @@ -10,6 +10,6 @@ relations: ## Intent -- outcome: - Current CLAUDE.md is 896 lines of organically accumulated content (2 weeks rapid iteration) - No variation support - same content for all work contexts - Manual maintenance burden - updates lag code changes - Mixed content types: some should be generated, some static - No evidence-based effectiveness tracking - Difficult to compose different "views" for different session types +- outcome: Extract a modular CLAUDE.md build system with generated and manual modules. - problem: - Current CLAUDE.md is 896 lines of organically accumulated content (2 weeks rapid iteration) - No variation support - same content for all work contexts - Manual maintenance burden - updates lag code changes - Mixed content types: some should be generated, some static - No evidence-based effectiveness tracking - Difficult to compose different "views" for different session types - value: - Extract CLAUDE.md build system to delivery-process package - Create hybrid architecture: generated + manual modules - Support tag-based variations (patterns, process, security, etc.) - Integrate with @architect annotations for auto-generated pattern docs - Enable session templates as includable prompt content - Add effectiveness tracking for evidence-based content decisions diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-001-define-command-preserves-literal-command-type.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-001-define-command-preserves-literal-command-type.sdp.md deleted file mode 100644 index 12e36c51..00000000 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-001-define-command-preserves-literal-command-type.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-bc.bc-contracts.define-command-preserves-literal-command-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bc.bc-contracts ---- -# defineCommand preserves literal commandType - -## Intent - -- outcome: Executable scenario: defineCommand preserves literal commandType - -```gwt -Given a command definition with commandType "CreateOrder" -When I call defineCommand with the definition -Then the result commandType should be "CreateOrder" -And the result should preserve the createsAggregate flag as true -``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-002-define-command-includes-all-metadata-fields.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-002-define-command-includes-all-metadata-fields.sdp.md deleted file mode 100644 index 7c83cef7..00000000 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-002-define-command-includes-all-metadata-fields.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-bc.bc-contracts.define-command-includes-all-metadata-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bc.bc-contracts ---- -# defineCommand includes all metadata fields - -## Intent - -- outcome: Executable scenario: defineCommand includes all metadata fields - -```gwt -Given a command definition with multiple producesEvents -When I call defineCommand with the definition -Then the result should have producesEvents with 2 items -And the result should have errorCodes with 1 item -``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-003-define-event-preserves-literal-event-type.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-003-define-event-preserves-literal-event-type.sdp.md deleted file mode 100644 index b3ec6235..00000000 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-003-define-event-preserves-literal-event-type.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-bc.bc-contracts.define-event-preserves-literal-event-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bc.bc-contracts ---- -# defineEvent preserves literal eventType - -## Intent - -- outcome: Executable scenario: defineEvent preserves literal eventType - -```gwt -Given an event definition with eventType "OrderCreated" -When I call defineEvent with the definition -Then the result eventType should be "OrderCreated" -And the result category should be "domain" -``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-004-define-event-supports-all-event-categories.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-004-define-event-supports-all-event-categories.sdp.md deleted file mode 100644 index 9215e058..00000000 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-004-define-event-supports-all-event-categories.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-bc.bc-contracts.define-event-supports-all-event-categories -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bc.bc-contracts ---- -# defineEvent supports all event categories - -## Intent - -- outcome: Executable scenario: defineEvent supports all event categories - -```gwt -Given an event definition with category "integration" -When I call defineEvent with the definition -Then the result category should be "integration" -``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-005-define-projection-preserves-literal-projection-name.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-005-define-projection-preserves-literal-projection-name.sdp.md deleted file mode 100644 index cb4529bc..00000000 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-005-define-projection-preserves-literal-projection-name.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-bc.bc-contracts.define-projection-preserves-literal-projection-name -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bc.bc-contracts ---- -# defineProjection preserves literal projectionName - -## Intent - -- outcome: Executable scenario: defineProjection preserves literal projectionName - -```gwt -Given a projection definition with projectionName "orderSummary" -When I call defineProjection with the definition -Then the result projectionName should be "orderSummary" -And the result type should be "primary" -``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-006-define-projection-preserves-event-subscriptions-tuple.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-006-define-projection-preserves-event-subscriptions-tuple.sdp.md deleted file mode 100644 index 05d0ac1d..00000000 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-006-define-projection-preserves-event-subscriptions-tuple.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-bc.bc-contracts.define-projection-preserves-event-subscriptions-tuple -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bc.bc-contracts ---- -# defineProjection preserves eventSubscriptions tuple - -## Intent - -- outcome: Executable scenario: defineProjection preserves eventSubscriptions tuple - -```gwt -Given a projection definition with 3 event subscriptions -When I call defineProjection with the definition -Then the result should have eventSubscriptions with 3 items -``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-007-is-projection-category-validates-category-strings.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-007-is-projection-category-validates-category-strings.sdp.md deleted file mode 100644 index 8a174799..00000000 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-007-is-projection-category-validates-category-strings.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-bc.bc-contracts.is-projection-category-validates-category-strings -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bc.bc-contracts ---- -# isProjectionCategory validates category strings - -## Intent - -- outcome: Executable scenario: isProjectionCategory validates category strings - -```gwt -Given the feature fixture is in place -When I check isProjectionCategory with value "value" -Then the result should be value -``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-008-is-logic-projection-returns-true-only-for-logic-category.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-008-is-logic-projection-returns-true-only-for-logic-category.sdp.md deleted file mode 100644 index f73c9896..00000000 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-008-is-logic-projection-returns-true-only-for-logic-category.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-bc.bc-contracts.is-logic-projection-returns-true-only-for-logic-category -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bc.bc-contracts ---- -# isLogicProjection returns true only for logic category - -## Intent - -- outcome: Executable scenario: isLogicProjection returns true only for logic category - -```gwt -Given a projection category "logic" -When I check isLogicProjection -Then the result should be true -``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-009-is-view-projection-returns-true-only-for-view-category.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-009-is-view-projection-returns-true-only-for-view-category.sdp.md deleted file mode 100644 index 4cda9968..00000000 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-009-is-view-projection-returns-true-only-for-view-category.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-bc.bc-contracts.is-view-projection-returns-true-only-for-view-category -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bc.bc-contracts ---- -# isViewProjection returns true only for view category - -## Intent - -- outcome: Executable scenario: isViewProjection returns true only for view category - -```gwt -Given a projection category "view" -When I check isViewProjection -Then the result should be true -``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-010-is-client-exposed-returns-true-only-for-view-category.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-010-is-client-exposed-returns-true-only-for-view-category.sdp.md deleted file mode 100644 index e82effa2..00000000 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-010-is-client-exposed-returns-true-only-for-view-category.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-bc.bc-contracts.is-client-exposed-returns-true-only-for-view-category -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bc.bc-contracts ---- -# isClientExposed returns true only for view category - -## Intent - -- outcome: Executable scenario: isClientExposed returns true only for view category - -```gwt -Given a projection category "view" -When I check isClientExposed -Then the result should be true -``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-011-is-client-exposed-returns-false-for-non-view-categories.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-011-is-client-exposed-returns-false-for-non-view-categories.sdp.md deleted file mode 100644 index 746a8f65..00000000 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-011-is-client-exposed-returns-false-for-non-view-categories.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-bc.bc-contracts.is-client-exposed-returns-false-for-non-view-categories -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bc.bc-contracts ---- -# isClientExposed returns false for non-view categories - -## Intent - -- outcome: Executable scenario: isClientExposed returns false for non-view categories - -```gwt -Given a projection category "reporting" -When I check isClientExposed -Then the result should be false -``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-012-define-process-manager-validates-time-triggered-requires-cron-config.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-012-define-process-manager-validates-time-triggered-requires-cron-config.sdp.md deleted file mode 100644 index f8b0d632..00000000 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-012-define-process-manager-validates-time-triggered-requires-cron-config.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-bc.bc-contracts.define-process-manager-validates-time-triggered-requires-cron-config -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bc.bc-contracts ---- -# defineProcessManager validates time-triggered requires cronConfig - -## Intent - -- outcome: Executable scenario: defineProcessManager validates time-triggered requires cronConfig - -```gwt -Given a process manager definition with triggerType "time" without cronConfig -When I call defineProcessManager expecting an error -Then it should throw an error containing "requires cronConfig" -``` diff --git a/specs/behavior/platform-bc/bc-contracts.examples/s-013-define-process-manager-validates-event-triggered-requires-subscriptions.sdp.md b/specs/behavior/platform-bc/bc-contracts.examples/s-013-define-process-manager-validates-event-triggered-requires-subscriptions.sdp.md deleted file mode 100644 index b0b1c140..00000000 --- a/specs/behavior/platform-bc/bc-contracts.examples/s-013-define-process-manager-validates-event-triggered-requires-subscriptions.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-bc.bc-contracts.define-process-manager-validates-event-triggered-requires-subscriptions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bc.bc-contracts ---- -# defineProcessManager validates event-triggered requires subscriptions - -## Intent - -- outcome: Executable scenario: defineProcessManager validates event-triggered requires subscriptions - -```gwt -Given a process manager definition with triggerType "event" without subscriptions -When I call defineProcessManager expecting an error -Then it should throw an error containing "requires at least one event subscription" -``` diff --git a/specs/behavior/platform-bc/bc-contracts.sdp.md b/specs/behavior/platform-bc/bc-contracts.sdp.md index 201c2992..db5ed481 100644 --- a/specs/behavior/platform-bc/bc-contracts.sdp.md +++ b/specs/behavior/platform-bc/bc-contracts.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Bounded Context Contract Helper Functions +- outcome: Preserve literal types on bounded-context contract helpers so registries stay type-safe and category strings can be validated at runtime. +- value: defineCommand, defineEvent, defineProjection, and defineProcessManager keep literal names, and category validators reject invalid strings. diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-001-direct-table-query-fails-across-component-boundary.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-001-direct-table-query-fails-across-component-boundary.sdp.md deleted file mode 100644 index 8e49cc5b..00000000 --- a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-001-direct-table-query-fails-across-component-boundary.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-bc.bounded-context-foundation-executable-tests.direct-table-query-fails-across-component-boundary -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bc.bounded-context-foundation-executable-tests ---- -# Direct table query fails across component boundary - -## Intent - -- outcome: Executable scenario: Direct table query fails across component boundary - -```gwt -Given the platform-bc contracts and definitions are available -And a bounded context "orders" with table "orderCMS" -When the parent app attempts to query "orderCMS" directly -Then the query fails because the table doesn't exist in parent database -``` diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-002-component-api-access-succeeds.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-002-component-api-access-succeeds.sdp.md deleted file mode 100644 index 1db410e8..00000000 --- a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-002-component-api-access-succeeds.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-bc.bounded-context-foundation-executable-tests.component-api-access-succeeds -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bc.bounded-context-foundation-executable-tests ---- -# Component API access succeeds - -## Intent - -- outcome: Executable scenario: Component API access succeeds - -```gwt -Given the platform-bc contracts and definitions are available -And a bounded context "orders" with handler "createOrder" -When the parent app calls ctx.runMutation(components.orders.handlers.createOrder) -Then the handler executes successfully -``` diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-003-component-handler-writes-commit-atomically-on-success.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-003-component-handler-writes-commit-atomically-on-success.sdp.md deleted file mode 100644 index 70e0c3ac..00000000 --- a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-003-component-handler-writes-commit-atomically-on-success.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-bc.bounded-context-foundation-executable-tests.component-handler-writes-commit-atomically-on-success -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bc.bounded-context-foundation-executable-tests ---- -# Component handler writes commit atomically on success - -## Intent - -- outcome: Executable scenario: Component handler writes commit atomically on success - -```gwt -Given the platform-bc contracts and definitions are available -And a component handler that performs two writes -When the handler completes successfully -Then both writes are visible after commit -``` diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-004-caught-component-failure-rolls-back-only-the-component-writes.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-004-caught-component-failure-rolls-back-only-the-component-writes.sdp.md deleted file mode 100644 index f96aa359..00000000 --- a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-004-caught-component-failure-rolls-back-only-the-component-writes.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-bc.bounded-context-foundation-executable-tests.caught-component-failure-rolls-back-only-the-component-writes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bc.bounded-context-foundation-executable-tests ---- -# Caught component failure rolls back only the component writes - -## Intent - -- outcome: Executable scenario: Caught component failure rolls back only the component writes - -```gwt -Given the platform-bc contracts and definitions are available -And a parent mutation that writes row X then calls a component handler that throws -When the parent catches the exception -Then row X is preserved -And the component handler's writes are rolled back -``` diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-005-user-id-passed-explicitly-to-component.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-005-user-id-passed-explicitly-to-component.sdp.md deleted file mode 100644 index 88b9876b..00000000 --- a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-005-user-id-passed-explicitly-to-component.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-bc.bounded-context-foundation-executable-tests.user-id-passed-explicitly-to-component -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bc.bounded-context-foundation-executable-tests ---- -# User ID passed explicitly to component - -## Intent - -- outcome: Executable scenario: User ID passed explicitly to component - -```gwt -Given the platform-bc contracts and definitions are available -And a command requiring user authorization -When calling the bounded context handler -Then userId is passed as an explicit argument -And the component does not access ctx.auth -``` diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-006-id-conversion-at-boundary.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-006-id-conversion-at-boundary.sdp.md deleted file mode 100644 index a3013c3f..00000000 --- a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-006-id-conversion-at-boundary.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-bc.bounded-context-foundation-executable-tests.id-conversion-at-boundary -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bc.bounded-context-foundation-executable-tests ---- -# ID conversion at boundary - -## Intent - -- outcome: Executable scenario: ID conversion at boundary - -```gwt -Given the platform-bc contracts and definitions are available -And an order with internal ID of type Idvalue -When returning the order through the component API -Then the ID is converted to string format -And external callers receive a string identifier -``` diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-007-contract-provides-type-safety-for-commands.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-007-contract-provides-type-safety-for-commands.sdp.md deleted file mode 100644 index 8bfdac72..00000000 --- a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.examples/s-007-contract-provides-type-safety-for-commands.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-bc.bounded-context-foundation-executable-tests.contract-provides-type-safety-for-commands -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bc.bounded-context-foundation-executable-tests ---- -# Contract provides type safety for commands - -## Intent - -- outcome: Executable scenario: Contract provides type safety for commands - -```gwt -Given the platform-bc contracts and definitions are available -And a DualWriteContextContract with commandTypes ["CreateOrder", "SubmitOrder"] -When using ExtractCommandTypes helper -Then the result type is "CreateOrder" "SubmitOrder" -And invalid command types cause compile errors -``` diff --git a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.sdp.md b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.sdp.md index 575890eb..976b5ae1 100644 --- a/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.sdp.md +++ b/specs/behavior/platform-bc/bounded-context-foundation-executable-tests.sdp.md @@ -10,7 +10,9 @@ relations: ## Intent -- outcome: BoundedContextFoundation Executable Tests +- problem: DDD bounded contexts need physically enforced boundaries; without isolation, accidental coupling undermines domain-driven design. +- outcome: Isolate each Convex component database behind a typed component API so a parent app cannot query component tables directly. +- value: DualWriteContextContract and string conversion at the API boundary keep inter-context communication type-safe. ## Behavior diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-001-first-command-execution-is-recorded.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-001-first-command-execution-is-recorded.sdp.md deleted file mode 100644 index a2f2ed4b..00000000 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-001-first-command-execution-is-recorded.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.first-command-execution-is-recorded -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests ---- -# First command execution is recorded - -## Intent - -- outcome: Executable scenario: First command execution is recorded - -```gwt -Given the platform-bus CommandBus client is available -And the platform-core CommandOrchestrator is available -And no command exists with id "cmd-123" -When recording command "cmd-123" of type "CreateOrder" -Then the command is recorded with status "pending" -And the response indicates isNew = true -``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-002-duplicate-command-returns-cached-result.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-002-duplicate-command-returns-cached-result.sdp.md deleted file mode 100644 index 9f5e5fc2..00000000 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-002-duplicate-command-returns-cached-result.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.duplicate-command-returns-cached-result -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests ---- -# Duplicate command returns cached result - -## Intent - -- outcome: Executable scenario: Duplicate command returns cached result - -```gwt -Given the platform-bus CommandBus client is available -And the platform-core CommandOrchestrator is available -And command "cmd-123" exists with status "executed" and result "success" -When recording command "cmd-123" again -Then the response indicates isNew = false -And the cached result is returned -``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-003-successful-command-transitions-to-executed.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-003-successful-command-transitions-to-executed.sdp.md deleted file mode 100644 index d3e2521d..00000000 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-003-successful-command-transitions-to-executed.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.successful-command-transitions-to-executed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests ---- -# Successful command transitions to executed - -## Intent - -- outcome: Executable scenario: Successful command transitions to executed - -```gwt -Given the platform-bus CommandBus client is available -And the platform-core CommandOrchestrator is available -And a command in "pending" status -When the command handler returns success -Then the status becomes "executed" -And the result contains success data -``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-004-business-rejection-transitions-to-rejected.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-004-business-rejection-transitions-to-rejected.sdp.md deleted file mode 100644 index 19d274a5..00000000 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-004-business-rejection-transitions-to-rejected.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.business-rejection-transitions-to-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests ---- -# Business rejection transitions to rejected - -## Intent - -- outcome: Executable scenario: Business rejection transitions to rejected - -```gwt -Given the platform-bus CommandBus client is available -And the platform-core CommandOrchestrator is available -And a command in "pending" status -When the command handler returns rejected with code "INVALID_STATUS" -Then the status becomes "rejected" -And the result contains the rejection code -``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-005-unexpected-error-transitions-to-failed.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-005-unexpected-error-transitions-to-failed.sdp.md deleted file mode 100644 index d9fcccd9..00000000 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-005-unexpected-error-transitions-to-failed.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.unexpected-error-transitions-to-failed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests ---- -# Unexpected error transitions to failed - -## Intent - -- outcome: Executable scenario: Unexpected error transitions to failed - -```gwt -Given the platform-bus CommandBus client is available -And the platform-core CommandOrchestrator is available -And a command in "pending" status -When the command handler throws an unexpected error -Then the status becomes "failed" -And the result contains error details -``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-006-successful-command-runs-all-7-orchestrator-steps.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-006-successful-command-runs-all-7-orchestrator-steps.sdp.md deleted file mode 100644 index 313a356c..00000000 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-006-successful-command-runs-all-7-orchestrator-steps.sdp.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.successful-command-runs-all-7-orchestrator-steps -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests ---- -# Successful command runs all 7 orchestrator steps - -## Intent - -- outcome: Executable scenario: Successful command runs all 7 orchestrator steps - -```gwt -Given the platform-bus CommandBus client is available -And the platform-core CommandOrchestrator is available -And a CommandOrchestrator wired with a successful handler -When dispatching a command -Then the command is recorded -And middleware executes -And the handler is called -And an event is appended -And the projection workpool is enqueued -And the command status is finalized -``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-007-rejected-command-short-circuits-before-event-append.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-007-rejected-command-short-circuits-before-event-append.sdp.md deleted file mode 100644 index bf5a3ba8..00000000 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-007-rejected-command-short-circuits-before-event-append.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.rejected-command-short-circuits-before-event-append -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests ---- -# Rejected command short-circuits before event append - -## Intent - -- outcome: Executable scenario: Rejected command short-circuits before event append - -```gwt -Given the platform-bus CommandBus client is available -And the platform-core CommandOrchestrator is available -And a CommandOrchestrator wired with a handler returning rejected -When dispatching a command -Then no event is appended -And the command status is finalized as "rejected" -``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-008-correlation-id-is-propagated-to-emitted-event-metadata.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-008-correlation-id-is-propagated-to-emitted-event-metadata.sdp.md deleted file mode 100644 index 7b1c5101..00000000 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-008-correlation-id-is-propagated-to-emitted-event-metadata.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.correlation-id-is-propagated-to-emitted-event-metadata -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests ---- -# Correlation id is propagated to emitted event metadata - -## Intent - -- outcome: Executable scenario: Correlation id is propagated to emitted event metadata - -```gwt -Given the platform-bus CommandBus client is available -And the platform-core CommandOrchestrator is available -And a command dispatched with correlationId "corr-1" -When the orchestrator appends an event -Then the event metadata carries correlationId "corr-1" -``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-009-get-by-correlation-returns-the-events-for-a-command.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-009-get-by-correlation-returns-the-events-for-a-command.sdp.md deleted file mode 100644 index 6c3e9cd5..00000000 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-009-get-by-correlation-returns-the-events-for-a-command.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.get-by-correlation-returns-the-events-for-a-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests ---- -# getByCorrelation returns the events for a command - -## Intent - -- outcome: Executable scenario: getByCorrelation returns the events for a command - -```gwt -Given the platform-bus CommandBus client is available -And the platform-core CommandOrchestrator is available -And a command dispatched with correlationId "corr-2" that produced one event -When calling getByCorrelation with "corr-2" -Then the resulting entry lists the produced eventId -``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-010-registered-middleware-run-in-order.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-010-registered-middleware-run-in-order.sdp.md deleted file mode 100644 index 5e48b4a6..00000000 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-010-registered-middleware-run-in-order.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.registered-middleware-run-in-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests ---- -# Registered middleware run in order - -## Intent - -- outcome: Executable scenario: Registered middleware run in order - -```gwt -Given the platform-bus CommandBus client is available -And the platform-core CommandOrchestrator is available -And two middlewares registered in order A then B -When a command is dispatched -Then middleware A executes before middleware B -``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-011-middleware-failure-halts-the-pipeline.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-011-middleware-failure-halts-the-pipeline.sdp.md deleted file mode 100644 index 7c403287..00000000 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.examples/s-011-middleware-failure-halts-the-pipeline.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-bus.command-bus-foundation-executable-tests.middleware-failure-halts-the-pipeline -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bus.command-bus-foundation-executable-tests ---- -# Middleware failure halts the pipeline - -## Intent - -- outcome: Executable scenario: Middleware failure halts the pipeline - -```gwt -Given the platform-bus CommandBus client is available -And the platform-core CommandOrchestrator is available -And a middleware that fails -When a command is dispatched -Then no subsequent middleware runs -And the handler is not invoked -``` diff --git a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.sdp.md b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.sdp.md index 65524165..67ca3989 100644 --- a/specs/behavior/platform-bus/command-bus-foundation-executable-tests.sdp.md +++ b/specs/behavior/platform-bus/command-bus-foundation-executable-tests.sdp.md @@ -10,7 +10,9 @@ relations: ## Intent -- outcome: CommandBusFoundation Executable Tests +- problem: Command execution needs infrastructure-level idempotency, status tracking, and one standardized flow; without that, duplicate requests can corrupt domain state. +- outcome: Record each command by commandId, track pending through executed, rejected, or failed, and run every command through the CommandOrchestrator. +- value: The same commandId returns the same result without re-execution, so retries cannot double-apply domain changes. ## Behavior diff --git a/specs/behavior/platform-bus/idempotency.examples/s-001-first-command-submission-is-recorded.sdp.md b/specs/behavior/platform-bus/idempotency.examples/s-001-first-command-submission-is-recorded.sdp.md deleted file mode 100644 index 6f3b260f..00000000 --- a/specs/behavior/platform-bus/idempotency.examples/s-001-first-command-submission-is-recorded.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-bus.idempotency.first-command-submission-is-recorded -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bus.idempotency ---- -# First command submission is recorded - -## Intent - -- outcome: Executable scenario: First command submission is recorded - -```gwt -Given the command bus component is available -And the test uses isolated command IDs -And a new command with unique id -And command type "CreateOrder" -And target context "orders" -When the command is submitted to the command bus -Then the response status should be "new" -And the command should be queryable by its id -``` diff --git a/specs/behavior/platform-bus/idempotency.examples/s-002-duplicate-command-returns-existing-status-when-completed.sdp.md b/specs/behavior/platform-bus/idempotency.examples/s-002-duplicate-command-returns-existing-status-when-completed.sdp.md deleted file mode 100644 index c273862c..00000000 --- a/specs/behavior/platform-bus/idempotency.examples/s-002-duplicate-command-returns-existing-status-when-completed.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-bus.idempotency.duplicate-command-returns-existing-status-when-completed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bus.idempotency ---- -# Duplicate command returns existing status when completed - -## Intent - -- outcome: Executable scenario: Duplicate command returns existing status when completed - -```gwt -Given the command bus component is available -And the test uses isolated command IDs -And a command was previously submitted and executed -When a duplicate command with the same id is submitted -Then the response status should be "duplicate" -And the response should include command status "executed" -``` diff --git a/specs/behavior/platform-bus/idempotency.examples/s-003-duplicate-command-during-processing-returns-pending-status.sdp.md b/specs/behavior/platform-bus/idempotency.examples/s-003-duplicate-command-during-processing-returns-pending-status.sdp.md deleted file mode 100644 index 8ea01e39..00000000 --- a/specs/behavior/platform-bus/idempotency.examples/s-003-duplicate-command-during-processing-returns-pending-status.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-bus.idempotency.duplicate-command-during-processing-returns-pending-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bus.idempotency ---- -# Duplicate command during processing returns pending status - -## Intent - -- outcome: Executable scenario: Duplicate command during processing returns pending status - -```gwt -Given the command bus component is available -And the test uses isolated command IDs -And a command is currently pending -When a duplicate command with the same id is submitted -Then the response status should be "duplicate" -And the response should include command status "pending" -``` diff --git a/specs/behavior/platform-bus/idempotency.examples/s-004-concurrent-duplicate-detection-via-post-insert-verification.sdp.md b/specs/behavior/platform-bus/idempotency.examples/s-004-concurrent-duplicate-detection-via-post-insert-verification.sdp.md deleted file mode 100644 index 1fe9782b..00000000 --- a/specs/behavior/platform-bus/idempotency.examples/s-004-concurrent-duplicate-detection-via-post-insert-verification.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-bus.idempotency.concurrent-duplicate-detection-via-post-insert-verification -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-bus.idempotency ---- -# Concurrent duplicate detection via post-insert verification - -## Intent - -- outcome: Executable scenario: Concurrent duplicate detection via post-insert verification - -```gwt -Given the command bus component is available -And the test uses isolated command IDs -And two concurrent submissions with identical command id -When both requests are processed -Then exactly one command record should exist -And the submissions should have one "new" and one "duplicate" response -``` diff --git a/specs/behavior/platform-bus/idempotency.sdp.md b/specs/behavior/platform-bus/idempotency.sdp.md index f9baf372..41131d6e 100644 --- a/specs/behavior/platform-bus/idempotency.sdp.md +++ b/specs/behavior/platform-bus/idempotency.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Command Bus Idempotency +- outcome: Detect duplicate command submissions that share a commandId and return the existing status instead of executing twice. +- value: Command dispatch stays reliable in distributed systems where retries may occur. diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-001-returns-null-when-checkpoint-position-equals-event-position.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-001-returns-null-when-checkpoint-position-equals-event-position.sdp.md deleted file mode 100644 index bd503a68..00000000 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-001-returns-null-when-checkpoint-position-equals-event-position.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.action-handler.returns-null-when-checkpoint-position-equals-event-position -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.action-handler ---- -# Returns null when checkpoint position equals event position - -## Intent - -- outcome: Executable scenario: Returns null when checkpoint position equals event position - -```gwt -Given an agent config with default test pattern -And a checkpoint with lastProcessedPosition 100 and status "active" -When I invoke the handler with globalPosition 100 -Then the result is null -``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-002-returns-null-when-checkpoint-position-exceeds-event-position.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-002-returns-null-when-checkpoint-position-exceeds-event-position.sdp.md deleted file mode 100644 index 27ed3f2b..00000000 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-002-returns-null-when-checkpoint-position-exceeds-event-position.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.action-handler.returns-null-when-checkpoint-position-exceeds-event-position -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.action-handler ---- -# Returns null when checkpoint position exceeds event position - -## Intent - -- outcome: Executable scenario: Returns null when checkpoint position exceeds event position - -```gwt -Given an agent config with default test pattern -And a checkpoint with lastProcessedPosition 200 and status "active" -When I invoke the handler with globalPosition 100 -Then the result is null -``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-003-returns-null-when-agent-status-is-paused.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-003-returns-null-when-agent-status-is-paused.sdp.md deleted file mode 100644 index 640ebe38..00000000 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-003-returns-null-when-agent-status-is-paused.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.action-handler.returns-null-when-agent-status-is-paused -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.action-handler ---- -# Returns null when agent status is paused - -## Intent - -- outcome: Executable scenario: Returns null when agent status is paused - -```gwt -Given an agent config with default test pattern -And a checkpoint with lastProcessedPosition 50 and status "paused" -When I invoke the handler with globalPosition 100 -Then the result is null -``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-004-returns-null-when-agent-status-is-stopped.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-004-returns-null-when-agent-status-is-stopped.sdp.md deleted file mode 100644 index 092997df..00000000 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-004-returns-null-when-agent-status-is-stopped.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.action-handler.returns-null-when-agent-status-is-stopped -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.action-handler ---- -# Returns null when agent status is stopped - -## Intent - -- outcome: Executable scenario: Returns null when agent status is stopped - -```gwt -Given an agent config with default test pattern -And a checkpoint with lastProcessedPosition 50 and status "stopped" -When I invoke the handler with globalPosition 100 -Then the result is null -``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-005-returns-null-when-agent-status-is-error-recovery.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-005-returns-null-when-agent-status-is-error-recovery.sdp.md deleted file mode 100644 index 22f29a84..00000000 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-005-returns-null-when-agent-status-is-error-recovery.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.action-handler.returns-null-when-agent-status-is-error-recovery -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.action-handler ---- -# Returns null when agent status is error_recovery - -## Intent - -- outcome: Executable scenario: Returns null when agent status is error_recovery - -```gwt -Given an agent config with default test pattern -And a checkpoint with lastProcessedPosition 50 and status "error_recovery" -When I invoke the handler with globalPosition 100 -Then the result is null -``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-006-processes-normally-when-checkpoint-is-null-first-event.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-006-processes-normally-when-checkpoint-is-null-first-event.sdp.md deleted file mode 100644 index 4375395f..00000000 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-006-processes-normally-when-checkpoint-is-null-first-event.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.action-handler.processes-normally-when-checkpoint-is-null-first-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.action-handler ---- -# Processes normally when checkpoint is null (first event) - -## Intent - -- outcome: Executable scenario: Processes normally when checkpoint is null (first event) - -```gwt -Given an agent config with default test pattern -And a null checkpoint -When I invoke the handler with globalPosition 1 -Then the result is not null -And the result has the following properties: -And the decision is not null -``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-007-returns-rule-based-analysis-when-pattern-has-no-analyze-function.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-007-returns-rule-based-analysis-when-pattern-has-no-analyze-function.sdp.md deleted file mode 100644 index 5abe1198..00000000 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-007-returns-rule-based-analysis-when-pattern-has-no-analyze-function.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.action-handler.returns-rule-based-analysis-when-pattern-has-no-analyze-function -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.action-handler ---- -# Returns rule-based analysis when pattern has no analyze function - -## Intent - -- outcome: Executable scenario: Returns rule-based analysis when pattern has no analyze function - -```gwt -Given an agent config with default test pattern -And a null checkpoint -When I invoke the handler with default args -Then the result is not null -And the result analysisMethod is "rule-based" -And the result llmMetrics is undefined -``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-008-re-throws-when-pattern-trigger-throws.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-008-re-throws-when-pattern-trigger-throws.sdp.md deleted file mode 100644 index 795827f4..00000000 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-008-re-throws-when-pattern-trigger-throws.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.action-handler.re-throws-when-pattern-trigger-throws -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.action-handler ---- -# Re-throws when pattern trigger throws - -## Intent - -- outcome: Executable scenario: Re-throws when pattern trigger throws - -```gwt -Given an agent config with a throwing pattern "Handler crashed" -And a null checkpoint -When I invoke the handler with default args expecting error -Then the error message is "Handler crashed" -``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-009-propagates-load-state-errors-for-workpool-retry.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-009-propagates-load-state-errors-for-workpool-retry.sdp.md deleted file mode 100644 index 6b34f449..00000000 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-009-propagates-load-state-errors-for-workpool-retry.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.action-handler.propagates-load-state-errors-for-workpool-retry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.action-handler ---- -# Propagates loadState errors for Workpool retry - -## Intent - -- outcome: Executable scenario: Propagates loadState errors for Workpool retry - -```gwt -Given an agent config with default test pattern -And a loadState that rejects with "DB connection lost" -When I invoke the handler with default args expecting error -Then the error message is "DB connection lost" -``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-010-generates-deterministic-decision-id-from-agent-id-and-global-position.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-010-generates-deterministic-decision-id-from-agent-id-and-global-position.sdp.md deleted file mode 100644 index 06ca8693..00000000 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-010-generates-deterministic-decision-id-from-agent-id-and-global-position.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.action-handler.generates-deterministic-decision-id-from-agent-id-and-global-position -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.action-handler ---- -# Generates deterministic decisionId from agentId and globalPosition - -## Intent - -- outcome: Executable scenario: Generates deterministic decisionId from agentId and globalPosition - -```gwt -Given an agent config with default test pattern -And a null checkpoint -When I invoke the handler with agentId "churn-risk-agent" and globalPosition 42 -Then the result is not null -And the result decisionId is "dec_churn-risk-agent_42" -``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-011-generates-same-decision-id-for-same-inputs-deterministic.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-011-generates-same-decision-id-for-same-inputs-deterministic.sdp.md deleted file mode 100644 index 7546eedd..00000000 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-011-generates-same-decision-id-for-same-inputs-deterministic.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.action-handler.generates-same-decision-id-for-same-inputs-deterministic -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.action-handler ---- -# Generates same decisionId for same inputs (deterministic) - -## Intent - -- outcome: Executable scenario: Generates same decisionId for same inputs (deterministic) - -```gwt -Given an agent config with default test pattern -And a null checkpoint -When I invoke the handler twice with agentId "agent-x" and globalPosition 99 -Then both results have decisionId "dec_agent-x_99" -``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-012-returns-pattern-id-and-rule-based-decision-when-pattern-triggers.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-012-returns-pattern-id-and-rule-based-decision-when-pattern-triggers.sdp.md deleted file mode 100644 index dc591fb3..00000000 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-012-returns-pattern-id-and-rule-based-decision-when-pattern-triggers.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.action-handler.returns-pattern-id-and-rule-based-decision-when-pattern-triggers -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.action-handler ---- -# Returns patternId and rule-based decision when pattern triggers - -## Intent - -- outcome: Executable scenario: Returns patternId and rule-based decision when pattern triggers - -```gwt -Given an agent config with a "churn-risk" pattern that always triggers -And a null checkpoint -When I invoke the handler with default args -Then the result is not null -And the result has the following pattern properties: -And the decision is not null -And the decision command is null -``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-013-returns-llm-analysis-method-when-pattern-has-analyze-function.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-013-returns-llm-analysis-method-when-pattern-has-analyze-function.sdp.md deleted file mode 100644 index 81802d99..00000000 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-013-returns-llm-analysis-method-when-pattern-has-analyze-function.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.action-handler.returns-llm-analysis-method-when-pattern-has-analyze-function -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.action-handler ---- -# Returns llm analysis method when pattern has analyze function - -## Intent - -- outcome: Executable scenario: Returns llm analysis method when pattern has analyze function - -```gwt -Given an agent config with a "fraud-detection" pattern that has LLM analyze -And a null checkpoint -When I invoke the handler with default args -Then the result is not null -And the result has the following pattern properties: -And the decision command is "FlagFraud" -And the decision confidence is 0.95 -``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-014-returns-no-pattern-id-when-no-pattern-matches.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-014-returns-no-pattern-id-when-no-pattern-matches.sdp.md deleted file mode 100644 index 85ec4a27..00000000 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-014-returns-no-pattern-id-when-no-pattern-matches.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.action-handler.returns-no-pattern-id-when-no-pattern-matches -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.action-handler ---- -# Returns no patternId when no pattern matches - -## Intent - -- outcome: Executable scenario: Returns no patternId when no pattern matches - -```gwt -Given an agent config with a pattern that never triggers -And a null checkpoint -When I invoke the handler with default args -Then the result is not null -And the result patternId is undefined -And the decision is null -``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-015-does-not-invoke-llm-enrichment-via-runtime.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-015-does-not-invoke-llm-enrichment-via-runtime.sdp.md deleted file mode 100644 index 35883c52..00000000 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-015-does-not-invoke-llm-enrichment-via-runtime.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.action-handler.does-not-invoke-llm-enrichment-via-runtime -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.action-handler ---- -# Does not invoke LLM enrichment via runtime - -## Intent - -- outcome: Executable scenario: Does not invoke LLM enrichment via runtime - -```gwt -Given an agent config with a rule-only pattern and a spy runtime -And a null checkpoint -When I invoke the handler with default args -Then the result is not null -And the runtime analyze was not called -And the result llmMetrics is undefined -``` diff --git a/specs/behavior/platform-core/agent/action-handler.examples/s-016-re-throws-when-pattern-executor-fails.sdp.md b/specs/behavior/platform-core/agent/action-handler.examples/s-016-re-throws-when-pattern-executor-fails.sdp.md deleted file mode 100644 index e496cb20..00000000 --- a/specs/behavior/platform-core/agent/action-handler.examples/s-016-re-throws-when-pattern-executor-fails.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.action-handler.re-throws-when-pattern-executor-fails -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.action-handler ---- -# Re-throws when pattern executor fails - -## Intent - -- outcome: Executable scenario: Re-throws when pattern executor fails - -```gwt -Given an agent config with a throwing pattern "Trigger exploded" -And a null checkpoint -When I invoke the handler with default args expecting error -Then the error message is "Trigger exploded" -``` diff --git a/specs/behavior/platform-core/agent/action-handler.sdp.md b/specs/behavior/platform-core/agent/action-handler.sdp.md index 14e165b2..6f9a8300 100644 --- a/specs/behavior/platform-core/agent/action-handler.sdp.md +++ b/specs/behavior/platform-core/agent/action-handler.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.action-handler kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,13 +10,44 @@ relations: ## Intent -- outcome: Agent Action Handler +- outcome: Load agent state, skip already-processed or inactive agents, run the pattern executor, and return an action result without persisting. +- value: Workpool can retry analysis as the ACTION half of the action/mutation split. ## Behavior -- rule: Idempotency via checkpoint position -- rule: Inactive agent handling -- rule: Normal processing for new events -- rule: Error propagation for Workpool retry -- rule: Deterministic decisionId format -- rule: Patterns mode integration +- rule: Handler returns null when event globalPosition is less than or equal to checkpoint lastProcessedPosition. +- rule: Handler returns null when agent checkpoint status is not active. +- rule: Handler processes normally when checkpoint is null or the event position is ahead of the checkpoint. +- rule: Handler re-throws errors from pattern trigger and loadState so Workpool can retry. +- rule: decisionId is always dec_{agentId}_{globalPosition}. +- rule: Handler invokes the pattern executor and returns the matching patternId, analysisMethod, and decision. + +## Example space + +```gwt-vocabulary +Given an agent config with default test pattern +And an agent config with a throwing pattern {throwMessage:string} +And an agent config with a {patternName:string} pattern that always triggers +And an agent config with a {patternName:string} pattern that has LLM analyze +And an agent config with a pattern that never triggers +And an agent config with a rule-only pattern and a spy runtime +And a checkpoint with lastProcessedPosition {lastProcessedPosition:number} and status {status:"active"|"paused"|"stopped"|"error_recovery"} +And a null checkpoint +And a loadState that rejects with {loadStateError:string} +When I invoke the handler with agentId {agentId:string} and globalPosition {globalPosition:number} +Then the result is null +And the result is not null +And the result analysisMethod is {analysisMethod:"rule-based"|"llm"} +And the result decisionId is {decisionId:string} +And the result llmMetrics is undefined +And the result patternId is {patternId:string} +And the result patternId is undefined +And the decision is not null +And the decision is null +And the decision command is null +And the decision command is {command:string} +And the decision confidence is {confidence:number} +And the error message is {errorMessage:string} +And both results have decisionId {decisionId:string} +And the runtime analyze was not called +``` diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-001-operation-executes-and-result-is-returned-when-allowed.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-001-operation-executes-and-result-is-returned-when-allowed.sdp.md deleted file mode 100644 index cdc49a8a..00000000 --- a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-001-operation-executes-and-result-is-returned-when-allowed.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-rate-limiter.operation-executes-and-result-is-returned-when-allowed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-rate-limiter ---- -# Operation executes and result is returned when allowed - -## Intent - -- outcome: Executable scenario: Operation executes and result is returned when allowed - -```gwt -Given a rate limiter config for agent "test-agent" that allows requests -And an operation that returns analysis "success" with score 0.95 -When I call withRateLimit -Then the result indicates allowed is true -And the result value has analysis "success" and score 0.95 -And the operation was called 1 time -``` diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-002-operation-is-not-executed-when-denied.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-002-operation-is-not-executed-when-denied.sdp.md deleted file mode 100644 index b1412b28..00000000 --- a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-002-operation-is-not-executed-when-denied.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-rate-limiter.operation-is-not-executed-when-denied -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-rate-limiter ---- -# Operation is not executed when denied - -## Intent - -- outcome: Executable scenario: Operation is not executed when denied - -```gwt -Given a rate limiter config for agent "test-agent" that denies with retryAfterMs 5000 -And a mock operation -When I call withRateLimit -Then the result indicates allowed is false -And the result retryAfterMs is 5000 -And the operation was not called -``` diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-003-check-rate-limit-receives-agent-scoped-key.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-003-check-rate-limit-receives-agent-scoped-key.sdp.md deleted file mode 100644 index f618b09d..00000000 --- a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-003-check-rate-limit-receives-agent-scoped-key.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-rate-limiter.check-rate-limit-receives-agent-scoped-key -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-rate-limiter ---- -# checkRateLimit receives agent-scoped key - -## Intent - -- outcome: Executable scenario: checkRateLimit receives agent-scoped key - -```gwt -Given a rate limiter config for agent "churn-risk-agent" that allows requests -When I call withRateLimit with a simple operation -Then checkRateLimit was called with key "agent:churn-risk-agent" -``` diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-004-operation-errors-propagate-to-caller.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-004-operation-errors-propagate-to-caller.sdp.md deleted file mode 100644 index 43bc54dd..00000000 --- a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-004-operation-errors-propagate-to-caller.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-rate-limiter.operation-errors-propagate-to-caller -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-rate-limiter ---- -# Operation errors propagate to caller - -## Intent - -- outcome: Executable scenario: Operation errors propagate to caller - -```gwt -Given a rate limiter config for agent "test-agent" that allows requests -And an operation that throws "LLM API crashed" -When I call withRateLimit expecting an error -Then the error message is "LLM API crashed" -``` diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-005-check-rate-limit-callback-errors-propagate-without-calling-operation.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-005-check-rate-limit-callback-errors-propagate-without-calling-operation.sdp.md deleted file mode 100644 index 5e4270c6..00000000 --- a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-005-check-rate-limit-callback-errors-propagate-without-calling-operation.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-rate-limiter.check-rate-limit-callback-errors-propagate-without-calling-operation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-rate-limiter ---- -# checkRateLimit callback errors propagate without calling operation - -## Intent - -- outcome: Executable scenario: checkRateLimit callback errors propagate without calling operation - -```gwt -Given a rate limiter config for agent "test-agent" where checkRateLimit throws "Rate limiter store unavailable" -And a mock operation -When I call withRateLimit expecting an error -Then the error message is "Rate limiter store unavailable" -And the operation was not called -``` diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-006-warning-is-logged-when-rate-limited.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-006-warning-is-logged-when-rate-limited.sdp.md deleted file mode 100644 index 57ddc9e1..00000000 --- a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-006-warning-is-logged-when-rate-limited.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-rate-limiter.warning-is-logged-when-rate-limited -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-rate-limiter ---- -# Warning is logged when rate limited - -## Intent - -- outcome: Executable scenario: Warning is logged when rate limited - -```gwt -Given a rate limiter config with logger for agent "test-agent" that denies with retryAfterMs 3000 -When I call withRateLimit with a simple operation -Then the logger warned "Rate limited" with agentId "test-agent" and retryAfterMs 3000 -``` diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-007-debug-is-logged-when-rate-limit-check-passes.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-007-debug-is-logged-when-rate-limit-check-passes.sdp.md deleted file mode 100644 index c853a7e7..00000000 --- a/specs/behavior/platform-core/agent/agent-rate-limiter.examples/s-007-debug-is-logged-when-rate-limit-check-passes.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-rate-limiter.debug-is-logged-when-rate-limit-check-passes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-rate-limiter ---- -# Debug is logged when rate limit check passes - -## Intent - -- outcome: Executable scenario: Debug is logged when rate limit check passes - -```gwt -Given a rate limiter config with logger for agent "test-agent" that allows requests -When I call withRateLimit with a simple operation -Then the logger logged debug "Rate limit passed, executing operation" with agentId "test-agent" -``` diff --git a/specs/behavior/platform-core/agent/agent-rate-limiter.sdp.md b/specs/behavior/platform-core/agent/agent-rate-limiter.sdp.md index 25152df0..2598c7eb 100644 --- a/specs/behavior/platform-core/agent/agent-rate-limiter.sdp.md +++ b/specs/behavior/platform-core/agent/agent-rate-limiter.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.agent-rate-limiter kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: Agent Rate Limiter +- outcome: Guard agent operations behind a rate-limit check so an allowed call executes the wrapped operation once and a denied call skips it and returns retryAfterMs. +- value: Callers receive either the operation result or retry timing, and errors from the operation or checkRateLimit still propagate. ## Behavior @@ -19,3 +20,27 @@ relations: - rule: Rate limit key is agent-scoped - rule: Errors propagate correctly - rule: Logging reflects rate limit outcomes + +## Example space + +```gwt-vocabulary +Given a rate limiter config for agent {agentId:string} that allows requests +And a rate limiter config for agent {agentId:string} that denies with retryAfterMs {retryAfterMs:number} +And a rate limiter config for agent {agentId:string} where checkRateLimit throws {errorMessage:string} +And a rate limiter config with logger for agent {agentId:string} that denies with retryAfterMs {retryAfterMs:number} +And a rate limiter config with logger for agent {agentId:string} that allows requests +And an operation that returns analysis "success" with score 0.95 +And an operation that throws {errorMessage:string} +And a mock operation +And a simple operation +When I call withRateLimit +Then the result indicates allowed is {allowed:boolean} +And the result value has analysis "success" and score 0.95 +And the operation was called 1 time +And the result retryAfterMs is {retryAfterMs:number} +And the operation was not called +And checkRateLimit was called with key "agent:churn-risk-agent" +And the error message is {errorMessage:string} +And the logger warned "Rate limited" with agentId {agentId:string} and retryAfterMs {retryAfterMs:number} +And the logger logged debug "Rate limit passed, executing operation" with agentId {agentId:string} +``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-001-action-subscription-has-correct-type-and-references.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-001-action-subscription-has-correct-type-and-references.sdp.md deleted file mode 100644 index 3f394e0e..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-001-action-subscription-has-correct-type-and-references.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription-action.action-subscription-has-correct-type-and-references -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription-action ---- -# Action subscription has correct type and references - -## Intent - -- outcome: Executable scenario: Action subscription has correct type and references - -```gwt -Given an LLM agent definition with id "llm-churn-risk" and context "orders" -And an action handler and onComplete reference -When I create an action subscription -Then the subscription has all expected properties: -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-002-object-retry-config-is-passed-through.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-002-object-retry-config-is-passed-through.sdp.md deleted file mode 100644 index f8d0c54f..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-002-object-retry-config-is-passed-through.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription-action.object-retry-config-is-passed-through -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription-action ---- -# Object retry config is passed through - -## Intent - -- outcome: Executable scenario: Object retry config is passed through - -```gwt -Given an LLM agent definition with id "llm-churn-risk" and context "orders" -And an action handler and onComplete reference -When I create an action subscription with retry config maxAttempts 3, initialBackoffMs 1000, base 2 -Then the subscription retry config equals maxAttempts 3, initialBackoffMs 1000, base 2 -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-003-boolean-retry-config-is-passed-through.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-003-boolean-retry-config-is-passed-through.sdp.md deleted file mode 100644 index d912515e..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-003-boolean-retry-config-is-passed-through.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription-action.boolean-retry-config-is-passed-through -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription-action ---- -# Boolean retry config is passed through - -## Intent - -- outcome: Executable scenario: Boolean retry config is passed through - -```gwt -Given an LLM agent definition with id "llm-churn-risk" and context "orders" -And an action handler and onComplete reference -When I create an action subscription with retry set to true -Then the subscription retry is true -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-004-retry-field-is-absent-when-not-specified.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-004-retry-field-is-absent-when-not-specified.sdp.md deleted file mode 100644 index 12cf8ce2..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-004-retry-field-is-absent-when-not-specified.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription-action.retry-field-is-absent-when-not-specified -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription-action ---- -# Retry field is absent when not specified - -## Intent - -- outcome: Executable scenario: Retry field is absent when not specified - -```gwt -Given an LLM agent definition with id "llm-churn-risk" and context "orders" -And an action handler and onComplete reference -When I create an action subscription -Then the subscription does not have a retry field -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-005-to-workpool-context-returns-all-required-fields.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-005-to-workpool-context-returns-all-required-fields.sdp.md deleted file mode 100644 index 05e58fd1..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-005-to-workpool-context-returns-all-required-fields.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription-action.to-workpool-context-returns-all-required-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription-action ---- -# toWorkpoolContext returns all required fields - -## Intent - -- outcome: Executable scenario: toWorkpoolContext returns all required fields - -```gwt -Given an LLM agent definition with id "llm-churn-risk" and context "orders" -And an action handler and onComplete reference -And a mock event "OrderCancelled" with streamId "order_123" at position 42 -And a correlation chain with correlationId "corr_abc" -When I create an action subscription and I call toWorkpoolContext with the event and correlation chain -Then the workpool context has all expected fields: -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-006-causation-id-equals-the-event-event-id.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-006-causation-id-equals-the-event-event-id.sdp.md deleted file mode 100644 index 291f2a28..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-006-causation-id-equals-the-event-event-id.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription-action.causation-id-equals-the-event-event-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription-action ---- -# causationId equals the event eventId - -## Intent - -- outcome: Executable scenario: causationId equals the event eventId - -```gwt -Given an LLM agent definition with id "llm-churn-risk" and context "orders" -And an action handler and onComplete reference -And a mock event "OrderRefunded" with streamId "order_789" at position 99 -And a correlation chain with correlationId "corr_xyz" -When I create an action subscription and I call toWorkpoolContext with the event and correlation chain -Then the workpool context causationId equals the event eventId "evt_99" -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-007-subscription-uses-default-priority-of-250.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-007-subscription-uses-default-priority-of-250.sdp.md deleted file mode 100644 index 23ce2221..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-007-subscription-uses-default-priority-of-250.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription-action.subscription-uses-default-priority-of-250 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription-action ---- -# Subscription uses default priority of 250 - -## Intent - -- outcome: Executable scenario: Subscription uses default priority of 250 - -```gwt -Given an LLM agent definition with id "llm-churn-risk" and context "orders" -And an action handler and onComplete reference -When I create an action subscription -Then the subscription priority is 250 -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-008-subscription-uses-custom-priority.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-008-subscription-uses-custom-priority.sdp.md deleted file mode 100644 index b1d25f41..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-008-subscription-uses-custom-priority.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription-action.subscription-uses-custom-priority -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription-action ---- -# Subscription uses custom priority - -## Intent - -- outcome: Executable scenario: Subscription uses custom priority - -```gwt -Given an LLM agent definition with id "llm-churn-risk" and context "orders" -And an action handler and onComplete reference -When I create an action subscription with priority 300 -Then the subscription priority is 300 -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-009-name-includes-context-when-provided.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-009-name-includes-context-when-provided.sdp.md deleted file mode 100644 index 0217134e..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-009-name-includes-context-when-provided.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription-action.name-includes-context-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription-action ---- -# Name includes context when provided - -## Intent - -- outcome: Executable scenario: Name includes context when provided - -```gwt -Given an LLM agent definition with id "llm-churn-risk" and context "orders" -And an action handler and onComplete reference -When I create an action subscription -Then the subscription name is "agent:orders:llm-churn-risk" -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-010-name-omits-context-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-010-name-omits-context-when-not-provided.sdp.md deleted file mode 100644 index c6805ec9..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-010-name-omits-context-when-not-provided.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription-action.name-omits-context-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription-action ---- -# Name omits context when not provided - -## Intent - -- outcome: Executable scenario: Name omits context when not provided - -```gwt -Given a simple agent definition with id "simple-llm-agent" -And an action handler and onComplete reference -When I create an action subscription -Then the subscription name is "agent:simple-llm-agent" -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-011-filter-contains-all-configured-event-types.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-011-filter-contains-all-configured-event-types.sdp.md deleted file mode 100644 index daa4b22d..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-011-filter-contains-all-configured-event-types.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription-action.filter-contains-all-configured-event-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription-action ---- -# Filter contains all configured event types - -## Intent - -- outcome: Executable scenario: Filter contains all configured event types - -```gwt -Given an LLM agent definition with id "llm-churn-risk" and context "orders" -And an action handler and onComplete reference -When I create an action subscription -Then the subscription filter contains event types: -And the subscription filter has 2 event types -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-012-to-handler-args-produces-correct-agent-event-handler-args.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-012-to-handler-args-produces-correct-agent-event-handler-args.sdp.md deleted file mode 100644 index 47bb1525..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-012-to-handler-args-produces-correct-agent-event-handler-args.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription-action.to-handler-args-produces-correct-agent-event-handler-args -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription-action ---- -# toHandlerArgs produces correct AgentEventHandlerArgs - -## Intent - -- outcome: Executable scenario: toHandlerArgs produces correct AgentEventHandlerArgs - -```gwt -Given an LLM agent definition with id "llm-churn-risk" and context "orders" -And an action handler and onComplete reference -And a mock event "OrderCancelled" with streamId "order_123" at position 42 -And a correlation chain with correlationId "corr_abc" -When I create an action subscription and I call toHandlerArgs with the event and correlation chain -Then the handler args have all expected fields: -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-013-get-partition-key-returns-stream-id-based-partition.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-013-get-partition-key-returns-stream-id-based-partition.sdp.md deleted file mode 100644 index 010628f0..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription-action.examples/s-013-get-partition-key-returns-stream-id-based-partition.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription-action.get-partition-key-returns-stream-id-based-partition -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription-action ---- -# getPartitionKey returns streamId-based partition - -## Intent - -- outcome: Executable scenario: getPartitionKey returns streamId-based partition - -```gwt -Given an LLM agent definition with id "llm-churn-risk" and context "orders" -And an action handler and onComplete reference -And a mock event "OrderCancelled" with streamId "order_456" at position 1 -When I create an action subscription and I call getPartitionKey with the event -Then the partition key name is "streamId" -And the partition key value is "order_456" -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription-action.sdp.md b/specs/behavior/platform-core/agent/agent-subscription-action.sdp.md index f0bb2586..168266e8 100644 --- a/specs/behavior/platform-core/agent/agent-subscription-action.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription-action.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.agent-subscription-action kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: Agent Subscription - Action Overload +- outcome: Create an action-typed agent subscription with handlerType action, an onComplete reference, optional retry, default priority 250, agent naming, event filtering, toHandlerArgs, toWorkpoolContext, and a streamId partition key. +- value: Action subscriptions carry the handler and completion references the workpool needs without inventing a second subscription factory. ## Behavior diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-001-subscription-with-context-has-correct-name.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-001-subscription-with-context-has-correct-name.sdp.md deleted file mode 100644 index 8b870838..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-001-subscription-with-context-has-correct-name.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.subscription-with-context-has-correct-name -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# Subscription with context has correct name - -## Intent - -- outcome: Executable scenario: Subscription with context has correct name - -```gwt -Given a churn risk agent definition with id "churn-risk-agent" and context "orders" -And a mock mutation handler -When I create a mutation subscription -Then the subscription name is "agent:orders:churn-risk-agent" -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-002-subscription-without-context-has-correct-name.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-002-subscription-without-context-has-correct-name.sdp.md deleted file mode 100644 index 019c0b10..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-002-subscription-without-context-has-correct-name.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.subscription-without-context-has-correct-name -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# Subscription without context has correct name - -## Intent - -- outcome: Executable scenario: Subscription without context has correct name - -```gwt -Given a simple agent definition with id "simple-agent" subscribing to "EventA" -And a mock mutation handler -When I create a mutation subscription -Then the subscription name is "agent:simple-agent" -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-003-subscription-uses-default-priority-of-250.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-003-subscription-uses-default-priority-of-250.sdp.md deleted file mode 100644 index 1d12d273..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-003-subscription-uses-default-priority-of-250.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.subscription-uses-default-priority-of-250 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# Subscription uses default priority of 250 - -## Intent - -- outcome: Executable scenario: Subscription uses default priority of 250 - -```gwt -Given a churn risk agent definition with id "churn-risk-agent" and context "orders" -And a mock mutation handler -When I create a mutation subscription -Then the subscription priority is 250 -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-004-subscription-uses-custom-priority.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-004-subscription-uses-custom-priority.sdp.md deleted file mode 100644 index 58e64093..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-004-subscription-uses-custom-priority.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.subscription-uses-custom-priority -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# Subscription uses custom priority - -## Intent - -- outcome: Executable scenario: Subscription uses custom priority - -```gwt -Given a churn risk agent definition with id "churn-risk-agent" and context "orders" -And a mock mutation handler -When I create a mutation subscription with priority 300 -Then the subscription priority is 300 -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-005-subscription-filter-contains-correct-event-types.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-005-subscription-filter-contains-correct-event-types.sdp.md deleted file mode 100644 index 4f94de64..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-005-subscription-filter-contains-correct-event-types.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.subscription-filter-contains-correct-event-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# Subscription filter contains correct event types - -## Intent - -- outcome: Executable scenario: Subscription filter contains correct event types - -```gwt -Given a churn risk agent definition with id "churn-risk-agent" and context "orders" -And a mock mutation handler -When I create a mutation subscription -Then the subscription filter contains event types: -And the subscription filter has 2 event types -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-006-subscription-attaches-the-handler-reference.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-006-subscription-attaches-the-handler-reference.sdp.md deleted file mode 100644 index b699730d..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-006-subscription-attaches-the-handler-reference.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.subscription-attaches-the-handler-reference -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# Subscription attaches the handler reference - -## Intent - -- outcome: Executable scenario: Subscription attaches the handler reference - -```gwt -Given a churn risk agent definition with id "churn-risk-agent" and context "orders" -And a mock mutation handler -When I create a mutation subscription -Then the subscription handler is the mock handler -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-007-to-handler-args-produces-correct-agent-event-handler-args.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-007-to-handler-args-produces-correct-agent-event-handler-args.sdp.md deleted file mode 100644 index 82a4d0d8..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-007-to-handler-args-produces-correct-agent-event-handler-args.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.to-handler-args-produces-correct-agent-event-handler-args -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# toHandlerArgs produces correct AgentEventHandlerArgs - -## Intent - -- outcome: Executable scenario: toHandlerArgs produces correct AgentEventHandlerArgs - -```gwt -Given a churn risk agent definition with id "churn-risk-agent" and context "orders" -And a mock mutation handler -And a mock event "OrderCancelled" with streamId "order_123" at position 42 -And a correlation chain with correlationId "corr_abc" -When I create a mutation subscription and I call toHandlerArgs with the event and correlation chain -Then the handler args have all expected fields: -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-008-to-handler-args-includes-payload-in-handler-args.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-008-to-handler-args-includes-payload-in-handler-args.sdp.md deleted file mode 100644 index 625637e1..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-008-to-handler-args-includes-payload-in-handler-args.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.to-handler-args-includes-payload-in-handler-args -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# toHandlerArgs includes payload in handler args - -## Intent - -- outcome: Executable scenario: toHandlerArgs includes payload in handler args - -```gwt -Given a churn risk agent definition with id "churn-risk-agent" and context "orders" -And a mock mutation handler -And a mock event "OrderCancelled" with streamId "order_123" at position 1 -And the event payload is set to orderId "order_123" amount 150 reason "Changed mind" -And a correlation chain with correlationId "corr_xyz" -When I create a mutation subscription and I call toHandlerArgs with the event and correlation chain -Then the handler args payload equals orderId "order_123" amount 150 reason "Changed mind" -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-009-default-agent-transform-wraps-non-object-payload-in-raw.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-009-default-agent-transform-wraps-non-object-payload-in-raw.sdp.md deleted file mode 100644 index 8fbc51a1..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-009-default-agent-transform-wraps-non-object-payload-in-raw.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.default-agent-transform-wraps-non-object-payload-in-raw -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# defaultAgentTransform wraps non-object payload in _raw - -## Intent - -- outcome: Executable scenario: defaultAgentTransform wraps non-object payload in _raw - -```gwt -Given a mock event "OrderCancelled" with streamId "order_123" at position 1 -And the event payload is set to string "string-payload" -And a correlation chain with correlationId "corr_xyz" -When I call defaultAgentTransform with agentId "test-agent" -Then the handler args payload equals _raw "string-payload" -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-010-custom-to-handler-args-transformer-is-used.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-010-custom-to-handler-args-transformer-is-used.sdp.md deleted file mode 100644 index 45f497cf..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-010-custom-to-handler-args-transformer-is-used.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.custom-to-handler-args-transformer-is-used -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# Custom toHandlerArgs transformer is used - -## Intent - -- outcome: Executable scenario: Custom toHandlerArgs transformer is used - -```gwt -Given a churn risk agent definition with id "churn-risk-agent" and context "orders" -And a mock mutation handler -And a mock event "OrderCancelled" with streamId "order_123" at position 1 -And a correlation chain with correlationId "corr_xyz" -When I create a mutation subscription with a custom toHandlerArgs transformer and I call toHandlerArgs with the event and correlation chain -Then the custom handler args have expected values: -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-011-partitions-by-stream-id-by-default.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-011-partitions-by-stream-id-by-default.sdp.md deleted file mode 100644 index 3efb97c0..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-011-partitions-by-stream-id-by-default.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.partitions-by-stream-id-by-default -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# Partitions by streamId by default - -## Intent - -- outcome: Executable scenario: Partitions by streamId by default - -```gwt -Given a churn risk agent definition with id "churn-risk-agent" and context "orders" -And a mock mutation handler -And a mock event "OrderCancelled" with streamId "order_456" at position 1 -When I create a mutation subscription and I call getPartitionKey with the event -Then the partition key name is "streamId" -And the partition key value is "order_456" -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-012-custom-partition-key-extractor-is-used.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-012-custom-partition-key-extractor-is-used.sdp.md deleted file mode 100644 index 273870a4..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-012-custom-partition-key-extractor-is-used.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.custom-partition-key-extractor-is-used -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# Custom partition key extractor is used - -## Intent - -- outcome: Executable scenario: Custom partition key extractor is used - -```gwt -Given a churn risk agent definition with id "churn-risk-agent" and context "orders" -And a mock mutation handler -And a mock event "OrderCancelled" with streamId "order_789" at position 1 -When I create a mutation subscription with a custom partition key extractor and I call getPartitionKey with the event -Then the partition key name is "agent" -And the partition key value is "churn-risk-agent:orders" -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-013-creates-subscriptions-for-multiple-agents.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-013-creates-subscriptions-for-multiple-agents.sdp.md deleted file mode 100644 index 71cfa941..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-013-creates-subscriptions-for-multiple-agents.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.creates-subscriptions-for-multiple-agents -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# Creates subscriptions for multiple agents - -## Intent - -- outcome: Executable scenario: Creates subscriptions for multiple agents - -```gwt -Given a churn risk agent definition with id "churn-risk-agent" and context "orders" -And a fraud agent definition with id "fraud-agent" subscribing to "PaymentFailed" in context "payments" -And a handler map with entries for "churn-risk-agent" and "fraud-agent" -When I create batch subscriptions -Then the batch has 2 subscriptions -And the batch subscription names are: -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-014-throws-if-handler-is-missing-for-an-agent.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-014-throws-if-handler-is-missing-for-an-agent.sdp.md deleted file mode 100644 index c2c146ba..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-014-throws-if-handler-is-missing-for-an-agent.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.throws-if-handler-is-missing-for-an-agent -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# Throws if handler is missing for an agent - -## Intent - -- outcome: Executable scenario: Throws if handler is missing for an agent - -```gwt -Given a churn risk agent definition with id "churn-risk-agent" and context "orders" -And a simple agent definition with id "simple-agent" subscribing to "EventA" -And a handler map with entry only for "churn-risk-agent" -When I create batch subscriptions for both agents -Then it throws with message containing "Missing handler for agent" -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-015-applies-common-options-to-all-subscriptions.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-015-applies-common-options-to-all-subscriptions.sdp.md deleted file mode 100644 index b18ab28a..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-015-applies-common-options-to-all-subscriptions.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.applies-common-options-to-all-subscriptions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# Applies common options to all subscriptions - -## Intent - -- outcome: Executable scenario: Applies common options to all subscriptions - -```gwt -Given a churn risk agent definition with id "churn-risk-agent" and context "orders" -And a simple agent definition with id "simple-agent" subscribing to "EventA" -And a handler map with entries for "churn-risk-agent" and "simple-agent" -When I create batch subscriptions with priority 300 -Then all subscriptions have priority 300 -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-016-same-agent-id-for-multiple-to-handler-args-calls.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-016-same-agent-id-for-multiple-to-handler-args-calls.sdp.md deleted file mode 100644 index 2ccef84d..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-016-same-agent-id-for-multiple-to-handler-args-calls.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.same-agent-id-for-multiple-to-handler-args-calls -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# Same agentId for multiple toHandlerArgs calls - -## Intent - -- outcome: Executable scenario: Same agentId for multiple toHandlerArgs calls - -```gwt -Given a churn risk agent definition with id "churn-risk-agent" and context "orders" -And a mock mutation handler -And a mock event "OrderCancelled" with streamId "order_123" at position 1 -And a correlation chain with correlationId "corr_abc" -When I create a mutation subscription and I call toHandlerArgs twice with the event and correlation chain -Then both handler args have agentId "churn-risk-agent" -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-017-same-agent-id-for-to-handler-args-and-get-partition-key.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-017-same-agent-id-for-to-handler-args-and-get-partition-key.sdp.md deleted file mode 100644 index 9c4cc478..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-017-same-agent-id-for-to-handler-args-and-get-partition-key.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.same-agent-id-for-to-handler-args-and-get-partition-key -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# Same agentId for toHandlerArgs and getPartitionKey - -## Intent - -- outcome: Executable scenario: Same agentId for toHandlerArgs and getPartitionKey - -```gwt -Given a churn risk agent definition with id "churn-risk-agent" and context "orders" -And a mock mutation handler with custom transform and partition key capturing agentId -And a mock event "OrderCancelled" with streamId "order_123" at position 1 -And a correlation chain with correlationId "corr_abc" -When I call toHandlerArgs and getPartitionKey -Then both captured agentIds are "churn-risk-agent" -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-018-filter-matches-subscribed-types-and-rejects-unsubscribed-types.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-018-filter-matches-subscribed-types-and-rejects-unsubscribed-types.sdp.md deleted file mode 100644 index 3fb68938..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-018-filter-matches-subscribed-types-and-rejects-unsubscribed-types.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.filter-matches-subscribed-types-and-rejects-unsubscribed-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# Filter matches subscribed types and rejects unsubscribed types - -## Intent - -- outcome: Executable scenario: Filter matches subscribed types and rejects unsubscribed types - -```gwt -Given a churn risk agent definition with id "churn-risk-agent" and context "orders" -And a mock mutation handler -When I create a mutation subscription -Then the subscription filter contains event types: -And the subscription filter does not contain event types: -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-019-event-types-array-starts-with-correct-length.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-019-event-types-array-starts-with-correct-length.sdp.md deleted file mode 100644 index 505fc379..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-019-event-types-array-starts-with-correct-length.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.event-types-array-starts-with-correct-length -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# Event types array starts with correct length - -## Intent - -- outcome: Executable scenario: Event types array starts with correct length - -```gwt -Given a churn risk agent definition with id "churn-risk-agent" and context "orders" -And a mock mutation handler -When I create a mutation subscription -Then the subscription filter has 2 event types -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-020-transforms-all-published-event-fields-correctly.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-020-transforms-all-published-event-fields-correctly.sdp.md deleted file mode 100644 index e565bf3a..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-020-transforms-all-published-event-fields-correctly.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.transforms-all-published-event-fields-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# Transforms all PublishedEvent fields correctly - -## Intent - -- outcome: Executable scenario: Transforms all PublishedEvent fields correctly - -```gwt -Given a fully populated published event -And a fully populated correlation chain with correlationId "corr_test_abc" -When I call defaultAgentTransform with agentId "test-agent-id" -Then the transform result has all expected fields: -And the transform result payload equals key "value" with nested prop 123 -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-021-handles-null-payload.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-021-handles-null-payload.sdp.md deleted file mode 100644 index d97b602b..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-021-handles-null-payload.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.handles-null-payload -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# Handles null payload - -## Intent - -- outcome: Executable scenario: Handles null payload - -```gwt -Given a mock event "TestEvent" with streamId "stream_1" at position 1 -And the event payload is set to null -And a correlation chain with correlationId "corr_1" -When I call defaultAgentTransform with agentId "agent" -Then the handler args payload equals _raw null -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.examples/s-022-handles-array-payload.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.examples/s-022-handles-array-payload.sdp.md deleted file mode 100644 index bf7664ba..00000000 --- a/specs/behavior/platform-core/agent/agent-subscription.examples/s-022-handles-array-payload.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.agent-subscription.handles-array-payload -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.agent-subscription ---- -# Handles array payload - -## Intent - -- outcome: Executable scenario: Handles array payload - -```gwt -Given a mock event "TestEvent" with streamId "stream_1" at position 1 -And the event payload is set to array 1 2 3 -And a correlation chain with correlationId "corr_1" -When I call defaultAgentTransform with agentId "agent" -Then the handler args payload equals _raw array 1 2 3 -``` diff --git a/specs/behavior/platform-core/agent/agent-subscription.sdp.md b/specs/behavior/platform-core/agent/agent-subscription.sdp.md index f54d3711..fe2d065f 100644 --- a/specs/behavior/platform-core/agent/agent-subscription.sdp.md +++ b/specs/behavior/platform-core/agent/agent-subscription.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.agent-subscription kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: Agent Subscription - Mutation Overload +- outcome: Create mutation EventSubscription objects with naming, priority, event filtering, handler-args transformation, partition keys, batch creation, and agentId memoization, and map PublishedEvent fields through defaultAgentTransform. +- value: Mutation subscriptions and defaultAgentTransform expose a consistent AgentEventHandlerArgs shape, including non-object payload wrapping. ## Behavior diff --git a/specs/behavior/platform-core/agent/approval.examples/s-001-all-six-error-codes-are-present.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-001-all-six-error-codes-are-present.sdp.md deleted file mode 100644 index 1698faf1..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-001-all-six-error-codes-are-present.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.all-six-error-codes-are-present -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# All six error codes are present - -## Intent - -- outcome: Executable scenario: All six error codes are present - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then APPROVAL_ERROR_CODES contains the following entries: -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-002-approval-statuses-contains-all-four-statuses-in-order.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-002-approval-statuses-contains-all-four-statuses-in-order.sdp.md deleted file mode 100644 index 1c43b81b..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-002-approval-statuses-contains-all-four-statuses-in-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.approval-statuses-contains-all-four-statuses-in-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# APPROVAL_STATUSES contains all four statuses in order - -## Intent - -- outcome: Executable scenario: APPROVAL_STATUSES contains all four statuses in order - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then APPROVAL_STATUSES equals pending, approved, rejected, expired -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-003-approval-statuses-is-a-4-element-array.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-003-approval-statuses-is-a-4-element-array.sdp.md deleted file mode 100644 index ece66e7f..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-003-approval-statuses-is-a-4-element-array.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.approval-statuses-is-a-4-element-array -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# APPROVAL_STATUSES is a 4-element array - -## Intent - -- outcome: Executable scenario: APPROVAL_STATUSES is a 4-element array - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then APPROVAL_STATUSES is an array with 4 elements -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-004-returns-true-for-valid-status-strings.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-004-returns-true-for-valid-status-strings.sdp.md deleted file mode 100644 index bd063857..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-004-returns-true-for-valid-status-strings.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-true-for-valid-status-strings -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns true for valid status strings - -## Intent - -- outcome: Executable scenario: Returns true for valid status strings - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isApprovalStatus returns true for all valid statuses: -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-005-returns-false-for-invalid-strings.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-005-returns-false-for-invalid-strings.sdp.md deleted file mode 100644 index 7ab6b78d..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-005-returns-false-for-invalid-strings.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-false-for-invalid-strings -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns false for invalid strings - -## Intent - -- outcome: Executable scenario: Returns false for invalid strings - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isApprovalStatus returns false for invalid values: -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-006-returns-false-for-non-string-types.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-006-returns-false-for-non-string-types.sdp.md deleted file mode 100644 index e1dc5338..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-006-returns-false-for-non-string-types.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-false-for-non-string-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns false for non-string types - -## Intent - -- outcome: Executable scenario: Returns false for non-string types - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isApprovalStatus returns false for non-string types including number, null, undefined, object, and array -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-007-accepts-all-four-valid-statuses.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-007-accepts-all-four-valid-statuses.sdp.md deleted file mode 100644 index b1326c88..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-007-accepts-all-four-valid-statuses.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.accepts-all-four-valid-statuses -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Accepts all four valid statuses - -## Intent - -- outcome: Executable scenario: Accepts all four valid statuses - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then ApprovalStatusSchema accepts all APPROVAL_STATUSES values -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-008-rejects-invalid-status-values.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-008-rejects-invalid-status-values.sdp.md deleted file mode 100644 index 76429475..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-008-rejects-invalid-status-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.rejects-invalid-status-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Rejects invalid status values - -## Intent - -- outcome: Executable scenario: Rejects invalid status values - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then ApprovalStatusSchema rejects invalid values: -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-009-accepts-a-valid-approval-object.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-009-accepts-a-valid-approval-object.sdp.md deleted file mode 100644 index dcccca96..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-009-accepts-a-valid-approval-object.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.accepts-a-valid-approval-object -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Accepts a valid approval object - -## Intent - -- outcome: Executable scenario: Accepts a valid approval object - -```gwt -Given the module is imported from platform-core -And a test approval with default values -When the scenario runs -Then PendingApprovalSchema accepts the approval -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-010-rejects-approval-with-missing-required-fields.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-010-rejects-approval-with-missing-required-fields.sdp.md deleted file mode 100644 index 120e62a2..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-010-rejects-approval-with-missing-required-fields.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.rejects-approval-with-missing-required-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Rejects approval with missing required fields - -## Intent - -- outcome: Executable scenario: Rejects approval with missing required fields - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then PendingApprovalSchema rejects an object with only approvalId -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-011-rejects-approval-with-confidence-above-1.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-011-rejects-approval-with-confidence-above-1.sdp.md deleted file mode 100644 index 16fca574..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-011-rejects-approval-with-confidence-above-1.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.rejects-approval-with-confidence-above-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Rejects approval with confidence above 1 - -## Intent - -- outcome: Executable scenario: Rejects approval with confidence above 1 - -```gwt -Given the module is imported from platform-core -And a test approval with confidence 1.5 -When the scenario runs -Then PendingApprovalSchema rejects the approval -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-012-rejects-approval-with-negative-confidence.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-012-rejects-approval-with-negative-confidence.sdp.md deleted file mode 100644 index 115ff883..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-012-rejects-approval-with-negative-confidence.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.rejects-approval-with-negative-confidence -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Rejects approval with negative confidence - -## Intent - -- outcome: Executable scenario: Rejects approval with negative confidence - -```gwt -Given the module is imported from platform-core -And a test approval with confidence -0.1 -When the scenario runs -Then PendingApprovalSchema rejects the approval -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-013-accepts-valid-auth-context-with-user-id-only.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-013-accepts-valid-auth-context-with-user-id-only.sdp.md deleted file mode 100644 index eb51f786..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-013-accepts-valid-auth-context-with-user-id-only.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.accepts-valid-auth-context-with-user-id-only -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Accepts valid auth context with userId only - -## Intent - -- outcome: Executable scenario: Accepts valid auth context with userId only - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then ApprovalAuthContextSchema accepts a context with userId "user-123" -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-014-accepts-auth-context-with-roles.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-014-accepts-auth-context-with-roles.sdp.md deleted file mode 100644 index e998b539..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-014-accepts-auth-context-with-roles.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.accepts-auth-context-with-roles -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Accepts auth context with roles - -## Intent - -- outcome: Executable scenario: Accepts auth context with roles - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then ApprovalAuthContextSchema accepts a context with roles "reviewer" and "admin" -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-015-accepts-auth-context-with-agent-ids.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-015-accepts-auth-context-with-agent-ids.sdp.md deleted file mode 100644 index 939fefe1..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-015-accepts-auth-context-with-agent-ids.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.accepts-auth-context-with-agent-ids -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Accepts auth context with agentIds - -## Intent - -- outcome: Executable scenario: Accepts auth context with agentIds - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then ApprovalAuthContextSchema accepts a context with agentIds "agent-1" and "agent-2" -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-016-rejects-auth-context-with-empty-user-id.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-016-rejects-auth-context-with-empty-user-id.sdp.md deleted file mode 100644 index 9e0b454e..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-016-rejects-auth-context-with-empty-user-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.rejects-auth-context-with-empty-user-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Rejects auth context with empty userId - -## Intent - -- outcome: Executable scenario: Rejects auth context with empty userId - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then ApprovalAuthContextSchema rejects a context with empty userId -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-017-parses-valid-duration-strings.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-017-parses-valid-duration-strings.sdp.md deleted file mode 100644 index 433f4784..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-017-parses-valid-duration-strings.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.parses-valid-duration-strings -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Parses valid duration strings - -## Intent - -- outcome: Executable scenario: Parses valid duration strings - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then parseApprovalTimeout returns correct milliseconds: -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-018-returns-null-for-invalid-formats.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-018-returns-null-for-invalid-formats.sdp.md deleted file mode 100644 index a660d416..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-018-returns-null-for-invalid-formats.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-null-for-invalid-formats -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns null for invalid formats - -## Intent - -- outcome: Executable scenario: Returns null for invalid formats - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then parseApprovalTimeout returns null for all of: -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-019-returns-null-for-zero-values.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-019-returns-null-for-zero-values.sdp.md deleted file mode 100644 index 84a6ca90..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-019-returns-null-for-zero-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-null-for-zero-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns null for zero values - -## Intent - -- outcome: Executable scenario: Returns null for zero values - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then parseApprovalTimeout returns null for all of: -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-020-returns-true-for-valid-timeout-formats.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-020-returns-true-for-valid-timeout-formats.sdp.md deleted file mode 100644 index 17563ec8..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-020-returns-true-for-valid-timeout-formats.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-true-for-valid-timeout-formats -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns true for valid timeout formats - -## Intent - -- outcome: Executable scenario: Returns true for valid timeout formats - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isValidApprovalTimeout returns true for: -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-021-returns-false-for-invalid-timeout-formats.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-021-returns-false-for-invalid-timeout-formats.sdp.md deleted file mode 100644 index 7c179121..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-021-returns-false-for-invalid-timeout-formats.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-false-for-invalid-timeout-formats -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns false for invalid timeout formats - -## Intent - -- outcome: Executable scenario: Returns false for invalid timeout formats - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isValidApprovalTimeout returns false for: -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-022-uses-explicit-timeout-from-config.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-022-uses-explicit-timeout-from-config.sdp.md deleted file mode 100644 index bdff5a24..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-022-uses-explicit-timeout-from-config.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.uses-explicit-timeout-from-config -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Uses explicit timeout from config - -## Intent - -- outcome: Executable scenario: Uses explicit timeout from config - -```gwt -Given the module is imported from platform-core -And a config with approvalTimeout "1h" and requestedAt 1000000 -When I calculate the expiration time -Then the expiration time equals requestedAt plus 3600000 -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-023-uses-default-timeout-when-not-specified.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-023-uses-default-timeout-when-not-specified.sdp.md deleted file mode 100644 index 444775b8..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-023-uses-default-timeout-when-not-specified.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.uses-default-timeout-when-not-specified -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Uses default timeout when not specified - -## Intent - -- outcome: Executable scenario: Uses default timeout when not specified - -```gwt -Given the module is imported from platform-core -And a config with no approvalTimeout and requestedAt 1000000 -When I calculate the expiration time -Then the expiration time equals requestedAt plus the default timeout -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-024-uses-default-timeout-for-invalid-format.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-024-uses-default-timeout-for-invalid-format.sdp.md deleted file mode 100644 index 77f59ad8..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-024-uses-default-timeout-for-invalid-format.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.uses-default-timeout-for-invalid-format -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Uses default timeout for invalid format - -## Intent - -- outcome: Executable scenario: Uses default timeout for invalid format - -```gwt -Given the module is imported from platform-core -And a config with approvalTimeout "invalid" and requestedAt 1000000 -When I calculate the expiration time -Then the expiration time equals requestedAt plus the default timeout -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-025-returns-true-when-confidence-is-below-threshold.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-025-returns-true-when-confidence-is-below-threshold.sdp.md deleted file mode 100644 index 73dc0263..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-025-returns-true-when-confidence-is-below-threshold.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-true-when-confidence-is-below-threshold -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns true when confidence is below threshold - -## Intent - -- outcome: Executable scenario: Returns true when confidence is below threshold - -```gwt -Given the module is imported from platform-core -And a config with confidenceThreshold 0.9 -When the scenario runs -Then shouldRequireApproval for action "SomeAction" with confidence 0.85 returns true -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-026-returns-true-when-confidence-equals-threshold-inclusive.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-026-returns-true-when-confidence-equals-threshold-inclusive.sdp.md deleted file mode 100644 index 312f2c4c..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-026-returns-true-when-confidence-equals-threshold-inclusive.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-true-when-confidence-equals-threshold-inclusive -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns true when confidence equals threshold (inclusive) - -## Intent - -- outcome: Executable scenario: Returns true when confidence equals threshold (inclusive) - -```gwt -Given the module is imported from platform-core -And a config with confidenceThreshold 0.9 -When the scenario runs -Then shouldRequireApproval for action "SomeAction" with confidence 0.9 returns true -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-027-returns-false-when-confidence-is-above-threshold.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-027-returns-false-when-confidence-is-above-threshold.sdp.md deleted file mode 100644 index 2f38e536..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-027-returns-false-when-confidence-is-above-threshold.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-false-when-confidence-is-above-threshold -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns false when confidence is above threshold - -## Intent - -- outcome: Executable scenario: Returns false when confidence is above threshold - -```gwt -Given the module is imported from platform-core -And a config with confidenceThreshold 0.9 -When the scenario runs -Then shouldRequireApproval for action "SomeAction" with confidence 0.95 returns false -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-028-uses-default-threshold-of-0-9-when-not-specified.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-028-uses-default-threshold-of-0-9-when-not-specified.sdp.md deleted file mode 100644 index 87e476d8..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-028-uses-default-threshold-of-0-9-when-not-specified.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.uses-default-threshold-of-0-9-when-not-specified -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Uses default threshold of 0.9 when not specified - -## Intent - -- outcome: Executable scenario: Uses default threshold of 0.9 when not specified - -```gwt -Given the module is imported from platform-core -And a config with no confidenceThreshold -When the scenario runs -Then shouldRequireApproval for action "SomeAction" with confidence 0.85 returns true -And shouldRequireApproval for action "SomeAction" with confidence 0.91 returns false -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-029-returns-true-for-listed-action-even-with-high-confidence.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-029-returns-true-for-listed-action-even-with-high-confidence.sdp.md deleted file mode 100644 index 315d8ead..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-029-returns-true-for-listed-action-even-with-high-confidence.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-true-for-listed-action-even-with-high-confidence -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns true for listed action even with high confidence - -## Intent - -- outcome: Executable scenario: Returns true for listed action even with high confidence - -```gwt -Given the module is imported from platform-core -And a config with confidenceThreshold 0.9 and requiresApproval list "DeleteCustomer,TransferFunds" -When the scenario runs -Then shouldRequireApproval for action "DeleteCustomer" with confidence 0.99 returns true -And shouldRequireApproval for action "TransferFunds" with confidence 1.0 returns true -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-030-returns-false-for-unlisted-action-with-high-confidence.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-030-returns-false-for-unlisted-action-with-high-confidence.sdp.md deleted file mode 100644 index 67be8055..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-030-returns-false-for-unlisted-action-with-high-confidence.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-false-for-unlisted-action-with-high-confidence -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns false for unlisted action with high confidence - -## Intent - -- outcome: Executable scenario: Returns false for unlisted action with high confidence - -```gwt -Given the module is imported from platform-core -And a config with confidenceThreshold 0.9 and requiresApproval list "DeleteCustomer" -When the scenario runs -Then shouldRequireApproval for action "UpdateCustomer" with confidence 0.95 returns false -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-031-returns-false-for-auto-approved-action-with-low-confidence.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-031-returns-false-for-auto-approved-action-with-low-confidence.sdp.md deleted file mode 100644 index 3dcfa73a..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-031-returns-false-for-auto-approved-action-with-low-confidence.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-false-for-auto-approved-action-with-low-confidence -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns false for auto-approved action with low confidence - -## Intent - -- outcome: Executable scenario: Returns false for auto-approved action with low confidence - -```gwt -Given the module is imported from platform-core -And a config with confidenceThreshold 0.9 and autoApprove list "LogEvent,SendNotification" -When the scenario runs -Then shouldRequireApproval for action "LogEvent" with confidence 0.1 returns false -And shouldRequireApproval for action "SendNotification" with confidence 0.5 returns false -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-032-auto-approve-takes-precedence-over-low-confidence.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-032-auto-approve-takes-precedence-over-low-confidence.sdp.md deleted file mode 100644 index 256784b5..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-032-auto-approve-takes-precedence-over-low-confidence.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.auto-approve-takes-precedence-over-low-confidence -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# autoApprove takes precedence over low confidence - -## Intent - -- outcome: Executable scenario: autoApprove takes precedence over low confidence - -```gwt -Given the module is imported from platform-core -And a config with confidenceThreshold 0.9 and autoApprove list "SafeAction" -When the scenario runs -Then shouldRequireApproval for action "SafeAction" with confidence 0.1 returns false -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-033-requires-approval-wins-when-action-is-in-both-lists.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-033-requires-approval-wins-when-action-is-in-both-lists.sdp.md deleted file mode 100644 index 9b94a845..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-033-requires-approval-wins-when-action-is-in-both-lists.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.requires-approval-wins-when-action-is-in-both-lists -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# requiresApproval wins when action is in both lists - -## Intent - -- outcome: Executable scenario: requiresApproval wins when action is in both lists - -```gwt -Given the module is imported from platform-core -And a config with requiresApproval "ConflictAction" and autoApprove "ConflictAction" -When the scenario runs -Then shouldRequireApproval for action "ConflictAction" with confidence 0.99 returns true -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-034-falls-through-to-confidence-check-with-empty-lists.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-034-falls-through-to-confidence-check-with-empty-lists.sdp.md deleted file mode 100644 index a0eeab50..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-034-falls-through-to-confidence-check-with-empty-lists.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.falls-through-to-confidence-check-with-empty-lists -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Falls through to confidence check with empty lists - -## Intent - -- outcome: Executable scenario: Falls through to confidence check with empty lists - -```gwt -Given the module is imported from platform-core -And a config with confidenceThreshold 0.9 and empty requiresApproval and autoApprove -When the scenario runs -Then shouldRequireApproval for action "SomeAction" with confidence 0.85 returns true -And shouldRequireApproval for action "SomeAction" with confidence 0.95 returns false -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-035-falls-through-to-confidence-check-with-undefined-lists.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-035-falls-through-to-confidence-check-with-undefined-lists.sdp.md deleted file mode 100644 index 70e69423..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-035-falls-through-to-confidence-check-with-undefined-lists.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.falls-through-to-confidence-check-with-undefined-lists -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Falls through to confidence check with undefined lists - -## Intent - -- outcome: Executable scenario: Falls through to confidence check with undefined lists - -```gwt -Given the module is imported from platform-core -And a config with confidenceThreshold 0.9 -When the scenario runs -Then shouldRequireApproval for action "SomeAction" with confidence 0.85 returns true -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-036-handles-confidence-of-0.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-036-handles-confidence-of-0.sdp.md deleted file mode 100644 index ae551e6a..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-036-handles-confidence-of-0.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.handles-confidence-of-0 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Handles confidence of 0 - -## Intent - -- outcome: Executable scenario: Handles confidence of 0 - -```gwt -Given the module is imported from platform-core -And a config with confidenceThreshold 0.9 -When the scenario runs -Then shouldRequireApproval for action "SomeAction" with confidence 0 returns true -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-037-handles-confidence-of-1.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-037-handles-confidence-of-1.sdp.md deleted file mode 100644 index 61c17f33..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-037-handles-confidence-of-1.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.handles-confidence-of-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Handles confidence of 1 - -## Intent - -- outcome: Executable scenario: Handles confidence of 1 - -```gwt -Given the module is imported from platform-core -And a config with confidenceThreshold 0.9 -When the scenario runs -Then shouldRequireApproval for action "SomeAction" with confidence 1 returns false -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-038-returns-true-when-agent-id-is-in-auth-context-agent-ids.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-038-returns-true-when-agent-id-is-in-auth-context-agent-ids.sdp.md deleted file mode 100644 index bc141376..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-038-returns-true-when-agent-id-is-in-auth-context-agent-ids.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-true-when-agent-id-is-in-auth-context-agent-ids -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns true when agentId is in authContext agentIds - -## Intent - -- outcome: Executable scenario: Returns true when agentId is in authContext agentIds - -```gwt -Given the module is imported from platform-core -And an approval with agentId "agent-1" -And an auth context with agentIds "agent-1,agent-2" -When the scenario runs -Then isAuthorizedReviewer returns true -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-039-returns-false-when-agent-id-is-not-in-auth-context-agent-ids.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-039-returns-false-when-agent-id-is-not-in-auth-context-agent-ids.sdp.md deleted file mode 100644 index 7adba617..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-039-returns-false-when-agent-id-is-not-in-auth-context-agent-ids.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-false-when-agent-id-is-not-in-auth-context-agent-ids -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns false when agentId is not in authContext agentIds - -## Intent - -- outcome: Executable scenario: Returns false when agentId is not in authContext agentIds - -```gwt -Given the module is imported from platform-core -And an approval with agentId "agent-3" -And an auth context with agentIds "agent-1,agent-2" -When the scenario runs -Then isAuthorizedReviewer returns false -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-040-returns-false-when-agent-ids-is-undefined.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-040-returns-false-when-agent-ids-is-undefined.sdp.md deleted file mode 100644 index f0a20acc..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-040-returns-false-when-agent-ids-is-undefined.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-false-when-agent-ids-is-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns false when agentIds is undefined - -## Intent - -- outcome: Executable scenario: Returns false when agentIds is undefined - -```gwt -Given the module is imported from platform-core -And an approval with agentId "any-agent" -And an auth context with no agentIds -When the scenario runs -Then isAuthorizedReviewer returns false -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-041-returns-false-when-agent-ids-is-empty.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-041-returns-false-when-agent-ids-is-empty.sdp.md deleted file mode 100644 index ea8b0132..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-041-returns-false-when-agent-ids-is-empty.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-false-when-agent-ids-is-empty -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns false when agentIds is empty - -## Intent - -- outcome: Executable scenario: Returns false when agentIds is empty - -```gwt -Given the module is imported from platform-core -And an approval with agentId "any-agent" -And an auth context with empty agentIds -When the scenario runs -Then isAuthorizedReviewer returns false -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-042-returns-true-when-user-has-at-least-one-role.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-042-returns-true-when-user-has-at-least-one-role.sdp.md deleted file mode 100644 index ef16d61d..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-042-returns-true-when-user-has-at-least-one-role.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-true-when-user-has-at-least-one-role -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns true when user has at least one role - -## Intent - -- outcome: Executable scenario: Returns true when user has at least one role - -```gwt -Given the module is imported from platform-core -And a default approval -And an auth context with roles "reviewer" -When the scenario runs -Then isAuthorizedReviewer returns true -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-043-returns-false-when-roles-is-undefined.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-043-returns-false-when-roles-is-undefined.sdp.md deleted file mode 100644 index 760079dc..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-043-returns-false-when-roles-is-undefined.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-false-when-roles-is-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns false when roles is undefined - -## Intent - -- outcome: Executable scenario: Returns false when roles is undefined - -```gwt -Given the module is imported from platform-core -And a default approval -And an auth context with no roles -When the scenario runs -Then isAuthorizedReviewer returns false -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-044-returns-false-when-roles-is-empty.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-044-returns-false-when-roles-is-empty.sdp.md deleted file mode 100644 index 301335e0..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-044-returns-false-when-roles-is-empty.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-false-when-roles-is-empty -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns false when roles is empty - -## Intent - -- outcome: Executable scenario: Returns false when roles is empty - -```gwt -Given the module is imported from platform-core -And a default approval -And an auth context with empty roles -When the scenario runs -Then isAuthorizedReviewer returns false -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-045-agent-ids-check-fails-even-with-admin-role.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-045-agent-ids-check-fails-even-with-admin-role.sdp.md deleted file mode 100644 index 909d2d73..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-045-agent-ids-check-fails-even-with-admin-role.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.agent-ids-check-fails-even-with-admin-role -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# AgentIds check fails even with admin role - -## Intent - -- outcome: Executable scenario: AgentIds check fails even with admin role - -```gwt -Given the module is imported from platform-core -And an approval with agentId "restricted-agent" -And an auth context with agentIds "other-agent" and roles "admin" -When the scenario runs -Then isAuthorizedReviewer returns false -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-046-both-agent-ids-and-roles-pass.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-046-both-agent-ids-and-roles-pass.sdp.md deleted file mode 100644 index da46647d..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-046-both-agent-ids-and-roles-pass.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.both-agent-ids-and-roles-pass -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Both agentIds and roles pass - -## Intent - -- outcome: Executable scenario: Both agentIds and roles pass - -```gwt -Given the module is imported from platform-core -And an approval with agentId "allowed-agent" -And an auth context with agentIds "allowed-agent" and roles "reviewer" -When the scenario runs -Then isAuthorizedReviewer returns true -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-047-generates-id-with-apr-prefix-and-correct-format.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-047-generates-id-with-apr-prefix-and-correct-format.sdp.md deleted file mode 100644 index 19a000e1..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-047-generates-id-with-apr-prefix-and-correct-format.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.generates-id-with-apr-prefix-and-correct-format -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Generates ID with apr_ prefix and correct format - -## Intent - -- outcome: Executable scenario: Generates ID with apr_ prefix and correct format - -```gwt -Given the module is imported from platform-core -When I generate an approval ID -Then the approval ID starts with "apr_" -And the approval ID has 2 underscore-delimited parts -And the second part has 36 characters -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-048-generates-unique-i-ds-over-multiple-calls.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-048-generates-unique-i-ds-over-multiple-calls.sdp.md deleted file mode 100644 index c83fbbcf..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-048-generates-unique-i-ds-over-multiple-calls.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.generates-unique-i-ds-over-multiple-calls -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Generates unique IDs over multiple calls - -## Intent - -- outcome: Executable scenario: Generates unique IDs over multiple calls - -```gwt -Given the module is imported from platform-core -When I generate 3 approval IDs with delay -Then all 3 IDs are unique -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-049-sets-correct-initial-field-values.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-049-sets-correct-initial-field-values.sdp.md deleted file mode 100644 index ead05d17..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-049-sets-correct-initial-field-values.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.sets-correct-initial-field-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Sets correct initial field values - -## Intent - -- outcome: Executable scenario: Sets correct initial field values - -```gwt -Given the module is imported from platform-core -And fake time is set to "2024-01-15T12:00:00Z" -When I create a pending approval for agent "test-agent" decision "dec_123" action "TestAction" confidence 0.75 reason "Test reason" timeout "24h" -Then the approval has the following initial values: -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-050-generates-unique-approval-ids-over-multiple-calls.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-050-generates-unique-approval-ids-over-multiple-calls.sdp.md deleted file mode 100644 index 9757556c..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-050-generates-unique-approval-ids-over-multiple-calls.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.generates-unique-approval-ids-over-multiple-calls -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Generates unique approvalIds over multiple calls - -## Intent - -- outcome: Executable scenario: Generates unique approvalIds over multiple calls - -```gwt -Given the module is imported from platform-core -When I create 3 pending approvals with delay -Then all 3 approval IDs are unique -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-051-sets-requested-at-to-current-time.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-051-sets-requested-at-to-current-time.sdp.md deleted file mode 100644 index adcc91c2..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-051-sets-requested-at-to-current-time.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.sets-requested-at-to-current-time -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Sets requestedAt to current time - -## Intent - -- outcome: Executable scenario: Sets requestedAt to current time - -```gwt -Given the module is imported from platform-core -And fake time is set to "2024-01-15T12:00:00Z" -When I create a pending approval with default values -Then the approval requestedAt equals the current fake time -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-052-calculates-expires-at-based-on-config-timeout.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-052-calculates-expires-at-based-on-config-timeout.sdp.md deleted file mode 100644 index 294e07b0..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-052-calculates-expires-at-based-on-config-timeout.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.calculates-expires-at-based-on-config-timeout -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Calculates expiresAt based on config timeout - -## Intent - -- outcome: Executable scenario: Calculates expiresAt based on config timeout - -```gwt -Given the module is imported from platform-core -And fake time is set to "2024-01-15T12:00:00Z" -When I create a pending approval with timeout "1h" -Then the approval expiresAt equals requestedAt plus 3600000 -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-053-does-not-include-optional-fields-initially.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-053-does-not-include-optional-fields-initially.sdp.md deleted file mode 100644 index d157b58a..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-053-does-not-include-optional-fields-initially.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.does-not-include-optional-fields-initially -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Does not include optional fields initially - -## Intent - -- outcome: Executable scenario: Does not include optional fields initially - -```gwt -Given the module is imported from platform-core -And fake time is set to "2024-01-15T12:00:00Z" -When I create a pending approval with default values -Then the approval optional fields are all undefined: -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-054-transitions-pending-approval-to-approved.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-054-transitions-pending-approval-to-approved.sdp.md deleted file mode 100644 index 0ce37f97..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-054-transitions-pending-approval-to-approved.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.transitions-pending-approval-to-approved -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Transitions pending approval to approved - -## Intent - -- outcome: Executable scenario: Transitions pending approval to approved - -```gwt -Given the module is imported from platform-core -And fake time is set to "2024-01-15T12:00:00Z" -And a pending approval -When I approve the approval with reviewer "reviewer-123" -Then the result status is "approved" -And the result reviewerId is "reviewer-123" -And the result reviewedAt equals the current fake time -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-055-includes-review-note-when-provided.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-055-includes-review-note-when-provided.sdp.md deleted file mode 100644 index aeb02efa..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-055-includes-review-note-when-provided.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.includes-review-note-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Includes reviewNote when provided - -## Intent - -- outcome: Executable scenario: Includes reviewNote when provided - -```gwt -Given the module is imported from platform-core -And fake time is set to "2024-01-15T12:00:00Z" -And a pending approval -When I approve the approval with reviewer "reviewer-123" and note "Looks good!" -Then the result reviewNote is "Looks good!" -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-056-does-not-include-review-note-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-056-does-not-include-review-note-when-not-provided.sdp.md deleted file mode 100644 index 5c9cf0ab..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-056-does-not-include-review-note-when-not-provided.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.does-not-include-review-note-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Does not include reviewNote when not provided - -## Intent - -- outcome: Executable scenario: Does not include reviewNote when not provided - -```gwt -Given the module is imported from platform-core -And fake time is set to "2024-01-15T12:00:00Z" -And a pending approval -When I approve the approval with reviewer "reviewer-123" -Then the result reviewNote is undefined -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-057-throws-error-for-non-pending-statuses.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-057-throws-error-for-non-pending-statuses.sdp.md deleted file mode 100644 index 370b058f..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-057-throws-error-for-non-pending-statuses.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.throws-error-for-non-pending-statuses -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Throws error for non-pending statuses - -## Intent - -- outcome: Executable scenario: Throws error for non-pending statuses - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then approving a non-pending approval throws for statuses: -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-058-throws-error-for-expired-pending-approvals.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-058-throws-error-for-expired-pending-approvals.sdp.md deleted file mode 100644 index 4b37eff8..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-058-throws-error-for-expired-pending-approvals.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.throws-error-for-expired-pending-approvals -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Throws error for expired pending approvals - -## Intent - -- outcome: Executable scenario: Throws error for expired pending approvals - -```gwt -Given the module is imported from platform-core -And fake time is set to "2024-01-15T12:00:00Z" -When I approve an expired pending approval -Then the approval action throws "approval has expired" -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-059-preserves-other-fields-after-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-059-preserves-other-fields-after-approval.sdp.md deleted file mode 100644 index 7a5ff5b1..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-059-preserves-other-fields-after-approval.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.preserves-other-fields-after-approval -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Preserves other fields after approval - -## Intent - -- outcome: Executable scenario: Preserves other fields after approval - -```gwt -Given the module is imported from platform-core -And fake time is set to "2024-01-15T12:00:00Z" -And a pending approval with agentId "my-agent" decisionId "my-decision" confidence 0.8 -When I approve the approval with reviewer "reviewer-123" -Then the result preserves agentId "my-agent" decisionId "my-decision" confidence 0.8 -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-060-transitions-pending-approval-to-rejected-with-reason.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-060-transitions-pending-approval-to-rejected-with-reason.sdp.md deleted file mode 100644 index 29d6bced..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-060-transitions-pending-approval-to-rejected-with-reason.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.transitions-pending-approval-to-rejected-with-reason -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Transitions pending approval to rejected with reason - -## Intent - -- outcome: Executable scenario: Transitions pending approval to rejected with reason - -```gwt -Given the module is imported from platform-core -And fake time is set to "2024-01-15T12:00:00Z" -And a pending approval -When I reject the approval with reviewer "reviewer-123" and reason "Not appropriate" -Then the result status is "rejected" -And the result reviewerId is "reviewer-123" -And the result rejectionReason is "Customer already contacted" -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-061-sets-reviewed-at-to-current-time-on-rejection.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-061-sets-reviewed-at-to-current-time-on-rejection.sdp.md deleted file mode 100644 index 6c5a702a..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-061-sets-reviewed-at-to-current-time-on-rejection.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.sets-reviewed-at-to-current-time-on-rejection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Sets reviewedAt to current time on rejection - -## Intent - -- outcome: Executable scenario: Sets reviewedAt to current time on rejection - -```gwt -Given the module is imported from platform-core -And fake time is set to "2024-01-15T12:00:00Z" -And a pending approval -When I reject the approval with reviewer "reviewer-123" and reason "Reason" -Then the result reviewedAt equals the current fake time -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-062-throws-error-when-rejecting-non-pending-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-062-throws-error-when-rejecting-non-pending-approval.sdp.md deleted file mode 100644 index 42e1da8f..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-062-throws-error-when-rejecting-non-pending-approval.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.throws-error-when-rejecting-non-pending-approval -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Throws error when rejecting non-pending approval - -## Intent - -- outcome: Executable scenario: Throws error when rejecting non-pending approval - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then rejecting a non-pending approval throws for status "approved" -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-063-throws-error-when-rejecting-expired-pending-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-063-throws-error-when-rejecting-expired-pending-approval.sdp.md deleted file mode 100644 index cc3f8a59..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-063-throws-error-when-rejecting-expired-pending-approval.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.throws-error-when-rejecting-expired-pending-approval -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Throws error when rejecting expired pending approval - -## Intent - -- outcome: Executable scenario: Throws error when rejecting expired pending approval - -```gwt -Given the module is imported from platform-core -And fake time is set to "2024-01-15T12:00:00Z" -When I reject an expired pending approval -Then the rejection action throws "approval has expired" -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-064-transitions-pending-approval-to-expired.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-064-transitions-pending-approval-to-expired.sdp.md deleted file mode 100644 index d30abc26..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-064-transitions-pending-approval-to-expired.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.transitions-pending-approval-to-expired -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Transitions pending approval to expired - -## Intent - -- outcome: Executable scenario: Transitions pending approval to expired - -```gwt -Given the module is imported from platform-core -And a pending approval -When I expire the approval -Then the result status is "expired" -And the result reviewerId is undefined -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-065-throws-error-when-expiring-non-pending-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-065-throws-error-when-expiring-non-pending-approval.sdp.md deleted file mode 100644 index 55f97835..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-065-throws-error-when-expiring-non-pending-approval.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.throws-error-when-expiring-non-pending-approval -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Throws error when expiring non-pending approval - -## Intent - -- outcome: Executable scenario: Throws error when expiring non-pending approval - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then expiring a non-pending approval throws for status "approved" -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-066-preserves-original-fields-after-expiration.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-066-preserves-original-fields-after-expiration.sdp.md deleted file mode 100644 index d96a990e..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-066-preserves-original-fields-after-expiration.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.preserves-original-fields-after-expiration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Preserves original fields after expiration - -## Intent - -- outcome: Executable scenario: Preserves original fields after expiration - -```gwt -Given the module is imported from platform-core -And a pending approval with confidence 0.7 -When I expire the approval -Then the result confidence is 0.7 -And the result approvalId matches the original -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-067-returns-success-for-valid-pending-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-067-returns-success-for-valid-pending-approval.sdp.md deleted file mode 100644 index 292733ee..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-067-returns-success-for-valid-pending-approval.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-success-for-valid-pending-approval -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns success for valid pending approval - -## Intent - -- outcome: Executable scenario: Returns success for valid pending approval - -```gwt -Given the module is imported from platform-core -And fake time is set to "2024-01-15T12:00:00Z" -And a pending approval -And a valid auth context -When I safely approve the approval with note "Note" -Then the safe result is successful -And the safe result approval status is "approved" -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-068-returns-unauthorized-reviewer-when-not-authorized.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-068-returns-unauthorized-reviewer-when-not-authorized.sdp.md deleted file mode 100644 index e805bb92..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-068-returns-unauthorized-reviewer-when-not-authorized.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-unauthorized-reviewer-when-not-authorized -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns UNAUTHORIZED_REVIEWER when not authorized - -## Intent - -- outcome: Executable scenario: Returns UNAUTHORIZED_REVIEWER when not authorized - -```gwt -Given the module is imported from platform-core -And an approval with agentId "restricted-agent" -And an auth context with agentIds "other-agent" -When I safely approve the approval -Then the safe result is not successful -And the safe result error code is "UNAUTHORIZED_REVIEWER" -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-069-returns-invalid-status-transition-when-already-processed.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-069-returns-invalid-status-transition-when-already-processed.sdp.md deleted file mode 100644 index 7deabeea..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-069-returns-invalid-status-transition-when-already-processed.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-invalid-status-transition-when-already-processed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns INVALID_STATUS_TRANSITION when already processed - -## Intent - -- outcome: Executable scenario: Returns INVALID_STATUS_TRANSITION when already processed - -```gwt -Given the module is imported from platform-core -And an already approved approval -And a valid auth context -When I safely approve the approval -Then the safe result is not successful -And the safe result error code is "INVALID_STATUS_TRANSITION" -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-070-returns-approval-expired-when-past-expiration.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-070-returns-approval-expired-when-past-expiration.sdp.md deleted file mode 100644 index 4d9b2bc6..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-070-returns-approval-expired-when-past-expiration.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-approval-expired-when-past-expiration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns APPROVAL_EXPIRED when past expiration - -## Intent - -- outcome: Executable scenario: Returns APPROVAL_EXPIRED when past expiration - -```gwt -Given the module is imported from platform-core -And fake time is set to "2024-01-15T12:00:00Z" -And a pending approval that expired 1 second ago -And a valid auth context -When I safely approve the approval -Then the safe result is not successful -And the safe result error code is "APPROVAL_EXPIRED" -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-071-returns-success-for-valid-rejection.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-071-returns-success-for-valid-rejection.sdp.md deleted file mode 100644 index 929b090d..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-071-returns-success-for-valid-rejection.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-success-for-valid-rejection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns success for valid rejection - -## Intent - -- outcome: Executable scenario: Returns success for valid rejection - -```gwt -Given the module is imported from platform-core -And fake time is set to "2024-01-15T12:00:00Z" -And a pending approval -And a valid auth context -When I safely reject the approval with reason "Reason" -Then the safe result is successful -And the safe result approval status is "rejected" -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-072-returns-unauthorized-reviewer-on-safe-reject.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-072-returns-unauthorized-reviewer-on-safe-reject.sdp.md deleted file mode 100644 index ea19e487..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-072-returns-unauthorized-reviewer-on-safe-reject.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-unauthorized-reviewer-on-safe-reject -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns UNAUTHORIZED_REVIEWER on safe reject - -## Intent - -- outcome: Executable scenario: Returns UNAUTHORIZED_REVIEWER on safe reject - -```gwt -Given the module is imported from platform-core -And an approval with agentId "restricted-agent" -And an auth context with agentIds "other-agent" -When I safely reject the approval with reason "Reason" -Then the safe result is not successful -And the safe result error code is "UNAUTHORIZED_REVIEWER" -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-073-returns-approval-expired-on-safe-reject.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-073-returns-approval-expired-on-safe-reject.sdp.md deleted file mode 100644 index 03bf7f9b..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-073-returns-approval-expired-on-safe-reject.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-approval-expired-on-safe-reject -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns APPROVAL_EXPIRED on safe reject - -## Intent - -- outcome: Executable scenario: Returns APPROVAL_EXPIRED on safe reject - -```gwt -Given the module is imported from platform-core -And fake time is set to "2024-01-15T12:00:00Z" -And a pending approval that expired 1 second ago -And a valid auth context -When I safely reject the approval with reason "Reason" -Then the safe result is not successful -And the safe result error code is "APPROVAL_EXPIRED" -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-074-is-approval-pending-returns-true-only-for-pending.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-074-is-approval-pending-returns-true-only-for-pending.sdp.md deleted file mode 100644 index 3d366b6a..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-074-is-approval-pending-returns-true-only-for-pending.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.is-approval-pending-returns-true-only-for-pending -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# isApprovalPending returns true only for pending - -## Intent - -- outcome: Executable scenario: isApprovalPending returns true only for pending - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isApprovalPending returns true for status "pending" -And isApprovalPending returns false for statuses: -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-075-is-approval-approved-returns-true-only-for-approved.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-075-is-approval-approved-returns-true-only-for-approved.sdp.md deleted file mode 100644 index ed700c6b..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-075-is-approval-approved-returns-true-only-for-approved.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.is-approval-approved-returns-true-only-for-approved -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# isApprovalApproved returns true only for approved - -## Intent - -- outcome: Executable scenario: isApprovalApproved returns true only for approved - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isApprovalApproved returns true for status "approved" -And isApprovalApproved returns false for status "pending" -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-076-is-approval-rejected-returns-true-only-for-rejected.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-076-is-approval-rejected-returns-true-only-for-rejected.sdp.md deleted file mode 100644 index e15bdc14..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-076-is-approval-rejected-returns-true-only-for-rejected.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.is-approval-rejected-returns-true-only-for-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# isApprovalRejected returns true only for rejected - -## Intent - -- outcome: Executable scenario: isApprovalRejected returns true only for rejected - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isApprovalRejected returns true for status "rejected" -And isApprovalRejected returns false for status "pending" -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-077-is-approval-expired-detects-expired-status-and-time-based-expiration.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-077-is-approval-expired-detects-expired-status-and-time-based-expiration.sdp.md deleted file mode 100644 index 8ae3c64a..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-077-is-approval-expired-detects-expired-status-and-time-based-expiration.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.is-approval-expired-detects-expired-status-and-time-based-expiration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# isApprovalExpired detects expired status and time-based expiration - -## Intent - -- outcome: Executable scenario: isApprovalExpired detects expired status and time-based expiration - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isApprovalExpired returns true for status "expired" -And isApprovalExpired returns true for pending approval past expiration time -And isApprovalExpired returns false for pending approval before expiration time -And isApprovalExpired returns false for status "approved" -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-078-is-approval-actionable-checks-pending-and-not-expired.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-078-is-approval-actionable-checks-pending-and-not-expired.sdp.md deleted file mode 100644 index b0f4881c..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-078-is-approval-actionable-checks-pending-and-not-expired.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.is-approval-actionable-checks-pending-and-not-expired -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# isApprovalActionable checks pending and not expired - -## Intent - -- outcome: Executable scenario: isApprovalActionable checks pending and not expired - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isApprovalActionable returns true for pending approval before expiration -And isApprovalActionable returns false for pending approval at expiration -And isApprovalActionable returns false for status "approved" -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-079-returns-remaining-time-for-pending-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-079-returns-remaining-time-for-pending-approval.sdp.md deleted file mode 100644 index 6e15ded7..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-079-returns-remaining-time-for-pending-approval.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-remaining-time-for-pending-approval -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns remaining time for pending approval - -## Intent - -- outcome: Executable scenario: Returns remaining time for pending approval - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then getRemainingApprovalTime returns 5000 for pending approval expiring in 5000ms -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-080-returns-0-for-expired-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-080-returns-0-for-expired-approval.sdp.md deleted file mode 100644 index 5b2b0233..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-080-returns-0-for-expired-approval.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-0-for-expired-approval -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns 0 for expired approval - -## Intent - -- outcome: Executable scenario: Returns 0 for expired approval - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then getRemainingApprovalTime returns 0 for pending approval past expiration -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-081-returns-0-for-non-pending-status.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-081-returns-0-for-non-pending-status.sdp.md deleted file mode 100644 index 9215f5a7..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-081-returns-0-for-non-pending-status.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-0-for-non-pending-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns 0 for non-pending status - -## Intent - -- outcome: Executable scenario: Returns 0 for non-pending status - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then getRemainingApprovalTime returns 0 for approved status -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-082-formats-hours-and-minutes.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-082-formats-hours-and-minutes.sdp.md deleted file mode 100644 index 9511d2bb..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-082-formats-hours-and-minutes.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.formats-hours-and-minutes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Formats hours and minutes - -## Intent - -- outcome: Executable scenario: Formats hours and minutes - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then formatRemainingApprovalTime returns "2h 30m" for 2.5 hours remaining -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-083-formats-minutes-only.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-083-formats-minutes-only.sdp.md deleted file mode 100644 index 17cb14eb..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-083-formats-minutes-only.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.formats-minutes-only -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Formats minutes only - -## Intent - -- outcome: Executable scenario: Formats minutes only - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then formatRemainingApprovalTime returns "45m" for 45 minutes remaining -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-084-returns-expired-for-past-expiration.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-084-returns-expired-for-past-expiration.sdp.md deleted file mode 100644 index 427bf242..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-084-returns-expired-for-past-expiration.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-expired-for-past-expiration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns expired for past expiration - -## Intent - -- outcome: Executable scenario: Returns expired for past expiration - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then formatRemainingApprovalTime returns "expired" for past expiration -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-085-returns-true-for-valid-approval.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-085-returns-true-for-valid-approval.sdp.md deleted file mode 100644 index 3c91a325..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-085-returns-true-for-valid-approval.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-true-for-valid-approval -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns true for valid approval - -## Intent - -- outcome: Executable scenario: Returns true for valid approval - -```gwt -Given the module is imported from platform-core -And a test approval with default values -When the scenario runs -Then validatePendingApproval returns true -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-086-returns-false-for-invalid-inputs.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-086-returns-false-for-invalid-inputs.sdp.md deleted file mode 100644 index 98abdae1..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-086-returns-false-for-invalid-inputs.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-false-for-invalid-inputs -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns false for invalid inputs - -## Intent - -- outcome: Executable scenario: Returns false for invalid inputs - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then validatePendingApproval returns false for: -``` diff --git a/specs/behavior/platform-core/agent/approval.examples/s-087-returns-false-for-invalid-confidence.sdp.md b/specs/behavior/platform-core/agent/approval.examples/s-087-returns-false-for-invalid-confidence.sdp.md deleted file mode 100644 index 98f703cf..00000000 --- a/specs/behavior/platform-core/agent/approval.examples/s-087-returns-false-for-invalid-confidence.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.approval.returns-false-for-invalid-confidence -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.approval ---- -# Returns false for invalid confidence - -## Intent - -- outcome: Executable scenario: Returns false for invalid confidence - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then validatePendingApproval returns false for confidence 2.0 -``` diff --git a/specs/behavior/platform-core/agent/approval.sdp.md b/specs/behavior/platform-core/agent/approval.sdp.md index eae993cf..4240a8d6 100644 --- a/specs/behavior/platform-core/agent/approval.sdp.md +++ b/specs/behavior/platform-core/agent/approval.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.approval kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,35 +10,35 @@ relations: ## Intent -- outcome: Approval Module +- outcome: Provide pure functions for the human-in-loop approval workflow covering approval determination, authorization checks, status transitions, factory functions, type guards, Zod schemas, and timeout helpers. ## Behavior -- rule: Error codes contain all expected entries -- rule: Status constants define the four approval statuses -- rule: isApprovalStatus type guard validates status strings -- rule: ApprovalStatusSchema validates with Zod -- rule: PendingApprovalSchema validates approval objects -- rule: ApprovalAuthContextSchema validates auth context objects -- rule: parseApprovalTimeout converts duration strings to milliseconds -- rule: isValidApprovalTimeout checks format validity -- rule: calculateExpirationTime computes expiration from config and requestedAt -- rule: shouldRequireApproval determines if approval is needed based on confidence -- rule: requiresApproval list forces approval regardless of confidence -- rule: autoApprove list skips approval regardless of confidence -- rule: requiresApproval takes precedence over autoApprove -- rule: shouldRequireApproval edge cases -- rule: isAuthorizedReviewer checks agentIds restriction -- rule: isAuthorizedReviewer checks roles -- rule: isAuthorizedReviewer evaluates agentIds before roles -- rule: generateApprovalId produces correctly formatted unique IDs -- rule: createPendingApproval builds approval with correct initial values -- rule: approveAction transitions pending to approved -- rule: rejectAction transitions pending to rejected -- rule: expireAction transitions pending to expired -- rule: safeApproveAction returns result objects instead of throwing -- rule: safeRejectAction returns result objects instead of throwing -- rule: Type guards correctly identify approval statuses -- rule: getRemainingApprovalTime returns milliseconds until expiration -- rule: formatRemainingApprovalTime returns human-readable duration -- rule: validatePendingApproval checks structural validity +- rule: APPROVAL_ERROR_CODES maps each error name to its string value. +- rule: APPROVAL_STATUSES is a readonly 4-element tuple of pending, approved, rejected, and expired. +- rule: isApprovalStatus returns true only for the four valid status strings. +- rule: ApprovalStatusSchema accepts valid statuses and rejects invalid values. +- rule: PendingApprovalSchema accepts well-formed approvals and rejects malformed ones. +- rule: ApprovalAuthContextSchema accepts valid auth contexts, optionally with roles or agentIds. +- rule: parseApprovalTimeout returns milliseconds for valid Nd/Nh/Nm patterns and null otherwise. +- rule: isValidApprovalTimeout returns true for valid duration formats and false otherwise. +- rule: calculateExpirationTime adds the parsed timeout, or the default, to requestedAt. +- rule: shouldRequireApproval returns true when confidence is less than or equal to the threshold. +- rule: Actions in requiresApproval always require approval regardless of confidence. +- rule: Actions in autoApprove skip approval regardless of confidence. +- rule: When an action is in both lists, requiresApproval wins over autoApprove. +- rule: Empty or undefined requiresApproval and autoApprove lists fall through to the confidence check. +- rule: Authorization fails closed when agentIds is set; the list must be non-empty and include approval.agentId. +- rule: Roles are checked after agentIds; empty or undefined roles fail closed. +- rule: The agentIds check fails even when the user has an admin role. +- rule: generateApprovalId produces IDs with an apr_ prefix and a full UUIDv7 suffix. +- rule: createPendingApproval sets status pending and leaves reviewerId, reviewedAt, reviewNote, and rejectionReason undefined. +- rule: Only unexpired pending approvals can be approved; approveAction sets reviewerId, reviewedAt, and an optional reviewNote. +- rule: Only unexpired pending approvals can be rejected; rejectAction sets reviewerId, rejectionReason, and reviewedAt. +- rule: Only pending approvals can be expired; expireAction does not set reviewerId. +- rule: safeApproveAction returns success with an approved approval or failure with an error code. +- rule: safeRejectAction returns success with a rejected approval or failure with an error code. +- rule: Each status type guard returns true only for its matching status. +- rule: getRemainingApprovalTime returns positive milliseconds for an active pending approval and 0 for expired or non-pending. +- rule: formatRemainingApprovalTime formats remaining time as Xh Ym, Xm, or expired. +- rule: validatePendingApproval returns true for a valid PendingApproval and false for invalid shapes. diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-001-record-pattern-detected-event.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-001-record-pattern-detected-event.sdp.md deleted file mode 100644 index 89cc375a..00000000 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-001-record-pattern-detected-event.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit-trail.record-pattern-detected-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit-trail ---- -# Record PatternDetected event - -## Intent - -- outcome: Executable scenario: Record PatternDetected event - -```gwt -Given the agent module is imported from platform-core -And the audit trail utilities are available -And agent detects ChurnRisk pattern -When agent decides to emit SuggestCustomerOutreach -Then PatternDetected event is recorded -And event includes: -``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-002-audit-includes-triggering-events.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-002-audit-includes-triggering-events.sdp.md deleted file mode 100644 index fc33cafa..00000000 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-002-audit-includes-triggering-events.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit-trail.audit-includes-triggering-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit-trail ---- -# Audit includes triggering events - -## Intent - -- outcome: Executable scenario: Audit includes triggering events - -```gwt -Given the agent module is imported from platform-core -And the audit trail utilities are available -And pattern triggered by events E1, E2, E3 -When PatternDetected is recorded -Then event.triggeringEvents equals ["E1", "E2", "E3"] -``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-003-audit-includes-execution-mode.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-003-audit-includes-execution-mode.sdp.md deleted file mode 100644 index b76e6282..00000000 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-003-audit-includes-execution-mode.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit-trail.audit-includes-execution-mode -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit-trail ---- -# Audit includes execution mode - -## Intent - -- outcome: Executable scenario: Audit includes execution mode - -```gwt -Given the agent module is imported from platform-core -And the audit trail utilities are available -And agent decision with confidence 0.85 -And threshold is 0.8 -When PatternDetected is recorded -Then event.executionMode equals "auto-execute" -``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-004-audit-includes-llm-metadata.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-004-audit-includes-llm-metadata.sdp.md deleted file mode 100644 index a603f566..00000000 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-004-audit-includes-llm-metadata.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit-trail.audit-includes-llm-metadata -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit-trail ---- -# Audit includes LLM metadata - -## Intent - -- outcome: Executable scenario: Audit includes LLM metadata - -```gwt -Given the agent module is imported from platform-core -And the audit trail utilities are available -And agent used LLM for pattern analysis -When PatternDetected is recorded -Then event.llmContext includes: -``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-005-audit-llm-failures.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-005-audit-llm-failures.sdp.md deleted file mode 100644 index 9523512e..00000000 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-005-audit-llm-failures.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit-trail.audit-llm-failures -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit-trail ---- -# Audit LLM failures - -## Intent - -- outcome: Executable scenario: Audit LLM failures - -```gwt -Given the agent module is imported from platform-core -And the audit trail utilities are available -And LLM call failed with timeout -When AgentLLMError event is recorded -Then event includes error details -And event includes fallback action taken -``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-006-record-auto-executed-action.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-006-record-auto-executed-action.sdp.md deleted file mode 100644 index ee100b45..00000000 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-006-record-auto-executed-action.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit-trail.record-auto-executed-action -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit-trail ---- -# Record auto-executed action - -## Intent - -- outcome: Executable scenario: Record auto-executed action - -```gwt -Given the agent module is imported from platform-core -And the audit trail utilities are available -And an auto-execute decision -When command is executed -Then AgentActionExecuted event is recorded -And event links to original PatternDetected -``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-007-record-approved-action.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-007-record-approved-action.sdp.md deleted file mode 100644 index 14878e67..00000000 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-007-record-approved-action.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit-trail.record-approved-action -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit-trail ---- -# Record approved action - -## Intent - -- outcome: Executable scenario: Record approved action - -```gwt -Given the agent module is imported from platform-core -And the audit trail utilities are available -And an action approved by reviewer -When command is executed -Then ApprovalGranted event is recorded -And event includes reviewerId and approvalTime -``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-008-record-rejected-action.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-008-record-rejected-action.sdp.md deleted file mode 100644 index 12b41665..00000000 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-008-record-rejected-action.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit-trail.record-rejected-action -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit-trail ---- -# Record rejected action - -## Intent - -- outcome: Executable scenario: Record rejected action - -```gwt -Given the agent module is imported from platform-core -And the audit trail utilities are available -And an action rejected by reviewer -When rejection is processed -Then ApprovalRejected event is recorded -And event includes reviewerId and rejectionReason -``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-009-record-expired-action.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-009-record-expired-action.sdp.md deleted file mode 100644 index 1f9a9416..00000000 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-009-record-expired-action.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit-trail.record-expired-action -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit-trail ---- -# Record expired action - -## Intent - -- outcome: Executable scenario: Record expired action - -```gwt -Given the agent module is imported from platform-core -And the audit trail utilities are available -And an action that timed out -When expiration is processed -Then ApprovalExpired event is recorded -And event includes expirationTime -``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-010-query-all-decisions-for-an-agent.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-010-query-all-decisions-for-an-agent.sdp.md deleted file mode 100644 index bba7dade..00000000 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-010-query-all-decisions-for-an-agent.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit-trail.query-all-decisions-for-an-agent -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit-trail ---- -# Query all decisions for an agent - -## Intent - -- outcome: Executable scenario: Query all decisions for an agent - -```gwt -Given the agent module is imported from platform-core -And the audit trail utilities are available -And agent "churn-detector" made 100 decisions -When I query PatternDetected for agent "churn-detector" -Then I receive 100 decision records -``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-011-query-decisions-by-pattern-type.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-011-query-decisions-by-pattern-type.sdp.md deleted file mode 100644 index 800ae874..00000000 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-011-query-decisions-by-pattern-type.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit-trail.query-decisions-by-pattern-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit-trail ---- -# Query decisions by pattern type - -## Intent - -- outcome: Executable scenario: Query decisions by pattern type - -```gwt -Given the agent module is imported from platform-core -And the audit trail utilities are available -And decisions for patterns: ChurnRisk (50), FraudRisk (30) -When I query decisions where patternDetected = "ChurnRisk" -Then I receive 50 records -``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-012-query-decisions-by-time-range.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-012-query-decisions-by-time-range.sdp.md deleted file mode 100644 index 1f3925cd..00000000 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-012-query-decisions-by-time-range.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit-trail.query-decisions-by-time-range -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit-trail ---- -# Query decisions by time range - -## Intent - -- outcome: Executable scenario: Query decisions by time range - -```gwt -Given the agent module is imported from platform-core -And the audit trail utilities are available -And decisions from January and February -When I query decisions for January only -Then I receive only January decisions -``` diff --git a/specs/behavior/platform-core/agent/audit-trail.examples/s-013-query-decision-with-full-trace.sdp.md b/specs/behavior/platform-core/agent/audit-trail.examples/s-013-query-decision-with-full-trace.sdp.md deleted file mode 100644 index 279bfd1a..00000000 --- a/specs/behavior/platform-core/agent/audit-trail.examples/s-013-query-decision-with-full-trace.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit-trail.query-decision-with-full-trace -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit-trail ---- -# Query decision with full trace - -## Intent - -- outcome: Executable scenario: Query decision with full trace - -```gwt -Given the agent module is imported from platform-core -And the audit trail utilities are available -And a decision that led to executed command -When I query with expandTrace: true -Then result includes related events: -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-001-contains-all-ds-1-base-event-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-001-contains-all-ds-1-base-event-types.sdp.md deleted file mode 100644 index 7e97fb12..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-001-contains-all-ds-1-base-event-types.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.contains-all-ds-1-base-event-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Contains all DS-1 base event types - -## Intent - -- outcome: Executable scenario: Contains all DS-1 base event types - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then AGENT_AUDIT_EVENT_TYPES contains the following entries: -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-002-contains-all-ds-4-command-routing-event-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-002-contains-all-ds-4-command-routing-event-types.sdp.md deleted file mode 100644 index 4e5a5b0a..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-002-contains-all-ds-4-command-routing-event-types.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.contains-all-ds-4-command-routing-event-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Contains all DS-4 command routing event types - -## Intent - -- outcome: Executable scenario: Contains all DS-4 command routing event types - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then AGENT_AUDIT_EVENT_TYPES contains the following entries: -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-003-contains-all-ds-5-lifecycle-event-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-003-contains-all-ds-5-lifecycle-event-types.sdp.md deleted file mode 100644 index 02ef73a0..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-003-contains-all-ds-5-lifecycle-event-types.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.contains-all-ds-5-lifecycle-event-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Contains all DS-5 lifecycle event types - -## Intent - -- outcome: Executable scenario: Contains all DS-5 lifecycle event types - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then AGENT_AUDIT_EVENT_TYPES contains the following entries: -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-004-contains-ds-6-failure-tracking-event-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-004-contains-ds-6-failure-tracking-event-type.sdp.md deleted file mode 100644 index 460018c0..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-004-contains-ds-6-failure-tracking-event-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.contains-ds-6-failure-tracking-event-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Contains DS-6 failure tracking event type - -## Intent - -- outcome: Executable scenario: Contains DS-6 failure tracking event type - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then AGENT_AUDIT_EVENT_TYPES contains the following entries: -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-005-has-exactly-17-event-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-005-has-exactly-17-event-types.sdp.md deleted file mode 100644 index 2e53da9b..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-005-has-exactly-17-event-types.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.has-exactly-17-event-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Has exactly 17 event types - -## Intent - -- outcome: Executable scenario: Has exactly 17 event types - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then AGENT_AUDIT_EVENT_TYPES has length 17 -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-006-returns-true-for-all-valid-event-type-strings.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-006-returns-true-for-all-valid-event-type-strings.sdp.md deleted file mode 100644 index 5d554512..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-006-returns-true-for-all-valid-event-type-strings.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.returns-true-for-all-valid-event-type-strings -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Returns true for all valid event type strings - -## Intent - -- outcome: Executable scenario: Returns true for all valid event type strings - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isAgentAuditEventType returns true for: -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-007-returns-false-for-invalid-values.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-007-returns-false-for-invalid-values.sdp.md deleted file mode 100644 index 8f6e9663..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-007-returns-false-for-invalid-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.returns-false-for-invalid-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Returns false for invalid values - -## Intent - -- outcome: Executable scenario: Returns false for invalid values - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isAgentAuditEventType returns false for: -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-008-returns-false-for-non-string-values.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-008-returns-false-for-non-string-values.sdp.md deleted file mode 100644 index 74ef6996..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-008-returns-false-for-non-string-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.returns-false-for-non-string-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Returns false for non-string values - -## Intent - -- outcome: Executable scenario: Returns false for non-string values - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isAgentAuditEventType returns false for non-string values -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-009-accepts-all-valid-event-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-009-accepts-all-valid-event-types.sdp.md deleted file mode 100644 index 466d3cb1..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-009-accepts-all-valid-event-types.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.accepts-all-valid-event-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Accepts all valid event types - -## Intent - -- outcome: Executable scenario: Accepts all valid event types - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then AgentAuditEventTypeSchema accepts all AGENT_AUDIT_EVENT_TYPES entries -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-010-rejects-invalid-event-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-010-rejects-invalid-event-types.sdp.md deleted file mode 100644 index 6b7bd3c6..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-010-rejects-invalid-event-types.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.rejects-invalid-event-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Rejects invalid event types - -## Intent - -- outcome: Executable scenario: Rejects invalid event types - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then AgentAuditEventTypeSchema rejects the following values: -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-011-rejects-non-string-values-via-zod.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-011-rejects-non-string-values-via-zod.sdp.md deleted file mode 100644 index 416885a9..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-011-rejects-non-string-values-via-zod.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.rejects-non-string-values-via-zod -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Rejects non-string values via Zod - -## Intent - -- outcome: Executable scenario: Rejects non-string values via Zod - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then AgentAuditEventTypeSchema rejects numeric 123 and null -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-012-accepts-valid-llm-context.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-012-accepts-valid-llm-context.sdp.md deleted file mode 100644 index 653e8ca4..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-012-accepts-valid-llm-context.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.accepts-valid-llm-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Accepts valid LLM context - -## Intent - -- outcome: Executable scenario: Accepts valid LLM context - -```gwt -Given the module is imported from platform-core -And an LLM context with model "gpt-4" and tokens 1500 and duration 2500 -When the scenario runs -Then the LLM context passes AuditLLMContextSchema validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-013-rejects-negative-tokens.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-013-rejects-negative-tokens.sdp.md deleted file mode 100644 index 903ddb05..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-013-rejects-negative-tokens.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.rejects-negative-tokens -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Rejects negative tokens - -## Intent - -- outcome: Executable scenario: Rejects negative tokens - -```gwt -Given the module is imported from platform-core -And an LLM context with model "gpt-4" and tokens -100 and duration 2500 -When the scenario runs -Then the LLM context fails AuditLLMContextSchema validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-014-rejects-negative-duration.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-014-rejects-negative-duration.sdp.md deleted file mode 100644 index 6fbdc13d..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-014-rejects-negative-duration.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.rejects-negative-duration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Rejects negative duration - -## Intent - -- outcome: Executable scenario: Rejects negative duration - -```gwt -Given the module is imported from platform-core -And an LLM context with model "gpt-4" and tokens 1500 and duration -100 -When the scenario runs -Then the LLM context fails AuditLLMContextSchema validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-015-rejects-non-integer-tokens.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-015-rejects-non-integer-tokens.sdp.md deleted file mode 100644 index 4f9772f4..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-015-rejects-non-integer-tokens.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.rejects-non-integer-tokens -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Rejects non-integer tokens - -## Intent - -- outcome: Executable scenario: Rejects non-integer tokens - -```gwt -Given the module is imported from platform-core -And an LLM context with model "gpt-4" and tokens 1500.5 and duration 2500 -When the scenario runs -Then the LLM context fails AuditLLMContextSchema validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-016-accepts-zero-values.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-016-accepts-zero-values.sdp.md deleted file mode 100644 index 0f7bd6ef..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-016-accepts-zero-values.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.accepts-zero-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Accepts zero values - -## Intent - -- outcome: Executable scenario: Accepts zero values - -```gwt -Given the module is imported from platform-core -And an LLM context with model "test" and tokens 0 and duration 0 -When the scenario runs -Then the LLM context passes AuditLLMContextSchema validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-017-accepts-valid-action-with-flag-for-review.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-017-accepts-valid-action-with-flag-for-review.sdp.md deleted file mode 100644 index 687c5c32..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-017-accepts-valid-action-with-flag-for-review.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.accepts-valid-action-with-flag-for-review -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Accepts valid action with flag-for-review - -## Intent - -- outcome: Executable scenario: Accepts valid action with flag-for-review - -```gwt -Given the module is imported from platform-core -And an audit action with type "SuggestOutreach" and executionMode "flag-for-review" -When the scenario runs -Then the audit action passes AuditActionSchema validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-018-accepts-valid-action-with-auto-execute.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-018-accepts-valid-action-with-auto-execute.sdp.md deleted file mode 100644 index afc9a7cb..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-018-accepts-valid-action-with-auto-execute.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.accepts-valid-action-with-auto-execute -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Accepts valid action with auto-execute - -## Intent - -- outcome: Executable scenario: Accepts valid action with auto-execute - -```gwt -Given the module is imported from platform-core -And an audit action with type "LogEvent" and executionMode "auto-execute" -When the scenario runs -Then the audit action passes AuditActionSchema validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-019-rejects-action-with-empty-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-019-rejects-action-with-empty-type.sdp.md deleted file mode 100644 index 2ca02244..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-019-rejects-action-with-empty-type.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.rejects-action-with-empty-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Rejects action with empty type - -## Intent - -- outcome: Executable scenario: Rejects action with empty type - -```gwt -Given the module is imported from platform-core -And an audit action with type "" and executionMode "flag-for-review" -When the scenario runs -Then the audit action fails AuditActionSchema validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-020-rejects-action-with-invalid-execution-mode.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-020-rejects-action-with-invalid-execution-mode.sdp.md deleted file mode 100644 index d0c6fc38..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-020-rejects-action-with-invalid-execution-mode.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.rejects-action-with-invalid-execution-mode -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Rejects action with invalid executionMode - -## Intent - -- outcome: Executable scenario: Rejects action with invalid executionMode - -```gwt -Given the module is imported from platform-core -And an audit action with type "SuggestOutreach" and executionMode "invalid" -When the scenario runs -Then the audit action fails AuditActionSchema validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-021-rejects-action-with-extra-fields-in-strict-mode.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-021-rejects-action-with-extra-fields-in-strict-mode.sdp.md deleted file mode 100644 index 4e260523..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-021-rejects-action-with-extra-fields-in-strict-mode.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.rejects-action-with-extra-fields-in-strict-mode -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Rejects action with extra fields in strict mode - -## Intent - -- outcome: Executable scenario: Rejects action with extra fields in strict mode - -```gwt -Given the module is imported from platform-core -And an audit action with type "Test" and executionMode "auto-execute" and extra field -When the scenario runs -Then the audit action fails AuditActionSchema validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-022-accepts-valid-payload-with-action.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-022-accepts-valid-payload-with-action.sdp.md deleted file mode 100644 index ceef0ac0..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-022-accepts-valid-payload-with-action.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.accepts-valid-payload-with-action -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Accepts valid payload with action - -## Intent - -- outcome: Executable scenario: Accepts valid payload with action - -```gwt -Given the module is imported from platform-core -And a valid pattern detected payload -When the scenario runs -Then the payload passes PatternDetectedPayloadSchema validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-023-accepts-payload-with-null-pattern-detected.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-023-accepts-payload-with-null-pattern-detected.sdp.md deleted file mode 100644 index 2c09898c..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-023-accepts-payload-with-null-pattern-detected.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.accepts-payload-with-null-pattern-detected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Accepts payload with null patternDetected - -## Intent - -- outcome: Executable scenario: Accepts payload with null patternDetected - -```gwt -Given the module is imported from platform-core -And a pattern detected payload with null patternDetected -When the scenario runs -Then the payload passes PatternDetectedPayloadSchema validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-024-accepts-payload-with-null-action.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-024-accepts-payload-with-null-action.sdp.md deleted file mode 100644 index 6de1e303..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-024-accepts-payload-with-null-action.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.accepts-payload-with-null-action -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Accepts payload with null action - -## Intent - -- outcome: Executable scenario: Accepts payload with null action - -```gwt -Given the module is imported from platform-core -And a pattern detected payload with null action -When the scenario runs -Then the payload passes PatternDetectedPayloadSchema validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-025-accepts-payload-with-llm-context.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-025-accepts-payload-with-llm-context.sdp.md deleted file mode 100644 index 36bb426b..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-025-accepts-payload-with-llm-context.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.accepts-payload-with-llm-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Accepts payload with LLM context - -## Intent - -- outcome: Executable scenario: Accepts payload with LLM context - -```gwt -Given the module is imported from platform-core -And a pattern detected payload with LLM context -When the scenario runs -Then the payload passes PatternDetectedPayloadSchema validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-026-rejects-payload-with-confidence-below-0.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-026-rejects-payload-with-confidence-below-0.sdp.md deleted file mode 100644 index 6cc2552f..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-026-rejects-payload-with-confidence-below-0.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.rejects-payload-with-confidence-below-0 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Rejects payload with confidence below 0 - -## Intent - -- outcome: Executable scenario: Rejects payload with confidence below 0 - -```gwt -Given the module is imported from platform-core -And a pattern detected payload with confidence -0.1 -When the scenario runs -Then the payload fails PatternDetectedPayloadSchema validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-027-rejects-payload-with-confidence-above-1.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-027-rejects-payload-with-confidence-above-1.sdp.md deleted file mode 100644 index baa87d3a..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-027-rejects-payload-with-confidence-above-1.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.rejects-payload-with-confidence-above-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Rejects payload with confidence above 1 - -## Intent - -- outcome: Executable scenario: Rejects payload with confidence above 1 - -```gwt -Given the module is imported from platform-core -And a pattern detected payload with confidence 1.5 -When the scenario runs -Then the payload fails PatternDetectedPayloadSchema validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-028-accepts-valid-approval-granted-payload.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-028-accepts-valid-approval-granted-payload.sdp.md deleted file mode 100644 index af782cba..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-028-accepts-valid-approval-granted-payload.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.accepts-valid-approval-granted-payload -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Accepts valid approval granted payload - -## Intent - -- outcome: Executable scenario: Accepts valid approval granted payload - -```gwt -Given the module is imported from platform-core -And a valid approval granted payload -When the scenario runs -Then the approval granted payload passes validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-029-accepts-payload-with-review-note.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-029-accepts-payload-with-review-note.sdp.md deleted file mode 100644 index 895747b8..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-029-accepts-payload-with-review-note.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.accepts-payload-with-review-note -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Accepts payload with reviewNote - -## Intent - -- outcome: Executable scenario: Accepts payload with reviewNote - -```gwt -Given the module is imported from platform-core -And an approval granted payload with reviewNote "Looks good!" -When the scenario runs -Then the approval granted payload passes validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-030-rejects-payload-with-empty-action-id.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-030-rejects-payload-with-empty-action-id.sdp.md deleted file mode 100644 index 9a0022a5..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-030-rejects-payload-with-empty-action-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.rejects-payload-with-empty-action-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Rejects payload with empty actionId - -## Intent - -- outcome: Executable scenario: Rejects payload with empty actionId - -```gwt -Given the module is imported from platform-core -And an approval granted payload with empty actionId -When the scenario runs -Then the approval granted payload fails validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-031-accepts-valid-approval-rejected-payload.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-031-accepts-valid-approval-rejected-payload.sdp.md deleted file mode 100644 index f0616918..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-031-accepts-valid-approval-rejected-payload.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.accepts-valid-approval-rejected-payload -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Accepts valid approval rejected payload - -## Intent - -- outcome: Executable scenario: Accepts valid approval rejected payload - -```gwt -Given the module is imported from platform-core -And a valid approval rejected payload -When the scenario runs -Then the approval rejected payload passes validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-032-allows-empty-rejection-reason-string.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-032-allows-empty-rejection-reason-string.sdp.md deleted file mode 100644 index b46a7668..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-032-allows-empty-rejection-reason-string.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.allows-empty-rejection-reason-string -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Allows empty rejectionReason string - -## Intent - -- outcome: Executable scenario: Allows empty rejectionReason string - -```gwt -Given the module is imported from platform-core -And an approval rejected payload with empty rejectionReason -When the scenario runs -Then the approval rejected payload passes validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-033-accepts-valid-approval-expired-payload.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-033-accepts-valid-approval-expired-payload.sdp.md deleted file mode 100644 index eb89a8f3..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-033-accepts-valid-approval-expired-payload.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.accepts-valid-approval-expired-payload -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Accepts valid approval expired payload - -## Intent - -- outcome: Executable scenario: Accepts valid approval expired payload - -```gwt -Given the module is imported from platform-core -And a valid approval expired payload -When the scenario runs -Then the approval expired payload passes validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-034-rejects-payload-with-empty-action-id.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-034-rejects-payload-with-empty-action-id.sdp.md deleted file mode 100644 index 97d5e707..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-034-rejects-payload-with-empty-action-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.rejects-payload-with-empty-action-id-2 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Rejects payload with empty actionId - -## Intent - -- outcome: Executable scenario: Rejects payload with empty actionId - -```gwt -Given the module is imported from platform-core -And an approval expired payload with empty actionId -When the scenario runs -Then the approval expired payload fails validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-035-accepts-valid-audit-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-035-accepts-valid-audit-event.sdp.md deleted file mode 100644 index 07fc1822..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-035-accepts-valid-audit-event.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.accepts-valid-audit-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Accepts valid audit event - -## Intent - -- outcome: Executable scenario: Accepts valid audit event - -```gwt -Given the module is imported from platform-core -And a valid full audit event -When the scenario runs -Then the full audit event passes AgentAuditEventSchema validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-036-rejects-event-with-empty-agent-id.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-036-rejects-event-with-empty-agent-id.sdp.md deleted file mode 100644 index 4668bdfc..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-036-rejects-event-with-empty-agent-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.rejects-event-with-empty-agent-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Rejects event with empty agentId - -## Intent - -- outcome: Executable scenario: Rejects event with empty agentId - -```gwt -Given the module is imported from platform-core -And a full audit event with empty agentId -When the scenario runs -Then the full audit event fails AgentAuditEventSchema validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-037-rejects-event-with-empty-decision-id.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-037-rejects-event-with-empty-decision-id.sdp.md deleted file mode 100644 index 46837cc9..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-037-rejects-event-with-empty-decision-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.rejects-event-with-empty-decision-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Rejects event with empty decisionId - -## Intent - -- outcome: Executable scenario: Rejects event with empty decisionId - -```gwt -Given the module is imported from platform-core -And a full audit event with empty decisionId -When the scenario runs -Then the full audit event fails AgentAuditEventSchema validation -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-038-generates-i-ds-with-dec-prefix.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-038-generates-i-ds-with-dec-prefix.sdp.md deleted file mode 100644 index a11de409..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-038-generates-i-ds-with-dec-prefix.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.generates-i-ds-with-dec-prefix -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Generates IDs with dec_ prefix - -## Intent - -- outcome: Executable scenario: Generates IDs with dec_ prefix - -```gwt -Given the module is imported from platform-core -When I generate a decision ID -Then the decision ID starts with "dec_" -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-039-generates-i-ds-with-expected-format.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-039-generates-i-ds-with-expected-format.sdp.md deleted file mode 100644 index ab58bfff..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-039-generates-i-ds-with-expected-format.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.generates-i-ds-with-expected-format -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Generates IDs with expected format - -## Intent - -- outcome: Executable scenario: Generates IDs with expected format - -```gwt -Given the module is imported from platform-core -When I generate a decision ID -Then the decision ID has two underscore-separated parts -And the first part is "dec" -And the second part is a UUIDv7 string -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-040-generates-unique-i-ds-over-multiple-calls.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-040-generates-unique-i-ds-over-multiple-calls.sdp.md deleted file mode 100644 index 871277df..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-040-generates-unique-i-ds-over-multiple-calls.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.generates-unique-i-ds-over-multiple-calls -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Generates unique IDs over multiple calls - -## Intent - -- outcome: Executable scenario: Generates unique IDs over multiple calls - -```gwt -Given the module is imported from platform-core -When I generate 3 decision IDs with small delays -Then all 3 IDs are unique -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-041-uses-a-uui-dv7-payload-in-the-id.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-041-uses-a-uui-dv7-payload-in-the-id.sdp.md deleted file mode 100644 index 97a9c2c7..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-041-uses-a-uui-dv7-payload-in-the-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.uses-a-uui-dv7-payload-in-the-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Uses a UUIDv7 payload in the ID - -## Intent - -- outcome: Executable scenario: Uses a UUIDv7 payload in the ID - -```gwt -Given the module is imported from platform-core -When I generate a decision ID at fixed time "2024-01-15T12:00:00Z" -Then the UUID payload matches UUIDv7 format -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-042-creates-event-with-pattern-detected-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-042-creates-event-with-pattern-detected-type.sdp.md deleted file mode 100644 index f28f8537..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-042-creates-event-with-pattern-detected-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.creates-event-with-pattern-detected-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Creates event with PatternDetected type - -## Intent - -- outcome: Executable scenario: Creates event with PatternDetected type - -```gwt -Given the module is imported from platform-core -When I create a pattern detected audit for agent "test-agent" -Then the event type is "PatternDetected" -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-043-includes-all-required-fields.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-043-includes-all-required-fields.sdp.md deleted file mode 100644 index 67393c2f..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-043-includes-all-required-fields.sdp.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.includes-all-required-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Includes all required fields - -## Intent - -- outcome: Executable scenario: Includes all required fields - -```gwt -Given the module is imported from platform-core -When I create a pattern detected audit for agent "test-agent" with full payload -Then the event has the following properties: -And the decisionId matches the dec_ format -And the timestamp equals current time -And the payload has patternDetected "churn-risk" -And the payload has confidence 0.85 -And the payload has reasoning "Customer at risk" -And the payload has the expected action -And the payload has triggering events "evt-1" and "evt-2" -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-044-includes-llm-context-when-provided.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-044-includes-llm-context-when-provided.sdp.md deleted file mode 100644 index 101e5d3d..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-044-includes-llm-context-when-provided.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.includes-llm-context-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Includes LLM context when provided - -## Intent - -- outcome: Executable scenario: Includes LLM context when provided - -```gwt -Given the module is imported from platform-core -When I create a pattern detected audit with LLM context -Then the payload LLM context is defined -And the LLM context has model "gpt-4" -And the LLM context has tokens 1500 -And the LLM context has duration 2500 -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-045-does-not-include-llm-context-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-045-does-not-include-llm-context-when-not-provided.sdp.md deleted file mode 100644 index 6a6f5eee..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-045-does-not-include-llm-context-when-not-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.does-not-include-llm-context-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Does not include LLM context when not provided - -## Intent - -- outcome: Executable scenario: Does not include LLM context when not provided - -```gwt -Given the module is imported from platform-core -When I create a pattern detected audit without LLM context -Then the payload LLM context is undefined -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-046-handles-null-pattern-detected.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-046-handles-null-pattern-detected.sdp.md deleted file mode 100644 index 8ae03c22..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-046-handles-null-pattern-detected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.handles-null-pattern-detected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Handles null patternDetected - -## Intent - -- outcome: Executable scenario: Handles null patternDetected - -```gwt -Given the module is imported from platform-core -When I create a pattern detected audit with null patternDetected -Then the payload patternDetected is null -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-047-handles-null-action.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-047-handles-null-action.sdp.md deleted file mode 100644 index cd770c70..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-047-handles-null-action.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.handles-null-action -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Handles null action - -## Intent - -- outcome: Executable scenario: Handles null action - -```gwt -Given the module is imported from platform-core -When I create a pattern detected audit with null action -Then the payload action is null -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-048-creates-event-with-approval-granted-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-048-creates-event-with-approval-granted-type.sdp.md deleted file mode 100644 index 1a060d9a..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-048-creates-event-with-approval-granted-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.creates-event-with-approval-granted-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Creates event with ApprovalGranted type - -## Intent - -- outcome: Executable scenario: Creates event with ApprovalGranted type - -```gwt -Given the module is imported from platform-core -When I create an approval granted audit for agent "agent" action "action-123" reviewer "user-456" -Then the event type is "ApprovalGranted" -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-049-includes-all-required-fields-for-approval-granted.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-049-includes-all-required-fields-for-approval-granted.sdp.md deleted file mode 100644 index b153dc6b..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-049-includes-all-required-fields-for-approval-granted.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.includes-all-required-fields-for-approval-granted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Includes all required fields for approval granted - -## Intent - -- outcome: Executable scenario: Includes all required fields for approval granted - -```gwt -Given the module is imported from platform-core -When I create an approval granted audit for agent "test-agent" action "action-123" reviewer "user-456" -Then the event has the following properties: -And the decisionId matches the dec_ format -And the timestamp equals current time -And the payload actionId is "action-123" -And the payload reviewerId is "user-456" -And the payload reviewedAt equals current time -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-050-includes-review-note-when-provided.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-050-includes-review-note-when-provided.sdp.md deleted file mode 100644 index 11a32faf..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-050-includes-review-note-when-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.includes-review-note-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Includes reviewNote when provided - -## Intent - -- outcome: Executable scenario: Includes reviewNote when provided - -```gwt -Given the module is imported from platform-core -When I create an approval granted audit with reviewNote "Verified customer is at risk" -Then the payload reviewNote is "Verified customer is at risk" -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-051-does-not-include-review-note-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-051-does-not-include-review-note-when-not-provided.sdp.md deleted file mode 100644 index 621a5e9d..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-051-does-not-include-review-note-when-not-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.does-not-include-review-note-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Does not include reviewNote when not provided - -## Intent - -- outcome: Executable scenario: Does not include reviewNote when not provided - -```gwt -Given the module is imported from platform-core -When I create an approval granted audit without reviewNote -Then the payload reviewNote is undefined -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-052-creates-event-with-approval-rejected-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-052-creates-event-with-approval-rejected-type.sdp.md deleted file mode 100644 index 2fdc9a47..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-052-creates-event-with-approval-rejected-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.creates-event-with-approval-rejected-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Creates event with ApprovalRejected type - -## Intent - -- outcome: Executable scenario: Creates event with ApprovalRejected type - -```gwt -Given the module is imported from platform-core -When I create an approval rejected audit for agent "agent" -Then the event type is "ApprovalRejected" -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-053-includes-all-required-fields-for-approval-rejected.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-053-includes-all-required-fields-for-approval-rejected.sdp.md deleted file mode 100644 index f99804db..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-053-includes-all-required-fields-for-approval-rejected.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.includes-all-required-fields-for-approval-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Includes all required fields for approval rejected - -## Intent - -- outcome: Executable scenario: Includes all required fields for approval rejected - -```gwt -Given the module is imported from platform-core -When I create an approval rejected audit for agent "test-agent" with reason "Not appropriate" -Then the event has the following properties: -And the decisionId matches the dec_ format -And the timestamp equals current time -And the payload actionId is "action-123" -And the payload reviewerId is "user-456" -And the payload rejectionReason is "Not appropriate" -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-054-creates-event-with-approval-expired-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-054-creates-event-with-approval-expired-type.sdp.md deleted file mode 100644 index a56476d0..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-054-creates-event-with-approval-expired-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.creates-event-with-approval-expired-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Creates event with ApprovalExpired type - -## Intent - -- outcome: Executable scenario: Creates event with ApprovalExpired type - -```gwt -Given the module is imported from platform-core -When I create an approval expired audit for agent "agent" -Then the event type is "ApprovalExpired" -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-055-includes-all-required-fields-for-approval-expired.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-055-includes-all-required-fields-for-approval-expired.sdp.md deleted file mode 100644 index 4f78aa09..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-055-includes-all-required-fields-for-approval-expired.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.includes-all-required-fields-for-approval-expired -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Includes all required fields for approval expired - -## Intent - -- outcome: Executable scenario: Includes all required fields for approval expired - -```gwt -Given the module is imported from platform-core -When I create an approval expired audit for agent "test-agent" -Then the event has the following properties: -And the decisionId matches the dec_ format -And the timestamp equals current time -And the payload actionId is "action-123" -And the payload requestedAt is the stored requested time -And the payload expiredAt equals current time -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-056-creates-event-with-specified-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-056-creates-event-with-specified-type.sdp.md deleted file mode 100644 index 8c62b73f..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-056-creates-event-with-specified-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.creates-event-with-specified-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Creates event with specified type - -## Intent - -- outcome: Executable scenario: Creates event with specified type - -```gwt -Given the module is imported from platform-core -When I create a generic audit event with type "CommandEmitted" -Then the event type is "CommandEmitted" -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-057-includes-all-required-fields-for-generic-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-057-includes-all-required-fields-for-generic-event.sdp.md deleted file mode 100644 index 3877f936..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-057-includes-all-required-fields-for-generic-event.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.includes-all-required-fields-for-generic-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Includes all required fields for generic event - -## Intent - -- outcome: Executable scenario: Includes all required fields for generic event - -```gwt -Given the module is imported from platform-core -When I create a generic audit event for agent "test-agent" with type "AgentStarted" -Then the event has the following properties: -And the decisionId matches the dec_ format -And the timestamp equals current time -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-058-defaults-payload-to-empty-object-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-058-defaults-payload-to-empty-object-when-not-provided.sdp.md deleted file mode 100644 index cb2845d3..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-058-defaults-payload-to-empty-object-when-not-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.defaults-payload-to-empty-object-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Defaults payload to empty object when not provided - -## Intent - -- outcome: Executable scenario: Defaults payload to empty object when not provided - -```gwt -Given the module is imported from platform-core -When I create a generic audit event with type "CheckpointUpdated" and no payload -Then the payload equals empty object -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-059-works-with-ds-4-command-routing-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-059-works-with-ds-4-command-routing-types.sdp.md deleted file mode 100644 index 3479834c..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-059-works-with-ds-4-command-routing-types.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.works-with-ds-4-command-routing-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Works with DS-4 command routing types - -## Intent - -- outcome: Executable scenario: Works with DS-4 command routing types - -```gwt -Given the module is imported from platform-core -When I create a generic audit event with type "AgentCommandRouted" -Then the event type is "AgentCommandRouted" -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-060-works-with-ds-5-lifecycle-types.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-060-works-with-ds-5-lifecycle-types.sdp.md deleted file mode 100644 index 8ce75b2e..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-060-works-with-ds-5-lifecycle-types.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.works-with-ds-5-lifecycle-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Works with DS-5 lifecycle types - -## Intent - -- outcome: Executable scenario: Works with DS-5 lifecycle types - -```gwt -Given the module is imported from platform-core -When I create a generic audit event with type "AgentErrorRecoveryStarted" -Then the event type is "AgentErrorRecoveryStarted" -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-061-returns-true-for-pattern-detected-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-061-returns-true-for-pattern-detected-event.sdp.md deleted file mode 100644 index fa6317db..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-061-returns-true-for-pattern-detected-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.returns-true-for-pattern-detected-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Returns true for PatternDetected event - -## Intent - -- outcome: Executable scenario: Returns true for PatternDetected event - -```gwt -Given the module is imported from platform-core -When I create a pattern detected event for type guard test -Then isPatternDetectedEvent returns true -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-062-returns-false-for-approval-granted-event-via-is-pattern-detected.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-062-returns-false-for-approval-granted-event-via-is-pattern-detected.sdp.md deleted file mode 100644 index 107d67a5..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-062-returns-false-for-approval-granted-event-via-is-pattern-detected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.returns-false-for-approval-granted-event-via-is-pattern-detected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Returns false for ApprovalGranted event via isPatternDetected - -## Intent - -- outcome: Executable scenario: Returns false for ApprovalGranted event via isPatternDetected - -```gwt -Given the module is imported from platform-core -When I create an approval granted event for type guard test -Then isPatternDetectedEvent returns false -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-063-returns-false-for-approval-rejected-event-via-is-pattern-detected.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-063-returns-false-for-approval-rejected-event-via-is-pattern-detected.sdp.md deleted file mode 100644 index f7181c65..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-063-returns-false-for-approval-rejected-event-via-is-pattern-detected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.returns-false-for-approval-rejected-event-via-is-pattern-detected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Returns false for ApprovalRejected event via isPatternDetected - -## Intent - -- outcome: Executable scenario: Returns false for ApprovalRejected event via isPatternDetected - -```gwt -Given the module is imported from platform-core -When I create an approval rejected event for type guard test -Then isPatternDetectedEvent returns false -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-064-returns-true-for-approval-granted-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-064-returns-true-for-approval-granted-event.sdp.md deleted file mode 100644 index 198b2744..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-064-returns-true-for-approval-granted-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.returns-true-for-approval-granted-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Returns true for ApprovalGranted event - -## Intent - -- outcome: Executable scenario: Returns true for ApprovalGranted event - -```gwt -Given the module is imported from platform-core -When I create an approval granted event for type guard test -Then isApprovalGrantedEvent returns true -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-065-returns-false-for-pattern-detected-event-via-is-approval-granted.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-065-returns-false-for-pattern-detected-event-via-is-approval-granted.sdp.md deleted file mode 100644 index 4495a3ef..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-065-returns-false-for-pattern-detected-event-via-is-approval-granted.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.returns-false-for-pattern-detected-event-via-is-approval-granted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Returns false for PatternDetected event via isApprovalGranted - -## Intent - -- outcome: Executable scenario: Returns false for PatternDetected event via isApprovalGranted - -```gwt -Given the module is imported from platform-core -When I create a pattern detected event for type guard test -Then isApprovalGrantedEvent returns false -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-066-returns-false-for-approval-rejected-event-via-is-approval-granted.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-066-returns-false-for-approval-rejected-event-via-is-approval-granted.sdp.md deleted file mode 100644 index 0126f7d5..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-066-returns-false-for-approval-rejected-event-via-is-approval-granted.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.returns-false-for-approval-rejected-event-via-is-approval-granted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Returns false for ApprovalRejected event via isApprovalGranted - -## Intent - -- outcome: Executable scenario: Returns false for ApprovalRejected event via isApprovalGranted - -```gwt -Given the module is imported from platform-core -When I create an approval rejected event for type guard test -Then isApprovalGrantedEvent returns false -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-067-returns-true-for-approval-rejected-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-067-returns-true-for-approval-rejected-event.sdp.md deleted file mode 100644 index a2009f4f..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-067-returns-true-for-approval-rejected-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.returns-true-for-approval-rejected-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Returns true for ApprovalRejected event - -## Intent - -- outcome: Executable scenario: Returns true for ApprovalRejected event - -```gwt -Given the module is imported from platform-core -When I create an approval rejected event for type guard test -Then isApprovalRejectedEvent returns true -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-068-returns-false-for-approval-granted-event-via-is-approval-rejected.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-068-returns-false-for-approval-granted-event-via-is-approval-rejected.sdp.md deleted file mode 100644 index cbe62da8..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-068-returns-false-for-approval-granted-event-via-is-approval-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.returns-false-for-approval-granted-event-via-is-approval-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Returns false for ApprovalGranted event via isApprovalRejected - -## Intent - -- outcome: Executable scenario: Returns false for ApprovalGranted event via isApprovalRejected - -```gwt -Given the module is imported from platform-core -When I create an approval granted event for type guard test -Then isApprovalRejectedEvent returns false -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-069-returns-false-for-pattern-detected-event-via-is-approval-rejected.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-069-returns-false-for-pattern-detected-event-via-is-approval-rejected.sdp.md deleted file mode 100644 index e077c508..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-069-returns-false-for-pattern-detected-event-via-is-approval-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.returns-false-for-pattern-detected-event-via-is-approval-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Returns false for PatternDetected event via isApprovalRejected - -## Intent - -- outcome: Executable scenario: Returns false for PatternDetected event via isApprovalRejected - -```gwt -Given the module is imported from platform-core -When I create a pattern detected event for type guard test -Then isApprovalRejectedEvent returns false -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-070-returns-true-for-valid-pattern-detected-audit-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-070-returns-true-for-valid-pattern-detected-audit-event.sdp.md deleted file mode 100644 index a923c747..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-070-returns-true-for-valid-pattern-detected-audit-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.returns-true-for-valid-pattern-detected-audit-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Returns true for valid pattern detected audit event - -## Intent - -- outcome: Executable scenario: Returns true for valid pattern detected audit event - -```gwt -Given the module is imported from platform-core -When I create a pattern detected event for validation -Then validateAgentAuditEvent returns true -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-071-returns-true-for-valid-approval-granted-audit-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-071-returns-true-for-valid-approval-granted-audit-event.sdp.md deleted file mode 100644 index 509c1aa3..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-071-returns-true-for-valid-approval-granted-audit-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.returns-true-for-valid-approval-granted-audit-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Returns true for valid approval granted audit event - -## Intent - -- outcome: Executable scenario: Returns true for valid approval granted audit event - -```gwt -Given the module is imported from platform-core -When I create an approval granted event for validation -Then validateAgentAuditEvent returns true -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-072-returns-true-for-valid-approval-rejected-audit-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-072-returns-true-for-valid-approval-rejected-audit-event.sdp.md deleted file mode 100644 index d368007e..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-072-returns-true-for-valid-approval-rejected-audit-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.returns-true-for-valid-approval-rejected-audit-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Returns true for valid approval rejected audit event - -## Intent - -- outcome: Executable scenario: Returns true for valid approval rejected audit event - -```gwt -Given the module is imported from platform-core -When I create an approval rejected event for validation -Then validateAgentAuditEvent returns true -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-073-returns-true-for-valid-approval-expired-audit-event.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-073-returns-true-for-valid-approval-expired-audit-event.sdp.md deleted file mode 100644 index 9dac0330..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-073-returns-true-for-valid-approval-expired-audit-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.returns-true-for-valid-approval-expired-audit-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Returns true for valid approval expired audit event - -## Intent - -- outcome: Executable scenario: Returns true for valid approval expired audit event - -```gwt -Given the module is imported from platform-core -When I create an approval expired event for validation -Then validateAgentAuditEvent returns true -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-074-returns-false-for-null.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-074-returns-false-for-null.sdp.md deleted file mode 100644 index 2618fd75..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-074-returns-false-for-null.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.returns-false-for-null -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Returns false for null - -## Intent - -- outcome: Executable scenario: Returns false for null - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then validateAgentAuditEvent returns false for null -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-075-returns-false-for-undefined.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-075-returns-false-for-undefined.sdp.md deleted file mode 100644 index 2cf59584..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-075-returns-false-for-undefined.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.returns-false-for-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Returns false for undefined - -## Intent - -- outcome: Executable scenario: Returns false for undefined - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then validateAgentAuditEvent returns false for undefined -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-076-returns-false-for-empty-object.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-076-returns-false-for-empty-object.sdp.md deleted file mode 100644 index 7bdb61c2..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-076-returns-false-for-empty-object.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.returns-false-for-empty-object -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Returns false for empty object - -## Intent - -- outcome: Executable scenario: Returns false for empty object - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then validateAgentAuditEvent returns false for empty object -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-077-returns-false-for-invalid-event-type.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-077-returns-false-for-invalid-event-type.sdp.md deleted file mode 100644 index 28ee3843..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-077-returns-false-for-invalid-event-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.returns-false-for-invalid-event-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Returns false for invalid event type - -## Intent - -- outcome: Executable scenario: Returns false for invalid event type - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then validateAgentAuditEvent returns false for invalid event type -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-078-returns-false-for-missing-required-fields.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-078-returns-false-for-missing-required-fields.sdp.md deleted file mode 100644 index 2d99f391..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-078-returns-false-for-missing-required-fields.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.returns-false-for-missing-required-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Returns false for missing required fields - -## Intent - -- outcome: Executable scenario: Returns false for missing required fields - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then validateAgentAuditEvent returns false for missing required fields -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-079-creates-complete-audit-trail-for-approved-action.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-079-creates-complete-audit-trail-for-approved-action.sdp.md deleted file mode 100644 index eeb5c8f8..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-079-creates-complete-audit-trail-for-approved-action.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.creates-complete-audit-trail-for-approved-action -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Creates complete audit trail for approved action - -## Intent - -- outcome: Executable scenario: Creates complete audit trail for approved action - -```gwt -Given the module is imported from platform-core -When I create a detection then approval flow for agent "churn-risk-agent" -Then the detection passes isPatternDetectedEvent -And the detection passes validateAgentAuditEvent -And the approval passes isApprovalGrantedEvent -And the approval passes validateAgentAuditEvent -And the approval timestamp is greater than the detection timestamp -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-080-creates-complete-audit-trail-for-rejected-action.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-080-creates-complete-audit-trail-for-rejected-action.sdp.md deleted file mode 100644 index 5679701a..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-080-creates-complete-audit-trail-for-rejected-action.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.creates-complete-audit-trail-for-rejected-action -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Creates complete audit trail for rejected action - -## Intent - -- outcome: Executable scenario: Creates complete audit trail for rejected action - -```gwt -Given the module is imported from platform-core -When I create a detection then rejection flow for agent "inventory-agent" -Then the rejection passes isApprovalRejectedEvent -And the rejection passes validateAgentAuditEvent -And the rejection reason is "Order already placed by manager" -``` diff --git a/specs/behavior/platform-core/agent/audit.examples/s-081-creates-audit-trail-for-expired-action.sdp.md b/specs/behavior/platform-core/agent/audit.examples/s-081-creates-audit-trail-for-expired-action.sdp.md deleted file mode 100644 index 5a8c5073..00000000 --- a/specs/behavior/platform-core/agent/audit.examples/s-081-creates-audit-trail-for-expired-action.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.audit.creates-audit-trail-for-expired-action -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.audit ---- -# Creates audit trail for expired action - -## Intent - -- outcome: Executable scenario: Creates audit trail for expired action - -```gwt -Given the module is imported from platform-core -When I create a detection then expiration flow for agent "notification-agent" -Then the expiration event type is "ApprovalExpired" -And the expiration requestedAt is less than expiredAt -And the expiration passes validateAgentAuditEvent -``` diff --git a/specs/behavior/platform-core/agent/audit.sdp.md b/specs/behavior/platform-core/agent/audit.sdp.md index c0fc12ca..ede35c22 100644 --- a/specs/behavior/platform-core/agent/audit.sdp.md +++ b/specs/behavior/platform-core/agent/audit.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.audit kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,28 +10,29 @@ relations: ## Intent -- outcome: Agent Audit Trail +- outcome: Provide decision ID generation, audit event factories, type guards, and Zod schema validation so agent decisions form an explainable audit trail. +- value: Callers can record and inspect pattern detection, approval, command routing, lifecycle, and analysis-failure events from one typed event catalog. ## Behavior -- rule: AGENT_AUDIT_EVENT_TYPES contains all canonical event types -- rule: isAgentAuditEventType validates event type strings -- rule: AgentAuditEventTypeSchema validates via Zod -- rule: AuditLLMContextSchema validates LLM context objects -- rule: AuditActionSchema validates action objects -- rule: PatternDetectedPayloadSchema validates pattern payloads -- rule: ApprovalGrantedPayloadSchema validates approval payloads -- rule: ApprovalRejectedPayloadSchema validates rejection payloads -- rule: ApprovalExpiredPayloadSchema validates expiration payloads -- rule: AgentAuditEventSchema validates full audit event objects -- rule: generateDecisionId produces well-formed unique IDs -- rule: createPatternDetectedAudit factory produces correct events -- rule: createApprovalGrantedAudit factory produces correct events -- rule: createApprovalRejectedAudit factory produces correct events -- rule: createApprovalExpiredAudit factory produces correct events -- rule: createGenericAuditEvent factory produces correct events -- rule: isPatternDetectedEvent type guard identifies PatternDetected events -- rule: isApprovalGrantedEvent type guard identifies ApprovalGranted events -- rule: isApprovalRejectedEvent type guard identifies ApprovalRejected events -- rule: validateAgentAuditEvent validates full event objects -- rule: Audit trail flows create consistent event sequences +- rule: AGENT_AUDIT_EVENT_TYPES contains all DS-1, DS-4, DS-5, and DS-6 event types. +- rule: isAgentAuditEventType returns true for all canonical event type strings and false for anything else. +- rule: AgentAuditEventTypeSchema accepts all canonical event types and rejects everything else. +- rule: AuditLLMContextSchema accepts valid model, tokens, and duration, and rejects negative or non-integer values. +- rule: AuditActionSchema accepts a valid type plus executionMode, and rejects empty type, invalid mode, or extra fields. +- rule: PatternDetectedPayloadSchema accepts valid payloads with optional nulls for pattern or action, and rejects out-of-range confidence. +- rule: ApprovalGrantedPayloadSchema accepts valid actionId, reviewerId, and reviewedAt with optional reviewNote, and rejects empty actionId. +- rule: ApprovalRejectedPayloadSchema accepts valid actionId, reviewerId, and rejectionReason. +- rule: ApprovalExpiredPayloadSchema accepts valid actionId, requestedAt, and expiredAt, and rejects empty actionId. +- rule: AgentAuditEventSchema accepts a valid event with all required fields and rejects empty agentId or decisionId. +- rule: generateDecisionId produces IDs with a dec_ prefix, a full UUIDv7 payload, and uniqueness across calls. +- rule: createPatternDetectedAudit returns an event with PatternDetected type, a generated decisionId, and all payload fields. +- rule: createApprovalGrantedAudit returns an event with ApprovalGranted type, actionId, reviewerId, reviewedAt, and optional reviewNote. +- rule: createApprovalRejectedAudit returns an event with ApprovalRejected type, actionId, reviewerId, and rejectionReason. +- rule: createApprovalExpiredAudit returns an event with ApprovalExpired type, actionId, requestedAt, and expiredAt. +- rule: createGenericAuditEvent returns an event with the specified type, a generated decisionId, and the given or empty payload. +- rule: isPatternDetectedEvent returns true only for events with eventType PatternDetected. +- rule: isApprovalGrantedEvent returns true only for events with eventType ApprovalGranted. +- rule: isApprovalRejectedEvent returns true only for events with eventType ApprovalRejected. +- rule: validateAgentAuditEvent returns true for factory-created events and false for null, undefined, empty, or invalid objects. +- rule: Factory-created events form valid audit trails with proper timestamps and type guards. diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-001-returns-true-for-error-recovery-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-001-returns-true-for-error-recovery-status.sdp.md deleted file mode 100644 index f3df9cdf..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-001-returns-true-for-error-recovery-status.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.returns-true-for-error-recovery-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Returns true for error_recovery status - -## Intent - -- outcome: Executable scenario: Returns true for error_recovery status - -```gwt -Given a checkpoint with status "error_recovery" -When I check if the agent is in error recovery -Then the error recovery result is true -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-002-returns-false-for-active-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-002-returns-false-for-active-status.sdp.md deleted file mode 100644 index bbd0aa80..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-002-returns-false-for-active-status.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.returns-false-for-active-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Returns false for active status - -## Intent - -- outcome: Executable scenario: Returns false for active status - -```gwt -Given a checkpoint with status "active" -When I check if the agent is in error recovery -Then the error recovery result is false -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-003-returns-false-for-paused-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-003-returns-false-for-paused-status.sdp.md deleted file mode 100644 index f4ae3986..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-003-returns-false-for-paused-status.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.returns-false-for-paused-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Returns false for paused status - -## Intent - -- outcome: Executable scenario: Returns false for paused status - -```gwt -Given a checkpoint with status "paused" -When I check if the agent is in error recovery -Then the error recovery result is false -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-004-returns-false-for-stopped-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-004-returns-false-for-stopped-status.sdp.md deleted file mode 100644 index da3fc4f3..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-004-returns-false-for-stopped-status.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.returns-false-for-stopped-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Returns false for stopped status - -## Intent - -- outcome: Executable scenario: Returns false for stopped status - -```gwt -Given a checkpoint with status "stopped" -When I check if the agent is in error recovery -Then the error recovery result is false -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-005-returns-base-config-values-when-overrides-are-undefined.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-005-returns-base-config-values-when-overrides-are-undefined.sdp.md deleted file mode 100644 index c49df5c9..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-005-returns-base-config-values-when-overrides-are-undefined.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.returns-base-config-values-when-overrides-are-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Returns base config values when overrides are undefined - -## Intent - -- outcome: Executable scenario: Returns base config values when overrides are undefined - -```gwt -Given a base config with confidenceThreshold 0.8 and patternWindowDuration "30d" -When I resolve effective config without overrides -Then the effective confidenceThreshold is 0.8 -And the effective patternWindowDuration is "30d" -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-006-passes-through-base-rate-limits-when-no-overrides.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-006-passes-through-base-rate-limits-when-no-overrides.sdp.md deleted file mode 100644 index 3cc2c84b..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-006-passes-through-base-rate-limits-when-no-overrides.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.passes-through-base-rate-limits-when-no-overrides -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Passes through base rateLimits when no overrides - -## Intent - -- outcome: Executable scenario: Passes through base rateLimits when no overrides - -```gwt -Given a base config with confidenceThreshold 0.75 and patternWindowDuration "7d" and rateLimits -When I resolve effective config without overrides -Then the effective rateLimits have the following values: -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-007-omits-rate-limits-when-base-has-none-and-no-overrides.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-007-omits-rate-limits-when-base-has-none-and-no-overrides.sdp.md deleted file mode 100644 index be437124..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-007-omits-rate-limits-when-base-has-none-and-no-overrides.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.omits-rate-limits-when-base-has-none-and-no-overrides -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Omits rateLimits when base has none and no overrides - -## Intent - -- outcome: Executable scenario: Omits rateLimits when base has none and no overrides - -```gwt -Given a base config with confidenceThreshold 0.5 and patternWindowDuration "1d" -When I resolve effective config without overrides -Then the effective rateLimits are undefined -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-008-overrides-confidence-threshold-while-preserving-pattern-window-duration.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-008-overrides-confidence-threshold-while-preserving-pattern-window-duration.sdp.md deleted file mode 100644 index 29ccaa18..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-008-overrides-confidence-threshold-while-preserving-pattern-window-duration.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.overrides-confidence-threshold-while-preserving-pattern-window-duration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Overrides confidenceThreshold while preserving patternWindowDuration - -## Intent - -- outcome: Executable scenario: Overrides confidenceThreshold while preserving patternWindowDuration - -```gwt -Given a base config with confidenceThreshold 0.8 and patternWindowDuration "30d" -When I resolve effective config with confidenceThreshold override 0.95 -Then the effective confidenceThreshold is 0.95 -And the effective patternWindowDuration is "30d" -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-009-overrides-pattern-window-duration-while-preserving-confidence-threshold.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-009-overrides-pattern-window-duration-while-preserving-confidence-threshold.sdp.md deleted file mode 100644 index a89f9bc3..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-009-overrides-pattern-window-duration-while-preserving-confidence-threshold.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.overrides-pattern-window-duration-while-preserving-confidence-threshold -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Overrides patternWindowDuration while preserving confidenceThreshold - -## Intent - -- outcome: Executable scenario: Overrides patternWindowDuration while preserving confidenceThreshold - -```gwt -Given a base config with confidenceThreshold 0.8 and patternWindowDuration "30d" -When I resolve effective config with patternWindowDuration override "7d" -Then the effective confidenceThreshold is 0.8 -And the effective patternWindowDuration is "7d" -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-010-overrides-rate-limits-max-requests-per-minute-while-preserving-base-cost-b.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-010-overrides-rate-limits-max-requests-per-minute-while-preserving-base-cost-b.sdp.md deleted file mode 100644 index 94ef7cda..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-010-overrides-rate-limits-max-requests-per-minute-while-preserving-base-cost-b.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.overrides-rate-limits-max-requests-per-minute-while-preserving-base-cost-budget -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Overrides rateLimits.maxRequestsPerMinute while preserving base costBudget - -## Intent - -- outcome: Executable scenario: Overrides rateLimits.maxRequestsPerMinute while preserving base costBudget - -```gwt -Given a base config with confidenceThreshold 0.8 and patternWindowDuration "30d" and rateLimits -When I resolve effective config with rateLimits maxRequestsPerMinute override 120 -Then the effective rateLimits have the following values: -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-011-deep-merges-cost-budget-daily-while-preserving-cost-budget-alert-threshold.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-011-deep-merges-cost-budget-daily-while-preserving-cost-budget-alert-threshold.sdp.md deleted file mode 100644 index 9635dab7..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-011-deep-merges-cost-budget-daily-while-preserving-cost-budget-alert-threshold.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.deep-merges-cost-budget-daily-while-preserving-cost-budget-alert-threshold -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Deep-merges costBudget.daily while preserving costBudget.alertThreshold - -## Intent - -- outcome: Executable scenario: Deep-merges costBudget.daily while preserving costBudget.alertThreshold - -```gwt -Given a base config with confidenceThreshold 0.8 and patternWindowDuration "30d" and rateLimits -When I resolve effective config with costBudget daily override 200 -Then the effective rateLimits have the following values: -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-012-deep-merges-cost-budget-alert-threshold-while-preserving-cost-budget-daily.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-012-deep-merges-cost-budget-alert-threshold-while-preserving-cost-budget-daily.sdp.md deleted file mode 100644 index 276257f0..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-012-deep-merges-cost-budget-alert-threshold-while-preserving-cost-budget-daily.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.deep-merges-cost-budget-alert-threshold-while-preserving-cost-budget-daily -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Deep-merges costBudget.alertThreshold while preserving costBudget.daily - -## Intent - -- outcome: Executable scenario: Deep-merges costBudget.alertThreshold while preserving costBudget.daily - -```gwt -Given a base config with confidenceThreshold 0.8 and patternWindowDuration "30d" and rateLimits -When I resolve effective config with costBudget alertThreshold override 0.95 -Then the effective rateLimits have the following values: -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-013-fully-overrides-all-config-values.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-013-fully-overrides-all-config-values.sdp.md deleted file mode 100644 index 2eb6ab03..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-013-fully-overrides-all-config-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.fully-overrides-all-config-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Fully overrides all config values - -## Intent - -- outcome: Executable scenario: Fully overrides all config values - -```gwt -Given a base config with confidenceThreshold 0.8 and patternWindowDuration "30d" and rateLimits -When I resolve effective config with full overrides -Then the resolved config has the following values: -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-014-adds-rate-limits-via-overrides-when-base-has-none.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-014-adds-rate-limits-via-overrides-when-base-has-none.sdp.md deleted file mode 100644 index 21b36658..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-014-adds-rate-limits-via-overrides-when-base-has-none.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.adds-rate-limits-via-overrides-when-base-has-none -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Adds rateLimits via overrides when base has none - -## Intent - -- outcome: Executable scenario: Adds rateLimits via overrides when base has none - -```gwt -Given a base config with confidenceThreshold 0.8 and patternWindowDuration "30d" -When I resolve effective config adding rateLimits via overrides -Then the effective rateLimits have the following values: -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-015-empty-overrides-object-returns-base-config-values.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-015-empty-overrides-object-returns-base-config-values.sdp.md deleted file mode 100644 index 81589512..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-015-empty-overrides-object-returns-base-config-values.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.empty-overrides-object-returns-base-config-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Empty overrides object returns base config values - -## Intent - -- outcome: Executable scenario: Empty overrides object returns base config values - -```gwt -Given a base config with confidenceThreshold 0.8 and patternWindowDuration "30d" and base rateLimits only maxRequestsPerMinute 60 -When I resolve effective config with empty overrides -Then the effective confidenceThreshold is 0.8 -And the effective patternWindowDuration is "30d" -And the effective rateLimits maxRequestsPerMinute is 60 -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-016-applies-config-overrides-to-a-checkpoint-without-existing-overrides.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-016-applies-config-overrides-to-a-checkpoint-without-existing-overrides.sdp.md deleted file mode 100644 index ec847c5a..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-016-applies-config-overrides-to-a-checkpoint-without-existing-overrides.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.applies-config-overrides-to-a-checkpoint-without-existing-overrides -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Applies configOverrides to a checkpoint without existing overrides - -## Intent - -- outcome: Executable scenario: Applies configOverrides to a checkpoint without existing overrides - -```gwt -Given a checkpoint without configOverrides -When I apply an update with configOverrides confidenceThreshold 0.95 -Then the result configOverrides confidenceThreshold is 0.95 -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-017-merges-new-config-overrides-with-existing-overrides.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-017-merges-new-config-overrides-with-existing-overrides.sdp.md deleted file mode 100644 index 2aa7b7b4..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-017-merges-new-config-overrides-with-existing-overrides.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.merges-new-config-overrides-with-existing-overrides -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Merges new configOverrides with existing overrides - -## Intent - -- outcome: Executable scenario: Merges new configOverrides with existing overrides - -```gwt -Given a checkpoint with configOverrides confidenceThreshold 0.8 -When I apply an update with configOverrides patternWindowDuration "7d" -Then the result configOverrides has the following values: -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-018-update-overrides-take-precedence-over-existing.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-018-update-overrides-take-precedence-over-existing.sdp.md deleted file mode 100644 index 4451c87e..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-018-update-overrides-take-precedence-over-existing.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.update-overrides-take-precedence-over-existing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Update overrides take precedence over existing - -## Intent - -- outcome: Executable scenario: Update overrides take precedence over existing - -```gwt -Given a checkpoint with configOverrides confidenceThreshold 0.8 -When I apply an update with configOverrides confidenceThreshold 0.99 -Then the result configOverrides confidenceThreshold is 0.99 -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-019-preserves-existing-config-overrides-when-update-has-no-overrides.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-019-preserves-existing-config-overrides-when-update-has-no-overrides.sdp.md deleted file mode 100644 index d2b0d30a..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-019-preserves-existing-config-overrides-when-update-has-no-overrides.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.preserves-existing-config-overrides-when-update-has-no-overrides -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Preserves existing configOverrides when update has no overrides - -## Intent - -- outcome: Executable scenario: Preserves existing configOverrides when update has no overrides - -```gwt -Given a checkpoint with configOverrides confidenceThreshold 0.9 and rateLimits maxRequestsPerMinute 30 -When I apply an update with status "paused" only -Then the result configOverrides has the following values: -And the result status is "paused" -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-020-deep-merges-rate-limits-cost-budget-in-checkpoint-overrides.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-020-deep-merges-rate-limits-cost-budget-in-checkpoint-overrides.sdp.md deleted file mode 100644 index 0a38ee1c..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-020-deep-merges-rate-limits-cost-budget-in-checkpoint-overrides.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.deep-merges-rate-limits-cost-budget-in-checkpoint-overrides -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Deep-merges rateLimits.costBudget in checkpoint overrides - -## Intent - -- outcome: Executable scenario: Deep-merges rateLimits.costBudget in checkpoint overrides - -```gwt -Given a checkpoint with configOverrides rateLimits maxRequestsPerMinute 60 and costBudget daily 100 alertThreshold 0.8 -When I apply an update with configOverrides costBudget daily 200 -Then the result configOverrides has the following values: -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-021-updates-updated-at-timestamp.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-021-updates-updated-at-timestamp.sdp.md deleted file mode 100644 index b64a8dfc..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-021-updates-updated-at-timestamp.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.updates-updated-at-timestamp -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Updates updatedAt timestamp - -## Intent - -- outcome: Executable scenario: Updates updatedAt timestamp - -```gwt -Given a checkpoint without configOverrides -When I apply an update with lastProcessedPosition 20 -Then the result updatedAt equals the current time -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-022-increments-events-processed-count.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-022-increments-events-processed-count.sdp.md deleted file mode 100644 index 290fda15..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-022-increments-events-processed-count.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.increments-events-processed-count -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Increments eventsProcessed count - -## Intent - -- outcome: Executable scenario: Increments eventsProcessed count - -```gwt -Given a checkpoint with eventsProcessed 10 -When I apply an update with incrementEventsProcessed 5 -Then the result eventsProcessed is 15 -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-023-preserves-events-processed-when-no-increment-provided.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-023-preserves-events-processed-when-no-increment-provided.sdp.md deleted file mode 100644 index aafb4ec1..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-023-preserves-events-processed-when-no-increment-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.preserves-events-processed-when-no-increment-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Preserves eventsProcessed when no increment provided - -## Intent - -- outcome: Executable scenario: Preserves eventsProcessed when no increment provided - -```gwt -Given a checkpoint with eventsProcessed 10 -When I apply an update with status "paused" only -Then the result eventsProcessed is 10 -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-024-does-not-add-config-overrides-key-when-neither-existing-nor-update-have-th.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-024-does-not-add-config-overrides-key-when-neither-existing-nor-update-have-th.sdp.md deleted file mode 100644 index 78fbb777..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-024-does-not-add-config-overrides-key-when-neither-existing-nor-update-have-th.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.does-not-add-config-overrides-key-when-neither-existing-nor-update-have-them -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Does not add configOverrides key when neither existing nor update have them - -## Intent - -- outcome: Executable scenario: Does not add configOverrides key when neither existing nor update have them - -```gwt -Given a checkpoint without configOverrides -When I apply an update with lastProcessedPosition 20 -Then the result configOverrides are undefined -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-025-creates-checkpoint-with-sentinel-last-processed-position-of-1.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-025-creates-checkpoint-with-sentinel-last-processed-position-of-1.sdp.md deleted file mode 100644 index 013f3c00..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-025-creates-checkpoint-with-sentinel-last-processed-position-of-1.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.creates-checkpoint-with-sentinel-last-processed-position-of-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Creates checkpoint with sentinel lastProcessedPosition of -1 - -## Intent - -- outcome: Executable scenario: Creates checkpoint with sentinel lastProcessedPosition of -1 - -```gwt -Given the feature fixture is in place -When I create an initial checkpoint for agent "agent-001" and subscription "sub-001" -Then the initial checkpoint lastProcessedPosition is -1 -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-026-creates-checkpoint-with-active-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-026-creates-checkpoint-with-active-status.sdp.md deleted file mode 100644 index a010d5c3..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-026-creates-checkpoint-with-active-status.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.creates-checkpoint-with-active-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Creates checkpoint with active status - -## Intent - -- outcome: Executable scenario: Creates checkpoint with active status - -```gwt -Given the feature fixture is in place -When I create an initial checkpoint for agent "agent-001" and subscription "sub-001" -Then the initial checkpoint status is "active" -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-027-creates-checkpoint-with-zero-events-processed.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-027-creates-checkpoint-with-zero-events-processed.sdp.md deleted file mode 100644 index fded1454..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-027-creates-checkpoint-with-zero-events-processed.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.creates-checkpoint-with-zero-events-processed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Creates checkpoint with zero events processed - -## Intent - -- outcome: Executable scenario: Creates checkpoint with zero events processed - -```gwt -Given the feature fixture is in place -When I create an initial checkpoint for agent "agent-001" and subscription "sub-001" -Then the initial checkpoint eventsProcessed is 0 -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-028-creates-checkpoint-with-empty-last-event-id.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-028-creates-checkpoint-with-empty-last-event-id.sdp.md deleted file mode 100644 index 8deb8578..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-028-creates-checkpoint-with-empty-last-event-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.creates-checkpoint-with-empty-last-event-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Creates checkpoint with empty lastEventId - -## Intent - -- outcome: Executable scenario: Creates checkpoint with empty lastEventId - -```gwt -Given the feature fixture is in place -When I create an initial checkpoint for agent "agent-001" and subscription "sub-001" -Then the initial checkpoint lastEventId is "" -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-029-sets-updated-at-to-current-time.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-029-sets-updated-at-to-current-time.sdp.md deleted file mode 100644 index 61a31685..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-029-sets-updated-at-to-current-time.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.sets-updated-at-to-current-time -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Sets updatedAt to current time - -## Intent - -- outcome: Executable scenario: Sets updatedAt to current time - -```gwt -Given the feature fixture is in place -When I create an initial checkpoint for agent "agent-001" and subscription "sub-001" -Then the initial checkpoint updatedAt equals the current time -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-030-preserves-agent-id-and-subscription-id.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-030-preserves-agent-id-and-subscription-id.sdp.md deleted file mode 100644 index 8416ae74..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-030-preserves-agent-id-and-subscription-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.preserves-agent-id-and-subscription-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Preserves agentId and subscriptionId - -## Intent - -- outcome: Executable scenario: Preserves agentId and subscriptionId - -```gwt -Given the feature fixture is in place -When I create an initial checkpoint for agent "my-agent" and subscription "my-sub" -Then the initial checkpoint has the following identity values: -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-031-does-not-include-config-overrides.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-031-does-not-include-config-overrides.sdp.md deleted file mode 100644 index f56bc746..00000000 --- a/specs/behavior/platform-core/agent/checkpoint-extension.examples/s-031-does-not-include-config-overrides.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint-extension.does-not-include-config-overrides -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint-extension ---- -# Does not include configOverrides - -## Intent - -- outcome: Executable scenario: Does not include configOverrides - -```gwt -Given the feature fixture is in place -When I create an initial checkpoint for agent "agent-001" and subscription "sub-001" -Then the initial checkpoint configOverrides are undefined -``` diff --git a/specs/behavior/platform-core/agent/checkpoint-extension.sdp.md b/specs/behavior/platform-core/agent/checkpoint-extension.sdp.md index 7dcef2d0..87e4fe80 100644 --- a/specs/behavior/platform-core/agent/checkpoint-extension.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint-extension.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.checkpoint-extension kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: Checkpoint Extension +- outcome: Detect error recovery, resolve effective config with overrides, apply checkpoint updates with config merges, and create initial checkpoints. +- value: Per-agent overrides deep-merge onto base config without dropping fields the update does not mention. ## Behavior diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-001-contains-all-four-statuses.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-001-contains-all-four-statuses.sdp.md deleted file mode 100644 index dd474f6b..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-001-contains-all-four-statuses.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.contains-all-four-statuses -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Contains all four statuses - -## Intent - -- outcome: Executable scenario: Contains all four statuses - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then AGENT_CHECKPOINT_STATUSES equals ["active", "paused", "stopped", "error_recovery"] -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-002-is-a-readonly-tuple-with-4-elements.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-002-is-a-readonly-tuple-with-4-elements.sdp.md deleted file mode 100644 index e033d1e7..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-002-is-a-readonly-tuple-with-4-elements.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.is-a-readonly-tuple-with-4-elements -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Is a readonly tuple with 4 elements - -## Intent - -- outcome: Executable scenario: Is a readonly tuple with 4 elements - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then AGENT_CHECKPOINT_STATUSES is an array -And AGENT_CHECKPOINT_STATUSES has length 4 -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-003-accepts-all-valid-statuses.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-003-accepts-all-valid-statuses.sdp.md deleted file mode 100644 index 59c4a852..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-003-accepts-all-valid-statuses.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.accepts-all-valid-statuses -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Accepts all valid statuses - -## Intent - -- outcome: Executable scenario: Accepts all valid statuses - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then AgentCheckpointStatusSchema accepts all of: -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-004-rejects-invalid-statuses.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-004-rejects-invalid-statuses.sdp.md deleted file mode 100644 index 189583c0..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-004-rejects-invalid-statuses.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.rejects-invalid-statuses -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Rejects invalid statuses - -## Intent - -- outcome: Executable scenario: Rejects invalid statuses - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then AgentCheckpointStatusSchema rejects all of: -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-005-accepts-a-valid-checkpoint-object.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-005-accepts-a-valid-checkpoint-object.sdp.md deleted file mode 100644 index 34c8b73b..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-005-accepts-a-valid-checkpoint-object.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.accepts-a-valid-checkpoint-object -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Accepts a valid checkpoint object - -## Intent - -- outcome: Executable scenario: Accepts a valid checkpoint object - -```gwt -Given the module is imported from platform-core -And a test checkpoint with defaults -When the scenario runs -Then the checkpoint passes AgentCheckpointSchema validation -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-006-accepts-checkpoint-with-sentinel-position-1.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-006-accepts-checkpoint-with-sentinel-position-1.sdp.md deleted file mode 100644 index b610c782..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-006-accepts-checkpoint-with-sentinel-position-1.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.accepts-checkpoint-with-sentinel-position-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Accepts checkpoint with sentinel position -1 - -## Intent - -- outcome: Executable scenario: Accepts checkpoint with sentinel position -1 - -```gwt -Given the module is imported from platform-core -And a test checkpoint with lastProcessedPosition -1 -When the scenario runs -Then the checkpoint passes AgentCheckpointSchema validation -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-007-rejects-checkpoint-with-position-below-1.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-007-rejects-checkpoint-with-position-below-1.sdp.md deleted file mode 100644 index f0e66895..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-007-rejects-checkpoint-with-position-below-1.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.rejects-checkpoint-with-position-below-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Rejects checkpoint with position below -1 - -## Intent - -- outcome: Executable scenario: Rejects checkpoint with position below -1 - -```gwt -Given the module is imported from platform-core -And a test checkpoint with lastProcessedPosition -2 -When the scenario runs -Then the checkpoint fails AgentCheckpointSchema validation -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-008-rejects-checkpoint-with-negative-events-processed.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-008-rejects-checkpoint-with-negative-events-processed.sdp.md deleted file mode 100644 index 804bb186..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-008-rejects-checkpoint-with-negative-events-processed.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.rejects-checkpoint-with-negative-events-processed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Rejects checkpoint with negative eventsProcessed - -## Intent - -- outcome: Executable scenario: Rejects checkpoint with negative eventsProcessed - -```gwt -Given the module is imported from platform-core -And a test checkpoint with eventsProcessed -1 -When the scenario runs -Then the checkpoint fails AgentCheckpointSchema validation -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-009-rejects-checkpoint-with-empty-agent-id.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-009-rejects-checkpoint-with-empty-agent-id.sdp.md deleted file mode 100644 index 10745c92..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-009-rejects-checkpoint-with-empty-agent-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.rejects-checkpoint-with-empty-agent-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Rejects checkpoint with empty agentId - -## Intent - -- outcome: Executable scenario: Rejects checkpoint with empty agentId - -```gwt -Given the module is imported from platform-core -And a test checkpoint with agentId "" -When the scenario runs -Then the checkpoint fails AgentCheckpointSchema validation -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-010-rejects-checkpoint-with-empty-subscription-id.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-010-rejects-checkpoint-with-empty-subscription-id.sdp.md deleted file mode 100644 index 15b4a4c5..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-010-rejects-checkpoint-with-empty-subscription-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.rejects-checkpoint-with-empty-subscription-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Rejects checkpoint with empty subscriptionId - -## Intent - -- outcome: Executable scenario: Rejects checkpoint with empty subscriptionId - -```gwt -Given the module is imported from platform-core -And a test checkpoint with subscriptionId "" -When the scenario runs -Then the checkpoint fails AgentCheckpointSchema validation -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-011-rejects-checkpoint-with-missing-required-fields.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-011-rejects-checkpoint-with-missing-required-fields.sdp.md deleted file mode 100644 index dbf8ce8a..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-011-rejects-checkpoint-with-missing-required-fields.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.rejects-checkpoint-with-missing-required-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Rejects checkpoint with missing required fields - -## Intent - -- outcome: Executable scenario: Rejects checkpoint with missing required fields - -```gwt -Given the module is imported from platform-core -And an object with only agentId "test" -When the scenario runs -Then the checkpoint fails AgentCheckpointSchema validation -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-012-creates-checkpoint-with-correct-agent-id-and-subscription-id.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-012-creates-checkpoint-with-correct-agent-id-and-subscription-id.sdp.md deleted file mode 100644 index 86e6ea3f..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-012-creates-checkpoint-with-correct-agent-id-and-subscription-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.creates-checkpoint-with-correct-agent-id-and-subscription-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Creates checkpoint with correct agentId and subscriptionId - -## Intent - -- outcome: Executable scenario: Creates checkpoint with correct agentId and subscriptionId - -```gwt -Given the module is imported from platform-core -When I create an initial checkpoint for agent "my-agent" with subscription "sub-001" -Then the checkpoint has the following properties: -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-013-initializes-position-and-event-tracking-defaults.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-013-initializes-position-and-event-tracking-defaults.sdp.md deleted file mode 100644 index 2933f8b2..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-013-initializes-position-and-event-tracking-defaults.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.initializes-position-and-event-tracking-defaults -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Initializes position and event tracking defaults - -## Intent - -- outcome: Executable scenario: Initializes position and event tracking defaults - -```gwt -Given the module is imported from platform-core -When I create an initial checkpoint for agent "my-agent" with subscription "sub-001" -Then the checkpoint has the following numeric properties: -And the checkpoint lastEventId is "" -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-014-initializes-status-to-active.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-014-initializes-status-to-active.sdp.md deleted file mode 100644 index b779ff32..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-014-initializes-status-to-active.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.initializes-status-to-active -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Initializes status to active - -## Intent - -- outcome: Executable scenario: Initializes status to active - -```gwt -Given the module is imported from platform-core -When I create an initial checkpoint for agent "my-agent" with subscription "sub-001" -Then the checkpoint status is "active" -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-015-sets-updated-at-to-current-time.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-015-sets-updated-at-to-current-time.sdp.md deleted file mode 100644 index 8ecdc3ba..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-015-sets-updated-at-to-current-time.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.sets-updated-at-to-current-time -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Sets updatedAt to current time - -## Intent - -- outcome: Executable scenario: Sets updatedAt to current time - -```gwt -Given the module is imported from platform-core -When I create an initial checkpoint for agent "my-agent" with subscription "sub-001" -Then the checkpoint updatedAt equals the current time -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-016-creates-a-checkpoint-that-passes-schema-validation.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-016-creates-a-checkpoint-that-passes-schema-validation.sdp.md deleted file mode 100644 index 54471518..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-016-creates-a-checkpoint-that-passes-schema-validation.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.creates-a-checkpoint-that-passes-schema-validation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Creates a checkpoint that passes schema validation - -## Intent - -- outcome: Executable scenario: Creates a checkpoint that passes schema validation - -```gwt -Given the module is imported from platform-core -When I create an initial checkpoint for agent "my-agent" with subscription "sub-001" -Then the checkpoint passes AgentCheckpointSchema validation -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-017-updates-last-processed-position.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-017-updates-last-processed-position.sdp.md deleted file mode 100644 index 0c24d04a..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-017-updates-last-processed-position.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.updates-last-processed-position -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Updates lastProcessedPosition - -## Intent - -- outcome: Executable scenario: Updates lastProcessedPosition - -```gwt -Given the module is imported from platform-core -And a test checkpoint with lastProcessedPosition 100 -When I apply an update with lastProcessedPosition 150 -Then the checkpoint lastProcessedPosition is 150 -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-018-updates-last-event-id.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-018-updates-last-event-id.sdp.md deleted file mode 100644 index 2a60f368..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-018-updates-last-event-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.updates-last-event-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Updates lastEventId - -## Intent - -- outcome: Executable scenario: Updates lastEventId - -```gwt -Given the module is imported from platform-core -And a test checkpoint with lastEventId "evt_old" -When I apply an update with lastEventId "evt_new" -Then the checkpoint lastEventId is "evt_new" -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-019-updates-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-019-updates-status.sdp.md deleted file mode 100644 index ff023963..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-019-updates-status.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.updates-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Updates status - -## Intent - -- outcome: Executable scenario: Updates status - -```gwt -Given the module is imported from platform-core -And a test checkpoint with status "active" -When I apply an update with status "paused" -Then the checkpoint status is "paused" -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-020-increments-events-processed-by-specified-amount.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-020-increments-events-processed-by-specified-amount.sdp.md deleted file mode 100644 index b27f5622..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-020-increments-events-processed-by-specified-amount.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.increments-events-processed-by-specified-amount -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Increments eventsProcessed by specified amount - -## Intent - -- outcome: Executable scenario: Increments eventsProcessed by specified amount - -```gwt -Given the module is imported from platform-core -And a test checkpoint with eventsProcessed 50 -When I apply an update with incrementEventsProcessed 5 -Then the checkpoint eventsProcessed is 55 -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-021-increments-events-processed-by-1-for-single-event.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-021-increments-events-processed-by-1-for-single-event.sdp.md deleted file mode 100644 index 01b205f1..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-021-increments-events-processed-by-1-for-single-event.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.increments-events-processed-by-1-for-single-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Increments eventsProcessed by 1 for single event - -## Intent - -- outcome: Executable scenario: Increments eventsProcessed by 1 for single event - -```gwt -Given the module is imported from platform-core -And a test checkpoint with eventsProcessed 100 -When I apply an update with incrementEventsProcessed 1 -Then the checkpoint eventsProcessed is 101 -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-022-does-not-increment-events-processed-when-not-specified.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-022-does-not-increment-events-processed-when-not-specified.sdp.md deleted file mode 100644 index 3677c0f1..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-022-does-not-increment-events-processed-when-not-specified.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.does-not-increment-events-processed-when-not-specified -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Does not increment eventsProcessed when not specified - -## Intent - -- outcome: Executable scenario: Does not increment eventsProcessed when not specified - -```gwt -Given the module is imported from platform-core -And a test checkpoint with eventsProcessed 50 -When I apply an update with lastProcessedPosition 101 -Then the checkpoint eventsProcessed is 50 -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-023-preserves-unchanged-fields.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-023-preserves-unchanged-fields.sdp.md deleted file mode 100644 index 0e537baa..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-023-preserves-unchanged-fields.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.preserves-unchanged-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Preserves unchanged fields - -## Intent - -- outcome: Executable scenario: Preserves unchanged fields - -```gwt -Given the module is imported from platform-core -And a fully specified test checkpoint -When I apply an update with lastProcessedPosition 101 -Then the unchanged fields are preserved -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-024-updates-updated-at-to-current-time.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-024-updates-updated-at-to-current-time.sdp.md deleted file mode 100644 index f5af608c..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-024-updates-updated-at-to-current-time.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.updates-updated-at-to-current-time -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Updates updatedAt to current time - -## Intent - -- outcome: Executable scenario: Updates updatedAt to current time - -```gwt -Given the module is imported from platform-core -And a test checkpoint with updatedAt 10000ms ago -When I apply an update with lastProcessedPosition 101 -Then the checkpoint updatedAt equals the current time -And the checkpoint updatedAt differs from the old time -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-025-applies-multiple-updates-at-once.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-025-applies-multiple-updates-at-once.sdp.md deleted file mode 100644 index e0b76d2f..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-025-applies-multiple-updates-at-once.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.applies-multiple-updates-at-once -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Applies multiple updates at once - -## Intent - -- outcome: Executable scenario: Applies multiple updates at once - -```gwt -Given the module is imported from platform-core -And a test checkpoint with lastProcessedPosition 100 and lastEventId "evt_old" and status "active" and eventsProcessed 50 -When I apply an update with lastProcessedPosition 101 and lastEventId "evt_new" and status "paused" and incrementEventsProcessed 1 -Then the checkpoint has the following properties: -And the checkpoint eventsProcessed is 51 -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-026-handles-empty-update-by-only-updating-timestamp.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-026-handles-empty-update-by-only-updating-timestamp.sdp.md deleted file mode 100644 index 9ea2d509..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-026-handles-empty-update-by-only-updating-timestamp.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.handles-empty-update-by-only-updating-timestamp -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Handles empty update by only updating timestamp - -## Intent - -- outcome: Executable scenario: Handles empty update by only updating timestamp - -```gwt -Given the module is imported from platform-core -And a test checkpoint with defaults -When I apply an empty update -Then the checkpoint fields match the original except updatedAt -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-027-returns-true-when-event-position-is-greater-than-checkpoint.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-027-returns-true-when-event-position-is-greater-than-checkpoint.sdp.md deleted file mode 100644 index e45b2d9b..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-027-returns-true-when-event-position-is-greater-than-checkpoint.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.returns-true-when-event-position-is-greater-than-checkpoint -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Returns true when event position is greater than checkpoint - -## Intent - -- outcome: Executable scenario: Returns true when event position is greater than checkpoint - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then shouldProcessAgentEvent with position 101 and checkpoint 100 returns true -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-028-returns-false-for-duplicate-event-at-same-position.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-028-returns-false-for-duplicate-event-at-same-position.sdp.md deleted file mode 100644 index 02337fa2..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-028-returns-false-for-duplicate-event-at-same-position.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.returns-false-for-duplicate-event-at-same-position -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Returns false for duplicate event at same position - -## Intent - -- outcome: Executable scenario: Returns false for duplicate event at same position - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then shouldProcessAgentEvent with position 100 and checkpoint 100 returns false -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-029-returns-false-for-already-processed-event.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-029-returns-false-for-already-processed-event.sdp.md deleted file mode 100644 index 60b8d8d9..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-029-returns-false-for-already-processed-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.returns-false-for-already-processed-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Returns false for already-processed event - -## Intent - -- outcome: Executable scenario: Returns false for already-processed event - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then shouldProcessAgentEvent with position 50 and checkpoint 100 returns false -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-030-returns-true-for-position-0-against-sentinel-1-for-a-new-agent.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-030-returns-true-for-position-0-against-sentinel-1-for-a-new-agent.sdp.md deleted file mode 100644 index 9ff7ce28..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-030-returns-true-for-position-0-against-sentinel-1-for-a-new-agent.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.returns-true-for-position-0-against-sentinel-1-for-a-new-agent -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Returns true for position 0 against sentinel -1 for a new agent - -## Intent - -- outcome: Executable scenario: Returns true for position 0 against sentinel -1 for a new agent - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then shouldProcessAgentEvent with position 0 and checkpoint -1 returns true -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-031-returns-true-for-position-1-against-sentinel-1.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-031-returns-true-for-position-1-against-sentinel-1.sdp.md deleted file mode 100644 index 76f4b512..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-031-returns-true-for-position-1-against-sentinel-1.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.returns-true-for-position-1-against-sentinel-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Returns true for position 1 against sentinel -1 - -## Intent - -- outcome: Executable scenario: Returns true for position 1 against sentinel -1 - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then shouldProcessAgentEvent with position 1 and checkpoint -1 returns true -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-032-returns-true-for-any-positive-position-against-sentinel-1.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-032-returns-true-for-any-positive-position-against-sentinel-1.sdp.md deleted file mode 100644 index 5f033d7d..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-032-returns-true-for-any-positive-position-against-sentinel-1.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.returns-true-for-any-positive-position-against-sentinel-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Returns true for any positive position against sentinel -1 - -## Intent - -- outcome: Executable scenario: Returns true for any positive position against sentinel -1 - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then shouldProcessAgentEvent returns true for all positions against sentinel: -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-033-returns-true-for-position-1-against-checkpoint-0.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-033-returns-true-for-position-1-against-checkpoint-0.sdp.md deleted file mode 100644 index f07ea46c..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-033-returns-true-for-position-1-against-checkpoint-0.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.returns-true-for-position-1-against-checkpoint-0 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Returns true for position 1 against checkpoint 0 - -## Intent - -- outcome: Executable scenario: Returns true for position 1 against checkpoint 0 - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then shouldProcessAgentEvent with position 1 and checkpoint 0 returns true -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-034-returns-false-for-position-0-against-checkpoint-0.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-034-returns-false-for-position-0-against-checkpoint-0.sdp.md deleted file mode 100644 index 1442e008..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-034-returns-false-for-position-0-against-checkpoint-0.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.returns-false-for-position-0-against-checkpoint-0 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Returns false for position 0 against checkpoint 0 - -## Intent - -- outcome: Executable scenario: Returns false for position 0 against checkpoint 0 - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then shouldProcessAgentEvent with position 0 and checkpoint 0 returns false -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-035-handles-large-position-values.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-035-handles-large-position-values.sdp.md deleted file mode 100644 index f0c29ba9..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-035-handles-large-position-values.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.handles-large-position-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Handles large position values - -## Intent - -- outcome: Executable scenario: Handles large position values - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then shouldProcessAgentEvent with position 1000001 and checkpoint 1000000 returns true -And shouldProcessAgentEvent with position 1000000 and checkpoint 1000000 returns false -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-036-processes-sequential-events-correctly.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-036-processes-sequential-events-correctly.sdp.md deleted file mode 100644 index b3d8cf69..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-036-processes-sequential-events-correctly.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.processes-sequential-events-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Processes sequential events correctly - -## Intent - -- outcome: Executable scenario: Processes sequential events correctly - -```gwt -Given the module is imported from platform-core -When processing sequential events starting from sentinel -1 -Then each event is accepted and duplicates are rejected -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-037-handles-gaps-in-event-positions.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-037-handles-gaps-in-event-positions.sdp.md deleted file mode 100644 index 76d2c3a0..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-037-handles-gaps-in-event-positions.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.handles-gaps-in-event-positions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Handles gaps in event positions - -## Intent - -- outcome: Executable scenario: Handles gaps in event positions - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then shouldProcessAgentEvent with position 150 and checkpoint 100 returns true -And shouldProcessAgentEvent with position 200 and checkpoint 150 returns true -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-038-is-agent-active-returns-true-only-for-active-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-038-is-agent-active-returns-true-only-for-active-status.sdp.md deleted file mode 100644 index c262eb06..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-038-is-agent-active-returns-true-only-for-active-status.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.is-agent-active-returns-true-only-for-active-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# isAgentActive returns true only for active status - -## Intent - -- outcome: Executable scenario: isAgentActive returns true only for active status - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isAgentActive returns the following for each status: -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-039-is-agent-paused-returns-true-only-for-paused-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-039-is-agent-paused-returns-true-only-for-paused-status.sdp.md deleted file mode 100644 index 5c32ecca..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-039-is-agent-paused-returns-true-only-for-paused-status.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.is-agent-paused-returns-true-only-for-paused-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# isAgentPaused returns true only for paused status - -## Intent - -- outcome: Executable scenario: isAgentPaused returns true only for paused status - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isAgentPaused returns the following for each status: -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-040-is-agent-stopped-returns-true-only-for-stopped-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-040-is-agent-stopped-returns-true-only-for-stopped-status.sdp.md deleted file mode 100644 index 3e06ed9e..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-040-is-agent-stopped-returns-true-only-for-stopped-status.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.is-agent-stopped-returns-true-only-for-stopped-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# isAgentStopped returns true only for stopped status - -## Intent - -- outcome: Executable scenario: isAgentStopped returns true only for stopped status - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isAgentStopped returns the following for each status: -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-041-returns-true-for-a-valid-checkpoint.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-041-returns-true-for-a-valid-checkpoint.sdp.md deleted file mode 100644 index fff3d85c..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-041-returns-true-for-a-valid-checkpoint.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.returns-true-for-a-valid-checkpoint -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Returns true for a valid checkpoint - -## Intent - -- outcome: Executable scenario: Returns true for a valid checkpoint - -```gwt -Given the module is imported from platform-core -And a test checkpoint with defaults -When the scenario runs -Then isValidAgentCheckpoint returns true -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-042-returns-true-for-checkpoint-with-sentinel-position.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-042-returns-true-for-checkpoint-with-sentinel-position.sdp.md deleted file mode 100644 index 9290c56a..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-042-returns-true-for-checkpoint-with-sentinel-position.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.returns-true-for-checkpoint-with-sentinel-position -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Returns true for checkpoint with sentinel position - -## Intent - -- outcome: Executable scenario: Returns true for checkpoint with sentinel position - -```gwt -Given the module is imported from platform-core -And a test checkpoint with lastProcessedPosition -1 -When the scenario runs -Then isValidAgentCheckpoint returns true -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-043-returns-false-for-null-undefined-and-empty-object.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-043-returns-false-for-null-undefined-and-empty-object.sdp.md deleted file mode 100644 index 9a613b88..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-043-returns-false-for-null-undefined-and-empty-object.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.returns-false-for-null-undefined-and-empty-object -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Returns false for null, undefined, and empty object - -## Intent - -- outcome: Executable scenario: Returns false for null, undefined, and empty object - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isValidAgentCheckpoint returns false for: -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-044-returns-false-for-non-object-values.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-044-returns-false-for-non-object-values.sdp.md deleted file mode 100644 index 1bdd5543..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-044-returns-false-for-non-object-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.returns-false-for-non-object-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Returns false for non-object values - -## Intent - -- outcome: Executable scenario: Returns false for non-object values - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isValidAgentCheckpoint returns false for non-objects: -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-045-returns-false-for-checkpoint-with-invalid-status.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-045-returns-false-for-checkpoint-with-invalid-status.sdp.md deleted file mode 100644 index 14f55970..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-045-returns-false-for-checkpoint-with-invalid-status.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.returns-false-for-checkpoint-with-invalid-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Returns false for checkpoint with invalid status - -## Intent - -- outcome: Executable scenario: Returns false for checkpoint with invalid status - -```gwt -Given the module is imported from platform-core -And a test checkpoint with status "invalid" -When the scenario runs -Then isValidAgentCheckpoint returns false -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-046-returns-false-for-checkpoint-with-position-below-1.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-046-returns-false-for-checkpoint-with-position-below-1.sdp.md deleted file mode 100644 index f2f5ce37..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-046-returns-false-for-checkpoint-with-position-below-1.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.returns-false-for-checkpoint-with-position-below-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Returns false for checkpoint with position below -1 - -## Intent - -- outcome: Executable scenario: Returns false for checkpoint with position below -1 - -```gwt -Given the module is imported from platform-core -And a test checkpoint with lastProcessedPosition -2 -When the scenario runs -Then isValidAgentCheckpoint returns false -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-047-returns-false-for-checkpoint-with-negative-events-processed.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-047-returns-false-for-checkpoint-with-negative-events-processed.sdp.md deleted file mode 100644 index beb22b14..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-047-returns-false-for-checkpoint-with-negative-events-processed.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.returns-false-for-checkpoint-with-negative-events-processed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Returns false for checkpoint with negative eventsProcessed - -## Intent - -- outcome: Executable scenario: Returns false for checkpoint with negative eventsProcessed - -```gwt -Given the module is imported from platform-core -And a test checkpoint with eventsProcessed -1 -When the scenario runs -Then isValidAgentCheckpoint returns false -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-048-new-agent-processes-first-events.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-048-new-agent-processes-first-events.sdp.md deleted file mode 100644 index 0cd00f98..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-048-new-agent-processes-first-events.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.new-agent-processes-first-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# New agent processes first events - -## Intent - -- outcome: Executable scenario: New agent processes first events - -```gwt -Given the module is imported from platform-core -When I create an initial checkpoint for agent "new-agent" with subscription "sub-001" and I process event at position 0 with id "evt_0" and I process event at position 1 with id "evt_1" -Then the checkpoint lastProcessedPosition is -1 -And the checkpoint eventsProcessed is 0 -And isAgentActive returns true for the checkpoint -And the checkpoint lastProcessedPosition is 0 -And the checkpoint eventsProcessed is 1 -And the checkpoint lastProcessedPosition is 1 -And the checkpoint eventsProcessed is 2 -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-049-agent-pause-and-resume-preserves-position.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-049-agent-pause-and-resume-preserves-position.sdp.md deleted file mode 100644 index 0e9a3652..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-049-agent-pause-and-resume-preserves-position.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.agent-pause-and-resume-preserves-position -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Agent pause and resume preserves position - -## Intent - -- outcome: Executable scenario: Agent pause and resume preserves position - -```gwt -Given the module is imported from platform-core -And a test checkpoint with status "active" and lastProcessedPosition 100 and eventsProcessed 100 -When I apply an update with status "paused" and I apply an update with status "active" -Then isAgentPaused returns true for the checkpoint -And isAgentActive returns false for the checkpoint -And the checkpoint lastProcessedPosition is 100 -And the checkpoint eventsProcessed is 100 -And isAgentActive returns true for the checkpoint -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-050-agent-restart-recovery-skips-already-processed-events.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-050-agent-restart-recovery-skips-already-processed-events.sdp.md deleted file mode 100644 index d3817252..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-050-agent-restart-recovery-skips-already-processed-events.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.agent-restart-recovery-skips-already-processed-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Agent restart recovery skips already-processed events - -## Intent - -- outcome: Executable scenario: Agent restart recovery skips already-processed events - -```gwt -Given the module is imported from platform-core -And a test checkpoint with lastProcessedPosition 500 and lastEventId "evt_500" and eventsProcessed 500 -When the scenario runs -Then shouldProcessAgentEvent with position 500 and checkpoint 500 returns false -And shouldProcessAgentEvent with position 499 and checkpoint 500 returns false -And shouldProcessAgentEvent with position 501 and checkpoint 500 returns true -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.examples/s-051-duplicate-event-delivery-is-idempotent.sdp.md b/specs/behavior/platform-core/agent/checkpoint.examples/s-051-duplicate-event-delivery-is-idempotent.sdp.md deleted file mode 100644 index 8fa90cee..00000000 --- a/specs/behavior/platform-core/agent/checkpoint.examples/s-051-duplicate-event-delivery-is-idempotent.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.checkpoint.duplicate-event-delivery-is-idempotent -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.checkpoint ---- -# Duplicate event delivery is idempotent - -## Intent - -- outcome: Executable scenario: Duplicate event delivery is idempotent - -```gwt -Given the module is imported from platform-core -And a test checkpoint with lastProcessedPosition 100 and eventsProcessed 100 -When I process event at position 101 with id "evt_101" -Then shouldProcessAgentEvent with position 101 and checkpoint 101 returns false -And the checkpoint eventsProcessed is 101 -And shouldProcessAgentEvent with position 102 and checkpoint 101 returns true -``` diff --git a/specs/behavior/platform-core/agent/checkpoint.sdp.md b/specs/behavior/platform-core/agent/checkpoint.sdp.md index 10661812..7895f027 100644 --- a/specs/behavior/platform-core/agent/checkpoint.sdp.md +++ b/specs/behavior/platform-core/agent/checkpoint.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.checkpoint kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: Agent Checkpoint +- outcome: Manage agent checkpoints with creation, position tracking, idempotency guards, status helpers, and schema validation. +- value: Agents skip duplicate and out-of-order events and can pause, resume, and recover from a known position. ## Behavior diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-001-routes-command-through-registry-orchestrator-records-audit-and-updates-sta.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-001-routes-command-through-registry-orchestrator-records-audit-and-updates-sta.sdp.md deleted file mode 100644 index 3b8e3551..00000000 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-001-routes-command-through-registry-orchestrator-records-audit-and-updates-sta.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-bridge.routes-command-through-registry-orchestrator-records-audit-and-updates-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-bridge ---- -# Routes command through registry, orchestrator, records audit, and updates status - -## Intent - -- outcome: Executable scenario: Routes command through registry, orchestrator, records audit, and updates status - -```gwt -Given the module is imported from platform-core -And a standard mock component -And a mock orchestrator that succeeds -And a mock registry containing "SuggestCustomerOutreach" -And a standard route map -When the bridge handler is created and invoked with standard args -Then the orchestrator was called once with the correct arguments -And an AgentCommandRouted audit event was recorded with: -And the decision status was updated to "completed" -``` diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-002-records-agent-command-routing-failed-audit-and-sets-status-to-failed-for-u.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-002-records-agent-command-routing-failed-audit-and-sets-status-to-failed-for-u.sdp.md deleted file mode 100644 index ada40008..00000000 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-002-records-agent-command-routing-failed-audit-and-sets-status-to-failed-for-u.sdp.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-bridge.records-agent-command-routing-failed-audit-and-sets-status-to-failed-for-unknown -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-bridge ---- -# Records AgentCommandRoutingFailed audit and sets status to failed for unknown route - -## Intent - -- outcome: Executable scenario: Records AgentCommandRoutingFailed audit and sets status to failed for unknown route - -```gwt -Given the module is imported from platform-core -And a standard mock component -And a mock orchestrator that succeeds -And a mock registry containing "SuggestCustomerOutreach" -And a standard route map -When the bridge handler is invoked with commandType "NonExistentCommand" -Then the orchestrator was not called -And an AgentCommandRoutingFailed audit event was recorded for agent "test-agent" decision "dec_test_42" -And the audit payload code is "UNKNOWN_ROUTE" -And the decision status was updated to "failed" -``` diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-003-records-command-not-registered-error-when-registry-does-not-contain-the-co.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-003-records-command-not-registered-error-when-registry-does-not-contain-the-co.sdp.md deleted file mode 100644 index 8cc4012e..00000000 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-003-records-command-not-registered-error-when-registry-does-not-contain-the-co.sdp.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-bridge.records-command-not-registered-error-when-registry-does-not-contain-the-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-bridge ---- -# Records COMMAND_NOT_REGISTERED error when registry does not contain the command - -## Intent - -- outcome: Executable scenario: Records COMMAND_NOT_REGISTERED error when registry does not contain the command - -```gwt -Given the module is imported from platform-core -And a standard mock component -And a mock orchestrator that succeeds -And an empty mock registry -And a standard route map -When the bridge handler is created and invoked with standard args -Then the orchestrator was not called -And an AgentCommandRoutingFailed audit event was recorded -And the audit payload code is "COMMAND_NOT_REGISTERED" -And the audit payload error contains "not registered in CommandRegistry" -And the decision status was updated to "failed" -``` diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-004-records-invalid-transform-error-when-to-orchestrator-args-throws.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-004-records-invalid-transform-error-when-to-orchestrator-args-throws.sdp.md deleted file mode 100644 index 1d913e38..00000000 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-004-records-invalid-transform-error-when-to-orchestrator-args-throws.sdp.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-bridge.records-invalid-transform-error-when-to-orchestrator-args-throws -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-bridge ---- -# Records INVALID_TRANSFORM error when toOrchestratorArgs throws - -## Intent - -- outcome: Executable scenario: Records INVALID_TRANSFORM error when toOrchestratorArgs throws - -```gwt -Given the module is imported from platform-core -And a standard mock component -And a mock orchestrator that succeeds -And a mock registry containing "SuggestCustomerOutreach" -And a route map with a throwing transform for "SuggestCustomerOutreach" -When the bridge handler is created and invoked with standard args -Then the orchestrator was not called -And an AgentCommandRoutingFailed audit event was recorded -And the audit payload code is "INVALID_TRANSFORM" -And the audit payload error contains "Transform failed" -And the audit payload error contains "Missing required field: customerId" -And the decision status was updated to "failed" -``` diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-005-records-agent-command-routing-failed-audit-and-sets-status-to-failed-on-or.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-005-records-agent-command-routing-failed-audit-and-sets-status-to-failed-on-or.sdp.md deleted file mode 100644 index d5ac04b9..00000000 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-005-records-agent-command-routing-failed-audit-and-sets-status-to-failed-on-or.sdp.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-bridge.records-agent-command-routing-failed-audit-and-sets-status-to-failed-on-orchestr -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-bridge ---- -# Records AgentCommandRoutingFailed audit and sets status to failed on orchestrator error - -## Intent - -- outcome: Executable scenario: Records AgentCommandRoutingFailed audit and sets status to failed on orchestrator error - -```gwt -Given the module is imported from platform-core -And a standard mock component -And a mock orchestrator that throws "Orchestrator timeout" -And a mock registry containing "SuggestCustomerOutreach" -And a standard route map -When the bridge handler is created and invoked with standard args -Then the orchestrator was called once -And an AgentCommandRoutingFailed audit event was recorded for agent "test-agent" decision "dec_test_42" -And the audit payload error is "Orchestrator timeout" -And the decision status was updated to "failed" with error "Orchestrator timeout" -``` diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-006-does-not-throw-when-audit-recording-fails-on-success-path.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-006-does-not-throw-when-audit-recording-fails-on-success-path.sdp.md deleted file mode 100644 index a92b4a26..00000000 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-006-does-not-throw-when-audit-recording-fails-on-success-path.sdp.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-bridge.does-not-throw-when-audit-recording-fails-on-success-path -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-bridge ---- -# Does not throw when audit recording fails on success path - -## Intent - -- outcome: Executable scenario: Does not throw when audit recording fails on success path - -```gwt -Given the module is imported from platform-core -And a standard mock component -And a mock orchestrator that succeeds -And a mock registry containing "SuggestCustomerOutreach" -And a standard route map -And the audit mutation will throw "Audit store unavailable" -And a mock logger is provided -When the bridge handler is created and invoked with standard args -Then the handler resolves without throwing -And the orchestrator was called once -And the logger recorded an error "Failed to record AgentCommandRouted audit" with agentId "test-agent" and error "Audit store unavailable" -``` diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-007-does-not-throw-when-update-status-mutation-fails-on-success-path.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-007-does-not-throw-when-update-status-mutation-fails-on-success-path.sdp.md deleted file mode 100644 index 33fd033a..00000000 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-007-does-not-throw-when-update-status-mutation-fails-on-success-path.sdp.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-bridge.does-not-throw-when-update-status-mutation-fails-on-success-path -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-bridge ---- -# Does not throw when updateStatus mutation fails on success path - -## Intent - -- outcome: Executable scenario: Does not throw when updateStatus mutation fails on success path - -```gwt -Given the module is imported from platform-core -And a standard mock component -And a mock orchestrator that succeeds -And a mock registry containing "SuggestCustomerOutreach" -And a standard route map -And the updateStatus mutation will throw "Status update failed" -When the bridge handler is created and invoked with standard args -Then the handler resolves without throwing -And the orchestrator was called once -And the audit mutation was still called -``` diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-008-skips-status-update-without-error-when-update-status-is-undefined-on-succe.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-008-skips-status-update-without-error-when-update-status-is-undefined-on-succe.sdp.md deleted file mode 100644 index ed2506ae..00000000 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-008-skips-status-update-without-error-when-update-status-is-undefined-on-succe.sdp.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-bridge.skips-status-update-without-error-when-update-status-is-undefined-on-success-pat -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-bridge ---- -# Skips status update without error when updateStatus is undefined on success path - -## Intent - -- outcome: Executable scenario: Skips status update without error when updateStatus is undefined on success path - -```gwt -Given the module is imported from platform-core -And a mock component without updateStatus -And a mock orchestrator that succeeds -And a mock registry containing "SuggestCustomerOutreach" -And a standard route map -When the bridge handler is created and invoked with standard args -Then the handler resolves without throwing -And the orchestrator was called once -And the audit mutation was still called -And exactly 1 mutation call was made -``` diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-009-skips-status-update-on-routing-failure-when-update-status-is-undefined.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-009-skips-status-update-on-routing-failure-when-update-status-is-undefined.sdp.md deleted file mode 100644 index 015dcd8c..00000000 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-009-skips-status-update-on-routing-failure-when-update-status-is-undefined.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-bridge.skips-status-update-on-routing-failure-when-update-status-is-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-bridge ---- -# Skips status update on routing failure when updateStatus is undefined - -## Intent - -- outcome: Executable scenario: Skips status update on routing failure when updateStatus is undefined - -```gwt -Given the module is imported from platform-core -And a mock component without updateStatus -And a mock orchestrator that succeeds -And a mock registry containing "SuggestCustomerOutreach" -And a standard route map -When the bridge handler is invoked with commandType "NonExistent" -Then the handler resolves without throwing -And exactly 1 mutation call was made -And the only mutation call was the audit record -``` diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-010-includes-pattern-id-in-audit-event-payload-when-present-in-args.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-010-includes-pattern-id-in-audit-event-payload-when-present-in-args.sdp.md deleted file mode 100644 index 7d8e378a..00000000 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-010-includes-pattern-id-in-audit-event-payload-when-present-in-args.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-bridge.includes-pattern-id-in-audit-event-payload-when-present-in-args -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-bridge ---- -# Includes patternId in audit event payload when present in args - -## Intent - -- outcome: Executable scenario: Includes patternId in audit event payload when present in args - -```gwt -Given the module is imported from platform-core -And a standard mock component -And a mock orchestrator that succeeds -And a mock registry containing "SuggestCustomerOutreach" -And a standard route map -When the bridge handler is invoked with patternId "churn-risk-v2" -Then an AgentCommandRouted audit event was recorded with patternId "churn-risk-v2" -``` diff --git a/specs/behavior/platform-core/agent/command-bridge.examples/s-011-does-not-include-pattern-id-in-audit-payload-when-absent-from-args.sdp.md b/specs/behavior/platform-core/agent/command-bridge.examples/s-011-does-not-include-pattern-id-in-audit-payload-when-absent-from-args.sdp.md deleted file mode 100644 index 4b117618..00000000 --- a/specs/behavior/platform-core/agent/command-bridge.examples/s-011-does-not-include-pattern-id-in-audit-payload-when-absent-from-args.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-bridge.does-not-include-pattern-id-in-audit-payload-when-absent-from-args -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-bridge ---- -# Does not include patternId in audit payload when absent from args - -## Intent - -- outcome: Executable scenario: Does not include patternId in audit payload when absent from args - -```gwt -Given the module is imported from platform-core -And a standard mock component -And a mock orchestrator that succeeds -And a mock registry containing "SuggestCustomerOutreach" -And a standard route map -When the bridge handler is created and invoked with standard args -Then an AgentCommandRouted audit event was recorded without patternId -``` diff --git a/specs/behavior/platform-core/agent/command-bridge.sdp.md b/specs/behavior/platform-core/agent/command-bridge.sdp.md index 11cce1dc..3d4c68c2 100644 --- a/specs/behavior/platform-core/agent/command-bridge.sdp.md +++ b/specs/behavior/platform-core/agent/command-bridge.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.command-bridge kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: Agent Command Bridge Handler +- outcome: Look up the route, validate registry membership, transform args, call the orchestrator, record audit events, and update decision status. +- value: Failures at each stage produce structured audit trails without propagating to the caller. ## Behavior diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-001-emit-recommendation-command.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-001-emit-recommendation-command.sdp.md deleted file mode 100644 index bf2193b3..00000000 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-001-emit-recommendation-command.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-emission.emit-recommendation-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-emission ---- -# Emit recommendation command - -## Intent - -- outcome: Executable scenario: Emit recommendation command - -```gwt -Given the agent module is imported from platform-core -And the command emission utilities are available -And a detected ChurnRisk pattern -When agent emits SuggestCustomerOutreach command -Then command is delivered to Command Bus -And command has standard metadata -``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-002-command-includes-correlation-id.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-002-command-includes-correlation-id.sdp.md deleted file mode 100644 index 5db85379..00000000 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-002-command-includes-correlation-id.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-emission.command-includes-correlation-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-emission ---- -# Command includes correlation ID - -## Intent - -- outcome: Executable scenario: Command includes correlation ID - -```gwt -Given the agent module is imported from platform-core -And the command emission utilities are available -And pattern detected from correlated events -When agent emits command -Then command.correlationId traces back to triggering events -``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-003-command-includes-agent-bc-identifier.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-003-command-includes-agent-bc-identifier.sdp.md deleted file mode 100644 index fb658062..00000000 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-003-command-includes-agent-bc-identifier.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-emission.command-includes-agent-bc-identifier -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-emission ---- -# Command includes agent BC identifier - -## Intent - -- outcome: Executable scenario: Command includes agent BC identifier - -```gwt -Given the agent module is imported from platform-core -And the command emission utilities are available -And agent BC "churn-detector" -When agent emits command -Then command.source equals "agent:churn-detector" -``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-004-command-includes-reason.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-004-command-includes-reason.sdp.md deleted file mode 100644 index 227a3c65..00000000 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-004-command-includes-reason.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-emission.command-includes-reason -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-emission ---- -# Command includes reason - -## Intent - -- outcome: Executable scenario: Command includes reason - -```gwt -Given the agent module is imported from platform-core -And the command emission utilities are available -And agent decision with reasoning -When agent emits command -Then command.metadata.reason describes why action was taken -``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-005-command-includes-confidence.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-005-command-includes-confidence.sdp.md deleted file mode 100644 index f5d8bda9..00000000 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-005-command-includes-confidence.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-emission.command-includes-confidence -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-emission ---- -# Command includes confidence - -## Intent - -- outcome: Executable scenario: Command includes confidence - -```gwt -Given the agent module is imported from platform-core -And the command emission utilities are available -And pattern detected with 85% confidence -When agent emits command -Then command.metadata.confidence equals 0.85 -``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-006-command-includes-triggering-events.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-006-command-includes-triggering-events.sdp.md deleted file mode 100644 index a89aa541..00000000 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-006-command-includes-triggering-events.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-emission.command-includes-triggering-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-emission ---- -# Command includes triggering events - -## Intent - -- outcome: Executable scenario: Command includes triggering events - -```gwt -Given the agent module is imported from platform-core -And the command emission utilities are available -And pattern triggered by events E1, E2, E3 -When agent emits command -Then command.metadata.eventIds equals ["E1", "E2", "E3"] -``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-007-command-includes-llm-context.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-007-command-includes-llm-context.sdp.md deleted file mode 100644 index 3cfd9ab9..00000000 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-007-command-includes-llm-context.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-emission.command-includes-llm-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-emission ---- -# Command includes LLM context - -## Intent - -- outcome: Executable scenario: Command includes LLM context - -```gwt -Given the agent module is imported from platform-core -And the command emission utilities are available -And LLM was used for pattern analysis -When agent emits command -Then command.metadata.llmContext includes model, tokens, duration -``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-008-reject-command-without-reason.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-008-reject-command-without-reason.sdp.md deleted file mode 100644 index 82bfb65b..00000000 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-008-reject-command-without-reason.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-emission.reject-command-without-reason -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-emission ---- -# Reject command without reason - -## Intent - -- outcome: Executable scenario: Reject command without reason - -```gwt -Given the agent module is imported from platform-core -And the command emission utilities are available -And agent attempting to emit command -When reason is not provided -Then an error is thrown with code "REASON_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-009-reject-command-without-confidence.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-009-reject-command-without-confidence.sdp.md deleted file mode 100644 index 13a7b13d..00000000 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-009-reject-command-without-confidence.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-emission.reject-command-without-confidence -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-emission ---- -# Reject command without confidence - -## Intent - -- outcome: Executable scenario: Reject command without confidence - -```gwt -Given the agent module is imported from platform-core -And the command emission utilities are available -And agent attempting to emit command -When confidence is not provided -Then an error is thrown with code "CONFIDENCE_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-010-reject-confidence-outside-valid-range.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-010-reject-confidence-outside-valid-range.sdp.md deleted file mode 100644 index 7c244cc5..00000000 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-010-reject-confidence-outside-valid-range.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-emission.reject-confidence-outside-valid-range -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-emission ---- -# Reject confidence outside valid range - -## Intent - -- outcome: Executable scenario: Reject confidence outside valid range - -```gwt -Given the agent module is imported from platform-core -And the command emission utilities are available -And agent attempting to emit command with confidence 1.5 -When emitCommand is called -Then an error is thrown with code "INVALID_CONFIDENCE" -And error message mentions "must be between 0 and 1" -``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-011-llm-rate-limit-is-handled-with-exponential-backoff.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-011-llm-rate-limit-is-handled-with-exponential-backoff.sdp.md deleted file mode 100644 index c33a6563..00000000 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-011-llm-rate-limit-is-handled-with-exponential-backoff.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-emission.llm-rate-limit-is-handled-with-exponential-backoff -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-emission ---- -# LLM rate limit is handled with exponential backoff - -## Intent - -- outcome: Executable scenario: LLM rate limit is handled with exponential backoff - -```gwt -Given the agent module is imported from platform-core -And the command emission utilities are available -And an agent attempting LLM analysis -And LLM API returns 429 rate limit error -When agent retries the analysis -Then retry uses exponential backoff -And event processing queue is not blocked -And retry attempts are logged for observability -``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-012-llm-timeout-falls-back-to-rule-based-emission.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-012-llm-timeout-falls-back-to-rule-based-emission.sdp.md deleted file mode 100644 index d9096cc5..00000000 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-012-llm-timeout-falls-back-to-rule-based-emission.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-emission.llm-timeout-falls-back-to-rule-based-emission -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-emission ---- -# LLM timeout falls back to rule-based emission - -## Intent - -- outcome: Executable scenario: LLM timeout falls back to rule-based emission - -```gwt -Given the agent module is imported from platform-core -And the command emission utilities are available -And an agent with LLM analysis configured -And LLM request times out after 30 seconds -When command emission is attempted -Then fallback to rule-based decision is used -And command includes fallback indicator in metadata -``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-013-emit-notification-command.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-013-emit-notification-command.sdp.md deleted file mode 100644 index 029618e8..00000000 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-013-emit-notification-command.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-emission.emit-notification-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-emission ---- -# Emit notification command - -## Intent - -- outcome: Executable scenario: Emit notification command - -```gwt -Given the agent module is imported from platform-core -And the command emission utilities are available -And low-risk pattern detected -When agent emits NotifyTeam command -Then command is processed as notification -``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-014-emit-action-command.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-014-emit-action-command.sdp.md deleted file mode 100644 index 2e1ef793..00000000 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-014-emit-action-command.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-emission.emit-action-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-emission ---- -# Emit action command - -## Intent - -- outcome: Executable scenario: Emit action command - -```gwt -Given the agent module is imported from platform-core -And the command emission utilities are available -And high-confidence pattern detected -When agent emits AutomatedResponse command -Then command triggers actual business action -``` diff --git a/specs/behavior/platform-core/agent/command-emission.examples/s-015-emit-escalation-command.sdp.md b/specs/behavior/platform-core/agent/command-emission.examples/s-015-emit-escalation-command.sdp.md deleted file mode 100644 index e12b2867..00000000 --- a/specs/behavior/platform-core/agent/command-emission.examples/s-015-emit-escalation-command.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-emission.emit-escalation-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-emission ---- -# Emit escalation command - -## Intent - -- outcome: Executable scenario: Emit escalation command - -```gwt -Given the agent module is imported from platform-core -And the command emission utilities are available -And critical pattern detected -When agent emits EscalateToHuman command -Then command creates review task for human -``` diff --git a/specs/behavior/platform-core/agent/command-emission.sdp.md b/specs/behavior/platform-core/agent/command-emission.sdp.md index 603e242b..e69b114f 100644 --- a/specs/behavior/platform-core/agent/command-emission.sdp.md +++ b/specs/behavior/platform-core/agent/command-emission.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.command-emission kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: agents to emit commands with explainability so that agent actions are traceable and auditable +- outcome: Emit agent commands with explainability metadata so that agent actions are traceable and auditable. +- value: Commands reach the Command Bus with required metadata, and LLM failures fall back or retry instead of emitting unexplained commands. ## Behavior diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-001-returns-the-route-when-command-type-exists-in-the-map.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-001-returns-the-route-when-command-type-exists-in-the-map.sdp.md deleted file mode 100644 index 6a315ee5..00000000 --- a/specs/behavior/platform-core/agent/command-router.examples/s-001-returns-the-route-when-command-type-exists-in-the-map.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-router.returns-the-route-when-command-type-exists-in-the-map -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-router ---- -# Returns the route when commandType exists in the map - -## Intent - -- outcome: Executable scenario: Returns the route when commandType exists in the map - -```gwt -Given a valid route map with "CancelOrder" and "SuggestCustomerOutreach" routes -When I get the route for "CancelOrder" -Then the route is defined -And the route has the following properties: -And the route toOrchestratorArgs is a function -``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-002-returns-undefined-when-command-type-does-not-exist-in-the-map.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-002-returns-undefined-when-command-type-does-not-exist-in-the-map.sdp.md deleted file mode 100644 index d279ac9c..00000000 --- a/specs/behavior/platform-core/agent/command-router.examples/s-002-returns-undefined-when-command-type-does-not-exist-in-the-map.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-router.returns-undefined-when-command-type-does-not-exist-in-the-map -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-router ---- -# Returns undefined when commandType does not exist in the map - -## Intent - -- outcome: Executable scenario: Returns undefined when commandType does not exist in the map - -```gwt -Given a valid route map with "CancelOrder" and "SuggestCustomerOutreach" routes -When I get the route for "NonExistentCommand" -Then the route is undefined -``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-003-returns-undefined-for-empty-route-map.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-003-returns-undefined-for-empty-route-map.sdp.md deleted file mode 100644 index 4a21f05e..00000000 --- a/specs/behavior/platform-core/agent/command-router.examples/s-003-returns-undefined-for-empty-route-map.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-router.returns-undefined-for-empty-route-map -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-router ---- -# Returns undefined for empty route map - -## Intent - -- outcome: Executable scenario: Returns undefined for empty route map - -```gwt -Given an empty route map -When I get the route for "AnyCommand" -Then the route is undefined -``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-004-produces-success-results-for-valid-routes.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-004-produces-success-results-for-valid-routes.sdp.md deleted file mode 100644 index 5e1a32c3..00000000 --- a/specs/behavior/platform-core/agent/command-router.examples/s-004-produces-success-results-for-valid-routes.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-router.produces-success-results-for-valid-routes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-router ---- -# Produces success results for valid routes - -## Intent - -- outcome: Executable scenario: Produces success results for valid routes - -```gwt -Given a valid route map with "CancelOrder" and "SuggestCustomerOutreach" routes -When I validate the routes -Then the validation results count is 2 -And all results are successful -And the successful command types include: -``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-005-returns-command-not-registered-error-for-missing-command-type.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-005-returns-command-not-registered-error-for-missing-command-type.sdp.md deleted file mode 100644 index 3dc1d5ae..00000000 --- a/specs/behavior/platform-core/agent/command-router.examples/s-005-returns-command-not-registered-error-for-missing-command-type.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-router.returns-command-not-registered-error-for-missing-command-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-router ---- -# Returns COMMAND_NOT_REGISTERED error for missing commandType - -## Intent - -- outcome: Executable scenario: Returns COMMAND_NOT_REGISTERED error for missing commandType - -```gwt -Given a route map with a "BadRoute" entry that has empty commandType -When I validate the routes -Then the validation results count is 1 -And the first result is a failure with code "COMMAND_NOT_REGISTERED" -And the failure message contains "BadRoute" -And the failure message contains "missing commandType" -``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-006-returns-unknown-route-error-for-missing-bounded-context.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-006-returns-unknown-route-error-for-missing-bounded-context.sdp.md deleted file mode 100644 index 757cc908..00000000 --- a/specs/behavior/platform-core/agent/command-router.examples/s-006-returns-unknown-route-error-for-missing-bounded-context.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-router.returns-unknown-route-error-for-missing-bounded-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-router ---- -# Returns UNKNOWN_ROUTE error for missing boundedContext - -## Intent - -- outcome: Executable scenario: Returns UNKNOWN_ROUTE error for missing boundedContext - -```gwt -Given a route map with a "NoBCRoute" entry that has empty boundedContext -When I validate the routes -Then the validation results count is 1 -And the first result is a failure with code "UNKNOWN_ROUTE" -And the failure message contains "NoBCRoute" -And the failure message contains "missing boundedContext" -``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-007-returns-invalid-transform-error-for-missing-to-orchestrator-args.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-007-returns-invalid-transform-error-for-missing-to-orchestrator-args.sdp.md deleted file mode 100644 index 9f71297f..00000000 --- a/specs/behavior/platform-core/agent/command-router.examples/s-007-returns-invalid-transform-error-for-missing-to-orchestrator-args.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-router.returns-invalid-transform-error-for-missing-to-orchestrator-args -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-router ---- -# Returns INVALID_TRANSFORM error for missing toOrchestratorArgs - -## Intent - -- outcome: Executable scenario: Returns INVALID_TRANSFORM error for missing toOrchestratorArgs - -```gwt -Given a route map with a "NoTransformRoute" entry that has undefined toOrchestratorArgs -When I validate the routes -Then the validation results count is 1 -And the first result is a failure with code "INVALID_TRANSFORM" -And the failure message contains "NoTransformRoute" -And the failure message contains "missing toOrchestratorArgs" -``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-008-returns-empty-array-for-empty-route-map.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-008-returns-empty-array-for-empty-route-map.sdp.md deleted file mode 100644 index 15ab28d4..00000000 --- a/specs/behavior/platform-core/agent/command-router.examples/s-008-returns-empty-array-for-empty-route-map.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-router.returns-empty-array-for-empty-route-map -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-router ---- -# Returns empty array for empty route map - -## Intent - -- outcome: Executable scenario: Returns empty array for empty route map - -```gwt -Given an empty route map -When I validate the routes -Then the validation results are empty -``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-009-validates-mixed-valid-and-invalid-routes-independently.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-009-validates-mixed-valid-and-invalid-routes-independently.sdp.md deleted file mode 100644 index 868c38fc..00000000 --- a/specs/behavior/platform-core/agent/command-router.examples/s-009-validates-mixed-valid-and-invalid-routes-independently.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-router.validates-mixed-valid-and-invalid-routes-independently -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-router ---- -# Validates mixed valid and invalid routes independently - -## Intent - -- outcome: Executable scenario: Validates mixed valid and invalid routes independently - -```gwt -Given a route map with a valid "ValidRoute" and an invalid "InvalidRoute" with empty commandType -When I validate the routes -Then the validation results count is 2 -And the success count is 1 -And the failure count is 1 -``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-010-contains-all-expected-error-codes.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-010-contains-all-expected-error-codes.sdp.md deleted file mode 100644 index a609febc..00000000 --- a/specs/behavior/platform-core/agent/command-router.examples/s-010-contains-all-expected-error-codes.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-router.contains-all-expected-error-codes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-router ---- -# Contains all expected error codes - -## Intent - -- outcome: Executable scenario: Contains all expected error codes - -```gwt -Given the feature fixture is in place -When the scenario runs -Then COMMAND_ROUTING_ERROR_CODES contains the following codes: -``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-011-has-exactly-4-error-codes.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-011-has-exactly-4-error-codes.sdp.md deleted file mode 100644 index e734ba55..00000000 --- a/specs/behavior/platform-core/agent/command-router.examples/s-011-has-exactly-4-error-codes.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-router.has-exactly-4-error-codes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-router ---- -# Has exactly 4 error codes - -## Intent - -- outcome: Executable scenario: Has exactly 4 error codes - -```gwt -Given the feature fixture is in place -When the scenario runs -Then COMMAND_ROUTING_ERROR_CODES has exactly 4 entries -``` diff --git a/specs/behavior/platform-core/agent/command-router.examples/s-012-values-are-string-constants-matching-their-keys.sdp.md b/specs/behavior/platform-core/agent/command-router.examples/s-012-values-are-string-constants-matching-their-keys.sdp.md deleted file mode 100644 index 9ce67665..00000000 --- a/specs/behavior/platform-core/agent/command-router.examples/s-012-values-are-string-constants-matching-their-keys.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.command-router.values-are-string-constants-matching-their-keys -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.command-router ---- -# Values are string constants matching their keys - -## Intent - -- outcome: Executable scenario: Values are string constants matching their keys - -```gwt -Given the feature fixture is in place -When the scenario runs -Then every COMMAND_ROUTING_ERROR_CODES value is a non-empty string matching its key -``` diff --git a/specs/behavior/platform-core/agent/command-router.sdp.md b/specs/behavior/platform-core/agent/command-router.sdp.md index 2619f615..513c3c37 100644 --- a/specs/behavior/platform-core/agent/command-router.sdp.md +++ b/specs/behavior/platform-core/agent/command-router.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.command-router kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: Agent Command Router +- outcome: Look up routes by commandType, validate route-map integrity, and enumerate COMMAND_ROUTING_ERROR_CODES. +- value: Invalid routes fail with a specific code instead of reaching the orchestrator. ## Behavior diff --git a/specs/behavior/platform-core/agent/commands.examples/s-001-contains-all-expected-error-codes.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-001-contains-all-expected-error-codes.sdp.md deleted file mode 100644 index 2afc94f7..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-001-contains-all-expected-error-codes.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.contains-all-expected-error-codes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Contains all expected error codes - -## Intent - -- outcome: Executable scenario: Contains all expected error codes - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then COMMAND_EMISSION_ERROR_CODES contains the following codes: -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-002-has-exactly-5-error-codes.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-002-has-exactly-5-error-codes.sdp.md deleted file mode 100644 index 23e4cb86..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-002-has-exactly-5-error-codes.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.has-exactly-5-error-codes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Has exactly 5 error codes - -## Intent - -- outcome: Executable scenario: Has exactly 5 error codes - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then COMMAND_EMISSION_ERROR_CODES has exactly 5 entries -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-003-accepts-valid-metadata.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-003-accepts-valid-metadata.sdp.md deleted file mode 100644 index 28e5376c..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-003-accepts-valid-metadata.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.accepts-valid-metadata -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Accepts valid metadata - -## Intent - -- outcome: Executable scenario: Accepts valid metadata - -```gwt -Given the module is imported from platform-core -When I parse valid metadata through the schema -Then the schema result is successful -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-004-accepts-metadata-with-optional-pattern-id.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-004-accepts-metadata-with-optional-pattern-id.sdp.md deleted file mode 100644 index c11955f7..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-004-accepts-metadata-with-optional-pattern-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.accepts-metadata-with-optional-pattern-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Accepts metadata with optional patternId - -## Intent - -- outcome: Executable scenario: Accepts metadata with optional patternId - -```gwt -Given the module is imported from platform-core -When I parse metadata with patternId "pattern-1" through the schema -Then the schema result is successful -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-005-accepts-metadata-with-optional-analysis.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-005-accepts-metadata-with-optional-analysis.sdp.md deleted file mode 100644 index 0e740ed4..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-005-accepts-metadata-with-optional-analysis.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.accepts-metadata-with-optional-analysis -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Accepts metadata with optional analysis - -## Intent - -- outcome: Executable scenario: Accepts metadata with optional analysis - -```gwt -Given the module is imported from platform-core -When I parse metadata with analysis through the schema -Then the schema result is successful -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-006-rejects-metadata-with-empty-agent-id.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-006-rejects-metadata-with-empty-agent-id.sdp.md deleted file mode 100644 index d3459fc8..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-006-rejects-metadata-with-empty-agent-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.rejects-metadata-with-empty-agent-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Rejects metadata with empty agentId - -## Intent - -- outcome: Executable scenario: Rejects metadata with empty agentId - -```gwt -Given the module is imported from platform-core -When I parse metadata with empty agentId through the schema -Then the schema result is a failure -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-007-rejects-metadata-with-empty-decision-id.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-007-rejects-metadata-with-empty-decision-id.sdp.md deleted file mode 100644 index f1f8b2c2..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-007-rejects-metadata-with-empty-decision-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.rejects-metadata-with-empty-decision-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Rejects metadata with empty decisionId - -## Intent - -- outcome: Executable scenario: Rejects metadata with empty decisionId - -```gwt -Given the module is imported from platform-core -When I parse metadata with empty decisionId through the schema -Then the schema result is a failure -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-008-rejects-metadata-with-confidence-below-0.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-008-rejects-metadata-with-confidence-below-0.sdp.md deleted file mode 100644 index c9fe6cc5..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-008-rejects-metadata-with-confidence-below-0.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.rejects-metadata-with-confidence-below-0 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Rejects metadata with confidence below 0 - -## Intent - -- outcome: Executable scenario: Rejects metadata with confidence below 0 - -```gwt -Given the module is imported from platform-core -When I parse metadata with confidence -0.1 through the schema -Then the schema result is a failure -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-009-rejects-metadata-with-confidence-above-1.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-009-rejects-metadata-with-confidence-above-1.sdp.md deleted file mode 100644 index aae74d56..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-009-rejects-metadata-with-confidence-above-1.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.rejects-metadata-with-confidence-above-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Rejects metadata with confidence above 1 - -## Intent - -- outcome: Executable scenario: Rejects metadata with confidence above 1 - -```gwt -Given the module is imported from platform-core -When I parse metadata with confidence 1.5 through the schema -Then the schema result is a failure -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-010-rejects-metadata-with-empty-reason.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-010-rejects-metadata-with-empty-reason.sdp.md deleted file mode 100644 index a494fdea..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-010-rejects-metadata-with-empty-reason.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.rejects-metadata-with-empty-reason -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Rejects metadata with empty reason - -## Intent - -- outcome: Executable scenario: Rejects metadata with empty reason - -```gwt -Given the module is imported from platform-core -When I parse metadata with empty reason through the schema -Then the schema result is a failure -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-011-rejects-metadata-with-empty-event-ids-array.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-011-rejects-metadata-with-empty-event-ids-array.sdp.md deleted file mode 100644 index 76589823..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-011-rejects-metadata-with-empty-event-ids-array.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.rejects-metadata-with-empty-event-ids-array -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Rejects metadata with empty eventIds array - -## Intent - -- outcome: Executable scenario: Rejects metadata with empty eventIds array - -```gwt -Given the module is imported from platform-core -When I parse metadata with empty eventIds through the schema -Then the schema result is a failure -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-012-accepts-confidence-at-boundaries-0-and-1.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-012-accepts-confidence-at-boundaries-0-and-1.sdp.md deleted file mode 100644 index a6de3e72..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-012-accepts-confidence-at-boundaries-0-and-1.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.accepts-confidence-at-boundaries-0-and-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Accepts confidence at boundaries 0 and 1 - -## Intent - -- outcome: Executable scenario: Accepts confidence at boundaries 0 and 1 - -```gwt -Given the module is imported from platform-core -When I parse metadata with confidence 0 through the schema -Then the schema result is successful -And I parse metadata with confidence 1 and it is also successful -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-013-accepts-valid-command.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-013-accepts-valid-command.sdp.md deleted file mode 100644 index ba9689fe..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-013-accepts-valid-command.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.accepts-valid-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Accepts valid command - -## Intent - -- outcome: Executable scenario: Accepts valid command - -```gwt -Given the module is imported from platform-core -When I parse a valid command through the command schema -Then the command schema result is successful -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-014-rejects-command-with-empty-type.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-014-rejects-command-with-empty-type.sdp.md deleted file mode 100644 index e23d264a..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-014-rejects-command-with-empty-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.rejects-command-with-empty-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Rejects command with empty type - -## Intent - -- outcome: Executable scenario: Rejects command with empty type - -```gwt -Given the module is imported from platform-core -When I parse a command with empty type through the command schema -Then the command schema result is a failure -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-015-accepts-command-with-any-payload-type.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-015-accepts-command-with-any-payload-type.sdp.md deleted file mode 100644 index d4eda70d..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-015-accepts-command-with-any-payload-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.accepts-command-with-any-payload-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Accepts command with any payload type - -## Intent - -- outcome: Executable scenario: Accepts command with any payload type - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then the command schema accepts all payload types: -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-016-rejects-command-with-invalid-metadata.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-016-rejects-command-with-invalid-metadata.sdp.md deleted file mode 100644 index 736cad77..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-016-rejects-command-with-invalid-metadata.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.rejects-command-with-invalid-metadata -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Rejects command with invalid metadata - -## Intent - -- outcome: Executable scenario: Rejects command with invalid metadata - -```gwt -Given the module is imported from platform-core -When I parse a command with invalid metadata through the command schema -Then the command schema result is a failure -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-017-returns-invalid-when-type-is-undefined.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-017-returns-invalid-when-type-is-undefined.sdp.md deleted file mode 100644 index f4a6d1bb..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-017-returns-invalid-when-type-is-undefined.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-invalid-when-type-is-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns invalid when type is undefined - -## Intent - -- outcome: Executable scenario: Returns invalid when type is undefined - -```gwt -Given the module is imported from platform-core -When I validate a command without type -Then validation result is invalid with code "INVALID_COMMAND_TYPE" -And validation message contains "non-empty string" -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-018-returns-invalid-when-type-is-empty-string.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-018-returns-invalid-when-type-is-empty-string.sdp.md deleted file mode 100644 index 1608bdcd..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-018-returns-invalid-when-type-is-empty-string.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-invalid-when-type-is-empty-string -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns invalid when type is empty string - -## Intent - -- outcome: Executable scenario: Returns invalid when type is empty string - -```gwt -Given the module is imported from platform-core -When I validate a command with empty type -Then validation result is invalid with code "INVALID_COMMAND_TYPE" -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-019-returns-invalid-when-type-is-whitespace-only.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-019-returns-invalid-when-type-is-whitespace-only.sdp.md deleted file mode 100644 index 369fe053..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-019-returns-invalid-when-type-is-whitespace-only.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-invalid-when-type-is-whitespace-only -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns invalid when type is whitespace only - -## Intent - -- outcome: Executable scenario: Returns invalid when type is whitespace only - -```gwt -Given the module is imported from platform-core -When I validate a command with whitespace-only type -Then validation result is invalid with code "INVALID_COMMAND_TYPE" -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-020-returns-invalid-when-confidence-is-undefined.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-020-returns-invalid-when-confidence-is-undefined.sdp.md deleted file mode 100644 index 6b078193..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-020-returns-invalid-when-confidence-is-undefined.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-invalid-when-confidence-is-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns invalid when confidence is undefined - -## Intent - -- outcome: Executable scenario: Returns invalid when confidence is undefined - -```gwt -Given the module is imported from platform-core -When I validate a command without confidence -Then validation result is invalid with code "CONFIDENCE_REQUIRED" -And validation message contains "Confidence score is required" -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-021-returns-invalid-when-confidence-is-below-0.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-021-returns-invalid-when-confidence-is-below-0.sdp.md deleted file mode 100644 index a9fb72ad..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-021-returns-invalid-when-confidence-is-below-0.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-invalid-when-confidence-is-below-0 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns invalid when confidence is below 0 - -## Intent - -- outcome: Executable scenario: Returns invalid when confidence is below 0 - -```gwt -Given the module is imported from platform-core -When I validate a command with confidence -0.1 -Then validation result is invalid with code "INVALID_CONFIDENCE" -And validation message contains "between 0 and 1" -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-022-returns-invalid-when-confidence-is-above-1.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-022-returns-invalid-when-confidence-is-above-1.sdp.md deleted file mode 100644 index 13103009..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-022-returns-invalid-when-confidence-is-above-1.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-invalid-when-confidence-is-above-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns invalid when confidence is above 1 - -## Intent - -- outcome: Executable scenario: Returns invalid when confidence is above 1 - -```gwt -Given the module is imported from platform-core -When I validate a command with confidence 1.5 -Then validation result is invalid with code "INVALID_CONFIDENCE" -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-023-accepts-confidence-at-boundary-values.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-023-accepts-confidence-at-boundary-values.sdp.md deleted file mode 100644 index c8dad97f..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-023-accepts-confidence-at-boundary-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.accepts-confidence-at-boundary-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Accepts confidence at boundary values - -## Intent - -- outcome: Executable scenario: Accepts confidence at boundary values - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then validation accepts confidence at boundaries: -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-024-returns-invalid-when-reason-is-undefined.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-024-returns-invalid-when-reason-is-undefined.sdp.md deleted file mode 100644 index dc77ff95..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-024-returns-invalid-when-reason-is-undefined.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-invalid-when-reason-is-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns invalid when reason is undefined - -## Intent - -- outcome: Executable scenario: Returns invalid when reason is undefined - -```gwt -Given the module is imported from platform-core -When I validate a command without reason -Then validation result is invalid with code "REASON_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-025-returns-invalid-when-reason-is-empty-string.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-025-returns-invalid-when-reason-is-empty-string.sdp.md deleted file mode 100644 index 472b2103..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-025-returns-invalid-when-reason-is-empty-string.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-invalid-when-reason-is-empty-string -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns invalid when reason is empty string - -## Intent - -- outcome: Executable scenario: Returns invalid when reason is empty string - -```gwt -Given the module is imported from platform-core -When I validate a command with empty reason -Then validation result is invalid with code "REASON_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-026-returns-invalid-when-reason-is-whitespace-only.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-026-returns-invalid-when-reason-is-whitespace-only.sdp.md deleted file mode 100644 index 9643e166..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-026-returns-invalid-when-reason-is-whitespace-only.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-invalid-when-reason-is-whitespace-only -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns invalid when reason is whitespace only - -## Intent - -- outcome: Executable scenario: Returns invalid when reason is whitespace only - -```gwt -Given the module is imported from platform-core -When I validate a command with whitespace-only reason -Then validation result is invalid with code "REASON_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-027-returns-invalid-when-event-ids-is-undefined.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-027-returns-invalid-when-event-ids-is-undefined.sdp.md deleted file mode 100644 index 6ec88413..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-027-returns-invalid-when-event-ids-is-undefined.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-invalid-when-event-ids-is-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns invalid when eventIds is undefined - -## Intent - -- outcome: Executable scenario: Returns invalid when eventIds is undefined - -```gwt -Given the module is imported from platform-core -When I validate a command without eventIds -Then validation result is invalid with code "EVENTS_REQUIRED" -And validation message contains "At least one triggering event" -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-028-returns-invalid-when-event-ids-is-empty-array.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-028-returns-invalid-when-event-ids-is-empty-array.sdp.md deleted file mode 100644 index 8ba18f77..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-028-returns-invalid-when-event-ids-is-empty-array.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-invalid-when-event-ids-is-empty-array -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns invalid when eventIds is empty array - -## Intent - -- outcome: Executable scenario: Returns invalid when eventIds is empty array - -```gwt -Given the module is imported from platform-core -When I validate a command with empty eventIds -Then validation result is invalid with code "EVENTS_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-029-accepts-single-event-id.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-029-accepts-single-event-id.sdp.md deleted file mode 100644 index e3764e47..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-029-accepts-single-event-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.accepts-single-event-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Accepts single event ID - -## Intent - -- outcome: Executable scenario: Accepts single event ID - -```gwt -Given the module is imported from platform-core -When I validate a command with a single event ID -Then the validation result is valid -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-030-accepts-multiple-event-i-ds.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-030-accepts-multiple-event-i-ds.sdp.md deleted file mode 100644 index ed2afb71..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-030-accepts-multiple-event-i-ds.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.accepts-multiple-event-i-ds -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Accepts multiple event IDs - -## Intent - -- outcome: Executable scenario: Accepts multiple event IDs - -```gwt -Given the module is imported from platform-core -When I validate a command with multiple event IDs -Then the validation result is valid -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-031-returns-valid-for-complete-command-args.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-031-returns-valid-for-complete-command-args.sdp.md deleted file mode 100644 index a66fa659..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-031-returns-valid-for-complete-command-args.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-valid-for-complete-command-args -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns valid for complete command args - -## Intent - -- outcome: Executable scenario: Returns valid for complete command args - -```gwt -Given the module is imported from platform-core -When I validate a complete command -Then the validation result is valid -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-032-creates-command-with-all-required-fields.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-032-creates-command-with-all-required-fields.sdp.md deleted file mode 100644 index d6f1c9be..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-032-creates-command-with-all-required-fields.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.creates-command-with-all-required-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Creates command with all required fields - -## Intent - -- outcome: Executable scenario: Creates command with all required fields - -```gwt -Given the module is imported from platform-core -When I create an emitted agent command with standard args -Then the created command has all expected fields -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-033-generates-unique-decision-id.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-033-generates-unique-decision-id.sdp.md deleted file mode 100644 index 703d9266..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-033-generates-unique-decision-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.generates-unique-decision-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Generates unique decisionId - -## Intent - -- outcome: Executable scenario: Generates unique decisionId - -```gwt -Given the module is imported from platform-core -When I create an emitted agent command with standard args -Then the decisionId matches the pattern "dec_UUIDv7" -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-034-includes-pattern-id-when-provided-in-options.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-034-includes-pattern-id-when-provided-in-options.sdp.md deleted file mode 100644 index 58ab09f5..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-034-includes-pattern-id-when-provided-in-options.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.includes-pattern-id-when-provided-in-options -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Includes patternId when provided in options - -## Intent - -- outcome: Executable scenario: Includes patternId when provided in options - -```gwt -Given the module is imported from platform-core -When I create an emitted agent command with patternId "churn-risk" -Then the created command metadata patternId is "churn-risk" -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-035-does-not-include-pattern-id-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-035-does-not-include-pattern-id-when-not-provided.sdp.md deleted file mode 100644 index 13b49a66..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-035-does-not-include-pattern-id-when-not-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.does-not-include-pattern-id-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Does not include patternId when not provided - -## Intent - -- outcome: Executable scenario: Does not include patternId when not provided - -```gwt -Given the module is imported from platform-core -When I create an emitted agent command without options -Then the created command metadata patternId is undefined -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-036-includes-analysis-when-provided-in-options.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-036-includes-analysis-when-provided-in-options.sdp.md deleted file mode 100644 index 44e6ec1f..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-036-includes-analysis-when-provided-in-options.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.includes-analysis-when-provided-in-options -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Includes analysis when provided in options - -## Intent - -- outcome: Executable scenario: Includes analysis when provided in options - -```gwt -Given the module is imported from platform-core -When I create an emitted agent command with analysis data -Then the created command metadata analysis matches the provided data -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-037-does-not-include-analysis-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-037-does-not-include-analysis-when-not-provided.sdp.md deleted file mode 100644 index 8602140b..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-037-does-not-include-analysis-when-not-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.does-not-include-analysis-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Does not include analysis when not provided - -## Intent - -- outcome: Executable scenario: Does not include analysis when not provided - -```gwt -Given the module is imported from platform-core -When I create an emitted agent command without options -Then the created command metadata analysis is undefined -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-038-includes-both-pattern-id-and-analysis-when-provided.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-038-includes-both-pattern-id-and-analysis-when-provided.sdp.md deleted file mode 100644 index 1d4570a7..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-038-includes-both-pattern-id-and-analysis-when-provided.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.includes-both-pattern-id-and-analysis-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Includes both patternId and analysis when provided - -## Intent - -- outcome: Executable scenario: Includes both patternId and analysis when provided - -```gwt -Given the module is imported from platform-core -When I create an emitted agent command with patternId "pattern-1" and analysis -Then the created command metadata patternId is "pattern-1" -And the created command metadata analysis matches the combined data -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-039-copies-event-ids-array-without-reference-sharing.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-039-copies-event-ids-array-without-reference-sharing.sdp.md deleted file mode 100644 index 58265ce6..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-039-copies-event-ids-array-without-reference-sharing.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.copies-event-ids-array-without-reference-sharing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Copies eventIds array without reference sharing - -## Intent - -- outcome: Executable scenario: Copies eventIds array without reference sharing - -```gwt -Given the module is imported from platform-core -When I create an emitted agent command and mutate the original eventIds -Then the created command eventIds are unchanged -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-040-throws-error-for-empty-type.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-040-throws-error-for-empty-type.sdp.md deleted file mode 100644 index 1ba5a5a1..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-040-throws-error-for-empty-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.throws-error-for-empty-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Throws error for empty type - -## Intent - -- outcome: Executable scenario: Throws error for empty type - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then creating a command with empty type throws "Command type must be a non-empty string" -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-041-throws-error-for-invalid-confidence.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-041-throws-error-for-invalid-confidence.sdp.md deleted file mode 100644 index daa6b876..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-041-throws-error-for-invalid-confidence.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.throws-error-for-invalid-confidence -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Throws error for invalid confidence - -## Intent - -- outcome: Executable scenario: Throws error for invalid confidence - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then creating a command with confidence 1.5 throws "Confidence must be between 0 and 1" -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-042-throws-error-for-empty-reason.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-042-throws-error-for-empty-reason.sdp.md deleted file mode 100644 index dd37cd07..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-042-throws-error-for-empty-reason.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.throws-error-for-empty-reason -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Throws error for empty reason - -## Intent - -- outcome: Executable scenario: Throws error for empty reason - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then creating a command with empty reason throws "Reason is required" -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-043-throws-error-for-empty-event-ids.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-043-throws-error-for-empty-event-ids.sdp.md deleted file mode 100644 index 40916fc7..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-043-throws-error-for-empty-event-ids.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.throws-error-for-empty-event-ids -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Throws error for empty eventIds - -## Intent - -- outcome: Executable scenario: Throws error for empty eventIds - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then creating a command with empty eventIds throws "At least one triggering event" -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-044-includes-error-code-in-thrown-message.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-044-includes-error-code-in-thrown-message.sdp.md deleted file mode 100644 index 208e37a8..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-044-includes-error-code-in-thrown-message.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.includes-error-code-in-thrown-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Includes error code in thrown message - -## Intent - -- outcome: Executable scenario: Includes error code in thrown message - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then creating a command with empty type throws error code "INVALID_COMMAND_TYPE" -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-045-creates-command-from-decision-with-command.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-045-creates-command-from-decision-with-command.sdp.md deleted file mode 100644 index 0849505b..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-045-creates-command-from-decision-with-command.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.creates-command-from-decision-with-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Creates command from decision with command - -## Intent - -- outcome: Executable scenario: Creates command from decision with command - -```gwt -Given the module is imported from platform-core -When I create a command from a standard test decision -Then the decision-created command has all expected fields -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-046-returns-null-when-decision-has-no-command.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-046-returns-null-when-decision-has-no-command.sdp.md deleted file mode 100644 index 49a57f2d..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-046-returns-null-when-decision-has-no-command.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-null-when-decision-has-no-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns null when decision has no command - -## Intent - -- outcome: Executable scenario: Returns null when decision has no command - -```gwt -Given the module is imported from platform-core -When I create a command from a decision with null command -Then the result is null -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-047-includes-pattern-id-when-provided.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-047-includes-pattern-id-when-provided.sdp.md deleted file mode 100644 index f8d01931..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-047-includes-pattern-id-when-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.includes-pattern-id-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Includes patternId when provided - -## Intent - -- outcome: Executable scenario: Includes patternId when provided - -```gwt -Given the module is imported from platform-core -When I create a command from a decision with patternId "churn-risk" -Then the decision-created command metadata patternId is "churn-risk" -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-048-includes-analysis-when-provided.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-048-includes-analysis-when-provided.sdp.md deleted file mode 100644 index 8251356c..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-048-includes-analysis-when-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.includes-analysis-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Includes analysis when provided - -## Intent - -- outcome: Executable scenario: Includes analysis when provided - -```gwt -Given the module is imported from platform-core -When I create a command from a decision with analysis data -Then the decision-created command metadata analysis matches the provided analysis -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-049-maps-all-decision-fields-correctly.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-049-maps-all-decision-fields-correctly.sdp.md deleted file mode 100644 index 644e8973..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-049-maps-all-decision-fields-correctly.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.maps-all-decision-fields-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Maps all decision fields correctly - -## Intent - -- outcome: Executable scenario: Maps all decision fields correctly - -```gwt -Given the module is imported from platform-core -When I create a command from a decision with specific fields -Then the decision-created command maps all fields correctly -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-050-returns-true-for-valid-command.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-050-returns-true-for-valid-command.sdp.md deleted file mode 100644 index 124d1135..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-050-returns-true-for-valid-command.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-true-for-valid-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns true for valid command - -## Intent - -- outcome: Executable scenario: Returns true for valid command - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isEmittedAgentCommand returns true for a valid command -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-051-returns-true-for-command-with-optional-fields.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-051-returns-true-for-command-with-optional-fields.sdp.md deleted file mode 100644 index 2171544a..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-051-returns-true-for-command-with-optional-fields.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-true-for-command-with-optional-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns true for command with optional fields - -## Intent - -- outcome: Executable scenario: Returns true for command with optional fields - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isEmittedAgentCommand returns true for a command with optional fields -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-052-returns-false-for-non-command-values.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-052-returns-false-for-non-command-values.sdp.md deleted file mode 100644 index 3617209e..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-052-returns-false-for-non-command-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-false-for-non-command-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns false for non-command values - -## Intent - -- outcome: Executable scenario: Returns false for non-command values - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isEmittedAgentCommand returns false for: -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-053-returns-true-when-command-has-pattern-id.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-053-returns-true-when-command-has-pattern-id.sdp.md deleted file mode 100644 index 66e4a4fe..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-053-returns-true-when-command-has-pattern-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-true-when-command-has-pattern-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns true when command has patternId - -## Intent - -- outcome: Executable scenario: Returns true when command has patternId - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then hasPatternId returns true for a command with patternId "churn-risk" -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-054-returns-false-when-command-has-no-pattern-id.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-054-returns-false-when-command-has-no-pattern-id.sdp.md deleted file mode 100644 index 049a70d1..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-054-returns-false-when-command-has-no-pattern-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-false-when-command-has-no-pattern-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns false when command has no patternId - -## Intent - -- outcome: Executable scenario: Returns false when command has no patternId - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then hasPatternId returns false for a command without patternId -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-055-returns-false-when-pattern-id-is-undefined-explicitly.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-055-returns-false-when-pattern-id-is-undefined-explicitly.sdp.md deleted file mode 100644 index 43d2cf6d..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-055-returns-false-when-pattern-id-is-undefined-explicitly.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-false-when-pattern-id-is-undefined-explicitly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns false when patternId is undefined explicitly - -## Intent - -- outcome: Executable scenario: Returns false when patternId is undefined explicitly - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then hasPatternId returns false for a command with explicit undefined patternId -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-056-returns-true-when-command-has-analysis.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-056-returns-true-when-command-has-analysis.sdp.md deleted file mode 100644 index ac2f4c59..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-056-returns-true-when-command-has-analysis.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-true-when-command-has-analysis -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns true when command has analysis - -## Intent - -- outcome: Executable scenario: Returns true when command has analysis - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then hasAnalysisData returns true for a command with analysis -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-057-returns-false-when-command-has-no-analysis.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-057-returns-false-when-command-has-no-analysis.sdp.md deleted file mode 100644 index 170183fa..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-057-returns-false-when-command-has-no-analysis.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-false-when-command-has-no-analysis -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns false when command has no analysis - -## Intent - -- outcome: Executable scenario: Returns false when command has no analysis - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then hasAnalysisData returns false for a command without analysis -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-058-returns-false-when-analysis-is-undefined-explicitly.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-058-returns-false-when-analysis-is-undefined-explicitly.sdp.md deleted file mode 100644 index ebbe208d..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-058-returns-false-when-analysis-is-undefined-explicitly.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-false-when-analysis-is-undefined-explicitly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns false when analysis is undefined explicitly - -## Intent - -- outcome: Executable scenario: Returns false when analysis is undefined explicitly - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then hasAnalysisData returns false for a command with explicit undefined analysis -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-059-returns-true-for-null-analysis.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-059-returns-true-for-null-analysis.sdp.md deleted file mode 100644 index 4c06d01d..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-059-returns-true-for-null-analysis.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.returns-true-for-null-analysis -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Returns true for null analysis - -## Intent - -- outcome: Executable scenario: Returns true for null analysis - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then hasAnalysisData returns true for a command with null analysis -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-060-validates-creates-and-verifies-command.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-060-validates-creates-and-verifies-command.sdp.md deleted file mode 100644 index 5add5765..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-060-validates-creates-and-verifies-command.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.validates-creates-and-verifies-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Validates, creates, and verifies command - -## Intent - -- outcome: Executable scenario: Validates, creates, and verifies command - -```gwt -Given the module is imported from platform-core -When I validate args, create a command, and verify with type guard and schema -Then all steps succeed -``` diff --git a/specs/behavior/platform-core/agent/commands.examples/s-061-creates-command-from-decision-and-verifies.sdp.md b/specs/behavior/platform-core/agent/commands.examples/s-061-creates-command-from-decision-and-verifies.sdp.md deleted file mode 100644 index a232660d..00000000 --- a/specs/behavior/platform-core/agent/commands.examples/s-061-creates-command-from-decision-and-verifies.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.commands.creates-command-from-decision-and-verifies -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.commands ---- -# Creates command from decision and verifies - -## Intent - -- outcome: Executable scenario: Creates command from decision and verifies - -```gwt -Given the module is imported from platform-core -When I create a command from a decision with options and verify -Then the command passes type guard and has patternId and analysis -``` diff --git a/specs/behavior/platform-core/agent/commands.sdp.md b/specs/behavior/platform-core/agent/commands.sdp.md index 6d0d2887..6fc76325 100644 --- a/specs/behavior/platform-core/agent/commands.sdp.md +++ b/specs/behavior/platform-core/agent/commands.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.commands kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: Agent Commands Module +- outcome: Validate agent command emission, create commands via factories, apply type guards, and convert decisions to commands. +- value: Emitted commands carry required explainability fields and reject incomplete arguments before they reach the bus. ## Behavior diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-001-allowed-when-current-spend-plus-estimated-cost-is-under-budget.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-001-allowed-when-current-spend-plus-estimated-cost-is-under-budget.sdp.md deleted file mode 100644 index bb224398..00000000 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-001-allowed-when-current-spend-plus-estimated-cost-is-under-budget.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.cost-budget.allowed-when-current-spend-plus-estimated-cost-is-under-budget -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.cost-budget ---- -# Allowed when current spend plus estimated cost is under budget - -## Intent - -- outcome: Executable scenario: Allowed when current spend plus estimated cost is under budget - -```gwt -Given a cost tracker with currentSpend 5 and dailyBudget 10 and alertThreshold 0.8 -When I check the budget with estimatedCost 1 -Then the result allowed is true -And the remaining budget is 4 -``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-002-denied-when-estimated-cost-would-exceed-budget.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-002-denied-when-estimated-cost-would-exceed-budget.sdp.md deleted file mode 100644 index 86de694b..00000000 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-002-denied-when-estimated-cost-would-exceed-budget.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.cost-budget.denied-when-estimated-cost-would-exceed-budget -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.cost-budget ---- -# Denied when estimated cost would exceed budget - -## Intent - -- outcome: Executable scenario: Denied when estimated cost would exceed budget - -```gwt -Given a cost tracker with currentSpend 9.5 and dailyBudget 10 and alertThreshold 0.8 -When I check the budget with estimatedCost 1 -Then the result allowed is false -And the denial has the following properties: -``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-003-denied-when-current-spend-already-equals-budget.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-003-denied-when-current-spend-already-equals-budget.sdp.md deleted file mode 100644 index f6ccaa0d..00000000 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-003-denied-when-current-spend-already-equals-budget.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.cost-budget.denied-when-current-spend-already-equals-budget -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.cost-budget ---- -# Denied when current spend already equals budget - -## Intent - -- outcome: Executable scenario: Denied when current spend already equals budget - -```gwt -Given a cost tracker with currentSpend 10 and dailyBudget 10 and alertThreshold 0.8 -When I check the budget with estimatedCost 0.01 -Then the result allowed is false -``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-004-allowed-when-estimated-cost-exactly-reaches-budget.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-004-allowed-when-estimated-cost-exactly-reaches-budget.sdp.md deleted file mode 100644 index 7a54ef7e..00000000 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-004-allowed-when-estimated-cost-exactly-reaches-budget.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.cost-budget.allowed-when-estimated-cost-exactly-reaches-budget -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.cost-budget ---- -# Allowed when estimated cost exactly reaches budget - -## Intent - -- outcome: Executable scenario: Allowed when estimated cost exactly reaches budget - -```gwt -Given a cost tracker with currentSpend 5 and dailyBudget 10 and alertThreshold 0.8 -When I check the budget with estimatedCost 5 -Then the result allowed is true -And the remaining budget is 0 -``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-005-sets-at-alert-threshold-when-spend-exceeds-alert-threshold.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-005-sets-at-alert-threshold-when-spend-exceeds-alert-threshold.sdp.md deleted file mode 100644 index 5c7e6aca..00000000 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-005-sets-at-alert-threshold-when-spend-exceeds-alert-threshold.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.cost-budget.sets-at-alert-threshold-when-spend-exceeds-alert-threshold -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.cost-budget ---- -# Sets atAlertThreshold when spend exceeds alert threshold - -## Intent - -- outcome: Executable scenario: Sets atAlertThreshold when spend exceeds alert threshold - -```gwt -Given a cost tracker with currentSpend 8.5 and dailyBudget 10 and alertThreshold 0.8 -When I check the budget with estimatedCost 0.5 -Then the result allowed is true -And the atAlertThreshold flag is true -``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-006-does-not-set-at-alert-threshold-when-below-threshold.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-006-does-not-set-at-alert-threshold-when-below-threshold.sdp.md deleted file mode 100644 index 75c9dbed..00000000 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-006-does-not-set-at-alert-threshold-when-below-threshold.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.cost-budget.does-not-set-at-alert-threshold-when-below-threshold -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.cost-budget ---- -# Does not set atAlertThreshold when below threshold - -## Intent - -- outcome: Executable scenario: Does not set atAlertThreshold when below threshold - -```gwt -Given a cost tracker with currentSpend 5 and dailyBudget 10 and alertThreshold 0.8 -When I check the budget with estimatedCost 1 -Then the result allowed is true -And the atAlertThreshold flag is false -``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-007-sets-at-alert-threshold-at-exact-threshold-boundary.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-007-sets-at-alert-threshold-at-exact-threshold-boundary.sdp.md deleted file mode 100644 index 8dc800a9..00000000 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-007-sets-at-alert-threshold-at-exact-threshold-boundary.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.cost-budget.sets-at-alert-threshold-at-exact-threshold-boundary -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.cost-budget ---- -# Sets atAlertThreshold at exact threshold boundary - -## Intent - -- outcome: Executable scenario: Sets atAlertThreshold at exact threshold boundary - -```gwt -Given a cost tracker with currentSpend 8 and dailyBudget 10 and alertThreshold 0.8 -When I check the budget with estimatedCost 0.5 -Then the result allowed is true -And the atAlertThreshold flag is true -``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-008-simple-multiplication-of-tokens-and-cost-per-token.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-008-simple-multiplication-of-tokens-and-cost-per-token.sdp.md deleted file mode 100644 index d1d6b5ca..00000000 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-008-simple-multiplication-of-tokens-and-cost-per-token.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.cost-budget.simple-multiplication-of-tokens-and-cost-per-token -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.cost-budget ---- -# Simple multiplication of tokens and cost per token - -## Intent - -- outcome: Executable scenario: Simple multiplication of tokens and cost per token - -```gwt -Given the feature fixture is in place -When I estimate cost for 1000 tokens at 0.000003 per token -Then the estimated cost is 0.003 -``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-009-returns-0-for-0-tokens.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-009-returns-0-for-0-tokens.sdp.md deleted file mode 100644 index 66a2178e..00000000 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-009-returns-0-for-0-tokens.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.cost-budget.returns-0-for-0-tokens -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.cost-budget ---- -# Returns 0 for 0 tokens - -## Intent - -- outcome: Executable scenario: Returns 0 for 0 tokens - -```gwt -Given the feature fixture is in place -When I estimate cost for 0 tokens at 0.000003 per token -Then the estimated cost is 0 -``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-010-handles-large-token-counts.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-010-handles-large-token-counts.sdp.md deleted file mode 100644 index e35585cf..00000000 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-010-handles-large-token-counts.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.cost-budget.handles-large-token-counts -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.cost-budget ---- -# Handles large token counts - -## Intent - -- outcome: Executable scenario: Handles large token counts - -```gwt -Given the feature fixture is in place -When I estimate cost for 1000000 tokens at 0.000003 per token -Then the estimated cost is approximately 3.0 -``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-011-handles-very-small-cost-per-token.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-011-handles-very-small-cost-per-token.sdp.md deleted file mode 100644 index fe125736..00000000 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-011-handles-very-small-cost-per-token.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.cost-budget.handles-very-small-cost-per-token -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.cost-budget ---- -# Handles very small cost per token - -## Intent - -- outcome: Executable scenario: Handles very small cost per token - -```gwt -Given the feature fixture is in place -When I estimate cost for 100 tokens at 0.00000015 per token -Then the estimated cost is approximately 0.000015 -``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-012-claude-model-entry-has-positive-input-and-output-costs-with-output-greater.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-012-claude-model-entry-has-positive-input-and-output-costs-with-output-greater.sdp.md deleted file mode 100644 index 7edf07bf..00000000 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-012-claude-model-entry-has-positive-input-and-output-costs-with-output-greater.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.cost-budget.claude-model-entry-has-positive-input-and-output-costs-with-output-greater-than -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.cost-budget ---- -# Claude model entry has positive input and output costs with output greater than input - -## Intent - -- outcome: Executable scenario: Claude model entry has positive input and output costs with output greater than input - -```gwt -Given the feature fixture is in place -When I look up the "anthropic/claude-sonnet-4-5-20250929" model costs -Then the model entry is defined -And the input cost is greater than 0 -And the output cost is greater than 0 -And the output cost is greater than the input cost -``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-013-gpt-4o-model-entry-has-positive-input-and-output-costs.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-013-gpt-4o-model-entry-has-positive-input-and-output-costs.sdp.md deleted file mode 100644 index 1873eb05..00000000 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-013-gpt-4o-model-entry-has-positive-input-and-output-costs.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.cost-budget.gpt-4o-model-entry-has-positive-input-and-output-costs -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.cost-budget ---- -# GPT-4o model entry has positive input and output costs - -## Intent - -- outcome: Executable scenario: GPT-4o model entry has positive input and output costs - -```gwt -Given the feature fixture is in place -When I look up the "openai/gpt-4o" model costs -Then the model entry is defined -And the input cost is greater than 0 -And the output cost is greater than 0 -``` diff --git a/specs/behavior/platform-core/agent/cost-budget.examples/s-014-gpt-4o-mini-model-entry-is-cheaper-than-gpt-4o.sdp.md b/specs/behavior/platform-core/agent/cost-budget.examples/s-014-gpt-4o-mini-model-entry-is-cheaper-than-gpt-4o.sdp.md deleted file mode 100644 index dc8dfacb..00000000 --- a/specs/behavior/platform-core/agent/cost-budget.examples/s-014-gpt-4o-mini-model-entry-is-cheaper-than-gpt-4o.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.cost-budget.gpt-4o-mini-model-entry-is-cheaper-than-gpt-4o -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.cost-budget ---- -# GPT-4o-mini model entry is cheaper than GPT-4o - -## Intent - -- outcome: Executable scenario: GPT-4o-mini model entry is cheaper than GPT-4o - -```gwt -Given the feature fixture is in place -When I look up the "openai/gpt-4o-mini" model costs -Then the model entry is defined -And the input cost is greater than 0 -And the output cost is greater than 0 -And the input cost is less than the "openai/gpt-4o" input cost -``` diff --git a/specs/behavior/platform-core/agent/cost-budget.sdp.md b/specs/behavior/platform-core/agent/cost-budget.sdp.md index 69fd4884..4e89787e 100644 --- a/specs/behavior/platform-core/agent/cost-budget.sdp.md +++ b/specs/behavior/platform-core/agent/cost-budget.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.cost-budget kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: Cost Budget +- outcome: Evaluate spend against budget limits, estimate token costs, and look up default per-model pricing. +- value: Agent LLM work is denied when estimated cost would exceed the daily budget and flagged when spend meets the alert threshold. ## Behavior diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-001-contains-all-expected-error-codes.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-001-contains-all-expected-error-codes.sdp.md deleted file mode 100644 index 88b5f22d..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-001-contains-all-expected-error-codes.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.contains-all-expected-error-codes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Contains all expected error codes - -## Intent - -- outcome: Executable scenario: Contains all expected error codes - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then DEAD_LETTER_ERROR_CODES contains the following entries: -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-002-has-exactly-3-error-codes.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-002-has-exactly-3-error-codes.sdp.md deleted file mode 100644 index 6284e513..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-002-has-exactly-3-error-codes.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.has-exactly-3-error-codes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Has exactly 3 error codes - -## Intent - -- outcome: Executable scenario: Has exactly 3 error codes - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then DEAD_LETTER_ERROR_CODES has exactly 3 keys -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-003-contains-all-three-statuses-in-order.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-003-contains-all-three-statuses-in-order.sdp.md deleted file mode 100644 index ddeb0fb8..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-003-contains-all-three-statuses-in-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.contains-all-three-statuses-in-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Contains all three statuses in order - -## Intent - -- outcome: Executable scenario: Contains all three statuses in order - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then AGENT_DEAD_LETTER_STATUSES equals pending, replayed, ignored -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-004-is-a-readonly-tuple-with-3-elements.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-004-is-a-readonly-tuple-with-3-elements.sdp.md deleted file mode 100644 index 9215325f..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-004-is-a-readonly-tuple-with-3-elements.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.is-a-readonly-tuple-with-3-elements -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Is a readonly tuple with 3 elements - -## Intent - -- outcome: Executable scenario: Is a readonly tuple with 3 elements - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then AGENT_DEAD_LETTER_STATUSES is an array with 3 elements -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-005-type-guard-accepts-valid-statuses.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-005-type-guard-accepts-valid-statuses.sdp.md deleted file mode 100644 index a6873516..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-005-type-guard-accepts-valid-statuses.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.type-guard-accepts-valid-statuses -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Type guard accepts valid statuses - -## Intent - -- outcome: Executable scenario: Type guard accepts valid statuses - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isAgentDeadLetterStatus returns true for the following values: -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-006-type-guard-rejects-invalid-values.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-006-type-guard-rejects-invalid-values.sdp.md deleted file mode 100644 index d58001b0..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-006-type-guard-rejects-invalid-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.type-guard-rejects-invalid-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Type guard rejects invalid values - -## Intent - -- outcome: Executable scenario: Type guard rejects invalid values - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isAgentDeadLetterStatus returns false for the following values: -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-007-type-guard-rejects-non-string-types.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-007-type-guard-rejects-non-string-types.sdp.md deleted file mode 100644 index 7eee559f..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-007-type-guard-rejects-non-string-types.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.type-guard-rejects-non-string-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Type guard rejects non-string types - -## Intent - -- outcome: Executable scenario: Type guard rejects non-string types - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isAgentDeadLetterStatus returns false for numbers, null, undefined, objects, and arrays -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-008-accepts-all-valid-statuses.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-008-accepts-all-valid-statuses.sdp.md deleted file mode 100644 index 19d5f7f7..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-008-accepts-all-valid-statuses.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.accepts-all-valid-statuses -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Accepts all valid statuses - -## Intent - -- outcome: Executable scenario: Accepts all valid statuses - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then AgentDeadLetterStatusSchema accepts all AGENT_DEAD_LETTER_STATUSES -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-009-rejects-invalid-status-values.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-009-rejects-invalid-status-values.sdp.md deleted file mode 100644 index 46b6c408..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-009-rejects-invalid-status-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.rejects-invalid-status-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Rejects invalid status values - -## Intent - -- outcome: Executable scenario: Rejects invalid status values - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then AgentDeadLetterStatusSchema rejects the following values: -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-010-accepts-valid-context-with-all-fields.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-010-accepts-valid-context-with-all-fields.sdp.md deleted file mode 100644 index 242cc218..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-010-accepts-valid-context-with-all-fields.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.accepts-valid-context-with-all-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Accepts valid context with all fields - -## Intent - -- outcome: Executable scenario: Accepts valid context with all fields - -```gwt -Given the module is imported from platform-core -And a test context with correlationId "corr-123" and errorCode "LLM_TIMEOUT" and triggeringPattern "churn-risk" -When the scenario runs -Then AgentDeadLetterContextSchema accepts the context -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-011-accepts-context-with-only-correlation-id.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-011-accepts-context-with-only-correlation-id.sdp.md deleted file mode 100644 index 18d1f0f9..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-011-accepts-context-with-only-correlation-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.accepts-context-with-only-correlation-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Accepts context with only correlationId - -## Intent - -- outcome: Executable scenario: Accepts context with only correlationId - -```gwt -Given the module is imported from platform-core -And a context with only correlationId "corr-123" -When the scenario runs -Then AgentDeadLetterContextSchema accepts the context -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-012-accepts-context-with-only-error-code.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-012-accepts-context-with-only-error-code.sdp.md deleted file mode 100644 index 192c265d..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-012-accepts-context-with-only-error-code.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.accepts-context-with-only-error-code -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Accepts context with only errorCode - -## Intent - -- outcome: Executable scenario: Accepts context with only errorCode - -```gwt -Given the module is imported from platform-core -And a context with only errorCode "LLM_TIMEOUT" -When the scenario runs -Then AgentDeadLetterContextSchema accepts the context -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-013-accepts-empty-context-object.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-013-accepts-empty-context-object.sdp.md deleted file mode 100644 index cd32b600..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-013-accepts-empty-context-object.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.accepts-empty-context-object -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Accepts empty context object - -## Intent - -- outcome: Executable scenario: Accepts empty context object - -```gwt -Given the module is imported from platform-core -And an empty context object -When the scenario runs -Then AgentDeadLetterContextSchema accepts the context -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-014-rejects-context-with-unknown-fields-in-strict-mode.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-014-rejects-context-with-unknown-fields-in-strict-mode.sdp.md deleted file mode 100644 index 8c79025a..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-014-rejects-context-with-unknown-fields-in-strict-mode.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.rejects-context-with-unknown-fields-in-strict-mode -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Rejects context with unknown fields in strict mode - -## Intent - -- outcome: Executable scenario: Rejects context with unknown fields in strict mode - -```gwt -Given the module is imported from platform-core -And a context with correlationId "corr-123" and an unknown field -When the scenario runs -Then AgentDeadLetterContextSchema rejects the context -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-015-accepts-valid-dead-letter.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-015-accepts-valid-dead-letter.sdp.md deleted file mode 100644 index 34b87e6c..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-015-accepts-valid-dead-letter.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.accepts-valid-dead-letter -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Accepts valid dead letter - -## Intent - -- outcome: Executable scenario: Accepts valid dead letter - -```gwt -Given the module is imported from platform-core -And a valid test dead letter -When the scenario runs -Then AgentDeadLetterSchema accepts the dead letter -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-016-accepts-dead-letter-with-context.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-016-accepts-dead-letter-with-context.sdp.md deleted file mode 100644 index e94faeec..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-016-accepts-dead-letter-with-context.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.accepts-dead-letter-with-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Accepts dead letter with context - -## Intent - -- outcome: Executable scenario: Accepts dead letter with context - -```gwt -Given the module is imported from platform-core -And a valid test dead letter with context -When the scenario runs -Then AgentDeadLetterSchema accepts the dead letter -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-017-rejects-dead-letter-with-empty-agent-id.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-017-rejects-dead-letter-with-empty-agent-id.sdp.md deleted file mode 100644 index 5e40b09b..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-017-rejects-dead-letter-with-empty-agent-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.rejects-dead-letter-with-empty-agent-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Rejects dead letter with empty agentId - -## Intent - -- outcome: Executable scenario: Rejects dead letter with empty agentId - -```gwt -Given the module is imported from platform-core -And a test dead letter with agentId "" -When the scenario runs -Then AgentDeadLetterSchema rejects the dead letter -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-018-rejects-dead-letter-with-empty-subscription-id.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-018-rejects-dead-letter-with-empty-subscription-id.sdp.md deleted file mode 100644 index f4cf5298..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-018-rejects-dead-letter-with-empty-subscription-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.rejects-dead-letter-with-empty-subscription-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Rejects dead letter with empty subscriptionId - -## Intent - -- outcome: Executable scenario: Rejects dead letter with empty subscriptionId - -```gwt -Given the module is imported from platform-core -And a test dead letter with subscriptionId "" -When the scenario runs -Then AgentDeadLetterSchema rejects the dead letter -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-019-rejects-dead-letter-with-empty-event-id.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-019-rejects-dead-letter-with-empty-event-id.sdp.md deleted file mode 100644 index 9ddc9818..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-019-rejects-dead-letter-with-empty-event-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.rejects-dead-letter-with-empty-event-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Rejects dead letter with empty eventId - -## Intent - -- outcome: Executable scenario: Rejects dead letter with empty eventId - -```gwt -Given the module is imported from platform-core -And a test dead letter with eventId "" -When the scenario runs -Then AgentDeadLetterSchema rejects the dead letter -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-020-rejects-dead-letter-with-negative-global-position.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-020-rejects-dead-letter-with-negative-global-position.sdp.md deleted file mode 100644 index 8efa4cbb..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-020-rejects-dead-letter-with-negative-global-position.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.rejects-dead-letter-with-negative-global-position -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Rejects dead letter with negative globalPosition - -## Intent - -- outcome: Executable scenario: Rejects dead letter with negative globalPosition - -```gwt -Given the module is imported from platform-core -And a test dead letter with globalPosition -1 -When the scenario runs -Then AgentDeadLetterSchema rejects the dead letter -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-021-accepts-dead-letter-with-global-position-of-0.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-021-accepts-dead-letter-with-global-position-of-0.sdp.md deleted file mode 100644 index a8666e11..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-021-accepts-dead-letter-with-global-position-of-0.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.accepts-dead-letter-with-global-position-of-0 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Accepts dead letter with globalPosition of 0 - -## Intent - -- outcome: Executable scenario: Accepts dead letter with globalPosition of 0 - -```gwt -Given the module is imported from platform-core -And a test dead letter with globalPosition 0 -When the scenario runs -Then AgentDeadLetterSchema accepts the dead letter -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-022-rejects-dead-letter-with-non-positive-attempt-count.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-022-rejects-dead-letter-with-non-positive-attempt-count.sdp.md deleted file mode 100644 index c062f686..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-022-rejects-dead-letter-with-non-positive-attempt-count.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.rejects-dead-letter-with-non-positive-attempt-count -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Rejects dead letter with non-positive attemptCount - -## Intent - -- outcome: Executable scenario: Rejects dead letter with non-positive attemptCount - -```gwt -Given the module is imported from platform-core -And a test dead letter with attemptCount 0 -When the scenario runs -Then AgentDeadLetterSchema rejects the dead letter -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-023-rejects-dead-letter-with-missing-required-fields.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-023-rejects-dead-letter-with-missing-required-fields.sdp.md deleted file mode 100644 index 837885dd..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-023-rejects-dead-letter-with-missing-required-fields.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.rejects-dead-letter-with-missing-required-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Rejects dead letter with missing required fields - -## Intent - -- outcome: Executable scenario: Rejects dead letter with missing required fields - -```gwt -Given the module is imported from platform-core -And a partial object with only agentId "test" -When the scenario runs -Then AgentDeadLetterSchema rejects the dead letter -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-024-removes-content-after-at-when-followed-by-path-like-content.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-024-removes-content-after-at-when-followed-by-path-like-content.sdp.md deleted file mode 100644 index 305d0c21..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-024-removes-content-after-at-when-followed-by-path-like-content.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.removes-content-after-at-when-followed-by-path-like-content -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Removes content after at when followed by path-like content - -## Intent - -- outcome: Executable scenario: Removes content after at when followed by path-like content - -```gwt -Given the module is imported from platform-core -When I sanitize the error "Error occurred at /app/src/agent.ts:42:10" -Then the sanitized message is "Error occurred" -And the sanitized message does not contain "/app/src/agent.ts:42:10" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-025-removes-multi-line-stack-traces.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-025-removes-multi-line-stack-traces.sdp.md deleted file mode 100644 index af8b6372..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-025-removes-multi-line-stack-traces.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.removes-multi-line-stack-traces -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Removes multi-line stack traces - -## Intent - -- outcome: Executable scenario: Removes multi-line stack traces - -```gwt -Given the module is imported from platform-core -When I sanitize a multi-line error with stack traces -Then the sanitized message does not contain "at processEvent" -And the sanitized message does not contain "at runAgent" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-026-preserves-the-error-message-itself.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-026-preserves-the-error-message-itself.sdp.md deleted file mode 100644 index c8db60d4..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-026-preserves-the-error-message-itself.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.preserves-the-error-message-itself -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Preserves the error message itself - -## Intent - -- outcome: Executable scenario: Preserves the error message itself - -```gwt -Given the module is imported from platform-core -When I sanitize the error "LLM timeout during analysis" -Then the sanitized message is "LLM timeout during analysis" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-027-removes-type-script-file-paths-with-at-prefix.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-027-removes-type-script-file-paths-with-at-prefix.sdp.md deleted file mode 100644 index b5ee38c2..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-027-removes-type-script-file-paths-with-at-prefix.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.removes-type-script-file-paths-with-at-prefix -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Removes TypeScript file paths with at prefix - -## Intent - -- outcome: Executable scenario: Removes TypeScript file paths with at prefix - -```gwt -Given the module is imported from platform-core -When I sanitize the error "Failed at /app/src/agent.ts" -Then the sanitized message is "Failed" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-028-replaces-file-paths-without-at-prefix-with-path-marker.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-028-replaces-file-paths-without-at-prefix-with-path-marker.sdp.md deleted file mode 100644 index 77a7b532..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-028-replaces-file-paths-without-at-prefix-with-path-marker.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.replaces-file-paths-without-at-prefix-with-path-marker -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Replaces file paths without at prefix with path marker - -## Intent - -- outcome: Executable scenario: Replaces file paths without at prefix with path marker - -```gwt -Given the module is imported from platform-core -When I sanitize the error "Error in /dist/handler.js:100:5" -Then the sanitized message is "Error in [path]" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-029-removes-esm-file-paths-when-preceded-by-at.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-029-removes-esm-file-paths-when-preceded-by-at.sdp.md deleted file mode 100644 index 7030a4ed..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-029-removes-esm-file-paths-when-preceded-by-at.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.removes-esm-file-paths-when-preceded-by-at -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Removes ESM file paths when preceded by at - -## Intent - -- outcome: Executable scenario: Removes ESM file paths when preceded by at - -```gwt -Given the module is imported from platform-core -When I sanitize the error "Module error at /lib/module.mjs" -Then the sanitized message is "Module error" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-030-replaces-cjs-file-paths-with-path-marker-when-not-preceded-by-at.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-030-replaces-cjs-file-paths-with-path-marker-when-not-preceded-by-at.sdp.md deleted file mode 100644 index 4111a549..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-030-replaces-cjs-file-paths-with-path-marker-when-not-preceded-by-at.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.replaces-cjs-file-paths-with-path-marker-when-not-preceded-by-at -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Replaces CJS file paths with path marker when not preceded by at - -## Intent - -- outcome: Executable scenario: Replaces CJS file paths with path marker when not preceded by at - -```gwt -Given the module is imported from platform-core -When I sanitize the error "Require failed for /lib/module.cjs" -Then the sanitized message is "Require failed for [path]" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-031-removes-paths-with-line-and-column-numbers.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-031-removes-paths-with-line-and-column-numbers.sdp.md deleted file mode 100644 index 725442dc..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-031-removes-paths-with-line-and-column-numbers.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.removes-paths-with-line-and-column-numbers -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Removes paths with line and column numbers - -## Intent - -- outcome: Executable scenario: Removes paths with line and column numbers - -```gwt -Given the module is imported from platform-core -When I sanitize the error "Error at /path/to/file.ts:42:10" -Then the sanitized message does not contain ":42:10" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-032-truncates-long-messages-to-500-characters-ending-with-ellipsis.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-032-truncates-long-messages-to-500-characters-ending-with-ellipsis.sdp.md deleted file mode 100644 index 630f75bc..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-032-truncates-long-messages-to-500-characters-ending-with-ellipsis.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.truncates-long-messages-to-500-characters-ending-with-ellipsis -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Truncates long messages to 500 characters ending with ellipsis - -## Intent - -- outcome: Executable scenario: Truncates long messages to 500 characters ending with ellipsis - -```gwt -Given the module is imported from platform-core -When I sanitize an error of 600 repeated "A" characters -Then the sanitized message has length 500 -And the sanitized message ends with "..." -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-033-does-not-truncate-messages-under-500-characters.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-033-does-not-truncate-messages-under-500-characters.sdp.md deleted file mode 100644 index 6f489d22..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-033-does-not-truncate-messages-under-500-characters.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.does-not-truncate-messages-under-500-characters -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Does not truncate messages under 500 characters - -## Intent - -- outcome: Executable scenario: Does not truncate messages under 500 characters - -```gwt -Given the module is imported from platform-core -When I sanitize an error of 400 repeated "A" characters -Then the sanitized message has length 400 -And the sanitized message does not end with "..." -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-034-does-not-truncate-messages-of-exactly-500-characters.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-034-does-not-truncate-messages-of-exactly-500-characters.sdp.md deleted file mode 100644 index c3813c74..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-034-does-not-truncate-messages-of-exactly-500-characters.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.does-not-truncate-messages-of-exactly-500-characters -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Does not truncate messages of exactly 500 characters - -## Intent - -- outcome: Executable scenario: Does not truncate messages of exactly 500 characters - -```gwt -Given the module is imported from platform-core -When I sanitize an error of 500 repeated "A" characters -Then the sanitized message has length 500 -And the sanitized message does not end with "..." -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-035-handles-error-objects.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-035-handles-error-objects.sdp.md deleted file mode 100644 index 684738aa..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-035-handles-error-objects.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.handles-error-objects -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Handles Error objects - -## Intent - -- outcome: Executable scenario: Handles Error objects - -```gwt -Given the module is imported from platform-core -When I sanitize an Error object with message "Test error message" -Then the sanitized message contains "Test error message" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-036-handles-string-errors.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-036-handles-string-errors.sdp.md deleted file mode 100644 index 99785a20..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-036-handles-string-errors.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.handles-string-errors -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Handles string errors - -## Intent - -- outcome: Executable scenario: Handles string errors - -```gwt -Given the module is imported from platform-core -When I sanitize the error "String error message" -Then the sanitized message is "String error message" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-037-handles-objects-with-message-property.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-037-handles-objects-with-message-property.sdp.md deleted file mode 100644 index e5de2485..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-037-handles-objects-with-message-property.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.handles-objects-with-message-property -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Handles objects with message property - -## Intent - -- outcome: Executable scenario: Handles objects with message property - -```gwt -Given the module is imported from platform-core -When I sanitize an object with message "Object error message" -Then the sanitized message contains "Object error message" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-038-handles-unknown-error-types.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-038-handles-unknown-error-types.sdp.md deleted file mode 100644 index c0407b13..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-038-handles-unknown-error-types.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.handles-unknown-error-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Handles unknown error types - -## Intent - -- outcome: Executable scenario: Handles unknown error types - -```gwt -Given the module is imported from platform-core -When I sanitize an object without message property -Then the sanitized message is "Unknown error" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-039-handles-null.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-039-handles-null.sdp.md deleted file mode 100644 index f6ef3c42..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-039-handles-null.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.handles-null -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Handles null - -## Intent - -- outcome: Executable scenario: Handles null - -```gwt -Given the module is imported from platform-core -When I sanitize null -Then the sanitized message is "Unknown error" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-040-handles-undefined.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-040-handles-undefined.sdp.md deleted file mode 100644 index 10522c7a..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-040-handles-undefined.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.handles-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Handles undefined - -## Intent - -- outcome: Executable scenario: Handles undefined - -```gwt -Given the module is imported from platform-core -When I sanitize undefined -Then the sanitized message is "Unknown error" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-041-handles-empty-string.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-041-handles-empty-string.sdp.md deleted file mode 100644 index 5855f015..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-041-handles-empty-string.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.handles-empty-string -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Handles empty string - -## Intent - -- outcome: Executable scenario: Handles empty string - -```gwt -Given the module is imported from platform-core -When I sanitize the error "" -Then the sanitized message is "Unknown error" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-042-collapses-multiple-spaces.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-042-collapses-multiple-spaces.sdp.md deleted file mode 100644 index 1181fed2..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-042-collapses-multiple-spaces.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.collapses-multiple-spaces -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Collapses multiple spaces - -## Intent - -- outcome: Executable scenario: Collapses multiple spaces - -```gwt -Given the module is imported from platform-core -When I sanitize the error "Error with multiple spaces" -Then the sanitized message is "Error with multiple spaces" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-043-trims-leading-and-trailing-whitespace.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-043-trims-leading-and-trailing-whitespace.sdp.md deleted file mode 100644 index a87b0e13..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-043-trims-leading-and-trailing-whitespace.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.trims-leading-and-trailing-whitespace -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Trims leading and trailing whitespace - -## Intent - -- outcome: Executable scenario: Trims leading and trailing whitespace - -```gwt -Given the module is imported from platform-core -When I sanitize the error " Error with surrounding whitespace " -Then the sanitized message is "Error with surrounding whitespace" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-044-handles-newlines.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-044-handles-newlines.sdp.md deleted file mode 100644 index f593faeb..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-044-handles-newlines.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.handles-newlines -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Handles newlines - -## Intent - -- outcome: Executable scenario: Handles newlines - -```gwt -Given the module is imported from platform-core -When I sanitize an error with newlines "Error\non\nmultiple\nlines" -Then the sanitized message is "Error on multiple lines" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-045-creates-dead-letter-with-required-fields.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-045-creates-dead-letter-with-required-fields.sdp.md deleted file mode 100644 index dffe414b..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-045-creates-dead-letter-with-required-fields.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.creates-dead-letter-with-required-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Creates dead letter with required fields - -## Intent - -- outcome: Executable scenario: Creates dead letter with required fields - -```gwt -Given the module is imported from platform-core -And the system time is "2024-01-15T12:00:00Z" -When I create a dead letter with agentId "test-agent" subscriptionId "sub-001" eventId "evt-123" globalPosition 1000 and error "Error message" -Then the dead letter has the following properties: -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-046-creates-dead-letter-with-pending-status.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-046-creates-dead-letter-with-pending-status.sdp.md deleted file mode 100644 index f04c72ac..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-046-creates-dead-letter-with-pending-status.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.creates-dead-letter-with-pending-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Creates dead letter with pending status - -## Intent - -- outcome: Executable scenario: Creates dead letter with pending status - -```gwt -Given the module is imported from platform-core -And the system time is "2024-01-15T12:00:00Z" -When I create a dead letter with agentId "agent" subscriptionId "sub" eventId "evt" globalPosition 0 and error "error" -Then the dead letter status is "pending" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-047-sets-attempt-count-to-1.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-047-sets-attempt-count-to-1.sdp.md deleted file mode 100644 index 96e03f22..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-047-sets-attempt-count-to-1.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.sets-attempt-count-to-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Sets attemptCount to 1 - -## Intent - -- outcome: Executable scenario: Sets attemptCount to 1 - -```gwt -Given the module is imported from platform-core -And the system time is "2024-01-15T12:00:00Z" -When I create a dead letter with agentId "agent" subscriptionId "sub" eventId "evt" globalPosition 0 and error "error" -Then the dead letter attemptCount is 1 -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-048-sets-failed-at-to-current-time.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-048-sets-failed-at-to-current-time.sdp.md deleted file mode 100644 index 81363c84..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-048-sets-failed-at-to-current-time.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.sets-failed-at-to-current-time -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Sets failedAt to current time - -## Intent - -- outcome: Executable scenario: Sets failedAt to current time - -```gwt -Given the module is imported from platform-core -And the system time is "2024-01-15T12:00:00Z" -When I create a dead letter with agentId "agent" subscriptionId "sub" eventId "evt" globalPosition 0 and error "error" -Then the dead letter failedAt equals the current time -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-049-includes-context-when-provided.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-049-includes-context-when-provided.sdp.md deleted file mode 100644 index bb321c28..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-049-includes-context-when-provided.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.includes-context-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Includes context when provided - -## Intent - -- outcome: Executable scenario: Includes context when provided - -```gwt -Given the module is imported from platform-core -And the system time is "2024-01-15T12:00:00Z" -When I create a dead letter with context containing correlationId "corr-123" errorCode "LLM_TIMEOUT" and triggeringPattern "churn-risk" -Then the dead letter context matches the provided context -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-050-does-not-include-context-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-050-does-not-include-context-when-not-provided.sdp.md deleted file mode 100644 index 3c5d80e7..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-050-does-not-include-context-when-not-provided.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.does-not-include-context-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Does not include context when not provided - -## Intent - -- outcome: Executable scenario: Does not include context when not provided - -```gwt -Given the module is imported from platform-core -And the system time is "2024-01-15T12:00:00Z" -When I create a dead letter with agentId "agent" subscriptionId "sub" eventId "evt" globalPosition 0 and error "error" -Then the dead letter context is undefined -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-051-sanitizes-error-objects-removing-stack-like-patterns.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-051-sanitizes-error-objects-removing-stack-like-patterns.sdp.md deleted file mode 100644 index 9184dfa1..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-051-sanitizes-error-objects-removing-stack-like-patterns.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.sanitizes-error-objects-removing-stack-like-patterns -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Sanitizes Error objects removing stack-like patterns - -## Intent - -- outcome: Executable scenario: Sanitizes Error objects removing stack-like patterns - -```gwt -Given the module is imported from platform-core -And the system time is "2024-01-15T12:00:00Z" -When I create a dead letter with an Error object "Error at /app/src/handler.ts:42" -Then the dead letter error is "Error" -And the dead letter error does not contain "/app/src/handler.ts" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-052-sanitizes-string-errors.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-052-sanitizes-string-errors.sdp.md deleted file mode 100644 index c96bf83a..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-052-sanitizes-string-errors.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.sanitizes-string-errors -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Sanitizes string errors - -## Intent - -- outcome: Executable scenario: Sanitizes string errors - -```gwt -Given the module is imported from platform-core -And the system time is "2024-01-15T12:00:00Z" -When I create a dead letter with agentId "agent" subscriptionId "sub" eventId "evt" globalPosition 0 and error "Error at /app/src/handler.ts:42" -Then the dead letter error is "Error" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-053-replaces-paths-in-errors-without-at-prefix.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-053-replaces-paths-in-errors-without-at-prefix.sdp.md deleted file mode 100644 index a94a300a..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-053-replaces-paths-in-errors-without-at-prefix.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.replaces-paths-in-errors-without-at-prefix -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Replaces paths in errors without at prefix - -## Intent - -- outcome: Executable scenario: Replaces paths in errors without at prefix - -```gwt -Given the module is imported from platform-core -And the system time is "2024-01-15T12:00:00Z" -When I create a dead letter with agentId "agent" subscriptionId "sub" eventId "evt" globalPosition 0 and error "Failed loading /app/src/handler.ts" -Then the dead letter error is "Failed loading [path]" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-054-replaces-paths-with-line-column-suffix.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-054-replaces-paths-with-line-column-suffix.sdp.md deleted file mode 100644 index 8254a0e3..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-054-replaces-paths-with-line-column-suffix.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.replaces-paths-with-line-column-suffix -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Replaces paths with line column suffix - -## Intent - -- outcome: Executable scenario: Replaces paths with line column suffix - -```gwt -Given the module is imported from platform-core -And the system time is "2024-01-15T12:00:00Z" -When I create a dead letter with agentId "agent" subscriptionId "sub" eventId "evt" globalPosition 0 and error "Failed loading /app/src/handler.ts:42:10" -Then the dead letter error is "Failed loading [path]" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-055-sanitizes-unknown-error-types.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-055-sanitizes-unknown-error-types.sdp.md deleted file mode 100644 index 3373fb60..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-055-sanitizes-unknown-error-types.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.sanitizes-unknown-error-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Sanitizes unknown error types - -## Intent - -- outcome: Executable scenario: Sanitizes unknown error types - -```gwt -Given the module is imported from platform-core -And the system time is "2024-01-15T12:00:00Z" -When I create a dead letter with an unknown error type -Then the dead letter error is "Unknown error" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-056-increments-attempt-count.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-056-increments-attempt-count.sdp.md deleted file mode 100644 index 8ad95a94..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-056-increments-attempt-count.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.increments-attempt-count -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Increments attemptCount - -## Intent - -- outcome: Executable scenario: Increments attemptCount - -```gwt -Given the module is imported from platform-core -And the system time is "2024-01-15T12:00:00Z" -And a test dead letter with attemptCount 1 -When I increment the dead letter attempt with error "New error" -Then the dead letter attemptCount is 2 -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-057-updates-error-message.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-057-updates-error-message.sdp.md deleted file mode 100644 index dfc31e52..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-057-updates-error-message.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.updates-error-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Updates error message - -## Intent - -- outcome: Executable scenario: Updates error message - -```gwt -Given the module is imported from platform-core -And the system time is "2024-01-15T12:00:00Z" -And a test dead letter with error "Old error" -When I increment the dead letter attempt with error "New error" -Then the dead letter error is "New error" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-058-sanitizes-new-error-message-with-at-pattern.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-058-sanitizes-new-error-message-with-at-pattern.sdp.md deleted file mode 100644 index 8bdbebc3..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-058-sanitizes-new-error-message-with-at-pattern.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.sanitizes-new-error-message-with-at-pattern -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Sanitizes new error message with at pattern - -## Intent - -- outcome: Executable scenario: Sanitizes new error message with at pattern - -```gwt -Given the module is imported from platform-core -And the system time is "2024-01-15T12:00:00Z" -And a test dead letter with attemptCount 1 -When I increment the dead letter attempt with error "Error at /app/file.ts:10" -Then the dead letter error is "Error" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-059-sanitizes-new-error-message-with-path-replacement.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-059-sanitizes-new-error-message-with-path-replacement.sdp.md deleted file mode 100644 index a8b40163..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-059-sanitizes-new-error-message-with-path-replacement.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.sanitizes-new-error-message-with-path-replacement -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Sanitizes new error message with path replacement - -## Intent - -- outcome: Executable scenario: Sanitizes new error message with path replacement - -```gwt -Given the module is imported from platform-core -And the system time is "2024-01-15T12:00:00Z" -And a test dead letter with attemptCount 1 -When I increment the dead letter attempt with error "Failed loading /app/file.ts" -Then the dead letter error is "Failed loading [path]" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-060-updates-failed-at-to-current-time.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-060-updates-failed-at-to-current-time.sdp.md deleted file mode 100644 index ab983062..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-060-updates-failed-at-to-current-time.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.updates-failed-at-to-current-time -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Updates failedAt to current time - -## Intent - -- outcome: Executable scenario: Updates failedAt to current time - -```gwt -Given the module is imported from platform-core -And the system time is "2024-01-15T12:00:00Z" -And a test dead letter with failedAt 10000 ms ago -When I increment the dead letter attempt with error "New error" -Then the dead letter failedAt equals the current time -And the dead letter failedAt is different from the old failedAt -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-061-preserves-other-fields-during-increment.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-061-preserves-other-fields-during-increment.sdp.md deleted file mode 100644 index 416bfc53..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-061-preserves-other-fields-during-increment.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.preserves-other-fields-during-increment -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Preserves other fields during increment - -## Intent - -- outcome: Executable scenario: Preserves other fields during increment - -```gwt -Given the module is imported from platform-core -And the system time is "2024-01-15T12:00:00Z" -And a test dead letter with agentId "my-agent" subscriptionId "my-sub" eventId "my-evt" globalPosition 500 status "pending" and context -When I increment the dead letter attempt with error "New error" -Then the dead letter preserves all original fields except attemptCount, error, and failedAt -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-062-handles-multiple-increments.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-062-handles-multiple-increments.sdp.md deleted file mode 100644 index e608eda8..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-062-handles-multiple-increments.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.handles-multiple-increments -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Handles multiple increments - -## Intent - -- outcome: Executable scenario: Handles multiple increments - -```gwt -Given the module is imported from platform-core -And the system time is "2024-01-15T12:00:00Z" -And a test dead letter with attemptCount 1 -When I increment the dead letter attempt 3 times with errors "Retry 1", "Retry 2", "Retry 3" -Then the dead letter attemptCount is 4 -And the dead letter error is "Retry 3" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-063-transitions-pending-to-replayed.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-063-transitions-pending-to-replayed.sdp.md deleted file mode 100644 index 3fa647b1..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-063-transitions-pending-to-replayed.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.transitions-pending-to-replayed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Transitions pending to replayed - -## Intent - -- outcome: Executable scenario: Transitions pending to replayed - -```gwt -Given the module is imported from platform-core -And a test dead letter with status "pending" -When I mark the dead letter as replayed -Then the dead letter status is "replayed" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-064-preserves-all-other-fields-when-transitioning-to-replayed.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-064-preserves-all-other-fields-when-transitioning-to-replayed.sdp.md deleted file mode 100644 index daf86991..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-064-preserves-all-other-fields-when-transitioning-to-replayed.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.preserves-all-other-fields-when-transitioning-to-replayed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Preserves all other fields when transitioning to replayed - -## Intent - -- outcome: Executable scenario: Preserves all other fields when transitioning to replayed - -```gwt -Given the module is imported from platform-core -And a test dead letter with status "pending" agentId "my-agent" attemptCount 3 and context -When I mark the dead letter as replayed -Then the dead letter preserves agentId "my-agent" and attemptCount 3 and context -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-065-throws-when-marking-replayed-dead-letter-as-replayed.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-065-throws-when-marking-replayed-dead-letter-as-replayed.sdp.md deleted file mode 100644 index 71424bd2..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-065-throws-when-marking-replayed-dead-letter-as-replayed.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.throws-when-marking-replayed-dead-letter-as-replayed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Throws when marking replayed dead letter as replayed - -## Intent - -- outcome: Executable scenario: Throws when marking replayed dead letter as replayed - -```gwt -Given the module is imported from platform-core -And a test dead letter with status "replayed" -When the scenario runs -Then marking the dead letter as replayed throws with message containing "replayed" and "pending" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-066-throws-when-marking-ignored-dead-letter-as-replayed.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-066-throws-when-marking-ignored-dead-letter-as-replayed.sdp.md deleted file mode 100644 index 5bcc5948..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-066-throws-when-marking-ignored-dead-letter-as-replayed.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.throws-when-marking-ignored-dead-letter-as-replayed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Throws when marking ignored dead letter as replayed - -## Intent - -- outcome: Executable scenario: Throws when marking ignored dead letter as replayed - -```gwt -Given the module is imported from platform-core -And a test dead letter with status "ignored" -When the scenario runs -Then marking the dead letter as replayed throws with message containing "ignored" and "pending" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-067-transitions-pending-to-ignored.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-067-transitions-pending-to-ignored.sdp.md deleted file mode 100644 index 63880127..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-067-transitions-pending-to-ignored.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.transitions-pending-to-ignored -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Transitions pending to ignored - -## Intent - -- outcome: Executable scenario: Transitions pending to ignored - -```gwt -Given the module is imported from platform-core -And a test dead letter with status "pending" -When I mark the dead letter as ignored -Then the dead letter status is "ignored" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-068-preserves-all-other-fields-when-transitioning-to-ignored.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-068-preserves-all-other-fields-when-transitioning-to-ignored.sdp.md deleted file mode 100644 index 7c5cd2d1..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-068-preserves-all-other-fields-when-transitioning-to-ignored.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.preserves-all-other-fields-when-transitioning-to-ignored -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Preserves all other fields when transitioning to ignored - -## Intent - -- outcome: Executable scenario: Preserves all other fields when transitioning to ignored - -```gwt -Given the module is imported from platform-core -And a test dead letter with status "pending" eventId "evt-456" and error "Original error" -When I mark the dead letter as ignored -Then the dead letter preserves eventId "evt-456" and error "Original error" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-069-throws-when-marking-replayed-dead-letter-as-ignored.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-069-throws-when-marking-replayed-dead-letter-as-ignored.sdp.md deleted file mode 100644 index 07678ae7..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-069-throws-when-marking-replayed-dead-letter-as-ignored.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.throws-when-marking-replayed-dead-letter-as-ignored -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Throws when marking replayed dead letter as ignored - -## Intent - -- outcome: Executable scenario: Throws when marking replayed dead letter as ignored - -```gwt -Given the module is imported from platform-core -And a test dead letter with status "replayed" -When the scenario runs -Then marking the dead letter as ignored throws with message containing "replayed" and "pending" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-070-throws-when-marking-already-ignored-dead-letter-as-ignored.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-070-throws-when-marking-already-ignored-dead-letter-as-ignored.sdp.md deleted file mode 100644 index 4e827abb..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-070-throws-when-marking-already-ignored-dead-letter-as-ignored.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.throws-when-marking-already-ignored-dead-letter-as-ignored -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Throws when marking already ignored dead letter as ignored - -## Intent - -- outcome: Executable scenario: Throws when marking already ignored dead letter as ignored - -```gwt -Given the module is imported from platform-core -And a test dead letter with status "ignored" -When the scenario runs -Then marking the dead letter as ignored throws with message containing "ignored" and "pending" -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-071-is-dead-letter-pending-returns-true-only-for-pending.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-071-is-dead-letter-pending-returns-true-only-for-pending.sdp.md deleted file mode 100644 index 5827190c..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-071-is-dead-letter-pending-returns-true-only-for-pending.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.is-dead-letter-pending-returns-true-only-for-pending -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# isDeadLetterPending returns true only for pending - -## Intent - -- outcome: Executable scenario: isDeadLetterPending returns true only for pending - -```gwt -Given the module is imported from platform-core -And a test dead letter with status "pending" -When the scenario runs -Then isDeadLetterPending returns true -And isDeadLetterReplayed returns false -And isDeadLetterIgnored returns false -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-072-is-dead-letter-replayed-returns-true-only-for-replayed.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-072-is-dead-letter-replayed-returns-true-only-for-replayed.sdp.md deleted file mode 100644 index fbeaac18..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-072-is-dead-letter-replayed-returns-true-only-for-replayed.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.is-dead-letter-replayed-returns-true-only-for-replayed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# isDeadLetterReplayed returns true only for replayed - -## Intent - -- outcome: Executable scenario: isDeadLetterReplayed returns true only for replayed - -```gwt -Given the module is imported from platform-core -And a test dead letter with status "replayed" -When the scenario runs -Then isDeadLetterPending returns false -And isDeadLetterReplayed returns true -And isDeadLetterIgnored returns false -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-073-is-dead-letter-ignored-returns-true-only-for-ignored.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-073-is-dead-letter-ignored-returns-true-only-for-ignored.sdp.md deleted file mode 100644 index 615d680c..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-073-is-dead-letter-ignored-returns-true-only-for-ignored.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.is-dead-letter-ignored-returns-true-only-for-ignored -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# isDeadLetterIgnored returns true only for ignored - -## Intent - -- outcome: Executable scenario: isDeadLetterIgnored returns true only for ignored - -```gwt -Given the module is imported from platform-core -And a test dead letter with status "ignored" -When the scenario runs -Then isDeadLetterPending returns false -And isDeadLetterReplayed returns false -And isDeadLetterIgnored returns true -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-074-returns-true-for-valid-dead-letter.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-074-returns-true-for-valid-dead-letter.sdp.md deleted file mode 100644 index d24576a2..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-074-returns-true-for-valid-dead-letter.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.returns-true-for-valid-dead-letter -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Returns true for valid dead letter - -## Intent - -- outcome: Executable scenario: Returns true for valid dead letter - -```gwt -Given the module is imported from platform-core -And a valid test dead letter -When the scenario runs -Then validateAgentDeadLetter returns true -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-075-returns-true-for-dead-letter-with-context.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-075-returns-true-for-dead-letter-with-context.sdp.md deleted file mode 100644 index 4f567882..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-075-returns-true-for-dead-letter-with-context.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.returns-true-for-dead-letter-with-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Returns true for dead letter with context - -## Intent - -- outcome: Executable scenario: Returns true for dead letter with context - -```gwt -Given the module is imported from platform-core -And a valid test dead letter with context -When the scenario runs -Then validateAgentDeadLetter returns true -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-076-returns-false-for-null.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-076-returns-false-for-null.sdp.md deleted file mode 100644 index f647271f..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-076-returns-false-for-null.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.returns-false-for-null -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Returns false for null - -## Intent - -- outcome: Executable scenario: Returns false for null - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then validateAgentDeadLetter returns false for null -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-077-returns-false-for-undefined.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-077-returns-false-for-undefined.sdp.md deleted file mode 100644 index 7b2b3b1a..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-077-returns-false-for-undefined.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.returns-false-for-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Returns false for undefined - -## Intent - -- outcome: Executable scenario: Returns false for undefined - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then validateAgentDeadLetter returns false for undefined -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-078-returns-false-for-empty-object.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-078-returns-false-for-empty-object.sdp.md deleted file mode 100644 index 20377093..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-078-returns-false-for-empty-object.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.returns-false-for-empty-object -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Returns false for empty object - -## Intent - -- outcome: Executable scenario: Returns false for empty object - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then validateAgentDeadLetter returns false for an empty object -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-079-returns-false-for-non-object-types.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-079-returns-false-for-non-object-types.sdp.md deleted file mode 100644 index f31e2524..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-079-returns-false-for-non-object-types.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.returns-false-for-non-object-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Returns false for non-object types - -## Intent - -- outcome: Executable scenario: Returns false for non-object types - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then validateAgentDeadLetter returns false for non-object types including string, number, and boolean -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-080-returns-false-for-dead-letter-with-invalid-status.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-080-returns-false-for-dead-letter-with-invalid-status.sdp.md deleted file mode 100644 index 53f38a80..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-080-returns-false-for-dead-letter-with-invalid-status.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.returns-false-for-dead-letter-with-invalid-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Returns false for dead letter with invalid status - -## Intent - -- outcome: Executable scenario: Returns false for dead letter with invalid status - -```gwt -Given the module is imported from platform-core -And a test dead letter with status "invalid" -When the scenario runs -Then validateAgentDeadLetter returns false for the dead letter -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-081-returns-false-for-dead-letter-with-missing-fields.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-081-returns-false-for-dead-letter-with-missing-fields.sdp.md deleted file mode 100644 index 33d698cd..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-081-returns-false-for-dead-letter-with-missing-fields.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.returns-false-for-dead-letter-with-missing-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Returns false for dead letter with missing fields - -## Intent - -- outcome: Executable scenario: Returns false for dead letter with missing fields - -```gwt -Given the module is imported from platform-core -And a partial object with agentId "test" and status "pending" -When the scenario runs -Then validateAgentDeadLetter returns false for the dead letter -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-082-failed-event-processing-and-replay-lifecycle.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-082-failed-event-processing-and-replay-lifecycle.sdp.md deleted file mode 100644 index 2a2c7030..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-082-failed-event-processing-and-replay-lifecycle.sdp.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.failed-event-processing-and-replay-lifecycle -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Failed event processing and replay lifecycle - -## Intent - -- outcome: Executable scenario: Failed event processing and replay lifecycle - -```gwt -Given the module is imported from platform-core -And the system time is "2024-01-15T12:00:00Z" -When I create a dead letter for agent "churn-agent" subscription "sub-001" event "evt-500" position 500 with Error "LLM timeout" and context correlationId "corr-abc" triggeringPattern "churn-risk" and I advance time by 5000 ms and increment wit… -Then the dead letter status is "pending" -And the dead letter attemptCount is 1 -And validateAgentDeadLetter returns true -And the dead letter attemptCount is 2 -And isDeadLetterPending returns true -And the dead letter attemptCount is 3 -And the dead letter status is "replayed" -And isDeadLetterReplayed returns true -And marking the dead letter as ignored throws -And marking the dead letter as replayed throws -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.examples/s-083-obsolete-event-being-ignored-lifecycle.sdp.md b/specs/behavior/platform-core/agent/dead-letter.examples/s-083-obsolete-event-being-ignored-lifecycle.sdp.md deleted file mode 100644 index d9e02388..00000000 --- a/specs/behavior/platform-core/agent/dead-letter.examples/s-083-obsolete-event-being-ignored-lifecycle.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.dead-letter.obsolete-event-being-ignored-lifecycle -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.dead-letter ---- -# Obsolete event being ignored lifecycle - -## Intent - -- outcome: Executable scenario: Obsolete event being ignored lifecycle - -```gwt -Given the module is imported from platform-core -And the system time is "2024-01-15T12:00:00Z" -When I create a dead letter for agent "inventory-agent" subscription "sub-002" event "evt-obsolete" position 100 with string error "Processing failed" and I mark the dead letter as ignored -Then isDeadLetterPending returns true -And the dead letter status is "ignored" -And isDeadLetterIgnored returns true -And marking the dead letter as replayed throws -``` diff --git a/specs/behavior/platform-core/agent/dead-letter.sdp.md b/specs/behavior/platform-core/agent/dead-letter.sdp.md index 5b7dc45b..66e5567f 100644 --- a/specs/behavior/platform-core/agent/dead-letter.sdp.md +++ b/specs/behavior/platform-core/agent/dead-letter.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.dead-letter kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: Agent Dead Letter Queue +- outcome: Sanitize and record failed agent event processing so a pending dead letter can be replayed or ignored without leaking stack traces or mixing process-manager semantics. +- value: Operators can investigate, replay, or ignore poisoned agent work from a schema-validated queue with pending-only status transitions. ## Behavior diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-001-subscribe-to-single-event-type.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-001-subscribe-to-single-event-type.sdp.md deleted file mode 100644 index 18c3fe9a..00000000 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-001-subscribe-to-single-event-type.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.event-subscription.subscribe-to-single-event-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.event-subscription ---- -# Subscribe to single event type - -## Intent - -- outcome: Executable scenario: Subscribe to single event type - -```gwt -Given the agent module is imported from platform-core -And the EventBus is available -And an agent BC with subscription to "OrderSubmitted" -When an OrderSubmitted event is published -Then the agent receives the event -And event has full fat-event payload -``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-002-subscribe-to-multiple-event-types.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-002-subscribe-to-multiple-event-types.sdp.md deleted file mode 100644 index bcc8d29f..00000000 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-002-subscribe-to-multiple-event-types.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.event-subscription.subscribe-to-multiple-event-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.event-subscription ---- -# Subscribe to multiple event types - -## Intent - -- outcome: Executable scenario: Subscribe to multiple event types - -```gwt -Given the agent module is imported from platform-core -And the EventBus is available -And an agent BC with subscriptions: -When each event type is published -Then the agent receives all three events -``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-003-agent-does-not-receive-unsubscribed-events.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-003-agent-does-not-receive-unsubscribed-events.sdp.md deleted file mode 100644 index f6f6202d..00000000 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-003-agent-does-not-receive-unsubscribed-events.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.event-subscription.agent-does-not-receive-unsubscribed-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.event-subscription ---- -# Agent does not receive unsubscribed events - -## Intent - -- outcome: Executable scenario: Agent does not receive unsubscribed events - -```gwt -Given the agent module is imported from platform-core -And the EventBus is available -And an agent BC subscribed to "OrderSubmitted" only -When an OrderCancelled event is published -Then the agent does not receive the event -``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-004-filter-by-payload-field.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-004-filter-by-payload-field.sdp.md deleted file mode 100644 index 121b9fcd..00000000 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-004-filter-by-payload-field.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.event-subscription.filter-by-payload-field -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.event-subscription ---- -# Filter by payload field - -## Intent - -- outcome: Executable scenario: Filter by payload field - -```gwt -Given the agent module is imported from platform-core -And the EventBus is available -And an agent subscribed with filter: amount > 100 -When OrderSubmitted with amount 50 is published and OrderSubmitted with amount 150 is published -Then the agent receives only the amount=150 event -``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-005-filter-by-customer-segment.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-005-filter-by-customer-segment.sdp.md deleted file mode 100644 index 33817576..00000000 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-005-filter-by-customer-segment.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.event-subscription.filter-by-customer-segment -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.event-subscription ---- -# Filter by customer segment - -## Intent - -- outcome: Executable scenario: Filter by customer segment - -```gwt -Given the agent module is imported from platform-core -And the EventBus is available -And an agent subscribed with filter: customer.segment = 'premium' -When event for premium customer is published and event for standard customer is published -Then the agent receives only the premium customer event -``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-006-events-delivered-in-publication-order.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-006-events-delivered-in-publication-order.sdp.md deleted file mode 100644 index 52382fd9..00000000 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-006-events-delivered-in-publication-order.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.event-subscription.events-delivered-in-publication-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.event-subscription ---- -# Events delivered in publication order - -## Intent - -- outcome: Executable scenario: Events delivered in publication order - -```gwt -Given the agent module is imported from platform-core -And the EventBus is available -And an agent subscribed to OrderSubmitted -When events E1, E2, E3 are published in sequence -Then the agent receives events in order: E1, E2, E3 -``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-007-events-from-same-stream-maintain-order.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-007-events-from-same-stream-maintain-order.sdp.md deleted file mode 100644 index 911261fc..00000000 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-007-events-from-same-stream-maintain-order.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.event-subscription.events-from-same-stream-maintain-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.event-subscription ---- -# Events from same stream maintain order - -## Intent - -- outcome: Executable scenario: Events from same stream maintain order - -```gwt -Given the agent module is imported from platform-core -And the EventBus is available -And events for customer "cust_123" with sequence 1, 2, 3 -When agent processes events -Then events are processed in sequence order -``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-008-agent-resumes-from-last-processed-position-after-restart.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-008-agent-resumes-from-last-processed-position-after-restart.sdp.md deleted file mode 100644 index e120e874..00000000 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-008-agent-resumes-from-last-processed-position-after-restart.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.event-subscription.agent-resumes-from-last-processed-position-after-restart -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.event-subscription ---- -# Agent resumes from last processed position after restart - -## Intent - -- outcome: Executable scenario: Agent resumes from last processed position after restart - -```gwt -Given the agent module is imported from platform-core -And the EventBus is available -And an agent subscribed to OrderSubmitted -And agent has processed events up to position 100 -When server restarts and agent subscription resumes -Then processing continues from position 101 -And no events are reprocessed -And no events are lost -``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-009-checkpoint-updated-after-successful-analysis.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-009-checkpoint-updated-after-successful-analysis.sdp.md deleted file mode 100644 index cb43b502..00000000 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-009-checkpoint-updated-after-successful-analysis.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.event-subscription.checkpoint-updated-after-successful-analysis -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.event-subscription ---- -# Checkpoint updated after successful analysis - -## Intent - -- outcome: Executable scenario: Checkpoint updated after successful analysis - -```gwt -Given the agent module is imported from platform-core -And the EventBus is available -And an agent subscribed to OrderSubmitted -And agent has processed events up to position 100 -When an event at position 101 is successfully analyzed -Then the checkpoint should be updated to position 101 -And eventsProcessed counter should increment by 1 -And lastEventId should be updated -``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-010-failed-analysis-records-to-dead-letter-without-advancing-checkpoint.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-010-failed-analysis-records-to-dead-letter-without-advancing-checkpoint.sdp.md deleted file mode 100644 index 8e076da9..00000000 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-010-failed-analysis-records-to-dead-letter-without-advancing-checkpoint.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.event-subscription.failed-analysis-records-to-dead-letter-without-advancing-checkpoint -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.event-subscription ---- -# Failed analysis records to dead letter without advancing checkpoint - -## Intent - -- outcome: Executable scenario: Failed analysis records to dead letter without advancing checkpoint - -```gwt -Given the agent module is imported from platform-core -And the EventBus is available -And an agent subscribed to OrderSubmitted -And agent has processed events up to position 100 -When analysis of event at position 101 fails -Then the checkpoint should remain at position 100 -And a dead letter should be recorded with the error -And eventsProcessed counter should not increment -``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-011-checkpoint-persists-agent-subscription-state.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-011-checkpoint-persists-agent-subscription-state.sdp.md deleted file mode 100644 index 07194653..00000000 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-011-checkpoint-persists-agent-subscription-state.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.event-subscription.checkpoint-persists-agent-subscription-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.event-subscription ---- -# Checkpoint persists agent subscription state - -## Intent - -- outcome: Executable scenario: Checkpoint persists agent subscription state - -```gwt -Given the agent module is imported from platform-core -And the EventBus is available -And an agent with id "churn-detector" -And subscription is active -When checkpoint is queried -Then it returns: -``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-012-pause-subscription.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-012-pause-subscription.sdp.md deleted file mode 100644 index f106910f..00000000 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-012-pause-subscription.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.event-subscription.pause-subscription -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.event-subscription ---- -# Pause subscription - -## Intent - -- outcome: Executable scenario: Pause subscription - -```gwt -Given the agent module is imported from platform-core -And the EventBus is available -And an active agent subscription -When I call subscription.pause() and events are published -Then the agent does not receive events during pause -``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-013-resume-subscription.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-013-resume-subscription.sdp.md deleted file mode 100644 index 8e5553ea..00000000 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-013-resume-subscription.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.event-subscription.resume-subscription -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.event-subscription ---- -# Resume subscription - -## Intent - -- outcome: Executable scenario: Resume subscription - -```gwt -Given the agent module is imported from platform-core -And the EventBus is available -And a paused agent subscription -When I call subscription.resume() and events are published -Then the agent receives new events -``` diff --git a/specs/behavior/platform-core/agent/event-subscription.examples/s-014-unsubscribe-stops-all-event-delivery.sdp.md b/specs/behavior/platform-core/agent/event-subscription.examples/s-014-unsubscribe-stops-all-event-delivery.sdp.md deleted file mode 100644 index 9087a6f0..00000000 --- a/specs/behavior/platform-core/agent/event-subscription.examples/s-014-unsubscribe-stops-all-event-delivery.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.event-subscription.unsubscribe-stops-all-event-delivery -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.event-subscription ---- -# Unsubscribe stops all event delivery - -## Intent - -- outcome: Executable scenario: Unsubscribe stops all event delivery - -```gwt -Given the agent module is imported from platform-core -And the EventBus is available -And an active agent subscription -When I call subscription.unsubscribe() -Then subsequent events are not delivered to agent -``` diff --git a/specs/behavior/platform-core/agent/event-subscription.sdp.md b/specs/behavior/platform-core/agent/event-subscription.sdp.md index ea4c24db..8ea1f891 100644 --- a/specs/behavior/platform-core/agent/event-subscription.sdp.md +++ b/specs/behavior/platform-core/agent/event-subscription.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.event-subscription kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: agents to subscribe to event streams via EventBus so that agents can react to business events in real-time +- outcome: Agents subscribe to event streams via EventBus. +- value: Agents can react to business events in real time. ## Behavior diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-001-execution-mode-based-on-confidence.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-001-execution-mode-based-on-confidence.sdp.md deleted file mode 100644 index 480a96ea..00000000 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-001-execution-mode-based-on-confidence.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.human-in-loop.execution-mode-based-on-confidence -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.human-in-loop ---- -# Execution mode based on confidence - -## Intent - -- outcome: Executable scenario: Execution mode based on confidence - -```gwt -Given the agent module is imported from platform-core -And the human-in-loop configuration is available -And confidence threshold is 0.8 -And agent detects pattern with confidence value -When determining execution mode -Then mode should be "value" -``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-002-custom-threshold-per-agent.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-002-custom-threshold-per-agent.sdp.md deleted file mode 100644 index b95f6ce6..00000000 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-002-custom-threshold-per-agent.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.human-in-loop.custom-threshold-per-agent -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.human-in-loop ---- -# Custom threshold per agent - -## Intent - -- outcome: Executable scenario: Custom threshold per agent - -```gwt -Given the agent module is imported from platform-core -And the human-in-loop configuration is available -And agent "high-risk-detector" with threshold 0.95 -And agent "low-risk-notifier" with threshold 0.5 -When both detect patterns with confidence 0.75 -Then high-risk-detector flags for review -And low-risk-notifier auto-executes -``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-003-requires-approval-action-with-high-confidence.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-003-requires-approval-action-with-high-confidence.sdp.md deleted file mode 100644 index ed740e91..00000000 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-003-requires-approval-action-with-high-confidence.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.human-in-loop.requires-approval-action-with-high-confidence -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.human-in-loop ---- -# RequiresApproval action with high confidence - -## Intent - -- outcome: Executable scenario: RequiresApproval action with high confidence - -```gwt -Given the agent module is imported from platform-core -And the human-in-loop configuration is available -And action "AccountSuspension" in requiresApproval list -And agent confidence is 0.99 -When determining execution mode -Then mode should be "flag-for-review" -``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-004-auto-approve-action-with-low-confidence.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-004-auto-approve-action-with-low-confidence.sdp.md deleted file mode 100644 index 9396b923..00000000 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-004-auto-approve-action-with-low-confidence.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.human-in-loop.auto-approve-action-with-low-confidence -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.human-in-loop ---- -# AutoApprove action with low confidence - -## Intent - -- outcome: Executable scenario: AutoApprove action with low confidence - -```gwt -Given the agent module is imported from platform-core -And the human-in-loop configuration is available -And action "LowRiskNotification" in autoApprove list -And agent confidence is 0.5 -When determining execution mode -Then mode should be "auto-execute" -``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-005-configure-multiple-approval-requirements.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-005-configure-multiple-approval-requirements.sdp.md deleted file mode 100644 index 86849a89..00000000 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-005-configure-multiple-approval-requirements.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.human-in-loop.configure-multiple-approval-requirements -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.human-in-loop ---- -# Configure multiple approval requirements - -## Intent - -- outcome: Executable scenario: Configure multiple approval requirements - -```gwt -Given the agent module is imported from platform-core -And the human-in-loop configuration is available -And requiresApproval list: -When any of these actions are proposed -Then all require human approval -``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-006-create-review-task.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-006-create-review-task.sdp.md deleted file mode 100644 index 74aaba2c..00000000 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-006-create-review-task.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.human-in-loop.create-review-task -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.human-in-loop ---- -# Create review task - -## Intent - -- outcome: Executable scenario: Create review task - -```gwt -Given the agent module is imported from platform-core -And the human-in-loop configuration is available -And an action flagged for review -When action is submitted -Then AgentActionPending event is recorded -And review task is created -And task includes action details and reasoning -``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-007-approve-pending-action.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-007-approve-pending-action.sdp.md deleted file mode 100644 index 01bbc188..00000000 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-007-approve-pending-action.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.human-in-loop.approve-pending-action -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.human-in-loop ---- -# Approve pending action - -## Intent - -- outcome: Executable scenario: Approve pending action - -```gwt -Given the agent module is imported from platform-core -And the human-in-loop configuration is available -And a pending action with id "action_123" -When reviewer approves the action -Then ApprovalGranted event is recorded -And original command is executed -``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-008-reject-pending-action.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-008-reject-pending-action.sdp.md deleted file mode 100644 index c62dcfdb..00000000 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-008-reject-pending-action.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.human-in-loop.reject-pending-action -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.human-in-loop ---- -# Reject pending action - -## Intent - -- outcome: Executable scenario: Reject pending action - -```gwt -Given the agent module is imported from platform-core -And the human-in-loop configuration is available -And a pending action with id "action_123" -When reviewer rejects with reason "False positive" -Then ApprovalRejected event is recorded -And command is NOT executed -And rejection reason is recorded -``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-009-action-expires-after-timeout.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-009-action-expires-after-timeout.sdp.md deleted file mode 100644 index ac7bbf77..00000000 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-009-action-expires-after-timeout.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.human-in-loop.action-expires-after-timeout -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.human-in-loop ---- -# Action expires after timeout - -## Intent - -- outcome: Executable scenario: Action expires after timeout - -```gwt -Given the agent module is imported from platform-core -And the human-in-loop configuration is available -And approval timeout is 24 hours -And an action flagged for review -When 24 hours pass without review -Then ApprovalExpired event is recorded -And action status becomes "expired" -``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-010-custom-timeout-per-action-type.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-010-custom-timeout-per-action-type.sdp.md deleted file mode 100644 index daf1ea02..00000000 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-010-custom-timeout-per-action-type.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.human-in-loop.custom-timeout-per-action-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.human-in-loop ---- -# Custom timeout per action type - -## Intent - -- outcome: Executable scenario: Custom timeout per action type - -```gwt -Given the agent module is imported from platform-core -And the human-in-loop configuration is available -And AccountSuspension timeout is 1 hour -And LowRiskNotification timeout is 7 days -When both are flagged for review -Then each uses its configured timeout -``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.examples/s-011-approve-action-near-timeout.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.examples/s-011-approve-action-near-timeout.sdp.md deleted file mode 100644 index 0dbc6778..00000000 --- a/specs/behavior/platform-core/agent/human-in-loop.examples/s-011-approve-action-near-timeout.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.human-in-loop.approve-action-near-timeout -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.human-in-loop ---- -# Approve action near timeout - -## Intent - -- outcome: Executable scenario: Approve action near timeout - -```gwt -Given the agent module is imported from platform-core -And the human-in-loop configuration is available -And an action 23 hours old -And timeout is 24 hours -When reviewer approves at 23h 59m -Then approval succeeds -And command is executed -``` diff --git a/specs/behavior/platform-core/agent/human-in-loop.sdp.md b/specs/behavior/platform-core/agent/human-in-loop.sdp.md index a41dd3d4..fd8bede1 100644 --- a/specs/behavior/platform-core/agent/human-in-loop.sdp.md +++ b/specs/behavior/platform-core/agent/human-in-loop.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.human-in-loop kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,11 +11,12 @@ relations: ## Intent - actor: a platform developer -- outcome: configurable human-in-loop controls so that agent actions can be reviewed when appropriate +- outcome: Configure human-in-loop controls so agent actions can be reviewed when appropriate. +- value: Confidence thresholds, approval requirements, and timeouts decide auto-execution versus human review. ## Behavior -- rule: Confidence threshold determines execution mode -- rule: Some actions always require approval -- rule: Flagged actions create review tasks -- rule: Pending actions expire after timeout +- rule: Confidence threshold determines execution mode — high confidence auto-executes, low confidence requires review. +- rule: Some actions always require approval — critical actions bypass the confidence threshold. +- rule: Flagged actions create review tasks — human reviewers see pending actions. +- rule: Pending actions expire after timeout — unreviewed actions do not linger indefinitely. diff --git a/specs/behavior/platform-core/agent/init.examples/s-001-rejects-empty-string-id.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-001-rejects-empty-string-id.sdp.md deleted file mode 100644 index 5a45f330..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-001-rejects-empty-string-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.rejects-empty-string-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Rejects empty string id - -## Intent - -- outcome: Executable scenario: Rejects empty string id - -```gwt -Given a valid agent config with id overridden to "" -When I validate the agent config -Then the validation result is invalid with code "AGENT_ID_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-002-rejects-undefined-id.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-002-rejects-undefined-id.sdp.md deleted file mode 100644 index 9456cf76..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-002-rejects-undefined-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.rejects-undefined-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Rejects undefined id - -## Intent - -- outcome: Executable scenario: Rejects undefined id - -```gwt -Given a valid agent config with id deleted -When I validate the agent config -Then the validation result is invalid with code "AGENT_ID_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-003-rejects-whitespace-only-id.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-003-rejects-whitespace-only-id.sdp.md deleted file mode 100644 index 3dd6450a..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-003-rejects-whitespace-only-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.rejects-whitespace-only-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Rejects whitespace-only id - -## Intent - -- outcome: Executable scenario: Rejects whitespace-only id - -```gwt -Given a valid agent config with id overridden to " " -When I validate the agent config -Then the validation result is invalid with code "AGENT_ID_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-004-rejects-empty-subscriptions-array.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-004-rejects-empty-subscriptions-array.sdp.md deleted file mode 100644 index 0d1410d1..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-004-rejects-empty-subscriptions-array.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.rejects-empty-subscriptions-array -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Rejects empty subscriptions array - -## Intent - -- outcome: Executable scenario: Rejects empty subscriptions array - -```gwt -Given a valid agent config with subscriptions overridden to empty array -When I validate the agent config -Then the validation result is invalid with code "NO_SUBSCRIPTIONS" -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-005-rejects-undefined-subscriptions.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-005-rejects-undefined-subscriptions.sdp.md deleted file mode 100644 index 2b256b3a..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-005-rejects-undefined-subscriptions.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.rejects-undefined-subscriptions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Rejects undefined subscriptions - -## Intent - -- outcome: Executable scenario: Rejects undefined subscriptions - -```gwt -Given a valid agent config with subscriptions deleted -When I validate the agent config -Then the validation result is invalid with code "NO_SUBSCRIPTIONS" -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-006-rejects-negative-threshold.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-006-rejects-negative-threshold.sdp.md deleted file mode 100644 index d5ccf323..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-006-rejects-negative-threshold.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.rejects-negative-threshold -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Rejects negative threshold - -## Intent - -- outcome: Executable scenario: Rejects negative threshold - -```gwt -Given a valid agent config with confidenceThreshold overridden to -0.1 -When I validate the agent config -Then the validation result is invalid with code "INVALID_CONFIDENCE_THRESHOLD" -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-007-rejects-threshold-greater-than-1.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-007-rejects-threshold-greater-than-1.sdp.md deleted file mode 100644 index 36672f43..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-007-rejects-threshold-greater-than-1.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.rejects-threshold-greater-than-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Rejects threshold greater than 1 - -## Intent - -- outcome: Executable scenario: Rejects threshold greater than 1 - -```gwt -Given a valid agent config with confidenceThreshold overridden to 1.5 -When I validate the agent config -Then the validation result is invalid with code "INVALID_CONFIDENCE_THRESHOLD" -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-008-rejects-empty-pattern-window-duration.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-008-rejects-empty-pattern-window-duration.sdp.md deleted file mode 100644 index 04b77819..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-008-rejects-empty-pattern-window-duration.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.rejects-empty-pattern-window-duration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Rejects empty pattern window duration - -## Intent - -- outcome: Executable scenario: Rejects empty pattern window duration - -```gwt -Given a valid agent config with patternWindow duration overridden to "" -When I validate the agent config -Then the validation result is invalid with code "INVALID_PATTERN_WINDOW" -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-009-rejects-whitespace-only-pattern-window-duration.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-009-rejects-whitespace-only-pattern-window-duration.sdp.md deleted file mode 100644 index 7111ffed..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-009-rejects-whitespace-only-pattern-window-duration.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.rejects-whitespace-only-pattern-window-duration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Rejects whitespace-only pattern window duration - -## Intent - -- outcome: Executable scenario: Rejects whitespace-only pattern window duration - -```gwt -Given a valid agent config with patternWindow duration overridden to " " -When I validate the agent config -Then the validation result is invalid with code "INVALID_PATTERN_WINDOW" -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-010-rejects-action-in-both-requires-approval-and-auto-approve.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-010-rejects-action-in-both-requires-approval-and-auto-approve.sdp.md deleted file mode 100644 index 070bd9e3..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-010-rejects-action-in-both-requires-approval-and-auto-approve.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.rejects-action-in-both-requires-approval-and-auto-approve -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Rejects action in both requiresApproval and autoApprove - -## Intent - -- outcome: Executable scenario: Rejects action in both requiresApproval and autoApprove - -```gwt -Given a valid agent config with conflicting approval rules for "DeleteCustomer" -When I validate the agent config -Then the validation result is invalid with code "CONFLICTING_APPROVAL_RULES" -And the validation error message contains "DeleteCustomer" -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-011-rejects-config-with-no-patterns-array.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-011-rejects-config-with-no-patterns-array.sdp.md deleted file mode 100644 index f669cb4f..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-011-rejects-config-with-no-patterns-array.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.rejects-config-with-no-patterns-array -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Rejects config with no patterns array - -## Intent - -- outcome: Executable scenario: Rejects config with no patterns array - -```gwt -Given a valid agent config with patterns deleted -When I validate the agent config -Then the validation result is invalid with code "NO_PATTERNS" -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-012-rejects-config-with-empty-patterns-array.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-012-rejects-config-with-empty-patterns-array.sdp.md deleted file mode 100644 index d14429b6..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-012-rejects-config-with-empty-patterns-array.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.rejects-config-with-empty-patterns-array -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Rejects config with empty patterns array - -## Intent - -- outcome: Executable scenario: Rejects config with empty patterns array - -```gwt -Given a valid agent config with patterns overridden to empty array -When I validate the agent config -Then the validation result is invalid with code "NO_PATTERNS" -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-013-accepts-valid-config-with-patterns.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-013-accepts-valid-config-with-patterns.sdp.md deleted file mode 100644 index c16577ea..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-013-accepts-valid-config-with-patterns.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.accepts-valid-config-with-patterns -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Accepts valid config with patterns - -## Intent - -- outcome: Executable scenario: Accepts valid config with patterns - -```gwt -Given a valid agent config with default values -When I validate the agent config -Then the validation result is valid -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-014-accepts-config-without-confidence-threshold.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-014-accepts-config-without-confidence-threshold.sdp.md deleted file mode 100644 index 4acc020e..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-014-accepts-config-without-confidence-threshold.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.accepts-config-without-confidence-threshold -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Accepts config without confidenceThreshold - -## Intent - -- outcome: Executable scenario: Accepts config without confidenceThreshold - -```gwt -Given a valid agent config with confidenceThreshold deleted -When I validate the agent config -Then the validation result is valid -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-015-transforms-a-standard-event-correctly.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-015-transforms-a-standard-event-correctly.sdp.md deleted file mode 100644 index 352decee..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-015-transforms-a-standard-event-correctly.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.transforms-a-standard-event-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Transforms a standard event correctly - -## Intent - -- outcome: Executable scenario: Transforms a standard event correctly - -```gwt -Given a standard published event and correlation chain -When I transform to agent handler args with agentId "my-agent" -Then the handler args contain the expected fields: -And the handler args payload matches the event payload -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-016-wraps-array-payload-in-raw-wrapper.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-016-wraps-array-payload-in-raw-wrapper.sdp.md deleted file mode 100644 index d2de2ff8..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-016-wraps-array-payload-in-raw-wrapper.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.wraps-array-payload-in-raw-wrapper -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Wraps array payload in _raw wrapper - -## Intent - -- outcome: Executable scenario: Wraps array payload in _raw wrapper - -```gwt -Given a published event with array payload -When I transform to agent handler args with agentId "agent-1" -Then the handler args payload equals raw-wrapped array -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-017-wraps-null-payload-in-raw-wrapper.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-017-wraps-null-payload-in-raw-wrapper.sdp.md deleted file mode 100644 index a399eac3..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-017-wraps-null-payload-in-raw-wrapper.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.wraps-null-payload-in-raw-wrapper -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Wraps null payload in _raw wrapper - -## Intent - -- outcome: Executable scenario: Wraps null payload in _raw wrapper - -```gwt -Given a published event with null payload -When I transform to agent handler args with agentId "agent-1" -Then the handler args payload equals raw-wrapped null -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-018-passes-through-object-payloads-without-wrapping.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-018-passes-through-object-payloads-without-wrapping.sdp.md deleted file mode 100644 index 3be41fd0..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-018-passes-through-object-payloads-without-wrapping.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.passes-through-object-payloads-without-wrapping -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Passes through object payloads without wrapping - -## Intent - -- outcome: Executable scenario: Passes through object payloads without wrapping - -```gwt -Given a published event with nested object payload -When I transform to agent handler args with agentId "agent-1" -Then the handler args payload matches the event payload -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-019-uses-correlation-id-from-the-chain-not-from-the-event.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-019-uses-correlation-id-from-the-chain-not-from-the-event.sdp.md deleted file mode 100644 index 766edf57..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-019-uses-correlation-id-from-the-chain-not-from-the-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.uses-correlation-id-from-the-chain-not-from-the-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Uses correlationId from the chain not from the event - -## Intent - -- outcome: Executable scenario: Uses correlationId from the chain not from the event - -```gwt -Given a published event with its own correlationId "event_corr" -When I transform to agent handler args with agentId "agent-1" -Then the handler args correlationId is "corr_chain_001" -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-020-subscription-id-starts-with-sub-prefix.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-020-subscription-id-starts-with-sub-prefix.sdp.md deleted file mode 100644 index 0c531185..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-020-subscription-id-starts-with-sub-prefix.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.subscription-id-starts-with-sub-prefix -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Subscription ID starts with sub_ prefix - -## Intent - -- outcome: Executable scenario: Subscription ID starts with sub_ prefix - -```gwt -Given the system time is fixed at "2024-01-15T12:00:00Z" -When I generate a subscription ID for "my-agent" -Then the subscription ID starts with "sub_" -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-021-subscription-id-contains-the-agent-id.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-021-subscription-id-contains-the-agent-id.sdp.md deleted file mode 100644 index 415fe4dd..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-021-subscription-id-contains-the-agent-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.subscription-id-contains-the-agent-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Subscription ID contains the agentId - -## Intent - -- outcome: Executable scenario: Subscription ID contains the agentId - -```gwt -Given the system time is fixed at "2024-01-15T12:00:00Z" -When I generate a subscription ID for "churn-risk-agent" -Then the subscription ID contains "churn-risk-agent" -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-022-subscription-id-contains-a-uuid-segment.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-022-subscription-id-contains-a-uuid-segment.sdp.md deleted file mode 100644 index 1f20c20d..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-022-subscription-id-contains-a-uuid-segment.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.subscription-id-contains-a-uuid-segment -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Subscription ID contains a UUID segment - -## Intent - -- outcome: Executable scenario: Subscription ID contains a UUID segment - -```gwt -Given the system time is fixed at "2024-01-15T12:00:00Z" -When I generate a subscription ID for "my-agent" -Then the subscription ID contains a UUIDv7 suffix -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-023-produces-different-i-ds-when-timestamp-differs.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-023-produces-different-i-ds-when-timestamp-differs.sdp.md deleted file mode 100644 index 839c173d..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-023-produces-different-i-ds-when-timestamp-differs.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.produces-different-i-ds-when-timestamp-differs -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Produces different IDs when timestamp differs - -## Intent - -- outcome: Executable scenario: Produces different IDs when timestamp differs - -```gwt -Given the system time is fixed at "2024-01-15T12:00:00Z" -When I generate two subscription IDs for "my-agent" with 1ms between them -Then the two subscription IDs are different -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-024-returns-success-with-handle-for-a-valid-config.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-024-returns-success-with-handle-for-a-valid-config.sdp.md deleted file mode 100644 index 95b55efc..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-024-returns-success-with-handle-for-a-valid-config.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.returns-success-with-handle-for-a-valid-config -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Returns success with handle for a valid config - -## Intent - -- outcome: Executable scenario: Returns success with handle for a valid config - -```gwt -Given a valid agent BC config with id "test-agent" -And mock eventBus and handler dependencies -When I initialize the agent BC -Then the initialization is successful -And the handle has the expected properties: -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-025-returns-error-with-invalid-config-code-for-invalid-config.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-025-returns-error-with-invalid-config-code-for-invalid-config.sdp.md deleted file mode 100644 index 5d1b8704..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-025-returns-error-with-invalid-config-code-for-invalid-config.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.returns-error-with-invalid-config-code-for-invalid-config -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Returns error with INVALID_CONFIG code for invalid config - -## Intent - -- outcome: Executable scenario: Returns error with INVALID_CONFIG code for invalid config - -```gwt -Given a valid agent BC config with id "" -And mock eventBus and handler dependencies -When I initialize the agent BC -Then the initialization failed with code "INVALID_CONFIG" -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-026-uses-existing-checkpoint-when-provided.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-026-uses-existing-checkpoint-when-provided.sdp.md deleted file mode 100644 index e06c2796..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-026-uses-existing-checkpoint-when-provided.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.uses-existing-checkpoint-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Uses existing checkpoint when provided - -## Intent - -- outcome: Executable scenario: Uses existing checkpoint when provided - -```gwt -Given a valid agent BC config with id "test-agent" -And mock eventBus and handler dependencies -And an existing checkpoint with lastProcessedPosition 200 -When I initialize the agent BC with the existing checkpoint -Then the initialization is successful -And the handle checkpoint has lastProcessedPosition 200 -And the handle checkpoint has status "active" -``` diff --git a/specs/behavior/platform-core/agent/init.examples/s-027-creates-a-new-checkpoint-when-no-existing-checkpoint-provided.sdp.md b/specs/behavior/platform-core/agent/init.examples/s-027-creates-a-new-checkpoint-when-no-existing-checkpoint-provided.sdp.md deleted file mode 100644 index d066025b..00000000 --- a/specs/behavior/platform-core/agent/init.examples/s-027-creates-a-new-checkpoint-when-no-existing-checkpoint-provided.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.init.creates-a-new-checkpoint-when-no-existing-checkpoint-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.init ---- -# Creates a new checkpoint when no existing checkpoint provided - -## Intent - -- outcome: Executable scenario: Creates a new checkpoint when no existing checkpoint provided - -```gwt -Given a valid agent BC config with id "fresh-agent" -And mock eventBus and handler dependencies -When I initialize the agent BC -Then the initialization is successful -And the handle checkpoint has agentId "fresh-agent" -And the handle checkpoint has lastProcessedPosition -1 -And the handle checkpoint has eventsProcessed 0 -And the handle checkpoint has status "active" -``` diff --git a/specs/behavior/platform-core/agent/init.sdp.md b/specs/behavior/platform-core/agent/init.sdp.md index 20c88f4e..a1107a46 100644 --- a/specs/behavior/platform-core/agent/init.sdp.md +++ b/specs/behavior/platform-core/agent/init.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.init kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,20 +10,21 @@ relations: ## Intent -- outcome: Agent Initialization +- outcome: Validate agent BC config, transform a published event and correlation chain into handler args, generate agent-scoped subscription IDs, and initialize an agent BC with a success handle or INVALID_CONFIG error. +- value: Callers can bootstrap an agent bounded context from a validated config, resuming an existing checkpoint or creating a fresh one. ## Behavior -- rule: validateAgentBCConfig rejects invalid agent ID -- rule: validateAgentBCConfig rejects missing subscriptions -- rule: validateAgentBCConfig rejects invalid confidence threshold -- rule: validateAgentBCConfig rejects invalid pattern window -- rule: validateAgentBCConfig rejects conflicting approval rules -- rule: validateAgentBCConfig rejects missing patterns -- rule: validateAgentBCConfig accepts valid configurations -- rule: toAgentHandlerArgs transforms event and correlation chain -- rule: generateSubscriptionId produces deterministic agent-scoped IDs -- rule: initializeAgentBC returns success handle for valid config -- rule: initializeAgentBC returns error for invalid config -- rule: initializeAgentBC uses existing checkpoint when provided -- rule: initializeAgentBC creates new checkpoint when none provided +- rule: validateAgentBCConfig rejects empty, undefined, or whitespace-only id with AGENT_ID_REQUIRED. +- rule: validateAgentBCConfig rejects empty or undefined subscriptions with NO_SUBSCRIPTIONS. +- rule: validateAgentBCConfig rejects a confidence threshold outside [0, 1] with INVALID_CONFIDENCE_THRESHOLD. +- rule: validateAgentBCConfig rejects empty or whitespace-only pattern window duration with INVALID_PATTERN_WINDOW. +- rule: validateAgentBCConfig rejects an action in both requiresApproval and autoApprove with CONFLICTING_APPROVAL_RULES. +- rule: validateAgentBCConfig rejects missing or empty patterns with NO_PATTERNS. +- rule: validateAgentBCConfig accepts a well-formed config, including when optional confidenceThreshold is omitted. +- rule: toAgentHandlerArgs transforms PublishedEvent and CorrelationChain into AgentEventHandlerArgs using the chain correlationId, wrapping non-object payloads in _raw. +- rule: generateSubscriptionId produces IDs that start with sub_, contain the agentId, include a UUIDv7 suffix, and differ when regenerated. +- rule: initializeAgentBC returns a success handle with agentId, config, subscription, and checkpoint for valid config. +- rule: initializeAgentBC returns INVALID_CONFIG for invalid config. +- rule: initializeAgentBC uses existingCheckpoint when provided instead of creating a new one. +- rule: initializeAgentBC creates a fresh checkpoint at lastProcessedPosition -1 with 0 events processed when none is provided. diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-001-start-agent-command-carries-type-and-required-fields.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-001-start-agent-command-carries-type-and-required-fields.sdp.md deleted file mode 100644 index ac9ed339..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-001-start-agent-command-carries-type-and-required-fields.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-commands.start-agent-command-carries-type-and-required-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-commands ---- -# StartAgentCommand carries type and required fields - -## Intent - -- outcome: Executable scenario: StartAgentCommand carries type and required fields - -```gwt -Given a StartAgentCommand with commandId "cmd-001" agentId "agent-001" correlationId "corr-001" -When the scenario runs -Then the command has the following properties: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-002-pause-agent-command-carries-optional-reason-when-provided.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-002-pause-agent-command-carries-optional-reason-when-provided.sdp.md deleted file mode 100644 index b589ee97..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-002-pause-agent-command-carries-optional-reason-when-provided.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-commands.pause-agent-command-carries-optional-reason-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-commands ---- -# PauseAgentCommand carries optional reason when provided - -## Intent - -- outcome: Executable scenario: PauseAgentCommand carries optional reason when provided - -```gwt -Given a PauseAgentCommand with commandId "cmd-002" agentId "agent-001" correlationId "corr-002" reason "maintenance window" -When the scenario runs -Then the command type is "PauseAgent" -And the command reason is "maintenance window" -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-003-pause-agent-command-has-undefined-reason-when-omitted.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-003-pause-agent-command-has-undefined-reason-when-omitted.sdp.md deleted file mode 100644 index 11e028cc..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-003-pause-agent-command-has-undefined-reason-when-omitted.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-commands.pause-agent-command-has-undefined-reason-when-omitted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-commands ---- -# PauseAgentCommand has undefined reason when omitted - -## Intent - -- outcome: Executable scenario: PauseAgentCommand has undefined reason when omitted - -```gwt -Given a PauseAgentCommand with commandId "cmd-003" agentId "agent-001" correlationId "corr-003" and no reason -When the scenario runs -Then the command reason is undefined -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-004-resume-agent-command-carries-correct-type.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-004-resume-agent-command-carries-correct-type.sdp.md deleted file mode 100644 index 35b63477..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-004-resume-agent-command-carries-correct-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-commands.resume-agent-command-carries-correct-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-commands ---- -# ResumeAgentCommand carries correct type - -## Intent - -- outcome: Executable scenario: ResumeAgentCommand carries correct type - -```gwt -Given a ResumeAgentCommand with commandId "cmd-004" agentId "agent-001" correlationId "corr-004" -When the scenario runs -Then the command type is "ResumeAgent" -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-005-stop-agent-command-carries-optional-reason-when-provided.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-005-stop-agent-command-carries-optional-reason-when-provided.sdp.md deleted file mode 100644 index 84052736..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-005-stop-agent-command-carries-optional-reason-when-provided.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-commands.stop-agent-command-carries-optional-reason-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-commands ---- -# StopAgentCommand carries optional reason when provided - -## Intent - -- outcome: Executable scenario: StopAgentCommand carries optional reason when provided - -```gwt -Given a StopAgentCommand with commandId "cmd-005" agentId "agent-001" correlationId "corr-005" reason "budget exceeded" -When the scenario runs -Then the command type is "StopAgent" -And the command reason is "budget exceeded" -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-006-reconfigure-agent-command-carries-config-overrides-with-nested-fields.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-006-reconfigure-agent-command-carries-config-overrides-with-nested-fields.sdp.md deleted file mode 100644 index 6181e2e0..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-006-reconfigure-agent-command-carries-config-overrides-with-nested-fields.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-commands.reconfigure-agent-command-carries-config-overrides-with-nested-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-commands ---- -# ReconfigureAgentCommand carries configOverrides with nested fields - -## Intent - -- outcome: Executable scenario: ReconfigureAgentCommand carries configOverrides with nested fields - -```gwt -Given a ReconfigureAgentCommand with config overrides -When the scenario runs -Then the command type is "ReconfigureAgent" -And the config overrides have the following properties: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-007-discriminated-union-narrows-by-type-field-at-runtime.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-007-discriminated-union-narrows-by-type-field-at-runtime.sdp.md deleted file mode 100644 index 68fb8d28..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-007-discriminated-union-narrows-by-type-field-at-runtime.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-commands.discriminated-union-narrows-by-type-field-at-runtime -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-commands ---- -# Discriminated union narrows by type field at runtime - -## Intent - -- outcome: Executable scenario: Discriminated union narrows by type field at runtime - -```gwt -Given an AgentLifecycleCommand of type PauseAgent with reason "test" -When the scenario runs -Then narrowing by type "PauseAgent" yields reason "test" -And narrowing by type "ReconfigureAgent" does not execute -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-008-all-fields-are-optional-in-agent-config-overrides.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-008-all-fields-are-optional-in-agent-config-overrides.sdp.md deleted file mode 100644 index 3fb48623..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-008-all-fields-are-optional-in-agent-config-overrides.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-commands.all-fields-are-optional-in-agent-config-overrides -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-commands ---- -# All fields are optional in AgentConfigOverrides - -## Intent - -- outcome: Executable scenario: All fields are optional in AgentConfigOverrides - -```gwt -Given an empty AgentConfigOverrides object -When the scenario runs -Then the overrides have all undefined top-level fields: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-009-partial-rate-limits-with-only-max-requests-per-minute.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-009-partial-rate-limits-with-only-max-requests-per-minute.sdp.md deleted file mode 100644 index 84477d8e..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-009-partial-rate-limits-with-only-max-requests-per-minute.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-commands.partial-rate-limits-with-only-max-requests-per-minute -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-commands ---- -# Partial rateLimits with only maxRequestsPerMinute - -## Intent - -- outcome: Executable scenario: Partial rateLimits with only maxRequestsPerMinute - -```gwt -Given an AgentConfigOverrides with only maxRequestsPerMinute 10 -When the scenario runs -Then the overrides rateLimits.maxRequestsPerMinute is 10 -And the overrides rateLimits.maxConcurrent is undefined -And the overrides rateLimits.costBudget is undefined -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-010-nested-cost-budget-overrides-with-only-daily.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-010-nested-cost-budget-overrides-with-only-daily.sdp.md deleted file mode 100644 index 49bb0415..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-010-nested-cost-budget-overrides-with-only-daily.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-commands.nested-cost-budget-overrides-with-only-daily -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-commands ---- -# Nested costBudget overrides with only daily - -## Intent - -- outcome: Executable scenario: Nested costBudget overrides with only daily - -```gwt -Given an AgentConfigOverrides with only costBudget daily 25 -When the scenario runs -Then the overrides rateLimits.costBudget.daily is 25 -And the overrides rateLimits.costBudget.alertThreshold is undefined -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-011-error-codes-contain-expected-values-and-count.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-011-error-codes-contain-expected-values-and-count.sdp.md deleted file mode 100644 index 67c59761..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-011-error-codes-contain-expected-values-and-count.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-commands.error-codes-contain-expected-values-and-count -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-commands ---- -# Error codes contain expected values and count - -## Intent - -- outcome: Executable scenario: Error codes contain expected values and count - -```gwt -Given the feature fixture is in place -When the scenario runs -Then the AGENT_LIFECYCLE_ERROR_CODES have the following entries: -And there are exactly 2 error codes -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-012-success-result-carries-state-transition-fields.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-012-success-result-carries-state-transition-fields.sdp.md deleted file mode 100644 index 0ba27c3a..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-012-success-result-carries-state-transition-fields.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-commands.success-result-carries-state-transition-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-commands ---- -# Success result carries state transition fields - -## Intent - -- outcome: Executable scenario: Success result carries state transition fields - -```gwt -Given a success result with agentId "agent-001" previousState "stopped" newState "active" -When the scenario runs -Then the result has the following properties: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-013-failure-result-with-error-code-carries-message-and-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-013-failure-result-with-error-code-carries-message-and-state.sdp.md deleted file mode 100644 index 5376709e..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-013-failure-result-with-error-code-carries-message-and-state.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-commands.failure-result-with-error-code-carries-message-and-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-commands ---- -# Failure result with error code carries message and state - -## Intent - -- outcome: Executable scenario: Failure result with error code carries message and state - -```gwt -Given a failure result with agentId "agent-001" code "INVALID_LIFECYCLE_TRANSITION" message "Cannot PAUSE from stopped state" currentState "stopped" -When the scenario runs -Then the result success is false -And the failure has the following properties: -And the failure message contains "PAUSE" -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-014-failure-result-without-current-state-for-agent-not-found.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-014-failure-result-without-current-state-for-agent-not-found.sdp.md deleted file mode 100644 index e1375f75..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-014-failure-result-without-current-state-for-agent-not-found.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-commands.failure-result-without-current-state-for-agent-not-found -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-commands ---- -# Failure result without currentState for agent not found - -## Intent - -- outcome: Executable scenario: Failure result without currentState for agent not found - -```gwt -Given a failure result with agentId "nonexistent" code "AGENT_NOT_FOUND" message "Agent not found" and no currentState -When the scenario runs -Then the failure currentState is undefined -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-015-discriminated-union-narrows-to-success-branch.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-015-discriminated-union-narrows-to-success-branch.sdp.md deleted file mode 100644 index 4ef75592..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-015-discriminated-union-narrows-to-success-branch.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-commands.discriminated-union-narrows-to-success-branch -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-commands ---- -# Discriminated union narrows to success branch - -## Intent - -- outcome: Executable scenario: Discriminated union narrows to success branch - -```gwt -Given a success result with agentId "agent-001" previousState "active" newState "paused" -When the scenario runs -Then narrowing on success yields previousState "active" and newState "paused" -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-016-discriminated-union-narrows-to-failure-branch.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-016-discriminated-union-narrows-to-failure-branch.sdp.md deleted file mode 100644 index 720d4e4c..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-016-discriminated-union-narrows-to-failure-branch.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-commands.discriminated-union-narrows-to-failure-branch -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-commands ---- -# Discriminated union narrows to failure branch - -## Intent - -- outcome: Executable scenario: Discriminated union narrows to failure branch - -```gwt -Given a failure result with agentId "agent-001" code "AGENT_NOT_FOUND" message "Agent not found" and no currentState -When the scenario runs -Then narrowing on failure yields code "AGENT_NOT_FOUND" -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-017-all-lifecycle-validators-are-exported.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-017-all-lifecycle-validators-are-exported.sdp.md deleted file mode 100644 index 05107566..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-commands.examples/s-017-all-lifecycle-validators-are-exported.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-commands.all-lifecycle-validators-are-exported -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-commands ---- -# All lifecycle validators are exported - -## Intent - -- outcome: Executable scenario: All lifecycle validators are exported - -```gwt -Given the feature fixture is in place -When the scenario runs -Then the following validators are defined: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-commands.sdp.md b/specs/behavior/platform-core/agent/lifecycle-commands.sdp.md index 260a38af..a9af6db6 100644 --- a/specs/behavior/platform-core/agent/lifecycle-commands.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-commands.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.lifecycle-commands kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: Lifecycle Commands +- outcome: Export agent lifecycle command types, error codes, result types, and Convex validators for the discriminated-union command model. +- value: Callers construct StartAgent, PauseAgent, ResumeAgent, StopAgent, and ReconfigureAgent variants and success or failure results without extra fields. ## Behavior diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-001-agent-lifecycle-states-contains-all-four-states.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-001-agent-lifecycle-states-contains-all-four-states.sdp.md deleted file mode 100644 index dd846b3f..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-001-agent-lifecycle-states-contains-all-four-states.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-fsm.agent-lifecycle-states-contains-all-four-states -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-fsm ---- -# AGENT_LIFECYCLE_STATES contains all four states - -## Intent - -- outcome: Executable scenario: AGENT_LIFECYCLE_STATES contains all four states - -```gwt -Given the feature fixture is in place -When the scenario runs -Then AGENT_LIFECYCLE_STATES equals: -And AGENT_LIFECYCLE_STATES has length 4 -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-002-agent-lifecycle-events-contains-all-seven-events.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-002-agent-lifecycle-events-contains-all-seven-events.sdp.md deleted file mode 100644 index d5579675..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-002-agent-lifecycle-events-contains-all-seven-events.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-fsm.agent-lifecycle-events-contains-all-seven-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-fsm ---- -# AGENT_LIFECYCLE_EVENTS contains all seven events - -## Intent - -- outcome: Executable scenario: AGENT_LIFECYCLE_EVENTS contains all seven events - -```gwt -Given the feature fixture is in place -When the scenario runs -Then AGENT_LIFECYCLE_EVENTS equals: -And AGENT_LIFECYCLE_EVENTS has length 7 -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-003-transition-agent-state-returns-correct-target-for-every-valid-transition.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-003-transition-agent-state-returns-correct-target-for-every-valid-transition.sdp.md deleted file mode 100644 index 04a6c604..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-003-transition-agent-state-returns-correct-target-for-every-valid-transition.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-fsm.transition-agent-state-returns-correct-target-for-every-valid-transition -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-fsm ---- -# transitionAgentState returns correct target for every valid transition - -## Intent - -- outcome: Executable scenario: transitionAgentState returns correct target for every valid transition - -```gwt -Given the feature fixture is in place -When the scenario runs -Then transitionAgentState returns the correct target for all valid transitions: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-004-is-valid-agent-transition-returns-true-for-every-valid-pair.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-004-is-valid-agent-transition-returns-true-for-every-valid-pair.sdp.md deleted file mode 100644 index fbd7ac8b..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-004-is-valid-agent-transition-returns-true-for-every-valid-pair.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-fsm.is-valid-agent-transition-returns-true-for-every-valid-pair -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-fsm ---- -# isValidAgentTransition returns true for every valid pair - -## Intent - -- outcome: Executable scenario: isValidAgentTransition returns true for every valid pair - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isValidAgentTransition returns true for all valid pairs: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-005-transition-agent-state-returns-null-for-representative-invalid-pairs.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-005-transition-agent-state-returns-null-for-representative-invalid-pairs.sdp.md deleted file mode 100644 index 4e6b5708..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-005-transition-agent-state-returns-null-for-representative-invalid-pairs.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-fsm.transition-agent-state-returns-null-for-representative-invalid-pairs -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-fsm ---- -# transitionAgentState returns null for representative invalid pairs - -## Intent - -- outcome: Executable scenario: transitionAgentState returns null for representative invalid pairs - -```gwt -Given the feature fixture is in place -When the scenario runs -Then transitionAgentState returns null for these invalid pairs: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-006-exactly-18-invalid-pairs-exist-and-all-return-false.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-006-exactly-18-invalid-pairs-exist-and-all-return-false.sdp.md deleted file mode 100644 index 367390a9..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-006-exactly-18-invalid-pairs-exist-and-all-return-false.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-fsm.exactly-18-invalid-pairs-exist-and-all-return-false -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-fsm ---- -# Exactly 18 invalid pairs exist and all return false - -## Intent - -- outcome: Executable scenario: Exactly 18 invalid pairs exist and all return false - -```gwt -Given the feature fixture is in place -When the scenario runs -Then there are exactly 18 invalid state-event pairs -And isValidAgentTransition returns false for every invalid pair -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-007-exactly-18-invalid-pairs-return-null-from-transition-agent-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-007-exactly-18-invalid-pairs-return-null-from-transition-agent-state.sdp.md deleted file mode 100644 index 5e7641ae..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-007-exactly-18-invalid-pairs-return-null-from-transition-agent-state.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-fsm.exactly-18-invalid-pairs-return-null-from-transition-agent-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-fsm ---- -# Exactly 18 invalid pairs return null from transitionAgentState - -## Intent - -- outcome: Executable scenario: Exactly 18 invalid pairs return null from transitionAgentState - -```gwt -Given the feature fixture is in place -When the scenario runs -Then there are exactly 18 invalid state-event pairs for transitionAgentState -And transitionAgentState returns null for every invalid pair -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-008-assert-valid-agent-transition-returns-next-state-for-valid-transitions.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-008-assert-valid-agent-transition-returns-next-state-for-valid-transitions.sdp.md deleted file mode 100644 index a41bd230..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-008-assert-valid-agent-transition-returns-next-state-for-valid-transitions.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-fsm.assert-valid-agent-transition-returns-next-state-for-valid-transitions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-fsm ---- -# assertValidAgentTransition returns next state for valid transitions - -## Intent - -- outcome: Executable scenario: assertValidAgentTransition returns next state for valid transitions - -```gwt -Given the feature fixture is in place -When the scenario runs -Then assertValidAgentTransition returns the correct state for valid inputs: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-009-assert-valid-agent-transition-throws-for-invalid-transition.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-009-assert-valid-agent-transition-throws-for-invalid-transition.sdp.md deleted file mode 100644 index 3bddeeb5..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-009-assert-valid-agent-transition-throws-for-invalid-transition.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-fsm.assert-valid-agent-transition-throws-for-invalid-transition -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-fsm ---- -# assertValidAgentTransition throws for invalid transition - -## Intent - -- outcome: Executable scenario: assertValidAgentTransition throws for invalid transition - -```gwt -Given the feature fixture is in place -When the scenario runs -Then assertValidAgentTransition throws for from "stopped" event "PAUSE" agentId "test-agent" -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-010-assert-valid-agent-transition-error-message-includes-details.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-010-assert-valid-agent-transition-error-message-includes-details.sdp.md deleted file mode 100644 index f47f3d83..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-010-assert-valid-agent-transition-error-message-includes-details.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-fsm.assert-valid-agent-transition-error-message-includes-details -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-fsm ---- -# assertValidAgentTransition error message includes details - -## Intent - -- outcome: Executable scenario: assertValidAgentTransition error message includes details - -```gwt -Given the feature fixture is in place -When the scenario runs -Then assertValidAgentTransition error for from "stopped" event "PAUSE" agentId "my-agent" contains: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-011-get-valid-agent-events-from-returns-correct-events-for-stopped.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-011-get-valid-agent-events-from-returns-correct-events-for-stopped.sdp.md deleted file mode 100644 index d3e64d9c..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-011-get-valid-agent-events-from-returns-correct-events-for-stopped.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-fsm.get-valid-agent-events-from-returns-correct-events-for-stopped -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-fsm ---- -# getValidAgentEventsFrom returns correct events for stopped - -## Intent - -- outcome: Executable scenario: getValidAgentEventsFrom returns correct events for stopped - -```gwt -Given the state is "stopped" -When the scenario runs -Then getValidAgentEventsFrom returns: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-012-get-valid-agent-events-from-returns-correct-events-for-active.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-012-get-valid-agent-events-from-returns-correct-events-for-active.sdp.md deleted file mode 100644 index 2eb909c3..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-012-get-valid-agent-events-from-returns-correct-events-for-active.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-fsm.get-valid-agent-events-from-returns-correct-events-for-active -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-fsm ---- -# getValidAgentEventsFrom returns correct events for active - -## Intent - -- outcome: Executable scenario: getValidAgentEventsFrom returns correct events for active - -```gwt -Given the state is "active" -When the scenario runs -Then getValidAgentEventsFrom returns: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-013-get-valid-agent-events-from-returns-correct-events-for-paused.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-013-get-valid-agent-events-from-returns-correct-events-for-paused.sdp.md deleted file mode 100644 index 343a47aa..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-013-get-valid-agent-events-from-returns-correct-events-for-paused.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-fsm.get-valid-agent-events-from-returns-correct-events-for-paused -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-fsm ---- -# getValidAgentEventsFrom returns correct events for paused - -## Intent - -- outcome: Executable scenario: getValidAgentEventsFrom returns correct events for paused - -```gwt -Given the state is "paused" -When the scenario runs -Then getValidAgentEventsFrom returns: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-014-get-valid-agent-events-from-returns-correct-events-for-error-recovery.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-014-get-valid-agent-events-from-returns-correct-events-for-error-recovery.sdp.md deleted file mode 100644 index b1fa09c9..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-014-get-valid-agent-events-from-returns-correct-events-for-error-recovery.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-fsm.get-valid-agent-events-from-returns-correct-events-for-error-recovery -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-fsm ---- -# getValidAgentEventsFrom returns correct events for error_recovery - -## Intent - -- outcome: Executable scenario: getValidAgentEventsFrom returns correct events for error_recovery - -```gwt -Given the state is "error_recovery" -When the scenario runs -Then getValidAgentEventsFrom returns: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-015-get-all-agent-transitions-returns-exactly-10-transitions.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-015-get-all-agent-transitions-returns-exactly-10-transitions.sdp.md deleted file mode 100644 index 2ab7d7a0..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-015-get-all-agent-transitions-returns-exactly-10-transitions.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-fsm.get-all-agent-transitions-returns-exactly-10-transitions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-fsm ---- -# getAllAgentTransitions returns exactly 10 transitions - -## Intent - -- outcome: Executable scenario: getAllAgentTransitions returns exactly 10 transitions - -```gwt -Given the feature fixture is in place -When the scenario runs -Then getAllAgentTransitions returns exactly 10 transitions -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-016-each-transition-has-from-event-and-to-fields.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-016-each-transition-has-from-event-and-to-fields.sdp.md deleted file mode 100644 index 747d59e5..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-016-each-transition-has-from-event-and-to-fields.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-fsm.each-transition-has-from-event-and-to-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-fsm ---- -# Each transition has from event and to fields - -## Intent - -- outcome: Executable scenario: Each transition has from event and to fields - -```gwt -Given the feature fixture is in place -When the scenario runs -Then every transition from getAllAgentTransitions has from event and to fields -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-017-get-all-agent-transitions-contains-specific-transitions.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-017-get-all-agent-transitions-contains-specific-transitions.sdp.md deleted file mode 100644 index 50507792..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-017-get-all-agent-transitions-contains-specific-transitions.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-fsm.get-all-agent-transitions-contains-specific-transitions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-fsm ---- -# getAllAgentTransitions contains specific transitions - -## Intent - -- outcome: Executable scenario: getAllAgentTransitions contains specific transitions - -```gwt -Given the feature fixture is in place -When the scenario runs -Then getAllAgentTransitions contains these transitions: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-018-get-all-agent-transitions-returns-same-reference-each-call.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-018-get-all-agent-transitions-returns-same-reference-each-call.sdp.md deleted file mode 100644 index 1868a6bd..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-018-get-all-agent-transitions-returns-same-reference-each-call.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-fsm.get-all-agent-transitions-returns-same-reference-each-call -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-fsm ---- -# getAllAgentTransitions returns same reference each call - -## Intent - -- outcome: Executable scenario: getAllAgentTransitions returns same reference each call - -```gwt -Given the feature fixture is in place -When the scenario runs -Then getAllAgentTransitions returns the same reference on repeated calls -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-019-is-agent-error-state-returns-correct-classification-for-all-states.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-019-is-agent-error-state-returns-correct-classification-for-all-states.sdp.md deleted file mode 100644 index e9054688..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-019-is-agent-error-state-returns-correct-classification-for-all-states.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-fsm.is-agent-error-state-returns-correct-classification-for-all-states -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-fsm ---- -# isAgentErrorState returns correct classification for all states - -## Intent - -- outcome: Executable scenario: isAgentErrorState returns correct classification for all states - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isAgentErrorState returns the correct value for each state: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-020-is-agent-processing-state-returns-correct-classification-for-all-states.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-020-is-agent-processing-state-returns-correct-classification-for-all-states.sdp.md deleted file mode 100644 index 4b9c589a..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-020-is-agent-processing-state-returns-correct-classification-for-all-states.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-fsm.is-agent-processing-state-returns-correct-classification-for-all-states -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-fsm ---- -# isAgentProcessingState returns correct classification for all states - -## Intent - -- outcome: Executable scenario: isAgentProcessingState returns correct classification for all states - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isAgentProcessingState returns the correct value for each state: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-021-command-to-event-maps-known-commands-and-returns-null-for-unknown.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-021-command-to-event-maps-known-commands-and-returns-null-for-unknown.sdp.md deleted file mode 100644 index 7bfaafee..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.examples/s-021-command-to-event-maps-known-commands-and-returns-null-for-unknown.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-fsm.command-to-event-maps-known-commands-and-returns-null-for-unknown -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-fsm ---- -# commandToEvent maps known commands and returns null for unknown - -## Intent - -- outcome: Executable scenario: commandToEvent maps known commands and returns null for unknown - -```gwt -Given the feature fixture is in place -When the scenario runs -Then commandToEvent returns the correct mapping: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-fsm.sdp.md b/specs/behavior/platform-core/agent/lifecycle-fsm.sdp.md index 6b4a87f6..c80246f4 100644 --- a/specs/behavior/platform-core/agent/lifecycle-fsm.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-fsm.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.lifecycle-fsm kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: Lifecycle FSM +- outcome: Provide a pure agent lifecycle state machine with states, events, transitions, classification helpers, and command-to-event mapping. +- value: Transition checks stay out of I/O so handlers can validate start, pause, resume, stop, and reconfigure before writing checkpoint status. ## Behavior diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-001-happy-path-stopped-to-active-with-agent-started-audit.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-001-happy-path-stopped-to-active-with-agent-started-audit.sdp.md deleted file mode 100644 index 3fc48258..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-001-happy-path-stopped-to-active-with-agent-started-audit.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-handlers.happy-path-stopped-to-active-with-agent-started-audit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-handlers ---- -# Happy path - stopped to active with AgentStarted audit - -## Intent - -- outcome: Executable scenario: Happy path - stopped to active with AgentStarted audit - -```gwt -Given the module is imported from platform-core -And an agent in "stopped" state with lastProcessedPosition 25 -And a logger is attached -When handleStartAgent is invoked with agentId "test-agent" and correlationId "corr_001" -Then the result is successful with previousState "stopped" and newState "active" -And transitionLifecycle was called with status "active" and audit event type "AgentStarted" -And the AgentStarted audit payload contains: -And the logger info was called with "Agent started" and agentId "test-agent" -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-002-rejects-start-from-active-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-002-rejects-start-from-active-state.sdp.md deleted file mode 100644 index c957c6c3..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-002-rejects-start-from-active-state.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-handlers.rejects-start-from-active-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-handlers ---- -# Rejects START from active state - -## Intent - -- outcome: Executable scenario: Rejects START from active state - -```gwt -Given the module is imported from platform-core -And an agent in "active" state -When handleStartAgent is invoked with agentId "test-agent" and correlationId "corr_002" -Then the result is a failure with code INVALID_LIFECYCLE_TRANSITION -And the failure message contains "START" and "active" -And the failure currentState is "active" -And transitionLifecycle was not called -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-003-rejects-start-from-paused-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-003-rejects-start-from-paused-state.sdp.md deleted file mode 100644 index 6c2e295e..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-003-rejects-start-from-paused-state.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-handlers.rejects-start-from-paused-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-handlers ---- -# Rejects START from paused state - -## Intent - -- outcome: Executable scenario: Rejects START from paused state - -```gwt -Given the module is imported from platform-core -And an agent in "paused" state -When handleStartAgent is invoked with agentId "test-agent" and correlationId "corr_003" -Then the result is a failure with code INVALID_LIFECYCLE_TRANSITION -And the failure currentState is "paused" -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-004-happy-path-active-to-paused-with-agent-paused-audit-and-reason.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-004-happy-path-active-to-paused-with-agent-paused-audit-and-reason.sdp.md deleted file mode 100644 index dd0f4380..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-004-happy-path-active-to-paused-with-agent-paused-audit-and-reason.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-handlers.happy-path-active-to-paused-with-agent-paused-audit-and-reason -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-handlers ---- -# Happy path - active to paused with AgentPaused audit and reason - -## Intent - -- outcome: Executable scenario: Happy path - active to paused with AgentPaused audit and reason - -```gwt -Given the module is imported from platform-core -And an agent in "active" state with lastProcessedPosition 50 and eventsProcessed 20 -And a logger is attached -When handlePauseAgent is invoked with agentId "test-agent" correlationId "corr_010" and reason "Maintenance window" -Then the result is successful with previousState "active" and newState "paused" -And transitionLifecycle was called with status "paused" and audit event type "AgentPaused" -And the AgentPaused audit payload contains: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-005-rejects-pause-from-stopped-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-005-rejects-pause-from-stopped-state.sdp.md deleted file mode 100644 index 53ad4104..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-005-rejects-pause-from-stopped-state.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-handlers.rejects-pause-from-stopped-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-handlers ---- -# Rejects PAUSE from stopped state - -## Intent - -- outcome: Executable scenario: Rejects PAUSE from stopped state - -```gwt -Given the module is imported from platform-core -And an agent in "stopped" state -When handlePauseAgent is invoked with agentId "test-agent" and correlationId "corr_011" -Then the result is a failure with code INVALID_LIFECYCLE_TRANSITION -And the failure message contains "PAUSE" and "stopped" -And the failure currentState is "stopped" -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-006-happy-path-paused-to-active-with-agent-resumed-audit.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-006-happy-path-paused-to-active-with-agent-resumed-audit.sdp.md deleted file mode 100644 index c6bd927a..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-006-happy-path-paused-to-active-with-agent-resumed-audit.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-handlers.happy-path-paused-to-active-with-agent-resumed-audit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-handlers ---- -# Happy path - paused to active with AgentResumed audit - -## Intent - -- outcome: Executable scenario: Happy path - paused to active with AgentResumed audit - -```gwt -Given the module is imported from platform-core -And an agent in "paused" state with lastProcessedPosition 75 -And a logger is attached -When handleResumeAgent is invoked with agentId "test-agent" and correlationId "corr_020" -Then the result is successful with previousState "paused" and newState "active" -And transitionLifecycle was called with status "active" and audit event type "AgentResumed" -And the AgentResumed audit payload contains: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-007-rejects-resume-from-stopped-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-007-rejects-resume-from-stopped-state.sdp.md deleted file mode 100644 index 0a57a1d0..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-007-rejects-resume-from-stopped-state.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-handlers.rejects-resume-from-stopped-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-handlers ---- -# Rejects RESUME from stopped state - -## Intent - -- outcome: Executable scenario: Rejects RESUME from stopped state - -```gwt -Given the module is imported from platform-core -And an agent in "stopped" state -When handleResumeAgent is invoked with agentId "test-agent" and correlationId "corr_021" -Then the result is a failure with code INVALID_LIFECYCLE_TRANSITION -And the failure message contains "RESUME" and "stopped" -And the failure currentState is "stopped" -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-008-happy-path-active-to-stopped-with-agent-stopped-audit.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-008-happy-path-active-to-stopped-with-agent-stopped-audit.sdp.md deleted file mode 100644 index f653cb05..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-008-happy-path-active-to-stopped-with-agent-stopped-audit.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-handlers.happy-path-active-to-stopped-with-agent-stopped-audit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-handlers ---- -# Happy path - active to stopped with AgentStopped audit - -## Intent - -- outcome: Executable scenario: Happy path - active to stopped with AgentStopped audit - -```gwt -Given the module is imported from platform-core -And an agent in "active" state with lastProcessedPosition 100 -And a logger is attached -When handleStopAgent is invoked with agentId "test-agent" correlationId "corr_030" and reason "Decommissioning" -Then the result is successful with previousState "active" and newState "stopped" -And transitionLifecycle was called with status "stopped" and audit event type "AgentStopped" -And the AgentStopped audit payload contains: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-009-happy-path-paused-to-stopped-as-universal-escape-hatch.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-009-happy-path-paused-to-stopped-as-universal-escape-hatch.sdp.md deleted file mode 100644 index bb49e12f..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-009-happy-path-paused-to-stopped-as-universal-escape-hatch.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-handlers.happy-path-paused-to-stopped-as-universal-escape-hatch -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-handlers ---- -# Happy path - paused to stopped as universal escape hatch - -## Intent - -- outcome: Executable scenario: Happy path - paused to stopped as universal escape hatch - -```gwt -Given the module is imported from platform-core -And an agent in "paused" state with lastProcessedPosition 60 -When handleStopAgent is invoked with agentId "test-agent" and correlationId "corr_031" -Then the result is successful with previousState "paused" and newState "stopped" -And the AgentStopped audit payload has previousState "paused" and stoppedAtPosition 60 -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-010-happy-path-error-recovery-to-stopped.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-010-happy-path-error-recovery-to-stopped.sdp.md deleted file mode 100644 index f4625b36..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-010-happy-path-error-recovery-to-stopped.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-handlers.happy-path-error-recovery-to-stopped -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-handlers ---- -# Happy path - error_recovery to stopped - -## Intent - -- outcome: Executable scenario: Happy path - error_recovery to stopped - -```gwt -Given the module is imported from platform-core -And an agent in "error_recovery" state with lastProcessedPosition 88 -When handleStopAgent is invoked with agentId "test-agent" and correlationId "corr_032" -Then the result is successful with previousState "error_recovery" and newState "stopped" -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-011-rejects-stop-from-already-stopped-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-011-rejects-stop-from-already-stopped-state.sdp.md deleted file mode 100644 index e82d1cbb..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-011-rejects-stop-from-already-stopped-state.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-handlers.rejects-stop-from-already-stopped-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-handlers ---- -# Rejects STOP from already stopped state - -## Intent - -- outcome: Executable scenario: Rejects STOP from already stopped state - -```gwt -Given the module is imported from platform-core -And an agent in "stopped" state -When handleStopAgent is invoked with agentId "test-agent" and correlationId "corr_033" -Then the result is a failure with code INVALID_LIFECYCLE_TRANSITION -And the failure message contains "STOP" and "stopped" -And the failure currentState is "stopped" -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-012-reconfigures-active-agent-with-merged-overrides.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-012-reconfigures-active-agent-with-merged-overrides.sdp.md deleted file mode 100644 index 21b0b1df..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-012-reconfigures-active-agent-with-merged-overrides.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-handlers.reconfigures-active-agent-with-merged-overrides -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-handlers ---- -# Reconfigures active agent with merged overrides - -## Intent - -- outcome: Executable scenario: Reconfigures active agent with merged overrides - -```gwt -Given the module is imported from platform-core -And an agent in "active" state with existing config overrides -And a logger is attached -When handleReconfigureAgent is invoked with agentId "test-agent" correlationId "corr_040" and new overrides -Then the result is successful with previousState "active" and newState "active" -And patchConfigOverrides was called with merged overrides -And the AgentReconfigured audit payload contains previous and new overrides -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-013-reconfigures-paused-agent-transitioning-to-active.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-013-reconfigures-paused-agent-transitioning-to-active.sdp.md deleted file mode 100644 index 0eceb58e..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-013-reconfigures-paused-agent-transitioning-to-active.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-handlers.reconfigures-paused-agent-transitioning-to-active -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-handlers ---- -# Reconfigures paused agent transitioning to active - -## Intent - -- outcome: Executable scenario: Reconfigures paused agent transitioning to active - -```gwt -Given the module is imported from platform-core -And an agent in "paused" state with no config overrides -When handleReconfigureAgent is invoked with agentId "test-agent" correlationId "corr_041" and paused overrides -Then the result is successful with previousState "paused" and newState "active" -And patchConfigOverrides was called with paused agent overrides -And transitionLifecycle was called with status "active" for paused reconfigure -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-014-rejects-reconfigure-from-stopped-state.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-014-rejects-reconfigure-from-stopped-state.sdp.md deleted file mode 100644 index da1016a3..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-014-rejects-reconfigure-from-stopped-state.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-handlers.rejects-reconfigure-from-stopped-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-handlers ---- -# Rejects RECONFIGURE from stopped state - -## Intent - -- outcome: Executable scenario: Rejects RECONFIGURE from stopped state - -```gwt -Given the module is imported from platform-core -And an agent in "stopped" state -When handleReconfigureAgent is invoked with agentId "test-agent" correlationId "corr_042" and overrides -Then the result is a failure with code INVALID_LIFECYCLE_TRANSITION -And the failure message contains "RECONFIGURE" and "stopped" -And the failure currentState is "stopped" -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-015-handles-first-time-config-overrides-when-checkpoint-has-none.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-015-handles-first-time-config-overrides-when-checkpoint-has-none.sdp.md deleted file mode 100644 index 2a965903..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-015-handles-first-time-config-overrides-when-checkpoint-has-none.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-handlers.handles-first-time-config-overrides-when-checkpoint-has-none -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-handlers ---- -# Handles first-time config overrides when checkpoint has none - -## Intent - -- outcome: Executable scenario: Handles first-time config overrides when checkpoint has none - -```gwt -Given the module is imported from platform-core -And an agent in "active" state with no existing config overrides -When handleReconfigureAgent is invoked with agentId "test-agent" correlationId "corr_043" and first-time overrides -Then the result is successful -And patchConfigOverrides was called with first-time overrides only -And the AgentReconfigured audit payload has undefined previousOverrides -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-016-factory-returns-all-5-handler-functions.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-016-factory-returns-all-5-handler-functions.sdp.md deleted file mode 100644 index 9b4cf533..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-016-factory-returns-all-5-handler-functions.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-handlers.factory-returns-all-5-handler-functions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-handlers ---- -# Factory returns all 5 handler functions - -## Intent - -- outcome: Executable scenario: Factory returns all 5 handler functions - -```gwt -Given the module is imported from platform-core -When createLifecycleHandlers is invoked with a mock component -Then the result contains all handler functions: -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-017-factory-handlers-complete-a-start-pause-stop-round-trip.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-017-factory-handlers-complete-a-start-pause-stop-round-trip.sdp.md deleted file mode 100644 index ebbfecb6..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-017-factory-handlers-complete-a-start-pause-stop-round-trip.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-handlers.factory-handlers-complete-a-start-pause-stop-round-trip -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-handlers ---- -# Factory handlers complete a start-pause-stop round trip - -## Intent - -- outcome: Executable scenario: Factory handlers complete a start-pause-stop round trip - -```gwt -Given the module is imported from platform-core -When a round-trip lifecycle sequence is executed via factory handlers -Then all three operations succeed -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-018-uses-no-op-logger-when-none-provided.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-018-uses-no-op-logger-when-none-provided.sdp.md deleted file mode 100644 index 039243e0..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-018-uses-no-op-logger-when-none-provided.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-handlers.uses-no-op-logger-when-none-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-handlers ---- -# Uses no-op logger when none provided - -## Intent - -- outcome: Executable scenario: Uses no-op logger when none provided - -```gwt -Given the module is imported from platform-core -And an agent in "stopped" state -When handleStartAgent is invoked without a logger with agentId "test-agent" and correlationId "corr_200" -Then the result is successful -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-019-logs-warning-on-invalid-transition.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-019-logs-warning-on-invalid-transition.sdp.md deleted file mode 100644 index c337de72..00000000 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.examples/s-019-logs-warning-on-invalid-transition.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.lifecycle-handlers.logs-warning-on-invalid-transition -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.lifecycle-handlers ---- -# Logs warning on invalid transition - -## Intent - -- outcome: Executable scenario: Logs warning on invalid transition - -```gwt -Given the module is imported from platform-core -And an agent in "active" state -And a logger is attached -When handleStartAgent is invoked with logger with agentId "test-agent" and correlationId "corr_201" -Then the logger warn was called with "Invalid lifecycle transition" and command "StartAgent" and currentState "active" -``` diff --git a/specs/behavior/platform-core/agent/lifecycle-handlers.sdp.md b/specs/behavior/platform-core/agent/lifecycle-handlers.sdp.md index fdb8c0e4..2cde3afb 100644 --- a/specs/behavior/platform-core/agent/lifecycle-handlers.sdp.md +++ b/specs/behavior/platform-core/agent/lifecycle-handlers.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.lifecycle-handlers kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: Lifecycle Handlers +- outcome: Load the checkpoint, validate the FSM transition via a pure decider, and atomically write the new status plus an audit event for each lifecycle command. +- value: createLifecycleHandlers returns the five handler functions that bypass CommandOrchestrator. ## Behavior diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-001-returns-immediately-without-calling-any-mutations.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-001-returns-immediately-without-calling-any-mutations.sdp.md deleted file mode 100644 index 9b5d8868..00000000 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-001-returns-immediately-without-calling-any-mutations.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.oncomplete-handler.returns-immediately-without-calling-any-mutations -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.oncomplete-handler ---- -# Returns immediately without calling any mutations - -## Intent - -- outcome: Executable scenario: Returns immediately without calling any mutations - -```gwt -Given the module is imported from platform-core -And a handler with default config -And args with a canceled result -When the handler is invoked -Then runMutation is not called -``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-002-records-dead-letter-and-audit-event-but-does-not-advance-checkpoint.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-002-records-dead-letter-and-audit-event-but-does-not-advance-checkpoint.sdp.md deleted file mode 100644 index 2917bb49..00000000 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-002-records-dead-letter-and-audit-event-but-does-not-advance-checkpoint.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.oncomplete-handler.records-dead-letter-and-audit-event-but-does-not-advance-checkpoint -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.oncomplete-handler ---- -# Records dead letter and audit event but does not advance checkpoint - -## Intent - -- outcome: Executable scenario: Records dead letter and audit event but does not advance checkpoint - -```gwt -Given the module is imported from platform-core -And a handler with default config -And args with a failed result with error "LLM timeout after 30s" -When the handler is invoked -Then the dead letter is recorded with fields: -And the audit is recorded with eventType "AgentAnalysisFailed" and agentId "test-agent" -And the checkpoint update is not called -And the checkpoint loadOrCreate is not called -``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-003-advances-checkpoint-when-return-value-is-null.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-003-advances-checkpoint-when-return-value-is-null.sdp.md deleted file mode 100644 index a40a941f..00000000 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-003-advances-checkpoint-when-return-value-is-null.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.oncomplete-handler.advances-checkpoint-when-return-value-is-null -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.oncomplete-handler ---- -# Advances checkpoint when returnValue is null - -## Intent - -- outcome: Executable scenario: Advances checkpoint when returnValue is null - -```gwt -Given the module is imported from platform-core -And a handler with default config -And args with a success result with null returnValue -When the handler is invoked -Then the checkpoint loadOrCreate is called -And the checkpoint update is called -And the audit record is not called -And the commands record is not called -And the approvals create is not called -``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-004-persists-in-correct-order-when-requires-approval-is-true.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-004-persists-in-correct-order-when-requires-approval-is-true.sdp.md deleted file mode 100644 index 7978e62d..00000000 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-004-persists-in-correct-order-when-requires-approval-is-true.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.oncomplete-handler.persists-in-correct-order-when-requires-approval-is-true -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.oncomplete-handler ---- -# Persists in correct order when requiresApproval is true - -## Intent - -- outcome: Executable scenario: Persists in correct order when requiresApproval is true - -```gwt -Given the module is imported from platform-core -And a handler with default config and fake timers at "2024-01-15T12:00:00Z" -And args with a success result containing a decision with requiresApproval true -When the handler is invoked -Then the persistence order is: -``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-005-updates-checkpoint-with-correct-args.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-005-updates-checkpoint-with-correct-args.sdp.md deleted file mode 100644 index 972f00a8..00000000 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-005-updates-checkpoint-with-correct-args.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.oncomplete-handler.updates-checkpoint-with-correct-args -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.oncomplete-handler ---- -# Updates checkpoint with correct args - -## Intent - -- outcome: Executable scenario: Updates checkpoint with correct args - -```gwt -Given the module is imported from platform-core -And a handler with default config and fake timers at "2024-01-15T12:00:00Z" -And args with a success result and context agentId "my-agent" subscriptionId "sub_my-agent" eventId "evt_999" globalPosition 150 -When the handler is invoked -Then the checkpoint update is called with: -``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-006-uses-default-24h-timeout-for-approval-expires-at.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-006-uses-default-24h-timeout-for-approval-expires-at.sdp.md deleted file mode 100644 index 3db17022..00000000 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-006-uses-default-24h-timeout-for-approval-expires-at.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.oncomplete-handler.uses-default-24h-timeout-for-approval-expires-at -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.oncomplete-handler ---- -# Uses default 24h timeout for approval expiresAt - -## Intent - -- outcome: Executable scenario: Uses default 24h timeout for approval expiresAt - -```gwt -Given the module is imported from platform-core -And a handler with default config and fake timers at "2024-01-15T12:00:00Z" -And args with a success result containing a decision with requiresApproval true -When the handler is invoked -Then the approval expiresAt equals Date.now() plus 86400000 ms -``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-007-records-command-but-not-approval-when-requires-approval-is-false.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-007-records-command-but-not-approval-when-requires-approval-is-false.sdp.md deleted file mode 100644 index 91de46ea..00000000 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-007-records-command-but-not-approval-when-requires-approval-is-false.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.oncomplete-handler.records-command-but-not-approval-when-requires-approval-is-false -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.oncomplete-handler ---- -# Records command but not approval when requiresApproval is false - -## Intent - -- outcome: Executable scenario: Records command but not approval when requiresApproval is false - -```gwt -Given the module is imported from platform-core -And a handler with default config and fake timers at "2024-01-15T12:00:00Z" -And args with a success result containing a decision with requiresApproval false -When the handler is invoked -Then the commands record is called -And the approvals create is not called -``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-008-does-not-create-approval-when-requires-approval-is-true-but-command-is-nul.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-008-does-not-create-approval-when-requires-approval-is-true-but-command-is-nul.sdp.md deleted file mode 100644 index 14223681..00000000 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-008-does-not-create-approval-when-requires-approval-is-true-but-command-is-nul.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.oncomplete-handler.does-not-create-approval-when-requires-approval-is-true-but-command-is-null -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.oncomplete-handler ---- -# Does not create approval when requiresApproval is true but command is null - -## Intent - -- outcome: Executable scenario: Does not create approval when requiresApproval is true but command is null - -```gwt -Given the module is imported from platform-core -And a handler with default config and fake timers at "2024-01-15T12:00:00Z" -And args with a success result containing a decision with null command and requiresApproval true -When the handler is invoked -Then the approvals create is not called -And the commands record is not called -And the checkpoint update is called -``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-009-uses-custom-approval-timeout-ms-for-approval-expires-at.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-009-uses-custom-approval-timeout-ms-for-approval-expires-at.sdp.md deleted file mode 100644 index a5250538..00000000 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-009-uses-custom-approval-timeout-ms-for-approval-expires-at.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.oncomplete-handler.uses-custom-approval-timeout-ms-for-approval-expires-at -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.oncomplete-handler ---- -# Uses custom approvalTimeoutMs for approval expiresAt - -## Intent - -- outcome: Executable scenario: Uses custom approvalTimeoutMs for approval expiresAt - -```gwt -Given the module is imported from platform-core -And a handler with approvalTimeoutMs 3600000 and fake timers at "2024-01-15T12:00:00Z" -And args with a success result containing a decision with requiresApproval true -When the handler is invoked -Then the approval expiresAt equals Date.now() plus 3600000 ms -``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-010-records-audit-and-checkpoint-but-skips-command-and-approval.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-010-records-audit-and-checkpoint-but-skips-command-and-approval.sdp.md deleted file mode 100644 index e43aed5c..00000000 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-010-records-audit-and-checkpoint-but-skips-command-and-approval.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.oncomplete-handler.records-audit-and-checkpoint-but-skips-command-and-approval -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.oncomplete-handler ---- -# Records audit and checkpoint but skips command and approval - -## Intent - -- outcome: Executable scenario: Records audit and checkpoint but skips command and approval - -```gwt -Given the module is imported from platform-core -And a handler with default config and fake timers at "2024-01-15T12:00:00Z" -And args with a success result containing a no-command decision -When the handler is invoked -Then the audit record is called -And the commands record is not called -And the approvals create is not called -And the checkpoint update is called -``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-011-skips-when-checkpoint-position-equals-event-position.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-011-skips-when-checkpoint-position-equals-event-position.sdp.md deleted file mode 100644 index 4b068e1a..00000000 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-011-skips-when-checkpoint-position-equals-event-position.sdp.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.oncomplete-handler.skips-when-checkpoint-position-equals-event-position -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.oncomplete-handler ---- -# Skips when checkpoint position equals event position - -## Intent - -- outcome: Executable scenario: Skips when checkpoint position equals event position - -```gwt -Given the module is imported from platform-core -And a handler with default config and fake timers at "2024-01-15T12:00:00Z" -And args with a success result and context globalPosition 42 -And the checkpoint loadOrCreate returns lastProcessedPosition 42 -When the handler is invoked -Then the checkpoint loadOrCreate is called -And the checkpoint update is not called -And the audit record is not called -And the commands record is not called -And the approvals create is not called -``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-012-catches-checkpoint-error-and-creates-dead-letter-instead-of-throwing.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-012-catches-checkpoint-error-and-creates-dead-letter-instead-of-throwing.sdp.md deleted file mode 100644 index 69103e0e..00000000 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-012-catches-checkpoint-error-and-creates-dead-letter-instead-of-throwing.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.oncomplete-handler.catches-checkpoint-error-and-creates-dead-letter-instead-of-throwing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.oncomplete-handler ---- -# Catches checkpoint error and creates dead letter instead of throwing - -## Intent - -- outcome: Executable scenario: Catches checkpoint error and creates dead letter instead of throwing - -```gwt -Given the module is imported from platform-core -And a handler with default config and a logger -And the checkpoint loadOrCreate will throw "Database connection lost" -And args with a success result containing a standard decision -When the handler is invoked -Then the handler resolves without throwing -And the dead letter is recorded with fields: -And the logger error is called with message "Unexpected error in agent onComplete" and agentId "test-agent" and error "Database connection lost" -``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-013-dead-letters-and-skips-checkpoint-when-audit-persistence-fails.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-013-dead-letters-and-skips-checkpoint-when-audit-persistence-fails.sdp.md deleted file mode 100644 index a721db26..00000000 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-013-dead-letters-and-skips-checkpoint-when-audit-persistence-fails.sdp.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.oncomplete-handler.dead-letters-and-skips-checkpoint-when-audit-persistence-fails -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.oncomplete-handler ---- -# Dead-letters and skips checkpoint when audit persistence fails - -## Intent - -- outcome: Executable scenario: Dead-letters and skips checkpoint when audit persistence fails - -```gwt -Given the module is imported from platform-core -And a handler with default config and a logger -And the checkpoint loadOrCreate returns lastProcessedPosition 0 -And the audit record will throw "Audit store unavailable" -And args with a success result containing a decision with command and requiresApproval false -When the handler is invoked -Then the handler resolves without throwing -And the audit record is called -And the commands record is not called -And the checkpoint update is not called -And the dead letter is recorded with fields: -And the dead letter context includes correlationId "corr_123" and errorCode "AGENT_ONCOMPLETE_REQUIRED_PERSISTENCE_FAILED" -And the logger error is called with message "Required persistence failed in agent onComplete" and agentId "test-agent" and error "Required onComplete audit persistence failed: Audit store unavailable" -``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-014-dead-letters-and-skips-checkpoint-when-command-persistence-fails.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-014-dead-letters-and-skips-checkpoint-when-command-persistence-fails.sdp.md deleted file mode 100644 index f026da9d..00000000 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-014-dead-letters-and-skips-checkpoint-when-command-persistence-fails.sdp.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.oncomplete-handler.dead-letters-and-skips-checkpoint-when-command-persistence-fails -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.oncomplete-handler ---- -# Dead-letters and skips checkpoint when command persistence fails - -## Intent - -- outcome: Executable scenario: Dead-letters and skips checkpoint when command persistence fails - -```gwt -Given the module is imported from platform-core -And a handler with default config and a logger -And the checkpoint loadOrCreate returns lastProcessedPosition 0 -And the commands record will throw "Command store unavailable" -And args with a success result containing a decision with command and requiresApproval false -When the handler is invoked -Then the handler resolves without throwing -And the audit record is called -And the commands record is called -And the checkpoint update is not called -And the dead letter is recorded with fields: -``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-015-dead-letters-and-skips-checkpoint-when-approval-persistence-fails.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-015-dead-letters-and-skips-checkpoint-when-approval-persistence-fails.sdp.md deleted file mode 100644 index 57c2fb61..00000000 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-015-dead-letters-and-skips-checkpoint-when-approval-persistence-fails.sdp.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.oncomplete-handler.dead-letters-and-skips-checkpoint-when-approval-persistence-fails -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.oncomplete-handler ---- -# Dead-letters and skips checkpoint when approval persistence fails - -## Intent - -- outcome: Executable scenario: Dead-letters and skips checkpoint when approval persistence fails - -```gwt -Given the module is imported from platform-core -And a handler with default config and a logger -And the checkpoint loadOrCreate returns lastProcessedPosition 0 -And the approvals create will throw "Approval store unavailable" -And args with a success result containing a decision with requiresApproval true -When the handler is invoked -Then the handler resolves without throwing -And the audit record is called -And the commands record is called -And the approvals create is called -And the checkpoint update is not called -And the dead letter is recorded with fields: -``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-016-success-persistence-calls-include-verification-proofs.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-016-success-persistence-calls-include-verification-proofs.sdp.md deleted file mode 100644 index cc7f5cbe..00000000 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-016-success-persistence-calls-include-verification-proofs.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.oncomplete-handler.success-persistence-calls-include-verification-proofs -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.oncomplete-handler ---- -# Success persistence calls include verification proofs - -## Intent - -- outcome: Executable scenario: Success persistence calls include verification proofs - -```gwt -Given the module is imported from platform-core -And a handler with default config and fake timers at "2024-01-15T12:00:00Z" -And args with a success result containing a decision with requiresApproval true -When the handler is invoked -Then the audit record includes a verification proof for agentId "test-agent" -And the commands record includes a verification proof for agentId "test-agent" -And the approvals create includes a verification proof for agentId "test-agent" -``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-017-does-not-throw-even-when-dead-letter-recording-also-fails.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-017-does-not-throw-even-when-dead-letter-recording-also-fails.sdp.md deleted file mode 100644 index c2405da5..00000000 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-017-does-not-throw-even-when-dead-letter-recording-also-fails.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.oncomplete-handler.does-not-throw-even-when-dead-letter-recording-also-fails -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.oncomplete-handler ---- -# Does not throw even when dead letter recording also fails - -## Intent - -- outcome: Executable scenario: Does not throw even when dead letter recording also fails - -```gwt -Given the module is imported from platform-core -And a handler with default config and a logger -And the checkpoint loadOrCreate will throw "Primary failure" -And the dead letter record will throw "Dead letter also failed" -And args with a success result containing a standard decision -When the handler is invoked -Then the handler resolves without throwing -And the logger error is called with message "Unexpected error in agent onComplete" -And the logger error is called with message "Failed to record dead letter in catch-all" and agentId "test-agent" and eventId "evt_123" -``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-018-does-not-throw-when-failed-result-dead-letter-recording-fails.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-018-does-not-throw-when-failed-result-dead-letter-recording-fails.sdp.md deleted file mode 100644 index 9347624e..00000000 --- a/specs/behavior/platform-core/agent/oncomplete-handler.examples/s-018-does-not-throw-when-failed-result-dead-letter-recording-fails.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.oncomplete-handler.does-not-throw-when-failed-result-dead-letter-recording-fails -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.oncomplete-handler ---- -# Does not throw when failed result dead letter recording fails - -## Intent - -- outcome: Executable scenario: Does not throw when failed result dead letter recording fails - -```gwt -Given the module is imported from platform-core -And a handler with default config and a logger -And the dead letter record will throw "Dead letter store unavailable" -And args with a failed result with error "Action failed" -When the handler is invoked -Then the handler resolves without throwing -And the logger error is called with message "Failed to record dead letter for action failure" and agentId "test-agent" and error "Dead letter store unavailable" -``` diff --git a/specs/behavior/platform-core/agent/oncomplete-handler.sdp.md b/specs/behavior/platform-core/agent/oncomplete-handler.sdp.md index 5b122e0d..a5ad8ba3 100644 --- a/specs/behavior/platform-core/agent/oncomplete-handler.sdp.md +++ b/specs/behavior/platform-core/agent/oncomplete-handler.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.oncomplete-handler kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,14 +10,67 @@ relations: ## Intent -- outcome: Agent onComplete Handler +- outcome: Persist canceled, failed, and successful agent action results without throwing, advancing the checkpoint only after successful persistence. +- value: Workpool can treat analysis as done while this mutation persists audit, commands, approvals, and the checkpoint. ## Behavior -- rule: Canceled results are no-ops -- rule: Failed results record dead letter and audit without checkpoint -- rule: Success with null returnValue still advances checkpoint -- rule: Success with decision persists audit, command, approval, and checkpoint -- rule: Success with no-command decision skips command and approval recording -- rule: Idempotency via checkpoint position -- rule: NO-THROW zone catches errors and records dead letter fallback +- rule: A canceled workpool result triggers no mutations. +- rule: Failed results persist a dead letter and AgentAnalysisFailed audit and never advance the checkpoint. +- rule: A null returnValue records no audit, command, or approval side effects but still advances the checkpoint once. +- rule: Persistence for a decision runs loadOrCreate, audit, commands, approvals, then checkpoint update last. +- rule: A decision with a null command records audit and checkpoint but not command or approval. +- rule: Events at or below the checkpoint lastProcessedPosition are skipped. +- rule: The handler never throws; errors produce dead letters and log entries. + +## Example space + +```gwt-vocabulary +Given the module is imported from platform-core +And a handler with default config +And a handler with default config and fake timers at {timerAt:string} +And a handler with approvalTimeoutMs {approvalTimeoutMs:number} and fake timers at {timerAt:string} +And a handler with default config and a logger +And args with a canceled result +And args with a failed result with error {error:string} +And args with a success result with null returnValue +And args with a success result containing a decision with requiresApproval {requiresApproval:boolean} +And args with a success result and context agentId {agentId:string} subscriptionId {subscriptionId:string} eventId {eventId:string} globalPosition {globalPosition:number} +And args with a success result containing a decision with null command and requiresApproval {requiresApproval:boolean} +And args with a success result containing a no-command decision +And args with a success result and context globalPosition {globalPosition:number} +And args with a success result containing a standard decision +And args with a success result containing a decision with command and requiresApproval {requiresApproval:boolean} +And the checkpoint loadOrCreate returns lastProcessedPosition {lastProcessedPosition:number} +And the checkpoint loadOrCreate will throw {loadError:string} +And the audit record will throw {auditError:string} +And the commands record will throw {commandError:string} +And the approvals create will throw {approvalError:string} +And the dead letter record will throw {deadLetterError:string} +When the handler is invoked +Then runMutation is not called +And the dead letter is recorded with agentId {agentId:string} subscriptionId {subscriptionId:string} eventId {eventId:string} globalPosition {globalPosition:number} error {error:string} +And the dead letter is recorded with agentId {agentId:string} eventId {eventId:string} error {error:string} +And the audit is recorded with eventType {eventType:string} and agentId {agentId:string} +And the checkpoint update is not called +And the checkpoint loadOrCreate is not called +And the checkpoint loadOrCreate is called +And the checkpoint update is called +And the audit record is not called +And the commands record is not called +And the approvals create is not called +And the persistence order is loadOrCreate then audit then commands then approvals then checkpoint_update +And the checkpoint update is called with agentId {agentId:string} subscriptionId {subscriptionId:string} lastProcessedPosition {lastProcessedPosition:number} lastEventId {lastEventId:string} incrementEventsProcessed {incrementEventsProcessed:boolean} +And the approval expiresAt equals Date.now() plus {approvalTimeoutMs:number} ms +And the commands record is called +And the audit record is called +And the approvals create is called +And the handler resolves without throwing +And the logger error is called with message {logMessage:string} and agentId {agentId:string} and error {error:string} +And the logger error is called with message {logMessage:string} +And the logger error is called with message {logMessage:string} and agentId {agentId:string} and eventId {eventId:string} +And the dead letter context includes correlationId {correlationId:string} and errorCode {errorCode:string} +And the audit record includes a verification proof for agentId {agentId:string} +And the commands record includes a verification proof for agentId {agentId:string} +And the approvals create includes a verification proof for agentId {agentId:string} +``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-001-define-rule-based-pattern.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-001-define-rule-based-pattern.sdp.md deleted file mode 100644 index 7c0aea97..00000000 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-001-define-rule-based-pattern.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-detection.define-rule-based-pattern -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-detection ---- -# Define rule-based pattern - -## Intent - -- outcome: Executable scenario: Define rule-based pattern - -```gwt -Given the agent module is imported from platform-core -And the pattern detection framework is available -And a pattern definition "ChurnRisk" -And window: 30 days, minimum 3 events -And trigger: count(OrderCancelled) >= 3 -When I register the pattern -Then pattern is available for detection -``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-002-define-llm-analyzed-pattern.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-002-define-llm-analyzed-pattern.sdp.md deleted file mode 100644 index 8c375317..00000000 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-002-define-llm-analyzed-pattern.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-detection.define-llm-analyzed-pattern -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-detection ---- -# Define LLM-analyzed pattern - -## Intent - -- outcome: Executable scenario: Define LLM-analyzed pattern - -```gwt -Given the agent module is imported from platform-core -And the pattern detection framework is available -And a pattern definition "AnomalyDetection" -And LLM analysis prompt for unusual activity -When I register the pattern -Then pattern uses LLM for analysis -``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-003-window-respects-time-boundary.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-003-window-respects-time-boundary.sdp.md deleted file mode 100644 index 411dd061..00000000 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-003-window-respects-time-boundary.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-detection.window-respects-time-boundary -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-detection ---- -# Window respects time boundary - -## Intent - -- outcome: Executable scenario: Window respects time boundary - -```gwt -Given the agent module is imported from platform-core -And the pattern detection framework is available -And pattern window of 30 days -And events spanning 60 days -When pattern detection runs -Then only events from last 30 days are analyzed -``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-004-window-respects-event-limit.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-004-window-respects-event-limit.sdp.md deleted file mode 100644 index b9339612..00000000 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-004-window-respects-event-limit.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-detection.window-respects-event-limit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-detection ---- -# Window respects event limit - -## Intent - -- outcome: Executable scenario: Window respects event limit - -```gwt -Given the agent module is imported from platform-core -And the pattern detection framework is available -And pattern window with eventLimit: 100 -And 150 events in time range -When pattern detection runs -Then only most recent 100 events are analyzed -``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-005-empty-window-returns-no-patterns.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-005-empty-window-returns-no-patterns.sdp.md deleted file mode 100644 index debb613f..00000000 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-005-empty-window-returns-no-patterns.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-detection.empty-window-returns-no-patterns -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-detection ---- -# Empty window returns no patterns - -## Intent - -- outcome: Executable scenario: Empty window returns no patterns - -```gwt -Given the agent module is imported from platform-core -And the pattern detection framework is available -And pattern window with no events -When pattern detection runs -Then no patterns are detected -And result includes "no_events" status -``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-006-pattern-window-loads-events-lazily-for-memory-efficiency.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-006-pattern-window-loads-events-lazily-for-memory-efficiency.sdp.md deleted file mode 100644 index e3011e34..00000000 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-006-pattern-window-loads-events-lazily-for-memory-efficiency.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-detection.pattern-window-loads-events-lazily-for-memory-efficiency -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-detection ---- -# Pattern window loads events lazily for memory efficiency - -## Intent - -- outcome: Executable scenario: Pattern window loads events lazily for memory efficiency - -```gwt -Given the agent module is imported from platform-core -And the pattern detection framework is available -And pattern window duration is 30 days -And 1000 events exist within the pattern window -When pattern trigger is evaluated -Then events are loaded in batches -And memory usage remains bounded -And all relevant events are considered for pattern detection -``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-007-detect-churn-risk-from-cancellations.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-007-detect-churn-risk-from-cancellations.sdp.md deleted file mode 100644 index 23301da2..00000000 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-007-detect-churn-risk-from-cancellations.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-detection.detect-churn-risk-from-cancellations -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-detection ---- -# Detect ChurnRisk from cancellations - -## Intent - -- outcome: Executable scenario: Detect ChurnRisk from cancellations - -```gwt -Given the agent module is imported from platform-core -And the pattern detection framework is available -And events for customer "cust_123": -When pattern detection runs -Then "ChurnRisk" pattern is detected -And confidence is calculated -``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-008-detect-fraud-risk-from-frequency-anomaly.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-008-detect-fraud-risk-from-frequency-anomaly.sdp.md deleted file mode 100644 index f08d7606..00000000 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-008-detect-fraud-risk-from-frequency-anomaly.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-detection.detect-fraud-risk-from-frequency-anomaly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-detection ---- -# Detect FraudRisk from frequency anomaly - -## Intent - -- outcome: Executable scenario: Detect FraudRisk from frequency anomaly - -```gwt -Given the agent module is imported from platform-core -And the pattern detection framework is available -And events showing 50 orders in 1 hour -And normal rate is 5 orders per hour -When pattern detection runs -Then "FraudRisk" pattern is detected -And confidence > 0.9 -``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-009-no-pattern-when-threshold-not-met.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-009-no-pattern-when-threshold-not-met.sdp.md deleted file mode 100644 index 220a5c28..00000000 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-009-no-pattern-when-threshold-not-met.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-detection.no-pattern-when-threshold-not-met -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-detection ---- -# No pattern when threshold not met - -## Intent - -- outcome: Executable scenario: No pattern when threshold not met - -```gwt -Given the agent module is imported from platform-core -And the pattern detection framework is available -And events for customer "cust_123": -When pattern detection runs -Then "ChurnRisk" pattern is NOT detected -``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-010-llm-analyzes-event-sequence.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-010-llm-analyzes-event-sequence.sdp.md deleted file mode 100644 index 21e5b3b4..00000000 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-010-llm-analyzes-event-sequence.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-detection.llm-analyzes-event-sequence -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-detection ---- -# LLM analyzes event sequence - -## Intent - -- outcome: Executable scenario: LLM analyzes event sequence - -```gwt -Given the agent module is imported from platform-core -And the pattern detection framework is available -And events submitted to LLM analysis -When analysis completes -Then result includes detected patterns -And result includes confidence scores -And result includes reasoning text -``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-011-llm-response-includes-suggested-action.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-011-llm-response-includes-suggested-action.sdp.md deleted file mode 100644 index fe52e8b4..00000000 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-011-llm-response-includes-suggested-action.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-detection.llm-response-includes-suggested-action -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-detection ---- -# LLM response includes suggested action - -## Intent - -- outcome: Executable scenario: LLM response includes suggested action - -```gwt -Given the agent module is imported from platform-core -And the pattern detection framework is available -And a detected pattern with high confidence -When LLM provides analysis -Then suggestedCommand is included -And reasoning explains why -``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.examples/s-012-llm-timeout-handled-gracefully.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.examples/s-012-llm-timeout-handled-gracefully.sdp.md deleted file mode 100644 index 11adc43b..00000000 --- a/specs/behavior/platform-core/agent/pattern-detection.examples/s-012-llm-timeout-handled-gracefully.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-detection.llm-timeout-handled-gracefully -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-detection ---- -# LLM timeout handled gracefully - -## Intent - -- outcome: Executable scenario: LLM timeout handled gracefully - -```gwt -Given the agent module is imported from platform-core -And the pattern detection framework is available -And LLM analysis times out -When pattern detection runs -Then fallback to rule-based detection -And audit records timeout event -``` diff --git a/specs/behavior/platform-core/agent/pattern-detection.sdp.md b/specs/behavior/platform-core/agent/pattern-detection.sdp.md index 66b008ed..a7c61511 100644 --- a/specs/behavior/platform-core/agent/pattern-detection.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-detection.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.pattern-detection kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,11 +11,12 @@ relations: ## Intent - actor: a platform developer -- outcome: agents to detect patterns across event streams so that business insights can be generated automatically +- outcome: Detect patterns across event streams using windowed triggers and optional LLM analysis so business insights can be generated automatically. +- value: Cheap rule-based triggers decide when optional LLM analysis should run. ## Behavior -- rule: Patterns are defined with detection criteria -- rule: Pattern window constrains event scope -- rule: Patterns are detected from event sequences -- rule: LLM provides deeper pattern analysis +- rule: Patterns are defined with window, trigger, and analysis logic. +- rule: Pattern window constrains event scope so events outside the window are not considered. +- rule: Trigger conditions activate pattern detection from event sequences. +- rule: Complex patterns use LLM analysis for insight, with a rule-based fallback on timeout. diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-001-returns-null-matched-pattern-and-null-decision-for-empty-patterns-array.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-001-returns-null-matched-pattern-and-null-decision-for-empty-patterns-array.sdp.md deleted file mode 100644 index 6e4c3a46..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-001-returns-null-matched-pattern-and-null-decision-for-empty-patterns-array.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.returns-null-matched-pattern-and-null-decision-for-empty-patterns-array -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Returns null matchedPattern and null decision for empty patterns array - -## Intent - -- outcome: Executable scenario: Returns null matchedPattern and null decision for empty patterns array - -```gwt -Given the module is imported from platform-core -And an event list with 1 default event -When executePatterns is called with no patterns -Then the matchedPattern is null -And the decision is null -And the analysisMethod is "rule-based" -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-002-returns-rule-based-decision-when-trigger-returns-true-and-no-analyze.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-002-returns-rule-based-decision-when-trigger-returns-true-and-no-analyze.sdp.md deleted file mode 100644 index 6f8ceea9..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-002-returns-rule-based-decision-when-trigger-returns-true-and-no-analyze.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.returns-rule-based-decision-when-trigger-returns-true-and-no-analyze -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Returns rule-based decision when trigger returns true and no analyze - -## Intent - -- outcome: Executable scenario: Returns rule-based decision when trigger returns true and no analyze - -```gwt -Given the module is imported from platform-core -And an event list with 1 default event -And a pattern "churn-risk" with trigger returning true -When executePatterns is called with those patterns -Then the matchedPattern is "churn-risk" -And the decision is not null -And the analysisMethod is "rule-based" -And the decision command is null -And the decision requiresApproval is true -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-003-skips-pattern-when-trigger-returns-false.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-003-skips-pattern-when-trigger-returns-false.sdp.md deleted file mode 100644 index 11472d97..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-003-skips-pattern-when-trigger-returns-false.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.skips-pattern-when-trigger-returns-false -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Skips pattern when trigger returns false - -## Intent - -- outcome: Executable scenario: Skips pattern when trigger returns false - -```gwt -Given the module is imported from platform-core -And an event list with 1 default event -And a pattern "no-match" with trigger returning false -When executePatterns is called with those patterns -Then the matchedPattern is null -And the decision is null -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-004-returns-llm-decision-when-analyze-returns-detected.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-004-returns-llm-decision-when-analyze-returns-detected.sdp.md deleted file mode 100644 index 437c24a4..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-004-returns-llm-decision-when-analyze-returns-detected.sdp.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.returns-llm-decision-when-analyze-returns-detected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Returns llm decision when analyze returns detected - -## Intent - -- outcome: Executable scenario: Returns llm decision when analyze returns detected - -```gwt -Given the module is imported from platform-core -And an event list with 1 event with eventId "evt_1" -And a pattern "churn-risk" with trigger true and analyze returning detected with confidence 0.92 -When executePatterns is called with those patterns -Then the matchedPattern is "churn-risk" -And the analysisMethod is "llm" -And the decision is not null -And the decision command is "SuggestOutreach" -And the decision confidence is 0.92 -And the decision reason is "High churn risk detected" -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-005-continues-to-next-pattern-when-analyze-returns-not-detected.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-005-continues-to-next-pattern-when-analyze-returns-not-detected.sdp.md deleted file mode 100644 index 1aa6485e..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-005-continues-to-next-pattern-when-analyze-returns-not-detected.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.continues-to-next-pattern-when-analyze-returns-not-detected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Continues to next pattern when analyze returns not detected - -## Intent - -- outcome: Executable scenario: Continues to next pattern when analyze returns not detected - -```gwt -Given the module is imported from platform-core -And an event list with 1 default event -And a pattern "first" with trigger true and analyze returning not-detected -And a pattern "second" with trigger returning true -When executePatterns is called with those patterns -Then the matchedPattern is "second" -And the analysisMethod is "rule-based" -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-006-propagates-error-when-analyze-throws.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-006-propagates-error-when-analyze-throws.sdp.md deleted file mode 100644 index e8ee8eec..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-006-propagates-error-when-analyze-throws.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.propagates-error-when-analyze-throws -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Propagates error when analyze throws - -## Intent - -- outcome: Executable scenario: Propagates error when analyze throws - -```gwt -Given the module is imported from platform-core -And an event list with 1 default event -And a pattern "risky" with trigger true and analyze that throws "LLM API timeout" -When executePatterns is called with those patterns it rejects with "LLM API timeout" -Then the expected outcome holds -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-007-stops-after-first-matching-pattern.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-007-stops-after-first-matching-pattern.sdp.md deleted file mode 100644 index 5f5c5e8b..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-007-stops-after-first-matching-pattern.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.stops-after-first-matching-pattern -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Stops after first matching pattern - -## Intent - -- outcome: Executable scenario: Stops after first matching pattern - -```gwt -Given the module is imported from platform-core -And an event list with 1 default event -And a pattern "first" with trigger returning true -And a spy pattern "second" with trigger spy -When executePatterns is called with those patterns -Then the matchedPattern is "first" -And the second trigger spy was not called -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-008-falls-through-to-second-pattern-when-first-trigger-is-false.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-008-falls-through-to-second-pattern-when-first-trigger-is-false.sdp.md deleted file mode 100644 index 9c0b8508..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-008-falls-through-to-second-pattern-when-first-trigger-is-false.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.falls-through-to-second-pattern-when-first-trigger-is-false -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Falls through to second pattern when first trigger is false - -## Intent - -- outcome: Executable scenario: Falls through to second pattern when first trigger is false - -```gwt -Given the module is imported from platform-core -And an event list with 1 default event -And a pattern "first" with trigger returning false -And a pattern "second" with trigger returning true -When executePatterns is called with those patterns -Then the matchedPattern is "second" -And the analysisMethod is "rule-based" -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-009-skips-pattern-when-min-events-is-not-met.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-009-skips-pattern-when-min-events-is-not-met.sdp.md deleted file mode 100644 index 868c0e81..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-009-skips-pattern-when-min-events-is-not-met.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.skips-pattern-when-min-events-is-not-met -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Skips pattern when minEvents is not met - -## Intent - -- outcome: Executable scenario: Skips pattern when minEvents is not met - -```gwt -Given the module is imported from platform-core -And an event list with 1 default event -And a pattern "needs-many" with minEvents 5 and a trigger spy -When executePatterns is called with those patterns -Then the matchedPattern is null -And the decision is null -And the minEvents trigger spy was not called -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-010-processes-pattern-when-min-events-is-met.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-010-processes-pattern-when-min-events-is-met.sdp.md deleted file mode 100644 index 9436d8be..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-010-processes-pattern-when-min-events-is-met.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.processes-pattern-when-min-events-is-met -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Processes pattern when minEvents is met - -## Intent - -- outcome: Executable scenario: Processes pattern when minEvents is met - -```gwt -Given the module is imported from platform-core -And an event list with 5 events -And a pattern "needs-five" with minEvents 5 and trigger returning true -When executePatterns is called with those patterns -Then the matchedPattern is "needs-five" -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-011-excludes-events-outside-the-pattern-window.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-011-excludes-events-outside-the-pattern-window.sdp.md deleted file mode 100644 index 350edd1c..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-011-excludes-events-outside-the-pattern-window.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.excludes-events-outside-the-pattern-window -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Excludes events outside the pattern window - -## Intent - -- outcome: Executable scenario: Excludes events outside the pattern window - -```gwt -Given the module is imported from platform-core -And an event from 1 hour ago with eventId "recent" -And an event from 2 days ago with eventId "old" -And a pattern "short-window" with 1-day window and a trigger spy -When executePatterns is called with those patterns and both events -Then the matchedPattern is "short-window" -And the trigger spy was called once with 1 event having eventId "recent" -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-012-returns-no-match-when-all-events-are-outside-the-window.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-012-returns-no-match-when-all-events-are-outside-the-window.sdp.md deleted file mode 100644 index b1337d91..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-012-returns-no-match-when-all-events-are-outside-the-window.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.returns-no-match-when-all-events-are-outside-the-window -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Returns no match when all events are outside the window - -## Intent - -- outcome: Executable scenario: Returns no match when all events are outside the window - -```gwt -Given the module is imported from platform-core -And an event from 2 days ago with eventId "old" -And a pattern "short-window" with 1-day window and minEvents 1 -When executePatterns is called with those patterns and the old event -Then the matchedPattern is null -And the decision is null -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-013-extracts-command-type-from-analysis-result.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-013-extracts-command-type-from-analysis-result.sdp.md deleted file mode 100644 index b5d70318..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-013-extracts-command-type-from-analysis-result.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.extracts-command-type-from-analysis-result -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Extracts command type from analysis result - -## Intent - -- outcome: Executable scenario: Extracts command type from analysis result - -```gwt -Given the module is imported from platform-core -And an analysis result with command "SuggestOutreach" and payload urgency "high" and confidence 0.95 -When buildDecisionFromAnalysis is called with pattern "churn-risk" -Then the decision command is "SuggestOutreach" -And the decision payload equals urgency "high" -And the decision confidence is 0.95 -And the decision reason is "Pattern detected" -And the decision triggeringEvents equals "evt_1" -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-014-returns-null-command-when-no-command-present.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-014-returns-null-command-when-no-command-present.sdp.md deleted file mode 100644 index 0f2f40f6..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-014-returns-null-command-when-no-command-present.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.returns-null-command-when-no-command-present -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Returns null command when no command present - -## Intent - -- outcome: Executable scenario: Returns null command when no command present - -```gwt -Given the module is imported from platform-core -And an analysis result with no command and confidence 0.7 -When buildDecisionFromAnalysis is called with pattern "no-command" -Then the decision command is null -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-015-uses-command-payload-when-command-is-present.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-015-uses-command-payload-when-command-is-present.sdp.md deleted file mode 100644 index a0dc18f6..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-015-uses-command-payload-when-command-is-present.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.uses-command-payload-when-command-is-present -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Uses command payload when command is present - -## Intent - -- outcome: Executable scenario: Uses command payload when command is present - -```gwt -Given the module is imported from platform-core -And an analysis result with command "Cmd" and specific payload -When buildDecisionFromAnalysis is called with pattern "payload-test" -Then the decision payload equals specific "data" -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-016-uses-result-data-as-payload-when-no-command-present.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-016-uses-result-data-as-payload-when-no-command-present.sdp.md deleted file mode 100644 index dee1474b..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-016-uses-result-data-as-payload-when-no-command-present.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.uses-result-data-as-payload-when-no-command-present -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Uses result data as payload when no command present - -## Intent - -- outcome: Executable scenario: Uses result data as payload when no command present - -```gwt -Given the module is imported from platform-core -And an analysis result with no command but with data extra "info" -When buildDecisionFromAnalysis is called with pattern "data-fallback" -Then the decision payload equals extra "info" -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-017-requires-approval-when-confidence-is-below-threshold.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-017-requires-approval-when-confidence-is-below-threshold.sdp.md deleted file mode 100644 index bc98890b..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-017-requires-approval-when-confidence-is-below-threshold.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.requires-approval-when-confidence-is-below-threshold -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Requires approval when confidence is below threshold - -## Intent - -- outcome: Executable scenario: Requires approval when confidence is below threshold - -```gwt -Given the module is imported from platform-core -And an analysis result with command "SomeAction" and confidence 0.5 -When buildDecisionFromAnalysis is called with confidence threshold 0.8 -Then the decision requiresApproval is true -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-018-does-not-require-approval-when-confidence-meets-threshold.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-018-does-not-require-approval-when-confidence-meets-threshold.sdp.md deleted file mode 100644 index 44df29d4..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-018-does-not-require-approval-when-confidence-meets-threshold.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.does-not-require-approval-when-confidence-meets-threshold -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Does not require approval when confidence meets threshold - -## Intent - -- outcome: Executable scenario: Does not require approval when confidence meets threshold - -```gwt -Given the module is imported from platform-core -And an analysis result with command "SafeAction" and confidence 0.9 -When buildDecisionFromAnalysis is called with confidence threshold 0.8 -Then the decision requiresApproval is false -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-019-does-not-require-approval-when-confidence-equals-threshold.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-019-does-not-require-approval-when-confidence-equals-threshold.sdp.md deleted file mode 100644 index 603af7a7..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-019-does-not-require-approval-when-confidence-equals-threshold.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.does-not-require-approval-when-confidence-equals-threshold -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Does not require approval when confidence equals threshold - -## Intent - -- outcome: Executable scenario: Does not require approval when confidence equals threshold - -```gwt -Given the module is imported from platform-core -And an analysis result with command "ExactAction" and confidence 0.8 -When buildDecisionFromAnalysis is called with confidence threshold 0.8 -Then the decision requiresApproval is false -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-020-always-requires-approval-when-no-command-is-present.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-020-always-requires-approval-when-no-command-is-present.sdp.md deleted file mode 100644 index 9522e6a8..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-020-always-requires-approval-when-no-command-is-present.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.always-requires-approval-when-no-command-is-present -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Always requires approval when no command is present - -## Intent - -- outcome: Executable scenario: Always requires approval when no command is present - -```gwt -Given the module is imported from platform-core -And an analysis result with no command and confidence 0.99 -When buildDecisionFromAnalysis is called with pattern "no-cmd" -Then the decision requiresApproval is true -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-021-forces-approval-when-command-is-in-requires-approval-list.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-021-forces-approval-when-command-is-in-requires-approval-list.sdp.md deleted file mode 100644 index 246cd847..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-021-forces-approval-when-command-is-in-requires-approval-list.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.forces-approval-when-command-is-in-requires-approval-list -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Forces approval when command is in requiresApproval list - -## Intent - -- outcome: Executable scenario: Forces approval when command is in requiresApproval list - -```gwt -Given the module is imported from platform-core -And an analysis result with command "DangerousAction" and confidence 0.99 -When buildDecisionFromAnalysis is called with humanInLoop requiresApproval "DangerousAction" -Then the decision requiresApproval is true -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-022-skips-approval-when-command-is-in-auto-approve-list.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-022-skips-approval-when-command-is-in-auto-approve-list.sdp.md deleted file mode 100644 index f0713ff6..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-022-skips-approval-when-command-is-in-auto-approve-list.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.skips-approval-when-command-is-in-auto-approve-list -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Skips approval when command is in autoApprove list - -## Intent - -- outcome: Executable scenario: Skips approval when command is in autoApprove list - -```gwt -Given the module is imported from platform-core -And an analysis result with command "SafeAction" and confidence 0.3 -When buildDecisionFromAnalysis is called with humanInLoop autoApprove "SafeAction" -Then the decision requiresApproval is false -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-023-requires-approval-takes-precedence-over-auto-approve-for-same-command.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-023-requires-approval-takes-precedence-over-auto-approve-for-same-command.sdp.md deleted file mode 100644 index bc2d1c3d..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-023-requires-approval-takes-precedence-over-auto-approve-for-same-command.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.requires-approval-takes-precedence-over-auto-approve-for-same-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# requiresApproval takes precedence over autoApprove for same command - -## Intent - -- outcome: Executable scenario: requiresApproval takes precedence over autoApprove for same command - -```gwt -Given the module is imported from platform-core -And an analysis result with command "ConflictAction" and confidence 0.99 -When buildDecisionFromAnalysis is called with humanInLoop both lists for "ConflictAction" -Then the decision requiresApproval is true -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-024-returns-null-command-for-trigger-only-decision.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-024-returns-null-command-for-trigger-only-decision.sdp.md deleted file mode 100644 index 189efec1..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-024-returns-null-command-for-trigger-only-decision.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.returns-null-command-for-trigger-only-decision -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Returns null command for trigger-only decision - -## Intent - -- outcome: Executable scenario: Returns null command for trigger-only decision - -```gwt -Given the module is imported from platform-core -And 1 default event for trigger decision -And a trigger pattern named "basic" -When buildDecisionFromTrigger is called -Then the trigger decision command is null -And the trigger decision payload is empty -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-025-always-requires-approval-for-trigger-only-decision.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-025-always-requires-approval-for-trigger-only-decision.sdp.md deleted file mode 100644 index d027b058..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-025-always-requires-approval-for-trigger-only-decision.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.always-requires-approval-for-trigger-only-decision -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Always requires approval for trigger-only decision - -## Intent - -- outcome: Executable scenario: Always requires approval for trigger-only decision - -```gwt -Given the module is imported from platform-core -And 1 default event for trigger decision -And a trigger pattern named "basic" -When buildDecisionFromTrigger is called -Then the trigger decision requiresApproval is true -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-026-includes-pattern-name-in-trigger-decision-reason.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-026-includes-pattern-name-in-trigger-decision-reason.sdp.md deleted file mode 100644 index b7024190..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-026-includes-pattern-name-in-trigger-decision-reason.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.includes-pattern-name-in-trigger-decision-reason -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Includes pattern name in trigger decision reason - -## Intent - -- outcome: Executable scenario: Includes pattern name in trigger decision reason - -```gwt -Given the module is imported from platform-core -And 1 default event for trigger decision -And a trigger pattern named "churn-risk" -When buildDecisionFromTrigger is called -Then the trigger decision reason contains "churn-risk" -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-027-includes-event-count-in-trigger-decision-reason.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-027-includes-event-count-in-trigger-decision-reason.sdp.md deleted file mode 100644 index 8feada9c..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-027-includes-event-count-in-trigger-decision-reason.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.includes-event-count-in-trigger-decision-reason -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Includes event count in trigger decision reason - -## Intent - -- outcome: Executable scenario: Includes event count in trigger decision reason - -```gwt -Given the module is imported from platform-core -And 3 default events for trigger decision -And a trigger pattern named "multi-event" -When buildDecisionFromTrigger is called -Then the trigger decision reason contains "3 events" -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-028-includes-all-event-i-ds-in-triggering-events.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-028-includes-all-event-i-ds-in-triggering-events.sdp.md deleted file mode 100644 index f191d8fc..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-028-includes-all-event-i-ds-in-triggering-events.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.includes-all-event-i-ds-in-triggering-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Includes all event IDs in triggeringEvents - -## Intent - -- outcome: Executable scenario: Includes all event IDs in triggeringEvents - -```gwt -Given the module is imported from platform-core -And events with IDs "evt_a" and "evt_b" for trigger decision -And a trigger pattern named "trigger-test" -When buildDecisionFromTrigger is called -Then the trigger decision triggeringEvents are "evt_a" and "evt_b" -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-029-returns-0-6-confidence-for-1-event.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-029-returns-0-6-confidence-for-1-event.sdp.md deleted file mode 100644 index dec6ddd3..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-029-returns-0-6-confidence-for-1-event.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.returns-0-6-confidence-for-1-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Returns 0.6 confidence for 1 event - -## Intent - -- outcome: Executable scenario: Returns 0.6 confidence for 1 event - -```gwt -Given the module is imported from platform-core -And 1 default event for trigger decision -And a trigger pattern named "t" -When buildDecisionFromTrigger is called -Then the trigger decision confidence is approximately 0.6 -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-030-returns-0-7-confidence-for-2-events.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-030-returns-0-7-confidence-for-2-events.sdp.md deleted file mode 100644 index a546ce06..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-030-returns-0-7-confidence-for-2-events.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.returns-0-7-confidence-for-2-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Returns 0.7 confidence for 2 events - -## Intent - -- outcome: Executable scenario: Returns 0.7 confidence for 2 events - -```gwt -Given the module is imported from platform-core -And 2 default events for trigger decision -And a trigger pattern named "t" -When buildDecisionFromTrigger is called -Then the trigger decision confidence is approximately 0.7 -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-031-returns-0-8-confidence-for-3-events.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-031-returns-0-8-confidence-for-3-events.sdp.md deleted file mode 100644 index 5bf8cfb6..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-031-returns-0-8-confidence-for-3-events.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.returns-0-8-confidence-for-3-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Returns 0.8 confidence for 3 events - -## Intent - -- outcome: Executable scenario: Returns 0.8 confidence for 3 events - -```gwt -Given the module is imported from platform-core -And 3 default events for trigger decision -And a trigger pattern named "t" -When buildDecisionFromTrigger is called -Then the trigger decision confidence is approximately 0.8 -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-032-caps-at-0-85-for-4-events.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-032-caps-at-0-85-for-4-events.sdp.md deleted file mode 100644 index 0d35bb77..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-032-caps-at-0-85-for-4-events.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.caps-at-0-85-for-4-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Caps at 0.85 for 4 events - -## Intent - -- outcome: Executable scenario: Caps at 0.85 for 4 events - -```gwt -Given the module is imported from platform-core -And 4 default events for trigger decision -And a trigger pattern named "t" -When buildDecisionFromTrigger is called -Then the trigger decision confidence is approximately 0.85 -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-033-caps-at-0-85-for-10-events.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-033-caps-at-0-85-for-10-events.sdp.md deleted file mode 100644 index d8866793..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-033-caps-at-0-85-for-10-events.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.caps-at-0-85-for-10-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Caps at 0.85 for 10 events - -## Intent - -- outcome: Executable scenario: Caps at 0.85 for 10 events - -```gwt -Given the module is imported from platform-core -And 10 default events for trigger decision -And a trigger pattern named "t" -When buildDecisionFromTrigger is called -Then the trigger decision confidence is approximately 0.85 -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.examples/s-034-returns-0-5-for-0-events-edge-case.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.examples/s-034-returns-0-5-for-0-events-edge-case.sdp.md deleted file mode 100644 index 64d7875c..00000000 --- a/specs/behavior/platform-core/agent/pattern-executor.examples/s-034-returns-0-5-for-0-events-edge-case.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-executor.returns-0-5-for-0-events-edge-case -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-executor ---- -# Returns 0.5 for 0 events edge case - -## Intent - -- outcome: Executable scenario: Returns 0.5 for 0 events edge case - -```gwt -Given the module is imported from platform-core -And 0 events for trigger decision -And a trigger pattern named "t" -When buildDecisionFromTrigger is called -Then the trigger decision confidence is approximately 0.5 -``` diff --git a/specs/behavior/platform-core/agent/pattern-executor.sdp.md b/specs/behavior/platform-core/agent/pattern-executor.sdp.md index 89d6107f..0f442863 100644 --- a/specs/behavior/platform-core/agent/pattern-executor.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-executor.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.pattern-executor kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,20 +10,21 @@ relations: ## Intent -- outcome: Pattern Executor +- outcome: Iterate the agent's pattern array in priority order, call trigger then analyze, short-circuit on the first match, and return an execution summary. +- value: Trigger-only patterns produce rule-based decisions; analyze errors propagate so Workpool can retry. ## Behavior -- rule: executePatterns returns null for empty patterns -- rule: executePatterns matches single pattern via trigger -- rule: executePatterns delegates to analyze when present -- rule: executePatterns propagates analyze errors -- rule: executePatterns short-circuits on first match -- rule: executePatterns falls through non-matching patterns -- rule: executePatterns enforces minEvents -- rule: executePatterns applies window filtering -- rule: buildDecisionFromAnalysis extracts command and payload -- rule: buildDecisionFromAnalysis determines requiresApproval from confidence threshold -- rule: buildDecisionFromAnalysis respects humanInLoop overrides -- rule: buildDecisionFromTrigger returns basic trigger-only decision -- rule: buildDecisionFromTrigger computes heuristic confidence +- rule: Empty patterns array yields null matchedPattern, null decision, and rule-based method. +- rule: A pattern whose trigger returns true is matched rule-based; a false trigger is skipped. +- rule: Analyze detected yields an llm decision; not-detected falls through to the next pattern. +- rule: Errors from analyze propagate for Workpool retry. +- rule: After the first matching pattern, remaining patterns are never evaluated. +- rule: Patterns with false triggers are skipped and the next pattern is evaluated. +- rule: Patterns with minEvents greater than available events are skipped without calling trigger. +- rule: Events outside the pattern window duration are excluded before trigger evaluation. +- rule: Command type, payload, confidence, reason, and triggeringEvents are extracted from the analysis result. +- rule: Approval is required when confidence is below threshold or no command is present. +- rule: requiresApproval list forces approval; autoApprove list skips it; requiresApproval takes precedence. +- rule: Trigger-only decisions have null command, empty payload, always require approval, and include pattern name and event IDs. +- rule: Trigger-only confidence is min(0.85, 0.5 + eventCount * 0.1). diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-001-error-codes-object-contains-all-expected-codes.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-001-error-codes-object-contains-all-expected-codes.sdp.md deleted file mode 100644 index d644e842..00000000 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-001-error-codes-object-contains-all-expected-codes.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-registry.error-codes-object-contains-all-expected-codes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-registry ---- -# Error codes object contains all expected codes - -## Intent - -- outcome: Executable scenario: Error codes object contains all expected codes - -```gwt -Given the feature fixture is in place -When the scenario runs -Then PATTERN_REGISTRY_ERROR_CODES contains all expected codes: -And PATTERN_REGISTRY_ERROR_CODES has exactly 4 keys -``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-002-single-valid-pattern-passes.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-002-single-valid-pattern-passes.sdp.md deleted file mode 100644 index cd8ed860..00000000 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-002-single-valid-pattern-passes.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-registry.single-valid-pattern-passes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-registry ---- -# Single valid pattern passes - -## Intent - -- outcome: Executable scenario: Single valid pattern passes - -```gwt -Given a valid pattern named "churn-risk" -When I validate the pattern definitions -Then the result is valid -``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-003-multiple-patterns-with-unique-names-pass.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-003-multiple-patterns-with-unique-names-pass.sdp.md deleted file mode 100644 index 870f31cb..00000000 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-003-multiple-patterns-with-unique-names-pass.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-registry.multiple-patterns-with-unique-names-pass -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-registry ---- -# Multiple patterns with unique names pass - -## Intent - -- outcome: Executable scenario: Multiple patterns with unique names pass - -```gwt -Given valid patterns named: -When I validate the pattern definitions -Then the result is valid -``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-004-patterns-with-different-window-configurations-pass.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-004-patterns-with-different-window-configurations-pass.sdp.md deleted file mode 100644 index 5820a643..00000000 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-004-patterns-with-different-window-configurations-pass.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-registry.patterns-with-different-window-configurations-pass -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-registry ---- -# Patterns with different window configurations pass - -## Intent - -- outcome: Executable scenario: Patterns with different window configurations pass - -```gwt -Given a pattern "short-window" with window duration "1h" -And a pattern "long-window" with window duration "30d" and minEvents 5 and eventLimit 200 -When I validate the pattern definitions -Then the result is valid -``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-005-pattern-with-analyze-function-passes.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-005-pattern-with-analyze-function-passes.sdp.md deleted file mode 100644 index 47d51fca..00000000 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-005-pattern-with-analyze-function-passes.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-registry.pattern-with-analyze-function-passes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-registry ---- -# Pattern with analyze function passes - -## Intent - -- outcome: Executable scenario: Pattern with analyze function passes - -```gwt -Given a pattern "with-analyzer" that has an analyze function -When I validate the pattern definitions -Then the result is valid -``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-006-empty-array-returns-valid.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-006-empty-array-returns-valid.sdp.md deleted file mode 100644 index bd566bd9..00000000 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-006-empty-array-returns-valid.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-registry.empty-array-returns-valid -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-registry ---- -# Empty array returns valid - -## Intent - -- outcome: Executable scenario: Empty array returns valid - -```gwt -Given an empty pattern array -When I validate the pattern definitions -Then the result is valid -``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-007-two-patterns-with-same-name-fail.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-007-two-patterns-with-same-name-fail.sdp.md deleted file mode 100644 index 3872d751..00000000 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-007-two-patterns-with-same-name-fail.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-registry.two-patterns-with-same-name-fail -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-registry ---- -# Two patterns with same name fail - -## Intent - -- outcome: Executable scenario: Two patterns with same name fail - -```gwt -Given valid patterns named: -When I validate the pattern definitions -Then the result is invalid with code "DUPLICATE_PATTERN" -And the error message contains "churn-risk" -``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-008-duplicate-detected-in-middle-of-array.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-008-duplicate-detected-in-middle-of-array.sdp.md deleted file mode 100644 index 8a7c2761..00000000 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-008-duplicate-detected-in-middle-of-array.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-registry.duplicate-detected-in-middle-of-array -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-registry ---- -# Duplicate detected in middle of array - -## Intent - -- outcome: Executable scenario: Duplicate detected in middle of array - -```gwt -Given valid patterns named: -When I validate the pattern definitions -Then the result is invalid with code "DUPLICATE_PATTERN" -And the error message contains "alpha" -``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-009-short-circuits-on-first-duplicate-found.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-009-short-circuits-on-first-duplicate-found.sdp.md deleted file mode 100644 index b503b265..00000000 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-009-short-circuits-on-first-duplicate-found.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-registry.short-circuits-on-first-duplicate-found -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-registry ---- -# Short-circuits on first duplicate found - -## Intent - -- outcome: Executable scenario: Short-circuits on first duplicate found - -```gwt -Given valid patterns named: -When I validate the pattern definitions -Then the result is invalid with code "DUPLICATE_PATTERN" -And the error message contains "alpha" -``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-010-empty-name-fails-with-pattern-name-required.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-010-empty-name-fails-with-pattern-name-required.sdp.md deleted file mode 100644 index ab67cf0c..00000000 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-010-empty-name-fails-with-pattern-name-required.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-registry.empty-name-fails-with-pattern-name-required -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-registry ---- -# Empty name fails with PATTERN_NAME_REQUIRED - -## Intent - -- outcome: Executable scenario: Empty name fails with PATTERN_NAME_REQUIRED - -```gwt -Given a valid pattern named "" -When I validate the pattern definitions -Then the result is invalid with code "PATTERN_NAME_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-011-whitespace-only-name-fails-with-pattern-name-required.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-011-whitespace-only-name-fails-with-pattern-name-required.sdp.md deleted file mode 100644 index 6c3ed9e8..00000000 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-011-whitespace-only-name-fails-with-pattern-name-required.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-registry.whitespace-only-name-fails-with-pattern-name-required -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-registry ---- -# Whitespace-only name fails with PATTERN_NAME_REQUIRED - -## Intent - -- outcome: Executable scenario: Whitespace-only name fails with PATTERN_NAME_REQUIRED - -```gwt -Given a valid pattern named " " -When I validate the pattern definitions -Then the result is invalid with code "PATTERN_NAME_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-012-invalid-pattern-short-circuits-before-duplicate-check.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-012-invalid-pattern-short-circuits-before-duplicate-check.sdp.md deleted file mode 100644 index 8b0f3e40..00000000 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-012-invalid-pattern-short-circuits-before-duplicate-check.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-registry.invalid-pattern-short-circuits-before-duplicate-check -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-registry ---- -# Invalid pattern short-circuits before duplicate check - -## Intent - -- outcome: Executable scenario: Invalid pattern short-circuits before duplicate check - -```gwt -Given a pattern with empty name followed by a pattern named "churn-risk" -When I validate the pattern definitions -Then the result is invalid with code "PATTERN_NAME_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-013-pattern-without-trigger-function-fails.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-013-pattern-without-trigger-function-fails.sdp.md deleted file mode 100644 index b7963cdf..00000000 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-013-pattern-without-trigger-function-fails.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-registry.pattern-without-trigger-function-fails -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-registry ---- -# Pattern without trigger function fails - -## Intent - -- outcome: Executable scenario: Pattern without trigger function fails - -```gwt -Given a pattern "no-trigger" without a trigger function -When I validate the pattern definitions -Then the result is invalid with code "TRIGGER_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-014-pattern-with-non-function-trigger-fails.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-014-pattern-with-non-function-trigger-fails.sdp.md deleted file mode 100644 index a6d288e6..00000000 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-014-pattern-with-non-function-trigger-fails.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-registry.pattern-with-non-function-trigger-fails -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-registry ---- -# Pattern with non-function trigger fails - -## Intent - -- outcome: Executable scenario: Pattern with non-function trigger fails - -```gwt -Given a pattern "bad-trigger" with a non-function trigger -When I validate the pattern definitions -Then the result is invalid with code "TRIGGER_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-015-pattern-name-required-maps-to-registry-pattern-name-required.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-015-pattern-name-required-maps-to-registry-pattern-name-required.sdp.md deleted file mode 100644 index 29b1c0f0..00000000 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-015-pattern-name-required-maps-to-registry-pattern-name-required.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-registry.pattern-name-required-maps-to-registry-pattern-name-required -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-registry ---- -# PATTERN_NAME_REQUIRED maps to registry PATTERN_NAME_REQUIRED - -## Intent - -- outcome: Executable scenario: PATTERN_NAME_REQUIRED maps to registry PATTERN_NAME_REQUIRED - -```gwt -Given a valid pattern named "" -When I validate the pattern definitions -Then the result is invalid with code "PATTERN_NAME_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-016-trigger-required-maps-to-registry-trigger-required.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-016-trigger-required-maps-to-registry-trigger-required.sdp.md deleted file mode 100644 index 71bfe0ba..00000000 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-016-trigger-required-maps-to-registry-trigger-required.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-registry.trigger-required-maps-to-registry-trigger-required -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-registry ---- -# TRIGGER_REQUIRED maps to registry TRIGGER_REQUIRED - -## Intent - -- outcome: Executable scenario: TRIGGER_REQUIRED maps to registry TRIGGER_REQUIRED - -```gwt -Given a pattern "no-trigger" without a trigger function -When I validate the pattern definitions -Then the result is invalid with code "TRIGGER_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-017-unknown-pattern-error-codes-map-to-invalid-pattern.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-017-unknown-pattern-error-codes-map-to-invalid-pattern.sdp.md deleted file mode 100644 index 59bbb96d..00000000 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-017-unknown-pattern-error-codes-map-to-invalid-pattern.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-registry.unknown-pattern-error-codes-map-to-invalid-pattern -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-registry ---- -# Unknown pattern error codes map to INVALID_PATTERN - -## Intent - -- outcome: Executable scenario: Unknown pattern error codes map to INVALID_PATTERN - -```gwt -Given a pattern "bad-window" with invalid window duration "invalid" -When I validate the pattern definitions -Then the result is invalid with code "INVALID_PATTERN" -``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-018-accepts-readonly-array-input.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-018-accepts-readonly-array-input.sdp.md deleted file mode 100644 index aa2cd31f..00000000 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-018-accepts-readonly-array-input.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-registry.accepts-readonly-array-input -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-registry ---- -# Accepts readonly array input - -## Intent - -- outcome: Executable scenario: Accepts readonly array input - -```gwt -Given a frozen readonly pattern array with pattern "frozen-pattern" -When I validate the pattern definitions -Then the result is valid -``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.examples/s-019-error-result-has-correct-discriminated-union-shape.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.examples/s-019-error-result-has-correct-discriminated-union-shape.sdp.md deleted file mode 100644 index 585aa804..00000000 --- a/specs/behavior/platform-core/agent/pattern-registry.examples/s-019-error-result-has-correct-discriminated-union-shape.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.pattern-registry.error-result-has-correct-discriminated-union-shape -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.pattern-registry ---- -# Error result has correct discriminated union shape - -## Intent - -- outcome: Executable scenario: Error result has correct discriminated union shape - -```gwt -Given valid patterns named: -When I validate the pattern definitions -Then the result is invalid with code "DUPLICATE_PATTERN" -And the error message is a string -``` diff --git a/specs/behavior/platform-core/agent/pattern-registry.sdp.md b/specs/behavior/platform-core/agent/pattern-registry.sdp.md index 95644037..7351007c 100644 --- a/specs/behavior/platform-core/agent/pattern-registry.sdp.md +++ b/specs/behavior/platform-core/agent/pattern-registry.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.pattern-registry kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,15 +10,16 @@ relations: ## Intent -- outcome: Pattern Registry +- outcome: Validate PatternDefinition arrays passed on AgentBCConfig.patterns, rejecting missing names, missing triggers, and duplicate names. +- value: A single agent can pass PatternDefinition[] directly without a global singleton registry. ## Behavior -- rule: Error code constants are complete and correct -- rule: Valid patterns pass validation -- rule: Empty array passes validation -- rule: Duplicate names are rejected -- rule: Missing name is rejected -- rule: Missing trigger is rejected -- rule: Error codes are mapped correctly at registry level -- rule: Type safety is preserved +- rule: PATTERN_REGISTRY_ERROR_CODES contains exactly four known error codes with values matching their keys. +- rule: Any array of well-formed patterns with unique names returns valid true. +- rule: An empty array has nothing to validate and returns valid true. +- rule: If two or more patterns share the same name, validation fails with DUPLICATE_PATTERN and mentions the offending name. +- rule: A pattern with an empty or whitespace-only name fails with PATTERN_NAME_REQUIRED. +- rule: A pattern without a trigger function, or with a non-function trigger, fails with TRIGGER_REQUIRED. +- rule: Pattern-level error codes map to their registry-level equivalents; unknown codes map to INVALID_PATTERN. +- rule: The function accepts readonly arrays and the error result conforms to the discriminated union shape. diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-001-error-codes-contain-all-expected-values.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-001-error-codes-contain-all-expected-values.sdp.md deleted file mode 100644 index c71d930c..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-001-error-codes-contain-all-expected-values.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.error-codes-contain-all-expected-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Error codes contain all expected values - -## Intent - -- outcome: Executable scenario: Error codes contain all expected values - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then the error codes contain the following entries: -And the error codes object has exactly 6 keys -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-002-accepts-valid-window-with-duration-only.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-002-accepts-valid-window-with-duration-only.sdp.md deleted file mode 100644 index 5826b22f..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-002-accepts-valid-window-with-duration-only.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.accepts-valid-window-with-duration-only -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Accepts valid window with duration only - -## Intent - -- outcome: Executable scenario: Accepts valid window with duration only - -```gwt -Given the module is imported from platform-core -When I parse a window with duration "7d" -Then the schema parse succeeds -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-003-accepts-window-with-all-optional-fields.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-003-accepts-window-with-all-optional-fields.sdp.md deleted file mode 100644 index eacb6b3b..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-003-accepts-window-with-all-optional-fields.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.accepts-window-with-all-optional-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Accepts window with all optional fields - -## Intent - -- outcome: Executable scenario: Accepts window with all optional fields - -```gwt -Given the module is imported from platform-core -When I parse a window with duration "7d" eventLimit 100 minEvents 5 loadBatchSize 50 -Then the schema parse succeeds -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-004-rejects-window-with-empty-duration.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-004-rejects-window-with-empty-duration.sdp.md deleted file mode 100644 index b4948d86..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-004-rejects-window-with-empty-duration.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.rejects-window-with-empty-duration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Rejects window with empty duration - -## Intent - -- outcome: Executable scenario: Rejects window with empty duration - -```gwt -Given the module is imported from platform-core -When I parse a window with duration "" -Then the schema parse fails -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-005-rejects-window-with-missing-duration.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-005-rejects-window-with-missing-duration.sdp.md deleted file mode 100644 index d61c86b5..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-005-rejects-window-with-missing-duration.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.rejects-window-with-missing-duration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Rejects window with missing duration - -## Intent - -- outcome: Executable scenario: Rejects window with missing duration - -```gwt -Given the module is imported from platform-core -When I parse a window with no duration -Then the schema parse fails -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-006-rejects-window-with-non-positive-event-limit.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-006-rejects-window-with-non-positive-event-limit.sdp.md deleted file mode 100644 index 4916fcc9..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-006-rejects-window-with-non-positive-event-limit.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.rejects-window-with-non-positive-event-limit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Rejects window with non-positive eventLimit - -## Intent - -- outcome: Executable scenario: Rejects window with non-positive eventLimit - -```gwt -Given the module is imported from platform-core -When I parse a window with duration "7d" and eventLimit 0 -Then the schema parse fails -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-007-rejects-window-with-negative-event-limit.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-007-rejects-window-with-negative-event-limit.sdp.md deleted file mode 100644 index b0ed232a..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-007-rejects-window-with-negative-event-limit.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.rejects-window-with-negative-event-limit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Rejects window with negative eventLimit - -## Intent - -- outcome: Executable scenario: Rejects window with negative eventLimit - -```gwt -Given the module is imported from platform-core -When I parse a window with duration "7d" and eventLimit -10 -Then the schema parse fails -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-008-rejects-window-with-non-positive-min-events.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-008-rejects-window-with-non-positive-min-events.sdp.md deleted file mode 100644 index 8e6cf054..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-008-rejects-window-with-non-positive-min-events.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.rejects-window-with-non-positive-min-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Rejects window with non-positive minEvents - -## Intent - -- outcome: Executable scenario: Rejects window with non-positive minEvents - -```gwt -Given the module is imported from platform-core -When I parse a window with duration "7d" and minEvents 0 -Then the schema parse fails -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-009-rejects-window-with-non-positive-load-batch-size.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-009-rejects-window-with-non-positive-load-batch-size.sdp.md deleted file mode 100644 index 3aea032c..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-009-rejects-window-with-non-positive-load-batch-size.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.rejects-window-with-non-positive-load-batch-size -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Rejects window with non-positive loadBatchSize - -## Intent - -- outcome: Executable scenario: Rejects window with non-positive loadBatchSize - -```gwt -Given the module is imported from platform-core -When I parse a window with duration "7d" and loadBatchSize 0 -Then the schema parse fails -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-010-rejects-window-with-non-integer-event-limit.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-010-rejects-window-with-non-integer-event-limit.sdp.md deleted file mode 100644 index e8b9082f..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-010-rejects-window-with-non-integer-event-limit.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.rejects-window-with-non-integer-event-limit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Rejects window with non-integer eventLimit - -## Intent - -- outcome: Executable scenario: Rejects window with non-integer eventLimit - -```gwt -Given the module is imported from platform-core -When I parse a window with duration "7d" and eventLimit 50.5 -Then the schema parse fails -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-011-parses-days-format-correctly.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-011-parses-days-format-correctly.sdp.md deleted file mode 100644 index 98c05012..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-011-parses-days-format-correctly.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.parses-days-format-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Parses days format correctly - -## Intent - -- outcome: Executable scenario: Parses days format correctly - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then parseDuration returns expected milliseconds for: -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-012-parses-hours-format-correctly.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-012-parses-hours-format-correctly.sdp.md deleted file mode 100644 index 319f66ca..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-012-parses-hours-format-correctly.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.parses-hours-format-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Parses hours format correctly - -## Intent - -- outcome: Executable scenario: Parses hours format correctly - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then parseDuration returns expected milliseconds for: -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-013-parses-minutes-format-correctly.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-013-parses-minutes-format-correctly.sdp.md deleted file mode 100644 index b7e60795..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-013-parses-minutes-format-correctly.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.parses-minutes-format-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Parses minutes format correctly - -## Intent - -- outcome: Executable scenario: Parses minutes format correctly - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then parseDuration returns expected milliseconds for: -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-014-handles-uppercase-units.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-014-handles-uppercase-units.sdp.md deleted file mode 100644 index 4614de26..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-014-handles-uppercase-units.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.handles-uppercase-units -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Handles uppercase units - -## Intent - -- outcome: Executable scenario: Handles uppercase units - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then parseDuration returns expected milliseconds for: -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-015-returns-null-for-invalid-formats.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-015-returns-null-for-invalid-formats.sdp.md deleted file mode 100644 index 7648479e..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-015-returns-null-for-invalid-formats.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-null-for-invalid-formats -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns null for invalid formats - -## Intent - -- outcome: Executable scenario: Returns null for invalid formats - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then parseDuration returns null for: -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-016-trims-leading-and-trailing-whitespace.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-016-trims-leading-and-trailing-whitespace.sdp.md deleted file mode 100644 index 2068d776..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-016-trims-leading-and-trailing-whitespace.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.trims-leading-and-trailing-whitespace -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Trims leading and trailing whitespace - -## Intent - -- outcome: Executable scenario: Trims leading and trailing whitespace - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then parseDuration returns expected milliseconds for: -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-017-returns-true-for-valid-duration-formats.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-017-returns-true-for-valid-duration-formats.sdp.md deleted file mode 100644 index 673072cb..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-017-returns-true-for-valid-duration-formats.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-true-for-valid-duration-formats -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns true for valid duration formats - -## Intent - -- outcome: Executable scenario: Returns true for valid duration formats - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isValidDuration returns true for: -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-018-returns-false-for-invalid-duration-formats.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-018-returns-false-for-invalid-duration-formats.sdp.md deleted file mode 100644 index a3343ecd..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-018-returns-false-for-invalid-duration-formats.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-false-for-invalid-duration-formats -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns false for invalid duration formats - -## Intent - -- outcome: Executable scenario: Returns false for invalid duration formats - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isValidDuration returns false for: -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-019-returns-invalid-when-name-is-missing.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-019-returns-invalid-when-name-is-missing.sdp.md deleted file mode 100644 index 1887cdf8..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-019-returns-invalid-when-name-is-missing.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-name-is-missing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns invalid when name is missing - -## Intent - -- outcome: Executable scenario: Returns invalid when name is missing - -```gwt -Given the module is imported from platform-core -When I validate a pattern with no name -Then the validation result is invalid with code "PATTERN_NAME_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-020-returns-invalid-when-name-is-empty-string.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-020-returns-invalid-when-name-is-empty-string.sdp.md deleted file mode 100644 index 52b47b4c..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-020-returns-invalid-when-name-is-empty-string.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-name-is-empty-string -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns invalid when name is empty string - -## Intent - -- outcome: Executable scenario: Returns invalid when name is empty string - -```gwt -Given the module is imported from platform-core -When I validate a pattern with name "" -Then the validation result is invalid with code "PATTERN_NAME_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-021-returns-invalid-when-name-is-whitespace-only.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-021-returns-invalid-when-name-is-whitespace-only.sdp.md deleted file mode 100644 index 674d5deb..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-021-returns-invalid-when-name-is-whitespace-only.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-name-is-whitespace-only -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns invalid when name is whitespace only - -## Intent - -- outcome: Executable scenario: Returns invalid when name is whitespace only - -```gwt -Given the module is imported from platform-core -When I validate a pattern with name " " -Then the validation result is invalid with code "PATTERN_NAME_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-022-returns-invalid-when-trigger-is-missing.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-022-returns-invalid-when-trigger-is-missing.sdp.md deleted file mode 100644 index 484acf3d..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-022-returns-invalid-when-trigger-is-missing.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-trigger-is-missing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns invalid when trigger is missing - -## Intent - -- outcome: Executable scenario: Returns invalid when trigger is missing - -```gwt -Given the module is imported from platform-core -When I validate a pattern with no trigger -Then the validation result is invalid with code "TRIGGER_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-023-returns-invalid-when-trigger-is-not-a-function.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-023-returns-invalid-when-trigger-is-not-a-function.sdp.md deleted file mode 100644 index 4b8d29a5..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-023-returns-invalid-when-trigger-is-not-a-function.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-trigger-is-not-a-function -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns invalid when trigger is not a function - -## Intent - -- outcome: Executable scenario: Returns invalid when trigger is not a function - -```gwt -Given the module is imported from platform-core -When I validate a pattern with trigger as a non-function -Then the validation result is invalid with code "TRIGGER_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-024-returns-invalid-when-duration-format-is-invalid.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-024-returns-invalid-when-duration-format-is-invalid.sdp.md deleted file mode 100644 index 96646c5b..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-024-returns-invalid-when-duration-format-is-invalid.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-duration-format-is-invalid -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns invalid when duration format is invalid - -## Intent - -- outcome: Executable scenario: Returns invalid when duration format is invalid - -```gwt -Given the module is imported from platform-core -When I validate a pattern with duration "invalid" -Then the validation result is invalid with code "INVALID_DURATION_FORMAT" -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-025-returns-invalid-when-duration-is-empty.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-025-returns-invalid-when-duration-is-empty.sdp.md deleted file mode 100644 index fe1ff709..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-025-returns-invalid-when-duration-is-empty.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-duration-is-empty -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns invalid when duration is empty - -## Intent - -- outcome: Executable scenario: Returns invalid when duration is empty - -```gwt -Given the module is imported from platform-core -When I validate a pattern with duration "" -Then the validation result is invalid with code "INVALID_DURATION_FORMAT" -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-026-returns-invalid-when-event-limit-is-non-positive.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-026-returns-invalid-when-event-limit-is-non-positive.sdp.md deleted file mode 100644 index 6fb86647..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-026-returns-invalid-when-event-limit-is-non-positive.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-event-limit-is-non-positive -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns invalid when eventLimit is non-positive - -## Intent - -- outcome: Executable scenario: Returns invalid when eventLimit is non-positive - -```gwt -Given the module is imported from platform-core -When I validate a pattern with eventLimit 0 -Then the validation result is invalid with code "INVALID_EVENT_LIMIT" -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-027-returns-invalid-when-event-limit-is-negative.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-027-returns-invalid-when-event-limit-is-negative.sdp.md deleted file mode 100644 index 2e85c5dc..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-027-returns-invalid-when-event-limit-is-negative.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-event-limit-is-negative -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns invalid when eventLimit is negative - -## Intent - -- outcome: Executable scenario: Returns invalid when eventLimit is negative - -```gwt -Given the module is imported from platform-core -When I validate a pattern with eventLimit -10 -Then the validation result is invalid -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-028-returns-invalid-when-event-limit-is-not-an-integer.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-028-returns-invalid-when-event-limit-is-not-an-integer.sdp.md deleted file mode 100644 index 628f2f0a..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-028-returns-invalid-when-event-limit-is-not-an-integer.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-event-limit-is-not-an-integer -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns invalid when eventLimit is not an integer - -## Intent - -- outcome: Executable scenario: Returns invalid when eventLimit is not an integer - -```gwt -Given the module is imported from platform-core -When I validate a pattern with eventLimit 50.5 -Then the validation result is invalid -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-029-returns-invalid-when-min-events-is-non-positive.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-029-returns-invalid-when-min-events-is-non-positive.sdp.md deleted file mode 100644 index 6e5023ad..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-029-returns-invalid-when-min-events-is-non-positive.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-min-events-is-non-positive -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns invalid when minEvents is non-positive - -## Intent - -- outcome: Executable scenario: Returns invalid when minEvents is non-positive - -```gwt -Given the module is imported from platform-core -When I validate a pattern with minEvents 0 -Then the validation result is invalid with code "INVALID_MIN_EVENTS" -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-030-returns-invalid-when-load-batch-size-is-non-positive.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-030-returns-invalid-when-load-batch-size-is-non-positive.sdp.md deleted file mode 100644 index b8ee13f8..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-030-returns-invalid-when-load-batch-size-is-non-positive.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-invalid-when-load-batch-size-is-non-positive -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns invalid when loadBatchSize is non-positive - -## Intent - -- outcome: Executable scenario: Returns invalid when loadBatchSize is non-positive - -```gwt -Given the module is imported from platform-core -When I validate a pattern with loadBatchSize 0 -Then the validation result is invalid with code "INVALID_LOAD_BATCH_SIZE" -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-031-returns-valid-for-minimal-definition.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-031-returns-valid-for-minimal-definition.sdp.md deleted file mode 100644 index ba3ebd2a..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-031-returns-valid-for-minimal-definition.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-valid-for-minimal-definition -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns valid for minimal definition - -## Intent - -- outcome: Executable scenario: Returns valid for minimal definition - -```gwt -Given the module is imported from platform-core -When I validate a pattern with name "test-pattern" and duration "7d" and a trigger -Then the validation result is valid -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-032-returns-valid-for-complete-definition.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-032-returns-valid-for-complete-definition.sdp.md deleted file mode 100644 index b1e3543b..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-032-returns-valid-for-complete-definition.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-valid-for-complete-definition -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns valid for complete definition - -## Intent - -- outcome: Executable scenario: Returns valid for complete definition - -```gwt -Given the module is imported from platform-core -When I validate a complete test pattern definition -Then the validation result is valid -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-033-returns-valid-for-definition-with-all-window-options.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-033-returns-valid-for-definition-with-all-window-options.sdp.md deleted file mode 100644 index b6131025..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-033-returns-valid-for-definition-with-all-window-options.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-valid-for-definition-with-all-window-options -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns valid for definition with all window options - -## Intent - -- outcome: Executable scenario: Returns valid for definition with all window options - -```gwt -Given the module is imported from platform-core -When I validate a pattern with all window options -Then the validation result is valid -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-034-returns-the-definition-when-valid.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-034-returns-the-definition-when-valid.sdp.md deleted file mode 100644 index f6310eb7..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-034-returns-the-definition-when-valid.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-the-definition-when-valid -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns the definition when valid - -## Intent - -- outcome: Executable scenario: Returns the definition when valid - -```gwt -Given the module is imported from platform-core -When I define a valid test pattern -Then the returned definition is the same object -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-035-throws-error-when-name-is-missing.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-035-throws-error-when-name-is-missing.sdp.md deleted file mode 100644 index 41c1ab44..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-035-throws-error-when-name-is-missing.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.throws-error-when-name-is-missing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Throws error when name is missing - -## Intent - -- outcome: Executable scenario: Throws error when name is missing - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then definePattern with empty name throws "Pattern name is required" -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-036-throws-error-when-trigger-is-missing.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-036-throws-error-when-trigger-is-missing.sdp.md deleted file mode 100644 index d35c61e0..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-036-throws-error-when-trigger-is-missing.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.throws-error-when-trigger-is-missing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Throws error when trigger is missing - -## Intent - -- outcome: Executable scenario: Throws error when trigger is missing - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then definePattern with no trigger throws "Pattern trigger function is required" -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-037-throws-error-when-duration-is-invalid.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-037-throws-error-when-duration-is-invalid.sdp.md deleted file mode 100644 index c6a6cccd..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-037-throws-error-when-duration-is-invalid.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.throws-error-when-duration-is-invalid -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Throws error when duration is invalid - -## Intent - -- outcome: Executable scenario: Throws error when duration is invalid - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then definePattern with duration "invalid" throws "Duration must be in format" -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-038-includes-error-code-in-thrown-error-message.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-038-includes-error-code-in-thrown-error-message.sdp.md deleted file mode 100644 index 695190b3..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-038-includes-error-code-in-thrown-error-message.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.includes-error-code-in-thrown-error-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Includes error code in thrown error message - -## Intent - -- outcome: Executable scenario: Includes error code in thrown error message - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then definePattern with empty name throws "PATTERN_NAME_REQUIRED" -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-039-calculates-boundary-for-days.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-039-calculates-boundary-for-days.sdp.md deleted file mode 100644 index 7557b4e6..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-039-calculates-boundary-for-days.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.calculates-boundary-for-days -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Calculates boundary for days - -## Intent - -- outcome: Executable scenario: Calculates boundary for days - -```gwt -Given the module is imported from platform-core -When I calculate the window boundary for "7d" at timestamp 1000000000 -Then the boundary is 1000000000 minus 7 days in milliseconds -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-040-calculates-boundary-for-hours.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-040-calculates-boundary-for-hours.sdp.md deleted file mode 100644 index ce50470e..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-040-calculates-boundary-for-hours.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.calculates-boundary-for-hours -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Calculates boundary for hours - -## Intent - -- outcome: Executable scenario: Calculates boundary for hours - -```gwt -Given the module is imported from platform-core -When I calculate the window boundary for "24h" at timestamp 1000000000 -Then the boundary is 1000000000 minus 24 hours in milliseconds -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-041-calculates-boundary-for-minutes.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-041-calculates-boundary-for-minutes.sdp.md deleted file mode 100644 index fb747c5f..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-041-calculates-boundary-for-minutes.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.calculates-boundary-for-minutes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Calculates boundary for minutes - -## Intent - -- outcome: Executable scenario: Calculates boundary for minutes - -```gwt -Given the module is imported from platform-core -When I calculate the window boundary for "30m" at timestamp 1000000000 -Then the boundary is 1000000000 minus 30 minutes in milliseconds -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-042-uses-date-now-when-now-is-not-provided.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-042-uses-date-now-when-now-is-not-provided.sdp.md deleted file mode 100644 index 8da338ab..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-042-uses-date-now-when-now-is-not-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.uses-date-now-when-now-is-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Uses Date.now when now is not provided - -## Intent - -- outcome: Executable scenario: Uses Date.now when now is not provided - -```gwt -Given the module is imported from platform-core -When I calculate the window boundary for "7d" without providing now -Then the boundary is approximately Date.now minus 7 days -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-043-throws-error-for-invalid-duration-format.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-043-throws-error-for-invalid-duration-format.sdp.md deleted file mode 100644 index 919ce619..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-043-throws-error-for-invalid-duration-format.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.throws-error-for-invalid-duration-format -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Throws error for invalid duration format - -## Intent - -- outcome: Executable scenario: Throws error for invalid duration format - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then calculateWindowBoundary with duration "invalid" throws "Invalid duration format" -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-044-includes-events-within-the-window.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-044-includes-events-within-the-window.sdp.md deleted file mode 100644 index 23f11bfd..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-044-includes-events-within-the-window.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.includes-events-within-the-window -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Includes events within the window - -## Intent - -- outcome: Executable scenario: Includes events within the window - -```gwt -Given the module is imported from platform-core -And events at offsets 100 and 200 from the 1h boundary at timestamp 1000000000 -When I filter events in a 1h window at timestamp 1000000000 -Then 2 events are returned -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-045-excludes-events-outside-the-window.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-045-excludes-events-outside-the-window.sdp.md deleted file mode 100644 index 2d6fa6a1..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-045-excludes-events-outside-the-window.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.excludes-events-outside-the-window -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Excludes events outside the window - -## Intent - -- outcome: Executable scenario: Excludes events outside the window - -```gwt -Given the module is imported from platform-core -And events at offsets -100 and 100 from the 1h boundary at timestamp 1000000000 -When I filter events in a 1h window at timestamp 1000000000 -Then 1 event is returned with eventId "evt2" -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-046-includes-events-exactly-at-the-boundary.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-046-includes-events-exactly-at-the-boundary.sdp.md deleted file mode 100644 index dc9c9343..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-046-includes-events-exactly-at-the-boundary.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.includes-events-exactly-at-the-boundary -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Includes events exactly at the boundary - -## Intent - -- outcome: Executable scenario: Includes events exactly at the boundary - -```gwt -Given the module is imported from platform-core -And an event exactly at the 1h boundary at timestamp 1000000000 -When I filter events in a 1h window at timestamp 1000000000 -Then 1 event is returned -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-047-applies-event-limit-and-takes-most-recent.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-047-applies-event-limit-and-takes-most-recent.sdp.md deleted file mode 100644 index 6c2ab21b..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-047-applies-event-limit-and-takes-most-recent.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.applies-event-limit-and-takes-most-recent -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Applies event limit and takes most recent - -## Intent - -- outcome: Executable scenario: Applies event limit and takes most recent - -```gwt -Given the module is imported from platform-core -And 3 events at offsets 100 200 300 from the 1h boundary at timestamp 1000000000 -When I filter events in a 1h window with eventLimit 2 at timestamp 1000000000 -Then 2 events are returned containing eventIds "evt2" and "evt3" -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-048-does-not-limit-when-under-event-limit.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-048-does-not-limit-when-under-event-limit.sdp.md deleted file mode 100644 index 332867f2..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-048-does-not-limit-when-under-event-limit.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.does-not-limit-when-under-event-limit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Does not limit when under event limit - -## Intent - -- outcome: Executable scenario: Does not limit when under event limit - -```gwt -Given the module is imported from platform-core -And events at offsets 100 and 200 from the 1h boundary at timestamp 1000000000 -When I filter events in a 1h window with eventLimit 10 at timestamp 1000000000 -Then 2 events are returned -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-049-returns-empty-array-when-no-events-match.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-049-returns-empty-array-when-no-events-match.sdp.md deleted file mode 100644 index 829f08e8..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-049-returns-empty-array-when-no-events-match.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-empty-array-when-no-events-match -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns empty array when no events match - -## Intent - -- outcome: Executable scenario: Returns empty array when no events match - -```gwt -Given the module is imported from platform-core -And events at offsets -1000 and -2000 from the 1h boundary at timestamp 1000000000 -When I filter events in a 1h window at timestamp 1000000000 -Then 0 events are returned -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-050-handles-empty-events-array.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-050-handles-empty-events-array.sdp.md deleted file mode 100644 index eface5d8..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-050-handles-empty-events-array.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.handles-empty-events-array -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Handles empty events array - -## Intent - -- outcome: Executable scenario: Handles empty events array - -```gwt -Given the module is imported from platform-core -When I filter an empty array in a 1h window at timestamp 1000000000 -Then 0 events are returned -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-051-returns-true-when-events-count-meets-min-events.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-051-returns-true-when-events-count-meets-min-events.sdp.md deleted file mode 100644 index 0640a558..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-051-returns-true-when-events-count-meets-min-events.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-true-when-events-count-meets-min-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns true when events count meets minEvents - -## Intent - -- outcome: Executable scenario: Returns true when events count meets minEvents - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then hasMinimumEvents with 3 events and minEvents 3 is true -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-052-returns-true-when-events-count-exceeds-min-events.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-052-returns-true-when-events-count-exceeds-min-events.sdp.md deleted file mode 100644 index f2648a9b..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-052-returns-true-when-events-count-exceeds-min-events.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-true-when-events-count-exceeds-min-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns true when events count exceeds minEvents - -## Intent - -- outcome: Executable scenario: Returns true when events count exceeds minEvents - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then hasMinimumEvents with 3 events and minEvents 2 is true -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-053-returns-false-when-events-count-is-below-min-events.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-053-returns-false-when-events-count-is-below-min-events.sdp.md deleted file mode 100644 index 8c8b103e..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-053-returns-false-when-events-count-is-below-min-events.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-false-when-events-count-is-below-min-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns false when events count is below minEvents - -## Intent - -- outcome: Executable scenario: Returns false when events count is below minEvents - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then hasMinimumEvents with 2 events and minEvents 5 is false -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-054-defaults-to-min-events-of-1.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-054-defaults-to-min-events-of-1.sdp.md deleted file mode 100644 index 49efff32..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-054-defaults-to-min-events-of-1.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.defaults-to-min-events-of-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Defaults to minEvents of 1 - -## Intent - -- outcome: Executable scenario: Defaults to minEvents of 1 - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then hasMinimumEvents with 1 event and no minEvents is true -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-055-returns-false-for-empty-events-when-min-events-is-default.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-055-returns-false-for-empty-events-when-min-events-is-default.sdp.md deleted file mode 100644 index c882fab5..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-055-returns-false-for-empty-events-when-min-events-is-default.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-false-for-empty-events-when-min-events-is-default -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns false for empty events when minEvents is default - -## Intent - -- outcome: Executable scenario: Returns false for empty events when minEvents is default - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then hasMinimumEvents with 0 events and no minEvents is false -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-056-returns-true-when-event-count-meets-threshold.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-056-returns-true-when-event-count-meets-threshold.sdp.md deleted file mode 100644 index eeeb2f2e..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-056-returns-true-when-event-count-meets-threshold.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-true-when-event-count-meets-threshold -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns true when event count meets threshold - -## Intent - -- outcome: Executable scenario: Returns true when event count meets threshold - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then countThreshold 3 with 3 events returns true -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-057-returns-true-when-event-count-exceeds-threshold.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-057-returns-true-when-event-count-exceeds-threshold.sdp.md deleted file mode 100644 index 04869bf6..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-057-returns-true-when-event-count-exceeds-threshold.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-true-when-event-count-exceeds-threshold -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns true when event count exceeds threshold - -## Intent - -- outcome: Executable scenario: Returns true when event count exceeds threshold - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then countThreshold 2 with 3 events returns true -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-058-returns-false-when-event-count-is-below-threshold.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-058-returns-false-when-event-count-is-below-threshold.sdp.md deleted file mode 100644 index 67f47308..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-058-returns-false-when-event-count-is-below-threshold.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-false-when-event-count-is-below-threshold -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns false when event count is below threshold - -## Intent - -- outcome: Executable scenario: Returns false when event count is below threshold - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then countThreshold 5 with 2 events returns false -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-059-returns-true-when-event-type-is-present.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-059-returns-true-when-event-type-is-present.sdp.md deleted file mode 100644 index 231a1a04..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-059-returns-true-when-event-type-is-present.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-true-when-event-type-is-present -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns true when event type is present - -## Intent - -- outcome: Executable scenario: Returns true when event type is present - -```gwt -Given the module is imported from platform-core -And events with types "OrderCreated" and "OrderCancelled" -When I check eventTypePresent for "OrderCancelled" -Then the trigger returns true -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-060-returns-false-when-event-type-is-not-present.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-060-returns-false-when-event-type-is-not-present.sdp.md deleted file mode 100644 index bbf69e16..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-060-returns-false-when-event-type-is-not-present.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-false-when-event-type-is-not-present -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns false when event type is not present - -## Intent - -- outcome: Executable scenario: Returns false when event type is not present - -```gwt -Given the module is imported from platform-core -And events with types "OrderCreated" and "OrderShipped" -When I check eventTypePresent for "OrderCancelled" -Then the trigger returns false -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-061-returns-true-when-any-of-multiple-event-types-is-present.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-061-returns-true-when-any-of-multiple-event-types-is-present.sdp.md deleted file mode 100644 index 4f91d854..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-061-returns-true-when-any-of-multiple-event-types-is-present.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-true-when-any-of-multiple-event-types-is-present -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns true when any of multiple event types is present - -## Intent - -- outcome: Executable scenario: Returns true when any of multiple event types is present - -```gwt -Given the module is imported from platform-core -And events with types "OrderRefunded" -When I check eventTypePresent for "OrderCancelled" or "OrderRefunded" -Then the trigger returns true -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-062-respects-min-count-parameter.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-062-respects-min-count-parameter.sdp.md deleted file mode 100644 index 2d72cd77..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-062-respects-min-count-parameter.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.respects-min-count-parameter -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Respects minCount parameter - -## Intent - -- outcome: Executable scenario: Respects minCount parameter - -```gwt -Given the module is imported from platform-core -And 2 events of type "OrderCancelled" -When I check eventTypePresent for "OrderCancelled" with minCount 3 -Then the trigger returns false -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-063-returns-true-when-min-count-is-met.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-063-returns-true-when-min-count-is-met.sdp.md deleted file mode 100644 index f86c9191..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-063-returns-true-when-min-count-is-met.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-true-when-min-count-is-met -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns true when minCount is met - -## Intent - -- outcome: Executable scenario: Returns true when minCount is met - -```gwt -Given the module is imported from platform-core -And 3 events of type "OrderCancelled" -When I check eventTypePresent for "OrderCancelled" with minCount 3 -Then the trigger returns true -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-064-returns-true-when-minimum-streams-are-present.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-064-returns-true-when-minimum-streams-are-present.sdp.md deleted file mode 100644 index 54af139d..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-064-returns-true-when-minimum-streams-are-present.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-true-when-minimum-streams-are-present -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns true when minimum streams are present - -## Intent - -- outcome: Executable scenario: Returns true when minimum streams are present - -```gwt -Given the module is imported from platform-core -And events from streams "stream-1" and "stream-2" -When I check multiStreamPresent with minimum 2 -Then the trigger returns true -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-065-returns-false-when-below-minimum-streams.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-065-returns-false-when-below-minimum-streams.sdp.md deleted file mode 100644 index 8c68e962..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-065-returns-false-when-below-minimum-streams.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-false-when-below-minimum-streams -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns false when below minimum streams - -## Intent - -- outcome: Executable scenario: Returns false when below minimum streams - -```gwt -Given the module is imported from platform-core -And events from streams "stream-1" and "stream-2" -When I check multiStreamPresent with minimum 3 -Then the trigger returns false -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-066-counts-unique-streams-correctly.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-066-counts-unique-streams-correctly.sdp.md deleted file mode 100644 index e974e0f6..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-066-counts-unique-streams-correctly.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.counts-unique-streams-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Counts unique streams correctly - -## Intent - -- outcome: Executable scenario: Counts unique streams correctly - -```gwt -Given the module is imported from platform-core -And 3 events all from stream "stream-1" -When I check multiStreamPresent with minimum 2 -Then the trigger returns false -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-067-returns-true-when-all-triggers-match.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-067-returns-true-when-all-triggers-match.sdp.md deleted file mode 100644 index c4dccc86..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-067-returns-true-when-all-triggers-match.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-true-when-all-triggers-match -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns true when ALL triggers match - -## Intent - -- outcome: Executable scenario: Returns true when ALL triggers match - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then all() with two true triggers returns true -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-068-returns-false-when-any-trigger-does-not-match.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-068-returns-false-when-any-trigger-does-not-match.sdp.md deleted file mode 100644 index 6c9b3a1f..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-068-returns-false-when-any-trigger-does-not-match.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-false-when-any-trigger-does-not-match -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns false when ANY trigger does not match - -## Intent - -- outcome: Executable scenario: Returns false when ANY trigger does not match - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then all() with one true and one false trigger returns false -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-069-returns-false-when-no-triggers-match.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-069-returns-false-when-no-triggers-match.sdp.md deleted file mode 100644 index b46cb663..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-069-returns-false-when-no-triggers-match.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-false-when-no-triggers-match -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns false when NO triggers match - -## Intent - -- outcome: Executable scenario: Returns false when NO triggers match - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then all() with two false triggers returns false -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-070-returns-true-for-empty-triggers-array.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-070-returns-true-for-empty-triggers-array.sdp.md deleted file mode 100644 index 88a53dd0..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-070-returns-true-for-empty-triggers-array.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-true-for-empty-triggers-array -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns true for empty triggers array - -## Intent - -- outcome: Executable scenario: Returns true for empty triggers array - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then all() with no triggers returns true -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-071-passes-events-to-each-trigger.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-071-passes-events-to-each-trigger.sdp.md deleted file mode 100644 index a6124cad..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-071-passes-events-to-each-trigger.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.passes-events-to-each-trigger -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Passes events to each trigger - -## Intent - -- outcome: Executable scenario: Passes events to each trigger - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then all() passes the events array to each trigger -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-072-returns-true-when-any-trigger-matches.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-072-returns-true-when-any-trigger-matches.sdp.md deleted file mode 100644 index 91825f02..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-072-returns-true-when-any-trigger-matches.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-true-when-any-trigger-matches -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns true when ANY trigger matches - -## Intent - -- outcome: Executable scenario: Returns true when ANY trigger matches - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then any() with one false and one true trigger returns true -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-073-returns-true-when-all-triggers-match.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-073-returns-true-when-all-triggers-match.sdp.md deleted file mode 100644 index 97e48b3e..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-073-returns-true-when-all-triggers-match.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-true-when-all-triggers-match-2 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns true when ALL triggers match - -## Intent - -- outcome: Executable scenario: Returns true when ALL triggers match - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then any() with two true triggers returns true -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-074-returns-false-when-no-triggers-match.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-074-returns-false-when-no-triggers-match.sdp.md deleted file mode 100644 index e2a2c6a9..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-074-returns-false-when-no-triggers-match.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-false-when-no-triggers-match-2 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns false when NO triggers match - -## Intent - -- outcome: Executable scenario: Returns false when NO triggers match - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then any() with two false triggers returns false -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-075-returns-false-for-empty-triggers-array.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-075-returns-false-for-empty-triggers-array.sdp.md deleted file mode 100644 index 1c6eda92..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-075-returns-false-for-empty-triggers-array.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.returns-false-for-empty-triggers-array -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Returns false for empty triggers array - -## Intent - -- outcome: Executable scenario: Returns false for empty triggers array - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then any() with no triggers returns false -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-076-short-circuits-on-first-match.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-076-short-circuits-on-first-match.sdp.md deleted file mode 100644 index d0a5cf4d..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-076-short-circuits-on-first-match.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.short-circuits-on-first-match -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Short-circuits on first match - -## Intent - -- outcome: Executable scenario: Short-circuits on first match - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then any() calls the first trigger -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-077-combines-count-threshold-with-event-type-using-all.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-077-combines-count-threshold-with-event-type-using-all.sdp.md deleted file mode 100644 index 165cc216..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-077-combines-count-threshold-with-event-type-using-all.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.combines-count-threshold-with-event-type-using-all -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Combines count threshold with event type using all - -## Intent - -- outcome: Executable scenario: Combines count threshold with event type using all - -```gwt -Given the module is imported from platform-core -And 3 events where one is "OrderCancelled" -When I check all(countThreshold 3, eventTypePresent "OrderCancelled") -Then the trigger returns true -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-078-fails-all-when-event-type-missing-despite-count-met.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-078-fails-all-when-event-type-missing-despite-count-met.sdp.md deleted file mode 100644 index d1f1e166..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-078-fails-all-when-event-type-missing-despite-count-met.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.fails-all-when-event-type-missing-despite-count-met -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Fails all when event type missing despite count met - -## Intent - -- outcome: Executable scenario: Fails all when event type missing despite count met - -```gwt -Given the module is imported from platform-core -And 3 events with no "OrderCancelled" -When I check all(countThreshold 3, eventTypePresent "OrderCancelled") -Then the trigger returns false -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-079-combines-any-with-count-thresholds-alert-present.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-079-combines-any-with-count-thresholds-alert-present.sdp.md deleted file mode 100644 index 887c9c98..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-079-combines-any-with-count-thresholds-alert-present.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.combines-any-with-count-thresholds-alert-present -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Combines any with count thresholds - alert present - -## Intent - -- outcome: Executable scenario: Combines any with count thresholds - alert present - -```gwt -Given the module is imported from platform-core -And 5 events where first is "HighPriorityAlert" -When I check any(countThreshold 10, eventTypePresent "HighPriorityAlert") -Then the trigger returns true -``` diff --git a/specs/behavior/platform-core/agent/patterns.examples/s-080-combines-any-with-count-thresholds-neither-condition-met.sdp.md b/specs/behavior/platform-core/agent/patterns.examples/s-080-combines-any-with-count-thresholds-neither-condition-met.sdp.md deleted file mode 100644 index 7757c850..00000000 --- a/specs/behavior/platform-core/agent/patterns.examples/s-080-combines-any-with-count-thresholds-neither-condition-met.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.patterns.combines-any-with-count-thresholds-neither-condition-met -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.patterns ---- -# Combines any with count thresholds - neither condition met - -## Intent - -- outcome: Executable scenario: Combines any with count thresholds - neither condition met - -```gwt -Given the module is imported from platform-core -And 5 regular events -When I check any(countThreshold 10, eventTypePresent "HighPriorityAlert") -Then the trigger returns false -``` diff --git a/specs/behavior/platform-core/agent/patterns.sdp.md b/specs/behavior/platform-core/agent/patterns.sdp.md index acd04b18..26ce1ef0 100644 --- a/specs/behavior/platform-core/agent/patterns.sdp.md +++ b/specs/behavior/platform-core/agent/patterns.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.patterns kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: Pattern Detection Framework +- outcome: Define, validate, and evaluate agent pattern windows and composable triggers as pure functions. +- value: Agents can detect patterns across event streams against a time and event window. ## Behavior diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-001-all-expected-error-codes-are-present-with-correct-values.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-001-all-expected-error-codes-are-present-with-correct-values.sdp.md deleted file mode 100644 index 6cd1cdfe..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-001-all-expected-error-codes-are-present-with-correct-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.all-expected-error-codes-are-present-with-correct-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# All expected error codes are present with correct values - -## Intent - -- outcome: Executable scenario: All expected error codes are present with correct values - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then RATE_LIMIT_ERROR_CODES contains all of: -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-002-error-codes-object-has-exactly-8-entries.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-002-error-codes-object-has-exactly-8-entries.sdp.md deleted file mode 100644 index d229cce1..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-002-error-codes-object-has-exactly-8-entries.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.error-codes-object-has-exactly-8-entries -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Error codes object has exactly 8 entries - -## Intent - -- outcome: Executable scenario: Error codes object has exactly 8 entries - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then RATE_LIMIT_ERROR_CODES has 8 entries -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-003-accepts-valid-cost-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-003-accepts-valid-cost-budget.sdp.md deleted file mode 100644 index df2043e9..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-003-accepts-valid-cost-budget.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.accepts-valid-cost-budget -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Accepts valid cost budget - -## Intent - -- outcome: Executable scenario: Accepts valid cost budget - -```gwt -Given the module is imported from platform-core -When I parse a cost budget with daily 10 and alertThreshold 0.8 -Then the schema parse succeeds -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-004-rejects-budget-with-zero-daily.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-004-rejects-budget-with-zero-daily.sdp.md deleted file mode 100644 index 500b7993..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-004-rejects-budget-with-zero-daily.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.rejects-budget-with-zero-daily -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Rejects budget with zero daily - -## Intent - -- outcome: Executable scenario: Rejects budget with zero daily - -```gwt -Given the module is imported from platform-core -When I parse a cost budget with daily 0 and alertThreshold 0.8 -Then the schema parse fails -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-005-rejects-budget-with-negative-daily.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-005-rejects-budget-with-negative-daily.sdp.md deleted file mode 100644 index 76f2e5e6..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-005-rejects-budget-with-negative-daily.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.rejects-budget-with-negative-daily -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Rejects budget with negative daily - -## Intent - -- outcome: Executable scenario: Rejects budget with negative daily - -```gwt -Given the module is imported from platform-core -When I parse a cost budget with daily -10 and alertThreshold 0.8 -Then the schema parse fails -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-006-rejects-budget-with-alert-threshold-above-1.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-006-rejects-budget-with-alert-threshold-above-1.sdp.md deleted file mode 100644 index e272c7a3..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-006-rejects-budget-with-alert-threshold-above-1.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.rejects-budget-with-alert-threshold-above-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Rejects budget with alertThreshold above 1 - -## Intent - -- outcome: Executable scenario: Rejects budget with alertThreshold above 1 - -```gwt -Given the module is imported from platform-core -When I parse a cost budget with daily 10 and alertThreshold 1.5 -Then the schema parse fails -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-007-rejects-budget-with-negative-alert-threshold.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-007-rejects-budget-with-negative-alert-threshold.sdp.md deleted file mode 100644 index 5020b0a0..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-007-rejects-budget-with-negative-alert-threshold.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.rejects-budget-with-negative-alert-threshold -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Rejects budget with negative alertThreshold - -## Intent - -- outcome: Executable scenario: Rejects budget with negative alertThreshold - -```gwt -Given the module is imported from platform-core -When I parse a cost budget with daily 10 and alertThreshold -0.1 -Then the schema parse fails -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-008-accepts-alert-threshold-at-boundary-0.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-008-accepts-alert-threshold-at-boundary-0.sdp.md deleted file mode 100644 index 30770a4f..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-008-accepts-alert-threshold-at-boundary-0.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.accepts-alert-threshold-at-boundary-0 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Accepts alertThreshold at boundary 0 - -## Intent - -- outcome: Executable scenario: Accepts alertThreshold at boundary 0 - -```gwt -Given the module is imported from platform-core -When I parse a cost budget with daily 10 and alertThreshold 0 -Then the schema parse succeeds -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-009-accepts-alert-threshold-at-boundary-1.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-009-accepts-alert-threshold-at-boundary-1.sdp.md deleted file mode 100644 index eaa07991..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-009-accepts-alert-threshold-at-boundary-1.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.accepts-alert-threshold-at-boundary-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Accepts alertThreshold at boundary 1 - -## Intent - -- outcome: Executable scenario: Accepts alertThreshold at boundary 1 - -```gwt -Given the module is imported from platform-core -When I parse a cost budget with daily 10 and alertThreshold 1 -Then the schema parse succeeds -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-010-accepts-valid-config-with-required-fields-only.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-010-accepts-valid-config-with-required-fields-only.sdp.md deleted file mode 100644 index 7f98c6f9..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-010-accepts-valid-config-with-required-fields-only.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.accepts-valid-config-with-required-fields-only -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Accepts valid config with required fields only - -## Intent - -- outcome: Executable scenario: Accepts valid config with required fields only - -```gwt -Given the module is imported from platform-core -When I parse a rate limit config with maxRequestsPerMinute 60 -Then the schema parse succeeds -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-011-accepts-config-with-all-optional-fields.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-011-accepts-config-with-all-optional-fields.sdp.md deleted file mode 100644 index 188ef33a..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-011-accepts-config-with-all-optional-fields.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.accepts-config-with-all-optional-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Accepts config with all optional fields - -## Intent - -- outcome: Executable scenario: Accepts config with all optional fields - -```gwt -Given the module is imported from platform-core -When I parse a full rate limit config with maxRequestsPerMinute 60 and maxConcurrent 5 and queueDepth 100 and budget -Then the schema parse succeeds -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-012-rejects-config-with-zero-max-requests-per-minute.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-012-rejects-config-with-zero-max-requests-per-minute.sdp.md deleted file mode 100644 index 0ee43378..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-012-rejects-config-with-zero-max-requests-per-minute.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.rejects-config-with-zero-max-requests-per-minute -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Rejects config with zero maxRequestsPerMinute - -## Intent - -- outcome: Executable scenario: Rejects config with zero maxRequestsPerMinute - -```gwt -Given the module is imported from platform-core -When I parse a rate limit config with maxRequestsPerMinute 0 -Then the schema parse fails -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-013-rejects-config-with-negative-max-requests-per-minute.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-013-rejects-config-with-negative-max-requests-per-minute.sdp.md deleted file mode 100644 index e25f009b..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-013-rejects-config-with-negative-max-requests-per-minute.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.rejects-config-with-negative-max-requests-per-minute -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Rejects config with negative maxRequestsPerMinute - -## Intent - -- outcome: Executable scenario: Rejects config with negative maxRequestsPerMinute - -```gwt -Given the module is imported from platform-core -When I parse a rate limit config with maxRequestsPerMinute -10 -Then the schema parse fails -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-014-rejects-config-with-non-integer-max-requests-per-minute.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-014-rejects-config-with-non-integer-max-requests-per-minute.sdp.md deleted file mode 100644 index 33027490..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-014-rejects-config-with-non-integer-max-requests-per-minute.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.rejects-config-with-non-integer-max-requests-per-minute -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Rejects config with non-integer maxRequestsPerMinute - -## Intent - -- outcome: Executable scenario: Rejects config with non-integer maxRequestsPerMinute - -```gwt -Given the module is imported from platform-core -When I parse a rate limit config with maxRequestsPerMinute 60.5 -Then the schema parse fails -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-015-rejects-config-with-zero-max-concurrent.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-015-rejects-config-with-zero-max-concurrent.sdp.md deleted file mode 100644 index a73297d7..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-015-rejects-config-with-zero-max-concurrent.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.rejects-config-with-zero-max-concurrent -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Rejects config with zero maxConcurrent - -## Intent - -- outcome: Executable scenario: Rejects config with zero maxConcurrent - -```gwt -Given the module is imported from platform-core -When I parse a rate limit config with maxRequestsPerMinute 60 and maxConcurrent 0 -Then the schema parse fails -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-016-rejects-config-with-zero-queue-depth.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-016-rejects-config-with-zero-queue-depth.sdp.md deleted file mode 100644 index bd57c1f0..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-016-rejects-config-with-zero-queue-depth.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.rejects-config-with-zero-queue-depth -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Rejects config with zero queueDepth - -## Intent - -- outcome: Executable scenario: Rejects config with zero queueDepth - -```gwt -Given the module is imported from platform-core -When I parse a rate limit config with maxRequestsPerMinute 60 and queueDepth 0 -Then the schema parse fails -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-017-returns-invalid-when-max-requests-per-minute-is-undefined.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-017-returns-invalid-when-max-requests-per-minute-is-undefined.sdp.md deleted file mode 100644 index bde016b9..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-017-returns-invalid-when-max-requests-per-minute-is-undefined.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-max-requests-per-minute-is-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns invalid when maxRequestsPerMinute is undefined - -## Intent - -- outcome: Executable scenario: Returns invalid when maxRequestsPerMinute is undefined - -```gwt -Given the module is imported from platform-core -When I validate a rate limit config with no maxRequestsPerMinute -Then the validation result is invalid -And the validation error code is "INVALID_RATE_LIMIT_CONFIG" -And the validation error message contains "maxRequestsPerMinute" -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-018-returns-invalid-when-max-requests-per-minute-is-zero.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-018-returns-invalid-when-max-requests-per-minute-is-zero.sdp.md deleted file mode 100644 index bd2eb568..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-018-returns-invalid-when-max-requests-per-minute-is-zero.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-max-requests-per-minute-is-zero -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns invalid when maxRequestsPerMinute is zero - -## Intent - -- outcome: Executable scenario: Returns invalid when maxRequestsPerMinute is zero - -```gwt -Given the module is imported from platform-core -When I validate a rate limit config with maxRequestsPerMinute 0 -Then the validation result is invalid -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-019-returns-invalid-when-max-requests-per-minute-is-negative.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-019-returns-invalid-when-max-requests-per-minute-is-negative.sdp.md deleted file mode 100644 index 55a1a359..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-019-returns-invalid-when-max-requests-per-minute-is-negative.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-max-requests-per-minute-is-negative -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns invalid when maxRequestsPerMinute is negative - -## Intent - -- outcome: Executable scenario: Returns invalid when maxRequestsPerMinute is negative - -```gwt -Given the module is imported from platform-core -When I validate a rate limit config with maxRequestsPerMinute -10 -Then the validation result is invalid -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-020-returns-invalid-when-max-requests-per-minute-is-not-an-integer.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-020-returns-invalid-when-max-requests-per-minute-is-not-an-integer.sdp.md deleted file mode 100644 index 9fbf1e49..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-020-returns-invalid-when-max-requests-per-minute-is-not-an-integer.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-max-requests-per-minute-is-not-an-integer -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns invalid when maxRequestsPerMinute is not an integer - -## Intent - -- outcome: Executable scenario: Returns invalid when maxRequestsPerMinute is not an integer - -```gwt -Given the module is imported from platform-core -When I validate a rate limit config with maxRequestsPerMinute 60.5 -Then the validation result is invalid -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-021-returns-valid-for-positive-integer-max-requests-per-minute.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-021-returns-valid-for-positive-integer-max-requests-per-minute.sdp.md deleted file mode 100644 index fa02df12..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-021-returns-valid-for-positive-integer-max-requests-per-minute.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-valid-for-positive-integer-max-requests-per-minute -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns valid for positive integer maxRequestsPerMinute - -## Intent - -- outcome: Executable scenario: Returns valid for positive integer maxRequestsPerMinute - -```gwt -Given the module is imported from platform-core -When I validate a rate limit config with maxRequestsPerMinute 60 -Then the validation result is valid -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-022-returns-invalid-when-max-concurrent-is-zero.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-022-returns-invalid-when-max-concurrent-is-zero.sdp.md deleted file mode 100644 index 67ffe41b..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-022-returns-invalid-when-max-concurrent-is-zero.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-max-concurrent-is-zero -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns invalid when maxConcurrent is zero - -## Intent - -- outcome: Executable scenario: Returns invalid when maxConcurrent is zero - -```gwt -Given the module is imported from platform-core -When I validate a rate limit config with maxRequestsPerMinute 60 and maxConcurrent 0 -Then the validation result is invalid -And the validation error message contains "maxConcurrent" -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-023-returns-invalid-when-max-concurrent-is-negative.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-023-returns-invalid-when-max-concurrent-is-negative.sdp.md deleted file mode 100644 index 01da95a4..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-023-returns-invalid-when-max-concurrent-is-negative.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-max-concurrent-is-negative -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns invalid when maxConcurrent is negative - -## Intent - -- outcome: Executable scenario: Returns invalid when maxConcurrent is negative - -```gwt -Given the module is imported from platform-core -When I validate a rate limit config with maxRequestsPerMinute 60 and maxConcurrent -5 -Then the validation result is invalid -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-024-returns-invalid-when-max-concurrent-is-not-an-integer.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-024-returns-invalid-when-max-concurrent-is-not-an-integer.sdp.md deleted file mode 100644 index 28f5bcc5..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-024-returns-invalid-when-max-concurrent-is-not-an-integer.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-max-concurrent-is-not-an-integer -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns invalid when maxConcurrent is not an integer - -## Intent - -- outcome: Executable scenario: Returns invalid when maxConcurrent is not an integer - -```gwt -Given the module is imported from platform-core -When I validate a rate limit config with maxRequestsPerMinute 60 and maxConcurrent 5.5 -Then the validation result is invalid -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-025-returns-valid-when-max-concurrent-is-undefined.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-025-returns-valid-when-max-concurrent-is-undefined.sdp.md deleted file mode 100644 index f6cc07bd..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-025-returns-valid-when-max-concurrent-is-undefined.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-valid-when-max-concurrent-is-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns valid when maxConcurrent is undefined - -## Intent - -- outcome: Executable scenario: Returns valid when maxConcurrent is undefined - -```gwt -Given the module is imported from platform-core -When I validate a rate limit config with maxRequestsPerMinute 60 -Then the validation result is valid -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-026-returns-invalid-when-queue-depth-is-zero.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-026-returns-invalid-when-queue-depth-is-zero.sdp.md deleted file mode 100644 index b4b53d69..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-026-returns-invalid-when-queue-depth-is-zero.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-queue-depth-is-zero -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns invalid when queueDepth is zero - -## Intent - -- outcome: Executable scenario: Returns invalid when queueDepth is zero - -```gwt -Given the module is imported from platform-core -When I validate a rate limit config with maxRequestsPerMinute 60 and queueDepth 0 -Then the validation result is invalid -And the validation error message contains "queueDepth" -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-027-returns-invalid-when-queue-depth-is-negative.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-027-returns-invalid-when-queue-depth-is-negative.sdp.md deleted file mode 100644 index d272e647..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-027-returns-invalid-when-queue-depth-is-negative.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-queue-depth-is-negative -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns invalid when queueDepth is negative - -## Intent - -- outcome: Executable scenario: Returns invalid when queueDepth is negative - -```gwt -Given the module is imported from platform-core -When I validate a rate limit config with maxRequestsPerMinute 60 and queueDepth -100 -Then the validation result is invalid -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-028-returns-invalid-when-queue-depth-is-not-an-integer.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-028-returns-invalid-when-queue-depth-is-not-an-integer.sdp.md deleted file mode 100644 index c89efc46..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-028-returns-invalid-when-queue-depth-is-not-an-integer.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-queue-depth-is-not-an-integer -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns invalid when queueDepth is not an integer - -## Intent - -- outcome: Executable scenario: Returns invalid when queueDepth is not an integer - -```gwt -Given the module is imported from platform-core -When I validate a rate limit config with maxRequestsPerMinute 60 and queueDepth 100.5 -Then the validation result is invalid -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-029-returns-invalid-when-cost-budget-daily-is-zero.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-029-returns-invalid-when-cost-budget-daily-is-zero.sdp.md deleted file mode 100644 index 72a6943d..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-029-returns-invalid-when-cost-budget-daily-is-zero.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-cost-budget-daily-is-zero -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns invalid when costBudget daily is zero - -## Intent - -- outcome: Executable scenario: Returns invalid when costBudget daily is zero - -```gwt -Given the module is imported from platform-core -When I validate a rate limit config with maxRequestsPerMinute 60 and costBudget daily 0 alertThreshold 0.8 -Then the validation result is invalid -And the validation error message contains "daily" -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-030-returns-invalid-when-cost-budget-daily-is-negative.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-030-returns-invalid-when-cost-budget-daily-is-negative.sdp.md deleted file mode 100644 index b50aaa3e..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-030-returns-invalid-when-cost-budget-daily-is-negative.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-cost-budget-daily-is-negative -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns invalid when costBudget daily is negative - -## Intent - -- outcome: Executable scenario: Returns invalid when costBudget daily is negative - -```gwt -Given the module is imported from platform-core -When I validate a rate limit config with maxRequestsPerMinute 60 and costBudget daily -10 alertThreshold 0.8 -Then the validation result is invalid -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-031-returns-invalid-when-cost-budget-alert-threshold-is-below-0.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-031-returns-invalid-when-cost-budget-alert-threshold-is-below-0.sdp.md deleted file mode 100644 index 60e276a6..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-031-returns-invalid-when-cost-budget-alert-threshold-is-below-0.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-cost-budget-alert-threshold-is-below-0 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns invalid when costBudget alertThreshold is below 0 - -## Intent - -- outcome: Executable scenario: Returns invalid when costBudget alertThreshold is below 0 - -```gwt -Given the module is imported from platform-core -When I validate a rate limit config with maxRequestsPerMinute 60 and costBudget daily 10 alertThreshold -0.1 -Then the validation result is invalid -And the validation error message contains "alertThreshold" -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-032-returns-invalid-when-cost-budget-alert-threshold-is-above-1.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-032-returns-invalid-when-cost-budget-alert-threshold-is-above-1.sdp.md deleted file mode 100644 index f2daa28f..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-032-returns-invalid-when-cost-budget-alert-threshold-is-above-1.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-invalid-when-cost-budget-alert-threshold-is-above-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns invalid when costBudget alertThreshold is above 1 - -## Intent - -- outcome: Executable scenario: Returns invalid when costBudget alertThreshold is above 1 - -```gwt -Given the module is imported from platform-core -When I validate a rate limit config with maxRequestsPerMinute 60 and costBudget daily 10 alertThreshold 1.5 -Then the validation result is invalid -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-033-returns-valid-when-cost-budget-is-valid.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-033-returns-valid-when-cost-budget-is-valid.sdp.md deleted file mode 100644 index b0674b83..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-033-returns-valid-when-cost-budget-is-valid.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-valid-when-cost-budget-is-valid -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns valid when costBudget is valid - -## Intent - -- outcome: Executable scenario: Returns valid when costBudget is valid - -```gwt -Given the module is imported from platform-core -When I validate a rate limit config with maxRequestsPerMinute 60 and costBudget daily 10 alertThreshold 0.8 -Then the validation result is valid -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-034-returns-valid-for-complete-valid-config.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-034-returns-valid-for-complete-valid-config.sdp.md deleted file mode 100644 index 5c2bb1d4..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-034-returns-valid-for-complete-valid-config.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-valid-for-complete-valid-config -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns valid for complete valid config - -## Intent - -- outcome: Executable scenario: Returns valid for complete valid config - -```gwt -Given the module is imported from platform-core -When I validate a complete rate limit config -Then the validation result is valid -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-035-default-config-has-correct-field-values.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-035-default-config-has-correct-field-values.sdp.md deleted file mode 100644 index eb7f55f2..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-035-default-config-has-correct-field-values.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.default-config-has-correct-field-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Default config has correct field values - -## Intent - -- outcome: Executable scenario: Default config has correct field values - -```gwt -Given the module is imported from platform-core -When I create a default rate limit config -Then the config maxRequestsPerMinute matches the default -And the config maxConcurrent matches the default -And the config queueDepth matches the default -And the config has no costBudget -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-036-default-config-passes-validation.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-036-default-config-passes-validation.sdp.md deleted file mode 100644 index 3a0248eb..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-036-default-config-passes-validation.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.default-config-passes-validation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Default config passes validation - -## Intent - -- outcome: Executable scenario: Default config passes validation - -```gwt -Given the module is imported from platform-core -When I create a default rate limit config and I validate the created config -Then the validation result is valid -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-037-creates-config-with-specified-daily-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-037-creates-config-with-specified-daily-budget.sdp.md deleted file mode 100644 index 7328b19c..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-037-creates-config-with-specified-daily-budget.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.creates-config-with-specified-daily-budget -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Creates config with specified dailyBudget - -## Intent - -- outcome: Executable scenario: Creates config with specified dailyBudget - -```gwt -Given the module is imported from platform-core -When I create a rate limit config with dailyBudget 25 -Then the config costBudget daily is 25 -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-038-uses-default-alert-threshold-when-not-specified.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-038-uses-default-alert-threshold-when-not-specified.sdp.md deleted file mode 100644 index 8a875c17..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-038-uses-default-alert-threshold-when-not-specified.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.uses-default-alert-threshold-when-not-specified -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Uses default alertThreshold when not specified - -## Intent - -- outcome: Executable scenario: Uses default alertThreshold when not specified - -```gwt -Given the module is imported from platform-core -When I create a rate limit config with dailyBudget 10 -Then the config costBudget alertThreshold is 0.8 -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-039-uses-specified-alert-threshold.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-039-uses-specified-alert-threshold.sdp.md deleted file mode 100644 index 1d367200..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-039-uses-specified-alert-threshold.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.uses-specified-alert-threshold -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Uses specified alertThreshold - -## Intent - -- outcome: Executable scenario: Uses specified alertThreshold - -```gwt -Given the module is imported from platform-core -When I create a rate limit config with dailyBudget 10 and alertThreshold 0.5 -Then the config costBudget alertThreshold is 0.5 -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-040-uses-specified-max-requests-per-minute.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-040-uses-specified-max-requests-per-minute.sdp.md deleted file mode 100644 index 2359b26f..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-040-uses-specified-max-requests-per-minute.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.uses-specified-max-requests-per-minute -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Uses specified maxRequestsPerMinute - -## Intent - -- outcome: Executable scenario: Uses specified maxRequestsPerMinute - -```gwt -Given the module is imported from platform-core -When I create a rate limit config with dailyBudget 10 and maxRequestsPerMinute 30 -Then the config maxRequestsPerMinute is 30 -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-041-uses-default-max-requests-per-minute-when-not-specified.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-041-uses-default-max-requests-per-minute-when-not-specified.sdp.md deleted file mode 100644 index edc2cde2..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-041-uses-default-max-requests-per-minute-when-not-specified.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.uses-default-max-requests-per-minute-when-not-specified -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Uses default maxRequestsPerMinute when not specified - -## Intent - -- outcome: Executable scenario: Uses default maxRequestsPerMinute when not specified - -```gwt -Given the module is imported from platform-core -When I create a rate limit config with dailyBudget 10 -Then the config maxRequestsPerMinute matches the default -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-042-includes-all-optional-fields.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-042-includes-all-optional-fields.sdp.md deleted file mode 100644 index e586326e..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-042-includes-all-optional-fields.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.includes-all-optional-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Includes all optional fields - -## Intent - -- outcome: Executable scenario: Includes all optional fields - -```gwt -Given the module is imported from platform-core -When I create a rate limit config with dailyBudget 10 and maxRequestsPerMinute 30 and maxConcurrent 3 and queueDepth 50 and alertThreshold 0.7 -Then the config has the following values: -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-043-creates-error-with-code-and-message.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-043-creates-error-with-code-and-message.sdp.md deleted file mode 100644 index 2d523036..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-043-creates-error-with-code-and-message.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.creates-error-with-code-and-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Creates error with code and message - -## Intent - -- outcome: Executable scenario: Creates error with code and message - -```gwt -Given the module is imported from platform-core -When I create a rate limit error with code "LLM_RATE_LIMITED" and message "Rate limit exceeded" -Then the error code is "LLM_RATE_LIMITED" -And the error message is "Rate limit exceeded" -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-044-creates-error-without-optional-fields-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-044-creates-error-without-optional-fields-when-not-provided.sdp.md deleted file mode 100644 index b749fcd5..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-044-creates-error-without-optional-fields-when-not-provided.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.creates-error-without-optional-fields-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Creates error without optional fields when not provided - -## Intent - -- outcome: Executable scenario: Creates error without optional fields when not provided - -```gwt -Given the module is imported from platform-core -When I create a rate limit error with code "LLM_UNAVAILABLE" and message "Service unavailable" -Then the error retryAfterMs is undefined -And the error context is undefined -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-045-creates-error-with-retry-after-ms-when-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-045-creates-error-with-retry-after-ms-when-provided.sdp.md deleted file mode 100644 index eb105da6..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-045-creates-error-with-retry-after-ms-when-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.creates-error-with-retry-after-ms-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Creates error with retryAfterMs when provided - -## Intent - -- outcome: Executable scenario: Creates error with retryAfterMs when provided - -```gwt -Given the module is imported from platform-core -When I create a rate limit error with code "LLM_RATE_LIMITED" and message "Rate limited" and retryAfterMs 5000 -Then the error retryAfterMs is 5000 -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-046-creates-error-with-context-when-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-046-creates-error-with-context-when-provided.sdp.md deleted file mode 100644 index c51e25da..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-046-creates-error-with-context-when-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.creates-error-with-context-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Creates error with context when provided - -## Intent - -- outcome: Executable scenario: Creates error with context when provided - -```gwt -Given the module is imported from platform-core -When I create a rate limit error with code "QUEUE_OVERFLOW" and message "Queue full" and context queueSize 100 maxSize 100 -Then the error context equals queueSize 100 and maxSize 100 -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-047-creates-error-with-both-retry-after-ms-and-context.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-047-creates-error-with-both-retry-after-ms-and-context.sdp.md deleted file mode 100644 index c9a629a3..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-047-creates-error-with-both-retry-after-ms-and-context.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.creates-error-with-both-retry-after-ms-and-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Creates error with both retryAfterMs and context - -## Intent - -- outcome: Executable scenario: Creates error with both retryAfterMs and context - -```gwt -Given the module is imported from platform-core -When I create a rate limit error with code "LLM_TIMEOUT" and message "Timeout" and retryAfterMs 10000 and context attempt 3 -Then the error retryAfterMs is 10000 -And the error context equals attempt 3 -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-048-returns-true-for-valid-rate-limit-error.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-048-returns-true-for-valid-rate-limit-error.sdp.md deleted file mode 100644 index cd9e4295..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-048-returns-true-for-valid-rate-limit-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-true-for-valid-rate-limit-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns true for valid rate limit error - -## Intent - -- outcome: Executable scenario: Returns true for valid rate limit error - -```gwt -Given the module is imported from platform-core -When I check isRateLimitError for a valid LLM_RATE_LIMITED error -Then the type guard result is true -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-049-returns-true-for-all-known-error-codes.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-049-returns-true-for-all-known-error-codes.sdp.md deleted file mode 100644 index 7cdaf695..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-049-returns-true-for-all-known-error-codes.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-true-for-all-known-error-codes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns true for all known error codes - -## Intent - -- outcome: Executable scenario: Returns true for all known error codes - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isRateLimitError returns true for all known error codes -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-050-returns-false-for-non-error-values.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-050-returns-false-for-non-error-values.sdp.md deleted file mode 100644 index 8f4c4348..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-050-returns-false-for-non-error-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-false-for-non-error-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns false for non-error values - -## Intent - -- outcome: Executable scenario: Returns false for non-error values - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isRateLimitError returns false for all of: -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-051-retryable-error-codes.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-051-retryable-error-codes.sdp.md deleted file mode 100644 index 2401df71..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-051-retryable-error-codes.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.retryable-error-codes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Retryable error codes - -## Intent - -- outcome: Executable scenario: Retryable error codes - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isRetryableError returns the expected result for each code: -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-052-returns-false-for-non-rate-limit-errors.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-052-returns-false-for-non-rate-limit-errors.sdp.md deleted file mode 100644 index 62b9097c..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-052-returns-false-for-non-rate-limit-errors.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-false-for-non-rate-limit-errors -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns false for non-rate-limit errors - -## Intent - -- outcome: Executable scenario: Returns false for non-rate-limit errors - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isRetryableError returns false for non-error values -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-053-permanent-error-codes.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-053-permanent-error-codes.sdp.md deleted file mode 100644 index d2017c99..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-053-permanent-error-codes.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.permanent-error-codes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Permanent error codes - -## Intent - -- outcome: Executable scenario: Permanent error codes - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isPermanentError returns the expected result for each code: -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-054-returns-false-for-non-rate-limit-errors.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-054-returns-false-for-non-rate-limit-errors.sdp.md deleted file mode 100644 index 21f28332..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-054-returns-false-for-non-rate-limit-errors.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-false-for-non-rate-limit-errors-2 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns false for non-rate-limit errors - -## Intent - -- outcome: Executable scenario: Returns false for non-rate-limit errors - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isPermanentError returns false for non-error values -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-055-exponential-2-n-growth-pattern-with-math-random-mocked-to-0.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-055-exponential-2-n-growth-pattern-with-math-random-mocked-to-0.sdp.md deleted file mode 100644 index deff67e9..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-055-exponential-2-n-growth-pattern-with-math-random-mocked-to-0.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.exponential-2-n-growth-pattern-with-math-random-mocked-to-0 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Exponential 2^n growth pattern with Math.random mocked to 0 - -## Intent - -- outcome: Executable scenario: Exponential 2^n growth pattern with Math.random mocked to 0 - -```gwt -Given the module is imported from platform-core -When Math.random is mocked to return 0 -Then calculateBackoffDelay returns the expected delays: -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-056-caps-at-default-max-delay-of-60000ms.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-056-caps-at-default-max-delay-of-60000ms.sdp.md deleted file mode 100644 index 8f8075f7..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-056-caps-at-default-max-delay-of-60000ms.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.caps-at-default-max-delay-of-60000ms -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Caps at default maxDelay of 60000ms - -## Intent - -- outcome: Executable scenario: Caps at default maxDelay of 60000ms - -```gwt -Given the module is imported from platform-core -When Math.random is mocked to return 0 -Then calculateBackoffDelay for attempt 10 with baseDelay 1000 returns 60000 -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-057-caps-at-custom-max-delay.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-057-caps-at-custom-max-delay.sdp.md deleted file mode 100644 index b8f912bf..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-057-caps-at-custom-max-delay.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.caps-at-custom-max-delay -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Caps at custom maxDelay - -## Intent - -- outcome: Executable scenario: Caps at custom maxDelay - -```gwt -Given the module is imported from platform-core -When Math.random is mocked to return 0 -Then calculateBackoffDelay for attempt 5 with baseDelay 1000 and maxDelay 10000 returns 10000 -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-058-does-not-cap-when-delay-is-below-max.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-058-does-not-cap-when-delay-is-below-max.sdp.md deleted file mode 100644 index 7918486e..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-058-does-not-cap-when-delay-is-below-max.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.does-not-cap-when-delay-is-below-max -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Does not cap when delay is below max - -## Intent - -- outcome: Executable scenario: Does not cap when delay is below max - -```gwt -Given the module is imported from platform-core -When Math.random is mocked to return 0 -Then calculateBackoffDelay for attempt 2 with baseDelay 1000 and maxDelay 10000 returns 4000 -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-059-adds-jitter-up-to-25-of-delay.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-059-adds-jitter-up-to-25-of-delay.sdp.md deleted file mode 100644 index 6c6ddbb1..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-059-adds-jitter-up-to-25-of-delay.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.adds-jitter-up-to-25-of-delay -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Adds jitter up to 25% of delay - -## Intent - -- outcome: Executable scenario: Adds jitter up to 25% of delay - -```gwt -Given the module is imported from platform-core -When Math.random is mocked to return 0.5 -Then calculateBackoffDelay for attempt 0 with baseDelay 1000 returns 1125 -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-060-adds-max-jitter-of-25-when-random-is-1.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-060-adds-max-jitter-of-25-when-random-is-1.sdp.md deleted file mode 100644 index 89a54e44..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-060-adds-max-jitter-of-25-when-random-is-1.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.adds-max-jitter-of-25-when-random-is-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Adds max jitter of 25% when random is 1 - -## Intent - -- outcome: Executable scenario: Adds max jitter of 25% when random is 1 - -```gwt -Given the module is imported from platform-core -When Math.random is mocked to return 1 -Then calculateBackoffDelay for attempt 0 with baseDelay 1000 returns 1250 -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-061-uses-default-base-delay-of-1000ms.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-061-uses-default-base-delay-of-1000ms.sdp.md deleted file mode 100644 index 5680283d..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-061-uses-default-base-delay-of-1000ms.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.uses-default-base-delay-of-1000ms -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Uses default base delay of 1000ms - -## Intent - -- outcome: Executable scenario: Uses default base delay of 1000ms - -```gwt -Given the module is imported from platform-core -When Math.random is mocked to return 0 -Then calculateBackoffDelay for attempt 0 with default params returns 1000 -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-062-uses-default-max-delay-of-60000ms.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-062-uses-default-max-delay-of-60000ms.sdp.md deleted file mode 100644 index 3ca3d91a..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-062-uses-default-max-delay-of-60000ms.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.uses-default-max-delay-of-60000ms -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Uses default max delay of 60000ms - -## Intent - -- outcome: Executable scenario: Uses default max delay of 60000ms - -```gwt -Given the module is imported from platform-core -When Math.random is mocked to return 0 -Then calculateBackoffDelay for attempt 10 with default params returns 60000 -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-063-returns-floored-integer.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-063-returns-floored-integer.sdp.md deleted file mode 100644 index 6d638263..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-063-returns-floored-integer.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-floored-integer -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns floored integer - -## Intent - -- outcome: Executable scenario: Returns floored integer - -```gwt -Given the module is imported from platform-core -When Math.random is mocked to return 0.333 -Then calculateBackoffDelay for attempt 0 with baseDelay 1000 returns an integer -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-064-returns-true-when-total-exceeds-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-064-returns-true-when-total-exceeds-budget.sdp.md deleted file mode 100644 index 20231989..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-064-returns-true-when-total-exceeds-budget.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-true-when-total-exceeds-budget -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns true when total exceeds budget - -## Intent - -- outcome: Executable scenario: Returns true when total exceeds budget - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then wouldExceedBudget for currentSpend 9 estimatedCost 2 and daily 10 returns true -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-065-returns-false-when-total-is-under-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-065-returns-false-when-total-is-under-budget.sdp.md deleted file mode 100644 index 2f94ad7b..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-065-returns-false-when-total-is-under-budget.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-false-when-total-is-under-budget -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns false when total is under budget - -## Intent - -- outcome: Executable scenario: Returns false when total is under budget - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then wouldExceedBudget for currentSpend 5 estimatedCost 3 and daily 10 returns false -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-066-returns-false-when-total-equals-budget-exactly.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-066-returns-false-when-total-equals-budget-exactly.sdp.md deleted file mode 100644 index 58825c90..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-066-returns-false-when-total-equals-budget-exactly.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-false-when-total-equals-budget-exactly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns false when total equals budget exactly - -## Intent - -- outcome: Executable scenario: Returns false when total equals budget exactly - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then wouldExceedBudget for currentSpend 7 estimatedCost 3 and daily 10 returns false -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-067-returns-true-when-current-spend-already-exceeds-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-067-returns-true-when-current-spend-already-exceeds-budget.sdp.md deleted file mode 100644 index fe4ede62..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-067-returns-true-when-current-spend-already-exceeds-budget.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-true-when-current-spend-already-exceeds-budget -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns true when current spend already exceeds budget - -## Intent - -- outcome: Executable scenario: Returns true when current spend already exceeds budget - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then wouldExceedBudget for currentSpend 11 estimatedCost 0 and daily 10 returns true -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-068-handles-zero-current-spend-under-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-068-handles-zero-current-spend-under-budget.sdp.md deleted file mode 100644 index 59efa741..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-068-handles-zero-current-spend-under-budget.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.handles-zero-current-spend-under-budget -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Handles zero current spend under budget - -## Intent - -- outcome: Executable scenario: Handles zero current spend under budget - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then wouldExceedBudget for currentSpend 0 estimatedCost 5 and daily 10 returns false -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-069-handles-zero-current-spend-over-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-069-handles-zero-current-spend-over-budget.sdp.md deleted file mode 100644 index 12657ecf..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-069-handles-zero-current-spend-over-budget.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.handles-zero-current-spend-over-budget -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Handles zero current spend over budget - -## Intent - -- outcome: Executable scenario: Handles zero current spend over budget - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then wouldExceedBudget for currentSpend 0 estimatedCost 15 and daily 10 returns true -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-070-handles-small-decimal-values-under-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-070-handles-small-decimal-values-under-budget.sdp.md deleted file mode 100644 index d4d8b432..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-070-handles-small-decimal-values-under-budget.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.handles-small-decimal-values-under-budget -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Handles small decimal values under budget - -## Intent - -- outcome: Executable scenario: Handles small decimal values under budget - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then wouldExceedBudget for currentSpend 0.05 estimatedCost 0.04 and daily 0.1 returns false -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-071-handles-small-decimal-values-over-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-071-handles-small-decimal-values-over-budget.sdp.md deleted file mode 100644 index c06d9d85..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-071-handles-small-decimal-values-over-budget.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.handles-small-decimal-values-over-budget -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Handles small decimal values over budget - -## Intent - -- outcome: Executable scenario: Handles small decimal values over budget - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then wouldExceedBudget for currentSpend 0.05 estimatedCost 0.06 and daily 0.1 returns true -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-072-returns-true-when-spend-reaches-threshold-percentage.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-072-returns-true-when-spend-reaches-threshold-percentage.sdp.md deleted file mode 100644 index 24bdb704..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-072-returns-true-when-spend-reaches-threshold-percentage.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-true-when-spend-reaches-threshold-percentage -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns true when spend reaches threshold percentage - -## Intent - -- outcome: Executable scenario: Returns true when spend reaches threshold percentage - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isAtAlertThreshold for currentSpend 8 with daily 10 and alertThreshold 0.8 returns true -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-073-returns-true-when-spend-exceeds-threshold.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-073-returns-true-when-spend-exceeds-threshold.sdp.md deleted file mode 100644 index 83338ebe..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-073-returns-true-when-spend-exceeds-threshold.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-true-when-spend-exceeds-threshold -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns true when spend exceeds threshold - -## Intent - -- outcome: Executable scenario: Returns true when spend exceeds threshold - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isAtAlertThreshold for currentSpend 9 with daily 10 and alertThreshold 0.8 returns true -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-074-returns-false-when-spend-is-below-threshold.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-074-returns-false-when-spend-is-below-threshold.sdp.md deleted file mode 100644 index 98ace3e4..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-074-returns-false-when-spend-is-below-threshold.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-false-when-spend-is-below-threshold -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns false when spend is below threshold - -## Intent - -- outcome: Executable scenario: Returns false when spend is below threshold - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isAtAlertThreshold for currentSpend 7 with daily 10 and alertThreshold 0.8 returns false -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-075-handles-threshold-of-0-always-alert.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-075-handles-threshold-of-0-always-alert.sdp.md deleted file mode 100644 index 18e61674..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-075-handles-threshold-of-0-always-alert.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.handles-threshold-of-0-always-alert -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Handles threshold of 0 - always alert - -## Intent - -- outcome: Executable scenario: Handles threshold of 0 - always alert - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isAtAlertThreshold for currentSpend 0 with daily 10 and alertThreshold 0 returns true -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-076-handles-threshold-of-1-below-full-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-076-handles-threshold-of-1-below-full-budget.sdp.md deleted file mode 100644 index 0051c386..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-076-handles-threshold-of-1-below-full-budget.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.handles-threshold-of-1-below-full-budget -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Handles threshold of 1 - below full budget - -## Intent - -- outcome: Executable scenario: Handles threshold of 1 - below full budget - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isAtAlertThreshold for currentSpend 9.99 with daily 10 and alertThreshold 1 returns false -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-077-handles-threshold-of-1-at-full-budget.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-077-handles-threshold-of-1-at-full-budget.sdp.md deleted file mode 100644 index 09945e48..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-077-handles-threshold-of-1-at-full-budget.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.handles-threshold-of-1-at-full-budget -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Handles threshold of 1 - at full budget - -## Intent - -- outcome: Executable scenario: Handles threshold of 1 - at full budget - -```gwt -Given the module is imported from platform-core -When the scenario runs -Then isAtAlertThreshold for currentSpend 10 with daily 10 and alertThreshold 1 returns true -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-078-returns-defaults-when-no-config-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-078-returns-defaults-when-no-config-provided.sdp.md deleted file mode 100644 index e0caf61d..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-078-returns-defaults-when-no-config-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-defaults-when-no-config-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns defaults when no config provided - -## Intent - -- outcome: Executable scenario: Returns defaults when no config provided - -```gwt -Given the module is imported from platform-core -When I get the effective rate limit config with no input -Then the effective config matches all defaults -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-079-returns-defaults-when-undefined-config-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-079-returns-defaults-when-undefined-config-provided.sdp.md deleted file mode 100644 index 0d37031c..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-079-returns-defaults-when-undefined-config-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.returns-defaults-when-undefined-config-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Returns defaults when undefined config provided - -## Intent - -- outcome: Executable scenario: Returns defaults when undefined config provided - -```gwt -Given the module is imported from platform-core -When I get the effective rate limit config with undefined input -Then the effective config maxRequestsPerMinute matches the default -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-080-uses-provided-max-requests-per-minute.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-080-uses-provided-max-requests-per-minute.sdp.md deleted file mode 100644 index 0749f1f9..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-080-uses-provided-max-requests-per-minute.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.uses-provided-max-requests-per-minute -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Uses provided maxRequestsPerMinute - -## Intent - -- outcome: Executable scenario: Uses provided maxRequestsPerMinute - -```gwt -Given the module is imported from platform-core -When I get the effective rate limit config with maxRequestsPerMinute 30 -Then the effective config maxRequestsPerMinute is 30 -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-081-uses-default-max-concurrent-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-081-uses-default-max-concurrent-when-not-provided.sdp.md deleted file mode 100644 index 576765b2..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-081-uses-default-max-concurrent-when-not-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.uses-default-max-concurrent-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Uses default maxConcurrent when not provided - -## Intent - -- outcome: Executable scenario: Uses default maxConcurrent when not provided - -```gwt -Given the module is imported from platform-core -When I get the effective rate limit config with maxRequestsPerMinute 30 -Then the effective config maxConcurrent matches the default -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-082-uses-provided-max-concurrent.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-082-uses-provided-max-concurrent.sdp.md deleted file mode 100644 index 806a6249..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-082-uses-provided-max-concurrent.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.uses-provided-max-concurrent -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Uses provided maxConcurrent - -## Intent - -- outcome: Executable scenario: Uses provided maxConcurrent - -```gwt -Given the module is imported from platform-core -When I get the effective rate limit config with maxRequestsPerMinute 30 and maxConcurrent 3 -Then the effective config maxConcurrent is 3 -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-083-uses-default-queue-depth-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-083-uses-default-queue-depth-when-not-provided.sdp.md deleted file mode 100644 index e2310ddd..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-083-uses-default-queue-depth-when-not-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.uses-default-queue-depth-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Uses default queueDepth when not provided - -## Intent - -- outcome: Executable scenario: Uses default queueDepth when not provided - -```gwt -Given the module is imported from platform-core -When I get the effective rate limit config with maxRequestsPerMinute 30 -Then the effective config queueDepth matches the default -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-084-uses-provided-queue-depth.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-084-uses-provided-queue-depth.sdp.md deleted file mode 100644 index 20b73f43..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-084-uses-provided-queue-depth.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.uses-provided-queue-depth -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Uses provided queueDepth - -## Intent - -- outcome: Executable scenario: Uses provided queueDepth - -```gwt -Given the module is imported from platform-core -When I get the effective rate limit config with maxRequestsPerMinute 30 and queueDepth 50 -Then the effective config queueDepth is 50 -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-085-preserves-cost-budget-when-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-085-preserves-cost-budget-when-provided.sdp.md deleted file mode 100644 index d88800de..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-085-preserves-cost-budget-when-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.preserves-cost-budget-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Preserves costBudget when provided - -## Intent - -- outcome: Executable scenario: Preserves costBudget when provided - -```gwt -Given the module is imported from platform-core -When I get the effective rate limit config with maxRequestsPerMinute 30 and costBudget daily 10 alertThreshold 0.8 -Then the effective config costBudget equals daily 10 and alertThreshold 0.8 -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.examples/s-086-does-not-include-cost-budget-when-not-provided.sdp.md b/specs/behavior/platform-core/agent/rate-limit.examples/s-086-does-not-include-cost-budget-when-not-provided.sdp.md deleted file mode 100644 index c8726934..00000000 --- a/specs/behavior/platform-core/agent/rate-limit.examples/s-086-does-not-include-cost-budget-when-not-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.rate-limit.does-not-include-cost-budget-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.rate-limit ---- -# Does not include costBudget when not provided - -## Intent - -- outcome: Executable scenario: Does not include costBudget when not provided - -```gwt -Given the module is imported from platform-core -When I get the effective rate limit config with maxRequestsPerMinute 30 -Then the effective config costBudget is undefined -``` diff --git a/specs/behavior/platform-core/agent/rate-limit.sdp.md b/specs/behavior/platform-core/agent/rate-limit.sdp.md index 93ae240e..6265b141 100644 --- a/specs/behavior/platform-core/agent/rate-limit.sdp.md +++ b/specs/behavior/platform-core/agent/rate-limit.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.rate-limit kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: Rate Limit Module +- outcome: Provide schemas, factories, type guards, exponential backoff, and budget helpers for LLM rate limiting. +- value: Agent configuration can be validated and retry decisions can be made from named error codes and a daily cost budget. ## Behavior diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-001-calls-generate-text-and-parses-a-valid-json-response.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-001-calls-generate-text-and-parses-a-valid-json-response.sdp.md deleted file mode 100644 index b34916c2..00000000 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-001-calls-generate-text-and-parses-a-valid-json-response.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.thread-adapter.calls-generate-text-and-parses-a-valid-json-response -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.thread-adapter ---- -# Calls generateText and parses a valid JSON response - -## Intent - -- outcome: Executable scenario: Calls generateText and parses a valid JSON response - -```gwt -Given a generateText mock returning a churn-risk JSON response with 100 tokens -When I call analyze with prompt "Detect churn risk" and 2 events -Then generateText was called exactly 1 time -And the analyze result has the following properties: -And the first pattern matchingEventIds are "evt_1" and "evt_2" -``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-002-handles-non-json-response-with-defaults.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-002-handles-non-json-response-with-defaults.sdp.md deleted file mode 100644 index b74c5e77..00000000 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-002-handles-non-json-response-with-defaults.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.thread-adapter.handles-non-json-response-with-defaults -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.thread-adapter ---- -# Handles non-JSON response with defaults - -## Intent - -- outcome: Executable scenario: Handles non-JSON response with defaults - -```gwt -Given a generateText mock returning plain text "This is plain text, not JSON" with 30 tokens -When I call analyze with prompt "Analyze events" and 1 event -Then the analyze result has defaults with reasoning "This is plain text, not JSON" -``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-003-handles-malformed-json-gracefully.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-003-handles-malformed-json-gracefully.sdp.md deleted file mode 100644 index d9f09804..00000000 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-003-handles-malformed-json-gracefully.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.thread-adapter.handles-malformed-json-gracefully -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.thread-adapter ---- -# Handles malformed JSON gracefully - -## Intent - -- outcome: Executable scenario: Handles malformed JSON gracefully - -```gwt -Given a generateText mock returning plain text "{ not valid json }}}" with 20 tokens -When I call analyze with prompt "Analyze events" and 1 event -Then the analyze result has defaults with reasoning "{ not valid json }}}" -``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-004-re-throws-generate-text-errors.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-004-re-throws-generate-text-errors.sdp.md deleted file mode 100644 index 86cb6bab..00000000 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-004-re-throws-generate-text-errors.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.thread-adapter.re-throws-generate-text-errors -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.thread-adapter ---- -# Re-throws generateText errors - -## Intent - -- outcome: Executable scenario: Re-throws generateText errors - -```gwt -Given a generateText mock that rejects with "API rate limit exceeded" -When I call analyze expecting an error -Then the error message is "API rate limit exceeded" -``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-005-tracks-timing-in-llm-context.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-005-tracks-timing-in-llm-context.sdp.md deleted file mode 100644 index 6f536178..00000000 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-005-tracks-timing-in-llm-context.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.thread-adapter.tracks-timing-in-llm-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.thread-adapter ---- -# Tracks timing in llmContext - -## Intent - -- outcome: Executable scenario: Tracks timing in llmContext - -```gwt -Given a generateText mock that takes 250ms and returns 50 tokens -When I call analyze with prompt "Analyze" and 1 event -Then the llmContext has the following timing properties: -``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-006-includes-thread-id-in-llm-context-when-present.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-006-includes-thread-id-in-llm-context-when-present.sdp.md deleted file mode 100644 index 39638eeb..00000000 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-006-includes-thread-id-in-llm-context-when-present.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.thread-adapter.includes-thread-id-in-llm-context-when-present -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.thread-adapter ---- -# Includes threadId in llmContext when present - -## Intent - -- outcome: Executable scenario: Includes threadId in llmContext when present - -```gwt -Given a generateText mock returning JSON with threadId "thread_abc123" and 50 tokens -When I call analyze with prompt "Analyze" and 1 event -Then the llmContext threadId is "thread_abc123" -``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-007-omits-thread-id-from-llm-context-when-not-present.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-007-omits-thread-id-from-llm-context-when-not-present.sdp.md deleted file mode 100644 index a82d5518..00000000 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-007-omits-thread-id-from-llm-context-when-not-present.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.thread-adapter.omits-thread-id-from-llm-context-when-not-present -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.thread-adapter ---- -# Omits threadId from llmContext when not present - -## Intent - -- outcome: Executable scenario: Omits threadId from llmContext when not present - -```gwt -Given a generateText mock returning JSON without threadId and 50 tokens -When I call analyze with prompt "Analyze" and 1 event -Then the llmContext does not contain threadId -``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-008-handles-missing-usage-with-zero-tokens.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-008-handles-missing-usage-with-zero-tokens.sdp.md deleted file mode 100644 index 9f07b412..00000000 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-008-handles-missing-usage-with-zero-tokens.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.thread-adapter.handles-missing-usage-with-zero-tokens -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.thread-adapter ---- -# Handles missing usage with zero tokens - -## Intent - -- outcome: Executable scenario: Handles missing usage with zero tokens - -```gwt -Given a generateText mock returning JSON without usage -When I call analyze with prompt "Analyze" and 1 event -Then the llmContext tokens is 0 -``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-009-calls-generate-text-and-parses-json-response-for-reason.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-009-calls-generate-text-and-parses-json-response-for-reason.sdp.md deleted file mode 100644 index a5a91302..00000000 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-009-calls-generate-text-and-parses-json-response-for-reason.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.thread-adapter.calls-generate-text-and-parses-json-response-for-reason -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.thread-adapter ---- -# Calls generateText and parses JSON response for reason - -## Intent - -- outcome: Executable scenario: Calls generateText and parses JSON response for reason - -```gwt -Given a generateText mock returning a reasoning JSON response with 80 tokens -When I call reason with a test event -Then the reason result is a structured object with observation and implications -``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-010-returns-raw-text-when-response-is-not-json.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-010-returns-raw-text-when-response-is-not-json.sdp.md deleted file mode 100644 index eef8b6a0..00000000 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-010-returns-raw-text-when-response-is-not-json.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.thread-adapter.returns-raw-text-when-response-is-not-json -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.thread-adapter ---- -# Returns raw text when response is not JSON - -## Intent - -- outcome: Executable scenario: Returns raw text when response is not JSON - -```gwt -Given a generateText mock returning plain text "This event indicates a potential issue with order fulfillment." with 40 tokens -When I call reason with a test event -Then the reason result is the raw text "This event indicates a potential issue with order fulfillment." -``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-011-re-throws-generate-text-errors-from-reason.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-011-re-throws-generate-text-errors-from-reason.sdp.md deleted file mode 100644 index 3efbafd0..00000000 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-011-re-throws-generate-text-errors-from-reason.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.thread-adapter.re-throws-generate-text-errors-from-reason -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.thread-adapter ---- -# Re-throws generateText errors from reason - -## Intent - -- outcome: Executable scenario: Re-throws generateText errors from reason - -```gwt -Given a generateText mock that rejects with "Network error" -When I call reason expecting an error -Then the error message is "Network error" -``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.examples/s-012-logs-reasoning-start-and-completion.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.examples/s-012-logs-reasoning-start-and-completion.sdp.md deleted file mode 100644 index 701b6f3e..00000000 --- a/specs/behavior/platform-core/agent/thread-adapter.examples/s-012-logs-reasoning-start-and-completion.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.agent.thread-adapter.logs-reasoning-start-and-completion -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.agent.thread-adapter ---- -# Logs reasoning start and completion - -## Intent - -- outcome: Executable scenario: Logs reasoning start and completion - -```gwt -Given a generateText mock returning JSON with 30 tokens and a mock logger -When I call reason with a PaymentFailed event -Then the logger debug was called with "Starting reasoning" and agentId "test-agent" and eventType "PaymentFailed" -And the logger info was called with "Reasoning completed" and agentId "test-agent" and model "anthropic/claude-sonnet-4-5-20250929" -``` diff --git a/specs/behavior/platform-core/agent/thread-adapter.sdp.md b/specs/behavior/platform-core/agent/thread-adapter.sdp.md index 736ee3e4..17b7d796 100644 --- a/specs/behavior/platform-core/agent/thread-adapter.sdp.md +++ b/specs/behavior/platform-core/agent/thread-adapter.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.agent.thread-adapter kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,17 +10,18 @@ relations: ## Intent -- outcome: Thread Adapter +- outcome: Return an AgentInterface whose analyze and reason methods wrap an injected generateText callback, parse JSON responses, and record model, tokens, timing, and threadId in llmContext. +- value: platform-core stays free of the agent SDK because the application supplies generateText. ## Behavior -- rule: analyze() parses JSON responses with patterns, confidence, and reasoning -- rule: analyze() handles non-JSON and malformed responses gracefully -- rule: analyze() re-throws generateText errors -- rule: analyze() tracks timing in llmContext -- rule: analyze() handles threadId presence and absence in llmContext -- rule: analyze() handles missing usage in generateText result -- rule: reason() parses JSON and returns structured data -- rule: reason() falls back to raw text for non-JSON responses -- rule: reason() re-throws generateText errors -- rule: reason() logs reasoning start and completion +- rule: A valid JSON analyze response is parsed into structured patterns, confidence, reasoning, and llmContext. +- rule: Non-JSON or malformed analyze responses return empty patterns, zero confidence, and raw text as reasoning. +- rule: Errors from generateText propagate from analyze without being swallowed. +- rule: llmContext.durationMs reflects elapsed time during the generateText call. +- rule: threadId is included in llmContext only when present in the generateText result. +- rule: When usage is absent from the generateText result, tokens defaults to 0. +- rule: reason parses a valid JSON response and returns it as a structured object. +- rule: Non-JSON responses from generateText are returned as raw text from reason. +- rule: Errors from generateText propagate from reason without being swallowed. +- rule: reason logs debug on start and info on completion with agent and model metadata. diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-001-executes-commands-sequentially-in-atomic-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-001-executes-commands-sequentially-in-atomic-mode.sdp.md deleted file mode 100644 index ca54b9fa..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-001-executes-commands-sequentially-in-atomic-mode.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.executes-commands-sequentially-in-atomic-mode -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Executes commands sequentially in atomic mode - -## Intent - -- outcome: Executable scenario: Executes commands sequentially in atomic mode - -```gwt -Given a mock executor that succeeds for all commands -And a BatchExecutor with the mock executor and standard registry -And a batch of 3 AddOrderItem commands for order "ord_1" -When the batch is executed in "atomic" mode with aggregateId "ord_1" -Then the batch result status is "success" -And the batch summary shows: -And the executor was called 3 times -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-002-stops-on-first-failure-and-skips-remaining-in-atomic-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-002-stops-on-first-failure-and-skips-remaining-in-atomic-mode.sdp.md deleted file mode 100644 index c2b74442..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-002-stops-on-first-failure-and-skips-remaining-in-atomic-mode.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.stops-on-first-failure-and-skips-remaining-in-atomic-mode -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Stops on first failure and skips remaining in atomic mode - -## Intent - -- outcome: Executable scenario: Stops on first failure and skips remaining in atomic mode - -```gwt -Given a failing executor that fails after 1 successful command -And a BatchExecutor with the failing executor and standard registry -And a batch of 3 AddOrderItem commands for order "ord_1" -When the batch is executed in "atomic" mode with aggregateId "ord_1" -Then the batch result status is "failed" -And the batch summary shows: -And the executor was called 2 times -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-003-rejects-batch-for-cross-aggregate-commands-in-atomic-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-003-rejects-batch-for-cross-aggregate-commands-in-atomic-mode.sdp.md deleted file mode 100644 index 763fe183..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-003-rejects-batch-for-cross-aggregate-commands-in-atomic-mode.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.rejects-batch-for-cross-aggregate-commands-in-atomic-mode -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Rejects batch for cross-aggregate commands in atomic mode - -## Intent - -- outcome: Executable scenario: Rejects batch for cross-aggregate commands in atomic mode - -```gwt -Given a mock executor that succeeds for all commands -And a BatchExecutor with the mock executor and standard registry -And a batch of AddOrderItem commands targeting different orders: -When the batch is executed in "atomic" mode with aggregateId "ord_1" -Then the batch result status is "failed" -And all batch results have status "rejected" -And the executor was not called -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-004-uses-shared-correlation-id-in-atomic-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-004-uses-shared-correlation-id-in-atomic-mode.sdp.md deleted file mode 100644 index 8018d45e..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-004-uses-shared-correlation-id-in-atomic-mode.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.uses-shared-correlation-id-in-atomic-mode -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Uses shared correlationId in atomic mode - -## Intent - -- outcome: Executable scenario: Uses shared correlationId in atomic mode - -```gwt -Given a mock executor that succeeds for all commands -And a BatchExecutor with the mock executor and standard registry -And a batch of 2 AddOrderItem commands for order "ord_1" -When the batch is executed in "atomic" mode with aggregateId "ord_1" and correlationId "batch_corr_123" -Then the batch correlationId is "batch_corr_123" -And the executor received correlationId "batch_corr_123" -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-005-allows-command-level-correlation-id-override-in-atomic-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-005-allows-command-level-correlation-id-override-in-atomic-mode.sdp.md deleted file mode 100644 index 1ee88fbd..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-005-allows-command-level-correlation-id-override-in-atomic-mode.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.allows-command-level-correlation-id-override-in-atomic-mode -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Allows command-level correlationId override in atomic mode - -## Intent - -- outcome: Executable scenario: Allows command-level correlationId override in atomic mode - -```gwt -Given a mock executor that succeeds for all commands -And a BatchExecutor with the mock executor and standard registry -And a batch with command-level correlationId override for order "ord_1" -When the batch is executed in "atomic" mode with aggregateId "ord_1" and correlationId "batch_corr" -Then the executor call 1 received correlationId "cmd_corr_1" -And the executor call 2 received correlationId "batch_corr" -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-006-executes-all-commands-even-with-failures-in-partial-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-006-executes-all-commands-even-with-failures-in-partial-mode.sdp.md deleted file mode 100644 index 6ee951ba..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-006-executes-all-commands-even-with-failures-in-partial-mode.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.executes-all-commands-even-with-failures-in-partial-mode -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Executes all commands even with failures in partial mode - -## Intent - -- outcome: Executable scenario: Executes all commands even with failures in partial mode - -```gwt -Given a failing executor that fails after 1 successful command -And a BatchExecutor with the failing executor and standard registry -And a batch of AddOrderItem commands targeting different orders: -When the batch is executed in "partial" mode -Then the batch result status is "partial" -And the batch summary shows: -And the executor was called 3 times -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-007-returns-success-when-all-commands-succeed-in-partial-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-007-returns-success-when-all-commands-succeed-in-partial-mode.sdp.md deleted file mode 100644 index c3dd0f6d..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-007-returns-success-when-all-commands-succeed-in-partial-mode.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.returns-success-when-all-commands-succeed-in-partial-mode -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Returns success when all commands succeed in partial mode - -## Intent - -- outcome: Executable scenario: Returns success when all commands succeed in partial mode - -```gwt -Given a mock executor that succeeds for all commands -And a BatchExecutor with the mock executor only -And a batch of CreateOrder commands: -When the batch is executed in "partial" mode -Then the batch result status is "success" -And the batch summary shows: -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-008-allows-cross-aggregate-commands-in-partial-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-008-allows-cross-aggregate-commands-in-partial-mode.sdp.md deleted file mode 100644 index a3507df9..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-008-allows-cross-aggregate-commands-in-partial-mode.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.allows-cross-aggregate-commands-in-partial-mode -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Allows cross-aggregate commands in partial mode - -## Intent - -- outcome: Executable scenario: Allows cross-aggregate commands in partial mode - -```gwt -Given a mock executor that succeeds for all commands -And a BatchExecutor with the mock executor and standard registry -And a batch of AddOrderItem commands targeting different orders: -When the batch is executed in "partial" mode -Then the batch result status is "success" -And the executor was called 2 times -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-009-respects-max-concurrency-in-partial-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-009-respects-max-concurrency-in-partial-mode.sdp.md deleted file mode 100644 index 516e7c69..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-009-respects-max-concurrency-in-partial-mode.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.respects-max-concurrency-in-partial-mode -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Respects maxConcurrency in partial mode - -## Intent - -- outcome: Executable scenario: Respects maxConcurrency in partial mode - -```gwt -Given a concurrency-tracking executor -And a BatchExecutor with the tracking executor -And a batch of 10 generic test commands -When the batch is executed in "partial" mode with maxConcurrency 3 -Then the executor was called 10 times -And the maximum observed concurrency was at most 3 -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-010-stops-on-failure-when-continue-on-error-is-false-in-partial-mode.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-010-stops-on-failure-when-continue-on-error-is-false-in-partial-mode.sdp.md deleted file mode 100644 index 5a9e93f7..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-010-stops-on-failure-when-continue-on-error-is-false-in-partial-mode.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.stops-on-failure-when-continue-on-error-is-false-in-partial-mode -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Stops on failure when continueOnError is false in partial mode - -## Intent - -- outcome: Executable scenario: Stops on failure when continueOnError is false in partial mode - -```gwt -Given a failing executor that fails after 1 successful command -And a BatchExecutor with the failing executor only -And a batch of 3 generic test commands -When the batch is executed in "partial" mode with maxConcurrency 1 and continueOnError false -Then the batch result status is "partial" -And the batch summary shows: -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-011-tracks-individual-command-results.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-011-tracks-individual-command-results.sdp.md deleted file mode 100644 index fdc8a849..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-011-tracks-individual-command-results.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.tracks-individual-command-results -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Tracks individual command results - -## Intent - -- outcome: Executable scenario: Tracks individual command results - -```gwt -Given a mock executor that succeeds for all commands -And a BatchExecutor with the mock executor only -And a batch of two different command types -When the batch is executed in "partial" mode -Then the batch has 2 results -And result 0 has commandType "TestA" and index 0 -And result 1 has commandType "TestB" and index 1 -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-012-includes-duration-for-each-command.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-012-includes-duration-for-each-command.sdp.md deleted file mode 100644 index c1f8639f..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-012-includes-duration-for-each-command.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.includes-duration-for-each-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Includes duration for each command - -## Intent - -- outcome: Executable scenario: Includes duration for each command - -```gwt -Given a mock executor that succeeds for all commands -And a BatchExecutor with the mock executor only -And a single Test command -When the batch is executed in "partial" mode -Then result 0 has a numeric durationMs -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-013-includes-error-message-for-failed-commands.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-013-includes-error-message-for-failed-commands.sdp.md deleted file mode 100644 index 3f027bee..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-013-includes-error-message-for-failed-commands.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.includes-error-message-for-failed-commands -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Includes error message for failed commands - -## Intent - -- outcome: Executable scenario: Includes error message for failed commands - -```gwt -Given an executor that always rejects with reason "Something went wrong" -And a BatchExecutor with the rejecting executor -And a single Test command -When the batch is executed in "partial" mode -Then result 0 has error "Something went wrong" -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-014-calculates-correct-summary-statistics.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-014-calculates-correct-summary-statistics.sdp.md deleted file mode 100644 index 2d52f47d..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-014-calculates-correct-summary-statistics.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.calculates-correct-summary-statistics -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Calculates correct summary statistics - -## Intent - -- outcome: Executable scenario: Calculates correct summary statistics - -```gwt -Given a failing executor that fails after 2 successful commands -And a BatchExecutor with the failing executor only -And a batch of 5 generic test commands -When the batch is executed in "partial" mode with maxConcurrency 1 -Then the batch summary shows: -And the batch summary totalDurationMs is non-negative -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-015-handles-executor-throwing-errors.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-015-handles-executor-throwing-errors.sdp.md deleted file mode 100644 index 465ff94f..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-015-handles-executor-throwing-errors.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.handles-executor-throwing-errors -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Handles executor throwing errors - -## Intent - -- outcome: Executable scenario: Handles executor throwing errors - -```gwt -Given an executor that throws "Executor crashed" -And a BatchExecutor with the throwing executor -And a single Test command -When the batch is executed in "partial" mode -Then the batch result status is "failed" -And result 0 has status "failed" -And result 0 has error "Executor crashed" -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-016-handles-empty-batch-gracefully.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-016-handles-empty-batch-gracefully.sdp.md deleted file mode 100644 index 1d277622..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-016-handles-empty-batch-gracefully.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.handles-empty-batch-gracefully -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Handles empty batch gracefully - -## Intent - -- outcome: Executable scenario: Handles empty batch gracefully - -```gwt -Given a mock executor that succeeds for all commands -And a BatchExecutor with the mock executor only -When an empty batch is executed in "partial" mode -Then the batch result status is "failed" -And the executor was not called -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-017-rejects-batch-exceeding-max-command-count-before-execution.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-017-rejects-batch-exceeding-max-command-count-before-execution.sdp.md deleted file mode 100644 index 3a394171..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-017-rejects-batch-exceeding-max-command-count-before-execution.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.rejects-batch-exceeding-max-command-count-before-execution -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Rejects batch exceeding max command count before execution - -## Intent - -- outcome: Executable scenario: Rejects batch exceeding max command count before execution - -```gwt -Given a mock executor that succeeds for all commands -And a BatchExecutor with the mock executor only -And a batch of 4 generic test commands -When the batch is executed in "partial" mode with max batch size 3 -Then the batch result status is "failed" -And all batch results have status "rejected" -And the executor was not called -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-018-accepts-batch-exactly-at-max-command-count.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-018-accepts-batch-exactly-at-max-command-count.sdp.md deleted file mode 100644 index 7925ac5e..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-018-accepts-batch-exactly-at-max-command-count.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.accepts-batch-exactly-at-max-command-count -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Accepts batch exactly at max command count - -## Intent - -- outcome: Executable scenario: Accepts batch exactly at max command count - -```gwt -Given a mock executor that succeeds for all commands -And a BatchExecutor with the mock executor only -And a batch of 3 generic test commands -When the batch is executed in "partial" mode with max batch size 3 -Then the batch result status is "success" -And the executor was called 3 times -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-019-accepts-batch-exactly-at-default-max-command-count.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-019-accepts-batch-exactly-at-default-max-command-count.sdp.md deleted file mode 100644 index 03e1231e..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-019-accepts-batch-exactly-at-default-max-command-count.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.accepts-batch-exactly-at-default-max-command-count -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Accepts batch exactly at default max command count - -## Intent - -- outcome: Executable scenario: Accepts batch exactly at default max command count - -```gwt -Given a mock executor that succeeds for all commands -And a BatchExecutor with the mock executor only -And a batch of 100 generic test commands -When the batch is executed in "partial" mode using default max batch size -Then the batch result status is "success" -And the executor was called 100 times -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-020-rejects-batch-exceeding-default-max-command-count-before-execution.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-020-rejects-batch-exceeding-default-max-command-count-before-execution.sdp.md deleted file mode 100644 index 7119800f..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-020-rejects-batch-exceeding-default-max-command-count-before-execution.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.rejects-batch-exceeding-default-max-command-count-before-execution -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Rejects batch exceeding default max command count before execution - -## Intent - -- outcome: Executable scenario: Rejects batch exceeding default max command count before execution - -```gwt -Given a mock executor that succeeds for all commands -And a BatchExecutor with the mock executor only -And a batch of 101 generic test commands -When the batch is executed in "partial" mode using default max batch size -Then the batch result status is "failed" -And all batch results have status "rejected" -And the executor was not called -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-021-rejects-commands-from-wrong-bounded-context.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-021-rejects-commands-from-wrong-bounded-context.sdp.md deleted file mode 100644 index 49933bba..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-021-rejects-commands-from-wrong-bounded-context.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.rejects-commands-from-wrong-bounded-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Rejects commands from wrong bounded context - -## Intent - -- outcome: Executable scenario: Rejects commands from wrong bounded context - -```gwt -Given a mock executor that succeeds for all commands -And a BatchExecutor with inventory registry and default bounded context "orders" -And a batch with cross-context commands -When the batch is executed in "partial" mode -Then the batch result status is "failed" -And result 1 error contains "validation failed" -And the executor was not called -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.examples/s-022-creates-a-batch-executor-instance-via-factory.sdp.md b/specs/behavior/platform-core/batch/batch-executor.examples/s-022-creates-a-batch-executor-instance-via-factory.sdp.md deleted file mode 100644 index 8ba483cc..00000000 --- a/specs/behavior/platform-core/batch/batch-executor.examples/s-022-creates-a-batch-executor-instance-via-factory.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.batch-executor.creates-a-batch-executor-instance-via-factory -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.batch-executor ---- -# Creates a BatchExecutor instance via factory - -## Intent - -- outcome: Executable scenario: Creates a BatchExecutor instance via factory - -```gwt -Given a mock executor that succeeds for all commands -When createBatchExecutor is called with the mock executor -Then the result is a BatchExecutor instance -``` diff --git a/specs/behavior/platform-core/batch/batch-executor.sdp.md b/specs/behavior/platform-core/batch/batch-executor.sdp.md index c15e6087..bced1d25 100644 --- a/specs/behavior/platform-core/batch/batch-executor.sdp.md +++ b/specs/behavior/platform-core/batch/batch-executor.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.batch.batch-executor kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: to execute batch commands in atomic and partial modes so that multiple commands can be processed with appropriate failure semantics +- outcome: Execute batch commands in atomic and partial modes so multiple commands are processed with the matching failure semantics. +- value: Atomic mode stops on first failure for a single aggregate; partial mode continues across aggregates and records per-command results, durations, and summary statistics. ## Behavior diff --git a/specs/behavior/platform-core/batch/validation.examples/s-001-rejects-empty-batch.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-001-rejects-empty-batch.sdp.md deleted file mode 100644 index 82775a87..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-001-rejects-empty-batch.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.rejects-empty-batch -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Rejects empty batch - -## Intent - -- outcome: Executable scenario: Rejects empty batch - -```gwt -Given an empty batch of commands -When the batch is validated in "partial" mode -Then validation fails with error code "EMPTY_BATCH" -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-002-accepts-batch-exactly-at-max-size.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-002-accepts-batch-exactly-at-max-size.sdp.md deleted file mode 100644 index fdd1f742..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-002-accepts-batch-exactly-at-max-size.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.accepts-batch-exactly-at-max-size -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Accepts batch exactly at max size - -## Intent - -- outcome: Executable scenario: Accepts batch exactly at max size - -```gwt -Given a batch of 3 generic test commands -When the batch is validated in "partial" mode with max batch size 3 -Then validation succeeds -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-003-rejects-batch-exceeding-max-size.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-003-rejects-batch-exceeding-max-size.sdp.md deleted file mode 100644 index 70384f9e..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-003-rejects-batch-exceeding-max-size.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.rejects-batch-exceeding-max-size -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Rejects batch exceeding max size - -## Intent - -- outcome: Executable scenario: Rejects batch exceeding max size - -```gwt -Given a batch of 4 generic test commands -When the batch is validated in "partial" mode with max batch size 3 -Then validation fails with error code "BATCH_TOO_LARGE" -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-004-accepts-batch-exactly-at-default-max-size.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-004-accepts-batch-exactly-at-default-max-size.sdp.md deleted file mode 100644 index 9da143fd..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-004-accepts-batch-exactly-at-default-max-size.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.accepts-batch-exactly-at-default-max-size -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Accepts batch exactly at default max size - -## Intent - -- outcome: Executable scenario: Accepts batch exactly at default max size - -```gwt -Given a batch of 100 generic test commands -When the batch is validated in "partial" mode using default max batch size -Then validation succeeds -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-005-rejects-batch-exceeding-default-max-size.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-005-rejects-batch-exceeding-default-max-size.sdp.md deleted file mode 100644 index f2860f2f..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-005-rejects-batch-exceeding-default-max-size.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.rejects-batch-exceeding-default-max-size -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Rejects batch exceeding default max size - -## Intent - -- outcome: Executable scenario: Rejects batch exceeding default max size - -```gwt -Given a batch of 101 generic test commands -When the batch is validated in "partial" mode using default max batch size -Then validation fails with error code "BATCH_TOO_LARGE" -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-006-accepts-valid-commands-without-registry.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-006-accepts-valid-commands-without-registry.sdp.md deleted file mode 100644 index b0121401..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-006-accepts-valid-commands-without-registry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.accepts-valid-commands-without-registry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Accepts valid commands without registry - -## Intent - -- outcome: Executable scenario: Accepts valid commands without registry - -```gwt -Given a batch of commands: -When the batch is validated in "partial" mode without registry -Then validation succeeds -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-007-accepts-commands-in-different-bounded-contexts.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-007-accepts-commands-in-different-bounded-contexts.sdp.md deleted file mode 100644 index 5a06de67..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-007-accepts-commands-in-different-bounded-contexts.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.accepts-commands-in-different-bounded-contexts -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Accepts commands in different bounded contexts - -## Intent - -- outcome: Executable scenario: Accepts commands in different bounded contexts - -```gwt -Given a batch of commands: -And a registry with entries: -When the batch is validated in "partial" mode with registry -Then validation succeeds -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-008-requires-aggregate-id-option.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-008-requires-aggregate-id-option.sdp.md deleted file mode 100644 index 2a12430b..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-008-requires-aggregate-id-option.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.requires-aggregate-id-option -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Requires aggregateId option - -## Intent - -- outcome: Executable scenario: Requires aggregateId option - -```gwt -Given a batch of commands: -When the batch is validated in "atomic" mode without options -Then validation fails with error code "MISSING_AGGREGATE_ID" -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-009-requires-aggregate-id-field-option.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-009-requires-aggregate-id-field-option.sdp.md deleted file mode 100644 index e7e5e2af..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-009-requires-aggregate-id-field-option.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.requires-aggregate-id-field-option -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Requires aggregateIdField option - -## Intent - -- outcome: Executable scenario: Requires aggregateIdField option - -```gwt -Given a batch of commands: -When the batch is validated in "atomic" mode with only aggregateId "ord_1" -Then validation fails with error code "MISSING_AGGREGATE_ID" -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-010-accepts-when-all-commands-target-same-aggregate.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-010-accepts-when-all-commands-target-same-aggregate.sdp.md deleted file mode 100644 index 6b4b95c8..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-010-accepts-when-all-commands-target-same-aggregate.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.accepts-when-all-commands-target-same-aggregate -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Accepts when all commands target same aggregate - -## Intent - -- outcome: Executable scenario: Accepts when all commands target same aggregate - -```gwt -Given a batch of commands: -When the batch is validated in "atomic" mode with aggregateId "ord_1" and field "orderId" -Then validation succeeds -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-011-rejects-when-commands-target-different-aggregates.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-011-rejects-when-commands-target-different-aggregates.sdp.md deleted file mode 100644 index a7fa2054..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-011-rejects-when-commands-target-different-aggregates.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.rejects-when-commands-target-different-aggregates -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Rejects when commands target different aggregates - -## Intent - -- outcome: Executable scenario: Rejects when commands target different aggregates - -```gwt -Given a batch of commands: -When the batch is validated in "atomic" mode with aggregateId "ord_1" and field "orderId" -Then validation fails with error code "CROSS_AGGREGATE_ATOMIC" at command index 1 -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-012-accepts-commands-targeting-same-aggregate-with-explicit-aggregate-id.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-012-accepts-commands-targeting-same-aggregate-with-explicit-aggregate-id.sdp.md deleted file mode 100644 index 69c1c987..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-012-accepts-commands-targeting-same-aggregate-with-explicit-aggregate-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.accepts-commands-targeting-same-aggregate-with-explicit-aggregate-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Accepts commands targeting same aggregate with explicit aggregateId - -## Intent - -- outcome: Executable scenario: Accepts commands targeting same aggregate with explicit aggregateId - -```gwt -Given a batch of commands: -And the standard atomic registry -When the batch is validated in "atomic" mode with explicit aggregateId "ord_1" and registry -Then validation succeeds -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-013-infers-aggregate-id-from-first-command-when-not-specified.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-013-infers-aggregate-id-from-first-command-when-not-specified.sdp.md deleted file mode 100644 index b3097d5f..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-013-infers-aggregate-id-from-first-command-when-not-specified.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.infers-aggregate-id-from-first-command-when-not-specified -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Infers aggregate ID from first command when not specified - -## Intent - -- outcome: Executable scenario: Infers aggregate ID from first command when not specified - -```gwt -Given a batch of commands: -And the standard atomic registry -When the batch is validated in "atomic" mode with registry only -Then validation succeeds -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-014-rejects-when-commands-target-different-aggregate-instances.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-014-rejects-when-commands-target-different-aggregate-instances.sdp.md deleted file mode 100644 index 5d6b9211..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-014-rejects-when-commands-target-different-aggregate-instances.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.rejects-when-commands-target-different-aggregate-instances -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Rejects when commands target different aggregate instances - -## Intent - -- outcome: Executable scenario: Rejects when commands target different aggregate instances - -```gwt -Given a batch of commands: -And the standard atomic registry -When the batch is validated in "atomic" mode with registry only -Then validation fails with error code "CROSS_AGGREGATE_ATOMIC" -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-015-rejects-when-commands-target-different-aggregate-types.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-015-rejects-when-commands-target-different-aggregate-types.sdp.md deleted file mode 100644 index ba6685f4..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-015-rejects-when-commands-target-different-aggregate-types.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.rejects-when-commands-target-different-aggregate-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Rejects when commands target different aggregate types - -## Intent - -- outcome: Executable scenario: Rejects when commands target different aggregate types - -```gwt -Given a batch of commands: -And the standard atomic registry -When the batch is validated in "atomic" mode with registry only -Then validation fails with error code "CROSS_AGGREGATE_ATOMIC" -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-016-rejects-non-aggregate-commands-in-atomic-mode.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-016-rejects-non-aggregate-commands-in-atomic-mode.sdp.md deleted file mode 100644 index f73c9549..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-016-rejects-non-aggregate-commands-in-atomic-mode.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.rejects-non-aggregate-commands-in-atomic-mode -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Rejects non-aggregate commands in atomic mode - -## Intent - -- outcome: Executable scenario: Rejects non-aggregate commands in atomic mode - -```gwt -Given a batch of commands: -And the standard atomic registry -When the batch is validated in "atomic" mode with registry only -Then validation fails with error code "WRONG_CATEGORY" -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-017-rejects-unregistered-commands.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-017-rejects-unregistered-commands.sdp.md deleted file mode 100644 index 1e1b6430..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-017-rejects-unregistered-commands.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.rejects-unregistered-commands -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Rejects unregistered commands - -## Intent - -- outcome: Executable scenario: Rejects unregistered commands - -```gwt -Given a batch of commands: -And the standard atomic registry -When the batch is validated in "atomic" mode with registry only -Then validation fails with error code "UNREGISTERED_COMMAND" at command index 1 -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-018-accepts-commands-matching-specified-bounded-context.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-018-accepts-commands-matching-specified-bounded-context.sdp.md deleted file mode 100644 index 4805376c..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-018-accepts-commands-matching-specified-bounded-context.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.accepts-commands-matching-specified-bounded-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Accepts commands matching specified bounded context - -## Intent - -- outcome: Executable scenario: Accepts commands matching specified bounded context - -```gwt -Given a batch of commands: -And a registry with entries: -When the batch is validated in "partial" mode with boundedContext "orders" and registry -Then validation succeeds -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-019-rejects-commands-from-wrong-bounded-context.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-019-rejects-commands-from-wrong-bounded-context.sdp.md deleted file mode 100644 index 57bb3b80..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-019-rejects-commands-from-wrong-bounded-context.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.rejects-commands-from-wrong-bounded-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Rejects commands from wrong bounded context - -## Intent - -- outcome: Executable scenario: Rejects commands from wrong bounded context - -```gwt -Given a batch of commands: -And a registry with entries: -When the batch is validated in "partial" mode with boundedContext "orders" and registry -Then validation fails with error code "WRONG_BOUNDED_CONTEXT" at command index 1 -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-020-extracts-id-from-command-args.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-020-extracts-id-from-command-args.sdp.md deleted file mode 100644 index aae34e5e..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-020-extracts-id-from-command-args.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.extracts-id-from-command-args -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Extracts ID from command args - -## Intent - -- outcome: Executable scenario: Extracts ID from command args - -```gwt -Given a command "AddOrderItem" with args {"orderId": "ord_123", "productId": "prod_456"} -When extractAggregateId is called with field "orderId" -Then the extracted ID is "ord_123" -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-021-returns-undefined-for-missing-field.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-021-returns-undefined-for-missing-field.sdp.md deleted file mode 100644 index d8cc24a4..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-021-returns-undefined-for-missing-field.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.returns-undefined-for-missing-field -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Returns undefined for missing field - -## Intent - -- outcome: Executable scenario: Returns undefined for missing field - -```gwt -Given a command "AddOrderItem" with args {"productId": "prod_456"} -When extractAggregateId is called with field "orderId" -Then the extracted ID is undefined -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-022-returns-undefined-for-non-string-value.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-022-returns-undefined-for-non-string-value.sdp.md deleted file mode 100644 index cf86de12..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-022-returns-undefined-for-non-string-value.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.returns-undefined-for-non-string-value -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Returns undefined for non-string value - -## Intent - -- outcome: Executable scenario: Returns undefined for non-string value - -```gwt -Given a command "AddOrderItem" with args {"orderId": 123} -When extractAggregateId is called with field "orderId" -Then the extracted ID is undefined -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-023-groups-commands-by-aggregate-id.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-023-groups-commands-by-aggregate-id.sdp.md deleted file mode 100644 index d9c4f0b0..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-023-groups-commands-by-aggregate-id.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.groups-commands-by-aggregate-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Groups commands by aggregate ID - -## Intent - -- outcome: Executable scenario: Groups commands by aggregate ID - -```gwt -Given a batch of commands: -When groupByAggregateId is called with field "orderId" -Then there are 2 groups -And group "ord_1" has 2 commands -And group "ord_2" has 1 command -``` diff --git a/specs/behavior/platform-core/batch/validation.examples/s-024-uses-placeholder-for-missing-i-ds.sdp.md b/specs/behavior/platform-core/batch/validation.examples/s-024-uses-placeholder-for-missing-i-ds.sdp.md deleted file mode 100644 index 5325949c..00000000 --- a/specs/behavior/platform-core/batch/validation.examples/s-024-uses-placeholder-for-missing-i-ds.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.batch.validation.uses-placeholder-for-missing-i-ds -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.batch.validation ---- -# Uses placeholder for missing IDs - -## Intent - -- outcome: Executable scenario: Uses placeholder for missing IDs - -```gwt -Given a batch of commands: -When groupByAggregateId is called with field "orderId" -Then there are 2 groups -And group "ord_1" has 1 command -And group "__no_id__" has 1 command -``` diff --git a/specs/behavior/platform-core/batch/validation.sdp.md b/specs/behavior/platform-core/batch/validation.sdp.md index d4679eac..596385d6 100644 --- a/specs/behavior/platform-core/batch/validation.sdp.md +++ b/specs/behavior/platform-core/batch/validation.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.batch.validation kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: pre-flight validation for batch command execution so that invalid batches are rejected before processing begins +- outcome: Reject invalid batches in pre-flight validation before any command is processed. +- value: Commands are checked for emptiness, size, atomic single-aggregate scope, and bounded-context filters before execution begins. ## Behavior diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-001-state-at-current-version-is-returned-as-is.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-001-state-at-current-version-is-returned-as-is.sdp.md deleted file mode 100644 index cddafd7d..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-001-state-at-current-version-is-returned-as-is.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.state-at-current-version-is-returned-as-is -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# State at current version is returned as-is - -## Intent - -- outcome: Executable scenario: State at current version is returned as-is - -```gwt -Given the module is imported from platform-core -And a CMS upcaster from version 1 to version 2 -And a v2 CMS state with id "test_1" and name "Test" and description "Already at v2" -When the CMS upcaster is applied -Then the result was not upcasted -And the original state version is 2 -And the CMS state equals the input state -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-002-state-is-migrated-from-v1-to-v2.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-002-state-is-migrated-from-v1-to-v2.sdp.md deleted file mode 100644 index fbfa64ab..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-002-state-is-migrated-from-v1-to-v2.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.state-is-migrated-from-v1-to-v2 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# State is migrated from v1 to v2 - -## Intent - -- outcome: Executable scenario: State is migrated from v1 to v2 - -```gwt -Given the module is imported from platform-core -And a CMS upcaster from version 1 to version 2 -And a v1 CMS state with id "test_1" and name "Test" -When the CMS upcaster is applied -Then the result was upcasted -And the original state version is 1 -And the CMS stateVersion is 2 -And the CMS description is "Migrated from v1" -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-003-state-is-migrated-from-v1-to-v3.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-003-state-is-migrated-from-v1-to-v3.sdp.md deleted file mode 100644 index 238d3954..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-003-state-is-migrated-from-v1-to-v3.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.state-is-migrated-from-v1-to-v3 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# State is migrated from v1 to v3 - -## Intent - -- outcome: Executable scenario: State is migrated from v1 to v3 - -```gwt -Given the module is imported from platform-core -And a CMS upcaster from version 1 to version 3 -And a v1 CMS state with id "test_1" and name "Test" -When the CMS upcaster is applied -Then the result was upcasted -And the original state version is 1 -And the CMS stateVersion is 3 -And the CMS description is "Added in v2" -And the CMS priority is "medium" -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-004-legacy-state-without-state-version-is-treated-as-version-0.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-004-legacy-state-without-state-version-is-treated-as-version-0.sdp.md deleted file mode 100644 index d8a8e7b2..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-004-legacy-state-without-state-version-is-treated-as-version-0.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.legacy-state-without-state-version-is-treated-as-version-0 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Legacy state without stateVersion is treated as version 0 - -## Intent - -- outcome: Executable scenario: Legacy state without stateVersion is treated as version 0 - -```gwt -Given the module is imported from platform-core -And a CMS upcaster from version 0 to version 2 with legacy support -And a legacy CMS state with id "legacy_1" and name "Legacy" -When the CMS upcaster is applied -Then the result was upcasted -And the original state version is 0 -And the CMS stateVersion is 2 -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-005-null-input-throws-cms-upcaster-error.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-005-null-input-throws-cms-upcaster-error.sdp.md deleted file mode 100644 index 0ede2ba8..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-005-null-input-throws-cms-upcaster-error.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.null-input-throws-cms-upcaster-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Future schema version throws FUTURE_VERSION error - -## Intent - -- outcome: Executable scenario: Future schema version throws FUTURE_VERSION error - -```gwt -Given an upcaster from version 1 to version 2 -And a v5 event with orderId "order_1" and customerId "cust_1" -When the upcaster is applied expecting an error -Then it throws an EventUpcasterError -And the error message contains "is newer than current version" -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-006-undefined-input-throws-cms-upcaster-error.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-006-undefined-input-throws-cms-upcaster-error.sdp.md deleted file mode 100644 index 0b5da446..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-006-undefined-input-throws-cms-upcaster-error.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.undefined-input-throws-cms-upcaster-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Validation passes after migration - -## Intent - -- outcome: Executable scenario: Validation passes after migration - -```gwt -Given an upcaster from version 1 to version 2 with a validator that checks createdAt is a number -And a v1 event with orderId "order_1" and customerId "cust_1" -When the upcaster is applied -Then the result was upcasted -And the event payload has a defined createdAt field -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-007-incomplete-migration-chain-throws-at-creation-time.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-007-incomplete-migration-chain-throws-at-creation-time.sdp.md deleted file mode 100644 index 0ad26c59..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-007-incomplete-migration-chain-throws-at-creation-time.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.incomplete-migration-chain-throws-at-creation-time -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Incomplete migration chain throws at creation time - -## Intent - -- outcome: Executable scenario: Incomplete migration chain throws at creation time - -```gwt -Given the module is imported from platform-core -When a CMS upcaster is created with current version 3 but only a v1 migration -Then it throws an error containing "Missing migration for version 2" -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-008-future-state-version-throws-cms-upcaster-error.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-008-future-state-version-throws-cms-upcaster-error.sdp.md deleted file mode 100644 index 438e887b..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-008-future-state-version-throws-cms-upcaster-error.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.future-state-version-throws-cms-upcaster-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Registry reports registered and unregistered event types - -## Intent - -- outcome: Executable scenario: Registry reports registered and unregistered event types - -```gwt -Given an upcaster registry with "OrderCreated" registered -When the scenario runs -Then the registry has "OrderCreated" -And the registry does not have "UnregisteredEvent" -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-009-migration-function-error-propagates-mid-chain.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-009-migration-function-error-propagates-mid-chain.sdp.md deleted file mode 100644 index e843f9ce..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-009-migration-function-error-propagates-mid-chain.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.migration-function-error-propagates-mid-chain -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Migration function error propagates mid-chain - -## Intent - -- outcome: Executable scenario: Migration function error propagates mid-chain - -```gwt -Given the module is imported from platform-core -And a CMS upcaster from v1 to v3 where v2-to-v3 migration throws -And a v1 CMS state with id "test_1" and name "Test" -When the CMS upcaster is applied expecting an error -Then the error message contains "Migration v2->v3 failed: data corruption detected" -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-010-first-migration-function-error-propagates.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-010-first-migration-function-error-propagates.sdp.md deleted file mode 100644 index c3d3b786..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-010-first-migration-function-error-propagates.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.first-migration-function-error-propagates -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# First migration function error propagates - -## Intent - -- outcome: Executable scenario: First migration function error propagates - -```gwt -Given the module is imported from platform-core -And a CMS upcaster from v1 to v2 where v1 migration throws -And a v1 CMS state with id "test_1" and name "Test" -When the CMS upcaster is applied expecting an error -Then the error message contains "Invalid v1 state structure" -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-011-state-at-current-version-is-returned-as-is-via-upcast-if-needed.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-011-state-at-current-version-is-returned-as-is-via-upcast-if-needed.sdp.md deleted file mode 100644 index 8d38d25d..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-011-state-at-current-version-is-returned-as-is-via-upcast-if-needed.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.state-at-current-version-is-returned-as-is-via-upcast-if-needed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# State at current version is returned as-is via upcastIfNeeded - -## Intent - -- outcome: Executable scenario: State at current version is returned as-is via upcastIfNeeded - -```gwt -Given the module is imported from platform-core -And a v2 CMS state with id "test_1" and description "Current version" -When upcastIfNeeded is called with target version 2 -Then the result was not upcasted -And the original state version is 2 -And the CMS description is "Current version" -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-012-state-is-migrated-via-upcast-if-needed.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-012-state-is-migrated-via-upcast-if-needed.sdp.md deleted file mode 100644 index 79707b88..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-012-state-is-migrated-via-upcast-if-needed.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.state-is-migrated-via-upcast-if-needed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# State is migrated via upcastIfNeeded - -## Intent - -- outcome: Executable scenario: State is migrated via upcastIfNeeded - -```gwt -Given the module is imported from platform-core -And a v1 CMS state with id "test_1" and name "Test" -When upcastIfNeeded is called with target version 2 and migration -Then the result was upcasted -And the original state version is 1 -And the CMS description is "Migrated" -And the CMS stateVersion is 2 -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-013-validation-passes-when-state-is-valid.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-013-validation-passes-when-state-is-valid.sdp.md deleted file mode 100644 index 1c6b3f98..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-013-validation-passes-when-state-is-valid.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.validation-passes-when-state-is-valid -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Validation passes when state is valid - -## Intent - -- outcome: Executable scenario: Validation passes when state is valid - -```gwt -Given the module is imported from platform-core -And a v2 CMS state with id "test_1" and description "Valid" -When upcastIfNeeded is called with target version 2 and validation -Then the result was not upcasted -And the CMS state equals the input state -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-014-validation-fails-when-state-is-invalid.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-014-validation-fails-when-state-is-invalid.sdp.md deleted file mode 100644 index f6ba5cf4..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-014-validation-fails-when-state-is-invalid.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.validation-fails-when-state-is-invalid -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Validation fails when state is invalid - -## Intent - -- outcome: Executable scenario: Validation fails when state is invalid - -```gwt -Given the module is imported from platform-core -And a v2 CMS state without description field -When upcastIfNeeded is called with target version 2 and validation expecting error -Then it throws a CMSUpcasterError -And the error message contains "fails validation" -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-015-future-state-version-throws-cms-upcaster-error-via-upcast-if-needed.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-015-future-state-version-throws-cms-upcaster-error-via-upcast-if-needed.sdp.md deleted file mode 100644 index 29cee5fd..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-015-future-state-version-throws-cms-upcaster-error-via-upcast-if-needed.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.future-state-version-throws-cms-upcaster-error-via-upcast-if-needed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Field is renamed in the payload - -## Intent - -- outcome: Executable scenario: Field is renamed in the payload - -```gwt -Given a renameFieldMigration from "userId" to "customerId" at version 2 -And an event with payload userId "user_123" -When the rename migration is applied -Then the payload field "customerId" is "user_123" -And the payload field "userId" is undefined -And the schema version is 2 -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-016-error-has-correct-name.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-016-error-has-correct-name.sdp.md deleted file mode 100644 index ac45815d..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-016-error-has-correct-name.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.error-has-correct-name -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Error has correct name - -## Intent - -- outcome: Executable scenario: Error has correct name - -```gwt -Given the module is imported from platform-core -And a CMSUpcasterError with code "NULL_STATE" and message "Test error" -When the scenario runs -Then the error name is "CMSUpcasterError" -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-017-error-has-correct-code.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-017-error-has-correct-code.sdp.md deleted file mode 100644 index e6c21f48..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-017-error-has-correct-code.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.error-has-correct-code -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Error has correct code - -## Intent - -- outcome: Executable scenario: Error has correct code - -```gwt -Given the module is imported from platform-core -And a CMSUpcasterError with code "MISSING_MIGRATION" and message "Test error" -When the scenario runs -Then the error code is "MISSING_MIGRATION" -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-018-error-has-correct-message.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-018-error-has-correct-message.sdp.md deleted file mode 100644 index a71aea21..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-018-error-has-correct-message.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.error-has-correct-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Error has correct message - -## Intent - -- outcome: Executable scenario: Error has correct message - -```gwt -Given the module is imported from platform-core -And a CMSUpcasterError with code "INVALID_STATE" and message "Custom message" -When the scenario runs -Then the error message text is "Custom message" -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-019-error-stores-context-when-provided.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-019-error-stores-context-when-provided.sdp.md deleted file mode 100644 index 01efce97..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-019-error-stores-context-when-provided.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.error-stores-context-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Error stores context when provided - -## Intent - -- outcome: Executable scenario: Error stores context when provided - -```gwt -Given the module is imported from platform-core -And a CMSUpcasterError with code "INVALID_STATE" and message "Error" and context: -When the scenario runs -Then the error context matches: -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-020-error-has-undefined-context-when-not-provided.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-020-error-has-undefined-context-when-not-provided.sdp.md deleted file mode 100644 index 289c4041..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-020-error-has-undefined-context-when-not-provided.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.error-has-undefined-context-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Error has undefined context when not provided - -## Intent - -- outcome: Executable scenario: Error has undefined context when not provided - -```gwt -Given the module is imported from platform-core -And a CMSUpcasterError with code "NULL_STATE" and message "Error" -When the scenario runs -Then the error context is undefined -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-021-error-is-instanceof-error.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-021-error-is-instanceof-error.sdp.md deleted file mode 100644 index c7352688..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-021-error-is-instanceof-error.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.error-is-instanceof-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Error is instanceof Error - -## Intent - -- outcome: Executable scenario: Error is instanceof Error - -```gwt -Given the module is imported from platform-core -And a CMSUpcasterError with code "NULL_STATE" and message "Error" -When the scenario runs -Then the error is an instance of Error -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-022-validation-passes-for-current-version-state.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-022-validation-passes-for-current-version-state.sdp.md deleted file mode 100644 index 05e6586d..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-022-validation-passes-for-current-version-state.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.validation-passes-for-current-version-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Validation passes for current version state - -## Intent - -- outcome: Executable scenario: Validation passes for current version state - -```gwt -Given the module is imported from platform-core -And a CMS upcaster with validation that checks description is a string -And a v2 CMS state with id "test_1" and description "Valid" -When the CMS upcaster is applied -Then the result was not upcasted -And the CMS state equals the input state -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-023-validation-fails-for-current-version-state-with-empty-description.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-023-validation-fails-for-current-version-state-with-empty-description.sdp.md deleted file mode 100644 index d9f38df1..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-023-validation-fails-for-current-version-state-with-empty-description.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.validation-fails-for-current-version-state-with-empty-description -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Validation fails for current version state with empty description - -## Intent - -- outcome: Executable scenario: Validation fails for current version state with empty description - -```gwt -Given the module is imported from platform-core -And a CMS upcaster with validation that checks description is non-empty -And a v2 CMS state with id "test_1" and description "" -When the CMS upcaster is applied expecting an error -Then it throws a CMSUpcasterError -And the error message contains "fails validation" -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-024-validation-passes-after-upcasting-from-v1.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-024-validation-passes-after-upcasting-from-v1.sdp.md deleted file mode 100644 index 40d35079..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-024-validation-passes-after-upcasting-from-v1.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.validation-passes-after-upcasting-from-v1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Validation passes after upcasting from v1 - -## Intent - -- outcome: Executable scenario: Validation passes after upcasting from v1 - -```gwt -Given the module is imported from platform-core -And a CMS upcaster with validation that checks description is a string -And a v1 CMS state with id "test_1" and name "Test" -When the CMS upcaster is applied -Then the result was upcasted -And the CMS description is "Migrated successfully" -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-025-validation-fails-after-upcasting-produces-invalid-state.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-025-validation-fails-after-upcasting-produces-invalid-state.sdp.md deleted file mode 100644 index aa95cd3b..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-025-validation-fails-after-upcasting-produces-invalid-state.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.validation-fails-after-upcasting-produces-invalid-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Validation fails after upcasting produces invalid state - -## Intent - -- outcome: Executable scenario: Validation fails after upcasting produces invalid state - -```gwt -Given the module is imported from platform-core -And a CMS upcaster with validation that checks description is non-empty and migration produces empty -And a v1 CMS state with id "test_1" and name "Test" -When the CMS upcaster is applied expecting an error -Then it throws a CMSUpcasterError -And the error message contains "Upcasted CMS failed validation" -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-026-static-default-value-is-added.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-026-static-default-value-is-added.sdp.md deleted file mode 100644 index 16555c80..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-026-static-default-value-is-added.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.static-default-value-is-added -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Static default value is added - -## Intent - -- outcome: Executable scenario: Static default value is added - -```gwt -Given the module is imported from platform-core -And an addCMSFieldMigration for "priority" with default "standard" to version 2 -And a base CMS state with id "test_1" and name "Test" at version 1 -When the CMS field migration is applied -Then the CMS field "priority" is "standard" -And the CMS field "name" is "Test" -And the CMS stateVersion is 2 -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-027-computed-default-value-is-added.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-027-computed-default-value-is-added.sdp.md deleted file mode 100644 index 022056ef..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-027-computed-default-value-is-added.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.computed-default-value-is-added -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Computed default value is added - -## Intent - -- outcome: Executable scenario: Computed default value is added - -```gwt -Given the module is imported from platform-core -And an addCMSFieldMigration for "createdAt" with computed value 1704067200000 to version 2 -And a base CMS state with id "test_1" at version 1 -When the CMS field migration is applied -Then the CMS field "createdAt" is 1704067200000 -And the CMS stateVersion is 2 -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-028-computed-default-accesses-state.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-028-computed-default-accesses-state.sdp.md deleted file mode 100644 index 28162c12..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-028-computed-default-accesses-state.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.computed-default-accesses-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Computed default accesses state - -## Intent - -- outcome: Executable scenario: Computed default accesses state - -```gwt -Given the module is imported from platform-core -And an addCMSFieldMigration for "displayName" computed from orderId to version 2 -And a base CMS state with orderId "order_123" at version 1 -When the CMS field migration is applied -Then the CMS field "displayName" is "Order order_123" -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-029-existing-fields-are-preserved.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-029-existing-fields-are-preserved.sdp.md deleted file mode 100644 index 2869a4b7..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-029-existing-fields-are-preserved.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.existing-fields-are-preserved -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Existing fields are preserved - -## Intent - -- outcome: Executable scenario: Existing fields are preserved - -```gwt -Given the module is imported from platform-core -And an addCMSFieldMigration for "newField" with default "value" to version 2 -And a base CMS state with existingField "existing" and anotherField 42 at version 1 with version 5 -When the CMS field migration is applied -Then the CMS field "existingField" is "existing" -And the CMS field "anotherField" is 42 -And the CMS version is 5 -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-030-field-is-renamed.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-030-field-is-renamed.sdp.md deleted file mode 100644 index 79e07f35..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-030-field-is-renamed.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.field-is-renamed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Field is renamed - -## Intent - -- outcome: Executable scenario: Field is renamed - -```gwt -Given the module is imported from platform-core -And a renameCMSFieldMigration from "userId" to "customerId" at version 2 -And a CMS state with userId "user_123" and name "Test" at version 1 -When the CMS rename migration is applied -Then the CMS field "customerId" is "user_123" -And the CMS field "userId" is undefined -And the CMS field "name" is "Test" -And the CMS stateVersion is 2 -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-031-other-fields-are-preserved-when-renaming.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-031-other-fields-are-preserved-when-renaming.sdp.md deleted file mode 100644 index f17b12cb..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-031-other-fields-are-preserved-when-renaming.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.other-fields-are-preserved-when-renaming -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Other fields are preserved when renaming - -## Intent - -- outcome: Executable scenario: Other fields are preserved when renaming - -```gwt -Given the module is imported from platform-core -And a renameCMSFieldMigration from "oldName" to "newName" at version 2 -And a CMS state with oldName "value" and otherField1 "keep1" and otherField2 42 at version 1 with version 3 -When the CMS rename migration is applied -Then the CMS field "otherField1" is "keep1" -And the CMS field "otherField2" is 42 -And the CMS version is 3 -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-032-undefined-value-in-renamed-field-is-handled.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-032-undefined-value-in-renamed-field-is-handled.sdp.md deleted file mode 100644 index dca7fc23..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-032-undefined-value-in-renamed-field-is-handled.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.undefined-value-in-renamed-field-is-handled -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Undefined value in renamed field is handled - -## Intent - -- outcome: Executable scenario: Undefined value in renamed field is handled - -```gwt -Given the module is imported from platform-core -And a renameCMSFieldMigration from "optionalField" to "renamedOptional" at version 2 -And a base CMS state at version 1 -When the CMS rename migration is applied -Then the CMS field "renamedOptional" is undefined -And the CMS stateVersion is 2 -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-033-specified-field-is-removed.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-033-specified-field-is-removed.sdp.md deleted file mode 100644 index 8287057c..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-033-specified-field-is-removed.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.specified-field-is-removed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Specified field is removed - -## Intent - -- outcome: Executable scenario: Specified field is removed - -```gwt -Given the module is imported from platform-core -And a removeCMSFieldMigration for "deprecatedField" at version 2 -And a CMS state with deprecatedField "old value" and keepField "keep me" at version 1 -When the CMS remove migration is applied -Then the CMS field "deprecatedField" is undefined -And the CMS field "keepField" is "keep me" -And the CMS stateVersion is 2 -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-034-other-fields-are-preserved-when-removing.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-034-other-fields-are-preserved-when-removing.sdp.md deleted file mode 100644 index d7b0fac2..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-034-other-fields-are-preserved-when-removing.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.other-fields-are-preserved-when-removing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Other fields are preserved when removing - -## Intent - -- outcome: Executable scenario: Other fields are preserved when removing - -```gwt -Given the module is imported from platform-core -And a removeCMSFieldMigration for "toRemove" at version 2 -And a CMS state with toRemove "bye" and field1 "a" and field2 "b" and nested data at version 1 with version 5 -When the CMS remove migration is applied -Then the CMS field "field1" is "a" -And the CMS field "field2" is "b" -And the CMS nested field equals data 123 -And the CMS version is 5 -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-035-non-existent-field-is-handled-gracefully.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-035-non-existent-field-is-handled-gracefully.sdp.md deleted file mode 100644 index 7a26c784..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-035-non-existent-field-is-handled-gracefully.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.non-existent-field-is-handled-gracefully -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Non-existent field is handled gracefully - -## Intent - -- outcome: Executable scenario: Non-existent field is handled gracefully - -```gwt -Given the module is imported from platform-core -And a removeCMSFieldMigration for "nonExistent" at version 2 -And a CMS state with existingField "value" at version 1 -When the CMS remove migration is applied -Then the CMS field "existingField" is "value" -And the CMS stateVersion is 2 -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-036-add-cms-field-migration-works-in-migration-chain.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-036-add-cms-field-migration-works-in-migration-chain.sdp.md deleted file mode 100644 index bdfb89d2..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-036-add-cms-field-migration-works-in-migration-chain.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.add-cms-field-migration-works-in-migration-chain -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# addCMSFieldMigration works in migration chain - -## Intent - -- outcome: Executable scenario: addCMSFieldMigration works in migration chain - -```gwt -Given the module is imported from platform-core -And a CMS upcaster using addCMSFieldMigration for description -And a v1 CMS state with id "test_1" and name "Test" -When the CMS upcaster is applied -Then the result was upcasted -And the CMS description is "Added via helper" -And the CMS stateVersion is 2 -``` diff --git a/specs/behavior/platform-core/cms/upcaster.examples/s-037-multiple-helper-migrations-are-chained.sdp.md b/specs/behavior/platform-core/cms/upcaster.examples/s-037-multiple-helper-migrations-are-chained.sdp.md deleted file mode 100644 index 7d7bc106..00000000 --- a/specs/behavior/platform-core/cms/upcaster.examples/s-037-multiple-helper-migrations-are-chained.sdp.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: spec:behavior.platform-core.cms.upcaster.multiple-helper-migrations-are-chained -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.cms.upcaster ---- -# Multiple helper migrations are chained - -## Intent - -- outcome: Executable scenario: Multiple helper migrations are chained - -```gwt -Given the module is imported from platform-core -And a CMS upcaster chaining rename and add helper migrations -And a CMS state with userId "user_456" at version 1 -When the CMS upcaster is applied -Then the result was upcasted -And the original state version is 1 -And the CMS field "customerId" is "user_456" -And the CMS field "userId" is undefined -And the CMS field "priority" is "normal" -And the CMS stateVersion is 3 -``` diff --git a/specs/behavior/platform-core/cms/upcaster.sdp.md b/specs/behavior/platform-core/cms/upcaster.sdp.md index 030ab173..b8991486 100644 --- a/specs/behavior/platform-core/cms/upcaster.sdp.md +++ b/specs/behavior/platform-core/cms/upcaster.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.cms.upcaster kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,8 +10,8 @@ relations: ## Intent -- actor: a platform developer -- outcome: CMS schema evolution utilities with chain-based migration so that CMS state can be transparently upgraded to the latest schema version +- outcome: Provide chain-based CMS schema-evolution utilities so stored CMS state upgrades transparently to the latest schema version. +- value: createUpcaster, upcastIfNeeded, and field-helper migrations migrate documents without rewriting callers. ## Behavior diff --git a/specs/behavior/platform-core/commands/categories.examples/s-001-command-categories-has-exactly-four-entries-in-the-correct-order.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-001-command-categories-has-exactly-four-entries-in-the-correct-order.sdp.md deleted file mode 100644 index 8f267b71..00000000 --- a/specs/behavior/platform-core/commands/categories.examples/s-001-command-categories-has-exactly-four-entries-in-the-correct-order.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.categories.command-categories-has-exactly-four-entries-in-the-correct-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.categories ---- -# COMMAND_CATEGORIES has exactly four entries in the correct order - -## Intent - -- outcome: Executable scenario: COMMAND_CATEGORIES has exactly four entries in the correct order - -```gwt -Given the COMMAND_CATEGORIES constant -When the scenario runs -Then it has length 4 -And the categories in order are: -``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-002-schema-accepts-valid-category-strings.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-002-schema-accepts-valid-category-strings.sdp.md deleted file mode 100644 index d038e6db..00000000 --- a/specs/behavior/platform-core/commands/categories.examples/s-002-schema-accepts-valid-category-strings.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.categories.schema-accepts-valid-category-strings -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.categories ---- -# Schema accepts valid category strings - -## Intent - -- outcome: Executable scenario: Schema accepts valid category strings - -```gwt -Given the feature fixture is in place -When the following values are parsed with CommandCategorySchema: -Then each parse returns the input value unchanged -``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-003-schema-rejects-invalid-category-values.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-003-schema-rejects-invalid-category-values.sdp.md deleted file mode 100644 index 610e4da3..00000000 --- a/specs/behavior/platform-core/commands/categories.examples/s-003-schema-rejects-invalid-category-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.categories.schema-rejects-invalid-category-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.categories ---- -# Schema rejects invalid category values - -## Intent - -- outcome: Executable scenario: Schema rejects invalid category values - -```gwt -Given the feature fixture is in place -When the following invalid values are parsed with CommandCategorySchema: -Then each parse throws a validation error -``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-004-default-command-category-is-aggregate.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-004-default-command-category-is-aggregate.sdp.md deleted file mode 100644 index 154d4fdc..00000000 --- a/specs/behavior/platform-core/commands/categories.examples/s-004-default-command-category-is-aggregate.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.categories.default-command-category-is-aggregate -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.categories ---- -# DEFAULT_COMMAND_CATEGORY is aggregate - -## Intent - -- outcome: Executable scenario: DEFAULT_COMMAND_CATEGORY is aggregate - -```gwt -Given the feature fixture is in place -When the scenario runs -Then DEFAULT_COMMAND_CATEGORY equals "aggregate" -``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-005-type-guard-accepts-all-valid-categories.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-005-type-guard-accepts-all-valid-categories.sdp.md deleted file mode 100644 index a8de436a..00000000 --- a/specs/behavior/platform-core/commands/categories.examples/s-005-type-guard-accepts-all-valid-categories.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.categories.type-guard-accepts-all-valid-categories -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.categories ---- -# Type guard accepts all valid categories - -## Intent - -- outcome: Executable scenario: Type guard accepts all valid categories - -```gwt -Given the feature fixture is in place -When isCommandCategory is called with the following values: -Then each call returns true -``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-006-type-guard-rejects-invalid-values.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-006-type-guard-rejects-invalid-values.sdp.md deleted file mode 100644 index 29d4f96d..00000000 --- a/specs/behavior/platform-core/commands/categories.examples/s-006-type-guard-rejects-invalid-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.categories.type-guard-rejects-invalid-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.categories ---- -# Type guard rejects invalid values - -## Intent - -- outcome: Executable scenario: Type guard rejects invalid values - -```gwt -Given the feature fixture is in place -When isCommandCategory is called with the following invalid values: -Then each call returns false -``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-007-valid-categories-are-returned-unchanged.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-007-valid-categories-are-returned-unchanged.sdp.md deleted file mode 100644 index eb45bfbc..00000000 --- a/specs/behavior/platform-core/commands/categories.examples/s-007-valid-categories-are-returned-unchanged.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.categories.valid-categories-are-returned-unchanged -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.categories ---- -# Valid categories are returned unchanged - -## Intent - -- outcome: Executable scenario: Valid categories are returned unchanged - -```gwt -Given the feature fixture is in place -When normalizeCommandCategory is called with valid categories: -Then each call returns the expected category -``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-008-invalid-values-normalize-to-aggregate.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-008-invalid-values-normalize-to-aggregate.sdp.md deleted file mode 100644 index b4bab506..00000000 --- a/specs/behavior/platform-core/commands/categories.examples/s-008-invalid-values-normalize-to-aggregate.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.categories.invalid-values-normalize-to-aggregate -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.categories ---- -# Invalid values normalize to aggregate - -## Intent - -- outcome: Executable scenario: Invalid values normalize to aggregate - -```gwt -Given the feature fixture is in place -When normalizeCommandCategory is called with invalid values: -Then each call returns "aggregate" -``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-009-classification-of-categories-as-aggregate.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-009-classification-of-categories-as-aggregate.sdp.md deleted file mode 100644 index 87eb3387..00000000 --- a/specs/behavior/platform-core/commands/categories.examples/s-009-classification-of-categories-as-aggregate.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.categories.classification-of-categories-as-aggregate -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.categories ---- -# Classification of categories as aggregate - -## Intent - -- outcome: Executable scenario: Classification of categories as aggregate - -```gwt -Given the feature fixture is in place -When isAggregateCommand is called with each category: -Then each call returns the expected aggregate classification -``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-010-classification-of-categories-as-process.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-010-classification-of-categories-as-process.sdp.md deleted file mode 100644 index ad36dbde..00000000 --- a/specs/behavior/platform-core/commands/categories.examples/s-010-classification-of-categories-as-process.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.categories.classification-of-categories-as-process -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.categories ---- -# Classification of categories as process - -## Intent - -- outcome: Executable scenario: Classification of categories as process - -```gwt -Given the feature fixture is in place -When isProcessCommand is called with each category: -Then each call returns the expected process classification -``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-011-classification-of-categories-as-system.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-011-classification-of-categories-as-system.sdp.md deleted file mode 100644 index c6854394..00000000 --- a/specs/behavior/platform-core/commands/categories.examples/s-011-classification-of-categories-as-system.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.categories.classification-of-categories-as-system -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.categories ---- -# Classification of categories as system - -## Intent - -- outcome: Executable scenario: Classification of categories as system - -```gwt -Given the feature fixture is in place -When isSystemCommand is called with each category: -Then each call returns the expected system classification -``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-012-classification-of-categories-as-batch.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-012-classification-of-categories-as-batch.sdp.md deleted file mode 100644 index 811fc676..00000000 --- a/specs/behavior/platform-core/commands/categories.examples/s-012-classification-of-categories-as-batch.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.categories.classification-of-categories-as-batch -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.categories ---- -# Classification of categories as batch - -## Intent - -- outcome: Executable scenario: Classification of categories as batch - -```gwt -Given the feature fixture is in place -When isBatchCommand is called with each category: -Then each call returns the expected batch classification -``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-013-schema-accepts-valid-aggregate-targets.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-013-schema-accepts-valid-aggregate-targets.sdp.md deleted file mode 100644 index 73a07f68..00000000 --- a/specs/behavior/platform-core/commands/categories.examples/s-013-schema-accepts-valid-aggregate-targets.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.categories.schema-accepts-valid-aggregate-targets -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.categories ---- -# Schema accepts valid aggregate targets - -## Intent - -- outcome: Executable scenario: Schema accepts valid aggregate targets - -```gwt -Given the feature fixture is in place -When an aggregate target with type "Order" and idField "orderId" is parsed -Then the parsed result equals the input target -``` diff --git a/specs/behavior/platform-core/commands/categories.examples/s-014-schema-rejects-invalid-aggregate-targets.sdp.md b/specs/behavior/platform-core/commands/categories.examples/s-014-schema-rejects-invalid-aggregate-targets.sdp.md deleted file mode 100644 index 8726bd27..00000000 --- a/specs/behavior/platform-core/commands/categories.examples/s-014-schema-rejects-invalid-aggregate-targets.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.categories.schema-rejects-invalid-aggregate-targets -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.categories ---- -# Schema rejects invalid aggregate targets - -## Intent - -- outcome: Executable scenario: Schema rejects invalid aggregate targets - -```gwt -Given the feature fixture is in place -When the following invalid aggregate targets are parsed: -Then each parse throws a validation error -``` diff --git a/specs/behavior/platform-core/commands/categories.sdp.md b/specs/behavior/platform-core/commands/categories.sdp.md index 99f90bcd..06af4aac 100644 --- a/specs/behavior/platform-core/commands/categories.sdp.md +++ b/specs/behavior/platform-core/commands/categories.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.commands.categories kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,8 +10,8 @@ relations: ## Intent -- actor: a platform developer -- outcome: command taxonomy utilities with type-safe categories so that commands are correctly classified and validated at runtime +- outcome: Classify and validate command categories at runtime with type-safe taxonomy utilities. +- value: Commands stay correctly classified as aggregate, process, system, or batch. ## Behavior diff --git a/specs/behavior/platform-core/commands/errors.examples/s-001-error-categories-has-exactly-four-entries-with-correct-values.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-001-error-categories-has-exactly-four-entries-with-correct-values.sdp.md deleted file mode 100644 index f1b4cb52..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-001-error-categories-has-exactly-four-entries-with-correct-values.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.error-categories-has-exactly-four-entries-with-correct-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# ERROR_CATEGORIES has exactly four entries with correct values - -## Intent - -- outcome: Executable scenario: ERROR_CATEGORIES has exactly four entries with correct values - -```gwt -Given the ERROR_CATEGORIES constant -When the scenario runs -Then it has length 4 -And it contains all categories: -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-002-error-category-members-have-correct-string-values.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-002-error-category-members-have-correct-string-values.sdp.md deleted file mode 100644 index 43a3b199..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-002-error-category-members-have-correct-string-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.error-category-members-have-correct-string-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# ErrorCategory members have correct string values - -## Intent - -- outcome: Executable scenario: ErrorCategory members have correct string values - -```gwt -Given the feature fixture is in place -When the scenario runs -Then the ErrorCategory enum values are: -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-003-type-guard-accepts-valid-error-categories.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-003-type-guard-accepts-valid-error-categories.sdp.md deleted file mode 100644 index 52baa810..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-003-type-guard-accepts-valid-error-categories.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.type-guard-accepts-valid-error-categories -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# Type guard accepts valid error categories - -## Intent - -- outcome: Executable scenario: Type guard accepts valid error categories - -```gwt -Given the feature fixture is in place -When isErrorCategory is called with valid values: -Then each isErrorCategory call returns true -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-004-type-guard-rejects-invalid-values.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-004-type-guard-rejects-invalid-values.sdp.md deleted file mode 100644 index 7df29ed8..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-004-type-guard-rejects-invalid-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.type-guard-rejects-invalid-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# Type guard rejects invalid values - -## Intent - -- outcome: Executable scenario: Type guard rejects invalid values - -```gwt -Given the feature fixture is in place -When isErrorCategory is called with invalid values: -Then each isErrorCategory call returns false -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-005-command-error-is-created-with-all-properties.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-005-command-error-is-created-with-all-properties.sdp.md deleted file mode 100644 index 409e92d9..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-005-command-error-is-created-with-all-properties.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.command-error-is-created-with-all-properties -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# CommandError is created with all properties - -## Intent - -- outcome: Executable scenario: CommandError is created with all properties - -```gwt -Given the feature fixture is in place -When a CommandError is created with category "domain", code "ORDER_NOT_FOUND", message "Order was not found", recoverable false, and context orderId "123" -Then the error has all expected properties: -And the error context has orderId "123" -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-006-command-error-is-an-instance-of-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-006-command-error-is-an-instance-of-error.sdp.md deleted file mode 100644 index ffba907c..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-006-command-error-is-an-instance-of-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.command-error-is-an-instance-of-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# CommandError is an instance of Error - -## Intent - -- outcome: Executable scenario: CommandError is an instance of Error - -```gwt -Given the feature fixture is in place -When a CommandError is created with category "domain", code "TEST", and message "test message" -Then it is an instance of Error -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-007-command-error-from-returns-existing-command-error-unchanged.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-007-command-error-from-returns-existing-command-error-unchanged.sdp.md deleted file mode 100644 index f8a06173..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-007-command-error-from-returns-existing-command-error-unchanged.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.command-error-from-returns-existing-command-error-unchanged -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# CommandError.from returns existing CommandError unchanged - -## Intent - -- outcome: Executable scenario: CommandError.from returns existing CommandError unchanged - -```gwt -Given a CommandError with category "domain", code "TEST", and message "test" -When CommandError.from is called with that error -Then the result is the same reference as the original -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-008-command-error-from-wraps-a-regular-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-008-command-error-from-wraps-a-regular-error.sdp.md deleted file mode 100644 index d4754377..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-008-command-error-from-wraps-a-regular-error.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.command-error-from-wraps-a-regular-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# CommandError.from wraps a regular Error - -## Intent - -- outcome: Executable scenario: CommandError.from wraps a regular Error - -```gwt -Given the feature fixture is in place -When CommandError.from is called with a regular Error "Something went wrong" and code "WRAPPED_ERROR" -Then the wrapped error has category "infra", code "WRAPPED_ERROR", message "Something went wrong", and is recoverable -And the wrapped error context has originalError "Error" -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-009-command-error-from-wraps-a-string-value.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-009-command-error-from-wraps-a-string-value.sdp.md deleted file mode 100644 index d554f6d8..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-009-command-error-from-wraps-a-string-value.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.command-error-from-wraps-a-string-value -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# CommandError.from wraps a string value - -## Intent - -- outcome: Executable scenario: CommandError.from wraps a string value - -```gwt -Given the feature fixture is in place -When CommandError.from is called with string "string error" -Then the wrapped error has category "infra" and message "string error" -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-010-command-error-from-wraps-an-unknown-value.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-010-command-error-from-wraps-an-unknown-value.sdp.md deleted file mode 100644 index 47380497..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-010-command-error-from-wraps-an-unknown-value.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.command-error-from-wraps-an-unknown-value -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# CommandError.from wraps an unknown value - -## Intent - -- outcome: Executable scenario: CommandError.from wraps an unknown value - -```gwt -Given the feature fixture is in place -When CommandError.from is called with number 123 -Then the wrapped error has message "123" -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-011-to-json-serializes-error-with-context.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-011-to-json-serializes-error-with-context.sdp.md deleted file mode 100644 index 6c69bb53..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-011-to-json-serializes-error-with-context.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.to-json-serializes-error-with-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# toJSON serializes error with context - -## Intent - -- outcome: Executable scenario: toJSON serializes error with context - -```gwt -Given a CommandError with category "domain", code "ORDER_NOT_FOUND", message "Order was not found", recoverable false, and context orderId "123" -When toJSON is called -Then the JSON contains all properties: -And the JSON context has orderId "123" -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-012-to-json-handles-undefined-context.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-012-to-json-handles-undefined-context.sdp.md deleted file mode 100644 index 363c033e..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-012-to-json-handles-undefined-context.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.to-json-handles-undefined-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# toJSON handles undefined context - -## Intent - -- outcome: Executable scenario: toJSON handles undefined context - -```gwt -Given a CommandError with category "domain", code "TEST", message "test", and no context -When toJSON is called on it -Then the JSON context is undefined -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-013-factory-creates-domain-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-013-factory-creates-domain-error.sdp.md deleted file mode 100644 index 94e614f6..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-013-factory-creates-domain-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.factory-creates-domain-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# Factory creates domain error - -## Intent - -- outcome: Executable scenario: Factory creates domain error - -```gwt -Given the feature fixture is in place -When CommandErrors.domain is called with code "ORDER_ALREADY_SUBMITTED" and message "Order has already been submitted" -Then the factory error has category "domain", code "ORDER_ALREADY_SUBMITTED", and is not recoverable -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-014-factory-creates-validation-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-014-factory-creates-validation-error.sdp.md deleted file mode 100644 index 4a2e4772..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-014-factory-creates-validation-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.factory-creates-validation-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# Factory creates validation error - -## Intent - -- outcome: Executable scenario: Factory creates validation error - -```gwt -Given the feature fixture is in place -When CommandErrors.validation is called with code "INVALID_EMAIL" and message "Email format is invalid" -Then the factory error has category "validation" and is not recoverable -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-015-factory-creates-concurrency-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-015-factory-creates-concurrency-error.sdp.md deleted file mode 100644 index cda035f4..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-015-factory-creates-concurrency-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.factory-creates-concurrency-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# Factory creates concurrency error - -## Intent - -- outcome: Executable scenario: Factory creates concurrency error - -```gwt -Given the feature fixture is in place -When CommandErrors.concurrency is called with code "VERSION_CONFLICT" and message "Resource was modified by another request" -Then the factory error has category "concurrency" and is recoverable -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-016-factory-creates-infrastructure-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-016-factory-creates-infrastructure-error.sdp.md deleted file mode 100644 index 5360965b..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-016-factory-creates-infrastructure-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.factory-creates-infrastructure-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# Factory creates infrastructure error - -## Intent - -- outcome: Executable scenario: Factory creates infrastructure error - -```gwt -Given the feature fixture is in place -When CommandErrors.infrastructure is called with code "DATABASE_UNAVAILABLE" and message "Database connection failed" -Then the factory error has category "infra" and is recoverable -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-017-factory-creates-not-found-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-017-factory-creates-not-found-error.sdp.md deleted file mode 100644 index ba613e85..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-017-factory-creates-not-found-error.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.factory-creates-not-found-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# Factory creates not found error - -## Intent - -- outcome: Executable scenario: Factory creates not found error - -```gwt -Given the feature fixture is in place -When CommandErrors.notFound is called with entity "Order" and id "ord_123" -Then the error has code "ORDER_NOT_FOUND" and message 'Order with ID "ord_123" was not found' -And the error has category "domain" and context entityType "Order" and entityId "ord_123" -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-018-factory-creates-already-exists-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-018-factory-creates-already-exists-error.sdp.md deleted file mode 100644 index de471165..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-018-factory-creates-already-exists-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.factory-creates-already-exists-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# Factory creates already exists error - -## Intent - -- outcome: Executable scenario: Factory creates already exists error - -```gwt -Given the feature fixture is in place -When CommandErrors.alreadyExists is called with entity "Order" and id "ord_123" -Then the error has code "ORDER_ALREADY_EXISTS" and message 'Order with ID "ord_123" already exists' -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-019-factory-creates-invalid-state-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-019-factory-creates-invalid-state-error.sdp.md deleted file mode 100644 index e8ecaf15..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-019-factory-creates-invalid-state-error.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.factory-creates-invalid-state-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# Factory creates invalid state error - -## Intent - -- outcome: Executable scenario: Factory creates invalid state error - -```gwt -Given the feature fixture is in place -When CommandErrors.invalidState is called with entity "Order", current "draft", and required "submitted" -Then the error has code "INVALID_ORDER_STATE" and message 'Order is in "draft" state but "submitted" is required' -And the error context has entityType "Order", currentState "draft", and requiredState "submitted" -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-020-factory-creates-unauthorized-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-020-factory-creates-unauthorized-error.sdp.md deleted file mode 100644 index ceb5ccaa..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-020-factory-creates-unauthorized-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.factory-creates-unauthorized-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# Factory creates unauthorized error - -## Intent - -- outcome: Executable scenario: Factory creates unauthorized error - -```gwt -Given the feature fixture is in place -When CommandErrors.unauthorized is called with action "delete order" -Then the error has code "UNAUTHORIZED" and message "Not authorized to perform action: delete order" -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-021-factory-creates-rate-limited-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-021-factory-creates-rate-limited-error.sdp.md deleted file mode 100644 index 4708510e..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-021-factory-creates-rate-limited-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.factory-creates-rate-limited-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# Factory creates rate limited error - -## Intent - -- outcome: Executable scenario: Factory creates rate limited error - -```gwt -Given the feature fixture is in place -When CommandErrors.rateLimited is called with retryAfterMs 5000 -Then the error has code "RATE_LIMITED", category "infra", is recoverable, and context retryAfterMs 5000 -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-022-returns-true-for-matching-category.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-022-returns-true-for-matching-category.sdp.md deleted file mode 100644 index 3851a51f..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-022-returns-true-for-matching-category.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.returns-true-for-matching-category -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# Returns true for matching category - -## Intent - -- outcome: Executable scenario: Returns true for matching category - -```gwt -Given a CommandError with category "domain" -When the scenario runs -Then isCommandErrorOfCategory returns true for category "domain" -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-023-returns-false-for-non-matching-category.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-023-returns-false-for-non-matching-category.sdp.md deleted file mode 100644 index e5c334de..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-023-returns-false-for-non-matching-category.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.returns-false-for-non-matching-category -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# Returns false for non-matching category - -## Intent - -- outcome: Executable scenario: Returns false for non-matching category - -```gwt -Given a CommandError with category "domain" -When the scenario runs -Then isCommandErrorOfCategory returns false for category "validation" -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-024-returns-false-for-non-command-error.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-024-returns-false-for-non-command-error.sdp.md deleted file mode 100644 index 0e7f7635..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-024-returns-false-for-non-command-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.returns-false-for-non-command-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# Returns false for non-CommandError - -## Intent - -- outcome: Executable scenario: Returns false for non-CommandError - -```gwt -Given a regular Error "test" -When the scenario runs -Then isCommandErrorOfCategory returns false for any category -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-025-recoverable-errors-are-identified-correctly.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-025-recoverable-errors-are-identified-correctly.sdp.md deleted file mode 100644 index 06a5ce0c..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-025-recoverable-errors-are-identified-correctly.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.recoverable-errors-are-identified-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# Recoverable errors are identified correctly - -## Intent - -- outcome: Executable scenario: Recoverable errors are identified correctly - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isRecoverableError returns true for a concurrency error -And isRecoverableError returns false for a domain error -And isRecoverableError returns true for a regular Error -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-026-non-recoverable-error-gets-delay-of-1.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-026-non-recoverable-error-gets-delay-of-1.sdp.md deleted file mode 100644 index 7335d992..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-026-non-recoverable-error-gets-delay-of-1.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.non-recoverable-error-gets-delay-of-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# Non-recoverable error gets delay of -1 - -## Intent - -- outcome: Executable scenario: Non-recoverable error gets delay of -1 - -```gwt -Given the feature fixture is in place -When getRetryDelay is called with a domain error at attempt 1 -Then the delay is -1 -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-027-concurrency-error-delays-escalate-then-cap.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-027-concurrency-error-delays-escalate-then-cap.sdp.md deleted file mode 100644 index 755f2e33..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-027-concurrency-error-delays-escalate-then-cap.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.concurrency-error-delays-escalate-then-cap -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# Concurrency error delays escalate then cap - -## Intent - -- outcome: Executable scenario: Concurrency error delays escalate then cap - -```gwt -Given the feature fixture is in place -When the scenario runs -Then getRetryDelay for concurrency errors returns: -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-028-infrastructure-error-delays-escalate-then-cap.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-028-infrastructure-error-delays-escalate-then-cap.sdp.md deleted file mode 100644 index 151a88e9..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-028-infrastructure-error-delays-escalate-then-cap.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.infrastructure-error-delays-escalate-then-cap -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# Infrastructure error delays escalate then cap - -## Intent - -- outcome: Executable scenario: Infrastructure error delays escalate then cap - -```gwt -Given the feature fixture is in place -When the scenario runs -Then getRetryDelay for infrastructure errors returns: -``` diff --git a/specs/behavior/platform-core/commands/errors.examples/s-029-unknown-error-gets-infrastructure-style-delay.sdp.md b/specs/behavior/platform-core/commands/errors.examples/s-029-unknown-error-gets-infrastructure-style-delay.sdp.md deleted file mode 100644 index b72c1a46..00000000 --- a/specs/behavior/platform-core/commands/errors.examples/s-029-unknown-error-gets-infrastructure-style-delay.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.errors.unknown-error-gets-infrastructure-style-delay -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.errors ---- -# Unknown error gets infrastructure-style delay - -## Intent - -- outcome: Executable scenario: Unknown error gets infrastructure-style delay - -```gwt -Given the feature fixture is in place -When getRetryDelay is called with a regular Error at attempt 1 -Then the delay is 1000 -``` diff --git a/specs/behavior/platform-core/commands/errors.sdp.md b/specs/behavior/platform-core/commands/errors.sdp.md index 26ac8238..768a990d 100644 --- a/specs/behavior/platform-core/commands/errors.sdp.md +++ b/specs/behavior/platform-core/commands/errors.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.commands.errors kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,8 +10,8 @@ relations: ## Intent -- actor: a platform developer -- outcome: a structured error system with categories and recovery semantics so that command failures are classified, serializable, and recoverable +- outcome: Classify command failures with categorized, serializable errors and recovery semantics. +- value: Callers can decide retry delays from error category without inspecting ad-hoc exceptions. ## Behavior diff --git a/specs/behavior/platform-core/commands/factories.examples/s-001-schema-assigns-aggregate-category-and-preserves-command-type.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-001-schema-assigns-aggregate-category-and-preserves-command-type.sdp.md deleted file mode 100644 index 322f0e65..00000000 --- a/specs/behavior/platform-core/commands/factories.examples/s-001-schema-assigns-aggregate-category-and-preserves-command-type.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.factories.schema-assigns-aggregate-category-and-preserves-command-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.factories ---- -# Schema assigns aggregate category and preserves command type - -## Intent - -- outcome: Executable scenario: Schema assigns aggregate category and preserves command type - -```gwt -Given an aggregate command schema for "CreateOrder" with payload fields "orderId,customerId" -When a valid command is parsed with commandType "CreateOrder" -Then the parsed command has category "aggregate" -And the parsed command has commandType "CreateOrder" -``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-002-aggregate-target-is-present-on-parsed-command.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-002-aggregate-target-is-present-on-parsed-command.sdp.md deleted file mode 100644 index e71ba7fc..00000000 --- a/specs/behavior/platform-core/commands/factories.examples/s-002-aggregate-target-is-present-on-parsed-command.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.factories.aggregate-target-is-present-on-parsed-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.factories ---- -# Aggregate target is present on parsed command - -## Intent - -- outcome: Executable scenario: Aggregate target is present on parsed command - -```gwt -Given an aggregate command schema for "AddOrderItem" with aggregate target type "Order" and idField "orderId" -When a valid command is parsed with commandType "AddOrderItem" -Then the parsed command has aggregateTarget type "Order" and idField "orderId" -``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-003-aggregate-target-is-undefined-when-not-configured.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-003-aggregate-target-is-undefined-when-not-configured.sdp.md deleted file mode 100644 index 6a3b7a1b..00000000 --- a/specs/behavior/platform-core/commands/factories.examples/s-003-aggregate-target-is-undefined-when-not-configured.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.factories.aggregate-target-is-undefined-when-not-configured -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.factories ---- -# Aggregate target is undefined when not configured - -## Intent - -- outcome: Executable scenario: Aggregate target is undefined when not configured - -```gwt -Given an aggregate command schema for "CreateOrder" with payload fields "orderId" -When a valid command is parsed with commandType "CreateOrder" -Then the parsed command has undefined aggregateTarget -``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-004-schema-rejects-a-mismatched-command-type.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-004-schema-rejects-a-mismatched-command-type.sdp.md deleted file mode 100644 index a43879d7..00000000 --- a/specs/behavior/platform-core/commands/factories.examples/s-004-schema-rejects-a-mismatched-command-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.factories.schema-rejects-a-mismatched-command-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.factories ---- -# Schema rejects a mismatched command type - -## Intent - -- outcome: Executable scenario: Schema rejects a mismatched command type - -```gwt -Given an aggregate command schema for "CreateOrder" with payload fields "orderId" -When a command with commandType "WrongType" is parsed -Then the parse throws a validation error -``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-005-schema-rejects-commands-missing-required-fields.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-005-schema-rejects-commands-missing-required-fields.sdp.md deleted file mode 100644 index c6bb35be..00000000 --- a/specs/behavior/platform-core/commands/factories.examples/s-005-schema-rejects-commands-missing-required-fields.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.factories.schema-rejects-commands-missing-required-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.factories ---- -# Schema rejects commands missing required fields - -## Intent - -- outcome: Executable scenario: Schema rejects commands missing required fields - -```gwt -Given an aggregate command schema for "CreateOrder" with payload fields "orderId" -When commands are parsed with the following missing fields: -Then each parse throws a validation error -``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-006-schema-assigns-process-category-and-preserves-command-type.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-006-schema-assigns-process-category-and-preserves-command-type.sdp.md deleted file mode 100644 index f7fd8997..00000000 --- a/specs/behavior/platform-core/commands/factories.examples/s-006-schema-assigns-process-category-and-preserves-command-type.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.factories.schema-assigns-process-category-and-preserves-command-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.factories ---- -# Schema assigns process category and preserves command type - -## Intent - -- outcome: Executable scenario: Schema assigns process category and preserves command type - -```gwt -Given a process command schema for "StartOrderFulfillment" with payload fields "orderId,warehouseId" -When a valid process command is parsed with commandType "StartOrderFulfillment" -Then the parsed command has category "process" -And the parsed command has commandType "StartOrderFulfillment" -``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-007-process-type-is-present-on-parsed-command.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-007-process-type-is-present-on-parsed-command.sdp.md deleted file mode 100644 index 312a71a4..00000000 --- a/specs/behavior/platform-core/commands/factories.examples/s-007-process-type-is-present-on-parsed-command.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.factories.process-type-is-present-on-parsed-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.factories ---- -# Process type is present on parsed command - -## Intent - -- outcome: Executable scenario: Process type is present on parsed command - -```gwt -Given a process command schema for "StartOrderFulfillment" with processType "OrderFulfillmentSaga" -When a valid process command is parsed with commandType "StartOrderFulfillment" -Then the parsed command has processType "OrderFulfillmentSaga" -``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-008-process-type-is-undefined-when-not-configured.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-008-process-type-is-undefined-when-not-configured.sdp.md deleted file mode 100644 index d314ef5e..00000000 --- a/specs/behavior/platform-core/commands/factories.examples/s-008-process-type-is-undefined-when-not-configured.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.factories.process-type-is-undefined-when-not-configured -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.factories ---- -# Process type is undefined when not configured - -## Intent - -- outcome: Executable scenario: Process type is undefined when not configured - -```gwt -Given a process command schema for "StartProcess" with payload fields "id" -When a valid process command is parsed with commandType "StartProcess" -Then the parsed command has undefined processType -``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-009-schema-assigns-system-category-and-preserves-command-type.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-009-schema-assigns-system-category-and-preserves-command-type.sdp.md deleted file mode 100644 index 3bd65862..00000000 --- a/specs/behavior/platform-core/commands/factories.examples/s-009-schema-assigns-system-category-and-preserves-command-type.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.factories.schema-assigns-system-category-and-preserves-command-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.factories ---- -# Schema assigns system category and preserves command type - -## Intent - -- outcome: Executable scenario: Schema assigns system category and preserves command type - -```gwt -Given a system command schema for "CleanupExpiredCommands" with payload fields "olderThanDays:number" -When a valid system command is parsed with commandType "CleanupExpiredCommands" -Then the parsed command has category "system" -And the parsed command has commandType "CleanupExpiredCommands" -``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-010-requires-idempotency-defaults-to-false.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-010-requires-idempotency-defaults-to-false.sdp.md deleted file mode 100644 index a0daa6f5..00000000 --- a/specs/behavior/platform-core/commands/factories.examples/s-010-requires-idempotency-defaults-to-false.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.factories.requires-idempotency-defaults-to-false -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.factories ---- -# requiresIdempotency defaults to false - -## Intent - -- outcome: Executable scenario: requiresIdempotency defaults to false - -```gwt -Given a system command schema for "RunHealthCheck" with empty payload -When a valid system command is parsed with commandType "RunHealthCheck" -Then the parsed command has requiresIdempotency false -``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-011-requires-idempotency-can-be-set-to-true.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-011-requires-idempotency-can-be-set-to-true.sdp.md deleted file mode 100644 index c119ac4f..00000000 --- a/specs/behavior/platform-core/commands/factories.examples/s-011-requires-idempotency-can-be-set-to-true.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.factories.requires-idempotency-can-be-set-to-true -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.factories ---- -# requiresIdempotency can be set to true - -## Intent - -- outcome: Executable scenario: requiresIdempotency can be set to true - -```gwt -Given a system command schema for "MigrateData" with requiresIdempotency true -When a valid system command is parsed with commandType "MigrateData" -Then the parsed command has requiresIdempotency true -``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-012-schema-assigns-batch-category-with-items.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-012-schema-assigns-batch-category-with-items.sdp.md deleted file mode 100644 index 48f75d6f..00000000 --- a/specs/behavior/platform-core/commands/factories.examples/s-012-schema-assigns-batch-category-with-items.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.factories.schema-assigns-batch-category-with-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.factories ---- -# Schema assigns batch category with items - -## Intent - -- outcome: Executable scenario: Schema assigns batch category with items - -```gwt -Given a batch command schema for "BulkCreateOrders" with item fields "customerId,productId" -When a valid batch command is parsed with 2 items -Then the parsed command has category "batch" -And the parsed command has 2 items -``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-013-batch-config-is-present-on-parsed-command.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-013-batch-config-is-present-on-parsed-command.sdp.md deleted file mode 100644 index cbbc537d..00000000 --- a/specs/behavior/platform-core/commands/factories.examples/s-013-batch-config-is-present-on-parsed-command.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.factories.batch-config-is-present-on-parsed-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.factories ---- -# Batch config is present on parsed command - -## Intent - -- outcome: Executable scenario: Batch config is present on parsed command - -```gwt -Given a batch command schema for "BulkUpdateProducts" with batchConfig maxItems 100 and continueOnError true -When a valid batch command is parsed with 1 item -Then the parsed command has batchConfig maxItems 100 and continueOnError true -``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-014-schema-rejects-items-that-fail-item-schema-validation.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-014-schema-rejects-items-that-fail-item-schema-validation.sdp.md deleted file mode 100644 index 933e3ac3..00000000 --- a/specs/behavior/platform-core/commands/factories.examples/s-014-schema-rejects-items-that-fail-item-schema-validation.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.factories.schema-rejects-items-that-fail-item-schema-validation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.factories ---- -# Schema rejects items that fail item schema validation - -## Intent - -- outcome: Executable scenario: Schema rejects items that fail item schema validation - -```gwt -Given a batch command schema for "BulkProcess" with item fields "id,value:positive-number" -When a batch command is parsed with an invalid item value -5 -Then the parse throws a validation error -``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-015-empty-items-array-is-accepted.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-015-empty-items-array-is-accepted.sdp.md deleted file mode 100644 index ed5fee2d..00000000 --- a/specs/behavior/platform-core/commands/factories.examples/s-015-empty-items-array-is-accepted.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.factories.empty-items-array-is-accepted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.factories ---- -# Empty items array is accepted - -## Intent - -- outcome: Executable scenario: Empty items array is accepted - -```gwt -Given a batch command schema for "BulkProcess" with item fields "id" -When a valid batch command is parsed with 0 items -Then the parsed command has 0 items -``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-016-category-is-extracted-from-each-factory-schema.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-016-category-is-extracted-from-each-factory-schema.sdp.md deleted file mode 100644 index 730889a9..00000000 --- a/specs/behavior/platform-core/commands/factories.examples/s-016-category-is-extracted-from-each-factory-schema.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.factories.category-is-extracted-from-each-factory-schema -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.factories ---- -# Category is extracted from each factory schema - -## Intent - -- outcome: Executable scenario: Category is extracted from each factory schema - -```gwt -Given a schema from each command category factory: -When the scenario runs -Then each extraction returns the expected category -``` diff --git a/specs/behavior/platform-core/commands/factories.examples/s-017-non-command-schemas-return-undefined.sdp.md b/specs/behavior/platform-core/commands/factories.examples/s-017-non-command-schemas-return-undefined.sdp.md deleted file mode 100644 index 8dadbd9e..00000000 --- a/specs/behavior/platform-core/commands/factories.examples/s-017-non-command-schemas-return-undefined.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.factories.non-command-schemas-return-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.factories ---- -# Non-command schemas return undefined - -## Intent - -- outcome: Executable scenario: Non-command schemas return undefined - -```gwt -Given getCommandCategoryFromSchema is called on non-command schemas: -When the scenario runs -Then each extraction returns undefined -``` diff --git a/specs/behavior/platform-core/commands/factories.sdp.md b/specs/behavior/platform-core/commands/factories.sdp.md index f3d7c0ed..f3f5a7a5 100644 --- a/specs/behavior/platform-core/commands/factories.sdp.md +++ b/specs/behavior/platform-core/commands/factories.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.commands.factories kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,8 +10,8 @@ relations: ## Intent -- actor: a platform developer -- outcome: category-specific factory functions for command schemas so that commands are created with the correct category, validated fields, and typed payloads +- outcome: Build category-specific command schemas so each command carries the correct category, validated fields, and typed payload. +- value: Factories keep aggregate, process, system, and batch commands consistent at parse time. ## Behavior diff --git a/specs/behavior/platform-core/commands/naming.examples/s-001-command-name-prefixes-includes-all-standard-prefixes.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-001-command-name-prefixes-includes-all-standard-prefixes.sdp.md deleted file mode 100644 index f11c327b..00000000 --- a/specs/behavior/platform-core/commands/naming.examples/s-001-command-name-prefixes-includes-all-standard-prefixes.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.naming.command-name-prefixes-includes-all-standard-prefixes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.naming ---- -# COMMAND_NAME_PREFIXES includes all standard prefixes - -## Intent - -- outcome: Executable scenario: COMMAND_NAME_PREFIXES includes all standard prefixes - -```gwt -Given the COMMAND_NAME_PREFIXES constant -When the scenario runs -Then it contains all of the following prefixes: -``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-002-create-pattern-accepts-valid-create-prefixed-names.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-002-create-pattern-accepts-valid-create-prefixed-names.sdp.md deleted file mode 100644 index e8f2d823..00000000 --- a/specs/behavior/platform-core/commands/naming.examples/s-002-create-pattern-accepts-valid-create-prefixed-names.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.naming.create-pattern-accepts-valid-create-prefixed-names -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.naming ---- -# CREATE pattern accepts valid Create-prefixed names - -## Intent - -- outcome: Executable scenario: CREATE pattern accepts valid Create-prefixed names - -```gwt -Given the feature fixture is in place -When the CREATE pattern is tested against the following names: -Then each pattern test returns the expected result -``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-003-add-pattern-accepts-valid-add-prefixed-names.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-003-add-pattern-accepts-valid-add-prefixed-names.sdp.md deleted file mode 100644 index 1ca0b237..00000000 --- a/specs/behavior/platform-core/commands/naming.examples/s-003-add-pattern-accepts-valid-add-prefixed-names.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.naming.add-pattern-accepts-valid-add-prefixed-names -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.naming ---- -# ADD pattern accepts valid Add-prefixed names - -## Intent - -- outcome: Executable scenario: ADD pattern accepts valid Add-prefixed names - -```gwt -Given the feature fixture is in place -When the ADD pattern is tested against the following names: -Then each pattern test returns the expected result -``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-004-update-pattern-accepts-update-change-and-modify-prefixes.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-004-update-pattern-accepts-update-change-and-modify-prefixes.sdp.md deleted file mode 100644 index d178b8ca..00000000 --- a/specs/behavior/platform-core/commands/naming.examples/s-004-update-pattern-accepts-update-change-and-modify-prefixes.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.naming.update-pattern-accepts-update-change-and-modify-prefixes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.naming ---- -# UPDATE pattern accepts Update, Change, and Modify prefixes - -## Intent - -- outcome: Executable scenario: UPDATE pattern accepts Update, Change, and Modify prefixes - -```gwt -Given the feature fixture is in place -When the UPDATE pattern is tested against the following names: -Then each pattern test returns the expected result -``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-005-valid-command-names-are-accepted.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-005-valid-command-names-are-accepted.sdp.md deleted file mode 100644 index a9e244b1..00000000 --- a/specs/behavior/platform-core/commands/naming.examples/s-005-valid-command-names-are-accepted.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.naming.valid-command-names-are-accepted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.naming ---- -# Valid command names are accepted - -## Intent - -- outcome: Executable scenario: Valid command names are accepted - -```gwt -Given the feature fixture is in place -When isValidCommandName is called with the following names: -Then each validity check returns the expected result -``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-006-invalid-command-names-are-rejected.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-006-invalid-command-names-are-rejected.sdp.md deleted file mode 100644 index 6e3aa6a7..00000000 --- a/specs/behavior/platform-core/commands/naming.examples/s-006-invalid-command-names-are-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.naming.invalid-command-names-are-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.naming ---- -# Invalid command names are rejected - -## Intent - -- outcome: Executable scenario: Invalid command names are rejected - -```gwt -Given the feature fixture is in place -When isValidCommandName is called with the following names: -Then each validity check returns the expected result -``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-007-valid-names-return-matched-prefix-and-valid-flag.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-007-valid-names-return-matched-prefix-and-valid-flag.sdp.md deleted file mode 100644 index ba21f906..00000000 --- a/specs/behavior/platform-core/commands/naming.examples/s-007-valid-names-return-matched-prefix-and-valid-flag.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.naming.valid-names-return-matched-prefix-and-valid-flag -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.naming ---- -# Valid names return matched prefix and valid flag - -## Intent - -- outcome: Executable scenario: Valid names return matched prefix and valid flag - -```gwt -Given the feature fixture is in place -When validateCommandName is called with the following valid names: -Then each validation result is valid with the expected prefix -And no validation result contains suggestions -``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-008-invalid-name-returns-suggestions-and-error-message.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-008-invalid-name-returns-suggestions-and-error-message.sdp.md deleted file mode 100644 index 70672e38..00000000 --- a/specs/behavior/platform-core/commands/naming.examples/s-008-invalid-name-returns-suggestions-and-error-message.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.naming.invalid-name-returns-suggestions-and-error-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.naming ---- -# Invalid name returns suggestions and error message - -## Intent - -- outcome: Executable scenario: Invalid name returns suggestions and error message - -```gwt -Given the feature fixture is in place -When validateCommandName is called with "OrderCreate" -Then the validation result is invalid -And the validation message contains "does not follow naming conventions" -And the suggestions include "CreateOrder" -``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-009-inverted-name-receives-corrected-suggestion.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-009-inverted-name-receives-corrected-suggestion.sdp.md deleted file mode 100644 index 8599afaf..00000000 --- a/specs/behavior/platform-core/commands/naming.examples/s-009-inverted-name-receives-corrected-suggestion.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.naming.inverted-name-receives-corrected-suggestion -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.naming ---- -# Inverted name receives corrected suggestion - -## Intent - -- outcome: Executable scenario: Inverted name receives corrected suggestion - -```gwt -Given the feature fixture is in place -When generateNameSuggestions is called with "OrderCreate" -Then the suggestions include "CreateOrder" -``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-010-suggestions-are-limited-to-at-most-3.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-010-suggestions-are-limited-to-at-most-3.sdp.md deleted file mode 100644 index 078b4415..00000000 --- a/specs/behavior/platform-core/commands/naming.examples/s-010-suggestions-are-limited-to-at-most-3.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.naming.suggestions-are-limited-to-at-most-3 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.naming ---- -# Suggestions are limited to at most 3 - -## Intent - -- outcome: Executable scenario: Suggestions are limited to at most 3 - -```gwt -Given the feature fixture is in place -When generateNameSuggestions is called with "SomeRandomName" -Then the suggestion count is at most 3 -``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-011-known-names-return-their-prefix.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-011-known-names-return-their-prefix.sdp.md deleted file mode 100644 index 53912163..00000000 --- a/specs/behavior/platform-core/commands/naming.examples/s-011-known-names-return-their-prefix.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.naming.known-names-return-their-prefix -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.naming ---- -# Known names return their prefix - -## Intent - -- outcome: Executable scenario: Known names return their prefix - -```gwt -Given the feature fixture is in place -When getCommandPrefix is called with the following names: -Then each prefix extraction returns the expected prefix -``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-012-invalid-or-empty-names-return-undefined.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-012-invalid-or-empty-names-return-undefined.sdp.md deleted file mode 100644 index ba27e59d..00000000 --- a/specs/behavior/platform-core/commands/naming.examples/s-012-invalid-or-empty-names-return-undefined.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.naming.invalid-or-empty-names-return-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.naming ---- -# Invalid or empty names return undefined - -## Intent - -- outcome: Executable scenario: Invalid or empty names return undefined - -```gwt -Given the feature fixture is in place -When getCommandPrefix is called with the following names: -Then each prefix extraction returns the expected prefix -``` diff --git a/specs/behavior/platform-core/commands/naming.examples/s-013-various-input-formats-produce-correct-pascal-case-names.sdp.md b/specs/behavior/platform-core/commands/naming.examples/s-013-various-input-formats-produce-correct-pascal-case-names.sdp.md deleted file mode 100644 index 9dbf4ed7..00000000 --- a/specs/behavior/platform-core/commands/naming.examples/s-013-various-input-formats-produce-correct-pascal-case-names.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.commands.naming.various-input-formats-produce-correct-pascal-case-names -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.commands.naming ---- -# Various input formats produce correct PascalCase names - -## Intent - -- outcome: Executable scenario: Various input formats produce correct PascalCase names - -```gwt -Given the feature fixture is in place -When formatCommandName is called with the following inputs: -Then each format call returns the expected output -``` diff --git a/specs/behavior/platform-core/commands/naming.sdp.md b/specs/behavior/platform-core/commands/naming.sdp.md index 8ef0c76d..184d70c5 100644 --- a/specs/behavior/platform-core/commands/naming.sdp.md +++ b/specs/behavior/platform-core/commands/naming.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.commands.naming kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,8 +10,8 @@ relations: ## Intent -- actor: a platform developer -- outcome: command naming conventions enforced at runtime so that commands follow consistent Verb+Noun PascalCase patterns across bounded contexts +- outcome: Enforce Verb+Noun PascalCase command naming at runtime across bounded contexts. +- value: Invalid names produce structured validation results and corrective suggestions. ## Behavior diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-001-chain-uses-command-id-as-causation-id-and-generates-correlation-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-001-chain-uses-command-id-as-causation-id-and-generates-correlation-id.sdp.md deleted file mode 100644 index 9a56c2cb..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-001-chain-uses-command-id-as-causation-id-and-generates-correlation-id.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.chain-uses-command-id-as-causation-id-and-generates-correlation-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Chain uses commandId as causationId and generates correlationId - -## Intent - -- outcome: Executable scenario: Chain uses commandId as causationId and generates correlationId - -```gwt -Given the module is imported from platform-core -And the system time is fixed at 1703001234567 -When a correlation chain is created with commandId "cmd_test_123" -Then the chain has the following properties: -And the chain correlationId starts with "corr_" -And the chain userId is undefined -And the chain context is undefined -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-002-chain-uses-provided-correlation-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-002-chain-uses-provided-correlation-id.sdp.md deleted file mode 100644 index 6482d3f8..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-002-chain-uses-provided-correlation-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.chain-uses-provided-correlation-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Chain uses provided correlationId - -## Intent - -- outcome: Executable scenario: Chain uses provided correlationId - -```gwt -Given the module is imported from platform-core -And the system time is fixed at 1703001234567 -When a correlation chain is created with commandId "cmd_test_123" and correlationId "corr_custom_456" -Then the chain correlationId is "corr_custom_456" -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-003-chain-uses-provided-user-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-003-chain-uses-provided-user-id.sdp.md deleted file mode 100644 index 9b384b91..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-003-chain-uses-provided-user-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.chain-uses-provided-user-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Chain uses provided userId - -## Intent - -- outcome: Executable scenario: Chain uses provided userId - -```gwt -Given the module is imported from platform-core -And the system time is fixed at 1703001234567 -When a correlation chain is created with commandId "cmd_test_123" and userId "user_abc" -Then the chain userId is "user_abc" -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-004-chain-uses-provided-context.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-004-chain-uses-provided-context.sdp.md deleted file mode 100644 index 6911b5c9..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-004-chain-uses-provided-context.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.chain-uses-provided-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Chain uses provided context - -## Intent - -- outcome: Executable scenario: Chain uses provided context - -```gwt -Given the module is imported from platform-core -And the system time is fixed at 1703001234567 -When a correlation chain is created with commandId "cmd_test_123" and context source "api" version "v1" -Then the chain context equals source "api" version "v1" -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-005-chain-uses-provided-initiated-at.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-005-chain-uses-provided-initiated-at.sdp.md deleted file mode 100644 index 74cbb831..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-005-chain-uses-provided-initiated-at.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.chain-uses-provided-initiated-at -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Chain uses provided initiatedAt - -## Intent - -- outcome: Executable scenario: Chain uses provided initiatedAt - -```gwt -Given the module is imported from platform-core -When a correlation chain is created with commandId "cmd_test_123" and initiatedAt 1700000000000 -Then the chain initiatedAt is 1700000000000 -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-006-chain-accepts-all-options-together.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-006-chain-accepts-all-options-together.sdp.md deleted file mode 100644 index 3d1d740a..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-006-chain-accepts-all-options-together.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.chain-accepts-all-options-together -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Chain accepts all options together - -## Intent - -- outcome: Executable scenario: Chain accepts all options together - -```gwt -Given the module is imported from platform-core -When a correlation chain is created with all options commandId "cmd_test_123" correlationId "corr_custom" userId "user_xyz" context key "value" and initiatedAt 1699999999999 -Then the chain equals the full expected object: -And the chain context equals key "value" -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-007-derived-chain-preserves-correlation-id-and-uses-event-id-as-causation-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-007-derived-chain-preserves-correlation-id-and-uses-event-id-as-causation-id.sdp.md deleted file mode 100644 index e2afd522..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-007-derived-chain-preserves-correlation-id-and-uses-event-id-as-causation-id.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.derived-chain-preserves-correlation-id-and-uses-event-id-as-causation-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Derived chain preserves correlationId and uses eventId as causationId - -## Intent - -- outcome: Executable scenario: Derived chain preserves correlationId and uses eventId as causationId - -```gwt -Given the module is imported from platform-core -And the system time is fixed at 1703001234567 -And a causation source with eventId "evt_abc123" and correlationId "corr_original" -When a correlation chain is derived from the source -Then the derived chain has the following properties: -And the derived chain commandId starts with "cmd_" -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-008-derived-chain-inherits-user-id-from-source.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-008-derived-chain-inherits-user-id-from-source.sdp.md deleted file mode 100644 index cd80ba63..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-008-derived-chain-inherits-user-id-from-source.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.derived-chain-inherits-user-id-from-source -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Derived chain inherits userId from source - -## Intent - -- outcome: Executable scenario: Derived chain inherits userId from source - -```gwt -Given the module is imported from platform-core -And the system time is fixed at 1703001234567 -And a causation source with eventId "evt_abc123" correlationId "corr_original" and userId "user_inherited" -When a correlation chain is derived from the source -Then the derived chain userId is "user_inherited" -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-009-derived-chain-inherits-context-from-source.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-009-derived-chain-inherits-context-from-source.sdp.md deleted file mode 100644 index 012f14e2..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-009-derived-chain-inherits-context-from-source.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.derived-chain-inherits-context-from-source -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Derived chain inherits context from source - -## Intent - -- outcome: Executable scenario: Derived chain inherits context from source - -```gwt -Given the module is imported from platform-core -And the system time is fixed at 1703001234567 -And a causation source with eventId "evt_abc123" correlationId "corr_original" and context parentKey "parentValue" -When a correlation chain is derived from the source -Then the derived chain context equals parentKey "parentValue" -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-010-derived-chain-merges-source-and-option-contexts.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-010-derived-chain-merges-source-and-option-contexts.sdp.md deleted file mode 100644 index 173b7b32..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-010-derived-chain-merges-source-and-option-contexts.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.derived-chain-merges-source-and-option-contexts -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Derived chain merges source and option contexts - -## Intent - -- outcome: Executable scenario: Derived chain merges source and option contexts - -```gwt -Given the module is imported from platform-core -And the system time is fixed at 1703001234567 -And a causation source with eventId "evt_abc123" correlationId "corr_original" and context parentKey "parentValue" -When a correlation chain is derived from the source with context childKey "childValue" -Then the derived chain context equals parentKey "parentValue" and childKey "childValue" -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-011-option-context-takes-precedence-over-source-context.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-011-option-context-takes-precedence-over-source-context.sdp.md deleted file mode 100644 index 9323a13f..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-011-option-context-takes-precedence-over-source-context.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.option-context-takes-precedence-over-source-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Option context takes precedence over source context - -## Intent - -- outcome: Executable scenario: Option context takes precedence over source context - -```gwt -Given the module is imported from platform-core -And the system time is fixed at 1703001234567 -And a causation source with eventId "evt_abc123" correlationId "corr_original" and context key "sourceValue" -When a correlation chain is derived from the source with context key "optionValue" -Then the derived chain context equals key "optionValue" -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-012-source-context-preserved-when-options-have-no-context.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-012-source-context-preserved-when-options-have-no-context.sdp.md deleted file mode 100644 index 4065d0a5..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-012-source-context-preserved-when-options-have-no-context.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.source-context-preserved-when-options-have-no-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Source context preserved when options have no context - -## Intent - -- outcome: Executable scenario: Source context preserved when options have no context - -```gwt -Given the module is imported from platform-core -And the system time is fixed at 1703001234567 -And a causation source with eventId "evt_abc123" correlationId "corr_original" and context key "value" -When a correlation chain is derived from the source with empty options -Then the derived chain context equals key "value" -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-013-options-context-used-when-source-has-no-context.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-013-options-context-used-when-source-has-no-context.sdp.md deleted file mode 100644 index 9e3ef069..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-013-options-context-used-when-source-has-no-context.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.options-context-used-when-source-has-no-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Options context used when source has no context - -## Intent - -- outcome: Executable scenario: Options context used when source has no context - -```gwt -Given the module is imported from platform-core -And the system time is fixed at 1703001234567 -And a causation source with eventId "evt_abc123" and correlationId "corr_original" -When a correlation chain is derived from the source with context key "value" -Then the derived chain context equals key "value" -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-014-context-is-undefined-when-neither-source-nor-options-have-context.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-014-context-is-undefined-when-neither-source-nor-options-have-context.sdp.md deleted file mode 100644 index 6e0ae278..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-014-context-is-undefined-when-neither-source-nor-options-have-context.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.context-is-undefined-when-neither-source-nor-options-have-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Context is undefined when neither source nor options have context - -## Intent - -- outcome: Executable scenario: Context is undefined when neither source nor options have context - -```gwt -Given the module is imported from platform-core -And the system time is fixed at 1703001234567 -And a causation source with eventId "evt_abc123" and correlationId "corr_original" -When a correlation chain is derived from the source -Then the derived chain context is undefined -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-015-both-empty-contexts-merge-to-empty-object.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-015-both-empty-contexts-merge-to-empty-object.sdp.md deleted file mode 100644 index a3fd4308..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-015-both-empty-contexts-merge-to-empty-object.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.both-empty-contexts-merge-to-empty-object -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Both empty contexts merge to empty object - -## Intent - -- outcome: Executable scenario: Both empty contexts merge to empty object - -```gwt -Given the module is imported from platform-core -And the system time is fixed at 1703001234567 -And a causation source with eventId "evt_abc123" correlationId "corr_original" and empty context -When a correlation chain is derived from the source with empty context -Then the derived chain context is an empty object -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-016-source-context-preserved-when-options-context-is-empty.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-016-source-context-preserved-when-options-context-is-empty.sdp.md deleted file mode 100644 index 3b7c7e09..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-016-source-context-preserved-when-options-context-is-empty.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.source-context-preserved-when-options-context-is-empty -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Source context preserved when options context is empty - -## Intent - -- outcome: Executable scenario: Source context preserved when options context is empty - -```gwt -Given the module is imported from platform-core -And the system time is fixed at 1703001234567 -And a causation source with eventId "evt_abc123" correlationId "corr_original" and context key "value" -When a correlation chain is derived from the source with empty context -Then the derived chain context equals key "value" -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-017-options-context-used-when-source-context-is-empty.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-017-options-context-used-when-source-context-is-empty.sdp.md deleted file mode 100644 index e30f4883..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-017-options-context-used-when-source-context-is-empty.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.options-context-used-when-source-context-is-empty -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Options context used when source context is empty - -## Intent - -- outcome: Executable scenario: Options context used when source context is empty - -```gwt -Given the module is imported from platform-core -And the system time is fixed at 1703001234567 -And a causation source with eventId "evt_abc123" correlationId "corr_original" and empty context -When a correlation chain is derived from the source with context key "value" -Then the derived chain context equals key "value" -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-018-derived-chain-uses-provided-command-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-018-derived-chain-uses-provided-command-id.sdp.md deleted file mode 100644 index 07595474..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-018-derived-chain-uses-provided-command-id.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.derived-chain-uses-provided-command-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Derived chain uses provided commandId - -## Intent - -- outcome: Executable scenario: Derived chain uses provided commandId - -```gwt -Given the module is imported from platform-core -And the system time is fixed at 1703001234567 -And a causation source with eventId "evt_abc123" and correlationId "corr_original" -When a correlation chain is derived from the source with commandId "cmd_custom_999" -Then the derived chain commandId is "cmd_custom_999" -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-019-derived-chain-uses-provided-initiated-at.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-019-derived-chain-uses-provided-initiated-at.sdp.md deleted file mode 100644 index eb690852..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-019-derived-chain-uses-provided-initiated-at.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.derived-chain-uses-provided-initiated-at -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Derived chain uses provided initiatedAt - -## Intent - -- outcome: Executable scenario: Derived chain uses provided initiatedAt - -```gwt -Given the module is imported from platform-core -And the system time is fixed at 1703001234567 -And a causation source with eventId "evt_abc123" and correlationId "corr_original" -When a correlation chain is derived from the source with initiatedAt 1700000000000 -Then the derived chain initiatedAt is 1700000000000 -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-020-extracts-correlation-id-and-causation-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-020-extracts-correlation-id-and-causation-id.sdp.md deleted file mode 100644 index c55f595b..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-020-extracts-correlation-id-and-causation-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.extracts-correlation-id-and-causation-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Extracts correlationId and causationId - -## Intent - -- outcome: Executable scenario: Extracts correlationId and causationId - -```gwt -Given the module is imported from platform-core -And a correlation chain with commandId "cmd_123" correlationId "corr_456" and causationId "evt_789" -When toEventMetadata is called on the chain -Then the metadata has correlationId "corr_456" and causationId "evt_789" -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-021-includes-user-id-when-present.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-021-includes-user-id-when-present.sdp.md deleted file mode 100644 index bab9fcdd..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-021-includes-user-id-when-present.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.includes-user-id-when-present -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Includes userId when present - -## Intent - -- outcome: Executable scenario: Includes userId when present - -```gwt -Given the module is imported from platform-core -And a correlation chain with commandId "cmd_123" correlationId "corr_456" causationId "cmd_123" and userId "user_abc" -When toEventMetadata is called on the chain -Then the metadata userId is "user_abc" -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-022-excludes-user-id-when-undefined.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-022-excludes-user-id-when-undefined.sdp.md deleted file mode 100644 index bade9a5f..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-022-excludes-user-id-when-undefined.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.excludes-user-id-when-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Excludes userId when undefined - -## Intent - -- outcome: Executable scenario: Excludes userId when undefined - -```gwt -Given the module is imported from platform-core -And a correlation chain with commandId "cmd_123" correlationId "corr_456" and causationId "cmd_123" -When toEventMetadata is called on the chain -Then the metadata does not contain userId -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-023-merges-additional-metadata.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-023-merges-additional-metadata.sdp.md deleted file mode 100644 index e7de187b..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-023-merges-additional-metadata.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.merges-additional-metadata -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Merges additional metadata - -## Intent - -- outcome: Executable scenario: Merges additional metadata - -```gwt -Given the module is imported from platform-core -And a correlation chain with commandId "cmd_123" correlationId "corr_456" and causationId "cmd_123" -When toEventMetadata is called with additional metadata requestId "req_xyz" and customField 42 -Then the metadata has correlationId "corr_456" and causationId "cmd_123" -And the metadata has requestId "req_xyz" and customField 42 -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-024-does-not-include-context-initiated-at-or-command-id-from-chain.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-024-does-not-include-context-initiated-at-or-command-id-from-chain.sdp.md deleted file mode 100644 index a376e557..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-024-does-not-include-context-initiated-at-or-command-id-from-chain.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.does-not-include-context-initiated-at-or-command-id-from-chain -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Does not include context, initiatedAt, or commandId from chain - -## Intent - -- outcome: Executable scenario: Does not include context, initiatedAt, or commandId from chain - -```gwt -Given the module is imported from platform-core -And a correlation chain with commandId "cmd_123" correlationId "corr_456" causationId "cmd_123" and context key "value" -When toEventMetadata is called on the chain -Then the metadata does not contain excluded fields: -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-025-returns-true-for-chains-with-same-correlation-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-025-returns-true-for-chains-with-same-correlation-id.sdp.md deleted file mode 100644 index 769049ac..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-025-returns-true-for-chains-with-same-correlation-id.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.returns-true-for-chains-with-same-correlation-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Returns true for chains with same correlationId - -## Intent - -- outcome: Executable scenario: Returns true for chains with same correlationId - -```gwt -Given the module is imported from platform-core -And chain A with commandId "cmd_1" correlationId "corr_shared" and causationId "cmd_1" -And chain B with commandId "cmd_2" correlationId "corr_shared" and causationId "evt_1" -When isCorrelated is called with chain A and chain B -Then the result is true -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-026-returns-false-for-chains-with-different-correlation-ids.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-026-returns-false-for-chains-with-different-correlation-ids.sdp.md deleted file mode 100644 index 9e93db51..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-026-returns-false-for-chains-with-different-correlation-ids.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.returns-false-for-chains-with-different-correlation-ids -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Returns false for chains with different correlationIds - -## Intent - -- outcome: Executable scenario: Returns false for chains with different correlationIds - -```gwt -Given the module is imported from platform-core -And chain A with commandId "cmd_1" correlationId "corr_first" and causationId "cmd_1" -And chain B with commandId "cmd_2" correlationId "corr_second" and causationId "evt_1" -When isCorrelated is called with chain A and chain B -Then the result is false -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-027-returns-true-when-child-causation-id-matches-parent-command-id.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-027-returns-true-when-child-causation-id-matches-parent-command-id.sdp.md deleted file mode 100644 index 971fdf4d..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-027-returns-true-when-child-causation-id-matches-parent-command-id.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.returns-true-when-child-causation-id-matches-parent-command-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Returns true when child causationId matches parent commandId - -## Intent - -- outcome: Executable scenario: Returns true when child causationId matches parent commandId - -```gwt -Given the module is imported from platform-core -And a parent chain with commandId "cmd_parent" correlationId "corr_shared" and causationId "cmd_parent" -And a child chain with commandId "cmd_child" correlationId "corr_shared" and causationId "cmd_parent" -When isCausedBy is called with parent and child -Then the result is true -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-028-returns-false-when-child-causation-id-does-not-match.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-028-returns-false-when-child-causation-id-does-not-match.sdp.md deleted file mode 100644 index 54165693..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-028-returns-false-when-child-causation-id-does-not-match.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.returns-false-when-child-causation-id-does-not-match -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Returns false when child causationId does not match - -## Intent - -- outcome: Executable scenario: Returns false when child causationId does not match - -```gwt -Given the module is imported from platform-core -And a parent chain with commandId "cmd_parent" correlationId "corr_shared" and causationId "cmd_parent" -And a child chain with commandId "cmd_child" correlationId "corr_shared" and causationId "evt_other" -When isCausedBy is called with parent and child -Then the result is false -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-029-returns-true-for-same-chain-where-command-is-its-own-cause.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-029-returns-true-for-same-chain-where-command-is-its-own-cause.sdp.md deleted file mode 100644 index 7c2be8e3..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-029-returns-true-for-same-chain-where-command-is-its-own-cause.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.returns-true-for-same-chain-where-command-is-its-own-cause -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Returns true for same chain where command is its own cause - -## Intent - -- outcome: Executable scenario: Returns true for same chain where command is its own cause - -```gwt -Given the module is imported from platform-core -And a self-referencing chain with commandId "cmd_1" correlationId "corr_1" and causationId "cmd_1" -When isCausedBy is called with the same chain as both parent and child -Then the result is true -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-030-full-request-flow-tracing-from-user-command-through-saga-reaction.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-030-full-request-flow-tracing-from-user-command-through-saga-reaction.sdp.md deleted file mode 100644 index 9e76f459..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-030-full-request-flow-tracing-from-user-command-through-saga-reaction.sdp.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.full-request-flow-tracing-from-user-command-through-saga-reaction -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Full request flow tracing from user command through saga reaction - -## Intent - -- outcome: Executable scenario: Full request flow tracing from user command through saga reaction - -```gwt -Given the module is imported from platform-core -And the system time is fixed at 1703001234567 -When a correlation chain is created with commandId "cmd_submit_001" userId "user_123" and context source "web-ui" and toEventMetadata is called on the submit chain and a saga derives a chain from event "evt_order_submitted_001" using the submit… -Then the chain commandId is "cmd_submit_001" -And the chain causationId is "cmd_submit_001" -And the submit metadata correlationId matches the chain correlationId -And the saga chain correlationId matches the submit chain correlationId -And the saga chain causationId is "evt_order_submitted_001" -And the saga chain userId is "user_123" -And the saga chain context equals source "web-ui" -And the submit chain and saga chain are correlated -``` diff --git a/specs/behavior/platform-core/correlation/chain.examples/s-031-multi-step-saga-preserves-correlation-id-across-three-links.sdp.md b/specs/behavior/platform-core/correlation/chain.examples/s-031-multi-step-saga-preserves-correlation-id-across-three-links.sdp.md deleted file mode 100644 index 8b2f9390..00000000 --- a/specs/behavior/platform-core/correlation/chain.examples/s-031-multi-step-saga-preserves-correlation-id-across-three-links.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.chain.multi-step-saga-preserves-correlation-id-across-three-links -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.chain ---- -# Multi-step saga preserves correlationId across three links - -## Intent - -- outcome: Executable scenario: Multi-step saga preserves correlationId across three links - -```gwt -Given the module is imported from platform-core -And the system time is fixed at 1703001234567 -When an initial chain is created with commandId "cmd_1" and correlationId "corr_saga_flow" and chain2 is derived from event "evt_1" using the initial chain correlationId and chain3 is derived from event "evt_2" using chain2 correlationId -Then all three chains share correlationId "corr_saga_flow" -And chain2 causationId is "evt_1" -And chain3 causationId is "evt_2" -And all three chains are pairwise correlated -``` diff --git a/specs/behavior/platform-core/correlation/chain.sdp.md b/specs/behavior/platform-core/correlation/chain.sdp.md index f7c8cfa7..c090ab7a 100644 --- a/specs/behavior/platform-core/correlation/chain.sdp.md +++ b/specs/behavior/platform-core/correlation/chain.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.correlation.chain kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,8 +10,8 @@ relations: ## Intent -- actor: a platform developer -- outcome: correlation chain utilities that create, derive, and inspect chains so that I can trace causation through command-event flows +- outcome: Create, derive, and inspect correlation chains so causation can be traced through command-event flows. +- value: Request-scoped correlationId and causationId survive saga reactions and metadata extraction. ## Behavior diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-001-record-a-new-correlation.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-001-record-a-new-correlation.sdp.md deleted file mode 100644 index 047e6326..00000000 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-001-record-a-new-correlation.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.correlation-service.record-a-new-correlation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.correlation-service ---- -# Record a new correlation - -## Intent - -- outcome: Executable scenario: Record a new correlation - -```gwt -Given the feature fixture is in place -When a correlation is recorded with commandId "cmd_123", eventIds "evt_456", commandType "CreateOrder", and boundedContext "orders" -Then the record result is true -And the client was called with the correct arguments -``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-002-merge-event-i-ds-for-existing-correlation.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-002-merge-event-i-ds-for-existing-correlation.sdp.md deleted file mode 100644 index a4ccb578..00000000 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-002-merge-event-i-ds-for-existing-correlation.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.correlation-service.merge-event-i-ds-for-existing-correlation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.correlation-service ---- -# Merge event IDs for existing correlation - -## Intent - -- outcome: Executable scenario: Merge event IDs for existing correlation - -```gwt -Given a correlation exists with commandId "cmd_123", eventId "evt_1", commandType "CreateOrder", and boundedContext "orders" -When a second correlation is recorded with commandId "cmd_123", eventId "evt_2", commandType "CreateOrder", and boundedContext "orders" -Then the correlation for "cmd_123" contains event IDs: -``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-003-return-null-for-non-existent-command.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-003-return-null-for-non-existent-command.sdp.md deleted file mode 100644 index 62e4bee2..00000000 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-003-return-null-for-non-existent-command.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.correlation-service.return-null-for-non-existent-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.correlation-service ---- -# Return null for non-existent command - -## Intent - -- outcome: Executable scenario: Return null for non-existent command - -```gwt -Given the feature fixture is in place -When getEventsByCommand is called with "cmd_nonexistent" -Then the result is null -``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-004-return-correlation-for-existing-command.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-004-return-correlation-for-existing-command.sdp.md deleted file mode 100644 index f0a30a22..00000000 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-004-return-correlation-for-existing-command.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.correlation-service.return-correlation-for-existing-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.correlation-service ---- -# Return correlation for existing command - -## Intent - -- outcome: Executable scenario: Return correlation for existing command - -```gwt -Given a correlation exists with commandId "cmd_123", eventIds "evt_456,evt_789", commandType "CreateOrder", and boundedContext "orders" -When getEventsByCommand is called with "cmd_123" -Then the returned correlation has all properties: -And the returned correlation has eventIds "evt_456" and "evt_789" -``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-005-filter-by-bounded-context.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-005-filter-by-bounded-context.sdp.md deleted file mode 100644 index 6d93d7d4..00000000 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-005-filter-by-bounded-context.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.correlation-service.filter-by-bounded-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.correlation-service ---- -# Filter by bounded context - -## Intent - -- outcome: Executable scenario: Filter by bounded context - -```gwt -Given seeded correlations exist across contexts -When getCorrelationsByContext is called with boundedContext "orders" -Then the result has 2 correlations all with boundedContext "orders" -``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-006-throw-when-bounded-context-is-missing.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-006-throw-when-bounded-context-is-missing.sdp.md deleted file mode 100644 index 81374b34..00000000 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-006-throw-when-bounded-context-is-missing.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.correlation-service.throw-when-bounded-context-is-missing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.correlation-service ---- -# Throw when boundedContext is missing - -## Intent - -- outcome: Executable scenario: Throw when boundedContext is missing - -```gwt -Given the feature fixture is in place -When getCorrelationsByContext is called with an empty object -Then it throws "boundedContext is required for getCorrelationsByContext" -``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-007-respect-limit-parameter.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-007-respect-limit-parameter.sdp.md deleted file mode 100644 index 34cce786..00000000 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-007-respect-limit-parameter.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.correlation-service.respect-limit-parameter -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.correlation-service ---- -# Respect limit parameter - -## Intent - -- outcome: Executable scenario: Respect limit parameter - -```gwt -Given seeded correlations exist across contexts -When getCorrelationsByContext is called with boundedContext "orders" and limit 1 -Then the result has 1 correlation -``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-008-return-true-for-command-with-events.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-008-return-true-for-command-with-events.sdp.md deleted file mode 100644 index 8e424e19..00000000 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-008-return-true-for-command-with-events.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.correlation-service.return-true-for-command-with-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.correlation-service ---- -# Return true for command with events - -## Intent - -- outcome: Executable scenario: Return true for command with events - -```gwt -Given a correlation exists with commandId "cmd_123", eventId "evt_456", commandType "CreateOrder", and boundedContext "orders" -When hasCorrelation is called with "cmd_123" -Then the hasCorrelation result is true -``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-009-return-false-for-non-existent-command.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-009-return-false-for-non-existent-command.sdp.md deleted file mode 100644 index 31d57bdb..00000000 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-009-return-false-for-non-existent-command.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.correlation-service.return-false-for-non-existent-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.correlation-service ---- -# Return false for non-existent command - -## Intent - -- outcome: Executable scenario: Return false for non-existent command - -```gwt -Given the feature fixture is in place -When hasCorrelation is called with "cmd_nonexistent" -Then the hasCorrelation result is false -``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-010-return-event-count-for-existing-command.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-010-return-event-count-for-existing-command.sdp.md deleted file mode 100644 index a8928a56..00000000 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-010-return-event-count-for-existing-command.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.correlation-service.return-event-count-for-existing-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.correlation-service ---- -# Return event count for existing command - -## Intent - -- outcome: Executable scenario: Return event count for existing command - -```gwt -Given a correlation exists with commandId "cmd_123", eventIds "evt_1,evt_2,evt_3", commandType "CreateOrder", and boundedContext "orders" -When getEventCount is called with "cmd_123" -Then the event count is 3 -``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-011-return-0-for-non-existent-command.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-011-return-0-for-non-existent-command.sdp.md deleted file mode 100644 index 528341d4..00000000 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-011-return-0-for-non-existent-command.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.correlation-service.return-0-for-non-existent-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.correlation-service ---- -# Return 0 for non-existent command - -## Intent - -- outcome: Executable scenario: Return 0 for non-existent command - -```gwt -Given the feature fixture is in place -When getEventCount is called with "cmd_nonexistent" -Then the event count is 0 -``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.examples/s-012-create-a-correlation-service-instance.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.examples/s-012-create-a-correlation-service-instance.sdp.md deleted file mode 100644 index 59d312f5..00000000 --- a/specs/behavior/platform-core/correlation/correlation-service.examples/s-012-create-a-correlation-service-instance.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.correlation.correlation-service.create-a-correlation-service-instance -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.correlation.correlation-service ---- -# Create a CorrelationService instance - -## Intent - -- outcome: Executable scenario: Create a CorrelationService instance - -```gwt -Given the feature fixture is in place -When createCorrelationService is called with a mock client -Then the result is an instance of CorrelationService -``` diff --git a/specs/behavior/platform-core/correlation/correlation-service.sdp.md b/specs/behavior/platform-core/correlation/correlation-service.sdp.md index e8031dfb..68fd6c56 100644 --- a/specs/behavior/platform-core/correlation/correlation-service.sdp.md +++ b/specs/behavior/platform-core/correlation/correlation-service.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.correlation.correlation-service kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,8 +10,8 @@ relations: ## Intent -- actor: a platform developer -- outcome: a correlation service that tracks command-to-event relationships so that I can trace which events resulted from which commands +- outcome: Track command-to-event relationships so callers can trace which events resulted from which commands. +- value: The service records, merges, queries, and counts correlations by command and bounded context. ## Behavior diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-001-successful-execution-without-scope-operations.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-001-successful-execution-without-scope-operations.sdp.md deleted file mode 100644 index 15d80bda..00000000 --- a/specs/behavior/platform-core/dcb/execute.examples/s-001-successful-execution-without-scope-operations.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.execute.successful-execution-without-scope-operations -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.execute ---- -# Successful execution without scopeOperations - -## Intent - -- outcome: Executable scenario: Successful execution without scopeOperations - -```gwt -Given a mock mutation context -And a scope key "tenant:t1:reservation:res_123" -And entities with streamIds "product_1" and "product_2" -And a decider that succeeds with event type "ItemsReserved" -And no scopeOperations are provided -When I execute the DCB operation -Then the result status is "success" -And the result contains event type "ItemsReserved" -And the result scopeVersion is 1 -``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-002-successful-execution-includes-schema-version-and-category-in-events.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-002-successful-execution-includes-schema-version-and-category-in-events.sdp.md deleted file mode 100644 index 763fffe4..00000000 --- a/specs/behavior/platform-core/dcb/execute.examples/s-002-successful-execution-includes-schema-version-and-category-in-events.sdp.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.execute.successful-execution-includes-schema-version-and-category-in-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.execute ---- -# Successful execution includes schemaVersion and category in events - -## Intent - -- outcome: Executable scenario: Successful execution includes schemaVersion and category in events - -```gwt -Given a mock mutation context -And a scope key "tenant:t1:reservation:res_123" -And entities with streamIds "product_1" and "product_2" -And a decider that succeeds with event type "ItemsReserved" -And schemaVersion is 2 -And eventCategory is "domain" -When I execute the DCB operation -Then the result status is "success" -And the generated event has schemaVersion 2 -And the generated event has category "domain" -``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-003-rejected-decider-result-returns-rejection.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-003-rejected-decider-result-returns-rejection.sdp.md deleted file mode 100644 index 47864b75..00000000 --- a/specs/behavior/platform-core/dcb/execute.examples/s-003-rejected-decider-result-returns-rejection.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.execute.rejected-decider-result-returns-rejection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.execute ---- -# Rejected decider result returns rejection - -## Intent - -- outcome: Executable scenario: Rejected decider result returns rejection - -```gwt -Given a mock mutation context -And a scope key "tenant:t1:reservation:res_123" -And entities with streamIds "product_1" and "product_2" -And a decider that rejects with code "INSUFFICIENT_STOCK" and message "Not enough stock" -When I execute the DCB operation -Then the result status is "rejected" -And the rejection code is "INSUFFICIENT_STOCK" -And the rejection reason is "Not enough stock" -``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-004-failed-decider-result-returns-failure-with-event.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-004-failed-decider-result-returns-failure-with-event.sdp.md deleted file mode 100644 index c53826f7..00000000 --- a/specs/behavior/platform-core/dcb/execute.examples/s-004-failed-decider-result-returns-failure-with-event.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.execute.failed-decider-result-returns-failure-with-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.execute ---- -# Failed decider result returns failure with event - -## Intent - -- outcome: Executable scenario: Failed decider result returns failure with event - -```gwt -Given a mock mutation context -And a scope key "tenant:t1:reservation:res_123" -And entities with streamIds "product_1" and "product_2" -And a decider that fails with event type "ReservationFailed" and reason "Stock unavailable" -When I execute the DCB operation -Then the result status is "failed" -And the failure reason is "Stock unavailable" -And the result contains event type "ReservationFailed" -``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-005-occ-pre-check-passes-when-expected-version-matches-scope-version.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-005-occ-pre-check-passes-when-expected-version-matches-scope-version.sdp.md deleted file mode 100644 index ff7ace9d..00000000 --- a/specs/behavior/platform-core/dcb/execute.examples/s-005-occ-pre-check-passes-when-expected-version-matches-scope-version.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.execute.occ-pre-check-passes-when-expected-version-matches-scope-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.execute ---- -# OCC pre-check passes when expectedVersion matches scope version - -## Intent - -- outcome: Executable scenario: OCC pre-check passes when expectedVersion matches scope version - -```gwt -Given a mock mutation context -And a scope key "tenant:t1:reservation:res_123" -And entities with streamIds "product_1" and "product_2" -And scopeOperations that return scope with currentVersion 0 -And expectedVersion is 0 -And a decider that succeeds -And scopeOperations commitScope succeeds with newVersion 1 -When I execute the DCB operation -Then the result status is "success" -``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-006-occ-pre-check-detects-stale-expected-version.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-006-occ-pre-check-detects-stale-expected-version.sdp.md deleted file mode 100644 index 70fd12b5..00000000 --- a/specs/behavior/platform-core/dcb/execute.examples/s-006-occ-pre-check-detects-stale-expected-version.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.execute.occ-pre-check-detects-stale-expected-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.execute ---- -# OCC pre-check detects stale expectedVersion - -## Intent - -- outcome: Executable scenario: OCC pre-check detects stale expectedVersion - -```gwt -Given a mock mutation context -And a scope key "tenant:t1:reservation:res_123" -And entities with streamIds "product_1" and "product_2" -And scopeOperations that return scope with currentVersion 5 -And expectedVersion is 3 -When I execute the DCB operation -Then the result status is "conflict" -And the conflict currentVersion is 5 -``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-007-occ-pre-check-detects-scope-not-found-when-expected-version-0.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-007-occ-pre-check-detects-scope-not-found-when-expected-version-0.sdp.md deleted file mode 100644 index ec37bad2..00000000 --- a/specs/behavior/platform-core/dcb/execute.examples/s-007-occ-pre-check-detects-scope-not-found-when-expected-version-0.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.execute.occ-pre-check-detects-scope-not-found-when-expected-version-0 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.execute ---- -# OCC pre-check detects scope not found when expectedVersion ) 0 - -## Intent - -- outcome: Executable scenario: OCC pre-check detects scope not found when expectedVersion ) 0 - -```gwt -Given a mock mutation context -And a scope key "tenant:t1:reservation:res_123" -And entities with streamIds "product_1" and "product_2" -And scopeOperations that return null scope -And expectedVersion is 1 -When I execute the DCB operation -Then the result status is "conflict" -And the conflict currentVersion is 0 -``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-008-occ-pre-check-allows-new-scope-with-expected-version-0.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-008-occ-pre-check-allows-new-scope-with-expected-version-0.sdp.md deleted file mode 100644 index 5dd2aa69..00000000 --- a/specs/behavior/platform-core/dcb/execute.examples/s-008-occ-pre-check-allows-new-scope-with-expected-version-0.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.execute.occ-pre-check-allows-new-scope-with-expected-version-0 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.execute ---- -# OCC pre-check allows new scope with expectedVersion 0 - -## Intent - -- outcome: Executable scenario: OCC pre-check allows new scope with expectedVersion 0 - -```gwt -Given a mock mutation context -And a scope key "tenant:t1:reservation:res_123" -And entities with streamIds "product_1" and "product_2" -And scopeOperations that return null scope -And expectedVersion is 0 -And a decider that succeeds -And scopeOperations commitScope succeeds with newVersion 1 -When I execute the DCB operation -Then the result status is "success" -``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-009-occ-commit-detects-concurrent-modification.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-009-occ-commit-detects-concurrent-modification.sdp.md deleted file mode 100644 index 03361ad7..00000000 --- a/specs/behavior/platform-core/dcb/execute.examples/s-009-occ-commit-detects-concurrent-modification.sdp.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.execute.occ-commit-detects-concurrent-modification -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.execute ---- -# OCC commit detects concurrent modification - -## Intent - -- outcome: Executable scenario: OCC commit detects concurrent modification - -```gwt -Given a mock mutation context -And a scope key "tenant:t1:reservation:res_123" -And entities with streamIds "product_1" and "product_2" -And scopeOperations that return scope with currentVersion 0 -And expectedVersion is 0 -And a decider that succeeds -And scopeOperations commitScope returns conflict with currentVersion 1 -When I execute the DCB operation -Then the result status is "conflict" -And the conflict currentVersion is 1 -``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-010-occ-commit-tracks-updated-stream-i-ds.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-010-occ-commit-tracks-updated-stream-i-ds.sdp.md deleted file mode 100644 index f72ba6a5..00000000 --- a/specs/behavior/platform-core/dcb/execute.examples/s-010-occ-commit-tracks-updated-stream-i-ds.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.execute.occ-commit-tracks-updated-stream-i-ds -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.execute ---- -# OCC commit tracks updated stream IDs - -## Intent - -- outcome: Executable scenario: OCC commit tracks updated stream IDs - -```gwt -Given a mock mutation context -And a scope key "tenant:t1:reservation:res_123" -And entities with streamIds "product_1" and "product_2" -And scopeOperations that return scope with currentVersion 0 -And expectedVersion is 0 -And a decider that succeeds with updates to "product_1" and "product_2" -And scopeOperations commitScope is called -When I execute the DCB operation -Then commitScope was called with streamIds "product_1" and "product_2" -``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-011-invalid-scope-key-returns-rejection.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-011-invalid-scope-key-returns-rejection.sdp.md deleted file mode 100644 index bbfd7919..00000000 --- a/specs/behavior/platform-core/dcb/execute.examples/s-011-invalid-scope-key-returns-rejection.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.execute.invalid-scope-key-returns-rejection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.execute ---- -# Invalid scope key returns rejection - -## Intent - -- outcome: Executable scenario: Invalid scope key returns rejection - -```gwt -Given a mock mutation context -And a scope key "tenant:t1:reservation:res_123" -And entities with streamIds "product_1" and "product_2" -And an invalid scope key "invalid_key" -When I execute the DCB operation -Then the result status is "rejected" -And the rejection code contains "INVALID_SCOPE_KEY_FORMAT" -``` diff --git a/specs/behavior/platform-core/dcb/execute.examples/s-012-missing-entities-returns-rejection.sdp.md b/specs/behavior/platform-core/dcb/execute.examples/s-012-missing-entities-returns-rejection.sdp.md deleted file mode 100644 index de5b70e8..00000000 --- a/specs/behavior/platform-core/dcb/execute.examples/s-012-missing-entities-returns-rejection.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.execute.missing-entities-returns-rejection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.execute ---- -# Missing entities returns rejection - -## Intent - -- outcome: Executable scenario: Missing entities returns rejection - -```gwt -Given a mock mutation context -And a scope key "tenant:t1:reservation:res_123" -And entities with streamIds "product_1" and "product_2" -And entities where "product_1" exists but "product_2" does not -When I execute the DCB operation -Then the result status is "rejected" -And the rejection code is "ENTITIES_NOT_FOUND" -And the rejection reason contains "product_2" -``` diff --git a/specs/behavior/platform-core/dcb/execute.sdp.md b/specs/behavior/platform-core/dcb/execute.sdp.md index 3ff14a26..d5ebc417 100644 --- a/specs/behavior/platform-core/dcb/execute.sdp.md +++ b/specs/behavior/platform-core/dcb/execute.sdp.md @@ -11,4 +11,42 @@ relations: ## Intent - actor: a platform developer -- outcome: executeWithDCB to enforce scope-level OCC so that cross-entity invariants are protected from concurrent modifications +- outcome: executeWithDCB enforces scope-level OCC so cross-entity invariants are protected from concurrent modifications. +- value: Cross-entity invariants stay protected when multiple entities change in one scope. + +## Example space + +```gwt-vocabulary +Given a mock mutation context +And a scope key {scopeKey:string} +And entities with streamIds {streamId1:string} and {streamId2:string} +And a decider that succeeds with event type {eventType:string} +And no scopeOperations are provided +And schemaVersion is {schemaVersion:number} +And eventCategory is {eventCategory:string} +And a decider that rejects with code {rejectionCode:string} and message {rejectionMessage:string} +And a decider that fails with event type {eventType:string} and reason {failureReason:string} +And scopeOperations that return scope with currentVersion {currentVersion:number} +And expectedVersion is {expectedVersion:number} +And a decider that succeeds +And scopeOperations commitScope succeeds with newVersion {newVersion:number} +And scopeOperations that return null scope +And scopeOperations commitScope returns conflict with currentVersion {conflictVersion:number} +And a decider that succeeds with updates to {streamId1:string} and {streamId2:string} +And scopeOperations commitScope is called +And an invalid scope key {invalidScopeKey:string} +And entities where {existingStreamId:string} exists but {missingStreamId:string} does not +When I execute the DCB operation +Then the result status is {status:"success"|"rejected"|"failed"|"conflict"} +And the result contains event type {eventType:string} +And the result scopeVersion is {scopeVersion:number} +And the generated event has schemaVersion {schemaVersion:number} +And the generated event has category {eventCategory:string} +And the rejection code is {rejectionCode:string} +And the rejection reason is {rejectionReason:string} +And the failure reason is {failureReason:string} +And the conflict currentVersion is {conflictVersion:number} +And commitScope was called with streamIds {streamId1:string} and {streamId2:string} +And the rejection code contains {rejectionCodePart:string} +And the rejection reason contains {missingStreamId:string} +``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-001-create-valid-scope-key-from-components.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-001-create-valid-scope-key-from-components.sdp.md deleted file mode 100644 index 0497272e..00000000 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-001-create-valid-scope-key-from-components.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.scope-key.create-valid-scope-key-from-components -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.scope-key ---- -# Create valid scope key from components - -## Intent - -- outcome: Executable scenario: Create valid scope key from components - -```gwt -Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" -And the tenant prefix is "tenant:" for mandatory tenant isolation -When I call createScopeKey with tenantId "t123", scopeType "reservation", scopeId "res_456" -Then I receive scope key "tenant:t123:reservation:res_456" -And the result is a branded DCBScopeKey type -``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-002-scope-id-may-contain-colons-for-composite-identifiers.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-002-scope-id-may-contain-colons-for-composite-identifiers.sdp.md deleted file mode 100644 index 9e4d2e72..00000000 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-002-scope-id-may-contain-colons-for-composite-identifiers.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.scope-key.scope-id-may-contain-colons-for-composite-identifiers -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.scope-key ---- -# Scope ID may contain colons for composite identifiers - -## Intent - -- outcome: Executable scenario: Scope ID may contain colons for composite identifiers - -```gwt -Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" -And the tenant prefix is "tenant:" for mandatory tenant isolation -When I call createScopeKey with tenantId "t1", scopeType "order", scopeId "ord:2024:001" -Then I receive scope key "tenant:t1:order:ord:2024:001" -``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-003-create-scope-key-throws-on-invalid-input.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-003-create-scope-key-throws-on-invalid-input.sdp.md deleted file mode 100644 index 53a08c4a..00000000 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-003-create-scope-key-throws-on-invalid-input.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.scope-key.create-scope-key-throws-on-invalid-input -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.scope-key ---- -# createScopeKey throws on invalid input - -## Intent - -- outcome: Executable scenario: createScopeKey throws on invalid input - -```gwt -Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" -And the tenant prefix is "tenant:" for mandatory tenant isolation -When I call createScopeKey with tenantId "value", scopeType "value", scopeId "value" -Then an error is thrown with message containing "value" -``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-004-try-create-scope-key-returns-scope-key-for-valid-input.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-004-try-create-scope-key-returns-scope-key-for-valid-input.sdp.md deleted file mode 100644 index 26871d16..00000000 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-004-try-create-scope-key-returns-scope-key-for-valid-input.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.scope-key.try-create-scope-key-returns-scope-key-for-valid-input -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.scope-key ---- -# tryCreateScopeKey returns scope key for valid input - -## Intent - -- outcome: Executable scenario: tryCreateScopeKey returns scope key for valid input - -```gwt -Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" -And the tenant prefix is "tenant:" for mandatory tenant isolation -When I call tryCreateScopeKey with tenantId "tenant_1", scopeType "order", scopeId "ord_789" -Then I receive scope key "tenant:tenant_1:order:ord_789" -``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-005-try-create-scope-key-returns-null-for-invalid-input.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-005-try-create-scope-key-returns-null-for-invalid-input.sdp.md deleted file mode 100644 index 2515ba0e..00000000 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-005-try-create-scope-key-returns-null-for-invalid-input.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.scope-key.try-create-scope-key-returns-null-for-invalid-input -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.scope-key ---- -# tryCreateScopeKey returns null for invalid input - -## Intent - -- outcome: Executable scenario: tryCreateScopeKey returns null for invalid input - -```gwt -Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" -And the tenant prefix is "tenant:" for mandatory tenant isolation -When I call tryCreateScopeKey with tenantId "", scopeType "order", scopeId "ord_1" -Then I receive null -``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-006-parse-valid-scope-key-into-components.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-006-parse-valid-scope-key-into-components.sdp.md deleted file mode 100644 index eb97bb3b..00000000 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-006-parse-valid-scope-key-into-components.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.scope-key.parse-valid-scope-key-into-components -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.scope-key ---- -# Parse valid scope key into components - -## Intent - -- outcome: Executable scenario: Parse valid scope key into components - -```gwt -Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" -And the tenant prefix is "tenant:" for mandatory tenant isolation -When I call parseScopeKey with "tenant:t1:order:ord_123" -Then I receive parsed scope key with: -``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-007-parse-scope-key-with-composite-scope-id-containing-colons.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-007-parse-scope-key-with-composite-scope-id-containing-colons.sdp.md deleted file mode 100644 index 50b63d42..00000000 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-007-parse-scope-key-with-composite-scope-id-containing-colons.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.scope-key.parse-scope-key-with-composite-scope-id-containing-colons -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.scope-key ---- -# Parse scope key with composite scopeId containing colons - -## Intent - -- outcome: Executable scenario: Parse scope key with composite scopeId containing colons - -```gwt -Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" -And the tenant prefix is "tenant:" for mandatory tenant isolation -When I call parseScopeKey with "tenant:t1:reservation:res:2024:summer:001" -Then I receive parsed scope key with: -``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-008-parse-scope-key-returns-null-for-invalid-format.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-008-parse-scope-key-returns-null-for-invalid-format.sdp.md deleted file mode 100644 index a96c2b0e..00000000 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-008-parse-scope-key-returns-null-for-invalid-format.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.scope-key.parse-scope-key-returns-null-for-invalid-format -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.scope-key ---- -# parseScopeKey returns null for invalid format - -## Intent - -- outcome: Executable scenario: parseScopeKey returns null for invalid format - -```gwt -Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" -And the tenant prefix is "tenant:" for mandatory tenant isolation -When I call parseScopeKey with "value" -Then I receive null -``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-009-validate-scope-key-returns-null-for-valid-scope-key.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-009-validate-scope-key-returns-null-for-valid-scope-key.sdp.md deleted file mode 100644 index a08ae905..00000000 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-009-validate-scope-key-returns-null-for-valid-scope-key.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.scope-key.validate-scope-key-returns-null-for-valid-scope-key -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.scope-key ---- -# validateScopeKey returns null for valid scope key - -## Intent - -- outcome: Executable scenario: validateScopeKey returns null for valid scope key - -```gwt -Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" -And the tenant prefix is "tenant:" for mandatory tenant isolation -When I call validateScopeKey with "tenant:t1:reservation:res_123" -Then I receive null indicating valid -``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-010-validate-scope-key-returns-scope-key-empty-error-for-empty-string.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-010-validate-scope-key-returns-scope-key-empty-error-for-empty-string.sdp.md deleted file mode 100644 index 78283dfd..00000000 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-010-validate-scope-key-returns-scope-key-empty-error-for-empty-string.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.scope-key.validate-scope-key-returns-scope-key-empty-error-for-empty-string -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.scope-key ---- -# validateScopeKey returns SCOPE_KEY_EMPTY error for empty string - -## Intent - -- outcome: Executable scenario: validateScopeKey returns SCOPE_KEY_EMPTY error for empty string - -```gwt -Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" -And the tenant prefix is "tenant:" for mandatory tenant isolation -When I call validateScopeKey with "" -Then I receive validation error with code "SCOPE_KEY_EMPTY" -And the error message contains "cannot be empty" -``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-011-validate-scope-key-returns-error-for-missing-tenant-prefix.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-011-validate-scope-key-returns-error-for-missing-tenant-prefix.sdp.md deleted file mode 100644 index 616f9fc9..00000000 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-011-validate-scope-key-returns-error-for-missing-tenant-prefix.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.scope-key.validate-scope-key-returns-error-for-missing-tenant-prefix -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.scope-key ---- -# validateScopeKey returns error for missing tenant prefix - -## Intent - -- outcome: Executable scenario: validateScopeKey returns error for missing tenant prefix - -```gwt -Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" -And the tenant prefix is "tenant:" for mandatory tenant isolation -When I call validateScopeKey with "reservation:res_123" -Then I receive validation error with code "INVALID_SCOPE_KEY_FORMAT" -And the error message contains "tenant:" -``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-012-validate-scope-key-returns-error-for-malformed-scope-key.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-012-validate-scope-key-returns-error-for-malformed-scope-key.sdp.md deleted file mode 100644 index 6ef630f1..00000000 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-012-validate-scope-key-returns-error-for-malformed-scope-key.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.scope-key.validate-scope-key-returns-error-for-malformed-scope-key -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.scope-key ---- -# validateScopeKey returns error for malformed scope key - -## Intent - -- outcome: Executable scenario: validateScopeKey returns error for malformed scope key - -```gwt -Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" -And the tenant prefix is "tenant:" for mandatory tenant isolation -When I call validateScopeKey with "tenant:t1:reservation" -Then I receive validation error with code "INVALID_SCOPE_KEY_FORMAT" -``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-013-is-valid-scope-key-type-guard.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-013-is-valid-scope-key-type-guard.sdp.md deleted file mode 100644 index b62d759c..00000000 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-013-is-valid-scope-key-type-guard.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.scope-key.is-valid-scope-key-type-guard -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.scope-key ---- -# isValidScopeKey type guard - -## Intent - -- outcome: Executable scenario: isValidScopeKey type guard - -```gwt -Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" -And the tenant prefix is "tenant:" for mandatory tenant isolation -When I call isValidScopeKey with "value" -Then I receive value -``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-014-assert-valid-scope-key-throws-on-invalid-input.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-014-assert-valid-scope-key-throws-on-invalid-input.sdp.md deleted file mode 100644 index 59acb044..00000000 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-014-assert-valid-scope-key-throws-on-invalid-input.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.scope-key.assert-valid-scope-key-throws-on-invalid-input -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.scope-key ---- -# assertValidScopeKey throws on invalid input - -## Intent - -- outcome: Executable scenario: assertValidScopeKey throws on invalid input - -```gwt -Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" -And the tenant prefix is "tenant:" for mandatory tenant isolation -When I call assertValidScopeKey with "invalid_scope" -Then an error is thrown with message containing "INVALID_SCOPE_KEY_FORMAT" -``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-015-assert-valid-scope-key-succeeds-on-valid-input.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-015-assert-valid-scope-key-succeeds-on-valid-input.sdp.md deleted file mode 100644 index 7dd763d0..00000000 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-015-assert-valid-scope-key-succeeds-on-valid-input.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.scope-key.assert-valid-scope-key-succeeds-on-valid-input -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.scope-key ---- -# assertValidScopeKey succeeds on valid input - -## Intent - -- outcome: Executable scenario: assertValidScopeKey succeeds on valid input - -```gwt -Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" -And the tenant prefix is "tenant:" for mandatory tenant isolation -When I call assertValidScopeKey with "tenant:t1:order:ord_1" -Then no error is thrown -``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-016-is-scope-tenant-checks-tenant-membership.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-016-is-scope-tenant-checks-tenant-membership.sdp.md deleted file mode 100644 index c161edd9..00000000 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-016-is-scope-tenant-checks-tenant-membership.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.scope-key.is-scope-tenant-checks-tenant-membership -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.scope-key ---- -# isScopeTenant checks tenant membership - -## Intent - -- outcome: Executable scenario: isScopeTenant checks tenant membership - -```gwt -Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" -And the tenant prefix is "tenant:" for mandatory tenant isolation -And a valid scope key "tenant:t1:order:ord_123" -When I call isScopeTenant with tenantId "value" -Then I receive value -``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-017-extract-tenant-id-returns-tenant-id-from-scope-key.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-017-extract-tenant-id-returns-tenant-id-from-scope-key.sdp.md deleted file mode 100644 index 31fe9018..00000000 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-017-extract-tenant-id-returns-tenant-id-from-scope-key.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.scope-key.extract-tenant-id-returns-tenant-id-from-scope-key -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.scope-key ---- -# extractTenantId returns tenant ID from scope key - -## Intent - -- outcome: Executable scenario: extractTenantId returns tenant ID from scope key - -```gwt -Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" -And the tenant prefix is "tenant:" for mandatory tenant isolation -And a valid scope key "tenant:tenant_abc:reservation:res_001" -When I call extractTenantId -Then I receive "tenant_abc" -``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-018-extract-scope-type-returns-scope-type-from-scope-key.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-018-extract-scope-type-returns-scope-type-from-scope-key.sdp.md deleted file mode 100644 index b42bfdbd..00000000 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-018-extract-scope-type-returns-scope-type-from-scope-key.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.scope-key.extract-scope-type-returns-scope-type-from-scope-key -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.scope-key ---- -# extractScopeType returns scope type from scope key - -## Intent - -- outcome: Executable scenario: extractScopeType returns scope type from scope key - -```gwt -Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" -And the tenant prefix is "tenant:" for mandatory tenant isolation -And a valid scope key "tenant:t1:reservation:res_001" -When I call extractScopeType -Then I receive "reservation" -``` diff --git a/specs/behavior/platform-core/dcb/scope-key.examples/s-019-extract-scope-id-returns-scope-id-from-scope-key.sdp.md b/specs/behavior/platform-core/dcb/scope-key.examples/s-019-extract-scope-id-returns-scope-id-from-scope-key.sdp.md deleted file mode 100644 index dbd6031e..00000000 --- a/specs/behavior/platform-core/dcb/scope-key.examples/s-019-extract-scope-id-returns-scope-id-from-scope-key.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.dcb.scope-key.extract-scope-id-returns-scope-id-from-scope-key -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.dcb.scope-key ---- -# extractScopeId returns scope ID from scope key - -## Intent - -- outcome: Executable scenario: extractScopeId returns scope ID from scope key - -```gwt -Given the scope key format is "tenant:${tenantId}:${scopeType}:${scopeId}" -And the tenant prefix is "tenant:" for mandatory tenant isolation -And a valid scope key "tenant:t1:order:ord:2024:001" -When I call extractScopeId -Then I receive "ord:2024:001" -``` diff --git a/specs/behavior/platform-core/dcb/scope-key.sdp.md b/specs/behavior/platform-core/dcb/scope-key.sdp.md index 21745cb0..c84533c4 100644 --- a/specs/behavior/platform-core/dcb/scope-key.sdp.md +++ b/specs/behavior/platform-core/dcb/scope-key.sdp.md @@ -11,4 +11,6 @@ relations: ## Intent - actor: a platform developer -- outcome: standardized scope key creation and parsing utilities so that I can ensure tenant isolation in DCB operations +- outcome: Standardized scope-key creation and parsing utilities keep DCB operations tenant-isolated. +- value: Tenant isolation can be checked from a single scope-key format. + diff --git a/specs/behavior/platform-core/decider/factory.examples/s-001-handler-calls-load-state-with-correct-entity-id.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-001-handler-calls-load-state-with-correct-entity-id.sdp.md deleted file mode 100644 index dfc0da9f..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-001-handler-calls-load-state-with-correct-entity-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.handler-calls-load-state-with-correct-entity-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Handler calls loadState with correct entityId - -## Intent - -- outcome: Executable scenario: Handler calls loadState with correct entityId - -```gwt -Given a decider handler configured with a success decider -And loadState returns a CMS with id "test-1" and version 1 -When the handler processes a command with entityId "test-1" -Then loadState was called with entityId "test-1" -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-002-handler-calls-decider-with-state-command-input-and-context.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-002-handler-calls-decider-with-state-command-input-and-context.sdp.md deleted file mode 100644 index a3d024c8..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-002-handler-calls-decider-with-state-command-input-and-context.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.handler-calls-decider-with-state-command-input-and-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Handler calls decider with state, command input, and context - -## Intent - -- outcome: Executable scenario: Handler calls decider with state, command input, and context - -```gwt -Given a decider handler configured with a mock decider -And loadState returns a CMS with id "test-1" and version 1 -When the handler processes a command with entityId "test-1" and newValue 101 -Then the mock decider was called with the CMS state -And the mock decider received command input with entityId "test-1" and newValue 101 -And the mock decider received context with commandId "cmd-1" and correlationId "corr-1" -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-003-handler-calls-apply-update-with-correct-parameters.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-003-handler-calls-apply-update-with-correct-parameters.sdp.md deleted file mode 100644 index b406e537..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-003-handler-calls-apply-update-with-correct-parameters.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.handler-calls-apply-update-with-correct-parameters -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Handler calls applyUpdate with correct parameters - -## Intent - -- outcome: Executable scenario: Handler calls applyUpdate with correct parameters - -```gwt -Given a decider handler configured with a success decider -And loadState returns a CMS with id "test-1" and version 5 -When the handler processes a command with entityId "test-1" and newValue 200 -Then applyUpdate was called with docId "doc-1" and stateUpdate value 200 and version 6 -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-004-handler-returns-success-result-with-correct-structure.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-004-handler-returns-success-result-with-correct-structure.sdp.md deleted file mode 100644 index deb4343f..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-004-handler-returns-success-result-with-correct-structure.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.handler-returns-success-result-with-correct-structure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Handler returns success result with correct structure - -## Intent - -- outcome: Executable scenario: Handler returns success result with correct structure - -```gwt -Given a decider handler configured with a success decider -And loadState returns a CMS with id "test-1" and version 1 -When the handler processes a command with entityId "test-1" -Then the result status is "success" -And the result has all success fields: -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-005-handler-increments-version-correctly-from-existing-version.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-005-handler-increments-version-correctly-from-existing-version.sdp.md deleted file mode 100644 index 524862ee..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-005-handler-increments-version-correctly-from-existing-version.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.handler-increments-version-correctly-from-existing-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Handler increments version correctly from existing version - -## Intent - -- outcome: Executable scenario: Handler increments version correctly from existing version - -```gwt -Given a decider handler configured with a success decider -And loadState returns a CMS with id "test-1" and version 10 -When the handler processes a command with entityId "test-1" -Then the result status is "success" -And the result version is 11 -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-006-handler-returns-rejected-result-without-calling-apply-update.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-006-handler-returns-rejected-result-without-calling-apply-update.sdp.md deleted file mode 100644 index f4f4a057..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-006-handler-returns-rejected-result-without-calling-apply-update.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.handler-returns-rejected-result-without-calling-apply-update -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Handler returns rejected result without calling applyUpdate - -## Intent - -- outcome: Executable scenario: Handler returns rejected result without calling applyUpdate - -```gwt -Given a decider handler configured with a rejected decider -And loadState returns a CMS with id "test-1" and version 1 -When the handler processes a command with entityId "test-1" -Then the result status is "rejected" -And applyUpdate was not called -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-007-rejected-result-includes-rejection-details.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-007-rejected-result-includes-rejection-details.sdp.md deleted file mode 100644 index d3a8a2ed..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-007-rejected-result-includes-rejection-details.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.rejected-result-includes-rejection-details -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Rejected result includes rejection details - -## Intent - -- outcome: Executable scenario: Rejected result includes rejection details - -```gwt -Given a decider handler configured with a rejected decider -And loadState returns a CMS with id "test-1" and version 1 -When the handler processes a command with entityId "test-1" -Then the rejected result has all details: -And the rejected result context has reason "test" -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-008-handler-returns-failed-result-without-calling-apply-update.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-008-handler-returns-failed-result-without-calling-apply-update.sdp.md deleted file mode 100644 index 992314ac..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-008-handler-returns-failed-result-without-calling-apply-update.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.handler-returns-failed-result-without-calling-apply-update -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Handler returns failed result without calling applyUpdate - -## Intent - -- outcome: Executable scenario: Handler returns failed result without calling applyUpdate - -```gwt -Given a decider handler configured with a failed decider -And loadState returns a CMS with id "test-1" and version 1 -When the handler processes a command with entityId "test-1" -Then the result status is "failed" -And applyUpdate was not called -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-009-failed-result-includes-failure-event-and-details.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-009-failed-result-includes-failure-event-and-details.sdp.md deleted file mode 100644 index 5b1f25ee..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-009-failed-result-includes-failure-event-and-details.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.failed-result-includes-failure-event-and-details -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Failed result includes failure event and details - -## Intent - -- outcome: Executable scenario: Failed result includes failure event and details - -```gwt -Given a decider handler configured with a failed decider -And loadState returns a CMS with id "test-1" and version 3 -When the handler processes a command with entityId "test-1" -Then the failed result has all details: -And the failed result context has additionalInfo "test" -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-010-handler-propagates-load-state-errors.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-010-handler-propagates-load-state-errors.sdp.md deleted file mode 100644 index a4bd19df..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-010-handler-propagates-load-state-errors.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.handler-propagates-load-state-errors -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Handler propagates loadState errors - -## Intent - -- outcome: Executable scenario: Handler propagates loadState errors - -```gwt -Given a decider handler configured with a success decider -And loadState rejects with error "Entity not found" -When the handler processes a command expecting an error -Then the error message is "Entity not found" -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-011-handler-uses-custom-error-handler-when-provided.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-011-handler-uses-custom-error-handler-when-provided.sdp.md deleted file mode 100644 index af1f1ad5..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-011-handler-uses-custom-error-handler-when-provided.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.handler-uses-custom-error-handler-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Handler uses custom error handler when provided - -## Intent - -- outcome: Executable scenario: Handler uses custom error handler when provided - -```gwt -Given a decider handler configured with a success decider and a custom error handler returning rejection "NOT_FOUND" -And loadState rejects with error "Not found" -When the handler processes a command with entityId "test-1" -Then the custom error handler was called -And the result status is "rejected" -And the result rejection code is "NOT_FOUND" -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-012-handler-rethrows-when-custom-error-handler-returns-nothing.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-012-handler-rethrows-when-custom-error-handler-returns-nothing.sdp.md deleted file mode 100644 index 5614f8b8..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-012-handler-rethrows-when-custom-error-handler-returns-nothing.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.handler-rethrows-when-custom-error-handler-returns-nothing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Handler rethrows when custom error handler returns nothing - -## Intent - -- outcome: Executable scenario: Handler rethrows when custom error handler returns nothing - -```gwt -Given a decider handler configured with a success decider and a custom error handler returning undefined -And loadState rejects with error "Unknown error" -When the handler processes a command expecting an error -Then the error message is "Unknown error" -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-013-handler-logs-debug-on-success.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-013-handler-logs-debug-on-success.sdp.md deleted file mode 100644 index 7f31b112..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-013-handler-logs-debug-on-success.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.handler-logs-debug-on-success -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Handler logs debug on success - -## Intent - -- outcome: Executable scenario: Handler logs debug on success - -```gwt -Given a decider handler configured with a success decider and a logger -And loadState returns a CMS with id "test-1" and version 1 -When the handler processes a command with entityId "test-1" -Then the logger debug was called with messages: -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-014-handler-logs-debug-on-rejection.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-014-handler-logs-debug-on-rejection.sdp.md deleted file mode 100644 index 90c982e5..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-014-handler-logs-debug-on-rejection.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.handler-logs-debug-on-rejection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Handler logs debug on rejection - -## Intent - -- outcome: Executable scenario: Handler logs debug on rejection - -```gwt -Given a decider handler configured with a rejected decider and a logger -And loadState returns a CMS with id "test-1" and version 1 -When the handler processes a command with entityId "test-1" -Then the logger debug was called with message "[TestHandler] Command rejected" with code "TEST_REJECTED" -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-015-handler-logs-error-on-exception.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-015-handler-logs-error-on-exception.sdp.md deleted file mode 100644 index b967b1e5..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-015-handler-logs-error-on-exception.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.handler-logs-error-on-exception -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Handler logs error on exception - -## Intent - -- outcome: Executable scenario: Handler logs error on exception - -```gwt -Given a decider handler configured with a success decider and a logger -And loadState rejects with error "Test error" -When the handler processes a command with entityId "test-1" ignoring error -Then the logger error was called with message "[TestHandler] Command error" with entityId "test-1" -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-016-handler-generates-unique-event-id-per-invocation.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-016-handler-generates-unique-event-id-per-invocation.sdp.md deleted file mode 100644 index 2c3958da..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-016-handler-generates-unique-event-id-per-invocation.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.handler-generates-unique-event-id-per-invocation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Handler generates unique eventId per invocation - -## Intent - -- outcome: Executable scenario: Handler generates unique eventId per invocation - -```gwt -Given a decider handler configured with a success decider -And loadState returns a CMS with id "test-1" and version 1 -When the handler processes two commands -Then the two events have different eventIds -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-017-handler-includes-schema-version-in-event-metadata.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-017-handler-includes-schema-version-in-event-metadata.sdp.md deleted file mode 100644 index 3fdb4545..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-017-handler-includes-schema-version-in-event-metadata.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.handler-includes-schema-version-in-event-metadata -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Handler includes schemaVersion in event metadata - -## Intent - -- outcome: Executable scenario: Handler includes schemaVersion in event metadata - -```gwt -Given a decider handler configured with a success decider and schemaVersion 3 -And loadState returns a CMS with id "test-1" and version 1 -When the handler processes a command with entityId "test-1" -Then the event metadata schemaVersion is 3 -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-018-handler-builds-correct-stream-id-from-entity-id.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-018-handler-builds-correct-stream-id-from-entity-id.sdp.md deleted file mode 100644 index 99e0b7f8..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-018-handler-builds-correct-stream-id-from-entity-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.handler-builds-correct-stream-id-from-entity-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Handler builds correct streamId from entityId - -## Intent - -- outcome: Executable scenario: Handler builds correct streamId from entityId - -```gwt -Given a decider handler configured with a success decider -And loadState returns a CMS with id "test-1" and version 1 -When the handler processes a command with entityId "my-entity-123" -Then the event streamId contains "my-entity-123" -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-019-entity-handler-calls-try-load-state-with-correct-entity-id.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-019-entity-handler-calls-try-load-state-with-correct-entity-id.sdp.md deleted file mode 100644 index 3ceccf4e..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-019-entity-handler-calls-try-load-state-with-correct-entity-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.entity-handler-calls-try-load-state-with-correct-entity-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Entity handler calls tryLoadState with correct entityId - -## Intent - -- outcome: Executable scenario: Entity handler calls tryLoadState with correct entityId - -```gwt -Given an entity decider handler configured for creation -And tryLoadState returns null -When the entity handler processes a command with entityId "test-1" -Then tryLoadState was called with entityId "test-1" -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-020-entity-handler-calls-decider-with-null-state-when-entity-does-not-exist.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-020-entity-handler-calls-decider-with-null-state-when-entity-does-not-exist.sdp.md deleted file mode 100644 index 8cf10826..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-020-entity-handler-calls-decider-with-null-state-when-entity-does-not-exist.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.entity-handler-calls-decider-with-null-state-when-entity-does-not-exist -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Entity handler calls decider with null state when entity does not exist - -## Intent - -- outcome: Executable scenario: Entity handler calls decider with null state when entity does not exist - -```gwt -Given an entity decider handler configured with a mock decider -And tryLoadState returns null -When the entity handler processes a command with entityId "test-1" -Then the entity mock decider was called with null state -And the entity mock decider received command input with entityId "test-1" -And the entity mock decider received context with commandId "cmd-1" and correlationId "corr-1" -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-021-entity-handler-calls-insert-for-new-entities.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-021-entity-handler-calls-insert-for-new-entities.sdp.md deleted file mode 100644 index 96df830b..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-021-entity-handler-calls-insert-for-new-entities.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.entity-handler-calls-insert-for-new-entities -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Entity handler calls insert for new entities - -## Intent - -- outcome: Executable scenario: Entity handler calls insert for new entities - -```gwt -Given an entity decider handler configured for creation -And tryLoadState returns null -When the entity handler processes a command with entityId "test-1" and newValue 200 -Then insert was called with entityId "test-1" and stateUpdate value 200 and status "active" and version 1 -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-022-entity-handler-returns-success-with-version-1-for-new-entities.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-022-entity-handler-returns-success-with-version-1-for-new-entities.sdp.md deleted file mode 100644 index cfe0758c..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-022-entity-handler-returns-success-with-version-1-for-new-entities.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.entity-handler-returns-success-with-version-1-for-new-entities -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Entity handler returns success with version 1 for new entities - -## Intent - -- outcome: Executable scenario: Entity handler returns success with version 1 for new entities - -```gwt -Given an entity decider handler configured for creation -And tryLoadState returns null -When the entity handler processes a command with entityId "test-1" -Then the result status is "success" -And the entity result has all success fields: -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-023-entity-handler-generates-correct-event-metadata-for-new-entities.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-023-entity-handler-generates-correct-event-metadata-for-new-entities.sdp.md deleted file mode 100644 index ea6ae4f2..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-023-entity-handler-generates-correct-event-metadata-for-new-entities.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.entity-handler-generates-correct-event-metadata-for-new-entities -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Entity handler generates correct event metadata for new entities - -## Intent - -- outcome: Executable scenario: Entity handler generates correct event metadata for new entities - -```gwt -Given an entity decider handler configured for creation -And tryLoadState returns null -When the entity handler processes a command with entityId "test-1" -Then the entity event has correct metadata: -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-024-entity-handler-calls-decider-with-existing-state-when-entity-exists.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-024-entity-handler-calls-decider-with-existing-state-when-entity-exists.sdp.md deleted file mode 100644 index 661ef674..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-024-entity-handler-calls-decider-with-existing-state-when-entity-exists.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.entity-handler-calls-decider-with-existing-state-when-entity-exists -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Entity handler calls decider with existing state when entity exists - -## Intent - -- outcome: Executable scenario: Entity handler calls decider with existing state when entity exists - -```gwt -Given an entity decider handler configured with an existence-checking mock decider -And tryLoadState returns an existing CMS with id "test-1" -When the entity handler processes a command with entityId "test-1" -Then the existence mock decider was called with the existing CMS state -And the existence mock decider received command input with entityId "test-1" -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-025-entity-handler-returns-rejection-when-entity-already-exists.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-025-entity-handler-returns-rejection-when-entity-already-exists.sdp.md deleted file mode 100644 index 688230f4..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-025-entity-handler-returns-rejection-when-entity-already-exists.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.entity-handler-returns-rejection-when-entity-already-exists -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Entity handler returns rejection when entity already exists - -## Intent - -- outcome: Executable scenario: Entity handler returns rejection when entity already exists - -```gwt -Given an entity decider handler configured for creation -And tryLoadState returns an existing CMS with id "test-1" -When the entity handler processes a command with entityId "test-1" -Then the result status is "rejected" -And the result rejection code is "ENTITY_ALREADY_EXISTS" -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-026-entity-handler-does-not-call-insert-when-entity-already-exists.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-026-entity-handler-does-not-call-insert-when-entity-already-exists.sdp.md deleted file mode 100644 index fdbb330b..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-026-entity-handler-does-not-call-insert-when-entity-already-exists.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.entity-handler-does-not-call-insert-when-entity-already-exists -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Entity handler does not call insert when entity already exists - -## Intent - -- outcome: Executable scenario: Entity handler does not call insert when entity already exists - -```gwt -Given an entity decider handler configured for creation -And tryLoadState returns an existing CMS with id "test-1" -When the entity handler processes a command with entityId "test-1" -Then insert was not called -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-027-entity-handler-returns-failed-result-with-version-0-for-non-existent-entit.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-027-entity-handler-returns-failed-result-with-version-0-for-non-existent-entit.sdp.md deleted file mode 100644 index 7fbe10c3..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-027-entity-handler-returns-failed-result-with-version-0-for-non-existent-entit.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.entity-handler-returns-failed-result-with-version-0-for-non-existent-entity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Entity handler returns failed result with version 0 for non-existent entity - -## Intent - -- outcome: Executable scenario: Entity handler returns failed result with version 0 for non-existent entity - -```gwt -Given an entity decider handler configured with a failed entity decider -And tryLoadState returns null -When the entity handler processes a command with entityId "test-1" -Then the result status is "failed" -And the entity failed result has expectedVersion 0 -And the entity failed result event type is "TestFailed" -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-028-entity-handler-does-not-call-insert-on-business-failure.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-028-entity-handler-does-not-call-insert-on-business-failure.sdp.md deleted file mode 100644 index 94587cdd..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-028-entity-handler-does-not-call-insert-on-business-failure.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.entity-handler-does-not-call-insert-on-business-failure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Entity handler does not call insert on business failure - -## Intent - -- outcome: Executable scenario: Entity handler does not call insert on business failure - -```gwt -Given an entity decider handler configured with a failed entity decider -And tryLoadState returns null -When the entity handler processes a command with entityId "test-1" -Then insert was not called -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-029-entity-handler-propagates-try-load-state-errors.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-029-entity-handler-propagates-try-load-state-errors.sdp.md deleted file mode 100644 index f37c3569..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-029-entity-handler-propagates-try-load-state-errors.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.entity-handler-propagates-try-load-state-errors -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Entity handler propagates tryLoadState errors - -## Intent - -- outcome: Executable scenario: Entity handler propagates tryLoadState errors - -```gwt -Given an entity decider handler configured for creation -And tryLoadState rejects with error "Database error" -When the entity handler processes a command expecting an error -Then the error message is "Database error" -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-030-entity-handler-propagates-insert-errors.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-030-entity-handler-propagates-insert-errors.sdp.md deleted file mode 100644 index 66558255..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-030-entity-handler-propagates-insert-errors.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.entity-handler-propagates-insert-errors -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Entity handler propagates insert errors - -## Intent - -- outcome: Executable scenario: Entity handler propagates insert errors - -```gwt -Given an entity decider handler configured for creation -And tryLoadState returns null -And insert rejects with error "Insert constraint violation" -When the entity handler processes a command expecting an error -Then the error message is "Insert constraint violation" -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-031-entity-handler-uses-custom-error-handler-when-provided.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-031-entity-handler-uses-custom-error-handler-when-provided.sdp.md deleted file mode 100644 index d88f1177..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-031-entity-handler-uses-custom-error-handler-when-provided.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.entity-handler-uses-custom-error-handler-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Entity handler uses custom error handler when provided - -## Intent - -- outcome: Executable scenario: Entity handler uses custom error handler when provided - -```gwt -Given an entity decider handler configured for creation with a custom error handler returning rejection "CONSTRAINT_ERROR" -And tryLoadState rejects with error "Constraint violation" -When the entity handler processes a command with entityId "test-1" -Then the custom error handler was called -And the result status is "rejected" -And the result rejection code is "CONSTRAINT_ERROR" -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-032-entity-handler-logs-debug-on-entity-creation-success.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-032-entity-handler-logs-debug-on-entity-creation-success.sdp.md deleted file mode 100644 index aad511b8..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-032-entity-handler-logs-debug-on-entity-creation-success.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.entity-handler-logs-debug-on-entity-creation-success -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Entity handler logs debug on entity creation success - -## Intent - -- outcome: Executable scenario: Entity handler logs debug on entity creation success - -```gwt -Given an entity decider handler configured for creation with a logger -And tryLoadState returns null -When the entity handler processes a command with entityId "test-1" -Then the entity logger debug was called with messages: -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-033-entity-handler-logs-debug-on-rejection.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-033-entity-handler-logs-debug-on-rejection.sdp.md deleted file mode 100644 index e2bcebfc..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-033-entity-handler-logs-debug-on-rejection.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.entity-handler-logs-debug-on-rejection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Entity handler logs debug on rejection - -## Intent - -- outcome: Executable scenario: Entity handler logs debug on rejection - -```gwt -Given an entity decider handler configured for creation with a logger -And tryLoadState returns an existing CMS with id "test-1" -When the entity handler processes a command with entityId "test-1" -Then the entity logger debug was called with message "[CreateEntity] Command rejected" with code "ENTITY_ALREADY_EXISTS" -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-034-entity-handler-generates-unique-event-id-for-each-creation.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-034-entity-handler-generates-unique-event-id-for-each-creation.sdp.md deleted file mode 100644 index 7a89967f..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-034-entity-handler-generates-unique-event-id-for-each-creation.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.entity-handler-generates-unique-event-id-for-each-creation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Entity handler generates unique eventId for each creation - -## Intent - -- outcome: Executable scenario: Entity handler generates unique eventId for each creation - -```gwt -Given an entity decider handler configured for creation -And tryLoadState returns null -When the entity handler processes two creation commands with different entityIds -Then the two entity events have different eventIds -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-035-entity-handler-includes-schema-version-in-metadata.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-035-entity-handler-includes-schema-version-in-metadata.sdp.md deleted file mode 100644 index 32c85955..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-035-entity-handler-includes-schema-version-in-metadata.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.entity-handler-includes-schema-version-in-metadata -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Entity handler includes schemaVersion in metadata - -## Intent - -- outcome: Executable scenario: Entity handler includes schemaVersion in metadata - -```gwt -Given an entity decider handler configured for creation with schemaVersion 5 -And tryLoadState returns null -When the entity handler processes a command with entityId "test-1" -Then the entity event metadata schemaVersion is 5 -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-036-pre-validate-rejection-short-circuits-handler.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-036-pre-validate-rejection-short-circuits-handler.sdp.md deleted file mode 100644 index 28fae49a..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-036-pre-validate-rejection-short-circuits-handler.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.pre-validate-rejection-short-circuits-handler -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# PreValidate rejection short-circuits handler - -## Intent - -- outcome: Executable scenario: PreValidate rejection short-circuits handler - -```gwt -Given an entity decider handler configured with preValidate returning rejection "SKU_ALREADY_EXISTS" -When the entity handler processes a command with entityId "test-1" -Then the result status is "rejected" -And the result rejection code is "SKU_ALREADY_EXISTS" -And tryLoadState was not called -And the entity mock decider was not called -And insert was not called -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-037-pre-validate-returning-undefined-allows-normal-flow.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-037-pre-validate-returning-undefined-allows-normal-flow.sdp.md deleted file mode 100644 index 78011be1..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-037-pre-validate-returning-undefined-allows-normal-flow.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.pre-validate-returning-undefined-allows-normal-flow -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# PreValidate returning undefined allows normal flow - -## Intent - -- outcome: Executable scenario: PreValidate returning undefined allows normal flow - -```gwt -Given an entity decider handler configured with preValidate returning undefined -And tryLoadState returns null -When the entity handler processes a command with entityId "test-1" -Then preValidate was called with entityId "test-1" -And tryLoadState was called -And insert was called -And the result status is "success" -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-038-pre-validate-receives-correct-arguments.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-038-pre-validate-receives-correct-arguments.sdp.md deleted file mode 100644 index 90088604..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-038-pre-validate-receives-correct-arguments.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.pre-validate-receives-correct-arguments -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# PreValidate receives correct arguments - -## Intent - -- outcome: Executable scenario: PreValidate receives correct arguments - -```gwt -Given an entity decider handler configured with preValidate returning undefined -And tryLoadState returns null -When the entity handler processes a command with entityId "my-product" and newValue 500 -Then preValidate was called with entityId "my-product" and newValue 500 -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-039-pre-validate-failure-is-logged.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-039-pre-validate-failure-is-logged.sdp.md deleted file mode 100644 index 613a7485..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-039-pre-validate-failure-is-logged.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.pre-validate-failure-is-logged -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# PreValidate failure is logged - -## Intent - -- outcome: Executable scenario: PreValidate failure is logged - -```gwt -Given an entity decider handler configured with preValidate returning rejection "VALIDATION_FAILED" and a logger -When the entity handler processes a command with entityId "test-1" -Then the entity logger debug was called with messages: -``` diff --git a/specs/behavior/platform-core/decider/factory.examples/s-040-handler-works-normally-without-pre-validate-configured.sdp.md b/specs/behavior/platform-core/decider/factory.examples/s-040-handler-works-normally-without-pre-validate-configured.sdp.md deleted file mode 100644 index 150d2960..00000000 --- a/specs/behavior/platform-core/decider/factory.examples/s-040-handler-works-normally-without-pre-validate-configured.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.decider.factory.handler-works-normally-without-pre-validate-configured -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.decider.factory ---- -# Handler works normally without preValidate configured - -## Intent - -- outcome: Executable scenario: Handler works normally without preValidate configured - -```gwt -Given an entity decider handler configured for creation without preValidate -And tryLoadState returns null -When the entity handler processes a command with entityId "test-1" -Then tryLoadState was called -And the result status is "success" -``` diff --git a/specs/behavior/platform-core/decider/factory.sdp.md b/specs/behavior/platform-core/decider/factory.sdp.md index 8b5ac80a..44b16dbb 100644 --- a/specs/behavior/platform-core/decider/factory.sdp.md +++ b/specs/behavior/platform-core/decider/factory.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.decider.factory kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: Decider Handler Factory +- outcome: Factory functions wrap pure decider functions with load, persist, and event building for existing-entity updates and entity creation. +- value: Handlers can apply existing-entity updates and create new entities without embedding infrastructure in the decider. ## Behavior diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-001-dcb-succeeds-on-first-attempt.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-001-dcb-succeeds-on-first-attempt.sdp.md deleted file mode 100644 index 0dd7c9ae..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-001-dcb-succeeds-on-first-attempt.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.dcb-succeeds-on-first-attempt -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry ---- -# DCB succeeds on first attempt - -## Intent - -- outcome: Executable scenario: DCB succeeds on first attempt - -```gwt -Given DCB retry helper is configured -And a DCB operation with expectedVersion 5 -And currentVersion is 5 - no conflict -When withDCBRetry is called -Then executeWithDCB should be called once -And the success result should be returned unchanged -And no retry should be scheduled -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-002-rejected-result-passes-through-unchanged.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-002-rejected-result-passes-through-unchanged.sdp.md deleted file mode 100644 index f3b48316..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-002-rejected-result-passes-through-unchanged.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.rejected-result-passes-through-unchanged -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry ---- -# Rejected result passes through unchanged - -## Intent - -- outcome: Executable scenario: Rejected result passes through unchanged - -```gwt -Given DCB retry helper is configured -And a DCB operation that will be rejected by decider -When withDCBRetry is called -Then the rejected result should be returned unchanged -And no retry should be scheduled -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-003-conflict-triggers-retry-with-updated-version.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-003-conflict-triggers-retry-with-updated-version.sdp.md deleted file mode 100644 index d9071ce1..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-003-conflict-triggers-retry-with-updated-version.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.conflict-triggers-retry-with-updated-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry ---- -# Conflict triggers retry with updated version - -## Intent - -- outcome: Executable scenario: Conflict triggers retry with updated version - -```gwt -Given DCB retry helper is configured -And a DCB operation with expectedVersion 5 -And currentVersion is 6 - conflict detected -When withDCBRetry is called with attempt 0 -Then a retry mutation should be enqueued to Workpool -And the retry should use expectedVersion 6 -And the result should have status "deferred" -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md deleted file mode 100644 index ab97fc56..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-004-max-retries-exceeded-returns-rejected.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.max-retries-exceeded-returns-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry ---- -# Max retries exceeded returns rejected - -## Intent - -- outcome: Executable scenario: Max retries exceeded returns rejected - -```gwt -Given DCB retry helper is configured -And a DCB operation that conflicts -And attempt is 5 - equal to maxAttempts -When withDCBRetry is called -Then the result should have status "rejected" -And the code should be "DCB_MAX_RETRIES_EXCEEDED" -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-005-scope-aware-scheduling-key-is-preserved.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-005-scope-aware-scheduling-key-is-preserved.sdp.md deleted file mode 100644 index b0b3be30..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-005-scope-aware-scheduling-key-is-preserved.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.scope-aware-scheduling-key-is-preserved -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry ---- -# Scope-aware scheduling key is preserved - -## Intent - -- outcome: Executable scenario: Scope-aware scheduling key is preserved - -```gwt -Given DCB retry helper is configured -And scope key "tenant:t1:reservation:r1" -When conflict triggers retry -Then partition key should be "dcb:tenant:t1:reservation:r1" -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-006-successful-retry-calls-on-complete-with-result.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-006-successful-retry-calls-on-complete-with-result.sdp.md deleted file mode 100644 index 804d8df4..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-006-successful-retry-calls-on-complete-with-result.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.successful-retry-calls-on-complete-with-result -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry ---- -# Successful retry calls onComplete with result - -## Intent - -- outcome: Executable scenario: Successful retry calls onComplete with result - -```gwt -Given DCB retry helper is configured -And a DCB operation with onComplete callback configured -And the operation conflicts then succeeds on retry -When the retry mutation completes successfully -Then onComplete should be called with success result -And the context object should be passed through -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-007-version-advances-during-retry-delay.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-007-version-advances-during-retry-delay.sdp.md deleted file mode 100644 index a8614526..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-007-version-advances-during-retry-delay.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.version-advances-during-retry-delay -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry ---- -# Version advances during retry delay - -## Intent - -- outcome: Executable scenario: Version advances during retry delay - -```gwt -Given DCB retry helper is configured -And call A schedules retry with expectedVersion 6 at t=0 -And call B advances version to 7 at t=100ms -When call A's retry executes at t=250ms with expectedVersion 6 -Then it should detect conflict with currentVersion 7 -And it should schedule another retry with expectedVersion 7 -And attempt counter should be 2 -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-008-backoff-increases-exponentially.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-008-backoff-increases-exponentially.sdp.md deleted file mode 100644 index 10ca7318..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-008-backoff-increases-exponentially.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.backoff-increases-exponentially -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry ---- -# Backoff increases exponentially - -## Intent - -- outcome: Executable scenario: Backoff increases exponentially - -```gwt -Given DCB retry helper is configured -And backoff config with initialMs 100 and base 2 -When calculating backoff for attempt value -Then base delay should be valuems -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-009-backoff-is-capped-at-maximum.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-009-backoff-is-capped-at-maximum.sdp.md deleted file mode 100644 index dd8c7531..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-009-backoff-is-capped-at-maximum.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.backoff-is-capped-at-maximum -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry ---- -# Backoff is capped at maximum - -## Intent - -- outcome: Executable scenario: Backoff is capped at maximum - -```gwt -Given DCB retry helper is configured -And backoff config with maxMs 30000 -When calculating backoff for attempt 10 -Then total delay should not exceed 30000ms -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-010-jitter-adds-randomness-to-prevent-thundering-herd.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-010-jitter-adds-randomness-to-prevent-thundering-herd.sdp.md deleted file mode 100644 index 2614f9cf..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-010-jitter-adds-randomness-to-prevent-thundering-herd.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.jitter-adds-randomness-to-prevent-thundering-herd -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry ---- -# Jitter adds randomness to prevent thundering herd - -## Intent - -- outcome: Executable scenario: Jitter adds randomness to prevent thundering herd - -```gwt -Given DCB retry helper is configured -And backoff config with initialMs 100 -When calculating backoff for attempt 0 multiple times -Then results should vary within 50-150% multiplicative jitter range -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-011-jitter-function-is-injectable-for-deterministic-tests.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-011-jitter-function-is-injectable-for-deterministic-tests.sdp.md deleted file mode 100644 index ad62243b..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.examples/s-011-jitter-function-is-injectable-for-deterministic-tests.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry.jitter-function-is-injectable-for-deterministic-tests -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry ---- -# Jitter function is injectable for deterministic tests - -## Intent - -- outcome: Executable scenario: Jitter function is injectable for deterministic tests - -```gwt -Given DCB retry helper is configured -And a backoff calculator with custom jitter function returning 1.0 -When calculating backoff for attempt 0 with initialMs 100 -Then result should be exactly 100ms - no random variation -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.sdp.md b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.sdp.md index 5b4bb6d8..f326fe8b 100644 --- a/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/dcb-conflict-retry.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.durable-function-adapters.dcb-conflict-retry kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: DCB OCC conflicts to be automatically retried so that I don't need to implement manual retry logic everywhere +- outcome: DCB OCC conflicts are automatically retried so callers do not implement manual retry logic everywhere. +- value: Workpool-based retry with exponential backoff and jitter covers OCC conflicts. ## Behavior diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-001-adapter-plugs-into-existing-middleware.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-001-adapter-plugs-into-existing-middleware.sdp.md deleted file mode 100644 index f8a1dad3..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-001-adapter-plugs-into-existing-middleware.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.integration-patterns.adapter-plugs-into-existing-middleware -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.integration-patterns ---- -# Adapter plugs into existing middleware - -## Intent - -- outcome: Executable scenario: Adapter plugs into existing middleware - -```gwt -Given platform infrastructure is configured for integration tests -And rate limit middleware at order 50 -And ConvexRateLimitAdapter is configured -When a command is dispatched -Then rate limit should be checked via the adapter -And middleware order should be preserved -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-002-rate-limited-command-returns-standard-rejection.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-002-rate-limited-command-returns-standard-rejection.sdp.md deleted file mode 100644 index b7cd2a29..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-002-rate-limited-command-returns-standard-rejection.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.integration-patterns.rate-limited-command-returns-standard-rejection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.integration-patterns ---- -# Rate limited command returns standard rejection - -## Intent - -- outcome: Executable scenario: Rate limited command returns standard rejection - -```gwt -Given platform infrastructure is configured for integration tests -And rate limit is exhausted for current user -When a command is dispatched -Then the result should have status "rejected" -And the code should be "RATE_LIMITED" -And context should include retryAfterMs -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-003-dcb-retry-uses-separate-workpool.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-003-dcb-retry-uses-separate-workpool.sdp.md deleted file mode 100644 index 8999c782..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-003-dcb-retry-uses-separate-workpool.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.integration-patterns.dcb-retry-uses-separate-workpool -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.integration-patterns ---- -# DCB retry uses separate Workpool - -## Intent - -- outcome: Executable scenario: DCB retry uses separate Workpool - -```gwt -Given platform infrastructure is configured for integration tests -And dcbRetryPool is configured with maxParallelism 10 -And projectionPool is configured separately -When a DCB conflict triggers retry -Then retry should be enqueued to dcbRetryPool -And projectionPool should not be affected -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-004-retry-mutation-receives-correct-arguments.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-004-retry-mutation-receives-correct-arguments.sdp.md deleted file mode 100644 index b7062796..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-004-retry-mutation-receives-correct-arguments.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.integration-patterns.retry-mutation-receives-correct-arguments -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.integration-patterns ---- -# Retry mutation receives correct arguments - -## Intent - -- outcome: Executable scenario: Retry mutation receives correct arguments - -```gwt -Given platform infrastructure is configured for integration tests -And a DCB operation with scope "tenant:t1:res:r1" -When conflict triggers retry -Then retry mutation should receive updated expectedVersion -And retry mutation should receive incremented attempt -And retry mutation should receive original DCB config -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-005-dcb-retry-with-on-complete-callback-integration.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-005-dcb-retry-with-on-complete-callback-integration.sdp.md deleted file mode 100644 index a43580b2..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-005-dcb-retry-with-on-complete-callback-integration.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.integration-patterns.dcb-retry-with-on-complete-callback-integration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.integration-patterns ---- -# DCB retry with onComplete callback integration - -## Intent - -- outcome: Executable scenario: DCB retry with onComplete callback integration - -```gwt -Given platform infrastructure is configured for integration tests -And dcbRetryPool supports onComplete callbacks -And a DCB operation with onComplete configured -When conflict triggers retry that eventually succeeds -Then onComplete mutation should receive the success result -And parallel DCB operations should each track independently -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-006-workpool-does-not-retry-dcb-mutations-clarification.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-006-workpool-does-not-retry-dcb-mutations-clarification.sdp.md deleted file mode 100644 index 0e633dce..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-006-workpool-does-not-retry-dcb-mutations-clarification.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.integration-patterns.workpool-does-not-retry-dcb-mutations-clarification -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.integration-patterns ---- -# Workpool does not retry DCB mutations - clarification - -## Intent - -- outcome: Executable scenario: Workpool does not retry DCB mutations - clarification - -```gwt -Given platform infrastructure is configured for integration tests -And dcbRetryPool has maxAttempts 1 at Workpool level -And withDCBRetry has maxAttempts 5 at DCB level -When a DCB mutation throws an exception - not OCC conflict -Then Workpool should NOT retry as exception is final failure -And onComplete should receive failed result -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-007-rate-limiter-component-creates-tables.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-007-rate-limiter-component-creates-tables.sdp.md deleted file mode 100644 index 48643c7f..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-007-rate-limiter-component-creates-tables.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.integration-patterns.rate-limiter-component-creates-tables -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.integration-patterns ---- -# Rate limiter component creates tables - -## Intent - -- outcome: Executable scenario: Rate limiter component creates tables - -```gwt -Given platform infrastructure is configured for integration tests -And convex.config.ts includes rate limiter component -When deployment runs -Then rate limiter internal tables should exist -And rate limiter API should be accessible -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-008-multiple-workpools-can-coexist.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-008-multiple-workpools-can-coexist.sdp.md deleted file mode 100644 index 90cb4bd9..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.examples/s-008-multiple-workpools-can-coexist.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.integration-patterns.multiple-workpools-can-coexist -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.integration-patterns ---- -# Multiple Workpools can coexist - -## Intent - -- outcome: Executable scenario: Multiple Workpools can coexist - -```gwt -Given platform infrastructure is configured for integration tests -And convex.config.ts includes projectionPool -And convex.config.ts includes dcbRetryPool -When deployment runs -Then both Workpools should have independent state -And both should be addressable by name -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.sdp.md b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.sdp.md index 7792b0a3..8e959642 100644 --- a/specs/behavior/platform-core/durable-function-adapters/integration-patterns.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/integration-patterns.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.durable-function-adapters.integration-patterns kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: adapters to integrate seamlessly with existing infrastructure so that I can adopt production patterns without refactoring +- outcome: Adapters integrate with existing middleware, Workpool, and Convex components so production patterns can be adopted without refactoring. +- value: Rate limiting and DCB retry plug into current infrastructure without changing caller code. ## Behavior diff --git a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-001-adapter-allows-request-within-rate-limit.sdp.md b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-001-adapter-allows-request-within-rate-limit.sdp.md deleted file mode 100644 index d34581d2..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-001-adapter-allows-request-within-rate-limit.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.rate-limit-adapter.adapter-allows-request-within-rate-limit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.rate-limit-adapter ---- -# Adapter allows request within rate limit - -## Intent - -- outcome: Executable scenario: Adapter allows request within rate limit - -```gwt -Given rate limit "testLimit" is configured with 10 requests per minute -And 5 requests have been made for key "user:alice" -When checking rate limit for key "user:alice" -Then the result should have allowed = true -And retryAfterMs should be undefined -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-002-adapter-rejects-request-exceeding-rate-limit.sdp.md b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-002-adapter-rejects-request-exceeding-rate-limit.sdp.md deleted file mode 100644 index 69186302..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-002-adapter-rejects-request-exceeding-rate-limit.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.rate-limit-adapter.adapter-rejects-request-exceeding-rate-limit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.rate-limit-adapter ---- -# Adapter rejects request exceeding rate limit - -## Intent - -- outcome: Executable scenario: Adapter rejects request exceeding rate limit - -```gwt -Given rate limit "testLimit" is configured with 10 requests per minute -And 10 requests have been made for key "user:alice" -When checking rate limit for key "user:alice" -Then the result should have allowed = false -And retryAfterMs should be greater than 0 -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-003-different-keys-have-independent-limits.sdp.md b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-003-different-keys-have-independent-limits.sdp.md deleted file mode 100644 index 946a0e1d..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-003-different-keys-have-independent-limits.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.rate-limit-adapter.different-keys-have-independent-limits -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.rate-limit-adapter ---- -# Different keys have independent limits - -## Intent - -- outcome: Executable scenario: Different keys have independent limits - -```gwt -Given rate limit "testLimit" is configured with 10 requests per minute -And user "alice" has exhausted her rate limit -When checking rate limit for key "user:bob" -Then the result should have allowed = true -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md deleted file mode 100644 index 39e13363..00000000 --- a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.examples/s-004-same-user-different-command-types-have-independent-limits.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.durable-function-adapters.rate-limit-adapter.same-user-different-command-types-have-independent-limits -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.durable-function-adapters.rate-limit-adapter ---- -# Same user different command types have independent limits - -## Intent - -- outcome: Executable scenario: Same user different command types have independent limits - -```gwt -Given rate limit "testLimit" is configured with 10 requests per minute -And user "alice" has exhausted limit for "commandA" -When checking rate limit for "user:alice:commandB" -Then the result should have allowed = true -``` diff --git a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.sdp.md b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.sdp.md index 96738ad1..a70d2914 100644 --- a/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.sdp.md +++ b/specs/behavior/platform-core/durable-function-adapters/rate-limit-adapter.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.durable-function-adapters.rate-limit-adapter kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,9 +11,23 @@ relations: ## Intent - actor: a platform developer -- outcome: the middleware rate limiter to use @convex-dev/rate-limiter so that rate limiting is production-grade with persistence and sharding +- outcome: The middleware rate limiter uses @convex-dev/rate-limiter so rate limiting is production-grade with persistence and sharding. +- value: Rate limits persist across restarts and stay isolated by key. ## Behavior - rule: Adapter implements RateLimitChecker interface - rule: Rate limits are isolated by key + +## Example space + +```gwt-vocabulary +Given rate limit {limitName:string} is configured with {requestsPerMinute:number} requests per minute +And {requestCount:number} requests have been made for key {key:string} +And user {user:string} has exhausted her rate limit +And user {user:string} has exhausted limit for {commandType:string} +When checking rate limit for key {key:string} +Then the result should have allowed = {allowed:boolean} +And retryAfterMs should be undefined +And retryAfterMs should be greater than 0 +``` diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-001-create-basic-fat-event.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-001-create-basic-fat-event.sdp.md deleted file mode 100644 index 5933260f..00000000 --- a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-001-create-basic-fat-event.sdp.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.fat-event-builder.create-basic-fat-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.fat-event-builder ---- -# Create basic fat event - -## Intent - -- outcome: Executable scenario: Create basic fat event - -```gwt -Given the ECST module is imported from platform-core -And a sample customer entity exists -And sample order items exist -And event type "OrderSubmitted" -And payload with orderId and totalAmount -When I call createFatEvent(type, payload) -Then I receive a FatEvent object -And event.type equals "OrderSubmitted" -And event.payload contains the provided data -And event.metadata.timestamp is set -And event.metadata.schemaVersion is set -``` diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-002-create-fat-event-with-schema-definition.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-002-create-fat-event-with-schema-definition.sdp.md deleted file mode 100644 index 5d93f0b2..00000000 --- a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-002-create-fat-event-with-schema-definition.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.fat-event-builder.create-fat-event-with-schema-definition -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.fat-event-builder ---- -# Create fat event with schema definition - -## Intent - -- outcome: Executable scenario: Create fat event with schema definition - -```gwt -Given the ECST module is imported from platform-core -And a sample customer entity exists -And sample order items exist -And event type "OrderSubmitted" -And a schema with version "2.0.0" -When I call createFatEvent(type, payload, { schema }) -Then event.metadata.schemaVersion equals "2.0.0" -``` diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-003-schema-validation-failure.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-003-schema-validation-failure.sdp.md deleted file mode 100644 index 44c11704..00000000 --- a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-003-schema-validation-failure.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.fat-event-builder.schema-validation-failure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.fat-event-builder ---- -# Schema validation failure - -## Intent - -- outcome: Executable scenario: Schema validation failure - -```gwt -Given the ECST module is imported from platform-core -And a sample customer entity exists -And sample order items exist -And event type "OrderSubmitted" -And an invalid payload missing required fields -And a schema with validation rules -When I call createFatEvent(type, payload, { schema }) -Then an error is thrown with message "Schema validation failed" -``` diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-004-create-fat-event-with-correlation-id.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-004-create-fat-event-with-correlation-id.sdp.md deleted file mode 100644 index 394b0480..00000000 --- a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-004-create-fat-event-with-correlation-id.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.fat-event-builder.create-fat-event-with-correlation-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.fat-event-builder ---- -# Create fat event with correlation ID - -## Intent - -- outcome: Executable scenario: Create fat event with correlation ID - -```gwt -Given the ECST module is imported from platform-core -And a sample customer entity exists -And sample order items exist -And event type "OrderSubmitted" -And payload with orderId and totalAmount -And a correlationId "corr_abc123" -When I call createFatEvent(type, payload, { correlationId }) -Then event.metadata.correlationId equals "corr_abc123" -``` diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-005-embed-selected-entity-fields.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-005-embed-selected-entity-fields.sdp.md deleted file mode 100644 index c48da682..00000000 --- a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-005-embed-selected-entity-fields.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.fat-event-builder.embed-selected-entity-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.fat-event-builder ---- -# Embed selected entity fields - -## Intent - -- outcome: Executable scenario: Embed selected entity fields - -```gwt -Given the ECST module is imported from platform-core -And a sample customer entity exists -And sample order items exist -And a customer entity with id, name, email, internalNotes -When I call embedEntity(customer, ['id', 'name', 'email']) -Then the result contains id, name, email -And the result does NOT contain internalNotes -``` diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-006-embed-all-fields.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-006-embed-all-fields.sdp.md deleted file mode 100644 index e7b0c529..00000000 --- a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-006-embed-all-fields.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.fat-event-builder.embed-all-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.fat-event-builder ---- -# Embed all fields - -## Intent - -- outcome: Executable scenario: Embed all fields - -```gwt -Given the ECST module is imported from platform-core -And a sample customer entity exists -And sample order items exist -And a customer entity with id, name, email -When I call embedEntity(customer) without field list -Then the result contains all entity fields -``` diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-007-embed-non-existent-field.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-007-embed-non-existent-field.sdp.md deleted file mode 100644 index 6b6bc724..00000000 --- a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-007-embed-non-existent-field.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.fat-event-builder.embed-non-existent-field -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.fat-event-builder ---- -# Embed non-existent field - -## Intent - -- outcome: Executable scenario: Embed non-existent field - -```gwt -Given the ECST module is imported from platform-core -And a sample customer entity exists -And sample order items exist -And a customer entity without address field -When I call embedEntity(customer, ['id', 'address']) -Then an error is thrown with message "Field 'address' not found" -``` diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-008-embed-collection-of-items.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-008-embed-collection-of-items.sdp.md deleted file mode 100644 index 3294e6d8..00000000 --- a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-008-embed-collection-of-items.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.fat-event-builder.embed-collection-of-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.fat-event-builder ---- -# Embed collection of items - -## Intent - -- outcome: Executable scenario: Embed collection of items - -```gwt -Given the ECST module is imported from platform-core -And a sample customer entity exists -And sample order items exist -And 3 order items with productId, name, quantity -When I call embedCollection(items) -Then the result is an array of 3 items -And each item contains productId, name, quantity -``` diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-009-embed-collection-with-field-selection.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-009-embed-collection-with-field-selection.sdp.md deleted file mode 100644 index 455b1ddc..00000000 --- a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-009-embed-collection-with-field-selection.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.fat-event-builder.embed-collection-with-field-selection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.fat-event-builder ---- -# Embed collection with field selection - -## Intent - -- outcome: Executable scenario: Embed collection with field selection - -```gwt -Given the ECST module is imported from platform-core -And a sample customer entity exists -And sample order items exist -And 3 order items with productId, name, quantity, internalSku -When I call embedCollection(items, ['productId', 'name', 'quantity']) -Then each item contains productId, name, quantity -And no item contains internalSku -``` diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-010-embed-empty-collection.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-010-embed-empty-collection.sdp.md deleted file mode 100644 index 5a27894c..00000000 --- a/specs/behavior/platform-core/ecst/fat-event-builder.examples/s-010-embed-empty-collection.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.fat-event-builder.embed-empty-collection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.fat-event-builder ---- -# Embed empty collection - -## Intent - -- outcome: Executable scenario: Embed empty collection - -```gwt -Given the ECST module is imported from platform-core -And a sample customer entity exists -And sample order items exist -And an empty array of items -When I call embedCollection(items) -Then the result is an empty array -``` diff --git a/specs/behavior/platform-core/ecst/fat-event-builder.sdp.md b/specs/behavior/platform-core/ecst/fat-event-builder.sdp.md index db9d3b30..10509802 100644 --- a/specs/behavior/platform-core/ecst/fat-event-builder.sdp.md +++ b/specs/behavior/platform-core/ecst/fat-event-builder.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.ecst.fat-event-builder kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: to create fat events with embedded context so that downstream consumers have all data needed without back-queries +- outcome: Create fat events with embedded context so downstream consumers have all data needed without back-queries. +- value: createFatEvent, embedEntity, and embedCollection snapshot entity and collection state for Event-Carried State Transfer. ## Behavior diff --git a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-001-event-type-for-integration-scenarios.sdp.md b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-001-event-type-for-integration-scenarios.sdp.md deleted file mode 100644 index 906c073d..00000000 --- a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-001-event-type-for-integration-scenarios.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.fat-vs-thin-selection.event-type-for-integration-scenarios -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.fat-vs-thin-selection ---- -# Event type for integration scenarios - -## Intent - -- outcome: Executable scenario: Event type for integration scenarios - -```gwt -Given the event category taxonomy is available -And sample use cases for different event types -And an event for "value" -When determining appropriate event type -Then "value" should be used -And reason is "value" -``` diff --git a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-002-inventory-updated-as-thin-event.sdp.md b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-002-inventory-updated-as-thin-event.sdp.md deleted file mode 100644 index 66ed23ca..00000000 --- a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-002-inventory-updated-as-thin-event.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.fat-vs-thin-selection.inventory-updated-as-thin-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.fat-vs-thin-selection ---- -# InventoryUpdated as thin event - -## Intent - -- outcome: Executable scenario: InventoryUpdated as thin event - -```gwt -Given the event category taxonomy is available -And sample use cases for different event types -And an "InventoryUpdated" event occurring 1000 times/second -When evaluating event type -Then thin event is recommended -And reason is "High frequency, same-context consumers can query" -``` diff --git a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-003-order-submitted-as-fat-event.sdp.md b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-003-order-submitted-as-fat-event.sdp.md deleted file mode 100644 index f16a3f06..00000000 --- a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-003-order-submitted-as-fat-event.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.fat-vs-thin-selection.order-submitted-as-fat-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.fat-vs-thin-selection ---- -# OrderSubmitted as fat event - -## Intent - -- outcome: Executable scenario: OrderSubmitted as fat event - -```gwt -Given the event category taxonomy is available -And sample use cases for different event types -And an "OrderSubmitted" event occurring 10 times/second -And multiple downstream consumers in different contexts -When evaluating event type -Then fat event is recommended -And reason is "Cross-context consumers, low frequency" -``` diff --git a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-004-published-language-event-is-fat.sdp.md b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-004-published-language-event-is-fat.sdp.md deleted file mode 100644 index 7848d0a9..00000000 --- a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-004-published-language-event-is-fat.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.fat-vs-thin-selection.published-language-event-is-fat -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.fat-vs-thin-selection ---- -# Published Language event is fat - -## Intent - -- outcome: Executable scenario: Published Language event is fat - -```gwt -Given the event category taxonomy is available -And sample use cases for different event types -And an event defined in Published Language schema -When checking event requirements -Then event must be fat -And must include all fields defined in the contract -And schemaVersion must match Published Language version -``` diff --git a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-005-category-suggests-event-type.sdp.md b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-005-category-suggests-event-type.sdp.md deleted file mode 100644 index f1b82dca..00000000 --- a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.examples/s-005-category-suggests-event-type.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.fat-vs-thin-selection.category-suggests-event-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.fat-vs-thin-selection ---- -# Category suggests event type - -## Intent - -- outcome: Executable scenario: Category suggests event type - -```gwt -Given the event category taxonomy is available -And sample use cases for different event types -And an event with category "value" -When checking suggested event type -Then suggested type is "value" -``` diff --git a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.sdp.md b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.sdp.md index 5f932d09..0f0da05e 100644 --- a/specs/behavior/platform-core/ecst/fat-vs-thin-selection.sdp.md +++ b/specs/behavior/platform-core/ecst/fat-vs-thin-selection.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.ecst.fat-vs-thin-selection kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: guidelines for when to use fat vs thin events so that I make appropriate trade-offs between payload size and independence +- outcome: Choose fat or thin events so payload size and consumer independence are traded off appropriately. +- value: Cross-context and Published Language contracts carry full snapshots; high-frequency same-context events stay thin. ## Behavior diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-001-mark-single-field-for-shredding.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-001-mark-single-field-for-shredding.sdp.md deleted file mode 100644 index 669a7066..00000000 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-001-mark-single-field-for-shredding.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.privacy-markers.mark-single-field-for-shredding -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.privacy-markers ---- -# Mark single field for shredding - -## Intent - -- outcome: Executable scenario: Mark single field for shredding - -```gwt -Given the ECST module with privacy support is imported -And sample entities with PII fields exist -And a customer entity with email "alice@example.com" -When I call embedEntity(customer, ['id', 'name', 'email'], { shred: ['email'] }) -Then the result includes email field -And email is marked with __shred: true metadata -``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-002-mark-multiple-fields-for-shredding.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-002-mark-multiple-fields-for-shredding.sdp.md deleted file mode 100644 index ed5824b9..00000000 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-002-mark-multiple-fields-for-shredding.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.privacy-markers.mark-multiple-fields-for-shredding -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.privacy-markers ---- -# Mark multiple fields for shredding - -## Intent - -- outcome: Executable scenario: Mark multiple fields for shredding - -```gwt -Given the ECST module with privacy support is imported -And sample entities with PII fields exist -And a customer entity with email, phone, address -When I call embedEntity(customer, ['id', 'email', 'phone', 'address'], { shred: ['email', 'phone', 'address'] }) -Then email, phone, and address are all marked with __shred: true -``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-003-non-pii-fields-are-not-marked.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-003-non-pii-fields-are-not-marked.sdp.md deleted file mode 100644 index bf7377d1..00000000 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-003-non-pii-fields-are-not-marked.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.privacy-markers.non-pii-fields-are-not-marked -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.privacy-markers ---- -# Non-PII fields are not marked - -## Intent - -- outcome: Executable scenario: Non-PII fields are not marked - -```gwt -Given the ECST module with privacy support is imported -And sample entities with PII fields exist -And a customer entity with id, name, email -When I call embedEntity(customer, ['id', 'name', 'email'], { shred: ['email'] }) -Then id and name are NOT marked with __shred -``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-004-find-all-shreddable-fields-in-event.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-004-find-all-shreddable-fields-in-event.sdp.md deleted file mode 100644 index 82550b12..00000000 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-004-find-all-shreddable-fields-in-event.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.privacy-markers.find-all-shreddable-fields-in-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.privacy-markers ---- -# Find all shreddable fields in event - -## Intent - -- outcome: Executable scenario: Find all shreddable fields in event - -```gwt -Given the ECST module with privacy support is imported -And sample entities with PII fields exist -And a fat event with marked email and phone fields -When I call findShreddableFields(event) -Then result includes "payload.customer.email" -And result includes "payload.customer.phone" -``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-005-no-shreddable-fields-returns-empty.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-005-no-shreddable-fields-returns-empty.sdp.md deleted file mode 100644 index 6d2564a8..00000000 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-005-no-shreddable-fields-returns-empty.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.privacy-markers.no-shreddable-fields-returns-empty -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.privacy-markers ---- -# No shreddable fields returns empty - -## Intent - -- outcome: Executable scenario: No shreddable fields returns empty - -```gwt -Given the ECST module with privacy support is imported -And sample entities with PII fields exist -And a fat event with no marked fields -When I call findShreddableFields(event) -Then result is an empty array -``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-006-mark-fields-in-collection-items.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-006-mark-fields-in-collection-items.sdp.md deleted file mode 100644 index 5d2a1f43..00000000 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-006-mark-fields-in-collection-items.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.privacy-markers.mark-fields-in-collection-items -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.privacy-markers ---- -# Mark fields in collection items - -## Intent - -- outcome: Executable scenario: Mark fields in collection items - -```gwt -Given the ECST module with privacy support is imported -And sample entities with PII fields exist -And 2 shipping addresses with street, city, postalCode -When I call embedCollection(addresses, ['street', 'city', 'postalCode'], { shred: ['street', 'postalCode'] }) -Then each item has street and postalCode marked with __shred: true -And city is not marked in any item -``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-007-shred-all-marked-fields.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-007-shred-all-marked-fields.sdp.md deleted file mode 100644 index a79b94d4..00000000 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-007-shred-all-marked-fields.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.privacy-markers.shred-all-marked-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.privacy-markers ---- -# Shred all marked fields - -## Intent - -- outcome: Executable scenario: Shred all marked fields - -```gwt -Given the ECST module with privacy support is imported -And sample entities with PII fields exist -And a fat event with marked email "alice@example.com" -When I call shredEvent(event) -Then email field is a RedactedValue object -And RedactedValue has __redacted set to true -And RedactedValue has originalType "string" -And RedactedValue has redactedAt timestamp -``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-008-non-marked-fields-are-preserved.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-008-non-marked-fields-are-preserved.sdp.md deleted file mode 100644 index a88d1262..00000000 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-008-non-marked-fields-are-preserved.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.privacy-markers.non-marked-fields-are-preserved -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.privacy-markers ---- -# Non-marked fields are preserved - -## Intent - -- outcome: Executable scenario: Non-marked fields are preserved - -```gwt -Given the ECST module with privacy support is imported -And sample entities with PII fields exist -And a fat event with marked email and non-marked name -When I call shredEvent(event) -Then name field value is unchanged -And email field is a RedactedValue object -``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-009-shred-event-returns-audit-trail.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-009-shred-event-returns-audit-trail.sdp.md deleted file mode 100644 index 06f4d2f4..00000000 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-009-shred-event-returns-audit-trail.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.privacy-markers.shred-event-returns-audit-trail -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.privacy-markers ---- -# Shred event returns audit trail - -## Intent - -- outcome: Executable scenario: Shred event returns audit trail - -```gwt -Given the ECST module with privacy support is imported -And sample entities with PII fields exist -And a fat event with marked email "alice@example.com" -When I call shredEvent(event) with correlationId "erasure-req-123" -Then the result includes an audit object -And audit.correlationId equals "erasure-req-123" -And audit.fieldsShredded includes the shredded field paths -And audit.shreddedAt is a timestamp -``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-010-check-if-event-has-any-shreddable-fields.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-010-check-if-event-has-any-shreddable-fields.sdp.md deleted file mode 100644 index 09ce279d..00000000 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-010-check-if-event-has-any-shreddable-fields.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.privacy-markers.check-if-event-has-any-shreddable-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.privacy-markers ---- -# Check if event has any shreddable fields - -## Intent - -- outcome: Executable scenario: Check if event has any shreddable fields - -```gwt -Given the ECST module with privacy support is imported -And sample entities with PII fields exist -And a fat event with marked PII fields -When I call hasShreddableFields(event) -Then the result is true -``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-011-check-event-without-shreddable-fields.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-011-check-event-without-shreddable-fields.sdp.md deleted file mode 100644 index 4cb77aab..00000000 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-011-check-event-without-shreddable-fields.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.privacy-markers.check-event-without-shreddable-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.privacy-markers ---- -# Check event without shreddable fields - -## Intent - -- outcome: Executable scenario: Check event without shreddable fields - -```gwt -Given the ECST module with privacy support is imported -And sample entities with PII fields exist -And a fat event with no marked fields -When I call hasShreddableFields(event) -Then the result is false -``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-012-count-shreddable-fields.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-012-count-shreddable-fields.sdp.md deleted file mode 100644 index b14ad305..00000000 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-012-count-shreddable-fields.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.privacy-markers.count-shreddable-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.privacy-markers ---- -# Count shreddable fields - -## Intent - -- outcome: Executable scenario: Count shreddable fields - -```gwt -Given the ECST module with privacy support is imported -And sample entities with PII fields exist -And a fat event with 2 marked PII fields -When I call countShreddableFields(event) -Then the result is 2 -``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-013-cannot-shred-required-fields.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-013-cannot-shred-required-fields.sdp.md deleted file mode 100644 index 1c8bf251..00000000 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-013-cannot-shred-required-fields.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.privacy-markers.cannot-shred-required-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.privacy-markers ---- -# Cannot shred required fields - -## Intent - -- outcome: Executable scenario: Cannot shred required fields - -```gwt -Given the ECST module with privacy support is imported -And sample entities with PII fields exist -And an entity with fields id, name, email -When I call embedEntity with shred ["email"] and required ["email"] -Then an error is thrown with message containing "marked as required" -``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-014-non-overlapping-shred-and-required-fields-work.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.examples/s-014-non-overlapping-shred-and-required-fields-work.sdp.md deleted file mode 100644 index 6ea65bc4..00000000 --- a/specs/behavior/platform-core/ecst/privacy-markers.examples/s-014-non-overlapping-shred-and-required-fields-work.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.privacy-markers.non-overlapping-shred-and-required-fields-work -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.privacy-markers ---- -# Non-overlapping shred and required fields work - -## Intent - -- outcome: Executable scenario: Non-overlapping shred and required fields work - -```gwt -Given the ECST module with privacy support is imported -And sample entities with PII fields exist -And an entity with fields id, name, email -When I call embedEntity with shred ["email"] and required ["id"] -Then the result includes email marked with __shred -And the result includes id without __shred marker -``` diff --git a/specs/behavior/platform-core/ecst/privacy-markers.sdp.md b/specs/behavior/platform-core/ecst/privacy-markers.sdp.md index bf26d5b2..2b459950 100644 --- a/specs/behavior/platform-core/ecst/privacy-markers.sdp.md +++ b/specs/behavior/platform-core/ecst/privacy-markers.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.ecst.privacy-markers kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: to mark PII fields in fat events for crypto-shredding so that GDPR right-to-erasure requests can be properly handled +- outcome: Mark PII fields in fat events for crypto-shredding so GDPR right-to-erasure requests can be handled. +- value: Shred markers identify personal data that can later be replaced with RedactedValue without rewriting history. ## Behavior diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-001-schema-version-is-included-automatically.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-001-schema-version-is-included-automatically.sdp.md deleted file mode 100644 index 69afcfa2..00000000 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-001-schema-version-is-included-automatically.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.schema-versioning.schema-version-is-included-automatically -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.schema-versioning ---- -# Schema version is included automatically - -## Intent - -- outcome: Executable scenario: Schema version is included automatically - -```gwt -Given the ECST schema registry is available -And sample schemas for different versions exist -And a fat event created without explicit schema -When I inspect the event metadata -Then schemaVersion field exists -And it defaults to "1.0.0" -``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-002-custom-schema-version-is-used.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-002-custom-schema-version-is-used.sdp.md deleted file mode 100644 index 7fc2957d..00000000 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-002-custom-schema-version-is-used.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.schema-versioning.custom-schema-version-is-used -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.schema-versioning ---- -# Custom schema version is used - -## Intent - -- outcome: Executable scenario: Custom schema version is used - -```gwt -Given the ECST schema registry is available -And sample schemas for different versions exist -And a schema with version "2.1.0" -When I create a fat event with this schema -Then event.metadata.schemaVersion equals "2.1.0" -``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-003-valid-payload-passes-validation.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-003-valid-payload-passes-validation.sdp.md deleted file mode 100644 index 6e3a716c..00000000 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-003-valid-payload-passes-validation.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.schema-versioning.valid-payload-passes-validation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.schema-versioning ---- -# Valid payload passes validation - -## Intent - -- outcome: Executable scenario: Valid payload passes validation - -```gwt -Given the ECST schema registry is available -And sample schemas for different versions exist -And an OrderSubmitted schema requiring orderId and items -And a payload with orderId "ord_123" and items array -When I call validateFatEvent(event, schema) -Then validation succeeds with { valid: true } -``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-004-missing-required-field-fails-validation.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-004-missing-required-field-fails-validation.sdp.md deleted file mode 100644 index ccd84b7d..00000000 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-004-missing-required-field-fails-validation.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.schema-versioning.missing-required-field-fails-validation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.schema-versioning ---- -# Missing required field fails validation - -## Intent - -- outcome: Executable scenario: Missing required field fails validation - -```gwt -Given the ECST schema registry is available -And sample schemas for different versions exist -And an OrderSubmitted schema requiring orderId and items -And a payload missing orderId -When I call validateFatEvent(event, schema) -Then validation fails with { valid: false } -And error contains "orderId is required" -``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-005-wrong-field-type-fails-validation.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-005-wrong-field-type-fails-validation.sdp.md deleted file mode 100644 index 0ebe347c..00000000 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-005-wrong-field-type-fails-validation.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.schema-versioning.wrong-field-type-fails-validation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.schema-versioning ---- -# Wrong field type fails validation - -## Intent - -- outcome: Executable scenario: Wrong field type fails validation - -```gwt -Given the ECST schema registry is available -And sample schemas for different versions exist -And an OrderSubmitted schema requiring items as array -And a payload with items as a string -When I call validateFatEvent(event, schema) -Then validation fails with { valid: false } -And error contains "items must be an array" -``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-006-migrate-v1-event-to-v2-format.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-006-migrate-v1-event-to-v2-format.sdp.md deleted file mode 100644 index 67593dfa..00000000 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-006-migrate-v1-event-to-v2-format.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.schema-versioning.migrate-v1-event-to-v2-format -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.schema-versioning ---- -# Migrate v1 event to v2 format - -## Intent - -- outcome: Executable scenario: Migrate v1 event to v2 format - -```gwt -Given the ECST schema registry is available -And sample schemas for different versions exist -And a v1 OrderSubmitted event without currency field -And a v2 schema that adds currency with default "USD" -And a migration function from v1 to v2 -When I call migrateEvent(event, targetSchema) -Then the result has schemaVersion "2.0.0" -And payload.currency equals "USD" -``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-007-no-migration-needed-for-current-version.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-007-no-migration-needed-for-current-version.sdp.md deleted file mode 100644 index fe6815f1..00000000 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-007-no-migration-needed-for-current-version.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.schema-versioning.no-migration-needed-for-current-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.schema-versioning ---- -# No migration needed for current version - -## Intent - -- outcome: Executable scenario: No migration needed for current version - -```gwt -Given the ECST schema registry is available -And sample schemas for different versions exist -And a v2 OrderSubmitted event -And a v2 schema -When I call migrateEvent(event, targetSchema) -Then the event is returned unchanged -``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-008-unknown-source-version-fails-migration.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-008-unknown-source-version-fails-migration.sdp.md deleted file mode 100644 index 2e80bb84..00000000 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-008-unknown-source-version-fails-migration.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.schema-versioning.unknown-source-version-fails-migration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.schema-versioning ---- -# Unknown source version fails migration - -## Intent - -- outcome: Executable scenario: Unknown source version fails migration - -```gwt -Given the ECST schema registry is available -And sample schemas for different versions exist -And an event with schemaVersion "0.5.0" -And a schema with no migration path from 0.5.0 -When I call migrateEvent(event, targetSchema) -Then an error is thrown with message "No migration path from 0.5.0" -``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-009-compare-older-version-to-newer-version.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-009-compare-older-version-to-newer-version.sdp.md deleted file mode 100644 index 534c748c..00000000 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-009-compare-older-version-to-newer-version.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.schema-versioning.compare-older-version-to-newer-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.schema-versioning ---- -# Compare older version to newer version - -## Intent - -- outcome: Executable scenario: Compare older version to newer version - -```gwt -Given the ECST schema registry is available -And sample schemas for different versions exist -And version "1.0.0" and version "2.0.0" -When comparing versions -Then the result is -1 -``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-010-compare-newer-version-to-older-version.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-010-compare-newer-version-to-older-version.sdp.md deleted file mode 100644 index dddc2b31..00000000 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-010-compare-newer-version-to-older-version.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.schema-versioning.compare-newer-version-to-older-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.schema-versioning ---- -# Compare newer version to older version - -## Intent - -- outcome: Executable scenario: Compare newer version to older version - -```gwt -Given the ECST schema registry is available -And sample schemas for different versions exist -And version "2.0.0" and version "1.0.0" -When comparing versions -Then the result is 1 -``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-011-compare-equal-versions.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-011-compare-equal-versions.sdp.md deleted file mode 100644 index 202fae46..00000000 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-011-compare-equal-versions.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.schema-versioning.compare-equal-versions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.schema-versioning ---- -# Compare equal versions - -## Intent - -- outcome: Executable scenario: Compare equal versions - -```gwt -Given the ECST schema registry is available -And sample schemas for different versions exist -And version "1.0.0" and version "1.0.0" -When comparing versions -Then the result is 0 -``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-012-compare-versions-with-different-minor.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-012-compare-versions-with-different-minor.sdp.md deleted file mode 100644 index 407d2e06..00000000 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-012-compare-versions-with-different-minor.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.schema-versioning.compare-versions-with-different-minor -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.schema-versioning ---- -# Compare versions with different minor - -## Intent - -- outcome: Executable scenario: Compare versions with different minor - -```gwt -Given the ECST schema registry is available -And sample schemas for different versions exist -And version "1.2.0" and version "1.10.0" -When comparing versions -Then the result is -1 -``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-013-invalid-semver-format-is-rejected.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-013-invalid-semver-format-is-rejected.sdp.md deleted file mode 100644 index 1f2e9420..00000000 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-013-invalid-semver-format-is-rejected.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.schema-versioning.invalid-semver-format-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.schema-versioning ---- -# Invalid semver format is rejected - -## Intent - -- outcome: Executable scenario: Invalid semver format is rejected - -```gwt -Given the ECST schema registry is available -And sample schemas for different versions exist -And an invalid version "1.x.0" -When attempting to compare with "2.0.0" -Then an error is thrown with message containing "Invalid semver format" -``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-014-negative-major-version-is-rejected.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-014-negative-major-version-is-rejected.sdp.md deleted file mode 100644 index e329206b..00000000 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-014-negative-major-version-is-rejected.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.schema-versioning.negative-major-version-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.schema-versioning ---- -# Negative major version is rejected - -## Intent - -- outcome: Executable scenario: Negative major version is rejected - -```gwt -Given the ECST schema registry is available -And sample schemas for different versions exist -And an invalid version "-1.0.0" -When attempting to compare with "1.0.0" -Then an error is thrown with message containing "non-negative" -``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-015-negative-minor-version-is-rejected.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-015-negative-minor-version-is-rejected.sdp.md deleted file mode 100644 index cde73510..00000000 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-015-negative-minor-version-is-rejected.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.schema-versioning.negative-minor-version-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.schema-versioning ---- -# Negative minor version is rejected - -## Intent - -- outcome: Executable scenario: Negative minor version is rejected - -```gwt -Given the ECST schema registry is available -And sample schemas for different versions exist -And an invalid version "1.-5.0" -When attempting to compare with "1.0.0" -Then an error is thrown with message containing "non-negative" -``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-016-event-needs-migration-to-newer-version.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-016-event-needs-migration-to-newer-version.sdp.md deleted file mode 100644 index a26b42ed..00000000 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-016-event-needs-migration-to-newer-version.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.schema-versioning.event-needs-migration-to-newer-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.schema-versioning ---- -# Event needs migration to newer version - -## Intent - -- outcome: Executable scenario: Event needs migration to newer version - -```gwt -Given the ECST schema registry is available -And sample schemas for different versions exist -And an event with schemaVersion "1.0.0" -And a target version "2.0.0" -When checking if migration is needed -Then the result is true -``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-017-event-does-not-need-migration-for-same-version.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-017-event-does-not-need-migration-for-same-version.sdp.md deleted file mode 100644 index b1d42f5c..00000000 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-017-event-does-not-need-migration-for-same-version.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.schema-versioning.event-does-not-need-migration-for-same-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.schema-versioning ---- -# Event does not need migration for same version - -## Intent - -- outcome: Executable scenario: Event does not need migration for same version - -```gwt -Given the ECST schema registry is available -And sample schemas for different versions exist -And an event with schemaVersion "2.0.0" -And a target version "2.0.0" -When checking if migration is needed -Then the result is false -``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-018-event-does-not-need-migration-for-older-target.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.examples/s-018-event-does-not-need-migration-for-older-target.sdp.md deleted file mode 100644 index 8f54aba0..00000000 --- a/specs/behavior/platform-core/ecst/schema-versioning.examples/s-018-event-does-not-need-migration-for-older-target.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.ecst.schema-versioning.event-does-not-need-migration-for-older-target -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ecst.schema-versioning ---- -# Event does not need migration for older target - -## Intent - -- outcome: Executable scenario: Event does not need migration for older target - -```gwt -Given the ECST schema registry is available -And sample schemas for different versions exist -And an event with schemaVersion "3.0.0" -And a target version "2.0.0" -When checking if migration is needed -Then the result is false -``` diff --git a/specs/behavior/platform-core/ecst/schema-versioning.sdp.md b/specs/behavior/platform-core/ecst/schema-versioning.sdp.md index bd81267e..a5e20b59 100644 --- a/specs/behavior/platform-core/ecst/schema-versioning.sdp.md +++ b/specs/behavior/platform-core/ecst/schema-versioning.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.ecst.schema-versioning kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: fat events to include schema version information so that consumers can upcast events from older versions +- outcome: Include schema version information on fat events so consumers can upcast events from older versions. +- value: Validation and migrateEvent keep older payloads readable against the current schema. ## Behavior diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-001-percentage-is-50-when-half-events-processed.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-001-percentage-is-50-when-half-events-processed.sdp.md deleted file mode 100644 index 5fccc573..00000000 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-001-percentage-is-50-when-half-events-processed.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-replay.replay-progress.percentage-is-50-when-half-events-processed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-replay.replay-progress ---- -# Percentage is 50 when half events processed - -## Intent - -- outcome: Executable scenario: Percentage is 50 when half events processed - -```gwt -Given 500 events processed out of 1000 total -When calculating percent complete -Then the result should be 50 -``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-002-percentage-is-100-when-all-events-processed.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-002-percentage-is-100-when-all-events-processed.sdp.md deleted file mode 100644 index 42816ad5..00000000 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-002-percentage-is-100-when-all-events-processed.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-replay.replay-progress.percentage-is-100-when-all-events-processed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-replay.replay-progress ---- -# Percentage is 100 when all events processed - -## Intent - -- outcome: Executable scenario: Percentage is 100 when all events processed - -```gwt -Given 1000 events processed out of 1000 total -When calculating percent complete -Then the result should be 100 -``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-003-percentage-is-100-when-total-events-is-zero.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-003-percentage-is-100-when-total-events-is-zero.sdp.md deleted file mode 100644 index d904fd49..00000000 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-003-percentage-is-100-when-total-events-is-zero.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-replay.replay-progress.percentage-is-100-when-total-events-is-zero -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-replay.replay-progress ---- -# Percentage is 100 when total events is zero - -## Intent - -- outcome: Executable scenario: Percentage is 100 when total events is zero - -```gwt -Given 0 events processed out of 0 total -When calculating percent complete -Then the result should be 100 -``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-004-percentage-has-one-decimal-place-precision.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-004-percentage-has-one-decimal-place-precision.sdp.md deleted file mode 100644 index 2523873c..00000000 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-004-percentage-has-one-decimal-place-precision.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-replay.replay-progress.percentage-has-one-decimal-place-precision -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-replay.replay-progress ---- -# Percentage has one decimal place precision - -## Intent - -- outcome: Executable scenario: Percentage has one decimal place precision - -```gwt -Given 333 events processed out of 1000 total -When calculating percent complete -Then the result should be 33.3 -``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-005-remaining-time-estimated-from-throughput.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-005-remaining-time-estimated-from-throughput.sdp.md deleted file mode 100644 index 08f627a4..00000000 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-005-remaining-time-estimated-from-throughput.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-replay.replay-progress.remaining-time-estimated-from-throughput -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-replay.replay-progress ---- -# Remaining time estimated from throughput - -## Intent - -- outcome: Executable scenario: Remaining time estimated from throughput - -```gwt -Given 100 events processed in 10000ms with 1000 total events -When estimating remaining time -Then the estimated time should be 90000ms -``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-006-remaining-time-is-undefined-when-no-events-processed.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-006-remaining-time-is-undefined-when-no-events-processed.sdp.md deleted file mode 100644 index 082477b2..00000000 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-006-remaining-time-is-undefined-when-no-events-processed.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-replay.replay-progress.remaining-time-is-undefined-when-no-events-processed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-replay.replay-progress ---- -# Remaining time is undefined when no events processed - -## Intent - -- outcome: Executable scenario: Remaining time is undefined when no events processed - -```gwt -Given 0 events processed in 5000ms with 1000 total events -When estimating remaining time -Then the estimated time should be undefined -``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-007-remaining-time-is-undefined-when-elapsed-time-is-zero.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-007-remaining-time-is-undefined-when-elapsed-time-is-zero.sdp.md deleted file mode 100644 index cec12a41..00000000 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-007-remaining-time-is-undefined-when-elapsed-time-is-zero.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-replay.replay-progress.remaining-time-is-undefined-when-elapsed-time-is-zero -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-replay.replay-progress ---- -# Remaining time is undefined when elapsed time is zero - -## Intent - -- outcome: Executable scenario: Remaining time is undefined when elapsed time is zero - -```gwt -Given 100 events processed in 0ms with 1000 total events -When estimating remaining time -Then the estimated time should be undefined -``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-008-remaining-time-is-zero-when-all-events-processed.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-008-remaining-time-is-zero-when-all-events-processed.sdp.md deleted file mode 100644 index 47ce66e1..00000000 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-008-remaining-time-is-zero-when-all-events-processed.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-replay.replay-progress.remaining-time-is-zero-when-all-events-processed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-replay.replay-progress ---- -# Remaining time is zero when all events processed - -## Intent - -- outcome: Executable scenario: Remaining time is zero when all events processed - -```gwt -Given 1000 events processed in 10000ms with 1000 total events -When estimating remaining time -Then the estimated time should be 0 -``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-009-calculate-progress-for-running-replay.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-009-calculate-progress-for-running-replay.sdp.md deleted file mode 100644 index 47a7b24e..00000000 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-009-calculate-progress-for-running-replay.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.event-replay.replay-progress.calculate-progress-for-running-replay -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-replay.replay-progress ---- -# Calculate progress for running replay - -## Intent - -- outcome: Executable scenario: Calculate progress for running replay - -```gwt -Given a running checkpoint with 500 of 1000 events processed -And the replay started 10 seconds ago -When calculating full progress -Then the progress status should be "running" -And the progress percentComplete should be 50 -And the progress should have an estimatedRemainingMs value -``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-010-calculate-progress-for-completed-replay.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-010-calculate-progress-for-completed-replay.sdp.md deleted file mode 100644 index fb285490..00000000 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-010-calculate-progress-for-completed-replay.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.event-replay.replay-progress.calculate-progress-for-completed-replay -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-replay.replay-progress ---- -# Calculate progress for completed replay - -## Intent - -- outcome: Executable scenario: Calculate progress for completed replay - -```gwt -Given a completed checkpoint with 1000 of 1000 events processed -When calculating full progress -Then the progress status should be "completed" -And the progress percentComplete should be 100 -And the progress should NOT have an estimatedRemainingMs value -``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-011-calculate-progress-includes-error-for-failed-replay.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-011-calculate-progress-includes-error-for-failed-replay.sdp.md deleted file mode 100644 index 5fae8c02..00000000 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-011-calculate-progress-includes-error-for-failed-replay.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.event-replay.replay-progress.calculate-progress-includes-error-for-failed-replay -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-replay.replay-progress ---- -# Calculate progress includes error for failed replay - -## Intent - -- outcome: Executable scenario: Calculate progress includes error for failed replay - -```gwt -Given a failed checkpoint with error "Projection handler threw exception" -When calculating full progress -Then the progress status should be "failed" -And the progress error should be "Projection handler threw exception" -``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-012-running-status-is-active.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-012-running-status-is-active.sdp.md deleted file mode 100644 index b627a8e8..00000000 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-012-running-status-is-active.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-replay.replay-progress.running-status-is-active -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-replay.replay-progress ---- -# Running status is active - -## Intent - -- outcome: Executable scenario: Running status is active - -```gwt -Given a replay with status "running" -When checking if replay is active -Then the result should be true -``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-013-paused-status-is-active.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-013-paused-status-is-active.sdp.md deleted file mode 100644 index d6b66a69..00000000 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-013-paused-status-is-active.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-replay.replay-progress.paused-status-is-active -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-replay.replay-progress ---- -# Paused status is active - -## Intent - -- outcome: Executable scenario: Paused status is active - -```gwt -Given a replay with status "paused" -When checking if replay is active -Then the result should be true -``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-014-completed-status-is-not-active.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-014-completed-status-is-not-active.sdp.md deleted file mode 100644 index ef62b6c1..00000000 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-014-completed-status-is-not-active.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-replay.replay-progress.completed-status-is-not-active -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-replay.replay-progress ---- -# Completed status is not active - -## Intent - -- outcome: Executable scenario: Completed status is not active - -```gwt -Given a replay with status "completed" -When checking if replay is active -Then the result should be false -``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-015-failed-status-is-not-active.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-015-failed-status-is-not-active.sdp.md deleted file mode 100644 index 7f37fd3b..00000000 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-015-failed-status-is-not-active.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-replay.replay-progress.failed-status-is-not-active -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-replay.replay-progress ---- -# Failed status is not active - -## Intent - -- outcome: Executable scenario: Failed status is not active - -```gwt -Given a replay with status "failed" -When checking if replay is active -Then the result should be false -``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-016-completed-status-is-terminal.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-016-completed-status-is-terminal.sdp.md deleted file mode 100644 index 64395195..00000000 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-016-completed-status-is-terminal.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-replay.replay-progress.completed-status-is-terminal -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-replay.replay-progress ---- -# Completed status is terminal - -## Intent - -- outcome: Executable scenario: Completed status is terminal - -```gwt -Given a replay with status "completed" -When checking if status is terminal -Then the result should be true -``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-017-failed-status-is-terminal.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-017-failed-status-is-terminal.sdp.md deleted file mode 100644 index ce0e04bc..00000000 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-017-failed-status-is-terminal.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-replay.replay-progress.failed-status-is-terminal -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-replay.replay-progress ---- -# Failed status is terminal - -## Intent - -- outcome: Executable scenario: Failed status is terminal - -```gwt -Given a replay with status "failed" -When checking if status is terminal -Then the result should be true -``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-018-cancelled-status-is-terminal.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-018-cancelled-status-is-terminal.sdp.md deleted file mode 100644 index ec92f11c..00000000 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-018-cancelled-status-is-terminal.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-replay.replay-progress.cancelled-status-is-terminal -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-replay.replay-progress ---- -# Cancelled status is terminal - -## Intent - -- outcome: Executable scenario: Cancelled status is terminal - -```gwt -Given a replay with status "cancelled" -When checking if status is terminal -Then the result should be true -``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-019-running-status-is-not-terminal.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-019-running-status-is-not-terminal.sdp.md deleted file mode 100644 index 6b0375f7..00000000 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-019-running-status-is-not-terminal.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-replay.replay-progress.running-status-is-not-terminal -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-replay.replay-progress ---- -# Running status is not terminal - -## Intent - -- outcome: Executable scenario: Running status is not terminal - -```gwt -Given a replay with status "running" -When checking if status is terminal -Then the result should be false -``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-020-paused-status-is-not-terminal.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.examples/s-020-paused-status-is-not-terminal.sdp.md deleted file mode 100644 index 33ad5901..00000000 --- a/specs/behavior/platform-core/event-replay/replay-progress.examples/s-020-paused-status-is-not-terminal.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-replay.replay-progress.paused-status-is-not-terminal -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-replay.replay-progress ---- -# Paused status is not terminal - -## Intent - -- outcome: Executable scenario: Paused status is not terminal - -```gwt -Given a replay with status "paused" -When checking if status is terminal -Then the result should be false -``` diff --git a/specs/behavior/platform-core/event-replay/replay-progress.sdp.md b/specs/behavior/platform-core/event-replay/replay-progress.sdp.md index 710d7d73..c0b48b4f 100644 --- a/specs/behavior/platform-core/event-replay/replay-progress.sdp.md +++ b/specs/behavior/platform-core/event-replay/replay-progress.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Replay Progress Calculator +- outcome: Calculate replay percent complete, remaining time, and active or terminal status from checkpoint counts. +- value: Operators can turn replay checkpoint state into dashboard progress without inventing a second calculator. diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-001-create-append-partition-key-generates-correct-format.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-001-create-append-partition-key-generates-correct-format.sdp.md deleted file mode 100644 index 2470bdea..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-001-create-append-partition-key-generates-correct-format.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-append.create-append-partition-key-generates-correct-format -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-append ---- -# createAppendPartitionKey generates correct format - -## Intent - -- outcome: Executable scenario: createAppendPartitionKey generates correct format - -```gwt -Given the feature fixture is in place -When calling createAppendPartitionKey with stream type "Order" and ID "ord-456" -Then the partition key name should be "append" -And the partition key value should be "Order:ord-456" -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-002-partition-key-handles-various-stream-types.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-002-partition-key-handles-various-stream-types.sdp.md deleted file mode 100644 index 59bc7d6c..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-002-partition-key-handles-various-stream-types.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-append.partition-key-handles-various-stream-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-append ---- -# Partition key handles various stream types - -## Intent - -- outcome: Executable scenario: Partition key handles various stream types - -```gwt -Given the feature fixture is in place -When calling createAppendPartitionKey with stream type "value" and ID "value" -Then the partition key value should be "value" -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-003-durable-append-event-enqueues-action-to-workpool.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-003-durable-append-event-enqueues-action-to-workpool.sdp.md deleted file mode 100644 index 7a2a5855..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-003-durable-append-event-enqueues-action-to-workpool.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-append.durable-append-event-enqueues-action-to-workpool -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-append ---- -# durableAppendEvent enqueues action to Workpool - -## Intent - -- outcome: Executable scenario: durableAppendEvent enqueues action to Workpool - -```gwt -Given a mock Workpool for durable append -When calling durableAppendEvent for stream "Order:ord-123" -Then Workpool enqueueAction should be called -And the workpool partition key should be "Order:ord-123" -And the result status should be "enqueued" -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-004-durable-append-event-returns-work-id-from-workpool.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-004-durable-append-event-returns-work-id-from-workpool.sdp.md deleted file mode 100644 index ea3117b6..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-004-durable-append-event-returns-work-id-from-workpool.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-append.durable-append-event-returns-work-id-from-workpool -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-append ---- -# durableAppendEvent returns work ID from Workpool - -## Intent - -- outcome: Executable scenario: durableAppendEvent returns work ID from Workpool - -```gwt -Given a mock Workpool that returns work ID "work-789" -When calling durableAppendEvent for any event -Then the result workId should be "work-789" -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-005-durable-append-event-passes-on-complete-to-workpool.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-005-durable-append-event-passes-on-complete-to-workpool.sdp.md deleted file mode 100644 index e6250f73..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-005-durable-append-event-passes-on-complete-to-workpool.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-append.durable-append-event-passes-on-complete-to-workpool -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-append ---- -# durableAppendEvent passes onComplete to Workpool - -## Intent - -- outcome: Executable scenario: durableAppendEvent passes onComplete to Workpool - -```gwt -Given a mock Workpool for durable append -When calling durableAppendEvent with onComplete handler -Then Workpool should receive the onComplete reference -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-006-durable-append-event-includes-idempotency-key-in-context.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-006-durable-append-event-includes-idempotency-key-in-context.sdp.md deleted file mode 100644 index d0bc2052..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-006-durable-append-event-includes-idempotency-key-in-context.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-append.durable-append-event-includes-idempotency-key-in-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-append ---- -# durableAppendEvent includes idempotencyKey in context - -## Intent - -- outcome: Executable scenario: durableAppendEvent includes idempotencyKey in context - -```gwt -Given a mock Workpool for durable append -When calling durableAppendEvent with idempotencyKey "test:ord-123" -Then Workpool context should include the idempotencyKey -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-007-create-durable-append-action-handler-returns-a-function.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-007-create-durable-append-action-handler-returns-a-function.sdp.md deleted file mode 100644 index fada7542..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-007-create-durable-append-action-handler-returns-a-function.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-append.create-durable-append-action-handler-returns-a-function -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-append ---- -# createDurableAppendActionHandler returns a function - -## Intent - -- outcome: Executable scenario: createDurableAppendActionHandler returns a function - -```gwt -Given the feature fixture is in place -When calling createDurableAppendActionHandler -Then the result should be a callable function -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-008-action-handler-invokes-idempotent-append-event.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-008-action-handler-invokes-idempotent-append-event.sdp.md deleted file mode 100644 index 30644473..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-append.examples/s-008-action-handler-invokes-idempotent-append-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-append.action-handler-invokes-idempotent-append-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-append ---- -# Action handler invokes idempotentAppendEvent - -## Intent - -- outcome: Executable scenario: Action handler invokes idempotentAppendEvent - -```gwt -Given a durable append action handler -When invoking the handler with event args -Then idempotentAppendEvent should be called -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-append.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-append.sdp.md index c267d857..b6997c2a 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-append.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-append.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Durable Event Append +- outcome: Wrap event append in Workpool for automatic retry with exponential backoff so failed async appends are recovered via Workpool actions. +- value: Partition keys, durableAppendEvent, and the action handler keep append retries out of the caller path. diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-001-partition-key-format-is-event-id-target-context.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-001-partition-key-format-is-event-id-target-context.sdp.md deleted file mode 100644 index 916e6caa..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-001-partition-key-format-is-event-id-target-context.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-publication.partition-key-format-is-event-id-target-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-publication ---- -# Partition key format is eventId:targetContext - -## Intent - -- outcome: Executable scenario: Partition key format is eventId:targetContext - -```gwt -Given an eventId "evt-123" and target context "inventory" -When creating a publication partition key -Then the partition key value should be "evt-123:inventory" -And the partition key name should be "publication" -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-002-different-events-get-different-partition-keys.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-002-different-events-get-different-partition-keys.sdp.md deleted file mode 100644 index ee72e870..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-002-different-events-get-different-partition-keys.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-publication.different-events-get-different-partition-keys -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-publication ---- -# Different events get different partition keys - -## Intent - -- outcome: Executable scenario: Different events get different partition keys - -```gwt -Given an eventId "value" and target context "value" -When creating a publication partition key -Then the partition key value should be "value" -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-003-publishing-event-creates-tracking-records-for-each-target.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-003-publishing-event-creates-tracking-records-for-each-target.sdp.md deleted file mode 100644 index 86343059..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-003-publishing-event-creates-tracking-records-for-each-target.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-publication.publishing-event-creates-tracking-records-for-each-target -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-publication ---- -# Publishing event creates tracking records for each target - -## Intent - -- outcome: Executable scenario: Publishing event creates tracking records for each target - -```gwt -Given a durable event publisher configured with maxAttempts 5 -And an event "evt-123" to publish to contexts "inventory" and "notifications" -When publishing the event -Then 2 publication tracking records should be created -And each record should have status "pending" -And each record should have attemptCount 0 -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-004-publishing-event-enqueues-delivery-actions-via-workpool.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-004-publishing-event-enqueues-delivery-actions-via-workpool.sdp.md deleted file mode 100644 index 2b6c135c..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-004-publishing-event-enqueues-delivery-actions-via-workpool.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-publication.publishing-event-enqueues-delivery-actions-via-workpool -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-publication ---- -# Publishing event enqueues delivery actions via Workpool - -## Intent - -- outcome: Executable scenario: Publishing event enqueues delivery actions via Workpool - -```gwt -Given a durable event publisher configured with maxAttempts 5 -And an event "evt-123" to publish to contexts "inventory" and "notifications" -When publishing the event -Then 2 delivery actions should be enqueued -And each action should have correct partition key -And each action should have onComplete handler set -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-005-publish-result-contains-publication-i-ds-for-each-target.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-005-publish-result-contains-publication-i-ds-for-each-target.sdp.md deleted file mode 100644 index 9dd2e3e4..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-005-publish-result-contains-publication-i-ds-for-each-target.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-publication.publish-result-contains-publication-i-ds-for-each-target -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-publication ---- -# Query returns empty for unknown event - -## Intent - -- outcome: Executable scenario: Query returns empty for unknown event - -```gwt -Given the backend is running and clean -And durable publication is configured with maxAttempts 3 -And no publications exist for event "evt-pub-unknown" -When querying publications for event "evt-pub-unknown" -Then 0 publication records should be returned -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-006-correlation-id-is-passed-through-to-tracking-records.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-006-correlation-id-is-passed-through-to-tracking-records.sdp.md deleted file mode 100644 index fb23fa7f..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-006-correlation-id-is-passed-through-to-tracking-records.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-publication.correlation-id-is-passed-through-to-tracking-records -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-publication ---- -# Correlation ID is passed through to tracking records - -## Intent - -- outcome: Executable scenario: Correlation ID is passed through to tracking records - -```gwt -Given a durable event publisher -And an event "evt-123" with correlationId "corr-456" -And target contexts "inventory" -When publishing the event -Then the tracking record should have correlationId "corr-456" -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-007-get-publication-status-returns-all-target-contexts.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-007-get-publication-status-returns-all-target-contexts.sdp.md deleted file mode 100644 index 851dd341..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-007-get-publication-status-returns-all-target-contexts.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-publication.get-publication-status-returns-all-target-contexts -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-publication ---- -# Get publication status returns all target contexts - -## Intent - -- outcome: Executable scenario: Get publication status returns all target contexts - -```gwt -Given publications exist for event "evt-123" to 3 targets -When getting publication status for event "evt-123" -Then the result should contain 3 publications -And the result should show inventory as delivered -And the result should show analytics as dead_letter -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-008-get-publication-status-returns-empty-array-for-unknown-event.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-008-get-publication-status-returns-empty-array-for-unknown-event.sdp.md deleted file mode 100644 index a2671034..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-008-get-publication-status-returns-empty-array-for-unknown-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-publication.get-publication-status-returns-empty-array-for-unknown-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-publication ---- -# Get publication status returns empty array for unknown event - -## Intent - -- outcome: Executable scenario: Get publication status returns empty array for unknown event - -```gwt -Given no publications exist for event "evt-unknown" -When getting publication status for event "evt-unknown" -Then the result should be an empty array -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-009-retry-publication-re-enqueues-delivery-action.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-009-retry-publication-re-enqueues-delivery-action.sdp.md deleted file mode 100644 index f55dde16..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-009-retry-publication-re-enqueues-delivery-action.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-publication.retry-publication-re-enqueues-delivery-action -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-publication ---- -# Retry publication re-enqueues delivery action - -## Intent - -- outcome: Executable scenario: Retry publication re-enqueues delivery action - -```gwt -Given a publication record "pub-123" with status "dead_letter" -When retrying publication "pub-123" -Then the result status should be "retried" -And the record status should be updated to "retried" -And attemptCount should be incremented -And a new delivery action should be enqueued -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-010-retry-publication-returns-not-found-for-unknown-publication.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-010-retry-publication-returns-not-found-for-unknown-publication.sdp.md deleted file mode 100644 index 8a0f29a2..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-010-retry-publication-returns-not-found-for-unknown-publication.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-publication.retry-publication-returns-not-found-for-unknown-publication -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-publication ---- -# Retry publication returns not_found for unknown publication - -## Intent - -- outcome: Executable scenario: Retry publication returns not_found for unknown publication - -```gwt -Given no publication record exists for "pub-unknown" -When retrying publication "pub-unknown" -Then the result status should be "not_found" -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-011-retry-publication-returns-already-delivered-for-delivered-publication.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-011-retry-publication-returns-already-delivered-for-delivered-publication.sdp.md deleted file mode 100644 index 9b9cf147..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-011-retry-publication-returns-already-delivered-for-delivered-publication.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-publication.retry-publication-returns-already-delivered-for-delivered-publication -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-publication ---- -# Retry publication returns already_delivered for delivered publication - -## Intent - -- outcome: Executable scenario: Retry publication returns already_delivered for delivered publication - -```gwt -Given a publication record "pub-123" with status "delivered" -When retrying publication "pub-123" -Then the result status should be "already_delivered" -And no delivery action should be enqueued -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-012-retry-increments-attempt-count-correctly.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-012-retry-increments-attempt-count-correctly.sdp.md deleted file mode 100644 index ef1f0811..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-012-retry-increments-attempt-count-correctly.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-publication.retry-increments-attempt-count-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-publication ---- -# Retry increments attempt count correctly - -## Intent - -- outcome: Executable scenario: Retry increments attempt count correctly - -```gwt -Given a publication record "pub-123" with status "dead_letter" and attemptCount 5 -When retrying publication "pub-123" -Then the record attemptCount should be 6 -And lastAttemptAt should be updated -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-013-on-complete-updates-status-to-delivered-on-success.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-013-on-complete-updates-status-to-delivered-on-success.sdp.md deleted file mode 100644 index f4fbe274..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-013-on-complete-updates-status-to-delivered-on-success.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-publication.on-complete-updates-status-to-delivered-on-success -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-publication ---- -# onComplete updates status to delivered on success - -## Intent - -- outcome: Executable scenario: onComplete updates status to delivered on success - -```gwt -Given a publication "pub-123" in pending state -And delivery action succeeds -When onComplete callback is invoked with success -Then publication status should be "delivered" -And deliveredAt timestamp should be set -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-014-on-complete-increments-attempt-count-on-failure.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-014-on-complete-increments-attempt-count-on-failure.sdp.md deleted file mode 100644 index ac9379d8..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-014-on-complete-increments-attempt-count-on-failure.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-publication.on-complete-increments-attempt-count-on-failure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-publication ---- -# onComplete increments attemptCount on failure - -## Intent - -- outcome: Executable scenario: onComplete increments attemptCount on failure - -```gwt -Given a publication "pub-123" with attemptCount 2 -And delivery action fails -When onComplete callback is invoked with failure -Then publication attemptCount should be 3 -And status should remain "pending" if under maxAttempts -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-015-on-complete-creates-dead-letter-after-max-retries.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-015-on-complete-creates-dead-letter-after-max-retries.sdp.md deleted file mode 100644 index 948b42a5..00000000 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.examples/s-015-on-complete-creates-dead-letter-after-max-retries.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.durable-publication.on-complete-creates-dead-letter-after-max-retries -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.durable-publication ---- -# onComplete creates dead letter after max retries - -## Intent - -- outcome: Executable scenario: onComplete creates dead letter after max retries - -```gwt -Given a publication "pub-123" with attemptCount at maxAttempts -And delivery action fails -When onComplete callback is invoked with failure -Then publication status should be "dead_letter" -And error details should be recorded -``` diff --git a/specs/behavior/platform-core/event-store-durability/durable-publication.sdp.md b/specs/behavior/platform-core/event-store-durability/durable-publication.sdp.md index 972262ff..957afeca 100644 --- a/specs/behavior/platform-core/event-store-durability/durable-publication.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/durable-publication.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Durable Cross-Context Event Publication +- outcome: Publish cross-context events through Workpool-backed delivery with tracking, retry, and dead-letter handling. +- value: Each target context gets a publication record and a retryable delivery action instead of a fire-and-forget emit. diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-001-command-idempotency-key-uses-command-type-entity-id-command-id-format.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-001-command-idempotency-key-uses-command-type-entity-id-command-id-format.sdp.md deleted file mode 100644 index dcd43171..00000000 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-001-command-idempotency-key-uses-command-type-entity-id-command-id-format.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.idempotent-append.command-idempotency-key-uses-command-type-entity-id-command-id-format -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.idempotent-append ---- -# Command idempotency key uses commandType:entityId:commandId format - -## Intent - -- outcome: Executable scenario: Command idempotency key uses commandType:entityId:commandId format - -```gwt -Given the feature fixture is in place -When building command idempotency key with type "SubmitOrder", entity "ord-123", command "cmd-456" -Then the idempotency key should be "SubmitOrder:ord-123:cmd-456" -``` diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-002-action-idempotency-key-uses-action-type-entity-id-format.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-002-action-idempotency-key-uses-action-type-entity-id-format.sdp.md deleted file mode 100644 index 2e1c3f7b..00000000 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-002-action-idempotency-key-uses-action-type-entity-id-format.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.idempotent-append.action-idempotency-key-uses-action-type-entity-id-format -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.idempotent-append ---- -# Action idempotency key uses actionType:entityId format - -## Intent - -- outcome: Executable scenario: Action idempotency key uses actionType:entityId format - -```gwt -Given the feature fixture is in place -When building action idempotency key with type "payment" and entity "ord-123" -Then the idempotency key should be "payment:ord-123" -``` diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-003-saga-step-idempotency-key-uses-saga-type-saga-id-step-format.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-003-saga-step-idempotency-key-uses-saga-type-saga-id-step-format.sdp.md deleted file mode 100644 index a501c4c9..00000000 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-003-saga-step-idempotency-key-uses-saga-type-saga-id-step-format.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.idempotent-append.saga-step-idempotency-key-uses-saga-type-saga-id-step-format -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.idempotent-append ---- -# Saga step idempotency key uses sagaType:sagaId:step format - -## Intent - -- outcome: Executable scenario: Saga step idempotency key uses sagaType:sagaId:step format - -```gwt -Given the feature fixture is in place -When building saga step idempotency key with type "OrderFulfillment", id "saga-789", step "reserveStock" -Then the idempotency key should be "OrderFulfillment:saga-789:reserveStock" -``` diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-004-scheduled-job-idempotency-key-uses-job-type-schedule-id-timestamp-format.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-004-scheduled-job-idempotency-key-uses-job-type-schedule-id-timestamp-format.sdp.md deleted file mode 100644 index 32499499..00000000 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-004-scheduled-job-idempotency-key-uses-job-type-schedule-id-timestamp-format.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.idempotent-append.scheduled-job-idempotency-key-uses-job-type-schedule-id-timestamp-format -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.idempotent-append ---- -# Scheduled job idempotency key uses jobType:scheduleId:timestamp format - -## Intent - -- outcome: Executable scenario: Scheduled job idempotency key uses jobType:scheduleId:timestamp format - -```gwt -Given the feature fixture is in place -When building scheduled job idempotency key with type "expireReservations", schedule "job-001", timestamp 1704067200 -Then the idempotency key should be "expireReservations:job-001:1704067200" -``` diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-005-first-append-with-idempotency-key-succeeds.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-005-first-append-with-idempotency-key-succeeds.sdp.md deleted file mode 100644 index a32b8fcf..00000000 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-005-first-append-with-idempotency-key-succeeds.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.idempotent-append.first-append-with-idempotency-key-succeeds -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.idempotent-append ---- -# First append with idempotency key succeeds - -## Intent - -- outcome: Executable scenario: First append with idempotency key succeeds - -```gwt -Given no existing event for idempotency key "payment:ord-123" -When calling idempotentAppendEvent with key "payment:ord-123" -Then the append result status should be "appended" -And a new event ID should be generated -``` diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-006-duplicate-append-returns-existing-event.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-006-duplicate-append-returns-existing-event.sdp.md deleted file mode 100644 index 28c507c5..00000000 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-006-duplicate-append-returns-existing-event.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.idempotent-append.duplicate-append-returns-existing-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.idempotent-append ---- -# Duplicate append returns existing event - -## Intent - -- outcome: Executable scenario: Duplicate append returns existing event - -```gwt -Given an existing event with idempotency key "payment:ord-123" and ID "evt-456" -When calling idempotentAppendEvent with key "payment:ord-123" -Then the append result status should be "duplicate" -And the result event ID should be "evt-456" -``` diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-007-same-key-with-different-payload-is-rejected.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-007-same-key-with-different-payload-is-rejected.sdp.md deleted file mode 100644 index 8367c188..00000000 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-007-same-key-with-different-payload-is-rejected.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.idempotent-append.same-key-with-different-payload-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.idempotent-append ---- -# Same key with different payload is rejected - -## Intent - -- outcome: Executable scenario: Same key with different payload is rejected - -```gwt -Given an existing event with idempotency key "payment:ord-123" and payload chargeId "ch-legacy" -And appendToStream reports an audited idempotency conflict for existing event "evt-456" -When calling idempotentAppendEvent with key "payment:ord-123" and payload chargeId "ch-new" -Then an idempotency conflict error should be thrown -``` diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-008-different-idempotency-keys-create-separate-events.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-008-different-idempotency-keys-create-separate-events.sdp.md deleted file mode 100644 index 0081ecea..00000000 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-008-different-idempotency-keys-create-separate-events.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.idempotent-append.different-idempotency-keys-create-separate-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.idempotent-append ---- -# Different idempotency keys create separate events - -## Intent - -- outcome: Executable scenario: Different idempotency keys create separate events - -```gwt -Given no existing event for idempotency key "payment:ord-456" -When calling idempotentAppendEvent with key "payment:ord-456" -Then the append result status should be "appended" -``` diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-009-occ-conflict-with-duplicate-on-recheck-returns-duplicate.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-009-occ-conflict-with-duplicate-on-recheck-returns-duplicate.sdp.md deleted file mode 100644 index 35409e9f..00000000 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-009-occ-conflict-with-duplicate-on-recheck-returns-duplicate.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.idempotent-append.occ-conflict-with-duplicate-on-recheck-returns-duplicate -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.idempotent-append ---- -# OCC conflict with duplicate on recheck returns duplicate - -## Intent - -- outcome: Executable scenario: OCC conflict with duplicate on recheck returns duplicate - -```gwt -Given no initial event but duplicate appears on recheck for key "payment:ord-123" -When calling idempotentAppendEvent with OCC conflict -Then the append result status should be "duplicate" -``` diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-010-true-occ-conflict-throws-error.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-010-true-occ-conflict-throws-error.sdp.md deleted file mode 100644 index 1add659c..00000000 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.examples/s-010-true-occ-conflict-throws-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.idempotent-append.true-occ-conflict-throws-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.idempotent-append ---- -# True OCC conflict throws error - -## Intent - -- outcome: Executable scenario: True OCC conflict throws error - -```gwt -Given no event exists and no duplicate on recheck for key "payment:ord-123" -When calling idempotentAppendEvent with true OCC conflict -Then an OCC conflict error should be thrown with version info -``` diff --git a/specs/behavior/platform-core/event-store-durability/idempotent-append.sdp.md b/specs/behavior/platform-core/event-store-durability/idempotent-append.sdp.md index cf9737c7..6e77418f 100644 --- a/specs/behavior/platform-core/event-store-durability/idempotent-append.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/idempotent-append.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Idempotent Event Append +- outcome: Append each event only once even when the append operation is retried so duplicate events cannot corrupt projections or double-process downstream. +- value: Command, action, saga-step, and scheduled-job key builders feed one idempotentAppendEvent path that returns appended, duplicate, or conflict. diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-001-build-intent-key-generates-correct-format.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-001-build-intent-key-generates-correct-format.sdp.md deleted file mode 100644 index 573c62fe..00000000 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-001-build-intent-key-generates-correct-format.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.intent-completion.build-intent-key-generates-correct-format -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.intent-completion ---- -# buildIntentKey generates correct format - -## Intent - -- outcome: Executable scenario: buildIntentKey generates correct format - -```gwt -Given the feature fixture is in place -When building intent key for operation "OrderSubmission", stream "Order:ord-123", timestamp 1704067200000 -Then the intent key should be "OrderSubmission:Order:ord-123:1704067200000" -``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-002-intent-key-handles-various-operation-types.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-002-intent-key-handles-various-operation-types.sdp.md deleted file mode 100644 index d156ca3d..00000000 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-002-intent-key-handles-various-operation-types.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.intent-completion.intent-key-handles-various-operation-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.intent-completion ---- -# Intent key handles various operation types - -## Intent - -- outcome: Executable scenario: Intent key handles various operation types - -```gwt -Given the feature fixture is in place -When building intent key for operation "value", stream "value:value", timestamp value -Then the intent key should be "value" -``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-003-record-intent-creates-intent-event-with-correct-type.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-003-record-intent-creates-intent-event-with-correct-type.sdp.md deleted file mode 100644 index 63a615ed..00000000 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-003-record-intent-creates-intent-event-with-correct-type.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.intent-completion.record-intent-creates-intent-event-with-correct-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.intent-completion ---- -# recordIntent creates intent event with correct type - -## Intent - -- outcome: Executable scenario: recordIntent creates intent event with correct type - -```gwt -Given a mock context for intent recording -When recording intent for operation "OrderSubmission" with timeout 300000ms -Then an event of type "OrderSubmissionStarted" should be created -And the event data should include the intent key and timeout -``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-004-record-intent-schedules-timeout-check.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-004-record-intent-schedules-timeout-check.sdp.md deleted file mode 100644 index caf1dc19..00000000 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-004-record-intent-schedules-timeout-check.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.intent-completion.record-intent-schedules-timeout-check -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.intent-completion ---- -# recordIntent schedules timeout check - -## Intent - -- outcome: Executable scenario: recordIntent schedules timeout check - -```gwt -Given a mock context for intent recording -When recording intent with timeout 60000ms -Then scheduler.runAfter should be called with 60000ms delay -``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-005-record-intent-returns-intent-key-and-event-id.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-005-record-intent-returns-intent-key-and-event-id.sdp.md deleted file mode 100644 index 2cfc7404..00000000 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-005-record-intent-returns-intent-key-and-event-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.intent-completion.record-intent-returns-intent-key-and-event-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.intent-completion ---- -# recordIntent returns intentKey and eventId - -## Intent - -- outcome: Executable scenario: recordIntent returns intentKey and eventId - -```gwt -Given a mock context for intent recording -When recording any intent -Then the result should contain intentKey and intentEventId -``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-006-record-completion-creates-success-event.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-006-record-completion-creates-success-event.sdp.md deleted file mode 100644 index 5455aa2d..00000000 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-006-record-completion-creates-success-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.intent-completion.record-completion-creates-success-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.intent-completion ---- -# recordCompletion creates success event - -## Intent - -- outcome: Executable scenario: recordCompletion creates success event - -```gwt -Given a mock context for completion recording -When recording completion with status "success" for intent "OrderSubmission:Order:ord-123:1704067200000" -Then an event of type "OrderSubmissionCompleted" should be created -``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-007-record-completion-creates-failure-event-with-error.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-007-record-completion-creates-failure-event-with-error.sdp.md deleted file mode 100644 index 8706e834..00000000 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-007-record-completion-creates-failure-event-with-error.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.intent-completion.record-completion-creates-failure-event-with-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.intent-completion ---- -# recordCompletion creates failure event with error - -## Intent - -- outcome: Executable scenario: recordCompletion creates failure event with error - -```gwt -Given a mock context for completion recording -When recording completion with status "failure" and error "Validation failed" -Then an event of type "OrderSubmissionFailed" should be created -And the event data should include error "Validation failed" -``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-008-record-completion-creates-abandonment-event.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-008-record-completion-creates-abandonment-event.sdp.md deleted file mode 100644 index 948e8302..00000000 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-008-record-completion-creates-abandonment-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.intent-completion.record-completion-creates-abandonment-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.intent-completion ---- -# recordCompletion creates abandonment event - -## Intent - -- outcome: Executable scenario: recordCompletion creates abandonment event - -```gwt -Given a mock context for completion recording -When recording completion with status "abandoned" for intent "OrderSubmission:Order:ord-123:1704067200000" -Then an event of type "OrderSubmissionAbandoned" should be created -``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-009-check-intent-timeout-returns-already-resolved-when-completion-exists.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-009-check-intent-timeout-returns-already-resolved-when-completion-exists.sdp.md deleted file mode 100644 index a49b7f58..00000000 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-009-check-intent-timeout-returns-already-resolved-when-completion-exists.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.intent-completion.check-intent-timeout-returns-already-resolved-when-completion-exists -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.intent-completion ---- -# checkIntentTimeout returns already_resolved when completion exists - -## Intent - -- outcome: Executable scenario: checkIntentTimeout returns already_resolved when completion exists - -```gwt -Given a mock context where completion exists for the intent -When calling checkIntentTimeout -Then the result status should be "already_resolved" -And no new event should be created -``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-010-check-intent-timeout-creates-abandonment-when-no-completion.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-010-check-intent-timeout-creates-abandonment-when-no-completion.sdp.md deleted file mode 100644 index fac8369e..00000000 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-010-check-intent-timeout-creates-abandonment-when-no-completion.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.intent-completion.check-intent-timeout-creates-abandonment-when-no-completion -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.intent-completion ---- -# checkIntentTimeout creates abandonment when no completion - -## Intent - -- outcome: Executable scenario: checkIntentTimeout creates abandonment when no completion - -```gwt -Given a mock context where no completion exists -When calling checkIntentTimeout -Then the result status should be "abandoned" -And an abandonment event should be created -``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-011-check-intent-timeout-is-idempotent.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-011-check-intent-timeout-is-idempotent.sdp.md deleted file mode 100644 index 763db78c..00000000 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-011-check-intent-timeout-is-idempotent.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.intent-completion.check-intent-timeout-is-idempotent -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.intent-completion ---- -# checkIntentTimeout is idempotent - -## Intent - -- outcome: Executable scenario: checkIntentTimeout is idempotent - -```gwt -Given a mock context where abandonment completion already exists -When calling checkIntentTimeout again -Then the result status should be "already_resolved" -``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-012-query-orphaned-intents-returns-intents-without-completion.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-012-query-orphaned-intents-returns-intents-without-completion.sdp.md deleted file mode 100644 index 0fa12b6f..00000000 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-012-query-orphaned-intents-returns-intents-without-completion.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.intent-completion.query-orphaned-intents-returns-intents-without-completion -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.intent-completion ---- -# queryOrphanedIntents returns intents without completion - -## Intent - -- outcome: Executable scenario: queryOrphanedIntents returns intents without completion - -```gwt -Given 3 intent events where 1 has no completion -When querying orphaned intents older than 300000ms -Then the result should contain 1 orphaned intent -And each orphan should include timeSinceIntent -``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-013-query-orphaned-intents-filters-by-operation-type.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-013-query-orphaned-intents-filters-by-operation-type.sdp.md deleted file mode 100644 index b25f7e94..00000000 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.examples/s-013-query-orphaned-intents-filters-by-operation-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.intent-completion.query-orphaned-intents-filters-by-operation-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.intent-completion ---- -# queryOrphanedIntents filters by operation type - -## Intent - -- outcome: Executable scenario: queryOrphanedIntents filters by operation type - -```gwt -Given orphaned intents for multiple operation types -When querying with operationType filter "OrderSubmission" -Then the query should filter by operation type -``` diff --git a/specs/behavior/platform-core/event-store-durability/intent-completion.sdp.md b/specs/behavior/platform-core/event-store-durability/intent-completion.sdp.md index 1753bc05..8f4dabf7 100644 --- a/specs/behavior/platform-core/event-store-durability/intent-completion.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/intent-completion.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Intent and Completion Bracketing +- outcome: Record intent before long-running operations and completion after success or failure so timeout detection, reconciliation, and audit remain possible. +- value: Intent keys, timeout checks, and orphaned-intent queries bracket multi-step work without inventing a second ledger. diff --git a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-001-create-outbox-handler-returns-a-callable-function.sdp.md b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-001-create-outbox-handler-returns-a-callable-function.sdp.md deleted file mode 100644 index c8fcfe21..00000000 --- a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-001-create-outbox-handler-returns-a-callable-function.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.outbox-handler.create-outbox-handler-returns-a-callable-function -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.outbox-handler ---- -# createOutboxHandler returns a callable function - -## Intent - -- outcome: Executable scenario: createOutboxHandler returns a callable function - -```gwt -Given the feature fixture is in place -When creating an outbox handler with standard configuration -Then the result should be a function -``` diff --git a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-002-outbox-handler-extracts-idempotency-key-from-context.sdp.md b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-002-outbox-handler-extracts-idempotency-key-from-context.sdp.md deleted file mode 100644 index 19467ec9..00000000 --- a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-002-outbox-handler-extracts-idempotency-key-from-context.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.outbox-handler.outbox-handler-extracts-idempotency-key-from-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.outbox-handler ---- -# Outbox handler extracts idempotency key from context - -## Intent - -- outcome: Executable scenario: Outbox handler extracts idempotency key from context - -```gwt -Given an outbox handler configured to use orderId for idempotency key -When processing a success result with orderId "ord-123" -Then the idempotency key should be "payment:ord-123" -``` diff --git a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-003-outbox-handler-builds-payment-completed-event-from-success-result.sdp.md b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-003-outbox-handler-builds-payment-completed-event-from-success-result.sdp.md deleted file mode 100644 index b706dfee..00000000 --- a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-003-outbox-handler-builds-payment-completed-event-from-success-result.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.outbox-handler.outbox-handler-builds-payment-completed-event-from-success-result -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.outbox-handler ---- -# Outbox handler builds PaymentCompleted event from success result - -## Intent - -- outcome: Executable scenario: Outbox handler builds PaymentCompleted event from success result - -```gwt -Given an outbox handler for payment events -When processing success result with chargeId "ch-456" and orderId "ord-123" -Then the event type should be "PaymentCompleted" -And the event data should contain chargeId "ch-456" -``` diff --git a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-004-outbox-handler-builds-payment-failed-event-from-failure-result.sdp.md b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-004-outbox-handler-builds-payment-failed-event-from-failure-result.sdp.md deleted file mode 100644 index 32fb42bf..00000000 --- a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-004-outbox-handler-builds-payment-failed-event-from-failure-result.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.outbox-handler.outbox-handler-builds-payment-failed-event-from-failure-result -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.outbox-handler ---- -# Outbox handler builds PaymentFailed event from failure result - -## Intent - -- outcome: Executable scenario: Outbox handler builds PaymentFailed event from failure result - -```gwt -Given an outbox handler for payment events -When processing failure result with error "Card declined" and orderId "ord-123" -Then the event type should be "PaymentFailed" -And the event data should contain error "Card declined" -``` diff --git a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-005-outbox-handler-calls-idempotent-append-event-internally.sdp.md b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-005-outbox-handler-calls-idempotent-append-event-internally.sdp.md deleted file mode 100644 index 97abc953..00000000 --- a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-005-outbox-handler-calls-idempotent-append-event-internally.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.outbox-handler.outbox-handler-calls-idempotent-append-event-internally -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.outbox-handler ---- -# Outbox handler calls idempotentAppendEvent internally - -## Intent - -- outcome: Executable scenario: Outbox handler calls idempotentAppendEvent internally - -```gwt -Given an outbox handler with mock event store -When processing a result with orderId "ord-123" -Then idempotentAppendEvent should be invoked -And the event should include bounded context "orders" -``` diff --git a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-006-outbox-handler-completes-without-error-for-duplicates.sdp.md b/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-006-outbox-handler-completes-without-error-for-duplicates.sdp.md deleted file mode 100644 index ad73f749..00000000 --- a/specs/behavior/platform-core/event-store-durability/outbox-handler.examples/s-006-outbox-handler-completes-without-error-for-duplicates.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.outbox-handler.outbox-handler-completes-without-error-for-duplicates -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.outbox-handler ---- -# Outbox handler completes without error for duplicates - -## Intent - -- outcome: Executable scenario: Outbox handler completes without error for duplicates - -```gwt -Given an outbox handler where idempotent append returns duplicate -When processing a result with existing idempotency key -Then the handler should complete successfully -``` diff --git a/specs/behavior/platform-core/event-store-durability/outbox-handler.sdp.md b/specs/behavior/platform-core/event-store-durability/outbox-handler.sdp.md index 35f7c29b..b223a7b5 100644 --- a/specs/behavior/platform-core/event-store-durability/outbox-handler.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/outbox-handler.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Outbox Handler Pattern +- outcome: Capture action results as domain events through durable onComplete handlers so external API success and failure are recorded with idempotent append. +- value: PaymentCompleted and PaymentFailed events reuse the same idempotency key so duplicate outbox deliveries stay safe. diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-001-successful-processing-creates-no-poison-record.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-001-successful-processing-creates-no-poison-record.sdp.md deleted file mode 100644 index c793d646..00000000 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-001-successful-processing-creates-no-poison-record.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.poison-event.successful-processing-creates-no-poison-record -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.poison-event ---- -# Successful processing creates no poison record - -## Intent - -- outcome: Executable scenario: Successful processing creates no poison record - -```gwt -Given a poison event handler wrapping a successful projection -When processing an event -Then no poison record should be created -And the handler should complete successfully -``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-002-first-failure-records-attempt-but-does-not-quarantine.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-002-first-failure-records-attempt-but-does-not-quarantine.sdp.md deleted file mode 100644 index 0b4b48f9..00000000 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-002-first-failure-records-attempt-but-does-not-quarantine.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.poison-event.first-failure-records-attempt-but-does-not-quarantine -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.poison-event ---- -# First failure records attempt but does not quarantine - -## Intent - -- outcome: Executable scenario: First failure records attempt but does not quarantine - -```gwt -Given a poison event handler with maxAttempts 3 and no existing record -When processing an event that throws an error -Then a poison record should be created with attemptCount 1 -And the record status should be "pending" -And the original error should be re-thrown -``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-003-event-becomes-quarantined-after-max-retries.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-003-event-becomes-quarantined-after-max-retries.sdp.md deleted file mode 100644 index 50d32c65..00000000 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-003-event-becomes-quarantined-after-max-retries.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.poison-event.event-becomes-quarantined-after-max-retries -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.poison-event ---- -# Event becomes quarantined after max retries - -## Intent - -- outcome: Executable scenario: Event becomes quarantined after max retries - -```gwt -Given a poison event handler with maxAttempts 3 and existing record with 2 attempts -When processing an event that throws an error -Then the poison record should be updated to status "quarantined" -And the error should NOT be re-thrown -``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-004-quarantined-event-is-silently-skipped.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-004-quarantined-event-is-silently-skipped.sdp.md deleted file mode 100644 index 024e76a2..00000000 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-004-quarantined-event-is-silently-skipped.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.poison-event.quarantined-event-is-silently-skipped -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.poison-event ---- -# Quarantined event is silently skipped - -## Intent - -- outcome: Executable scenario: Quarantined event is silently skipped - -```gwt -Given a poison event handler with a quarantined record for the event -When processing the quarantined event -Then the projection handler should NOT be called -And no error should be thrown -``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-005-on-quarantine-callback-invoked-when-alert-on-quarantine-is-true.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-005-on-quarantine-callback-invoked-when-alert-on-quarantine-is-true.sdp.md deleted file mode 100644 index dabf487f..00000000 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-005-on-quarantine-callback-invoked-when-alert-on-quarantine-is-true.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.poison-event.on-quarantine-callback-invoked-when-alert-on-quarantine-is-true -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.poison-event ---- -# onQuarantine callback invoked when alertOnQuarantine is true - -## Intent - -- outcome: Executable scenario: onQuarantine callback invoked when alertOnQuarantine is true - -```gwt -Given a poison handler with alertOnQuarantine true and onQuarantine callback -When an event becomes quarantined -Then the onQuarantine callback should be invoked with event details -``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-006-on-quarantine-not-invoked-when-alert-on-quarantine-is-false.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-006-on-quarantine-not-invoked-when-alert-on-quarantine-is-false.sdp.md deleted file mode 100644 index da55f9ef..00000000 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-006-on-quarantine-not-invoked-when-alert-on-quarantine-is-false.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.poison-event.on-quarantine-not-invoked-when-alert-on-quarantine-is-false -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.poison-event ---- -# onQuarantine NOT invoked when alertOnQuarantine is false - -## Intent - -- outcome: Executable scenario: onQuarantine NOT invoked when alertOnQuarantine is false - -```gwt -Given a poison handler with alertOnQuarantine false -When an event becomes quarantined -Then the onQuarantine callback should NOT be invoked -``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-007-is-event-quarantined-returns-true-for-quarantined-event.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-007-is-event-quarantined-returns-true-for-quarantined-event.sdp.md deleted file mode 100644 index 2a6bc448..00000000 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-007-is-event-quarantined-returns-true-for-quarantined-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.poison-event.is-event-quarantined-returns-true-for-quarantined-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.poison-event ---- -# isEventQuarantined returns true for quarantined event - -## Intent - -- outcome: Executable scenario: isEventQuarantined returns true for quarantined event - -```gwt -Given a quarantined poison record for event "evt-123" -When checking if event "evt-123" is quarantined for projection "orderSummary" -Then the result should be true -``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-008-is-event-quarantined-returns-false-for-non-quarantined-event.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-008-is-event-quarantined-returns-false-for-non-quarantined-event.sdp.md deleted file mode 100644 index be5f36d7..00000000 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-008-is-event-quarantined-returns-false-for-non-quarantined-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.poison-event.is-event-quarantined-returns-false-for-non-quarantined-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.poison-event ---- -# isEventQuarantined returns false for non-quarantined event - -## Intent - -- outcome: Executable scenario: isEventQuarantined returns false for non-quarantined event - -```gwt -Given a pending poison record for event "evt-123" -When checking if event "evt-123" is quarantined for projection "orderSummary" -Then the result should be false -``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-009-get-poison-event-record-returns-normalized-record.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-009-get-poison-event-record-returns-normalized-record.sdp.md deleted file mode 100644 index c355eed4..00000000 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-009-get-poison-event-record-returns-normalized-record.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.poison-event.get-poison-event-record-returns-normalized-record -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.poison-event ---- -# getPoisonEventRecord returns normalized record - -## Intent - -- outcome: Executable scenario: getPoisonEventRecord returns normalized record - -```gwt -Given a poison record with attemptCount 3 and error "Test error" -When getting poison record for the event -Then the result should have attempts 3 and lastError "Test error" -``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-010-get-poison-event-record-returns-null-for-non-existent-event.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-010-get-poison-event-record-returns-null-for-non-existent-event.sdp.md deleted file mode 100644 index 30f7588c..00000000 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-010-get-poison-event-record-returns-null-for-non-existent-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.poison-event.get-poison-event-record-returns-null-for-non-existent-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.poison-event ---- -# getPoisonEventRecord returns null for non-existent event - -## Intent - -- outcome: Executable scenario: getPoisonEventRecord returns null for non-existent event - -```gwt -Given no poison record exists for event "evt-999" -When getting poison record for event "evt-999" -Then the result should be null -``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-011-unquarantine-event-clears-quarantine-status.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-011-unquarantine-event-clears-quarantine-status.sdp.md deleted file mode 100644 index a18dfa80..00000000 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-011-unquarantine-event-clears-quarantine-status.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.poison-event.unquarantine-event-clears-quarantine-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.poison-event ---- -# unquarantineEvent clears quarantine status - -## Intent - -- outcome: Executable scenario: unquarantineEvent clears quarantine status - -```gwt -Given a quarantined poison record for event "evt-123" -When calling unquarantineEvent -Then the result status should be "unquarantined" -And the record should be updated to status "replayed" with attemptCount 0 -``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-012-unquarantine-event-returns-not-found-for-missing-event.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-012-unquarantine-event-returns-not-found-for-missing-event.sdp.md deleted file mode 100644 index 54321e8e..00000000 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-012-unquarantine-event-returns-not-found-for-missing-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.poison-event.unquarantine-event-returns-not-found-for-missing-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.poison-event ---- -# unquarantineEvent returns not_found for missing event - -## Intent - -- outcome: Executable scenario: unquarantineEvent returns not_found for missing event - -```gwt -Given no poison record exists for event "evt-999" -When calling unquarantineEvent for event "evt-999" -Then the result status should be "not_found" -``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-013-unquarantine-event-returns-not-quarantined-for-pending-event.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-013-unquarantine-event-returns-not-quarantined-for-pending-event.sdp.md deleted file mode 100644 index a110f94a..00000000 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-013-unquarantine-event-returns-not-quarantined-for-pending-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.poison-event.unquarantine-event-returns-not-quarantined-for-pending-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.poison-event ---- -# unquarantineEvent returns not_quarantined for pending event - -## Intent - -- outcome: Executable scenario: unquarantineEvent returns not_quarantined for pending event - -```gwt -Given a pending poison record for event "evt-123" -When calling unquarantineEvent -Then the result status should be "not_quarantined" -``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-014-list-quarantined-events-returns-quarantined-records.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-014-list-quarantined-events-returns-quarantined-records.sdp.md deleted file mode 100644 index bedb76be..00000000 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-014-list-quarantined-events-returns-quarantined-records.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.poison-event.list-quarantined-events-returns-quarantined-records -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.poison-event ---- -# listQuarantinedEvents returns quarantined records - -## Intent - -- outcome: Executable scenario: listQuarantinedEvents returns quarantined records - -```gwt -Given 3 quarantined poison records -When listing quarantined events -Then the result should contain 3 records with eventId, projectionName, and attempts -``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-015-list-quarantined-events-filters-by-projection.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-015-list-quarantined-events-filters-by-projection.sdp.md deleted file mode 100644 index 8b6215c3..00000000 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-015-list-quarantined-events-filters-by-projection.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.poison-event.list-quarantined-events-filters-by-projection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.poison-event ---- -# listQuarantinedEvents filters by projection - -## Intent - -- outcome: Executable scenario: listQuarantinedEvents filters by projection - -```gwt -Given quarantined records for multiple projections -When listing quarantined events with projectionName "orderSummary" -Then the query should filter by projection name -``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-016-get-poison-event-stats-returns-aggregated-statistics.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-016-get-poison-event-stats-returns-aggregated-statistics.sdp.md deleted file mode 100644 index 744aba40..00000000 --- a/specs/behavior/platform-core/event-store-durability/poison-event.examples/s-016-get-poison-event-stats-returns-aggregated-statistics.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.event-store-durability.poison-event.get-poison-event-stats-returns-aggregated-statistics -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.event-store-durability.poison-event ---- -# getPoisonEventStats returns aggregated statistics - -## Intent - -- outcome: Executable scenario: getPoisonEventStats returns aggregated statistics - -```gwt -Given poison stats with totalQuarantined 10 and byProjection orderSummary:7, inventory:3 -When getting poison event stats -Then the result totalQuarantined should be 10 -And byProjection should contain orderSummary:7 and inventory:3 -``` diff --git a/specs/behavior/platform-core/event-store-durability/poison-event.sdp.md b/specs/behavior/platform-core/event-store-durability/poison-event.sdp.md index 896418c6..277f80f8 100644 --- a/specs/behavior/platform-core/event-store-durability/poison-event.sdp.md +++ b/specs/behavior/platform-core/event-store-durability/poison-event.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Poison Event Handling +- outcome: Quarantine events that repeatedly fail projection processing after N failures so infinite retry loops cannot stall a projection. +- value: Query, unquarantine, and stats helpers expose quarantined records without re-running the failing handler. diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-001-creates-bus-with-empty-subscriptions.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-001-creates-bus-with-empty-subscriptions.sdp.md deleted file mode 100644 index 37517a51..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-001-creates-bus-with-empty-subscriptions.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.creates-bus-with-empty-subscriptions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Creates bus with empty subscriptions - -## Intent - -- outcome: Executable scenario: Creates bus with empty subscriptions - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with no subscriptions -When the scenario runs -Then getAllSubscriptions returns 0 subscriptions -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-002-creates-bus-with-subscriptions-sorted-by-priority.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-002-creates-bus-with-subscriptions-sorted-by-priority.sdp.md deleted file mode 100644 index ada7dd4f..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-002-creates-bus-with-subscriptions-sorted-by-priority.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.creates-bus-with-subscriptions-sorted-by-priority -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Creates bus with subscriptions sorted by priority - -## Intent - -- outcome: Executable scenario: Creates bus with subscriptions sorted by priority - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with subscriptions at priorities: -When the scenario runs -Then getAllSubscriptions returns 3 subscriptions in order: -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-003-returns-empty-result-when-no-subscriptions-match.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-003-returns-empty-result-when-no-subscriptions-match.sdp.md deleted file mode 100644 index cd6864ac..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-003-returns-empty-result-when-no-subscriptions-match.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.returns-empty-result-when-no-subscriptions-match -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Returns empty result when no subscriptions match - -## Intent - -- outcome: Executable scenario: Returns empty result when no subscriptions match - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with a subscription "order.handler" for event type "OrderCancelled" -When an "OrderSubmitted" event is published -Then the publish result has 0 matched subscriptions -And the triggered subscriptions list is empty -And the publish result is successful -And the workpool received 0 enqueue calls -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-004-enqueues-matching-subscriptions-via-workpool.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-004-enqueues-matching-subscriptions-via-workpool.sdp.md deleted file mode 100644 index 976d141a..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-004-enqueues-matching-subscriptions-via-workpool.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.enqueues-matching-subscriptions-via-workpool -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Enqueues matching subscriptions via workpool - -## Intent - -- outcome: Executable scenario: Enqueues matching subscriptions via workpool - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with a subscription "order.handler" for event type "OrderSubmitted" -When an "OrderSubmitted" event is published -Then the publish result has 1 matched subscription -And the triggered subscriptions include "order.handler" -And the publish result is successful -And the workpool received 1 enqueue call -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-005-enqueues-multiple-matching-subscriptions.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-005-enqueues-multiple-matching-subscriptions.sdp.md deleted file mode 100644 index ec5610d4..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-005-enqueues-multiple-matching-subscriptions.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.enqueues-multiple-matching-subscriptions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Enqueues multiple matching subscriptions - -## Intent - -- outcome: Executable scenario: Enqueues multiple matching subscriptions - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with subscriptions for event type "OrderSubmitted": -When an "OrderSubmitted" event is published -Then the publish result has 2 matched subscriptions -And the triggered subscriptions are in order: -And the workpool received 2 enqueue calls -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-006-passes-transformed-args-to-workpool.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-006-passes-transformed-args-to-workpool.sdp.md deleted file mode 100644 index da76e2d7..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-006-passes-transformed-args-to-workpool.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.passes-transformed-args-to-workpool -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Passes transformed args to workpool - -## Intent - -- outcome: Executable scenario: Passes transformed args to workpool - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with a subscription "order.handler" for "OrderSubmitted" with a custom transform -When an "OrderSubmitted" event is published -Then the workpool received args with orderId "order_456" and eventType "OrderSubmitted" -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-007-includes-partition-key-in-workpool-context.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-007-includes-partition-key-in-workpool-context.sdp.md deleted file mode 100644 index f107df98..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-007-includes-partition-key-in-workpool-context.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.includes-partition-key-in-workpool-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Includes partition key in workpool context - -## Intent - -- outcome: Executable scenario: Includes partition key in workpool context - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with a subscription "order.handler" for "OrderSubmitted" with a custom partition key -When an "OrderSubmitted" event is published -Then the workpool context has partition name "orderId" and value "order_456" -And the workpool context has globalPosition 1000 -And the workpool context has subscriptionName "order.handler" -And the workpool context has eventId "evt_test_123" -And the workpool context has eventType "OrderSubmitted" -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-008-uses-subscription-level-on-complete-when-provided.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-008-uses-subscription-level-on-complete-when-provided.sdp.md deleted file mode 100644 index 37e01b01..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-008-uses-subscription-level-on-complete-when-provided.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.uses-subscription-level-on-complete-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Uses subscription-level onComplete when provided - -## Intent - -- outcome: Executable scenario: Uses subscription-level onComplete when provided - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with a subscription "order.handler" for "OrderSubmitted" with subscription-level onComplete -When an "OrderSubmitted" event is published -Then the workpool options onComplete is the subscription onComplete handler -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-009-uses-default-on-complete-from-config-when-subscription-has-none.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-009-uses-default-on-complete-from-config-when-subscription-has-none.sdp.md deleted file mode 100644 index 5c2cb9cb..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-009-uses-default-on-complete-from-config-when-subscription-has-none.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.uses-default-on-complete-from-config-when-subscription-has-none -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Uses default onComplete from config when subscription has none - -## Intent - -- outcome: Executable scenario: Uses default onComplete from config when subscription has none - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with a subscription "order.handler" for "OrderSubmitted" and a default onComplete config -When an "OrderSubmitted" event is published -Then the workpool options onComplete is the default onComplete handler -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-010-does-not-include-on-complete-if-neither-subscription-nor-config-provides-i.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-010-does-not-include-on-complete-if-neither-subscription-nor-config-provides-i.sdp.md deleted file mode 100644 index 771e3e15..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-010-does-not-include-on-complete-if-neither-subscription-nor-config-provides-i.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.does-not-include-on-complete-if-neither-subscription-nor-config-provides-it -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Does not include onComplete if neither subscription nor config provides it - -## Intent - -- outcome: Executable scenario: Does not include onComplete if neither subscription nor config provides it - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with a subscription "order.handler" for "OrderSubmitted" without any onComplete -When an "OrderSubmitted" event is published -Then the workpool options onComplete is undefined -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-011-returns-true-for-indexed-event-type-and-false-for-unsubscribed-type.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-011-returns-true-for-indexed-event-type-and-false-for-unsubscribed-type.sdp.md deleted file mode 100644 index 0c8ec3bb..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-011-returns-true-for-indexed-event-type-and-false-for-unsubscribed-type.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.returns-true-for-indexed-event-type-and-false-for-unsubscribed-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Returns true for indexed event type and false for unsubscribed type - -## Intent - -- outcome: Executable scenario: Returns true for indexed event type and false for unsubscribed type - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with a subscription "order.handler" for event type "OrderSubmitted" -When the scenario runs -Then hasSubscribersFor "OrderSubmitted" returns true -And hasSubscribersFor "OrderCancelled" returns false -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-012-returns-true-for-any-event-type-when-wildcard-subscription-exists.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-012-returns-true-for-any-event-type-when-wildcard-subscription-exists.sdp.md deleted file mode 100644 index f7072a89..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-012-returns-true-for-any-event-type-when-wildcard-subscription-exists.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.returns-true-for-any-event-type-when-wildcard-subscription-exists -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Returns true for any event type when wildcard subscription exists - -## Intent - -- outcome: Executable scenario: Returns true for any event type when wildcard subscription exists - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with a wildcard subscription "wildcard.handler" -When the scenario runs -Then hasSubscribersFor "AnyEventType" returns true -And hasSubscribersFor "AnotherType" returns true -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-013-returns-false-when-no-subscriptions-exist.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-013-returns-false-when-no-subscriptions-exist.sdp.md deleted file mode 100644 index a6463047..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-013-returns-false-when-no-subscriptions-exist.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.returns-false-when-no-subscriptions-exist -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Returns false when no subscriptions exist - -## Intent - -- outcome: Executable scenario: Returns false when no subscriptions exist - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with no subscriptions -When the scenario runs -Then hasSubscribersFor "SomeEvent" returns false -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-014-returns-all-subscriptions.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-014-returns-all-subscriptions.sdp.md deleted file mode 100644 index cbe8a114..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-014-returns-all-subscriptions.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.returns-all-subscriptions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Returns all subscriptions - -## Intent - -- outcome: Executable scenario: Returns all subscriptions - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with subscriptions "handler1" and "handler2" -When the scenario runs -Then getAllSubscriptions returns 2 subscriptions -And getAllSubscriptions contains "handler1" and "handler2" -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-015-returns-empty-array-when-no-subscriptions.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-015-returns-empty-array-when-no-subscriptions.sdp.md deleted file mode 100644 index 140e90a6..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-015-returns-empty-array-when-no-subscriptions.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.returns-empty-array-when-no-subscriptions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Returns empty array when no subscriptions - -## Intent - -- outcome: Executable scenario: Returns empty array when no subscriptions - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with no subscriptions -When the scenario runs -Then getAllSubscriptions returns an empty array -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-016-returns-subscriptions-matching-event-type-filter.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-016-returns-subscriptions-matching-event-type-filter.sdp.md deleted file mode 100644 index 60ac2f69..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-016-returns-subscriptions-matching-event-type-filter.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.returns-subscriptions-matching-event-type-filter -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Returns subscriptions matching event type filter - -## Intent - -- outcome: Executable scenario: Returns subscriptions matching event type filter - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with event-type subscriptions: -When getMatchingSubscriptions is called with eventTypes "OrderSubmitted" -Then the matching result has 1 subscription named "order.handler" -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-017-returns-subscriptions-matching-category-filter.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-017-returns-subscriptions-matching-category-filter.sdp.md deleted file mode 100644 index e277c944..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-017-returns-subscriptions-matching-category-filter.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.returns-subscriptions-matching-category-filter -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Returns subscriptions matching category filter - -## Intent - -- outcome: Executable scenario: Returns subscriptions matching category filter - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with category subscriptions: -When getMatchingSubscriptions is called with categories "integration" -Then the matching result has 1 subscription named "integration.handler" -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-018-publishes-to-subscriptions-in-priority-order.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-018-publishes-to-subscriptions-in-priority-order.sdp.md deleted file mode 100644 index 6baacf54..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-018-publishes-to-subscriptions-in-priority-order.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.publishes-to-subscriptions-in-priority-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Publishes to subscriptions in priority order - -## Intent - -- outcome: Executable scenario: Publishes to subscriptions in priority order - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with subscriptions for event type "TestEvent": -When a "TestEvent" event is published -Then the triggered subscriptions are in order: -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-019-propagates-workpool-errors-when-enqueue-fails.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-019-propagates-workpool-errors-when-enqueue-fails.sdp.md deleted file mode 100644 index fde9306c..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-019-propagates-workpool-errors-when-enqueue-fails.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.propagates-workpool-errors-when-enqueue-fails -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Propagates workpool errors when enqueue fails - -## Intent - -- outcome: Executable scenario: Propagates workpool errors when enqueue fails - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with a failing workpool and subscription "order.handler" for "OrderSubmitted" -When an "OrderSubmitted" event is published -Then the publish rejects with error "Workpool unavailable" -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-020-does-not-enqueue-subsequent-subscriptions-if-earlier-enqueue-fails.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-020-does-not-enqueue-subsequent-subscriptions-if-earlier-enqueue-fails.sdp.md deleted file mode 100644 index 3668d76c..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-020-does-not-enqueue-subsequent-subscriptions-if-earlier-enqueue-fails.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.does-not-enqueue-subsequent-subscriptions-if-earlier-enqueue-fails -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Does not enqueue subsequent subscriptions if earlier enqueue fails - -## Intent - -- outcome: Executable scenario: Does not enqueue subsequent subscriptions if earlier enqueue fails - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with a workpool that fails on second enqueue and 3 subscriptions for "OrderSubmitted" -When an "OrderSubmitted" event is published -Then the publish rejects with error "Second enqueue failed" -And the workpool enqueue was called 2 times -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-021-wildcard-subscriptions-match-any-event-type.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-021-wildcard-subscriptions-match-any-event-type.sdp.md deleted file mode 100644 index 47069c6d..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-021-wildcard-subscriptions-match-any-event-type.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.wildcard-subscriptions-match-any-event-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Wildcard subscriptions match any event type - -## Intent - -- outcome: Executable scenario: Wildcard subscriptions match any event type - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with a wildcard subscription "wildcard" -When events of different types are published: -Then every publish result includes "wildcard" in triggered subscriptions -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-022-wildcard-with-bounded-context-filter-only-matches-that-context.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-022-wildcard-with-bounded-context-filter-only-matches-that-context.sdp.md deleted file mode 100644 index 201316d7..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-022-wildcard-with-bounded-context-filter-only-matches-that-context.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.wildcard-with-bounded-context-filter-only-matches-that-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Wildcard with bounded context filter only matches that context - -## Intent - -- outcome: Executable scenario: Wildcard with bounded context filter only matches that context - -```gwt -Given the module is imported from platform-core -And a ConvexEventBus with a subscription "orders.audit" filtered to bounded context "orders" -When events from different bounded contexts are published: -Then each publish result matches the expected subscription count -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-023-creates-event-bus-instance-with-empty-subscriptions.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-023-creates-event-bus-instance-with-empty-subscriptions.sdp.md deleted file mode 100644 index f74849b7..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-023-creates-event-bus-instance-with-empty-subscriptions.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.creates-event-bus-instance-with-empty-subscriptions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Creates EventBus instance with empty subscriptions - -## Intent - -- outcome: Executable scenario: Creates EventBus instance with empty subscriptions - -```gwt -Given the module is imported from platform-core -When createEventBus is called with empty subscriptions -Then the result is a ConvexEventBus instance -And getAllSubscriptions returns 0 subscriptions -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-024-creates-event-bus-with-config.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-024-creates-event-bus-with-config.sdp.md deleted file mode 100644 index b1b66597..00000000 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.examples/s-024-creates-event-bus-with-config.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.convex-event-bus.creates-event-bus-with-config -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.convex-event-bus ---- -# Creates EventBus with config - -## Intent - -- outcome: Executable scenario: Creates EventBus with config - -```gwt -Given the module is imported from platform-core -When createEventBus is called with a subscription and default onComplete config -Then the result is a ConvexEventBus instance -``` diff --git a/specs/behavior/platform-core/eventbus/convex-event-bus.sdp.md b/specs/behavior/platform-core/eventbus/convex-event-bus.sdp.md index d073f8ad..e216635f 100644 --- a/specs/behavior/platform-core/eventbus/convex-event-bus.sdp.md +++ b/specs/behavior/platform-core/eventbus/convex-event-bus.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.eventbus.convex-event-bus kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: a ConvexEventBus that routes published events to matching subscription handlers via workpool so that event-driven communication is decoupled and reliable +- outcome: Route published events to matching subscription handlers via workpool so event-driven communication stays decoupled and reliable. +- value: Priority-ordered enqueue, wildcard matching, and workpool error propagation keep delivery on one bus. ## Behavior diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-001-builder-creates-subscription-with-name-and-handler.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-001-builder-creates-subscription-with-name-and-handler.sdp.md deleted file mode 100644 index 0c20dd5c..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-001-builder-creates-subscription-with-name-and-handler.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.builder-creates-subscription-with-name-and-handler -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# Builder creates subscription with name and handler - -## Intent - -- outcome: Executable scenario: Builder creates subscription with name and handler - -```gwt -Given a SubscriptionBuilder with name "test.handler" and a mock handler -When the subscription is built -Then the subscription has name "test.handler" and the mock handler -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-002-builder-defaults-to-empty-filter.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-002-builder-defaults-to-empty-filter.sdp.md deleted file mode 100644 index f9020978..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-002-builder-defaults-to-empty-filter.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.builder-defaults-to-empty-filter -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# Builder defaults to empty filter - -## Intent - -- outcome: Executable scenario: Builder defaults to empty filter - -```gwt -Given a SubscriptionBuilder with name "test.handler" and a mock handler -When the subscription is built -Then the subscription filter is empty -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-003-builder-defaults-to-priority-100.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-003-builder-defaults-to-priority-100.sdp.md deleted file mode 100644 index 7776358b..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-003-builder-defaults-to-priority-100.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.builder-defaults-to-priority-100 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# Builder defaults to priority 100 - -## Intent - -- outcome: Executable scenario: Builder defaults to priority 100 - -```gwt -Given a SubscriptionBuilder with name "test.handler" and a mock handler -When the subscription is built -Then the subscription priority is 100 -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-004-builder-defaults-partition-key-to-stream-id.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-004-builder-defaults-partition-key-to-stream-id.sdp.md deleted file mode 100644 index 8c0957db..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-004-builder-defaults-partition-key-to-stream-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.builder-defaults-partition-key-to-stream-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# Builder defaults partition key to streamId - -## Intent - -- outcome: Executable scenario: Builder defaults partition key to streamId - -```gwt -Given a SubscriptionBuilder with name "test.handler" and a mock handler -When the subscription is built -Then the partition key for a test event uses streamId with value "order_456" -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-005-for-event-types-sets-event-type-filter.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-005-for-event-types-sets-event-type-filter.sdp.md deleted file mode 100644 index 6fd567ad..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-005-for-event-types-sets-event-type-filter.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.for-event-types-sets-event-type-filter -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# forEventTypes sets event type filter - -## Intent - -- outcome: Executable scenario: forEventTypes sets event type filter - -```gwt -Given a SubscriptionBuilder with name "test.handler" and a mock handler -When forEventTypes is called with "OrderSubmitted" and "OrderCancelled" and the subscription is built -Then the subscription filter eventTypes are: -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-006-for-categories-sets-category-filter.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-006-for-categories-sets-category-filter.sdp.md deleted file mode 100644 index cbabcd62..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-006-for-categories-sets-category-filter.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.for-categories-sets-category-filter -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# forCategories sets category filter - -## Intent - -- outcome: Executable scenario: forCategories sets category filter - -```gwt -Given a SubscriptionBuilder with name "test.handler" and a mock handler -When forCategories is called with "domain" and "integration" and the subscription is built -Then the subscription filter categories are: -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-007-for-bounded-contexts-sets-bounded-context-filter.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-007-for-bounded-contexts-sets-bounded-context-filter.sdp.md deleted file mode 100644 index 285a361c..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-007-for-bounded-contexts-sets-bounded-context-filter.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.for-bounded-contexts-sets-bounded-context-filter -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# forBoundedContexts sets bounded context filter - -## Intent - -- outcome: Executable scenario: forBoundedContexts sets bounded context filter - -```gwt -Given a SubscriptionBuilder with name "test.handler" and a mock handler -When forBoundedContexts is called with "orders" and "inventory" and the subscription is built -Then the subscription filter boundedContexts are: -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-008-for-stream-types-sets-stream-type-filter.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-008-for-stream-types-sets-stream-type-filter.sdp.md deleted file mode 100644 index e2ea623a..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-008-for-stream-types-sets-stream-type-filter.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.for-stream-types-sets-stream-type-filter -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# forStreamTypes sets stream type filter - -## Intent - -- outcome: Executable scenario: forStreamTypes sets stream type filter - -```gwt -Given a SubscriptionBuilder with name "test.handler" and a mock handler -When forStreamTypes is called with "Order" and "Product" and the subscription is built -Then the subscription filter streamTypes are: -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-009-chaining-multiple-filters-composes-them.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-009-chaining-multiple-filters-composes-them.sdp.md deleted file mode 100644 index 64c9980f..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-009-chaining-multiple-filters-composes-them.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.chaining-multiple-filters-composes-them -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# Chaining multiple filters composes them - -## Intent - -- outcome: Executable scenario: Chaining multiple filters composes them - -```gwt -Given a SubscriptionBuilder with name "test.handler" and a mock handler -When forEventTypes is called with "OrderSubmitted" and forCategories is called with "domain" and forBoundedContexts is called with "orders" and the subscription is built -Then the subscription filter has all three filter types set -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-010-with-on-complete-sets-the-on-complete-handler.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-010-with-on-complete-sets-the-on-complete-handler.sdp.md deleted file mode 100644 index e7d976e4..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-010-with-on-complete-sets-the-on-complete-handler.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.with-on-complete-sets-the-on-complete-handler -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# withOnComplete sets the onComplete handler - -## Intent - -- outcome: Executable scenario: withOnComplete sets the onComplete handler - -```gwt -Given a SubscriptionBuilder with name "test.handler" and a mock handler -When withOnComplete is called with the mock onComplete handler and the subscription is built -Then the subscription onComplete is the mock onComplete handler -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-011-with-priority-sets-priority.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-011-with-priority-sets-priority.sdp.md deleted file mode 100644 index a0e0338f..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-011-with-priority-sets-priority.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.with-priority-sets-priority -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# withPriority sets priority - -## Intent - -- outcome: Executable scenario: withPriority sets priority - -```gwt -Given a SubscriptionBuilder with name "test.handler" and a mock handler -When withPriority is called with 50 and the subscription is built -Then the subscription priority is 50 -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-012-with-transform-sets-custom-transformer.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-012-with-transform-sets-custom-transformer.sdp.md deleted file mode 100644 index 9c8bf40c..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-012-with-transform-sets-custom-transformer.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.with-transform-sets-custom-transformer -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# withTransform sets custom transformer - -## Intent - -- outcome: Executable scenario: withTransform sets custom transformer - -```gwt -Given a SubscriptionBuilder with name "test.handler" and a mock handler -When withTransform is called with a custom transformer and the subscription is built -Then toHandlerArgs returns the transformed output -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-013-with-partition-key-sets-custom-partition-key-extractor.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-013-with-partition-key-sets-custom-partition-key-extractor.sdp.md deleted file mode 100644 index a9d6de23..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-013-with-partition-key-sets-custom-partition-key-extractor.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.with-partition-key-sets-custom-partition-key-extractor -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# withPartitionKey sets custom partition key extractor - -## Intent - -- outcome: Executable scenario: withPartitionKey sets custom partition key extractor - -```gwt -Given a SubscriptionBuilder with name "test.handler" and a mock handler -When withPartitionKey is called with a customerId extractor and the subscription is built -Then the partition key for an event with customerId "cust_123" returns name "customerId" and value "cust_123" -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-014-add-adds-a-subscription-to-the-registry.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-014-add-adds-a-subscription-to-the-registry.sdp.md deleted file mode 100644 index 46da5334..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-014-add-adds-a-subscription-to-the-registry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.add-adds-a-subscription-to-the-registry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# add() adds a subscription to the registry - -## Intent - -- outcome: Executable scenario: add() adds a subscription to the registry - -```gwt -Given an empty SubscriptionRegistry -When a subscription "test.handler" is added -Then the registry has 1 subscription with name "test.handler" -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-015-add-supports-chaining.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-015-add-supports-chaining.sdp.md deleted file mode 100644 index 3e53fa2d..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-015-add-supports-chaining.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.add-supports-chaining -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# add() supports chaining - -## Intent - -- outcome: Executable scenario: add() supports chaining - -```gwt -Given an empty SubscriptionRegistry -When subscriptions "handler1" and "handler2" are added via chaining -Then the registry has 2 subscriptions -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-016-add-throws-on-duplicate-subscription-name.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-016-add-throws-on-duplicate-subscription-name.sdp.md deleted file mode 100644 index b033e8c4..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-016-add-throws-on-duplicate-subscription-name.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.add-throws-on-duplicate-subscription-name -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# add() throws on duplicate subscription name - -## Intent - -- outcome: Executable scenario: add() throws on duplicate subscription name - -```gwt -Given an empty SubscriptionRegistry -When a subscription "duplicate.name" is added -Then adding another subscription "duplicate.name" throws a duplicate error -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-017-subscribe-returns-builder-that-adds-to-registry-on-build.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-017-subscribe-returns-builder-that-adds-to-registry-on-build.sdp.md deleted file mode 100644 index 28892077..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-017-subscribe-returns-builder-that-adds-to-registry-on-build.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.subscribe-returns-builder-that-adds-to-registry-on-build -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# subscribe() returns builder that adds to registry on build - -## Intent - -- outcome: Executable scenario: subscribe() returns builder that adds to registry on build - -```gwt -Given an empty SubscriptionRegistry -When subscribe is called with "test.handler" and built with forEventTypes "OrderSubmitted" -Then the registry has 1 subscription with name "test.handler" -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-018-define-subscriptions-returns-configured-subscriptions.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-018-define-subscriptions-returns-configured-subscriptions.sdp.md deleted file mode 100644 index 6429d662..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-018-define-subscriptions-returns-configured-subscriptions.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.define-subscriptions-returns-configured-subscriptions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# defineSubscriptions returns configured subscriptions - -## Intent - -- outcome: Executable scenario: defineSubscriptions returns configured subscriptions - -```gwt -Given the feature fixture is in place -When defineSubscriptions is called with two subscriptions "handler1" and "handler2" -Then the result has 2 subscriptions named "handler1" and "handler2" -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-019-define-subscriptions-throws-on-duplicate-names-via-subscribe-build.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-019-define-subscriptions-throws-on-duplicate-names-via-subscribe-build.sdp.md deleted file mode 100644 index 9f66b4f5..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-019-define-subscriptions-throws-on-duplicate-names-via-subscribe-build.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.define-subscriptions-throws-on-duplicate-names-via-subscribe-build -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# defineSubscriptions throws on duplicate names via subscribe().build() - -## Intent - -- outcome: Executable scenario: defineSubscriptions throws on duplicate names via subscribe().build() - -```gwt -Given the feature fixture is in place -When the scenario runs -Then calling defineSubscriptions with duplicate "duplicate.handler" via subscribe throws -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-020-define-subscriptions-throws-on-duplicate-names-via-add.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-020-define-subscriptions-throws-on-duplicate-names-via-add.sdp.md deleted file mode 100644 index 2c6a357c..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-020-define-subscriptions-throws-on-duplicate-names-via-add.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.define-subscriptions-throws-on-duplicate-names-via-add -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# defineSubscriptions throws on duplicate names via add() - -## Intent - -- outcome: Executable scenario: defineSubscriptions throws on duplicate names via add() - -```gwt -Given the feature fixture is in place -When the scenario runs -Then calling defineSubscriptions with duplicate "duplicate.name" via add throws -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-021-create-subscription-creates-standalone-builder.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-021-create-subscription-creates-standalone-builder.sdp.md deleted file mode 100644 index ffbd2a23..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-021-create-subscription-creates-standalone-builder.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.create-subscription-creates-standalone-builder -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# createSubscription creates standalone builder - -## Intent - -- outcome: Executable scenario: createSubscription creates standalone builder - -```gwt -Given the feature fixture is in place -When createSubscription is called with "standalone" and forEventTypes "TestEvent" -Then the built subscription has name "standalone" and eventTypes filter "TestEvent" -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-022-empty-filter-matches-any-event.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-022-empty-filter-matches-any-event.sdp.md deleted file mode 100644 index b6a416e6..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-022-empty-filter-matches-any-event.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.empty-filter-matches-any-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# Empty filter matches any event - -## Intent - -- outcome: Executable scenario: Empty filter matches any event - -```gwt -Given a subscription "wildcard" with an empty filter -When the scenario runs -Then matchesEvent returns true for event type "OrderSubmitted" -And matchesEvent returns true for event type "DifferentEvent" -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-023-matches-when-event-type-is-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-023-matches-when-event-type-is-in-the-list.sdp.md deleted file mode 100644 index 45ab0a6d..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-023-matches-when-event-type-is-in-the-list.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.matches-when-event-type-is-in-the-list -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# Matches when event type is in the list - -## Intent - -- outcome: Executable scenario: Matches when event type is in the list - -```gwt -Given a subscription "test" with eventTypes filter "OrderSubmitted" and "OrderCancelled" -When the scenario runs -Then matchesEvent returns true for event type "OrderSubmitted" -And matchesEvent returns true for event type "OrderCancelled" -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-024-does-not-match-when-event-type-is-not-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-024-does-not-match-when-event-type-is-not-in-the-list.sdp.md deleted file mode 100644 index a5591d8b..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-024-does-not-match-when-event-type-is-not-in-the-list.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.does-not-match-when-event-type-is-not-in-the-list -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# Does not match when event type is not in the list - -## Intent - -- outcome: Executable scenario: Does not match when event type is not in the list - -```gwt -Given a subscription "test" with eventTypes filter "OrderSubmitted" -When the scenario runs -Then matchesEvent returns false for event type "DifferentEvent" -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-025-matches-when-category-is-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-025-matches-when-category-is-in-the-list.sdp.md deleted file mode 100644 index 536380bb..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-025-matches-when-category-is-in-the-list.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.matches-when-category-is-in-the-list -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# Matches when category is in the list - -## Intent - -- outcome: Executable scenario: Matches when category is in the list - -```gwt -Given a subscription "test" with categories filter "domain" and "integration" -When the scenario runs -Then matchesEvent returns true for category "domain" -And matchesEvent returns true for category "integration" -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-026-does-not-match-when-category-is-not-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-026-does-not-match-when-category-is-not-in-the-list.sdp.md deleted file mode 100644 index a16c7a86..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-026-does-not-match-when-category-is-not-in-the-list.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.does-not-match-when-category-is-not-in-the-list -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# Does not match when category is not in the list - -## Intent - -- outcome: Executable scenario: Does not match when category is not in the list - -```gwt -Given a subscription "test" with categories filter "domain" -When the scenario runs -Then matchesEvent returns false for category "trigger" -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-027-matches-when-bounded-context-is-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-027-matches-when-bounded-context-is-in-the-list.sdp.md deleted file mode 100644 index 161ab789..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-027-matches-when-bounded-context-is-in-the-list.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.matches-when-bounded-context-is-in-the-list -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# Matches when bounded context is in the list - -## Intent - -- outcome: Executable scenario: Matches when bounded context is in the list - -```gwt -Given a subscription "test" with boundedContexts filter "orders" and "inventory" -When the scenario runs -Then matchesEvent returns true for boundedContext "orders" -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-028-does-not-match-when-bounded-context-is-not-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-028-does-not-match-when-bounded-context-is-not-in-the-list.sdp.md deleted file mode 100644 index 675aee0a..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-028-does-not-match-when-bounded-context-is-not-in-the-list.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.does-not-match-when-bounded-context-is-not-in-the-list -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# Does not match when bounded context is not in the list - -## Intent - -- outcome: Executable scenario: Does not match when bounded context is not in the list - -```gwt -Given a subscription "test" with boundedContexts filter "payments" -When the scenario runs -Then matchesEvent returns false for boundedContext "orders" -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-029-matches-when-stream-type-is-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-029-matches-when-stream-type-is-in-the-list.sdp.md deleted file mode 100644 index 2521d36c..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-029-matches-when-stream-type-is-in-the-list.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.matches-when-stream-type-is-in-the-list -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# Matches when stream type is in the list - -## Intent - -- outcome: Executable scenario: Matches when stream type is in the list - -```gwt -Given a subscription "test" with streamTypes filter "Order" and "Product" -When the scenario runs -Then matchesEvent returns true for streamType "Order" -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-030-does-not-match-when-stream-type-is-not-in-the-list.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-030-does-not-match-when-stream-type-is-not-in-the-list.sdp.md deleted file mode 100644 index e030ee46..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-030-does-not-match-when-stream-type-is-not-in-the-list.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.does-not-match-when-stream-type-is-not-in-the-list -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# Does not match when stream type is not in the list - -## Intent - -- outcome: Executable scenario: Does not match when stream type is not in the list - -```gwt -Given a subscription "test" with streamTypes filter "Customer" -When the scenario runs -Then matchesEvent returns false for streamType "Order" -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-031-all-filters-matching-returns-true.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-031-all-filters-matching-returns-true.sdp.md deleted file mode 100644 index b5169802..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-031-all-filters-matching-returns-true.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.all-filters-matching-returns-true -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# All filters matching returns true - -## Intent - -- outcome: Executable scenario: All filters matching returns true - -```gwt -Given a subscription "test" with combined filters eventTypes "OrderSubmitted", categories "domain", and boundedContexts "orders" -When the scenario runs -Then matchesEvent returns true for an event matching all filters -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-032-non-matching-event-type-returns-false-with-combined-filters.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-032-non-matching-event-type-returns-false-with-combined-filters.sdp.md deleted file mode 100644 index a4ff6924..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-032-non-matching-event-type-returns-false-with-combined-filters.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.non-matching-event-type-returns-false-with-combined-filters -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# Non-matching event type returns false with combined filters - -## Intent - -- outcome: Executable scenario: Non-matching event type returns false with combined filters - -```gwt -Given a subscription "test" with combined filters eventTypes "OrderSubmitted", categories "domain", and boundedContexts "orders" -When the scenario runs -Then matchesEvent returns false for an event with wrong eventType "OrderCancelled" -``` diff --git a/specs/behavior/platform-core/eventbus/registry.examples/s-033-non-matching-category-returns-false-with-combined-filters.sdp.md b/specs/behavior/platform-core/eventbus/registry.examples/s-033-non-matching-category-returns-false-with-combined-filters.sdp.md deleted file mode 100644 index dd2f7dba..00000000 --- a/specs/behavior/platform-core/eventbus/registry.examples/s-033-non-matching-category-returns-false-with-combined-filters.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.eventbus.registry.non-matching-category-returns-false-with-combined-filters -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.eventbus.registry ---- -# Non-matching category returns false with combined filters - -## Intent - -- outcome: Executable scenario: Non-matching category returns false with combined filters - -```gwt -Given a subscription "test" with combined filters eventTypes "OrderSubmitted", categories "domain", and boundedContexts "orders" -When the scenario runs -Then matchesEvent returns false for an event with wrong category "trigger" -``` diff --git a/specs/behavior/platform-core/eventbus/registry.sdp.md b/specs/behavior/platform-core/eventbus/registry.sdp.md index 274e08c5..77b50ccb 100644 --- a/specs/behavior/platform-core/eventbus/registry.sdp.md +++ b/specs/behavior/platform-core/eventbus/registry.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.eventbus.registry kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: a subscription registry with builder API and event matching so that event handlers are configured declaratively and matched correctly +- outcome: Configure event handlers through a subscription registry with a builder API so handlers match events declaratively. +- value: Combined filters use AND between filter types and OR within each list, and duplicate names are rejected. ## Behavior diff --git a/specs/behavior/platform-core/events/builder.examples/s-001-generates-event-id-with-bounded-context-prefix.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-001-generates-event-id-with-bounded-context-prefix.sdp.md deleted file mode 100644 index f9b29bf5..00000000 --- a/specs/behavior/platform-core/events/builder.examples/s-001-generates-event-id-with-bounded-context-prefix.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.builder.generates-event-id-with-bounded-context-prefix -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.builder ---- -# Generates eventId with bounded context prefix - -## Intent - -- outcome: Executable scenario: Generates eventId with bounded context prefix - -```gwt -Given a createEventData input with bounded context "orders" -When createEventData is called -Then the result eventId is "orders_event_mock-uuid-v7" -``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-002-copies-all-core-fields-correctly.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-002-copies-all-core-fields-correctly.sdp.md deleted file mode 100644 index 7da56a25..00000000 --- a/specs/behavior/platform-core/events/builder.examples/s-002-copies-all-core-fields-correctly.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.builder.copies-all-core-fields-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.builder ---- -# Copies all core fields correctly - -## Intent - -- outcome: Executable scenario: Copies all core fields correctly - -```gwt -Given a createEventData input with: -When createEventData is called -Then the result has fields: -``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-003-copies-payload-correctly.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-003-copies-payload-correctly.sdp.md deleted file mode 100644 index 50859359..00000000 --- a/specs/behavior/platform-core/events/builder.examples/s-003-copies-payload-correctly.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.builder.copies-payload-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.builder ---- -# Copies payload correctly - -## Intent - -- outcome: Executable scenario: Copies payload correctly - -```gwt -Given a createEventData input with a complex payload -When createEventData is called -Then the result payload matches the input payload -``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-004-includes-correlation-id-and-causation-id-in-metadata.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-004-includes-correlation-id-and-causation-id-in-metadata.sdp.md deleted file mode 100644 index 933a1c88..00000000 --- a/specs/behavior/platform-core/events/builder.examples/s-004-includes-correlation-id-and-causation-id-in-metadata.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.builder.includes-correlation-id-and-causation-id-in-metadata -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.builder ---- -# Includes correlationId and causationId in metadata - -## Intent - -- outcome: Executable scenario: Includes correlationId and causationId in metadata - -```gwt -Given a createEventData input with correlationId "corr_unique_123" and causationId "cmd_unique_456" -When createEventData is called -Then the result metadata has: -``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-005-generates-different-event-ids-for-different-bounded-contexts.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-005-generates-different-event-ids-for-different-bounded-contexts.sdp.md deleted file mode 100644 index be28618f..00000000 --- a/specs/behavior/platform-core/events/builder.examples/s-005-generates-different-event-ids-for-different-bounded-contexts.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.builder.generates-different-event-ids-for-different-bounded-contexts -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.builder ---- -# Generates different eventIds for different bounded contexts - -## Intent - -- outcome: Executable scenario: Generates different eventIds for different bounded contexts - -```gwt -Given the feature fixture is in place -When createEventData is called with bounded context "orders" and createEventData is called with bounded context "inventory" -Then generateEventId was called with "orders" and "inventory" -``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-006-returns-complete-new-event-data-structure.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-006-returns-complete-new-event-data-structure.sdp.md deleted file mode 100644 index 41281796..00000000 --- a/specs/behavior/platform-core/events/builder.examples/s-006-returns-complete-new-event-data-structure.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.events.builder.returns-complete-new-event-data-structure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.builder ---- -# Returns complete NewEventData structure - -## Intent - -- outcome: Executable scenario: Returns complete NewEventData structure - -```gwt -Given a createEventData input with bounded context "orders" -When createEventData is called -Then the result has all required properties: -And the result metadata has all required properties: -``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-007-uses-provided-event-id-without-generating-a-new-one.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-007-uses-provided-event-id-without-generating-a-new-one.sdp.md deleted file mode 100644 index 1337139e..00000000 --- a/specs/behavior/platform-core/events/builder.examples/s-007-uses-provided-event-id-without-generating-a-new-one.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.builder.uses-provided-event-id-without-generating-a-new-one -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.builder ---- -# Uses provided eventId without generating a new one - -## Intent - -- outcome: Executable scenario: Uses provided eventId without generating a new one - -```gwt -Given a pre-generated eventId "orders_event_pre-generated-uuid" -When createEventDataWithId is called -Then the result eventId is "orders_event_pre-generated-uuid" -``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-008-extracts-bounded-context-from-event-id-when-not-provided.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-008-extracts-bounded-context-from-event-id-when-not-provided.sdp.md deleted file mode 100644 index bdd33e41..00000000 --- a/specs/behavior/platform-core/events/builder.examples/s-008-extracts-bounded-context-from-event-id-when-not-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.builder.extracts-bounded-context-from-event-id-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.builder ---- -# Extracts boundedContext from eventId when not provided - -## Intent - -- outcome: Executable scenario: Extracts boundedContext from eventId when not provided - -```gwt -Given a pre-generated eventId "inventory_event_some-uuid" without explicit boundedContext -When createEventDataWithId is called -Then the result boundedContext is "inventory" -``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-009-uses-provided-bounded-context-when-explicitly-set.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-009-uses-provided-bounded-context-when-explicitly-set.sdp.md deleted file mode 100644 index 9640868f..00000000 --- a/specs/behavior/platform-core/events/builder.examples/s-009-uses-provided-bounded-context-when-explicitly-set.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.builder.uses-provided-bounded-context-when-explicitly-set -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.builder ---- -# Uses provided boundedContext when explicitly set - -## Intent - -- outcome: Executable scenario: Uses provided boundedContext when explicitly set - -```gwt -Given a pre-generated eventId "orders_event_some-uuid" with explicit boundedContext "custom-context" -When createEventDataWithId is called -Then the result boundedContext is "custom-context" -``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-010-uses-full-event-id-as-bounded-context-when-no-underscore-present.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-010-uses-full-event-id-as-bounded-context-when-no-underscore-present.sdp.md deleted file mode 100644 index 1681e3de..00000000 --- a/specs/behavior/platform-core/events/builder.examples/s-010-uses-full-event-id-as-bounded-context-when-no-underscore-present.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.builder.uses-full-event-id-as-bounded-context-when-no-underscore-present -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.builder ---- -# Uses full eventId as boundedContext when no underscore present - -## Intent - -- outcome: Executable scenario: Uses full eventId as boundedContext when no underscore present - -```gwt -Given a pre-generated eventId "malformed-event-id" without explicit boundedContext -When createEventDataWithId is called -Then the result boundedContext is "malformed-event-id" -``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-011-copies-all-other-fields-correctly-with-pre-generated-event-id.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-011-copies-all-other-fields-correctly-with-pre-generated-event-id.sdp.md deleted file mode 100644 index a8001541..00000000 --- a/specs/behavior/platform-core/events/builder.examples/s-011-copies-all-other-fields-correctly-with-pre-generated-event-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.builder.copies-all-other-fields-correctly-with-pre-generated-event-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.builder ---- -# Copies all other fields correctly with pre-generated eventId - -## Intent - -- outcome: Executable scenario: Copies all other fields correctly with pre-generated eventId - -```gwt -Given a pre-generated eventId "orders_event_custom-uuid" with full input -When createEventDataWithId is called -Then the withId result has fields: -``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-012-handles-event-id-with-multiple-underscores-correctly.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-012-handles-event-id-with-multiple-underscores-correctly.sdp.md deleted file mode 100644 index 4091a1c1..00000000 --- a/specs/behavior/platform-core/events/builder.examples/s-012-handles-event-id-with-multiple-underscores-correctly.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.builder.handles-event-id-with-multiple-underscores-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.builder ---- -# Handles eventId with multiple underscores correctly - -## Intent - -- outcome: Executable scenario: Handles eventId with multiple underscores correctly - -```gwt -Given a pre-generated eventId "my_bounded_context_event_uuid-v7" without explicit boundedContext -When createEventDataWithId is called -Then the result boundedContext is "my" -``` diff --git a/specs/behavior/platform-core/events/builder.examples/s-013-returns-complete-new-event-data-structure-with-pre-generated-event-id.sdp.md b/specs/behavior/platform-core/events/builder.examples/s-013-returns-complete-new-event-data-structure-with-pre-generated-event-id.sdp.md deleted file mode 100644 index ccd3b1b7..00000000 --- a/specs/behavior/platform-core/events/builder.examples/s-013-returns-complete-new-event-data-structure-with-pre-generated-event-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.events.builder.returns-complete-new-event-data-structure-with-pre-generated-event-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.builder ---- -# Returns complete NewEventData structure with pre-generated eventId - -## Intent - -- outcome: Executable scenario: Returns complete NewEventData structure with pre-generated eventId - -```gwt -Given a pre-generated eventId "orders_event_test-uuid" -When createEventDataWithId is called -Then the result has all required properties: -And the result metadata has all required properties: -``` diff --git a/specs/behavior/platform-core/events/builder.sdp.md b/specs/behavior/platform-core/events/builder.sdp.md index b4de7640..811c7199 100644 --- a/specs/behavior/platform-core/events/builder.sdp.md +++ b/specs/behavior/platform-core/events/builder.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.events.builder kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: builder functions to create event data structures so that events are correctly formatted for Event Store persistence +- outcome: Build event data structures so events are correctly formatted for Event Store persistence. +- value: createEventData generates an eventId; createEventDataWithId uses a pre-generated id and infers boundedContext. ## Behavior diff --git a/specs/behavior/platform-core/events/category.examples/s-001-event-categories-has-exactly-four-entries-in-the-correct-order.sdp.md b/specs/behavior/platform-core/events/category.examples/s-001-event-categories-has-exactly-four-entries-in-the-correct-order.sdp.md deleted file mode 100644 index 7ac81ec7..00000000 --- a/specs/behavior/platform-core/events/category.examples/s-001-event-categories-has-exactly-four-entries-in-the-correct-order.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.events.category.event-categories-has-exactly-four-entries-in-the-correct-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.category ---- -# EVENT_CATEGORIES has exactly four entries in the correct order - -## Intent - -- outcome: Executable scenario: EVENT_CATEGORIES has exactly four entries in the correct order - -```gwt -Given the EVENT_CATEGORIES constant -When the scenario runs -Then it has length 4 -And the categories in order are: -``` diff --git a/specs/behavior/platform-core/events/category.examples/s-002-schema-accepts-valid-category-strings.sdp.md b/specs/behavior/platform-core/events/category.examples/s-002-schema-accepts-valid-category-strings.sdp.md deleted file mode 100644 index e4f8acbe..00000000 --- a/specs/behavior/platform-core/events/category.examples/s-002-schema-accepts-valid-category-strings.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.category.schema-accepts-valid-category-strings -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.category ---- -# Schema accepts valid category strings - -## Intent - -- outcome: Executable scenario: Schema accepts valid category strings - -```gwt -Given the feature fixture is in place -When the following values are parsed with EventCategorySchema: -Then each parse returns the input value unchanged -``` diff --git a/specs/behavior/platform-core/events/category.examples/s-003-schema-rejects-invalid-category-values.sdp.md b/specs/behavior/platform-core/events/category.examples/s-003-schema-rejects-invalid-category-values.sdp.md deleted file mode 100644 index 15b3c6ed..00000000 --- a/specs/behavior/platform-core/events/category.examples/s-003-schema-rejects-invalid-category-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.category.schema-rejects-invalid-category-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.category ---- -# Schema rejects invalid category values - -## Intent - -- outcome: Executable scenario: Schema rejects invalid category values - -```gwt -Given the feature fixture is in place -When the following values are parsed with EventCategorySchema: -Then each parse throws a validation error -``` diff --git a/specs/behavior/platform-core/events/category.examples/s-004-default-event-category-is-domain.sdp.md b/specs/behavior/platform-core/events/category.examples/s-004-default-event-category-is-domain.sdp.md deleted file mode 100644 index 851d01e0..00000000 --- a/specs/behavior/platform-core/events/category.examples/s-004-default-event-category-is-domain.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.category.default-event-category-is-domain -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.category ---- -# DEFAULT_EVENT_CATEGORY is domain - -## Intent - -- outcome: Executable scenario: DEFAULT_EVENT_CATEGORY is domain - -```gwt -Given the feature fixture is in place -When the scenario runs -Then DEFAULT_EVENT_CATEGORY equals "domain" -``` diff --git a/specs/behavior/platform-core/events/category.examples/s-005-default-schema-version-is-1.sdp.md b/specs/behavior/platform-core/events/category.examples/s-005-default-schema-version-is-1.sdp.md deleted file mode 100644 index 57072b8a..00000000 --- a/specs/behavior/platform-core/events/category.examples/s-005-default-schema-version-is-1.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.category.default-schema-version-is-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.category ---- -# DEFAULT_SCHEMA_VERSION is 1 - -## Intent - -- outcome: Executable scenario: DEFAULT_SCHEMA_VERSION is 1 - -```gwt -Given the feature fixture is in place -When the scenario runs -Then DEFAULT_SCHEMA_VERSION equals 1 -``` diff --git a/specs/behavior/platform-core/events/category.examples/s-006-type-guard-accepts-all-valid-categories.sdp.md b/specs/behavior/platform-core/events/category.examples/s-006-type-guard-accepts-all-valid-categories.sdp.md deleted file mode 100644 index 1d72422c..00000000 --- a/specs/behavior/platform-core/events/category.examples/s-006-type-guard-accepts-all-valid-categories.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.category.type-guard-accepts-all-valid-categories -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.category ---- -# Type guard accepts all valid categories - -## Intent - -- outcome: Executable scenario: Type guard accepts all valid categories - -```gwt -Given the feature fixture is in place -When isEventCategory is called with the following values: -Then each call returns the expected boolean -``` diff --git a/specs/behavior/platform-core/events/category.examples/s-007-type-guard-rejects-invalid-values.sdp.md b/specs/behavior/platform-core/events/category.examples/s-007-type-guard-rejects-invalid-values.sdp.md deleted file mode 100644 index 6687d9ff..00000000 --- a/specs/behavior/platform-core/events/category.examples/s-007-type-guard-rejects-invalid-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.category.type-guard-rejects-invalid-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.category ---- -# Type guard rejects invalid values - -## Intent - -- outcome: Executable scenario: Type guard rejects invalid values - -```gwt -Given the feature fixture is in place -When isEventCategory is called with the following invalid values: -Then each call returns the expected boolean result -``` diff --git a/specs/behavior/platform-core/events/category.examples/s-008-valid-categories-are-returned-unchanged.sdp.md b/specs/behavior/platform-core/events/category.examples/s-008-valid-categories-are-returned-unchanged.sdp.md deleted file mode 100644 index 7f2bc859..00000000 --- a/specs/behavior/platform-core/events/category.examples/s-008-valid-categories-are-returned-unchanged.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.category.valid-categories-are-returned-unchanged -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.category ---- -# Valid categories are returned unchanged - -## Intent - -- outcome: Executable scenario: Valid categories are returned unchanged - -```gwt -Given the feature fixture is in place -When normalizeCategory is called with valid categories: -Then each call returns the expected result -``` diff --git a/specs/behavior/platform-core/events/category.examples/s-009-invalid-values-normalize-to-domain.sdp.md b/specs/behavior/platform-core/events/category.examples/s-009-invalid-values-normalize-to-domain.sdp.md deleted file mode 100644 index 1492a7d7..00000000 --- a/specs/behavior/platform-core/events/category.examples/s-009-invalid-values-normalize-to-domain.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.category.invalid-values-normalize-to-domain -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.category ---- -# Invalid values normalize to domain - -## Intent - -- outcome: Executable scenario: Invalid values normalize to domain - -```gwt -Given the feature fixture is in place -When normalizeCategory is called with invalid values: -Then each call returns "domain" -``` diff --git a/specs/behavior/platform-core/events/category.examples/s-010-positive-integers-are-returned-unchanged.sdp.md b/specs/behavior/platform-core/events/category.examples/s-010-positive-integers-are-returned-unchanged.sdp.md deleted file mode 100644 index 98cd818f..00000000 --- a/specs/behavior/platform-core/events/category.examples/s-010-positive-integers-are-returned-unchanged.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.category.positive-integers-are-returned-unchanged -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.category ---- -# Positive integers are returned unchanged - -## Intent - -- outcome: Executable scenario: Positive integers are returned unchanged - -```gwt -Given the feature fixture is in place -When normalizeSchemaVersion is called with: -Then each call returns the expected version number -``` diff --git a/specs/behavior/platform-core/events/category.examples/s-011-invalid-values-normalize-to-1.sdp.md b/specs/behavior/platform-core/events/category.examples/s-011-invalid-values-normalize-to-1.sdp.md deleted file mode 100644 index cd5e3e17..00000000 --- a/specs/behavior/platform-core/events/category.examples/s-011-invalid-values-normalize-to-1.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.category.invalid-values-normalize-to-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.category ---- -# Invalid values normalize to 1 - -## Intent - -- outcome: Executable scenario: Invalid values normalize to 1 - -```gwt -Given the feature fixture is in place -When normalizeSchemaVersion is called with invalid values: -Then each call returns 1 -``` diff --git a/specs/behavior/platform-core/events/category.examples/s-012-classification-of-categories-as-external-or-internal.sdp.md b/specs/behavior/platform-core/events/category.examples/s-012-classification-of-categories-as-external-or-internal.sdp.md deleted file mode 100644 index 42ca9add..00000000 --- a/specs/behavior/platform-core/events/category.examples/s-012-classification-of-categories-as-external-or-internal.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.category.classification-of-categories-as-external-or-internal -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.category ---- -# Classification of categories as external or internal - -## Intent - -- outcome: Executable scenario: Classification of categories as external or internal - -```gwt -Given the feature fixture is in place -When isExternalCategory is called with each category: -Then each call returns the expected classification -``` diff --git a/specs/behavior/platform-core/events/category.examples/s-013-classification-of-categories-as-cross-context.sdp.md b/specs/behavior/platform-core/events/category.examples/s-013-classification-of-categories-as-cross-context.sdp.md deleted file mode 100644 index 5668040e..00000000 --- a/specs/behavior/platform-core/events/category.examples/s-013-classification-of-categories-as-cross-context.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.category.classification-of-categories-as-cross-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.category ---- -# Classification of categories as cross-context - -## Intent - -- outcome: Executable scenario: Classification of categories as cross-context - -```gwt -Given the feature fixture is in place -When isCrossContextCategory is called with each category: -Then each call returns the expected cross-context classification -``` diff --git a/specs/behavior/platform-core/events/category.sdp.md b/specs/behavior/platform-core/events/category.sdp.md index 609aef99..97d6a423 100644 --- a/specs/behavior/platform-core/events/category.sdp.md +++ b/specs/behavior/platform-core/events/category.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.events.category kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: event taxonomy utilities with type-safe categories so that events are correctly classified and validated at runtime +- outcome: Classify events with type-safe category utilities so events are validated at runtime as domain, integration, trigger, or fat. +- value: Type guards and normalizers fall back to domain and schema version 1 instead of accepting unknown labels. ## Behavior diff --git a/specs/behavior/platform-core/events/schemas.examples/s-001-valid-event-metadata-is-accepted-and-fields-are-preserved.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-001-valid-event-metadata-is-accepted-and-fields-are-preserved.sdp.md deleted file mode 100644 index cdf22dc7..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-001-valid-event-metadata-is-accepted-and-fields-are-preserved.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.valid-event-metadata-is-accepted-and-fields-are-preserved -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Valid event metadata is accepted and fields are preserved - -## Intent - -- outcome: Executable scenario: Valid event metadata is accepted and fields are preserved - -```gwt -Given valid event metadata -When the metadata is parsed with EventMetadataSchema -Then all metadata fields match the input -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-002-missing-required-fields-are-rejected.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-002-missing-required-fields-are-rejected.sdp.md deleted file mode 100644 index 06c4dbc8..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-002-missing-required-fields-are-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.missing-required-fields-are-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Missing required fields are rejected - -## Intent - -- outcome: Executable scenario: Missing required fields are rejected - -```gwt -Given the feature fixture is in place -When an empty object is parsed with EventMetadataSchema -Then the parse throws a validation error -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-003-partial-metadata-with-only-event-id-is-rejected.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-003-partial-metadata-with-only-event-id-is-rejected.sdp.md deleted file mode 100644 index 03dcddfa..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-003-partial-metadata-with-only-event-id-is-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.partial-metadata-with-only-event-id-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Partial metadata with only eventId is rejected - -## Intent - -- outcome: Executable scenario: Partial metadata with only eventId is rejected - -```gwt -Given the feature fixture is in place -When an object with only eventId is parsed with EventMetadataSchema -Then the parse throws a validation error -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-004-optional-causation-id-is-supported.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-004-optional-causation-id-is-supported.sdp.md deleted file mode 100644 index ae49802b..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-004-optional-causation-id-is-supported.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.optional-causation-id-is-supported -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Optional causationId is supported - -## Intent - -- outcome: Executable scenario: Optional causationId is supported - -```gwt -Given valid event metadata -When the metadata is parsed without causationId and the metadata is parsed with causationId "cause_123" -Then causationId is undefined -And causationId equals "cause_123" -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-005-invalid-version-values-are-rejected.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-005-invalid-version-values-are-rejected.sdp.md deleted file mode 100644 index 578adf38..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-005-invalid-version-values-are-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.invalid-version-values-are-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Invalid version values are rejected - -## Intent - -- outcome: Executable scenario: Invalid version values are rejected - -```gwt -Given valid event metadata -When the metadata is parsed with invalid version values: -Then each parse throws a validation error -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-006-zero-global-position-is-accepted.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-006-zero-global-position-is-accepted.sdp.md deleted file mode 100644 index 8ea60752..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-006-zero-global-position-is-accepted.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.zero-global-position-is-accepted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Zero globalPosition is accepted - -## Intent - -- outcome: Executable scenario: Zero globalPosition is accepted - -```gwt -Given valid event metadata -When the metadata is parsed with globalPosition 0 -Then globalPosition equals 0 -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-007-enhanced-metadata-includes-category-and-schema-version.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-007-enhanced-metadata-includes-category-and-schema-version.sdp.md deleted file mode 100644 index 88b84913..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-007-enhanced-metadata-includes-category-and-schema-version.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.enhanced-metadata-includes-category-and-schema-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Enhanced metadata includes category and schemaVersion - -## Intent - -- outcome: Executable scenario: Enhanced metadata includes category and schemaVersion - -```gwt -Given valid enhanced event metadata -When the enhanced metadata is parsed -Then the parsed category is "domain" -And the parsed schemaVersion is 1 -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-008-category-defaults-to-domain-when-not-provided.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-008-category-defaults-to-domain-when-not-provided.sdp.md deleted file mode 100644 index 32d2d659..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-008-category-defaults-to-domain-when-not-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.category-defaults-to-domain-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Category defaults to domain when not provided - -## Intent - -- outcome: Executable scenario: Category defaults to domain when not provided - -```gwt -Given valid event metadata -When the metadata is parsed with EnhancedEventMetadataSchema -Then the parsed category is "domain" -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-009-schema-version-defaults-to-1-when-not-provided.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-009-schema-version-defaults-to-1-when-not-provided.sdp.md deleted file mode 100644 index e07a2069..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-009-schema-version-defaults-to-1-when-not-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.schema-version-defaults-to-1-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# SchemaVersion defaults to 1 when not provided - -## Intent - -- outcome: Executable scenario: SchemaVersion defaults to 1 when not provided - -```gwt -Given valid event metadata -When the metadata is parsed with EnhancedEventMetadataSchema -Then the parsed schemaVersion is 1 -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-010-all-valid-categories-are-accepted.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-010-all-valid-categories-are-accepted.sdp.md deleted file mode 100644 index a48b7f9b..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-010-all-valid-categories-are-accepted.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.all-valid-categories-are-accepted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# All valid categories are accepted - -## Intent - -- outcome: Executable scenario: All valid categories are accepted - -```gwt -Given valid event metadata -When the metadata is parsed with each category: -Then each parse returns the matching category -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-011-invalid-categories-are-rejected.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-011-invalid-categories-are-rejected.sdp.md deleted file mode 100644 index cfa47435..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-011-invalid-categories-are-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.invalid-categories-are-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Invalid categories are rejected - -## Intent - -- outcome: Executable scenario: Invalid categories are rejected - -```gwt -Given valid event metadata -When the metadata is parsed with category "invalid" -Then the parse throws a validation error -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-012-schema-accepts-events-with-matching-event-type-and-valid-payload.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-012-schema-accepts-events-with-matching-event-type-and-valid-payload.sdp.md deleted file mode 100644 index e96a1e9a..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-012-schema-accepts-events-with-matching-event-type-and-valid-payload.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.schema-accepts-events-with-matching-event-type-and-valid-payload -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Schema accepts events with matching eventType and valid payload - -## Intent - -- outcome: Executable scenario: Schema accepts events with matching eventType and valid payload - -```gwt -Given a createEventSchema for "OrderCreated" with orderId and customerId payload -When an OrderCreated event with valid payload is parsed -Then the parsed eventType is "OrderCreated" -And the parsed payload orderId is "order_123" -And the parsed payload customerId is "customer_456" -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-013-schema-rejects-events-with-wrong-event-type.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-013-schema-rejects-events-with-wrong-event-type.sdp.md deleted file mode 100644 index 1d2cea37..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-013-schema-rejects-events-with-wrong-event-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.schema-rejects-events-with-wrong-event-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Schema rejects events with wrong eventType - -## Intent - -- outcome: Executable scenario: Schema rejects events with wrong eventType - -```gwt -Given a createEventSchema for "OrderCreated" with orderId payload -When an event with eventType "WrongEvent" is parsed with the schema -Then the parse throws a validation error -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-014-schema-validates-payload-constraints.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-014-schema-validates-payload-constraints.sdp.md deleted file mode 100644 index 8282182e..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-014-schema-validates-payload-constraints.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.schema-validates-payload-constraints -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Schema validates payload constraints - -## Intent - -- outcome: Executable scenario: Schema validates payload constraints - -```gwt -Given a createEventSchema for "OrderCreated" with orderId and positive quantity payload -When an event with negative quantity is parsed -Then the parse throws a validation error -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-015-optional-metadata-field-is-supported.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-015-optional-metadata-field-is-supported.sdp.md deleted file mode 100644 index 7c6f1bcf..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-015-optional-metadata-field-is-supported.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.optional-metadata-field-is-supported -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Optional metadata field is supported - -## Intent - -- outcome: Executable scenario: Optional metadata field is supported - -```gwt -Given a createEventSchema for "Test" with id payload -When an event without metadata is parsed and an event with metadata source "api" and requestId "req_123" is parsed -Then the parsed metadata is undefined -And the parsed metadata has source "api" and requestId "req_123" -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-016-domain-event-schema-sets-category-to-domain.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-016-domain-event-schema-sets-category-to-domain.sdp.md deleted file mode 100644 index 3ef75f30..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-016-domain-event-schema-sets-category-to-domain.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.domain-event-schema-sets-category-to-domain -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Domain event schema sets category to domain - -## Intent - -- outcome: Executable scenario: Domain event schema sets category to domain - -```gwt -Given a domain event schema for "OrderSubmitted" with orderId and totalAmount -When a domain event with valid payload is parsed -Then the parsed eventType is "OrderSubmitted" -And the parsed category is "domain" -And the parsed payload orderId is "order_123" -And the parsed payload totalAmount is 99.99 -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-017-category-defaults-to-domain-when-not-in-input.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-017-category-defaults-to-domain-when-not-in-input.sdp.md deleted file mode 100644 index 0224e7ee..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-017-category-defaults-to-domain-when-not-in-input.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.category-defaults-to-domain-when-not-in-input -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Category defaults to domain when not in input - -## Intent - -- outcome: Executable scenario: Category defaults to domain when not in input - -```gwt -Given a domain event schema for "Test" with id payload -When an event without explicit category is parsed via domain schema -Then the parsed category is "domain" -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-018-schema-version-defaults-to-1-when-not-in-config.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-018-schema-version-defaults-to-1-when-not-in-config.sdp.md deleted file mode 100644 index d55eb82f..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-018-schema-version-defaults-to-1-when-not-in-config.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.schema-version-defaults-to-1-when-not-in-config -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# SchemaVersion defaults to 1 when not in config - -## Intent - -- outcome: Executable scenario: SchemaVersion defaults to 1 when not in config - -```gwt -Given a domain event schema for "Test" with id payload -When an event without explicit schemaVersion is parsed via domain schema -Then the parsed schemaVersion is 1 -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-019-custom-schema-version-in-config-is-enforced.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-019-custom-schema-version-in-config-is-enforced.sdp.md deleted file mode 100644 index 6ef6dc16..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-019-custom-schema-version-in-config-is-enforced.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.custom-schema-version-in-config-is-enforced -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Custom schemaVersion in config is enforced - -## Intent - -- outcome: Executable scenario: Custom schemaVersion in config is enforced - -```gwt -Given a domain event schema for "Test" with id and newField payload and schemaVersion 2 -When a domain event with matching v2 payload is parsed -Then the parsed schemaVersion is 2 -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-020-wrong-schema-version-is-rejected.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-020-wrong-schema-version-is-rejected.sdp.md deleted file mode 100644 index 39e01231..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-020-wrong-schema-version-is-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.wrong-schema-version-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Wrong schemaVersion is rejected - -## Intent - -- outcome: Executable scenario: Wrong schemaVersion is rejected - -```gwt -Given a domain event schema for "Test" with id payload and schemaVersion 2 -When an event with schemaVersion 3 is parsed via domain schema -Then the parse throws a validation error -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-021-integration-event-schema-sets-category-to-integration.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-021-integration-event-schema-sets-category-to-integration.sdp.md deleted file mode 100644 index 7039f9a3..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-021-integration-event-schema-sets-category-to-integration.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.integration-event-schema-sets-category-to-integration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Integration event schema sets category to integration - -## Intent - -- outcome: Executable scenario: Integration event schema sets category to integration - -```gwt -Given an integration event schema for "OrderPlacedIntegration" with source "orders" -When an integration event with valid payload is parsed -Then the parsed eventType is "OrderPlacedIntegration" -And the parsed category is "integration" -And the parsed payload totalAmount is 199.99 -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-022-category-defaults-to-integration-when-not-in-input.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-022-category-defaults-to-integration-when-not-in-input.sdp.md deleted file mode 100644 index 1192d85e..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-022-category-defaults-to-integration-when-not-in-input.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.category-defaults-to-integration-when-not-in-input -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Category defaults to integration when not in input - -## Intent - -- outcome: Executable scenario: Category defaults to integration when not in input - -```gwt -Given an integration event schema for "TestIntegration" with source "test" and id payload -When an event without explicit category is parsed via integration schema -Then the parsed category is "integration" -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-023-schema-version-defaults-to-1-for-integration-events.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-023-schema-version-defaults-to-1-for-integration-events.sdp.md deleted file mode 100644 index 98867490..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-023-schema-version-defaults-to-1-for-integration-events.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.schema-version-defaults-to-1-for-integration-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# SchemaVersion defaults to 1 for integration events - -## Intent - -- outcome: Executable scenario: SchemaVersion defaults to 1 for integration events - -```gwt -Given an integration event schema for "TestIntegration" with source "test" and id payload -When an event without explicit schemaVersion is parsed via integration schema -Then the parsed schemaVersion is 1 -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-024-trigger-event-schema-sets-category-to-trigger-with-entity-id-payload.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-024-trigger-event-schema-sets-category-to-trigger-with-entity-id-payload.sdp.md deleted file mode 100644 index b6db3da5..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-024-trigger-event-schema-sets-category-to-trigger-with-entity-id-payload.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.trigger-event-schema-sets-category-to-trigger-with-entity-id-payload -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Trigger event schema sets category to trigger with entity ID payload - -## Intent - -- outcome: Executable scenario: Trigger event schema sets category to trigger with entity ID payload - -```gwt -Given a trigger event schema for "OrderShipmentStarted" with entityIdField "orderId" -When a trigger event with orderId "order_123" is parsed -Then the parsed eventType is "OrderShipmentStarted" -And the parsed category is "trigger" -And the parsed payload orderId is "order_123" -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-025-trigger-event-rejects-missing-entity-id.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-025-trigger-event-rejects-missing-entity-id.sdp.md deleted file mode 100644 index b00e0f16..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-025-trigger-event-rejects-missing-entity-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.trigger-event-rejects-missing-entity-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Trigger event rejects missing entity ID - -## Intent - -- outcome: Executable scenario: Trigger event rejects missing entity ID - -```gwt -Given a trigger event schema for "ItemUpdated" with entityIdField "itemId" -When a trigger event with itemId "item_123" is parsed and a trigger event with empty payload is parsed -Then the parsed payload itemId is "item_123" -And the parse throws a validation error -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-026-category-defaults-to-trigger-when-not-in-input.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-026-category-defaults-to-trigger-when-not-in-input.sdp.md deleted file mode 100644 index 20112e00..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-026-category-defaults-to-trigger-when-not-in-input.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.category-defaults-to-trigger-when-not-in-input -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Category defaults to trigger when not in input - -## Intent - -- outcome: Executable scenario: Category defaults to trigger when not in input - -```gwt -Given a trigger event schema for "Test" with entityIdField "testId" -When a trigger event with testId "123" is parsed without explicit category -Then the parsed category is "trigger" -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-027-custom-schema-version-for-trigger-events.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-027-custom-schema-version-for-trigger-events.sdp.md deleted file mode 100644 index 76587e80..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-027-custom-schema-version-for-trigger-events.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.custom-schema-version-for-trigger-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Custom schemaVersion for trigger events - -## Intent - -- outcome: Executable scenario: Custom schemaVersion for trigger events - -```gwt -Given a trigger event schema for "Test" with entityIdField "testId" and schemaVersion 3 -When a trigger event with testId "123" is parsed with custom schema version -Then the parsed schemaVersion is 3 -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-028-fat-event-schema-sets-category-to-fat-with-full-payload.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-028-fat-event-schema-sets-category-to-fat-with-full-payload.sdp.md deleted file mode 100644 index b7ab4bb9..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-028-fat-event-schema-sets-category-to-fat-with-full-payload.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.fat-event-schema-sets-category-to-fat-with-full-payload -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Fat event schema sets category to fat with full payload - -## Intent - -- outcome: Executable scenario: Fat event schema sets category to fat with full payload - -```gwt -Given a fat event schema for "OrderSnapshot" with full order payload -When a fat event with valid order snapshot is parsed -Then the parsed eventType is "OrderSnapshot" -And the parsed category is "fat" -And the parsed payload orderId is "order_123" -And the parsed payload items has length 1 -And the parsed payload status is "confirmed" -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-029-category-defaults-to-fat-when-not-in-input.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-029-category-defaults-to-fat-when-not-in-input.sdp.md deleted file mode 100644 index afde40a5..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-029-category-defaults-to-fat-when-not-in-input.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.category-defaults-to-fat-when-not-in-input -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Category defaults to fat when not in input - -## Intent - -- outcome: Executable scenario: Category defaults to fat when not in input - -```gwt -Given a fat event schema for "TestSnapshot" with record payload -When an event without explicit category is parsed via fat schema -Then the parsed category is "fat" -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-030-complex-nested-payload-with-valid-positive-value.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-030-complex-nested-payload-with-valid-positive-value.sdp.md deleted file mode 100644 index ce113fef..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-030-complex-nested-payload-with-valid-positive-value.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.complex-nested-payload-with-valid-positive-value -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Complex nested payload with valid positive value - -## Intent - -- outcome: Executable scenario: Complex nested payload with valid positive value - -```gwt -Given a fat event schema for "ComplexSnapshot" with nested positive value payload -When a fat event with nested value 42 is parsed -Then the parsed nested value is 42 -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-031-complex-nested-payload-rejects-negative-value.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-031-complex-nested-payload-rejects-negative-value.sdp.md deleted file mode 100644 index 0696fdb2..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-031-complex-nested-payload-rejects-negative-value.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.complex-nested-payload-rejects-negative-value -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Complex nested payload rejects negative value - -## Intent - -- outcome: Executable scenario: Complex nested payload rejects negative value - -```gwt -Given a fat event schema for "ComplexSnapshot" with nested positive value payload -When a fat event with nested negative value is parsed -Then the parse throws a validation error -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-032-custom-schema-version-for-fat-events.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-032-custom-schema-version-for-fat-events.sdp.md deleted file mode 100644 index 32b1a499..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-032-custom-schema-version-for-fat-events.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.custom-schema-version-for-fat-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# Custom schemaVersion for fat events - -## Intent - -- outcome: Executable scenario: Custom schemaVersion for fat events - -```gwt -Given a fat event schema for "Test" with id payload and schemaVersion 5 -When a fat event with id payload is parsed -Then the parsed schemaVersion is 5 -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-033-domain-event-schema-accepts-any-payload-shape.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-033-domain-event-schema-accepts-any-payload-shape.sdp.md deleted file mode 100644 index f0878c0a..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-033-domain-event-schema-accepts-any-payload-shape.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.domain-event-schema-accepts-any-payload-shape -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# DomainEventSchema accepts any payload shape - -## Intent - -- outcome: Executable scenario: DomainEventSchema accepts any payload shape - -```gwt -Given valid event metadata -When an event with arbitrary payload is parsed with DomainEventSchema -Then the payload matches the arbitrary input -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-034-enhanced-domain-event-schema-includes-defaults.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-034-enhanced-domain-event-schema-includes-defaults.sdp.md deleted file mode 100644 index 9ba30540..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-034-enhanced-domain-event-schema-includes-defaults.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.enhanced-domain-event-schema-includes-defaults -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# EnhancedDomainEventSchema includes defaults - -## Intent - -- outcome: Executable scenario: EnhancedDomainEventSchema includes defaults - -```gwt -Given valid event metadata -When an event with simple payload is parsed with EnhancedDomainEventSchema -Then the parsed category is "domain" -And the parsed schemaVersion is 1 -And the payload matches the simple input -``` diff --git a/specs/behavior/platform-core/events/schemas.examples/s-035-enhanced-domain-event-schema-allows-optional-metadata.sdp.md b/specs/behavior/platform-core/events/schemas.examples/s-035-enhanced-domain-event-schema-allows-optional-metadata.sdp.md deleted file mode 100644 index e5323aa9..00000000 --- a/specs/behavior/platform-core/events/schemas.examples/s-035-enhanced-domain-event-schema-allows-optional-metadata.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.schemas.enhanced-domain-event-schema-allows-optional-metadata -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.schemas ---- -# EnhancedDomainEventSchema allows optional metadata - -## Intent - -- outcome: Executable scenario: EnhancedDomainEventSchema allows optional metadata - -```gwt -Given valid event metadata -When an event with metadata is parsed with EnhancedDomainEventSchema -Then the metadata matches the expected input -``` diff --git a/specs/behavior/platform-core/events/schemas.sdp.md b/specs/behavior/platform-core/events/schemas.sdp.md index 10452358..ad6e343a 100644 --- a/specs/behavior/platform-core/events/schemas.sdp.md +++ b/specs/behavior/platform-core/events/schemas.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.events.schemas kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: schema factory functions that produce typed Zod schemas so that events are validated at runtime with correct eventType, category, and payload +- outcome: Produce typed Zod event schemas so events are validated at runtime with the correct eventType, category, and payload. +- value: Domain, integration, trigger, and fat factories share metadata rules while each category keeps its own default. ## Behavior diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-001-event-at-current-version-is-returned-as-is.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-001-event-at-current-version-is-returned-as-is.sdp.md deleted file mode 100644 index c7567202..00000000 --- a/specs/behavior/platform-core/events/upcaster.examples/s-001-event-at-current-version-is-returned-as-is.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.events.upcaster.event-at-current-version-is-returned-as-is -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.upcaster ---- -# Event at current version is returned as-is - -## Intent - -- outcome: Executable scenario: Event at current version is returned as-is - -```gwt -Given an upcaster from version 1 to version 2 -And a v2 event with orderId "order_1" and customerId "cust_1" and createdAt 1234567890 -When the upcaster is applied -Then the result was not upcasted -And the original schema version is 2 -And the current schema version is 2 -And the event payload matches the input payload -``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-002-event-is-migrated-from-v1-to-v2.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-002-event-is-migrated-from-v1-to-v2.sdp.md deleted file mode 100644 index 2bcbb9e8..00000000 --- a/specs/behavior/platform-core/events/upcaster.examples/s-002-event-is-migrated-from-v1-to-v2.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.events.upcaster.event-is-migrated-from-v1-to-v2 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.upcaster ---- -# Event is migrated from v1 to v2 - -## Intent - -- outcome: Executable scenario: Event is migrated from v1 to v2 - -```gwt -Given an upcaster from version 1 to version 2 -And a v1 event with orderId "order_1" and customerId "cust_1" -When the upcaster is applied -Then the result was upcasted -And the original schema version is 1 -And the current schema version is 2 -And the event payload has a defined createdAt field -``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-003-event-is-migrated-from-v1-to-v3.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-003-event-is-migrated-from-v1-to-v3.sdp.md deleted file mode 100644 index cfcce313..00000000 --- a/specs/behavior/platform-core/events/upcaster.examples/s-003-event-is-migrated-from-v1-to-v3.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.events.upcaster.event-is-migrated-from-v1-to-v3 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.upcaster ---- -# Event is migrated from v1 to v3 - -## Intent - -- outcome: Executable scenario: Event is migrated from v1 to v3 - -```gwt -Given an upcaster from version 1 to version 3 -And a v1 event with orderId "order_1" and customerId "cust_1" -When the upcaster is applied -Then the result was upcasted -And the original schema version is 1 -And the current schema version is 3 -And the event payload has a defined createdAt field -And the event payload priority is "medium" -``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-004-incomplete-migration-chain-throws-at-creation-time.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-004-incomplete-migration-chain-throws-at-creation-time.sdp.md deleted file mode 100644 index 10dc6ed5..00000000 --- a/specs/behavior/platform-core/events/upcaster.examples/s-004-incomplete-migration-chain-throws-at-creation-time.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.upcaster.incomplete-migration-chain-throws-at-creation-time -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.upcaster ---- -# Incomplete migration chain throws at creation time - -## Intent - -- outcome: Executable scenario: Incomplete migration chain throws at creation time - -```gwt -Given the feature fixture is in place -When an upcaster is created with current version 3 but only a v1 migration -Then it throws an error containing "Missing migration for version 2" -``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-005-future-schema-version-throws-future-version-error.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-005-future-schema-version-throws-future-version-error.sdp.md deleted file mode 100644 index 8e60c961..00000000 --- a/specs/behavior/platform-core/events/upcaster.examples/s-005-future-schema-version-throws-future-version-error.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.events.upcaster.future-schema-version-throws-future-version-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.upcaster ---- -# Future schema version throws FUTURE_VERSION error - -## Intent - -- outcome: Executable scenario: Future schema version throws FUTURE_VERSION error - -```gwt -Given an upcaster from version 1 to version 2 -And a v5 event with orderId "order_1" and customerId "cust_1" -When the upcaster is applied expecting an error -Then it throws an EventUpcasterError -And the error message contains "is newer than current version" -``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-006-validation-passes-after-migration.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-006-validation-passes-after-migration.sdp.md deleted file mode 100644 index 47667a19..00000000 --- a/specs/behavior/platform-core/events/upcaster.examples/s-006-validation-passes-after-migration.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.events.upcaster.validation-passes-after-migration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.upcaster ---- -# Validation passes after migration - -## Intent - -- outcome: Executable scenario: Validation passes after migration - -```gwt -Given an upcaster from version 1 to version 2 with a validator that checks createdAt is a number -And a v1 event with orderId "order_1" and customerId "cust_1" -When the upcaster is applied -Then the result was upcasted -And the event payload has a defined createdAt field -``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-007-validation-fails-after-migration.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-007-validation-fails-after-migration.sdp.md deleted file mode 100644 index 4616e845..00000000 --- a/specs/behavior/platform-core/events/upcaster.examples/s-007-validation-fails-after-migration.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.events.upcaster.validation-fails-after-migration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.upcaster ---- -# Validation fails after migration - -## Intent - -- outcome: Executable scenario: Validation fails after migration - -```gwt -Given an upcaster from version 1 to version 2 with a validator that checks createdAt is positive -And a v1 event with orderId "order_1" and customerId "cust_1" -When the upcaster is applied expecting an error -Then it throws an EventUpcasterError -And the error message contains "failed validation" -``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-008-registry-reports-registered-and-unregistered-event-types.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-008-registry-reports-registered-and-unregistered-event-types.sdp.md deleted file mode 100644 index 2673e567..00000000 --- a/specs/behavior/platform-core/events/upcaster.examples/s-008-registry-reports-registered-and-unregistered-event-types.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.events.upcaster.registry-reports-registered-and-unregistered-event-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.upcaster ---- -# Registry reports registered and unregistered event types - -## Intent - -- outcome: Executable scenario: Registry reports registered and unregistered event types - -```gwt -Given an upcaster registry with "OrderCreated" registered -When the scenario runs -Then the registry has "OrderCreated" -And the registry does not have "UnregisteredEvent" -``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-009-registry-returns-all-registered-event-types.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-009-registry-returns-all-registered-event-types.sdp.md deleted file mode 100644 index 913be532..00000000 --- a/specs/behavior/platform-core/events/upcaster.examples/s-009-registry-returns-all-registered-event-types.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.events.upcaster.registry-returns-all-registered-event-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.upcaster ---- -# Registry returns all registered event types - -## Intent - -- outcome: Executable scenario: Registry returns all registered event types - -```gwt -Given an upcaster registry with types: -When the scenario runs -Then getRegisteredTypes contains all of: -And getRegisteredTypes has length 2 -``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-010-second-registration-overrides-the-first.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-010-second-registration-overrides-the-first.sdp.md deleted file mode 100644 index 0e10c9a9..00000000 --- a/specs/behavior/platform-core/events/upcaster.examples/s-010-second-registration-overrides-the-first.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.events.upcaster.second-registration-overrides-the-first -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.upcaster ---- -# Second registration overrides the first - -## Intent - -- outcome: Executable scenario: Second registration overrides the first - -```gwt -Given an upcaster registry where "OrderCreated" is registered twice -And the first upcaster migrates to v2 with createdAt 1000 -And the second upcaster migrates to v3 with createdAt 2000 and priority "high" -When a v1 OrderCreated event is upcasted via the registry -Then the current schema version is 3 -And the upcasted createdAt is 2000 -And the upcasted priority is "high" -``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-011-registered-event-type-is-upcasted.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-011-registered-event-type-is-upcasted.sdp.md deleted file mode 100644 index 4eddab1a..00000000 --- a/specs/behavior/platform-core/events/upcaster.examples/s-011-registered-event-type-is-upcasted.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.events.upcaster.registered-event-type-is-upcasted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.upcaster ---- -# Registered event type is upcasted - -## Intent - -- outcome: Executable scenario: Registered event type is upcasted - -```gwt -Given an upcaster registry with "OrderCreated" registered for v1 to v2 -And a v1 OrderCreated event -When the event is upcasted via the registry -Then the result was upcasted -And the current schema version is 2 -``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-012-unregistered-event-type-is-returned-as-is.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-012-unregistered-event-type-is-returned-as-is.sdp.md deleted file mode 100644 index de7b3ced..00000000 --- a/specs/behavior/platform-core/events/upcaster.examples/s-012-unregistered-event-type-is-returned-as-is.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.events.upcaster.unregistered-event-type-is-returned-as-is -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.upcaster ---- -# Unregistered event type is returned as-is - -## Intent - -- outcome: Executable scenario: Unregistered event type is returned as-is - -```gwt -Given an empty upcaster registry -And an unregistered event with eventType "UnregisteredEvent" -When the event is upcasted via the registry -Then the result was not upcasted -And the event category is "domain" -And the event schema version is 1 -``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-013-static-default-value-is-added.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-013-static-default-value-is-added.sdp.md deleted file mode 100644 index 8819beaa..00000000 --- a/specs/behavior/platform-core/events/upcaster.examples/s-013-static-default-value-is-added.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.events.upcaster.static-default-value-is-added -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.upcaster ---- -# Static default value is added - -## Intent - -- outcome: Executable scenario: Static default value is added - -```gwt -Given an addFieldMigration for "priority" with default "medium" to version 2 -And an event with payload orderId "order_1" -When the migration is applied -Then the payload field "priority" is "medium" -And the schema version is 2 -``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-014-computed-default-value-is-added-from-event-timestamp.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-014-computed-default-value-is-added-from-event-timestamp.sdp.md deleted file mode 100644 index b6416cf7..00000000 --- a/specs/behavior/platform-core/events/upcaster.examples/s-014-computed-default-value-is-added-from-event-timestamp.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.events.upcaster.computed-default-value-is-added-from-event-timestamp -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.upcaster ---- -# Computed default value is added from event timestamp - -## Intent - -- outcome: Executable scenario: Computed default value is added from event timestamp - -```gwt -Given an addFieldMigration for "createdAt" computed from timestamp to version 2 -And an event with payload orderId "order_1" and timestamp 1234567890 -When the migration is applied -Then the payload field "createdAt" is 1234567890 -And the schema version is 2 -``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-015-field-is-renamed-in-the-payload.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-015-field-is-renamed-in-the-payload.sdp.md deleted file mode 100644 index 9d5b812f..00000000 --- a/specs/behavior/platform-core/events/upcaster.examples/s-015-field-is-renamed-in-the-payload.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.events.upcaster.field-is-renamed-in-the-payload -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.upcaster ---- -# Field is renamed in the payload - -## Intent - -- outcome: Executable scenario: Field is renamed in the payload - -```gwt -Given a renameFieldMigration from "userId" to "customerId" at version 2 -And an event with payload userId "user_123" -When the rename migration is applied -Then the payload field "customerId" is "user_123" -And the payload field "userId" is undefined -And the schema version is 2 -``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-016-error-has-correct-name-code-and-message.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-016-error-has-correct-name-code-and-message.sdp.md deleted file mode 100644 index 8b47e52f..00000000 --- a/specs/behavior/platform-core/events/upcaster.examples/s-016-error-has-correct-name-code-and-message.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.events.upcaster.error-has-correct-name-code-and-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.upcaster ---- -# Error has correct name, code, and message - -## Intent - -- outcome: Executable scenario: Error has correct name, code, and message - -```gwt -Given an EventUpcasterError with code "UNKNOWN_EVENT_TYPE" and message "Test error" -When the scenario runs -Then the error name is "EventUpcasterError" -And the error code is "UNKNOWN_EVENT_TYPE" -``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-017-error-stores-context-when-provided.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-017-error-stores-context-when-provided.sdp.md deleted file mode 100644 index 21a8f2cf..00000000 --- a/specs/behavior/platform-core/events/upcaster.examples/s-017-error-stores-context-when-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.upcaster.error-stores-context-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.upcaster ---- -# Error stores context when provided - -## Intent - -- outcome: Executable scenario: Error stores context when provided - -```gwt -Given an EventUpcasterError with code "INVALID_EVENT" and message "Error" and context: -When the scenario runs -Then the error context matches: -``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-018-error-has-undefined-context-when-not-provided.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-018-error-has-undefined-context-when-not-provided.sdp.md deleted file mode 100644 index 22f339e5..00000000 --- a/specs/behavior/platform-core/events/upcaster.examples/s-018-error-has-undefined-context-when-not-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.upcaster.error-has-undefined-context-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.upcaster ---- -# Error has undefined context when not provided - -## Intent - -- outcome: Executable scenario: Error has undefined context when not provided - -```gwt -Given an EventUpcasterError with code "UNKNOWN_EVENT_TYPE" and message "Error" -When the scenario runs -Then the error context is undefined -``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-019-error-is-instanceof-error.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-019-error-is-instanceof-error.sdp.md deleted file mode 100644 index 6b6a5f4a..00000000 --- a/specs/behavior/platform-core/events/upcaster.examples/s-019-error-is-instanceof-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.upcaster.error-is-instanceof-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.upcaster ---- -# Error is instanceof Error - -## Intent - -- outcome: Executable scenario: Error is instanceof Error - -```gwt -Given an EventUpcasterError with code "UNKNOWN_EVENT_TYPE" and message "Error" -When the scenario runs -Then the error is an instance of Error -``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-020-error-preserves-specific-code-values.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-020-error-preserves-specific-code-values.sdp.md deleted file mode 100644 index 524b8b56..00000000 --- a/specs/behavior/platform-core/events/upcaster.examples/s-020-error-preserves-specific-code-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.upcaster.error-preserves-specific-code-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.upcaster ---- -# Error preserves specific code values - -## Intent - -- outcome: Executable scenario: Error preserves specific code values - -```gwt -Given an EventUpcasterError with code "MISSING_MIGRATION" and message "Test error" -When the scenario runs -Then the error code is "MISSING_MIGRATION" -``` diff --git a/specs/behavior/platform-core/events/upcaster.examples/s-021-error-preserves-custom-message.sdp.md b/specs/behavior/platform-core/events/upcaster.examples/s-021-error-preserves-custom-message.sdp.md deleted file mode 100644 index 01fe20db..00000000 --- a/specs/behavior/platform-core/events/upcaster.examples/s-021-error-preserves-custom-message.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.events.upcaster.error-preserves-custom-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.events.upcaster ---- -# Error preserves custom message - -## Intent - -- outcome: Executable scenario: Error preserves custom message - -```gwt -Given an EventUpcasterError with code "INVALID_EVENT" and message "Custom message" -When the scenario runs -Then the error message is "Custom message" -``` diff --git a/specs/behavior/platform-core/events/upcaster.sdp.md b/specs/behavior/platform-core/events/upcaster.sdp.md index c98f928e..fe08a1b8 100644 --- a/specs/behavior/platform-core/events/upcaster.sdp.md +++ b/specs/behavior/platform-core/events/upcaster.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.events.upcaster kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: event schema evolution utilities with chain-based migration so that events can be transparently upgraded to the latest schema version +- outcome: Evolve event schemas with chain-based migration so events can be upgraded to the latest schema version transparently. +- value: createEventUpcaster, the registry, and field migrations keep historical payloads on the current schema without rewriting the store. ## Behavior diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md deleted file mode 100644 index aa36f4df..00000000 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.fsm.fsm.fsm-is-created-with-correct-initial-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.fsm.fsm ---- -# FSM is created with correct initial state - -## Intent - -- outcome: Executable scenario: FSM is created with correct initial state - -```gwt -Given a test FSM with initial state "draft" -When the scenario runs -Then the FSM initial state is "draft" -``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-002-fsm-preserves-the-definition.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-002-fsm-preserves-the-definition.sdp.md deleted file mode 100644 index b056302e..00000000 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-002-fsm-preserves-the-definition.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.fsm.fsm.fsm-preserves-the-definition -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.fsm.fsm ---- -# FSM preserves the definition - -## Intent - -- outcome: Executable scenario: FSM preserves the definition - -```gwt -Given a test FSM with initial state "draft" -When the scenario runs -Then the FSM definition initial state is "draft" -And the FSM definition transitions for "draft" are: -``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-003-valid-transitions-return-true.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-003-valid-transitions-return-true.sdp.md deleted file mode 100644 index 91664b7b..00000000 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-003-valid-transitions-return-true.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.fsm.fsm.valid-transitions-return-true -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.fsm.fsm ---- -# Valid transitions return true - -## Intent - -- outcome: Executable scenario: Valid transitions return true - -```gwt -Given a test FSM with initial state "draft" -When the scenario runs -Then canTransition returns true for: -``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-004-invalid-transitions-return-false.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-004-invalid-transitions-return-false.sdp.md deleted file mode 100644 index 8f5f8c45..00000000 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-004-invalid-transitions-return-false.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.fsm.fsm.invalid-transitions-return-false -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.fsm.fsm ---- -# Invalid transitions return false - -## Intent - -- outcome: Executable scenario: Invalid transitions return false - -```gwt -Given a test FSM with initial state "draft" -When the scenario runs -Then canTransition returns false for: -``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-005-standalone-can-transition-function-works.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-005-standalone-can-transition-function-works.sdp.md deleted file mode 100644 index c35d0cec..00000000 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-005-standalone-can-transition-function-works.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.fsm.fsm.standalone-can-transition-function-works -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.fsm.fsm ---- -# Standalone canTransition function works - -## Intent - -- outcome: Executable scenario: Standalone canTransition function works - -```gwt -Given a test FSM with initial state "draft" -When the scenario runs -Then standalone canTransition returns true for "draft" to "submitted" -And standalone canTransition returns false for "draft" to "confirmed" -``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-006-valid-transitions-do-not-throw.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-006-valid-transitions-do-not-throw.sdp.md deleted file mode 100644 index 5efb08ff..00000000 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-006-valid-transitions-do-not-throw.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.fsm.fsm.valid-transitions-do-not-throw -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.fsm.fsm ---- -# Valid transitions do not throw - -## Intent - -- outcome: Executable scenario: Valid transitions do not throw - -```gwt -Given a test FSM with initial state "draft" -When the scenario runs -Then assertTransition does not throw for: -``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-007-invalid-transition-throws-fsm-transition-error.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-007-invalid-transition-throws-fsm-transition-error.sdp.md deleted file mode 100644 index 6c4544ea..00000000 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-007-invalid-transition-throws-fsm-transition-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.fsm.fsm.invalid-transition-throws-fsm-transition-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.fsm.fsm ---- -# Invalid transition throws FSMTransitionError - -## Intent - -- outcome: Executable scenario: Invalid transition throws FSMTransitionError - -```gwt -Given a test FSM with initial state "draft" -When I attempt transition from "draft" to "confirmed" -Then an FSMTransitionError is thrown -``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-008-fsm-transition-error-includes-transition-details.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-008-fsm-transition-error-includes-transition-details.sdp.md deleted file mode 100644 index bee8fb3e..00000000 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-008-fsm-transition-error-includes-transition-details.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.fsm.fsm.fsm-transition-error-includes-transition-details -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.fsm.fsm ---- -# FSMTransitionError includes transition details - -## Intent - -- outcome: Executable scenario: FSMTransitionError includes transition details - -```gwt -Given a test FSM with initial state "draft" -When I attempt transition from "draft" to "confirmed" -Then the error has from "draft" and to "confirmed" -And the error has valid transitions: -And the error has code "FSM_INVALID_TRANSITION" -``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-009-standalone-assert-transition-function-works.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-009-standalone-assert-transition-function-works.sdp.md deleted file mode 100644 index 007fb780..00000000 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-009-standalone-assert-transition-function-works.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.fsm.fsm.standalone-assert-transition-function-works -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.fsm.fsm ---- -# Standalone assertTransition function works - -## Intent - -- outcome: Executable scenario: Standalone assertTransition function works - -```gwt -Given a test FSM with initial state "draft" -When the scenario runs -Then standalone assertTransition does not throw for "draft" to "submitted" -And standalone assertTransition throws FSMTransitionError for "draft" to "confirmed" -``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-010-returns-valid-transitions-for-each-state.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-010-returns-valid-transitions-for-each-state.sdp.md deleted file mode 100644 index 70c56882..00000000 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-010-returns-valid-transitions-for-each-state.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.fsm.fsm.returns-valid-transitions-for-each-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.fsm.fsm ---- -# Returns valid transitions for each state - -## Intent - -- outcome: Executable scenario: Returns valid transitions for each state - -```gwt -Given a test FSM with initial state "draft" -When the scenario runs -Then validTransitions returns for each state: -``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-011-standalone-valid-transitions-function-works.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-011-standalone-valid-transitions-function-works.sdp.md deleted file mode 100644 index 544ea78b..00000000 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-011-standalone-valid-transitions-function-works.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.fsm.fsm.standalone-valid-transitions-function-works -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.fsm.fsm ---- -# Standalone validTransitions function works - -## Intent - -- outcome: Executable scenario: Standalone validTransitions function works - -```gwt -Given a test FSM with initial state "draft" -When the scenario runs -Then standalone validTransitions for "draft" returns: -``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-012-terminal-states-are-identified.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-012-terminal-states-are-identified.sdp.md deleted file mode 100644 index ea134608..00000000 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-012-terminal-states-are-identified.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.fsm.fsm.terminal-states-are-identified -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.fsm.fsm ---- -# Terminal states are identified - -## Intent - -- outcome: Executable scenario: Terminal states are identified - -```gwt -Given a test FSM with initial state "draft" -When the scenario runs -Then isTerminal returns true for: -``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-013-non-terminal-states-are-identified.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-013-non-terminal-states-are-identified.sdp.md deleted file mode 100644 index fd5edcc5..00000000 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-013-non-terminal-states-are-identified.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.fsm.fsm.non-terminal-states-are-identified -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.fsm.fsm ---- -# Non-terminal states are identified - -## Intent - -- outcome: Executable scenario: Non-terminal states are identified - -```gwt -Given a test FSM with initial state "draft" -When the scenario runs -Then isTerminal returns false for: -``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-014-standalone-is-terminal-function-works.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-014-standalone-is-terminal-function-works.sdp.md deleted file mode 100644 index 1ddae1ea..00000000 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-014-standalone-is-terminal-function-works.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.fsm.fsm.standalone-is-terminal-function-works -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.fsm.fsm ---- -# Standalone isTerminal function works - -## Intent - -- outcome: Executable scenario: Standalone isTerminal function works - -```gwt -Given a test FSM with initial state "draft" -When the scenario runs -Then standalone isTerminal returns true for "confirmed" -And standalone isTerminal returns false for "draft" -``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-015-valid-states-return-true.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-015-valid-states-return-true.sdp.md deleted file mode 100644 index 176ea405..00000000 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-015-valid-states-return-true.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.fsm.fsm.valid-states-return-true -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.fsm.fsm ---- -# Valid states return true - -## Intent - -- outcome: Executable scenario: Valid states return true - -```gwt -Given a test FSM with initial state "draft" -When the scenario runs -Then isValidState returns true for: -``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-016-invalid-states-return-false.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-016-invalid-states-return-false.sdp.md deleted file mode 100644 index de2ed5e7..00000000 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-016-invalid-states-return-false.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.fsm.fsm.invalid-states-return-false -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.fsm.fsm ---- -# Invalid states return false - -## Intent - -- outcome: Executable scenario: Invalid states return false - -```gwt -Given a test FSM with initial state "draft" -When the scenario runs -Then isValidState returns false for: -``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-017-standalone-is-valid-state-function-works.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-017-standalone-is-valid-state-function-works.sdp.md deleted file mode 100644 index 3bcc443f..00000000 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-017-standalone-is-valid-state-function-works.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.fsm.fsm.standalone-is-valid-state-function-works -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.fsm.fsm ---- -# Standalone isValidState function works - -## Intent - -- outcome: Executable scenario: Standalone isValidState function works - -```gwt -Given a test FSM with initial state "draft" -When the scenario runs -Then standalone isValidState returns true for "draft" -And standalone isValidState returns false for "unknown" -``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-018-error-has-correct-properties.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-018-error-has-correct-properties.sdp.md deleted file mode 100644 index 49e9063b..00000000 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-018-error-has-correct-properties.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.fsm.fsm.error-has-correct-properties -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.fsm.fsm ---- -# Error has correct properties - -## Intent - -- outcome: Executable scenario: Error has correct properties - -```gwt -Given the feature fixture is in place -When I create an FSMTransitionError from "draft" to "confirmed" with valid transitions: -Then the error name is "FSMTransitionError" -And the error code is "FSM_INVALID_TRANSITION" -And the error has from "draft" and to "confirmed" -And the error message contains "Invalid transition" -And the error message contains "draft" -And the error message contains "confirmed" -``` diff --git a/specs/behavior/platform-core/fsm/fsm.examples/s-019-error-handles-terminal-states-in-message.sdp.md b/specs/behavior/platform-core/fsm/fsm.examples/s-019-error-handles-terminal-states-in-message.sdp.md deleted file mode 100644 index 4f718072..00000000 --- a/specs/behavior/platform-core/fsm/fsm.examples/s-019-error-handles-terminal-states-in-message.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.fsm.fsm.error-handles-terminal-states-in-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.fsm.fsm ---- -# Error handles terminal states in message - -## Intent - -- outcome: Executable scenario: Error handles terminal states in message - -```gwt -Given the feature fixture is in place -When I create an FSMTransitionError from "confirmed" to "draft" with no valid transitions -Then the error message contains "(none - terminal state)" -``` diff --git a/specs/behavior/platform-core/fsm/fsm.sdp.md b/specs/behavior/platform-core/fsm/fsm.sdp.md index 04cf7e3c..c3b7b6c6 100644 --- a/specs/behavior/platform-core/fsm/fsm.sdp.md +++ b/specs/behavior/platform-core/fsm/fsm.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.fsm.fsm kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: a finite state machine with transition validation so that domain state changes are always safe and auditable +- outcome: Provide a typed finite state machine with transition validation so that domain state changes are always checked and auditable. +- value: Domain workflows declare allowed paths; invalid transitions fail with FSMTransitionError rather than silent wrong states. ## Behavior diff --git a/specs/behavior/platform-core/handlers/result.examples/s-001-success-result-has-correct-structure.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-001-success-result-has-correct-structure.sdp.md deleted file mode 100644 index b5f0250e..00000000 --- a/specs/behavior/platform-core/handlers/result.examples/s-001-success-result-has-correct-structure.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.handlers.result.success-result-has-correct-structure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.handlers.result ---- -# Success result has correct structure - -## Intent - -- outcome: Executable scenario: Success result has correct structure - -```gwt -Given a data payload with orderId "order_123" and customerId "cust_456" -And a test event -And a version number 5 -When I create a success result -Then the result has all expected fields: -And the result event matches the test event -``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-002-success-result-preserves-typed-data.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-002-success-result-preserves-typed-data.sdp.md deleted file mode 100644 index 0a8032b8..00000000 --- a/specs/behavior/platform-core/handlers/result.examples/s-002-success-result-preserves-typed-data.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.handlers.result.success-result-preserves-typed-data -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.handlers.result ---- -# Success result preserves typed data - -## Intent - -- outcome: Executable scenario: Success result preserves typed data - -```gwt -Given a typed data payload with orderId "order_123" and customerId "cust_456" -And a test event -When I create a success result with version 1 -Then the result data fields are: -``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-003-success-result-returns-status-as-literal-type.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-003-success-result-returns-status-as-literal-type.sdp.md deleted file mode 100644 index 4d2681d9..00000000 --- a/specs/behavior/platform-core/handlers/result.examples/s-003-success-result-returns-status-as-literal-type.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.handlers.result.success-result-returns-status-as-literal-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.handlers.result ---- -# Success result returns status as literal type - -## Intent - -- outcome: Executable scenario: Success result returns status as literal type - -```gwt -Given an empty data payload -And a test event -When I create a success result with version 0 -Then the result status is "success" -``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-004-rejected-result-has-code-and-reason.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-004-rejected-result-has-code-and-reason.sdp.md deleted file mode 100644 index 1f60df33..00000000 --- a/specs/behavior/platform-core/handlers/result.examples/s-004-rejected-result-has-code-and-reason.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.handlers.result.rejected-result-has-code-and-reason -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.handlers.result ---- -# Rejected result has code and reason - -## Intent - -- outcome: Executable scenario: Rejected result has code and reason - -```gwt -Given the feature fixture is in place -When I create a rejected result with code "ORDER_NOT_FOUND" and reason "Order not found" -Then the rejected result has all expected fields: -``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-005-rejected-result-includes-context-when-provided.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-005-rejected-result-includes-context-when-provided.sdp.md deleted file mode 100644 index 7450e30b..00000000 --- a/specs/behavior/platform-core/handlers/result.examples/s-005-rejected-result-includes-context-when-provided.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.handlers.result.rejected-result-includes-context-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.handlers.result ---- -# Rejected result includes context when provided - -## Intent - -- outcome: Executable scenario: Rejected result includes context when provided - -```gwt -Given the feature fixture is in place -When I create a rejected result with code "ORDER_NOT_FOUND" and reason "Order not found" and context -Then the rejected result status is "rejected" -And the rejected result code is "ORDER_NOT_FOUND" -And the rejected result context contains orderId "order_123" -And the rejected result context searchedAt is a number -``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-006-rejected-result-omits-context-when-not-provided.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-006-rejected-result-omits-context-when-not-provided.sdp.md deleted file mode 100644 index 75eb4fc5..00000000 --- a/specs/behavior/platform-core/handlers/result.examples/s-006-rejected-result-omits-context-when-not-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.handlers.result.rejected-result-omits-context-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.handlers.result ---- -# Rejected result omits context when not provided - -## Intent - -- outcome: Executable scenario: Rejected result omits context when not provided - -```gwt -Given the feature fixture is in place -When I create a rejected result with code "VALIDATION_ERROR" and reason "Invalid input" -Then the rejected result does not have a context property -``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-007-rejected-result-returns-status-as-literal-type.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-007-rejected-result-returns-status-as-literal-type.sdp.md deleted file mode 100644 index fe210331..00000000 --- a/specs/behavior/platform-core/handlers/result.examples/s-007-rejected-result-returns-status-as-literal-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.handlers.result.rejected-result-returns-status-as-literal-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.handlers.result ---- -# Rejected result returns status as literal type - -## Intent - -- outcome: Executable scenario: Rejected result returns status as literal type - -```gwt -Given the feature fixture is in place -When I create a rejected result with code "ERROR" and reason "message" -Then the rejected result status is "rejected" -``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-008-failed-result-has-event-data.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-008-failed-result-has-event-data.sdp.md deleted file mode 100644 index bf198074..00000000 --- a/specs/behavior/platform-core/handlers/result.examples/s-008-failed-result-has-event-data.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.handlers.result.failed-result-has-event-data -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.handlers.result ---- -# Failed result has event data - -## Intent - -- outcome: Executable scenario: Failed result has event data - -```gwt -Given a test event with eventType "ReservationFailed" -When I create a failed result with reason "Insufficient stock" -Then the failed result has all expected fields: -And the failed result event matches the test event -``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-009-failed-result-includes-expected-version-when-provided.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-009-failed-result-includes-expected-version-when-provided.sdp.md deleted file mode 100644 index 1b0542f6..00000000 --- a/specs/behavior/platform-core/handlers/result.examples/s-009-failed-result-includes-expected-version-when-provided.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.handlers.result.failed-result-includes-expected-version-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.handlers.result ---- -# Failed result includes expectedVersion when provided - -## Intent - -- outcome: Executable scenario: Failed result includes expectedVersion when provided - -```gwt -Given a test event -When I create a failed result with reason "Operation failed" and expectedVersion 10 -Then the failed result status is "failed" -And the failed result expectedVersion is 10 -``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-010-failed-result-includes-context-when-provided.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-010-failed-result-includes-context-when-provided.sdp.md deleted file mode 100644 index f2947d48..00000000 --- a/specs/behavior/platform-core/handlers/result.examples/s-010-failed-result-includes-context-when-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.handlers.result.failed-result-includes-context-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.handlers.result ---- -# Failed result includes context when provided - -## Intent - -- outcome: Executable scenario: Failed result includes context when provided - -```gwt -Given a test event -When I create a failed result with reason "Operation failed" and context -Then the failed result context is: -``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-011-failed-result-includes-both-expected-version-and-context.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-011-failed-result-includes-both-expected-version-and-context.sdp.md deleted file mode 100644 index 2815b41e..00000000 --- a/specs/behavior/platform-core/handlers/result.examples/s-011-failed-result-includes-both-expected-version-and-context.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.handlers.result.failed-result-includes-both-expected-version-and-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.handlers.result ---- -# Failed result includes both expectedVersion and context - -## Intent - -- outcome: Executable scenario: Failed result includes both expectedVersion and context - -```gwt -Given a test event -When I create a failed result with reason "Operation failed" and expectedVersion 5 and context -Then the failed result expectedVersion is 5 -And the failed result context contains detail "extra info" -``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-012-failed-result-omits-optional-properties-when-not-provided.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-012-failed-result-omits-optional-properties-when-not-provided.sdp.md deleted file mode 100644 index 9ce69284..00000000 --- a/specs/behavior/platform-core/handlers/result.examples/s-012-failed-result-omits-optional-properties-when-not-provided.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.handlers.result.failed-result-omits-optional-properties-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.handlers.result ---- -# Failed result omits optional properties when not provided - -## Intent - -- outcome: Executable scenario: Failed result omits optional properties when not provided - -```gwt -Given a test event -When I create a failed result with reason "Simple failure" -Then the failed result does not have expectedVersion property -And the failed result does not have context property -``` diff --git a/specs/behavior/platform-core/handlers/result.examples/s-013-failed-result-returns-status-as-literal-type.sdp.md b/specs/behavior/platform-core/handlers/result.examples/s-013-failed-result-returns-status-as-literal-type.sdp.md deleted file mode 100644 index 3536ad36..00000000 --- a/specs/behavior/platform-core/handlers/result.examples/s-013-failed-result-returns-status-as-literal-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.handlers.result.failed-result-returns-status-as-literal-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.handlers.result ---- -# Failed result returns status as literal type - -## Intent - -- outcome: Executable scenario: Failed result returns status as literal type - -```gwt -Given a test event -When I create a failed result with reason "message" -Then the failed result status is "failed" -``` diff --git a/specs/behavior/platform-core/handlers/result.sdp.md b/specs/behavior/platform-core/handlers/result.sdp.md index b5912a11..314984ea 100644 --- a/specs/behavior/platform-core/handlers/result.sdp.md +++ b/specs/behavior/platform-core/handlers/result.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.handlers.result kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: Handler Result Helpers +- outcome: Create typed dual-write command-handler results for success with event data, rejection without events, and failure that still emits an event. +- value: Command handlers can return status, data, and optional event payloads without assembling the result objects by hand. ## Behavior diff --git a/specs/behavior/platform-core/ids/branded.examples/s-001-factory-functions-produce-branded-i-ds-preserving-the-input-value.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-001-factory-functions-produce-branded-i-ds-preserving-the-input-value.sdp.md deleted file mode 100644 index d398c392..00000000 --- a/specs/behavior/platform-core/ids/branded.examples/s-001-factory-functions-produce-branded-i-ds-preserving-the-input-value.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.branded.factory-functions-produce-branded-i-ds-preserving-the-input-value -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.branded ---- -# Factory functions produce branded IDs preserving the input value - -## Intent - -- outcome: Executable scenario: Factory functions produce branded IDs preserving the input value - -```gwt -Given the following raw ID strings: -When each factory function is called with its input -Then each result equals its input string -And each result is assignable to its branded type -``` diff --git a/specs/behavior/platform-core/ids/branded.examples/s-002-branded-i-ds-are-assignable-to-plain-string-variables.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-002-branded-i-ds-are-assignable-to-plain-string-variables.sdp.md deleted file mode 100644 index c6159b37..00000000 --- a/specs/behavior/platform-core/ids/branded.examples/s-002-branded-i-ds-are-assignable-to-plain-string-variables.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.branded.branded-i-ds-are-assignable-to-plain-string-variables -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.branded ---- -# Branded IDs are assignable to plain string variables - -## Intent - -- outcome: Executable scenario: Branded IDs are assignable to plain string variables - -```gwt -Given branded IDs created from the following inputs: -When each branded ID is assigned to a string variable -Then each string variable equals its original input -``` diff --git a/specs/behavior/platform-core/ids/branded.examples/s-003-branded-i-ds-support-standard-string-methods.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-003-branded-i-ds-support-standard-string-methods.sdp.md deleted file mode 100644 index 8cd2df91..00000000 --- a/specs/behavior/platform-core/ids/branded.examples/s-003-branded-i-ds-support-standard-string-methods.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.branded.branded-i-ds-support-standard-string-methods -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.branded ---- -# Branded IDs support standard string methods - -## Intent - -- outcome: Executable scenario: Branded IDs support standard string methods - -```gwt -Given a CommandId created from "cmd_TEST_123" -When string methods are called on the branded ID -Then toLowerCase returns "cmd_test_123" -And startsWith "cmd_" returns true -And length equals 12 -``` diff --git a/specs/behavior/platform-core/ids/branded.examples/s-004-generators-produce-correctly-prefixed-branded-i-ds.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-004-generators-produce-correctly-prefixed-branded-i-ds.sdp.md deleted file mode 100644 index 4698fa91..00000000 --- a/specs/behavior/platform-core/ids/branded.examples/s-004-generators-produce-correctly-prefixed-branded-i-ds.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.branded.generators-produce-correctly-prefixed-branded-i-ds -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.branded ---- -# Generators produce correctly prefixed branded IDs - -## Intent - -- outcome: Executable scenario: Generators produce correctly prefixed branded IDs - -```gwt -Given the feature fixture is in place -When the following generators are called: -Then each result starts with its expected prefix -``` diff --git a/specs/behavior/platform-core/ids/branded.examples/s-005-command-and-correlation-generators-produce-valid-uuid-v7-after-prefix.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-005-command-and-correlation-generators-produce-valid-uuid-v7-after-prefix.sdp.md deleted file mode 100644 index 2a0dc22e..00000000 --- a/specs/behavior/platform-core/ids/branded.examples/s-005-command-and-correlation-generators-produce-valid-uuid-v7-after-prefix.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.branded.command-and-correlation-generators-produce-valid-uuid-v7-after-prefix -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.branded ---- -# Command and correlation generators produce valid UUID v7 after prefix - -## Intent - -- outcome: Executable scenario: Command and correlation generators produce valid UUID v7 after prefix - -```gwt -Given the feature fixture is in place -When generateCommandId is called and generateCorrelationId is called -Then the result after removing "cmd_" matches UUID v7 format -And the result after removing "corr_" matches UUID v7 format -``` diff --git a/specs/behavior/platform-core/ids/branded.examples/s-006-is-valid-id-string-returns-true-for-non-empty-strings.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-006-is-valid-id-string-returns-true-for-non-empty-strings.sdp.md deleted file mode 100644 index 0bffa000..00000000 --- a/specs/behavior/platform-core/ids/branded.examples/s-006-is-valid-id-string-returns-true-for-non-empty-strings.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.branded.is-valid-id-string-returns-true-for-non-empty-strings -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.branded ---- -# isValidIdString returns true for non-empty strings - -## Intent - -- outcome: Executable scenario: isValidIdString returns true for non-empty strings - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isValidIdString returns true for all of: -``` diff --git a/specs/behavior/platform-core/ids/branded.examples/s-007-is-valid-id-string-returns-false-for-empty-string.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-007-is-valid-id-string-returns-false-for-empty-string.sdp.md deleted file mode 100644 index 5dffc4c8..00000000 --- a/specs/behavior/platform-core/ids/branded.examples/s-007-is-valid-id-string-returns-false-for-empty-string.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.branded.is-valid-id-string-returns-false-for-empty-string -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.branded ---- -# isValidIdString returns false for empty string - -## Intent - -- outcome: Executable scenario: isValidIdString returns false for empty string - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isValidIdString returns false for "" -``` diff --git a/specs/behavior/platform-core/ids/branded.examples/s-008-is-valid-id-string-returns-false-for-non-string-values.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-008-is-valid-id-string-returns-false-for-non-string-values.sdp.md deleted file mode 100644 index 7b674753..00000000 --- a/specs/behavior/platform-core/ids/branded.examples/s-008-is-valid-id-string-returns-false-for-non-string-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.branded.is-valid-id-string-returns-false-for-non-string-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.branded ---- -# isValidIdString returns false for non-string values - -## Intent - -- outcome: Executable scenario: isValidIdString returns false for non-string values - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isValidIdString returns false for all non-string values: -``` diff --git a/specs/behavior/platform-core/ids/branded.examples/s-009-is-valid-id-string-narrows-type-for-type-script.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-009-is-valid-id-string-narrows-type-for-type-script.sdp.md deleted file mode 100644 index b524258e..00000000 --- a/specs/behavior/platform-core/ids/branded.examples/s-009-is-valid-id-string-narrows-type-for-type-script.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.branded.is-valid-id-string-narrows-type-for-type-script -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.branded ---- -# isValidIdString narrows type for TypeScript - -## Intent - -- outcome: Executable scenario: isValidIdString narrows type for TypeScript - -```gwt -Given an unknown value "test_id" -When isValidIdString returns true -Then the value is usable as a string with length greater than 0 -``` diff --git a/specs/behavior/platform-core/ids/branded.examples/s-010-n-100-generated-command-ids-are-all-unique.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-010-n-100-generated-command-ids-are-all-unique.sdp.md deleted file mode 100644 index af496906..00000000 --- a/specs/behavior/platform-core/ids/branded.examples/s-010-n-100-generated-command-ids-are-all-unique.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.branded.n-100-generated-command-ids-are-all-unique -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.branded ---- -# 100 generated CommandIds are all unique - -## Intent - -- outcome: Executable scenario: 100 generated CommandIds are all unique - -```gwt -Given the feature fixture is in place -When 100 CommandIds are generated -Then all 100 are distinct -``` diff --git a/specs/behavior/platform-core/ids/branded.examples/s-011-n-100-generated-correlation-ids-are-all-unique.sdp.md b/specs/behavior/platform-core/ids/branded.examples/s-011-n-100-generated-correlation-ids-are-all-unique.sdp.md deleted file mode 100644 index ff673fb7..00000000 --- a/specs/behavior/platform-core/ids/branded.examples/s-011-n-100-generated-correlation-ids-are-all-unique.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.branded.n-100-generated-correlation-ids-are-all-unique -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.branded ---- -# 100 generated CorrelationIds are all unique - -## Intent - -- outcome: Executable scenario: 100 generated CorrelationIds are all unique - -```gwt -Given the feature fixture is in place -When 100 CorrelationIds are generated -Then all 100 are distinct -``` diff --git a/specs/behavior/platform-core/ids/branded.sdp.md b/specs/behavior/platform-core/ids/branded.sdp.md index 44309ffb..73f4c0af 100644 --- a/specs/behavior/platform-core/ids/branded.sdp.md +++ b/specs/behavior/platform-core/ids/branded.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.ids.branded kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: branded ID types that provide compile-time safety so that different ID kinds cannot be accidentally interchanged +- outcome: Provide branded ID types that give compile-time safety so different ID kinds cannot be accidentally interchanged. +- value: Branded types stay nominally distinct at the type level while remaining plain strings at runtime with zero overhead. ## Behavior diff --git a/specs/behavior/platform-core/ids/generator.examples/s-001-generated-id-matches-the-expected-format.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-001-generated-id-matches-the-expected-format.sdp.md deleted file mode 100644 index b31c1f4e..00000000 --- a/specs/behavior/platform-core/ids/generator.examples/s-001-generated-id-matches-the-expected-format.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.generator.generated-id-matches-the-expected-format -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.generator ---- -# Generated ID matches the expected format - -## Intent - -- outcome: Executable scenario: Generated ID matches the expected format - -```gwt -Given the feature fixture is in place -When generateId is called with context "orders" and type "order" -Then the result matches pattern "^orders_order_[0-9a-f-]{36}$" -``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-002-each-call-produces-a-unique-id.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-002-each-call-produces-a-unique-id.sdp.md deleted file mode 100644 index 980b43ad..00000000 --- a/specs/behavior/platform-core/ids/generator.examples/s-002-each-call-produces-a-unique-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.generator.each-call-produces-a-unique-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.generator ---- -# Each call produces a unique ID - -## Intent - -- outcome: Executable scenario: Each call produces a unique ID - -```gwt -Given the feature fixture is in place -When generateId is called twice with context "orders" and type "order" -Then the two IDs are different -``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-003-generated-id-starts-with-the-provided-context-and-type.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-003-generated-id-starts-with-the-provided-context-and-type.sdp.md deleted file mode 100644 index 18a21dea..00000000 --- a/specs/behavior/platform-core/ids/generator.examples/s-003-generated-id-starts-with-the-provided-context-and-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.generator.generated-id-starts-with-the-provided-context-and-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.generator ---- -# Generated ID starts with the provided context and type - -## Intent - -- outcome: Executable scenario: Generated ID starts with the provided context and type - -```gwt -Given the feature fixture is in place -When generateId is called with context "inventory" and type "product" -Then the result starts with "inventory_product_" -``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-004-lowercase-alphanumeric-values-are-accepted-for-context-and-type.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-004-lowercase-alphanumeric-values-are-accepted-for-context-and-type.sdp.md deleted file mode 100644 index 87f0e896..00000000 --- a/specs/behavior/platform-core/ids/generator.examples/s-004-lowercase-alphanumeric-values-are-accepted-for-context-and-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.generator.lowercase-alphanumeric-values-are-accepted-for-context-and-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.generator ---- -# Lowercase alphanumeric values are accepted for context and type - -## Intent - -- outcome: Executable scenario: Lowercase alphanumeric values are accepted for context and type - -```gwt -Given the feature fixture is in place -When generateId is called with the following inputs: -Then each result starts with its expected prefix -``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-005-empty-context-or-type-throws-an-error.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-005-empty-context-or-type-throws-an-error.sdp.md deleted file mode 100644 index b32285ad..00000000 --- a/specs/behavior/platform-core/ids/generator.examples/s-005-empty-context-or-type-throws-an-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.generator.empty-context-or-type-throws-an-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.generator ---- -# Empty context or type throws an error - -## Intent - -- outcome: Executable scenario: Empty context or type throws an error - -```gwt -Given the feature fixture is in place -When the scenario runs -Then generateId throws for invalid inputs: -``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-006-context-with-disallowed-characters-throws-an-error.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-006-context-with-disallowed-characters-throws-an-error.sdp.md deleted file mode 100644 index f5f5d9be..00000000 --- a/specs/behavior/platform-core/ids/generator.examples/s-006-context-with-disallowed-characters-throws-an-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.generator.context-with-disallowed-characters-throws-an-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.generator ---- -# Context with disallowed characters throws an error - -## Intent - -- outcome: Executable scenario: Context with disallowed characters throws an error - -```gwt -Given the feature fixture is in place -When the scenario runs -Then generateId throws for invalid inputs: -``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-007-type-with-underscore-throws-an-error.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-007-type-with-underscore-throws-an-error.sdp.md deleted file mode 100644 index 0ab8ae10..00000000 --- a/specs/behavior/platform-core/ids/generator.examples/s-007-type-with-underscore-throws-an-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.generator.type-with-underscore-throws-an-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.generator ---- -# Type with underscore throws an error - -## Intent - -- outcome: Executable scenario: Type with underscore throws an error - -```gwt -Given the feature fixture is in place -When the scenario runs -Then generateId throws for invalid inputs: -``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-008-a-well-formed-id-is-parsed-into-its-components.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-008-a-well-formed-id-is-parsed-into-its-components.sdp.md deleted file mode 100644 index 6545f5db..00000000 --- a/specs/behavior/platform-core/ids/generator.examples/s-008-a-well-formed-id-is-parsed-into-its-components.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.generator.a-well-formed-id-is-parsed-into-its-components -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.generator ---- -# A well-formed ID is parsed into its components - -## Intent - -- outcome: Executable scenario: A well-formed ID is parsed into its components - -```gwt -Given the ID string "orders_order_0190a7c4-1234-7abc-8def-1234567890ab" -When parseId is called -Then the parsed result is: -``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-009-an-id-produced-by-generate-id-is-parseable.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-009-an-id-produced-by-generate-id-is-parseable.sdp.md deleted file mode 100644 index 5c82fc8b..00000000 --- a/specs/behavior/platform-core/ids/generator.examples/s-009-an-id-produced-by-generate-id-is-parseable.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.generator.an-id-produced-by-generate-id-is-parseable -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.generator ---- -# An ID produced by generateId is parseable - -## Intent - -- outcome: Executable scenario: An ID produced by generateId is parseable - -```gwt -Given an ID generated with context "inventory" and type "product" -When parseId is called -Then the parsed context is "inventory" -And the parsed type is "product" -And the parsed uuid matches "^[0-9a-f-]{36}$" -``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-010-uuid-portion-containing-underscores-is-preserved.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-010-uuid-portion-containing-underscores-is-preserved.sdp.md deleted file mode 100644 index c0440f9c..00000000 --- a/specs/behavior/platform-core/ids/generator.examples/s-010-uuid-portion-containing-underscores-is-preserved.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.generator.uuid-portion-containing-underscores-is-preserved -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.generator ---- -# UUID portion containing underscores is preserved - -## Intent - -- outcome: Executable scenario: UUID portion containing underscores is preserved - -```gwt -Given the ID string "orders_order_uuid_with_extra_parts" -When parseId is called -Then the parsed result is: -``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-011-i-ds-with-fewer-than-three-parts-return-null.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-011-i-ds-with-fewer-than-three-parts-return-null.sdp.md deleted file mode 100644 index 9c84db6e..00000000 --- a/specs/behavior/platform-core/ids/generator.examples/s-011-i-ds-with-fewer-than-three-parts-return-null.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.generator.i-ds-with-fewer-than-three-parts-return-null -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.generator ---- -# IDs with fewer than three parts return null - -## Intent - -- outcome: Executable scenario: IDs with fewer than three parts return null - -```gwt -Given the feature fixture is in place -When the scenario runs -Then parseId returns null for all of: -``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-012-i-ds-with-empty-context-or-type-return-null.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-012-i-ds-with-empty-context-or-type-return-null.sdp.md deleted file mode 100644 index d64ec06c..00000000 --- a/specs/behavior/platform-core/ids/generator.examples/s-012-i-ds-with-empty-context-or-type-return-null.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.generator.i-ds-with-empty-context-or-type-return-null -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.generator ---- -# IDs with empty context or type return null - -## Intent - -- outcome: Executable scenario: IDs with empty context or type return null - -```gwt -Given the feature fixture is in place -When the scenario runs -Then parseId returns null for all of: -``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-013-correlation-id-has-the-expected-format-and-is-unique-per-call.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-013-correlation-id-has-the-expected-format-and-is-unique-per-call.sdp.md deleted file mode 100644 index ca471036..00000000 --- a/specs/behavior/platform-core/ids/generator.examples/s-013-correlation-id-has-the-expected-format-and-is-unique-per-call.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.generator.correlation-id-has-the-expected-format-and-is-unique-per-call -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.generator ---- -# Correlation ID has the expected format and is unique per call - -## Intent - -- outcome: Executable scenario: Correlation ID has the expected format and is unique per call - -```gwt -Given the feature fixture is in place -When generateCorrelationId is called twice -Then both results match pattern "^corr_[0-9a-f-]{36}$" -And the two results are different -``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-014-command-id-has-the-expected-format-and-is-unique-per-call.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-014-command-id-has-the-expected-format-and-is-unique-per-call.sdp.md deleted file mode 100644 index 5f1bb40f..00000000 --- a/specs/behavior/platform-core/ids/generator.examples/s-014-command-id-has-the-expected-format-and-is-unique-per-call.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.generator.command-id-has-the-expected-format-and-is-unique-per-call -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.generator ---- -# Command ID has the expected format and is unique per call - -## Intent - -- outcome: Executable scenario: Command ID has the expected format and is unique per call - -```gwt -Given the feature fixture is in place -When generateCommandId is called twice -Then both results match pattern "^cmd_[0-9a-f-]{36}$" -And the two results are different -``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-015-event-id-has-the-expected-format-and-uses-the-provided-context.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-015-event-id-has-the-expected-format-and-uses-the-provided-context.sdp.md deleted file mode 100644 index 8acf9ced..00000000 --- a/specs/behavior/platform-core/ids/generator.examples/s-015-event-id-has-the-expected-format-and-uses-the-provided-context.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.generator.event-id-has-the-expected-format-and-uses-the-provided-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.generator ---- -# Event ID has the expected format and uses the provided context - -## Intent - -- outcome: Executable scenario: Event ID has the expected format and uses the provided context - -```gwt -Given the feature fixture is in place -When generateEventId is called with context "orders" and generateEventId is called with context "inventory" -Then the result matches pattern "^orders_event_[0-9a-f-]{36}$" -And the result starts with "inventory_event_" -``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-016-event-i-ds-are-unique-per-call.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-016-event-i-ds-are-unique-per-call.sdp.md deleted file mode 100644 index 9cf80261..00000000 --- a/specs/behavior/platform-core/ids/generator.examples/s-016-event-i-ds-are-unique-per-call.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.generator.event-i-ds-are-unique-per-call -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.generator ---- -# Event IDs are unique per call - -## Intent - -- outcome: Executable scenario: Event IDs are unique per call - -```gwt -Given the feature fixture is in place -When generateEventId is called twice with context "orders" -Then the two results are different -``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-017-empty-context-throws-an-error.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-017-empty-context-throws-an-error.sdp.md deleted file mode 100644 index aa56a29a..00000000 --- a/specs/behavior/platform-core/ids/generator.examples/s-017-empty-context-throws-an-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.generator.empty-context-throws-an-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.generator ---- -# Empty context throws an error - -## Intent - -- outcome: Executable scenario: Empty context throws an error - -```gwt -Given the feature fixture is in place -When the scenario runs -Then generateEventId with empty context throws "context cannot be empty" -``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-018-integration-event-id-has-the-expected-format-and-is-unique-per-call.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-018-integration-event-id-has-the-expected-format-and-is-unique-per-call.sdp.md deleted file mode 100644 index 1b5f4f47..00000000 --- a/specs/behavior/platform-core/ids/generator.examples/s-018-integration-event-id-has-the-expected-format-and-is-unique-per-call.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.generator.integration-event-id-has-the-expected-format-and-is-unique-per-call -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.generator ---- -# Integration event ID has the expected format and is unique per call - -## Intent - -- outcome: Executable scenario: Integration event ID has the expected format and is unique per call - -```gwt -Given the feature fixture is in place -When generateIntegrationEventId is called twice -Then both results match pattern "^int_evt_[0-9a-f-]{36}$" -And the two results are different -``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-019-uuid-portion-has-version-7-indicator.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-019-uuid-portion-has-version-7-indicator.sdp.md deleted file mode 100644 index 108a366c..00000000 --- a/specs/behavior/platform-core/ids/generator.examples/s-019-uuid-portion-has-version-7-indicator.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.generator.uuid-portion-has-version-7-indicator -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.generator ---- -# UUID portion has version 7 indicator - -## Intent - -- outcome: Executable scenario: UUID portion has version 7 indicator - -```gwt -Given the feature fixture is in place -When generateId is called with context "test" and type "item" -Then the UUID portion matches "^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$" -``` diff --git a/specs/behavior/platform-core/ids/generator.examples/s-020-ten-sequential-i-ds-are-lexicographically-sorted.sdp.md b/specs/behavior/platform-core/ids/generator.examples/s-020-ten-sequential-i-ds-are-lexicographically-sorted.sdp.md deleted file mode 100644 index acac4df7..00000000 --- a/specs/behavior/platform-core/ids/generator.examples/s-020-ten-sequential-i-ds-are-lexicographically-sorted.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.ids.generator.ten-sequential-i-ds-are-lexicographically-sorted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.ids.generator ---- -# Ten sequential IDs are lexicographically sorted - -## Intent - -- outcome: Executable scenario: Ten sequential IDs are lexicographically sorted - -```gwt -Given the feature fixture is in place -When 10 IDs are generated sequentially with context "test" and type "item" -Then the IDs are in lexicographic order -``` diff --git a/specs/behavior/platform-core/ids/generator.sdp.md b/specs/behavior/platform-core/ids/generator.sdp.md index 56d0e3fc..b6e3df99 100644 --- a/specs/behavior/platform-core/ids/generator.sdp.md +++ b/specs/behavior/platform-core/ids/generator.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.ids.generator kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,11 +11,12 @@ relations: ## Intent - actor: a platform developer -- outcome: prefixed ID generation with validation so that IDs follow a consistent format across bounded contexts +- outcome: Generate prefixed IDs with validation so IDs follow a consistent format across bounded contexts. +- value: Pure functions generate and parse generateId, parseId, generateCorrelationId, generateCommandId, generateEventId, and generateIntegrationEventId. ## Behavior -- rule: generateId produces IDs in {context}_{type}_{uuid} format +- rule: generateId produces IDs in context_type_uuid format - rule: generateId rejects invalid context and type values - rule: parseId decomposes valid IDs into context, type, and uuid - rule: parseId returns null for malformed IDs diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-001-define-acl-for-payment-gateway.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-001-define-acl-for-payment-gateway.sdp.md deleted file mode 100644 index 3743d4c4..00000000 --- a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-001-define-acl-for-payment-gateway.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.anti-corruption-layer.define-acl-for-payment-gateway -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.anti-corruption-layer ---- -# Define ACL for payment gateway - -## Intent - -- outcome: Executable scenario: Define ACL for payment gateway - -```gwt -Given the integration module is imported from platform-core -And ACL utilities are available -And an external payment gateway with model { txn_id, amt, ccy, status } -When I define a PaymentACL with fromGateway() method -Then the ACL can translate gateway responses to domain models -And domain models have { transactionId, amount, currency, status } -``` diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-002-acl-translates-field-names.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-002-acl-translates-field-names.sdp.md deleted file mode 100644 index 14c1c19c..00000000 --- a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-002-acl-translates-field-names.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.anti-corruption-layer.acl-translates-field-names -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.anti-corruption-layer ---- -# ACL translates field names - -## Intent - -- outcome: Executable scenario: ACL translates field names - -```gwt -Given the integration module is imported from platform-core -And ACL utilities are available -And external field "txn_id" maps to domain "transactionId" -When ACL processes { txn_id: 'abc123' } -Then result has { transactionId: 'abc123' } -And result does NOT have txn_id -``` diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-003-acl-transforms-field-values.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-003-acl-transforms-field-values.sdp.md deleted file mode 100644 index 6a70ea17..00000000 --- a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-003-acl-transforms-field-values.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.anti-corruption-layer.acl-transforms-field-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.anti-corruption-layer ---- -# ACL transforms field values - -## Intent - -- outcome: Executable scenario: ACL transforms field values - -```gwt -Given the integration module is imported from platform-core -And ACL utilities are available -And external "amt" is in cents (15000) -And domain "amount.value" is in dollars -When ACL processes { amt: 15000 } -Then result has { amount: { value: 150.00 } } -``` diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-004-acl-translates-domain-to-external.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-004-acl-translates-domain-to-external.sdp.md deleted file mode 100644 index 7ab1ed19..00000000 --- a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-004-acl-translates-domain-to-external.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.anti-corruption-layer.acl-translates-domain-to-external -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.anti-corruption-layer ---- -# ACL translates domain to external - -## Intent - -- outcome: Executable scenario: ACL translates domain to external - -```gwt -Given the integration module is imported from platform-core -And ACL utilities are available -And a domain PaymentRequest { transactionId, amount, currency } -When I call paymentACL.toGateway(domainModel) -Then result has { txn_id, amt, ccy } -And amounts are converted to cents -``` diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-005-round-trip-translation-preserves-data.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-005-round-trip-translation-preserves-data.sdp.md deleted file mode 100644 index 894c961e..00000000 --- a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-005-round-trip-translation-preserves-data.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.anti-corruption-layer.round-trip-translation-preserves-data -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.anti-corruption-layer ---- -# Round-trip translation preserves data - -## Intent - -- outcome: Executable scenario: Round-trip translation preserves data - -```gwt -Given the integration module is imported from platform-core -And ACL utilities are available -And a domain model -When I call toGateway() then fromGateway() -Then the result equals the original domain model -``` diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-006-missing-required-external-field.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-006-missing-required-external-field.sdp.md deleted file mode 100644 index e3ee012d..00000000 --- a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-006-missing-required-external-field.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.anti-corruption-layer.missing-required-external-field -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.anti-corruption-layer ---- -# Missing required external field - -## Intent - -- outcome: Executable scenario: Missing required external field - -```gwt -Given the integration module is imported from platform-core -And ACL utilities are available -And external response missing "txn_id" -When ACL processes the response -Then an error is thrown with code "INVALID_EXTERNAL_RESPONSE" -And error.field equals "txn_id" -``` diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-007-invalid-external-field-type.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-007-invalid-external-field-type.sdp.md deleted file mode 100644 index 9f96e42a..00000000 --- a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-007-invalid-external-field-type.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.anti-corruption-layer.invalid-external-field-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.anti-corruption-layer ---- -# Invalid external field type - -## Intent - -- outcome: Executable scenario: Invalid external field type - -```gwt -Given the integration module is imported from platform-core -And ACL utilities are available -And external response with amt: "not a number" -When ACL processes the response -Then an error is thrown with code "INVALID_EXTERNAL_RESPONSE" -And error.field equals "amt" -``` diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-008-unknown-external-status.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-008-unknown-external-status.sdp.md deleted file mode 100644 index 37ee2440..00000000 --- a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-008-unknown-external-status.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.anti-corruption-layer.unknown-external-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.anti-corruption-layer ---- -# Unknown external status - -## Intent - -- outcome: Executable scenario: Unknown external status - -```gwt -Given the integration module is imported from platform-core -And ACL utilities are available -And external response with status: "unknown_status" -When ACL processes the response -Then an error is thrown with code "UNMAPPED_VALUE" -And error.field equals "status" -``` diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-009-multiple-payment-gateways-with-different-schemas.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-009-multiple-payment-gateways-with-different-schemas.sdp.md deleted file mode 100644 index e6b38cc7..00000000 --- a/specs/behavior/platform-core/integration/anti-corruption-layer.examples/s-009-multiple-payment-gateways-with-different-schemas.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.anti-corruption-layer.multiple-payment-gateways-with-different-schemas -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.anti-corruption-layer ---- -# Multiple payment gateways with different schemas - -## Intent - -- outcome: Executable scenario: Multiple payment gateways with different schemas - -```gwt -Given the integration module is imported from platform-core -And ACL utilities are available -And StripeACL for Stripe responses { id, amount, currency } -And PayPalACL for PayPal responses { transaction_id, value, cur_code } -When processing responses from both systems -Then both produce consistent domain PaymentConfirmation models -``` diff --git a/specs/behavior/platform-core/integration/anti-corruption-layer.sdp.md b/specs/behavior/platform-core/integration/anti-corruption-layer.sdp.md index 3227134b..2e17aa57 100644 --- a/specs/behavior/platform-core/integration/anti-corruption-layer.sdp.md +++ b/specs/behavior/platform-core/integration/anti-corruption-layer.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.integration.anti-corruption-layer kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: ACL utilities to translate external models so that domain code remains clean of foreign concepts +- outcome: Translate external models through ACL utilities so domain code stays clean of foreign concepts. +- value: Each external system gets its own ACL with field mapping, value conversion, and validation. ## Behavior diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-001-register-upstream-downstream-relationship.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-001-register-upstream-downstream-relationship.sdp.md deleted file mode 100644 index 3a6e04ca..00000000 --- a/specs/behavior/platform-core/integration/context-map.examples/s-001-register-upstream-downstream-relationship.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.context-map.register-upstream-downstream-relationship -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.context-map ---- -# Register Upstream/Downstream relationship - -## Intent - -- outcome: Executable scenario: Register Upstream/Downstream relationship - -```gwt -Given the integration module is imported from platform-core -And the Context Map registry is available -And BC "Orders" publishes events -And BC "Inventory" consumes those events -When I register the relationship as "Upstream/Downstream" -Then Context Map shows Orders as upstream -And Context Map shows Inventory as downstream -``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-002-register-customer-supplier-relationship.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-002-register-customer-supplier-relationship.sdp.md deleted file mode 100644 index ceedd867..00000000 --- a/specs/behavior/platform-core/integration/context-map.examples/s-002-register-customer-supplier-relationship.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.context-map.register-customer-supplier-relationship -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.context-map ---- -# Register Customer/Supplier relationship - -## Intent - -- outcome: Executable scenario: Register Customer/Supplier relationship - -```gwt -Given the integration module is imported from platform-core -And the Context Map registry is available -And BC "Shipping" needs data from BC "Orders" -And Shipping's needs drive Orders' API -When I register the relationship as "Customer/Supplier" -Then Context Map shows Orders as supplier -And Context Map shows Shipping as customer -``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-003-register-conformist-relationship.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-003-register-conformist-relationship.sdp.md deleted file mode 100644 index e2b9e186..00000000 --- a/specs/behavior/platform-core/integration/context-map.examples/s-003-register-conformist-relationship.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.context-map.register-conformist-relationship -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.context-map ---- -# Register Conformist relationship - -## Intent - -- outcome: Executable scenario: Register Conformist relationship - -```gwt -Given the integration module is imported from platform-core -And the Context Map registry is available -And BC "Analytics" adopts EventStore schema -When I register the relationship as "Conformist" -Then Context Map shows Analytics conforms to EventStore -``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-004-register-acl-relationship.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-004-register-acl-relationship.sdp.md deleted file mode 100644 index 2dd9cb2f..00000000 --- a/specs/behavior/platform-core/integration/context-map.examples/s-004-register-acl-relationship.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.context-map.register-acl-relationship -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.context-map ---- -# Register ACL relationship - -## Intent - -- outcome: Executable scenario: Register ACL relationship - -```gwt -Given the integration module is imported from platform-core -And the Context Map registry is available -And BC "Payments" translates ExternalGateway responses -When I register the relationship as "ACL" -Then Context Map shows Payments has ACL for ExternalGateway -``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-005-register-partnership-relationship.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-005-register-partnership-relationship.sdp.md deleted file mode 100644 index 035a8517..00000000 --- a/specs/behavior/platform-core/integration/context-map.examples/s-005-register-partnership-relationship.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.context-map.register-partnership-relationship -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.context-map ---- -# Register Partnership relationship - -## Intent - -- outcome: Executable scenario: Register Partnership relationship - -```gwt -Given the integration module is imported from platform-core -And the Context Map registry is available -And BC "Orders" and BC "Inventory" collaborate on shared model -When I register the relationship as "Partnership" -Then Context Map shows bidirectional partnership -And both BCs are listed as collaborators -``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-006-register-shared-kernel-relationship.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-006-register-shared-kernel-relationship.sdp.md deleted file mode 100644 index 8d0db0eb..00000000 --- a/specs/behavior/platform-core/integration/context-map.examples/s-006-register-shared-kernel-relationship.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.context-map.register-shared-kernel-relationship -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.context-map ---- -# Register Shared Kernel relationship - -## Intent - -- outcome: Executable scenario: Register Shared Kernel relationship - -```gwt -Given the integration module is imported from platform-core -And the Context Map registry is available -And BC "Core" provides shared types to "Orders" and "Inventory" -When I register the relationships as "Shared Kernel" -Then Context Map shows Core as shared kernel provider -And dependents include Orders and Inventory -``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-007-register-open-host-service-relationship.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-007-register-open-host-service-relationship.sdp.md deleted file mode 100644 index aecf6c2d..00000000 --- a/specs/behavior/platform-core/integration/context-map.examples/s-007-register-open-host-service-relationship.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.context-map.register-open-host-service-relationship -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.context-map ---- -# Register Open Host Service relationship - -## Intent - -- outcome: Executable scenario: Register Open Host Service relationship - -```gwt -Given the integration module is imported from platform-core -And the Context Map registry is available -And BC "Orders" exposes public API for external consumers -When I register the relationship as "Open Host Service" -Then Context Map shows Orders as OHS provider -And external consumers are documented -``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-008-query-all-relationships-for-a-bc.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-008-query-all-relationships-for-a-bc.sdp.md deleted file mode 100644 index 168ce426..00000000 --- a/specs/behavior/platform-core/integration/context-map.examples/s-008-query-all-relationships-for-a-bc.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.context-map.query-all-relationships-for-a-bc -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.context-map ---- -# Query all relationships for a BC - -## Intent - -- outcome: Executable scenario: Query all relationships for a BC - -```gwt -Given the integration module is imported from platform-core -And the Context Map registry is available -And Orders has relationships with Inventory, Shipping, and Payments -When I query relationships for "Orders" -Then I receive all 3 relationships -And each includes type and direction -``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-009-query-upstream-b-cs.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-009-query-upstream-b-cs.sdp.md deleted file mode 100644 index ed85f0f2..00000000 --- a/specs/behavior/platform-core/integration/context-map.examples/s-009-query-upstream-b-cs.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.context-map.query-upstream-b-cs -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.context-map ---- -# Query upstream BCs - -## Intent - -- outcome: Executable scenario: Query upstream BCs - -```gwt -Given the integration module is imported from platform-core -And the Context Map registry is available -And Analytics consumes from Orders, Inventory, and Payments -When I query upstream BCs for "Analytics" -Then I receive ["Orders", "Inventory", "Payments"] -``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-010-query-bc-with-no-relationships.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-010-query-bc-with-no-relationships.sdp.md deleted file mode 100644 index 7fce55da..00000000 --- a/specs/behavior/platform-core/integration/context-map.examples/s-010-query-bc-with-no-relationships.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.context-map.query-bc-with-no-relationships -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.context-map ---- -# Query BC with no relationships - -## Intent - -- outcome: Executable scenario: Query BC with no relationships - -```gwt -Given the integration module is imported from platform-core -And the Context Map registry is available -And BC "Isolated" has no registered relationships -When I query relationships for "Isolated" -Then I receive an empty array -``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-011-duplicate-relationship-is-rejected.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-011-duplicate-relationship-is-rejected.sdp.md deleted file mode 100644 index 97a7c764..00000000 --- a/specs/behavior/platform-core/integration/context-map.examples/s-011-duplicate-relationship-is-rejected.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.context-map.duplicate-relationship-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.context-map ---- -# Duplicate relationship is rejected - -## Intent - -- outcome: Executable scenario: Duplicate relationship is rejected - -```gwt -Given the integration module is imported from platform-core -And the Context Map registry is available -And relationship "Orders → Inventory" already exists -When I attempt to register "Orders → Inventory" again -Then an error is thrown with code "DUPLICATE_RELATIONSHIP" -``` diff --git a/specs/behavior/platform-core/integration/context-map.examples/s-012-self-referential-relationship-is-rejected.sdp.md b/specs/behavior/platform-core/integration/context-map.examples/s-012-self-referential-relationship-is-rejected.sdp.md deleted file mode 100644 index 4594d11a..00000000 --- a/specs/behavior/platform-core/integration/context-map.examples/s-012-self-referential-relationship-is-rejected.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.context-map.self-referential-relationship-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.context-map ---- -# Self-referential relationship is rejected - -## Intent - -- outcome: Executable scenario: Self-referential relationship is rejected - -```gwt -Given the integration module is imported from platform-core -And the Context Map registry is available -When I attempt to register "Orders → Orders" -Then an error is thrown with code "SELF_REFERENCE" -``` diff --git a/specs/behavior/platform-core/integration/context-map.sdp.md b/specs/behavior/platform-core/integration/context-map.sdp.md index 44192bd9..aef47c72 100644 --- a/specs/behavior/platform-core/integration/context-map.sdp.md +++ b/specs/behavior/platform-core/integration/context-map.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.integration.context-map kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: BC relationships documented in a Context Map so that integration points are explicit and maintainable +- outcome: Document bounded-context relationships in a Context Map so integration points stay explicit and maintainable. +- value: DDD relationship types, topology queries, and consistency checks keep the map valid. ## Behavior diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-001-generate-sample-from-schema.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-001-generate-sample-from-schema.sdp.md deleted file mode 100644 index 58e40f38..00000000 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-001-generate-sample-from-schema.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.contract-testing.generate-sample-from-schema -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.contract-testing ---- -# Generate sample from schema - -## Intent - -- outcome: Executable scenario: Generate sample from schema - -```gwt -Given the integration module is imported from platform-core -And contract testing utilities are available -And a registered schema "OrderSubmittedV1" -When I call createContractSample('OrderSubmittedV1') -Then a valid sample event is generated -And it passes OrderSubmittedV1 schema validation -``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-002-generate-sample-with-overrides.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-002-generate-sample-with-overrides.sdp.md deleted file mode 100644 index 3c6410ad..00000000 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-002-generate-sample-with-overrides.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.contract-testing.generate-sample-with-overrides -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.contract-testing ---- -# Generate sample with overrides - -## Intent - -- outcome: Executable scenario: Generate sample with overrides - -```gwt -Given the integration module is imported from platform-core -And contract testing utilities are available -And a registered schema "OrderSubmittedV1" -When I call createContractSample('OrderSubmittedV1', { orderId: 'custom_123' }) -Then sample.orderId equals "custom_123" -And other fields have generated values -``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-003-generate-multiple-samples.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-003-generate-multiple-samples.sdp.md deleted file mode 100644 index 4df34e86..00000000 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-003-generate-multiple-samples.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.contract-testing.generate-multiple-samples -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.contract-testing ---- -# Generate multiple samples - -## Intent - -- outcome: Executable scenario: Generate multiple samples - -```gwt -Given the integration module is imported from platform-core -And contract testing utilities are available -And a registered schema "OrderSubmittedV1" -When I call createContractSamples('OrderSubmittedV1', 10) -Then I receive 10 unique sample events -And all pass schema validation -``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-004-producer-emits-valid-event.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-004-producer-emits-valid-event.sdp.md deleted file mode 100644 index 0e11f0b9..00000000 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-004-producer-emits-valid-event.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.contract-testing.producer-emits-valid-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.contract-testing ---- -# Producer emits valid event - -## Intent - -- outcome: Executable scenario: Producer emits valid event - -```gwt -Given the integration module is imported from platform-core -And contract testing utilities are available -And a producer function that creates OrderSubmitted events -When I run createProducerContractTest('OrderSubmittedV1', producer) -Then test passes when producer emits valid V1 events -``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-005-producer-emits-invalid-event.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-005-producer-emits-invalid-event.sdp.md deleted file mode 100644 index 6b96c5c2..00000000 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-005-producer-emits-invalid-event.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.contract-testing.producer-emits-invalid-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.contract-testing ---- -# Producer emits invalid event - -## Intent - -- outcome: Executable scenario: Producer emits invalid event - -```gwt -Given the integration module is imported from platform-core -And contract testing utilities are available -And a producer that emits events missing "orderId" -When I run createProducerContractTest('OrderSubmittedV1', producer) -Then test fails with "SCHEMA_VALIDATION_FAILED" -And error identifies missing field -``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-006-producer-emits-wrong-version.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-006-producer-emits-wrong-version.sdp.md deleted file mode 100644 index f706d21a..00000000 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-006-producer-emits-wrong-version.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.contract-testing.producer-emits-wrong-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.contract-testing ---- -# Producer emits wrong version - -## Intent - -- outcome: Executable scenario: Producer emits wrong version - -```gwt -Given the integration module is imported from platform-core -And contract testing utilities are available -And a producer emitting V2 events -When I run createProducerContractTest('OrderSubmittedV1', producer) -Then test fails with "VERSION_MISMATCH" -``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-007-consumer-processes-valid-event.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-007-consumer-processes-valid-event.sdp.md deleted file mode 100644 index 44c2272d..00000000 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-007-consumer-processes-valid-event.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.contract-testing.consumer-processes-valid-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.contract-testing ---- -# Consumer processes valid event - -## Intent - -- outcome: Executable scenario: Consumer processes valid event - -```gwt -Given the integration module is imported from platform-core -And contract testing utilities are available -And a consumer handler for OrderSubmitted -When I run createConsumerContractTest('OrderSubmittedV1', consumer) -Then test passes when consumer processes sample events -``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-008-consumer-handles-all-sample-variations.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-008-consumer-handles-all-sample-variations.sdp.md deleted file mode 100644 index 5b156af0..00000000 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-008-consumer-handles-all-sample-variations.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.contract-testing.consumer-handles-all-sample-variations -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.contract-testing ---- -# Consumer handles all sample variations - -## Intent - -- outcome: Executable scenario: Consumer handles all sample variations - -```gwt -Given the integration module is imported from platform-core -And contract testing utilities are available -And a consumer handler for OrderSubmitted -When I run createConsumerContractTest with 100 samples -Then consumer successfully processes all 100 samples -``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-009-consumer-rejects-valid-event.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-009-consumer-rejects-valid-event.sdp.md deleted file mode 100644 index 5113c033..00000000 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-009-consumer-rejects-valid-event.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.contract-testing.consumer-rejects-valid-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.contract-testing ---- -# Consumer rejects valid event - -## Intent - -- outcome: Executable scenario: Consumer rejects valid event - -```gwt -Given the integration module is imported from platform-core -And contract testing utilities are available -And a consumer that throws on valid V1 events -When I run createConsumerContractTest('OrderSubmittedV1', consumer) -Then test fails with "CONSUMER_REJECTED_VALID_EVENT" -``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-010-compatible-producer-and-consumer.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-010-compatible-producer-and-consumer.sdp.md deleted file mode 100644 index faa69105..00000000 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-010-compatible-producer-and-consumer.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.contract-testing.compatible-producer-and-consumer -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.contract-testing ---- -# Compatible producer and consumer - -## Intent - -- outcome: Executable scenario: Compatible producer and consumer - -```gwt -Given the integration module is imported from platform-core -And contract testing utilities are available -And producer emitting OrderSubmittedV1 -And consumer expecting OrderSubmittedV1 -When I run verifyContractCompatibility(producer, consumer, 'OrderSubmittedV1') -Then verification passes -``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-011-incompatible-versions-detected.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-011-incompatible-versions-detected.sdp.md deleted file mode 100644 index dc2f2b52..00000000 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-011-incompatible-versions-detected.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.contract-testing.incompatible-versions-detected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.contract-testing ---- -# Incompatible versions detected - -## Intent - -- outcome: Executable scenario: Incompatible versions detected - -```gwt -Given the integration module is imported from platform-core -And contract testing utilities are available -And producer emitting OrderSubmittedV2 -And consumer expecting OrderSubmittedV1 -And no downcaster registered -When I run verifyContractCompatibility(producer, consumer) -Then verification fails with "SCHEMA_MISMATCH" -And suggestion mentions "register downcaster V2 → V1" -``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-012-compatible-with-downcaster.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-012-compatible-with-downcaster.sdp.md deleted file mode 100644 index 51ad977f..00000000 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-012-compatible-with-downcaster.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.contract-testing.compatible-with-downcaster -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.contract-testing ---- -# Compatible with downcaster - -## Intent - -- outcome: Executable scenario: Compatible with downcaster - -```gwt -Given the integration module is imported from platform-core -And contract testing utilities are available -And producer emitting OrderSubmittedV2 -And consumer expecting OrderSubmittedV1 -And downcaster V2 → V1 is registered -When I run verifyContractCompatibility(producer, consumer) -Then verification passes -``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-013-contract-violation-is-recorded.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-013-contract-violation-is-recorded.sdp.md deleted file mode 100644 index ecb95245..00000000 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-013-contract-violation-is-recorded.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.contract-testing.contract-violation-is-recorded -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.contract-testing ---- -# Contract violation is recorded - -## Intent - -- outcome: Executable scenario: Contract violation is recorded - -```gwt -Given the integration module is imported from platform-core -And contract testing utilities are available -And a schema mismatch detected at runtime -When violation detection processes the mismatch -Then a ContractViolation is created -And it includes eventType, producerVersion, consumerExpectedVersion -And it includes timestamp and details -And it is passed to ContractMetrics.recordViolation() -``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-014-query-contract-violations.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-014-query-contract-violations.sdp.md deleted file mode 100644 index f96d4b62..00000000 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-014-query-contract-violations.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.contract-testing.query-contract-violations -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.contract-testing ---- -# Query contract violations - -## Intent - -- outcome: Executable scenario: Query contract violations - -```gwt -Given the integration module is imported from platform-core -And contract testing utilities are available -And multiple contract violations have been recorded -When I call contractMetrics.getViolations() -Then I receive all recorded violations -And they are sorted by timestamp descending -``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-015-query-violations-since-timestamp.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-015-query-violations-since-timestamp.sdp.md deleted file mode 100644 index 8924f5b5..00000000 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-015-query-violations-since-timestamp.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.contract-testing.query-violations-since-timestamp -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.contract-testing ---- -# Query violations since timestamp - -## Intent - -- outcome: Executable scenario: Query violations since timestamp - -```gwt -Given the integration module is imported from platform-core -And contract testing utilities are available -And violations recorded at different times -When I call contractMetrics.getViolations({ since: oneHourAgo }) -Then I receive only violations from the last hour -``` diff --git a/specs/behavior/platform-core/integration/contract-testing.examples/s-016-no-violations-returns-empty-array.sdp.md b/specs/behavior/platform-core/integration/contract-testing.examples/s-016-no-violations-returns-empty-array.sdp.md deleted file mode 100644 index 6d33ae00..00000000 --- a/specs/behavior/platform-core/integration/contract-testing.examples/s-016-no-violations-returns-empty-array.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.contract-testing.no-violations-returns-empty-array -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.contract-testing ---- -# No violations returns empty array - -## Intent - -- outcome: Executable scenario: No violations returns empty array - -```gwt -Given the integration module is imported from platform-core -And contract testing utilities are available -And no contract violations have been recorded -When I call contractMetrics.getViolations() -Then I receive an empty array -``` diff --git a/specs/behavior/platform-core/integration/contract-testing.sdp.md b/specs/behavior/platform-core/integration/contract-testing.sdp.md index 4249a67f..08294283 100644 --- a/specs/behavior/platform-core/integration/contract-testing.sdp.md +++ b/specs/behavior/platform-core/integration/contract-testing.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.integration.contract-testing kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: utilities for contract testing integration events so that producer-consumer compatibility is validated +- outcome: Test producer-consumer compatibility of integration events with generated samples and recorded violations. +- value: Sample generation, producer tests, consumer tests, and compatibility checks catch schema drift early. ## Behavior diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-001-upcast-v1-event-to-v2.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-001-upcast-v1-event-to-v2.sdp.md deleted file mode 100644 index e022d911..00000000 --- a/specs/behavior/platform-core/integration/event-versioning.examples/s-001-upcast-v1-event-to-v2.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.event-versioning.upcast-v1-event-to-v2 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.event-versioning ---- -# Upcast V1 event to V2 - -## Intent - -- outcome: Executable scenario: Upcast V1 event to V2 - -```gwt -Given the integration module is imported from platform-core -And the versioning utilities are available -And OrderSubmittedV1 { orderId, customerId, items } -And OrderSubmittedV2 adds required "currency" field -When I register an upcaster V1 → V2 -Then upcasting V1 event adds currency: 'USD' default -``` diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-002-chain-upcasters-for-multiple-versions.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-002-chain-upcasters-for-multiple-versions.sdp.md deleted file mode 100644 index 33108c7c..00000000 --- a/specs/behavior/platform-core/integration/event-versioning.examples/s-002-chain-upcasters-for-multiple-versions.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.event-versioning.chain-upcasters-for-multiple-versions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.event-versioning ---- -# Chain upcasters for multiple versions - -## Intent - -- outcome: Executable scenario: Chain upcasters for multiple versions - -```gwt -Given the integration module is imported from platform-core -And the versioning utilities are available -And versions V1, V2, V3 with upcasters V1→V2 and V2→V3 -When I upcast a V1 event to V3 -Then both upcasters are applied in sequence -And final result is valid V3 -``` diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-003-upcast-adds-computed-field.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-003-upcast-adds-computed-field.sdp.md deleted file mode 100644 index a9f35e13..00000000 --- a/specs/behavior/platform-core/integration/event-versioning.examples/s-003-upcast-adds-computed-field.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.event-versioning.upcast-adds-computed-field -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.event-versioning ---- -# Upcast adds computed field - -## Intent - -- outcome: Executable scenario: Upcast adds computed field - -```gwt -Given the integration module is imported from platform-core -And the versioning utilities are available -And V1 has { items } array -And V2 adds computed { itemCount } -When upcasting V1 to V2 -Then itemCount equals items.length -``` diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-004-downcast-v2-event-to-v1.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-004-downcast-v2-event-to-v1.sdp.md deleted file mode 100644 index 3c90b4fd..00000000 --- a/specs/behavior/platform-core/integration/event-versioning.examples/s-004-downcast-v2-event-to-v1.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.event-versioning.downcast-v2-event-to-v1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.event-versioning ---- -# Downcast V2 event to V1 - -## Intent - -- outcome: Executable scenario: Downcast V2 event to V1 - -```gwt -Given the integration module is imported from platform-core -And the versioning utilities are available -And OrderSubmittedV2 { orderId, customerId, items, currency } -And consumer expects OrderSubmittedV1 -When I register a downcaster V2 → V1 -Then downcasting V2 event removes currency field -``` diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-005-downcast-removes-required-in-new-field.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-005-downcast-removes-required-in-new-field.sdp.md deleted file mode 100644 index 822c1969..00000000 --- a/specs/behavior/platform-core/integration/event-versioning.examples/s-005-downcast-removes-required-in-new-field.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.event-versioning.downcast-removes-required-in-new-field -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.event-versioning ---- -# Downcast removes required-in-new field - -## Intent - -- outcome: Executable scenario: Downcast removes required-in-new field - -```gwt -Given the integration module is imported from platform-core -And the versioning utilities are available -And V2 has required "priority" field -And V1 has no priority concept -When downcasting V2 to V1 -Then priority field is removed -And result is valid V1 -``` diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-006-register-schema-with-migration.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-006-register-schema-with-migration.sdp.md deleted file mode 100644 index 40aa3127..00000000 --- a/specs/behavior/platform-core/integration/event-versioning.examples/s-006-register-schema-with-migration.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.event-versioning.register-schema-with-migration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.event-versioning ---- -# Register schema with migration - -## Intent - -- outcome: Executable scenario: Register schema with migration - -```gwt -Given the integration module is imported from platform-core -And the versioning utilities are available -And OrderSubmittedV2 schema -When I register with backwardCompatible: ['1.0.0'] and provide migrate function for V1 -Then V1 events can be automatically upcasted -``` diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-007-missing-migration-path.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-007-missing-migration-path.sdp.md deleted file mode 100644 index f88f5df9..00000000 --- a/specs/behavior/platform-core/integration/event-versioning.examples/s-007-missing-migration-path.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.event-versioning.missing-migration-path -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.event-versioning ---- -# Missing migration path - -## Intent - -- outcome: Executable scenario: Missing migration path - -```gwt -Given the integration module is imported from platform-core -And the versioning utilities are available -And V1 and V3 registered -And no V2 or direct V1→V3 migration -When attempting to upcast V1 to V3 -Then an error is thrown with code "NO_MIGRATION_PATH" -``` diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-008-breaking-change-without-migration.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-008-breaking-change-without-migration.sdp.md deleted file mode 100644 index bf638d43..00000000 --- a/specs/behavior/platform-core/integration/event-versioning.examples/s-008-breaking-change-without-migration.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.event-versioning.breaking-change-without-migration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.event-versioning ---- -# Breaking change without migration - -## Intent - -- outcome: Executable scenario: Breaking change without migration - -```gwt -Given the integration module is imported from platform-core -And the versioning utilities are available -And V2 removes required V1 field "orderId" -When attempting to register V2 as backwardCompatible with V1 -Then an error is thrown with code "BREAKING_CHANGE" -And error suggests registering migration function -``` diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-009-detect-version-from-event-metadata.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-009-detect-version-from-event-metadata.sdp.md deleted file mode 100644 index 48b2f9d8..00000000 --- a/specs/behavior/platform-core/integration/event-versioning.examples/s-009-detect-version-from-event-metadata.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.event-versioning.detect-version-from-event-metadata -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.event-versioning ---- -# Detect version from event metadata - -## Intent - -- outcome: Executable scenario: Detect version from event metadata - -```gwt -Given the integration module is imported from platform-core -And the versioning utilities are available -And an event with metadata.schemaVersion: "2.0.0" -When I call detectVersion(event) -Then result equals "2.0.0" -``` diff --git a/specs/behavior/platform-core/integration/event-versioning.examples/s-010-infer-version-from-payload-shape.sdp.md b/specs/behavior/platform-core/integration/event-versioning.examples/s-010-infer-version-from-payload-shape.sdp.md deleted file mode 100644 index 029fac0d..00000000 --- a/specs/behavior/platform-core/integration/event-versioning.examples/s-010-infer-version-from-payload-shape.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.event-versioning.infer-version-from-payload-shape -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.event-versioning ---- -# Infer version from payload shape - -## Intent - -- outcome: Executable scenario: Infer version from payload shape - -```gwt -Given the integration module is imported from platform-core -And the versioning utilities are available -And an event without schemaVersion metadata -And payload matches OrderSubmittedV1 shape -When I call detectVersion(event, 'OrderSubmitted') -Then result equals "1.0.0" -``` diff --git a/specs/behavior/platform-core/integration/event-versioning.sdp.md b/specs/behavior/platform-core/integration/event-versioning.sdp.md index e0ba14b4..946b42db 100644 --- a/specs/behavior/platform-core/integration/event-versioning.sdp.md +++ b/specs/behavior/platform-core/integration/event-versioning.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.integration.event-versioning kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: integration events to support schema evolution so that old consumers continue working when schemas change +- outcome: Evolve integration event schemas so old consumers keep working when schemas change. +- value: Upcasters, downcasters, registered migrations, and version detection keep historical events loadable. ## Behavior diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-001-create-publisher-with-empty-routes.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-001-create-publisher-with-empty-routes.sdp.md deleted file mode 100644 index da50c026..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-001-create-publisher-with-empty-routes.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.create-publisher-with-empty-routes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Create publisher with empty routes - -## Intent - -- outcome: Executable scenario: Create publisher with empty routes - -```gwt -Given the module is imported from platform-core -And a mock workpool client -When a publisher is created with no routes -Then getRoutes returns 0 routes -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-002-create-publisher-with-one-route.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-002-create-publisher-with-one-route.sdp.md deleted file mode 100644 index 0ff3bcaf..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-002-create-publisher-with-one-route.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.create-publisher-with-one-route -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Create publisher with one route - -## Intent - -- outcome: Executable scenario: Create publisher with one route - -```gwt -Given the module is imported from platform-core -And a mock workpool client -And a route from "OrderSubmitted" to "OrderPlacedIntegration" with schema version 1 -When a publisher is created with that route -Then getRoutes returns 1 route -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-003-reject-duplicate-source-event-type-routes.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-003-reject-duplicate-source-event-type-routes.sdp.md deleted file mode 100644 index 6eb94c1e..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-003-reject-duplicate-source-event-type-routes.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.reject-duplicate-source-event-type-routes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Reject duplicate sourceEventType routes - -## Intent - -- outcome: Executable scenario: Reject duplicate sourceEventType routes - -```gwt -Given the module is imported from platform-core -And a mock workpool client -And two routes both mapping from "OrderSubmitted" -When a publisher is created with both routes -Then an IntegrationRouteError is thrown -And the error message contains "Duplicate route for source event type" -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-004-check-route-existence-for-registered-and-unregistered-types.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-004-check-route-existence-for-registered-and-unregistered-types.sdp.md deleted file mode 100644 index 61fe48e4..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-004-check-route-existence-for-registered-and-unregistered-types.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.check-route-existence-for-registered-and-unregistered-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Check route existence for registered and unregistered types - -## Intent - -- outcome: Executable scenario: Check route existence for registered and unregistered types - -```gwt -Given the module is imported from platform-core -And a mock workpool client -And a route from "OrderSubmitted" to "OrderPlacedIntegration" with schema version 1 -And a publisher is created with that route -When the scenario runs -Then hasRouteFor "OrderSubmitted" returns true -And hasRouteFor returns false for unregistered types: -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-005-retrieve-all-registered-routes.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-005-retrieve-all-registered-routes.sdp.md deleted file mode 100644 index 3d89ba74..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-005-retrieve-all-registered-routes.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.retrieve-all-registered-routes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Retrieve all registered routes - -## Intent - -- outcome: Executable scenario: Retrieve all registered routes - -```gwt -Given the module is imported from platform-core -And a mock workpool client -And routes are configured for source event types: -When a publisher is created with those routes -Then getRoutes returns 2 routes -And the returned routes include source event types: -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-006-return-null-when-no-route-matches.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-006-return-null-when-no-route-matches.sdp.md deleted file mode 100644 index b9f6fcd0..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-006-return-null-when-no-route-matches.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.return-null-when-no-route-matches -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Return null when no route matches - -## Intent - -- outcome: Executable scenario: Return null when no route matches - -```gwt -Given the module is imported from platform-core -And a mock workpool client -And a route from "OrderSubmitted" to "OrderPlacedIntegration" with schema version 1 -And a publisher is created with that route -When publish is called with source event type "DifferentEvent" -Then the publish result is null -And the workpool received 0 calls -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-007-translate-and-publish-a-domain-event.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-007-translate-and-publish-a-domain-event.sdp.md deleted file mode 100644 index a71d87b2..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-007-translate-and-publish-a-domain-event.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.translate-and-publish-a-domain-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Translate and publish a domain event - -## Intent - -- outcome: Executable scenario: Translate and publish a domain event - -```gwt -Given the module is imported from platform-core -And a mock workpool client -And a translating route from "OrderSubmitted" to "OrderPlacedIntegration" -And a publisher is created with that route -When publish is called with a standard source event -Then the publish result is not null -And the publish result indicates success with 1 handler invoked -And the integration event ID starts with "int_" -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-008-enqueue-multiple-handlers.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-008-enqueue-multiple-handlers.sdp.md deleted file mode 100644 index ad0a69c4..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-008-enqueue-multiple-handlers.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.enqueue-multiple-handlers -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Enqueue multiple handlers - -## Intent - -- outcome: Executable scenario: Enqueue multiple handlers - -```gwt -Given the module is imported from platform-core -And a mock workpool client -And a route from "OrderSubmitted" to "OrderPlacedIntegration" with 2 handlers -And a publisher is created with that route -When publish is called with a standard source event -Then the publish result indicates success with 2 handlers invoked -And the workpool received 2 calls -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-009-verify-integration-event-metadata-fields.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-009-verify-integration-event-metadata-fields.sdp.md deleted file mode 100644 index 2f4f1b42..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-009-verify-integration-event-metadata-fields.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.verify-integration-event-metadata-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Verify integration event metadata fields - -## Intent - -- outcome: Executable scenario: Verify integration event metadata fields - -```gwt -Given the module is imported from platform-core -And a mock workpool client -And a route from "OrderSubmitted" to "OrderPlacedIntegration" with schema version 2 and orderId translator -And a publisher is created with that route -When publish is called with a standard source event -Then the enqueued integration event has metadata: -And the enqueued integration event payload equals orderId "order_456" -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-010-include-user-id-when-present-in-chain.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-010-include-user-id-when-present-in-chain.sdp.md deleted file mode 100644 index 9c96778a..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-010-include-user-id-when-present-in-chain.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.include-user-id-when-present-in-chain -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Include userId when present in chain - -## Intent - -- outcome: Executable scenario: Include userId when present in chain - -```gwt -Given the module is imported from platform-core -And a mock workpool client -And a simple route from "OrderSubmitted" to "OrderPlacedIntegration" -And a publisher is created with that route -When publish is called with userId "user_abc" -Then the enqueued integration event userId is "user_abc" -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-011-omit-user-id-when-absent-from-chain.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-011-omit-user-id-when-absent-from-chain.sdp.md deleted file mode 100644 index 161b23ed..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-011-omit-user-id-when-absent-from-chain.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.omit-user-id-when-absent-from-chain -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Omit userId when absent from chain - -## Intent - -- outcome: Executable scenario: Omit userId when absent from chain - -```gwt -Given the module is imported from platform-core -And a mock workpool client -And a simple route from "OrderSubmitted" to "OrderPlacedIntegration" -And a publisher is created with that route -When publish is called without userId -Then the enqueued integration event userId is undefined -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-012-pass-on-complete-handler-to-workpool.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-012-pass-on-complete-handler-to-workpool.sdp.md deleted file mode 100644 index 39325eff..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-012-pass-on-complete-handler-to-workpool.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.pass-on-complete-handler-to-workpool -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Pass onComplete handler to workpool - -## Intent - -- outcome: Executable scenario: Pass onComplete handler to workpool - -```gwt -Given the module is imported from platform-core -And a mock workpool client -And a simple route from "OrderSubmitted" to "OrderPlacedIntegration" -And an onComplete handler reference -And a publisher is created with that route and onComplete -When publish is called with a standard source event -Then the workpool options include the onComplete handler -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-013-propagate-translator-error.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-013-propagate-translator-error.sdp.md deleted file mode 100644 index 2d182ad0..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-013-propagate-translator-error.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.propagate-translator-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Propagate translator error - -## Intent - -- outcome: Executable scenario: Propagate translator error - -```gwt -Given the module is imported from platform-core -And a mock workpool client -And a route with a failing translator -And a publisher is created with that route -When publish is called with a standard source event -Then the publish call rejects with "Translation failed: invalid payload structure" -And the workpool received 0 calls -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-014-verify-workpool-context-fields.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-014-verify-workpool-context-fields.sdp.md deleted file mode 100644 index 89058d60..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-014-verify-workpool-context-fields.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.verify-workpool-context-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Verify workpool context fields - -## Intent - -- outcome: Executable scenario: Verify workpool context fields - -```gwt -Given the module is imported from platform-core -And a mock workpool client -And a simple route from "OrderSubmitted" to "OrderPlacedIntegration" -And a publisher is created with that route -When publish is called with a standard source event -Then the workpool context includes: -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-015-build-a-route-with-all-required-fields.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-015-build-a-route-with-all-required-fields.sdp.md deleted file mode 100644 index 2559ed65..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-015-build-a-route-with-all-required-fields.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.build-a-route-with-all-required-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Build a route with all required fields - -## Intent - -- outcome: Executable scenario: Build a route with all required fields - -```gwt -Given the module is imported from platform-core -When a route is built with from "OrderSubmitted", to "OrderPlacedIntegration", a translator, and one handler -Then the built route sourceEventType is "OrderSubmitted" -And the built route targetEventType is "OrderPlacedIntegration" -And the built route schemaVersion defaults to 1 -And the built route has 1 handler -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-016-set-schema-version-via-version-method.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-016-set-schema-version-via-version-method.sdp.md deleted file mode 100644 index 183c550f..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-016-set-schema-version-via-version-method.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.set-schema-version-via-version-method -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Set schema version via version method - -## Intent - -- outcome: Executable scenario: Set schema version via version method - -```gwt -Given the module is imported from platform-core -When a route is built with version 3 -Then the built route schemaVersion is 3 -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-017-pass-multiple-handlers-to-notify.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-017-pass-multiple-handlers-to-notify.sdp.md deleted file mode 100644 index 670451e6..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-017-pass-multiple-handlers-to-notify.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.pass-multiple-handlers-to-notify -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Pass multiple handlers to notify - -## Intent - -- outcome: Executable scenario: Pass multiple handlers to notify - -```gwt -Given the module is imported from platform-core -When a route is built with 2 handlers via notify -Then the built route has 2 handlers -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-018-translator-function-transforms-source-event.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-018-translator-function-transforms-source-event.sdp.md deleted file mode 100644 index b19a85b7..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-018-translator-function-transforms-source-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.translator-function-transforms-source-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Translator function transforms source event - -## Intent - -- outcome: Executable scenario: Translator function transforms source event - -```gwt -Given the module is imported from platform-core -When a route is built with a translator that extracts eventId and eventType -Then invoking the translator with eventId "evt_1" and eventType "OrderSubmitted" returns the expected payload -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-019-reject-missing-source-event-type.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-019-reject-missing-source-event-type.sdp.md deleted file mode 100644 index cdd4aef1..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-019-reject-missing-source-event-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.reject-missing-source-event-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Reject missing source event type - -## Intent - -- outcome: Executable scenario: Reject missing source event type - -```gwt -Given the module is imported from platform-core -When build is called without from -Then an IntegrationRouteError is thrown with code "MISSING_SOURCE_EVENT_TYPE" -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-020-reject-missing-target-event-type.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-020-reject-missing-target-event-type.sdp.md deleted file mode 100644 index 69df3e07..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-020-reject-missing-target-event-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.reject-missing-target-event-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Reject missing target event type - -## Intent - -- outcome: Executable scenario: Reject missing target event type - -```gwt -Given the module is imported from platform-core -When build is called without to -Then an IntegrationRouteError is thrown with code "MISSING_TARGET_EVENT_TYPE" -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-021-reject-missing-translator.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-021-reject-missing-translator.sdp.md deleted file mode 100644 index 5f90bd33..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-021-reject-missing-translator.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.reject-missing-translator -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Reject missing translator - -## Intent - -- outcome: Executable scenario: Reject missing translator - -```gwt -Given the module is imported from platform-core -When build is called without translate -Then an IntegrationRouteError is thrown with code "MISSING_TRANSLATOR" -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-022-reject-missing-handlers.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-022-reject-missing-handlers.sdp.md deleted file mode 100644 index 1dc64478..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-022-reject-missing-handlers.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.reject-missing-handlers -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Reject missing handlers - -## Intent - -- outcome: Executable scenario: Reject missing handlers - -```gwt -Given the module is imported from platform-core -When build is called without notify -Then an IntegrationRouteError is thrown with code "MISSING_HANDLERS" -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-023-build-route-via-define-integration-route-factory.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-023-build-route-via-define-integration-route-factory.sdp.md deleted file mode 100644 index 852f4817..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-023-build-route-via-define-integration-route-factory.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.build-route-via-define-integration-route-factory -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Build route via defineIntegrationRoute factory - -## Intent - -- outcome: Executable scenario: Build route via defineIntegrationRoute factory - -```gwt -Given the module is imported from platform-core -When a route is built using defineIntegrationRoute -Then the built route sourceEventType is "OrderSubmitted" -And the built route targetEventType is "OrderPlacedIntegration" -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-024-create-publisher-via-factory-function.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-024-create-publisher-via-factory-function.sdp.md deleted file mode 100644 index 5530b821..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-024-create-publisher-via-factory-function.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.create-publisher-via-factory-function -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Create publisher via factory function - -## Intent - -- outcome: Executable scenario: Create publisher via factory function - -```gwt -Given the module is imported from platform-core -And a mock workpool client -When a publisher is created using createIntegrationPublisher with one route -Then hasRouteFor "OrderSubmitted" returns true on the factory publisher -And getRoutes returns 1 route on the factory publisher -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-025-verify-integration-route-error-properties.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-025-verify-integration-route-error-properties.sdp.md deleted file mode 100644 index 2ec4cba5..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-025-verify-integration-route-error-properties.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.verify-integration-route-error-properties -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Verify IntegrationRouteError properties - -## Intent - -- outcome: Executable scenario: Verify IntegrationRouteError properties - -```gwt -Given the module is imported from platform-core -When an IntegrationRouteError is created with code "MISSING_TRANSLATOR" and message "Test message" -Then the error name is "IntegrationRouteError" -And the error code is "MISSING_TRANSLATOR" -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-026-verify-integration-route-error-with-context.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-026-verify-integration-route-error-with-context.sdp.md deleted file mode 100644 index 8cf11b3b..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-026-verify-integration-route-error-with-context.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.verify-integration-route-error-with-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Verify IntegrationRouteError with context - -## Intent - -- outcome: Executable scenario: Verify IntegrationRouteError with context - -```gwt -Given the module is imported from platform-core -When an IntegrationRouteError is created with code "DUPLICATE_SOURCE_EVENT_TYPE", message "Test", and context sourceEventType "OrderSubmitted" -Then the error context equals sourceEventType "OrderSubmitted" -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-027-verify-integration-route-error-instanceof-chain.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-027-verify-integration-route-error-instanceof-chain.sdp.md deleted file mode 100644 index 84d5c59b..00000000 --- a/specs/behavior/platform-core/integration/integration-event-publisher.examples/s-027-verify-integration-route-error-instanceof-chain.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.integration-event-publisher.verify-integration-route-error-instanceof-chain -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.integration-event-publisher ---- -# Verify IntegrationRouteError instanceof chain - -## Intent - -- outcome: Executable scenario: Verify IntegrationRouteError instanceof chain - -```gwt -Given the module is imported from platform-core -When an IntegrationRouteError is created with code "MISSING_HANDLERS" and message "Test" -Then the error is an instance of Error -And the error is an instance of IntegrationRouteError -``` diff --git a/specs/behavior/platform-core/integration/integration-event-publisher.sdp.md b/specs/behavior/platform-core/integration/integration-event-publisher.sdp.md index d98a6fe0..508c033d 100644 --- a/specs/behavior/platform-core/integration/integration-event-publisher.sdp.md +++ b/specs/behavior/platform-core/integration/integration-event-publisher.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.integration.integration-event-publisher kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: an integration event publisher that translates domain events into integration events so that bounded contexts can communicate through well-defined published language contracts +- outcome: Translate domain events into integration events and route them so bounded contexts communicate through published-language contracts. +- value: Unique source routes, correlation metadata, and workpool enqueue keep translation and delivery explicit. ## Behavior diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-001-register-integration-event-schema.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-001-register-integration-event-schema.sdp.md deleted file mode 100644 index 5f8919eb..00000000 --- a/specs/behavior/platform-core/integration/published-language.examples/s-001-register-integration-event-schema.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.published-language.register-integration-event-schema -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.published-language ---- -# Register integration event schema - -## Intent - -- outcome: Executable scenario: Register integration event schema - -```gwt -Given the integration module is imported from platform-core -And the Published Language registry is available -And event type "OrderSubmitted" -And schema version "1.0.0" -When I call registerIntegrationSchema({ eventType, version, schema }) -Then the schema is available in the registry -And getSchema('OrderSubmitted', '1.0.0') returns the schema -``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-002-register-multiple-versions.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-002-register-multiple-versions.sdp.md deleted file mode 100644 index ca0ca2a7..00000000 --- a/specs/behavior/platform-core/integration/published-language.examples/s-002-register-multiple-versions.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.published-language.register-multiple-versions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.published-language ---- -# Register multiple versions - -## Intent - -- outcome: Executable scenario: Register multiple versions - -```gwt -Given the integration module is imported from platform-core -And the Published Language registry is available -And "OrderSubmitted" version "1.0.0" is registered -When I register "OrderSubmitted" version "2.0.0" -Then both versions are available -And getLatestVersion('OrderSubmitted') returns "2.0.0" -``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-003-duplicate-version-is-rejected.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-003-duplicate-version-is-rejected.sdp.md deleted file mode 100644 index c3a1446d..00000000 --- a/specs/behavior/platform-core/integration/published-language.examples/s-003-duplicate-version-is-rejected.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.published-language.duplicate-version-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.published-language ---- -# Duplicate version is rejected - -## Intent - -- outcome: Executable scenario: Duplicate version is rejected - -```gwt -Given the integration module is imported from platform-core -And the Published Language registry is available -And "OrderSubmitted" version "1.0.0" is registered -When I attempt to register "OrderSubmitted" version "1.0.0" again -Then an error is thrown with code "VERSION_EXISTS" -``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-004-convert-domain-event-to-integration-event.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-004-convert-domain-event-to-integration-event.sdp.md deleted file mode 100644 index 1b49bf72..00000000 --- a/specs/behavior/platform-core/integration/published-language.examples/s-004-convert-domain-event-to-integration-event.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.published-language.convert-domain-event-to-integration-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.published-language ---- -# Convert domain event to integration event - -## Intent - -- outcome: Executable scenario: Convert domain event to integration event - -```gwt -Given the integration module is imported from platform-core -And the Published Language registry is available -And a registered schema for "OrderSubmitted" v1.0.0 -And a domain OrderSubmitted event with orderId and customerId -When I call toPublishedLanguage('OrderSubmitted', payload) -Then result.type equals "OrderSubmitted" -And result.payload contains orderId and customerId -And result.metadata.schemaVersion equals "1.0.0" -And result.metadata.timestamp is set -``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-005-convert-with-explicit-version.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-005-convert-with-explicit-version.sdp.md deleted file mode 100644 index c3696bce..00000000 --- a/specs/behavior/platform-core/integration/published-language.examples/s-005-convert-with-explicit-version.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.published-language.convert-with-explicit-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.published-language ---- -# Convert with explicit version - -## Intent - -- outcome: Executable scenario: Convert with explicit version - -```gwt -Given the integration module is imported from platform-core -And the Published Language registry is available -And "OrderSubmitted" versions "1.0.0" and "2.0.0" are registered -When I call toPublishedLanguage('OrderSubmitted', payload, { version: '1.0.0' }) -Then result.metadata.schemaVersion equals "1.0.0" -``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-006-unregistered-event-type-fails.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-006-unregistered-event-type-fails.sdp.md deleted file mode 100644 index b3cda58a..00000000 --- a/specs/behavior/platform-core/integration/published-language.examples/s-006-unregistered-event-type-fails.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.published-language.unregistered-event-type-fails -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.published-language ---- -# Unregistered event type fails - -## Intent - -- outcome: Executable scenario: Unregistered event type fails - -```gwt -Given the integration module is imported from platform-core -And the Published Language registry is available -And no schema registered for "UnknownEvent" -When I call toPublishedLanguage('UnknownEvent', payload) -Then an error is thrown with code "SCHEMA_NOT_FOUND" -``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-007-invalid-payload-fails-schema-validation.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-007-invalid-payload-fails-schema-validation.sdp.md deleted file mode 100644 index aee47fde..00000000 --- a/specs/behavior/platform-core/integration/published-language.examples/s-007-invalid-payload-fails-schema-validation.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.published-language.invalid-payload-fails-schema-validation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.published-language ---- -# Invalid payload fails schema validation - -## Intent - -- outcome: Executable scenario: Invalid payload fails schema validation - -```gwt -Given the integration module is imported from platform-core -And the Published Language registry is available -And a registered schema requiring "orderId" field -When I call toPublishedLanguage('OrderSubmitted', {}) -Then an error is thrown with code "SCHEMA_VALIDATION_FAILED" -And error details mention missing "orderId" -``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-008-event-tagging-for-routing-and-dcb.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-008-event-tagging-for-routing-and-dcb.sdp.md deleted file mode 100644 index c19d80b5..00000000 --- a/specs/behavior/platform-core/integration/published-language.examples/s-008-event-tagging-for-routing-and-dcb.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.published-language.event-tagging-for-routing-and-dcb -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.published-language ---- -# Event tagging for routing and DCB - -## Intent - -- outcome: Executable scenario: Event tagging for routing and DCB - -```gwt -Given the integration module is imported from platform-core -And the Published Language registry is available -And a registered schema for "OrderSubmitted" v1.0.0 -And a domain event with customerId "cust_456" -When I call toPublishedLanguage('OrderSubmitted', payload, { tags: { customerId: 'cust_456' } }) -Then result.metadata.tags contains customerId -And tags can be used for DCB consistency queries -``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-009-multiple-tags-for-routing.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-009-multiple-tags-for-routing.sdp.md deleted file mode 100644 index 4be17593..00000000 --- a/specs/behavior/platform-core/integration/published-language.examples/s-009-multiple-tags-for-routing.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.published-language.multiple-tags-for-routing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.published-language ---- -# Multiple tags for routing - -## Intent - -- outcome: Executable scenario: Multiple tags for routing - -```gwt -Given the integration module is imported from platform-core -And the Published Language registry is available -And a registered schema for "OrderSubmitted" v1.0.0 -When I call toPublishedLanguage with tags { customerId: 'cust_456', region: 'US' } -Then result.metadata.tags contains both customerId and region -``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-010-register-schema-with-compatibility-mode.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-010-register-schema-with-compatibility-mode.sdp.md deleted file mode 100644 index 8f800929..00000000 --- a/specs/behavior/platform-core/integration/published-language.examples/s-010-register-schema-with-compatibility-mode.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.published-language.register-schema-with-compatibility-mode -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.published-language ---- -# Register schema with compatibility mode - -## Intent - -- outcome: Executable scenario: Register schema with compatibility mode - -```gwt -Given the integration module is imported from platform-core -And the Published Language registry is available -And a new integration event type "InventoryReserved" -When I register with version "1.0.0" and compatibility "backward" -Then the schema is available in the registry -And compatibility mode is stored with the schema -``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-011-query-schema-compatibility-mode.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-011-query-schema-compatibility-mode.sdp.md deleted file mode 100644 index 68c572d9..00000000 --- a/specs/behavior/platform-core/integration/published-language.examples/s-011-query-schema-compatibility-mode.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.published-language.query-schema-compatibility-mode -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.published-language ---- -# Query schema compatibility mode - -## Intent - -- outcome: Executable scenario: Query schema compatibility mode - -```gwt -Given the integration module is imported from platform-core -And the Published Language registry is available -And "OrderSubmitted" v2.0.0 registered with compatibility "full" -When I call getSchema('OrderSubmitted', '2.0.0') -Then result.compatibility equals "full" -``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-012-list-all-event-types.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-012-list-all-event-types.sdp.md deleted file mode 100644 index 8e5c56c7..00000000 --- a/specs/behavior/platform-core/integration/published-language.examples/s-012-list-all-event-types.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.published-language.list-all-event-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.published-language ---- -# List all event types - -## Intent - -- outcome: Executable scenario: List all event types - -```gwt -Given the integration module is imported from platform-core -And the Published Language registry is available -And schemas registered for "OrderSubmitted", "OrderConfirmed", "PaymentReceived" -When I call listEventTypes() -Then I receive ["OrderSubmitted", "OrderConfirmed", "PaymentReceived"] -``` diff --git a/specs/behavior/platform-core/integration/published-language.examples/s-013-list-versions-for-event-type.sdp.md b/specs/behavior/platform-core/integration/published-language.examples/s-013-list-versions-for-event-type.sdp.md deleted file mode 100644 index a891682d..00000000 --- a/specs/behavior/platform-core/integration/published-language.examples/s-013-list-versions-for-event-type.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.integration.published-language.list-versions-for-event-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.integration.published-language ---- -# List versions for event type - -## Intent - -- outcome: Executable scenario: List versions for event type - -```gwt -Given the integration module is imported from platform-core -And the Published Language registry is available -And "OrderSubmitted" has versions "1.0.0", "1.1.0", "2.0.0" -When I call listVersions('OrderSubmitted') -Then I receive ["1.0.0", "1.1.0", "2.0.0"] -``` diff --git a/specs/behavior/platform-core/integration/published-language.sdp.md b/specs/behavior/platform-core/integration/published-language.sdp.md index 28cfa0ac..ee21c969 100644 --- a/specs/behavior/platform-core/integration/published-language.sdp.md +++ b/specs/behavior/platform-core/integration/published-language.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.integration.published-language kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: a registry of versioned integration event schemas so that cross-BC communication has stable contracts +- outcome: Register versioned integration event schemas so cross-BC communication has stable contracts. +- value: toPublishedLanguage converts domain events, and the registry answers schema and version queries. ## Behavior diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-001-set-contains-all-provided-invariants.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-001-set-contains-all-provided-invariants.sdp.md deleted file mode 100644 index e86e0d5a..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-001-set-contains-all-provided-invariants.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant-set.set-contains-all-provided-invariants -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant-set ---- -# Set contains all provided invariants - -## Intent - -- outcome: Executable scenario: Set contains all provided invariants - -```gwt -Given an invariant set with "isDraft" and "hasItems" -When the scenario runs -Then the set has the following invariant names: -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-002-invariants-array-is-immutable-and-a-frozen-copy.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-002-invariants-array-is-immutable-and-a-frozen-copy.sdp.md deleted file mode 100644 index c309b14d..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-002-invariants-array-is-immutable-and-a-frozen-copy.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant-set.invariants-array-is-immutable-and-a-frozen-copy -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant-set ---- -# Invariants array is immutable and a frozen copy - -## Intent - -- outcome: Executable scenario: Invariants array is immutable and a frozen copy - -```gwt -Given an invariant set with "isDraft" and "hasItems" from a mutable array -When the scenario runs -Then the invariants array is frozen -And mutating the original array does not affect the set -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-003-check-all-returns-true-when-all-invariants-pass.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-003-check-all-returns-true-when-all-invariants-pass.sdp.md deleted file mode 100644 index 8c679bbd..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-003-check-all-returns-true-when-all-invariants-pass.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant-set.check-all-returns-true-when-all-invariants-pass -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant-set ---- -# checkAll returns true when all invariants pass - -## Intent - -- outcome: Executable scenario: checkAll returns true when all invariants pass - -```gwt -Given an invariant set with "isDraft" and "hasItems" -When I checkAll with status "draft" and 1 item -Then the checkAll result is true -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-004-check-all-returns-false-when-first-invariant-fails.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-004-check-all-returns-false-when-first-invariant-fails.sdp.md deleted file mode 100644 index d6a67280..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-004-check-all-returns-false-when-first-invariant-fails.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant-set.check-all-returns-false-when-first-invariant-fails -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant-set ---- -# checkAll returns false when first invariant fails - -## Intent - -- outcome: Executable scenario: checkAll returns false when first invariant fails - -```gwt -Given an invariant set with "isDraft" and "hasItems" -When I checkAll with status "submitted" and 1 item -Then the checkAll result is false -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-005-check-all-returns-false-when-second-invariant-fails.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-005-check-all-returns-false-when-second-invariant-fails.sdp.md deleted file mode 100644 index 5c2279b8..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-005-check-all-returns-false-when-second-invariant-fails.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant-set.check-all-returns-false-when-second-invariant-fails -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant-set ---- -# checkAll returns false when second invariant fails - -## Intent - -- outcome: Executable scenario: checkAll returns false when second invariant fails - -```gwt -Given an invariant set with "isDraft" and "hasItems" -When I checkAll with status "draft" and 0 items -Then the checkAll result is false -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-006-check-all-returns-false-when-all-invariants-fail.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-006-check-all-returns-false-when-all-invariants-fail.sdp.md deleted file mode 100644 index a7fefda9..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-006-check-all-returns-false-when-all-invariants-fail.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant-set.check-all-returns-false-when-all-invariants-fail -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant-set ---- -# checkAll returns false when all invariants fail - -## Intent - -- outcome: Executable scenario: checkAll returns false when all invariants fail - -```gwt -Given an invariant set with "isDraft" and "hasItems" -When I checkAll with status "submitted" and 0 items -Then the checkAll result is false -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-007-assert-all-does-not-throw-when-all-invariants-pass.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-007-assert-all-does-not-throw-when-all-invariants-pass.sdp.md deleted file mode 100644 index 2c85071e..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-007-assert-all-does-not-throw-when-all-invariants-pass.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant-set.assert-all-does-not-throw-when-all-invariants-pass -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant-set ---- -# assertAll does not throw when all invariants pass - -## Intent - -- outcome: Executable scenario: assertAll does not throw when all invariants pass - -```gwt -Given an invariant set with "isDraft", "hasItems", and "notTooManyItems" -When I assertAll with status "draft" and 1 item -Then no assertAll error is thrown -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-008-assert-all-throws-on-first-failure-with-fail-fast.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-008-assert-all-throws-on-first-failure-with-fail-fast.sdp.md deleted file mode 100644 index 606ad4d1..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-008-assert-all-throws-on-first-failure-with-fail-fast.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant-set.assert-all-throws-on-first-failure-with-fail-fast -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant-set ---- -# assertAll throws on first failure with fail-fast - -## Intent - -- outcome: Executable scenario: assertAll throws on first failure with fail-fast - -```gwt -Given an invariant set with "isDraft", "hasItems", and "notTooManyItems" -When I assertAll with status "submitted" and 0 items -Then the assertAll error has code "NOT_DRAFT" -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-009-assert-all-throws-correct-error-class.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-009-assert-all-throws-correct-error-class.sdp.md deleted file mode 100644 index 6e3138fa..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-009-assert-all-throws-correct-error-class.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant-set.assert-all-throws-correct-error-class -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant-set ---- -# assertAll throws correct error class - -## Intent - -- outcome: Executable scenario: assertAll throws correct error class - -```gwt -Given an invariant set with "isDraft", "hasItems", and "notTooManyItems" -When I assertAll with status "confirmed" and 1 item -Then the assertAll error is an instance of TestInvariantError and InvariantError -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-010-assert-all-throws-error-with-context-when-provided.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-010-assert-all-throws-error-with-context-when-provided.sdp.md deleted file mode 100644 index afb56027..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-010-assert-all-throws-error-with-context-when-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant-set.assert-all-throws-error-with-context-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant-set ---- -# assertAll throws error with context when provided - -## Intent - -- outcome: Executable scenario: assertAll throws error with context when provided - -```gwt -Given an invariant set with "isDraft", "hasItems", and "notTooManyItems" -When I assertAll with orderId "order-123" and status "submitted" and 1 item -Then the assertAll error has context with orderId "order-123" -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-011-validate-all-returns-valid-when-all-invariants-pass.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-011-validate-all-returns-valid-when-all-invariants-pass.sdp.md deleted file mode 100644 index 52e6523b..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-011-validate-all-returns-valid-when-all-invariants-pass.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant-set.validate-all-returns-valid-when-all-invariants-pass -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant-set ---- -# validateAll returns valid when all invariants pass - -## Intent - -- outcome: Executable scenario: validateAll returns valid when all invariants pass - -```gwt -Given an invariant set with "isDraft", "hasItems", and "notTooManyItems" -When I validateAll with status "draft" and 1 item -Then the validateAll result is valid -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-012-validate-all-collects-single-violation.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-012-validate-all-collects-single-violation.sdp.md deleted file mode 100644 index 484433b4..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-012-validate-all-collects-single-violation.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant-set.validate-all-collects-single-violation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant-set ---- -# validateAll collects single violation - -## Intent - -- outcome: Executable scenario: validateAll collects single violation - -```gwt -Given an invariant set with "isDraft", "hasItems", and "notTooManyItems" -When I validateAll with orderId "order-123" and status "submitted" and 1 item -Then the validateAll result is invalid with 1 violation -And the validateAll violation 0 has: -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-013-validate-all-collects-multiple-violations-without-short-circuiting.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-013-validate-all-collects-multiple-violations-without-short-circuiting.sdp.md deleted file mode 100644 index 8a17025f..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-013-validate-all-collects-multiple-violations-without-short-circuiting.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant-set.validate-all-collects-multiple-violations-without-short-circuiting -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant-set ---- -# validateAll collects multiple violations without short-circuiting - -## Intent - -- outcome: Executable scenario: validateAll collects multiple violations without short-circuiting - -```gwt -Given an invariant set with "isDraft", "hasItems", and "notTooManyItems" -When I validateAll with status "submitted" and 0 items -Then the validateAll result is invalid with 2 violations -And the validateAll violation codes include: -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-014-validate-all-collects-violations-from-non-adjacent-invariants.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-014-validate-all-collects-violations-from-non-adjacent-invariants.sdp.md deleted file mode 100644 index 376bb736..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-014-validate-all-collects-violations-from-non-adjacent-invariants.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant-set.validate-all-collects-violations-from-non-adjacent-invariants -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant-set ---- -# validateAll collects violations from non-adjacent invariants - -## Intent - -- outcome: Executable scenario: validateAll collects violations from non-adjacent invariants - -```gwt -Given an invariant set with "isDraft", "hasItems", and "notTooManyItems" -When I validateAll with status "submitted" and 15 items -Then the validateAll result is invalid with 2 violations -And the validateAll violation codes include: -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-015-validate-all-omits-context-when-invariant-has-no-context-function.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-015-validate-all-omits-context-when-invariant-has-no-context-function.sdp.md deleted file mode 100644 index 1476761d..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-015-validate-all-omits-context-when-invariant-has-no-context-function.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant-set.validate-all-omits-context-when-invariant-has-no-context-function -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant-set ---- -# validateAll omits context when invariant has no context function - -## Intent - -- outcome: Executable scenario: validateAll omits context when invariant has no context function - -```gwt -Given an invariant set with "isDraft", "hasItems", and "notTooManyItems" -When I validateAll with status "draft" and 0 items -Then the validateAll result is invalid with 1 violation -And the validateAll violation 0 has code "NO_ITEMS" and undefined context -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-016-empty-set-passes-all-operations.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-016-empty-set-passes-all-operations.sdp.md deleted file mode 100644 index b41c18a4..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-016-empty-set-passes-all-operations.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant-set.empty-set-passes-all-operations -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant-set ---- -# Empty set passes all operations - -## Intent - -- outcome: Executable scenario: Empty set passes all operations - -```gwt -Given an empty invariant set -When the scenario runs -Then checkAll returns true for the empty set -And assertAll does not throw for the empty set -And validateAll returns valid for the empty set -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-017-single-invariant-set-passes-all-operations-with-valid-state.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-017-single-invariant-set-passes-all-operations-with-valid-state.sdp.md deleted file mode 100644 index 4abca2c2..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant-set.examples/s-017-single-invariant-set-passes-all-operations-with-valid-state.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant-set.single-invariant-set-passes-all-operations-with-valid-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant-set ---- -# Single invariant set passes all operations with valid state - -## Intent - -- outcome: Executable scenario: Single invariant set passes all operations with valid state - -```gwt -Given a single invariant set with "isDraft" -When I operate on the single set with status "draft" -Then the single set checkAll result is true -And the single set assertAll does not throw -And the single set validateAll returns valid -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant-set.sdp.md b/specs/behavior/platform-core/invariants/create-invariant-set.sdp.md index 9ef1f670..e1e3ee2a 100644 --- a/specs/behavior/platform-core/invariants/create-invariant-set.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant-set.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.invariants.create-invariant-set kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a domain developer -- outcome: to group invariants into a set and validate them together so that I can check, assert, or validate multiple domain rules in one call +- outcome: Group invariants into a set and validate them together so multiple domain rules can be checked, asserted, or validated in one call. +- value: checkAll, assertAll, and validateAll share the same invariant list while keeping fail-fast versus collect-all semantics. ## Behavior diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-001-invariant-has-correct-name-and-code.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-001-invariant-has-correct-name-and-code.sdp.md deleted file mode 100644 index 42abec1b..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-001-invariant-has-correct-name-and-code.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant.invariant-has-correct-name-and-code -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant ---- -# Invariant has correct name and code - -## Intent - -- outcome: Executable scenario: Invariant has correct name and code - -```gwt -Given a "isDraft" invariant with code "NOT_DRAFT" for draft status -When the scenario runs -Then the invariant has the following identity: -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-002-check-returns-true-when-state-satisfies-the-predicate.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-002-check-returns-true-when-state-satisfies-the-predicate.sdp.md deleted file mode 100644 index f2b3f15b..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-002-check-returns-true-when-state-satisfies-the-predicate.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant.check-returns-true-when-state-satisfies-the-predicate -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant ---- -# check returns true when state satisfies the predicate - -## Intent - -- outcome: Executable scenario: check returns true when state satisfies the predicate - -```gwt -Given a "isDraft" invariant with code "NOT_DRAFT" for draft status -When I check a state with status "draft" -Then the check result is true -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-003-check-returns-false-when-state-violates-the-predicate.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-003-check-returns-false-when-state-violates-the-predicate.sdp.md deleted file mode 100644 index 954ad02a..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-003-check-returns-false-when-state-violates-the-predicate.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant.check-returns-false-when-state-violates-the-predicate -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant ---- -# check returns false when state violates the predicate - -## Intent - -- outcome: Executable scenario: check returns false when state violates the predicate - -```gwt -Given a "isDraft" invariant with code "NOT_DRAFT" for draft status -When I check a state with status "submitted" -Then the check result is false -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-004-assert-does-not-throw-when-state-is-valid.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-004-assert-does-not-throw-when-state-is-valid.sdp.md deleted file mode 100644 index aedffab9..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-004-assert-does-not-throw-when-state-is-valid.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant.assert-does-not-throw-when-state-is-valid -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant ---- -# assert does not throw when state is valid - -## Intent - -- outcome: Executable scenario: assert does not throw when state is valid - -```gwt -Given a "isDraft" invariant with code "NOT_DRAFT" for draft status -When I assert a state with status "draft" -Then no error is thrown -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-005-assert-throws-invariant-error-when-state-is-invalid.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-005-assert-throws-invariant-error-when-state-is-invalid.sdp.md deleted file mode 100644 index 4f7370d0..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-005-assert-throws-invariant-error-when-state-is-invalid.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant.assert-throws-invariant-error-when-state-is-invalid -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant ---- -# assert throws InvariantError when state is invalid - -## Intent - -- outcome: Executable scenario: assert throws InvariantError when state is invalid - -```gwt -Given a "isDraft" invariant with code "NOT_DRAFT" for draft status -When I assert a state with status "submitted" -Then an InvariantError is thrown -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-006-assert-error-has-correct-code-for-invalid-state.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-006-assert-error-has-correct-code-for-invalid-state.sdp.md deleted file mode 100644 index e94fc758..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-006-assert-error-has-correct-code-for-invalid-state.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant.assert-error-has-correct-code-for-invalid-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant ---- -# assert error has correct code for invalid state - -## Intent - -- outcome: Executable scenario: assert error has correct code for invalid state - -```gwt -Given a "isDraft" invariant with code "NOT_DRAFT" for draft status -When I assert a state with status "confirmed" -Then the thrown error has code "NOT_DRAFT" -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-007-assert-error-has-correct-message-for-invalid-state.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-007-assert-error-has-correct-message-for-invalid-state.sdp.md deleted file mode 100644 index c5f11d90..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-007-assert-error-has-correct-message-for-invalid-state.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant.assert-error-has-correct-message-for-invalid-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant ---- -# assert error has correct message for invalid state - -## Intent - -- outcome: Executable scenario: assert error has correct message for invalid state - -```gwt -Given a "isDraft" invariant with code "NOT_DRAFT" for draft status -When I assert a state with status "confirmed" -Then the thrown error has message "Expected draft status, got confirmed" -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-008-assert-error-has-correct-context-for-invalid-state.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-008-assert-error-has-correct-context-for-invalid-state.sdp.md deleted file mode 100644 index 953b1424..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-008-assert-error-has-correct-context-for-invalid-state.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant.assert-error-has-correct-context-for-invalid-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant ---- -# assert error has correct context for invalid state - -## Intent - -- outcome: Executable scenario: assert error has correct context for invalid state - -```gwt -Given a "isDraft" invariant with code "NOT_DRAFT" for draft status -When I assert a state with orderId "order-123" and status "submitted" -Then the thrown error has context: -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-009-validate-returns-valid-result-for-valid-state.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-009-validate-returns-valid-result-for-valid-state.sdp.md deleted file mode 100644 index a576d844..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-009-validate-returns-valid-result-for-valid-state.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant.validate-returns-valid-result-for-valid-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant ---- -# validate returns valid result for valid state - -## Intent - -- outcome: Executable scenario: validate returns valid result for valid state - -```gwt -Given a "isDraft" invariant with code "NOT_DRAFT" for draft status -When I validate a state with status "draft" -Then the validation result is valid -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-010-validate-returns-violation-details-for-invalid-state.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-010-validate-returns-violation-details-for-invalid-state.sdp.md deleted file mode 100644 index 42bab476..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-010-validate-returns-violation-details-for-invalid-state.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant.validate-returns-violation-details-for-invalid-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant ---- -# validate returns violation details for invalid state - -## Intent - -- outcome: Executable scenario: validate returns violation details for invalid state - -```gwt -Given a "isDraft" invariant with code "NOT_DRAFT" for draft status -When I validate a state with orderId "order-123" and status "submitted" -Then the validation result is invalid with: -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-011-assert-error-has-undefined-context-when-no-context-function.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-011-assert-error-has-undefined-context-when-no-context-function.sdp.md deleted file mode 100644 index 9805700d..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-011-assert-error-has-undefined-context-when-no-context-function.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant.assert-error-has-undefined-context-when-no-context-function -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant ---- -# assert error has undefined context when no context function - -## Intent - -- outcome: Executable scenario: assert error has undefined context when no context function - -```gwt -Given a "hasItems" invariant with code "NO_ITEMS" without context function -When I assert the hasItems invariant with an empty items state -Then the thrown error has undefined context -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-012-validate-result-has-undefined-context-when-no-context-function.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-012-validate-result-has-undefined-context-when-no-context-function.sdp.md deleted file mode 100644 index 68b5dd99..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-012-validate-result-has-undefined-context-when-no-context-function.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant.validate-result-has-undefined-context-when-no-context-function -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant ---- -# validate result has undefined context when no context function - -## Intent - -- outcome: Executable scenario: validate result has undefined context when no context function - -```gwt -Given a "hasItems" invariant with code "NO_ITEMS" without context function -When I validate the hasItems invariant with an empty items state -Then the validation result is invalid without context with: -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-013-check-uses-parameter-to-find-matching-item.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-013-check-uses-parameter-to-find-matching-item.sdp.md deleted file mode 100644 index d25653b7..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-013-check-uses-parameter-to-find-matching-item.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant.check-uses-parameter-to-find-matching-item -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant ---- -# check uses parameter to find matching item - -## Intent - -- outcome: Executable scenario: check uses parameter to find matching item - -```gwt -Given a parameterized "itemExists" invariant with code "ITEM_NOT_FOUND" -And a state with items: -When I check the parameterized invariant with parameter "prod-1" -Then the check result is true -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-014-check-returns-false-when-parameter-does-not-match.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-014-check-returns-false-when-parameter-does-not-match.sdp.md deleted file mode 100644 index 9792d577..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-014-check-returns-false-when-parameter-does-not-match.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant.check-returns-false-when-parameter-does-not-match -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant ---- -# check returns false when parameter does not match - -## Intent - -- outcome: Executable scenario: check returns false when parameter does not match - -```gwt -Given a parameterized "itemExists" invariant with code "ITEM_NOT_FOUND" -And a state with items: -When I check the parameterized invariant with parameter "prod-2" -Then the check result is false -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-015-assert-uses-parameter-in-error-message-and-context.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-015-assert-uses-parameter-in-error-message-and-context.sdp.md deleted file mode 100644 index 9c4e0f92..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-015-assert-uses-parameter-in-error-message-and-context.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant.assert-uses-parameter-in-error-message-and-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant ---- -# assert uses parameter in error message and context - -## Intent - -- outcome: Executable scenario: assert uses parameter in error message and context - -```gwt -Given a parameterized "itemExists" invariant with code "ITEM_NOT_FOUND" -And a state with orderId "order-123" and items: -When I assert the parameterized invariant with parameter "prod-missing" -Then the thrown error has message "Item prod-missing not found in order order-123" -And the thrown error has context: -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-016-validate-uses-parameter-in-result.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-016-validate-uses-parameter-in-result.sdp.md deleted file mode 100644 index 9a6a24d0..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-016-validate-uses-parameter-in-result.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant.validate-uses-parameter-in-result -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant ---- -# validate uses parameter in result - -## Intent - -- outcome: Executable scenario: validate uses parameter in result - -```gwt -Given a parameterized "itemExists" invariant with code "ITEM_NOT_FOUND" -And a state with orderId "order-456" and no items -When I validate the parameterized invariant with parameter "prod-xyz" -Then the validation result is invalid with: -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.examples/s-017-assert-throws-error-of-the-correct-custom-class.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.examples/s-017-assert-throws-error-of-the-correct-custom-class.sdp.md deleted file mode 100644 index ebb334a6..00000000 --- a/specs/behavior/platform-core/invariants/create-invariant.examples/s-017-assert-throws-error-of-the-correct-custom-class.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.create-invariant.assert-throws-error-of-the-correct-custom-class -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.create-invariant ---- -# assert throws error of the correct custom class - -## Intent - -- outcome: Executable scenario: assert throws error of the correct custom class - -```gwt -Given an invariant using a custom "Order" error class -When I assert the custom invariant with invalid state -Then the thrown error is an instance of the custom error class -And the thrown error is an instance of InvariantError -And the thrown error has name "OrderInvariantError" -``` diff --git a/specs/behavior/platform-core/invariants/create-invariant.sdp.md b/specs/behavior/platform-core/invariants/create-invariant.sdp.md index 015122ef..88786076 100644 --- a/specs/behavior/platform-core/invariants/create-invariant.sdp.md +++ b/specs/behavior/platform-core/invariants/create-invariant.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.invariants.create-invariant kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a domain developer -- outcome: a factory function to create invariants from a specification so that domain rules are reusable, composable, and produce structured violations +- outcome: Create invariants from a specification so domain rules are reusable, composable, and produce structured violations. +- value: check, assert, and validate share one predicate while remaining independently callable. ## Behavior diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-001-creating-an-error-with-code-and-message.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-001-creating-an-error-with-code-and-message.sdp.md deleted file mode 100644 index 3f3594a9..00000000 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-001-creating-an-error-with-code-and-message.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.invariant-error.creating-an-error-with-code-and-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.invariant-error ---- -# Creating an error with code and message - -## Intent - -- outcome: Executable scenario: Creating an error with code and message - -```gwt -Given an InvariantError with code "ORDER_NOT_FOUND" and message "Order not found" -When the scenario runs -Then the error is an instance of Error -And the error is an instance of InvariantError -And the error has the following properties: -``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-002-including-context-when-provided.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-002-including-context-when-provided.sdp.md deleted file mode 100644 index 68ad97af..00000000 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-002-including-context-when-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.invariant-error.including-context-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.invariant-error ---- -# Including context when provided - -## Intent - -- outcome: Executable scenario: Including context when provided - -```gwt -Given an InvariantError with code "VALIDATION_ERROR" and message "Invalid quantity" and context: -When the scenario runs -Then the error context equals the provided context -``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-003-context-is-undefined-when-not-provided.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-003-context-is-undefined-when-not-provided.sdp.md deleted file mode 100644 index 4091a7bf..00000000 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-003-context-is-undefined-when-not-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.invariant-error.context-is-undefined-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.invariant-error ---- -# Context is undefined when not provided - -## Intent - -- outcome: Executable scenario: Context is undefined when not provided - -```gwt -Given an InvariantError with code "SOME_ERROR" and message "message" without context -When the scenario runs -Then the error context is undefined -``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-004-error-has-proper-stack-trace.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-004-error-has-proper-stack-trace.sdp.md deleted file mode 100644 index b2b244fe..00000000 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-004-error-has-proper-stack-trace.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.invariant-error.error-has-proper-stack-trace -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.invariant-error ---- -# Error has proper stack trace - -## Intent - -- outcome: Executable scenario: Error has proper stack trace - -```gwt -Given an InvariantError with code "ERROR" and message "message" without context -When the scenario runs -Then the error stack is defined -And the error stack contains "InvariantError" -``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-005-creating-a-context-specific-error-class.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-005-creating-a-context-specific-error-class.sdp.md deleted file mode 100644 index 1280ac18..00000000 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-005-creating-a-context-specific-error-class.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.invariant-error.creating-a-context-specific-error-class -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.invariant-error ---- -# Creating a context-specific error class - -## Intent - -- outcome: Executable scenario: Creating a context-specific error class - -```gwt -Given a context-specific error class for "Order" -When I create an error with code "ORDER_NOT_FOUND" and message "Order not found" -Then the error is an instance of InvariantError -And the error has the following properties: -``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-006-different-contexts-produce-different-classes.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-006-different-contexts-produce-different-classes.sdp.md deleted file mode 100644 index cf392fc5..00000000 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-006-different-contexts-produce-different-classes.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.invariant-error.different-contexts-produce-different-classes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.invariant-error ---- -# Different contexts produce different classes - -## Intent - -- outcome: Executable scenario: Different contexts produce different classes - -```gwt -Given a context-specific error class for "Order" -And a context-specific error class for "Inventory" -When I create an Order error with code "ORDER_NOT_FOUND" and message "not found" and I create an Inventory error with code "PRODUCT_NOT_FOUND" and message "not found" -Then the Order error name is "OrderInvariantError" -And the Inventory error name is "InventoryInvariantError" -And both errors are instances of InvariantError -``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-007-typed-error-codes-are-supported.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-007-typed-error-codes-are-supported.sdp.md deleted file mode 100644 index fa54b0b9..00000000 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-007-typed-error-codes-are-supported.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.invariant-error.typed-error-codes-are-supported -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.invariant-error ---- -# Typed error codes are supported - -## Intent - -- outcome: Executable scenario: Typed error codes are supported - -```gwt -Given a context-specific error class for "Order" with typed codes -When I create errors with each typed code -Then all errors compile and instantiate successfully -``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-008-context-specific-errors-include-context-data.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-008-context-specific-errors-include-context-data.sdp.md deleted file mode 100644 index 4d65170e..00000000 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-008-context-specific-errors-include-context-data.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.invariant-error.context-specific-errors-include-context-data -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.invariant-error ---- -# Context-specific errors include context data - -## Intent - -- outcome: Executable scenario: Context-specific errors include context data - -```gwt -Given a context-specific error class for "Product" -When I create an error with code "OUT_OF_STOCK" and message "Product out of stock" and context: -Then the error context equals the provided context -``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-009-context-specific-class-has-proper-constructor-name.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-009-context-specific-class-has-proper-constructor-name.sdp.md deleted file mode 100644 index ef24f860..00000000 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-009-context-specific-class-has-proper-constructor-name.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.invariant-error.context-specific-class-has-proper-constructor-name -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.invariant-error ---- -# Context-specific class has proper constructor name - -## Intent - -- outcome: Executable scenario: Context-specific class has proper constructor name - -```gwt -Given a context-specific error class for "Customer" -When the scenario runs -Then the class name is "CustomerInvariantError" -``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-010-returns-true-for-invariant-error-instances.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-010-returns-true-for-invariant-error-instances.sdp.md deleted file mode 100644 index f81dac7b..00000000 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-010-returns-true-for-invariant-error-instances.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.invariant-error.returns-true-for-invariant-error-instances -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.invariant-error ---- -# Returns true for InvariantError instances - -## Intent - -- outcome: Executable scenario: Returns true for InvariantError instances - -```gwt -Given an InvariantError with code "CODE" and message "message" without context -When the scenario runs -Then isInvariantError returns true -``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-011-returns-true-for-context-specific-error-instances.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-011-returns-true-for-context-specific-error-instances.sdp.md deleted file mode 100644 index 6cd2ed55..00000000 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-011-returns-true-for-context-specific-error-instances.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.invariant-error.returns-true-for-context-specific-error-instances -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.invariant-error ---- -# Returns true for context-specific error instances - -## Intent - -- outcome: Executable scenario: Returns true for context-specific error instances - -```gwt -Given a context-specific error class for "Order" -When I create an error with code "CODE" and message "message" -Then isInvariantError returns true for the context error -``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-012-returns-false-for-regular-error-instances.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-012-returns-false-for-regular-error-instances.sdp.md deleted file mode 100644 index 2814c536..00000000 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-012-returns-false-for-regular-error-instances.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.invariant-error.returns-false-for-regular-error-instances -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.invariant-error ---- -# Returns false for regular Error instances - -## Intent - -- outcome: Executable scenario: Returns false for regular Error instances - -```gwt -Given a regular Error with message "message" -When the scenario runs -Then isInvariantError returns false -``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-013-returns-false-for-non-error-values.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-013-returns-false-for-non-error-values.sdp.md deleted file mode 100644 index 778d61b9..00000000 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-013-returns-false-for-non-error-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.invariant-error.returns-false-for-non-error-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.invariant-error ---- -# Returns false for non-error values - -## Intent - -- outcome: Executable scenario: Returns false for non-error values - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isInvariantError returns false for all of: -``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-014-returns-true-when-error-has-the-specified-code.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-014-returns-true-when-error-has-the-specified-code.sdp.md deleted file mode 100644 index b47faf08..00000000 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-014-returns-true-when-error-has-the-specified-code.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.invariant-error.returns-true-when-error-has-the-specified-code -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.invariant-error ---- -# Returns true when error has the specified code - -## Intent - -- outcome: Executable scenario: Returns true when error has the specified code - -```gwt -Given an InvariantError with code "ORDER_NOT_FOUND" and message "message" without context -When the scenario runs -Then hasCode with "ORDER_NOT_FOUND" returns true -``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-015-returns-false-when-error-has-a-different-code.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-015-returns-false-when-error-has-a-different-code.sdp.md deleted file mode 100644 index 55c3a5d3..00000000 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-015-returns-false-when-error-has-a-different-code.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.invariant-error.returns-false-when-error-has-a-different-code -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.invariant-error ---- -# Returns false when error has a different code - -## Intent - -- outcome: Executable scenario: Returns false when error has a different code - -```gwt -Given an InvariantError with code "ORDER_NOT_FOUND" and message "message" without context -When the scenario runs -Then hasCode with "ORDER_ALREADY_EXISTS" returns false -``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-016-returns-false-for-non-invariant-error-values.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-016-returns-false-for-non-invariant-error-values.sdp.md deleted file mode 100644 index ec1c6904..00000000 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-016-returns-false-for-non-invariant-error-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.invariant-error.returns-false-for-non-invariant-error-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.invariant-error ---- -# Returns false for non-InvariantError values - -## Intent - -- outcome: Executable scenario: Returns false for non-InvariantError values - -```gwt -Given the feature fixture is in place -When the scenario runs -Then hasCode returns false for all of: -``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.examples/s-017-works-with-context-specific-errors.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.examples/s-017-works-with-context-specific-errors.sdp.md deleted file mode 100644 index 82148480..00000000 --- a/specs/behavior/platform-core/invariants/invariant-error.examples/s-017-works-with-context-specific-errors.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.invariants.invariant-error.works-with-context-specific-errors -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.invariants.invariant-error ---- -# Works with context-specific errors - -## Intent - -- outcome: Executable scenario: Works with context-specific errors - -```gwt -Given a context-specific error class for "Inventory" -When I create an error with code "OUT_OF_STOCK" and message "message" -Then hasCode with "OUT_OF_STOCK" returns true for the context error -And hasCode with "OTHER_CODE" returns false for the context error -``` diff --git a/specs/behavior/platform-core/invariants/invariant-error.sdp.md b/specs/behavior/platform-core/invariants/invariant-error.sdp.md index 59ceefd9..f7c087af 100644 --- a/specs/behavior/platform-core/invariants/invariant-error.sdp.md +++ b/specs/behavior/platform-core/invariants/invariant-error.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.invariants.invariant-error kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a domain developer -- outcome: a base invariant error class with factory and type guards so that domain rule violations are expressed as typed, inspectable errors +- outcome: Provide a base invariant error class with factory and type guards so domain rule violations are typed, inspectable errors. +- value: Constructor, forContext, isInvariantError, and hasCode give structured codes, context, and instanceof checks. ## Behavior diff --git a/specs/behavior/platform-core/logging/commands.examples/s-001-command-start-is-logged-at-info-level.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-001-command-start-is-logged-at-info-level.sdp.md deleted file mode 100644 index e80a66e8..00000000 --- a/specs/behavior/platform-core/logging/commands.examples/s-001-command-start-is-logged-at-info-level.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.commands.command-start-is-logged-at-info-level -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.commands ---- -# Command start is logged at INFO level - -## Intent - -- outcome: Executable scenario: Command start is logged at INFO level - -```gwt -Given a base command log context -When I call logCommandStart -Then the log has 1 entry at level "INFO" with message "Command started" -And the log data equals the base context -``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-002-entity-specific-fields-are-included-in-start-log-data.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-002-entity-specific-fields-are-included-in-start-log-data.sdp.md deleted file mode 100644 index 4df70e99..00000000 --- a/specs/behavior/platform-core/logging/commands.examples/s-002-entity-specific-fields-are-included-in-start-log-data.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.commands.entity-specific-fields-are-included-in-start-log-data -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.commands ---- -# Entity-specific fields are included in start log data - -## Intent - -- outcome: Executable scenario: Entity-specific fields are included in start log data - -```gwt -Given a base command log context with extra fields -When I call logCommandStart with the extended context -Then the log data equals the extended context -``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-003-command-success-is-logged-at-info-level-with-result.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-003-command-success-is-logged-at-info-level-with-result.sdp.md deleted file mode 100644 index b76ab421..00000000 --- a/specs/behavior/platform-core/logging/commands.examples/s-003-command-success-is-logged-at-info-level-with-result.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.commands.command-success-is-logged-at-info-level-with-result -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.commands ---- -# Command success is logged at INFO level with result - -## Intent - -- outcome: Executable scenario: Command success is logged at INFO level with result - -```gwt -Given a base command log context -When I call logCommandSuccess with version 1 and eventType "OrderCreated" -Then the success log data equals the base context merged with: -``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-004-context-fields-are-preserved-alongside-result-fields.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-004-context-fields-are-preserved-alongside-result-fields.sdp.md deleted file mode 100644 index 553b302b..00000000 --- a/specs/behavior/platform-core/logging/commands.examples/s-004-context-fields-are-preserved-alongside-result-fields.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.commands.context-fields-are-preserved-alongside-result-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.commands ---- -# Context fields are preserved alongside result fields - -## Intent - -- outcome: Executable scenario: Context fields are preserved alongside result fields - -```gwt -Given a base command log context -When I call logCommandSuccess with version 5 and eventType "OrderConfirmed" -Then the log data has all expected properties: -``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-005-command-rejection-is-logged-at-warn-level.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-005-command-rejection-is-logged-at-warn-level.sdp.md deleted file mode 100644 index 059cc315..00000000 --- a/specs/behavior/platform-core/logging/commands.examples/s-005-command-rejection-is-logged-at-warn-level.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.commands.command-rejection-is-logged-at-warn-level -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.commands ---- -# Command rejection is logged at WARN level - -## Intent - -- outcome: Executable scenario: Command rejection is logged at WARN level - -```gwt -Given a base command log context -When I call logCommandRejected with code "INVALID_STATE" and message "Order already confirmed" -Then the rejection log data equals the base context merged with: -``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-006-rejection-uses-prefixed-field-names-not-raw-code-message.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-006-rejection-uses-prefixed-field-names-not-raw-code-message.sdp.md deleted file mode 100644 index c2342b45..00000000 --- a/specs/behavior/platform-core/logging/commands.examples/s-006-rejection-uses-prefixed-field-names-not-raw-code-message.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.commands.rejection-uses-prefixed-field-names-not-raw-code-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.commands ---- -# Rejection uses prefixed field names not raw code/message - -## Intent - -- outcome: Executable scenario: Rejection uses prefixed field names not raw code/message - -```gwt -Given a base command log context -When I call logCommandRejected with code "DUPLICATE" and message "Order ID already exists" -Then the log data has expected properties: -And the log data does not have properties: -``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-007-business-failure-is-logged-at-warn-level.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-007-business-failure-is-logged-at-warn-level.sdp.md deleted file mode 100644 index ce86750f..00000000 --- a/specs/behavior/platform-core/logging/commands.examples/s-007-business-failure-is-logged-at-warn-level.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.commands.business-failure-is-logged-at-warn-level -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.commands ---- -# Business failure is logged at WARN level - -## Intent - -- outcome: Executable scenario: Business failure is logged at WARN level - -```gwt -Given a base command log context -When I call logCommandFailed with eventType "ReservationFailed" and reason "Insufficient stock" -Then the failure log data equals the base context merged with: -``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-008-business-failure-uses-failure-reason-not-reason.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-008-business-failure-uses-failure-reason-not-reason.sdp.md deleted file mode 100644 index 229311f1..00000000 --- a/specs/behavior/platform-core/logging/commands.examples/s-008-business-failure-uses-failure-reason-not-reason.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.commands.business-failure-uses-failure-reason-not-reason -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.commands ---- -# Business failure uses failureReason not reason - -## Intent - -- outcome: Executable scenario: Business failure uses failureReason not reason - -```gwt -Given a base command log context -When I call logCommandFailed with eventType "PaymentFailed" and reason "Card declined" -Then the log data has failureReason "Card declined" -And the log data does not have property "reason" -``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-009-error-object-is-logged-at-error-level-with-message-and-stack.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-009-error-object-is-logged-at-error-level-with-message-and-stack.sdp.md deleted file mode 100644 index 12450899..00000000 --- a/specs/behavior/platform-core/logging/commands.examples/s-009-error-object-is-logged-at-error-level-with-message-and-stack.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.commands.error-object-is-logged-at-error-level-with-message-and-stack -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.commands ---- -# Error object is logged at ERROR level with message and stack - -## Intent - -- outcome: Executable scenario: Error object is logged at ERROR level with message and stack - -```gwt -Given a base command log context -When I call logCommandError with an Error "Database connection failed" -Then the log has 1 entry at level "ERROR" with message "Command failed" -And the log error data has message "Database connection failed" -And the log error data has a stack trace containing "Database connection failed" -``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-010-string-error-is-logged-directly.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-010-string-error-is-logged-directly.sdp.md deleted file mode 100644 index fa81d1b1..00000000 --- a/specs/behavior/platform-core/logging/commands.examples/s-010-string-error-is-logged-directly.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.commands.string-error-is-logged-directly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.commands ---- -# String error is logged directly - -## Intent - -- outcome: Executable scenario: String error is logged directly - -```gwt -Given a base command log context -When I call logCommandError with string "Something went wrong" -Then the log has 1 entry at level "ERROR" with message "Command failed" -And the log data error field equals "Something went wrong" -``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-011-non-string-non-error-values-are-stringified.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-011-non-string-non-error-values-are-stringified.sdp.md deleted file mode 100644 index c43877ba..00000000 --- a/specs/behavior/platform-core/logging/commands.examples/s-011-non-string-non-error-values-are-stringified.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.commands.non-string-non-error-values-are-stringified -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.commands ---- -# Non-string non-Error values are stringified - -## Intent - -- outcome: Executable scenario: Non-string non-Error values are stringified - -```gwt -Given a base command log context -When I call logCommandError with a plain object -Then the log data error field equals "[object Object]" -``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-012-null-error-is-stringified.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-012-null-error-is-stringified.sdp.md deleted file mode 100644 index 126feaf5..00000000 --- a/specs/behavior/platform-core/logging/commands.examples/s-012-null-error-is-stringified.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.commands.null-error-is-stringified -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.commands ---- -# Null error is stringified - -## Intent - -- outcome: Executable scenario: Null error is stringified - -```gwt -Given a base command log context -When I call logCommandError with null -Then the log data error field equals "null" -``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-013-undefined-error-is-stringified.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-013-undefined-error-is-stringified.sdp.md deleted file mode 100644 index 940bee1c..00000000 --- a/specs/behavior/platform-core/logging/commands.examples/s-013-undefined-error-is-stringified.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.commands.undefined-error-is-stringified -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.commands ---- -# Undefined error is stringified - -## Intent - -- outcome: Executable scenario: Undefined error is stringified - -```gwt -Given a base command log context -When I call logCommandError with undefined -Then the log data error field equals "undefined" -``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-014-stack-trace-is-preserved-for-debugging.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-014-stack-trace-is-preserved-for-debugging.sdp.md deleted file mode 100644 index d44b1858..00000000 --- a/specs/behavior/platform-core/logging/commands.examples/s-014-stack-trace-is-preserved-for-debugging.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.commands.stack-trace-is-preserved-for-debugging -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.commands ---- -# Stack trace is preserved for debugging - -## Intent - -- outcome: Executable scenario: Stack trace is preserved for debugging - -```gwt -Given a base command log context -When I call logCommandError with an Error "Test error" -Then the log error data has a stack trace containing "Test error" -``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-015-full-success-lifecycle-produces-start-and-success-logs.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-015-full-success-lifecycle-produces-start-and-success-logs.sdp.md deleted file mode 100644 index c5840d8f..00000000 --- a/specs/behavior/platform-core/logging/commands.examples/s-015-full-success-lifecycle-produces-start-and-success-logs.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.commands.full-success-lifecycle-produces-start-and-success-logs -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.commands ---- -# Full success lifecycle produces start and success logs - -## Intent - -- outcome: Executable scenario: Full success lifecycle produces start and success logs - -```gwt -Given a base command log context -When I log a full success lifecycle -Then there are 2 log entries with messages: -``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-016-rejection-lifecycle-produces-info-and-warn-logs.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-016-rejection-lifecycle-produces-info-and-warn-logs.sdp.md deleted file mode 100644 index 6c65e0a7..00000000 --- a/specs/behavior/platform-core/logging/commands.examples/s-016-rejection-lifecycle-produces-info-and-warn-logs.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.commands.rejection-lifecycle-produces-info-and-warn-logs -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.commands ---- -# Rejection lifecycle produces INFO and WARN logs - -## Intent - -- outcome: Executable scenario: Rejection lifecycle produces INFO and WARN logs - -```gwt -Given a base command log context -When I log a rejection lifecycle -Then there are 2 log entries -And the log level counts are: -``` diff --git a/specs/behavior/platform-core/logging/commands.examples/s-017-error-lifecycle-produces-info-and-error-logs.sdp.md b/specs/behavior/platform-core/logging/commands.examples/s-017-error-lifecycle-produces-info-and-error-logs.sdp.md deleted file mode 100644 index 7a047e95..00000000 --- a/specs/behavior/platform-core/logging/commands.examples/s-017-error-lifecycle-produces-info-and-error-logs.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.commands.error-lifecycle-produces-info-and-error-logs -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.commands ---- -# Error lifecycle produces INFO and ERROR logs - -## Intent - -- outcome: Executable scenario: Error lifecycle produces INFO and ERROR logs - -```gwt -Given a base command log context -When I log an error lifecycle -Then there are 2 log entries -And the log level counts are: -``` diff --git a/specs/behavior/platform-core/logging/commands.sdp.md b/specs/behavior/platform-core/logging/commands.sdp.md index ccf15823..d3c53679 100644 --- a/specs/behavior/platform-core/logging/commands.sdp.md +++ b/specs/behavior/platform-core/logging/commands.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.logging.commands kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,13 +11,14 @@ relations: ## Intent - actor: a platform developer -- outcome: structured logging helpers for command lifecycle events so that I can trace command execution with consistent field naming +- outcome: Log command lifecycle events with consistent field names. +- value: Developers can trace command execution through start, success, rejection, failure, and error. ## Behavior -- rule: logCommandStart logs at INFO level with full context -- rule: logCommandSuccess logs at INFO level with version and eventType -- rule: logCommandRejected logs at WARN level with rejection details -- rule: logCommandFailed logs business failures at WARN level -- rule: logCommandError logs unexpected errors at ERROR level -- rule: Command lifecycle can be traced through sequential log entries +- rule: logCommandStart logs at INFO level with full context. +- rule: logCommandSuccess logs at INFO level with version and eventType. +- rule: logCommandRejected logs at WARN level with rejection details. +- rule: logCommandFailed logs business failures at WARN level. +- rule: logCommandError logs unexpected errors at ERROR level. +- rule: Command lifecycle can be traced through sequential log entries. diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-001-messages-are-prefixed-with-scope.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-001-messages-are-prefixed-with-scope.sdp.md deleted file mode 100644 index 6d50d74c..00000000 --- a/specs/behavior/platform-core/logging/scoped.examples/s-001-messages-are-prefixed-with-scope.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.scoped.messages-are-prefixed-with-scope -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.scoped ---- -# Messages are prefixed with scope - -## Intent - -- outcome: Executable scenario: Messages are prefixed with scope - -```gwt -Given a scoped logger "TestScope" at level "DEBUG" -When I log an info message "Test message" -Then console.info was called with "[TestScope] Test message" -``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-002-data-object-is-appended-as-json.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-002-data-object-is-appended-as-json.sdp.md deleted file mode 100644 index cf810bad..00000000 --- a/specs/behavior/platform-core/logging/scoped.examples/s-002-data-object-is-appended-as-json.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.scoped.data-object-is-appended-as-json -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.scoped ---- -# Data object is appended as JSON - -## Intent - -- outcome: Executable scenario: Data object is appended as JSON - -```gwt -Given a scoped logger "TestScope" at level "DEBUG" -When I log an info message "Test message" with data '{"key":"value"}' -Then console.info was called with '[TestScope] Test message {"key":"value"}' -``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-003-empty-data-object-is-omitted-from-output.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-003-empty-data-object-is-omitted-from-output.sdp.md deleted file mode 100644 index 25b2495b..00000000 --- a/specs/behavior/platform-core/logging/scoped.examples/s-003-empty-data-object-is-omitted-from-output.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.scoped.empty-data-object-is-omitted-from-output -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.scoped ---- -# Empty data object is omitted from output - -## Intent - -- outcome: Executable scenario: Empty data object is omitted from output - -```gwt -Given a scoped logger "TestScope" at level "DEBUG" -When I log an info message "Test message" with empty data -Then console.info was called with "[TestScope] Test message" -``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-004-debug-level-allows-debug-messages.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-004-debug-level-allows-debug-messages.sdp.md deleted file mode 100644 index 3673478e..00000000 --- a/specs/behavior/platform-core/logging/scoped.examples/s-004-debug-level-allows-debug-messages.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.scoped.debug-level-allows-debug-messages -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.scoped ---- -# DEBUG level allows debug messages - -## Intent - -- outcome: Executable scenario: DEBUG level allows debug messages - -```gwt -Given a scoped logger "Test" at level "DEBUG" -When I log a debug message "Debug message" -Then console.debug was called -``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-005-info-level-suppresses-debug-messages.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-005-info-level-suppresses-debug-messages.sdp.md deleted file mode 100644 index ce85d901..00000000 --- a/specs/behavior/platform-core/logging/scoped.examples/s-005-info-level-suppresses-debug-messages.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.scoped.info-level-suppresses-debug-messages -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.scoped ---- -# INFO level suppresses debug messages - -## Intent - -- outcome: Executable scenario: INFO level suppresses debug messages - -```gwt -Given a scoped logger "Test" at level "INFO" -When I log a debug message "Debug message" -Then console.debug was not called -``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-006-info-level-allows-info-messages.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-006-info-level-allows-info-messages.sdp.md deleted file mode 100644 index 0317b133..00000000 --- a/specs/behavior/platform-core/logging/scoped.examples/s-006-info-level-allows-info-messages.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.scoped.info-level-allows-info-messages -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.scoped ---- -# INFO level allows info messages - -## Intent - -- outcome: Executable scenario: INFO level allows info messages - -```gwt -Given a scoped logger "Test" at level "INFO" -When I log an info message "Info message" -Then console.info was called -``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-007-info-level-allows-warn-messages.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-007-info-level-allows-warn-messages.sdp.md deleted file mode 100644 index fac31f41..00000000 --- a/specs/behavior/platform-core/logging/scoped.examples/s-007-info-level-allows-warn-messages.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.scoped.info-level-allows-warn-messages -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.scoped ---- -# INFO level allows warn messages - -## Intent - -- outcome: Executable scenario: INFO level allows warn messages - -```gwt -Given a scoped logger "Test" at level "INFO" -When I log a warn message "Warn message" -Then console.warn was called -``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-008-error-level-allows-error-messages.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-008-error-level-allows-error-messages.sdp.md deleted file mode 100644 index c8ef9911..00000000 --- a/specs/behavior/platform-core/logging/scoped.examples/s-008-error-level-allows-error-messages.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.scoped.error-level-allows-error-messages -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.scoped ---- -# ERROR level allows error messages - -## Intent - -- outcome: Executable scenario: ERROR level allows error messages - -```gwt -Given a scoped logger "Test" at level "ERROR" -When I log an error message "Error message" -Then console.error was called -``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-009-default-level-is-info-when-not-specified.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-009-default-level-is-info-when-not-specified.sdp.md deleted file mode 100644 index 6ee68d53..00000000 --- a/specs/behavior/platform-core/logging/scoped.examples/s-009-default-level-is-info-when-not-specified.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.scoped.default-level-is-info-when-not-specified -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.scoped ---- -# Default level is INFO when not specified - -## Intent - -- outcome: Executable scenario: Default level is INFO when not specified - -```gwt -Given a scoped logger "Test" with no explicit level -When I log a debug message "Debug message" and an info message "Info message" -Then console.debug was not called -And console.info was called -``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-010-each-log-level-uses-its-corresponding-console-method.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-010-each-log-level-uses-its-corresponding-console-method.sdp.md deleted file mode 100644 index 4999aaaa..00000000 --- a/specs/behavior/platform-core/logging/scoped.examples/s-010-each-log-level-uses-its-corresponding-console-method.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.scoped.each-log-level-uses-its-corresponding-console-method -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.scoped ---- -# Each log level uses its corresponding console method - -## Intent - -- outcome: Executable scenario: Each log level uses its corresponding console method - -```gwt -Given a scoped logger "Test" at level "DEBUG" -When the scenario runs -Then logging at each level calls the correct console method: -``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-011-report-level-outputs-structured-json-via-console-log.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-011-report-level-outputs-structured-json-via-console-log.sdp.md deleted file mode 100644 index a9c51e70..00000000 --- a/specs/behavior/platform-core/logging/scoped.examples/s-011-report-level-outputs-structured-json-via-console-log.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.scoped.report-level-outputs-structured-json-via-console-log -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.scoped ---- -# Report level outputs structured JSON via console.log - -## Intent - -- outcome: Executable scenario: Report level outputs structured JSON via console.log - -```gwt -Given a scoped logger "Test" at level "DEBUG" -When I log a report "Metrics" with data '{"count":10}' -Then console.log was called with structured JSON containing: -``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-012-timing-start-uses-console-time.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-012-timing-start-uses-console-time.sdp.md deleted file mode 100644 index ae5d18c2..00000000 --- a/specs/behavior/platform-core/logging/scoped.examples/s-012-timing-start-uses-console-time.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.scoped.timing-start-uses-console-time -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.scoped ---- -# Timing start uses console.time - -## Intent - -- outcome: Executable scenario: Timing start uses console.time - -```gwt -Given a scoped logger "Test" at level "DEBUG" -When I log a trace "Operation" with timing "start" -Then console.time was called with "[Test] Operation" -``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-013-timing-end-uses-console-time-end.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-013-timing-end-uses-console-time-end.sdp.md deleted file mode 100644 index 56e996f4..00000000 --- a/specs/behavior/platform-core/logging/scoped.examples/s-013-timing-end-uses-console-time-end.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.scoped.timing-end-uses-console-time-end -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.scoped ---- -# Timing end uses console.timeEnd - -## Intent - -- outcome: Executable scenario: Timing end uses console.timeEnd - -```gwt -Given a scoped logger "Test" at level "DEBUG" -When I log a trace "Operation" with timing "end" -Then console.timeEnd was called with "[Test] Operation" -``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-014-regular-trace-without-timing-uses-console-debug.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-014-regular-trace-without-timing-uses-console-debug.sdp.md deleted file mode 100644 index b2c1daab..00000000 --- a/specs/behavior/platform-core/logging/scoped.examples/s-014-regular-trace-without-timing-uses-console-debug.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.scoped.regular-trace-without-timing-uses-console-debug -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.scoped ---- -# Regular trace without timing uses console.debug - -## Intent - -- outcome: Executable scenario: Regular trace without timing uses console.debug - -```gwt -Given a scoped logger "Test" at level "DEBUG" -When I log a trace "Trace message" with data '{"data":"value"}' -Then console.debug was called -And console.time was not called -And console.timeEnd was not called -``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-015-no-op-logger-does-not-call-any-console-methods.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-015-no-op-logger-does-not-call-any-console-methods.sdp.md deleted file mode 100644 index 4883be02..00000000 --- a/specs/behavior/platform-core/logging/scoped.examples/s-015-no-op-logger-does-not-call-any-console-methods.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.scoped.no-op-logger-does-not-call-any-console-methods -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.scoped ---- -# No-op logger does not call any console methods - -## Intent - -- outcome: Executable scenario: No-op logger does not call any console methods - -```gwt -Given a no-op logger -When I invoke all log levels on the no-op logger -Then no console methods were called: -``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-016-no-op-logger-implements-the-full-logger-interface.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-016-no-op-logger-implements-the-full-logger-interface.sdp.md deleted file mode 100644 index 45b87b07..00000000 --- a/specs/behavior/platform-core/logging/scoped.examples/s-016-no-op-logger-implements-the-full-logger-interface.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.scoped.no-op-logger-implements-the-full-logger-interface -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.scoped ---- -# No-op logger implements the full Logger interface - -## Intent - -- outcome: Executable scenario: No-op logger implements the full Logger interface - -```gwt -Given a no-op logger -When the scenario runs -Then the no-op logger has all required methods: -``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-017-child-logger-prefixes-with-combined-scope.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-017-child-logger-prefixes-with-combined-scope.sdp.md deleted file mode 100644 index 4737c043..00000000 --- a/specs/behavior/platform-core/logging/scoped.examples/s-017-child-logger-prefixes-with-combined-scope.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.scoped.child-logger-prefixes-with-combined-scope -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.scoped ---- -# Child logger prefixes with combined scope - -## Intent - -- outcome: Executable scenario: Child logger prefixes with combined scope - -```gwt -Given a child logger with parent "Parent" and child "Child" at level "DEBUG" -When I log an info message "Test" on the child logger -Then console.info was called with "[Parent:Child] Test" -``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-018-child-logger-respects-provided-log-level.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-018-child-logger-respects-provided-log-level.sdp.md deleted file mode 100644 index eb450147..00000000 --- a/specs/behavior/platform-core/logging/scoped.examples/s-018-child-logger-respects-provided-log-level.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.scoped.child-logger-respects-provided-log-level -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.scoped ---- -# Child logger respects provided log level - -## Intent - -- outcome: Executable scenario: Child logger respects provided log level - -```gwt -Given a child logger with parent "Parent" and child "Child" at level "WARN" -When I log an info message "Info" on the child logger and I log a warn message "Warn" on the child logger -Then console.info was not called -And console.warn was called -``` diff --git a/specs/behavior/platform-core/logging/scoped.examples/s-019-child-logger-defaults-to-info-level.sdp.md b/specs/behavior/platform-core/logging/scoped.examples/s-019-child-logger-defaults-to-info-level.sdp.md deleted file mode 100644 index 1d938399..00000000 --- a/specs/behavior/platform-core/logging/scoped.examples/s-019-child-logger-defaults-to-info-level.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.scoped.child-logger-defaults-to-info-level -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.scoped ---- -# Child logger defaults to INFO level - -## Intent - -- outcome: Executable scenario: Child logger defaults to INFO level - -```gwt -Given a child logger with parent "Parent" and child "Child" with no explicit level -When I log a debug message "Debug" on the child logger and I log an info message "Info" on the child logger -Then console.debug was not called -And console.info was called -``` diff --git a/specs/behavior/platform-core/logging/scoped.sdp.md b/specs/behavior/platform-core/logging/scoped.sdp.md index 1ea588ac..b5e94bda 100644 --- a/specs/behavior/platform-core/logging/scoped.sdp.md +++ b/specs/behavior/platform-core/logging/scoped.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.logging.scoped kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,13 +11,14 @@ relations: ## Intent - actor: a platform developer -- outcome: scoped loggers that prefix messages and filter by level so that I can organize and control logging output per component +- outcome: Prefix scoped logger messages and filter them by log level. +- value: Developers can organize and control logging output per component. ## Behavior -- rule: createScopedLogger prefixes messages with the scope name -- rule: createScopedLogger filters messages below the configured log level -- rule: createScopedLogger maps each log level to the correct console method -- rule: Trace level supports console timing via the timing data field -- rule: createPlatformNoOpLogger produces a logger that discards all output -- rule: createChildLogger combines parent and child scopes with colon separator +- rule: createScopedLogger prefixes messages with the scope name. +- rule: createScopedLogger filters messages below the configured log level. +- rule: createScopedLogger maps each log level to the correct console method. +- rule: Trace level supports console timing via the timing data field. +- rule: createPlatformNoOpLogger produces a logger that discards all output. +- rule: createChildLogger combines parent and child scopes with colon separator. diff --git a/specs/behavior/platform-core/logging/testing.examples/s-001-all-six-log-method-calls-are-captured.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-001-all-six-log-method-calls-are-captured.sdp.md deleted file mode 100644 index 3d972587..00000000 --- a/specs/behavior/platform-core/logging/testing.examples/s-001-all-six-log-method-calls-are-captured.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.testing.all-six-log-method-calls-are-captured -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.testing ---- -# All six log method calls are captured - -## Intent - -- outcome: Executable scenario: All six log method calls are captured - -```gwt -Given a fresh mock logger -When I log one message at each level -Then the logger should have captured 6 calls -``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-002-each-call-records-the-correct-log-level.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-002-each-call-records-the-correct-log-level.sdp.md deleted file mode 100644 index 0d675223..00000000 --- a/specs/behavior/platform-core/logging/testing.examples/s-002-each-call-records-the-correct-log-level.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.testing.each-call-records-the-correct-log-level -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.testing ---- -# Each call records the correct log level - -## Intent - -- outcome: Executable scenario: Each call records the correct log level - -```gwt -Given a fresh mock logger -When I log one message at each level -Then each call has the correct level: -``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-003-message-text-is-captured-correctly.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-003-message-text-is-captured-correctly.sdp.md deleted file mode 100644 index 04748349..00000000 --- a/specs/behavior/platform-core/logging/testing.examples/s-003-message-text-is-captured-correctly.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.testing.message-text-is-captured-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.testing ---- -# Message text is captured correctly - -## Intent - -- outcome: Executable scenario: Message text is captured correctly - -```gwt -Given a fresh mock logger -When I log an info message "Test message" -Then the first call message should be "Test message" -``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-004-structured-data-is-captured-correctly.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-004-structured-data-is-captured-correctly.sdp.md deleted file mode 100644 index 1ce2d6f1..00000000 --- a/specs/behavior/platform-core/logging/testing.examples/s-004-structured-data-is-captured-correctly.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.testing.structured-data-is-captured-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.testing ---- -# Structured data is captured correctly - -## Intent - -- outcome: Executable scenario: Structured data is captured correctly - -```gwt -Given a fresh mock logger -When I log an info message with data key "value" and count 42 -Then the first call data should contain key "value" and count 42 -``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-005-data-is-undefined-when-not-provided.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-005-data-is-undefined-when-not-provided.sdp.md deleted file mode 100644 index d724758c..00000000 --- a/specs/behavior/platform-core/logging/testing.examples/s-005-data-is-undefined-when-not-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.testing.data-is-undefined-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.testing ---- -# Data is undefined when not provided - -## Intent - -- outcome: Executable scenario: Data is undefined when not provided - -```gwt -Given a fresh mock logger -When I log an info message "No data" -Then the first call data should be undefined -``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-006-timestamp-is-captured-within-bounds.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-006-timestamp-is-captured-within-bounds.sdp.md deleted file mode 100644 index 193fc36d..00000000 --- a/specs/behavior/platform-core/logging/testing.examples/s-006-timestamp-is-captured-within-bounds.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.testing.timestamp-is-captured-within-bounds -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.testing ---- -# Timestamp is captured within bounds - -## Intent - -- outcome: Executable scenario: Timestamp is captured within bounds - -```gwt -Given a fresh mock logger -When I log an info message with timestamp tracking -Then the first call timestamp should be within the tracked bounds -``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-007-clearing-resets-calls-to-empty.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-007-clearing-resets-calls-to-empty.sdp.md deleted file mode 100644 index 785d6a4e..00000000 --- a/specs/behavior/platform-core/logging/testing.examples/s-007-clearing-resets-calls-to-empty.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.testing.clearing-resets-calls-to-empty -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.testing ---- -# Clearing resets calls to empty - -## Intent - -- outcome: Executable scenario: Clearing resets calls to empty - -```gwt -Given a fresh mock logger -When I log 2 info messages and then clear -Then the logger should have captured 0 calls -``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-008-calls-are-filtered-by-level-correctly.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-008-calls-are-filtered-by-level-correctly.sdp.md deleted file mode 100644 index a1919df1..00000000 --- a/specs/behavior/platform-core/logging/testing.examples/s-008-calls-are-filtered-by-level-correctly.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.testing.calls-are-filtered-by-level-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.testing ---- -# Calls are filtered by level correctly - -## Intent - -- outcome: Executable scenario: Calls are filtered by level correctly - -```gwt -Given a fresh mock logger -When I log "Debug 1" at DEBUG, "Info 1" at INFO, "Debug 2" at DEBUG, and "Error 1" at ERROR -Then getCallsAtLevel returns the correct counts: -``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-009-partial-and-exact-message-matching.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-009-partial-and-exact-message-matching.sdp.md deleted file mode 100644 index 63f9bb42..00000000 --- a/specs/behavior/platform-core/logging/testing.examples/s-009-partial-and-exact-message-matching.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.testing.partial-and-exact-message-matching -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.testing ---- -# Partial and exact message matching - -## Intent - -- outcome: Executable scenario: Partial and exact message matching - -```gwt -Given a fresh mock logger -When I log "Command executed successfully" at INFO and "Command failed with error" at WARN -Then hasLoggedMessage returns the expected results: -``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-010-exact-message-match-works.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-010-exact-message-match-works.sdp.md deleted file mode 100644 index 69a5c03a..00000000 --- a/specs/behavior/platform-core/logging/testing.examples/s-010-exact-message-match-works.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.testing.exact-message-match-works -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.testing ---- -# Exact message match works - -## Intent - -- outcome: Executable scenario: Exact message match works - -```gwt -Given a fresh mock logger -When I log an info message "Exact message" -Then hasLoggedMessage for "Exact message" returns true -``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-011-level-and-message-must-both-match.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-011-level-and-message-must-both-match.sdp.md deleted file mode 100644 index caa178fb..00000000 --- a/specs/behavior/platform-core/logging/testing.examples/s-011-level-and-message-must-both-match.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.testing.level-and-message-must-both-match -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.testing ---- -# Level and message must both match - -## Intent - -- outcome: Executable scenario: Level and message must both match - -```gwt -Given a fresh mock logger -When I log "Info message" at INFO and "Error message" at ERROR -Then hasLoggedAt returns the expected results: -``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-012-returns-the-last-call-at-a-given-level.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-012-returns-the-last-call-at-a-given-level.sdp.md deleted file mode 100644 index 6c0d9ea7..00000000 --- a/specs/behavior/platform-core/logging/testing.examples/s-012-returns-the-last-call-at-a-given-level.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.testing.returns-the-last-call-at-a-given-level -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.testing ---- -# Returns the last call at a given level - -## Intent - -- outcome: Executable scenario: Returns the last call at a given level - -```gwt -Given a fresh mock logger -When I log "First info", "Second info", and "Third info" at INFO -Then getLastCallAt INFO should have message "Third info" -``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-013-returns-undefined-when-no-calls-at-level.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-013-returns-undefined-when-no-calls-at-level.sdp.md deleted file mode 100644 index 95b4003d..00000000 --- a/specs/behavior/platform-core/logging/testing.examples/s-013-returns-undefined-when-no-calls-at-level.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.testing.returns-undefined-when-no-calls-at-level -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.testing ---- -# Returns undefined when no calls at level - -## Intent - -- outcome: Executable scenario: Returns undefined when no calls at level - -```gwt -Given a fresh mock logger -When I log an info message "Info message" -Then getLastCallAt ERROR should be undefined -``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-014-multiple-accesses-return-equal-arrays.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-014-multiple-accesses-return-equal-arrays.sdp.md deleted file mode 100644 index 4d6ce456..00000000 --- a/specs/behavior/platform-core/logging/testing.examples/s-014-multiple-accesses-return-equal-arrays.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.testing.multiple-accesses-return-equal-arrays -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.testing ---- -# Multiple accesses return equal arrays - -## Intent - -- outcome: Executable scenario: Multiple accesses return equal arrays - -```gwt -Given a fresh mock logger -When I log an info message "Test" -Then two accesses to the calls property should be equal -``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-015-info-minimum-captures-info-report-warn-error-only.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-015-info-minimum-captures-info-report-warn-error-only.sdp.md deleted file mode 100644 index 80deec41..00000000 --- a/specs/behavior/platform-core/logging/testing.examples/s-015-info-minimum-captures-info-report-warn-error-only.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.testing.info-minimum-captures-info-report-warn-error-only -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.testing ---- -# INFO minimum captures INFO, REPORT, WARN, ERROR only - -## Intent - -- outcome: Executable scenario: INFO minimum captures INFO, REPORT, WARN, ERROR only - -```gwt -Given a filtered mock logger with minimum level "INFO" -When I log one message at each level on the filtered logger -Then the filtered logger should have captured 4 calls -And the filtered logger getCallsAtLevel returns: -``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-016-debug-minimum-captures-all-6-levels.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-016-debug-minimum-captures-all-6-levels.sdp.md deleted file mode 100644 index 8ad4e7f4..00000000 --- a/specs/behavior/platform-core/logging/testing.examples/s-016-debug-minimum-captures-all-6-levels.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.testing.debug-minimum-captures-all-6-levels -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.testing ---- -# DEBUG minimum captures all 6 levels - -## Intent - -- outcome: Executable scenario: DEBUG minimum captures all 6 levels - -```gwt -Given a filtered mock logger with minimum level "DEBUG" -When I log one message at each level on the filtered logger -Then the filtered logger should have captured 6 calls -``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-017-error-minimum-captures-only-error.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-017-error-minimum-captures-only-error.sdp.md deleted file mode 100644 index 59bd3a32..00000000 --- a/specs/behavior/platform-core/logging/testing.examples/s-017-error-minimum-captures-only-error.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.testing.error-minimum-captures-only-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.testing ---- -# ERROR minimum captures only ERROR - -## Intent - -- outcome: Executable scenario: ERROR minimum captures only ERROR - -```gwt -Given a filtered mock logger with minimum level "ERROR" -When I log one message at each level on the filtered logger -Then the filtered logger should have captured 1 calls -And the filtered logger first call level should be "ERROR" -``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-018-warn-minimum-captures-warn-and-error.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-018-warn-minimum-captures-warn-and-error.sdp.md deleted file mode 100644 index a5f9fd23..00000000 --- a/specs/behavior/platform-core/logging/testing.examples/s-018-warn-minimum-captures-warn-and-error.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.testing.warn-minimum-captures-warn-and-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.testing ---- -# WARN minimum captures WARN and ERROR - -## Intent - -- outcome: Executable scenario: WARN minimum captures WARN and ERROR - -```gwt -Given a filtered mock logger with minimum level "WARN" -When I log one message at each level on the filtered logger -Then the filtered logger should have captured 2 calls -And the filtered logger getCallsAtLevel returns: -``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-019-clear-resets-filtered-calls.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-019-clear-resets-filtered-calls.sdp.md deleted file mode 100644 index 8e731e34..00000000 --- a/specs/behavior/platform-core/logging/testing.examples/s-019-clear-resets-filtered-calls.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.testing.clear-resets-filtered-calls -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.testing ---- -# Clear resets filtered calls - -## Intent - -- outcome: Executable scenario: Clear resets filtered calls - -```gwt -Given a filtered mock logger with minimum level "INFO" -When I log an info and a debug message on the filtered logger and then clear -Then the filtered logger should have captured 0 calls -``` diff --git a/specs/behavior/platform-core/logging/testing.examples/s-020-has-logged-message-only-searches-filtered-calls.sdp.md b/specs/behavior/platform-core/logging/testing.examples/s-020-has-logged-message-only-searches-filtered-calls.sdp.md deleted file mode 100644 index 939c4edb..00000000 --- a/specs/behavior/platform-core/logging/testing.examples/s-020-has-logged-message-only-searches-filtered-calls.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.testing.has-logged-message-only-searches-filtered-calls -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.testing ---- -# hasLoggedMessage only searches filtered calls - -## Intent - -- outcome: Executable scenario: hasLoggedMessage only searches filtered calls - -```gwt -Given a filtered mock logger with minimum level "WARN" -When I log "Info message" at INFO and "Warning message" at WARN on the filtered logger -Then filtered hasLoggedMessage returns: -``` diff --git a/specs/behavior/platform-core/logging/testing.sdp.md b/specs/behavior/platform-core/logging/testing.sdp.md index a360b852..20e9a459 100644 --- a/specs/behavior/platform-core/logging/testing.sdp.md +++ b/specs/behavior/platform-core/logging/testing.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.logging.testing kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,16 +11,17 @@ relations: ## Intent - actor: a platform developer -- outcome: mock loggers for testing so that I can assert on log output without real console side effects +- outcome: Capture log method calls on mock loggers so tests can assert on output. +- value: Tests can assert on log output without real console side effects. ## Behavior -- rule: createMockLogger captures all log method calls with metadata -- rule: clear() resets the captured calls array -- rule: getCallsAtLevel filters captured calls by log level -- rule: hasLoggedMessage finds messages by partial text match -- rule: hasLoggedAt checks both level and message text together -- rule: getLastCallAt returns the most recent call at a specific level -- rule: calls property returns consistent array references -- rule: createFilteredMockLogger only captures logs at or above minimum level -- rule: Filtered logger helper methods respect the minimum level filter +- rule: createMockLogger captures all log method calls with metadata. +- rule: clear() resets the captured calls array. +- rule: getCallsAtLevel filters captured calls by log level. +- rule: hasLoggedMessage finds messages by partial text match. +- rule: hasLoggedAt checks both level and message text together. +- rule: getLastCallAt returns the most recent call at a specific level. +- rule: calls property returns consistent array references. +- rule: createFilteredMockLogger only captures logs at or above minimum level. +- rule: Filtered logger helper methods respect the minimum level filter. diff --git a/specs/behavior/platform-core/logging/types.examples/s-001-priority-values-increase-from-debug-to-error.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-001-priority-values-increase-from-debug-to-error.sdp.md deleted file mode 100644 index d65f2766..00000000 --- a/specs/behavior/platform-core/logging/types.examples/s-001-priority-values-increase-from-debug-to-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.types.priority-values-increase-from-debug-to-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.types ---- -# Priority values increase from DEBUG to ERROR - -## Intent - -- outcome: Executable scenario: Priority values increase from DEBUG to ERROR - -```gwt -Given the feature fixture is in place -When I inspect the LOG_LEVEL_PRIORITY map -Then the priority order from lowest to highest is: -``` diff --git a/specs/behavior/platform-core/logging/types.examples/s-002-all-6-log-levels-are-defined-as-numbers.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-002-all-6-log-levels-are-defined-as-numbers.sdp.md deleted file mode 100644 index f8c70d10..00000000 --- a/specs/behavior/platform-core/logging/types.examples/s-002-all-6-log-levels-are-defined-as-numbers.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.types.all-6-log-levels-are-defined-as-numbers -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.types ---- -# All 6 log levels are defined as numbers - -## Intent - -- outcome: Executable scenario: All 6 log levels are defined as numbers - -```gwt -Given the feature fixture is in place -When I inspect the LOG_LEVEL_PRIORITY map -Then all log levels are defined as numbers: -``` diff --git a/specs/behavior/platform-core/logging/types.examples/s-003-default-log-level-is-info.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-003-default-log-level-is-info.sdp.md deleted file mode 100644 index b54858df..00000000 --- a/specs/behavior/platform-core/logging/types.examples/s-003-default-log-level-is-info.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.types.default-log-level-is-info -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.types ---- -# Default log level is INFO - -## Intent - -- outcome: Executable scenario: Default log level is INFO - -```gwt -Given the feature fixture is in place -When I check the DEFAULT_LOG_LEVEL constant -Then it should be "INFO" -``` diff --git a/specs/behavior/platform-core/logging/types.examples/s-004-messages-at-or-above-info-level-pass-the-filter.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-004-messages-at-or-above-info-level-pass-the-filter.sdp.md deleted file mode 100644 index 72b2ef44..00000000 --- a/specs/behavior/platform-core/logging/types.examples/s-004-messages-at-or-above-info-level-pass-the-filter.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.types.messages-at-or-above-info-level-pass-the-filter -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.types ---- -# Messages at or above INFO level pass the filter - -## Intent - -- outcome: Executable scenario: Messages at or above INFO level pass the filter - -```gwt -Given the configured log level is "INFO" -When the scenario runs -Then shouldLog returns true for levels: -``` diff --git a/specs/behavior/platform-core/logging/types.examples/s-005-messages-below-info-level-are-filtered-out.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-005-messages-below-info-level-are-filtered-out.sdp.md deleted file mode 100644 index 5dfde474..00000000 --- a/specs/behavior/platform-core/logging/types.examples/s-005-messages-below-info-level-are-filtered-out.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.types.messages-below-info-level-are-filtered-out -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.types ---- -# Messages below INFO level are filtered out - -## Intent - -- outcome: Executable scenario: Messages below INFO level are filtered out - -```gwt -Given the configured log level is "INFO" -When the scenario runs -Then shouldLog returns false for levels: -``` diff --git a/specs/behavior/platform-core/logging/types.examples/s-006-debug-configured-level-allows-all-messages.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-006-debug-configured-level-allows-all-messages.sdp.md deleted file mode 100644 index 774c83bc..00000000 --- a/specs/behavior/platform-core/logging/types.examples/s-006-debug-configured-level-allows-all-messages.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.types.debug-configured-level-allows-all-messages -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.types ---- -# DEBUG configured level allows all messages - -## Intent - -- outcome: Executable scenario: DEBUG configured level allows all messages - -```gwt -Given the configured log level is "DEBUG" -When the scenario runs -Then shouldLog returns true for levels: -``` diff --git a/specs/behavior/platform-core/logging/types.examples/s-007-error-configured-level-only-allows-error.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-007-error-configured-level-only-allows-error.sdp.md deleted file mode 100644 index f1fac9f3..00000000 --- a/specs/behavior/platform-core/logging/types.examples/s-007-error-configured-level-only-allows-error.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.types.error-configured-level-only-allows-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.types ---- -# ERROR configured level only allows ERROR - -## Intent - -- outcome: Executable scenario: ERROR configured level only allows ERROR - -```gwt -Given the configured log level is "ERROR" -When the scenario runs -Then shouldLog returns false for levels: -And shouldLog returns true for level "ERROR" -``` diff --git a/specs/behavior/platform-core/logging/types.examples/s-008-warn-configured-level-allows-warn-and-error-only.sdp.md b/specs/behavior/platform-core/logging/types.examples/s-008-warn-configured-level-allows-warn-and-error-only.sdp.md deleted file mode 100644 index 4f1e5f63..00000000 --- a/specs/behavior/platform-core/logging/types.examples/s-008-warn-configured-level-allows-warn-and-error-only.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.logging.types.warn-configured-level-allows-warn-and-error-only -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.logging.types ---- -# WARN configured level allows WARN and ERROR only - -## Intent - -- outcome: Executable scenario: WARN configured level allows WARN and ERROR only - -```gwt -Given the configured log level is "WARN" -When the scenario runs -Then shouldLog returns false for levels: -And shouldLog returns true for levels at WARN and above: -``` diff --git a/specs/behavior/platform-core/logging/types.sdp.md b/specs/behavior/platform-core/logging/types.sdp.md index 17f38b36..6176fcff 100644 --- a/specs/behavior/platform-core/logging/types.sdp.md +++ b/specs/behavior/platform-core/logging/types.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.logging.types kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,10 +11,11 @@ relations: ## Intent - actor: a platform developer -- outcome: well-defined log level priorities and filtering so that I can control logging verbosity consistently +- outcome: Define numeric log-level priorities and filter messages against a configured level. +- value: Developers can control logging verbosity consistently. ## Behavior -- rule: LOG_LEVEL_PRIORITY defines numeric ordering for all log levels -- rule: DEFAULT_LOG_LEVEL is INFO -- rule: shouldLog returns true when message level )= configured level +- rule: LOG_LEVEL_PRIORITY defines numeric ordering for all log levels. +- rule: DEFAULT_LOG_LEVEL is INFO. +- rule: shouldLog returns true when message level >= configured level. diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-001-adding-middleware-increases-size-and-returns-pipeline-for-chaining.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-001-adding-middleware-increases-size-and-returns-pipeline-for-chaining.sdp.md deleted file mode 100644 index 83d46cf3..00000000 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-001-adding-middleware-increases-size-and-returns-pipeline-for-chaining.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middleware-pipeline.adding-middleware-increases-size-and-returns-pipeline-for-chaining -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middleware-pipeline ---- -# Adding middleware increases size and returns pipeline for chaining - -## Intent - -- outcome: Executable scenario: Adding middleware increases size and returns pipeline for chaining - -```gwt -Given a new middleware pipeline -When I add a middleware named "a" with order 10 and I chain a middleware named "b" with order 20 -Then the pipeline size is 1 -And use returns the pipeline instance -And the pipeline size is 2 -``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-002-removing-an-existing-middleware-returns-true-and-decreases-size.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-002-removing-an-existing-middleware-returns-true-and-decreases-size.sdp.md deleted file mode 100644 index d36a71d0..00000000 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-002-removing-an-existing-middleware-returns-true-and-decreases-size.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middleware-pipeline.removing-an-existing-middleware-returns-true-and-decreases-size -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middleware-pipeline ---- -# Removing an existing middleware returns true and decreases size - -## Intent - -- outcome: Executable scenario: Removing an existing middleware returns true and decreases size - -```gwt -Given a new middleware pipeline -And middleware "a" with order 10 is registered -And middleware "b" with order 20 is registered -When I remove the middleware named "a" -Then the remove result is true -And the pipeline size is 1 -``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-003-removing-a-non-existent-middleware-returns-false.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-003-removing-a-non-existent-middleware-returns-false.sdp.md deleted file mode 100644 index b22f6a5b..00000000 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-003-removing-a-non-existent-middleware-returns-false.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middleware-pipeline.removing-a-non-existent-middleware-returns-false -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middleware-pipeline ---- -# Removing a non-existent middleware returns false - -## Intent - -- outcome: Executable scenario: Removing a non-existent middleware returns false - -```gwt -Given a new middleware pipeline -When I remove the middleware named "nonexistent" -Then the remove result is false -``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-004-has-returns-true-for-existing-middleware.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-004-has-returns-true-for-existing-middleware.sdp.md deleted file mode 100644 index cfdf0c8a..00000000 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-004-has-returns-true-for-existing-middleware.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middleware-pipeline.has-returns-true-for-existing-middleware -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middleware-pipeline ---- -# has returns true for existing middleware - -## Intent - -- outcome: Executable scenario: has returns true for existing middleware - -```gwt -Given a new middleware pipeline -And middleware "test" with order 10 is registered -When the scenario runs -Then has "test" returns true -``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-005-has-returns-false-for-non-existent-middleware.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-005-has-returns-false-for-non-existent-middleware.sdp.md deleted file mode 100644 index 86af83f6..00000000 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-005-has-returns-false-for-non-existent-middleware.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middleware-pipeline.has-returns-false-for-non-existent-middleware -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middleware-pipeline ---- -# has returns false for non-existent middleware - -## Intent - -- outcome: Executable scenario: has returns false for non-existent middleware - -```gwt -Given a new middleware pipeline -When the scenario runs -Then has "nonexistent" returns false -``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-006-names-are-returned-sorted-by-order.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-006-names-are-returned-sorted-by-order.sdp.md deleted file mode 100644 index fca958b7..00000000 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-006-names-are-returned-sorted-by-order.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middleware-pipeline.names-are-returned-sorted-by-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middleware-pipeline ---- -# Names are returned sorted by order - -## Intent - -- outcome: Executable scenario: Names are returned sorted by order - -```gwt -Given a new middleware pipeline -And middleware "c" with order 30 is registered -And middleware "a" with order 10 is registered -And middleware "b" with order 20 is registered -When the scenario runs -Then getMiddlewareNames returns: -``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-007-handler-executes-directly-with-empty-pipeline.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-007-handler-executes-directly-with-empty-pipeline.sdp.md deleted file mode 100644 index 5c832e4f..00000000 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-007-handler-executes-directly-with-empty-pipeline.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middleware-pipeline.handler-executes-directly-with-empty-pipeline -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middleware-pipeline ---- -# Handler executes directly with empty pipeline - -## Intent - -- outcome: Executable scenario: Handler executes directly with empty pipeline - -```gwt -Given a new middleware pipeline -When I execute with no middlewares and a success handler -Then the execution result status is "success" -``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-008-before-hooks-run-in-order-10-then-20.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-008-before-hooks-run-in-order-10-then-20.sdp.md deleted file mode 100644 index 7a59206a..00000000 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-008-before-hooks-run-in-order-10-then-20.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middleware-pipeline.before-hooks-run-in-order-10-then-20 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middleware-pipeline ---- -# Before hooks run in order 10 then 20 - -## Intent - -- outcome: Executable scenario: Before hooks run in order 10 then 20 - -```gwt -Given a new middleware pipeline -And a before-hook middleware "first" with order 10 that records its name -And a before-hook middleware "second" with order 20 that records its name -When I execute the pipeline with a success handler -Then the recorded execution order is: -``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-009-after-hooks-run-in-order-20-then-10.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-009-after-hooks-run-in-order-20-then-10.sdp.md deleted file mode 100644 index 8a2718b3..00000000 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-009-after-hooks-run-in-order-20-then-10.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middleware-pipeline.after-hooks-run-in-order-20-then-10 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middleware-pipeline ---- -# After hooks run in order 20 then 10 - -## Intent - -- outcome: Executable scenario: After hooks run in order 20 then 10 - -```gwt -Given a new middleware pipeline -And an after-hook middleware "first" with order 10 that records its name -And an after-hook middleware "second" with order 20 that records its name -When I execute the pipeline with a success handler -Then the recorded execution order is: -``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-010-short-circuit-prevents-subsequent-middleware-execution.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-010-short-circuit-prevents-subsequent-middleware-execution.sdp.md deleted file mode 100644 index c9f8915d..00000000 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-010-short-circuit-prevents-subsequent-middleware-execution.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middleware-pipeline.short-circuit-prevents-subsequent-middleware-execution -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middleware-pipeline ---- -# Short-circuit prevents subsequent middleware execution - -## Intent - -- outcome: Executable scenario: Short-circuit prevents subsequent middleware execution - -```gwt -Given a new middleware pipeline -And a before-hook middleware "validator" with order 10 that short-circuits with VALIDATION_ERROR -And a before-hook middleware "auth" with order 20 that records its name -When I execute the pipeline with a success handler -Then the execution result status is "rejected" -And the recorded execution order contains only: -``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-011-enricher-middleware-passes-custom-context-to-subsequent-middleware.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-011-enricher-middleware-passes-custom-context-to-subsequent-middleware.sdp.md deleted file mode 100644 index 40f14a76..00000000 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-011-enricher-middleware-passes-custom-context-to-subsequent-middleware.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middleware-pipeline.enricher-middleware-passes-custom-context-to-subsequent-middleware -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middleware-pipeline ---- -# Enricher middleware passes custom context to subsequent middleware - -## Intent - -- outcome: Executable scenario: Enricher middleware passes custom context to subsequent middleware - -```gwt -Given a new middleware pipeline -And a before-hook middleware "enricher" with order 10 that sets custom.enriched to true -And a before-hook middleware "checker" with order 20 that captures the context -When I execute the pipeline with a success handler -Then the captured context has custom.enriched set to true -``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-012-throwing-before-hook-produces-middleware-error.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-012-throwing-before-hook-produces-middleware-error.sdp.md deleted file mode 100644 index 27ca79b8..00000000 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-012-throwing-before-hook-produces-middleware-error.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middleware-pipeline.throwing-before-hook-produces-middleware-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middleware-pipeline ---- -# Throwing before hook produces middleware error - -## Intent - -- outcome: Executable scenario: Throwing before hook produces middleware error - -```gwt -Given a new middleware pipeline -And a before-hook middleware "failing" with order 10 that throws "Middleware failed" -When I execute the pipeline with a success handler -Then the execution result status is "rejected" -And the rejection code is "MIDDLEWARE_ERROR" -And the rejection reason is "Middleware failed" -``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-013-throwing-handler-produces-handler-error.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-013-throwing-handler-produces-handler-error.sdp.md deleted file mode 100644 index 2330600a..00000000 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-013-throwing-handler-produces-handler-error.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middleware-pipeline.throwing-handler-produces-handler-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middleware-pipeline ---- -# Throwing handler produces handler error - -## Intent - -- outcome: Executable scenario: Throwing handler produces handler error - -```gwt -Given a new middleware pipeline -When I execute the pipeline with a handler that throws "Handler failed" -Then the execution result status is "rejected" -And the rejection code is "HANDLER_ERROR" -And the rejection reason is "Handler failed" -``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-014-failing-after-hook-does-not-prevent-other-after-hooks.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-014-failing-after-hook-does-not-prevent-other-after-hooks.sdp.md deleted file mode 100644 index b36e1dee..00000000 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-014-failing-after-hook-does-not-prevent-other-after-hooks.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middleware-pipeline.failing-after-hook-does-not-prevent-other-after-hooks -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middleware-pipeline ---- -# Failing after hook does not prevent other after hooks - -## Intent - -- outcome: Executable scenario: Failing after hook does not prevent other after hooks - -```gwt -Given a new middleware pipeline -And an after-hook middleware "failing" with order 10 that throws in after -And an after-hook middleware "succeeding" with order 20 that records its name in after -When I execute the pipeline with a success handler -Then both after hooks were called -And the execution result status is "success" -``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-015-only-pre-short-circuit-middleware-after-hooks-run.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-015-only-pre-short-circuit-middleware-after-hooks-run.sdp.md deleted file mode 100644 index 738ec290..00000000 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-015-only-pre-short-circuit-middleware-after-hooks-run.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middleware-pipeline.only-pre-short-circuit-middleware-after-hooks-run -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middleware-pipeline ---- -# Only pre-short-circuit middleware after hooks run - -## Intent - -- outcome: Executable scenario: Only pre-short-circuit middleware after hooks run - -```gwt -Given a new middleware pipeline -And a middleware "first" with order 10 and both hooks that records in after -And a middleware "shortcircuit" with order 20 that short-circuits and records in after -And a middleware "third" with order 30 and both hooks that records in after -When I execute the pipeline with a success handler -Then the after hooks called are only: -``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-016-clear-empties-the-pipeline.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-016-clear-empties-the-pipeline.sdp.md deleted file mode 100644 index 87b4da6f..00000000 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-016-clear-empties-the-pipeline.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middleware-pipeline.clear-empties-the-pipeline -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middleware-pipeline ---- -# Clear empties the pipeline - -## Intent - -- outcome: Executable scenario: Clear empties the pipeline - -```gwt -Given a new middleware pipeline -And middleware "a" with order 10 is registered -And middleware "b" with order 20 is registered -When I clear the pipeline -Then the pipeline size is 0 -``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-017-clone-has-same-middlewares-but-is-independent.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-017-clone-has-same-middlewares-but-is-independent.sdp.md deleted file mode 100644 index 46af869e..00000000 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-017-clone-has-same-middlewares-but-is-independent.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middleware-pipeline.clone-has-same-middlewares-but-is-independent -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middleware-pipeline ---- -# Clone has same middlewares but is independent - -## Intent - -- outcome: Executable scenario: Clone has same middlewares but is independent - -```gwt -Given a new middleware pipeline -And middleware "a" with order 10 is registered -And middleware "b" with order 20 is registered -When I clone the pipeline and I add a middleware named "c" with order 30 to the clone -Then the cloned pipeline size is 2 -And the cloned pipeline middleware names are: -And the original pipeline size is 2 -And the cloned pipeline size is 3 -``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-018-factory-creates-pipeline-without-options.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-018-factory-creates-pipeline-without-options.sdp.md deleted file mode 100644 index a33a2b49..00000000 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-018-factory-creates-pipeline-without-options.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middleware-pipeline.factory-creates-pipeline-without-options -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middleware-pipeline ---- -# Factory creates pipeline without options - -## Intent - -- outcome: Executable scenario: Factory creates pipeline without options - -```gwt -Given the feature fixture is in place -When I create a pipeline via factory -Then the result is a MiddlewarePipeline instance -``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-019-factory-creates-pipeline-with-debug-option.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-019-factory-creates-pipeline-with-debug-option.sdp.md deleted file mode 100644 index 63a6a35e..00000000 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.examples/s-019-factory-creates-pipeline-with-debug-option.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middleware-pipeline.factory-creates-pipeline-with-debug-option -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middleware-pipeline ---- -# Factory creates pipeline with debug option - -## Intent - -- outcome: Executable scenario: Factory creates pipeline with debug option - -```gwt -Given the feature fixture is in place -When I create a pipeline via factory with debug true -Then the result is a MiddlewarePipeline instance -``` diff --git a/specs/behavior/platform-core/middleware/middleware-pipeline.sdp.md b/specs/behavior/platform-core/middleware/middleware-pipeline.sdp.md index 0fcd0d88..c9ddb9d6 100644 --- a/specs/behavior/platform-core/middleware/middleware-pipeline.sdp.md +++ b/specs/behavior/platform-core/middleware/middleware-pipeline.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.middleware.middleware-pipeline kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,9 @@ relations: ## Intent -- outcome: MiddlewarePipeline orchestration +- actor: a platform developer +- outcome: Orchestrate middleware execution in registration order so before/after hooks, short-circuiting, and handler errors stay consistent. +- value: Command handlers pick up validation, authorization, and logging without each handler reimplementing those concerns. ## Behavior diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-001-structure-validation-has-correct-order.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-001-structure-validation-has-correct-order.sdp.md deleted file mode 100644 index 15987e98..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-001-structure-validation-has-correct-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.structure-validation-has-correct-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Structure validation has correct order - -## Intent - -- outcome: Executable scenario: Structure validation has correct order - -```gwt -Given the structure validation order constant -When the scenario runs -Then the order value is 10 -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-002-valid-payload-passes-structure-validation.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-002-valid-payload-passes-structure-validation.sdp.md deleted file mode 100644 index f8432bd8..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-002-valid-payload-passes-structure-validation.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.valid-payload-passes-structure-validation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Valid payload passes structure validation - -## Intent - -- outcome: Executable scenario: Valid payload passes structure validation - -```gwt -Given a structure validation middleware with a CreateOrder schema requiring orderId and customerId -When the middleware processes a valid CreateOrder command -Then the before hook returns continue true -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-003-invalid-payload-is-rejected-by-structure-validation.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-003-invalid-payload-is-rejected-by-structure-validation.sdp.md deleted file mode 100644 index 2a91ae54..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-003-invalid-payload-is-rejected-by-structure-validation.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.invalid-payload-is-rejected-by-structure-validation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Invalid payload is rejected by structure validation - -## Intent - -- outcome: Executable scenario: Invalid payload is rejected by structure validation - -```gwt -Given a structure validation middleware with a CreateOrder schema requiring orderId, customerId, and amount -When the middleware processes a CreateOrder command missing the amount field -Then the before hook returns continue false -And the result status is "rejected" -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-004-unregistered-command-skips-structure-validation.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-004-unregistered-command-skips-structure-validation.sdp.md deleted file mode 100644 index 9a5dc990..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-004-unregistered-command-skips-structure-validation.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.unregistered-command-skips-structure-validation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Unregistered command skips structure validation - -## Intent - -- outcome: Executable scenario: Unregistered command skips structure validation - -```gwt -Given a structure validation middleware with no schemas -When the middleware processes a valid CreateOrder command -Then the before hook returns continue true -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-005-registry-validation-validates-against-registry-schema.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-005-registry-validation-validates-against-registry-schema.sdp.md deleted file mode 100644 index 7dcb25ac..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-005-registry-validation-validates-against-registry-schema.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.registry-validation-validates-against-registry-schema -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Registry validation validates against registry schema - -## Intent - -- outcome: Executable scenario: Registry validation validates against registry schema - -```gwt -Given a registry validation middleware with a CreateOrder registration -When the middleware processes a valid CreateOrder command -Then the before hook returns continue true -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-006-registry-validation-skips-unregistered-commands.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-006-registry-validation-skips-unregistered-commands.sdp.md deleted file mode 100644 index af6ec101..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-006-registry-validation-skips-unregistered-commands.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.registry-validation-skips-unregistered-commands -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Registry validation skips unregistered commands - -## Intent - -- outcome: Executable scenario: Registry validation skips unregistered commands - -```gwt -Given a registry validation middleware with no registrations -When the middleware processes a valid CreateOrder command -Then the before hook returns continue true -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-007-domain-validation-has-correct-order.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-007-domain-validation-has-correct-order.sdp.md deleted file mode 100644 index 79e85299..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-007-domain-validation-has-correct-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.domain-validation-has-correct-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Domain validation has correct order - -## Intent - -- outcome: Executable scenario: Domain validation has correct order - -```gwt -Given the domain validation order constant -When the scenario runs -Then the order value is 20 -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-008-domain-validation-passes-when-validator-returns-undefined.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-008-domain-validation-passes-when-validator-returns-undefined.sdp.md deleted file mode 100644 index d2473c8f..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-008-domain-validation-passes-when-validator-returns-undefined.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.domain-validation-passes-when-validator-returns-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Domain validation passes when validator returns undefined - -## Intent - -- outcome: Executable scenario: Domain validation passes when validator returns undefined - -```gwt -Given a domain validation middleware where CreateOrder validator returns undefined -When the middleware processes a valid CreateOrder command -Then the before hook returns continue true -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-009-domain-validation-rejects-when-validator-returns-error-message.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-009-domain-validation-rejects-when-validator-returns-error-message.sdp.md deleted file mode 100644 index c926323f..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-009-domain-validation-rejects-when-validator-returns-error-message.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.domain-validation-rejects-when-validator-returns-error-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Domain validation rejects when validator returns error message - -## Intent - -- outcome: Executable scenario: Domain validation rejects when validator returns error message - -```gwt -Given a domain validation middleware where CreateOrder validator returns "Order already exists" -When the middleware processes a valid CreateOrder command -Then the before hook returns continue false -And the result status is "rejected" -And the result reason is "Order already exists" -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-010-domain-validation-skips-commands-without-validators.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-010-domain-validation-skips-commands-without-validators.sdp.md deleted file mode 100644 index e2f7b048..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-010-domain-validation-skips-commands-without-validators.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.domain-validation-skips-commands-without-validators -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Domain validation skips commands without validators - -## Intent - -- outcome: Executable scenario: Domain validation skips commands without validators - -```gwt -Given a domain validation middleware with no validators -When the middleware processes a valid CreateOrder command -Then the before hook returns continue true -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-011-combined-validators-return-first-error.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-011-combined-validators-return-first-error.sdp.md deleted file mode 100644 index 7b8e8a24..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-011-combined-validators-return-first-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.combined-validators-return-first-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Combined validators return first error - -## Intent - -- outcome: Executable scenario: Combined validators return first error - -```gwt -Given a combined validator with validators returning undefined, "Error from second", "Error from third" -When the combined validator runs -Then the combined result is "Error from second" -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-012-combined-validators-return-undefined-when-all-pass.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-012-combined-validators-return-undefined-when-all-pass.sdp.md deleted file mode 100644 index 9aaab7df..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-012-combined-validators-return-undefined-when-all-pass.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.combined-validators-return-undefined-when-all-pass -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Combined validators return undefined when all pass - -## Intent - -- outcome: Executable scenario: Combined validators return undefined when all pass - -```gwt -Given a combined validator with all validators returning undefined -When the combined validator runs -Then the combined result is undefined -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-013-required-string-validates-non-empty-strings.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-013-required-string-validates-non-empty-strings.sdp.md deleted file mode 100644 index 803038e9..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-013-required-string-validates-non-empty-strings.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.required-string-validates-non-empty-strings -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# requiredString validates non-empty strings - -## Intent - -- outcome: Executable scenario: requiredString validates non-empty strings - -```gwt -Given a requiredString validator for field "name" -When the scenario runs -Then validating the field produces expected results: -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-014-positive-number-validates-positive-numbers.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-014-positive-number-validates-positive-numbers.sdp.md deleted file mode 100644 index 4015f57c..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-014-positive-number-validates-positive-numbers.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.positive-number-validates-positive-numbers -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# positiveNumber validates positive numbers - -## Intent - -- outcome: Executable scenario: positiveNumber validates positive numbers - -```gwt -Given a positiveNumber validator for field "quantity" -When the scenario runs -Then validating the number field produces expected results: -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-015-number-range-validates-within-range.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-015-number-range-validates-within-range.sdp.md deleted file mode 100644 index 2382667a..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-015-number-range-validates-within-range.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.number-range-validates-within-range -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# numberRange validates within range - -## Intent - -- outcome: Executable scenario: numberRange validates within range - -```gwt -Given a numberRange validator for field "score" with min 0 and max 100 -When the scenario runs -Then validating the number field in range produces expected results: -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-016-starts-with-prefix-validates-prefix.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-016-starts-with-prefix-validates-prefix.sdp.md deleted file mode 100644 index 2c3973f6..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-016-starts-with-prefix-validates-prefix.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.starts-with-prefix-validates-prefix -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# startsWithPrefix validates prefix - -## Intent - -- outcome: Executable scenario: startsWithPrefix validates prefix - -```gwt -Given a startsWithPrefix validator for field "orderId" with prefix "ord_" -When the scenario runs -Then validating the prefix field produces expected results: -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-017-authorization-has-correct-order.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-017-authorization-has-correct-order.sdp.md deleted file mode 100644 index 033da4a0..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-017-authorization-has-correct-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.authorization-has-correct-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Authorization has correct order - -## Intent - -- outcome: Executable scenario: Authorization has correct order - -```gwt -Given the authorization order constant -When the scenario runs -Then the order value is 30 -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-018-authorization-allows-when-checker-returns-allowed-true.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-018-authorization-allows-when-checker-returns-allowed-true.sdp.md deleted file mode 100644 index 44f5c80b..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-018-authorization-allows-when-checker-returns-allowed-true.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.authorization-allows-when-checker-returns-allowed-true -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Authorization allows when checker returns allowed true - -## Intent - -- outcome: Executable scenario: Authorization allows when checker returns allowed true - -```gwt -Given an authorization middleware that always allows -When the middleware processes a valid CreateOrder command -Then the before hook returns continue true -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-019-authorization-rejects-when-checker-returns-allowed-false.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-019-authorization-rejects-when-checker-returns-allowed-false.sdp.md deleted file mode 100644 index 957f2654..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-019-authorization-rejects-when-checker-returns-allowed-false.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.authorization-rejects-when-checker-returns-allowed-false -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Authorization rejects when checker returns allowed false - -## Intent - -- outcome: Executable scenario: Authorization rejects when checker returns allowed false - -```gwt -Given an authorization middleware that denies with reason "Access denied" -When the middleware processes a valid CreateOrder command -Then the before hook returns continue false -And the result status is "rejected" -And the result code is "UNAUTHORIZED" -And the result reason is "Access denied" -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-020-authorization-skips-configured-commands.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-020-authorization-skips-configured-commands.sdp.md deleted file mode 100644 index de345e08..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-020-authorization-skips-configured-commands.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.authorization-skips-configured-commands -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Authorization skips configured commands - -## Intent - -- outcome: Executable scenario: Authorization skips configured commands - -```gwt -Given an authorization middleware that denies but skips CreateOrder -When the middleware processes a valid CreateOrder command -Then the before hook returns continue true -And the checker was not called -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-021-role-based-checker-allows-user-with-required-role.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-021-role-based-checker-allows-user-with-required-role.sdp.md deleted file mode 100644 index 76642e65..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-021-role-based-checker-allows-user-with-required-role.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.role-based-checker-allows-user-with-required-role -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Role-based checker allows user with required role - -## Intent - -- outcome: Executable scenario: Role-based checker allows user with required role - -```gwt -Given a role-based checker requiring "user" or "admin" for CreateOrder -When checking authorization for a user with role "user" -Then the authorization result is allowed -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-022-role-based-checker-rejects-user-without-required-role.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-022-role-based-checker-rejects-user-without-required-role.sdp.md deleted file mode 100644 index 30b3cf2f..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-022-role-based-checker-rejects-user-without-required-role.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.role-based-checker-rejects-user-without-required-role -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Role-based checker rejects user without required role - -## Intent - -- outcome: Executable scenario: Role-based checker rejects user without required role - -```gwt -Given a role-based checker requiring "admin" for CreateOrder -When checking authorization for a user with role "user" -Then the authorization result is not allowed -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-023-role-based-checker-requires-authentication.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-023-role-based-checker-requires-authentication.sdp.md deleted file mode 100644 index bd65d543..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-023-role-based-checker-requires-authentication.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.role-based-checker-requires-authentication -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Role-based checker requires authentication - -## Intent - -- outcome: Executable scenario: Role-based checker requires authentication - -```gwt -Given a role-based checker requiring "user" for CreateOrder -When checking authorization with no user role -Then the authorization result is not allowed -And the authorization reason is "Authentication required" -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-024-role-based-checker-allows-when-no-roles-specified.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-024-role-based-checker-allows-when-no-roles-specified.sdp.md deleted file mode 100644 index ec93c872..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-024-role-based-checker-allows-when-no-roles-specified.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.role-based-checker-allows-when-no-roles-specified -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Role-based checker allows when no roles specified - -## Intent - -- outcome: Executable scenario: Role-based checker allows when no roles specified - -```gwt -Given a role-based checker with no role requirements -When checking authorization for a user with role "user" -Then the authorization result is allowed -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-025-logging-has-correct-order.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-025-logging-has-correct-order.sdp.md deleted file mode 100644 index 1383c7d7..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-025-logging-has-correct-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.logging-has-correct-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Logging has correct order - -## Intent - -- outcome: Executable scenario: Logging has correct order - -```gwt -Given the logging order constant -When the scenario runs -Then the order value is 40 -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-026-logging-middleware-logs-before-and-after-execution.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-026-logging-middleware-logs-before-and-after-execution.sdp.md deleted file mode 100644 index e77c7105..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-026-logging-middleware-logs-before-and-after-execution.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.logging-middleware-logs-before-and-after-execution -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Logging middleware logs before and after execution - -## Intent - -- outcome: Executable scenario: Logging middleware logs before and after execution - -```gwt -Given a logging middleware with a mock logger -When the before hook runs for a CreateOrder command and the after hook runs with a success result -Then the logger contains message "Command started: CreateOrder" -And the logger contains message "Command succeeded: CreateOrder" -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-027-logging-middleware-logs-errors-for-failed-commands.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-027-logging-middleware-logs-errors-for-failed-commands.sdp.md deleted file mode 100644 index 32132bb2..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-027-logging-middleware-logs-errors-for-failed-commands.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.logging-middleware-logs-errors-for-failed-commands -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Logging middleware logs errors for failed commands - -## Intent - -- outcome: Executable scenario: Logging middleware logs errors for failed commands - -```gwt -Given a logging middleware with a mock logger -When the after hook runs with a failed result -Then the logger has error-level entries -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-028-no-op-logger-does-not-throw-on-any-level.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-028-no-op-logger-does-not-throw-on-any-level.sdp.md deleted file mode 100644 index 74977642..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-028-no-op-logger-does-not-throw-on-any-level.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.no-op-logger-does-not-throw-on-any-level -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# NoOp logger does not throw on any level - -## Intent - -- outcome: Executable scenario: NoOp logger does not throw on any level - -```gwt -Given a no-op logger -When the scenario runs -Then calling all log levels does not throw -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-029-json-logger-outputs-correctly-formatted-logs.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-029-json-logger-outputs-correctly-formatted-logs.sdp.md deleted file mode 100644 index f36df5ab..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-029-json-logger-outputs-correctly-formatted-logs.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.json-logger-outputs-correctly-formatted-logs -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# JSON logger outputs correctly formatted logs - -## Intent - -- outcome: Executable scenario: JSON logger outputs correctly formatted logs - -```gwt -Given a JSON logger without timestamps -When logging an info message "test message" with context key "value" -Then the JSON output has level "info" and message "test message" and key "value" -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-030-json-logger-includes-timestamp-when-configured.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-030-json-logger-includes-timestamp-when-configured.sdp.md deleted file mode 100644 index 014e565a..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-030-json-logger-includes-timestamp-when-configured.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.json-logger-includes-timestamp-when-configured -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# JSON logger includes timestamp when configured - -## Intent - -- outcome: Executable scenario: JSON logger includes timestamp when configured - -```gwt -Given a JSON logger with timestamps -When logging an info message "test" -Then the JSON output has a timestamp field -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-031-rate-limit-has-correct-order.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-031-rate-limit-has-correct-order.sdp.md deleted file mode 100644 index 879fbb7d..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-031-rate-limit-has-correct-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.rate-limit-has-correct-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Rate limit has correct order - -## Intent - -- outcome: Executable scenario: Rate limit has correct order - -```gwt -Given the rate limit order constant -When the scenario runs -Then the order value is 50 -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-032-rate-limit-allows-when-not-exceeded.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-032-rate-limit-allows-when-not-exceeded.sdp.md deleted file mode 100644 index d2efa360..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-032-rate-limit-allows-when-not-exceeded.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.rate-limit-allows-when-not-exceeded -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Rate limit allows when not exceeded - -## Intent - -- outcome: Executable scenario: Rate limit allows when not exceeded - -```gwt -Given a rate limit middleware that always allows -When the middleware processes a valid CreateOrder command -Then the before hook returns continue true -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-033-rate-limit-rejects-when-exceeded.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-033-rate-limit-rejects-when-exceeded.sdp.md deleted file mode 100644 index 6feda041..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-033-rate-limit-rejects-when-exceeded.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.rate-limit-rejects-when-exceeded -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Rate limit rejects when exceeded - -## Intent - -- outcome: Executable scenario: Rate limit rejects when exceeded - -```gwt -Given a rate limit middleware that always denies with retryAfterMs 1000 -When the middleware processes a valid CreateOrder command -Then the before hook returns continue false -And the result status is "rejected" -And the result code is "RATE_LIMITED" -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-034-rate-limit-skips-configured-commands.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-034-rate-limit-skips-configured-commands.sdp.md deleted file mode 100644 index b945c435..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-034-rate-limit-skips-configured-commands.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.rate-limit-skips-configured-commands -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# Rate limit skips configured commands - -## Intent - -- outcome: Executable scenario: Rate limit skips configured commands - -```gwt -Given a rate limit middleware that denies but skips CreateOrder -When the middleware processes a valid CreateOrder command -Then the before hook returns continue true -And the rate limit checker was not called -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-035-by-user-id-generates-correct-key.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-035-by-user-id-generates-correct-key.sdp.md deleted file mode 100644 index f3789a47..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-035-by-user-id-generates-correct-key.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.by-user-id-generates-correct-key -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# byUserId generates correct key - -## Intent - -- outcome: Executable scenario: byUserId generates correct key - -```gwt -Given a byUserId key generator -When generating a key for user "user_123" -Then the generated key is "user:user_123" -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-036-by-user-id-handles-anonymous-users.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-036-by-user-id-handles-anonymous-users.sdp.md deleted file mode 100644 index a4e2d209..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-036-by-user-id-handles-anonymous-users.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.by-user-id-handles-anonymous-users -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# byUserId handles anonymous users - -## Intent - -- outcome: Executable scenario: byUserId handles anonymous users - -```gwt -Given a byUserId key generator for anonymous users -When generating a key with no user -Then the generated key is "user:anonymous" -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-037-by-command-type-generates-correct-key.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-037-by-command-type-generates-correct-key.sdp.md deleted file mode 100644 index e801a1d1..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-037-by-command-type-generates-correct-key.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.by-command-type-generates-correct-key -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# byCommandType generates correct key - -## Intent - -- outcome: Executable scenario: byCommandType generates correct key - -```gwt -Given a byCommandType key generator -When generating a key for command type "CreateOrder" -Then the generated key is "command:CreateOrder" -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-038-by-user-and-command-generates-composite-key.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-038-by-user-and-command-generates-composite-key.sdp.md deleted file mode 100644 index ab919cfc..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-038-by-user-and-command-generates-composite-key.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.by-user-and-command-generates-composite-key -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# byUserAndCommand generates composite key - -## Intent - -- outcome: Executable scenario: byUserAndCommand generates composite key - -```gwt -Given a byUserAndCommand key generator -When generating a key for user "user_123" and command "CreateOrder" -Then the generated key is "user:user_123:CreateOrder" -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.examples/s-039-all-middleware-orders-follow-correct-sequence.sdp.md b/specs/behavior/platform-core/middleware/middlewares.examples/s-039-all-middleware-orders-follow-correct-sequence.sdp.md deleted file mode 100644 index 4fcf8174..00000000 --- a/specs/behavior/platform-core/middleware/middlewares.examples/s-039-all-middleware-orders-follow-correct-sequence.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.middleware.middlewares.all-middleware-orders-follow-correct-sequence -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.middleware.middlewares ---- -# All middleware orders follow correct sequence - -## Intent - -- outcome: Executable scenario: All middleware orders follow correct sequence - -```gwt -Given all middleware order constants -When the scenario runs -Then the orders follow the sequence: -``` diff --git a/specs/behavior/platform-core/middleware/middlewares.sdp.md b/specs/behavior/platform-core/middleware/middlewares.sdp.md index 9ca9e087..ea7a42a3 100644 --- a/specs/behavior/platform-core/middleware/middlewares.sdp.md +++ b/specs/behavior/platform-core/middleware/middlewares.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.middleware.middlewares kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,9 @@ relations: ## Intent -- outcome: Built-in middlewares +- actor: a platform developer +- outcome: Provide built-in structure, domain, authorization, logging, and rate-limit middlewares at fixed pipeline orders. +- value: Commands get the same validation and policy pipeline without each bounded context writing its own hooks. ## Behavior diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-001-operation-executes-normally-and-returns-result.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-001-operation-executes-normally-and-returns-result.sdp.md deleted file mode 100644 index 91e4270c..00000000 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-001-operation-executes-normally-and-returns-result.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.monitoring.circuit-breaker.operation-executes-normally-and-returns-result -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.monitoring.circuit-breaker ---- -# Operation executes normally and returns result - -## Intent - -- outcome: Executable scenario: Operation executes normally and returns result - -```gwt -Given a circuit "test-circuit" in closed state -When I execute a succeeding operation through the circuit breaker -Then the operation result is "success" -And the operation was called 1 time -And the circuit state is "closed" -``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-002-circuit-remains-closed-after-a-single-failure.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-002-circuit-remains-closed-after-a-single-failure.sdp.md deleted file mode 100644 index c3564052..00000000 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-002-circuit-remains-closed-after-a-single-failure.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.monitoring.circuit-breaker.circuit-remains-closed-after-a-single-failure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.monitoring.circuit-breaker ---- -# Circuit remains closed after a single failure - -## Intent - -- outcome: Executable scenario: Circuit remains closed after a single failure - -```gwt -Given a circuit "test-circuit" in closed state -When I execute a failing operation through the circuit breaker -Then the operation throws "transient error" -And the circuit state is "closed" -``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-003-circuit-opens-after-default-failure-threshold-of-5-failures.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-003-circuit-opens-after-default-failure-threshold-of-5-failures.sdp.md deleted file mode 100644 index bda8f311..00000000 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-003-circuit-opens-after-default-failure-threshold-of-5-failures.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.monitoring.circuit-breaker.circuit-opens-after-default-failure-threshold-of-5-failures -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.monitoring.circuit-breaker ---- -# Circuit opens after default failure threshold of 5 failures - -## Intent - -- outcome: Executable scenario: Circuit opens after default failure threshold of 5 failures - -```gwt -Given a circuit "test-circuit" in closed state -When I trigger 5 consecutive failures on circuit "test-circuit" -Then the circuit state is "open" -And the next operation on circuit "test-circuit" is rejected without invocation -``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-004-circuit-transitions-to-half-open-after-timeout.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-004-circuit-transitions-to-half-open-after-timeout.sdp.md deleted file mode 100644 index 6b8bc574..00000000 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-004-circuit-transitions-to-half-open-after-timeout.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.monitoring.circuit-breaker.circuit-transitions-to-half-open-after-timeout -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.monitoring.circuit-breaker ---- -# Circuit transitions to half-open after timeout - -## Intent - -- outcome: Executable scenario: Circuit transitions to half-open after timeout - -```gwt -Given a circuit "test-circuit" that has been opened by 5 failures -When I advance time by 60001 milliseconds -Then the circuit state is "half-open" -And a probe operation on circuit "test-circuit" returns "probe success" -``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-005-circuit-closes-on-success-in-half-open-state.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-005-circuit-closes-on-success-in-half-open-state.sdp.md deleted file mode 100644 index 98d917f7..00000000 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-005-circuit-closes-on-success-in-half-open-state.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.monitoring.circuit-breaker.circuit-closes-on-success-in-half-open-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.monitoring.circuit-breaker ---- -# Circuit closes on success in half-open state - -## Intent - -- outcome: Executable scenario: Circuit closes on success in half-open state - -```gwt -Given a circuit "test-circuit" in half-open state -When I execute a succeeding operation returning "recovered" through circuit "test-circuit" -Then the circuit state is "closed" -And a normal operation on circuit "test-circuit" returns "normal" -``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-006-circuit-re-opens-on-failure-in-half-open-state.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-006-circuit-re-opens-on-failure-in-half-open-state.sdp.md deleted file mode 100644 index 6b2e6eaf..00000000 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-006-circuit-re-opens-on-failure-in-half-open-state.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.monitoring.circuit-breaker.circuit-re-opens-on-failure-in-half-open-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.monitoring.circuit-breaker ---- -# Circuit re-opens on failure in half-open state - -## Intent - -- outcome: Executable scenario: Circuit re-opens on failure in half-open state - -```gwt -Given a circuit "test-circuit" in half-open state -When I execute a failing operation throwing "still broken" through circuit "test-circuit" -Then the circuit state is "open" -And the next operation on circuit "test-circuit" is rejected without invocation -``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-007-requires-3-consecutive-successes-in-half-open-to-close-circuit.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-007-requires-3-consecutive-successes-in-half-open-to-close-circuit.sdp.md deleted file mode 100644 index 53b346c8..00000000 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-007-requires-3-consecutive-successes-in-half-open-to-close-circuit.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.monitoring.circuit-breaker.requires-3-consecutive-successes-in-half-open-to-close-circuit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.monitoring.circuit-breaker ---- -# Requires 3 consecutive successes in half-open to close circuit - -## Intent - -- outcome: Executable scenario: Requires 3 consecutive successes in half-open to close circuit - -```gwt -Given a circuit "threshold-circuit" opened with failureThreshold 2 and timeout 5000 and successThreshold 3 -When I advance time by 5001 milliseconds -Then the circuit state for "threshold-circuit" is "half-open" -And the circuit "threshold-circuit" remains half-open after each success until the 3rd with config failureThreshold 2 timeout 5000 successThreshold 3 -``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-008-returns-closed-for-unknown-circuit.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-008-returns-closed-for-unknown-circuit.sdp.md deleted file mode 100644 index 08fabc9f..00000000 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-008-returns-closed-for-unknown-circuit.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.monitoring.circuit-breaker.returns-closed-for-unknown-circuit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.monitoring.circuit-breaker ---- -# Returns closed for unknown circuit - -## Intent - -- outcome: Executable scenario: Returns closed for unknown circuit - -```gwt -Given the feature fixture is in place -When I query the state of circuit "unknown-test" -Then the queried circuit state is "closed" -``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-009-reflects-current-state-after-a-successful-operation.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-009-reflects-current-state-after-a-successful-operation.sdp.md deleted file mode 100644 index fa586f8e..00000000 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-009-reflects-current-state-after-a-successful-operation.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.monitoring.circuit-breaker.reflects-current-state-after-a-successful-operation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.monitoring.circuit-breaker ---- -# Reflects current state after a successful operation - -## Intent - -- outcome: Executable scenario: Reflects current state after a successful operation - -```gwt -Given a circuit "test-circuit" in closed state -When I execute a succeeding operation through the circuit breaker -Then the circuit state is "closed" -``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-010-reset-clears-an-open-circuit-back-to-closed.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-010-reset-clears-an-open-circuit-back-to-closed.sdp.md deleted file mode 100644 index 8a6bbc95..00000000 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-010-reset-clears-an-open-circuit-back-to-closed.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.monitoring.circuit-breaker.reset-clears-an-open-circuit-back-to-closed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.monitoring.circuit-breaker ---- -# Reset clears an open circuit back to closed - -## Intent - -- outcome: Executable scenario: Reset clears an open circuit back to closed - -```gwt -Given a circuit "reset-test" that has been opened by 5 failures -When I reset circuit "reset-test" -Then the circuit state for "reset-test" is "closed" -And a normal operation on circuit "reset-test" returns "back to normal" -``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-011-respects-custom-failure-threshold.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-011-respects-custom-failure-threshold.sdp.md deleted file mode 100644 index 3053628e..00000000 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-011-respects-custom-failure-threshold.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.monitoring.circuit-breaker.respects-custom-failure-threshold -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.monitoring.circuit-breaker ---- -# Respects custom failureThreshold - -## Intent - -- outcome: Executable scenario: Respects custom failureThreshold - -```gwt -Given a circuit "custom-circuit" in closed state -When I trigger 2 consecutive failures on circuit "custom-circuit" with failureThreshold 2 -Then the circuit state for "custom-circuit" is "open" -``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-012-respects-custom-timeout.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-012-respects-custom-timeout.sdp.md deleted file mode 100644 index b97586cf..00000000 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-012-respects-custom-timeout.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.monitoring.circuit-breaker.respects-custom-timeout -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.monitoring.circuit-breaker ---- -# Respects custom timeout - -## Intent - -- outcome: Executable scenario: Respects custom timeout - -```gwt -Given a circuit "custom-circuit" opened with failureThreshold 2 and timeout 5000 -When I advance time by 4000 milliseconds and I advance time by 1001 milliseconds -Then the circuit state for "custom-circuit" is "open" -And the circuit state for "custom-circuit" is "half-open" -``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-013-failure-count-resets-on-success-in-closed-state.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-013-failure-count-resets-on-success-in-closed-state.sdp.md deleted file mode 100644 index e5b00445..00000000 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.examples/s-013-failure-count-resets-on-success-in-closed-state.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.monitoring.circuit-breaker.failure-count-resets-on-success-in-closed-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.monitoring.circuit-breaker ---- -# Failure count resets on success in closed state - -## Intent - -- outcome: Executable scenario: Failure count resets on success in closed state - -```gwt -Given a circuit "test-circuit" in closed state -When I trigger 4 consecutive failures on circuit "test-circuit" and I execute a succeeding operation through the circuit breaker and I trigger 4 more consecutive failures on circuit "test-circuit" -Then the circuit state is "closed" -``` diff --git a/specs/behavior/platform-core/monitoring/circuit-breaker.sdp.md b/specs/behavior/platform-core/monitoring/circuit-breaker.sdp.md index b2d735ea..11f9ae88 100644 --- a/specs/behavior/platform-core/monitoring/circuit-breaker.sdp.md +++ b/specs/behavior/platform-core/monitoring/circuit-breaker.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.monitoring.circuit-breaker kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: a circuit breaker for fault isolation so that cascading failures are prevented when operations fail repeatedly +- outcome: Provide a circuit breaker for fault isolation so cascading failures are prevented when operations fail repeatedly. +- value: After the failure threshold, open circuits reject subsequent calls immediately instead of repeating the same failure. ## Behavior @@ -20,7 +21,7 @@ relations: - rule: An open circuit transitions to half-open after the timeout elapses - rule: A half-open circuit closes on a successful probe - rule: A half-open circuit re-opens on a failed probe -- rule: With successThreshold ) 1, multiple consecutive successes are required to close +- rule: With successThreshold > 1, multiple consecutive successes are required to close - rule: getCircuitState returns the current state of a circuit - rule: resetCircuit clears circuit state back to closed - rule: Custom configuration overrides default thresholds and timeouts diff --git a/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-001-wraps-partition-key-in-structured-field-for-primary-projection.sdp.md b/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-001-wraps-partition-key-in-structured-field-for-primary-projection.sdp.md deleted file mode 100644 index 43c9e955..00000000 --- a/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-001-wraps-partition-key-in-structured-field-for-primary-projection.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.orchestration.command-orchestrator.wraps-partition-key-in-structured-field-for-primary-projection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.orchestration.command-orchestrator ---- -# Wraps partition key in structured field for primary projection - -## Intent - -- outcome: Executable scenario: Wraps partition key in structured field for primary projection - -```gwt -Given an orchestrator with mock dependencies -And a successful command handler result -And a command config with primary projection "orderSummary" partitioned by "orderId" -When I execute the command with orderId "ord_123" -Then the workpool was called at least 1 time -And the workpool call 0 context contains: -And the workpool call 0 partition is name "orderId" value "ord_123" -``` diff --git a/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-002-wraps-partition-key-in-structured-field-for-secondary-projections.sdp.md b/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-002-wraps-partition-key-in-structured-field-for-secondary-projections.sdp.md deleted file mode 100644 index d647565c..00000000 --- a/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-002-wraps-partition-key-in-structured-field-for-secondary-projections.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.platform-core.orchestration.command-orchestrator.wraps-partition-key-in-structured-field-for-secondary-projections -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.orchestration.command-orchestrator ---- -# Wraps partition key in structured field for secondary projections - -## Intent - -- outcome: Executable scenario: Wraps partition key in structured field for secondary projections - -```gwt -Given an orchestrator with mock dependencies -And a successful command handler result -And a command config with primary projection "orderSummary" partitioned by "orderId" -And a secondary projection "orderWithInventory" partitioned by "orderId" -When I execute the command with orderId "ord_456" -Then the workpool was called at least 2 times -And the workpool call 1 context contains: -And the workpool call 1 partition is name "orderId" value "ord_456" -And the primary projection stays on the projection pool -``` diff --git a/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-003-wraps-partition-key-in-structured-field-for-failed-projection.sdp.md b/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-003-wraps-partition-key-in-structured-field-for-failed-projection.sdp.md deleted file mode 100644 index a9dc2040..00000000 --- a/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-003-wraps-partition-key-in-structured-field-for-failed-projection.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.orchestration.command-orchestrator.wraps-partition-key-in-structured-field-for-failed-projection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.orchestration.command-orchestrator ---- -# Wraps partition key in structured field for failed projection - -## Intent - -- outcome: Executable scenario: Wraps partition key in structured field for failed projection - -```gwt -Given an orchestrator with mock dependencies -And a failed command handler result -And a command config with failed projection "reservationFailure" partitioned by "orderId" -When I execute the command with orderId "ord_789" -Then the workpool was called at least 1 time -And the workpool call 0 context contains: -And the workpool call 0 partition is name "orderId" value "ord_789" -``` diff --git a/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-004-routes-saga-work-to-saga-pool-only.sdp.md b/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-004-routes-saga-work-to-saga-pool-only.sdp.md deleted file mode 100644 index 6efaa5ca..00000000 --- a/specs/behavior/platform-core/orchestration/command-orchestrator.examples/s-004-routes-saga-work-to-saga-pool-only.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.orchestration.command-orchestrator.routes-saga-work-to-saga-pool-only -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.orchestration.command-orchestrator ---- -# Routes saga work to sagaPool only - -## Intent - -- outcome: Executable scenario: Routes saga work to sagaPool only - -```gwt -Given an orchestrator with mock dependencies -And a successful command handler result -And a command config with saga routing -When I execute the command with orderId "ord_saga_123" -Then the saga pool should receive exactly one enqueue call -And the fanout pool should remain unused -``` diff --git a/specs/behavior/platform-core/orchestration/command-orchestrator.sdp.md b/specs/behavior/platform-core/orchestration/command-orchestrator.sdp.md index e4b73988..69a37f38 100644 --- a/specs/behavior/platform-core/orchestration/command-orchestrator.sdp.md +++ b/specs/behavior/platform-core/orchestration/command-orchestrator.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.orchestration.command-orchestrator kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: CommandOrchestrator partition key structure +- outcome: The partition context passed to Workpool enqueueMutation uses a structured name and value across primary, secondary, and failed projection paths, and saga routing uses sagaPool. +- value: Workpool enqueue options carry a partition field so projection work stays isolated by key. ## Behavior @@ -18,3 +19,23 @@ relations: - rule: Secondary projections receive structured partition key - rule: Failed projection receives structured partition key - rule: Saga routing uses sagaPool + +## Example space + +```gwt-vocabulary +Given an orchestrator with mock dependencies +And a successful command handler result +And a failed command handler result +And a command config with primary projection {primaryProjection:string} partitioned by "orderId" +And a secondary projection {secondaryProjection:string} partitioned by "orderId" +And a command config with failed projection {failedProjection:string} partitioned by "orderId" +And a command config with saga routing +When I execute the command with orderId {orderId:string} +Then the workpool was called at least 1 time +And the workpool call {callIndex:number} context contains: +And the workpool call {callIndex:number} partition is name "orderId" value {orderId:string} +And the workpool was called at least 2 times +And the primary projection stays on the projection pool +And the saga pool should receive exactly one enqueue call +And the fanout pool should remain unused +``` diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-001-successful-cross-context-coordination.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-001-successful-cross-context-coordination.sdp.md deleted file mode 100644 index 2a0cc144..00000000 --- a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-001-successful-cross-context-coordination.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests.successful-cross-context-coordination -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests ---- -# Successful cross-context coordination - -## Intent - -- outcome: Executable scenario: Successful cross-context coordination - -```gwt -Given the saga registry and Convex Workflow integration are available -And an OrderSubmitted event for order "ord-123" -When the Order Fulfillment saga processes the event -Then it calls Inventory BC to reserve stock -And on success, it confirms the order -And the saga completes with status "completed" -``` diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-002-compensation-on-step-failure.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-002-compensation-on-step-failure.sdp.md deleted file mode 100644 index 13c1d12b..00000000 --- a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-002-compensation-on-step-failure.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests.compensation-on-step-failure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests ---- -# Compensation on step failure - -## Intent - -- outcome: Executable scenario: Compensation on step failure - -```gwt -Given the saga registry and Convex Workflow integration are available -And an OrderSubmitted event for order "ord-456" -When the Inventory BC rejects the reservation (insufficient stock) -Then the saga executes compensation -And the order is cancelled -And the saga completes with status "compensated" -``` diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-003-workflow-resumes-from-the-last-completed-step-after-restart.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-003-workflow-resumes-from-the-last-completed-step-after-restart.sdp.md deleted file mode 100644 index b2aa580e..00000000 --- a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-003-workflow-resumes-from-the-last-completed-step-after-restart.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests.workflow-resumes-from-the-last-completed-step-after-restart -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests ---- -# Workflow resumes from the last completed step after restart - -## Intent - -- outcome: Executable scenario: Workflow resumes from the last completed step after restart - -```gwt -Given the saga registry and Convex Workflow integration are available -And a saga workflow that has completed step 1 and is mid-step 2 -When the server restarts -Then the workflow resumes at step 2 without re-running step 1 -``` diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-004-compensation-executes-in-reverse-order-of-completed-steps.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-004-compensation-executes-in-reverse-order-of-completed-steps.sdp.md deleted file mode 100644 index 17d01faf..00000000 --- a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-004-compensation-executes-in-reverse-order-of-completed-steps.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests.compensation-executes-in-reverse-order-of-completed-steps -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests ---- -# Compensation executes in reverse order of completed steps - -## Intent - -- outcome: Executable scenario: Compensation executes in reverse order of completed steps - -```gwt -Given the saga registry and Convex Workflow integration are available -And a saga that completed steps 1 and 2 then failed at step 3 -When compensation runs -Then step 2's compensation runs before step 1's compensation -``` diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-005-first-trigger-starts-saga.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-005-first-trigger-starts-saga.sdp.md deleted file mode 100644 index 87bb5920..00000000 --- a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-005-first-trigger-starts-saga.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests.first-trigger-starts-saga -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests ---- -# First trigger starts saga - -## Intent - -- outcome: Executable scenario: First trigger starts saga - -```gwt -Given the saga registry and Convex Workflow integration are available -And no saga exists for order "ord-789" -When startSagaIfNotExists is called with sagaId "ord-789" -Then a new saga record is created with status "pending" -And the workflow is started -And the result indicates isNew = true -``` diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-006-duplicate-trigger-returns-existing-saga.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-006-duplicate-trigger-returns-existing-saga.sdp.md deleted file mode 100644 index d892fb3f..00000000 --- a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-006-duplicate-trigger-returns-existing-saga.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests.duplicate-trigger-returns-existing-saga -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests ---- -# Duplicate trigger returns existing saga - -## Intent - -- outcome: Executable scenario: Duplicate trigger returns existing saga - -```gwt -Given the saga registry and Convex Workflow integration are available -And a saga exists for order "ord-789" with status "pending" -When startSagaIfNotExists is called with sagaId "ord-789" again -Then no new saga is created -And the existing saga info is returned -And the result indicates isNew = false -``` diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-007-on-complete-updates-saga-status-after-workflow-finishes.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-007-on-complete-updates-saga-status-after-workflow-finishes.sdp.md deleted file mode 100644 index a2416589..00000000 --- a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.examples/s-007-on-complete-updates-saga-status-after-workflow-finishes.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests.on-complete-updates-saga-status-after-workflow-finishes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.orchestration.saga-orchestration-executable-tests ---- -# onComplete updates saga status after workflow finishes - -## Intent - -- outcome: Executable scenario: onComplete updates saga status after workflow finishes - -```gwt -Given the saga registry and Convex Workflow integration are available -And a saga workflow that completes successfully -When the onComplete callback runs -Then the sagas table row transitions to status "completed" -``` diff --git a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.sdp.md b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.sdp.md index 63aaf1a0..f31002e0 100644 --- a/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.sdp.md +++ b/specs/behavior/platform-core/orchestration/saga-orchestration-executable-tests.sdp.md @@ -10,7 +10,7 @@ relations: ## Intent -- outcome: SagaOrchestration Executable Tests +- outcome: Capture SagaOrchestration rule coverage as executable scenarios until the order-management harness wires compensation, durability, and sagaId idempotency. ## Behavior diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-001-executor-exposes-pm-name-and-event-subscriptions.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-001-executor-exposes-pm-name-and-event-subscriptions.sdp.md deleted file mode 100644 index 4ec590b8..00000000 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-001-executor-exposes-pm-name-and-event-subscriptions.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.executor.executor-exposes-pm-name-and-event-subscriptions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.executor ---- -# Executor exposes pmName and eventSubscriptions - -## Intent - -- outcome: Executable scenario: Executor exposes pmName and eventSubscriptions - -```gwt -Given a PM executor "orderNotification" subscribing to "OrderConfirmed,OrderShipped" -When the scenario runs -Then the executor pmName is "orderNotification" -And the executor eventSubscriptions are "OrderConfirmed,OrderShipped" -``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-002-handles-returns-true-for-subscribed-and-false-for-unsubscribed-events.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-002-handles-returns-true-for-subscribed-and-false-for-unsubscribed-events.sdp.md deleted file mode 100644 index 6f9e97ae..00000000 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-002-handles-returns-true-for-subscribed-and-false-for-unsubscribed-events.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.executor.handles-returns-true-for-subscribed-and-false-for-unsubscribed-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.executor ---- -# handles() returns true for subscribed and false for unsubscribed events - -## Intent - -- outcome: Executable scenario: handles() returns true for subscribed and false for unsubscribed events - -```gwt -Given a PM executor "orderNotification" subscribing to "OrderConfirmed,OrderShipped" -When the scenario runs -Then handles returns expected results for event types: -``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-003-processes-event-and-emits-commands.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-003-processes-event-and-emits-commands.sdp.md deleted file mode 100644 index d11397c2..00000000 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-003-processes-event-and-emits-commands.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.executor.processes-event-and-emits-commands -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.executor ---- -# Processes event and emits commands - -## Intent - -- outcome: Executable scenario: Processes event and emits commands - -```gwt -Given a PM executor "orderNotification" subscribing to "OrderConfirmed" -And the handler returns a "SendNotification" command -When the executor processes an "OrderConfirmed" event -Then the process result status is "processed" -And the handler was called with the event -And 1 command was emitted with commandType "SendNotification" -``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-004-skips-unsubscribed-event-with-not-subscribed-reason.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-004-skips-unsubscribed-event-with-not-subscribed-reason.sdp.md deleted file mode 100644 index 132ba1d0..00000000 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-004-skips-unsubscribed-event-with-not-subscribed-reason.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.executor.skips-unsubscribed-event-with-not-subscribed-reason -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.executor ---- -# Skips unsubscribed event with not_subscribed reason - -## Intent - -- outcome: Executable scenario: Skips unsubscribed event with not_subscribed reason - -```gwt -Given a PM executor "orderNotification" subscribing to "OrderConfirmed" -When the executor processes an "OrderCancelled" event -Then the process result status is "skipped" -And the skip reason is "not_subscribed" -And the handler was not called -``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-005-passes-custom-state-to-handler.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-005-passes-custom-state-to-handler.sdp.md deleted file mode 100644 index bcef46d3..00000000 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-005-passes-custom-state-to-handler.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.executor.passes-custom-state-to-handler -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.executor ---- -# Passes custom state to handler - -## Intent - -- outcome: Executable scenario: Passes custom state to handler - -```gwt -Given a PM executor "orderNotification" subscribing to "OrderConfirmed" -And the PM state store has custom state for "orderNotification:ord_123" -When the executor processes an "OrderConfirmed" event -Then the handler received the custom state -``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-006-uses-stream-id-as-default-instance-id.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-006-uses-stream-id-as-default-instance-id.sdp.md deleted file mode 100644 index 0fccf579..00000000 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-006-uses-stream-id-as-default-instance-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.executor.uses-stream-id-as-default-instance-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.executor ---- -# Uses streamId as default instance ID - -## Intent - -- outcome: Executable scenario: Uses streamId as default instance ID - -```gwt -Given a PM executor "orderNotification" subscribing to "OrderConfirmed" with no custom resolver -When the executor processes an "OrderConfirmed" event with streamId "ord_custom_id" -Then storage getPMState was called with instanceId "ord_custom_id" -``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-007-uses-custom-instance-id-resolver.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-007-uses-custom-instance-id-resolver.sdp.md deleted file mode 100644 index 3663fffa..00000000 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-007-uses-custom-instance-id-resolver.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.executor.uses-custom-instance-id-resolver -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.executor ---- -# Uses custom instance ID resolver - -## Intent - -- outcome: Executable scenario: Uses custom instance ID resolver - -```gwt -Given a PM executor "orderNotification" subscribing to "OrderConfirmed" with a customer-based resolver -When the executor processes an "OrderConfirmed" event with customerId "cust_789" -Then storage getPMState was called with instanceId "customer:cust_789" -``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-008-returns-failed-status-when-handler-throws.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-008-returns-failed-status-when-handler-throws.sdp.md deleted file mode 100644 index 52a2c775..00000000 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-008-returns-failed-status-when-handler-throws.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.executor.returns-failed-status-when-handler-throws -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.executor ---- -# Returns failed status when handler throws - -## Intent - -- outcome: Executable scenario: Returns failed status when handler throws - -```gwt -Given a PM executor "orderNotification" subscribing to "OrderConfirmed" with a throwing handler -When the executor processes an "OrderConfirmed" event -Then the process result status is "failed" -And the result error contains "Handler failed" -And 1 dead letter was recorded -``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-009-returns-failed-status-when-command-emitter-throws.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-009-returns-failed-status-when-command-emitter-throws.sdp.md deleted file mode 100644 index ff796b80..00000000 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-009-returns-failed-status-when-command-emitter-throws.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.executor.returns-failed-status-when-command-emitter-throws -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.executor ---- -# Returns failed status when command emitter throws - -## Intent - -- outcome: Executable scenario: Returns failed status when command emitter throws - -```gwt -Given a PM executor "orderNotification" subscribing to "OrderConfirmed" with a throwing emitter -When the executor processes an "OrderConfirmed" event -Then the process result status is "failed" -And 1 dead letter was recorded -``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-010-returns-all-pm-names.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-010-returns-all-pm-names.sdp.md deleted file mode 100644 index 41d8571c..00000000 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-010-returns-all-pm-names.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.executor.returns-all-pm-names -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.executor ---- -# Returns all PM names - -## Intent - -- outcome: Executable scenario: Returns all PM names - -```gwt -Given a multi-executor with "orderNotification" and "orderAnalytics" -When the scenario runs -Then the multi-executor pmNames are "orderNotification,orderAnalytics" -``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-011-finds-executors-by-event-type.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-011-finds-executors-by-event-type.sdp.md deleted file mode 100644 index 7b5b1394..00000000 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-011-finds-executors-by-event-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.executor.finds-executors-by-event-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.executor ---- -# Finds executors by event type - -## Intent - -- outcome: Executable scenario: Finds executors by event type - -```gwt -Given a multi-executor with "orderNotification" and "orderAnalytics" -When the scenario runs -Then findExecutors returns expected counts: -``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-012-processes-event-through-all-matching-executors.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-012-processes-event-through-all-matching-executors.sdp.md deleted file mode 100644 index 3476e2b4..00000000 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-012-processes-event-through-all-matching-executors.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.executor.processes-event-through-all-matching-executors -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.executor ---- -# Processes event through all matching executors - -## Intent - -- outcome: Executable scenario: Processes event through all matching executors - -```gwt -Given a multi-executor with "orderNotification" and "orderAnalytics" -When processAll is called with an "OrderConfirmed" event -Then processAll returns 2 results -And processAll result 0 has pmName "orderNotification" and status "processed" -And processAll result 1 has pmName "orderAnalytics" and status "processed" -And 2 commands were emitted total -``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-013-returns-empty-array-for-unsubscribed-event.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-013-returns-empty-array-for-unsubscribed-event.sdp.md deleted file mode 100644 index b8cf0b84..00000000 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-013-returns-empty-array-for-unsubscribed-event.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.executor.returns-empty-array-for-unsubscribed-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.executor ---- -# Returns empty array for unsubscribed event - -## Intent - -- outcome: Executable scenario: Returns empty array for unsubscribed event - -```gwt -Given a multi-executor with "orderNotification" and "orderAnalytics" -When processAll is called with an "OrderCancelled" event -Then processAll returns 0 results -And 0 commands were emitted total -``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-014-processes-single-matching-executor.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-014-processes-single-matching-executor.sdp.md deleted file mode 100644 index e5d00c48..00000000 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-014-processes-single-matching-executor.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.executor.processes-single-matching-executor -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.executor ---- -# Processes single matching executor - -## Intent - -- outcome: Executable scenario: Processes single matching executor - -```gwt -Given a multi-executor with "orderNotification" and "orderAnalytics" -When processAll is called with an "OrderShipped" event -Then processAll returns 1 results -And processAll result 0 has pmName "orderAnalytics" and status "processed" -And 1 command was emitted with commandType "TrackEvent" -``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-015-isolates-exceptions-so-other-executors-still-run.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-015-isolates-exceptions-so-other-executors-still-run.sdp.md deleted file mode 100644 index 74a0b557..00000000 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-015-isolates-exceptions-so-other-executors-still-run.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.executor.isolates-exceptions-so-other-executors-still-run -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.executor ---- -# Isolates exceptions so other executors still run - -## Intent - -- outcome: Executable scenario: Isolates exceptions so other executors still run - -```gwt -Given a multi-executor with a throwing executor and "orderNotification" and "orderAnalytics" -When processAll is called with an "OrderConfirmed" event -Then processAll returns 3 results -And processAll result 0 has pmName "throwingPM" and status "failed" -And processAll result 0 error contains "Unexpected executor error" -And processAll result 1 has pmName "orderNotification" and status "processed" -And processAll result 2 has pmName "orderAnalytics" and status "processed" -And 2 commands were emitted total -``` diff --git a/specs/behavior/platform-core/process-manager/executor.examples/s-016-handles-empty-executors-array.sdp.md b/specs/behavior/platform-core/process-manager/executor.examples/s-016-handles-empty-executors-array.sdp.md deleted file mode 100644 index 28813a71..00000000 --- a/specs/behavior/platform-core/process-manager/executor.examples/s-016-handles-empty-executors-array.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.executor.handles-empty-executors-array -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.executor ---- -# Handles empty executors array - -## Intent - -- outcome: Executable scenario: Handles empty executors array - -```gwt -Given an empty multi-executor -When processAll is called with an "OrderConfirmed" event -Then the multi-executor pmNames are empty -And findExecutors for "OrderConfirmed" returns 0 executors -And processAll returns 0 results -``` diff --git a/specs/behavior/platform-core/process-manager/executor.sdp.md b/specs/behavior/platform-core/process-manager/executor.sdp.md index bdabd9ad..7353d291 100644 --- a/specs/behavior/platform-core/process-manager/executor.sdp.md +++ b/specs/behavior/platform-core/process-manager/executor.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.process-manager.executor kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: a process manager executor that routes events to handlers so that process managers react to domain events and emit commands +- outcome: Route process-manager events to handlers so process managers react to domain events and emit commands. +- value: A subscribed event is processed into commands; unsubscribed events and handler failures stay isolated. ## Behavior diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-001-idle-state-allows-start.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-001-idle-state-allows-start.sdp.md deleted file mode 100644 index 5e93a0e7..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-001-idle-state-allows-start.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.idle-state-allows-start -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Idle state allows START - -## Intent - -- outcome: Executable scenario: Idle state allows START - -```gwt -Given the feature fixture is in place -When I check if transition from "idle" with "START" is valid -Then the transition is valid -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-002-idle-state-rejects-invalid-events.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-002-idle-state-rejects-invalid-events.sdp.md deleted file mode 100644 index 7093336a..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-002-idle-state-rejects-invalid-events.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.idle-state-rejects-invalid-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Idle state rejects invalid events - -## Intent - -- outcome: Executable scenario: Idle state rejects invalid events - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isPMValidTransition returns false for: -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-003-processing-state-allows-success-and-fail.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-003-processing-state-allows-success-and-fail.sdp.md deleted file mode 100644 index fdef26a2..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-003-processing-state-allows-success-and-fail.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.processing-state-allows-success-and-fail -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Processing state allows SUCCESS and FAIL - -## Intent - -- outcome: Executable scenario: Processing state allows SUCCESS and FAIL - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isPMValidTransition returns true for: -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-004-processing-state-rejects-invalid-events.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-004-processing-state-rejects-invalid-events.sdp.md deleted file mode 100644 index 28f08a33..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-004-processing-state-rejects-invalid-events.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.processing-state-rejects-invalid-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Processing state rejects invalid events - -## Intent - -- outcome: Executable scenario: Processing state rejects invalid events - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isPMValidTransition returns false for: -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-005-completed-state-allows-reset.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-005-completed-state-allows-reset.sdp.md deleted file mode 100644 index 4ba9c5c9..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-005-completed-state-allows-reset.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.completed-state-allows-reset -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Completed state allows RESET - -## Intent - -- outcome: Executable scenario: Completed state allows RESET - -```gwt -Given the feature fixture is in place -When I check if transition from "completed" with "RESET" is valid -Then the transition is valid -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-006-completed-state-rejects-invalid-events.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-006-completed-state-rejects-invalid-events.sdp.md deleted file mode 100644 index a5c4926b..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-006-completed-state-rejects-invalid-events.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.completed-state-rejects-invalid-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Completed state rejects invalid events - -## Intent - -- outcome: Executable scenario: Completed state rejects invalid events - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isPMValidTransition returns false for: -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-007-failed-state-allows-retry-and-reset.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-007-failed-state-allows-retry-and-reset.sdp.md deleted file mode 100644 index 2e93a05d..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-007-failed-state-allows-retry-and-reset.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.failed-state-allows-retry-and-reset -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Failed state allows RETRY and RESET - -## Intent - -- outcome: Executable scenario: Failed state allows RETRY and RESET - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isPMValidTransition returns true for: -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-008-failed-state-rejects-invalid-events.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-008-failed-state-rejects-invalid-events.sdp.md deleted file mode 100644 index 4a3a53ce..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-008-failed-state-rejects-invalid-events.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.failed-state-rejects-invalid-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Failed state rejects invalid events - -## Intent - -- outcome: Executable scenario: Failed state rejects invalid events - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isPMValidTransition returns false for: -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-009-valid-transitions-return-correct-target-state.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-009-valid-transitions-return-correct-target-state.sdp.md deleted file mode 100644 index 3f42c478..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-009-valid-transitions-return-correct-target-state.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.valid-transitions-return-correct-target-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Valid transitions return correct target state - -## Intent - -- outcome: Executable scenario: Valid transitions return correct target state - -```gwt -Given the feature fixture is in place -When the scenario runs -Then pmTransitionState returns the expected state for: -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md deleted file mode 100644 index 64f5ed73..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.invalid-transitions-return-null -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Invalid transitions return null - -## Intent - -- outcome: Executable scenario: Invalid transitions return null - -```gwt -Given the feature fixture is in place -When the scenario runs -Then pmTransitionState returns null for: -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-011-idle-state-has-exactly-one-valid-event.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-011-idle-state-has-exactly-one-valid-event.sdp.md deleted file mode 100644 index 703e0493..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-011-idle-state-has-exactly-one-valid-event.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.idle-state-has-exactly-one-valid-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Idle state has exactly one valid event - -## Intent - -- outcome: Executable scenario: Idle state has exactly one valid event - -```gwt -Given the feature fixture is in place -When I get valid events from "idle" -Then the valid events contain "START" -And the valid events count is 1 -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-012-processing-state-has-exactly-two-valid-events.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-012-processing-state-has-exactly-two-valid-events.sdp.md deleted file mode 100644 index 2d035c4b..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-012-processing-state-has-exactly-two-valid-events.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.processing-state-has-exactly-two-valid-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Processing state has exactly two valid events - -## Intent - -- outcome: Executable scenario: Processing state has exactly two valid events - -```gwt -Given the feature fixture is in place -When I get valid events from "processing" -Then the valid events contain all of: -And the valid events count is 2 -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-013-completed-state-has-exactly-one-valid-event.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-013-completed-state-has-exactly-one-valid-event.sdp.md deleted file mode 100644 index b258c7dc..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-013-completed-state-has-exactly-one-valid-event.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.completed-state-has-exactly-one-valid-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Completed state has exactly one valid event - -## Intent - -- outcome: Executable scenario: Completed state has exactly one valid event - -```gwt -Given the feature fixture is in place -When I get valid events from "completed" -Then the valid events contain "RESET" -And the valid events count is 1 -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-014-failed-state-has-exactly-two-valid-events.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-014-failed-state-has-exactly-two-valid-events.sdp.md deleted file mode 100644 index 16f7f2be..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-014-failed-state-has-exactly-two-valid-events.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.failed-state-has-exactly-two-valid-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Failed state has exactly two valid events - -## Intent - -- outcome: Executable scenario: Failed state has exactly two valid events - -```gwt -Given the feature fixture is in place -When I get valid events from "failed" -Then the valid events contain all of: -And the valid events count is 2 -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-015-returns-exactly-6-transitions-with-correct-properties.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-015-returns-exactly-6-transitions-with-correct-properties.sdp.md deleted file mode 100644 index b39a508e..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-015-returns-exactly-6-transitions-with-correct-properties.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.returns-exactly-6-transitions-with-correct-properties -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Returns exactly 6 transitions with correct properties - -## Intent - -- outcome: Executable scenario: Returns exactly 6 transitions with correct properties - -```gwt -Given the feature fixture is in place -When I get all PM transitions -Then there are 6 transitions -And each transition has "from", "event", and "to" properties -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-016-all-expected-transitions-are-present.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-016-all-expected-transitions-are-present.sdp.md deleted file mode 100644 index b9bfbd02..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-016-all-expected-transitions-are-present.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.all-expected-transitions-are-present -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# All expected transitions are present - -## Intent - -- outcome: Executable scenario: All expected transitions are present - -```gwt -Given the feature fixture is in place -When I get all PM transitions -Then all expected transitions are present: -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-017-returns-same-array-reference-on-repeated-calls.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-017-returns-same-array-reference-on-repeated-calls.sdp.md deleted file mode 100644 index 0ae09782..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-017-returns-same-array-reference-on-repeated-calls.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.returns-same-array-reference-on-repeated-calls -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Returns same array reference on repeated calls - -## Intent - -- outcome: Executable scenario: Returns same array reference on repeated calls - -```gwt -Given the feature fixture is in place -When I get all PM transitions twice -Then both references are identical -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-018-valid-transition-returns-new-state.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-018-valid-transition-returns-new-state.sdp.md deleted file mode 100644 index 7ad035d2..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-018-valid-transition-returns-new-state.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.valid-transition-returns-new-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Valid transition returns new state - -## Intent - -- outcome: Executable scenario: Valid transition returns new state - -```gwt -Given the feature fixture is in place -When I assert PM transition from "idle" with "START" for "orderNotification" instance "inst-123" -Then the result state is "processing" -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-019-invalid-transition-throws-with-pm-name-and-instance-id.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-019-invalid-transition-throws-with-pm-name-and-instance-id.sdp.md deleted file mode 100644 index 476bdf6b..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-019-invalid-transition-throws-with-pm-name-and-instance-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.invalid-transition-throws-with-pm-name-and-instance-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Invalid transition throws with PM name and instance ID - -## Intent - -- outcome: Executable scenario: Invalid transition throws with PM name and instance ID - -```gwt -Given the feature fixture is in place -When the scenario runs -Then assertPMValidTransition throws for: -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-020-completed-is-terminal.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-020-completed-is-terminal.sdp.md deleted file mode 100644 index bd670704..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-020-completed-is-terminal.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.completed-is-terminal -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Completed is terminal - -## Intent - -- outcome: Executable scenario: Completed is terminal - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isTerminalState returns true for "completed" -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-021-non-terminal-states-return-false.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-021-non-terminal-states-return-false.sdp.md deleted file mode 100644 index 10133da9..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-021-non-terminal-states-return-false.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.non-terminal-states-return-false -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Non-terminal states return false - -## Intent - -- outcome: Executable scenario: Non-terminal states return false - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isTerminalState returns false for: -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-022-failed-is-an-error-state.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-022-failed-is-an-error-state.sdp.md deleted file mode 100644 index 0e0e808c..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-022-failed-is-an-error-state.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.failed-is-an-error-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Failed is an error state - -## Intent - -- outcome: Executable scenario: Failed is an error state - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isErrorState returns true for "failed" -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-023-non-error-states-return-false.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-023-non-error-states-return-false.sdp.md deleted file mode 100644 index 00fbea70..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-023-non-error-states-return-false.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.non-error-states-return-false -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Non-error states return false - -## Intent - -- outcome: Executable scenario: Non-error states return false - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isErrorState returns false for: -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-024-all-non-terminal-states-have-at-least-one-valid-event.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-024-all-non-terminal-states-have-at-least-one-valid-event.sdp.md deleted file mode 100644 index 18528f17..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-024-all-non-terminal-states-have-at-least-one-valid-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.all-non-terminal-states-have-at-least-one-valid-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# All non-terminal states have at least one valid event - -## Intent - -- outcome: Executable scenario: All non-terminal states have at least one valid event - -```gwt -Given the feature fixture is in place -When the scenario runs -Then every non-terminal state has at least one valid event -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-025-critical-reachability-paths-exist.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-025-critical-reachability-paths-exist.sdp.md deleted file mode 100644 index e8c860ee..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-025-critical-reachability-paths-exist.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.critical-reachability-paths-exist -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Critical reachability paths exist - -## Intent - -- outcome: Executable scenario: Critical reachability paths exist - -```gwt -Given the feature fixture is in place -When the scenario runs -Then pmTransitionState returns the expected state for: -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-026-happy-path-idle-to-processing-to-completed.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-026-happy-path-idle-to-processing-to-completed.sdp.md deleted file mode 100644 index af38edc2..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-026-happy-path-idle-to-processing-to-completed.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.happy-path-idle-to-processing-to-completed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Happy path - idle to processing to completed - -## Intent - -- outcome: Executable scenario: Happy path - idle to processing to completed - -```gwt -Given PM state is "idle" -When I apply events in sequence: -Then the final PM state is "completed" -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-027-failure-path-idle-to-processing-to-failed.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-027-failure-path-idle-to-processing-to-failed.sdp.md deleted file mode 100644 index 0bc3c5f0..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-027-failure-path-idle-to-processing-to-failed.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.failure-path-idle-to-processing-to-failed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Failure path - idle to processing to failed - -## Intent - -- outcome: Executable scenario: Failure path - idle to processing to failed - -```gwt -Given PM state is "idle" -When I apply events in sequence: -Then the final PM state is "failed" -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-028-retry-workflow-idle-to-processing-to-failed-to-processing-to-completed.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-028-retry-workflow-idle-to-processing-to-failed-to-processing-to-completed.sdp.md deleted file mode 100644 index efea3c51..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-028-retry-workflow-idle-to-processing-to-failed-to-processing-to-completed.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.retry-workflow-idle-to-processing-to-failed-to-processing-to-completed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Retry workflow - idle to processing to failed to processing to completed - -## Intent - -- outcome: Executable scenario: Retry workflow - idle to processing to failed to processing to completed - -```gwt -Given PM state is "idle" -When I apply events in sequence: -Then the final PM state is "completed" -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-029-time-triggered-pm-workflow-idle-to-processing-to-completed-to-idle.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-029-time-triggered-pm-workflow-idle-to-processing-to-completed-to-idle.sdp.md deleted file mode 100644 index 61a28f29..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-029-time-triggered-pm-workflow-idle-to-processing-to-completed-to-idle.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.time-triggered-pm-workflow-idle-to-processing-to-completed-to-idle -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Time-triggered PM workflow - idle to processing to completed to idle - -## Intent - -- outcome: Executable scenario: Time-triggered PM workflow - idle to processing to completed to idle - -```gwt -Given PM state is "idle" -When I apply events in sequence: -Then the final PM state is "idle" -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-030-failed-reset-workflow-idle-to-processing-to-failed-to-idle.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.examples/s-030-failed-reset-workflow-idle-to-processing-to-failed-to-idle.sdp.md deleted file mode 100644 index 73d9a4a4..00000000 --- a/specs/behavior/platform-core/process-manager/lifecycle.examples/s-030-failed-reset-workflow-idle-to-processing-to-failed-to-idle.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.lifecycle.failed-reset-workflow-idle-to-processing-to-failed-to-idle -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.lifecycle ---- -# Failed reset workflow - idle to processing to failed to idle - -## Intent - -- outcome: Executable scenario: Failed reset workflow - idle to processing to failed to idle - -```gwt -Given PM state is "idle" -When I apply events in sequence: -Then the final PM state is "idle" -``` diff --git a/specs/behavior/platform-core/process-manager/lifecycle.sdp.md b/specs/behavior/platform-core/process-manager/lifecycle.sdp.md index a087c396..b7735f35 100644 --- a/specs/behavior/platform-core/process-manager/lifecycle.sdp.md +++ b/specs/behavior/platform-core/process-manager/lifecycle.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.process-manager.lifecycle kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: a process manager lifecycle state machine so that PM state transitions are validated and auditable +- outcome: Validate process-manager state transitions through a lifecycle state machine so PM state changes stay auditable. +- value: Allowed events move a PM through idle, processing, completed, and failed without inventing extra transitions. ## Behavior diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-001-register-a-single-process-manager.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-001-register-a-single-process-manager.sdp.md deleted file mode 100644 index 9f110f1e..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-001-register-a-single-process-manager.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.register-a-single-process-manager -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Register a single process manager - -## Intent - -- outcome: Executable scenario: Register a single process manager - -```gwt -Given an empty registry -When I register the "orderNotification" process manager -Then the registry has "orderNotification" -And the registry size is 1 -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-002-register-multiple-process-managers.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-002-register-multiple-process-managers.sdp.md deleted file mode 100644 index 84a646ca..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-002-register-multiple-process-managers.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.register-multiple-process-managers -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Register multiple process managers - -## Intent - -- outcome: Executable scenario: Register multiple process managers - -```gwt -Given an empty registry -When I register all three process managers -Then the registry size is 3 -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-003-duplicate-registration-throws-an-error.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-003-duplicate-registration-throws-an-error.sdp.md deleted file mode 100644 index 27e5e44d..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-003-duplicate-registration-throws-an-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.duplicate-registration-throws-an-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Duplicate registration throws an error - -## Intent - -- outcome: Executable scenario: Duplicate registration throws an error - -```gwt -Given an empty registry -When I register the "orderNotification" process manager -Then registering "orderNotification" again throws "is already registered" -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-004-get-returns-pm-by-name.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-004-get-returns-pm-by-name.sdp.md deleted file mode 100644 index ef283d8f..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-004-get-returns-pm-by-name.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.get-returns-pm-by-name -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Get returns PM by name - -## Intent - -- outcome: Executable scenario: Get returns PM by name - -```gwt -Given a registry with orderNotification and reservationExpiration -When I get the process manager "orderNotification" -Then the returned PM name is "orderNotification" -And the returned PM trigger type is "event" -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-005-get-returns-undefined-for-unknown-pm.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-005-get-returns-undefined-for-unknown-pm.sdp.md deleted file mode 100644 index f617d13f..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-005-get-returns-undefined-for-unknown-pm.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.get-returns-undefined-for-unknown-pm -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Get returns undefined for unknown PM - -## Intent - -- outcome: Executable scenario: Get returns undefined for unknown PM - -```gwt -Given a registry with orderNotification and reservationExpiration -When I get the process manager "unknownPM" -Then the returned PM is undefined -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-006-has-returns-true-for-registered-pm.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-006-has-returns-true-for-registered-pm.sdp.md deleted file mode 100644 index 791bb82b..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-006-has-returns-true-for-registered-pm.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.has-returns-true-for-registered-pm -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Has returns true for registered PM - -## Intent - -- outcome: Executable scenario: Has returns true for registered PM - -```gwt -Given an empty registry -When I register the "orderNotification" process manager -Then the registry has "orderNotification" -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-007-has-returns-false-for-unregistered-pm.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-007-has-returns-false-for-unregistered-pm.sdp.md deleted file mode 100644 index 893ce41f..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-007-has-returns-false-for-unregistered-pm.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.has-returns-false-for-unregistered-pm -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Has returns false for unregistered PM - -## Intent - -- outcome: Executable scenario: Has returns false for unregistered PM - -```gwt -Given an empty registry -When the scenario runs -Then the registry does not have "unknownPM" -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md deleted file mode 100644 index e10dbbfa..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.list-returns-empty-array-for-empty-registry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# List returns empty array for empty registry - -## Intent - -- outcome: Executable scenario: List returns empty array for empty registry - -```gwt -Given an empty registry -When the scenario runs -Then the list is empty -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-009-list-returns-all-registered-p-ms.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-009-list-returns-all-registered-p-ms.sdp.md deleted file mode 100644 index 296a4eb9..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-009-list-returns-all-registered-p-ms.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.list-returns-all-registered-p-ms -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# List returns all registered projections - -## Intent - -- outcome: Executable scenario: List returns all registered projections - -```gwt -Given a registry with "orderSummary" and "productCatalog" projections -When I list all projections -Then the list has 2 projections -And the list contains all of: -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md deleted file mode 100644 index 9902b9b3..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.size-is-0-for-empty-registry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Size is 0 for empty registry - -## Intent - -- outcome: Executable scenario: Size is 0 for empty registry - -```gwt -Given an empty registry -When the scenario runs -Then the registry size is 0 -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-011-size-reflects-registration-count.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-011-size-reflects-registration-count.sdp.md deleted file mode 100644 index f89a9e3c..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-011-size-reflects-registration-count.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.size-reflects-registration-count -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Size reflects registration count - -## Intent - -- outcome: Executable scenario: Size reflects registration count - -```gwt -Given a registry with orderNotification and reservationExpiration -When the scenario runs -Then the registry size is 2 -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-012-returns-pm-subscribed-to-a-specific-event.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-012-returns-pm-subscribed-to-a-specific-event.sdp.md deleted file mode 100644 index 227c9f1a..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-012-returns-pm-subscribed-to-a-specific-event.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.returns-pm-subscribed-to-a-specific-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Returns PM subscribed to a specific event - -## Intent - -- outcome: Executable scenario: Returns PM subscribed to a specific event - -```gwt -Given a fully populated registry -When I query PMs by trigger event "OrderConfirmed" -Then the trigger event result contains 1 PM -And the trigger event result includes "orderNotification" -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-013-returns-pm-for-shared-event-across-hybrid-pm.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-013-returns-pm-for-shared-event-across-hybrid-pm.sdp.md deleted file mode 100644 index 937801a8..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-013-returns-pm-for-shared-event-across-hybrid-pm.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.returns-pm-for-shared-event-across-hybrid-pm -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Returns PM for shared event across hybrid PM - -## Intent - -- outcome: Executable scenario: Returns PM for shared event across hybrid PM - -```gwt -Given a fully populated registry -When I query PMs by trigger event "OrderPaid" -Then the trigger event result contains 1 PM -And the trigger event result includes "orderFulfillment" -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-014-returns-empty-for-unknown-event-type.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-014-returns-empty-for-unknown-event-type.sdp.md deleted file mode 100644 index 0c15a857..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-014-returns-empty-for-unknown-event-type.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.returns-empty-for-unknown-event-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Returns empty for unknown event type - -## Intent - -- outcome: Executable scenario: Returns empty for unknown event type - -```gwt -Given a fully populated registry -When I query PMs by trigger event "UnknownEvent" -Then the trigger event result is empty -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-015-returns-empty-for-event-matching-no-subscriptions.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-015-returns-empty-for-event-matching-no-subscriptions.sdp.md deleted file mode 100644 index d7cebae4..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-015-returns-empty-for-event-matching-no-subscriptions.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.returns-empty-for-event-matching-no-subscriptions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Returns empty for event matching no subscriptions - -## Intent - -- outcome: Executable scenario: Returns empty for event matching no subscriptions - -```gwt -Given a fully populated registry -When I query PMs by trigger event "ReleaseReservation" -Then the trigger event result is empty -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-016-returns-empty-array-for-empty-registry.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-016-returns-empty-array-for-empty-registry.sdp.md deleted file mode 100644 index 75dc5327..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-016-returns-empty-array-for-empty-registry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.returns-empty-array-for-empty-registry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Returns empty array for empty registry - -## Intent - -- outcome: Executable scenario: Returns empty array for empty registry - -```gwt -Given an empty registry -When the scenario runs -Then getAllTriggerEvents returns an empty array -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-017-returns-unique-sorted-event-types.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-017-returns-unique-sorted-event-types.sdp.md deleted file mode 100644 index 21809ce7..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-017-returns-unique-sorted-event-types.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.returns-unique-sorted-event-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Returns unique sorted event types - -## Intent - -- outcome: Executable scenario: Returns unique sorted event types - -```gwt -Given an empty registry -When I register the "orderNotification" process manager and I also register the "orderFulfillment" process manager -Then getAllTriggerEvents result is sorted and unique -And getAllTriggerEvents contains all of: -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-018-returns-empty-array-for-empty-registry-for-commands.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-018-returns-empty-array-for-empty-registry-for-commands.sdp.md deleted file mode 100644 index 407de666..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-018-returns-empty-array-for-empty-registry-for-commands.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.returns-empty-array-for-empty-registry-for-commands -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Returns empty array for empty registry for commands - -## Intent - -- outcome: Executable scenario: Returns empty array for empty registry for commands - -```gwt -Given an empty registry -When the scenario runs -Then getAllEmittedCommands returns an empty array -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-019-returns-unique-sorted-command-types.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-019-returns-unique-sorted-command-types.sdp.md deleted file mode 100644 index abc6c67c..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-019-returns-unique-sorted-command-types.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.returns-unique-sorted-command-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Returns unique sorted command types - -## Intent - -- outcome: Executable scenario: Returns unique sorted command types - -```gwt -Given a fully populated registry -When the scenario runs -Then getAllEmittedCommands result is sorted and unique -And getAllEmittedCommands contains all of: -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-020-filters-by-orders-context.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-020-filters-by-orders-context.sdp.md deleted file mode 100644 index 731154b7..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-020-filters-by-orders-context.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.filters-by-orders-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Filters by orders context - -## Intent - -- outcome: Executable scenario: Filters by orders context - -```gwt -Given a fully populated registry -When I query PMs by context "orders" -Then the context result contains 2 PMs -And the context result includes these PM names: -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-021-filters-by-inventory-context.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-021-filters-by-inventory-context.sdp.md deleted file mode 100644 index 9c0dc6b0..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-021-filters-by-inventory-context.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.filters-by-inventory-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Filters by inventory context - -## Intent - -- outcome: Executable scenario: Filters by inventory context - -```gwt -Given a fully populated registry -When I query PMs by context "inventory" -Then the context result contains 1 PM -And the context result first PM is "reservationExpiration" -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-022-returns-empty-for-unknown-context.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-022-returns-empty-for-unknown-context.sdp.md deleted file mode 100644 index c1eb7572..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-022-returns-empty-for-unknown-context.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.returns-empty-for-unknown-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Returns empty for unknown context - -## Intent - -- outcome: Executable scenario: Returns empty for unknown context - -```gwt -Given a fully populated registry -When I query PMs by context "unknown" -Then the context result is empty -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-023-filters-by-event-trigger-type.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-023-filters-by-event-trigger-type.sdp.md deleted file mode 100644 index acd4aab5..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-023-filters-by-event-trigger-type.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.filters-by-event-trigger-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Filters by event trigger type - -## Intent - -- outcome: Executable scenario: Filters by event trigger type - -```gwt -Given a fully populated registry -When I query PMs by trigger type "event" -Then the trigger type result contains 1 PM -And the trigger type result first PM is "orderNotification" -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-024-filters-by-time-trigger-type.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-024-filters-by-time-trigger-type.sdp.md deleted file mode 100644 index dbd49401..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-024-filters-by-time-trigger-type.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.filters-by-time-trigger-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Filters by time trigger type - -## Intent - -- outcome: Executable scenario: Filters by time trigger type - -```gwt -Given a fully populated registry -When I query PMs by trigger type "time" -Then the trigger type result contains 1 PM -And the trigger type result first PM is "reservationExpiration" -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-025-filters-by-hybrid-trigger-type.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-025-filters-by-hybrid-trigger-type.sdp.md deleted file mode 100644 index 369b827e..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-025-filters-by-hybrid-trigger-type.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.filters-by-hybrid-trigger-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Filters by hybrid trigger type - -## Intent - -- outcome: Executable scenario: Filters by hybrid trigger type - -```gwt -Given a fully populated registry -When I query PMs by trigger type "hybrid" -Then the trigger type result contains 1 PM -And the trigger type result first PM is "orderFulfillment" -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-026-returns-time-and-hybrid-triggered-p-ms.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-026-returns-time-and-hybrid-triggered-p-ms.sdp.md deleted file mode 100644 index b9490738..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-026-returns-time-and-hybrid-triggered-p-ms.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.returns-time-and-hybrid-triggered-p-ms -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# GetByCategory returns integration projections - -## Intent - -- outcome: Executable scenario: GetByCategory returns integration projections - -```gwt -Given a registry with all five category projections -When I get projections by category "integration" -Then the category lookup returns 1 projection -And the first category lookup result is "orderWithInventory" -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-027-excludes-event-only-triggered-p-ms.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-027-excludes-event-only-triggered-p-ms.sdp.md deleted file mode 100644 index 18b17f21..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-027-excludes-event-only-triggered-p-ms.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.excludes-event-only-triggered-p-ms -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# GetByCategory returns empty when no projections match - -## Intent - -- outcome: Executable scenario: GetByCategory returns empty when no projections match - -```gwt -Given a registry with the "orderSummary" projection -When I get projections by category "logic" -Then the category lookup returns 0 projections -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-028-all-time-triggered-p-ms-have-cron-config.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-028-all-time-triggered-p-ms-have-cron-config.sdp.md deleted file mode 100644 index 42c9c102..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-028-all-time-triggered-p-ms-have-cron-config.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.all-time-triggered-p-ms-have-cron-config -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# GetByCategory verifies all results have requested category - -## Intent - -- outcome: Executable scenario: GetByCategory verifies all results have requested category - -```gwt -Given a registry with all five category projections -When I get projections by category "view" -Then all returned projections have category "view" -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-029-find-all-handlers-for-order-shipped-event.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-029-find-all-handlers-for-order-shipped-event.sdp.md deleted file mode 100644 index 9400c714..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-029-find-all-handlers-for-order-shipped-event.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.find-all-handlers-for-order-shipped-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Find all handlers for OrderShipped event - -## Intent - -- outcome: Executable scenario: Find all handlers for OrderShipped event - -```gwt -Given an empty registry -When I register the "orderNotification" process manager and I also register the "orderFulfillment" process manager and I query PMs by trigger event "OrderShipped" -Then the trigger event result contains 1 PM -And the trigger event result includes "orderNotification" -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-030-get-all-time-triggered-p-ms-for-cron-scheduling.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-030-get-all-time-triggered-p-ms-for-cron-scheduling.sdp.md deleted file mode 100644 index ec1e9393..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-030-get-all-time-triggered-p-ms-for-cron-scheduling.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.get-all-time-triggered-p-ms-for-cron-scheduling -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Category index is maintained incrementally - -## Intent - -- outcome: Executable scenario: Category index is maintained incrementally - -```gwt -Given an empty projection registry -When I register "orderSummary" with category "view" and I register "orderExistence" with category "logic" and I register "productCatalog" with category "view" -Then the category lookup for "view" returns 1 projection -And the category counts are: -And the category lookup for "view" returns 2 projections -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-031-pm-with-empty-subscriptions-and-commands-is-handled-correctly.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-031-pm-with-empty-subscriptions-and-commands-is-handled-correctly.sdp.md deleted file mode 100644 index 42b3ea4b..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-031-pm-with-empty-subscriptions-and-commands-is-handled-correctly.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.pm-with-empty-subscriptions-and-commands-is-handled-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# PM with empty subscriptions and commands is handled correctly - -## Intent - -- outcome: Executable scenario: PM with empty subscriptions and commands is handled correctly - -```gwt -Given an empty registry -When I register a no-op time-triggered process manager -Then the registry has "noopPM" -And the registry size is 1 -And getAllTriggerEvents returns an empty array -And getAllEmittedCommands returns an empty array -And getByTriggerType "time" returns 1 PM named "noopPM" -And getTimeTriggeredPMs returns 1 PM -And querying by trigger event "SomeEvent" returns empty -``` diff --git a/specs/behavior/platform-core/process-manager/registry.examples/s-032-mixed-p-ms-where-some-have-empty-arrays.sdp.md b/specs/behavior/platform-core/process-manager/registry.examples/s-032-mixed-p-ms-where-some-have-empty-arrays.sdp.md deleted file mode 100644 index 2150cda8..00000000 --- a/specs/behavior/platform-core/process-manager/registry.examples/s-032-mixed-p-ms-where-some-have-empty-arrays.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.registry.mixed-p-ms-where-some-have-empty-arrays -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.registry ---- -# Mixed PMs where some have empty arrays - -## Intent - -- outcome: Executable scenario: Mixed PMs where some have empty arrays - -```gwt -Given an empty registry -When I register the "orderNotification" process manager and I register a no-op time-triggered process manager -Then getAllTriggerEvents contains exactly these events: -And getAllEmittedCommands contains exactly these commands: -``` diff --git a/specs/behavior/platform-core/process-manager/registry.sdp.md b/specs/behavior/platform-core/process-manager/registry.sdp.md index 8237f1f3..d5e4980a 100644 --- a/specs/behavior/platform-core/process-manager/registry.sdp.md +++ b/specs/behavior/platform-core/process-manager/registry.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.process-manager.registry kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: a process manager registry with CRUD and lookup capabilities so that process managers can be registered, retrieved, and queried by various criteria +- outcome: Register, retrieve, and query process managers by event, context, and trigger type. +- value: Event routing and cron setup can enumerate the matching process managers without scanning ad-hoc lists. ## Behavior diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-001-no-correlation-strategy-uses-stream-id.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-001-no-correlation-strategy-uses-stream-id.sdp.md deleted file mode 100644 index 75fc5025..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-001-no-correlation-strategy-uses-stream-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.no-correlation-strategy-uses-stream-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# No correlation strategy uses streamId - -## Intent - -- outcome: Executable scenario: No correlation strategy uses streamId - -```gwt -Given an event with streamId "ord_custom_id" -When I compute PM instance ID without a correlation strategy -Then the instance ID is "ord_custom_id" -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-002-correlation-property-is-extracted-from-payload.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-002-correlation-property-is-extracted-from-payload.sdp.md deleted file mode 100644 index c9079942..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-002-correlation-property-is-extracted-from-payload.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.correlation-property-is-extracted-from-payload -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Correlation property is extracted from payload - -## Intent - -- outcome: Executable scenario: Correlation property is extracted from payload - -```gwt -Given an event with payload property "customerId" set to "cust_888" -When I compute PM instance ID with correlation property "customerId" -Then the instance ID is "cust_888" -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-003-falls-back-to-stream-id-when-correlation-property-not-in-payload.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-003-falls-back-to-stream-id-when-correlation-property-not-in-payload.sdp.md deleted file mode 100644 index 1ab144d0..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-003-falls-back-to-stream-id-when-correlation-property-not-in-payload.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.falls-back-to-stream-id-when-correlation-property-not-in-payload -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Falls back to streamId when correlation property not in payload - -## Intent - -- outcome: Executable scenario: Falls back to streamId when correlation property not in payload - -```gwt -Given an event with streamId "ord_fallback" and payload without "customerId" -When I compute PM instance ID with correlation property "customerId" -Then the instance ID is "ord_fallback" -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-004-falls-back-to-stream-id-when-correlation-property-is-not-a-string.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-004-falls-back-to-stream-id-when-correlation-property-is-not-a-string.sdp.md deleted file mode 100644 index fd56e157..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-004-falls-back-to-stream-id-when-correlation-property-is-not-a-string.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.falls-back-to-stream-id-when-correlation-property-is-not-a-string -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Falls back to streamId when correlation property is not a string - -## Intent - -- outcome: Executable scenario: Falls back to streamId when correlation property is not a string - -```gwt -Given an event with streamId "ord_fallback" and numeric payload property "numericId" -When I compute PM instance ID with correlation property "numericId" -Then the instance ID is "ord_fallback" -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-005-falls-back-to-stream-id-when-correlation-property-is-null.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-005-falls-back-to-stream-id-when-correlation-property-is-null.sdp.md deleted file mode 100644 index e88ddefc..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-005-falls-back-to-stream-id-when-correlation-property-is-null.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.falls-back-to-stream-id-when-correlation-property-is-null -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Falls back to streamId when correlation property is null - -## Intent - -- outcome: Executable scenario: Falls back to streamId when correlation property is null - -```gwt -Given an event with streamId "ord_null_fallback" and null payload property "nullField" -When I compute PM instance ID with correlation property "nullField" -Then the instance ID is "ord_null_fallback" -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-006-falls-back-to-stream-id-when-correlation-property-is-undefined.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-006-falls-back-to-stream-id-when-correlation-property-is-undefined.sdp.md deleted file mode 100644 index 2fc1b66e..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-006-falls-back-to-stream-id-when-correlation-property-is-undefined.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.falls-back-to-stream-id-when-correlation-property-is-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Falls back to streamId when correlation property is undefined - -## Intent - -- outcome: Executable scenario: Falls back to streamId when correlation property is undefined - -```gwt -Given an event with streamId "ord_undefined_fallback" and undefined payload property "undefinedField" -When I compute PM instance ID with correlation property "undefinedField" -Then the instance ID is "ord_undefined_fallback" -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-007-empty-string-correlation-property-value-is-used-as-is.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-007-empty-string-correlation-property-value-is-used-as-is.sdp.md deleted file mode 100644 index 937ea320..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-007-empty-string-correlation-property-value-is-used-as-is.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.empty-string-correlation-property-value-is-used-as-is -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Empty string correlation property value is used as-is - -## Intent - -- outcome: Executable scenario: Empty string correlation property value is used as-is - -```gwt -Given an event with streamId "ord_fallback" and payload property "orderId" set to "" -When I compute PM instance ID with correlation property "orderId" -Then the instance ID is "" -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-008-whitespace-only-correlation-property-value-is-used-as-is.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-008-whitespace-only-correlation-property-value-is-used-as-is.sdp.md deleted file mode 100644 index aaf09d8c..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-008-whitespace-only-correlation-property-value-is-used-as-is.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.whitespace-only-correlation-property-value-is-used-as-is -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Whitespace-only correlation property value is used as-is - -## Intent - -- outcome: Executable scenario: Whitespace-only correlation property value is used as-is - -```gwt -Given an event with streamId "ord_fallback" and payload property "orderId" set to " " -When I compute PM instance ID with correlation property "orderId" -Then the instance ID is " " -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-009-order-id-correlation-strategy-extracts-correctly.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-009-order-id-correlation-strategy-extracts-correctly.sdp.md deleted file mode 100644 index 3b47af7b..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-009-order-id-correlation-strategy-extracts-correctly.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.order-id-correlation-strategy-extracts-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# orderId correlation strategy extracts correctly - -## Intent - -- outcome: Executable scenario: orderId correlation strategy extracts correctly - -```gwt -Given an event with streamId "stream_123" and payload property "orderId" set to "order_specific_id" -When I compute PM instance ID with correlation property "orderId" -Then the instance ID is "order_specific_id" -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-010-subscription-name-without-context.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-010-subscription-name-without-context.sdp.md deleted file mode 100644 index 7358a016..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-010-subscription-name-without-context.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.subscription-name-without-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Subscription name without context - -## Intent - -- outcome: Executable scenario: Subscription name without context - -```gwt -Given a PM definition "orderNotification" without context -When I create a PM subscription -Then the subscription name is "pm:orderNotification" -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-011-subscription-name-with-context.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-011-subscription-name-with-context.sdp.md deleted file mode 100644 index 4f380040..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-011-subscription-name-with-context.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.subscription-name-with-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Subscription name with context - -## Intent - -- outcome: Executable scenario: Subscription name with context - -```gwt -Given a PM definition "orderNotification" with context "orders" -When I create a PM subscription -Then the subscription name is "pm:orders:orderNotification" -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-012-default-priority-is-200.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-012-default-priority-is-200.sdp.md deleted file mode 100644 index 8d1b548e..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-012-default-priority-is-200.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.default-priority-is-200 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Default priority is 200 - -## Intent - -- outcome: Executable scenario: Default priority is 200 - -```gwt -Given a PM definition "orderNotification" without context -When I create a PM subscription -Then the subscription priority is 200 -And the subscription priority equals DEFAULT_PM_SUBSCRIPTION_PRIORITY -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-013-custom-priority-overrides-default.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-013-custom-priority-overrides-default.sdp.md deleted file mode 100644 index 96354e0a..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-013-custom-priority-overrides-default.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.custom-priority-overrides-default -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Custom priority overrides default - -## Intent - -- outcome: Executable scenario: Custom priority overrides default - -```gwt -Given a PM definition "orderNotification" without context -When I create a PM subscription with priority 150 -Then the subscription priority is 150 -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-014-filters-by-event-types-from-pm-definition.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-014-filters-by-event-types-from-pm-definition.sdp.md deleted file mode 100644 index 97ad87d1..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-014-filters-by-event-types-from-pm-definition.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.filters-by-event-types-from-pm-definition -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Filters by event types from PM definition - -## Intent - -- outcome: Executable scenario: Filters by event types from PM definition - -```gwt -Given a PM definition "orderNotification" subscribing to events: -When I create a PM subscription -Then the subscription filters by event types: -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-015-creates-mutable-copy-of-event-types.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-015-creates-mutable-copy-of-event-types.sdp.md deleted file mode 100644 index e7a0c320..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-015-creates-mutable-copy-of-event-types.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.creates-mutable-copy-of-event-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Creates mutable copy of event types - -## Intent - -- outcome: Executable scenario: Creates mutable copy of event types - -```gwt -Given a PM definition "orderNotification" subscribing to events: -When I create a PM subscription -Then the filter event types are a copy not the original reference -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-016-default-to-handler-args-produces-correct-output.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-016-default-to-handler-args-produces-correct-output.sdp.md deleted file mode 100644 index f4a4fc60..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-016-default-to-handler-args-produces-correct-output.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.default-to-handler-args-produces-correct-output -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Default toHandlerArgs produces correct output - -## Intent - -- outcome: Executable scenario: Default toHandlerArgs produces correct output - -```gwt -Given a PM definition "orderNotification" without correlation strategy -And a test event for handler args transformation -And a correlation chain with correlationId "corr_001" -When I create a PM subscription and call toHandlerArgs -Then the handler args contain instanceId "ord_456" -And the handler args contain eventId "evt_test" -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-017-instance-id-from-correlation-strategy.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-017-instance-id-from-correlation-strategy.sdp.md deleted file mode 100644 index 221d3826..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-017-instance-id-from-correlation-strategy.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.instance-id-from-correlation-strategy -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# instanceId from correlation strategy - -## Intent - -- outcome: Executable scenario: instanceId from correlation strategy - -```gwt -Given a PM definition with correlation property "orderId" -And an event in stream "stream_different" with payload property "orderId" set to "ord_from_payload" -And a correlation chain with correlationId "corr_001" -When I create a PM subscription and call toHandlerArgs -Then the handler args contain instanceId "ord_from_payload" -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-018-custom-to-handler-args-transformer-is-used.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-018-custom-to-handler-args-transformer-is-used.sdp.md deleted file mode 100644 index 3204cf58..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-018-custom-to-handler-args-transformer-is-used.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.custom-to-handler-args-transformer-is-used -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Custom toHandlerArgs transformer is used - -## Intent - -- outcome: Executable scenario: Custom toHandlerArgs transformer is used - -```gwt -Given a PM definition "orderNotification" with a custom toHandlerArgs transformer -And an event in stream "ord_123" -And a correlation chain with correlationId "corr_001" -When I create a PM subscription and call toHandlerArgs -Then the custom transformer was called with the event and instanceId "ord_123" -And the handler args contain customField "custom_value" -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-019-default-partition-by-instance-id.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-019-default-partition-by-instance-id.sdp.md deleted file mode 100644 index d2a11c4b..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-019-default-partition-by-instance-id.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.default-partition-by-instance-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Default partition by instanceId - -## Intent - -- outcome: Executable scenario: Default partition by instanceId - -```gwt -Given a PM definition "orderNotification" without correlation strategy -And an event with streamId "ord_partition_test" -When I create a PM subscription and call getPartitionKey -Then the partition key name is "instanceId" -And the partition key value is "ord_partition_test" -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-020-correlation-strategy-affects-partition-key.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-020-correlation-strategy-affects-partition-key.sdp.md deleted file mode 100644 index f63ec6c1..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-020-correlation-strategy-affects-partition-key.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.correlation-strategy-affects-partition-key -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Correlation strategy affects partition key - -## Intent - -- outcome: Executable scenario: Correlation strategy affects partition key - -```gwt -Given a PM definition with correlation property "customerId" -And an event with payload property "customerId" set to "cust_partition" -When I create a PM subscription and call getPartitionKey -Then the partition key name is "instanceId" -And the partition key value is "cust_partition" -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-021-custom-get-partition-key-is-used.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-021-custom-get-partition-key-is-used.sdp.md deleted file mode 100644 index 8f015877..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-021-custom-get-partition-key-is-used.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.custom-get-partition-key-is-used -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Custom getPartitionKey is used - -## Intent - -- outcome: Executable scenario: Custom getPartitionKey is used - -```gwt -Given a PM definition "orderNotification" with a custom getPartitionKey -And an event with streamId "ord_custom" -When I create a PM subscription and call getPartitionKey -Then the custom getPartitionKey was called with the event and instanceId "ord_custom" -And the partition key name is "customPartition" -And the partition key value is "custom:ord_custom" -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-022-handler-reference-is-passed-through.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-022-handler-reference-is-passed-through.sdp.md deleted file mode 100644 index c8e7e88a..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-022-handler-reference-is-passed-through.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.handler-reference-is-passed-through -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Handler reference is passed through - -## Intent - -- outcome: Executable scenario: Handler reference is passed through - -```gwt -Given a PM definition "orderNotification" without context -When I create a PM subscription -Then the subscription handler is the same reference as the input handler -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-023-bulk-creation-produces-correct-subscription-names.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-023-bulk-creation-produces-correct-subscription-names.sdp.md deleted file mode 100644 index f7bd26b4..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-023-bulk-creation-produces-correct-subscription-names.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.bulk-creation-produces-correct-subscription-names -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Bulk creation produces correct subscription names - -## Intent - -- outcome: Executable scenario: Bulk creation produces correct subscription names - -```gwt -Given PM definitions: -When I create PM subscriptions in bulk -Then there are 2 subscriptions -And the subscription names are: -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-024-missing-handler-throws-error.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-024-missing-handler-throws-error.sdp.md deleted file mode 100644 index f694ade6..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-024-missing-handler-throws-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.missing-handler-throws-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Missing handler throws error - -## Intent - -- outcome: Executable scenario: Missing handler throws error - -```gwt -Given PM definitions: -When I create PM subscriptions with only "orderNotification" handler -Then it throws an error about missing handler for "orderAnalytics" -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-025-common-priority-applies-to-all-subscriptions.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-025-common-priority-applies-to-all-subscriptions.sdp.md deleted file mode 100644 index 434e1f83..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-025-common-priority-applies-to-all-subscriptions.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.common-priority-applies-to-all-subscriptions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Common priority applies to all subscriptions - -## Intent - -- outcome: Executable scenario: Common priority applies to all subscriptions - -```gwt -Given PM definitions: -When I create PM subscriptions in bulk with priority 250 -Then all subscriptions have priority 250 -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-026-each-subscription-has-correct-event-filter.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-026-each-subscription-has-correct-event-filter.sdp.md deleted file mode 100644 index 3d0625e9..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-026-each-subscription-has-correct-event-filter.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.each-subscription-has-correct-event-filter -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Each subscription has correct event filter - -## Intent - -- outcome: Executable scenario: Each subscription has correct event filter - -```gwt -Given PM definitions: -When I create PM subscriptions in bulk -Then subscription 0 filters by events "OrderConfirmed" -And subscription 1 also filters by events "OrderConfirmed,OrderShipped" -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-027-empty-definitions-produces-empty-subscriptions.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-027-empty-definitions-produces-empty-subscriptions.sdp.md deleted file mode 100644 index 8a4bf4ce..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-027-empty-definitions-produces-empty-subscriptions.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.empty-definitions-produces-empty-subscriptions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Empty definitions produces empty subscriptions - -## Intent - -- outcome: Executable scenario: Empty definitions produces empty subscriptions - -```gwt -Given the feature fixture is in place -When I create PM subscriptions with no definitions -Then there are 0 subscriptions -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-028-handlers-match-their-definitions.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-028-handlers-match-their-definitions.sdp.md deleted file mode 100644 index c901322c..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-028-handlers-match-their-definitions.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.handlers-match-their-definitions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Handlers match their definitions - -## Intent - -- outcome: Executable scenario: Handlers match their definitions - -```gwt -Given PM definitions: -When I create PM subscriptions in bulk -Then subscription 0 handler is the "orderNotification" mock handler -And subscription 1 also uses the "orderAnalytics" mock handler -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-029-default-priority-constant-is-200.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-029-default-priority-constant-is-200.sdp.md deleted file mode 100644 index fe9f1eee..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-029-default-priority-constant-is-200.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.default-priority-constant-is-200 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Default priority constant is 200 - -## Intent - -- outcome: Executable scenario: Default priority constant is 200 - -```gwt -Given the feature fixture is in place -When the scenario runs -Then DEFAULT_PM_SUBSCRIPTION_PRIORITY is 200 -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.examples/s-030-priority-is-after-projections-and-before-sagas.sdp.md b/specs/behavior/platform-core/process-manager/subscription.examples/s-030-priority-is-after-projections-and-before-sagas.sdp.md deleted file mode 100644 index da6d8ffe..00000000 --- a/specs/behavior/platform-core/process-manager/subscription.examples/s-030-priority-is-after-projections-and-before-sagas.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.subscription.priority-is-after-projections-and-before-sagas -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.subscription ---- -# Priority is after projections and before sagas - -## Intent - -- outcome: Executable scenario: Priority is after projections and before sagas - -```gwt -Given the feature fixture is in place -When the scenario runs -Then DEFAULT_PM_SUBSCRIPTION_PRIORITY is greater than projection priority 100 -And DEFAULT_PM_SUBSCRIPTION_PRIORITY is less than saga priority 300 -``` diff --git a/specs/behavior/platform-core/process-manager/subscription.sdp.md b/specs/behavior/platform-core/process-manager/subscription.sdp.md index 7028939b..3c194ac5 100644 --- a/specs/behavior/platform-core/process-manager/subscription.sdp.md +++ b/specs/behavior/platform-core/process-manager/subscription.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.process-manager.subscription kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: PM subscription helpers for EventBus registration so that process managers can subscribe to domain events with correct instance routing +- outcome: Subscribe process managers to domain events through EventBus helpers with correct instance routing. +- value: Instance identity comes from the correlation strategy or falls back to streamId so handlers see the right PM instance. ## Behavior diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-001-all-valid-pm-statuses-are-accepted.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-001-all-valid-pm-statuses-are-accepted.sdp.md deleted file mode 100644 index f843be4f..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-001-all-valid-pm-statuses-are-accepted.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.all-valid-pm-statuses-are-accepted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# All valid PM statuses are accepted - -## Intent - -- outcome: Executable scenario: All valid PM statuses are accepted - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isProcessManagerStatus returns true for all of: -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-002-every-entry-in-process-manager-statuses-passes-the-guard.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-002-every-entry-in-process-manager-statuses-passes-the-guard.sdp.md deleted file mode 100644 index e94de09f..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-002-every-entry-in-process-manager-statuses-passes-the-guard.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.every-entry-in-process-manager-statuses-passes-the-guard -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# Every entry in PROCESS_MANAGER_STATUSES passes the guard - -## Intent - -- outcome: Executable scenario: Every entry in PROCESS_MANAGER_STATUSES passes the guard - -```gwt -Given the feature fixture is in place -When the scenario runs -Then every value in PROCESS_MANAGER_STATUSES passes isProcessManagerStatus -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-003-invalid-status-strings-are-rejected.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-003-invalid-status-strings-are-rejected.sdp.md deleted file mode 100644 index 56cad649..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-003-invalid-status-strings-are-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.invalid-status-strings-are-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# Invalid status strings are rejected - -## Intent - -- outcome: Executable scenario: Invalid status strings are rejected - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isProcessManagerStatus returns false for strings: -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-004-non-string-values-are-rejected-by-is-process-manager-status.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-004-non-string-values-are-rejected-by-is-process-manager-status.sdp.md deleted file mode 100644 index e9764bb5..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-004-non-string-values-are-rejected-by-is-process-manager-status.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.non-string-values-are-rejected-by-is-process-manager-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# Non-string values are rejected by isProcessManagerStatus - -## Intent - -- outcome: Executable scenario: Non-string values are rejected by isProcessManagerStatus - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isProcessManagerStatus returns false for non-string values -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-005-arrays-containing-valid-statuses-are-rejected-by-is-process-manager-status.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-005-arrays-containing-valid-statuses-are-rejected-by-is-process-manager-status.sdp.md deleted file mode 100644 index c811658c..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-005-arrays-containing-valid-statuses-are-rejected-by-is-process-manager-status.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.arrays-containing-valid-statuses-are-rejected-by-is-process-manager-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# Arrays containing valid statuses are rejected by isProcessManagerStatus - -## Intent - -- outcome: Executable scenario: Arrays containing valid statuses are rejected by isProcessManagerStatus - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isProcessManagerStatus returns false for arrays of valid statuses -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-006-is-process-manager-status-is-case-sensitive.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-006-is-process-manager-status-is-case-sensitive.sdp.md deleted file mode 100644 index 025c3d10..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-006-is-process-manager-status-is-case-sensitive.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.is-process-manager-status-is-case-sensitive -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# isProcessManagerStatus is case-sensitive - -## Intent - -- outcome: Executable scenario: isProcessManagerStatus is case-sensitive - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isProcessManagerStatus returns false for case variants: -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-007-type-narrowing-works-in-conditionals.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-007-type-narrowing-works-in-conditionals.sdp.md deleted file mode 100644 index 9c6d7708..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-007-type-narrowing-works-in-conditionals.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.type-narrowing-works-in-conditionals -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# Type narrowing works in conditionals - -## Intent - -- outcome: Executable scenario: Type narrowing works in conditionals - -```gwt -Given an unknown value "processing" -When I check isProcessManagerStatus on the value -Then the narrowed PM status equals "processing" -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-008-type-guard-works-as-array-filter-predicate.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-008-type-guard-works-as-array-filter-predicate.sdp.md deleted file mode 100644 index 47eac07b..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-008-type-guard-works-as-array-filter-predicate.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.type-guard-works-as-array-filter-predicate -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# Type guard works as array filter predicate - -## Intent - -- outcome: Executable scenario: Type guard works as array filter predicate - -```gwt -Given an array of mixed values including PM statuses -When I filter the array with isProcessManagerStatus -Then the filtered PM result contains exactly: -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-009-process-manager-statuses-contains-exactly-4-statuses-in-order.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-009-process-manager-statuses-contains-exactly-4-statuses-in-order.sdp.md deleted file mode 100644 index 87c3fce7..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-009-process-manager-statuses-contains-exactly-4-statuses-in-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.process-manager-statuses-contains-exactly-4-statuses-in-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# PROCESS_MANAGER_STATUSES contains exactly 4 statuses in order - -## Intent - -- outcome: Executable scenario: PROCESS_MANAGER_STATUSES contains exactly 4 statuses in order - -```gwt -Given the feature fixture is in place -When the scenario runs -Then PROCESS_MANAGER_STATUSES equals exactly: -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-010-process-manager-statuses-is-a-readonly-array-with-correct-bounds.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-010-process-manager-statuses-is-a-readonly-array-with-correct-bounds.sdp.md deleted file mode 100644 index 5ccbf842..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-010-process-manager-statuses-is-a-readonly-array-with-correct-bounds.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.process-manager-statuses-is-a-readonly-array-with-correct-bounds -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# PROCESS_MANAGER_STATUSES is a readonly array with correct bounds - -## Intent - -- outcome: Executable scenario: PROCESS_MANAGER_STATUSES is a readonly array with correct bounds - -```gwt -Given the feature fixture is in place -When the scenario runs -Then PROCESS_MANAGER_STATUSES first element is "idle" -And PROCESS_MANAGER_STATUSES last element is "failed" -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-011-process-manager-statuses-contains-all-lifecycle-states.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-011-process-manager-statuses-contains-all-lifecycle-states.sdp.md deleted file mode 100644 index a20cd72c..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-011-process-manager-statuses-contains-all-lifecycle-states.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.process-manager-statuses-contains-all-lifecycle-states -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# PROCESS_MANAGER_STATUSES contains all lifecycle states - -## Intent - -- outcome: Executable scenario: PROCESS_MANAGER_STATUSES contains all lifecycle states - -```gwt -Given the feature fixture is in place -When the scenario runs -Then PROCESS_MANAGER_STATUSES contains all of: -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-012-process-manager-statuses-is-in-logical-lifecycle-order.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-012-process-manager-statuses-is-in-logical-lifecycle-order.sdp.md deleted file mode 100644 index bf4a77a0..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-012-process-manager-statuses-is-in-logical-lifecycle-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.process-manager-statuses-is-in-logical-lifecycle-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# PROCESS_MANAGER_STATUSES is in logical lifecycle order - -## Intent - -- outcome: Executable scenario: PROCESS_MANAGER_STATUSES is in logical lifecycle order - -```gwt -Given the feature fixture is in place -When the scenario runs -Then PM statuses are in lifecycle order: -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-013-all-valid-dead-letter-statuses-are-accepted.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-013-all-valid-dead-letter-statuses-are-accepted.sdp.md deleted file mode 100644 index deb870b1..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-013-all-valid-dead-letter-statuses-are-accepted.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.all-valid-dead-letter-statuses-are-accepted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# All valid dead letter statuses are accepted - -## Intent - -- outcome: Executable scenario: All valid dead letter statuses are accepted - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isDeadLetterStatus returns true for all of: -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-014-every-entry-in-dead-letter-statuses-passes-the-guard.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-014-every-entry-in-dead-letter-statuses-passes-the-guard.sdp.md deleted file mode 100644 index 6ab6aefe..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-014-every-entry-in-dead-letter-statuses-passes-the-guard.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.every-entry-in-dead-letter-statuses-passes-the-guard -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# Every entry in DEAD_LETTER_STATUSES passes the guard - -## Intent - -- outcome: Executable scenario: Every entry in DEAD_LETTER_STATUSES passes the guard - -```gwt -Given the feature fixture is in place -When the scenario runs -Then every value in DEAD_LETTER_STATUSES passes isDeadLetterStatus -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-015-invalid-status-strings-are-rejected-by-is-dead-letter-status.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-015-invalid-status-strings-are-rejected-by-is-dead-letter-status.sdp.md deleted file mode 100644 index 2a1fec74..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-015-invalid-status-strings-are-rejected-by-is-dead-letter-status.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.invalid-status-strings-are-rejected-by-is-dead-letter-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# Invalid status strings are rejected by isDeadLetterStatus - -## Intent - -- outcome: Executable scenario: Invalid status strings are rejected by isDeadLetterStatus - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isDeadLetterStatus returns false for strings: -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-016-pm-statuses-are-rejected-by-is-dead-letter-status.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-016-pm-statuses-are-rejected-by-is-dead-letter-status.sdp.md deleted file mode 100644 index 2740f95f..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-016-pm-statuses-are-rejected-by-is-dead-letter-status.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.pm-statuses-are-rejected-by-is-dead-letter-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# PM statuses are rejected by isDeadLetterStatus - -## Intent - -- outcome: Executable scenario: PM statuses are rejected by isDeadLetterStatus - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isDeadLetterStatus returns false for PM-domain statuses: -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-017-non-string-values-are-rejected-by-is-dead-letter-status.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-017-non-string-values-are-rejected-by-is-dead-letter-status.sdp.md deleted file mode 100644 index fd87ebb3..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-017-non-string-values-are-rejected-by-is-dead-letter-status.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.non-string-values-are-rejected-by-is-dead-letter-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# Non-string values are rejected by isDeadLetterStatus - -## Intent - -- outcome: Executable scenario: Non-string values are rejected by isDeadLetterStatus - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isDeadLetterStatus returns false for non-string values -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-018-arrays-containing-valid-dl-statuses-are-rejected.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-018-arrays-containing-valid-dl-statuses-are-rejected.sdp.md deleted file mode 100644 index deb3d3c8..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-018-arrays-containing-valid-dl-statuses-are-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.arrays-containing-valid-dl-statuses-are-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# Arrays containing valid DL statuses are rejected - -## Intent - -- outcome: Executable scenario: Arrays containing valid DL statuses are rejected - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isDeadLetterStatus returns false for arrays of valid DL statuses -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-019-is-dead-letter-status-is-case-sensitive.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-019-is-dead-letter-status-is-case-sensitive.sdp.md deleted file mode 100644 index b6c90ca8..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-019-is-dead-letter-status-is-case-sensitive.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.is-dead-letter-status-is-case-sensitive -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# isDeadLetterStatus is case-sensitive - -## Intent - -- outcome: Executable scenario: isDeadLetterStatus is case-sensitive - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isDeadLetterStatus returns false for case variants: -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-020-dl-type-narrowing-works-in-conditionals.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-020-dl-type-narrowing-works-in-conditionals.sdp.md deleted file mode 100644 index 3ae97695..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-020-dl-type-narrowing-works-in-conditionals.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.dl-type-narrowing-works-in-conditionals -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# DL type narrowing works in conditionals - -## Intent - -- outcome: Executable scenario: DL type narrowing works in conditionals - -```gwt -Given an unknown value "replayed" -When I check isDeadLetterStatus on the value -Then the narrowed DL status equals "replayed" -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-021-dl-type-guard-works-as-array-filter-predicate.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-021-dl-type-guard-works-as-array-filter-predicate.sdp.md deleted file mode 100644 index 6ba15503..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-021-dl-type-guard-works-as-array-filter-predicate.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.dl-type-guard-works-as-array-filter-predicate -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# DL type guard works as array filter predicate - -## Intent - -- outcome: Executable scenario: DL type guard works as array filter predicate - -```gwt -Given an array of mixed values including DL statuses -When I filter the array with isDeadLetterStatus -Then the filtered DL result contains exactly: -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-022-dead-letter-statuses-contains-exactly-3-statuses-in-order.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-022-dead-letter-statuses-contains-exactly-3-statuses-in-order.sdp.md deleted file mode 100644 index 60697969..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-022-dead-letter-statuses-contains-exactly-3-statuses-in-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.dead-letter-statuses-contains-exactly-3-statuses-in-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# DEAD_LETTER_STATUSES contains exactly 3 statuses in order - -## Intent - -- outcome: Executable scenario: DEAD_LETTER_STATUSES contains exactly 3 statuses in order - -```gwt -Given the feature fixture is in place -When the scenario runs -Then DEAD_LETTER_STATUSES equals exactly: -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-023-dead-letter-statuses-is-a-readonly-array-with-correct-bounds.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-023-dead-letter-statuses-is-a-readonly-array-with-correct-bounds.sdp.md deleted file mode 100644 index dccf6d5f..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-023-dead-letter-statuses-is-a-readonly-array-with-correct-bounds.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.dead-letter-statuses-is-a-readonly-array-with-correct-bounds -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# DEAD_LETTER_STATUSES is a readonly array with correct bounds - -## Intent - -- outcome: Executable scenario: DEAD_LETTER_STATUSES is a readonly array with correct bounds - -```gwt -Given the feature fixture is in place -When the scenario runs -Then DEAD_LETTER_STATUSES first element is "pending" -And DEAD_LETTER_STATUSES last element is "ignored" -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-024-dead-letter-statuses-contains-all-dead-letter-states.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-024-dead-letter-statuses-contains-all-dead-letter-states.sdp.md deleted file mode 100644 index 1859efa4..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-024-dead-letter-statuses-contains-all-dead-letter-states.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.dead-letter-statuses-contains-all-dead-letter-states -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# DEAD_LETTER_STATUSES contains all dead letter states - -## Intent - -- outcome: Executable scenario: DEAD_LETTER_STATUSES contains all dead letter states - -```gwt -Given the feature fixture is in place -When the scenario runs -Then DEAD_LETTER_STATUSES contains all of: -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-025-dead-letter-statuses-is-in-logical-workflow-order.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-025-dead-letter-statuses-is-in-logical-workflow-order.sdp.md deleted file mode 100644 index 513c1440..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-025-dead-letter-statuses-is-in-logical-workflow-order.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.dead-letter-statuses-is-in-logical-workflow-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# DEAD_LETTER_STATUSES is in logical workflow order - -## Intent - -- outcome: Executable scenario: DEAD_LETTER_STATUSES is in logical workflow order - -```gwt -Given the feature fixture is in place -When the scenario runs -Then DL statuses are in workflow order: -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-026-full-dead-letter-with-all-fields-has-correct-structure.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-026-full-dead-letter-with-all-fields-has-correct-structure.sdp.md deleted file mode 100644 index 5d72ab59..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-026-full-dead-letter-with-all-fields-has-correct-structure.sdp.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.full-dead-letter-with-all-fields-has-correct-structure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# Full dead letter with all fields has correct structure - -## Intent - -- outcome: Executable scenario: Full dead letter with all fields has correct structure - -```gwt -Given a dead letter with all fields populated -When the scenario runs -Then the dead letter has processManagerName "testPM" -And the dead letter has instanceId "inst-123" -And the dead letter has eventId "evt-456" -And the dead letter has error "Command execution failed" -And the dead letter has attemptCount 3 -And the dead letter has status "pending" -And the dead letter failedCommand has commandType "SendNotification" -And the dead letter failedCommand has payload with orderId "ord-789" -And the dead letter has context with retryable true -And the dead letter has a positive failedAt timestamp -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-027-dead-letter-with-only-required-fields-has-undefined-optionals.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-027-dead-letter-with-only-required-fields-has-undefined-optionals.sdp.md deleted file mode 100644 index 3c84397b..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-027-dead-letter-with-only-required-fields-has-undefined-optionals.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.dead-letter-with-only-required-fields-has-undefined-optionals -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# Dead letter with only required fields has undefined optionals - -## Intent - -- outcome: Executable scenario: Dead letter with only required fields has undefined optionals - -```gwt -Given a dead letter with only required fields -When the scenario runs -Then the dead letter eventId is undefined -And the dead letter failedCommand is undefined -And the dead letter context is undefined -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-028-dead-letter-supports-each-status-individually.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-028-dead-letter-supports-each-status-individually.sdp.md deleted file mode 100644 index 0182f549..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-028-dead-letter-supports-each-status-individually.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.dead-letter-supports-each-status-individually -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# Dead letter supports each status individually - -## Intent - -- outcome: Executable scenario: Dead letter supports each status individually - -```gwt -Given the feature fixture is in place -When the scenario runs -Then a dead letter can be created with each status: -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-029-failed-command-captures-command-type-and-complex-payload.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-029-failed-command-captures-command-type-and-complex-payload.sdp.md deleted file mode 100644 index e9254236..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-029-failed-command-captures-command-type-and-complex-payload.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.failed-command-captures-command-type-and-complex-payload -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# failedCommand captures command type and complex payload - -## Intent - -- outcome: Executable scenario: failedCommand captures command type and complex payload - -```gwt -Given a dead letter with a complex failedCommand -When the scenario runs -Then the dead letter failedCommand is defined -And the failedCommand commandType is "SendOrderConfirmation" -And the failedCommand payload has orderId "ord-123" -And the failedCommand payload has customerId "cust-456" -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-030-failed-command-allows-empty-payload.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-030-failed-command-allows-empty-payload.sdp.md deleted file mode 100644 index 0d79e1de..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-030-failed-command-allows-empty-payload.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.failed-command-allows-empty-payload -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# failedCommand allows empty payload - -## Intent - -- outcome: Executable scenario: failedCommand allows empty payload - -```gwt -Given a dead letter with an empty failedCommand payload -When the scenario runs -Then the dead letter failedCommand payload is an empty object -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-031-dead-letter-handles-high-attempt-count.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-031-dead-letter-handles-high-attempt-count.sdp.md deleted file mode 100644 index c80f2d85..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-031-dead-letter-handles-high-attempt-count.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.dead-letter-handles-high-attempt-count -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# Dead letter handles high attempt count - -## Intent - -- outcome: Executable scenario: Dead letter handles high attempt count - -```gwt -Given a dead letter with attemptCount 999 -When the scenario runs -Then the dead letter has attemptCount 999 -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-032-dead-letter-handles-long-error-messages.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-032-dead-letter-handles-long-error-messages.sdp.md deleted file mode 100644 index f1546faa..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-032-dead-letter-handles-long-error-messages.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.dead-letter-handles-long-error-messages -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# Dead letter handles long error messages - -## Intent - -- outcome: Executable scenario: Dead letter handles long error messages - -```gwt -Given a dead letter with a long error message -When the scenario runs -Then the dead letter error matches the long error message -``` diff --git a/specs/behavior/platform-core/process-manager/types.examples/s-033-dead-letter-handles-complex-context-objects.sdp.md b/specs/behavior/platform-core/process-manager/types.examples/s-033-dead-letter-handles-complex-context-objects.sdp.md deleted file mode 100644 index a28eb394..00000000 --- a/specs/behavior/platform-core/process-manager/types.examples/s-033-dead-letter-handles-complex-context-objects.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.types.dead-letter-handles-complex-context-objects -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.types ---- -# Dead letter handles complex context objects - -## Intent - -- outcome: Executable scenario: Dead letter handles complex context objects - -```gwt -Given a dead letter with a complex context object -When the scenario runs -Then the dead letter context has correlationId "corr-123" -And the dead letter context has a metadata property -And the dead letter context has a tags property -``` diff --git a/specs/behavior/platform-core/process-manager/types.sdp.md b/specs/behavior/platform-core/process-manager/types.sdp.md index 69bd4d41..4f88137b 100644 --- a/specs/behavior/platform-core/process-manager/types.sdp.md +++ b/specs/behavior/platform-core/process-manager/types.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.process-manager.types kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: type guards and constants for process manager runtime types so that status values are validated at runtime with full type narrowing +- outcome: Validate process-manager and dead-letter status values at runtime with type guards and canonical status lists. +- value: Callers can narrow status unions and reject invalid strings before they enter PM runtime state. ## Behavior diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-001-process-event-when-no-pm-state-exists.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-001-process-event-when-no-pm-state-exists.sdp.md deleted file mode 100644 index b9ef1290..00000000 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-001-process-event-when-no-pm-state-exists.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.process-event-when-no-pm-state-exists -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint ---- -# Process event when no PM state exists - -## Intent - -- outcome: Executable scenario: Process event when no PM state exists - -```gwt -Given no PM state exists for "orderNotification" instance "ord_123" -When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" -Then the PM result status is "processed" -And the PM result commandsEmitted contains: -And the process callback was invoked 1 time -And the emitCommands callback was invoked 1 time -And the emitted commands list has 1 entry -``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md deleted file mode 100644 index 1d99e745..00000000 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.process-event-when-global-position-exceeds-checkpoint -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint ---- -# Process event when globalPosition exceeds checkpoint - -## Intent - -- outcome: Executable scenario: Process event when globalPosition exceeds checkpoint - -```gwt -Given a PM state exists for "orderNotification" instance "ord_123" at position 1000 with status "idle" -When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 2000 event "evt_002" correlation "corr_002" -Then the PM result status is "processed" -And the process callback was invoked 1 time -``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-003-pm-state-is-updated-after-processing.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-003-pm-state-is-updated-after-processing.sdp.md deleted file mode 100644 index f2968203..00000000 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-003-pm-state-is-updated-after-processing.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.pm-state-is-updated-after-processing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint ---- -# PM state is updated after processing - -## Intent - -- outcome: Executable scenario: PM state is updated after processing - -```gwt -Given no PM state exists for "orderNotification" instance "ord_123" -When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" -Then the saved PM state for "orderNotification" instance "ord_123" has fields: -``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md deleted file mode 100644 index 7d5a2564..00000000 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.skip-event-when-global-position-equals-checkpoint -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint ---- -# Skip event when globalPosition equals checkpoint - -## Intent - -- outcome: Executable scenario: Skip event when globalPosition equals checkpoint - -```gwt -Given a PM state exists for "orderNotification" instance "ord_123" at position 1000 with status "idle" -When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" -Then the PM result status is "skipped" -And the PM result skip reason is "already_processed" -And the process callback was not invoked -And the emitCommands callback was not invoked -``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md deleted file mode 100644 index 0490b4fa..00000000 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.skip-event-when-global-position-is-less-than-checkpoint -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint ---- -# Skip event when globalPosition is less than checkpoint - -## Intent - -- outcome: Executable scenario: Skip event when globalPosition is less than checkpoint - -```gwt -Given a PM state exists for "orderNotification" instance "ord_123" at position 2000 with status "idle" -When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" -Then the PM result status is "skipped" -And the PM result skip reason is "already_processed" -And the process callback was not invoked -``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-006-skip-event-when-pm-is-in-completed-state.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-006-skip-event-when-pm-is-in-completed-state.sdp.md deleted file mode 100644 index cbb333a1..00000000 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-006-skip-event-when-pm-is-in-completed-state.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.skip-event-when-pm-is-in-completed-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint ---- -# Skip event when PM is in completed state - -## Intent - -- outcome: Executable scenario: Skip event when PM is in completed state - -```gwt -Given a PM state exists for "orderNotification" instance "ord_123" at position 1000 with status "completed" -When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 2000 event "evt_002" correlation "corr_002" -Then the PM result status is "skipped" -And the PM result skip reason is "terminal_state" -And the process callback was not invoked -``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-007-separate-instances-are-processed-independently.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-007-separate-instances-are-processed-independently.sdp.md deleted file mode 100644 index 6f5779bc..00000000 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-007-separate-instances-are-processed-independently.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.separate-instances-are-processed-independently -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint ---- -# Separate instances are processed independently - -## Intent - -- outcome: Executable scenario: Separate instances are processed independently - -```gwt -Given no PM state exists for "orderNotification" instance "ord_001" -And no PM state exists for "orderNotification" instance "ord_002" -When I call withPMCheckpoint with pm "orderNotification" instance "ord_001" position 1000 event "evt_001" correlation "corr_001" and I call withPMCheckpoint with pm "orderNotification" instance "ord_002" position 500 event "evt_002" correlation… -Then the saved PM state for "orderNotification" instance "ord_001" has lastGlobalPosition 1000 -And the saved PM state for "orderNotification" instance "ord_002" has lastGlobalPosition 500 -``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-008-retry-succeeds-after-emit-commands-failure.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-008-retry-succeeds-after-emit-commands-failure.sdp.md deleted file mode 100644 index 8825bc2a..00000000 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-008-retry-succeeds-after-emit-commands-failure.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.retry-succeeds-after-emit-commands-failure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint ---- -# Retry succeeds after emitCommands failure - -## Intent - -- outcome: Executable scenario: Retry succeeds after emitCommands failure - -```gwt -Given no PM state exists for "orderNotification" instance "ord_123" -When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 100 event "evt_001" correlation "corr_001" and emitCommands fails on first call and I retry withPMCheckpoint with pm "orderNotification" instance "ord_123" pos… -Then the first call PM result status is "failed" -And the first call PM result error contains "queue unavailable" -And the saved PM state for "orderNotification" instance "ord_123" has status "failed" -And the retry PM result status is "processed" -And the retry PM result commandsEmitted contains: -And the emitted commands list has 1 entry -``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-009-retry-succeeds-when-pm-is-stuck-in-processing-state.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-009-retry-succeeds-when-pm-is-stuck-in-processing-state.sdp.md deleted file mode 100644 index f2158400..00000000 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-009-retry-succeeds-when-pm-is-stuck-in-processing-state.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.retry-succeeds-when-pm-is-stuck-in-processing-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint ---- -# Retry succeeds when PM is stuck in processing state - -## Intent - -- outcome: Executable scenario: Retry succeeds when PM is stuck in processing state - -```gwt -Given a PM state exists for "orderNotification" instance "ord_123" at position 100 with status "processing" -When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 100 event "evt_001" correlation "corr_001" -Then the PM result status is "processed" -And the PM result commandsEmitted contains: -And the emitted commands list has 1 entry -``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-010-reject-negative-global-position.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-010-reject-negative-global-position.sdp.md deleted file mode 100644 index 0ef9a072..00000000 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-010-reject-negative-global-position.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.reject-negative-global-position -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint ---- -# Reject negative globalPosition - -## Intent - -- outcome: Executable scenario: Reject negative globalPosition - -```gwt -Given no PM state exists for "orderNotification" instance "ord_123" -When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position -1 event "evt_001" correlation "corr_001" -Then the PM result status is "failed" -And the PM result error contains "Invalid globalPosition" -And the PM result error contains "-1" -And the process callback was not invoked -And the emitCommands callback was not invoked -``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-011-global-position-zero-is-treated-as-already-processed.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-011-global-position-zero-is-treated-as-already-processed.sdp.md deleted file mode 100644 index 911a251e..00000000 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-011-global-position-zero-is-treated-as-already-processed.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.global-position-zero-is-treated-as-already-processed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint ---- -# GlobalPosition zero is treated as already processed - -## Intent - -- outcome: Executable scenario: GlobalPosition zero is treated as already processed - -```gwt -Given no PM state exists for "orderNotification" instance "ord_123" -When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 0 event "evt_001" correlation "corr_001" -Then the PM result status is "skipped" -And the PM result skip reason is "already_processed" -``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-012-first-real-event-after-initialization-is-processed.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-012-first-real-event-after-initialization-is-processed.sdp.md deleted file mode 100644 index 40bb5c38..00000000 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-012-first-real-event-after-initialization-is-processed.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.first-real-event-after-initialization-is-processed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint ---- -# First real event after initialization is processed - -## Intent - -- outcome: Executable scenario: First real event after initialization is processed - -```gwt -Given no PM state exists for "orderNotification" instance "ord_123" -When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000000000 event "evt_001" correlation "corr_001" -Then the PM result status is "processed" -And the process callback was invoked 1 time -``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-013-dead-letter-recorded-when-process-throws.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-013-dead-letter-recorded-when-process-throws.sdp.md deleted file mode 100644 index e2df8d8f..00000000 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-013-dead-letter-recorded-when-process-throws.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.dead-letter-recorded-when-process-throws -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint ---- -# Dead letter recorded when process throws - -## Intent - -- outcome: Executable scenario: Dead letter recorded when process throws - -```gwt -Given no PM state exists for "orderNotification" instance "ord_123" -When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" and process throws "Handler failed: external service unavailable" -Then the PM result status is "failed" -And the PM result error contains "external service unavailable" -And the dead letters list has 1 entry -And the dead letter at index 0 has pmName "orderNotification" and instanceId "ord_123" -And the saved PM state for "orderNotification" instance "ord_123" has status "failed" -``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-014-dead-letter-recorded-when-emit-commands-throws.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-014-dead-letter-recorded-when-emit-commands-throws.sdp.md deleted file mode 100644 index e3a6af33..00000000 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-014-dead-letter-recorded-when-emit-commands-throws.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.dead-letter-recorded-when-emit-commands-throws -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint ---- -# Dead letter recorded when emitCommands throws - -## Intent - -- outcome: Executable scenario: Dead letter recorded when emitCommands throws - -```gwt -Given no PM state exists for "orderNotification" instance "ord_123" -When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" and emitCommands throws "Command emission failed: queue unavailable" -Then the PM result status is "failed" -And the dead letters list has 1 entry -And the dead letter at index 0 error contains "Command emission failed" -``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-015-commands-failed-counter-is-incremented-on-failure.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-015-commands-failed-counter-is-incremented-on-failure.sdp.md deleted file mode 100644 index f9510975..00000000 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-015-commands-failed-counter-is-incremented-on-failure.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.commands-failed-counter-is-incremented-on-failure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint ---- -# commandsFailed counter is incremented on failure - -## Intent - -- outcome: Executable scenario: commandsFailed counter is incremented on failure - -```gwt -Given no PM state exists for "orderNotification" instance "ord_123" -When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" and emitCommands throws "Emission failed" -Then the saved PM state for "orderNotification" instance "ord_123" has commandsFailed 1 -``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-016-commands-emitted-counter-tracks-multiple-commands.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-016-commands-emitted-counter-tracks-multiple-commands.sdp.md deleted file mode 100644 index b789c3cc..00000000 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-016-commands-emitted-counter-tracks-multiple-commands.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.commands-emitted-counter-tracks-multiple-commands -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint ---- -# commandsEmitted counter tracks multiple commands - -## Intent - -- outcome: Executable scenario: commandsEmitted counter tracks multiple commands - -```gwt -Given no PM state exists for "orderNotification" instance "ord_123" -When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" and process returns 3 commands -Then the saved PM state for "orderNotification" instance "ord_123" has commandsEmitted 3 -``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-017-result-contains-emitted-command-types.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-017-result-contains-emitted-command-types.sdp.md deleted file mode 100644 index 1026943e..00000000 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-017-result-contains-emitted-command-types.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.result-contains-emitted-command-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint ---- -# Result contains emitted command types - -## Intent - -- outcome: Executable scenario: Result contains emitted command types - -```gwt -Given no PM state exists for "orderNotification" instance "ord_123" -When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" and process returns commands "SendEmail,UpdateCRM" -Then the PM result status is "processed" -And the PM result commandsEmitted contains: -``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-018-empty-command-list-produces-no-op-processed-result.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-018-empty-command-list-produces-no-op-processed-result.sdp.md deleted file mode 100644 index 4988ef98..00000000 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-018-empty-command-list-produces-no-op-processed-result.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.empty-command-list-produces-no-op-processed-result -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint ---- -# Empty command list produces no-op processed result - -## Intent - -- outcome: Executable scenario: Empty command list produces no-op processed result - -```gwt -Given no PM state exists for "orderNotification" instance "ord_123" -When I call withPMCheckpoint with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" and process returns 0 commands -Then the PM result status is "processed" -And the PM result commandsEmitted is empty -And the emitCommands callback was not invoked -``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-019-helper-processes-event-and-updates-state.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-019-helper-processes-event-and-updates-state.sdp.md deleted file mode 100644 index 3ab8b264..00000000 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-019-helper-processes-event-and-updates-state.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.helper-processes-event-and-updates-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint ---- -# Helper processes event and updates state - -## Intent - -- outcome: Executable scenario: Helper processes event and updates state - -```gwt -Given the feature fixture is in place -When I create a PM checkpoint helper and call it with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" -Then the helper result status is "processed" -And the helper emitted commands list has 1 entry -And the helper PM state for "orderNotification" instance "ord_123" has lastGlobalPosition 1000 -``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-020-helper-maintains-pm-idempotency-semantics.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-020-helper-maintains-pm-idempotency-semantics.sdp.md deleted file mode 100644 index e6607de4..00000000 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.examples/s-020-helper-maintains-pm-idempotency-semantics.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.process-manager.with-pm-checkpoint.helper-maintains-pm-idempotency-semantics -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.process-manager.with-pm-checkpoint ---- -# Helper maintains PM idempotency semantics - -## Intent - -- outcome: Executable scenario: Helper maintains PM idempotency semantics - -```gwt -Given the feature fixture is in place -When I create a PM checkpoint helper and call it twice with pm "orderNotification" instance "ord_123" position 1000 event "evt_001" correlation "corr_001" -Then the second helper call result status is "skipped" -And the helper emitted commands list has 1 entry -And the helper first emitted command type is "Cmd1" -``` diff --git a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.sdp.md b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.sdp.md index 4a9a6058..94bea887 100644 --- a/specs/behavior/platform-core/process-manager/with-pm-checkpoint.sdp.md +++ b/specs/behavior/platform-core/process-manager/with-pm-checkpoint.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.process-manager.with-pm-checkpoint kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: withPMCheckpoint Helper +- outcome: Process process-manager events through withPMCheckpoint so already-processed and terminal-state events are skipped and failures record dead letters. +- value: Each PM instance keeps its own checkpoint, command counters, and retryable failure path. ## Behavior diff --git a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-001-projection-rebuild-re-processes-events.sdp.md b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-001-projection-rebuild-re-processes-events.sdp.md deleted file mode 100644 index 552a76f6..00000000 --- a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-001-projection-rebuild-re-processes-events.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.admin-tooling.projection-rebuild-re-processes-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.admin-tooling ---- -# Projection rebuild re-processes events - -## Intent - -- outcome: Executable scenario: Projection rebuild re-processes events - -```gwt -Given the test environment is initialized -And admin endpoints are configured -And a corrupted projection at position 500 -When admin triggers rebuild from position 0 -Then checkpoint should reset to position 0 -And projection status should be "rebuilding" -And workpool should re-process all events -``` diff --git a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-002-dead-letter-retry-re-enqueues-event.sdp.md b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-002-dead-letter-retry-re-enqueues-event.sdp.md deleted file mode 100644 index ee9fcf9c..00000000 --- a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-002-dead-letter-retry-re-enqueues-event.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.admin-tooling.dead-letter-retry-re-enqueues-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.admin-tooling ---- -# Dead letter retry re-enqueues event - -## Intent - -- outcome: Executable scenario: Dead letter retry re-enqueues event - -```gwt -Given the test environment is initialized -And admin endpoints are configured -And a dead letter with status "pending" -When admin retries the dead letter -Then dead letter status should be "retrying" -And event should be re-enqueued to workpool -``` diff --git a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-003-event-flow-trace-returns-full-history.sdp.md b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-003-event-flow-trace-returns-full-history.sdp.md deleted file mode 100644 index 0e250960..00000000 --- a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-003-event-flow-trace-returns-full-history.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.admin-tooling.event-flow-trace-returns-full-history -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.admin-tooling ---- -# Event flow trace returns full history - -## Intent - -- outcome: Executable scenario: Event flow trace returns full history - -```gwt -Given the test environment is initialized -And admin endpoints are configured -And events with correlation ID "corr-123" -When admin requests event flow trace -Then response should include command, events, and projection updates -And entries should be ordered by timestamp -``` diff --git a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-004-rebuild-status-shows-progress.sdp.md b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-004-rebuild-status-shows-progress.sdp.md deleted file mode 100644 index ab28cb3b..00000000 --- a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-004-rebuild-status-shows-progress.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.admin-tooling.rebuild-status-shows-progress -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.admin-tooling ---- -# Rebuild status shows progress - -## Intent - -- outcome: Executable scenario: Rebuild status shows progress - -```gwt -Given the test environment is initialized -And admin endpoints are configured -And a rebuild in progress for projection "orderSummaries" -When admin queries rebuild status -Then response should include current position -And response should include total events to process -And response should include estimated time remaining -``` diff --git a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-005-bulk-dead-letter-retry-processes-all-pending.sdp.md b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-005-bulk-dead-letter-retry-processes-all-pending.sdp.md deleted file mode 100644 index 2d75befe..00000000 --- a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-005-bulk-dead-letter-retry-processes-all-pending.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.admin-tooling.bulk-dead-letter-retry-processes-all-pending -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.admin-tooling ---- -# Bulk dead letter retry processes all pending - -## Intent - -- outcome: Executable scenario: Bulk dead letter retry processes all pending - -```gwt -Given the test environment is initialized -And admin endpoints are configured -And 10 dead letters with status "pending" for projection "inventory" -When admin triggers bulk retry -Then all 10 dead letters should transition to "retrying" -And response should include count of retried items -``` diff --git a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-006-system-diagnostics-returns-comprehensive-state.sdp.md b/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-006-system-diagnostics-returns-comprehensive-state.sdp.md deleted file mode 100644 index f380661d..00000000 --- a/specs/behavior/platform-core/production-hardening/admin-tooling.examples/s-006-system-diagnostics-returns-comprehensive-state.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.admin-tooling.system-diagnostics-returns-comprehensive-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.admin-tooling ---- -# System diagnostics returns comprehensive state - -## Intent - -- outcome: Executable scenario: System diagnostics returns comprehensive state - -```gwt -Given the test environment is initialized -And admin endpoints are configured -And the system is running -When admin requests system diagnostics -Then response should include projection statuses -And response should include workpool queue depths -And response should include circuit breaker states -And response should include dead letter counts -``` diff --git a/specs/behavior/platform-core/production-hardening/admin-tooling.sdp.md b/specs/behavior/platform-core/production-hardening/admin-tooling.sdp.md index b35480f7..a8b94f84 100644 --- a/specs/behavior/platform-core/production-hardening/admin-tooling.sdp.md +++ b/specs/behavior/platform-core/production-hardening/admin-tooling.sdp.md @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform operator -- outcome: admin endpoints for operational tasks so that I can rebuild projections, manage dead letters, and diagnose issues +- outcome: Provide admin endpoints for operational tasks so operators can rebuild projections, manage dead letters, and diagnose issues. +- value: Rebuild, DLQ retry, event-flow trace, and diagnostics stay behind a single admin surface. These scenarios remain unimplemented planning stubs. ## Behavior diff --git a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-001-circuit-opens-after-repeated-failures.sdp.md b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-001-circuit-opens-after-repeated-failures.sdp.md deleted file mode 100644 index 85cf7182..00000000 --- a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-001-circuit-opens-after-repeated-failures.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.circuit-breakers.circuit-opens-after-repeated-failures -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.circuit-breakers ---- -# Circuit opens after repeated failures - -## Intent - -- outcome: Executable scenario: Circuit opens after repeated failures - -```gwt -Given the test environment is initialized -And circuit breaker state table exists -And a circuit breaker with threshold 5 -When 5 consecutive failures occur -Then circuit state should be "OPEN" -And subsequent calls should fail fast with "CIRCUIT_OPEN" -``` diff --git a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-002-circuit-transitions-to-half-open-after-timeout.sdp.md b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-002-circuit-transitions-to-half-open-after-timeout.sdp.md deleted file mode 100644 index d701ad36..00000000 --- a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-002-circuit-transitions-to-half-open-after-timeout.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.circuit-breakers.circuit-transitions-to-half-open-after-timeout -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.circuit-breakers ---- -# Circuit transitions to half-open after timeout - -## Intent - -- outcome: Executable scenario: Circuit transitions to half-open after timeout - -```gwt -Given the test environment is initialized -And circuit breaker state table exists -And a circuit in "OPEN" state -When the reset timeout expires (via scheduled function) -Then circuit state should be "HALF_OPEN" -And one test request should be allowed through -``` diff --git a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-003-successful-half-open-request-closes-circuit.sdp.md b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-003-successful-half-open-request-closes-circuit.sdp.md deleted file mode 100644 index 7fa8bd7c..00000000 --- a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-003-successful-half-open-request-closes-circuit.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.circuit-breakers.successful-half-open-request-closes-circuit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.circuit-breakers ---- -# Successful half-open request closes circuit - -## Intent - -- outcome: Executable scenario: Successful half-open request closes circuit - -```gwt -Given the test environment is initialized -And circuit breaker state table exists -And a circuit in "HALF_OPEN" state -When a request succeeds -Then circuit state should be "CLOSED" -And normal traffic should resume -``` diff --git a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-004-failed-half-open-request-reopens-circuit.sdp.md b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-004-failed-half-open-request-reopens-circuit.sdp.md deleted file mode 100644 index d521e286..00000000 --- a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-004-failed-half-open-request-reopens-circuit.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.circuit-breakers.failed-half-open-request-reopens-circuit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.circuit-breakers ---- -# Failed half-open request reopens circuit - -## Intent - -- outcome: Executable scenario: Failed half-open request reopens circuit - -```gwt -Given the test environment is initialized -And circuit breaker state table exists -And a circuit in "HALF_OPEN" state -When a request fails -Then circuit state should return to "OPEN" -And timeout timer should reset -``` diff --git a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-005-circuit-state-persists-across-function-invocations.sdp.md b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-005-circuit-state-persists-across-function-invocations.sdp.md deleted file mode 100644 index 2e7eafde..00000000 --- a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-005-circuit-state-persists-across-function-invocations.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.circuit-breakers.circuit-state-persists-across-function-invocations -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.circuit-breakers ---- -# Circuit state persists across function invocations - -## Intent - -- outcome: Executable scenario: Circuit state persists across function invocations - -```gwt -Given the test environment is initialized -And circuit breaker state table exists -And a circuit breaker in "OPEN" state -When the Convex function completes and a new invocation starts -Then the circuit state should still be "OPEN" -And failure count should be preserved -``` diff --git a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-006-multiple-circuit-breakers-operate-independently.sdp.md b/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-006-multiple-circuit-breakers-operate-independently.sdp.md deleted file mode 100644 index 0a629bf8..00000000 --- a/specs/behavior/platform-core/production-hardening/circuit-breakers.examples/s-006-multiple-circuit-breakers-operate-independently.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.circuit-breakers.multiple-circuit-breakers-operate-independently -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.circuit-breakers ---- -# Multiple circuit breakers operate independently - -## Intent - -- outcome: Executable scenario: Multiple circuit breakers operate independently - -```gwt -Given the test environment is initialized -And circuit breaker state table exists -And circuit breaker "payment-gateway" in "OPEN" state -And circuit breaker "email-service" in "CLOSED" state -When a request to "email-service" is made -Then the request should proceed normally -And "payment-gateway" should remain "OPEN" -``` diff --git a/specs/behavior/platform-core/production-hardening/circuit-breakers.sdp.md b/specs/behavior/platform-core/production-hardening/circuit-breakers.sdp.md index a61dd9eb..b2f7a8ba 100644 --- a/specs/behavior/platform-core/production-hardening/circuit-breakers.sdp.md +++ b/specs/behavior/platform-core/production-hardening/circuit-breakers.sdp.md @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: circuit breakers for external dependencies so that failures are isolated and the system degrades gracefully +- outcome: Isolate external-dependency failures with circuit breakers so the system degrades gracefully. +- value: Repeated failures open the circuit, a timeout probe half-opens it, and success or failure of that probe closes or reopens it. These scenarios remain unimplemented planning stubs. ## Behavior diff --git a/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-001-trace-spans-command-to-projection-flow.sdp.md b/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-001-trace-spans-command-to-projection-flow.sdp.md deleted file mode 100644 index b94cabeb..00000000 --- a/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-001-trace-spans-command-to-projection-flow.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.distributed-tracing.trace-spans-command-to-projection-flow -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.distributed-tracing ---- -# Trace spans command-to-projection flow - -## Intent - -- outcome: Executable scenario: Trace spans command-to-projection flow - -```gwt -Given the test environment is initialized -And trace context propagation is enabled -And a SubmitOrder command with trace context -When the command is processed and OrderSubmitted event is published and projection is updated -Then all log entries should share the same trace ID -And logs should show parent-child relationships via spanId -``` diff --git a/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-002-missing-trace-context-uses-default.sdp.md b/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-002-missing-trace-context-uses-default.sdp.md deleted file mode 100644 index 6c23a302..00000000 --- a/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-002-missing-trace-context-uses-default.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.distributed-tracing.missing-trace-context-uses-default -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.distributed-tracing ---- -# Missing trace context uses default - -## Intent - -- outcome: Executable scenario: Missing trace context uses default - -```gwt -Given the test environment is initialized -And trace context propagation is enabled -And a command without trace context -When the command is processed -Then a new trace ID should be generated -And all downstream operations should use the generated trace -``` diff --git a/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-003-trace-context-is-preserved-in-event-metadata.sdp.md b/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-003-trace-context-is-preserved-in-event-metadata.sdp.md deleted file mode 100644 index 29c0c0f6..00000000 --- a/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-003-trace-context-is-preserved-in-event-metadata.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.distributed-tracing.trace-context-is-preserved-in-event-metadata -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.distributed-tracing ---- -# Trace context is preserved in event metadata - -## Intent - -- outcome: Executable scenario: Trace context is preserved in event metadata - -```gwt -Given the test environment is initialized -And trace context propagation is enabled -And a command with traceId "trace-abc" and spanId "span-001" -When the command produces an event -Then the event metadata should contain traceId "trace-abc" -And the event metadata should contain a new spanId with parentSpanId "span-001" -``` diff --git a/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-004-multiple-projections-share-same-trace.sdp.md b/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-004-multiple-projections-share-same-trace.sdp.md deleted file mode 100644 index 1fc16d0f..00000000 --- a/specs/behavior/platform-core/production-hardening/distributed-tracing.examples/s-004-multiple-projections-share-same-trace.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.distributed-tracing.multiple-projections-share-same-trace -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.distributed-tracing ---- -# Multiple projections share same trace - -## Intent - -- outcome: Executable scenario: Multiple projections share same trace - -```gwt -Given the test environment is initialized -And trace context propagation is enabled -And an event with traceId "trace-xyz" -When two different projections process the event -Then both projection logs should include traceId "trace-xyz" -``` diff --git a/specs/behavior/platform-core/production-hardening/distributed-tracing.sdp.md b/specs/behavior/platform-core/production-hardening/distributed-tracing.sdp.md index 6ce55a0c..68af0a19 100644 --- a/specs/behavior/platform-core/production-hardening/distributed-tracing.sdp.md +++ b/specs/behavior/platform-core/production-hardening/distributed-tracing.sdp.md @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform operator -- outcome: to trace event flows through the system so that I can debug issues and understand command-to-projection paths +- outcome: Trace event flows through the system so operators can debug issues and understand command-to-projection paths. +- value: A command, its published event, and the projections that consume it share one trace. These scenarios remain unimplemented planning stubs. ## Behavior diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-001-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-001-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md deleted file mode 100644 index 8fe54826..00000000 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-001-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.durable-function-integration.circuit-breaker-uses-action-retrier-for-half-open-probe -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.durable-function-integration ---- -# Circuit breaker uses action retrier for half-open probe - -## Intent - -- outcome: Executable scenario: Circuit breaker uses action retrier for half-open probe - -```gwt -Given the test environment is initialized -And action retrier component is configured -And workpool component is configured -And a circuit breaker "payment-api" in "HALF_OPEN" state -When a test request is initiated -Then action retrier should execute with maxFailures=0 -And circuit state should update to "CLOSED" on success -``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-002-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-002-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md deleted file mode 100644 index 3fcba05a..00000000 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-002-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.durable-function-integration.failed-half-open-probe-reopens-circuit-via-action-retrier -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.durable-function-integration ---- -# Failed half-open probe reopens circuit via action retrier - -## Intent - -- outcome: Executable scenario: Failed half-open probe reopens circuit via action retrier - -```gwt -Given the test environment is initialized -And action retrier component is configured -And workpool component is configured -And a circuit breaker "payment-api" in "HALF_OPEN" state -When the probe action fails -Then onCircuitProbeComplete should transition to "OPEN" -And timeout should be rescheduled for next half-open transition -``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-003-closed-circuit-uses-action-retrier-with-configured-retries.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-003-closed-circuit-uses-action-retrier-with-configured-retries.sdp.md deleted file mode 100644 index d7beefed..00000000 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-003-closed-circuit-uses-action-retrier-with-configured-retries.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.durable-function-integration.closed-circuit-uses-action-retrier-with-configured-retries -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.durable-function-integration ---- -# Closed circuit uses action retrier with configured retries - -## Intent - -- outcome: Executable scenario: Closed circuit uses action retrier with configured retries - -```gwt -Given the test environment is initialized -And action retrier component is configured -And workpool component is configured -And a circuit breaker "payment-api" in "CLOSED" state -And retry config has maxFailures=3 and initialBackoffMs=250 -When an external operation is executed -Then action retrier should use the configured retry settings -And onOperationComplete should update circuit state on completion -``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-004-dcb-conflict-triggers-workpool-based-retry.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-004-dcb-conflict-triggers-workpool-based-retry.sdp.md deleted file mode 100644 index f2eb1c11..00000000 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-004-dcb-conflict-triggers-workpool-based-retry.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.durable-function-integration.dcb-conflict-triggers-workpool-based-retry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.durable-function-integration ---- -# DCB conflict triggers Workpool-based retry - -## Intent - -- outcome: Executable scenario: DCB conflict triggers Workpool-based retry - -```gwt -Given the test environment is initialized -And action retrier component is configured -And workpool component is configured -And a DCB operation with scope "tenant:t1:reservation:r1" -And expectedVersion is 5 but currentVersion is 6 -When conflict is detected -Then Workpool should enqueue retry mutation with backoff -And partition key should be "dcb:tenant:t1:reservation:r1" -And only one retry should run at a time for that scope -``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-005-dcb-retry-respects-exponential-backoff-with-jitter.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-005-dcb-retry-respects-exponential-backoff-with-jitter.sdp.md deleted file mode 100644 index 2fd24ae6..00000000 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-005-dcb-retry-respects-exponential-backoff-with-jitter.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.durable-function-integration.dcb-retry-respects-exponential-backoff-with-jitter -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.durable-function-integration ---- -# DCB retry respects exponential backoff with jitter - -## Intent - -- outcome: Executable scenario: DCB retry respects exponential backoff with jitter - -```gwt -Given the test environment is initialized -And action retrier component is configured -And workpool component is configured -And a DCB conflict on attempt 3 -When calculateBackoff is called -Then delay should be approximately 400ms (100 * 2^2) -And jitter should add 0-50% randomness -And maximum delay should be capped at 30 seconds -``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-006-dcb-retry-uses-latest-version-after-conflict.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-006-dcb-retry-uses-latest-version-after-conflict.sdp.md deleted file mode 100644 index de803b90..00000000 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-006-dcb-retry-uses-latest-version-after-conflict.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.durable-function-integration.dcb-retry-uses-latest-version-after-conflict -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.durable-function-integration ---- -# DCB retry uses latest version after conflict - -## Intent - -- outcome: Executable scenario: DCB retry uses latest version after conflict - -```gwt -Given the test environment is initialized -And action retrier component is configured -And workpool component is configured -And a DCB conflict with currentVersion 10 -When retry is enqueued via Workpool -Then the retry config should have expectedVersion=10 -And the retry attempt counter should increment -``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-007-dcb-retry-partition-key-prevents-concurrent-retries.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-007-dcb-retry-partition-key-prevents-concurrent-retries.sdp.md deleted file mode 100644 index ba89cf74..00000000 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-007-dcb-retry-partition-key-prevents-concurrent-retries.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.durable-function-integration.dcb-retry-partition-key-prevents-concurrent-retries -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.durable-function-integration ---- -# DCB retry partition key prevents concurrent retries - -## Intent - -- outcome: Executable scenario: DCB retry partition key prevents concurrent retries - -```gwt -Given the test environment is initialized -And action retrier component is configured -And workpool component is configured -And two DCB conflicts for scope "tenant:t1:reservation:r1" -When both conflicts trigger retries -Then Workpool partition key should serialize execution -And the second retry should wait for the first to complete -``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-008-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-008-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md deleted file mode 100644 index 7a09ab2a..00000000 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-008-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.durable-function-integration.dead-letter-retry-uses-action-retrier-for-external-calls -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.durable-function-integration ---- -# Dead letter retry uses action retrier for external calls - -## Intent - -- outcome: Executable scenario: Dead letter retry uses action retrier for external calls - -```gwt -Given the test environment is initialized -And action retrier component is configured -And workpool component is configured -And a dead letter with status "pending" and eventId "evt-123" -When admin triggers retry -Then action retrier should execute processEvent action -And dead letter status should be "retrying" -And retryRunId should track the action run -``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-009-failed-dlq-retry-returns-to-pending-status.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-009-failed-dlq-retry-returns-to-pending-status.sdp.md deleted file mode 100644 index 2f0c5392..00000000 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-009-failed-dlq-retry-returns-to-pending-status.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.durable-function-integration.failed-dlq-retry-returns-to-pending-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.durable-function-integration ---- -# Failed DLQ retry returns to pending status - -## Intent - -- outcome: Executable scenario: Failed DLQ retry returns to pending status - -```gwt -Given the test environment is initialized -And action retrier component is configured -And workpool component is configured -And a dead letter in "retrying" status -When action retrier exhausts all retry attempts -Then onDLQRetryComplete should update status to "pending" -And lastError should contain the failure reason -And item should be available for manual review -``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-010-successful-dlq-retry-marks-item-resolved.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-010-successful-dlq-retry-marks-item-resolved.sdp.md deleted file mode 100644 index c4abe319..00000000 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-010-successful-dlq-retry-marks-item-resolved.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.durable-function-integration.successful-dlq-retry-marks-item-resolved -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.durable-function-integration ---- -# Successful DLQ retry marks item resolved - -## Intent - -- outcome: Executable scenario: Successful DLQ retry marks item resolved - -```gwt -Given the test environment is initialized -And action retrier component is configured -And workpool component is configured -And a dead letter in "retrying" status -When action retrier completes successfully -Then onDLQRetryComplete should update status to "resolved" -And resolvedAt timestamp should be set -``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-011-dlq-retry-tracks-retry-count.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-011-dlq-retry-tracks-retry-count.sdp.md deleted file mode 100644 index 1b3afedd..00000000 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.examples/s-011-dlq-retry-tracks-retry-count.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.durable-function-integration.dlq-retry-tracks-retry-count -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.durable-function-integration ---- -# DLQ retry tracks retry count - -## Intent - -- outcome: Executable scenario: DLQ retry tracks retry count - -```gwt -Given the test environment is initialized -And action retrier component is configured -And workpool component is configured -And a dead letter with retryCount=2 -When admin triggers another retry -Then retryCount should increment to 3 -And lastRetryAt should be updated -``` diff --git a/specs/behavior/platform-core/production-hardening/durable-function-integration.sdp.md b/specs/behavior/platform-core/production-hardening/durable-function-integration.sdp.md index 880ed3a7..47ec748f 100644 --- a/specs/behavior/platform-core/production-hardening/durable-function-integration.sdp.md +++ b/specs/behavior/platform-core/production-hardening/durable-function-integration.sdp.md @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: durable function components integrated with platform patterns so that external calls, retries, and conflict handling are reliable +- outcome: Integrate durable function components with platform patterns so external calls, retries, and conflict handling stay reliable. +- value: Circuit probes, DCB conflicts, and DLQ retries use action retrier and workpool rather than in-process loops. These scenarios remain unimplemented planning stubs. ## Behavior diff --git a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-001-readiness-probe-checks-dependencies.sdp.md b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-001-readiness-probe-checks-dependencies.sdp.md deleted file mode 100644 index 3def4493..00000000 --- a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-001-readiness-probe-checks-dependencies.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.health-endpoints.readiness-probe-checks-dependencies -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.health-endpoints ---- -# Readiness probe checks dependencies - -## Intent - -- outcome: Executable scenario: Readiness probe checks dependencies - -```gwt -Given the test environment is initialized -And health check endpoints are configured -And the health endpoint is configured -When event store is reachable and projections are within lag threshold -Then /health/ready should return 200 -And response body should include component statuses -``` diff --git a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-002-unhealthy-dependency-fails-readiness.sdp.md b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-002-unhealthy-dependency-fails-readiness.sdp.md deleted file mode 100644 index 1f5a162b..00000000 --- a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-002-unhealthy-dependency-fails-readiness.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.health-endpoints.unhealthy-dependency-fails-readiness -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.health-endpoints ---- -# Unhealthy dependency fails readiness - -## Intent - -- outcome: Executable scenario: Unhealthy dependency fails readiness - -```gwt -Given the test environment is initialized -And health check endpoints are configured -And event store is unreachable -When /health/ready is called -Then response should be 503 -And response body should identify failed component -``` diff --git a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-003-liveness-probe-always-succeeds.sdp.md b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-003-liveness-probe-always-succeeds.sdp.md deleted file mode 100644 index 1a9d524f..00000000 --- a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-003-liveness-probe-always-succeeds.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.health-endpoints.liveness-probe-always-succeeds -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.health-endpoints ---- -# Liveness probe always succeeds - -## Intent - -- outcome: Executable scenario: Liveness probe always succeeds - -```gwt -Given the test environment is initialized -And health check endpoints are configured -And the health endpoint is configured -When /health/live is called -Then response should be 200 -And no dependency checks should be performed -``` diff --git a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-004-projection-lag-threshold-determines-health.sdp.md b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-004-projection-lag-threshold-determines-health.sdp.md deleted file mode 100644 index 479be1fa..00000000 --- a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-004-projection-lag-threshold-determines-health.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.health-endpoints.projection-lag-threshold-determines-health -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.health-endpoints ---- -# Projection lag threshold determines health - -## Intent - -- outcome: Executable scenario: Projection lag threshold determines health - -```gwt -Given the test environment is initialized -And health check endpoints are configured -And a projection with lag above threshold (100 events) -When /health/ready is called -Then response should be 503 -And response body should identify "projection_lag" as degraded -``` diff --git a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-005-health-response-includes-all-component-statuses.sdp.md b/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-005-health-response-includes-all-component-statuses.sdp.md deleted file mode 100644 index 5882bfff..00000000 --- a/specs/behavior/platform-core/production-hardening/health-endpoints.examples/s-005-health-response-includes-all-component-statuses.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.health-endpoints.health-response-includes-all-component-statuses -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.health-endpoints ---- -# Health response includes all component statuses - -## Intent - -- outcome: Executable scenario: Health response includes all component statuses - -```gwt -Given the test environment is initialized -And health check endpoints are configured -And event store is healthy -And projections have zero lag -And workpool has pending jobs -When /health/ready is called -Then response should include status for "event_store", "projections", "workpool" -``` diff --git a/specs/behavior/platform-core/production-hardening/health-endpoints.sdp.md b/specs/behavior/platform-core/production-hardening/health-endpoints.sdp.md index 3db0fa1d..b89ee5ca 100644 --- a/specs/behavior/platform-core/production-hardening/health-endpoints.sdp.md +++ b/specs/behavior/platform-core/production-hardening/health-endpoints.sdp.md @@ -11,7 +11,8 @@ relations: ## Intent - actor: a Kubernetes operator -- outcome: health check endpoints so that I can configure readiness and liveness probes for the application +- outcome: Expose health-check endpoints so Kubernetes can configure readiness and liveness probes for the application. +- value: Readiness fails when dependencies or projection lag are unhealthy; liveness stays up independently. These scenarios remain unimplemented planning stubs. ## Behavior diff --git a/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-001-projection-lag-is-tracked.sdp.md b/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-001-projection-lag-is-tracked.sdp.md deleted file mode 100644 index 37e5404d..00000000 --- a/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-001-projection-lag-is-tracked.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.metrics-collection.projection-lag-is-tracked -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.metrics-collection ---- -# Projection lag is tracked - -## Intent - -- outcome: Executable scenario: Projection lag is tracked - -```gwt -Given the test environment is initialized -And a metrics collector is configured -And a projection with checkpoint at position 100 -And the latest event is at position 150 -When metrics are collected -Then projection.lag_events should be 50 -And the metric should include projection name label -``` diff --git a/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-002-metrics-collection-handles-missing-checkpoints.sdp.md b/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-002-metrics-collection-handles-missing-checkpoints.sdp.md deleted file mode 100644 index 8d4ab041..00000000 --- a/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-002-metrics-collection-handles-missing-checkpoints.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.metrics-collection.metrics-collection-handles-missing-checkpoints -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.metrics-collection ---- -# Metrics collection handles missing checkpoints - -## Intent - -- outcome: Executable scenario: Metrics collection handles missing checkpoints - -```gwt -Given the test environment is initialized -And a metrics collector is configured -And a projection without a checkpoint entry -When metrics are collected -Then projection.lag_events should default to current global position -And a warning should be logged -``` diff --git a/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-003-event-throughput-is-calculated.sdp.md b/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-003-event-throughput-is-calculated.sdp.md deleted file mode 100644 index ff5c576c..00000000 --- a/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-003-event-throughput-is-calculated.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.metrics-collection.event-throughput-is-calculated -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.metrics-collection ---- -# Event throughput is calculated - -## Intent - -- outcome: Executable scenario: Event throughput is calculated - -```gwt -Given the test environment is initialized -And a metrics collector is configured -And 100 events were published in the last minute -When metrics are collected -Then events.throughput should be approximately 100 events/min -``` diff --git a/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-004-dead-letter-queue-size-is-tracked.sdp.md b/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-004-dead-letter-queue-size-is-tracked.sdp.md deleted file mode 100644 index c9351fd9..00000000 --- a/specs/behavior/platform-core/production-hardening/metrics-collection.examples/s-004-dead-letter-queue-size-is-tracked.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.metrics-collection.dead-letter-queue-size-is-tracked -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.metrics-collection ---- -# Dead letter queue size is tracked - -## Intent - -- outcome: Executable scenario: Dead letter queue size is tracked - -```gwt -Given the test environment is initialized -And a metrics collector is configured -And 5 dead letters exist for projection "orderSummaries" -When metrics are collected -Then dlq.size should be 5 -And the metric should include projection name label -``` diff --git a/specs/behavior/platform-core/production-hardening/metrics-collection.sdp.md b/specs/behavior/platform-core/production-hardening/metrics-collection.sdp.md index 325ba247..19e9e74c 100644 --- a/specs/behavior/platform-core/production-hardening/metrics-collection.sdp.md +++ b/specs/behavior/platform-core/production-hardening/metrics-collection.sdp.md @@ -11,8 +11,28 @@ relations: ## Intent - actor: a platform operator -- outcome: to collect system health metrics so that I can monitor projection lag, event throughput, and command latency +- outcome: Collect system health metrics so operators can monitor projection lag, event throughput, and command latency. +- value: Lag, throughput, and DLQ size export as labeled metrics. These scenarios remain unimplemented planning stubs. ## Behavior - rule: Metrics track system health indicators + +## Example space + +```gwt-vocabulary +Given the test environment is initialized +And a metrics collector is configured +And a projection with checkpoint at position {checkpointPosition:number} +And the latest event is at position {latestPosition:number} +And a projection without a checkpoint entry +And {eventCount:number} events were published in the last minute +And {deadLetterCount:number} dead letters exist for projection {projectionName:string} +When metrics are collected +Then projection.lag_events should be {lagEvents:number} +And the metric should include projection name label +And projection.lag_events should default to current global position +And a warning should be logged +And events.throughput should be approximately {throughput:number} events/min +And dlq.size should be {dlqSize:number} +``` diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-001-requests-within-rate-limit-succeed.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-001-requests-within-rate-limit-succeed.sdp.md deleted file mode 100644 index 3e104cda..00000000 --- a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-001-requests-within-rate-limit-succeed.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.rate-limiting.requests-within-rate-limit-succeed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.rate-limiting ---- -# Requests within rate limit succeed - -## Intent - -- outcome: Executable scenario: Requests within rate limit succeed - -```gwt -Given the test environment is initialized -And rate limiter component is mounted -And rate limit "commandDispatch" allows 100 requests per minute -And 50 requests have been made in the current window -When a new command is dispatched -Then the command should proceed to handler -And rate limit bucket should show 51 consumed -``` diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-002-requests-exceeding-rate-limit-are-rejected.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-002-requests-exceeding-rate-limit-are-rejected.sdp.md deleted file mode 100644 index 23a9ebc9..00000000 --- a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-002-requests-exceeding-rate-limit-are-rejected.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.rate-limiting.requests-exceeding-rate-limit-are-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.rate-limiting ---- -# Requests exceeding rate limit are rejected - -## Intent - -- outcome: Executable scenario: Requests exceeding rate limit are rejected - -```gwt -Given the test environment is initialized -And rate limiter component is mounted -And rate limit "commandDispatch" allows 100 requests per minute -And 100 requests have been made in the current window -When a new command is dispatched -Then the command should be rejected with "RATE_LIMITED" -And response should include "retryAfterMs" -``` diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-003-token-bucket-refills-over-time.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-003-token-bucket-refills-over-time.sdp.md deleted file mode 100644 index 10c30576..00000000 --- a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-003-token-bucket-refills-over-time.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.rate-limiting.token-bucket-refills-over-time -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.rate-limiting ---- -# Token bucket refills over time - -## Intent - -- outcome: Executable scenario: Token bucket refills over time - -```gwt -Given the test environment is initialized -And rate limiter component is mounted -And rate limit "commandDispatch" with rate 100/minute and capacity 150 -And bucket is depleted to 0 tokens -When 30 seconds pass -Then bucket should have approximately 50 tokens available -``` diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-004-rate-limit-key-isolation-by-user.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-004-rate-limit-key-isolation-by-user.sdp.md deleted file mode 100644 index 0eaa6c4d..00000000 --- a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-004-rate-limit-key-isolation-by-user.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.rate-limiting.rate-limit-key-isolation-by-user -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.rate-limiting ---- -# Rate limit key isolation by user - -## Intent - -- outcome: Executable scenario: Rate limit key isolation by user - -```gwt -Given the test environment is initialized -And rate limiter component is mounted -And rate limit key strategy is "byUserId" -And user "alice" has exhausted her rate limit -When user "bob" dispatches a command -Then "bob"'s command should proceed -And "alice" should remain rate limited -``` diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-005-admin-rebuild-respects-hourly-limit.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-005-admin-rebuild-respects-hourly-limit.sdp.md deleted file mode 100644 index 570afe82..00000000 --- a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-005-admin-rebuild-respects-hourly-limit.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.rate-limiting.admin-rebuild-respects-hourly-limit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.rate-limiting ---- -# Admin rebuild respects hourly limit - -## Intent - -- outcome: Executable scenario: Admin rebuild respects hourly limit - -```gwt -Given the test environment is initialized -And rate limiter component is mounted -And rate limit "adminRebuild" allows 10 rebuilds per hour -And 5 rebuilds have been triggered this hour -When admin triggers another rebuild -Then the rebuild should start -And rebuild count should be 6 -``` diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-006-admin-rebuild-blocked-when-limit-exceeded.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-006-admin-rebuild-blocked-when-limit-exceeded.sdp.md deleted file mode 100644 index 4c07d093..00000000 --- a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-006-admin-rebuild-blocked-when-limit-exceeded.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.rate-limiting.admin-rebuild-blocked-when-limit-exceeded -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.rate-limiting ---- -# Admin rebuild blocked when limit exceeded - -## Intent - -- outcome: Executable scenario: Admin rebuild blocked when limit exceeded - -```gwt -Given the test environment is initialized -And rate limiter component is mounted -And rate limit "adminRebuild" allows 10 rebuilds per hour -And 10 rebuilds have been triggered this hour -When admin triggers another rebuild -Then the operation should be rejected -And response should indicate "Rate limit exceeded for adminRebuild" -``` diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-007-adapter-converts-component-response-to-rate-limit-result.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-007-adapter-converts-component-response-to-rate-limit-result.sdp.md deleted file mode 100644 index c1a577ff..00000000 --- a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-007-adapter-converts-component-response-to-rate-limit-result.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.rate-limiting.adapter-converts-component-response-to-rate-limit-result -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.rate-limiting ---- -# Adapter converts component response to RateLimitResult - -## Intent - -- outcome: Executable scenario: Adapter converts component response to RateLimitResult - -```gwt -Given the test environment is initialized -And rate limiter component is mounted -And a rate limiter with "commandDispatch" limit configured -When createConvexRateLimitAdapter is called -Then it returns a function compatible with RateLimitChecker interface -And the function returns { allowed: boolean, retryAfterMs?: number } -``` diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-008-adapter-handles-component-errors-gracefully.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-008-adapter-handles-component-errors-gracefully.sdp.md deleted file mode 100644 index f3342caf..00000000 --- a/specs/behavior/platform-core/production-hardening/rate-limiting.examples/s-008-adapter-handles-component-errors-gracefully.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.production-hardening.rate-limiting.adapter-handles-component-errors-gracefully -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.production-hardening.rate-limiting ---- -# Adapter handles component errors gracefully - -## Intent - -- outcome: Executable scenario: Adapter handles component errors gracefully - -```gwt -Given the test environment is initialized -And rate limiter component is mounted -And rate limiter component throws an error -When the adapter is invoked -Then the error should propagate to caller -And middleware should handle the error appropriately -``` diff --git a/specs/behavior/platform-core/production-hardening/rate-limiting.sdp.md b/specs/behavior/platform-core/production-hardening/rate-limiting.sdp.md index 2cbd1305..93d0428c 100644 --- a/specs/behavior/platform-core/production-hardening/rate-limiting.sdp.md +++ b/specs/behavior/platform-core/production-hardening/rate-limiting.sdp.md @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: to rate limit commands and admin operations so that the system is protected from abuse and overload +- outcome: Rate-limit commands and admin operations so the system is protected from abuse and overload. +- value: Command dispatch and admin rebuild use separate limits, isolated by key. These scenarios remain unimplemented planning stubs. ## Behavior diff --git a/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-001-projection-categories-tuple-contains-all-valid-categories.sdp.md b/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-001-projection-categories-tuple-contains-all-valid-categories.sdp.md deleted file mode 100644 index fea3f2d1..00000000 --- a/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-001-projection-categories-tuple-contains-all-valid-categories.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projection-categories.category-definitions.projection-categories-tuple-contains-all-valid-categories -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projection-categories.category-definitions ---- -# PROJECTION_CATEGORIES tuple contains all valid categories - -## Intent - -- outcome: Executable scenario: PROJECTION_CATEGORIES tuple contains all valid categories - -```gwt -Given the projection category taxonomy: -When I access PROJECTION_CATEGORIES -Then it contains exactly "logic", "view", "reporting", "integration" -And it is a readonly tuple -``` diff --git a/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-002-is-projection-category-validates-category-strings.sdp.md b/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-002-is-projection-category-validates-category-strings.sdp.md deleted file mode 100644 index 68884a4e..00000000 --- a/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-002-is-projection-category-validates-category-strings.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projection-categories.category-definitions.is-projection-category-validates-category-strings -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projection-categories.category-definitions ---- -# isProjectionCategory validates category strings - -## Intent - -- outcome: Executable scenario: isProjectionCategory validates category strings - -```gwt -Given the projection category taxonomy: -When I call isProjectionCategory with "value" -Then I receive value -``` diff --git a/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-003-category-helper-functions-identify-correct-categories.sdp.md b/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-003-category-helper-functions-identify-correct-categories.sdp.md deleted file mode 100644 index b70d2c56..00000000 --- a/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-003-category-helper-functions-identify-correct-categories.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.projection-categories.category-definitions.category-helper-functions-identify-correct-categories -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projection-categories.category-definitions ---- -# Category helper functions identify correct categories - -## Intent - -- outcome: Executable scenario: Category helper functions identify correct categories - -```gwt -Given the projection category taxonomy: -And a projection category "value" -When the scenario runs -Then isLogicProjection returns value -And isViewProjection returns value -And isReportingProjection returns value -And isIntegrationProjection returns value -``` diff --git a/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-004-is-client-exposed-returns-correct-exposure-status.sdp.md b/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-004-is-client-exposed-returns-correct-exposure-status.sdp.md deleted file mode 100644 index ad70aa41..00000000 --- a/specs/behavior/platform-core/projection-categories/category-definitions.examples/s-004-is-client-exposed-returns-correct-exposure-status.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projection-categories.category-definitions.is-client-exposed-returns-correct-exposure-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projection-categories.category-definitions ---- -# isClientExposed returns correct exposure status - -## Intent - -- outcome: Executable scenario: isClientExposed returns correct exposure status - -```gwt -Given the projection category taxonomy: -And a projection category "value" -When I call isClientExposed -Then I receive value -``` diff --git a/specs/behavior/platform-core/projection-categories/category-definitions.sdp.md b/specs/behavior/platform-core/projection-categories/category-definitions.sdp.md index 16d5ec5c..1284948f 100644 --- a/specs/behavior/platform-core/projection-categories/category-definitions.sdp.md +++ b/specs/behavior/platform-core/projection-categories/category-definitions.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.projection-categories.category-definitions kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,4 +11,13 @@ relations: ## Intent - actor: a platform developer -- outcome: projections classified into four distinct categories so that I can route queries and optimize projection behavior +- outcome: Classify projections into four distinct categories so queries can be routed and projection behavior optimized. +- value: Logic, view, reporting, and integration stay mutually exclusive, and only view is client-exposed. + +## Behavior + +- rule: Every projection belongs to exactly one of logic, view, reporting, or integration. +- rule: PROJECTION_CATEGORIES is a readonly tuple of those four categories. +- rule: isProjectionCategory accepts only the four category strings. +- rule: Category helper functions identify the matching category. +- rule: isClientExposed is true only for view. diff --git a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-001-missing-category-returns-category-required-error.sdp.md b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-001-missing-category-returns-category-required-error.sdp.md deleted file mode 100644 index f8edbb96..00000000 --- a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-001-missing-category-returns-category-required-error.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.projection-categories.explicit-declaration.missing-category-returns-category-required-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projection-categories.explicit-declaration ---- -# Missing category returns CATEGORY_REQUIRED error - -## Intent - -- outcome: Executable scenario: Missing category returns CATEGORY_REQUIRED error - -```gwt -Given the projection validation module is available -And valid categories are "logic", "view", "reporting", "integration" -When I validate a projection category with undefined -Then validation fails -And error code is "CATEGORY_REQUIRED" -And error message contains "required" -And suggested categories are provided -``` diff --git a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-002-null-category-returns-category-required-error.sdp.md b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-002-null-category-returns-category-required-error.sdp.md deleted file mode 100644 index 7a847f38..00000000 --- a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-002-null-category-returns-category-required-error.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.projection-categories.explicit-declaration.null-category-returns-category-required-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projection-categories.explicit-declaration ---- -# Null category returns CATEGORY_REQUIRED error - -## Intent - -- outcome: Executable scenario: Null category returns CATEGORY_REQUIRED error - -```gwt -Given the projection validation module is available -And valid categories are "logic", "view", "reporting", "integration" -When I validate a projection category with null -Then validation fails -And error code is "CATEGORY_REQUIRED" -And suggested categories are provided -``` diff --git a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-003-valid-category-passes-validation.sdp.md b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-003-valid-category-passes-validation.sdp.md deleted file mode 100644 index df6248a1..00000000 --- a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-003-valid-category-passes-validation.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.projection-categories.explicit-declaration.valid-category-passes-validation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projection-categories.explicit-declaration ---- -# Valid category passes validation - -## Intent - -- outcome: Executable scenario: Valid category passes validation - -```gwt -Given the projection validation module is available -And valid categories are "logic", "view", "reporting", "integration" -When I validate a projection category with "value" -Then validation succeeds -And returned category is "value" -``` diff --git a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-004-assert-valid-category-returns-category-on-valid-input.sdp.md b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-004-assert-valid-category-returns-category-on-valid-input.sdp.md deleted file mode 100644 index 3f0eceea..00000000 --- a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-004-assert-valid-category-returns-category-on-valid-input.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.projection-categories.explicit-declaration.assert-valid-category-returns-category-on-valid-input -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projection-categories.explicit-declaration ---- -# assertValidCategory returns category on valid input - -## Intent - -- outcome: Executable scenario: assertValidCategory returns category on valid input - -```gwt -Given the projection validation module is available -And valid categories are "logic", "view", "reporting", "integration" -When I call assertValidCategory with "view" -Then I receive "view" -And no error is thrown -``` diff --git a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-005-invalid-category-returns-invalid-category-error.sdp.md b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-005-invalid-category-returns-invalid-category-error.sdp.md deleted file mode 100644 index f51fd94d..00000000 --- a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-005-invalid-category-returns-invalid-category-error.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.projection-categories.explicit-declaration.invalid-category-returns-invalid-category-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projection-categories.explicit-declaration ---- -# Invalid category returns INVALID_CATEGORY error - -## Intent - -- outcome: Executable scenario: Invalid category returns INVALID_CATEGORY error - -```gwt -Given the projection validation module is available -And valid categories are "logic", "view", "reporting", "integration" -When I validate a projection category with "value" -Then validation fails -And error code is "INVALID_CATEGORY" -And error message contains "value" -And suggested categories are provided -``` diff --git a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-006-assert-valid-category-throws-on-invalid-input.sdp.md b/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-006-assert-valid-category-throws-on-invalid-input.sdp.md deleted file mode 100644 index 0a2d9ebe..00000000 --- a/specs/behavior/platform-core/projection-categories/explicit-declaration.examples/s-006-assert-valid-category-throws-on-invalid-input.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.projection-categories.explicit-declaration.assert-valid-category-throws-on-invalid-input -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projection-categories.explicit-declaration ---- -# assertValidCategory throws on invalid input - -## Intent - -- outcome: Executable scenario: assertValidCategory throws on invalid input - -```gwt -Given the projection validation module is available -And valid categories are "logic", "view", "reporting", "integration" -When I call assertValidCategory with "invalid" -Then an error is thrown -And error message contains "INVALID_CATEGORY" -``` diff --git a/specs/behavior/platform-core/projection-categories/explicit-declaration.sdp.md b/specs/behavior/platform-core/projection-categories/explicit-declaration.sdp.md index b1ec9c44..50e6631b 100644 --- a/specs/behavior/platform-core/projection-categories/explicit-declaration.sdp.md +++ b/specs/behavior/platform-core/projection-categories/explicit-declaration.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.projection-categories.explicit-declaration kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,4 +11,12 @@ relations: ## Intent - actor: a platform developer -- outcome: projections to require explicit category declaration so that all projections have clear query routing semantics +- outcome: Require every projection to declare a category so query routing semantics stay explicit. +- value: Missing or invalid categories fail validation with CATEGORY_REQUIRED or INVALID_CATEGORY rather than defaulting. + +## Behavior + +- rule: Missing or null category returns CATEGORY_REQUIRED with suggested categories. +- rule: Valid categories pass validation and return the declared category. +- rule: Invalid category strings return INVALID_CATEGORY with suggested categories. +- rule: assertValidCategory returns the category on valid input and throws on invalid input. diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-001-get-by-category-returns-all-view-projections.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-001-get-by-category-returns-all-view-projections.sdp.md deleted file mode 100644 index 0b9c6309..00000000 --- a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-001-get-by-category-returns-all-view-projections.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.projection-categories.registry-lookup.get-by-category-returns-all-view-projections -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projection-categories.registry-lookup ---- -# getByCategory returns all view projections - -## Intent - -- outcome: Executable scenario: getByCategory returns all view projections - -```gwt -Given a projection registry with the following projections: -When I call getByCategory with "view" -Then I receive 2 projections -And the result contains "orderSummary" -And the result contains "productCatalog" -``` diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-002-get-by-category-returns-all-logic-projections.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-002-get-by-category-returns-all-logic-projections.sdp.md deleted file mode 100644 index eb4e7ad6..00000000 --- a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-002-get-by-category-returns-all-logic-projections.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projection-categories.registry-lookup.get-by-category-returns-all-logic-projections -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projection-categories.registry-lookup ---- -# getByCategory returns all logic projections - -## Intent - -- outcome: Executable scenario: getByCategory returns all logic projections - -```gwt -Given a projection registry with the following projections: -When I call getByCategory with "logic" -Then I receive 1 projection -And the result contains "orderExistence" -``` diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-003-get-by-category-returns-all-reporting-projections.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-003-get-by-category-returns-all-reporting-projections.sdp.md deleted file mode 100644 index 127f1a4f..00000000 --- a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-003-get-by-category-returns-all-reporting-projections.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projection-categories.registry-lookup.get-by-category-returns-all-reporting-projections -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projection-categories.registry-lookup ---- -# getByCategory returns all reporting projections - -## Intent - -- outcome: Executable scenario: getByCategory returns all reporting projections - -```gwt -Given a projection registry with the following projections: -When I call getByCategory with "reporting" -Then I receive 1 projection -And the result contains "dailySales" -``` diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-004-get-by-category-returns-all-integration-projections.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-004-get-by-category-returns-all-integration-projections.sdp.md deleted file mode 100644 index ac7b0501..00000000 --- a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-004-get-by-category-returns-all-integration-projections.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projection-categories.registry-lookup.get-by-category-returns-all-integration-projections -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projection-categories.registry-lookup ---- -# getByCategory returns all integration projections - -## Intent - -- outcome: Executable scenario: getByCategory returns all integration projections - -```gwt -Given a projection registry with the following projections: -When I call getByCategory with "integration" -Then I receive 1 projection -And the result contains "orderStatusFeed" -``` diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-005-get-by-category-returns-empty-array-for-category-with-no-projections.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-005-get-by-category-returns-empty-array-for-category-with-no-projections.sdp.md deleted file mode 100644 index c06138c9..00000000 --- a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-005-get-by-category-returns-empty-array-for-category-with-no-projections.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projection-categories.registry-lookup.get-by-category-returns-empty-array-for-category-with-no-projections -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projection-categories.registry-lookup ---- -# getByCategory returns empty array for category with no projections - -## Intent - -- outcome: Executable scenario: getByCategory returns empty array for category with no projections - -```gwt -Given a projection registry with the following projections: -And an empty projection registry -When I call getByCategory with "view" -Then I receive 0 projections -``` diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-006-target-view-projections-for-reactive-layer.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-006-target-view-projections-for-reactive-layer.sdp.md deleted file mode 100644 index 8ab3b85f..00000000 --- a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-006-target-view-projections-for-reactive-layer.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projection-categories.registry-lookup.target-view-projections-for-reactive-layer -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projection-categories.registry-lookup ---- -# Target view projections for reactive layer - -## Intent - -- outcome: Executable scenario: Target view projections for reactive layer - -```gwt -Given a projection registry with the following projections: -When I call getByCategory with "view" -Then all returned projections have category "view" -And these are candidates for reactive subscriptions -``` diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-007-target-integration-projections-for-event-bus-routing.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-007-target-integration-projections-for-event-bus-routing.sdp.md deleted file mode 100644 index f9426d8a..00000000 --- a/specs/behavior/platform-core/projection-categories/registry-lookup.examples/s-007-target-integration-projections-for-event-bus-routing.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projection-categories.registry-lookup.target-integration-projections-for-event-bus-routing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projection-categories.registry-lookup ---- -# Target integration projections for EventBus routing - -## Intent - -- outcome: Executable scenario: Target integration projections for EventBus routing - -```gwt -Given a projection registry with the following projections: -When I call getByCategory with "integration" -Then all returned projections have category "integration" -And these are candidates for EventBus publication -``` diff --git a/specs/behavior/platform-core/projection-categories/registry-lookup.sdp.md b/specs/behavior/platform-core/projection-categories/registry-lookup.sdp.md index cf82f3e8..bfd3abe9 100644 --- a/specs/behavior/platform-core/projection-categories/registry-lookup.sdp.md +++ b/specs/behavior/platform-core/projection-categories/registry-lookup.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.projection-categories.registry-lookup kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,4 +11,25 @@ relations: ## Intent - actor: a platform developer -- outcome: to query projections by category from the registry so that I can target specific projection types for different purposes +- outcome: Query projections by category from the registry so infrastructure can target specific projection types. +- value: View projections feed the reactive layer and integration projections feed EventBus routing; empty registries return no matches. + +## Behavior + +- rule: getByCategory returns the complete subset of registered projections whose declared category matches. +- rule: Lookups against an empty registry return an empty collection rather than failing. +- rule: Reactive targeting queries the registry by the view category. +- rule: EventBus routing queries the registry by the integration category. + +## Example space + +```gwt-vocabulary +Given a projection registry with the following projections: +And an empty projection registry +When I call getByCategory with {category:"view"|"logic"|"reporting"|"integration"} +Then I receive {count:number} projections +And the result contains {projectionName:string} +And all returned projections have category {category:"view"|"logic"|"reporting"|"integration"} +And these are candidates for reactive subscriptions +And these are candidates for EventBus publication +``` diff --git a/specs/behavior/platform-core/projections/categories.examples/s-001-projection-category-schema-accepts-all-valid-categories.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-001-projection-category-schema-accepts-all-valid-categories.sdp.md deleted file mode 100644 index a921704f..00000000 --- a/specs/behavior/platform-core/projections/categories.examples/s-001-projection-category-schema-accepts-all-valid-categories.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.categories.projection-category-schema-accepts-all-valid-categories -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.categories ---- -# ProjectionCategorySchema accepts all valid categories - -## Intent - -- outcome: Executable scenario: ProjectionCategorySchema accepts all valid categories - -```gwt -Given the feature fixture is in place -When I parse each valid category through ProjectionCategorySchema -Then all parse results succeed for: -``` diff --git a/specs/behavior/platform-core/projections/categories.examples/s-002-projection-category-schema-rejects-invalid-values.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-002-projection-category-schema-rejects-invalid-values.sdp.md deleted file mode 100644 index 9751d015..00000000 --- a/specs/behavior/platform-core/projections/categories.examples/s-002-projection-category-schema-rejects-invalid-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.categories.projection-category-schema-rejects-invalid-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.categories ---- -# ProjectionCategorySchema rejects invalid values - -## Intent - -- outcome: Executable scenario: ProjectionCategorySchema rejects invalid values - -```gwt -Given the feature fixture is in place -When I parse each invalid value through ProjectionCategorySchema -Then all parse results fail for: -``` diff --git a/specs/behavior/platform-core/projections/categories.examples/s-003-projection-category-schema-rejects-non-string-types.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-003-projection-category-schema-rejects-non-string-types.sdp.md deleted file mode 100644 index c81af463..00000000 --- a/specs/behavior/platform-core/projections/categories.examples/s-003-projection-category-schema-rejects-non-string-types.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.categories.projection-category-schema-rejects-non-string-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.categories ---- -# ProjectionCategorySchema rejects non-string types - -## Intent - -- outcome: Executable scenario: ProjectionCategorySchema rejects non-string types - -```gwt -Given the feature fixture is in place -When I parse non-string types through ProjectionCategorySchema -Then the schema rejects the number 123 -And the schema rejects null -``` diff --git a/specs/behavior/platform-core/projections/categories.examples/s-004-is-projection-category-rejects-objects.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-004-is-projection-category-rejects-objects.sdp.md deleted file mode 100644 index 92c28d63..00000000 --- a/specs/behavior/platform-core/projections/categories.examples/s-004-is-projection-category-rejects-objects.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.categories.is-projection-category-rejects-objects -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.categories ---- -# isProjectionCategory rejects objects - -## Intent - -- outcome: Executable scenario: isProjectionCategory rejects objects - -```gwt -Given the feature fixture is in place -When I call isProjectionCategory with an empty object -Then the type guard returns false -``` diff --git a/specs/behavior/platform-core/projections/categories.examples/s-005-is-projection-category-rejects-arrays.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-005-is-projection-category-rejects-arrays.sdp.md deleted file mode 100644 index 6ad6372b..00000000 --- a/specs/behavior/platform-core/projections/categories.examples/s-005-is-projection-category-rejects-arrays.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.categories.is-projection-category-rejects-arrays -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.categories ---- -# isProjectionCategory rejects arrays - -## Intent - -- outcome: Executable scenario: isProjectionCategory rejects arrays - -```gwt -Given the feature fixture is in place -When I call isProjectionCategory with an array containing "view" -Then the type guard returns false -``` diff --git a/specs/behavior/platform-core/projections/categories.examples/s-006-is-projection-category-rejects-booleans.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-006-is-projection-category-rejects-booleans.sdp.md deleted file mode 100644 index 05018d17..00000000 --- a/specs/behavior/platform-core/projections/categories.examples/s-006-is-projection-category-rejects-booleans.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.categories.is-projection-category-rejects-booleans -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.categories ---- -# isProjectionCategory rejects booleans - -## Intent - -- outcome: Executable scenario: isProjectionCategory rejects booleans - -```gwt -Given the feature fixture is in place -When I call isProjectionCategory with boolean values -Then the type guard returns false for both true and false -``` diff --git a/specs/behavior/platform-core/projections/categories.examples/s-007-is-projection-category-rejects-whitespace-padded-strings.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-007-is-projection-category-rejects-whitespace-padded-strings.sdp.md deleted file mode 100644 index 5fc3a3e4..00000000 --- a/specs/behavior/platform-core/projections/categories.examples/s-007-is-projection-category-rejects-whitespace-padded-strings.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.categories.is-projection-category-rejects-whitespace-padded-strings -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.categories ---- -# isProjectionCategory rejects whitespace-padded strings - -## Intent - -- outcome: Executable scenario: isProjectionCategory rejects whitespace-padded strings - -```gwt -Given the feature fixture is in place -When I call isProjectionCategory with whitespace-padded values -Then the type guard rejects space-padded view and tab-padded logic -``` diff --git a/specs/behavior/platform-core/projections/categories.examples/s-008-projection-validation-errors-has-expected-error-codes.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-008-projection-validation-errors-has-expected-error-codes.sdp.md deleted file mode 100644 index 554a2721..00000000 --- a/specs/behavior/platform-core/projections/categories.examples/s-008-projection-validation-errors-has-expected-error-codes.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.categories.projection-validation-errors-has-expected-error-codes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.categories ---- -# PROJECTION_VALIDATION_ERRORS has expected error codes - -## Intent - -- outcome: Executable scenario: PROJECTION_VALIDATION_ERRORS has expected error codes - -```gwt -Given the feature fixture is in place -When the scenario runs -Then CATEGORY_REQUIRED error code equals "CATEGORY_REQUIRED" -And INVALID_CATEGORY error code equals "INVALID_CATEGORY" -``` diff --git a/specs/behavior/platform-core/projections/categories.examples/s-009-validate-projection-category-rejects-non-string-types.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-009-validate-projection-category-rejects-non-string-types.sdp.md deleted file mode 100644 index 3394976e..00000000 --- a/specs/behavior/platform-core/projections/categories.examples/s-009-validate-projection-category-rejects-non-string-types.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.categories.validate-projection-category-rejects-non-string-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.categories ---- -# validateProjectionCategory rejects non-string types - -## Intent - -- outcome: Executable scenario: validateProjectionCategory rejects non-string types - -```gwt -Given the feature fixture is in place -When I validate non-string types as projection categories -Then all produce INVALID_CATEGORY errors: -``` diff --git a/specs/behavior/platform-core/projections/categories.examples/s-010-assert-valid-category-throws-category-required-for-undefined.sdp.md b/specs/behavior/platform-core/projections/categories.examples/s-010-assert-valid-category-throws-category-required-for-undefined.sdp.md deleted file mode 100644 index f06adde7..00000000 --- a/specs/behavior/platform-core/projections/categories.examples/s-010-assert-valid-category-throws-category-required-for-undefined.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.categories.assert-valid-category-throws-category-required-for-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.categories ---- -# assertValidCategory throws CATEGORY_REQUIRED for undefined - -## Intent - -- outcome: Executable scenario: assertValidCategory throws CATEGORY_REQUIRED for undefined - -```gwt -Given the feature fixture is in place -When I call assertValidCategory with undefined -Then the error message contains "CATEGORY_REQUIRED" -``` diff --git a/specs/behavior/platform-core/projections/categories.sdp.md b/specs/behavior/platform-core/projections/categories.sdp.md index 37ad469d..e83c1812 100644 --- a/specs/behavior/platform-core/projections/categories.sdp.md +++ b/specs/behavior/platform-core/projections/categories.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.projections.categories kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: Projection Categories Edge Cases and Schema Validation +- outcome: Validate projection category values through the schema, type guard, and assertion helpers. +- value: Non-string and unknown values fail with the published validation error codes instead of being coerced. ## Behavior diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-001-allowed-transitions-from-active-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-001-allowed-transitions-from-active-state.sdp.md deleted file mode 100644 index ef3405f9..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-001-allowed-transitions-from-active-state.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.allowed-transitions-from-active-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Allowed transitions from active state - -## Intent - -- outcome: Executable scenario: Allowed transitions from active state - -```gwt -Given the feature fixture is in place -When I check valid transitions from "active" -Then the following transitions are allowed: -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-002-rejected-transitions-from-active-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-002-rejected-transitions-from-active-state.sdp.md deleted file mode 100644 index 2e6a2cd8..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-002-rejected-transitions-from-active-state.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.rejected-transitions-from-active-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Rejected transitions from active state - -## Intent - -- outcome: Executable scenario: Rejected transitions from active state - -```gwt -Given the feature fixture is in place -When I check valid transitions from "active" -Then the following transitions are rejected: -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-003-allowed-transitions-from-rebuilding-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-003-allowed-transitions-from-rebuilding-state.sdp.md deleted file mode 100644 index da26776b..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-003-allowed-transitions-from-rebuilding-state.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.allowed-transitions-from-rebuilding-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Allowed transitions from rebuilding state - -## Intent - -- outcome: Executable scenario: Allowed transitions from rebuilding state - -```gwt -Given the feature fixture is in place -When I check valid transitions from "rebuilding" -Then the following transitions are allowed: -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-004-rejected-transitions-from-rebuilding-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-004-rejected-transitions-from-rebuilding-state.sdp.md deleted file mode 100644 index d45a295b..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-004-rejected-transitions-from-rebuilding-state.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.rejected-transitions-from-rebuilding-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Rejected transitions from rebuilding state - -## Intent - -- outcome: Executable scenario: Rejected transitions from rebuilding state - -```gwt -Given the feature fixture is in place -When I check valid transitions from "rebuilding" -Then the following transitions are rejected: -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-005-allowed-transitions-from-paused-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-005-allowed-transitions-from-paused-state.sdp.md deleted file mode 100644 index b29bf526..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-005-allowed-transitions-from-paused-state.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.allowed-transitions-from-paused-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Allowed transitions from paused state - -## Intent - -- outcome: Executable scenario: Allowed transitions from paused state - -```gwt -Given the feature fixture is in place -When I check valid transitions from "paused" -Then the following transitions are allowed: -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-006-rejected-transitions-from-paused-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-006-rejected-transitions-from-paused-state.sdp.md deleted file mode 100644 index 4de56957..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-006-rejected-transitions-from-paused-state.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.rejected-transitions-from-paused-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Rejected transitions from paused state - -## Intent - -- outcome: Executable scenario: Rejected transitions from paused state - -```gwt -Given the feature fixture is in place -When I check valid transitions from "paused" -Then the following transitions are rejected: -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-007-allowed-transitions-from-error-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-007-allowed-transitions-from-error-state.sdp.md deleted file mode 100644 index c0782524..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-007-allowed-transitions-from-error-state.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.allowed-transitions-from-error-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Allowed transitions from error state - -## Intent - -- outcome: Executable scenario: Allowed transitions from error state - -```gwt -Given the feature fixture is in place -When I check valid transitions from "error" -Then the following transitions are allowed: -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-008-rejected-transitions-from-error-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-008-rejected-transitions-from-error-state.sdp.md deleted file mode 100644 index d37c7f6c..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-008-rejected-transitions-from-error-state.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.rejected-transitions-from-error-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Rejected transitions from error state - -## Intent - -- outcome: Executable scenario: Rejected transitions from error state - -```gwt -Given the feature fixture is in place -When I check valid transitions from "error" -Then the following transitions are rejected: -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-009-valid-transitions-produce-correct-target-states.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-009-valid-transitions-produce-correct-target-states.sdp.md deleted file mode 100644 index 8dfb0f1d..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-009-valid-transitions-produce-correct-target-states.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.valid-transitions-produce-correct-target-states -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Valid transitions produce correct target states - -## Intent - -- outcome: Executable scenario: Valid transitions produce correct target states - -```gwt -Given the feature fixture is in place -When the scenario runs -Then transitionState returns correct targets for: -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md deleted file mode 100644 index 504e2c1f..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-010-invalid-transitions-return-null.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.invalid-transitions-return-null -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Invalid transitions return null - -## Intent - -- outcome: Executable scenario: Invalid transitions return null - -```gwt -Given the feature fixture is in place -When the scenario runs -Then transitionState returns null for: -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-011-valid-events-from-active-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-011-valid-events-from-active-state.sdp.md deleted file mode 100644 index 87a667cd..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-011-valid-events-from-active-state.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.valid-events-from-active-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Valid events from active state - -## Intent - -- outcome: Executable scenario: Valid events from active state - -```gwt -Given the feature fixture is in place -When I get valid events from "active" -Then the valid events are: -And the event count is 3 -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-012-valid-events-from-rebuilding-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-012-valid-events-from-rebuilding-state.sdp.md deleted file mode 100644 index 637beea5..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-012-valid-events-from-rebuilding-state.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.valid-events-from-rebuilding-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Valid events from rebuilding state - -## Intent - -- outcome: Executable scenario: Valid events from rebuilding state - -```gwt -Given the feature fixture is in place -When I get valid events from "rebuilding" -Then the valid events are: -And the event count is 2 -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-013-valid-events-from-paused-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-013-valid-events-from-paused-state.sdp.md deleted file mode 100644 index 840a3011..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-013-valid-events-from-paused-state.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.valid-events-from-paused-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Valid events from paused state - -## Intent - -- outcome: Executable scenario: Valid events from paused state - -```gwt -Given the feature fixture is in place -When I get valid events from "paused" -Then the valid events are: -And the event count is 3 -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-014-valid-events-from-error-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-014-valid-events-from-error-state.sdp.md deleted file mode 100644 index 189ecd1b..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-014-valid-events-from-error-state.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.valid-events-from-error-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Valid events from error state - -## Intent - -- outcome: Executable scenario: Valid events from error state - -```gwt -Given the feature fixture is in place -When I get valid events from "error" -Then the valid events are: -And the event count is 2 -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-015-returns-all-10-valid-transitions-with-correct-structure.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-015-returns-all-10-valid-transitions-with-correct-structure.sdp.md deleted file mode 100644 index 7bac5c9a..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-015-returns-all-10-valid-transitions-with-correct-structure.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.returns-all-10-valid-transitions-with-correct-structure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Returns all 10 valid transitions with correct structure - -## Intent - -- outcome: Executable scenario: Returns all 10 valid transitions with correct structure - -```gwt -Given the feature fixture is in place -When I get all transitions -Then the transition count is 10 -And each transition has "from", "event", and "to" properties -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-016-all-expected-transitions-are-included.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-016-all-expected-transitions-are-included.sdp.md deleted file mode 100644 index 7dd1614f..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-016-all-expected-transitions-are-included.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.all-expected-transitions-are-included -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# All expected transitions are included - -## Intent - -- outcome: Executable scenario: All expected transitions are included - -```gwt -Given the feature fixture is in place -When I get all transitions -Then the transition list includes: -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-017-returns-same-array-reference-memoized.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-017-returns-same-array-reference-memoized.sdp.md deleted file mode 100644 index ae55a205..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-017-returns-same-array-reference-memoized.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.returns-same-array-reference-memoized -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Returns same array reference (memoized) - -## Intent - -- outcome: Executable scenario: Returns same array reference (memoized) - -```gwt -Given the feature fixture is in place -When I get all transitions twice -Then both references are the same object -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-018-returns-new-state-for-valid-transition.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-018-returns-new-state-for-valid-transition.sdp.md deleted file mode 100644 index a951ed03..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-018-returns-new-state-for-valid-transition.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.returns-new-state-for-valid-transition -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Returns new state for valid transition - -## Intent - -- outcome: Executable scenario: Returns new state for valid transition - -```gwt -Given the feature fixture is in place -When I assert valid transition from "active" with "START_REBUILD" for "orderSummary" -Then the result state is "rebuilding" -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-019-throws-for-invalid-transition-with-projection-name.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-019-throws-for-invalid-transition-with-projection-name.sdp.md deleted file mode 100644 index f38eff14..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-019-throws-for-invalid-transition-with-projection-name.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.throws-for-invalid-transition-with-projection-name -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Throws for invalid transition with projection name - -## Intent - -- outcome: Executable scenario: Throws for invalid transition with projection name - -```gwt -Given the feature fixture is in place -When the scenario runs -Then assertValidTransition throws for: -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-020-all-states-are-reachable-from-at-least-one-other-state.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-020-all-states-are-reachable-from-at-least-one-other-state.sdp.md deleted file mode 100644 index 394e9ec0..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-020-all-states-are-reachable-from-at-least-one-other-state.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.all-states-are-reachable-from-at-least-one-other-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# All states are reachable from at least one other state - -## Intent - -- outcome: Executable scenario: All states are reachable from at least one other state - -```gwt -Given the feature fixture is in place -When I get all transitions -Then every state is a target of at least one transition: -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-021-all-states-have-at-least-one-outgoing-transition.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-021-all-states-have-at-least-one-outgoing-transition.sdp.md deleted file mode 100644 index 3fec5bf8..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-021-all-states-have-at-least-one-outgoing-transition.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.all-states-have-at-least-one-outgoing-transition -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# All states have at least one outgoing transition - -## Intent - -- outcome: Executable scenario: All states have at least one outgoing transition - -```gwt -Given the feature fixture is in place -When the scenario runs -Then every state has at least one valid event: -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-022-recovery-path-exists-from-error-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-022-recovery-path-exists-from-error-to-active.sdp.md deleted file mode 100644 index 26450a01..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-022-recovery-path-exists-from-error-to-active.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.recovery-path-exists-from-error-to-active -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Recovery path exists from error to active - -## Intent - -- outcome: Executable scenario: Recovery path exists from error to active - -```gwt -Given the feature fixture is in place -When I transition from "error" with "RECOVER" -Then the result state is "active" -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-023-error-path-exists-from-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-023-error-path-exists-from-active.sdp.md deleted file mode 100644 index 63d4b504..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-023-error-path-exists-from-active.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.error-path-exists-from-active -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Error path exists from active - -## Intent - -- outcome: Executable scenario: Error path exists from active - -```gwt -Given the feature fixture is in place -When I transition from "active" with "FAIL" -Then the result state is "error" -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-024-rebuild-retry-path-exists-from-error.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-024-rebuild-retry-path-exists-from-error.sdp.md deleted file mode 100644 index ab39c740..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-024-rebuild-retry-path-exists-from-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.rebuild-retry-path-exists-from-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Rebuild retry path exists from error - -## Intent - -- outcome: Executable scenario: Rebuild retry path exists from error - -```gwt -Given the feature fixture is in place -When I transition from "error" with "START_REBUILD" -Then the result state is "rebuilding" -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-025-normal-processing-active-state-allows-fail-event.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-025-normal-processing-active-state-allows-fail-event.sdp.md deleted file mode 100644 index a8178dd9..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-025-normal-processing-active-state-allows-fail-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.normal-processing-active-state-allows-fail-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Normal processing — active state allows FAIL event - -## Intent - -- outcome: Executable scenario: Normal processing — active state allows FAIL event - -```gwt -Given the projection is in "active" state -When the scenario runs -Then the valid events include "FAIL" -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-026-rebuild-workflow-active-to-rebuilding-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-026-rebuild-workflow-active-to-rebuilding-to-active.sdp.md deleted file mode 100644 index 38463723..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-026-rebuild-workflow-active-to-rebuilding-to-active.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.rebuild-workflow-active-to-rebuilding-to-active -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Rebuild workflow — active to rebuilding to active - -## Intent - -- outcome: Executable scenario: Rebuild workflow — active to rebuilding to active - -```gwt -Given the projection is in "active" state -When I apply event "START_REBUILD" and I apply event "COMPLETE_REBUILD" -Then the current state is "rebuilding" -And the current state is "active" -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-027-error-recovery-workflow-active-to-error-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-027-error-recovery-workflow-active-to-error-to-active.sdp.md deleted file mode 100644 index 26364d6a..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-027-error-recovery-workflow-active-to-error-to-active.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.error-recovery-workflow-active-to-error-to-active -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Error recovery workflow — active to error to active - -## Intent - -- outcome: Executable scenario: Error recovery workflow — active to error to active - -```gwt -Given the projection is in "active" state -When I apply event "FAIL" and I apply event "RECOVER" -Then the current state is "error" -And the current state is "active" -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-028-error-rebuild-workflow-active-to-error-to-rebuilding-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-028-error-rebuild-workflow-active-to-error-to-rebuilding-to-active.sdp.md deleted file mode 100644 index c48790ba..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-028-error-rebuild-workflow-active-to-error-to-rebuilding-to-active.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.error-rebuild-workflow-active-to-error-to-rebuilding-to-active -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Error rebuild workflow — active to error to rebuilding to active - -## Intent - -- outcome: Executable scenario: Error rebuild workflow — active to error to rebuilding to active - -```gwt -Given the projection is in "active" state -When I apply event "FAIL" and I apply event "START_REBUILD" and I apply event "COMPLETE_REBUILD" -Then the current state is "error" -And the current state is "rebuilding" -And the current state is "active" -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-029-pause-and-resume-workflow-active-to-paused-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-029-pause-and-resume-workflow-active-to-paused-to-active.sdp.md deleted file mode 100644 index 61a89e35..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-029-pause-and-resume-workflow-active-to-paused-to-active.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.pause-and-resume-workflow-active-to-paused-to-active -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Pause and resume workflow — active to paused to active - -## Intent - -- outcome: Executable scenario: Pause and resume workflow — active to paused to active - -```gwt -Given the projection is in "active" state -When I apply event "PAUSE" and I apply event "RESUME" -Then the current state is "paused" -And the current state is "active" -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-030-rebuild-failure-workflow-active-to-rebuilding-to-error-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-030-rebuild-failure-workflow-active-to-rebuilding-to-error-to-active.sdp.md deleted file mode 100644 index b94cb252..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-030-rebuild-failure-workflow-active-to-rebuilding-to-error-to-active.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.rebuild-failure-workflow-active-to-rebuilding-to-error-to-active -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Rebuild failure workflow — active to rebuilding to error to active - -## Intent - -- outcome: Executable scenario: Rebuild failure workflow — active to rebuilding to error to active - -```gwt -Given the projection is in "active" state -When I apply event "START_REBUILD" and I apply event "FAIL" and I apply event "RECOVER" -Then the current state is "rebuilding" -And the current state is "error" -And the current state is "active" -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-031-paused-rebuild-workflow-active-to-paused-to-rebuilding-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-031-paused-rebuild-workflow-active-to-paused-to-rebuilding-to-active.sdp.md deleted file mode 100644 index aec43896..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-031-paused-rebuild-workflow-active-to-paused-to-rebuilding-to-active.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.paused-rebuild-workflow-active-to-paused-to-rebuilding-to-active -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Paused rebuild workflow — active to paused to rebuilding to active - -## Intent - -- outcome: Executable scenario: Paused rebuild workflow — active to paused to rebuilding to active - -```gwt -Given the projection is in "active" state -When I apply event "PAUSE" and I apply event "START_REBUILD" and I apply event "COMPLETE_REBUILD" -Then the current state is "paused" -And the current state is "rebuilding" -And the current state is "active" -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.examples/s-032-paused-error-workflow-active-to-paused-to-error-to-active.sdp.md b/specs/behavior/platform-core/projections/lifecycle.examples/s-032-paused-error-workflow-active-to-paused-to-error-to-active.sdp.md deleted file mode 100644 index 85930b9c..00000000 --- a/specs/behavior/platform-core/projections/lifecycle.examples/s-032-paused-error-workflow-active-to-paused-to-error-to-active.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.lifecycle.paused-error-workflow-active-to-paused-to-error-to-active -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.lifecycle ---- -# Paused error workflow — active to paused to error to active - -## Intent - -- outcome: Executable scenario: Paused error workflow — active to paused to error to active - -```gwt -Given the projection is in "active" state -When I apply event "PAUSE" and I apply event "FAIL" and I apply event "RECOVER" -Then the current state is "paused" -And the current state is "error" -And the current state is "active" -``` diff --git a/specs/behavior/platform-core/projections/lifecycle.sdp.md b/specs/behavior/platform-core/projections/lifecycle.sdp.md index 1271fb54..804cad39 100644 --- a/specs/behavior/platform-core/projections/lifecycle.sdp.md +++ b/specs/behavior/platform-core/projections/lifecycle.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.projections.lifecycle kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: a projection lifecycle state machine so that projection state transitions are validated and auditable +- outcome: Validate projection state transitions through a lifecycle state machine so projection state changes stay auditable. +- value: Active, rebuilding, paused, and error states expose only the events that the transition table allows. ## Behavior diff --git a/specs/behavior/platform-core/projections/registry.examples/s-001-register-a-single-projection.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-001-register-a-single-projection.sdp.md deleted file mode 100644 index c2c1e097..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-001-register-a-single-projection.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.register-a-single-projection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# Register a single projection - -## Intent - -- outcome: Executable scenario: Register a single projection - -```gwt -Given an empty projection registry -When I register the "orderSummary" projection -Then the registry has "orderSummary" -And the registry size is 1 -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-002-register-multiple-projections.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-002-register-multiple-projections.sdp.md deleted file mode 100644 index 84e452ad..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-002-register-multiple-projections.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.register-multiple-projections -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# Register multiple projections - -## Intent - -- outcome: Executable scenario: Register multiple projections - -```gwt -Given an empty projection registry -When I register all standard projections -Then the registry size is 3 -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-003-duplicate-projection-name-throws-error.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-003-duplicate-projection-name-throws-error.sdp.md deleted file mode 100644 index cdb196a2..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-003-duplicate-projection-name-throws-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.duplicate-projection-name-throws-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# Duplicate projection name throws error - -## Intent - -- outcome: Executable scenario: Duplicate projection name throws error - -```gwt -Given a registry with the "orderSummary" projection -When I attempt to register "orderSummary" again -Then it throws "Projection \"orderSummary\" is already registered" -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-004-get-returns-projection-by-name.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-004-get-returns-projection-by-name.sdp.md deleted file mode 100644 index 36fc06fe..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-004-get-returns-projection-by-name.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.get-returns-projection-by-name -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# Get returns projection by name - -## Intent - -- outcome: Executable scenario: Get returns projection by name - -```gwt -Given a registry with "orderSummary" and "productCatalog" projections -When I get the "orderSummary" projection -Then the projection name is "orderSummary" -And the target table is "orderSummaries" -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-005-get-returns-undefined-for-unknown-projection.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-005-get-returns-undefined-for-unknown-projection.sdp.md deleted file mode 100644 index deb846d5..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-005-get-returns-undefined-for-unknown-projection.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.get-returns-undefined-for-unknown-projection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# Get returns undefined for unknown projection - -## Intent - -- outcome: Executable scenario: Get returns undefined for unknown projection - -```gwt -Given a registry with "orderSummary" and "productCatalog" projections -When I get the "unknownProjection" projection -Then the result is undefined -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-006-has-returns-true-for-registered-projection.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-006-has-returns-true-for-registered-projection.sdp.md deleted file mode 100644 index 3b2827b9..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-006-has-returns-true-for-registered-projection.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.has-returns-true-for-registered-projection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# Has returns true for registered projection - -## Intent - -- outcome: Executable scenario: Has returns true for registered projection - -```gwt -Given a registry with the "orderSummary" projection -When I check if the registry has "orderSummary" -Then the result is true -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-007-has-returns-false-for-unregistered-projection.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-007-has-returns-false-for-unregistered-projection.sdp.md deleted file mode 100644 index fbba3a8d..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-007-has-returns-false-for-unregistered-projection.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.has-returns-false-for-unregistered-projection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# Has returns false for unregistered projection - -## Intent - -- outcome: Executable scenario: Has returns false for unregistered projection - -```gwt -Given an empty projection registry -When I check if the registry has "unknownProjection" -Then the result is false -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md deleted file mode 100644 index 86061011..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-008-list-returns-empty-array-for-empty-registry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.list-returns-empty-array-for-empty-registry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# List returns empty array for empty registry - -## Intent - -- outcome: Executable scenario: List returns empty array for empty registry - -```gwt -Given an empty projection registry -When I list all projections -Then the list is empty -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-009-list-returns-all-registered-projections.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-009-list-returns-all-registered-projections.sdp.md deleted file mode 100644 index 4cc50842..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-009-list-returns-all-registered-projections.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.list-returns-all-registered-projections -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# List returns all registered projections - -## Intent - -- outcome: Executable scenario: List returns all registered projections - -```gwt -Given a registry with "orderSummary" and "productCatalog" projections -When I list all projections -Then the list has 2 projections -And the list contains all of: -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md deleted file mode 100644 index dc9c1949..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-010-size-is-0-for-empty-registry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.size-is-0-for-empty-registry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# Size is 0 for empty registry - -## Intent - -- outcome: Executable scenario: Size is 0 for empty registry - -```gwt -Given an empty projection registry -When the scenario runs -Then the registry size is 0 -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-011-size-reflects-registration-count.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-011-size-reflects-registration-count.sdp.md deleted file mode 100644 index 76e103df..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-011-size-reflects-registration-count.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.size-reflects-registration-count -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# Size reflects registration count - -## Intent - -- outcome: Executable scenario: Size reflects registration count - -```gwt -Given a registry with "orderSummary" and "productCatalog" projections -When the scenario runs -Then the registry size is 2 -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-012-get-by-event-type-returns-multiple-matching-projections.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-012-get-by-event-type-returns-multiple-matching-projections.sdp.md deleted file mode 100644 index 8195a614..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-012-get-by-event-type-returns-multiple-matching-projections.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.get-by-event-type-returns-multiple-matching-projections -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# GetByEventType returns multiple matching projections - -## Intent - -- outcome: Executable scenario: GetByEventType returns multiple matching projections - -```gwt -Given a registry with all standard projections -When I get projections by event type "OrderCreated" -Then the event lookup returns 2 projections -And the event lookup contains all of: -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-013-get-by-event-type-returns-single-context-specific-projection.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-013-get-by-event-type-returns-single-context-specific-projection.sdp.md deleted file mode 100644 index b024386f..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-013-get-by-event-type-returns-single-context-specific-projection.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.get-by-event-type-returns-single-context-specific-projection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# GetByEventType returns single context-specific projection - -## Intent - -- outcome: Executable scenario: GetByEventType returns single context-specific projection - -```gwt -Given a registry with all standard projections -When I get projections by event type "ProductCreated" -Then the event lookup returns 1 projection -And the first event lookup result is "productCatalog" -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-014-get-by-event-type-returns-empty-for-unknown-event.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-014-get-by-event-type-returns-empty-for-unknown-event.sdp.md deleted file mode 100644 index dc293797..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-014-get-by-event-type-returns-empty-for-unknown-event.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.get-by-event-type-returns-empty-for-unknown-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# GetByEventType returns empty for unknown event - -## Intent - -- outcome: Executable scenario: GetByEventType returns empty for unknown event - -```gwt -Given a registry with all standard projections -When I get projections by event type "UnknownEvent" -Then the event lookup returns 0 projections -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-015-get-all-event-types-returns-empty-for-empty-registry.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-015-get-all-event-types-returns-empty-for-empty-registry.sdp.md deleted file mode 100644 index 2948c149..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-015-get-all-event-types-returns-empty-for-empty-registry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.get-all-event-types-returns-empty-for-empty-registry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# GetAllEventTypes returns empty for empty registry - -## Intent - -- outcome: Executable scenario: GetAllEventTypes returns empty for empty registry - -```gwt -Given an empty projection registry -When I get all event types -Then the event types list is empty -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-016-get-all-event-types-returns-sorted-unique-event-types.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-016-get-all-event-types-returns-sorted-unique-event-types.sdp.md deleted file mode 100644 index a3fc6bb8..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-016-get-all-event-types-returns-sorted-unique-event-types.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.get-all-event-types-returns-sorted-unique-event-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# GetAllEventTypes returns sorted unique event types - -## Intent - -- outcome: Executable scenario: GetAllEventTypes returns sorted unique event types - -```gwt -Given a registry with all standard projections -When I get all event types -Then the event types are sorted -And the event types are unique -And the event types include all of: -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-017-get-by-context-filters-by-orders-context.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-017-get-by-context-filters-by-orders-context.sdp.md deleted file mode 100644 index 79e7d60b..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-017-get-by-context-filters-by-orders-context.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.get-by-context-filters-by-orders-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# GetByContext filters by orders context - -## Intent - -- outcome: Executable scenario: GetByContext filters by orders context - -```gwt -Given a registry with all standard projections -When I get projections by context "orders" -Then the context lookup returns 1 projection -And the first context lookup result is "orderSummary" -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-018-get-by-context-filters-by-inventory-context.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-018-get-by-context-filters-by-inventory-context.sdp.md deleted file mode 100644 index 90506e29..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-018-get-by-context-filters-by-inventory-context.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.get-by-context-filters-by-inventory-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# GetByContext filters by inventory context - -## Intent - -- outcome: Executable scenario: GetByContext filters by inventory context - -```gwt -Given a registry with all standard projections -When I get projections by context "inventory" -Then the context lookup returns 1 projection -And the first context lookup result is "productCatalog" -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-019-get-by-context-filters-by-cross-context.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-019-get-by-context-filters-by-cross-context.sdp.md deleted file mode 100644 index 83ea1572..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-019-get-by-context-filters-by-cross-context.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.get-by-context-filters-by-cross-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# GetByContext filters by cross-context - -## Intent - -- outcome: Executable scenario: GetByContext filters by cross-context - -```gwt -Given a registry with all standard projections -When I get projections by context "cross-context" -Then the context lookup returns 1 projection -And the first context lookup result is "orderWithInventory" -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-020-get-by-context-returns-empty-for-unknown-context.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-020-get-by-context-returns-empty-for-unknown-context.sdp.md deleted file mode 100644 index c66cd706..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-020-get-by-context-returns-empty-for-unknown-context.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.get-by-context-returns-empty-for-unknown-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# GetByContext returns empty for unknown context - -## Intent - -- outcome: Executable scenario: GetByContext returns empty for unknown context - -```gwt -Given a registry with all standard projections -When I get projections by context "unknown" -Then the context lookup returns 0 projections -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-021-get-rebuild-order-returns-empty-for-empty-registry.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-021-get-rebuild-order-returns-empty-for-empty-registry.sdp.md deleted file mode 100644 index 5fd76fc9..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-021-get-rebuild-order-returns-empty-for-empty-registry.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.get-rebuild-order-returns-empty-for-empty-registry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# GetRebuildOrder returns empty for empty registry - -## Intent - -- outcome: Executable scenario: GetRebuildOrder returns empty for empty registry - -```gwt -Given an empty projection registry -When I get the rebuild order -Then the rebuild order is empty -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-022-get-rebuild-order-places-primary-before-cross-context.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-022-get-rebuild-order-places-primary-before-cross-context.sdp.md deleted file mode 100644 index 504f5d5f..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-022-get-rebuild-order-places-primary-before-cross-context.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.get-rebuild-order-places-primary-before-cross-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# GetRebuildOrder places primary before cross-context - -## Intent - -- outcome: Executable scenario: GetRebuildOrder places primary before cross-context - -```gwt -Given a registry with projections registered in reverse order -When I get the rebuild order -Then "orderSummary" appears before "orderWithInventory" -And "productCatalog" appears before "orderWithInventory" -And the rebuild order has 3 projections -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-023-get-by-category-returns-view-projections.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-023-get-by-category-returns-view-projections.sdp.md deleted file mode 100644 index b13209a7..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-023-get-by-category-returns-view-projections.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.get-by-category-returns-view-projections -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# GetByCategory returns view projections - -## Intent - -- outcome: Executable scenario: GetByCategory returns view projections - -```gwt -Given a registry with all five category projections -When I get projections by category "view" -Then the category lookup returns 2 projections -And the category lookup contains all of: -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-024-get-by-category-returns-logic-projections.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-024-get-by-category-returns-logic-projections.sdp.md deleted file mode 100644 index 475a4b1f..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-024-get-by-category-returns-logic-projections.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.get-by-category-returns-logic-projections -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# GetByCategory returns logic projections - -## Intent - -- outcome: Executable scenario: GetByCategory returns logic projections - -```gwt -Given a registry with all five category projections -When I get projections by category "logic" -Then the category lookup returns 1 projection -And the first category lookup result is "orderExistence" -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-025-get-by-category-returns-reporting-projections.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-025-get-by-category-returns-reporting-projections.sdp.md deleted file mode 100644 index a12e9ebe..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-025-get-by-category-returns-reporting-projections.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.get-by-category-returns-reporting-projections -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# GetByCategory returns reporting projections - -## Intent - -- outcome: Executable scenario: GetByCategory returns reporting projections - -```gwt -Given a registry with all five category projections -When I get projections by category "reporting" -Then the category lookup returns 1 projection -And the first category lookup result is "dailySales" -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-026-get-by-category-returns-integration-projections.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-026-get-by-category-returns-integration-projections.sdp.md deleted file mode 100644 index ea1990e1..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-026-get-by-category-returns-integration-projections.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.get-by-category-returns-integration-projections -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# GetByCategory returns integration projections - -## Intent - -- outcome: Executable scenario: GetByCategory returns integration projections - -```gwt -Given a registry with all five category projections -When I get projections by category "integration" -Then the category lookup returns 1 projection -And the first category lookup result is "orderWithInventory" -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-027-get-by-category-returns-empty-when-no-projections-match.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-027-get-by-category-returns-empty-when-no-projections-match.sdp.md deleted file mode 100644 index 472c235c..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-027-get-by-category-returns-empty-when-no-projections-match.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.get-by-category-returns-empty-when-no-projections-match -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# GetByCategory returns empty when no projections match - -## Intent - -- outcome: Executable scenario: GetByCategory returns empty when no projections match - -```gwt -Given a registry with the "orderSummary" projection -When I get projections by category "logic" -Then the category lookup returns 0 projections -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-028-get-by-category-verifies-all-results-have-requested-category.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-028-get-by-category-verifies-all-results-have-requested-category.sdp.md deleted file mode 100644 index 901563fe..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-028-get-by-category-verifies-all-results-have-requested-category.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.get-by-category-verifies-all-results-have-requested-category -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# GetByCategory verifies all results have requested category - -## Intent - -- outcome: Executable scenario: GetByCategory verifies all results have requested category - -```gwt -Given a registry with all five category projections -When I get projections by category "view" -Then all returned projections have category "view" -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-029-get-by-category-works-regardless-of-registration-order.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-029-get-by-category-works-regardless-of-registration-order.sdp.md deleted file mode 100644 index 2dbbe3fc..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-029-get-by-category-works-regardless-of-registration-order.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.get-by-category-works-regardless-of-registration-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# GetByCategory works regardless of registration order - -## Intent - -- outcome: Executable scenario: GetByCategory works regardless of registration order - -```gwt -Given a registry with projections registered in non-category-grouped order -When I get projections by category "view" -Then the category lookup returns 2 projections -And the category lookup names sorted are "orderSummary" and "productCatalog" -``` diff --git a/specs/behavior/platform-core/projections/registry.examples/s-030-category-index-is-maintained-incrementally.sdp.md b/specs/behavior/platform-core/projections/registry.examples/s-030-category-index-is-maintained-incrementally.sdp.md deleted file mode 100644 index 7784d581..00000000 --- a/specs/behavior/platform-core/projections/registry.examples/s-030-category-index-is-maintained-incrementally.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.registry.category-index-is-maintained-incrementally -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.registry ---- -# Category index is maintained incrementally - -## Intent - -- outcome: Executable scenario: Category index is maintained incrementally - -```gwt -Given an empty projection registry -When I register "orderSummary" with category "view" and I register "orderExistence" with category "logic" and I register "productCatalog" with category "view" -Then the category lookup for "view" returns 1 projection -And the category counts are: -And the category lookup for "view" returns 2 projections -``` diff --git a/specs/behavior/platform-core/projections/registry.sdp.md b/specs/behavior/platform-core/projections/registry.sdp.md index 7f618afa..21c0428b 100644 --- a/specs/behavior/platform-core/projections/registry.sdp.md +++ b/specs/behavior/platform-core/projections/registry.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.projections.registry kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: Projection Registry CRUD and Lookup +- outcome: Register, retrieve, and look up projections by name, event type, context, category, and rebuild order. +- value: Duplicate names are rejected and category lookup stays indexed independently of registration order. ## Behavior diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-001-process-event-when-no-checkpoint-exists.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-001-process-event-when-no-checkpoint-exists.sdp.md deleted file mode 100644 index c1f66800..00000000 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-001-process-event-when-no-checkpoint-exists.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.with-checkpoint.process-event-when-no-checkpoint-exists -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.with-checkpoint ---- -# Process event when no checkpoint exists - -## Intent - -- outcome: Executable scenario: Process event when no checkpoint exists - -```gwt -Given no checkpoint exists for partition "ord_123" -When I call withCheckpoint with projection "orderSummary" partition "ord_123" position 1000 event "evt_001" -Then the result status is "processed" -And the process callback was invoked 1 time -And the updateCheckpoint callback was invoked 1 time -And the processed events list contains: -``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md deleted file mode 100644 index 254c75c7..00000000 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-002-process-event-when-global-position-exceeds-checkpoint.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.with-checkpoint.process-event-when-global-position-exceeds-checkpoint -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.with-checkpoint ---- -# Process event when globalPosition exceeds checkpoint - -## Intent - -- outcome: Executable scenario: Process event when globalPosition exceeds checkpoint - -```gwt -Given a checkpoint exists for partition "ord_123" at position 1000 with event "evt_001" -When I call withCheckpoint with projection "orderSummary" partition "ord_123" position 2000 event "evt_002" -Then the result status is "processed" -And the process callback was invoked 1 time -``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-003-checkpoint-is-updated-after-processing.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-003-checkpoint-is-updated-after-processing.sdp.md deleted file mode 100644 index 83a6e685..00000000 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-003-checkpoint-is-updated-after-processing.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.with-checkpoint.checkpoint-is-updated-after-processing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.with-checkpoint ---- -# Checkpoint is updated after processing - -## Intent - -- outcome: Executable scenario: Checkpoint is updated after processing - -```gwt -Given no checkpoint exists for partition "ord_123" -When I call withCheckpoint with projection "orderSummary" partition "ord_123" position 1000 event "evt_001" -Then the saved checkpoint for partition "ord_123" has all fields: -And the saved checkpoint updatedAt is recent -``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md deleted file mode 100644 index 5ef0851d..00000000 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-004-skip-event-when-global-position-equals-checkpoint.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.with-checkpoint.skip-event-when-global-position-equals-checkpoint -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.with-checkpoint ---- -# Skip event when globalPosition equals checkpoint - -## Intent - -- outcome: Executable scenario: Skip event when globalPosition equals checkpoint - -```gwt -Given a checkpoint exists for partition "ord_123" at position 1000 with event "evt_001" -When I call withCheckpoint with projection "orderSummary" partition "ord_123" position 1000 event "evt_001" -Then the result status is "skipped" -And the process callback was not invoked -And the updateCheckpoint callback was not invoked -``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md deleted file mode 100644 index b1747628..00000000 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-005-skip-event-when-global-position-is-less-than-checkpoint.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.with-checkpoint.skip-event-when-global-position-is-less-than-checkpoint -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.with-checkpoint ---- -# Skip event when globalPosition is less than checkpoint - -## Intent - -- outcome: Executable scenario: Skip event when globalPosition is less than checkpoint - -```gwt -Given a checkpoint exists for partition "ord_123" at position 2000 with event "evt_002" -When I call withCheckpoint with projection "orderSummary" partition "ord_123" position 1000 event "evt_001" -Then the result status is "skipped" -And the process callback was not invoked -``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-006-separate-checkpoints-per-partition.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-006-separate-checkpoints-per-partition.sdp.md deleted file mode 100644 index eb28b977..00000000 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-006-separate-checkpoints-per-partition.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.with-checkpoint.separate-checkpoints-per-partition -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.with-checkpoint ---- -# Separate checkpoints per partition - -## Intent - -- outcome: Executable scenario: Separate checkpoints per partition - -```gwt -Given no checkpoint exists for partition "ord_001" -And no checkpoint exists for partition "ord_002" -When I process partition "ord_001" with projection "orderSummary" position 1000 event "evt_001" and I process partition "ord_002" with projection "orderSummary" position 500 event "evt_002" -Then both partitions were processed -And the saved checkpoint for partition "ord_001" has lastGlobalPosition 1000 -And the saved checkpoint for partition "ord_002" has lastGlobalPosition 500 -``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-007-same-position-in-different-partitions-does-not-cause-skip.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-007-same-position-in-different-partitions-does-not-cause-skip.sdp.md deleted file mode 100644 index 482f6d00..00000000 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-007-same-position-in-different-partitions-does-not-cause-skip.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.with-checkpoint.same-position-in-different-partitions-does-not-cause-skip -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.with-checkpoint ---- -# Same position in different partitions does not cause skip - -## Intent - -- outcome: Executable scenario: Same position in different partitions does not cause skip - -```gwt -Given a checkpoint exists for partition "ord_001" at position 1000 with event "evt_001" -When I call withCheckpoint with projection "orderSummary" partition "ord_002" position 1000 event "evt_002" -Then the result status is "processed" -And the process callback was invoked 1 time -``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-008-checkpoint-not-updated-when-process-throws.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-008-checkpoint-not-updated-when-process-throws.sdp.md deleted file mode 100644 index dd90c31c..00000000 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-008-checkpoint-not-updated-when-process-throws.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.with-checkpoint.checkpoint-not-updated-when-process-throws -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.with-checkpoint ---- -# Checkpoint not updated when process throws - -## Intent - -- outcome: Executable scenario: Checkpoint not updated when process throws - -```gwt -Given no checkpoint exists for partition "ord_123" -When I call withCheckpoint with a failing process for partition "ord_123" position 1000 event "evt_001" -Then the call rejects with "Process failed: database unavailable" -And the updateCheckpoint callback was not invoked -And no checkpoint exists in store for partition "ord_123" -``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-009-retry-succeeds-after-process-failure.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-009-retry-succeeds-after-process-failure.sdp.md deleted file mode 100644 index bdecde42..00000000 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-009-retry-succeeds-after-process-failure.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.with-checkpoint.retry-succeeds-after-process-failure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.with-checkpoint ---- -# Retry succeeds after process failure - -## Intent - -- outcome: Executable scenario: Retry succeeds after process failure - -```gwt -Given no checkpoint exists for partition "ord_123" -When I call withCheckpoint with a transiently failing process for partition "ord_123" position 1000 event "evt_001" -Then the first attempt rejects with "Transient failure" -And the retry attempt succeeds with status "processed" -And the processed events list contains: -And the saved checkpoint for partition "ord_123" has lastGlobalPosition 1000 -``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-010-all-checkpoint-fields-stored-correctly.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-010-all-checkpoint-fields-stored-correctly.sdp.md deleted file mode 100644 index 40254574..00000000 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-010-all-checkpoint-fields-stored-correctly.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.with-checkpoint.all-checkpoint-fields-stored-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.with-checkpoint ---- -# All checkpoint fields stored correctly - -## Intent - -- outcome: Executable scenario: All checkpoint fields stored correctly - -```gwt -Given no checkpoint exists for partition "prod_xyz" -When I call withCheckpoint with projection "productCatalog" partition "prod_xyz" position 12345 event "evt_abc123" -Then updateCheckpoint was called with checkpoint matching: -``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-011-helper-processes-and-stores-checkpoint.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-011-helper-processes-and-stores-checkpoint.sdp.md deleted file mode 100644 index 23e36d07..00000000 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-011-helper-processes-and-stores-checkpoint.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.with-checkpoint.helper-processes-and-stores-checkpoint -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.with-checkpoint ---- -# Helper processes and stores checkpoint - -## Intent - -- outcome: Executable scenario: Helper processes and stores checkpoint - -```gwt -Given the feature fixture is in place -When I create a checkpoint helper and process partition "ord_123" position 1000 event "evt_001" -Then the helper result status is "processed" -And the helper processed events list contains: -And the helper checkpoint for partition "ord_123" has lastGlobalPosition 1000 -``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-012-helper-maintains-checkpoint-semantics-across-calls.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-012-helper-maintains-checkpoint-semantics-across-calls.sdp.md deleted file mode 100644 index a7bfdc90..00000000 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-012-helper-maintains-checkpoint-semantics-across-calls.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.with-checkpoint.helper-maintains-checkpoint-semantics-across-calls -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.with-checkpoint ---- -# Helper maintains checkpoint semantics across calls - -## Intent - -- outcome: Executable scenario: Helper maintains checkpoint semantics across calls - -```gwt -Given the feature fixture is in place -When I create a checkpoint helper and run a three-call sequence on partition "ord_123" -Then the second call was skipped -And the helper processed events list contains: -``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-013-should-process-event-position-comparisons.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-013-should-process-event-position-comparisons.sdp.md deleted file mode 100644 index 534c0167..00000000 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-013-should-process-event-position-comparisons.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.with-checkpoint.should-process-event-position-comparisons -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.with-checkpoint ---- -# shouldProcessEvent position comparisons - -## Intent - -- outcome: Executable scenario: shouldProcessEvent position comparisons - -```gwt -Given the feature fixture is in place -When the scenario runs -Then shouldProcessEvent returns expected results for: -``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-014-initial-checkpoint-has-sentinel-values.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-014-initial-checkpoint-has-sentinel-values.sdp.md deleted file mode 100644 index c7c2be42..00000000 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-014-initial-checkpoint-has-sentinel-values.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.with-checkpoint.initial-checkpoint-has-sentinel-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.with-checkpoint ---- -# Initial checkpoint has sentinel values - -## Intent - -- outcome: Executable scenario: Initial checkpoint has sentinel values - -```gwt -Given the feature fixture is in place -When I create an initial checkpoint for projection "orderSummary" partition "ord_123" -Then the initial checkpoint has all fields: -And the initial checkpoint updatedAt is greater than 0 -``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-015-each-initial-checkpoint-gets-a-unique-updated-at.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.examples/s-015-each-initial-checkpoint-gets-a-unique-updated-at.sdp.md deleted file mode 100644 index 1e66fffd..00000000 --- a/specs/behavior/platform-core/projections/with-checkpoint.examples/s-015-each-initial-checkpoint-gets-a-unique-updated-at.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.projections.with-checkpoint.each-initial-checkpoint-gets-a-unique-updated-at -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.projections.with-checkpoint ---- -# Each initial checkpoint gets a unique updatedAt - -## Intent - -- outcome: Executable scenario: Each initial checkpoint gets a unique updatedAt - -```gwt -Given the feature fixture is in place -When I create two initial checkpoints with a delay -Then the second checkpoint updatedAt is greater than or equal to the first -``` diff --git a/specs/behavior/platform-core/projections/with-checkpoint.sdp.md b/specs/behavior/platform-core/projections/with-checkpoint.sdp.md index 3226dd18..e93c4a48 100644 --- a/specs/behavior/platform-core/projections/with-checkpoint.sdp.md +++ b/specs/behavior/platform-core/projections/with-checkpoint.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.projections.with-checkpoint kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: withCheckpoint Projection Idempotency +- outcome: Process projection events through withCheckpoint so already-seen events are skipped and checkpoints stay partition-scoped. +- value: A failed process leaves the checkpoint unchanged so a retry can re-apply the same event. ## Behavior diff --git a/specs/behavior/platform-core/queries/factory.examples/s-001-single-result-query-descriptor-has-correct-result-type-and-config.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-001-single-result-query-descriptor-has-correct-result-type-and-config.sdp.md deleted file mode 100644 index 44a01c9e..00000000 --- a/specs/behavior/platform-core/queries/factory.examples/s-001-single-result-query-descriptor-has-correct-result-type-and-config.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.factory.single-result-query-descriptor-has-correct-result-type-and-config -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.factory ---- -# Single result query descriptor has correct result type and config - -## Intent - -- outcome: Executable scenario: Single result query descriptor has correct result type and config - -```gwt -Given a read model query descriptor for "getOrderById" with result type "single" -When the scenario runs -Then the descriptor has result type "single" -And the descriptor config has all expected fields: -``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-002-list-result-query-descriptor-has-correct-result-type.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-002-list-result-query-descriptor-has-correct-result-type.sdp.md deleted file mode 100644 index 50e98029..00000000 --- a/specs/behavior/platform-core/queries/factory.examples/s-002-list-result-query-descriptor-has-correct-result-type.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.factory.list-result-query-descriptor-has-correct-result-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.factory ---- -# List result query descriptor has correct result type - -## Intent - -- outcome: Executable scenario: List result query descriptor has correct result type - -```gwt -Given a read model query descriptor for "getOrdersByCustomer" with result type "list" -When the scenario runs -Then the descriptor has result type "list" -And the descriptor config queryName is "getOrdersByCustomer" -``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-003-count-result-query-descriptor-has-correct-result-type.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-003-count-result-query-descriptor-has-correct-result-type.sdp.md deleted file mode 100644 index 86b81509..00000000 --- a/specs/behavior/platform-core/queries/factory.examples/s-003-count-result-query-descriptor-has-correct-result-type.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.factory.count-result-query-descriptor-has-correct-result-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.factory ---- -# Count result query descriptor has correct result type - -## Intent - -- outcome: Executable scenario: Count result query descriptor has correct result type - -```gwt -Given a read model query descriptor for "countPendingOrders" with result type "count" -When the scenario runs -Then the descriptor has result type "count" -And the descriptor config queryName is "countPendingOrders" -``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-004-paginated-query-descriptor-uses-default-page-sizes.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-004-paginated-query-descriptor-uses-default-page-sizes.sdp.md deleted file mode 100644 index 49576c7c..00000000 --- a/specs/behavior/platform-core/queries/factory.examples/s-004-paginated-query-descriptor-uses-default-page-sizes.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.factory.paginated-query-descriptor-uses-default-page-sizes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.factory ---- -# Paginated query descriptor uses default page sizes - -## Intent - -- outcome: Executable scenario: Paginated query descriptor uses default page sizes - -```gwt -Given a paginated query descriptor for "listOrders" with index "by_customer" -When the scenario runs -Then the descriptor has result type "paginated" -And the descriptor config queryName is "listOrders" -And the descriptor config paginationIndex is "by_customer" -And the descriptor defaults use standard pagination constants -``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-005-paginated-query-descriptor-uses-custom-page-sizes.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-005-paginated-query-descriptor-uses-custom-page-sizes.sdp.md deleted file mode 100644 index 829273ae..00000000 --- a/specs/behavior/platform-core/queries/factory.examples/s-005-paginated-query-descriptor-uses-custom-page-sizes.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.factory.paginated-query-descriptor-uses-custom-page-sizes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.factory ---- -# Paginated query descriptor uses custom page sizes - -## Intent - -- outcome: Executable scenario: Paginated query descriptor uses custom page sizes - -```gwt -Given a paginated query descriptor for "listProducts" with custom page size 50 and max 200 -When the scenario runs -Then the descriptor has custom page sizes: -``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-006-config-receives-default-pagination-values.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-006-config-receives-default-pagination-values.sdp.md deleted file mode 100644 index b5d5ce1c..00000000 --- a/specs/behavior/platform-core/queries/factory.examples/s-006-config-receives-default-pagination-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.factory.config-receives-default-pagination-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.factory ---- -# Config receives default pagination values - -## Intent - -- outcome: Executable scenario: Config receives default pagination values - -```gwt -Given a paginated query descriptor for "listItems" with index "by_created" and no custom sizes -When the scenario runs -Then the descriptor config has default pagination values -``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-007-empty-registry-has-correct-context-and-projection.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-007-empty-registry-has-correct-context-and-projection.sdp.md deleted file mode 100644 index e330b157..00000000 --- a/specs/behavior/platform-core/queries/factory.examples/s-007-empty-registry-has-correct-context-and-projection.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.factory.empty-registry-has-correct-context-and-projection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.factory ---- -# Empty registry has correct context and projection - -## Intent - -- outcome: Executable scenario: Empty registry has correct context and projection - -```gwt -Given a query registry for context "orders" and projection "orderSummary" with no queries -When the scenario runs -Then the registry context is "orders" -And the registry sourceProjection is "orderSummary" -And the registry has 0 queries -``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-008-registry-with-multiple-queries-provides-keyed-access.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-008-registry-with-multiple-queries-provides-keyed-access.sdp.md deleted file mode 100644 index e458aae7..00000000 --- a/specs/behavior/platform-core/queries/factory.examples/s-008-registry-with-multiple-queries-provides-keyed-access.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.factory.registry-with-multiple-queries-provides-keyed-access -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.factory ---- -# Registry with multiple queries provides keyed access - -## Intent - -- outcome: Executable scenario: Registry with multiple queries provides keyed access - -```gwt -Given a query registry with a "single" query "getById" and a "paginated" query "list" -When the scenario runs -Then the registry has 2 queries -And the registry query result types are: -``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-009-type-safe-access-to-registered-query-descriptor.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-009-type-safe-access-to-registered-query-descriptor.sdp.md deleted file mode 100644 index f4292b85..00000000 --- a/specs/behavior/platform-core/queries/factory.examples/s-009-type-safe-access-to-registered-query-descriptor.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.factory.type-safe-access-to-registered-query-descriptor -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.factory ---- -# Type-safe access to registered query descriptor - -## Intent - -- outcome: Executable scenario: Type-safe access to registered query descriptor - -```gwt -Given a query registry with a single query "getById" -When the scenario runs -Then the registry query "getById" has queryName "getById" -``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-010-no-options-returns-descriptor-defaults.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-010-no-options-returns-descriptor-defaults.sdp.md deleted file mode 100644 index 26970499..00000000 --- a/specs/behavior/platform-core/queries/factory.examples/s-010-no-options-returns-descriptor-defaults.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.factory.no-options-returns-descriptor-defaults -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.factory ---- -# No options returns descriptor defaults - -## Intent - -- outcome: Executable scenario: No options returns descriptor defaults - -```gwt -Given a paginated query with default page size 25 and max 100 -When getPaginationOptions is called with no options -Then the pagination page size is 25 -And the pagination cursor is undefined -``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-011-provided-page-size-within-limits-is-used.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-011-provided-page-size-within-limits-is-used.sdp.md deleted file mode 100644 index 1cdb4567..00000000 --- a/specs/behavior/platform-core/queries/factory.examples/s-011-provided-page-size-within-limits-is-used.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.factory.provided-page-size-within-limits-is-used -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.factory ---- -# Provided page size within limits is used - -## Intent - -- outcome: Executable scenario: Provided page size within limits is used - -```gwt -Given a paginated query with default page size 25 and max 100 -When getPaginationOptions is called with page size 50 -Then the pagination page size is 50 -``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-012-page-size-exceeding-max-is-clamped.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-012-page-size-exceeding-max-is-clamped.sdp.md deleted file mode 100644 index eeca9235..00000000 --- a/specs/behavior/platform-core/queries/factory.examples/s-012-page-size-exceeding-max-is-clamped.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.factory.page-size-exceeding-max-is-clamped -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.factory ---- -# Page size exceeding max is clamped - -## Intent - -- outcome: Executable scenario: Page size exceeding max is clamped - -```gwt -Given a paginated query with default page size 25 and max 100 -When getPaginationOptions is called with page size 500 -Then the pagination page size is 100 -``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-013-zero-and-negative-page-sizes-are-clamped-to-1.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-013-zero-and-negative-page-sizes-are-clamped-to-1.sdp.md deleted file mode 100644 index 7581e5f9..00000000 --- a/specs/behavior/platform-core/queries/factory.examples/s-013-zero-and-negative-page-sizes-are-clamped-to-1.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.factory.zero-and-negative-page-sizes-are-clamped-to-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.factory ---- -# Zero and negative page sizes are clamped to 1 - -## Intent - -- outcome: Executable scenario: Zero and negative page sizes are clamped to 1 - -```gwt -Given a paginated query with default page size 25 and max 100 -When getPaginationOptions is called with each page size: -Then each result has page size 1 -``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-014-cursor-is-passed-through-to-options.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-014-cursor-is-passed-through-to-options.sdp.md deleted file mode 100644 index 151b1273..00000000 --- a/specs/behavior/platform-core/queries/factory.examples/s-014-cursor-is-passed-through-to-options.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.factory.cursor-is-passed-through-to-options -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.factory ---- -# Cursor is passed through to options - -## Intent - -- outcome: Executable scenario: Cursor is passed through to options - -```gwt -Given a paginated query with default page size 25 and max 100 -When getPaginationOptions is called with page size 20 and cursor "abc123" -Then the pagination cursor is "abc123" -``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-015-cursor-is-undefined-when-not-provided.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-015-cursor-is-undefined-when-not-provided.sdp.md deleted file mode 100644 index 3b954961..00000000 --- a/specs/behavior/platform-core/queries/factory.examples/s-015-cursor-is-undefined-when-not-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.factory.cursor-is-undefined-when-not-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.factory ---- -# Cursor is undefined when not provided - -## Intent - -- outcome: Executable scenario: Cursor is undefined when not provided - -```gwt -Given a paginated query with default page size 25 and max 100 -When getPaginationOptions is called with page size 20 -Then the pagination cursor is undefined -``` diff --git a/specs/behavior/platform-core/queries/factory.examples/s-016-read-model-and-paginated-descriptors-preserve-result-types.sdp.md b/specs/behavior/platform-core/queries/factory.examples/s-016-read-model-and-paginated-descriptors-preserve-result-types.sdp.md deleted file mode 100644 index ae0eca5a..00000000 --- a/specs/behavior/platform-core/queries/factory.examples/s-016-read-model-and-paginated-descriptors-preserve-result-types.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.factory.read-model-and-paginated-descriptors-preserve-result-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.factory ---- -# Read model and paginated descriptors preserve result types - -## Intent - -- outcome: Executable scenario: Read model and paginated descriptors preserve result types - -```gwt -Given a typed single ReadModelQueryDescriptor for "getOrder" -And a typed PaginatedQueryDescriptor for "listProducts" -When the scenario runs -Then the single descriptor has result type "single" -And the paginated descriptor has result type "paginated" -``` diff --git a/specs/behavior/platform-core/queries/factory.sdp.md b/specs/behavior/platform-core/queries/factory.sdp.md index dfd3763d..37922b3f 100644 --- a/specs/behavior/platform-core/queries/factory.sdp.md +++ b/specs/behavior/platform-core/queries/factory.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.queries.factory kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: factory functions for query descriptors and pagination so that read model queries are created with correct types, configurations, and pagination defaults +- outcome: Factory functions produce typed query descriptors, registries, and pagination options so read model queries are created with correct types, configurations, and pagination defaults. +- value: Read model queries get consistent types, configurations, and pagination defaults. ## Behavior diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-001-pagination-constants-have-expected-values.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-001-pagination-constants-have-expected-values.sdp.md deleted file mode 100644 index 8c1ebbc1..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-001-pagination-constants-have-expected-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.pagination-constants-have-expected-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Pagination constants have expected values - -## Intent - -- outcome: Executable scenario: Pagination constants have expected values - -```gwt -Given the feature fixture is in place -When the scenario runs -Then the pagination constants are: -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-002-returns-defaults-when-no-options-provided.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-002-returns-defaults-when-no-options-provided.sdp.md deleted file mode 100644 index 40cf58db..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-002-returns-defaults-when-no-options-provided.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.returns-defaults-when-no-options-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Returns defaults when no options provided - -## Intent - -- outcome: Executable scenario: Returns defaults when no options provided - -```gwt -Given a pagination config with defaultPageSize 20 and maxPageSize 100 -When I normalize pagination options with no input -Then the normalized pageSize is 20 -And the normalized cursor is undefined -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-003-uses-provided-page-size-within-limits.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-003-uses-provided-page-size-within-limits.sdp.md deleted file mode 100644 index ce9f23e7..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-003-uses-provided-page-size-within-limits.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.uses-provided-page-size-within-limits -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Uses provided page size within limits - -## Intent - -- outcome: Executable scenario: Uses provided page size within limits - -```gwt -Given a pagination config with defaultPageSize 20 and maxPageSize 100 -When I normalize pagination options with pageSize 50 -Then the normalized pageSize is 50 -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-004-caps-page-size-at-max.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-004-caps-page-size-at-max.sdp.md deleted file mode 100644 index 93bb7dfd..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-004-caps-page-size-at-max.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.caps-page-size-at-max -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Caps page size at max - -## Intent - -- outcome: Executable scenario: Caps page size at max - -```gwt -Given a pagination config with defaultPageSize 20 and maxPageSize 100 -When I normalize pagination options with pageSize 200 -Then the normalized pageSize is 100 -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-005-enforces-minimum-page-size-of-1-for-boundary-values.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-005-enforces-minimum-page-size-of-1-for-boundary-values.sdp.md deleted file mode 100644 index c7beaeaf..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-005-enforces-minimum-page-size-of-1-for-boundary-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.enforces-minimum-page-size-of-1-for-boundary-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Enforces minimum page size of 1 for boundary values - -## Intent - -- outcome: Executable scenario: Enforces minimum page size of 1 for boundary values - -```gwt -Given a pagination config with defaultPageSize 20 and maxPageSize 100 -When I normalize pagination options with pageSize values: -Then all normalized pageSizes are 1 -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-006-passes-through-cursor.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-006-passes-through-cursor.sdp.md deleted file mode 100644 index 5701d935..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-006-passes-through-cursor.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.passes-through-cursor -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Passes through cursor - -## Intent - -- outcome: Executable scenario: Passes through cursor - -```gwt -Given a pagination config with defaultPageSize 20 and maxPageSize 100 -When I normalize pagination options with cursor "abc123" -Then the normalized cursor is "abc123" -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-007-works-with-custom-config-values.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-007-works-with-custom-config-values.sdp.md deleted file mode 100644 index fa2b60b2..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-007-works-with-custom-config-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.works-with-custom-config-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Works with custom config values - -## Intent - -- outcome: Executable scenario: Works with custom config values - -```gwt -Given a pagination config with defaultPageSize 10 and maxPageSize 50 -When I normalize pagination options with various inputs: -Then the expected outcome holds -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-008-rounds-floating-point-page-sizes-down.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-008-rounds-floating-point-page-sizes-down.sdp.md deleted file mode 100644 index 00562806..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-008-rounds-floating-point-page-sizes-down.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.rounds-floating-point-page-sizes-down -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Rounds floating-point page sizes down - -## Intent - -- outcome: Executable scenario: Rounds floating-point page sizes down - -```gwt -Given a pagination config with defaultPageSize 20 and maxPageSize 100 -When I normalize pagination options with float pageSize values: -Then the expected outcome holds -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-009-creates-an-empty-page-with-correct-structure.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-009-creates-an-empty-page-with-correct-structure.sdp.md deleted file mode 100644 index b0cc079a..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-009-creates-an-empty-page-with-correct-structure.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.creates-an-empty-page-with-correct-structure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Creates an empty page with correct structure - -## Intent - -- outcome: Executable scenario: Creates an empty page with correct structure - -```gwt -Given the feature fixture is in place -When I create an empty page -Then the page has 0 items -And the page continueCursor is null -And the page isDone is true -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-010-preserves-type-information-with-empty-array.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-010-preserves-type-information-with-empty-array.sdp.md deleted file mode 100644 index eb582b52..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-010-preserves-type-information-with-empty-array.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.preserves-type-information-with-empty-array -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Preserves type information with empty array - -## Intent - -- outcome: Executable scenario: Preserves type information with empty array - -```gwt -Given the feature fixture is in place -When I create an empty page -Then the page items is an array with length 0 -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-011-creates-a-page-with-items-and-cursor.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-011-creates-a-page-with-items-and-cursor.sdp.md deleted file mode 100644 index 30438c37..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-011-creates-a-page-with-items-and-cursor.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.creates-a-page-with-items-and-cursor -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Creates a page with items and cursor - -## Intent - -- outcome: Executable scenario: Creates a page with items and cursor - -```gwt -Given items with ids "1", "2", "3" -When I create a paged result with pageSize 3 and cursor "next-cursor" -Then the page has 3 items -And the page continueCursor is "next-cursor" -And the page isDone is false -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-012-creates-a-done-page-when-cursor-is-null.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-012-creates-a-done-page-when-cursor-is-null.sdp.md deleted file mode 100644 index db14a918..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-012-creates-a-done-page-when-cursor-is-null.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.creates-a-done-page-when-cursor-is-null -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Creates a done page when cursor is null - -## Intent - -- outcome: Executable scenario: Creates a done page when cursor is null - -```gwt -Given items with ids "1", "2" -When I create a paged result with pageSize 3 and null cursor -Then the page items match the input items -And the page continueCursor is null -And the page isDone is true -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-013-handles-empty-items-array-with-null-cursor.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-013-handles-empty-items-array-with-null-cursor.sdp.md deleted file mode 100644 index 73340234..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-013-handles-empty-items-array-with-null-cursor.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.handles-empty-items-array-with-null-cursor -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Handles empty items array with null cursor - -## Intent - -- outcome: Executable scenario: Handles empty items array with null cursor - -```gwt -Given the feature fixture is in place -When I create a paged result with no items and null cursor -Then the page has 0 items -And the page isDone is true -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-014-encodes-and-decodes-simple-position-data.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-014-encodes-and-decodes-simple-position-data.sdp.md deleted file mode 100644 index efc12a1b..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-014-encodes-and-decodes-simple-position-data.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.encodes-and-decodes-simple-position-data -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Encodes and decodes simple position data - -## Intent - -- outcome: Executable scenario: Encodes and decodes simple position data - -```gwt -Given a cursor position with offset 20 and lastId "abc123" -When I encode and decode the cursor position -Then the decoded position matches the original -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-015-encodes-and-decodes-complex-position-data.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-015-encodes-and-decodes-complex-position-data.sdp.md deleted file mode 100644 index 9f4e9668..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-015-encodes-and-decodes-complex-position-data.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.encodes-and-decodes-complex-position-data -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Encodes and decodes complex position data - -## Intent - -- outcome: Executable scenario: Encodes and decodes complex position data - -```gwt -Given a cursor position with globalPosition, streamId, and timestamp -When I encode and decode the cursor position -Then the decoded position matches the original -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-016-produces-base64-encoded-string.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-016-produces-base64-encoded-string.sdp.md deleted file mode 100644 index 9eb4fe67..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-016-produces-base64-encoded-string.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.produces-base64-encoded-string -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Produces base64-encoded string - -## Intent - -- outcome: Executable scenario: Produces base64-encoded string - -```gwt -Given a cursor position with offset 0 -When I encode the cursor position -Then the encoded cursor is valid base64 -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-017-round-trips-various-data-shapes.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-017-round-trips-various-data-shapes.sdp.md deleted file mode 100644 index ab1573f9..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-017-round-trips-various-data-shapes.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.round-trips-various-data-shapes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Round-trips various data shapes - -## Intent - -- outcome: Executable scenario: Round-trips various data shapes - -```gwt -Given the feature fixture is in place -When I encode and decode each data shape: -Then all decoded shapes match their originals -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-018-returns-null-for-invalid-cursor-inputs.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-018-returns-null-for-invalid-cursor-inputs.sdp.md deleted file mode 100644 index 3a3e7b7b..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-018-returns-null-for-invalid-cursor-inputs.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.returns-null-for-invalid-cursor-inputs -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Returns null for invalid cursor inputs - -## Intent - -- outcome: Executable scenario: Returns null for invalid cursor inputs - -```gwt -Given the feature fixture is in place -When I decode invalid cursor values: -Then all decoded results are null -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-019-returns-null-for-base64-with-invalid-characters-in-middle-or-end.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-019-returns-null-for-base64-with-invalid-characters-in-middle-or-end.sdp.md deleted file mode 100644 index 5bb80dbd..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-019-returns-null-for-base64-with-invalid-characters-in-middle-or-end.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.returns-null-for-base64-with-invalid-characters-in-middle-or-end -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Returns null for base64 with invalid characters in middle or end - -## Intent - -- outcome: Executable scenario: Returns null for base64 with invalid characters in middle or end - -```gwt -Given the feature fixture is in place -When I decode cursors with invalid base64 characters: -Then all decoded results are null -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-020-returns-null-for-truncated-utf-8-sequences.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-020-returns-null-for-truncated-utf-8-sequences.sdp.md deleted file mode 100644 index 4a506709..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-020-returns-null-for-truncated-utf-8-sequences.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.returns-null-for-truncated-utf-8-sequences -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Returns null for truncated UTF-8 sequences - -## Intent - -- outcome: Executable scenario: Returns null for truncated UTF-8 sequences - -```gwt -Given the feature fixture is in place -When I decode the cursor "wA==" -Then the decoded result is null -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-021-returns-true-for-valid-page-sizes.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-021-returns-true-for-valid-page-sizes.sdp.md deleted file mode 100644 index 9a5b1236..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-021-returns-true-for-valid-page-sizes.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.returns-true-for-valid-page-sizes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Returns true for valid page sizes - -## Intent - -- outcome: Executable scenario: Returns true for valid page sizes - -```gwt -Given the feature fixture is in place -When the scenario runs -Then these page sizes are valid: -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-022-returns-false-for-invalid-page-sizes.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-022-returns-false-for-invalid-page-sizes.sdp.md deleted file mode 100644 index 31686348..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-022-returns-false-for-invalid-page-sizes.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.returns-false-for-invalid-page-sizes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Returns false for invalid page sizes - -## Intent - -- outcome: Executable scenario: Returns false for invalid page sizes - -```gwt -Given the feature fixture is in place -When the scenario runs -Then these page sizes are invalid: -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-023-respects-custom-max-page-size.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-023-respects-custom-max-page-size.sdp.md deleted file mode 100644 index afc14014..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-023-respects-custom-max-page-size.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.respects-custom-max-page-size -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Respects custom max page size - -## Intent - -- outcome: Executable scenario: Respects custom max page size - -```gwt -Given the feature fixture is in place -When the scenario runs -Then page size 50 is valid with max 50 -And page size 51 is invalid with max 50 -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-024-returns-requested-size-when-valid.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-024-returns-requested-size-when-valid.sdp.md deleted file mode 100644 index c967fc4e..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-024-returns-requested-size-when-valid.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.returns-requested-size-when-valid -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Returns requested size when valid - -## Intent - -- outcome: Executable scenario: Returns requested size when valid - -```gwt -Given the feature fixture is in place -When the scenario runs -Then effective page size for requested 50 is 50 -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-025-returns-default-when-not-specified.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-025-returns-default-when-not-specified.sdp.md deleted file mode 100644 index 1fc9e555..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-025-returns-default-when-not-specified.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.returns-default-when-not-specified -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Returns default when not specified - -## Intent - -- outcome: Executable scenario: Returns default when not specified - -```gwt -Given the feature fixture is in place -When the scenario runs -Then effective page size for undefined is DEFAULT_PAGE_SIZE -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-026-caps-at-max-and-enforces-minimum.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-026-caps-at-max-and-enforces-minimum.sdp.md deleted file mode 100644 index 464ce9cd..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-026-caps-at-max-and-enforces-minimum.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.caps-at-max-and-enforces-minimum -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Caps at max and enforces minimum - -## Intent - -- outcome: Executable scenario: Caps at max and enforces minimum - -```gwt -Given the feature fixture is in place -When the scenario runs -Then these effective page sizes are correct: -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-027-uses-custom-default-and-max-sizes.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-027-uses-custom-default-and-max-sizes.sdp.md deleted file mode 100644 index 195d4c0b..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-027-uses-custom-default-and-max-sizes.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.uses-custom-default-and-max-sizes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Uses custom default and max sizes - -## Intent - -- outcome: Executable scenario: Uses custom default and max sizes - -```gwt -Given the feature fixture is in place -When the scenario runs -Then these effective page sizes with custom config are correct: -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-028-rounds-floating-point-sizes-down.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-028-rounds-floating-point-sizes-down.sdp.md deleted file mode 100644 index c2ad7af0..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-028-rounds-floating-point-sizes-down.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.rounds-floating-point-sizes-down -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Rounds floating-point sizes down - -## Intent - -- outcome: Executable scenario: Rounds floating-point sizes down - -```gwt -Given the feature fixture is in place -When the scenario runs -Then these effective page sizes are correct: -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-029-simulates-complete-pagination-flow.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-029-simulates-complete-pagination-flow.sdp.md deleted file mode 100644 index 0d6b45ee..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-029-simulates-complete-pagination-flow.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.simulates-complete-pagination-flow -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Simulates complete pagination flow - -## Intent - -- outcome: Executable scenario: Simulates complete pagination flow - -```gwt -Given items for page 1 with ids "1", "2", "3" and encoded cursor offset 3 -When I create a paged result for page 1 and I create a final page with item id "4" -Then page 1 isDone is false -And the decoded cursor offset is 3 -And page 2 isDone is true -And page 2 continueCursor is null -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-030-handles-empty-result-set.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-030-handles-empty-result-set.sdp.md deleted file mode 100644 index d8c5a2bc..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-030-handles-empty-result-set.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.handles-empty-result-set -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Handles empty result set - -## Intent - -- outcome: Executable scenario: Handles empty result set - -```gwt -Given the feature fixture is in place -When I create an empty page -Then the page has 0 items -And the page isDone is true -``` diff --git a/specs/behavior/platform-core/queries/pagination.examples/s-031-handles-exact-page-size-match-with-continuation.sdp.md b/specs/behavior/platform-core/queries/pagination.examples/s-031-handles-exact-page-size-match-with-continuation.sdp.md deleted file mode 100644 index f2a18c8a..00000000 --- a/specs/behavior/platform-core/queries/pagination.examples/s-031-handles-exact-page-size-match-with-continuation.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.queries.pagination.handles-exact-page-size-match-with-continuation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.queries.pagination ---- -# Handles exact page size match with continuation - -## Intent - -- outcome: Executable scenario: Handles exact page size match with continuation - -```gwt -Given items for page 1 with ids "1", "2", "3" and encoded cursor offset 3 -When I create a paged result for page 1 -Then the page has 3 items -And page 1 isDone is false -``` diff --git a/specs/behavior/platform-core/queries/pagination.sdp.md b/specs/behavior/platform-core/queries/pagination.sdp.md index ac3d1c69..9943df9c 100644 --- a/specs/behavior/platform-core/queries/pagination.sdp.md +++ b/specs/behavior/platform-core/queries/pagination.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.queries.pagination kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: cursor-based pagination utilities for read model queries so that query results are paginated with consistent defaults, cursor encoding, and page size validation +- outcome: Cursor-based pagination utilities paginate query results with consistent defaults, cursor encoding, and page size validation. +- value: Query results are paginated with consistent defaults, cursor encoding, and page size validation. ## Behavior diff --git a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-001-conflicting-optimistic-update-is-rolled-back.sdp.md b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-001-conflicting-optimistic-update-is-rolled-back.sdp.md deleted file mode 100644 index efae6f0d..00000000 --- a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-001-conflicting-optimistic-update-is-rolled-back.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.reactive-projections.conflict-detection.conflicting-optimistic-update-is-rolled-back -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reactive-projections.conflict-detection ---- -# Conflicting optimistic update is rolled back - -## Intent - -- outcome: Executable scenario: Conflicting optimistic update is rolled back - -```gwt -Given the conflict detection module is initialized -And a reactive projection with optimistic state tracking -And optimistic state based on event A -And durable state updated with event B (different branch) -When conflict is detected -Then optimistic state should be discarded -And client should show durable state -``` diff --git a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-002-conflict-detection-handles-network-partition.sdp.md b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-002-conflict-detection-handles-network-partition.sdp.md deleted file mode 100644 index eb6ceae8..00000000 --- a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-002-conflict-detection-handles-network-partition.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.reactive-projections.conflict-detection.conflict-detection-handles-network-partition -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reactive-projections.conflict-detection ---- -# Conflict detection handles network partition - -## Intent - -- outcome: Executable scenario: Conflict detection handles network partition - -```gwt -Given the conflict detection module is initialized -And a reactive projection with optimistic state tracking -And optimistic updates accumulated during offline period -When client reconnects and receives durable state -Then all conflicting optimistic updates are rolled back -And non-conflicting updates are preserved -``` diff --git a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-003-no-conflict-when-optimistic-is-ahead-of-durable.sdp.md b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-003-no-conflict-when-optimistic-is-ahead-of-durable.sdp.md deleted file mode 100644 index f7d6bfcb..00000000 --- a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-003-no-conflict-when-optimistic-is-ahead-of-durable.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.reactive-projections.conflict-detection.no-conflict-when-optimistic-is-ahead-of-durable -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reactive-projections.conflict-detection ---- -# No conflict when optimistic is ahead of durable - -## Intent - -- outcome: Executable scenario: No conflict when optimistic is ahead of durable - -```gwt -Given the conflict detection module is initialized -And a reactive projection with optimistic state tracking -And optimistic state with events A, B -And durable state with only event A -When durable catches up with event B -Then states converge without rollback -And no user-visible disruption occurs -``` diff --git a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-004-rollback-triggers-ui-notification.sdp.md b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-004-rollback-triggers-ui-notification.sdp.md deleted file mode 100644 index 735eca61..00000000 --- a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-004-rollback-triggers-ui-notification.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.reactive-projections.conflict-detection.rollback-triggers-ui-notification -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reactive-projections.conflict-detection ---- -# Rollback triggers UI notification - -## Intent - -- outcome: Executable scenario: Rollback triggers UI notification - -```gwt -Given the conflict detection module is initialized -And a reactive projection with optimistic state tracking -And optimistic state that will conflict -When conflict is detected and rollback occurs -Then client receives conflict notification -And UI can display appropriate feedback -``` diff --git a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-005-partial-clearing-preserves-unconfirmed-events.sdp.md b/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-005-partial-clearing-preserves-unconfirmed-events.sdp.md deleted file mode 100644 index 5ff02683..00000000 --- a/specs/behavior/platform-core/reactive-projections/conflict-detection.examples/s-005-partial-clearing-preserves-unconfirmed-events.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.reactive-projections.conflict-detection.partial-clearing-preserves-unconfirmed-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reactive-projections.conflict-detection ---- -# Partial clearing preserves unconfirmed events - -## Intent - -- outcome: Executable scenario: Partial clearing preserves unconfirmed events - -```gwt -Given the conflict detection module is initialized -And a reactive projection with optimistic state tracking -And optimistic state with events at positions value -When durable confirms position value -Then remaining event positions should be "value" -``` diff --git a/specs/behavior/platform-core/reactive-projections/conflict-detection.sdp.md b/specs/behavior/platform-core/reactive-projections/conflict-detection.sdp.md index a616ac11..db855348 100644 --- a/specs/behavior/platform-core/reactive-projections/conflict-detection.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/conflict-detection.sdp.md @@ -11,4 +11,5 @@ relations: ## Intent - actor: a platform developer -- outcome: conflicts detected and resolved automatically so that data integrity is maintained despite optimistic updates +- outcome: Detect and resolve conflicts automatically so data integrity is maintained despite optimistic updates. +- value: Optimistic overlays that diverge from durable truth are discarded rather than left as a permanent incorrect view. diff --git a/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-001-client-receives-instant-update-then-durable-confirmation.sdp.md b/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-001-client-receives-instant-update-then-durable-confirmation.sdp.md deleted file mode 100644 index f1a932cb..00000000 --- a/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-001-client-receives-instant-update-then-durable-confirmation.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.reactive-projections.hybrid-model.client-receives-instant-update-then-durable-confirmation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reactive-projections.hybrid-model ---- -# Client receives instant update then durable confirmation - -## Intent - -- outcome: Executable scenario: Client receives instant update then durable confirmation - -```gwt -Given the reactive projection system is initialized -And a view projection "orderSummary" is registered -And an order is submitted -When the OrderSubmitted event is published -Then client sees optimistic update within 50ms -And Workpool updates durable projection within 500ms -And client state converges to durable state -``` diff --git a/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-002-optimistic-update-works-during-workpool-backlog.sdp.md b/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-002-optimistic-update-works-during-workpool-backlog.sdp.md deleted file mode 100644 index 291e959a..00000000 --- a/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-002-optimistic-update-works-during-workpool-backlog.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.reactive-projections.hybrid-model.optimistic-update-works-during-workpool-backlog -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reactive-projections.hybrid-model ---- -# Optimistic update works during Workpool backlog - -## Intent - -- outcome: Executable scenario: Optimistic update works during Workpool backlog - -```gwt -Given the reactive projection system is initialized -And a view projection "orderSummary" is registered -And the Workpool has a processing backlog -When an event is published -Then client sees optimistic update immediately -And optimistic state includes pending event -And durable state catches up when Workpool processes -``` diff --git a/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-003-durable-state-takes-precedence-after-convergence.sdp.md b/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-003-durable-state-takes-precedence-after-convergence.sdp.md deleted file mode 100644 index 7a43ab97..00000000 --- a/specs/behavior/platform-core/reactive-projections/hybrid-model.examples/s-003-durable-state-takes-precedence-after-convergence.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.reactive-projections.hybrid-model.durable-state-takes-precedence-after-convergence -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reactive-projections.hybrid-model ---- -# Durable state takes precedence after convergence - -## Intent - -- outcome: Executable scenario: Durable state takes precedence after convergence - -```gwt -Given the reactive projection system is initialized -And a view projection "orderSummary" is registered -And optimistic state from events A, B -And Workpool processes events A, B -When durable projection is updated -Then optimistic overlay clears for processed events -And client shows durable state -``` diff --git a/specs/behavior/platform-core/reactive-projections/hybrid-model.sdp.md b/specs/behavior/platform-core/reactive-projections/hybrid-model.sdp.md index 217da3b6..d7f4915f 100644 --- a/specs/behavior/platform-core/reactive-projections/hybrid-model.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/hybrid-model.sdp.md @@ -11,4 +11,5 @@ relations: ## Intent - actor: a frontend developer -- outcome: projections that combine durability with instant feedback so that users see optimistic updates while maintaining data integrity +- outcome: Combine durable projections with instant reactive feedback so users see optimistic updates while data integrity is maintained. +- value: Workpool persistence and the optimistic overlay operate on the same projection and converge once Workpool catches up. diff --git a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-001-category-determines-reactive-eligibility.sdp.md b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-001-category-determines-reactive-eligibility.sdp.md deleted file mode 100644 index 15592be2..00000000 --- a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-001-category-determines-reactive-eligibility.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.reactive-projections.reactive-eligibility.category-determines-reactive-eligibility -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reactive-projections.reactive-eligibility ---- -# Category determines reactive eligibility - -## Intent - -- outcome: Executable scenario: Category determines reactive eligibility - -```gwt -Given the projection registry is available -And projections are categorized by type -And a projection with category "value" -When the scenario runs -Then it should value for reactive updates -``` diff --git a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-002-non-view-projection-rejects-reactive-subscription.sdp.md b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-002-non-view-projection-rejects-reactive-subscription.sdp.md deleted file mode 100644 index 27959842..00000000 --- a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-002-non-view-projection-rejects-reactive-subscription.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.reactive-projections.reactive-eligibility.non-view-projection-rejects-reactive-subscription -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reactive-projections.reactive-eligibility ---- -# Non-view projection rejects reactive subscription - -## Intent - -- outcome: Executable scenario: Non-view projection rejects reactive subscription - -```gwt -Given the projection registry is available -And projections are categorized by type -And a projection with category "logic" -When useReactiveProjection is called -Then it should fail with code "REACTIVE_NOT_SUPPORTED" -And error message should suggest using regular useQuery -``` diff --git a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-003-view-projection-enables-full-reactive-functionality.sdp.md b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-003-view-projection-enables-full-reactive-functionality.sdp.md deleted file mode 100644 index d49c549b..00000000 --- a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-003-view-projection-enables-full-reactive-functionality.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.reactive-projections.reactive-eligibility.view-projection-enables-full-reactive-functionality -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reactive-projections.reactive-eligibility ---- -# View projection enables full reactive functionality - -## Intent - -- outcome: Executable scenario: View projection enables full reactive functionality - -```gwt -Given the projection registry is available -And projections are categorized by type -And a projection with category "view" -When useReactiveProjection is called -Then reactive subscription is established -And optimistic updates are enabled -And conflict detection is active -``` diff --git a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-004-initial-reactive-result-represents-loading-state.sdp.md b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-004-initial-reactive-result-represents-loading-state.sdp.md deleted file mode 100644 index 3d9d0160..00000000 --- a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.examples/s-004-initial-reactive-result-represents-loading-state.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.platform-core.reactive-projections.reactive-eligibility.initial-reactive-result-represents-loading-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reactive-projections.reactive-eligibility ---- -# Initial reactive result represents loading state - -## Intent - -- outcome: Executable scenario: Initial reactive result represents loading state - -```gwt -Given the projection registry is available -And projections are categorized by type -When createInitialReactiveResult is called -Then state should be null -And isLoading should be true -And isOptimistic should be false -And durablePosition should be 0 -And pendingEvents should be 0 -And error should be null -``` diff --git a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.sdp.md b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.sdp.md index f8fcc362..159b14ab 100644 --- a/specs/behavior/platform-core/reactive-projections/reactive-eligibility.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/reactive-eligibility.sdp.md @@ -11,4 +11,5 @@ relations: ## Intent - actor: a platform developer -- outcome: only view projections to support reactive updates so that system resources are optimized +- outcome: Restrict reactive updates to view projections so system resources stay proportional to user-visible benefit. +- value: Logic, reporting, and integration projections reject reactive subscriptions instead of paying for unused push infrastructure. diff --git a/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-001-evolve-produces-identical-results-on-client-and-server.sdp.md b/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-001-evolve-produces-identical-results-on-client-and-server.sdp.md deleted file mode 100644 index 76904d36..00000000 --- a/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-001-evolve-produces-identical-results-on-client-and-server.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.reactive-projections.shared-evolve.evolve-produces-identical-results-on-client-and-server -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reactive-projections.shared-evolve ---- -# Evolve produces identical results on client and server - -## Intent - -- outcome: Executable scenario: Evolve produces identical results on client and server - -```gwt -Given an evolve function is defined for the projection -And the evolve function handles OrderSubmitted and OrderConfirmed events -And an OrderSubmitted event -When evolve is applied on client (optimistic) and evolve is applied on server (durable) -Then both should produce identical state -``` diff --git a/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-002-evolve-handles-unknown-event-types-gracefully.sdp.md b/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-002-evolve-handles-unknown-event-types-gracefully.sdp.md deleted file mode 100644 index 24881721..00000000 --- a/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-002-evolve-handles-unknown-event-types-gracefully.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.reactive-projections.shared-evolve.evolve-handles-unknown-event-types-gracefully -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reactive-projections.shared-evolve ---- -# Evolve handles unknown event types gracefully - -## Intent - -- outcome: Executable scenario: Evolve handles unknown event types gracefully - -```gwt -Given an evolve function is defined for the projection -And the evolve function handles OrderSubmitted and OrderConfirmed events -And an evolve function for known event types -When an unknown event type is applied -Then state should remain unchanged -And no error should be thrown -``` diff --git a/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-003-multiple-events-evolve-in-sequence.sdp.md b/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-003-multiple-events-evolve-in-sequence.sdp.md deleted file mode 100644 index 53b69b81..00000000 --- a/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-003-multiple-events-evolve-in-sequence.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.reactive-projections.shared-evolve.multiple-events-evolve-in-sequence -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reactive-projections.shared-evolve ---- -# Multiple events evolve in sequence - -## Intent - -- outcome: Executable scenario: Multiple events evolve in sequence - -```gwt -Given an evolve function is defined for the projection -And the evolve function handles OrderSubmitted and OrderConfirmed events -And a base projection state -When OrderSubmitted then OrderConfirmed events are applied -Then final state reflects all event transformations in order -And intermediate states are consistent -``` diff --git a/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-004-evolve-error-includes-event-context.sdp.md b/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-004-evolve-error-includes-event-context.sdp.md deleted file mode 100644 index febcbc5a..00000000 --- a/specs/behavior/platform-core/reactive-projections/shared-evolve.examples/s-004-evolve-error-includes-event-context.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.reactive-projections.shared-evolve.evolve-error-includes-event-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reactive-projections.shared-evolve ---- -# Evolve error includes event context - -## Intent - -- outcome: Executable scenario: Evolve error includes event context - -```gwt -Given an evolve function is defined for the projection -And the evolve function handles OrderSubmitted and OrderConfirmed events -And a base projection state -And an evolve function that throws on "CorruptEvent" -When a "CorruptEvent" at position 5 is merged -Then error message should contain "position=5" -And error message should contain "CorruptEvent" -``` diff --git a/specs/behavior/platform-core/reactive-projections/shared-evolve.sdp.md b/specs/behavior/platform-core/reactive-projections/shared-evolve.sdp.md index dde05128..723f3083 100644 --- a/specs/behavior/platform-core/reactive-projections/shared-evolve.sdp.md +++ b/specs/behavior/platform-core/reactive-projections/shared-evolve.sdp.md @@ -11,4 +11,5 @@ relations: ## Intent - actor: a platform developer -- outcome: evolve logic shared between client and server so that state transformations are always consistent +- outcome: Share evolve logic between client and server so state transformations stay consistent. +- value: Identical input state and event produce identical output on both surfaces; unknown event types leave state unchanged. diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-001-get-instance-returns-the-same-instance-on-multiple-calls.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-001-get-instance-returns-the-same-instance-on-multiple-calls.sdp.md deleted file mode 100644 index 4dd60878..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-001-get-instance-returns-the-same-instance-on-multiple-calls.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.get-instance-returns-the-same-instance-on-multiple-calls -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# getInstance returns the same instance on multiple calls - -## Intent - -- outcome: Executable scenario: getInstance returns the same instance on multiple calls - -```gwt -Given a fresh CommandRegistry instance -When getInstance is called again -Then both instances are the same object -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-002-reset-creates-a-new-instance.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-002-reset-creates-a-new-instance.sdp.md deleted file mode 100644 index c10a361a..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-002-reset-creates-a-new-instance.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.reset-creates-a-new-instance -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# Reset creates a new instance - -## Intent - -- outcome: Executable scenario: Reset creates a new instance - -```gwt -Given a fresh CommandRegistry instance -When the registry is reset and a new instance is obtained -Then the new instance is a different object -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-003-register-a-command-successfully.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-003-register-a-command-successfully.sdp.md deleted file mode 100644 index af40789a..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-003-register-a-command-successfully.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.register-a-command-successfully -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# Register a command successfully - -## Intent - -- outcome: Executable scenario: Register a command successfully - -```gwt -Given a fresh CommandRegistry instance -When a "CreateOrder" command is registered -Then the registry has "CreateOrder" -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-004-duplicate-registration-throws-an-error.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-004-duplicate-registration-throws-an-error.sdp.md deleted file mode 100644 index 3e4ed3bf..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-004-duplicate-registration-throws-an-error.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.duplicate-registration-throws-an-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# Duplicate registration throws an error - -## Intent - -- outcome: Executable scenario: Duplicate registration throws an error - -```gwt -Given a fresh CommandRegistry instance -And a "CreateOrder" command is registered in context "orders" -When a duplicate "CreateOrder" command is registered in context "other" -Then the registration throws a duplicate error mentioning "orders" -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-005-different-command-types-can-be-registered.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-005-different-command-types-can-be-registered.sdp.md deleted file mode 100644 index 4cd2785f..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-005-different-command-types-can-be-registered.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.different-command-types-can-be-registered -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# Different command types can be registered - -## Intent - -- outcome: Executable scenario: Different command types can be registered - -```gwt -Given a fresh CommandRegistry instance -When "CreateOrder" and "CancelOrder" commands are both registered -Then the registry size is 2 -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-006-unregister-removes-a-registered-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-006-unregister-removes-a-registered-command.sdp.md deleted file mode 100644 index 9c0bb93b..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-006-unregister-removes-a-registered-command.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.unregister-removes-a-registered-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# Unregister removes a registered command - -## Intent - -- outcome: Executable scenario: Unregister removes a registered command - -```gwt -Given a fresh CommandRegistry instance -And a "CreateOrder" command is registered -When "CreateOrder" is unregistered -Then unregister returned true -And the registry does not have "CreateOrder" -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-007-unregister-returns-false-for-non-existent-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-007-unregister-returns-false-for-non-existent-command.sdp.md deleted file mode 100644 index 455fcbea..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-007-unregister-returns-false-for-non-existent-command.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.unregister-returns-false-for-non-existent-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# Unregister returns false for non-existent command - -## Intent - -- outcome: Executable scenario: Unregister returns false for non-existent command - -```gwt -Given a fresh CommandRegistry instance -When "NonExistent" is unregistered -Then unregister returned false -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-008-get-config-returns-config-for-a-registered-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-008-get-config-returns-config-for-a-registered-command.sdp.md deleted file mode 100644 index adabee8e..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-008-get-config-returns-config-for-a-registered-command.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.get-config-returns-config-for-a-registered-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# getConfig returns config for a registered command - -## Intent - -- outcome: Executable scenario: getConfig returns config for a registered command - -```gwt -Given a fresh CommandRegistry instance -And a "CreateOrder" command is registered -When getConfig is called for "CreateOrder" -Then the config is defined with commandType "CreateOrder" -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-009-get-config-returns-undefined-for-a-non-existent-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-009-get-config-returns-undefined-for-a-non-existent-command.sdp.md deleted file mode 100644 index 9a7f1719..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-009-get-config-returns-undefined-for-a-non-existent-command.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.get-config-returns-undefined-for-a-non-existent-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# getConfig returns undefined for a non-existent command - -## Intent - -- outcome: Executable scenario: getConfig returns undefined for a non-existent command - -```gwt -Given a fresh CommandRegistry instance -When getConfig is called for "NonExistent" -Then the config is undefined -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-010-get-registration-returns-full-registration-for-a-registered-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-010-get-registration-returns-full-registration-for-a-registered-command.sdp.md deleted file mode 100644 index ac486f50..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-010-get-registration-returns-full-registration-for-a-registered-command.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.get-registration-returns-full-registration-for-a-registered-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# getRegistration returns full registration for a registered command - -## Intent - -- outcome: Executable scenario: getRegistration returns full registration for a registered command - -```gwt -Given a fresh CommandRegistry instance -And a "CreateOrder" command is registered with description "Creates an order" -When getRegistration is called for "CreateOrder" -Then the registration is defined with commandType "CreateOrder" and description "Creates an order" -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-011-get-registration-returns-undefined-for-a-non-existent-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-011-get-registration-returns-undefined-for-a-non-existent-command.sdp.md deleted file mode 100644 index 7a7215b3..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-011-get-registration-returns-undefined-for-a-non-existent-command.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.get-registration-returns-undefined-for-a-non-existent-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# getRegistration returns undefined for a non-existent command - -## Intent - -- outcome: Executable scenario: getRegistration returns undefined for a non-existent command - -```gwt -Given a fresh CommandRegistry instance -When getRegistration is called for "NonExistent" -Then the registration result is undefined -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-012-has-returns-true-for-a-registered-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-012-has-returns-true-for-a-registered-command.sdp.md deleted file mode 100644 index 1909bb9e..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-012-has-returns-true-for-a-registered-command.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.has-returns-true-for-a-registered-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# has returns true for a registered command - -## Intent - -- outcome: Executable scenario: has returns true for a registered command - -```gwt -Given a fresh CommandRegistry instance -And a "CreateOrder" command is registered -When the scenario runs -Then the registry has "CreateOrder" -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-013-has-returns-false-for-a-non-existent-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-013-has-returns-false-for-a-non-existent-command.sdp.md deleted file mode 100644 index 7b3bbccd..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-013-has-returns-false-for-a-non-existent-command.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.has-returns-false-for-a-non-existent-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# has returns false for a non-existent command - -## Intent - -- outcome: Executable scenario: has returns false for a non-existent command - -```gwt -Given a fresh CommandRegistry instance -When the scenario runs -Then the registry does not have "NonExistent" -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-014-validate-returns-valid-for-correct-payload.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-014-validate-returns-valid-for-correct-payload.sdp.md deleted file mode 100644 index bb0e0ab3..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-014-validate-returns-valid-for-correct-payload.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.validate-returns-valid-for-correct-payload -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# Validate returns valid for correct payload - -## Intent - -- outcome: Executable scenario: Validate returns valid for correct payload - -```gwt -Given a fresh CommandRegistry instance -And a "CreateOrder" command is registered with orderId and customerId schema -When "CreateOrder" is validated with orderId "ord_123" and customerId "cust_456" -Then validation is valid with matching data -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-015-validate-returns-invalid-for-incorrect-payload.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-015-validate-returns-invalid-for-incorrect-payload.sdp.md deleted file mode 100644 index bd05c659..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-015-validate-returns-invalid-for-incorrect-payload.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.validate-returns-invalid-for-incorrect-payload -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# Validate returns invalid for incorrect payload - -## Intent - -- outcome: Executable scenario: Validate returns invalid for incorrect payload - -```gwt -Given a fresh CommandRegistry instance -And a "CreateOrder" command is registered with orderId and customerId schema -When "CreateOrder" is validated with only orderId "ord_123" -Then validation is invalid with errors -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-016-validate-returns-unknown-command-for-non-existent-command.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-016-validate-returns-unknown-command-for-non-existent-command.sdp.md deleted file mode 100644 index effc8851..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-016-validate-returns-unknown-command-for-non-existent-command.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.validate-returns-unknown-command-for-non-existent-command -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# Validate returns UNKNOWN_COMMAND for non-existent command - -## Intent - -- outcome: Executable scenario: Validate returns UNKNOWN_COMMAND for non-existent command - -```gwt -Given a fresh CommandRegistry instance -When "NonExistent" is validated with empty payload -Then validation is invalid with error code "UNKNOWN_COMMAND" -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-017-list-returns-empty-array-when-no-commands-are-registered.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-017-list-returns-empty-array-when-no-commands-are-registered.sdp.md deleted file mode 100644 index 4b8582fc..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-017-list-returns-empty-array-when-no-commands-are-registered.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.list-returns-empty-array-when-no-commands-are-registered -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# list returns empty array when no commands are registered - -## Intent - -- outcome: Executable scenario: list returns empty array when no commands are registered - -```gwt -Given a fresh CommandRegistry instance -When the scenario runs -Then list returns an empty array -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-018-list-returns-all-registered-commands.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-018-list-returns-all-registered-commands.sdp.md deleted file mode 100644 index cf42a87a..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-018-list-returns-all-registered-commands.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.list-returns-all-registered-commands -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# list returns all registered commands - -## Intent - -- outcome: Executable scenario: list returns all registered commands - -```gwt -Given a fresh CommandRegistry instance -And "CreateOrder" and "CancelOrder" are registered for listing -When the scenario runs -Then list returns 2 commands containing: -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-019-list-returns-command-info-objects-with-correct-shape.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-019-list-returns-command-info-objects-with-correct-shape.sdp.md deleted file mode 100644 index 1ed5d44c..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-019-list-returns-command-info-objects-with-correct-shape.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.list-returns-command-info-objects-with-correct-shape -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# list returns CommandInfo objects with correct shape - -## Intent - -- outcome: Executable scenario: list returns CommandInfo objects with correct shape - -```gwt -Given a fresh CommandRegistry instance -And a "CreateOrder" command is registered with full metadata -When the scenario runs -Then the CommandInfo has the expected fields -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-020-filter-commands-by-category.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-020-filter-commands-by-category.sdp.md deleted file mode 100644 index 968c52e9..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-020-filter-commands-by-category.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.filter-commands-by-category -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# Filter commands by category - -## Intent - -- outcome: Executable scenario: Filter commands by category - -```gwt -Given a fresh CommandRegistry instance -And the following categorized commands are registered: -When the scenario runs -Then listByCategory returns the expected results: -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-021-filter-commands-by-bounded-context.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-021-filter-commands-by-bounded-context.sdp.md deleted file mode 100644 index d00fe99b..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-021-filter-commands-by-bounded-context.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.filter-commands-by-bounded-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# Filter commands by bounded context - -## Intent - -- outcome: Executable scenario: Filter commands by bounded context - -```gwt -Given a fresh CommandRegistry instance -And commands are registered across contexts for context filtering -When the scenario runs -Then listByContext "orders" returns 2 commands -And listByContext "nonexistent" returns 0 commands -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-022-filter-commands-by-tag.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-022-filter-commands-by-tag.sdp.md deleted file mode 100644 index 3faae3b2..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-022-filter-commands-by-tag.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.filter-commands-by-tag -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# Filter commands by tag - -## Intent - -- outcome: Executable scenario: Filter commands by tag - -```gwt -Given a fresh CommandRegistry instance -And commands are registered with tags for tag filtering -When the scenario runs -Then listByTag "orders" returns 2 commands -And listByTag "inventory" returns 1 command with commandType "ReserveStock" -And listByTag "nonexistent" returns 0 commands -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-023-group-commands-by-bounded-context.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-023-group-commands-by-bounded-context.sdp.md deleted file mode 100644 index b6309299..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-023-group-commands-by-bounded-context.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.group-commands-by-bounded-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# Group commands by bounded context - -## Intent - -- outcome: Executable scenario: Group commands by bounded context - -```gwt -Given a fresh CommandRegistry instance -And commands are registered across contexts for grouping -When the scenario runs -Then groupByContext returns a map with 2 keys -And the "orders" group has 2 commands -And the "inventory" group has 1 command -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-024-group-by-context-returns-empty-map-when-no-commands.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-024-group-by-context-returns-empty-map-when-no-commands.sdp.md deleted file mode 100644 index 1901bbd1..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-024-group-by-context-returns-empty-map-when-no-commands.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.group-by-context-returns-empty-map-when-no-commands -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# groupByContext returns empty map when no commands - -## Intent - -- outcome: Executable scenario: groupByContext returns empty map when no commands - -```gwt -Given a fresh CommandRegistry instance -When the scenario runs -Then groupByContext returns a map with 0 keys -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-025-size-reflects-registered-command-count.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-025-size-reflects-registered-command-count.sdp.md deleted file mode 100644 index a45b8645..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-025-size-reflects-registered-command-count.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.size-reflects-registered-command-count -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# Size reflects registered command count - -## Intent - -- outcome: Executable scenario: Size reflects registered command count - -```gwt -Given a fresh CommandRegistry instance -When "CreateOrder" and "CancelOrder" are registered for size check -Then the registry size is 0 -And the registry size is 2 -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-026-clear-removes-all-registrations.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-026-clear-removes-all-registrations.sdp.md deleted file mode 100644 index 75234d63..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-026-clear-removes-all-registrations.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.clear-removes-all-registrations -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# Clear removes all registrations - -## Intent - -- outcome: Executable scenario: Clear removes all registrations - -```gwt -Given a fresh CommandRegistry instance -And "CreateOrder" and "CancelOrder" are registered for clearing -When the registry is cleared -Then the registry size is 0 -``` diff --git a/specs/behavior/platform-core/registry/command-registry.examples/s-027-global-registry-is-a-functional-registry-instance.sdp.md b/specs/behavior/platform-core/registry/command-registry.examples/s-027-global-registry-is-a-functional-registry-instance.sdp.md deleted file mode 100644 index 72ae1d35..00000000 --- a/specs/behavior/platform-core/registry/command-registry.examples/s-027-global-registry-is-a-functional-registry-instance.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.command-registry.global-registry-is-a-functional-registry-instance -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.command-registry ---- -# globalRegistry is a functional registry instance - -## Intent - -- outcome: Executable scenario: globalRegistry is a functional registry instance - -```gwt -Given the feature fixture is in place -When the scenario runs -Then globalRegistry is defined -And globalRegistry exposes a register function -``` diff --git a/specs/behavior/platform-core/registry/command-registry.sdp.md b/specs/behavior/platform-core/registry/command-registry.sdp.md index 49980874..e849300b 100644 --- a/specs/behavior/platform-core/registry/command-registry.sdp.md +++ b/specs/behavior/platform-core/registry/command-registry.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.registry.command-registry kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: a central registry for command definitions so that commands can be looked up, validated, and filtered at runtime +- outcome: Provide a central registry for command definitions so commands can be looked up, validated, and filtered at runtime. +- value: Duplicate registration is rejected and payloads validate against registered Zod schemas. ## Behavior diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-001-config-has-correct-command-type-bounded-context-and-projection-name.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-001-config-has-correct-command-type-bounded-context-and-projection-name.sdp.md deleted file mode 100644 index 778f0861..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-001-config-has-correct-command-type-bounded-context-and-projection-name.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.config-has-correct-command-type-bounded-context-and-projection-name -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# Config has correct commandType, boundedContext, and projection name - -## Intent - -- outcome: Executable scenario: Config has correct commandType, boundedContext, and projection name - -```gwt -Given the module is imported from platform-core -When an aggregate command "CreateOrder" is defined in context "orders" with projection "orderSummary" -Then the config commandType is "CreateOrder" -And the config boundedContext is "orders" -And the config projection name is "orderSummary" -``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-002-to-handler-args-merges-original-args-with-command-id-and-correlation-id.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-002-to-handler-args-merges-original-args-with-command-id-and-correlation-id.sdp.md deleted file mode 100644 index d7d23461..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-002-to-handler-args-merges-original-args-with-command-id-and-correlation-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.to-handler-args-merges-original-args-with-command-id-and-correlation-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# toHandlerArgs merges original args with commandId and correlationId - -## Intent - -- outcome: Executable scenario: toHandlerArgs merges original args with commandId and correlationId - -```gwt -Given the module is imported from platform-core -And an aggregate command "CreateOrder" is defined with an orderId field -When toHandlerArgs is called with orderId "ord_123", commandId "cmd_456", correlationId "corr_789" -Then the handler args equal orderId "ord_123", commandId "cmd_456", correlationId "corr_789" -``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-003-default-partition-key-uses-aggregate-id-field.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-003-default-partition-key-uses-aggregate-id-field.sdp.md deleted file mode 100644 index c1a45058..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-003-default-partition-key-uses-aggregate-id-field.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.default-partition-key-uses-aggregate-id-field -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# Default partition key uses aggregateIdField - -## Intent - -- outcome: Executable scenario: Default partition key uses aggregateIdField - -```gwt -Given the module is imported from platform-core -And an aggregate command "CreateOrder" is defined with aggregateIdField "orderId" -When getPartitionKey is called with orderId "ord_123" -Then the partition key is name "orderId" and value "ord_123" -``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-004-custom-partition-key-overrides-the-default.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-004-custom-partition-key-overrides-the-default.sdp.md deleted file mode 100644 index 59026e84..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-004-custom-partition-key-overrides-the-default.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.custom-partition-key-overrides-the-default -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# Custom partition key overrides the default - -## Intent - -- outcome: Executable scenario: Custom partition key overrides the default - -```gwt -Given the module is imported from platform-core -And an aggregate command "CreateOrder" is defined with a custom partition key on "customerId" -When getPartitionKey is called with orderId "ord_123" and customerId "cust_456" -Then the partition key is name "customerId" and value "cust_456" -``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-005-metadata-reflects-aggregate-category-and-custom-options.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-005-metadata-reflects-aggregate-category-and-custom-options.sdp.md deleted file mode 100644 index 9051d582..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-005-metadata-reflects-aggregate-category-and-custom-options.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.metadata-reflects-aggregate-category-and-custom-options -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# Metadata reflects aggregate category and custom options - -## Intent - -- outcome: Executable scenario: Metadata reflects aggregate category and custom options - -```gwt -Given the module is imported from platform-core -When an aggregate command "CreateOrder" is defined with description "Creates a new order", schemaVersion 2, and tags "orders,create" -Then the metadata category is "aggregate" -And the metadata targetAggregate type is "Order" with idField "orderId" -And the metadata description is "Creates a new order" -And the metadata schemaVersion is 2 -And the metadata tags are "orders,create" -``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-006-command-is-auto-registered-by-default.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-006-command-is-auto-registered-by-default.sdp.md deleted file mode 100644 index 88bde989..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-006-command-is-auto-registered-by-default.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.command-is-auto-registered-by-default -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# Command is auto-registered by default - -## Intent - -- outcome: Executable scenario: Command is auto-registered by default - -```gwt -Given the module is imported from platform-core -When an aggregate command "CreateOrder" is defined without autoRegister option -Then the global registry has "CreateOrder" -``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-007-command-is-not-registered-when-auto-register-is-false.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-007-command-is-not-registered-when-auto-register-is-false.sdp.md deleted file mode 100644 index 1457a659..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-007-command-is-not-registered-when-auto-register-is-false.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.command-is-not-registered-when-auto-register-is-false -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# Command is not registered when autoRegister is false - -## Intent - -- outcome: Executable scenario: Command is not registered when autoRegister is false - -```gwt -Given the module is imported from platform-core -When an aggregate command "CreateOrder" is defined with autoRegister false -Then the global registry does not have "CreateOrder" -``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-008-secondary-projections-are-included-in-config.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-008-secondary-projections-are-included-in-config.sdp.md deleted file mode 100644 index 8f85fe19..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-008-secondary-projections-are-included-in-config.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.secondary-projections-are-included-in-config -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# Secondary projections are included in config - -## Intent - -- outcome: Executable scenario: Secondary projections are included in config - -```gwt -Given the module is imported from platform-core -When an aggregate command "CreateOrder" is defined with a secondary projection "orderStats" -Then the config has 1 secondary projection -And the first secondary projection name is "orderStats" -``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-009-saga-route-is-included-in-config.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-009-saga-route-is-included-in-config.sdp.md deleted file mode 100644 index 6482e051..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-009-saga-route-is-included-in-config.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.saga-route-is-included-in-config -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# Saga route is included in config - -## Intent - -- outcome: Executable scenario: Saga route is included in config - -```gwt -Given the module is imported from platform-core -When an aggregate command "CreateOrder" is defined with a saga route returning "OrderCreated" -Then the config saga route is defined -And the saga route getEventType returns "OrderCreated" -``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-010-saga-route-on-complete-is-preserved.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-010-saga-route-on-complete-is-preserved.sdp.md deleted file mode 100644 index ea09c9f6..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-010-saga-route-on-complete-is-preserved.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.saga-route-on-complete-is-preserved -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# sagaRoute.onComplete is preserved - -## Intent - -- outcome: Executable scenario: sagaRoute.onComplete is preserved - -```gwt -Given the module is imported from platform-core -When an aggregate command "CreateOrder" is defined with a saga route that has an onComplete handler -Then the config saga route onComplete is the same reference as the provided handler -``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-011-failed-projection-is-included-in-config.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-011-failed-projection-is-included-in-config.sdp.md deleted file mode 100644 index 06902348..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-011-failed-projection-is-included-in-config.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.failed-projection-is-included-in-config -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# Failed projection is included in config - -## Intent - -- outcome: Executable scenario: Failed projection is included in config - -```gwt -Given the module is imported from platform-core -When an aggregate command "CreateOrder" is defined with a failed projection "orderFailures" -Then the config failed projection is defined -And the config failed projection name is "orderFailures" -``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-012-schema-version-defaults-to-1.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-012-schema-version-defaults-to-1.sdp.md deleted file mode 100644 index 57eb42a1..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-012-schema-version-defaults-to-1.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.schema-version-defaults-to-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# SchemaVersion defaults to 1 - -## Intent - -- outcome: Executable scenario: SchemaVersion defaults to 1 - -```gwt -Given the module is imported from platform-core -When an aggregate command "CreateOrder" is defined without specifying schemaVersion -Then the metadata schemaVersion is 1 -``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-013-process-command-has-correct-category-and-target.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-013-process-command-has-correct-category-and-target.sdp.md deleted file mode 100644 index f8f5c3fc..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-013-process-command-has-correct-category-and-target.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.process-command-has-correct-category-and-target -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# Process command has correct category and target - -## Intent - -- outcome: Executable scenario: Process command has correct category and target - -```gwt -Given the module is imported from platform-core -When a process command "StartOrderFulfillment" is defined for process "OrderFulfillment" -Then the process metadata category is "process" -And the process metadata targetProcess is "OrderFulfillment" -And the process metadata targetAggregate is undefined -``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-014-partition-key-uses-process-id-field.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-014-partition-key-uses-process-id-field.sdp.md deleted file mode 100644 index 3dbdacb1..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-014-partition-key-uses-process-id-field.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.partition-key-uses-process-id-field -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# Partition key uses processIdField - -## Intent - -- outcome: Executable scenario: Partition key uses processIdField - -```gwt -Given the module is imported from platform-core -And a process command "StartOrderFulfillment" is defined with processIdField "processId" -When the process getPartitionKey is called with processId "proc_123" -Then the process partition key is name "processId" and value "proc_123" -``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-015-process-command-auto-registers-with-category-and-target-info.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-015-process-command-auto-registers-with-category-and-target-info.sdp.md deleted file mode 100644 index d71a0631..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-015-process-command-auto-registers-with-category-and-target-info.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.process-command-auto-registers-with-category-and-target-info -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# Process command auto-registers with category and target info - -## Intent - -- outcome: Executable scenario: Process command auto-registers with category and target info - -```gwt -Given the module is imported from platform-core -When a process command "StartOrderFulfillment" is defined for process "OrderFulfillment" with auto-register -Then the global registry has "StartOrderFulfillment" -And the registry entry for "StartOrderFulfillment" has category "process" and targetProcess "OrderFulfillment" -``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-016-system-command-has-correct-category-subsystem-and-description.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-016-system-command-has-correct-category-subsystem-and-description.sdp.md deleted file mode 100644 index fc45ddda..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-016-system-command-has-correct-category-subsystem-and-description.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.system-command-has-correct-category-subsystem-and-description -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# System command has correct category, subsystem, and description - -## Intent - -- outcome: Executable scenario: System command has correct category, subsystem, and description - -```gwt -Given the module is imported from platform-core -When a system command "CleanupExpiredCommands" is defined with subsystem "cleanup" and description "Cleans up expired command records" -Then the system metadata category is "system" -And the system metadata subsystem is "cleanup" -And the system metadata description is "Cleans up expired command records" -``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-017-system-to-handler-args-merges-args-with-command-id-and-correlation-id.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-017-system-to-handler-args-merges-args-with-command-id-and-correlation-id.sdp.md deleted file mode 100644 index 35558b36..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-017-system-to-handler-args-merges-args-with-command-id-and-correlation-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.system-to-handler-args-merges-args-with-command-id-and-correlation-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# System toHandlerArgs merges args with commandId and correlationId - -## Intent - -- outcome: Executable scenario: System toHandlerArgs merges args with commandId and correlationId - -```gwt -Given the module is imported from platform-core -And a system command "CleanupExpiredCommands" is defined -When system toHandlerArgs is called with olderThanMs 86400000, commandId "cmd_123", correlationId "corr_456" -Then the system handler args equal olderThanMs 86400000, commandId "cmd_123", correlationId "corr_456" -``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-018-system-command-without-projection-has-no-projection-property.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-018-system-command-without-projection-has-no-projection-property.sdp.md deleted file mode 100644 index a0b3b4aa..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-018-system-command-without-projection-has-no-projection-property.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.system-command-without-projection-has-no-projection-property -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# System command without projection has no projection property - -## Intent - -- outcome: Executable scenario: System command without projection has no projection property - -```gwt -Given the module is imported from platform-core -When a system command "CleanupExpiredCommands" is defined without a projection -Then the system config commandType is "CleanupExpiredCommands" -And the system config does not have a projection property -``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-019-system-command-with-projection-includes-it-in-config.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-019-system-command-with-projection-includes-it-in-config.sdp.md deleted file mode 100644 index eef8e145..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-019-system-command-with-projection-includes-it-in-config.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.system-command-with-projection-includes-it-in-config -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# System command with projection includes it in config - -## Intent - -- outcome: Executable scenario: System command with projection includes it in config - -```gwt -Given the module is imported from platform-core -When a system command "CleanupExpiredCommands" is defined with projection "cleanupStats" -Then the system config projection name is "cleanupStats" -``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-020-system-partition-key-defaults-to-system-command-type.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-020-system-partition-key-defaults-to-system-command-type.sdp.md deleted file mode 100644 index 7244f961..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-020-system-partition-key-defaults-to-system-command-type.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.system-partition-key-defaults-to-system-command-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# System partition key defaults to system/commandType - -## Intent - -- outcome: Executable scenario: System partition key defaults to system/commandType - -```gwt -Given the module is imported from platform-core -And a system command "CleanupExpiredCommands" is defined with a projection -When the system getPartitionKey is called with olderThanMs 86400000 -Then the system partition key is name "system" and value "CleanupExpiredCommands" -``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-021-system-command-without-projection-is-not-registered-even-with-auto-registe.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-021-system-command-without-projection-is-not-registered-even-with-auto-registe.sdp.md deleted file mode 100644 index cde6ecbc..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-021-system-command-without-projection-is-not-registered-even-with-auto-registe.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.system-command-without-projection-is-not-registered-even-with-auto-register-true -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# System command without projection is not registered even with autoRegister true - -## Intent - -- outcome: Executable scenario: System command without projection is not registered even with autoRegister true - -```gwt -Given the module is imported from platform-core -When a system command "CleanupExpiredCommandsNoProj" is defined with autoRegister true but no projection and a system command "CleanupExpiredCommandsWithProj" is defined with autoRegister true and projection "cleanupStats" -Then the global registry does not have "CleanupExpiredCommandsNoProj" -And the global registry has "CleanupExpiredCommandsWithProj" -``` diff --git a/specs/behavior/platform-core/registry/define-command.examples/s-022-system-schema-version-defaults-to-1.sdp.md b/specs/behavior/platform-core/registry/define-command.examples/s-022-system-schema-version-defaults-to-1.sdp.md deleted file mode 100644 index 77c94b4a..00000000 --- a/specs/behavior/platform-core/registry/define-command.examples/s-022-system-schema-version-defaults-to-1.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.registry.define-command.system-schema-version-defaults-to-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.registry.define-command ---- -# System schemaVersion defaults to 1 - -## Intent - -- outcome: Executable scenario: System schemaVersion defaults to 1 - -```gwt -Given the module is imported from platform-core -When a system command "CleanupExpiredCommands" is defined without specifying schemaVersion -Then the system metadata schemaVersion is 1 -``` diff --git a/specs/behavior/platform-core/registry/define-command.sdp.md b/specs/behavior/platform-core/registry/define-command.sdp.md index 2496341a..24da995b 100644 --- a/specs/behavior/platform-core/registry/define-command.sdp.md +++ b/specs/behavior/platform-core/registry/define-command.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.registry.define-command kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: helper functions that reduce boilerplate for defining commands so that aggregate, process, and system commands can be defined concisely +- outcome: Reduce boilerplate for defining aggregate, process, and system commands so they can be authored concisely. +- value: Helpers produce CommandConfig with metadata, handler argument mapping, partition keys, and optional auto-registration. ## Behavior diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-001-load-and-upcast-cms-by-entity-id.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-001-load-and-upcast-cms-by-entity-id.sdp.md deleted file mode 100644 index c29e5b29..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-001-load-and-upcast-cms-by-entity-id.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.load-and-upcast-cms-by-entity-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# Load and upcast CMS by entity ID - -## Intent - -- outcome: Executable scenario: Load and upcast CMS by entity ID - -```gwt -Given a raw CMS document exists with testId "test_456" and docId "doc_123" -When I load the entity with ID "test_456" -Then the load result has all expected fields: -And the query was called with table "testCMS" and index "by_testId" -And the upcast function was called with the raw document -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-002-load-throws-not-found-error-for-missing-entity.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-002-load-throws-not-found-error-for-missing-entity.sdp.md deleted file mode 100644 index 21790495..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-002-load-throws-not-found-error-for-missing-entity.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.load-throws-not-found-error-for-missing-entity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# Load throws NotFoundError for missing entity - -## Intent - -- outcome: Executable scenario: Load throws NotFoundError for missing entity - -```gwt -Given no CMS document exists for the query -When I attempt to load the entity with ID "nonexistent" -Then a NotFoundError is thrown with message "testCMS not found: nonexistent" -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-003-load-returns-upcast-metadata.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-003-load-returns-upcast-metadata.sdp.md deleted file mode 100644 index 1dcbd0e1..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-003-load-returns-upcast-metadata.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.load-returns-upcast-metadata -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# Load returns upcast metadata - -## Intent - -- outcome: Executable scenario: Load returns upcast metadata - -```gwt -Given a raw CMS document exists with testId "test_456" and docId "doc_123" -And the upcast function returns wasUpcasted true and originalStateVersion 1 -When I load the entity with ID "test_456" -Then the load result wasUpcasted is true -And the load result originalStateVersion is 1 -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-004-load-propagates-upcast-errors.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-004-load-propagates-upcast-errors.sdp.md deleted file mode 100644 index a5d171e3..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-004-load-propagates-upcast-errors.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.load-propagates-upcast-errors -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# Load propagates upcast errors - -## Intent - -- outcome: Executable scenario: Load propagates upcast errors - -```gwt -Given a raw CMS document exists with testId "test_456" and docId "doc_123" -And the upcast function throws "Upcast failed: invalid state" -When I attempt to load the entity with ID "test_456" -Then an error is thrown with message "Upcast failed: invalid state" -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-005-try-load-returns-cms-when-entity-exists.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-005-try-load-returns-cms-when-entity-exists.sdp.md deleted file mode 100644 index 93168cc5..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-005-try-load-returns-cms-when-entity-exists.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.try-load-returns-cms-when-entity-exists -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# tryLoad returns CMS when entity exists - -## Intent - -- outcome: Executable scenario: tryLoad returns CMS when entity exists - -```gwt -Given a raw CMS document exists with testId "test_456" and docId "doc_123" -When I tryLoad the entity with ID "test_456" -Then the tryLoad result is not null -And the tryLoad result has docId "doc_123" and testId "test_456" -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-006-try-load-returns-null-when-entity-does-not-exist.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-006-try-load-returns-null-when-entity-does-not-exist.sdp.md deleted file mode 100644 index 90426962..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-006-try-load-returns-null-when-entity-does-not-exist.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.try-load-returns-null-when-entity-does-not-exist -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# tryLoad returns null when entity does not exist - -## Intent - -- outcome: Executable scenario: tryLoad returns null when entity does not exist - -```gwt -Given no CMS document exists for the query -When I tryLoad the entity with ID "nonexistent" -Then the tryLoad result is null -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-007-try-load-resolves-to-null-without-throwing.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-007-try-load-resolves-to-null-without-throwing.sdp.md deleted file mode 100644 index f1f6889a..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-007-try-load-resolves-to-null-without-throwing.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.try-load-resolves-to-null-without-throwing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# tryLoad resolves to null without throwing - -## Intent - -- outcome: Executable scenario: tryLoad resolves to null without throwing - -```gwt -Given no CMS document exists for the query -When I tryLoad the entity with ID "nonexistent" -Then the tryLoad promise resolves to null -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-008-try-load-propagates-upcast-errors.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-008-try-load-propagates-upcast-errors.sdp.md deleted file mode 100644 index 2f605396..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-008-try-load-propagates-upcast-errors.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.try-load-propagates-upcast-errors -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# tryLoad propagates upcast errors - -## Intent - -- outcome: Executable scenario: tryLoad propagates upcast errors - -```gwt -Given a raw CMS document exists with testId "test_456" and docId "doc_123" -And the upcast function throws "Invalid CMS state during upcast" -When I attempt to tryLoad the entity with ID "test_456" -Then an error is thrown with message "Invalid CMS state during upcast" -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-009-exists-returns-true-when-entity-exists.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-009-exists-returns-true-when-entity-exists.sdp.md deleted file mode 100644 index 34fb6dc4..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-009-exists-returns-true-when-entity-exists.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.exists-returns-true-when-entity-exists -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# exists returns true when entity exists - -## Intent - -- outcome: Executable scenario: exists returns true when entity exists - -```gwt -Given a raw CMS document exists with testId "test_456" and docId "doc_123" -When I check if entity "test_456" exists -Then the exists result is true -And the query was called with table "testCMS" and index "by_testId" -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-010-exists-returns-false-when-entity-does-not-exist.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-010-exists-returns-false-when-entity-does-not-exist.sdp.md deleted file mode 100644 index d72d9d1b..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-010-exists-returns-false-when-entity-does-not-exist.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.exists-returns-false-when-entity-does-not-exist -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# exists returns false when entity does not exist - -## Intent - -- outcome: Executable scenario: exists returns false when entity does not exist - -```gwt -Given no CMS document exists for the query -When I check if entity "nonexistent" exists -Then the exists result is false -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-011-exists-does-not-call-upcast-function.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-011-exists-does-not-call-upcast-function.sdp.md deleted file mode 100644 index 11ce0378..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-011-exists-does-not-call-upcast-function.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.exists-does-not-call-upcast-function -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# exists does not call upcast function - -## Intent - -- outcome: Executable scenario: exists does not call upcast function - -```gwt -Given a raw CMS document exists with testId "test_456" and docId "doc_123" -When I check if entity "test_456" exists -Then the upcast function was not called -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-012-load-many-loads-multiple-entities-in-parallel.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-012-load-many-loads-multiple-entities-in-parallel.sdp.md deleted file mode 100644 index 1018f92a..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-012-load-many-loads-multiple-entities-in-parallel.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.load-many-loads-multiple-entities-in-parallel -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# loadMany loads multiple entities in parallel - -## Intent - -- outcome: Executable scenario: loadMany loads multiple entities in parallel - -```gwt -Given raw CMS documents exist for IDs: -When I loadMany with IDs "test_1,test_2" -Then the loadMany result has length 2 -And the loadMany results match: -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-013-load-many-returns-null-for-missing-entities.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-013-load-many-returns-null-for-missing-entities.sdp.md deleted file mode 100644 index 0437fd81..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-013-load-many-returns-null-for-missing-entities.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.load-many-returns-null-for-missing-entities -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# loadMany returns null for missing entities - -## Intent - -- outcome: Executable scenario: loadMany returns null for missing entities - -```gwt -Given raw CMS documents exist with gaps: -When I loadMany with IDs "test_1,missing,test_3" -Then the loadMany result has length 3 -And the loadMany result at index 0 is not null -And the loadMany result at index 1 is null -And the loadMany result at index 2 is not null -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-014-load-many-returns-empty-array-for-empty-input.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-014-load-many-returns-empty-array-for-empty-input.sdp.md deleted file mode 100644 index a04c101f..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-014-load-many-returns-empty-array-for-empty-input.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.load-many-returns-empty-array-for-empty-input -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# loadMany returns empty array for empty input - -## Intent - -- outcome: Executable scenario: loadMany returns empty array for empty input - -```gwt -Given the feature fixture is in place -When I loadMany with an empty ID list -Then the loadMany result is an empty array -And the query was not called -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-015-load-many-upcasts-all-loaded-entities.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-015-load-many-upcasts-all-loaded-entities.sdp.md deleted file mode 100644 index 07acf565..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-015-load-many-upcasts-all-loaded-entities.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.load-many-upcasts-all-loaded-entities -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# loadMany upcasts all loaded entities - -## Intent - -- outcome: Executable scenario: loadMany upcasts all loaded entities - -```gwt -Given raw CMS documents exist for IDs: -When I loadMany with IDs "test_1,test_2" -Then the upcast function was called 2 times -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-016-load-many-preserves-order-of-input-i-ds.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-016-load-many-preserves-order-of-input-i-ds.sdp.md deleted file mode 100644 index 44d9f284..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-016-load-many-preserves-order-of-input-i-ds.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.load-many-preserves-order-of-input-i-ds -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# loadMany preserves order of input IDs - -## Intent - -- outcome: Executable scenario: loadMany preserves order of input IDs - -```gwt -Given raw CMS documents exist for IDs: -When I loadMany with IDs "a,b,c" -Then the loadMany results are in order: -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-017-load-many-propagates-upcast-errors-for-any-entity.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-017-load-many-propagates-upcast-errors-for-any-entity.sdp.md deleted file mode 100644 index 3b01bec6..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-017-load-many-propagates-upcast-errors-for-any-entity.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.load-many-propagates-upcast-errors-for-any-entity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# loadMany propagates upcast errors for any entity - -## Intent - -- outcome: Executable scenario: loadMany propagates upcast errors for any entity - -```gwt -Given raw CMS documents exist for IDs: -And the upcast function succeeds then throws "Upcast failed for second entity" -When I attempt to loadMany with IDs "test_1,test_2" -Then an error is thrown with message "Upcast failed for second entity" -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-018-insert-creates-cms-record-and-returns-document-id.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-018-insert-creates-cms-record-and-returns-document-id.sdp.md deleted file mode 100644 index 18c975e0..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-018-insert-creates-cms-record-and-returns-document-id.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.insert-creates-cms-record-and-returns-document-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# insert creates CMS record and returns document ID - -## Intent - -- outcome: Executable scenario: insert creates CMS record and returns document ID - -```gwt -Given a new CMS record with testId "test_789" and name "New Entity" -When I insert the CMS record -Then the insert returns document ID "doc_789" -And the insert was called with table "testCMS" -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-019-update-patches-cms-when-version-matches.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-019-update-patches-cms-when-version-matches.sdp.md deleted file mode 100644 index 5b683598..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-019-update-patches-cms-when-version-matches.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.update-patches-cms-when-version-matches -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# update patches CMS when version matches - -## Intent - -- outcome: Executable scenario: update patches CMS when version matches - -```gwt -Given a stored document "doc_123" with version 5 -When I update document "doc_123" with name "Updated" at version 5 -Then the patch was called with the update fields -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-020-update-throws-not-found-error-for-missing-document.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-020-update-throws-not-found-error-for-missing-document.sdp.md deleted file mode 100644 index 19539df4..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-020-update-throws-not-found-error-for-missing-document.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.update-throws-not-found-error-for-missing-document -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# update throws NotFoundError for missing document - -## Intent - -- outcome: Executable scenario: update throws NotFoundError for missing document - -```gwt -Given no stored document exists for ID "nonexistent" -When I attempt to update document "nonexistent" at version 1 -Then a NotFoundError is thrown -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-021-update-throws-version-conflict-error-on-version-mismatch.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-021-update-throws-version-conflict-error-on-version-mismatch.sdp.md deleted file mode 100644 index 1cb9a78b..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-021-update-throws-version-conflict-error-on-version-mismatch.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.update-throws-version-conflict-error-on-version-mismatch -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# update throws VersionConflictError on version mismatch - -## Intent - -- outcome: Executable scenario: update throws VersionConflictError on version mismatch - -```gwt -Given a stored document "doc_123" with version 10 -When I attempt to update document "doc_123" at version 5 -Then a VersionConflictError is thrown with message "expected 5, got 10" -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-022-not-found-error-has-correct-properties.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-022-not-found-error-has-correct-properties.sdp.md deleted file mode 100644 index 5ebcdc54..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-022-not-found-error-has-correct-properties.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.not-found-error-has-correct-properties -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# NotFoundError has correct properties - -## Intent - -- outcome: Executable scenario: NotFoundError has correct properties - -```gwt -Given the feature fixture is in place -When I create a NotFoundError with table "orderCMS" and id "order_123" -Then the NotFoundError has all expected properties: -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-023-not-found-error-is-instanceof-error.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-023-not-found-error-is-instanceof-error.sdp.md deleted file mode 100644 index f07b34fb..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-023-not-found-error-is-instanceof-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.not-found-error-is-instanceof-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# NotFoundError is instanceof Error - -## Intent - -- outcome: Executable scenario: NotFoundError is instanceof Error - -```gwt -Given the feature fixture is in place -When I create a NotFoundError with table "testCMS" and id "test_1" -Then the NotFoundError is an instance of Error -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-024-is-not-found-error-type-guard-returns-true-for-not-found-error.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-024-is-not-found-error-type-guard-returns-true-for-not-found-error.sdp.md deleted file mode 100644 index 7f2d527c..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-024-is-not-found-error-type-guard-returns-true-for-not-found-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.is-not-found-error-type-guard-returns-true-for-not-found-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# isNotFoundError type guard returns true for NotFoundError - -## Intent - -- outcome: Executable scenario: isNotFoundError type guard returns true for NotFoundError - -```gwt -Given the feature fixture is in place -When I create a NotFoundError with table "testCMS" and id "test_1" -Then isNotFoundError returns true -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-025-is-not-found-error-type-guard-returns-false-for-non-not-found-error-values.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-025-is-not-found-error-type-guard-returns-false-for-non-not-found-error-values.sdp.md deleted file mode 100644 index 297ae40f..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-025-is-not-found-error-type-guard-returns-false-for-non-not-found-error-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.is-not-found-error-type-guard-returns-false-for-non-not-found-error-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# isNotFoundError type guard returns false for non-NotFoundError values - -## Intent - -- outcome: Executable scenario: isNotFoundError type guard returns false for non-NotFoundError values - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isNotFoundError returns false for: -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-026-version-conflict-error-has-correct-properties.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-026-version-conflict-error-has-correct-properties.sdp.md deleted file mode 100644 index 8b8601c6..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-026-version-conflict-error-has-correct-properties.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.version-conflict-error-has-correct-properties -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# VersionConflictError has correct properties - -## Intent - -- outcome: Executable scenario: VersionConflictError has correct properties - -```gwt -Given the feature fixture is in place -When I create a VersionConflictError with table "orderCMS" id "order_123" expected 5 actual 10 -Then the VersionConflictError has all expected properties: -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-027-version-conflict-error-is-instanceof-error.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-027-version-conflict-error-is-instanceof-error.sdp.md deleted file mode 100644 index a25dcc63..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-027-version-conflict-error-is-instanceof-error.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.version-conflict-error-is-instanceof-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# VersionConflictError is instanceof Error - -## Intent - -- outcome: Executable scenario: VersionConflictError is instanceof Error - -```gwt -Given the feature fixture is in place -When I create a VersionConflictError with table "testCMS" id "test_1" expected 1 actual 2 -Then the VersionConflictError is an instance of Error -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-028-is-version-conflict-error-type-guard-returns-true-for-version-conflict-err.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-028-is-version-conflict-error-type-guard-returns-true-for-version-conflict-err.sdp.md deleted file mode 100644 index 48227edb..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-028-is-version-conflict-error-type-guard-returns-true-for-version-conflict-err.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.is-version-conflict-error-type-guard-returns-true-for-version-conflict-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# isVersionConflictError type guard returns true for VersionConflictError - -## Intent - -- outcome: Executable scenario: isVersionConflictError type guard returns true for VersionConflictError - -```gwt -Given the feature fixture is in place -When I create a VersionConflictError with table "testCMS" id "test_1" expected 1 actual 2 -Then isVersionConflictError returns true -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.examples/s-029-is-version-conflict-error-type-guard-returns-false-for-other-errors.sdp.md b/specs/behavior/platform-core/repository/cms-repository.examples/s-029-is-version-conflict-error-type-guard-returns-false-for-other-errors.sdp.md deleted file mode 100644 index f9803237..00000000 --- a/specs/behavior/platform-core/repository/cms-repository.examples/s-029-is-version-conflict-error-type-guard-returns-false-for-other-errors.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.repository.cms-repository.is-version-conflict-error-type-guard-returns-false-for-other-errors -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.repository.cms-repository ---- -# isVersionConflictError type guard returns false for other errors - -## Intent - -- outcome: Executable scenario: isVersionConflictError type guard returns false for other errors - -```gwt -Given the feature fixture is in place -When the scenario runs -Then isVersionConflictError returns false for: -``` diff --git a/specs/behavior/platform-core/repository/cms-repository.sdp.md b/specs/behavior/platform-core/repository/cms-repository.sdp.md index 68763a06..ceb25cc0 100644 --- a/specs/behavior/platform-core/repository/cms-repository.sdp.md +++ b/specs/behavior/platform-core/repository/cms-repository.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.repository.cms-repository kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: CMS Repository +- outcome: Load, insert, and update CMS entities through a typed repository so upcast and optimistic concurrency stay at the persistence boundary. +- value: Missing entities and version mismatches surface as NotFoundError and VersionConflictError. ## Behavior diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-001-confirm-reservation-with-entity-id.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-001-confirm-reservation-with-entity-id.sdp.md deleted file mode 100644 index 013bd8bb..00000000 --- a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-001-confirm-reservation-with-entity-id.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.confirm-operation.confirm-reservation-with-entity-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.confirm-operation ---- -# Confirm reservation with entity ID - -## Intent - -- outcome: Executable scenario: Confirm reservation with entity ID - -```gwt -Given the reservation module is imported from platform-core -And an active reservation exists for "alice@example.com" -And an active reservation with id "res_123" for "alice@example.com" -When I call confirm({ reservationId: 'res_123', entityId: 'user_456' }) -Then confirmation succeeds -And reservation.status equals "confirmed" -And reservation.entityId equals "user_456" -And reservation.confirmedAt is set -``` diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-002-confirmed-reservation-is-permanent.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-002-confirmed-reservation-is-permanent.sdp.md deleted file mode 100644 index c0259d0b..00000000 --- a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-002-confirmed-reservation-is-permanent.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.confirm-operation.confirmed-reservation-is-permanent -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.confirm-operation ---- -# Confirmed reservation is permanent - -## Intent - -- outcome: Executable scenario: Confirmed reservation is permanent - -```gwt -Given the reservation module is imported from platform-core -And an active reservation exists for "alice@example.com" -And a confirmed reservation for "alice@example.com" -When I query the reservation -Then expiresAt is null (no expiration) -And status equals "confirmed" -``` diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-003-cannot-confirm-expired-reservation.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-003-cannot-confirm-expired-reservation.sdp.md deleted file mode 100644 index 5008a8d8..00000000 --- a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-003-cannot-confirm-expired-reservation.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.confirm-operation.cannot-confirm-expired-reservation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.confirm-operation ---- -# Cannot confirm expired reservation - -## Intent - -- outcome: Executable scenario: Cannot confirm expired reservation - -```gwt -Given the reservation module is imported from platform-core -And an active reservation exists for "alice@example.com" -And an expired reservation with id "res_expired" -When I call confirm({ reservationId: 'res_expired', entityId: 'user_789' }) -Then an error is thrown with code "RESERVATION_ALREADY_EXPIRED" -``` diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-004-cannot-confirm-already-confirmed-reservation.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-004-cannot-confirm-already-confirmed-reservation.sdp.md deleted file mode 100644 index ba103cf8..00000000 --- a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-004-cannot-confirm-already-confirmed-reservation.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.confirm-operation.cannot-confirm-already-confirmed-reservation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.confirm-operation ---- -# Cannot confirm already confirmed reservation - -## Intent - -- outcome: Executable scenario: Cannot confirm already confirmed reservation - -```gwt -Given the reservation module is imported from platform-core -And an active reservation exists for "alice@example.com" -And a confirmed reservation with id "res_confirmed" -When I call confirm({ reservationId: 'res_confirmed', entityId: 'user_999' }) -Then an error is thrown with code "RESERVATION_ALREADY_CONFIRMED" -``` diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-005-cannot-confirm-non-existent-reservation.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-005-cannot-confirm-non-existent-reservation.sdp.md deleted file mode 100644 index c90c118f..00000000 --- a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-005-cannot-confirm-non-existent-reservation.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.confirm-operation.cannot-confirm-non-existent-reservation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.confirm-operation ---- -# Cannot confirm non-existent reservation - -## Intent - -- outcome: Executable scenario: Cannot confirm non-existent reservation - -```gwt -Given the reservation module is imported from platform-core -And an active reservation exists for "alice@example.com" -When I call confirm({ reservationId: 'res_nonexistent', entityId: 'user_000' }) -Then an error is thrown with code "RESERVATION_NOT_FOUND" -``` diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-006-cannot-confirm-released-reservation.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-006-cannot-confirm-released-reservation.sdp.md deleted file mode 100644 index 4e4ddfb6..00000000 --- a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-006-cannot-confirm-released-reservation.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.confirm-operation.cannot-confirm-released-reservation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.confirm-operation ---- -# Cannot confirm released reservation - -## Intent - -- outcome: Executable scenario: Cannot confirm released reservation - -```gwt -Given the reservation module is imported from platform-core -And an active reservation exists for "alice@example.com" -And a released reservation with id "res_released" -When I call confirm({ reservationId: 'res_released', entityId: 'user_123' }) -Then an error is thrown with code "RESERVATION_ALREADY_RELEASED" -``` diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-007-entity-id-is-required.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-007-entity-id-is-required.sdp.md deleted file mode 100644 index f2729f78..00000000 --- a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-007-entity-id-is-required.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.confirm-operation.entity-id-is-required -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.confirm-operation ---- -# Entity ID is required - -## Intent - -- outcome: Executable scenario: Entity ID is required - -```gwt -Given the reservation module is imported from platform-core -And an active reservation exists for "alice@example.com" -And an active reservation with id "res_123" -When I call confirm({ reservationId: 'res_123' }) without entityId -Then an error is thrown with code "ENTITY_ID_REQUIRED" -``` diff --git a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-008-entity-id-can-be-any-string-identifier.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.examples/s-008-entity-id-can-be-any-string-identifier.sdp.md deleted file mode 100644 index fe5b058c..00000000 --- a/specs/behavior/platform-core/reservation/confirm-operation.examples/s-008-entity-id-can-be-any-string-identifier.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.confirm-operation.entity-id-can-be-any-string-identifier -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.confirm-operation ---- -# Entity ID can be any string identifier - -## Intent - -- outcome: Executable scenario: Entity ID can be any string identifier - -```gwt -Given the reservation module is imported from platform-core -And an active reservation exists for "alice@example.com" -And an active reservation with id "res_123" -When I call confirm({ reservationId: 'res_123', entityId: 'custom_id_format' }) -Then confirmation succeeds -And reservation.entityId equals "custom_id_format" -``` diff --git a/specs/behavior/platform-core/reservation/confirm-operation.sdp.md b/specs/behavior/platform-core/reservation/confirm-operation.sdp.md index 53e6817e..36060fd4 100644 --- a/specs/behavior/platform-core/reservation/confirm-operation.sdp.md +++ b/specs/behavior/platform-core/reservation/confirm-operation.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.reservation.confirm-operation kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: to confirm reservations when entities are created so that the reserved value becomes permanently associated +- outcome: Confirm reservations when entities are created so the reserved value becomes permanently associated. +- value: Only active reservations can be confirmed, and confirmation requires an entity ID. ## Behavior diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-001-release-active-reservation.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-001-release-active-reservation.sdp.md deleted file mode 100644 index 4c2de5f8..00000000 --- a/specs/behavior/platform-core/reservation/release-operation.examples/s-001-release-active-reservation.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.release-operation.release-active-reservation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.release-operation ---- -# Release active reservation - -## Intent - -- outcome: Executable scenario: Release active reservation - -```gwt -Given the reservation module is imported from platform-core -And an active reservation exists -And an active reservation with id "res_123" for "cancel@example.com" -When I call release({ reservationId: 'res_123' }) -Then release succeeds -And reservation.status equals "released" -And "cancel@example.com" is available for new reservations -``` diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-002-released-value-can-be-immediately-reserved.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-002-released-value-can-be-immediately-reserved.sdp.md deleted file mode 100644 index 124a9998..00000000 --- a/specs/behavior/platform-core/reservation/release-operation.examples/s-002-released-value-can-be-immediately-reserved.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.release-operation.released-value-can-be-immediately-reserved -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.release-operation ---- -# Released value can be immediately reserved - -## Intent - -- outcome: Executable scenario: Released value can be immediately reserved - -```gwt -Given the reservation module is imported from platform-core -And an active reservation exists -And I released reservation for "reuse@example.com" -When I call reserve({ type: 'email', value: 'reuse@example.com', ttl: 300000 }) -Then a new reservation is created successfully -``` diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-003-cannot-release-confirmed-reservation.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-003-cannot-release-confirmed-reservation.sdp.md deleted file mode 100644 index a2b71461..00000000 --- a/specs/behavior/platform-core/reservation/release-operation.examples/s-003-cannot-release-confirmed-reservation.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.release-operation.cannot-release-confirmed-reservation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.release-operation ---- -# Cannot release confirmed reservation - -## Intent - -- outcome: Executable scenario: Cannot release confirmed reservation - -```gwt -Given the reservation module is imported from platform-core -And an active reservation exists -And a confirmed reservation with id "res_confirmed" -When I call release({ reservationId: 'res_confirmed' }) -Then an error is thrown with code "RESERVATION_ALREADY_CONFIRMED" -``` diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-004-cannot-release-already-released-reservation.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-004-cannot-release-already-released-reservation.sdp.md deleted file mode 100644 index 65c0e0d5..00000000 --- a/specs/behavior/platform-core/reservation/release-operation.examples/s-004-cannot-release-already-released-reservation.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.release-operation.cannot-release-already-released-reservation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.release-operation ---- -# Cannot release already released reservation - -## Intent - -- outcome: Executable scenario: Cannot release already released reservation - -```gwt -Given the reservation module is imported from platform-core -And an active reservation exists -And a released reservation with id "res_released" -When I call release({ reservationId: 'res_released' }) -Then an error is thrown with code "RESERVATION_ALREADY_RELEASED" -``` diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-005-cannot-release-expired-reservation.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-005-cannot-release-expired-reservation.sdp.md deleted file mode 100644 index 1d6a3260..00000000 --- a/specs/behavior/platform-core/reservation/release-operation.examples/s-005-cannot-release-expired-reservation.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.release-operation.cannot-release-expired-reservation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.release-operation ---- -# Cannot release expired reservation - -## Intent - -- outcome: Executable scenario: Cannot release expired reservation - -```gwt -Given the reservation module is imported from platform-core -And an active reservation exists -And an expired reservation with id "res_expired" -When I call release({ reservationId: 'res_expired' }) -Then an error is thrown with code "RESERVATION_ALREADY_EXPIRED" -``` diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-006-cannot-release-non-existent-reservation.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-006-cannot-release-non-existent-reservation.sdp.md deleted file mode 100644 index 53b257f0..00000000 --- a/specs/behavior/platform-core/reservation/release-operation.examples/s-006-cannot-release-non-existent-reservation.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.release-operation.cannot-release-non-existent-reservation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.release-operation ---- -# Cannot release non-existent reservation - -## Intent - -- outcome: Executable scenario: Cannot release non-existent reservation - -```gwt -Given the reservation module is imported from platform-core -And an active reservation exists -When I call release({ reservationId: 'res_nonexistent' }) -Then an error is thrown with code "RESERVATION_NOT_FOUND" -``` diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-007-expired-reservations-are-marked-by-cron.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-007-expired-reservations-are-marked-by-cron.sdp.md deleted file mode 100644 index 79a87973..00000000 --- a/specs/behavior/platform-core/reservation/release-operation.examples/s-007-expired-reservations-are-marked-by-cron.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.release-operation.expired-reservations-are-marked-by-cron -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.release-operation ---- -# Expired reservations are marked by cron - -## Intent - -- outcome: Executable scenario: Expired reservations are marked by cron - -```gwt -Given the reservation module is imported from platform-core -And an active reservation exists -And a reservation with TTL that expired 1 minute ago -When the TTL expiration cron runs -Then reservation.status equals "expired" -And the value is available for new reservations -``` diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-008-cron-does-not-affect-active-reservations.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-008-cron-does-not-affect-active-reservations.sdp.md deleted file mode 100644 index 1ee70a10..00000000 --- a/specs/behavior/platform-core/reservation/release-operation.examples/s-008-cron-does-not-affect-active-reservations.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.release-operation.cron-does-not-affect-active-reservations -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.release-operation ---- -# Cron does not affect active reservations - -## Intent - -- outcome: Executable scenario: Cron does not affect active reservations - -```gwt -Given the reservation module is imported from platform-core -And an active reservation exists -And a reservation with 10 minutes remaining TTL -When the TTL expiration cron runs -Then reservation.status remains "reserved" -``` diff --git a/specs/behavior/platform-core/reservation/release-operation.examples/s-009-cron-does-not-affect-confirmed-reservations.sdp.md b/specs/behavior/platform-core/reservation/release-operation.examples/s-009-cron-does-not-affect-confirmed-reservations.sdp.md deleted file mode 100644 index 22d36485..00000000 --- a/specs/behavior/platform-core/reservation/release-operation.examples/s-009-cron-does-not-affect-confirmed-reservations.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.release-operation.cron-does-not-affect-confirmed-reservations -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.release-operation ---- -# Cron does not affect confirmed reservations - -## Intent - -- outcome: Executable scenario: Cron does not affect confirmed reservations - -```gwt -Given the reservation module is imported from platform-core -And an active reservation exists -And a confirmed reservation -When the TTL expiration cron runs -Then reservation.status remains "confirmed" -``` diff --git a/specs/behavior/platform-core/reservation/release-operation.sdp.md b/specs/behavior/platform-core/reservation/release-operation.sdp.md index 52f09fe6..02e6d845 100644 --- a/specs/behavior/platform-core/reservation/release-operation.sdp.md +++ b/specs/behavior/platform-core/reservation/release-operation.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.reservation.release-operation kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: to release reservations before they expire so that values become immediately available when users cancel +- outcome: Release reservations before they expire so values become immediately available when users cancel. +- value: Only active reservations can be released, and TTL expiration cron marks expired reservations. ## Behavior diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-001-email-reservation-key-format.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-001-email-reservation-key-format.sdp.md deleted file mode 100644 index 2113cd18..00000000 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-001-email-reservation-key-format.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reservation-key.email-reservation-key-format -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reservation-key ---- -# Email reservation key format - -## Intent - -- outcome: Executable scenario: Email reservation key format - -```gwt -Given the reservation module is imported from platform-core -When I call reserve({ type: 'email', value: 'alice@example.com', ttl: 300000 }) -Then reservation.key equals "email:alice@example.com" -``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-002-username-reservation-key-format.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-002-username-reservation-key-format.sdp.md deleted file mode 100644 index 352efcc8..00000000 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-002-username-reservation-key-format.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reservation-key.username-reservation-key-format -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reservation-key ---- -# Username reservation key format - -## Intent - -- outcome: Executable scenario: Username reservation key format - -```gwt -Given the reservation module is imported from platform-core -When I call reserve({ type: 'username', value: 'alice123', ttl: 300000 }) -Then reservation.key equals "username:alice123" -``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-003-custom-type-reservation-key-format.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-003-custom-type-reservation-key-format.sdp.md deleted file mode 100644 index 28abdbb8..00000000 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-003-custom-type-reservation-key-format.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reservation-key.custom-type-reservation-key-format -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reservation-key ---- -# Custom type reservation key format - -## Intent - -- outcome: Executable scenario: Custom type reservation key format - -```gwt -Given the reservation module is imported from platform-core -When I call reserve({ type: 'phone', value: '+1-555-0123', ttl: 300000 }) -Then reservation.key equals "phone:+1-555-0123" -``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-004-same-value-different-types.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-004-same-value-different-types.sdp.md deleted file mode 100644 index 995f17e1..00000000 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-004-same-value-different-types.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reservation-key.same-value-different-types -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reservation-key ---- -# Same value different types - -## Intent - -- outcome: Executable scenario: Same value different types - -```gwt -Given the reservation module is imported from platform-core -And a reservation for email "alice" -When I call reserve({ type: 'username', value: 'alice', ttl: 300000 }) -Then reservation succeeds -And two reservations exist with different keys: -``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-005-independent-type-uniqueness.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-005-independent-type-uniqueness.sdp.md deleted file mode 100644 index ef8c582f..00000000 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-005-independent-type-uniqueness.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reservation-key.independent-type-uniqueness -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reservation-key ---- -# Independent type uniqueness - -## Intent - -- outcome: Executable scenario: Independent type uniqueness - -```gwt -Given the reservation module is imported from platform-core -And a confirmed reservation for email "taken@example.com" -When I call reserve({ type: 'recovery_email', value: 'taken@example.com', ttl: 300000 }) -Then reservation succeeds -And key is "recovery_email:taken@example.com" -``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-006-type-is-required.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-006-type-is-required.sdp.md deleted file mode 100644 index 940359e5..00000000 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-006-type-is-required.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reservation-key.type-is-required -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reservation-key ---- -# Type is required - -## Intent - -- outcome: Executable scenario: Type is required - -```gwt -Given the reservation module is imported from platform-core -When I call reserve({ value: 'test@example.com', ttl: 300000 }) without type -Then an error is thrown with code "TYPE_REQUIRED" -``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-007-value-is-required.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-007-value-is-required.sdp.md deleted file mode 100644 index 8bdbe899..00000000 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-007-value-is-required.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reservation-key.value-is-required -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reservation-key ---- -# Value is required - -## Intent - -- outcome: Executable scenario: Value is required - -```gwt -Given the reservation module is imported from platform-core -When I call reserve({ type: 'email', ttl: 300000 }) without value -Then an error is thrown with code "VALUE_REQUIRED" -``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-008-empty-type-is-invalid.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-008-empty-type-is-invalid.sdp.md deleted file mode 100644 index 2e3e49f9..00000000 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-008-empty-type-is-invalid.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reservation-key.empty-type-is-invalid -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reservation-key ---- -# Empty type is invalid - -## Intent - -- outcome: Executable scenario: Empty type is invalid - -```gwt -Given the reservation module is imported from platform-core -When I call reserve({ type: '', value: 'test@example.com', ttl: 300000 }) -Then an error is thrown with code "INVALID_TYPE" -``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-009-empty-value-is-invalid.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-009-empty-value-is-invalid.sdp.md deleted file mode 100644 index 26baa6e4..00000000 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-009-empty-value-is-invalid.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reservation-key.empty-value-is-invalid -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reservation-key ---- -# Empty value is invalid - -## Intent - -- outcome: Executable scenario: Empty value is invalid - -```gwt -Given the reservation module is imported from platform-core -When I call reserve({ type: 'email', value: '', ttl: 300000 }) -Then an error is thrown with code "INVALID_VALUE" -``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-010-find-reservation-by-key.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-010-find-reservation-by-key.sdp.md deleted file mode 100644 index 5fa880fe..00000000 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-010-find-reservation-by-key.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reservation-key.find-reservation-by-key -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reservation-key ---- -# Find reservation by key - -## Intent - -- outcome: Executable scenario: Find reservation by key - -```gwt -Given the reservation module is imported from platform-core -And an active reservation for email "lookup@example.com" -When I call findReservation({ key: 'email:lookup@example.com' }) -Then I receive the reservation object -``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-011-find-reservation-by-type-and-value.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-011-find-reservation-by-type-and-value.sdp.md deleted file mode 100644 index a3f0007c..00000000 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-011-find-reservation-by-type-and-value.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reservation-key.find-reservation-by-type-and-value -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reservation-key ---- -# Find reservation by type and value - -## Intent - -- outcome: Executable scenario: Find reservation by type and value - -```gwt -Given the reservation module is imported from platform-core -And an active reservation for email "lookup@example.com" -When I call findReservation({ type: 'email', value: 'lookup@example.com' }) -Then I receive the reservation object -``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-012-non-existent-key-returns-null.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-012-non-existent-key-returns-null.sdp.md deleted file mode 100644 index d76dba74..00000000 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-012-non-existent-key-returns-null.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reservation-key.non-existent-key-returns-null -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reservation-key ---- -# Non-existent key returns null - -## Intent - -- outcome: Executable scenario: Non-existent key returns null - -```gwt -Given the reservation module is imported from platform-core -When I call findReservation({ key: 'email:nonexistent@example.com' }) -Then I receive null -``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-013-type-containing-colon-is-rejected.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-013-type-containing-colon-is-rejected.sdp.md deleted file mode 100644 index 319e2931..00000000 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-013-type-containing-colon-is-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reservation-key.type-containing-colon-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reservation-key ---- -# Type containing colon is rejected - -## Intent - -- outcome: Executable scenario: Type containing colon is rejected - -```gwt -Given the reservation module is imported from platform-core -When I call reserve({ type: 'email:backup', value: 'test@example.com', ttl: 300000 }) -Then an error is thrown with code "INVALID_TYPE" -``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.examples/s-014-value-can-contain-colon-url-with-port.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.examples/s-014-value-can-contain-colon-url-with-port.sdp.md deleted file mode 100644 index 858b4317..00000000 --- a/specs/behavior/platform-core/reservation/reservation-key.examples/s-014-value-can-contain-colon-url-with-port.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reservation-key.value-can-contain-colon-url-with-port -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reservation-key ---- -# Value can contain colon (URL with port) - -## Intent - -- outcome: Executable scenario: Value can contain colon (URL with port) - -```gwt -Given the reservation module is imported from platform-core -When I call reserve({ type: 'url', value: 'https://example.com:8080', ttl: 300000 }) -Then I receive a reservation object -And reservation.key equals "url:https://example.com:8080" -``` diff --git a/specs/behavior/platform-core/reservation/reservation-key.sdp.md b/specs/behavior/platform-core/reservation/reservation-key.sdp.md index b9e5f552..e1271e49 100644 --- a/specs/behavior/platform-core/reservation/reservation-key.sdp.md +++ b/specs/behavior/platform-core/reservation/reservation-key.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.reservation.reservation-key kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: reservation keys to be type-scoped so that different uniqueness constraints don't conflict +- outcome: Scope reservation keys by type so different uniqueness constraints do not conflict. +- value: Keys combine type and value, types are independent namespaces, and the separator character is handled correctly. ## Behavior diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-001-reserve-an-email-address.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-001-reserve-an-email-address.sdp.md deleted file mode 100644 index b5e40451..00000000 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-001-reserve-an-email-address.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reserve-operation.reserve-an-email-address -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reserve-operation ---- -# Reserve an email address - -## Intent - -- outcome: Executable scenario: Reserve an email address - -```gwt -Given the reservation module is imported from platform-core -And the reservation table exists -And no existing reservation for "alice@example.com" -When I call reserve({ type: 'email', value: 'alice@example.com', ttl: 300000 }) -Then I receive a reservation object -And reservation.key equals "email:alice@example.com" -And reservation.status equals "reserved" -And reservation.expiresAt is 5 minutes from now -``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-002-reserve-with-correlation-id.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-002-reserve-with-correlation-id.sdp.md deleted file mode 100644 index 9f0de579..00000000 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-002-reserve-with-correlation-id.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reserve-operation.reserve-with-correlation-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reserve-operation ---- -# Reserve with correlation ID - -## Intent - -- outcome: Executable scenario: Reserve with correlation ID - -```gwt -Given the reservation module is imported from platform-core -And the reservation table exists -And no existing reservation for "bob@example.com" -And correlationId "corr_123" -When I call reserve({ type: 'email', value: 'bob@example.com', ttl: 300000, correlationId }) -Then reservation.correlationId equals "corr_123" -``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-003-first-reservation-wins.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-003-first-reservation-wins.sdp.md deleted file mode 100644 index 62f5e98d..00000000 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-003-first-reservation-wins.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reserve-operation.first-reservation-wins -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reserve-operation ---- -# First reservation wins - -## Intent - -- outcome: Executable scenario: First reservation wins - -```gwt -Given the reservation module is imported from platform-core -And the reservation table exists -And no existing reservation for "unique@example.com" -When reservation A is created for "unique@example.com" and reservation B is attempted concurrently for "unique@example.com" -Then reservation A succeeds -And reservation B fails with "ALREADY_RESERVED" -``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-004-reserved-value-cannot-be-re-reserved.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-004-reserved-value-cannot-be-re-reserved.sdp.md deleted file mode 100644 index e5f43c7f..00000000 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-004-reserved-value-cannot-be-re-reserved.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reserve-operation.reserved-value-cannot-be-re-reserved -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reserve-operation ---- -# Reserved value cannot be re-reserved - -## Intent - -- outcome: Executable scenario: Reserved value cannot be re-reserved - -```gwt -Given the reservation module is imported from platform-core -And the reservation table exists -And an active reservation for "taken@example.com" -When I call reserve({ type: 'email', value: 'taken@example.com', ttl: 300000 }) -Then an error is thrown with code "ALREADY_RESERVED" -And error.existingReservationId is provided -``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-005-different-ttl-values.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-005-different-ttl-values.sdp.md deleted file mode 100644 index e0dc4838..00000000 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-005-different-ttl-values.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reserve-operation.different-ttl-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reserve-operation ---- -# Different TTL values - -## Intent - -- outcome: Executable scenario: Different TTL values - -```gwt -Given the reservation module is imported from platform-core -And the reservation table exists -And no existing reservation -When I call reserve with ttl value -Then expiresAt is value from now -``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-006-ttl-must-be-positive.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-006-ttl-must-be-positive.sdp.md deleted file mode 100644 index c8de2839..00000000 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-006-ttl-must-be-positive.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reserve-operation.ttl-must-be-positive -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reserve-operation ---- -# TTL must be positive - -## Intent - -- outcome: Executable scenario: TTL must be positive - -```gwt -Given the reservation module is imported from platform-core -And the reservation table exists -When I call reserve({ type: 'email', value: 'test@example.com', ttl: 0 }) -Then an error is thrown with code "INVALID_TTL" -``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-007-ttl-has-maximum-limit.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-007-ttl-has-maximum-limit.sdp.md deleted file mode 100644 index de81a2b4..00000000 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-007-ttl-has-maximum-limit.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reserve-operation.ttl-has-maximum-limit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reserve-operation ---- -# TTL has maximum limit - -## Intent - -- outcome: Executable scenario: TTL has maximum limit - -```gwt -Given the reservation module is imported from platform-core -And the reservation table exists -When I call reserve({ type: 'email', value: 'test@example.com', ttl: 86400001 }) -Then an error is thrown with code "TTL_TOO_LONG" -And error message mentions maximum of 24 hours -``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-008-negative-ttl-is-rejected.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-008-negative-ttl-is-rejected.sdp.md deleted file mode 100644 index dec5694f..00000000 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-008-negative-ttl-is-rejected.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reserve-operation.negative-ttl-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reserve-operation ---- -# Negative TTL is rejected - -## Intent - -- outcome: Executable scenario: Negative TTL is rejected - -```gwt -Given the reservation module is imported from platform-core -And the reservation table exists -When I call reserve({ type: 'email', value: 'negative@example.com', ttl: -1 }) -Then an error is thrown with code "INVALID_TTL" -``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-009-ttl-at-minimum-boundary-succeeds.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-009-ttl-at-minimum-boundary-succeeds.sdp.md deleted file mode 100644 index 0dd88a50..00000000 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-009-ttl-at-minimum-boundary-succeeds.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reserve-operation.ttl-at-minimum-boundary-succeeds -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reserve-operation ---- -# TTL at minimum boundary succeeds - -## Intent - -- outcome: Executable scenario: TTL at minimum boundary succeeds - -```gwt -Given the reservation module is imported from platform-core -And the reservation table exists -When I call reserve({ type: 'email', value: 'minttl@example.com', ttl: 1000 }) -Then I receive a reservation object -``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-010-ttl-just-below-minimum-is-rejected.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-010-ttl-just-below-minimum-is-rejected.sdp.md deleted file mode 100644 index f04f3c49..00000000 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-010-ttl-just-below-minimum-is-rejected.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reserve-operation.ttl-just-below-minimum-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reserve-operation ---- -# TTL just below minimum is rejected - -## Intent - -- outcome: Executable scenario: TTL just below minimum is rejected - -```gwt -Given the reservation module is imported from platform-core -And the reservation table exists -When I call reserve({ type: 'email', value: 'belowmin@example.com', ttl: 999 }) -Then an error is thrown with code "INVALID_TTL" -``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-011-na-n-ttl-is-rejected.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-011-na-n-ttl-is-rejected.sdp.md deleted file mode 100644 index 19b3fd5e..00000000 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-011-na-n-ttl-is-rejected.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reserve-operation.na-n-ttl-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reserve-operation ---- -# NaN TTL is rejected - -## Intent - -- outcome: Executable scenario: NaN TTL is rejected - -```gwt -Given the reservation module is imported from platform-core -And the reservation table exists -When I call reserve with NaN TTL -Then an error is thrown with code "INVALID_TTL" -``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-012-infinity-ttl-is-rejected.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-012-infinity-ttl-is-rejected.sdp.md deleted file mode 100644 index d6f87415..00000000 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-012-infinity-ttl-is-rejected.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reserve-operation.infinity-ttl-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reserve-operation ---- -# Infinity TTL is rejected - -## Intent - -- outcome: Executable scenario: Infinity TTL is rejected - -```gwt -Given the reservation module is imported from platform-core -And the reservation table exists -When I call reserve with Infinity TTL -Then an error is thrown with code "INVALID_TTL" -``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-013-whitespace-only-type-is-invalid.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-013-whitespace-only-type-is-invalid.sdp.md deleted file mode 100644 index b0dde0c7..00000000 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-013-whitespace-only-type-is-invalid.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reserve-operation.whitespace-only-type-is-invalid -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reserve-operation ---- -# Whitespace-only type is invalid - -## Intent - -- outcome: Executable scenario: Whitespace-only type is invalid - -```gwt -Given the reservation module is imported from platform-core -And the reservation table exists -When I call reserve({ type: ' ', value: 'test@example.com', ttl: 300000 }) -Then an error is thrown with code "INVALID_TYPE" -``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-014-whitespace-only-value-is-invalid.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.examples/s-014-whitespace-only-value-is-invalid.sdp.md deleted file mode 100644 index 7708bc48..00000000 --- a/specs/behavior/platform-core/reservation/reserve-operation.examples/s-014-whitespace-only-value-is-invalid.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.reservation.reserve-operation.whitespace-only-value-is-invalid -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.reservation.reserve-operation ---- -# Whitespace-only value is invalid - -## Intent - -- outcome: Executable scenario: Whitespace-only value is invalid - -```gwt -Given the reservation module is imported from platform-core -And the reservation table exists -When I call reserve({ type: 'email', value: ' ', ttl: 300000 }) -Then an error is thrown with code "INVALID_VALUE" -``` diff --git a/specs/behavior/platform-core/reservation/reserve-operation.sdp.md b/specs/behavior/platform-core/reservation/reserve-operation.sdp.md index 20ba3512..693609c6 100644 --- a/specs/behavior/platform-core/reservation/reserve-operation.sdp.md +++ b/specs/behavior/platform-core/reservation/reserve-operation.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.reservation.reserve-operation kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: to reserve unique values with TTL so that I can enforce uniqueness before entity creation +- outcome: Reserve unique values with TTL so uniqueness can be enforced before entity creation. +- value: Concurrent reservations use OCC for atomicity, and TTL plus type and value inputs are validated. ## Behavior diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-001-complete-metadata-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-001-complete-metadata-is-accepted.sdp.md deleted file mode 100644 index a8cce721..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-001-complete-metadata-is-accepted.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.complete-metadata-is-accepted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Complete metadata is accepted - -## Intent - -- outcome: Executable scenario: Complete metadata is accepted - -```gwt -Given a metadata object with commandId "cmd_123", commandType "TestCommand", correlationId "corr_456", and a valid timestamp -When the metadata is validated against CommandMetadataSchema -Then the validation succeeds -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-002-metadata-with-optional-user-id-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-002-metadata-with-optional-user-id-is-accepted.sdp.md deleted file mode 100644 index 9d318673..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-002-metadata-with-optional-user-id-is-accepted.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.metadata-with-optional-user-id-is-accepted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Metadata with optional userId is accepted - -## Intent - -- outcome: Executable scenario: Metadata with optional userId is accepted - -```gwt -Given a metadata object with commandId "cmd_123", commandType "TestCommand", correlationId "corr_456", userId "user_789", and a valid timestamp -When the metadata is validated against CommandMetadataSchema -Then the validation succeeds -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-003-metadata-with-invalid-timestamps-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-003-metadata-with-invalid-timestamps-is-rejected.sdp.md deleted file mode 100644 index 7ec6da5e..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-003-metadata-with-invalid-timestamps-is-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.metadata-with-invalid-timestamps-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Metadata with invalid timestamps is rejected - -## Intent - -- outcome: Executable scenario: Metadata with invalid timestamps is rejected - -```gwt -Given metadata objects with the following timestamps: -When each metadata object is validated against CommandMetadataSchema -Then each validation fails -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-004-metadata-missing-required-fields-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-004-metadata-missing-required-fields-is-rejected.sdp.md deleted file mode 100644 index 0165222c..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-004-metadata-missing-required-fields-is-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.metadata-missing-required-fields-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Metadata missing required fields is rejected - -## Intent - -- outcome: Executable scenario: Metadata missing required fields is rejected - -```gwt -Given a metadata object with only commandId "cmd_123" -When the metadata is validated against CommandMetadataSchema -Then the validation fails -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-005-complete-command-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-005-complete-command-is-accepted.sdp.md deleted file mode 100644 index efa1d6c6..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-005-complete-command-is-accepted.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.complete-command-is-accepted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Complete command is accepted - -## Intent - -- outcome: Executable scenario: Complete command is accepted - -```gwt -Given a TestCommand schema created with createCommandSchema and payload field "foo:string" -When a valid command is parsed with commandType "TestCommand" and payload foo "bar" -Then the validation succeeds -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-006-command-with-optional-payload-fields-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-006-command-with-optional-payload-fields-is-accepted.sdp.md deleted file mode 100644 index 39bce2e6..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-006-command-with-optional-payload-fields-is-accepted.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.command-with-optional-payload-fields-is-accepted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Command with optional payload fields is accepted - -## Intent - -- outcome: Executable scenario: Command with optional payload fields is accepted - -```gwt -Given a TestCommand schema created with createCommandSchema and payload field "foo:string" -When a valid command is parsed with commandType "TestCommand" and payload foo "bar" and bar 42 -Then the validation succeeds -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-007-command-with-wrong-command-type-literal-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-007-command-with-wrong-command-type-literal-is-rejected.sdp.md deleted file mode 100644 index 256efee8..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-007-command-with-wrong-command-type-literal-is-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.command-with-wrong-command-type-literal-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Command with wrong commandType literal is rejected - -## Intent - -- outcome: Executable scenario: Command with wrong commandType literal is rejected - -```gwt -Given a TestCommand schema created with createCommandSchema and payload field "foo:string" -When a command is parsed with commandType "WrongType" and payload foo "bar" -Then the validation fails -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-008-command-with-invalid-payload-type-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-008-command-with-invalid-payload-type-is-rejected.sdp.md deleted file mode 100644 index 40cc39a5..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-008-command-with-invalid-payload-type-is-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.command-with-invalid-payload-type-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Command with invalid payload type is rejected - -## Intent - -- outcome: Executable scenario: Command with invalid payload type is rejected - -```gwt -Given a TestCommand schema created with createCommandSchema and payload field "foo:string" -When a command is parsed with payload foo as number 123 -Then the validation fails -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-009-command-with-missing-required-payload-field-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-009-command-with-missing-required-payload-field-is-rejected.sdp.md deleted file mode 100644 index 74972bfe..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-009-command-with-missing-required-payload-field-is-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.command-with-missing-required-payload-field-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Command with missing required payload field is rejected - -## Intent - -- outcome: Executable scenario: Command with missing required payload field is rejected - -```gwt -Given a TestCommand schema created with createCommandSchema and payload field "foo:string" -When a command is parsed with an empty payload object -Then the validation fails -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-010-command-missing-target-context-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-010-command-missing-target-context-is-rejected.sdp.md deleted file mode 100644 index aa3ca6bd..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-010-command-missing-target-context-is-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.command-missing-target-context-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Command missing targetContext is rejected - -## Intent - -- outcome: Executable scenario: Command missing targetContext is rejected - -```gwt -Given a TestCommand schema created with createCommandSchema and payload field "foo:string" -When a command is parsed without targetContext -Then the validation fails -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-011-schema-provides-type-inference-for-command-type-literal.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-011-schema-provides-type-inference-for-command-type-literal.sdp.md deleted file mode 100644 index 2d5007e6..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-011-schema-provides-type-inference-for-command-type-literal.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.schema-provides-type-inference-for-command-type-literal -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Schema provides type inference for commandType literal - -## Intent - -- outcome: Executable scenario: Schema provides type inference for commandType literal - -```gwt -Given a TestCommand schema created with createCommandSchema and payload field "foo:string" -When a valid command is parsed with commandType "TestCommand" and payload foo "bar" -Then the parsed commandType equals "TestCommand" -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-012-success-with-version-and-data-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-012-success-with-version-and-data-is-accepted.sdp.md deleted file mode 100644 index d9e89195..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-012-success-with-version-and-data-is-accepted.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.success-with-version-and-data-is-accepted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Success with version and data is accepted - -## Intent - -- outcome: Executable scenario: Success with version and data is accepted - -```gwt -Given a success result with version 1 and data id "123" -When the result is validated against CommandSuccessResultSchema -Then the validation succeeds -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-013-success-with-undefined-data-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-013-success-with-undefined-data-is-accepted.sdp.md deleted file mode 100644 index 65b62494..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-013-success-with-undefined-data-is-accepted.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.success-with-undefined-data-is-accepted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Success with undefined data is accepted - -## Intent - -- outcome: Executable scenario: Success with undefined data is accepted - -```gwt -Given a success result with version 5 and undefined data -When the result is validated against CommandSuccessResultSchema -Then the validation succeeds -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-014-success-without-version-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-014-success-without-version-is-rejected.sdp.md deleted file mode 100644 index a405a48e..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-014-success-without-version-is-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.success-without-version-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Success without version is rejected - -## Intent - -- outcome: Executable scenario: Success without version is rejected - -```gwt -Given a success result without version and data id "123" -When the result is validated against CommandSuccessResultSchema -Then the validation fails -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-015-rejected-with-code-and-reason-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-015-rejected-with-code-and-reason-is-accepted.sdp.md deleted file mode 100644 index 3ea00468..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-015-rejected-with-code-and-reason-is-accepted.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.rejected-with-code-and-reason-is-accepted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Rejected with code and reason is accepted - -## Intent - -- outcome: Executable scenario: Rejected with code and reason is accepted - -```gwt -Given a rejected result with code "VALIDATION_ERROR" and reason "Invalid input data" -When the result is validated against CommandRejectedResultSchema -Then the validation succeeds -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-016-rejected-with-optional-context-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-016-rejected-with-optional-context-is-accepted.sdp.md deleted file mode 100644 index a8516c34..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-016-rejected-with-optional-context-is-accepted.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.rejected-with-optional-context-is-accepted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Rejected with optional context is accepted - -## Intent - -- outcome: Executable scenario: Rejected with optional context is accepted - -```gwt -Given a rejected result with code "BUSINESS_RULE_VIOLATION", reason "Cannot cancel completed order", and context -When the result is validated against CommandRejectedResultSchema -Then the validation succeeds -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-017-rejected-without-reason-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-017-rejected-without-reason-is-rejected.sdp.md deleted file mode 100644 index 37009049..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-017-rejected-without-reason-is-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.rejected-without-reason-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Rejected without reason is rejected - -## Intent - -- outcome: Executable scenario: Rejected without reason is rejected - -```gwt -Given a rejected result with code "VALIDATION_ERROR" and no reason -When the result is validated against CommandRejectedResultSchema -Then the validation fails -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-018-conflict-with-concurrent-modification-code-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-018-conflict-with-concurrent-modification-code-is-accepted.sdp.md deleted file mode 100644 index 085b0716..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-018-conflict-with-concurrent-modification-code-is-accepted.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.conflict-with-concurrent-modification-code-is-accepted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Conflict with CONCURRENT_MODIFICATION code is accepted - -## Intent - -- outcome: Executable scenario: Conflict with CONCURRENT_MODIFICATION code is accepted - -```gwt -Given a conflict result with code "CONCURRENT_MODIFICATION" and currentVersion 5 -When the result is validated against CommandConflictResultSchema -Then the validation succeeds -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-019-conflict-with-wrong-code-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-019-conflict-with-wrong-code-is-rejected.sdp.md deleted file mode 100644 index 22fc88ac..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-019-conflict-with-wrong-code-is-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.conflict-with-wrong-code-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Conflict with wrong code is rejected - -## Intent - -- outcome: Executable scenario: Conflict with wrong code is rejected - -```gwt -Given a conflict result with code "OTHER_CODE" and currentVersion 5 -When the result is validated against CommandConflictResultSchema -Then the validation fails -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-020-conflict-without-current-version-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-020-conflict-without-current-version-is-rejected.sdp.md deleted file mode 100644 index 87db0d12..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-020-conflict-without-current-version-is-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.conflict-without-current-version-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Conflict without currentVersion is rejected - -## Intent - -- outcome: Executable scenario: Conflict without currentVersion is rejected - -```gwt -Given a conflict result with code "CONCURRENT_MODIFICATION" and no currentVersion -When the result is validated against CommandConflictResultSchema -Then the validation fails -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-021-error-with-message-is-accepted.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-021-error-with-message-is-accepted.sdp.md deleted file mode 100644 index 0286dea7..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-021-error-with-message-is-accepted.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.error-with-message-is-accepted -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Error with message is accepted - -## Intent - -- outcome: Executable scenario: Error with message is accepted - -```gwt -Given an error result with message "Unexpected database error" -When the result is validated against CommandErrorResultSchema -Then the validation succeeds -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-022-error-without-message-is-rejected.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-022-error-without-message-is-rejected.sdp.md deleted file mode 100644 index 11ce8b49..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-022-error-without-message-is-rejected.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.error-without-message-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Error without message is rejected - -## Intent - -- outcome: Executable scenario: Error without message is rejected - -```gwt -Given an error result with no message -When the result is validated against CommandErrorResultSchema -Then the validation fails -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-023-union-discriminates-success-and-preserves-version.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-023-union-discriminates-success-and-preserves-version.sdp.md deleted file mode 100644 index 5436991c..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-023-union-discriminates-success-and-preserves-version.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.union-discriminates-success-and-preserves-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Union discriminates success and preserves version - -## Intent - -- outcome: Executable scenario: Union discriminates success and preserves version - -```gwt -Given a result with status "success", version 1, and data null -When the result is validated against CommandResultSchema -Then the validation succeeds -And the parsed result has status "success" and version 1 -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-024-union-discriminates-rejected-and-preserves-code-and-reason.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-024-union-discriminates-rejected-and-preserves-code-and-reason.sdp.md deleted file mode 100644 index 92e62c69..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-024-union-discriminates-rejected-and-preserves-code-and-reason.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.union-discriminates-rejected-and-preserves-code-and-reason -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Union discriminates rejected and preserves code and reason - -## Intent - -- outcome: Executable scenario: Union discriminates rejected and preserves code and reason - -```gwt -Given a result with status "rejected", code "ERROR", and reason "Something went wrong" -When the result is validated against CommandResultSchema -Then the validation succeeds -And the parsed result has status "rejected", code "ERROR", and reason "Something went wrong" -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-025-union-discriminates-conflict-and-preserves-current-version.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-025-union-discriminates-conflict-and-preserves-current-version.sdp.md deleted file mode 100644 index ee3640dc..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-025-union-discriminates-conflict-and-preserves-current-version.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.union-discriminates-conflict-and-preserves-current-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Union discriminates conflict and preserves currentVersion - -## Intent - -- outcome: Executable scenario: Union discriminates conflict and preserves currentVersion - -```gwt -Given a result with status "conflict", code "CONCURRENT_MODIFICATION", and currentVersion 10 -When the result is validated against CommandResultSchema -Then the validation succeeds -And the parsed result has status "conflict" and currentVersion 10 -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-026-union-discriminates-error-and-preserves-message.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-026-union-discriminates-error-and-preserves-message.sdp.md deleted file mode 100644 index 9fd2ec0f..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-026-union-discriminates-error-and-preserves-message.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.union-discriminates-error-and-preserves-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Union discriminates error and preserves message - -## Intent - -- outcome: Executable scenario: Union discriminates error and preserves message - -```gwt -Given a result with status "error" and message "Internal error" -When the result is validated against CommandResultSchema -Then the validation succeeds -And the parsed result has status "error" and message "Internal error" -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.examples/s-027-union-rejects-unknown-status.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.examples/s-027-union-rejects-unknown-status.sdp.md deleted file mode 100644 index 2dd404d8..00000000 --- a/specs/behavior/platform-core/schemas/command-schemas.examples/s-027-union-rejects-unknown-status.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.schemas.command-schemas.union-rejects-unknown-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.schemas.command-schemas ---- -# Union rejects unknown status - -## Intent - -- outcome: Executable scenario: Union rejects unknown status - -```gwt -Given a result with status "unknown" and data object -When the result is validated against CommandResultSchema -Then the validation fails -``` diff --git a/specs/behavior/platform-core/schemas/command-schemas.sdp.md b/specs/behavior/platform-core/schemas/command-schemas.sdp.md index c377fcd1..f9019273 100644 --- a/specs/behavior/platform-core/schemas/command-schemas.sdp.md +++ b/specs/behavior/platform-core/schemas/command-schemas.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.schemas.command-schemas kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -10,7 +10,8 @@ relations: ## Intent -- outcome: Command Schemas +- outcome: Validate command metadata, factory-created command payloads, and the success, rejected, conflict, and error result union. +- value: Commands fail closed at the schema boundary so handlers receive typed metadata, payload, and result status. ## Behavior @@ -21,3 +22,42 @@ relations: - rule: CommandConflictResultSchema validates conflict results with CONCURRENT_MODIFICATION code - rule: CommandErrorResultSchema validates error results requiring a message - rule: CommandResultSchema discriminated union correctly routes by status field + +## Example space + +```gwt-vocabulary +Given a metadata object with commandId {commandId:string}, commandType {commandType:string}, correlationId {correlationId:string}, and a valid timestamp +And a metadata object with commandId {commandId:string}, commandType {commandType:string}, correlationId {correlationId:string}, userId {userId:string}, and a valid timestamp +And metadata objects with timestamps {timestamps:string} +And a metadata object with only commandId {commandId:string} +And a TestCommand schema created with createCommandSchema and payload field {payloadField:string} +And a command with commandType {commandType:string} and payload foo {foo:string} +And a command with commandType {commandType:string} and payload foo {foo:string} and bar {bar:number} +And a command with payload foo as number {fooNumber:number} +And a command with an empty payload object +And a command without targetContext +And a success result with version {version:number} and data id {dataId:string} +And a success result with version {version:number} and undefined data +And a success result without version and data id {dataId:string} +And a rejected result with code {code:string} and reason {reason:string} +And a rejected result with code {code:string}, reason {reason:string}, and context +And a rejected result with code {code:string} and no reason +And a conflict result with code {code:string} and currentVersion {currentVersion:number} +And a conflict result with code {code:string} and no currentVersion +And an error result with message {message:string} +And an error result with no message +And a result with status {status:"success"|"rejected"|"conflict"|"error"|"unknown"}, version {version:number}, and data null +And a result with status {status:"success"|"rejected"|"conflict"|"error"|"unknown"}, code {code:string}, and reason {reason:string} +And a result with status {status:"success"|"rejected"|"conflict"|"error"|"unknown"}, code {code:string}, and currentVersion {currentVersion:number} +And a result with status {status:"success"|"rejected"|"conflict"|"error"|"unknown"} and message {message:string} +And a result with status {status:"success"|"rejected"|"conflict"|"error"|"unknown"} and data object +When the input is validated against {schema:"CommandMetadataSchema"|"createCommandSchema"|"CommandSuccessResultSchema"|"CommandRejectedResultSchema"|"CommandConflictResultSchema"|"CommandErrorResultSchema"|"CommandResultSchema"} +Then the validation succeeds +And the validation fails +And each validation fails +And the parsed commandType equals {commandType:string} +And the parsed result has status {status:"success"|"rejected"|"conflict"|"error"|"unknown"} and version {version:number} +And the parsed result has status {status:"success"|"rejected"|"conflict"|"error"|"unknown"}, code {code:string}, and reason {reason:string} +And the parsed result has status {status:"success"|"rejected"|"conflict"|"error"|"unknown"} and currentVersion {currentVersion:number} +And the parsed result has status {status:"success"|"rejected"|"conflict"|"error"|"unknown"} and message {message:string} +``` diff --git a/specs/behavior/platform-core/testing/guards.examples/s-001-allow-execution-when-convex-test-mode-is-true.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-001-allow-execution-when-convex-test-mode-is-true.sdp.md deleted file mode 100644 index c4e9e5b7..00000000 --- a/specs/behavior/platform-core/testing/guards.examples/s-001-allow-execution-when-convex-test-mode-is-true.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.guards.allow-execution-when-convex-test-mode-is-true -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.guards ---- -# Allow execution when __CONVEX_TEST_MODE__ is true - -## Intent - -- outcome: Executable scenario: Allow execution when __CONVEX_TEST_MODE__ is true - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And globalThis.__CONVEX_TEST_MODE__ is true -When I call ensureTestEnvironment() -Then no error is thrown -``` diff --git a/specs/behavior/platform-core/testing/guards.examples/s-002-allow-execution-when-is-test-env-is-set.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-002-allow-execution-when-is-test-env-is-set.sdp.md deleted file mode 100644 index 5a145bac..00000000 --- a/specs/behavior/platform-core/testing/guards.examples/s-002-allow-execution-when-is-test-env-is-set.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.guards.allow-execution-when-is-test-env-is-set -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.guards ---- -# Allow execution when IS_TEST env is set - -## Intent - -- outcome: Executable scenario: Allow execution when IS_TEST env is set - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And process.env.IS_TEST is "true" -When I call ensureTestEnvironment() -Then no error is thrown -``` diff --git a/specs/behavior/platform-core/testing/guards.examples/s-003-allow-execution-on-self-hosted-runtime-without-explicit-test-signal.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-003-allow-execution-on-self-hosted-runtime-without-explicit-test-signal.sdp.md deleted file mode 100644 index 8976723c..00000000 --- a/specs/behavior/platform-core/testing/guards.examples/s-003-allow-execution-on-self-hosted-runtime-without-explicit-test-signal.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.guards.allow-execution-on-self-hosted-runtime-without-explicit-test-signal -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.guards ---- -# Allow execution on self-hosted runtime without explicit test signal - -## Intent - -- outcome: Executable scenario: Allow execution on self-hosted runtime without explicit test signal - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And process.env exists -And CONVEX_CLOUD_URL is not set -And IS_TEST is not set -And __CONVEX_TEST_MODE__ is not true -When I call ensureTestEnvironment() -Then no error is thrown -``` diff --git a/specs/behavior/platform-core/testing/guards.examples/s-004-block-execution-in-cloud-production.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-004-block-execution-in-cloud-production.sdp.md deleted file mode 100644 index 462794a4..00000000 --- a/specs/behavior/platform-core/testing/guards.examples/s-004-block-execution-in-cloud-production.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.guards.block-execution-in-cloud-production -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.guards ---- -# Block execution in cloud production - -## Intent - -- outcome: Executable scenario: Block execution in cloud production - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And process.env.CONVEX_CLOUD_URL is set -And IS_TEST is not set -And __CONVEX_TEST_MODE__ is not true -When I call ensureTestEnvironment() -Then an error is thrown with message containing "SECURITY" -And the error message contains "Test-only function" -``` diff --git a/specs/behavior/platform-core/testing/guards.examples/s-005-is-test-environment-returns-true-in-test-mode.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-005-is-test-environment-returns-true-in-test-mode.sdp.md deleted file mode 100644 index 69c06985..00000000 --- a/specs/behavior/platform-core/testing/guards.examples/s-005-is-test-environment-returns-true-in-test-mode.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.guards.is-test-environment-returns-true-in-test-mode -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.guards ---- -# isTestEnvironment returns true in test mode - -## Intent - -- outcome: Executable scenario: isTestEnvironment returns true in test mode - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And globalThis.__CONVEX_TEST_MODE__ is true -When I call isTestEnvironment() -Then I receive true -``` diff --git a/specs/behavior/platform-core/testing/guards.examples/s-006-is-test-environment-returns-true-with-is-test-env.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-006-is-test-environment-returns-true-with-is-test-env.sdp.md deleted file mode 100644 index 6e95dd0f..00000000 --- a/specs/behavior/platform-core/testing/guards.examples/s-006-is-test-environment-returns-true-with-is-test-env.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.guards.is-test-environment-returns-true-with-is-test-env -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.guards ---- -# isTestEnvironment returns true with IS_TEST env - -## Intent - -- outcome: Executable scenario: isTestEnvironment returns true with IS_TEST env - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And process.env.IS_TEST is "true" -When I call isTestEnvironment() -Then I receive true -``` diff --git a/specs/behavior/platform-core/testing/guards.examples/s-007-is-test-environment-returns-false-in-production.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-007-is-test-environment-returns-false-in-production.sdp.md deleted file mode 100644 index 84bd1cf7..00000000 --- a/specs/behavior/platform-core/testing/guards.examples/s-007-is-test-environment-returns-false-in-production.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.guards.is-test-environment-returns-false-in-production -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.guards ---- -# isTestEnvironment returns false in production - -## Intent - -- outcome: Executable scenario: isTestEnvironment returns false in production - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And process.env.CONVEX_CLOUD_URL is set -And IS_TEST is not set -When I call isTestEnvironment() -Then I receive false -``` diff --git a/specs/behavior/platform-core/testing/guards.examples/s-008-is-test-environment-is-a-safe-boolean-check.sdp.md b/specs/behavior/platform-core/testing/guards.examples/s-008-is-test-environment-is-a-safe-boolean-check.sdp.md deleted file mode 100644 index a7cc35c6..00000000 --- a/specs/behavior/platform-core/testing/guards.examples/s-008-is-test-environment-is-a-safe-boolean-check.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.guards.is-test-environment-is-a-safe-boolean-check -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.guards ---- -# isTestEnvironment is a safe boolean check - -## Intent - -- outcome: Executable scenario: isTestEnvironment is a safe boolean check - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -When I call isTestEnvironment() -Then I receive a boolean value -And no error is ever thrown from this function -``` diff --git a/specs/behavior/platform-core/testing/guards.sdp.md b/specs/behavior/platform-core/testing/guards.sdp.md index 21527666..d81637e4 100644 --- a/specs/behavior/platform-core/testing/guards.sdp.md +++ b/specs/behavior/platform-core/testing/guards.sdp.md @@ -11,4 +11,5 @@ relations: ## Intent - actor: a platform developer -- outcome: environment guards for test-only functions so that test utilities cannot be called in production +- outcome: Environment guards prevent test-only functions from being called in production. +- value: Test utilities cannot accidentally manipulate live data. diff --git a/specs/behavior/platform-core/testing/integration-isolation.examples/s-001-fresh-state-after-docker-restart.sdp.md b/specs/behavior/platform-core/testing/integration-isolation.examples/s-001-fresh-state-after-docker-restart.sdp.md deleted file mode 100644 index 0d67a081..00000000 --- a/specs/behavior/platform-core/testing/integration-isolation.examples/s-001-fresh-state-after-docker-restart.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.integration-isolation.fresh-state-after-docker-restart -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.integration-isolation ---- -# Fresh state after Docker restart - -## Intent - -- outcome: Executable scenario: Fresh state after Docker restart - -```gwt -Given the integration test environment is configured -And Docker backend is available on port 3210 -And a previous test created entity "order-123" -When Docker is restarted via "just restart" -Then querying for "order-123" should return nothing -And Workpool state should be empty -And scheduled functions should be cleared -``` diff --git a/specs/behavior/platform-core/testing/integration-isolation.examples/s-002-detect-state-pollution-without-restart.sdp.md b/specs/behavior/platform-core/testing/integration-isolation.examples/s-002-detect-state-pollution-without-restart.sdp.md deleted file mode 100644 index c06733c5..00000000 --- a/specs/behavior/platform-core/testing/integration-isolation.examples/s-002-detect-state-pollution-without-restart.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.integration-isolation.detect-state-pollution-without-restart -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.integration-isolation ---- -# Detect state pollution without restart - -## Intent - -- outcome: Executable scenario: Detect state pollution without restart - -```gwt -Given the integration test environment is configured -And Docker backend is available on port 3210 -And a test created entity with id "polluted-entity" -And Docker was NOT restarted -When a new test queries the database -Then "polluted-entity" may still exist -And this indicates potential state pollution -``` diff --git a/specs/behavior/platform-core/testing/integration-isolation.examples/s-003-unique-namespace-per-test.sdp.md b/specs/behavior/platform-core/testing/integration-isolation.examples/s-003-unique-namespace-per-test.sdp.md deleted file mode 100644 index 3988cb3f..00000000 --- a/specs/behavior/platform-core/testing/integration-isolation.examples/s-003-unique-namespace-per-test.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.integration-isolation.unique-namespace-per-test -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.integration-isolation ---- -# Unique namespace per test - -## Intent - -- outcome: Executable scenario: Unique namespace per test - -```gwt -Given the integration test environment is configured -And Docker backend is available on port 3210 -And test "test-1" with namespace "ns_abc123" -And test "test-2" with namespace "ns_def456" -When both tests create entity with logical id "order-1" -Then test-1 creates "ns_abc123_order-1" -And test-2 creates "ns_def456_order-1" -And no collision occurs -``` diff --git a/specs/behavior/platform-core/testing/integration-isolation.examples/s-004-namespace-applied-to-correlation-i-ds.sdp.md b/specs/behavior/platform-core/testing/integration-isolation.examples/s-004-namespace-applied-to-correlation-i-ds.sdp.md deleted file mode 100644 index e5fe1c0b..00000000 --- a/specs/behavior/platform-core/testing/integration-isolation.examples/s-004-namespace-applied-to-correlation-i-ds.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.integration-isolation.namespace-applied-to-correlation-i-ds -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.integration-isolation ---- -# Namespace applied to correlation IDs - -## Intent - -- outcome: Executable scenario: Namespace applied to correlation IDs - -```gwt -Given the integration test environment is configured -And Docker backend is available on port 3210 -And a test with namespace "ns_test" -When executing a command -Then correlationId should include namespace prefix -And events can be traced to the specific test -``` diff --git a/specs/behavior/platform-core/testing/integration-isolation.examples/s-005-workpool-jobs-from-previous-test-don-t-interfere.sdp.md b/specs/behavior/platform-core/testing/integration-isolation.examples/s-005-workpool-jobs-from-previous-test-don-t-interfere.sdp.md deleted file mode 100644 index 039e4eb8..00000000 --- a/specs/behavior/platform-core/testing/integration-isolation.examples/s-005-workpool-jobs-from-previous-test-don-t-interfere.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.integration-isolation.workpool-jobs-from-previous-test-don-t-interfere -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.integration-isolation ---- -# Workpool jobs from previous test don't interfere - -## Intent - -- outcome: Executable scenario: Workpool jobs from previous test don't interfere - -```gwt -Given the integration test environment is configured -And Docker backend is available on port 3210 -And test-1 queued a Workpool job that takes 5 seconds -And test-1 completed without waiting for the job -When test-2 starts immediately -Then test-2 should not see test-1's pending job -And Docker restart is required for complete isolation -``` diff --git a/specs/behavior/platform-core/testing/integration-isolation.examples/s-006-scheduled-functions-use-test-specific-context.sdp.md b/specs/behavior/platform-core/testing/integration-isolation.examples/s-006-scheduled-functions-use-test-specific-context.sdp.md deleted file mode 100644 index 8937b93d..00000000 --- a/specs/behavior/platform-core/testing/integration-isolation.examples/s-006-scheduled-functions-use-test-specific-context.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.integration-isolation.scheduled-functions-use-test-specific-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.integration-isolation ---- -# Scheduled functions use test-specific context - -## Intent - -- outcome: Executable scenario: Scheduled functions use test-specific context - -```gwt -Given the integration test environment is configured -And Docker backend is available on port 3210 -And a test schedules a function for 1 minute later -When the test completes -Then the scheduled function should include test namespace -And cleanup can identify test-specific scheduled functions -``` diff --git a/specs/behavior/platform-core/testing/integration-isolation.sdp.md b/specs/behavior/platform-core/testing/integration-isolation.sdp.md index 2646282a..8acaf2ea 100644 --- a/specs/behavior/platform-core/testing/integration-isolation.sdp.md +++ b/specs/behavior/platform-core/testing/integration-isolation.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.testing.integration-isolation kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform developer -- outcome: integration tests to be properly isolated so that tests don't interfere with each other and produce reliable results +- outcome: Integration tests stay isolated so they do not interfere with each other and produce reliable results. +- value: Docker restart, unique namespaces, and isolated background jobs keep results reproducible. ## Behavior diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-001-package-has-feature-directory-platform-core.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-001-package-has-feature-directory-platform-core.sdp.md deleted file mode 100644 index a4ad2432..00000000 --- a/specs/behavior/platform-core/testing/platform-coverage.examples/s-001-package-has-feature-directory-platform-core.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.platform-coverage.package-has-feature-directory-platform-core -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.platform-coverage ---- -# Package has feature directory - platform-core - -## Intent - -- outcome: Executable scenario: Package has feature directory - platform-core - -```gwt -Given the monorepo contains @libar-dev/platform-* packages -And each package follows the standard directory structure -And package @libar-dev/platform-core -When checking test structure -Then tests/features/ directory should exist -And at least one .feature file should be present -``` diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-002-package-has-feature-directory-platform-decider.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-002-package-has-feature-directory-platform-decider.sdp.md deleted file mode 100644 index e071d71a..00000000 --- a/specs/behavior/platform-core/testing/platform-coverage.examples/s-002-package-has-feature-directory-platform-decider.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.platform-coverage.package-has-feature-directory-platform-decider -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.platform-coverage ---- -# Package has feature directory - platform-decider - -## Intent - -- outcome: Executable scenario: Package has feature directory - platform-decider - -```gwt -Given the monorepo contains @libar-dev/platform-* packages -And each package follows the standard directory structure -And package @libar-dev/platform-decider -When checking test structure -Then tests/features/ directory should exist -And at least one .feature file should be present -``` diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-003-package-has-feature-directory-platform-fsm.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-003-package-has-feature-directory-platform-fsm.sdp.md deleted file mode 100644 index e35de7da..00000000 --- a/specs/behavior/platform-core/testing/platform-coverage.examples/s-003-package-has-feature-directory-platform-fsm.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.platform-coverage.package-has-feature-directory-platform-fsm -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.platform-coverage ---- -# Package has feature directory - platform-fsm - -## Intent - -- outcome: Executable scenario: Package has feature directory - platform-fsm - -```gwt -Given the monorepo contains @libar-dev/platform-* packages -And each package follows the standard directory structure -And package @libar-dev/platform-fsm -When checking test structure -Then tests/features/ directory should exist -And at least one .feature file should be present -``` diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-004-package-has-feature-directory-platform-store.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-004-package-has-feature-directory-platform-store.sdp.md deleted file mode 100644 index adf70b87..00000000 --- a/specs/behavior/platform-core/testing/platform-coverage.examples/s-004-package-has-feature-directory-platform-store.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.platform-coverage.package-has-feature-directory-platform-store -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.platform-coverage ---- -# Package has feature directory - platform-store - -## Intent - -- outcome: Executable scenario: Package has feature directory - platform-store - -```gwt -Given the monorepo contains @libar-dev/platform-* packages -And each package follows the standard directory structure -And package @libar-dev/platform-store -When checking test structure -Then tests/features/ directory should exist -And at least one .feature file should be present -``` diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-005-package-has-feature-directory-platform-bus.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-005-package-has-feature-directory-platform-bus.sdp.md deleted file mode 100644 index a79c34d8..00000000 --- a/specs/behavior/platform-core/testing/platform-coverage.examples/s-005-package-has-feature-directory-platform-bus.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.platform-coverage.package-has-feature-directory-platform-bus -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.platform-coverage ---- -# Package has feature directory - platform-bus - -## Intent - -- outcome: Executable scenario: Package has feature directory - platform-bus - -```gwt -Given the monorepo contains @libar-dev/platform-* packages -And each package follows the standard directory structure -And package @libar-dev/platform-bus -When checking test structure -Then tests/features/ directory should exist -And at least one .feature file should be present -``` diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-006-package-has-feature-directory-platform-bc.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-006-package-has-feature-directory-platform-bc.sdp.md deleted file mode 100644 index 1f73fe21..00000000 --- a/specs/behavior/platform-core/testing/platform-coverage.examples/s-006-package-has-feature-directory-platform-bc.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.platform-coverage.package-has-feature-directory-platform-bc -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.platform-coverage ---- -# Package has feature directory - platform-bc - -## Intent - -- outcome: Executable scenario: Package has feature directory - platform-bc - -```gwt -Given the monorepo contains @libar-dev/platform-* packages -And each package follows the standard directory structure -And package @libar-dev/platform-bc -When checking test structure -Then tests/features/ directory should exist -And at least one .feature file should be present -``` diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-007-exported-function-has-feature-coverage.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-007-exported-function-has-feature-coverage.sdp.md deleted file mode 100644 index e54f0398..00000000 --- a/specs/behavior/platform-core/testing/platform-coverage.examples/s-007-exported-function-has-feature-coverage.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.platform-coverage.exported-function-has-feature-coverage -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.platform-coverage ---- -# Exported function has feature coverage - -## Intent - -- outcome: Executable scenario: Exported function has feature coverage - -```gwt -Given the monorepo contains @libar-dev/platform-* packages -And each package follows the standard directory structure -And an exported function "createDeciderHandler" -When checking BDD coverage -Then a feature file should document its behavior -And scenarios should cover happy path and edge cases -``` diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-008-missing-coverage-is-detected.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-008-missing-coverage-is-detected.sdp.md deleted file mode 100644 index a27e7732..00000000 --- a/specs/behavior/platform-core/testing/platform-coverage.examples/s-008-missing-coverage-is-detected.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.platform-coverage.missing-coverage-is-detected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.platform-coverage ---- -# Missing coverage is detected - -## Intent - -- outcome: Executable scenario: Missing coverage is detected - -```gwt -Given the monorepo contains @libar-dev/platform-* packages -And each package follows the standard directory structure -And an exported function without feature coverage -When running coverage analysis -Then a warning should be generated -And the missing function should be listed -``` diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-009-step-definitions-follow-naming-convention.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-009-step-definitions-follow-naming-convention.sdp.md deleted file mode 100644 index c3de32d9..00000000 --- a/specs/behavior/platform-core/testing/platform-coverage.examples/s-009-step-definitions-follow-naming-convention.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.platform-coverage.step-definitions-follow-naming-convention -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.platform-coverage ---- -# Step definitions follow naming convention - -## Intent - -- outcome: Executable scenario: Step definitions follow naming convention - -```gwt -Given the monorepo contains @libar-dev/platform-* packages -And each package follows the standard directory structure -And package @libar-dev/platform-core -When checking step definition organization -Then steps should be in tests/steps/ directory -And each feature area has its own step file -And no duplicate step patterns exist across files -``` diff --git a/specs/behavior/platform-core/testing/platform-coverage.examples/s-010-step-file-matches-feature-file.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.examples/s-010-step-file-matches-feature-file.sdp.md deleted file mode 100644 index 23aa66bd..00000000 --- a/specs/behavior/platform-core/testing/platform-coverage.examples/s-010-step-file-matches-feature-file.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.platform-coverage.step-file-matches-feature-file -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.platform-coverage ---- -# Step file matches feature file - -## Intent - -- outcome: Executable scenario: Step file matches feature file - -```gwt -Given the monorepo contains @libar-dev/platform-* packages -And each package follows the standard directory structure -And feature file "decider-outputs.feature" -When looking for step definitions -Then steps should be in "steps/decider/outputs.steps.ts" or "steps/decider.steps.ts" -``` diff --git a/specs/behavior/platform-core/testing/platform-coverage.sdp.md b/specs/behavior/platform-core/testing/platform-coverage.sdp.md index 6fd037a0..4552a68f 100644 --- a/specs/behavior/platform-core/testing/platform-coverage.sdp.md +++ b/specs/behavior/platform-core/testing/platform-coverage.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.testing.platform-coverage kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,7 +11,8 @@ relations: ## Intent - actor: a platform maintainer -- outcome: all platform packages to have BDD test coverage so that public APIs are documented through executable specifications +- outcome: All platform packages have BDD test coverage so public APIs are documented through executable specifications. +- value: Public APIs stay documented in Gherkin rather than opaque unit tests. ## Behavior diff --git a/specs/behavior/platform-core/testing/polling.examples/s-001-sleep-for-specified-duration.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-001-sleep-for-specified-duration.sdp.md deleted file mode 100644 index 02fcd661..00000000 --- a/specs/behavior/platform-core/testing/polling.examples/s-001-sleep-for-specified-duration.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.polling.sleep-for-specified-duration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.polling ---- -# Sleep for specified duration - -## Intent - -- outcome: Executable scenario: Sleep for specified duration - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -When I call sleep(50) -Then the function resolves after approximately 50ms -And no error is thrown -``` diff --git a/specs/behavior/platform-core/testing/polling.examples/s-002-sleep-returns-a-promise.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-002-sleep-returns-a-promise.sdp.md deleted file mode 100644 index 5fd44e4e..00000000 --- a/specs/behavior/platform-core/testing/polling.examples/s-002-sleep-returns-a-promise.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.polling.sleep-returns-a-promise -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.polling ---- -# Sleep returns a promise - -## Intent - -- outcome: Executable scenario: Sleep returns a promise - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -When I call sleep(10) -Then I receive a Promise -And I can await the result -``` diff --git a/specs/behavior/platform-core/testing/polling.examples/s-003-wait-until-returns-truthy-result-immediately.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-003-wait-until-returns-truthy-result-immediately.sdp.md deleted file mode 100644 index 31ce614a..00000000 --- a/specs/behavior/platform-core/testing/polling.examples/s-003-wait-until-returns-truthy-result-immediately.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.polling.wait-until-returns-truthy-result-immediately -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.polling ---- -# waitUntil returns truthy result immediately - -## Intent - -- outcome: Executable scenario: waitUntil returns truthy result immediately - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And a check function that returns truthy on first call -When I call waitUntil with the check function -Then I receive the truthy value -And the check was called once -``` diff --git a/specs/behavior/platform-core/testing/polling.examples/s-004-wait-until-polls-until-condition-is-met.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-004-wait-until-polls-until-condition-is-met.sdp.md deleted file mode 100644 index 71ebc676..00000000 --- a/specs/behavior/platform-core/testing/polling.examples/s-004-wait-until-polls-until-condition-is-met.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.polling.wait-until-polls-until-condition-is-met -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.polling ---- -# waitUntil polls until condition is met - -## Intent - -- outcome: Executable scenario: waitUntil polls until condition is met - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And a check function that returns truthy after 3 calls -When I call waitUntil with the check function -Then I receive the truthy value -And the check was called 3 times -``` diff --git a/specs/behavior/platform-core/testing/polling.examples/s-005-wait-until-throws-on-timeout.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-005-wait-until-throws-on-timeout.sdp.md deleted file mode 100644 index 9699eca3..00000000 --- a/specs/behavior/platform-core/testing/polling.examples/s-005-wait-until-throws-on-timeout.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.polling.wait-until-throws-on-timeout -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.polling ---- -# waitUntil throws on timeout - -## Intent - -- outcome: Executable scenario: waitUntil throws on timeout - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And a check function that always returns falsy -When I call waitUntil with timeoutMs 100 and pollIntervalMs 20 -Then an error is thrown with message containing "within 100ms" -``` diff --git a/specs/behavior/platform-core/testing/polling.examples/s-006-wait-until-uses-custom-timeout-message.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-006-wait-until-uses-custom-timeout-message.sdp.md deleted file mode 100644 index 9ba40c4a..00000000 --- a/specs/behavior/platform-core/testing/polling.examples/s-006-wait-until-uses-custom-timeout-message.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.polling.wait-until-uses-custom-timeout-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.polling ---- -# waitUntil uses custom timeout message - -## Intent - -- outcome: Executable scenario: waitUntil uses custom timeout message - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And a check function that always returns falsy -When I call waitUntil with message "Order to be confirmed" -Then an error is thrown with message containing "Order to be confirmed" -``` diff --git a/specs/behavior/platform-core/testing/polling.examples/s-007-wait-until-respects-poll-interval-ms.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-007-wait-until-respects-poll-interval-ms.sdp.md deleted file mode 100644 index 2ce2f43f..00000000 --- a/specs/behavior/platform-core/testing/polling.examples/s-007-wait-until-respects-poll-interval-ms.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.polling.wait-until-respects-poll-interval-ms -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.polling ---- -# waitUntil respects pollIntervalMs - -## Intent - -- outcome: Executable scenario: waitUntil respects pollIntervalMs - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And a check function that tracks call timestamps -When I call waitUntil with pollIntervalMs 50 -Then calls are spaced approximately 50ms apart -``` diff --git a/specs/behavior/platform-core/testing/polling.examples/s-008-wait-for-resolves-when-predicate-returns-true.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-008-wait-for-resolves-when-predicate-returns-true.sdp.md deleted file mode 100644 index 72cc9ee2..00000000 --- a/specs/behavior/platform-core/testing/polling.examples/s-008-wait-for-resolves-when-predicate-returns-true.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.polling.wait-for-resolves-when-predicate-returns-true -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.polling ---- -# waitFor resolves when predicate returns true - -## Intent - -- outcome: Executable scenario: waitFor resolves when predicate returns true - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And a predicate that returns true after 2 calls -When I call waitFor with the predicate -Then the function resolves without error -And the predicate was called 2 times -``` diff --git a/specs/behavior/platform-core/testing/polling.examples/s-009-wait-for-throws-on-timeout.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-009-wait-for-throws-on-timeout.sdp.md deleted file mode 100644 index b57515b9..00000000 --- a/specs/behavior/platform-core/testing/polling.examples/s-009-wait-for-throws-on-timeout.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.polling.wait-for-throws-on-timeout -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.polling ---- -# waitFor throws on timeout - -## Intent - -- outcome: Executable scenario: waitFor throws on timeout - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And a predicate that always returns false -When I call waitFor with timeoutMs 100 -Then an error is thrown with message containing "100ms" -``` diff --git a/specs/behavior/platform-core/testing/polling.examples/s-010-default-timeout-is-30-seconds.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-010-default-timeout-is-30-seconds.sdp.md deleted file mode 100644 index 391370d7..00000000 --- a/specs/behavior/platform-core/testing/polling.examples/s-010-default-timeout-is-30-seconds.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.polling.default-timeout-is-30-seconds -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.polling ---- -# Default timeout is 30 seconds - -## Intent - -- outcome: Executable scenario: Default timeout is 30 seconds - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -When the scenario runs -Then DEFAULT_TIMEOUT_MS equals 30000 -``` diff --git a/specs/behavior/platform-core/testing/polling.examples/s-011-default-poll-interval-is-100ms.sdp.md b/specs/behavior/platform-core/testing/polling.examples/s-011-default-poll-interval-is-100ms.sdp.md deleted file mode 100644 index 0175350a..00000000 --- a/specs/behavior/platform-core/testing/polling.examples/s-011-default-poll-interval-is-100ms.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.polling.default-poll-interval-is-100ms -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.polling ---- -# Default poll interval is 100ms - -## Intent - -- outcome: Executable scenario: Default poll interval is 100ms - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -When the scenario runs -Then DEFAULT_POLL_INTERVAL_MS equals 100 -``` diff --git a/specs/behavior/platform-core/testing/polling.sdp.md b/specs/behavior/platform-core/testing/polling.sdp.md index 18c95082..841c8d90 100644 --- a/specs/behavior/platform-core/testing/polling.sdp.md +++ b/specs/behavior/platform-core/testing/polling.sdp.md @@ -11,4 +11,5 @@ relations: ## Intent - actor: a developer writing integration tests -- outcome: async polling utilities so that I can wait for eventual consistency patterns +- outcome: Async polling utilities wait for eventual-consistency patterns in integration tests. +- value: Tests can wait for Workpool-processed projections without racing. diff --git a/specs/behavior/platform-core/testing/world.examples/s-001-create-base-unit-test-world.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-001-create-base-unit-test-world.sdp.md deleted file mode 100644 index 58b10bd3..00000000 --- a/specs/behavior/platform-core/testing/world.examples/s-001-create-base-unit-test-world.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.world.create-base-unit-test-world -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.world ---- -# Create base unit test world - -## Intent - -- outcome: Executable scenario: Create base unit test world - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And a mock ConvexTest instance -When I call createBaseUnitTestWorld(t) -Then I receive a BaseUnitTestWorld object -And the world.t is the mock instance -And the world.lastResult is null -And the world.lastError is null -And the world.scenario is an empty object -``` diff --git a/specs/behavior/platform-core/testing/world.examples/s-002-unit-test-world-supports-scenario-context.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-002-unit-test-world-supports-scenario-context.sdp.md deleted file mode 100644 index 7390f21d..00000000 --- a/specs/behavior/platform-core/testing/world.examples/s-002-unit-test-world-supports-scenario-context.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.world.unit-test-world-supports-scenario-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.world ---- -# Unit test world supports scenario context - -## Intent - -- outcome: Executable scenario: Unit test world supports scenario context - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And a BaseUnitTestWorld instance -When I set world.scenario.orderId to "order-123" -Then world.scenario.orderId is "order-123" -``` diff --git a/specs/behavior/platform-core/testing/world.examples/s-003-unit-test-world-tracks-last-result.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-003-unit-test-world-tracks-last-result.sdp.md deleted file mode 100644 index 6e79d033..00000000 --- a/specs/behavior/platform-core/testing/world.examples/s-003-unit-test-world-tracks-last-result.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.world.unit-test-world-tracks-last-result -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.world ---- -# Unit test world tracks last result - -## Intent - -- outcome: Executable scenario: Unit test world tracks last result - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And a BaseUnitTestWorld instance -When I set world.lastResult to a success object -Then world.lastResult contains the success object -``` diff --git a/specs/behavior/platform-core/testing/world.examples/s-004-unit-test-world-tracks-last-error.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-004-unit-test-world-tracks-last-error.sdp.md deleted file mode 100644 index eff30373..00000000 --- a/specs/behavior/platform-core/testing/world.examples/s-004-unit-test-world-tracks-last-error.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.world.unit-test-world-tracks-last-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.world ---- -# Unit test world tracks last error - -## Intent - -- outcome: Executable scenario: Unit test world tracks last error - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And a BaseUnitTestWorld instance -When I set world.lastError to an Error -Then world.lastError is the Error instance -``` diff --git a/specs/behavior/platform-core/testing/world.examples/s-005-create-base-integration-test-world.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-005-create-base-integration-test-world.sdp.md deleted file mode 100644 index 6b57100e..00000000 --- a/specs/behavior/platform-core/testing/world.examples/s-005-create-base-integration-test-world.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.world.create-base-integration-test-world -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.world ---- -# Create base integration test world - -## Intent - -- outcome: Executable scenario: Create base integration test world - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And a mock ConvexTestingHelper instance -When I call createBaseIntegrationTestWorld(t) -Then I receive a BaseIntegrationTestWorld object -And the world.t is the mock instance -And the world.backendUrl is set -``` diff --git a/specs/behavior/platform-core/testing/world.examples/s-006-integration-test-world-uses-custom-backend-url.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-006-integration-test-world-uses-custom-backend-url.sdp.md deleted file mode 100644 index 9aa64b4e..00000000 --- a/specs/behavior/platform-core/testing/world.examples/s-006-integration-test-world-uses-custom-backend-url.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.world.integration-test-world-uses-custom-backend-url -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.world ---- -# Integration test world uses custom backend URL - -## Intent - -- outcome: Executable scenario: Integration test world uses custom backend URL - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And a mock ConvexTestingHelper instance -When I call createBaseIntegrationTestWorld(t, "http://custom:3210") -Then world.backendUrl is "http://custom:3210" -``` diff --git a/specs/behavior/platform-core/testing/world.examples/s-007-integration-test-world-defaults-to-localhost.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-007-integration-test-world-defaults-to-localhost.sdp.md deleted file mode 100644 index 8d3357d9..00000000 --- a/specs/behavior/platform-core/testing/world.examples/s-007-integration-test-world-defaults-to-localhost.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.world.integration-test-world-defaults-to-localhost -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.world ---- -# Integration test world defaults to localhost - -## Intent - -- outcome: Executable scenario: Integration test world defaults to localhost - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And a mock ConvexTestingHelper instance -And no CONVEX_URL environment variable is set -When I call createBaseIntegrationTestWorld(t) -Then world.backendUrl contains "127.0.0.1:3210" -``` diff --git a/specs/behavior/platform-core/testing/world.examples/s-008-reset-world-state-clears-all-fields.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-008-reset-world-state-clears-all-fields.sdp.md deleted file mode 100644 index 47db12fd..00000000 --- a/specs/behavior/platform-core/testing/world.examples/s-008-reset-world-state-clears-all-fields.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.world.reset-world-state-clears-all-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.world ---- -# Reset world state clears all fields - -## Intent - -- outcome: Executable scenario: Reset world state clears all fields - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And a BaseUnitTestWorld instance with populated state -When I call resetWorldState(world) -Then world.lastResult is null -And world.lastError is null -And world.scenario is an empty object -``` diff --git a/specs/behavior/platform-core/testing/world.examples/s-009-reset-preserves-test-backend-reference.sdp.md b/specs/behavior/platform-core/testing/world.examples/s-009-reset-preserves-test-backend-reference.sdp.md deleted file mode 100644 index ed6c8556..00000000 --- a/specs/behavior/platform-core/testing/world.examples/s-009-reset-preserves-test-backend-reference.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.testing.world.reset-preserves-test-backend-reference -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.testing.world ---- -# Reset preserves test backend reference - -## Intent - -- outcome: Executable scenario: Reset preserves test backend reference - -```gwt -Given the following deliverables: -And the platform-core testing module is imported -And a BaseUnitTestWorld instance with a mock t -When I call resetWorldState(world) -Then world.t is still the original mock instance -``` diff --git a/specs/behavior/platform-core/testing/world.sdp.md b/specs/behavior/platform-core/testing/world.sdp.md index 52d111b9..e0846414 100644 --- a/specs/behavior/platform-core/testing/world.sdp.md +++ b/specs/behavior/platform-core/testing/world.sdp.md @@ -11,4 +11,5 @@ relations: ## Intent - actor: a BDD test author -- outcome: world/state management utilities so that I can manage scenario context across steps +- outcome: World and state management utilities hold scenario context across steps. +- value: Unit and integration scenarios share lastResult, lastError, and scenario fields without leaking state between runs. diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-001-single-entity-projections-recommend-entity-strategy.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-001-single-entity-projections-recommend-entity-strategy.sdp.md deleted file mode 100644 index d046c8de..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-001-single-entity-projections-recommend-entity-strategy.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.single-entity-projections-recommend-entity-strategy -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier ---- -# Single entity projections recommend entity strategy - -## Intent - -- outcome: Executable scenario: Single entity projections recommend entity strategy - -```gwt -Given the decision tree priority is global > saga > customer > entity -And projection characteristics with singleEntity true and all others false -When I call classifyProjection -Then the strategy should be "entity" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-002-single-entity-projections-return-simple-complexity.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-002-single-entity-projections-return-simple-complexity.sdp.md deleted file mode 100644 index b0889e73..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-002-single-entity-projections-return-simple-complexity.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.single-entity-projections-return-simple-complexity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier ---- -# Single entity projections return simple complexity - -## Intent - -- outcome: Executable scenario: Single entity projections return simple complexity - -```gwt -Given the decision tree priority is global > saga > customer > entity -And projection characteristics with singleEntity true and all others false -When I call classifyProjection -Then the complexity should be "simple" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-003-single-entity-projections-include-rationale-about-stream-id.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-003-single-entity-projections-include-rationale-about-stream-id.sdp.md deleted file mode 100644 index 12b8550f..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-003-single-entity-projections-include-rationale-about-stream-id.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.single-entity-projections-include-rationale-about-stream-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier ---- -# Single entity projections include rationale about streamId - -## Intent - -- outcome: Executable scenario: Single entity projections include rationale about streamId - -```gwt -Given the decision tree priority is global > saga > customer > entity -And projection characteristics with singleEntity true and all others false -When I call classifyProjection -Then the rationale should contain "streamId" -And the rationale should contain "per-entity ordering" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-004-classification-defaults-to-entity-when-all-flags-are-false.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-004-classification-defaults-to-entity-when-all-flags-are-false.sdp.md deleted file mode 100644 index de792a2e..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-004-classification-defaults-to-entity-when-all-flags-are-false.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.classification-defaults-to-entity-when-all-flags-are-false -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier ---- -# Classification defaults to entity when all flags are false - -## Intent - -- outcome: Executable scenario: Classification defaults to entity when all flags are false - -```gwt -Given the decision tree priority is global > saga > customer > entity -And projection characteristics with all flags false -When I call classifyProjection -Then the strategy should be "entity" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-005-global-rollup-projections-recommend-global-strategy.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-005-global-rollup-projections-recommend-global-strategy.sdp.md deleted file mode 100644 index 6bc63cb9..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-005-global-rollup-projections-recommend-global-strategy.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.global-rollup-projections-recommend-global-strategy -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier ---- -# Global rollup projections recommend global strategy - -## Intent - -- outcome: Executable scenario: Global rollup projections recommend global strategy - -```gwt -Given the decision tree priority is global > saga > customer > entity -And projection characteristics with globalRollup true and singleEntity false -When I call classifyProjection -Then the strategy should be "global" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-006-global-rollup-projections-return-complex-complexity.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-006-global-rollup-projections-return-complex-complexity.sdp.md deleted file mode 100644 index 3edb3014..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-006-global-rollup-projections-return-complex-complexity.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.global-rollup-projections-return-complex-complexity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier ---- -# Global rollup projections return complex complexity - -## Intent - -- outcome: Executable scenario: Global rollup projections return complex complexity - -```gwt -Given the decision tree priority is global > saga > customer > entity -And projection characteristics with globalRollup true and singleEntity false -When I call classifyProjection -Then the complexity should be "complex" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-007-global-rollup-projections-include-rationale-about-occ-conflicts.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-007-global-rollup-projections-include-rationale-about-occ-conflicts.sdp.md deleted file mode 100644 index 78fcdf2b..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-007-global-rollup-projections-include-rationale-about-occ-conflicts.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.global-rollup-projections-include-rationale-about-occ-conflicts -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier ---- -# Global rollup projections include rationale about OCC conflicts - -## Intent - -- outcome: Executable scenario: Global rollup projections include rationale about OCC conflicts - -```gwt -Given the decision tree priority is global > saga > customer > entity -And projection characteristics with globalRollup true and singleEntity false -When I call classifyProjection -Then the rationale should contain "OCC conflicts" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-008-global-strategy-prioritizes-over-other-flags.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-008-global-strategy-prioritizes-over-other-flags.sdp.md deleted file mode 100644 index a6a54e9c..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-008-global-strategy-prioritizes-over-other-flags.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.global-strategy-prioritizes-over-other-flags -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier ---- -# Global strategy prioritizes over other flags - -## Intent - -- outcome: Executable scenario: Global strategy prioritizes over other flags - -```gwt -Given the decision tree priority is global > saga > customer > entity -And projection characteristics with all flags true -When I call classifyProjection -Then the strategy should be "global" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-009-cross-context-projections-recommend-saga-strategy.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-009-cross-context-projections-recommend-saga-strategy.sdp.md deleted file mode 100644 index 9d2e1160..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-009-cross-context-projections-recommend-saga-strategy.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.cross-context-projections-recommend-saga-strategy -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier ---- -# Cross-context projections recommend saga strategy - -## Intent - -- outcome: Executable scenario: Cross-context projections recommend saga strategy - -```gwt -Given the decision tree priority is global > saga > customer > entity -And projection characteristics with crossContext true and globalRollup false -When I call classifyProjection -Then the strategy should be "saga" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-010-cross-context-projections-return-complex-complexity.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-010-cross-context-projections-return-complex-complexity.sdp.md deleted file mode 100644 index 8ce75e06..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-010-cross-context-projections-return-complex-complexity.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.cross-context-projections-return-complex-complexity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier ---- -# Cross-context projections return complex complexity - -## Intent - -- outcome: Executable scenario: Cross-context projections return complex complexity - -```gwt -Given the decision tree priority is global > saga > customer > entity -And projection characteristics with crossContext true and globalRollup false -When I call classifyProjection -Then the complexity should be "complex" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-011-cross-context-projections-include-rationale-about-correlation-id.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-011-cross-context-projections-include-rationale-about-correlation-id.sdp.md deleted file mode 100644 index d13ad78f..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-011-cross-context-projections-include-rationale-about-correlation-id.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.cross-context-projections-include-rationale-about-correlation-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier ---- -# Cross-context projections include rationale about correlationId - -## Intent - -- outcome: Executable scenario: Cross-context projections include rationale about correlationId - -```gwt -Given the decision tree priority is global > saga > customer > entity -And projection characteristics with crossContext true and globalRollup false -When I call classifyProjection -Then the rationale should contain "correlationId" -And the rationale should contain "causal ordering" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-012-saga-strategy-prioritizes-over-customer-and-entity.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-012-saga-strategy-prioritizes-over-customer-and-entity.sdp.md deleted file mode 100644 index 5fe1b9a2..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-012-saga-strategy-prioritizes-over-customer-and-entity.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.saga-strategy-prioritizes-over-customer-and-entity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier ---- -# Saga strategy prioritizes over customer and entity - -## Intent - -- outcome: Executable scenario: Saga strategy prioritizes over customer and entity - -```gwt -Given the decision tree priority is global > saga > customer > entity -And projection characteristics with singleEntity true, customerScoped true, crossContext true, globalRollup false -When I call classifyProjection -Then the strategy should be "saga" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-013-customer-scoped-projections-recommend-customer-strategy.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-013-customer-scoped-projections-recommend-customer-strategy.sdp.md deleted file mode 100644 index 79991e6e..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-013-customer-scoped-projections-recommend-customer-strategy.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.customer-scoped-projections-recommend-customer-strategy -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier ---- -# Customer-scoped projections recommend customer strategy - -## Intent - -- outcome: Executable scenario: Customer-scoped projections recommend customer strategy - -```gwt -Given the decision tree priority is global > saga > customer > entity -And projection characteristics with customerScoped true and crossContext false and globalRollup false -When I call classifyProjection -Then the strategy should be "customer" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-014-customer-scoped-projections-return-moderate-complexity.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-014-customer-scoped-projections-return-moderate-complexity.sdp.md deleted file mode 100644 index 8c9ba2ce..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-014-customer-scoped-projections-return-moderate-complexity.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.customer-scoped-projections-return-moderate-complexity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier ---- -# Customer-scoped projections return moderate complexity - -## Intent - -- outcome: Executable scenario: Customer-scoped projections return moderate complexity - -```gwt -Given the decision tree priority is global > saga > customer > entity -And projection characteristics with customerScoped true and crossContext false and globalRollup false -When I call classifyProjection -Then the complexity should be "moderate" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-015-customer-scoped-projections-include-rationale-about-customer-id.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-015-customer-scoped-projections-include-rationale-about-customer-id.sdp.md deleted file mode 100644 index 6ae1645f..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-015-customer-scoped-projections-include-rationale-about-customer-id.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.customer-scoped-projections-include-rationale-about-customer-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier ---- -# Customer-scoped projections include rationale about customerId - -## Intent - -- outcome: Executable scenario: Customer-scoped projections include rationale about customerId - -```gwt -Given the decision tree priority is global > saga > customer > entity -And projection characteristics with customerScoped true and crossContext false and globalRollup false -When I call classifyProjection -Then the rationale should contain "customerId" -And the rationale should contain "per-customer ordering" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-016-customer-strategy-prioritizes-over-entity.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-016-customer-strategy-prioritizes-over-entity.sdp.md deleted file mode 100644 index f119b3c5..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-016-customer-strategy-prioritizes-over-entity.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.customer-strategy-prioritizes-over-entity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier ---- -# Customer strategy prioritizes over entity - -## Intent - -- outcome: Executable scenario: Customer strategy prioritizes over entity - -```gwt -Given the decision tree priority is global > saga > customer > entity -And projection characteristics with singleEntity true, customerScoped true, crossContext false, globalRollup false -When I call classifyProjection -Then the strategy should be "customer" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-017-decision-tree-follows-priority-global-saga-customer-entity.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-017-decision-tree-follows-priority-global-saga-customer-entity.sdp.md deleted file mode 100644 index 329f9651..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-017-decision-tree-follows-priority-global-saga-customer-entity.sdp.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.decision-tree-follows-priority-global-saga-customer-entity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier ---- -# Decision tree follows priority global ) saga ) customer ) entity - -## Intent - -- outcome: Executable scenario: Decision tree follows priority global ) saga ) customer ) entity - -```gwt -Given the decision tree priority is global > saga > customer > entity -And projection characteristics with all flags true -And projection characteristics with globalRollup false but all others true -And projection characteristics with globalRollup false, crossContext false, but customerScoped and singleEntity true -And projection characteristics with only singleEntity true -When the scenario runs -Then classifying should return strategy "global" -And classifying should return strategy "saga" -And classifying should return strategy "customer" -And classifying should return strategy "entity" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-018-strategy-parallelism-values.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-018-strategy-parallelism-values.sdp.md deleted file mode 100644 index c3c9ac3f..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-018-strategy-parallelism-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.strategy-parallelism-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier ---- -# Strategy parallelism values - -## Intent - -- outcome: Executable scenario: Strategy parallelism values - -```gwt -Given the decision tree priority is global > saga > customer > entity -When I access PARALLELISM_BY_STRATEGY for "value" -Then the parallelism should be value -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-019-get-recommended-parallelism-by-strategy.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-019-get-recommended-parallelism-by-strategy.sdp.md deleted file mode 100644 index 835dff80..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.examples/s-019-get-recommended-parallelism-by-strategy.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier.get-recommended-parallelism-by-strategy -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.complexity-classifier ---- -# Get recommended parallelism by strategy - -## Intent - -- outcome: Executable scenario: Get recommended parallelism by strategy - -```gwt -Given the decision tree priority is global > saga > customer > entity -When I call getRecommendedParallelism with "value" -Then the result should be value -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.sdp.md b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.sdp.md index 6ea8611c..4eed7269 100644 --- a/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/complexity-classifier.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.workpool-partitioning.complexity-classifier kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,4 +11,14 @@ relations: ## Intent - actor: a platform developer -- outcome: projections classified by complexity characteristics so that I can select appropriate partition strategies +- outcome: Classify projections by complexity characteristics so the matching partition strategy can be selected. +- value: Global, saga, customer, and entity recommendations stay ordered by one decision tree instead of ad hoc choice. + +## Behavior + +- rule: The classification decision tree priority is global, then saga, then customer, then entity. +- rule: Single-entity projections recommend entity strategy at simple complexity, with rationale about streamId and per-entity ordering. +- rule: Global-rollup projections recommend global strategy at complex complexity, with rationale about OCC conflicts. +- rule: Cross-context projections recommend saga strategy at complex complexity, with rationale about correlationId and causal ordering. +- rule: Customer-scoped projections recommend customer strategy at moderate complexity, with rationale about customerId and per-customer ordering. +- rule: PARALLELISM_BY_STRATEGY and getRecommendedParallelism map entity to 10, customer to 5, saga to 5, and global to 1. diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-001-global-partition-key-has-name-global.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-001-global-partition-key-has-name-global.sdp.md deleted file mode 100644 index 52560938..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-001-global-partition-key-has-name-global.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.global-partition-key-has-name-global -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# GLOBAL_PARTITION_KEY has name 'global' - -## Intent - -- outcome: Executable scenario: GLOBAL_PARTITION_KEY has name 'global' - -```gwt -Given the feature fixture is in place -When I access GLOBAL_PARTITION_KEY -Then the partition key name should be "global" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-002-global-partition-key-has-value-global.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-002-global-partition-key-has-value-global.sdp.md deleted file mode 100644 index ffacb4ff..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-002-global-partition-key-has-value-global.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.global-partition-key-has-value-global -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# GLOBAL_PARTITION_KEY has value 'global' - -## Intent - -- outcome: Executable scenario: GLOBAL_PARTITION_KEY has value 'global' - -```gwt -Given the feature fixture is in place -When I access GLOBAL_PARTITION_KEY -Then the partition key value should be "global" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-003-entity-partition-key-uses-stream-type-stream-id-format.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-003-entity-partition-key-uses-stream-type-stream-id-format.sdp.md deleted file mode 100644 index 1bea1de8..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-003-entity-partition-key-uses-stream-type-stream-id-format.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.entity-partition-key-uses-stream-type-stream-id-format -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# Entity partition key uses streamType:streamId format - -## Intent - -- outcome: Executable scenario: Entity partition key uses streamType:streamId format - -```gwt -Given a createEntityPartitionKey helper for streamType "Order" -When called with streamId "ord-123" -Then the partition key should be name "streamId" and value "Order:ord-123" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-004-entity-partition-key-prioritizes-stream-id-over-other-id-fields.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-004-entity-partition-key-prioritizes-stream-id-over-other-id-fields.sdp.md deleted file mode 100644 index c7c4eb89..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-004-entity-partition-key-prioritizes-stream-id-over-other-id-fields.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.entity-partition-key-prioritizes-stream-id-over-other-id-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# Entity partition key prioritizes streamId over other ID fields - -## Intent - -- outcome: Executable scenario: Entity partition key prioritizes streamId over other ID fields - -```gwt -Given a createEntityPartitionKey helper for streamType "Order" -When called with streamId "stream-123", orderId "ord-456", productId "prod-789" -Then the partition key should be name "streamId" and value "Order:stream-123" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-005-entity-partition-key-falls-back-to-alternate-id-fields.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-005-entity-partition-key-falls-back-to-alternate-id-fields.sdp.md deleted file mode 100644 index 04c18d7e..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-005-entity-partition-key-falls-back-to-alternate-id-fields.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.entity-partition-key-falls-back-to-alternate-id-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# Entity partition key falls back to alternate ID fields - -## Intent - -- outcome: Executable scenario: Entity partition key falls back to alternate ID fields - -```gwt -Given a createEntityPartitionKey helper for streamType "value" -When called with value "value" -Then the partition key should be name "streamId" and value "value" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-006-entity-partition-key-throws-when-no-id-field-provided.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-006-entity-partition-key-throws-when-no-id-field-provided.sdp.md deleted file mode 100644 index 9a9f6f19..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-006-entity-partition-key-throws-when-no-id-field-provided.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.entity-partition-key-throws-when-no-id-field-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# Entity partition key throws when no ID field provided - -## Intent - -- outcome: Executable scenario: Entity partition key throws when no ID field provided - -```gwt -Given a createEntityPartitionKey helper for streamType "Order" -When called with empty args -Then an error should be thrown with message containing "requires streamId, orderId, productId, or reservationId" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-007-entity-partition-key-includes-available-keys-in-error-message.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-007-entity-partition-key-includes-available-keys-in-error-message.sdp.md deleted file mode 100644 index 5725f511..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-007-entity-partition-key-includes-available-keys-in-error-message.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.entity-partition-key-includes-available-keys-in-error-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# Entity partition key includes available keys in error message - -## Intent - -- outcome: Executable scenario: Entity partition key includes available keys in error message - -```gwt -Given a createEntityPartitionKey helper for streamType "Order" -When called with customerId "cust-123" and someField "value" -Then an error should be thrown with message containing "Received args with keys:" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-008-entity-partition-key-uses-provided-stream-type-in-value.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-008-entity-partition-key-uses-provided-stream-type-in-value.sdp.md deleted file mode 100644 index 8a068d18..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-008-entity-partition-key-uses-provided-stream-type-in-value.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.entity-partition-key-uses-provided-stream-type-in-value -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# Entity partition key uses provided streamType in value - -## Intent - -- outcome: Executable scenario: Entity partition key uses provided streamType in value - -```gwt -Given a createEntityPartitionKey helper for streamType "value" -When called with value "value" -Then the partition key value should be "value" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-009-customer-partition-key-returns-customer-id.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-009-customer-partition-key-returns-customer-id.sdp.md deleted file mode 100644 index f2c20ec3..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-009-customer-partition-key-returns-customer-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.customer-partition-key-returns-customer-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# Customer partition key returns customerId - -## Intent - -- outcome: Executable scenario: Customer partition key returns customerId - -```gwt -Given a createCustomerPartitionKey helper -When called with customerId "cust-123" -Then the partition key should be name "customerId" and value "cust-123" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-010-customer-partition-key-ignores-additional-fields.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-010-customer-partition-key-ignores-additional-fields.sdp.md deleted file mode 100644 index 63f23bdc..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-010-customer-partition-key-ignores-additional-fields.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.customer-partition-key-ignores-additional-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# Customer partition key ignores additional fields - -## Intent - -- outcome: Executable scenario: Customer partition key ignores additional fields - -```gwt -Given a createCustomerPartitionKey helper -When called with customerId "cust-456", orderId "ord-789", someOtherField "value" -Then the partition key should be name "customerId" and value "cust-456" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-011-customer-partition-key-throws-when-customer-id-is-undefined.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-011-customer-partition-key-throws-when-customer-id-is-undefined.sdp.md deleted file mode 100644 index 09414f99..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-011-customer-partition-key-throws-when-customer-id-is-undefined.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.customer-partition-key-throws-when-customer-id-is-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# Customer partition key throws when customerId is undefined - -## Intent - -- outcome: Executable scenario: Customer partition key throws when customerId is undefined - -```gwt -Given a createCustomerPartitionKey helper -When called with customerId undefined -Then an error should be thrown with message containing "requires customerId field" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-012-customer-partition-key-throws-when-customer-id-is-missing.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-012-customer-partition-key-throws-when-customer-id-is-missing.sdp.md deleted file mode 100644 index 77db0457..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-012-customer-partition-key-throws-when-customer-id-is-missing.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.customer-partition-key-throws-when-customer-id-is-missing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# Customer partition key throws when customerId is missing - -## Intent - -- outcome: Executable scenario: Customer partition key throws when customerId is missing - -```gwt -Given a createCustomerPartitionKey helper -When called with customerId missing entirely -Then an error should be thrown with message containing "requires customerId field" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-013-customer-partition-key-throws-when-customer-id-is-empty-string.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-013-customer-partition-key-throws-when-customer-id-is-empty-string.sdp.md deleted file mode 100644 index d020c783..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-013-customer-partition-key-throws-when-customer-id-is-empty-string.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.customer-partition-key-throws-when-customer-id-is-empty-string -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# Customer partition key throws when customerId is empty string - -## Intent - -- outcome: Executable scenario: Customer partition key throws when customerId is empty string - -```gwt -Given a createCustomerPartitionKey helper -When called with customerId empty string -Then an error should be thrown with message containing "requires customerId field" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-014-saga-partition-key-returns-correlation-id.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-014-saga-partition-key-returns-correlation-id.sdp.md deleted file mode 100644 index d9c5e39f..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-014-saga-partition-key-returns-correlation-id.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.saga-partition-key-returns-correlation-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# Saga partition key returns correlationId - -## Intent - -- outcome: Executable scenario: Saga partition key returns correlationId - -```gwt -Given a createSagaPartitionKey helper -When called with correlationId "corr-123" -Then the partition key should be name "correlationId" and value "corr-123" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-015-saga-partition-key-ignores-additional-fields.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-015-saga-partition-key-ignores-additional-fields.sdp.md deleted file mode 100644 index 9202bd6e..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-015-saga-partition-key-ignores-additional-fields.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.saga-partition-key-ignores-additional-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# Saga partition key ignores additional fields - -## Intent - -- outcome: Executable scenario: Saga partition key ignores additional fields - -```gwt -Given a createSagaPartitionKey helper -When called with correlationId "corr-456", sagaId "saga-789", orderId "ord-101" -Then the partition key should be name "correlationId" and value "corr-456" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-016-saga-partition-key-throws-when-correlation-id-is-undefined.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-016-saga-partition-key-throws-when-correlation-id-is-undefined.sdp.md deleted file mode 100644 index 5916b0a9..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-016-saga-partition-key-throws-when-correlation-id-is-undefined.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.saga-partition-key-throws-when-correlation-id-is-undefined -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# Saga partition key throws when correlationId is undefined - -## Intent - -- outcome: Executable scenario: Saga partition key throws when correlationId is undefined - -```gwt -Given a createSagaPartitionKey helper -When called with correlationId undefined -Then an error should be thrown with message containing "requires correlationId field" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-017-saga-partition-key-throws-when-correlation-id-is-missing.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-017-saga-partition-key-throws-when-correlation-id-is-missing.sdp.md deleted file mode 100644 index 41190c25..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-017-saga-partition-key-throws-when-correlation-id-is-missing.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.saga-partition-key-throws-when-correlation-id-is-missing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# Saga partition key throws when correlationId is missing - -## Intent - -- outcome: Executable scenario: Saga partition key throws when correlationId is missing - -```gwt -Given a createSagaPartitionKey helper -When called with correlationId missing entirely -Then an error should be thrown with message containing "requires correlationId field" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-018-saga-partition-key-throws-when-correlation-id-is-empty-string.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-018-saga-partition-key-throws-when-correlation-id-is-empty-string.sdp.md deleted file mode 100644 index 174944ea..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-018-saga-partition-key-throws-when-correlation-id-is-empty-string.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.saga-partition-key-throws-when-correlation-id-is-empty-string -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# Saga partition key throws when correlationId is empty string - -## Intent - -- outcome: Executable scenario: Saga partition key throws when correlationId is empty string - -```gwt -Given a createSagaPartitionKey helper -When called with correlationId empty string -Then an error should be thrown with message containing "requires correlationId field" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-019-global-partition-key-returns-global-partition-key.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-019-global-partition-key-returns-global-partition-key.sdp.md deleted file mode 100644 index 8d59d976..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-019-global-partition-key-returns-global-partition-key.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.global-partition-key-returns-global-partition-key -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# Global partition key returns GLOBAL_PARTITION_KEY - -## Intent - -- outcome: Executable scenario: Global partition key returns GLOBAL_PARTITION_KEY - -```gwt -Given a createGlobalPartitionKey helper -When called with no arguments -Then the result should equal GLOBAL_PARTITION_KEY -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-020-global-partition-key-ignores-any-arguments.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-020-global-partition-key-ignores-any-arguments.sdp.md deleted file mode 100644 index 497accbd..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-020-global-partition-key-ignores-any-arguments.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.global-partition-key-ignores-any-arguments -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# Global partition key ignores any arguments - -## Intent - -- outcome: Executable scenario: Global partition key ignores any arguments - -```gwt -Given a createGlobalPartitionKey helper with type argument -When called with orderId "ord-123" -Then the result should equal GLOBAL_PARTITION_KEY -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-021-global-partition-key-returns-same-reference-on-multiple-calls.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-021-global-partition-key-returns-same-reference-on-multiple-calls.sdp.md deleted file mode 100644 index fcc24709..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-021-global-partition-key-returns-same-reference-on-multiple-calls.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.global-partition-key-returns-same-reference-on-multiple-calls -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# Global partition key returns same reference on multiple calls - -## Intent - -- outcome: Executable scenario: Global partition key returns same reference on multiple calls - -```gwt -Given a createGlobalPartitionKey helper -When called multiple times -Then all results should be the same reference as GLOBAL_PARTITION_KEY -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-022-dcb-partition-key-has-name-dcb.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-022-dcb-partition-key-has-name-dcb.sdp.md deleted file mode 100644 index bcfc2085..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-022-dcb-partition-key-has-name-dcb.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.dcb-partition-key-has-name-dcb -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# DCB partition key has name 'dcb' - -## Intent - -- outcome: Executable scenario: DCB partition key has name 'dcb' - -```gwt -Given the feature fixture is in place -When I call createDCBPartitionKey with scope key "tenant:T:entity:Order:ord-123" -Then the partition key name should be "dcb" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-023-dcb-partition-key-uses-scope-key-as-value.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-023-dcb-partition-key-uses-scope-key-as-value.sdp.md deleted file mode 100644 index f097ed43..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-023-dcb-partition-key-uses-scope-key-as-value.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.dcb-partition-key-uses-scope-key-as-value -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# DCB partition key uses scope key as value - -## Intent - -- outcome: Executable scenario: DCB partition key uses scope key as value - -```gwt -Given the feature fixture is in place -When I call createDCBPartitionKey with scope key "tenant:T:reservation:res-456" -Then the partition key value should be "tenant:T:reservation:res-456" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-024-dcb-partition-key-handles-various-scope-key-formats.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-024-dcb-partition-key-handles-various-scope-key-formats.sdp.md deleted file mode 100644 index c3ef5ade..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.examples/s-024-dcb-partition-key-handles-various-scope-key-formats.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers.dcb-partition-key-handles-various-scope-key-formats -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers ---- -# DCB partition key handles various scope key formats - -## Intent - -- outcome: Executable scenario: DCB partition key handles various scope key formats - -```gwt -Given the feature fixture is in place -When I call createDCBPartitionKey with scope key "value" -Then the partition key should be name "dcb" and value "value" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.sdp.md index 86693b10..05f9c80c 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-key-helpers.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.workpool-partitioning.partition-key-helpers kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,4 +11,14 @@ relations: ## Intent - actor: a platform developer -- outcome: standardized partition key helper functions so that I can ensure consistent partition key generation across projections +- outcome: Provide standardized partition key helpers so projections generate consistent keys. +- value: Entity, customer, saga, global, and DCB flows share one key format instead of ad hoc strings. + +## Behavior + +- rule: GLOBAL_PARTITION_KEY has name global and value global. +- rule: createEntityPartitionKey uses streamType:entityId, prefers streamId, and falls back to orderId, productId, or reservationId. +- rule: createCustomerPartitionKey returns name customerId and requires a nonempty customerId. +- rule: createSagaPartitionKey returns name correlationId and requires a nonempty correlationId. +- rule: createGlobalPartitionKey always returns GLOBAL_PARTITION_KEY. +- rule: createDCBPartitionKey returns name dcb and uses the given scope key as value. diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-001-valid-result-for-config-with-get-partition-key.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-001-valid-result-for-config-with-get-partition-key.sdp.md deleted file mode 100644 index a5073b88..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-001-valid-result-for-config-with-get-partition-key.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.valid-result-for-config-with-get-partition-key -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Valid result for config with getPartitionKey - -## Intent - -- outcome: Executable scenario: Valid result for config with getPartitionKey - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And a command config for "CreateOrder" with projection "orderSummary" using createEntityPartitionKey -When I call validateCommandConfigPartitions -Then the result should be valid -And there should be 0 errors -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-002-valid-result-for-inline-partition-key-function.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-002-valid-result-for-inline-partition-key-function.sdp.md deleted file mode 100644 index c300676b..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-002-valid-result-for-inline-partition-key-function.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.valid-result-for-inline-partition-key-function -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Valid result for inline partition key function - -## Intent - -- outcome: Executable scenario: Valid result for inline partition key function - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And a command config for "CreateOrder" with projection "orderSummary" using inline function -When I call validateCommandConfigPartitions -Then the result should be valid -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-003-validates-secondary-projections-with-get-partition-key.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-003-validates-secondary-projections-with-get-partition-key.sdp.md deleted file mode 100644 index 94760219..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-003-validates-secondary-projections-with-get-partition-key.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.validates-secondary-projections-with-get-partition-key -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Validates secondary projections with getPartitionKey - -## Intent - -- outcome: Executable scenario: Validates secondary projections with getPartitionKey - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And a command config with primary projection with getPartitionKey -And secondary projections with getPartitionKey -When I call validateCommandConfigPartitions -Then the result should be valid -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-004-validates-failed-projection-with-get-partition-key.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-004-validates-failed-projection-with-get-partition-key.sdp.md deleted file mode 100644 index 97af7e51..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-004-validates-failed-projection-with-get-partition-key.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.validates-failed-projection-with-get-partition-key -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Validates failed projection with getPartitionKey - -## Intent - -- outcome: Executable scenario: Validates failed projection with getPartitionKey - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And a command config with primary projection with getPartitionKey -And failed projection with getPartitionKey -When I call validateCommandConfigPartitions -Then the result should be valid -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-005-returns-missing-partition-key-error-for-missing-get-partition-key.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-005-returns-missing-partition-key-error-for-missing-get-partition-key.sdp.md deleted file mode 100644 index be880424..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-005-returns-missing-partition-key-error-for-missing-get-partition-key.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.returns-missing-partition-key-error-for-missing-get-partition-key -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Returns MISSING_PARTITION_KEY error for missing getPartitionKey - -## Intent - -- outcome: Executable scenario: Returns MISSING_PARTITION_KEY error for missing getPartitionKey - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And a command config for "CreateOrder" with projection "orderSummary" missing getPartitionKey -When I call validateCommandConfigPartitions -Then the result should be invalid -And there should be 1 error -And the error code should be "MISSING_PARTITION_KEY" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-006-includes-projection-name-in-error.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-006-includes-projection-name-in-error.sdp.md deleted file mode 100644 index 985010fc..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-006-includes-projection-name-in-error.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.includes-projection-name-in-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Includes projection name in error - -## Intent - -- outcome: Executable scenario: Includes projection name in error - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And a command config for "CreateOrder" with projection "orderSummary" missing getPartitionKey -When I call validateCommandConfigPartitions -Then the error projectionName should be "orderSummary" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-007-includes-config-path-in-error.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-007-includes-config-path-in-error.sdp.md deleted file mode 100644 index 040e1045..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-007-includes-config-path-in-error.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.includes-config-path-in-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Includes config path in error - -## Intent - -- outcome: Executable scenario: Includes config path in error - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And a command config for "CreateOrder" with projection "orderSummary" missing getPartitionKey -When I call validateCommandConfigPartitions -Then the error configPath should be "CreateOrder.projection" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-008-suggests-helper-functions-in-error-message.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-008-suggests-helper-functions-in-error-message.sdp.md deleted file mode 100644 index 80c17573..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-008-suggests-helper-functions-in-error-message.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.suggests-helper-functions-in-error-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Suggests helper functions in error message - -## Intent - -- outcome: Executable scenario: Suggests helper functions in error message - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And a command config for "CreateOrder" with projection "orderSummary" missing getPartitionKey -When I call validateCommandConfigPartitions -Then the error message should contain "createEntityPartitionKey" -And the error message should contain "createCustomerPartitionKey" -And the error message should contain "createSagaPartitionKey" -And the error message should contain "GLOBAL_PARTITION_KEY" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-009-returns-invalid-partition-key-shape-when-returning-null.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-009-returns-invalid-partition-key-shape-when-returning-null.sdp.md deleted file mode 100644 index 2de569d7..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-009-returns-invalid-partition-key-shape-when-returning-null.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.returns-invalid-partition-key-shape-when-returning-null -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Returns INVALID_PARTITION_KEY_SHAPE when returning null - -## Intent - -- outcome: Executable scenario: Returns INVALID_PARTITION_KEY_SHAPE when returning null - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And a command config with getPartitionKey returning null -When I call validateCommandConfigPartitions -Then the result should be invalid -And the error code should be "INVALID_PARTITION_KEY_SHAPE" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-010-returns-invalid-partition-key-shape-when-returning-wrong-type.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-010-returns-invalid-partition-key-shape-when-returning-wrong-type.sdp.md deleted file mode 100644 index 3260f7d0..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-010-returns-invalid-partition-key-shape-when-returning-wrong-type.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.returns-invalid-partition-key-shape-when-returning-wrong-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Returns INVALID_PARTITION_KEY_SHAPE when returning wrong type - -## Intent - -- outcome: Executable scenario: Returns INVALID_PARTITION_KEY_SHAPE when returning wrong type - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And a command config with getPartitionKey returning a string -When I call validateCommandConfigPartitions -Then the result should be invalid -And the error code should be "INVALID_PARTITION_KEY_SHAPE" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-011-returns-invalid-partition-key-shape-when-missing-name.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-011-returns-invalid-partition-key-shape-when-missing-name.sdp.md deleted file mode 100644 index c5723602..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-011-returns-invalid-partition-key-shape-when-missing-name.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.returns-invalid-partition-key-shape-when-missing-name -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Returns INVALID_PARTITION_KEY_SHAPE when missing name - -## Intent - -- outcome: Executable scenario: Returns INVALID_PARTITION_KEY_SHAPE when missing name - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And a command config with getPartitionKey returning object with only value -When I call validateCommandConfigPartitions -Then the result should be invalid -And the error code should be "INVALID_PARTITION_KEY_SHAPE" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-012-returns-invalid-partition-key-shape-when-missing-value.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-012-returns-invalid-partition-key-shape-when-missing-value.sdp.md deleted file mode 100644 index e3a3b03f..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-012-returns-invalid-partition-key-shape-when-missing-value.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.returns-invalid-partition-key-shape-when-missing-value -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Returns INVALID_PARTITION_KEY_SHAPE when missing value - -## Intent - -- outcome: Executable scenario: Returns INVALID_PARTITION_KEY_SHAPE when missing value - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And a command config with getPartitionKey returning object with only name -When I call validateCommandConfigPartitions -Then the result should be invalid -And the error code should be "INVALID_PARTITION_KEY_SHAPE" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-013-returns-invalid-partition-key-shape-when-value-is-number.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-013-returns-invalid-partition-key-shape-when-value-is-number.sdp.md deleted file mode 100644 index a6953740..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-013-returns-invalid-partition-key-shape-when-value-is-number.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.returns-invalid-partition-key-shape-when-value-is-number -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Returns INVALID_PARTITION_KEY_SHAPE when value is number - -## Intent - -- outcome: Executable scenario: Returns INVALID_PARTITION_KEY_SHAPE when value is number - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And a command config with getPartitionKey returning value as number -When I call validateCommandConfigPartitions -Then the result should be invalid -And the error code should be "INVALID_PARTITION_KEY_SHAPE" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-014-returns-empty-partition-value-for-empty-string.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-014-returns-empty-partition-value-for-empty-string.sdp.md deleted file mode 100644 index 9e45f903..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-014-returns-empty-partition-value-for-empty-string.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.returns-empty-partition-value-for-empty-string -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Returns EMPTY_PARTITION_VALUE for empty string - -## Intent - -- outcome: Executable scenario: Returns EMPTY_PARTITION_VALUE for empty string - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And a command config with getPartitionKey returning empty string value -When I call validateCommandConfigPartitions -Then the result should be invalid -And the error code should be "EMPTY_PARTITION_VALUE" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-015-returns-empty-partition-value-for-whitespace-only-string.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-015-returns-empty-partition-value-for-whitespace-only-string.sdp.md deleted file mode 100644 index e84dd390..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-015-returns-empty-partition-value-for-whitespace-only-string.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.returns-empty-partition-value-for-whitespace-only-string -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Returns EMPTY_PARTITION_VALUE for whitespace-only string - -## Intent - -- outcome: Executable scenario: Returns EMPTY_PARTITION_VALUE for whitespace-only string - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And a command config with getPartitionKey returning whitespace-only value -When I call validateCommandConfigPartitions -Then the result should be invalid -And the error code should be "EMPTY_PARTITION_VALUE" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-016-collects-errors-from-all-projections.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-016-collects-errors-from-all-projections.sdp.md deleted file mode 100644 index c8a91f38..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-016-collects-errors-from-all-projections.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.collects-errors-from-all-projections -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Collects errors from all projections - -## Intent - -- outcome: Executable scenario: Collects errors from all projections - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And a command config with all projections missing getPartitionKey -When I call validateCommandConfigPartitions -Then there should be 3 errors -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-017-reports-correct-config-paths-for-secondary-projections.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-017-reports-correct-config-paths-for-secondary-projections.sdp.md deleted file mode 100644 index 2e8fe1c5..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-017-reports-correct-config-paths-for-secondary-projections.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.reports-correct-config-paths-for-secondary-projections -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Reports correct config paths for secondary projections - -## Intent - -- outcome: Executable scenario: Reports correct config paths for secondary projections - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And a command config with valid primary projection -And 2 secondary projections missing getPartitionKey -When I call validateCommandConfigPartitions -Then error 0 configPath should be "CreateOrder.secondaryProjections[0]" -And error 1 configPath should be "CreateOrder.secondaryProjections[1]" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-018-reports-correct-config-path-for-failed-projection.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-018-reports-correct-config-path-for-failed-projection.sdp.md deleted file mode 100644 index a4252db4..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-018-reports-correct-config-path-for-failed-projection.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.reports-correct-config-path-for-failed-projection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Reports correct config path for failed projection - -## Intent - -- outcome: Executable scenario: Reports correct config path for failed projection - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And a command config with valid primary projection -And failed projection missing getPartitionKey -When I call validateCommandConfigPartitions -Then the error configPath should be "CreateOrder.failedProjection" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-019-does-not-throw-for-valid-configs-array.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-019-does-not-throw-for-valid-configs-array.sdp.md deleted file mode 100644 index 8ca6aa1a..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-019-does-not-throw-for-valid-configs-array.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.does-not-throw-for-valid-configs-array -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Does not throw for valid configs array - -## Intent - -- outcome: Executable scenario: Does not throw for valid configs array - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And an array of valid command configs -When I call assertValidPartitionKeys -Then no error should be thrown -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-020-does-not-throw-for-empty-array.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-020-does-not-throw-for-empty-array.sdp.md deleted file mode 100644 index 5007e29f..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-020-does-not-throw-for-empty-array.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.does-not-throw-for-empty-array -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Does not throw for empty array - -## Intent - -- outcome: Executable scenario: Does not throw for empty array - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And an empty array of command configs -When I call assertValidPartitionKeys -Then no error should be thrown -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-021-throws-on-first-invalid-config.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-021-throws-on-first-invalid-config.sdp.md deleted file mode 100644 index 0c09e25e..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-021-throws-on-first-invalid-config.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.throws-on-first-invalid-config -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Throws on first invalid config - -## Intent - -- outcome: Executable scenario: Throws on first invalid config - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And an array with one invalid command config -When I call assertValidPartitionKeys -Then an error should be thrown with message containing "Partition key validation failed" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-022-includes-all-errors-in-thrown-message.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-022-includes-all-errors-in-thrown-message.sdp.md deleted file mode 100644 index ac7efa9a..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-022-includes-all-errors-in-thrown-message.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.includes-all-errors-in-thrown-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Includes all errors in thrown message - -## Intent - -- outcome: Executable scenario: Includes all errors in thrown message - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And an array with 2 invalid command configs -When I call assertValidPartitionKeys -Then an error should be thrown with message containing "2 projection(s)" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-023-includes-error-codes-in-thrown-message.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-023-includes-error-codes-in-thrown-message.sdp.md deleted file mode 100644 index 3f215694..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-023-includes-error-codes-in-thrown-message.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.includes-error-codes-in-thrown-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Includes error codes in thrown message - -## Intent - -- outcome: Executable scenario: Includes error codes in thrown message - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And an array with one config missing getPartitionKey -When I call assertValidPartitionKeys -Then an error should be thrown with message containing "MISSING_PARTITION_KEY" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-024-includes-config-path-in-thrown-message.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-024-includes-config-path-in-thrown-message.sdp.md deleted file mode 100644 index 69cecaf3..00000000 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.examples/s-024-includes-config-path-in-thrown-message.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-core.workpool-partitioning.partition-validation.includes-config-path-in-thrown-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-core.workpool-partitioning.partition-validation ---- -# Includes config path in thrown message - -## Intent - -- outcome: Executable scenario: Includes config path in thrown message - -```gwt -Given the validation error codes MISSING_PARTITION_KEY, INVALID_PARTITION_KEY_SHAPE, EMPTY_PARTITION_VALUE -And an array with one config for "CreateOrder" missing getPartitionKey on primary projection -When I call assertValidPartitionKeys -Then an error should be thrown with message containing "CreateOrder.projection" -``` diff --git a/specs/behavior/platform-core/workpool-partitioning/partition-validation.sdp.md b/specs/behavior/platform-core/workpool-partitioning/partition-validation.sdp.md index 52d92d9e..29d7dfde 100644 --- a/specs/behavior/platform-core/workpool-partitioning/partition-validation.sdp.md +++ b/specs/behavior/platform-core/workpool-partitioning/partition-validation.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-core.workpool-partitioning.partition-validation kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-core --- @@ -11,4 +11,13 @@ relations: ## Intent - actor: a platform developer -- outcome: command configs validated for partition keys so that missing or invalid partition keys are caught at startup +- outcome: Validate command configs for partition keys so missing or invalid keys fail at startup. +- value: Startup rejects implicit partition keys before they can disorder Workpool processing. + +## Behavior + +- rule: Every projection config must have getPartitionKey defined. +- rule: Partition key functions must return a { name, value } object whose value is a nonempty string. +- rule: Missing keys report MISSING_PARTITION_KEY, bad shapes report INVALID_PARTITION_KEY_SHAPE, and empty values report EMPTY_PARTITION_VALUE. +- rule: Validation collects errors from all projections, including secondary and failed projections. +- rule: assertValidPartitionKeys does not throw for valid or empty arrays and throws one comprehensive error for invalid configs. diff --git a/specs/behavior/platform-decider/_epic.sdp.md b/specs/behavior/platform-decider/_epic.sdp.md index 99503486..0e503e4d 100644 --- a/specs/behavior/platform-decider/_epic.sdp.md +++ b/specs/behavior/platform-decider/_epic.sdp.md @@ -9,4 +9,5 @@ relations: {} ## Intent -- outcome: Hold the executable Gherkin behavior Specs migrated from the platform-decider test corpus. +- outcome: Capture the executable behavior of the platform-decider package. +- value: Decider output helpers and type guards stay traceable as one family of Specs. diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-001-success-creates-output-with-correct-status.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-001-success-creates-output-with-correct-status.sdp.md deleted file mode 100644 index fd471742..00000000 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-001-success-creates-output-with-correct-status.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.platform-decider.decider-outputs.success-creates-output-with-correct-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-decider.decider-outputs ---- -# success() creates output with correct status - -## Intent - -- outcome: Executable scenario: success() creates output with correct status - -```gwt -Given test event types are defined -And test data types are defined -And test state update types are defined -When creating a success output -Then the output status should be "success" -And the output data should have result "ok" -And the output event should have type "TestEvent" -And the output event payload should have testId "123" -And the output stateUpdate should have status "completed" -``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-002-success-includes-all-required-properties.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-002-success-includes-all-required-properties.sdp.md deleted file mode 100644 index 04ee8118..00000000 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-002-success-includes-all-required-properties.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-decider.decider-outputs.success-includes-all-required-properties -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-decider.decider-outputs ---- -# success() includes all required properties - -## Intent - -- outcome: Executable scenario: success() includes all required properties - -```gwt -Given test event types are defined -And test data types are defined -And test state update types are defined -When creating a minimal success output -Then the output should have all required properties: -``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-003-rejected-creates-output-with-code-and-message.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-003-rejected-creates-output-with-code-and-message.sdp.md deleted file mode 100644 index 38a01243..00000000 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-003-rejected-creates-output-with-code-and-message.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:behavior.platform-decider.decider-outputs.rejected-creates-output-with-code-and-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-decider.decider-outputs ---- -# rejected() creates output with code and message - -## Intent - -- outcome: Executable scenario: rejected() creates output with code and message - -```gwt -Given test event types are defined -And test data types are defined -And test state update types are defined -When creating a rejected output with code "TEST_ERROR" and message "Something went wrong" -Then the output status should be "rejected" -And the output code should be "TEST_ERROR" -And the output message should be "Something went wrong" -And the output context should be undefined -``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-004-rejected-includes-context-when-provided.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-004-rejected-includes-context-when-provided.sdp.md deleted file mode 100644 index 99ae5399..00000000 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-004-rejected-includes-context-when-provided.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-decider.decider-outputs.rejected-includes-context-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-decider.decider-outputs ---- -# rejected() includes context when provided - -## Intent - -- outcome: Executable scenario: rejected() includes context when provided - -```gwt -Given test event types are defined -And test data types are defined -And test state update types are defined -When creating a rejected output with code "TEST_ERROR" and message "Something went wrong" and detail "extra info" -Then the output status should be "rejected" -And the output context should have detail "extra info" -``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-005-failed-creates-output-with-reason-and-event.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-005-failed-creates-output-with-reason-and-event.sdp.md deleted file mode 100644 index d47de35c..00000000 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-005-failed-creates-output-with-reason-and-event.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.platform-decider.decider-outputs.failed-creates-output-with-reason-and-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-decider.decider-outputs ---- -# failed() creates output with reason and event - -## Intent - -- outcome: Executable scenario: failed() creates output with reason and event - -```gwt -Given test event types are defined -And test data types are defined -And test state update types are defined -When creating a failed output with reason "Operation failed" and eventType "TestEvent" and testId "456" -Then the output status should be "failed" -And the output reason should be "Operation failed" -And the output event should have type "TestEvent" -And the output event payload should have testId "456" -And the output context should be undefined -``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-006-failed-includes-context-when-provided.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-006-failed-includes-context-when-provided.sdp.md deleted file mode 100644 index d48eaa3e..00000000 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-006-failed-includes-context-when-provided.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-decider.decider-outputs.failed-includes-context-when-provided -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-decider.decider-outputs ---- -# failed() includes context when provided - -## Intent - -- outcome: Executable scenario: failed() includes context when provided - -```gwt -Given test event types are defined -And test data types are defined -And test state update types are defined -When creating a failed output with reason "Operation failed" and attemptNumber 3 -Then the output status should be "failed" -And the output context should have attemptNumber 3 -``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-007-is-success-returns-true-for-success-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-007-is-success-returns-true-for-success-output.sdp.md deleted file mode 100644 index a6c55653..00000000 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-007-is-success-returns-true-for-success-output.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-decider.decider-outputs.is-success-returns-true-for-success-output -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-decider.decider-outputs ---- -# isSuccess() returns true for success output - -## Intent - -- outcome: Executable scenario: isSuccess() returns true for success output - -```gwt -Given test event types are defined -And test data types are defined -And test state update types are defined -And a success output is created -When checking isSuccess on the output -Then the type guard should return true -``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-008-is-success-returns-false-for-rejected-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-008-is-success-returns-false-for-rejected-output.sdp.md deleted file mode 100644 index c8f61fe8..00000000 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-008-is-success-returns-false-for-rejected-output.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-decider.decider-outputs.is-success-returns-false-for-rejected-output -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-decider.decider-outputs ---- -# isSuccess() returns false for rejected output - -## Intent - -- outcome: Executable scenario: isSuccess() returns false for rejected output - -```gwt -Given test event types are defined -And test data types are defined -And test state update types are defined -And a rejected output is created -When checking isSuccess on the output -Then the type guard should return false -``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-009-is-success-returns-false-for-failed-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-009-is-success-returns-false-for-failed-output.sdp.md deleted file mode 100644 index 750adbc9..00000000 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-009-is-success-returns-false-for-failed-output.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-decider.decider-outputs.is-success-returns-false-for-failed-output -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-decider.decider-outputs ---- -# isSuccess() returns false for failed output - -## Intent - -- outcome: Executable scenario: isSuccess() returns false for failed output - -```gwt -Given test event types are defined -And test data types are defined -And test state update types are defined -And a failed output is created -When checking isSuccess on the output -Then the type guard should return false -``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-010-is-success-enables-type-narrowing.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-010-is-success-enables-type-narrowing.sdp.md deleted file mode 100644 index 7e0f06c6..00000000 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-010-is-success-enables-type-narrowing.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-decider.decider-outputs.is-success-enables-type-narrowing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-decider.decider-outputs ---- -# isSuccess() enables type narrowing - -## Intent - -- outcome: Executable scenario: isSuccess() enables type narrowing - -```gwt -Given test event types are defined -And test data types are defined -And test state update types are defined -And a success output is created -When checking isSuccess on the output -Then the output data property should be accessible -``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-011-is-rejected-returns-true-for-rejected-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-011-is-rejected-returns-true-for-rejected-output.sdp.md deleted file mode 100644 index f42d6d11..00000000 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-011-is-rejected-returns-true-for-rejected-output.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-decider.decider-outputs.is-rejected-returns-true-for-rejected-output -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-decider.decider-outputs ---- -# isRejected() returns true for rejected output - -## Intent - -- outcome: Executable scenario: isRejected() returns true for rejected output - -```gwt -Given test event types are defined -And test data types are defined -And test state update types are defined -And a rejected output is created -When checking isRejected on the output -Then the type guard should return true -``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-012-is-rejected-returns-false-for-success-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-012-is-rejected-returns-false-for-success-output.sdp.md deleted file mode 100644 index 5714fd9b..00000000 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-012-is-rejected-returns-false-for-success-output.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-decider.decider-outputs.is-rejected-returns-false-for-success-output -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-decider.decider-outputs ---- -# isRejected() returns false for success output - -## Intent - -- outcome: Executable scenario: isRejected() returns false for success output - -```gwt -Given test event types are defined -And test data types are defined -And test state update types are defined -And a success output is created -When checking isRejected on the output -Then the type guard should return false -``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-013-is-rejected-returns-false-for-failed-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-013-is-rejected-returns-false-for-failed-output.sdp.md deleted file mode 100644 index a57b5fff..00000000 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-013-is-rejected-returns-false-for-failed-output.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-decider.decider-outputs.is-rejected-returns-false-for-failed-output -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-decider.decider-outputs ---- -# isRejected() returns false for failed output - -## Intent - -- outcome: Executable scenario: isRejected() returns false for failed output - -```gwt -Given test event types are defined -And test data types are defined -And test state update types are defined -And a failed output is created -When checking isRejected on the output -Then the type guard should return false -``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-014-is-rejected-enables-type-narrowing.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-014-is-rejected-enables-type-narrowing.sdp.md deleted file mode 100644 index d60867ec..00000000 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-014-is-rejected-enables-type-narrowing.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-decider.decider-outputs.is-rejected-enables-type-narrowing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-decider.decider-outputs ---- -# isRejected() enables type narrowing - -## Intent - -- outcome: Executable scenario: isRejected() enables type narrowing - -```gwt -Given test event types are defined -And test data types are defined -And test state update types are defined -And a rejected output is created -When checking isRejected on the output -Then the output code property should be accessible -``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-015-is-failed-returns-true-for-failed-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-015-is-failed-returns-true-for-failed-output.sdp.md deleted file mode 100644 index b78a5418..00000000 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-015-is-failed-returns-true-for-failed-output.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-decider.decider-outputs.is-failed-returns-true-for-failed-output -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-decider.decider-outputs ---- -# isFailed() returns true for failed output - -## Intent - -- outcome: Executable scenario: isFailed() returns true for failed output - -```gwt -Given test event types are defined -And test data types are defined -And test state update types are defined -And a failed output is created -When checking isFailed on the output -Then the type guard should return true -``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-016-is-failed-returns-false-for-success-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-016-is-failed-returns-false-for-success-output.sdp.md deleted file mode 100644 index cf26af4e..00000000 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-016-is-failed-returns-false-for-success-output.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-decider.decider-outputs.is-failed-returns-false-for-success-output -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-decider.decider-outputs ---- -# isFailed() returns false for success output - -## Intent - -- outcome: Executable scenario: isFailed() returns false for success output - -```gwt -Given test event types are defined -And test data types are defined -And test state update types are defined -And a success output is created -When checking isFailed on the output -Then the type guard should return false -``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-017-is-failed-returns-false-for-rejected-output.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-017-is-failed-returns-false-for-rejected-output.sdp.md deleted file mode 100644 index bacc474c..00000000 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-017-is-failed-returns-false-for-rejected-output.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-decider.decider-outputs.is-failed-returns-false-for-rejected-output -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-decider.decider-outputs ---- -# isFailed() returns false for rejected output - -## Intent - -- outcome: Executable scenario: isFailed() returns false for rejected output - -```gwt -Given test event types are defined -And test data types are defined -And test state update types are defined -And a rejected output is created -When checking isFailed on the output -Then the type guard should return false -``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-018-is-failed-enables-type-narrowing.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-018-is-failed-enables-type-narrowing.sdp.md deleted file mode 100644 index ace14f67..00000000 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-018-is-failed-enables-type-narrowing.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-decider.decider-outputs.is-failed-enables-type-narrowing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-decider.decider-outputs ---- -# isFailed() enables type narrowing - -## Intent - -- outcome: Executable scenario: isFailed() enables type narrowing - -```gwt -Given test event types are defined -And test data types are defined -And test state update types are defined -And a failed output is created -When checking isFailed on the output -Then the output reason property should be accessible -``` diff --git a/specs/behavior/platform-decider/decider-outputs.examples/s-019-type-guards-are-mutually-exclusive.sdp.md b/specs/behavior/platform-decider/decider-outputs.examples/s-019-type-guards-are-mutually-exclusive.sdp.md deleted file mode 100644 index 97350c6f..00000000 --- a/specs/behavior/platform-decider/decider-outputs.examples/s-019-type-guards-are-mutually-exclusive.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-decider.decider-outputs.type-guards-are-mutually-exclusive -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-decider.decider-outputs ---- -# Type guards are mutually exclusive - -## Intent - -- outcome: Executable scenario: Type guards are mutually exclusive - -```gwt -Given test event types are defined -And test data types are defined -And test state update types are defined -And a "value" output is created -When the scenario runs -Then exactly one type guard should return true -``` diff --git a/specs/behavior/platform-decider/decider-outputs.sdp.md b/specs/behavior/platform-decider/decider-outputs.sdp.md index 8a92aef7..49ca20b7 100644 --- a/specs/behavior/platform-decider/decider-outputs.sdp.md +++ b/specs/behavior/platform-decider/decider-outputs.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-decider.decider-outputs kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-decider --- @@ -10,4 +10,10 @@ relations: ## Intent -- outcome: Decider Output Helpers and Type Guards +- outcome: Encode command outcomes as success, rejected, or failed outputs that helpers construct and type guards can narrow. +- value: Domain logic can return a discriminated union without calling infrastructure. + +## Behavior + +- rule: DeciderOutput encodes three outcomes: success emits an event and updates state, rejected is a business-rule violation with a code and no event, and failed is an unexpected failure with an audit event and preserved context. +- rule: Helper functions create these outputs, and type guards enable safe narrowing. diff --git a/specs/behavior/platform-fsm/_epic.sdp.md b/specs/behavior/platform-fsm/_epic.sdp.md index 58148f5e..636461b8 100644 --- a/specs/behavior/platform-fsm/_epic.sdp.md +++ b/specs/behavior/platform-fsm/_epic.sdp.md @@ -9,4 +9,5 @@ relations: {} ## Intent -- outcome: Hold the executable Gherkin behavior Specs migrated from the platform-fsm test corpus. +- outcome: Give aggregates explicit typed FSM definitions that prevent invalid state transitions at runtime and report the allowed targets. +- value: Domain workflows can enforce progressions such as draft to submitted to confirmed without embedding transition tables in handlers. diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md deleted file mode 100644 index cc57c06e..00000000 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-001-fsm-is-created-with-correct-initial-state.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-fsm.fsm-transitions.fsm-is-created-with-correct-initial-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-fsm.fsm-transitions ---- -# FSM is created with correct initial state - -## Intent - -- outcome: Executable scenario: FSM is created with correct initial state - -```gwt -Given a test FSM with states: draft, submitted, confirmed, cancelled -And initial state is "draft" -And transitions are defined as: -When the FSM is defined -Then the initial state should be "draft" -And the FSM definition should be accessible -``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-002-valid-transitions-are-allowed.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-002-valid-transitions-are-allowed.sdp.md deleted file mode 100644 index c8902f2a..00000000 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-002-valid-transitions-are-allowed.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-fsm.fsm-transitions.valid-transitions-are-allowed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-fsm.fsm-transitions ---- -# Valid transitions are allowed - -## Intent - -- outcome: Executable scenario: Valid transitions are allowed - -```gwt -Given a test FSM with states: draft, submitted, confirmed, cancelled -And initial state is "draft" -And transitions are defined as: -When checking if transition from "value" to "value" is valid -Then canTransition should return true -``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-003-assert-transition-does-not-throw-for-valid-transitions.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-003-assert-transition-does-not-throw-for-valid-transitions.sdp.md deleted file mode 100644 index de230cdc..00000000 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-003-assert-transition-does-not-throw-for-valid-transitions.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-fsm.fsm-transitions.assert-transition-does-not-throw-for-valid-transitions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-fsm.fsm-transitions ---- -# assertTransition does not throw for valid transitions - -## Intent - -- outcome: Executable scenario: assertTransition does not throw for valid transitions - -```gwt -Given a test FSM with states: draft, submitted, confirmed, cancelled -And initial state is "draft" -And transitions are defined as: -When asserting transition from "value" to "value" -Then no error should be thrown -``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-004-invalid-transitions-are-detected.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-004-invalid-transitions-are-detected.sdp.md deleted file mode 100644 index 45e116f2..00000000 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-004-invalid-transitions-are-detected.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-fsm.fsm-transitions.invalid-transitions-are-detected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-fsm.fsm-transitions ---- -# Invalid transitions are detected - -## Intent - -- outcome: Executable scenario: Invalid transitions are detected - -```gwt -Given a test FSM with states: draft, submitted, confirmed, cancelled -And initial state is "draft" -And transitions are defined as: -When checking if transition from "value" to "value" is valid -Then canTransition should return false -``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-005-assert-transition-throws-fsm-transition-error-for-invalid-transitions.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-005-assert-transition-throws-fsm-transition-error-for-invalid-transitions.sdp.md deleted file mode 100644 index db95bc97..00000000 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-005-assert-transition-throws-fsm-transition-error-for-invalid-transitions.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:behavior.platform-fsm.fsm-transitions.assert-transition-throws-fsm-transition-error-for-invalid-transitions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-fsm.fsm-transitions ---- -# assertTransition throws FSMTransitionError for invalid transitions - -## Intent - -- outcome: Executable scenario: assertTransition throws FSMTransitionError for invalid transitions - -```gwt -Given a test FSM with states: draft, submitted, confirmed, cancelled -And initial state is "draft" -And transitions are defined as: -When asserting transition from "draft" to "confirmed" -Then an FSMTransitionError should be thrown -And the error should have from state "draft" -And the error should have to state "confirmed" -And the error should have valid transitions "submitted, cancelled" -And the error code should be "FSM_INVALID_TRANSITION" -``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-006-terminal-states-are-correctly-identified.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-006-terminal-states-are-correctly-identified.sdp.md deleted file mode 100644 index 9a1e42eb..00000000 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-006-terminal-states-are-correctly-identified.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-fsm.fsm-transitions.terminal-states-are-correctly-identified -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-fsm.fsm-transitions ---- -# Terminal states are correctly identified - -## Intent - -- outcome: Executable scenario: Terminal states are correctly identified - -```gwt -Given a test FSM with states: draft, submitted, confirmed, cancelled -And initial state is "draft" -And transitions are defined as: -When checking if "value" is terminal -Then isTerminal should return "value" -``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-007-terminal-state-error-message-indicates-no-valid-transitions.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-007-terminal-state-error-message-indicates-no-valid-transitions.sdp.md deleted file mode 100644 index 111206c4..00000000 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-007-terminal-state-error-message-indicates-no-valid-transitions.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-fsm.fsm-transitions.terminal-state-error-message-indicates-no-valid-transitions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-fsm.fsm-transitions ---- -# Terminal state error message indicates no valid transitions - -## Intent - -- outcome: Executable scenario: Terminal state error message indicates no valid transitions - -```gwt -Given a test FSM with states: draft, submitted, confirmed, cancelled -And initial state is "draft" -And transitions are defined as: -And the FSM is in state "confirmed" -When asserting transition from "confirmed" to "draft" -Then an FSMTransitionError should be thrown -And the error message should contain "(none - terminal state)" -``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-008-state-validity-is-correctly-checked.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-008-state-validity-is-correctly-checked.sdp.md deleted file mode 100644 index 7fa9cf2b..00000000 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-008-state-validity-is-correctly-checked.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-fsm.fsm-transitions.state-validity-is-correctly-checked -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-fsm.fsm-transitions ---- -# State validity is correctly checked - -## Intent - -- outcome: Executable scenario: State validity is correctly checked - -```gwt -Given a test FSM with states: draft, submitted, confirmed, cancelled -And initial state is "draft" -And transitions are defined as: -When checking if "value" is a valid state -Then isValidState should return "value" -``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-009-valid-transitions-can-be-queried-for-any-state.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-009-valid-transitions-can-be-queried-for-any-state.sdp.md deleted file mode 100644 index b42205a3..00000000 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-009-valid-transitions-can-be-queried-for-any-state.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-fsm.fsm-transitions.valid-transitions-can-be-queried-for-any-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-fsm.fsm-transitions ---- -# Valid transitions can be queried for any state - -## Intent - -- outcome: Executable scenario: Valid transitions can be queried for any state - -```gwt -Given a test FSM with states: draft, submitted, confirmed, cancelled -And initial state is "draft" -And transitions are defined as: -When querying valid transitions from "value" -Then the result should be "value" -``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-010-standalone-functions-work-identically-to-fsm-methods.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-010-standalone-functions-work-identically-to-fsm-methods.sdp.md deleted file mode 100644 index 94c938ab..00000000 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-010-standalone-functions-work-identically-to-fsm-methods.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-fsm.fsm-transitions.standalone-functions-work-identically-to-fsm-methods -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-fsm.fsm-transitions ---- -# Standalone functions work identically to FSM methods - -## Intent - -- outcome: Executable scenario: Standalone functions work identically to FSM methods - -```gwt -Given a test FSM with states: draft, submitted, confirmed, cancelled -And initial state is "draft" -And transitions are defined as: -And the standalone canTransition function -When checking "value" to "value" with standalone function -Then the result should be "value" -``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.examples/s-011-standalone-assert-transition-throws-same-errors.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.examples/s-011-standalone-assert-transition-throws-same-errors.sdp.md deleted file mode 100644 index 86ab1963..00000000 --- a/specs/behavior/platform-fsm/fsm-transitions.examples/s-011-standalone-assert-transition-throws-same-errors.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-fsm.fsm-transitions.standalone-assert-transition-throws-same-errors -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-fsm.fsm-transitions ---- -# Standalone assertTransition throws same errors - -## Intent - -- outcome: Executable scenario: Standalone assertTransition throws same errors - -```gwt -Given a test FSM with states: draft, submitted, confirmed, cancelled -And initial state is "draft" -And transitions are defined as: -And the standalone assertTransition function -When asserting "draft" to "confirmed" with standalone function -Then an FSMTransitionError should be thrown -``` diff --git a/specs/behavior/platform-fsm/fsm-transitions.sdp.md b/specs/behavior/platform-fsm/fsm-transitions.sdp.md index f3eb702c..1703e2e3 100644 --- a/specs/behavior/platform-fsm/fsm-transitions.sdp.md +++ b/specs/behavior/platform-fsm/fsm-transitions.sdp.md @@ -2,7 +2,7 @@ id: spec:behavior.platform-fsm.fsm-transitions kind: behavior altitude: story -readiness: idea +readiness: defined relations: refines: spec:behavior.platform-fsm --- @@ -10,4 +10,15 @@ relations: ## Intent -- outcome: FSM State Transitions +- outcome: Define a typed FSM with explicit transition rules so invalid state changes fail at runtime with an error that names the allowed targets. +- value: Aggregates can reuse one transition map instead of scattering state-progression checks through handlers. + +## Behavior + +- rule: A defined FSM starts in the authored initial state and exposes its definition. +- rule: canTransition returns true only for transitions listed on the source state. +- rule: assertTransition throws FSMTransitionError for invalid transitions, with from, to, allowed targets, and code FSM_INVALID_TRANSITION. +- rule: Terminal states have no outgoing transitions and the error names "(none - terminal state)". +- rule: isValidState is true only for states in the definition. +- rule: validTransitions returns the allowed targets for a state. +- rule: Standalone canTransition and assertTransition functions match the FSM methods. diff --git a/specs/behavior/platform-store/_epic.sdp.md b/specs/behavior/platform-store/_epic.sdp.md index 8db67b42..a54aaebe 100644 --- a/specs/behavior/platform-store/_epic.sdp.md +++ b/specs/behavior/platform-store/_epic.sdp.md @@ -9,4 +9,5 @@ relations: {} ## Intent -- outcome: Hold the executable Gherkin behavior Specs migrated from the platform-store test corpus. +- outcome: Specify platform-store Event Store foundation and type-contract behavior migrated from the package test corpus. +- value: The platform-store package is the Convex event storage, stream ordering, and idempotency-audit component. diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-001-event-store-client-exposes-no-event-update-api.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-001-event-store-client-exposes-no-event-update-api.sdp.md deleted file mode 100644 index 3261ec94..00000000 --- a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-001-event-store-client-exposes-no-event-update-api.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-store.event-store-foundation-executable-tests.event-store-client-exposes-no-event-update-api -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-store.event-store-foundation-executable-tests ---- -# Event Store client exposes no event-update API - -## Intent - -- outcome: Executable scenario: Event Store client exposes no event-update API - -```gwt -Given the platform-store EventStore client is available -And the EventStore client surface -When inspecting its exported operations -Then no operation mutates a previously-appended event -``` diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-002-event-store-client-exposes-no-event-delete-api.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-002-event-store-client-exposes-no-event-delete-api.sdp.md deleted file mode 100644 index f4fb5e63..00000000 --- a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-002-event-store-client-exposes-no-event-delete-api.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-store.event-store-foundation-executable-tests.event-store-client-exposes-no-event-delete-api -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-store.event-store-foundation-executable-tests ---- -# Event Store client exposes no event-delete API - -## Intent - -- outcome: Executable scenario: Event Store client exposes no event-delete API - -```gwt -Given the platform-store EventStore client is available -And the EventStore client surface -When inspecting its exported operations -Then no operation deletes a previously-appended event -``` diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-003-first-append-to-a-new-stream-produces-version-1.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-003-first-append-to-a-new-stream-produces-version-1.sdp.md deleted file mode 100644 index 4b2f9256..00000000 --- a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-003-first-append-to-a-new-stream-produces-version-1.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-store.event-store-foundation-executable-tests.first-append-to-a-new-stream-produces-version-1 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-store.event-store-foundation-executable-tests ---- -# First append to a new stream produces version 1 - -## Intent - -- outcome: Executable scenario: First append to a new stream produces version 1 - -```gwt -Given the platform-store EventStore client is available -And a stream "Order" with id "ord-stub-1" that does not exist -When appending an event with expectedVersion 0 -Then the new stream version is 1 -``` diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-004-subsequent-appends-increment-the-stream-version-monotonically.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-004-subsequent-appends-increment-the-stream-version-monotonically.sdp.md deleted file mode 100644 index aab581cc..00000000 --- a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-004-subsequent-appends-increment-the-stream-version-monotonically.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-store.event-store-foundation-executable-tests.subsequent-appends-increment-the-stream-version-monotonically -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-store.event-store-foundation-executable-tests ---- -# Subsequent appends increment the stream version monotonically - -## Intent - -- outcome: Executable scenario: Subsequent appends increment the stream version monotonically - -```gwt -Given the platform-store EventStore client is available -And a stream "Order" with id "ord-stub-1" at version 1 -When appending another event with expectedVersion 1 -Then the new stream version is 2 -``` diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-005-global-position-is-unique-across-two-streams.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-005-global-position-is-unique-across-two-streams.sdp.md deleted file mode 100644 index 5414f26c..00000000 --- a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-005-global-position-is-unique-across-two-streams.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-store.event-store-foundation-executable-tests.global-position-is-unique-across-two-streams -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-store.event-store-foundation-executable-tests ---- -# globalPosition is unique across two streams - -## Intent - -- outcome: Executable scenario: globalPosition is unique across two streams - -```gwt -Given the platform-store EventStore client is available -And an event appended to stream "Order/ord-A" -And an event appended to stream "Order/ord-B" -When the scenario runs -Then both events have distinct globalPosition values -``` diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-006-global-position-increases-monotonically-within-a-stream.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-006-global-position-increases-monotonically-within-a-stream.sdp.md deleted file mode 100644 index 486475d8..00000000 --- a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-006-global-position-increases-monotonically-within-a-stream.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:behavior.platform-store.event-store-foundation-executable-tests.global-position-increases-monotonically-within-a-stream -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-store.event-store-foundation-executable-tests ---- -# globalPosition increases monotonically within a stream - -## Intent - -- outcome: Executable scenario: globalPosition increases monotonically within a stream - -```gwt -Given the platform-store EventStore client is available -And two events appended sequentially to stream "Order/ord-C" -When the scenario runs -Then the second event's globalPosition is greater than the first -``` diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-007-successful-append-with-matching-version.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-007-successful-append-with-matching-version.sdp.md deleted file mode 100644 index c5d95da5..00000000 --- a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-007-successful-append-with-matching-version.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-store.event-store-foundation-executable-tests.successful-append-with-matching-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-store.event-store-foundation-executable-tests ---- -# Successful append with matching version - -## Intent - -- outcome: Executable scenario: Successful append with matching version - -```gwt -Given the platform-store EventStore client is available -And a stream "Order" with id "ord-123" at version 5 -When appending an event with expectedVersion 5 -Then the append succeeds -And the stream version becomes 6 -And the event receives a globalPosition -``` diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-008-conflict-on-version-mismatch.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-008-conflict-on-version-mismatch.sdp.md deleted file mode 100644 index 839e6bec..00000000 --- a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-008-conflict-on-version-mismatch.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-store.event-store-foundation-executable-tests.conflict-on-version-mismatch -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-store.event-store-foundation-executable-tests ---- -# Conflict on version mismatch - -## Intent - -- outcome: Executable scenario: Conflict on version mismatch - -```gwt -Given the platform-store EventStore client is available -And a stream "Order" with id "ord-123" at version 5 -When appending an event with expectedVersion 3 -Then the append returns status "conflict" -And the response includes currentVersion 5 -``` diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-009-projection-resumes-from-checkpoint.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-009-projection-resumes-from-checkpoint.sdp.md deleted file mode 100644 index 733311b8..00000000 --- a/specs/behavior/platform-store/event-store-foundation-executable-tests.examples/s-009-projection-resumes-from-checkpoint.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-store.event-store-foundation-executable-tests.projection-resumes-from-checkpoint -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-store.event-store-foundation-executable-tests ---- -# Projection resumes from checkpoint - -## Intent - -- outcome: Executable scenario: Projection resumes from checkpoint - -```gwt -Given the platform-store EventStore client is available -And a projection with lastProcessedPosition 1000 -When reading events from position 1001 -Then only events with globalPosition > 1000 are returned -And events are ordered by globalPosition ascending -``` diff --git a/specs/behavior/platform-store/event-store-foundation-executable-tests.sdp.md b/specs/behavior/platform-store/event-store-foundation-executable-tests.sdp.md index 219b75cc..7e86e366 100644 --- a/specs/behavior/platform-store/event-store-foundation-executable-tests.sdp.md +++ b/specs/behavior/platform-store/event-store-foundation-executable-tests.sdp.md @@ -10,7 +10,9 @@ relations: ## Intent -- outcome: EventStoreFoundation Executable Tests +- problem: Event Sourcing requires centralized storage for domain events with ordering guarantees, concurrency control, and query capabilities for projections. Without infrastructure for stream-based storage, bounded contexts cannot maintain audit trails or support projection-based read models. +- outcome: Capture Event Store foundation coverage that events append immutably with stream versions, globalPosition ordering, OCC, and checkpointed projection reads until the stub harness is wired. +- value: The Event Store component provides stream-based storage with expectedVersion OCC, global positioning, appendToStream/readStream/readFromPosition APIs, event category taxonomy, and schema versioning. ## Behavior diff --git a/specs/behavior/platform-store/event-store-types.examples/s-001-event-category-supports-all-taxonomy-values.sdp.md b/specs/behavior/platform-store/event-store-types.examples/s-001-event-category-supports-all-taxonomy-values.sdp.md deleted file mode 100644 index b6298dc6..00000000 --- a/specs/behavior/platform-store/event-store-types.examples/s-001-event-category-supports-all-taxonomy-values.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:behavior.platform-store.event-store-types.event-category-supports-all-taxonomy-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-store.event-store-types ---- -# EventCategory supports all taxonomy values - -## Intent - -- outcome: Executable scenario: EventCategory supports all taxonomy values - -```gwt -Given the event store type definitions are available -When validating EventCategory type values -Then all Phase 9 taxonomy values should be valid: -``` diff --git a/specs/behavior/platform-store/event-store-types.examples/s-002-event-input-requires-core-event-fields.sdp.md b/specs/behavior/platform-store/event-store-types.examples/s-002-event-input-requires-core-event-fields.sdp.md deleted file mode 100644 index f3a56bcb..00000000 --- a/specs/behavior/platform-store/event-store-types.examples/s-002-event-input-requires-core-event-fields.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-store.event-store-types.event-input-requires-core-event-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-store.event-store-types ---- -# EventInput requires core event fields - -## Intent - -- outcome: Executable scenario: EventInput requires core event fields - -```gwt -Given the event store type definitions are available -And an EventInput with required fields: -When the EventInput structure is validated -Then the EventInput should have eventId "evt-123" -And the EventInput should have eventType "OrderCreated" -And the EventInput should have a payload object -``` diff --git a/specs/behavior/platform-store/event-store-types.examples/s-003-event-input-supports-optional-category-and-schema-version.sdp.md b/specs/behavior/platform-store/event-store-types.examples/s-003-event-input-supports-optional-category-and-schema-version.sdp.md deleted file mode 100644 index 9d302a69..00000000 --- a/specs/behavior/platform-store/event-store-types.examples/s-003-event-input-supports-optional-category-and-schema-version.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-store.event-store-types.event-input-supports-optional-category-and-schema-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-store.event-store-types ---- -# EventInput supports optional category and schemaVersion - -## Intent - -- outcome: Executable scenario: EventInput supports optional category and schemaVersion - -```gwt -Given the event store type definitions are available -And an EventInput with optional Phase 9 fields: -When the EventInput structure is validated -Then the EventInput should have category "domain" -And the EventInput should have schemaVersion 2 -``` diff --git a/specs/behavior/platform-store/event-store-types.examples/s-004-event-input-supports-metadata-with-correlation-tracking.sdp.md b/specs/behavior/platform-store/event-store-types.examples/s-004-event-input-supports-metadata-with-correlation-tracking.sdp.md deleted file mode 100644 index 427e7028..00000000 --- a/specs/behavior/platform-store/event-store-types.examples/s-004-event-input-supports-metadata-with-correlation-tracking.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-store.event-store-types.event-input-supports-metadata-with-correlation-tracking -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-store.event-store-types ---- -# EventInput supports metadata with correlation tracking - -## Intent - -- outcome: Executable scenario: EventInput supports metadata with correlation tracking - -```gwt -Given the event store type definitions are available -And an EventInput with metadata: -When the EventInput structure is validated -Then the EventInput metadata should have correlationId "corr-abc" -And the EventInput metadata should have causationId "cmd-def" -And the EventInput metadata should have userId "user-123" -``` diff --git a/specs/behavior/platform-store/event-store-types.examples/s-005-stored-event-includes-all-required-storage-fields.sdp.md b/specs/behavior/platform-store/event-store-types.examples/s-005-stored-event-includes-all-required-storage-fields.sdp.md deleted file mode 100644 index 3938afd2..00000000 --- a/specs/behavior/platform-store/event-store-types.examples/s-005-stored-event-includes-all-required-storage-fields.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:behavior.platform-store.event-store-types.stored-event-includes-all-required-storage-fields -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-store.event-store-types ---- -# StoredEvent includes all required storage fields - -## Intent - -- outcome: Executable scenario: StoredEvent includes all required storage fields - -```gwt -Given the event store type definitions are available -And a StoredEvent with all required fields -When the StoredEvent structure is validated -Then the StoredEvent should have stream identity fields: -And the StoredEvent should have version tracking fields: -And the StoredEvent should have Phase 9 taxonomy fields: -And the StoredEvent should have correlation tracking: -``` diff --git a/specs/behavior/platform-store/event-store-types.examples/s-006-append-result-success-includes-event-positions.sdp.md b/specs/behavior/platform-store/event-store-types.examples/s-006-append-result-success-includes-event-positions.sdp.md deleted file mode 100644 index d4b40212..00000000 --- a/specs/behavior/platform-store/event-store-types.examples/s-006-append-result-success-includes-event-positions.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:behavior.platform-store.event-store-types.append-result-success-includes-event-positions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-store.event-store-types ---- -# AppendResult success includes event positions - -## Intent - -- outcome: Executable scenario: AppendResult success includes event positions - -```gwt -Given the event store type definitions are available -And an AppendResult with status "success" -When the AppendResult structure is validated -Then the result should have eventIds array -And the result should have globalPositions array -And the result should have newVersion number -``` diff --git a/specs/behavior/platform-store/event-store-types.examples/s-007-append-result-conflict-includes-current-version.sdp.md b/specs/behavior/platform-store/event-store-types.examples/s-007-append-result-conflict-includes-current-version.sdp.md deleted file mode 100644 index 5931b183..00000000 --- a/specs/behavior/platform-store/event-store-types.examples/s-007-append-result-conflict-includes-current-version.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:behavior.platform-store.event-store-types.append-result-conflict-includes-current-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:behavior.platform-store.event-store-types ---- -# AppendResult conflict includes current version - -## Intent - -- outcome: Executable scenario: AppendResult conflict includes current version - -```gwt -Given the event store type definitions are available -And an AppendResult with status "conflict" -When the AppendResult structure is validated -Then the result should have currentVersion number -And the result should not have eventIds -``` diff --git a/specs/behavior/platform-store/event-store-types.sdp.md b/specs/behavior/platform-store/event-store-types.sdp.md index 07d79079..00a5d121 100644 --- a/specs/behavior/platform-store/event-store-types.sdp.md +++ b/specs/behavior/platform-store/event-store-types.sdp.md @@ -10,4 +10,5 @@ relations: ## Intent -- outcome: Event Store Type Contracts +- outcome: Export EventInput, StoredEvent, AppendResult, and EventCategory type contracts that define the Event Store client surface. +- value: Type contracts ensure EventInput captures append data, StoredEvent includes storage fields, AppendResult discriminates success from conflict, and EventCategory supports the Phase 9 taxonomy. diff --git a/specs/decisions.pack.sdp.md b/specs/decisions.pack.sdp.md index ddbb254c..4dc61e33 100644 --- a/specs/decisions.pack.sdp.md +++ b/specs/decisions.pack.sdp.md @@ -1,6 +1,7 @@ --- id: pack:decisions specs: + - spec:decisions.process - spec:decisions.pdr-001-process-decisions-folder - spec:decisions.pdr-002-release-management-architecture - spec:decisions.pdr-003-behavior-feature-file-structure diff --git a/specs/decisions/_epic.sdp.md b/specs/decisions/_epic.sdp.md new file mode 100644 index 00000000..4a793360 --- /dev/null +++ b/specs/decisions/_epic.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:decisions.process +kind: decision +altitude: epic +readiness: idea +relations: {} +--- +# Process decision registry + +## Intent + +- outcome: Hold the monorepo Process Decision Records as a single refinement parent so each PDR can declare a relation without inventing a second decision. + +## Decision + +- decision: Every PDR under specs/decisions/ refines spec:decisions.process. diff --git a/specs/decisions/pdr-001-process-decisions-folder.sdp.md b/specs/decisions/pdr-001-process-decisions-folder.sdp.md index d0bdacc4..ed69b4fb 100644 --- a/specs/decisions/pdr-001-process-decisions-folder.sdp.md +++ b/specs/decisions/pdr-001-process-decisions-folder.sdp.md @@ -2,15 +2,20 @@ id: spec:decisions.pdr-001-process-decisions-folder kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-001 - Process Decisions Live in /libar-platform/architect/decisions/ ## Intent -- outcome: PDR-001 - Process Decisions Live in /libar-platform/architect/decisions/ +- outcome: Keep monorepo process decision records separate from package-level architecture decision records. ## Decision -- decision: PDR-001 - Process Decisions Live in /libar-platform/architect/decisions/ +- context: The monorepo needed a location for process-level decisions (PDRs) separate from package-level Architecture Decision Records (ADRs). Package ADRs live with the architect tool and document its own tooling; PDRs document how this monorepo uses the tool, with independent ownership, numbering, and tag registries. +- decision: Process Decision Records for the monorepo live in specs/decisions/ as SDP Markdown carriers named pdr-NNN-name.sdp.md, keeping package ADRs and repo PDRs in separate ownership and numbering sequences. +- rationale: The separation enables clear ownership boundaries, different tag registries for different scopes, and independent evolution of package versus repo process decisions. +- consequence: Package ADRs and repo PDRs stay separately numbered and owned. +- consequence: Two registries must be maintained (package versus repo). diff --git a/specs/decisions/pdr-002-release-management-architecture.sdp.md b/specs/decisions/pdr-002-release-management-architecture.sdp.md index 219c68b7..73f6cd95 100644 --- a/specs/decisions/pdr-002-release-management-architecture.sdp.md +++ b/specs/decisions/pdr-002-release-management-architecture.sdp.md @@ -2,15 +2,22 @@ id: spec:decisions.pdr-002-release-management-architecture kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-002 - Release Management Architecture ## Intent -- outcome: PDR-002 - Release Management Architecture +- outcome: Organize delivery around release versions instead of pre-defined phase timelines. ## Decision -- decision: PDR-002 - Release Management Architecture +- context: Timeline feature files and TypeScript phase files created friction: deliverable DataTables were cumbersome, phases were pre-defined while work is not linear, and releases (external versions) were treated as if they were phases (internal work units). The relationship should be one roadmap phase to many releases. +- decision: Adopt a minimal release management architecture with three components: release definition files that list version, status, quarter, and highlights without deliverable DataTables; deliverable association via @architect-release tags; and generated changelog, roadmap, and release notes discovered by scanning those tags. +- rationale: Deliverables naturally belong to releases, not phases, so tagging and generation keep ceremony small while Git remains the event store and documentation remains a projection. +- consequence: Release files stay short and scope can change during development without restructuring. +- consequence: Scanner support for @architect-release is required, and both the release file and the tag on each deliverable must stay in sync. +- alternative: Timeline .feature files with DataTables and fifteen-plus metadata tags per file. +- alternative: TypeScript phase files tightly coupled 1:1 to releases. diff --git a/specs/decisions/pdr-003-behavior-feature-file-structure.sdp.md b/specs/decisions/pdr-003-behavior-feature-file-structure.sdp.md index 650be18f..bdf14abe 100644 --- a/specs/decisions/pdr-003-behavior-feature-file-structure.sdp.md +++ b/specs/decisions/pdr-003-behavior-feature-file-structure.sdp.md @@ -2,15 +2,20 @@ id: spec:decisions.pdr-003-behavior-feature-file-structure kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-003 - Behavior Feature File Structure ## Intent -- outcome: PDR-003 - Behavior Feature File Structure +- outcome: Let requirement specs evolve independently of release planning. ## Decision -- decision: PDR-003 - Behavior Feature File Structure +- context: Timeline .feature files mixed requirements with libar-process-* phase and release tags, so DataTables were hard to maintain, metadata was scattered, and combining or splitting specs required updating process metadata everywhere. +- decision: Separate WHAT from WHEN: specs carry semantic requirements and deliverables with no libar-process-* tags or Release columns, while TypeScript phase files carry @architect-* release, phase, and dependency annotations and reference specs by pattern name. +- rationale: Specs describe what the system does, not when it was released; release coupling prevents specs from evolving independently. +- consequence: Specs can evolve independently of release planning, and roadmap generation has a single source of truth in TypeScript annotations. +- consequence: Two file types must be maintained, and phase files must manually reference spec files. diff --git a/specs/decisions/pdr-004-unified-tag-prefix-architecture.sdp.md b/specs/decisions/pdr-004-unified-tag-prefix-architecture.sdp.md index d40728a4..9749b33d 100644 --- a/specs/decisions/pdr-004-unified-tag-prefix-architecture.sdp.md +++ b/specs/decisions/pdr-004-unified-tag-prefix-architecture.sdp.md @@ -2,15 +2,20 @@ id: spec:decisions.pdr-004-unified-tag-prefix-architecture kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-004 - Unified Tag Prefix Architecture ## Intent -- outcome: PDR-004 - Unified Tag Prefix Architecture +- outcome: Give process and documentation metadata one tag prefix so ownership is obvious. ## Decision -- decision: PDR-004 - Unified Tag Prefix Architecture +- context: Historical tag prefixes created confusion: libar-docs-* in TypeScript versus libar-process-* in Gherkin. Overlapping tags such as pattern, phase, and status had unclear ownership, so two mental models had to be maintained. +- decision: All process and documentation metadata tags use the unified @architect-* prefix; the libar-process-* prefix is deprecated; unprefixed BDD tags such as acceptance-criteria and happy-path remain unprefixed. +- rationale: A single prefix makes grep, onboarding, and ownership one mental model while leaving Cucumber-style scenario tags as BDD vocabulary. +- consequence: Contributors search and apply one @architect-* model for metadata. +- consequence: Existing libar-process-* tags must migrate, and the scanner accepts both prefixes during the transition. diff --git a/specs/decisions/pdr-005-mvp-workflow.sdp.md b/specs/decisions/pdr-005-mvp-workflow.sdp.md index 76f335b0..06390c11 100644 --- a/specs/decisions/pdr-005-mvp-workflow.sdp.md +++ b/specs/decisions/pdr-005-mvp-workflow.sdp.md @@ -2,15 +2,20 @@ id: spec:decisions.pdr-005-mvp-workflow kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-005 - MVP Workflow State Machine ## Intent -- outcome: PDR-005 - MVP Workflow State Machine +- outcome: Enforce a single process state machine so work items cannot skip or invent status transitions. ## Decision -- decision: PDR-005 - MVP Workflow State Machine +- context: Previous status values (implemented, partial, roadmap, completed, active) had overlapping semantics and no programmatic enforcement, so work items could transition without validation. +- decision: Adopt the phase-state-machine FSM with Decider-based enforcement: roadmap, active, completed, and deferred; valid transitions are roadmap to active or deferred, active to completed or back to roadmap, and deferred back to roadmap; completed is terminal without an explicit unlock; required tags are @architect-pattern and @architect-status. +- rationale: Protection levels and Decider validation catch invalid transitions and prevent accidental scope creep, aligning process metadata with platform Decider and FSM patterns. +- consequence: Invalid transitions are caught in process linting, and protection levels block accidental modification of in-progress or completed work. +- consequence: lint:process is required in pre-commit and CI, and the FSM supersedes legacy status values in the tag registry. diff --git a/specs/decisions/pdr-006-typescript-sourced-taxonomy.sdp.md b/specs/decisions/pdr-006-typescript-sourced-taxonomy.sdp.md index b30fae2b..7af86078 100644 --- a/specs/decisions/pdr-006-typescript-sourced-taxonomy.sdp.md +++ b/specs/decisions/pdr-006-typescript-sourced-taxonomy.sdp.md @@ -2,15 +2,20 @@ id: spec:decisions.pdr-006-typescript-sourced-taxonomy kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-006 - TypeScript-Sourced Taxonomy ## Intent -- outcome: PDR-006 - TypeScript-Sourced Taxonomy +- outcome: Make taxonomy values compile-time facts instead of untyped JSON strings. ## Decision -- decision: PDR-006 - TypeScript-Sourced Taxonomy +- context: tag-registry.json was the source of truth with Zod validating structure at runtime and no compile-time enforcement, so typos, renames, and missing autocomplete only appeared after JSON was edited. +- decision: TypeScript as-const arrays are the source of truth, types are inferred from those constants, Zod schemas reuse the constants for runtime validation, and JSON registries are generated artifacts rather than hand-edited files. +- rationale: Compile-time constants give IDE autocomplete and refactoring while keeping Zod at the runtime boundary and leaving external JSON consumers on generated output. +- consequence: Taxonomy values are checked at compile time and remain a single TypeScript source of truth. +- consequence: External tools that expect JSON must consume generated output from the registry builder. diff --git a/specs/decisions/pdr-007-two-tier-spec-architecture.sdp.md b/specs/decisions/pdr-007-two-tier-spec-architecture.sdp.md index d7ed68b0..55e6f1b4 100644 --- a/specs/decisions/pdr-007-two-tier-spec-architecture.sdp.md +++ b/specs/decisions/pdr-007-two-tier-spec-architecture.sdp.md @@ -2,15 +2,20 @@ id: spec:decisions.pdr-007-two-tier-spec-architecture kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-007 Two-Tier Spec Architecture ## Intent -- outcome: PDR-007 Two-Tier Spec Architecture +- outcome: Separate planning specs from executable package tests so scenarios are not duplicated. ## Decision -- decision: PDR-007 Two-Tier Spec Architecture +- context: Planning and tracking were conflated with implementation proof in the same feature files, which duplicated scenarios between roadmap specs and package tests and left ownership of executable versus documentation unclear. +- decision: Establish two tiers linked by metadata instead of duplicated scenarios: non-executable roadmap specs under libar-platform/architect/specs/ for planning and deliverables, and executable package specs under packages/*/tests/features/ for implementation tests, cross-referenced with @architect-executable-specs and @architect-roadmap-spec. +- rationale: Traceability via tags eliminates scenario duplication while keeping roadmap specs as lightweight planning documents and package specs as the authoritative behavior record. +- consequence: Ownership is clear and roadmap specs stay lightweight planning documents. +- consequence: Tag relationships must be maintained, and readers look in two places mitigated by the cross-references. diff --git a/specs/decisions/pdr-008-example-app-purpose.sdp.md b/specs/decisions/pdr-008-example-app-purpose.sdp.md index 9429f304..2c148e25 100644 --- a/specs/decisions/pdr-008-example-app-purpose.sdp.md +++ b/specs/decisions/pdr-008-example-app-purpose.sdp.md @@ -2,15 +2,20 @@ id: spec:decisions.pdr-008-example-app-purpose kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-008 Example App Purpose and Guidelines ## Intent -- outcome: PDR-008 Example App Purpose and Guidelines +- outcome: Keep example-app changes focused on demonstrating and testing the platform rather than growing a standalone product. ## Decision -- decision: PDR-008 Example App Purpose and Guidelines +- context: It was unclear whether example-app features should mirror production requirements, prioritize completeness versus demonstration, or be driven by business needs versus platform needs. The previous freeze policy listed allowed and prohibited change categories instead of stating the purpose that should guide those choices. +- decision: The example app exists to serve platform development, not as a standalone product: it is a development aid and testing consumer, a reference-grade demonstration of platform capabilities, and the primary vehicle for validating platform patterns in realistic scenarios. Changes are appropriate when they demonstrate, test, or unblock platform work, and not when they add unrelated business features. +- rationale: Articulating the fundamental purpose is simpler and more durable than an explicit allowed-and-prohibited freeze list. +- consequence: Example-app changes stay judged against platform value and are less likely to sprawl into unrelated business logic. +- consequence: The example app may not be a complete order-management product, and some realistic business scenarios stay simplified, so judgment is still required. diff --git a/specs/decisions/pdr-009-design-session-methodology.sdp.md b/specs/decisions/pdr-009-design-session-methodology.sdp.md index a57dde6a..fe7c0ed2 100644 --- a/specs/decisions/pdr-009-design-session-methodology.sdp.md +++ b/specs/decisions/pdr-009-design-session-methodology.sdp.md @@ -2,15 +2,20 @@ id: spec:decisions.pdr-009-design-session-methodology kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-009 Design Session Methodology ## Intent -- outcome: PDR-009 Design Session Methodology +- outcome: Give design sessions a fixed pair of outputs so HOW decisions and interface contracts do not live in throwaway documents or compile-breaking source stubs. ## Decision -- decision: PDR-009 Design Session Methodology +- context: Plan-level Gherkin specs captured WHAT to build, but design sessions also needed HOW decisions and interface contracts. Without a methodology, markdown design documents duplicated specs, stubs in real source folders broke compilation on missing generated Convex server code, and architectural decisions were scattered without structured traceability. +- decision: Design sessions produce decision specs as Gherkin features under libar-platform/architect/decisions/ and TypeScript stubs under libar-platform/architect/stubs/{pattern-name}/, which sits outside package tsconfig and eslint scopes. Stubs use pattern-based folder names with @architect-implements and @architect-target; they are not implementation code, and markdown design documents are not a design-session output. Decision records from design sessions use the design category alongside process and architecture. +- rationale: Stubs outside compilation never break the tree, decision specs carry structured tags, and pattern names stay stable after ephemeral session numbers are gone. +- consequence: Stubs never break compilation or linting, and design-to-implementation linkage is explicit through @architect-implements and @architect-target. +- consequence: Stubs are not type-checked until implementation moves them to @architect-target locations. diff --git a/specs/decisions/pdr-010-cross-component-argument-injection.sdp.md b/specs/decisions/pdr-010-cross-component-argument-injection.sdp.md index c64ee689..e1dd3787 100644 --- a/specs/decisions/pdr-010-cross-component-argument-injection.sdp.md +++ b/specs/decisions/pdr-010-cross-component-argument-injection.sdp.md @@ -2,15 +2,23 @@ id: spec:decisions.pdr-010-cross-component-argument-injection kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-010 Cross-Component Argument Injection Pattern ## Intent -- outcome: PDR-010 Cross-Component Argument Injection Pattern +- outcome: Let a Convex component use data from outside its isolated database without querying across the boundary. ## Decision -- decision: PDR-010 Cross-Component Argument Injection Pattern +- context: Convex component handlers can only access tables in that component's schema. They cannot query app-level tables or join across components, so all cross-component data access must go through handler arguments or return values. +- decision: When a component handler needs data from outside its boundary, the app-level caller loads that data, shapes it into a typed InjectedData container with optional fields, and passes it as an argument; the handler processes the pre-loaded data without external queries. +- rationale: Argument injection keeps the component pure and unaware of external schema, while the caller retains control over loading, caching, and batching. +- consequence: The component stays isolated, InjectedData is compile-time typed, and tests can inject mock data without projections. +- consequence: The caller must know what data the component needs, handler signatures carry extra arguments, and InjectedData can grow if different operations need different external data. +- alternative: A callback pattern in which the component requests data, which breaks transactional guarantees and makes the component aware of external schema. +- alternative: Duplicating external data into the component, which adds redundant storage and consistency risk. +- alternative: A shared database layer, which violates bounded-context isolation. diff --git a/specs/decisions/pdr-011-agent-action-handler-architecture.sdp.md b/specs/decisions/pdr-011-agent-action-handler-architecture.sdp.md index 4daf7dfc..bda3e3cf 100644 --- a/specs/decisions/pdr-011-agent-action-handler-architecture.sdp.md +++ b/specs/decisions/pdr-011-agent-action-handler-architecture.sdp.md @@ -2,15 +2,20 @@ id: spec:decisions.pdr-011-agent-action-handler-architecture kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-011 Agent Action Handler Architecture ## Intent -- outcome: PDR-011 Agent Action Handler Architecture +- outcome: Split agent event handling so LLM calls can run in Convex actions while all persistence stays in onComplete mutations. ## Decision -- decision: PDR-011 Agent Action Handler Architecture +- context: Agent event handlers that need LLM API calls cannot be mutations, because mutations cannot call external APIs and actions cannot write the database except through runMutation. Workpool partition-key ordering is not yet available, so concurrent actions for the same entity can run at once. This supersedes the single-mutation handler pattern from Phase 22 and is a companion to PDR-010. +- decision: Agent event processing is two-phase: an action loads checkpoint, history, and injectedData, runs pattern detection or LLM analysis, and returns AgentActionResult with no writes; an onComplete mutation persists audit, command, approval, and checkpoint last. EventSubscription is a discriminated union of mutation versus action, and ActionSubscription requires onComplete. Idempotency is guaranteed by OCC-serialized onComplete mutations, with an in-action checkpoint check only as a best-effort skip of unnecessary LLM calls. ActionSubscription and MutationSubscription may name an optional pool so agent LLM actions do not share the projection pool. +- rationale: A unified action-plus-onComplete path covers rule-only and LLM agents without dual handler models, and OCC on the checkpoint document is the correctness mechanism until Workpool key-based ordering exists. +- consequence: Agent handlers can call LLMs while all writes remain atomic in onComplete, and existing mutation subscriptions keep working. +- consequence: Two concurrent actions for the same entity can both analyze; serialization and duplicate suppression happen at onComplete, not at enqueue time. diff --git a/specs/decisions/pdr-012-agent-command-routing.sdp.md b/specs/decisions/pdr-012-agent-command-routing.sdp.md index efa3200a..3b4c9ff5 100644 --- a/specs/decisions/pdr-012-agent-command-routing.sdp.md +++ b/specs/decisions/pdr-012-agent-command-routing.sdp.md @@ -2,15 +2,20 @@ id: spec:decisions.pdr-012-agent-command-routing kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-012 Agent Command Routing & Pattern Unification ## Intent -- outcome: PDR-012 Agent Command Routing & Pattern Unification +- outcome: Route agent-emitted commands through CommandOrchestrator and make PatternDefinition the single detection source of truth. ## Decision -- decision: PDR-012 Agent Command Routing & Pattern Unification +- context: Commands emitted by agents were remaining pending in the agent component instead of reaching registered domain handlers, and inline onEvent handlers ran in parallel with unused PatternDefinition instances. This is a companion to PDR-011 and PDR-010. +- decision: Agent decisions that produce commands persist as before, then onComplete enqueues a Workpool mutation that loads the recorded command, maps it through AgentCommandRouter, and executes CommandOrchestrator. AgentBCConfig takes exactly one of onEvent or patterns: PatternExecutor iterates PatternDefinition[] in array order, short-circuits on the first match, and uses trigger() before optional analyze() so LLM calls are skipped when the cheap trigger does not fire. +- rationale: Workpool dispatch keeps persistence and routing in separate transactions with retry, and XOR config keeps existing onEvent agents working while new agents share one PatternDefinition source of truth. +- consequence: Agent commands reach domain handlers through the existing orchestrator pipeline, and unknown types fail with an audited routing error instead of sitting pending. +- consequence: Agents must choose onEvent or patterns; both or neither is invalid. diff --git a/specs/decisions/pdr-013-agent-lifecycle-fsm.sdp.md b/specs/decisions/pdr-013-agent-lifecycle-fsm.sdp.md index 0d7eff01..24145949 100644 --- a/specs/decisions/pdr-013-agent-lifecycle-fsm.sdp.md +++ b/specs/decisions/pdr-013-agent-lifecycle-fsm.sdp.md @@ -2,15 +2,20 @@ id: spec:decisions.pdr-013-agent-lifecycle-fsm kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-013 Agent Lifecycle FSM ## Intent -- outcome: PDR-013 Agent Lifecycle FSM +- outcome: Govern agent start, pause, resume, stop, and reconfigure with a formal lifecycle state machine that does not route through CommandOrchestrator. ## Decision -- decision: PDR-013 Agent Lifecycle FSM +- context: Agent start, pause, resume, stop, and reconfigure needed validated transitions with checkpoint status as the single source of truth. Lifecycle commands are infrastructure, not domain commands, and paused events must not replay as a storm on resume. Companion to PDR-011, PDR-012, and PDR-010. +- decision: Agent lifecycle uses the established event-driven Map pattern (not platform-fsm/defineFSM) over states stopped, active, paused, and error_recovery, stored on checkpoint status and applied to every checkpoint for an agentId. StartAgent, PauseAgent, ResumeAgent, StopAgent, and ReconfigureAgent are direct internalMutation calls that bypass CommandOrchestrator. While paused, EventBus still delivers events; the action returns a null decision and onComplete advances the checkpoint so events are seen-but-skipped. ReconfigureAgent stores runtime overrides (confidenceThreshold, patternWindowDuration, rateLimits) on the checkpoint and merges them with AgentBCConfig at execution; error_recovery trigger mechanics stay deferred to circuit-breaker design. +- rationale: defineFSM cannot attach named event triggers, the checkpoint table already has the four states, infrastructure commands must not cycle agent infra through command infra, and advancing paused checkpoints prevents replaying every event received during the pause. +- consequence: Invalid transitions are rejected with INVALID_LIFECYCLE_TRANSITION, and pause does not queue events for later catch-up. +- consequence: Operators who want catch-up after a pause must stop and rewind; pending routed commands and approvals are not cancelled by pause. diff --git a/specs/decisions/pdr-014-component-boundary-authentication-convention.sdp.md b/specs/decisions/pdr-014-component-boundary-authentication-convention.sdp.md index 01be321d..07a33ccb 100644 --- a/specs/decisions/pdr-014-component-boundary-authentication-convention.sdp.md +++ b/specs/decisions/pdr-014-component-boundary-authentication-convention.sdp.md @@ -2,15 +2,22 @@ id: spec:decisions.pdr-014-component-boundary-authentication-convention kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-014 - Component-Boundary Authentication Convention ## Intent -- outcome: PDR-014 - Component-Boundary Authentication Convention +- outcome: Verify actor identity inside each identity-bearing component mutation instead of trusting caller-supplied ids. ## Decision -- decision: PDR-014 - Component-Boundary Authentication Convention +- context: Convex component boundaries do not carry ctx.auth, yet caller and component still run in the same top-level transaction. The insecure gap is trust: component mutations treated caller-supplied reviewerId, agentId, boundedContext, or tenantId strings as authoritative. Components cannot read process.env, so verification cannot depend on bearer tokens or env-backed secrets inside the component. +- decision: Every identity-bearing component mutation in scope accepts a canonical verificationProof and calls verifyActor() before reading or writing component state. On success the verified proof is the source of truth; raw caller-supplied identity fields are only compared against the proof, never persisted as trusted values. The tranche-1 keystone packet migrates approve, reject, audit.record, agentCommands.record, and appendToStream together so none of those mutations still trust raw caller fields. +- rationale: A signed proof keeps the boundary explicit, rejects tampering, and composes with atomic parent mutations without leaking bearer tokens into the component. +- consequence: Wrong boundedContext, tenantId, reviewerId, or agentId claims are rejected before mutation writes, while the parent app still owns end-user authentication. +- consequence: Parent mutations and infrastructure clients must mint verificationProof objects, and component-local verification helpers duplicate the proof algorithm because component code cannot import the parent implementation. +- alternative: Pass a bearer or JWT token into the component, which leaks bearer material and couples the component to token semantics. +- alternative: Trust caller-supplied ids and only annotate callers, which leaves the trust vacuum in place. diff --git a/specs/decisions/pdr-015-global-position-numeric-representation.sdp.md b/specs/decisions/pdr-015-global-position-numeric-representation.sdp.md index 4a8e055e..083925db 100644 --- a/specs/decisions/pdr-015-global-position-numeric-representation.sdp.md +++ b/specs/decisions/pdr-015-global-position-numeric-representation.sdp.md @@ -2,15 +2,23 @@ id: spec:decisions.pdr-015-global-position-numeric-representation kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-015 - globalPosition Numeric Representation ## Intent -- outcome: PDR-015 - globalPosition Numeric Representation +- outcome: Represent event-store globalPosition exactly at real Date.now() scales without losing ordering. ## Decision -- decision: PDR-015 - globalPosition Numeric Representation +- context: The old representation combined Date.now() with hash and version arithmetic inside a JavaScript number. At current timestamps that exceeds Number.MAX_SAFE_INTEGER, so ordering and equality become lossy exactly where checkpoints and replay need exact comparisons. The new representation must stay indexable in Convex and readable from legacy numeric checkpoint documents. +- decision: Event Store events.globalPosition is Convex v.int64() at rest and TypeScript bigint at runtime, allocated as BigInt(timestamp) * 1_000_000n + BigInt(sequence) from a per-millisecond sequence 0..999999, clamping backwards clocks and overflowing into the next millisecond. New event-row writes use int64 only; checkpoint readers accept legacy number or canonical bigint through normalizeGlobalPosition() and persist canonical bigint on new writes. +- rationale: int64/bigint stays exact and indexable, keeps timestamp-derived ordering, and makes sequential appends strictly monotonic without hash buckets or version modulo wraparound. +- consequence: globalPosition comparisons are exact and monotonic at current timestamp scales, and legacy numeric checkpoints can still be read. +- consequence: Consumers that used number arithmetic such as subtraction, Math.max, or greater-than must migrate to shared bigint-aware helpers, and logs and UI must stringify bigint values. +- alternative: Keep a JavaScript number and adjust the formula, which remains unsafe at real timestamp scales. +- alternative: Fixed-width string positions, which couple lexical format into every comparison. +- alternative: A pure global counter, which loses timestamp decomposition and complicates compatibility with historical position magnitude. diff --git a/specs/decisions/pdr-016-projection-pool-split-named-pools-per-concern.sdp.md b/specs/decisions/pdr-016-projection-pool-split-named-pools-per-concern.sdp.md index 3f67240b..919dff38 100644 --- a/specs/decisions/pdr-016-projection-pool-split-named-pools-per-concern.sdp.md +++ b/specs/decisions/pdr-016-projection-pool-split-named-pools-per-concern.sdp.md @@ -2,15 +2,20 @@ id: spec:decisions.pdr-016-projection-pool-split-named-pools-per-concern kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-016 - projectionPool Split into Named Pools per Concern ## Intent -- outcome: PDR-016 - projectionPool Split into Named Pools per Concern +- outcome: Isolate primary projection work from saga routing and secondary fanout so they no longer share one Workpool. ## Decision -- decision: PDR-016 - projectionPool Split into Named Pools per Concern +- context: Tranche-2 adds more async traffic classes than a single projectionPool handled cleanly: primary projections are latency-sensitive, saga routing can compete with those updates, and wide fanout bursts can starve primary work. Upstream Workpool still does not provide a native FIFO key: ordering contract for general projection serialization, and this decision does not invent fake ordering around that missing feature. +- decision: OrchestratorDependencies requires three named pools: projectionPool for primary and failed projections, sagaPool for CommandOrchestrator.sagaRoute, and fanoutPool for secondary projections, the EventBus default pool, and IntegrationEventPublisher. The example app composition root mounts all three explicitly. +- rationale: Named pools make the topology explicit at the orchestrator boundary and insulate primary projection latency without claiming Workpool ordering the platform does not have. +- consequence: Primary projection latency is insulated from saga and fanout bursts, and those queues become separately observable. +- consequence: App infrastructure must mount and wire more named Workpool components, and tests and codegen must stay aligned with the expanded topology. diff --git a/specs/decisions/pdr-017-tranche-3-platform-architecture-gate.sdp.md b/specs/decisions/pdr-017-tranche-3-platform-architecture-gate.sdp.md index 3b6d93e6..7cdc2f1b 100644 --- a/specs/decisions/pdr-017-tranche-3-platform-architecture-gate.sdp.md +++ b/specs/decisions/pdr-017-tranche-3-platform-architecture-gate.sdp.md @@ -2,15 +2,20 @@ id: spec:decisions.pdr-017-tranche-3-platform-architecture-gate kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-017 - Tranche 3 Platform Architecture Gate ## Intent -- outcome: PDR-017 - Tranche 3 Platform Architecture Gate +- outcome: Choose the smallest tranche-3 packet that removes duplicated contracts without starting a platform-core or platform-store split. ## Decision -- decision: PDR-017 - Tranche 3 Platform Architecture Gate +- context: Tranche-3 work splits into cheap shared-contract extraction, medium cleanup and layering enforcement, and expensive full package splits. platform-core root exports are broad, platform-store and platform-bus still reach into platform-core, and too many consumers still import those broad surfaces, so a full split now would become a multi-package migration program. +- decision: Do not split platform-core or platform-store in tranche-3 packet 9. Extract EventCategory, ProcessManagerStatus, and DCB scope-key contracts into the zero-dependency package @libar-dev/platform-contracts-shared now; keep CommandBus and EventStore client classes as a deferred later replacement by functions; run P41 as a transitional lint:layers guard that freezes known bus/store reach-throughs; reject P42 and P43 for this packet while AC2 remains deferred follow-on work under this gate. +- rationale: Shared-contract extraction is the cheapest high-value boundary improvement and reduces duplication immediately without forcing a migration wave across every platform consumer. +- consequence: Tranche-3 closes real duplication now without starting an uncontrolled split, and later cleanup packets can proceed against resolved design questions. +- consequence: Root-export slimming, client-class removal, and remaining bus/store reach-throughs stay follow-on work, frozen from growing by the layering command. diff --git a/specs/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.sdp.md b/specs/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.sdp.md index 13fb8333..d939a45e 100644 --- a/specs/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.sdp.md +++ b/specs/decisions/pdr-018-idempotency-enforcement-for-append-to-stream.sdp.md @@ -2,15 +2,20 @@ id: spec:decisions.pdr-018-idempotency-enforcement-for-append-to-stream kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-018 - Idempotency Enforcement for appendToStream ## Intent -- outcome: PDR-018 - Idempotency Enforcement for appendToStream +- outcome: Make appendToStream honor idempotencyKey as an enforced contract instead of write-only metadata. ## Decision -- decision: PDR-018 - Idempotency Enforcement for appendToStream +- context: The old contract exposed and indexed events[].idempotencyKey and documented idempotent behavior, but the append path treated the key as write-only metadata, so retries could silently create duplicate or conflicting rows. Same key plus same payload must converge; same key plus different payload must not be silently deduplicated; idempotentAppendEvent() and appendToStream() must agree. +- decision: For every incoming event with an idempotencyKey, the Event Store fingerprints streamType, streamId, boundedContext, tenantId, eventType, category, schemaVersion, and payload. Same key and fingerprint returns duplicate with the original eventIds, globalPositions, and newVersion; same key and different fingerprint returns idempotency_conflict and persists an audit record; mixed or partial duplicate batches are rejected as idempotency_conflict; no key match continues normal append plus OCC. idempotentAppendEvent() follows the same rule rather than a softer pre-check. +- rationale: Semantic fingerprints distinguish retry of the same intent from conflicting reuse of a key, and a durable audit trail makes rejected attempts inspectable. +- consequence: Retries with the same intent converge to one durable event row, and conflicting key reuse is visible instead of swallowed. +- consequence: Direct appendToStream callers must handle duplicate and idempotency_conflict distinctly, and mixed duplicate batches cannot rely on partial success. diff --git a/specs/decisions/pdr-019-v-any-vs-v-unknown-boundary-policy.sdp.md b/specs/decisions/pdr-019-v-any-vs-v-unknown-boundary-policy.sdp.md index 5dbf975e..47ae5227 100644 --- a/specs/decisions/pdr-019-v-any-vs-v-unknown-boundary-policy.sdp.md +++ b/specs/decisions/pdr-019-v-any-vs-v-unknown-boundary-policy.sdp.md @@ -2,15 +2,20 @@ id: spec:decisions.pdr-019-v-any-vs-v-unknown-boundary-policy kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-019 - v.any() vs v.unknown() Boundary Policy ## Intent -- outcome: PDR-019 - v.any() vs v.unknown() Boundary Policy +- outcome: Keep flexible component payload fields open in shape while bounding their serialized size. ## Decision -- decision: PDR-019 - v.any() vs v.unknown() Boundary Policy +- context: Payload-like component boundaries intentionally store flexible values but used v.any() with no serialized-size guard, so type checks were weaker than needed and large payloads could cross the boundary until Convex or downstream code failed later. +- decision: Flexible storage and transport validators use v.unknown() instead of v.any(), with a default 64 KiB serialized-size cap that throws PAYLOAD_TOO_LARGE with field-specific context; a component may set a local constant when it needs a different cap. In-scope fields include payload, result, customState, configOverrides, failed-command payload, and debug context. +- rationale: v.unknown() plus an explicit size guard keeps the value shape flexible while making oversized failures deterministic before persistence. +- consequence: Oversized payload failures become deterministic and testable, and bus, store, and agent surfaces can share one validation helper. +- consequence: Callers that relied on arbitrarily large payloads now receive explicit rejections, and new flexible fields must opt into the shared size-guard policy. diff --git a/specs/decisions/pdr-020-events-table-index-policy.sdp.md b/specs/decisions/pdr-020-events-table-index-policy.sdp.md index c325023b..2b1758bd 100644 --- a/specs/decisions/pdr-020-events-table-index-policy.sdp.md +++ b/specs/decisions/pdr-020-events-table-index-policy.sdp.md @@ -2,15 +2,20 @@ id: spec:decisions.pdr-020-events-table-index-policy kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-020 - events Table Index Policy ## Intent -- outcome: PDR-020 - events Table Index Policy +- outcome: Align events-table indexes with the live readFromPosition path and drop unused indexes only after audit. ## Decision -- decision: PDR-020 - events Table Index Policy +- context: The event store had accumulated indexes whose usage no longer matched the active read path. Removing them too early would be a breaking change; leaving them forever keeps append cost higher than necessary. Consumers must migrate first, removal must be repo-backed, and re-adding a removed index remains the rollback. +- decision: Replace by_event_type with by_event_type_and_global_position for readFromPosition event-type filtering, and drop by_bounded_context, by_event_id, and by_category after audit showed no remaining in-repo consumer. Replay and catch-up consume { events, nextPosition, hasMore } from readFromPosition. A missed consumer discovered after merge is fixed by re-adding the required index in a follow-up patch. +- rationale: The replacement compound index matches pagination by event type and global position, and dead indexes are removed only after verified consumer usage so append cost drops without guessing. +- consequence: Event-type catch-up gets an index aligned to its pagination key, and dropping dead indexes reduces write amplification on events. +- consequence: Future event-table indexes require an explicit consumer audit before removal, and missed out-of-repo consumers still need a re-add path. diff --git a/specs/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.sdp.md b/specs/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.sdp.md index 2ac5073a..8907212e 100644 --- a/specs/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.sdp.md +++ b/specs/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core.sdp.md @@ -2,15 +2,20 @@ id: spec:decisions.pdr-021-platform-store-runtime-dependency-on-platform-core kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-021 - platform-store Runtime Dependency on platform-core Accepted with Constraints ## Intent -- outcome: PDR-021 - platform-store Runtime Dependency on platform-core Accepted with Constraints +- outcome: Record the live platform-store to platform-core runtime seam as a frozen public-subpath allowlist instead of calling the dependency phantom. ## Decision -- decision: PDR-021 - platform-store Runtime Dependency on platform-core Accepted with Constraints +- context: @libar-dev/platform-store still declares @libar-dev/platform-core because package managers operate at the package boundary. Live imports already use a narrow public subset (events, security, durability, validation, processManager). AC4 asked whether that dependency was phantom; AC2's full platform-core split remains deferred to PDR-017 follow-on work. +- decision: Keep the runtime dependency only for those five public subpaths. Forbid the platform-core root barrel, src/** internals, and any other platform-core surface (agent, orchestration, reservations, DCB, monitoring, testing). New imports outside the allowlist are not incremental convenience changes; further growth requires extracting a smaller boundary under the tranche-3 path rather than widening this set. +- rationale: Shared global-position, verification-proof, idempotency, validation, and process-manager invariants must stay identical across store and consumers without pretending the live seam does not exist or splitting packages in this packet. +- consequence: AC4 is resolved by recording the real dependency shape, and README, layer-policy, and future extraction work share one allowlist. +- consequence: platform-store still depends on platform-core at the package boundary until a later extraction, and growth beyond the approved set needs a follow-up decision. diff --git a/specs/decisions/pdr-022-value-transfer-doctrine-adoption.sdp.md b/specs/decisions/pdr-022-value-transfer-doctrine-adoption.sdp.md index c516f972..154f8bb5 100644 --- a/specs/decisions/pdr-022-value-transfer-doctrine-adoption.sdp.md +++ b/specs/decisions/pdr-022-value-transfer-doctrine-adoption.sdp.md @@ -2,15 +2,20 @@ id: spec:decisions.pdr-022-value-transfer-doctrine-adoption kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-022 Value-Transfer Doctrine Adoption and Naming Contract ## Intent -- outcome: PDR-022 Value-Transfer Doctrine Adoption and Naming Contract +- outcome: Adopt in-repo doctrine and keep semantic pattern names distinct from later executable-carrier artifact names. ## Decision -- decision: PDR-022 Value-Transfer Doctrine Adoption and Naming Contract +- context: Live architect sources cited doctrine that existed only on the off-branch architect-studio/.../_shared/ path, so guidance was not self-contained. The repo also needed a naming contract for shipped patterns whose executable carriers were created later, including whether EventStoreFoundationExecutableTests should replace the semantic name EventStoreFoundation or merely carry it. +- decision: The in-repo doctrine set under libar-platform/architect/_shared/ is the authoritative guidance for value transfer, annotation ownership, pattern-carrier relationships, maturity classification, and FSM interpretation. Semantic pattern names stay bare; ExecutableTests suffixes name the proving artifact only; @architect-implements is the durable continuity edge back to the bare name, while @architect-pattern on a carrier names the artifact node. +- rationale: Bare names remain the canonical references used by roadmap specs, decisions, and graph work, so executable carriers can exist without renaming the underlying concept. +- consequence: The repo no longer relies on off-branch doctrine paths, and executable carriers do not distort semantic pattern identity. +- consequence: Contributors must maintain the local doctrine surface and learn that artifact names are not interchangeable with semantic pattern names. diff --git a/specs/decisions/pdr-023-bulk-doctrine-rollback-and-recovery.sdp.md b/specs/decisions/pdr-023-bulk-doctrine-rollback-and-recovery.sdp.md index 89ac09e6..2651cf2a 100644 --- a/specs/decisions/pdr-023-bulk-doctrine-rollback-and-recovery.sdp.md +++ b/specs/decisions/pdr-023-bulk-doctrine-rollback-and-recovery.sdp.md @@ -2,15 +2,20 @@ id: spec:decisions.pdr-023-bulk-doctrine-rollback-and-recovery kind: decision altitude: feature -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:decisions.process --- # PDR-023 Bulk Doctrine Rollback and Recovery Governance ## Intent -- outcome: PDR-023 Bulk Doctrine Rollback and Recovery Governance +- outcome: Name how to undo a bulk doctrine packet, recover one pattern, or repair a transitional carrier without silent deferred work. ## Decision -- decision: PDR-023 Bulk Doctrine Rollback and Recovery Governance +- context: The doctrine cleanup branch deleted 19 standard gate-passing design specs, applied two narrative-only deletion exemptions, kept three specs blocked, and left four carve-out executable carriers completed but transitional. Review finding CI10 showed there was no in-repo protocol for undoing part of that packet; CI7, CI9, and CI12 showed deferred follow-up and reviewer duties were still mostly implicit. +- decision: Whole-packet failure is reverted as one git change set, then docs generation and the standard test.yml lanes rerun. Subset recovery restores only the affected spec and its paired continuity tags, carrier text, and report rows for that semantic pattern. A wrong transitional carve-out is repaired in place without restoring the deleted design spec. Deferred items T5-009 harness wiring, T5-010 expansion, saga fixture extraction, and commitlint stay named as deferred; release governance may summarize doctrine posture but must not become a second hard gate. +- rationale: Rollback decisions are made per semantic pattern group, not per touched file, so a live @architect-implements edge cannot point at a transfer that no longer claims to exist. +- consequence: Maintainers have a named protocol for restoring one pattern, one carve-out carrier, or the full packet, and deferred work stays visible instead of looking completed. +- consequence: Selective recovery still needs careful paired edits because git cannot infer semantic pattern boundaries, and transitional carve-out carriers plus missing commitlint remain until later follow-up. diff --git a/specs/platform.pack.sdp.md b/specs/platform.pack.sdp.md index 79860fab..32a9a7f2 100644 --- a/specs/platform.pack.sdp.md +++ b/specs/platform.pack.sdp.md @@ -123,7 +123,6 @@ specs: - spec:platform.saga-orchestration-executable-tests - spec:platform.saga-registry - spec:platform.saga-router - - spec:platform.test-content-blocks - spec:platform.test-environment-guards - spec:platform.test-isolation - spec:platform.themed-decision-architecture diff --git a/specs/platform/patterns/active-reservations-projection.sdp.md b/specs/platform/patterns/active-reservations-projection.sdp.md index da11554c..4bf99c90 100644 --- a/specs/platform/patterns/active-reservations-projection.sdp.md +++ b/specs/platform/patterns/active-reservations-projection.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "ActiveReservationsProjection" as an SDP Spec for delivery binding. +- outcome: Track active stock reservations and update stock levels from StockReserved, ReservationConfirmed, ReservationReleased, and ReservationExpired events using event data only. diff --git a/specs/platform/patterns/agent-action-handler.sdp.md b/specs/platform/patterns/agent-action-handler.sdp.md index ab17b548..c0134671 100644 --- a/specs/platform/patterns/agent-action-handler.sdp.md +++ b/specs/platform/patterns/agent-action-handler.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "AgentActionHandler" as an SDP Spec for delivery binding. +- outcome: Run the churn-risk agent action in a Workpool action context so it can call external LLM APIs while leaving all persistence to the onComplete mutation. diff --git a/specs/platform/patterns/agent-as-bounded-context.sdp.md b/specs/platform/patterns/agent-as-bounded-context.sdp.md index bae34530..096c2efc 100644 --- a/specs/platform/patterns/agent-as-bounded-context.sdp.md +++ b/specs/platform/patterns/agent-as-bounded-context.sdp.md @@ -9,4 +9,6 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "AgentAsBoundedContext" as an SDP Spec for delivery binding. +- outcome: Integrate AI agents into the event-driven architecture as bounded contexts that subscribe to events, detect patterns, and emit commands. +- problem: AI agents are invoked manually without integration into the event-driven architecture. No pattern for agents to react to business events. +- value: AI agents implemented as bounded contexts that subscribe to event streams via EventBus, detect patterns across events using LLM or rules, and emit commands based on detected patterns. diff --git a/specs/platform/patterns/agent-churn-risk-completion-executable-tests.sdp.md b/specs/platform/patterns/agent-churn-risk-completion-executable-tests.sdp.md index 038625c2..93e18ade 100644 --- a/specs/platform/patterns/agent-churn-risk-completion-executable-tests.sdp.md +++ b/specs/platform/patterns/agent-churn-risk-completion-executable-tests.sdp.md @@ -9,4 +9,5 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "AgentChurnRiskCompletionExecutableTests" as an SDP Spec for delivery binding. +- actor: a system operator +- outcome: Create dead letters for agent failures so that no events are silently lost during processing. diff --git a/specs/platform/patterns/agent-churn-risk-completion.sdp.md b/specs/platform/patterns/agent-churn-risk-completion.sdp.md index df285719..6af69826 100644 --- a/specs/platform/patterns/agent-churn-risk-completion.sdp.md +++ b/specs/platform/patterns/agent-churn-risk-completion.sdp.md @@ -9,4 +9,6 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "AgentChurnRiskCompletion" as an SDP Spec for delivery binding. +- outcome: Complete the churn-risk agent as a genuine AI agent reference so LLM failure retries to a dead letter, outreach commands create domain records, and the full pipeline is tested with a real LLM. +- problem: The churn-risk agent has working infrastructure from Phases 22a-22c but critical gaps prevent it from being a genuine AI agent reference: rule-based fallback defeats the AI purpose, command routing is a stub, and there is no end-to-end integration test with a real LLM. +- value: Remove the rule-based fallback, add a real outreach handler that emits OutreachCreated, add a full-pipeline OpenRouter integration test, add a BDD feature for the flow, and remove the rule-only highValueChurnPattern. diff --git a/specs/platform/patterns/agent-on-complete-handler.sdp.md b/specs/platform/patterns/agent-on-complete-handler.sdp.md index 402c2c6b..49f2e1b4 100644 --- a/specs/platform/patterns/agent-on-complete-handler.sdp.md +++ b/specs/platform/patterns/agent-on-complete-handler.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "AgentOnCompleteHandler" as an SDP Spec for delivery binding. +- outcome: Persist agent Workpool job results in a mutation so success writes audit, command, approval, and checkpoint last, while failure records a dead letter without advancing the checkpoint. diff --git a/specs/platform/patterns/app-composition-root.sdp.md b/specs/platform/patterns/app-composition-root.sdp.md index 264c66a5..5b93235b 100644 --- a/specs/platform/patterns/app-composition-root.sdp.md +++ b/specs/platform/patterns/app-composition-root.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "AppCompositionRoot" as an SDP Spec for delivery binding. +- outcome: Mount all Convex components and bounded contexts at the application composition root, including workpool, workflow, event store, command bus, rate limiter, agent BC, orders, and inventory. diff --git a/specs/platform/patterns/bdd-testing-infrastructure-executable-tests.sdp.md b/specs/platform/patterns/bdd-testing-infrastructure-executable-tests.sdp.md index 1f8b7ae5..e19cd34a 100644 --- a/specs/platform/patterns/bdd-testing-infrastructure-executable-tests.sdp.md +++ b/specs/platform/patterns/bdd-testing-infrastructure-executable-tests.sdp.md @@ -9,4 +9,5 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "BddTestingInfrastructureExecutableTests" as an SDP Spec for delivery binding. +- actor: a platform maintainer +- outcome: Give every platform package BDD coverage so public APIs are documented through executable specifications. diff --git a/specs/platform/patterns/bdd-testing-infrastructure.sdp.md b/specs/platform/patterns/bdd-testing-infrastructure.sdp.md index dcb5ae03..3123449a 100644 --- a/specs/platform/patterns/bdd-testing-infrastructure.sdp.md +++ b/specs/platform/patterns/bdd-testing-infrastructure.sdp.md @@ -9,4 +9,6 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "BddTestingInfrastructure" as an SDP Spec for delivery binding. +- outcome: Test domain logic with Gherkin so deciders map to Given/When/Then without Docker, and organized step definitions avoid conflicts. +- problem: Domain logic tests require infrastructure (Docker, database). Duplicate step definitions cause conflicts. Platform packages lack BDD tests. +- value: Behavior-driven development using Gherkin as the exclusive testing approach: pure deciders map to Given/When/Then, domain logic tests need no Docker, and step definition organization prevents conflicts. diff --git a/specs/platform/patterns/bdd-world.sdp.md b/specs/platform/patterns/bdd-world.sdp.md index 32d33264..f7e53404 100644 --- a/specs/platform/patterns/bdd-world.sdp.md +++ b/specs/platform/patterns/bdd-world.sdp.md @@ -9,4 +9,5 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "BDDWorld" as an SDP Spec for delivery binding. +- actor: a BDD test author +- outcome: Provide world and state management utilities so scenario context can be shared across steps. diff --git a/specs/platform/patterns/bounded-context-foundation-executable-tests.sdp.md b/specs/platform/patterns/bounded-context-foundation-executable-tests.sdp.md index b2939873..e3961e70 100644 --- a/specs/platform/patterns/bounded-context-foundation-executable-tests.sdp.md +++ b/specs/platform/patterns/bounded-context-foundation-executable-tests.sdp.md @@ -9,7 +9,7 @@ relations: {} ## Intent -- outcome: BoundedContextFoundation Executable Tests +- outcome: Execute coverage that Convex component databases stay isolated and DualWriteContextContract is the only typed path across bounded-context boundaries. ## Behavior diff --git a/specs/platform/patterns/bounded-context-foundation.sdp.md b/specs/platform/patterns/bounded-context-foundation.sdp.md index 2aa40b0f..4e614502 100644 --- a/specs/platform/patterns/bounded-context-foundation.sdp.md +++ b/specs/platform/patterns/bounded-context-foundation.sdp.md @@ -9,4 +9,14 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "BoundedContextFoundation" as an SDP Spec for delivery binding. +- outcome: Enforce DDD bounded-context boundaries with isolated Convex component databases and type-safe dual-write contracts so contexts cannot couple accidentally. +- problem: DDD Bounded Contexts need clear boundaries with physical enforcement, type-safe contracts, and domain purity (no infrastructure coupling in domain logic). Without physical isolation, accidental coupling between contexts undermines the benefits of domain-driven design. +- value: Convex Components provide physical database isolation. The platform-bc package defines BoundedContextIdentity, DualWriteContextContract, and CMS type definitions. + +## Behavior + +- rule: Components have isolated databases that parent cannot query directly +- rule: Sub-transactions are atomic within components +- rule: ctx.auth does not cross component boundaries +- rule: Id table types inside a component become string at the API boundary +- rule: DualWriteContextContract formalizes the bounded context API diff --git a/specs/platform/patterns/bounded-context-identity.sdp.md b/specs/platform/patterns/bounded-context-identity.sdp.md index d239e1b9..400dd67a 100644 --- a/specs/platform/patterns/bounded-context-identity.sdp.md +++ b/specs/platform/patterns/bounded-context-identity.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "BoundedContextIdentity" as an SDP Spec for delivery binding. +- outcome: Give each bounded context a core identification contract with name, description, version, and event stream prefixes for documentation, debugging, event routing, and cross-BC integration. diff --git a/specs/platform/patterns/cms-dual-write.sdp.md b/specs/platform/patterns/cms-dual-write.sdp.md index 0e4c4a54..c2632c2d 100644 --- a/specs/platform/patterns/cms-dual-write.sdp.md +++ b/specs/platform/patterns/cms-dual-write.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "CMSDualWrite" as an SDP Spec for delivery binding. +- outcome: Maintain a continuously updated Command Model State snapshot atomically alongside events in the dual-write pattern. diff --git a/specs/platform/patterns/cms-repository.sdp.md b/specs/platform/patterns/cms-repository.sdp.md index cdc6fedf..bcc42abc 100644 --- a/specs/platform/patterns/cms-repository.sdp.md +++ b/specs/platform/patterns/cms-repository.sdp.md @@ -9,7 +9,7 @@ relations: {} ## Intent -- outcome: CMS Repository +- outcome: Provide typed CMS data access with automatic schema upcasting so dual-write handlers can load, validate, and persist entities without repeating boilerplate. ## Behavior diff --git a/specs/platform/patterns/command-bus-foundation-executable-tests.sdp.md b/specs/platform/patterns/command-bus-foundation-executable-tests.sdp.md index 3bd84106..9244aa0c 100644 --- a/specs/platform/patterns/command-bus-foundation-executable-tests.sdp.md +++ b/specs/platform/patterns/command-bus-foundation-executable-tests.sdp.md @@ -9,7 +9,7 @@ relations: {} ## Intent -- outcome: CommandBusFoundation Executable Tests +- outcome: Execute coverage that command execution records once, tracks status, and follows the CommandOrchestrator so duplicate requests cannot corrupt domain state. ## Behavior diff --git a/specs/platform/patterns/command-bus-foundation.sdp.md b/specs/platform/patterns/command-bus-foundation.sdp.md index eca044d8..e1a560fb 100644 --- a/specs/platform/patterns/command-bus-foundation.sdp.md +++ b/specs/platform/patterns/command-bus-foundation.sdp.md @@ -9,4 +9,14 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "CommandBusFoundation" as an SDP Spec for delivery binding. +- outcome: Give command execution infrastructure-level idempotency, status tracking, and a single standardized flow from receipt through execution so duplicate requests cannot corrupt domain state. +- problem: Command execution requires idempotency (same command = same result), status tracking, and a standardized flow from receipt through execution. Without infrastructure-level idempotency, duplicate requests could corrupt domain state. +- value: The Command Bus provides commandId deduplication, status lifecycle tracking, the 7-step CommandOrchestrator, correlationId tracing, and TTL-based cleanup of expired command records. + +## Behavior + +- rule: Commands are idempotent via commandId deduplication +- rule: Status tracks the complete command lifecycle +- rule: The CommandOrchestrator is the only command execution path +- rule: correlationId links commands, events, and projections +- rule: Middleware provides composable cross-cutting concerns diff --git a/specs/platform/patterns/command-bus-idempotency.sdp.md b/specs/platform/patterns/command-bus-idempotency.sdp.md index 07f930a4..6297ce08 100644 --- a/specs/platform/patterns/command-bus-idempotency.sdp.md +++ b/specs/platform/patterns/command-bus-idempotency.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "CommandBusIdempotency" as an SDP Spec for delivery binding. +- outcome: Deduplicate commands by commandId so the same command always returns the cached result without re-execution. diff --git a/specs/platform/patterns/command-bus.sdp.md b/specs/platform/patterns/command-bus.sdp.md index e4b8eb82..fa359431 100644 --- a/specs/platform/patterns/command-bus.sdp.md +++ b/specs/platform/patterns/command-bus.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "CommandBus" as an SDP Spec for delivery binding. +- outcome: Provide a type-safe Convex Command Bus client that records commands once, tracks pending through executed, rejected, or failed status, and links command-event correlations for audit. diff --git a/specs/platform/patterns/command-orchestrator.sdp.md b/specs/platform/patterns/command-orchestrator.sdp.md index 0ef866d0..f498cec8 100644 --- a/specs/platform/patterns/command-orchestrator.sdp.md +++ b/specs/platform/patterns/command-orchestrator.sdp.md @@ -9,7 +9,7 @@ relations: {} ## Intent -- outcome: CommandOrchestrator partition key structure +- outcome: Run every command through the 7-step dual-write CommandOrchestrator and pass structured partition keys to primary, secondary, and failed projections while saga routing uses sagaPool. ## Behavior diff --git a/specs/platform/patterns/confirmed-order-cancellation-executable-tests.sdp.md b/specs/platform/patterns/confirmed-order-cancellation-executable-tests.sdp.md index 6905cb6e..8fc65d91 100644 --- a/specs/platform/patterns/confirmed-order-cancellation-executable-tests.sdp.md +++ b/specs/platform/patterns/confirmed-order-cancellation-executable-tests.sdp.md @@ -9,4 +9,5 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "ConfirmedOrderCancellationExecutableTests" as an SDP Spec for delivery binding. +- outcome: Execute coverage for cancelling confirmed orders and releasing their reservations so the Agent BC demo can record the three cancellations needed for churn-risk detection. +- problem: The Order FSM treats confirmed as terminal. Orders cannot be cancelled after saga confirmation, blocking the Agent BC demo which requires 3+ cancellations to trigger churn risk detection. diff --git a/specs/platform/patterns/correlation-chain-system.sdp.md b/specs/platform/patterns/correlation-chain-system.sdp.md index 012cbf76..edf95a56 100644 --- a/specs/platform/patterns/correlation-chain-system.sdp.md +++ b/specs/platform/patterns/correlation-chain-system.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "CorrelationChainSystem" as an SDP Spec for delivery binding. +- outcome: Track causal relationships in command-event flows with commandId, correlationId, and causationId so requests can be traced across bounded-context boundaries. diff --git a/specs/platform/patterns/cross-context-read-model.sdp.md b/specs/platform/patterns/cross-context-read-model.sdp.md index 2173cd08..df2ced8a 100644 --- a/specs/platform/patterns/cross-context-read-model.sdp.md +++ b/specs/platform/patterns/cross-context-read-model.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "CrossContextReadModel" as an SDP Spec for delivery binding. +- outcome: Combine data from multiple bounded contexts into unified app-level read models for the frontend. diff --git a/specs/platform/patterns/customer-cancellations-projection.sdp.md b/specs/platform/patterns/customer-cancellations-projection.sdp.md index c1b78621..c3c41883 100644 --- a/specs/platform/patterns/customer-cancellations-projection.sdp.md +++ b/specs/platform/patterns/customer-cancellations-projection.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "CustomerCancellationsProjection" as an SDP Spec for delivery binding. +- outcome: Keep a rolling 30-day customer cancellation history so the churn-risk agent can detect patterns via getCustomerCancellations. diff --git a/specs/platform/patterns/dcb-multi-product-reservation.sdp.md b/specs/platform/patterns/dcb-multi-product-reservation.sdp.md index 63dd89cf..db73aed0 100644 --- a/specs/platform/patterns/dcb-multi-product-reservation.sdp.md +++ b/specs/platform/patterns/dcb-multi-product-reservation.sdp.md @@ -10,7 +10,7 @@ relations: {} ## Intent - actor: a platform developer -- outcome: to see DCB demonstrated in the order submission flow so that I understand how to use executeWithDCB for multi-entity operations +- outcome: Demonstrate DCB in the order submission flow so executeWithDCB can reserve multiple products atomically. ## Behavior diff --git a/specs/platform/patterns/dcb-retry-execution.sdp.md b/specs/platform/patterns/dcb-retry-execution.sdp.md index 027c9668..5a581708 100644 --- a/specs/platform/patterns/dcb-retry-execution.sdp.md +++ b/specs/platform/patterns/dcb-retry-execution.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "DCBRetryExecution" as an SDP Spec for delivery binding. +- outcome: Integrate withDCBRetry into command handlers with a self-referential retry mutation that reschedules itself on OCC conflicts. diff --git a/specs/platform/patterns/dcb-scope-key-utilities.sdp.md b/specs/platform/patterns/dcb-scope-key-utilities.sdp.md index a22cc602..a0bdf92d 100644 --- a/specs/platform/patterns/dcb-scope-key-utilities.sdp.md +++ b/specs/platform/patterns/dcb-scope-key-utilities.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "DCBScopeKeyUtilities" as an SDP Spec for delivery binding. +- outcome: Re-export the canonical shared scope-key contract so platform packages create, parse, and validate tenant, scope type, and scope ID segments without duplicating helpers. diff --git a/specs/platform/patterns/dcb-types.sdp.md b/specs/platform/patterns/dcb-types.sdp.md index dbb687c2..960c466b 100644 --- a/specs/platform/patterns/dcb-types.sdp.md +++ b/specs/platform/patterns/dcb-types.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "DCBTypes" as an SDP Spec for delivery binding. +- outcome: Type scope-based multi-entity coordination within bounded contexts, including OCC operations, aggregated state, and DCB execution results. diff --git a/specs/platform/patterns/decider-outputs.sdp.md b/specs/platform/patterns/decider-outputs.sdp.md index a81c57e0..ee610969 100644 --- a/specs/platform/patterns/decider-outputs.sdp.md +++ b/specs/platform/patterns/decider-outputs.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Decider Output Helpers and Type Guards +- outcome: Encode command outcomes as success, rejected, or failed outputs that helpers construct and type guards can narrow. diff --git a/specs/platform/patterns/decider-pattern.sdp.md b/specs/platform/patterns/decider-pattern.sdp.md index cc8a4a96..125aa341 100644 --- a/specs/platform/patterns/decider-pattern.sdp.md +++ b/specs/platform/patterns/decider-pattern.sdp.md @@ -9,4 +9,14 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "DeciderPattern" as an SDP Spec for delivery binding. +- outcome: Separate domain logic into pure decide and evolve functions so aggregates stay immutable and tests need no infrastructure. +- problem: Domain logic embedded in handlers makes testing require infrastructure. Mutable aggregates complicate state management and prevent property-based testing. +- value: The Decider pattern separates domain logic into pure functions: decide(state, command) returns events, and evolve(state, event) returns the next state. + +## Behavior + +- rule: Deciders must be pure functions +- rule: DeciderOutput encodes three outcomes +- rule: FSM enforces valid state transitions +- rule: Evolve functions use event payload as source of truth +- rule: Handler factories wrap deciders with infrastructure diff --git a/specs/platform/patterns/dual-write-contract.sdp.md b/specs/platform/patterns/dual-write-contract.sdp.md index 6addfda8..a2d32b45 100644 --- a/specs/platform/patterns/dual-write-contract.sdp.md +++ b/specs/platform/patterns/dual-write-contract.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "DualWriteContract" as an SDP Spec for delivery binding. +- outcome: Declare a type-safe dual-write contract for each bounded context so command types, event types, and CMS tables are verified at compile time. diff --git a/specs/platform/patterns/durable-append-action.sdp.md b/specs/platform/patterns/durable-append-action.sdp.md index 11d688b7..ed9d00ca 100644 --- a/specs/platform/patterns/durable-append-action.sdp.md +++ b/specs/platform/patterns/durable-append-action.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "DurableAppendAction" as an SDP Spec for delivery binding. +- outcome: Append events through a Workpool-backed action that retries failed appends and records exhausted failures in eventAppendDeadLetters. diff --git a/specs/platform/patterns/durable-events-integration-executable-tests.sdp.md b/specs/platform/patterns/durable-events-integration-executable-tests.sdp.md index 126bd1c2..345ee855 100644 --- a/specs/platform/patterns/durable-events-integration-executable-tests.sdp.md +++ b/specs/platform/patterns/durable-events-integration-executable-tests.sdp.md @@ -9,4 +9,5 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "DurableEventsIntegrationExecutableTests" as an SDP Spec for delivery binding. +- outcome: Execute coverage that the order-management command flow uses Phase 18 durability primitives instead of leaving them only in test harnesses. +- problem: Phase 18 delivered durability primitives to platform-core, but the example app's main command flow still uses direct event append. Durability patterns exist only in test harnesses, not in the production order and inventory flows. diff --git a/specs/platform/patterns/durable-events-integration.sdp.md b/specs/platform/patterns/durable-events-integration.sdp.md index 4132df09..8a5dae70 100644 --- a/specs/platform/patterns/durable-events-integration.sdp.md +++ b/specs/platform/patterns/durable-events-integration.sdp.md @@ -9,4 +9,6 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "DurableEventsIntegration" as an SDP Spec for delivery binding. +- outcome: Integrate Phase 18 durability primitives into the order-management command flow so users see idempotent append, intent bracketing, durable publication, outbox, poison handling, and projection rebuild in production paths. +- problem: Phase 18 delivered durability primitives to platform-core, but the example app's main command flow still uses direct event append. Durability patterns exist only in test harnesses, not in the production order and inventory flows. +- value: Integrate idempotent event append, intent/completion bracketing, durable event publication, outbox handlers, poison event handling, and projection rebuild into the main order management flow. diff --git a/specs/platform/patterns/durable-function-adapters.sdp.md b/specs/platform/patterns/durable-function-adapters.sdp.md index 538c0e62..53fb904f 100644 --- a/specs/platform/patterns/durable-function-adapters.sdp.md +++ b/specs/platform/patterns/durable-function-adapters.sdp.md @@ -9,4 +9,6 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "DurableFunctionAdapters" as an SDP Spec for delivery binding. +- outcome: Bridge platform interfaces to production Convex durable components so rate limiting is persisted and DCB OCC conflicts retry through Workpool instead of in-memory fallbacks. +- problem: The platform has well-defined interfaces (RateLimitChecker, DCB conflict handling) but uses in-memory implementations not suitable for production. DCB returns conflict status but callers must implement manual retry logic. +- value: Minimal adapters connect RateLimitChecker to the Convex rate limiter and wrap executeWithDCB with Workpool-based OCC retry, then delete in-memory implementations. diff --git a/specs/platform/patterns/dynamic-consistency-boundaries.sdp.md b/specs/platform/patterns/dynamic-consistency-boundaries.sdp.md index e06b04b3..d9f753e9 100644 --- a/specs/platform/patterns/dynamic-consistency-boundaries.sdp.md +++ b/specs/platform/patterns/dynamic-consistency-boundaries.sdp.md @@ -9,4 +9,6 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "DynamicConsistencyBoundaries" as an SDP Spec for delivery binding. +- outcome: Enforce cross-entity invariants inside a bounded context by applying OCC to a runtime scope instead of sequential commands or saga compensation. +- problem: Cross-entity invariants within a bounded context currently require sequential commands (no atomicity) or saga coordination (eventual consistency). This leads to complex compensation logic and race conditions between related entities that should be validated together. +- value: DCB groups related entities into a scope, applies OCC on the scope rather than individual entities, and uses correlation chains to track the boundary. diff --git a/specs/platform/patterns/ecst-fat-events.sdp.md b/specs/platform/patterns/ecst-fat-events.sdp.md index ed48f2d7..14ad0039 100644 --- a/specs/platform/patterns/ecst-fat-events.sdp.md +++ b/specs/platform/patterns/ecst-fat-events.sdp.md @@ -9,4 +9,6 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "EcstFatEvents" as an SDP Spec for delivery binding. +- outcome: Carry full consumer context on events so downstream services can process them without querying the source bounded context. +- problem: Thin events require consumers to query back to the source BC, creating coupling and requiring synchronous communication. +- value: Event-Carried State Transfer (ECST) events carry full context for downstream consumers, eliminating back-queries. diff --git a/specs/platform/patterns/event-bus-abstraction.sdp.md b/specs/platform/patterns/event-bus-abstraction.sdp.md index 79c4f409..d16b3923 100644 --- a/specs/platform/patterns/event-bus-abstraction.sdp.md +++ b/specs/platform/patterns/event-bus-abstraction.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "EventBusAbstraction" as an SDP Spec for delivery binding. +- outcome: Publish domain events to matching Workpool subscriptions with parallelism, retries, dead-letter handling, and priority-based ordering. diff --git a/specs/platform/patterns/event-replay-infrastructure.sdp.md b/specs/platform/patterns/event-replay-infrastructure.sdp.md index 883b99cc..11d3fe16 100644 --- a/specs/platform/patterns/event-replay-infrastructure.sdp.md +++ b/specs/platform/patterns/event-replay-infrastructure.sdp.md @@ -9,4 +9,6 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "EventReplayInfrastructure" as an SDP Spec for delivery binding. +- outcome: Rebuild corrupted or migrated projections from the Event Store with checkpointed Workpool chunks so failed rebuilds resume instead of starting over. +- problem: When projections become corrupted, require schema migration, or drift from the Event Store, there is no infrastructure to replay events and rebuild them. Manual intervention requires direct database access and risks data inconsistency. +- value: A checkpoint-based replay system with a dedicated low-priority Workpool, chunked processing, admin mutations, and atomic next-chunk scheduling. diff --git a/specs/platform/patterns/event-store-durability.sdp.md b/specs/platform/patterns/event-store-durability.sdp.md index 6a368b1e..6002124a 100644 --- a/specs/platform/patterns/event-store-durability.sdp.md +++ b/specs/platform/patterns/event-store-durability.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "EventStoreDurability" as an SDP Spec for delivery binding. +- outcome: Provide guaranteed Convex-native event persistence through outbox, idempotent append, durable append, durable publication, intent/completion bracketing, and poison-event quarantine. diff --git a/specs/platform/patterns/event-store-foundation-executable-tests.sdp.md b/specs/platform/patterns/event-store-foundation-executable-tests.sdp.md index 10b148d9..e2a1d8d2 100644 --- a/specs/platform/patterns/event-store-foundation-executable-tests.sdp.md +++ b/specs/platform/patterns/event-store-foundation-executable-tests.sdp.md @@ -9,7 +9,7 @@ relations: {} ## Intent -- outcome: EventStoreFoundation Executable Tests +- outcome: Execute coverage that event streams append immutably with OCC, global positioning, and checkpointed projection reads. ## Behavior diff --git a/specs/platform/patterns/event-store-foundation.sdp.md b/specs/platform/patterns/event-store-foundation.sdp.md index 729bb5de..9d548383 100644 --- a/specs/platform/patterns/event-store-foundation.sdp.md +++ b/specs/platform/patterns/event-store-foundation.sdp.md @@ -9,4 +9,14 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "EventStoreFoundation" as an SDP Spec for delivery binding. +- outcome: Store domain events in versioned streams with OCC, global positioning, and category-aware read APIs so bounded contexts can keep audit trails and projection read models. +- problem: Event Sourcing requires centralized storage for domain events with ordering guarantees, concurrency control, and query capabilities for projections. Without infrastructure for stream-based storage, bounded contexts cannot maintain audit trails or support projection-based read models. +- value: The Event Store component provides stream-based storage with expectedVersion OCC, global positioning, appendToStream/readStream/readFromPosition APIs, event category taxonomy, and schema versioning. + +## Behavior + +- rule: Events are immutable once appended +- rule: Streams provide per-entity ordering via version numbers +- rule: globalPosition enables total ordering across all streams +- rule: OCC prevents concurrent modification conflicts +- rule: Checkpoints enable projection resumption with exactly-once semantics diff --git a/specs/platform/patterns/event-store.sdp.md b/specs/platform/patterns/event-store.sdp.md index 418d3238..9e7a5c39 100644 --- a/specs/platform/patterns/event-store.sdp.md +++ b/specs/platform/patterns/event-store.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "EventStore" as an SDP Spec for delivery binding. +- outcome: Provide a type-safe Convex Event Store client with optimistic concurrency and global ordering for dual-write appends and projection reads. diff --git a/specs/platform/patterns/event-subscription-registry.sdp.md b/specs/platform/patterns/event-subscription-registry.sdp.md index a619855b..cf8d32fa 100644 --- a/specs/platform/patterns/event-subscription-registry.sdp.md +++ b/specs/platform/patterns/event-subscription-registry.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "EventSubscriptionRegistry" as an SDP Spec for delivery binding. +- outcome: Register EventBus subscriptions for process managers at priority 200 and agents at priority 250 without duplicating CommandConfig projection routes. diff --git a/specs/platform/patterns/event-upcasting.sdp.md b/specs/platform/patterns/event-upcasting.sdp.md index 0064fbeb..3874dcab 100644 --- a/specs/platform/patterns/event-upcasting.sdp.md +++ b/specs/platform/patterns/event-upcasting.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "EventUpcasting" as an SDP Spec for delivery binding. +- outcome: Transform older event schema versions to the current version at read time so stored events can evolve without breaking projections or replay. diff --git a/specs/platform/patterns/example-app-architecture.sdp.md b/specs/platform/patterns/example-app-architecture.sdp.md index d2167b15..97ef5c27 100644 --- a/specs/platform/patterns/example-app-architecture.sdp.md +++ b/specs/platform/patterns/example-app-architecture.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "ExampleAppArchitecture" as an SDP Spec for delivery binding. +- outcome: Document the order-management reference architecture as Convex-native DDD/ES/CQRS with dual-write CMS snapshots, physically isolated bounded contexts, and built-in Workpool orchestration. diff --git a/specs/platform/patterns/example-app-modernization-executable-tests.sdp.md b/specs/platform/patterns/example-app-modernization-executable-tests.sdp.md index b15348c2..e761ef98 100644 --- a/specs/platform/patterns/example-app-modernization-executable-tests.sdp.md +++ b/specs/platform/patterns/example-app-modernization-executable-tests.sdp.md @@ -9,4 +9,5 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "ExampleAppModernizationExecutableTests" as an SDP Spec for delivery binding. +- outcome: Execute coverage that the order-management example demonstrates DCB, reactive projections, and fat events after the one-time modernization freeze. +- problem: The order-management example app grew organically during platform development. It does not demonstrate DCB, ReactiveProjections, or Fat Events from Phases 16-20. diff --git a/specs/platform/patterns/example-app-modernization.sdp.md b/specs/platform/patterns/example-app-modernization.sdp.md index 91baff5b..ece41104 100644 --- a/specs/platform/patterns/example-app-modernization.sdp.md +++ b/specs/platform/patterns/example-app-modernization.sdp.md @@ -9,4 +9,6 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "ExampleAppModernization" as an SDP Spec for delivery binding. +- outcome: Modernize the order-management example once to demonstrate DCB, reactive projections, and fat events, then freeze it as a reference implementation. +- problem: The order-management example app grew organically during platform development. It does not demonstrate DCB, ReactiveProjections, or Fat Events from Phases 16-20, and full e2e coverage treats it like a production app. +- value: Add targeted demonstrations of each new platform pattern, designate the app as a reference implementation, and establish post-freeze change boundaries. diff --git a/specs/platform/patterns/fsm-transitions.sdp.md b/specs/platform/patterns/fsm-transitions.sdp.md index e7a27ead..22a900ba 100644 --- a/specs/platform/patterns/fsm-transitions.sdp.md +++ b/specs/platform/patterns/fsm-transitions.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: FSM State Transitions +- outcome: Prevent invalid aggregate state transitions at runtime with explicit FSM rules and clear error messages. diff --git a/specs/platform/patterns/handler-factories.sdp.md b/specs/platform/patterns/handler-factories.sdp.md index dd888d7d..95447bfc 100644 --- a/specs/platform/patterns/handler-factories.sdp.md +++ b/specs/platform/patterns/handler-factories.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "HandlerFactories" as an SDP Spec for delivery binding. +- outcome: Wrap pure deciders with infrastructure so command handlers can load state, persist dual-write results, and keep domain logic unit-testable without a database. diff --git a/specs/platform/patterns/integration-dead-letters.sdp.md b/specs/platform/patterns/integration-dead-letters.sdp.md index 082fd938..175ce142 100644 --- a/specs/platform/patterns/integration-dead-letters.sdp.md +++ b/specs/platform/patterns/integration-dead-letters.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "IntegrationDeadLetters" as an SDP Spec for delivery binding. +- outcome: Manage a dead-letter queue for failed cross-context event publications so operators can replay or ignore poisoned integration work. diff --git a/specs/platform/patterns/integration-event-handlers.sdp.md b/specs/platform/patterns/integration-event-handlers.sdp.md index 9d6012e2..e7c8f2f7 100644 --- a/specs/platform/patterns/integration-event-handlers.sdp.md +++ b/specs/platform/patterns/integration-event-handlers.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "IntegrationEventHandlers" as an SDP Spec for delivery binding. +- outcome: Process Published Language integration events and dispatch them to the appropriate bounded-context commands. diff --git a/specs/platform/patterns/integration-event-schemas.sdp.md b/specs/platform/patterns/integration-event-schemas.sdp.md index d0dd9a2c..1fab4adc 100644 --- a/specs/platform/patterns/integration-event-schemas.sdp.md +++ b/specs/platform/patterns/integration-event-schemas.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "IntegrationEventSchemas" as an SDP Spec for delivery binding. +- outcome: Define Published Language schemas that form the contract for cross-context integration events. diff --git a/specs/platform/patterns/integration-patterns-21-a.sdp.md b/specs/platform/patterns/integration-patterns-21-a.sdp.md index 5187c58b..c0e0d917 100644 --- a/specs/platform/patterns/integration-patterns-21-a.sdp.md +++ b/specs/platform/patterns/integration-patterns-21-a.sdp.md @@ -9,4 +9,6 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "IntegrationPatterns21a" as an SDP Spec for delivery binding. +- outcome: Replace ad-hoc cross-context event coupling with a Context Map, Published Language, and Anti-Corruption Layer. +- problem: Cross-context communication is ad-hoc. Domain events are used directly for integration without explicit contracts, leading to tight coupling. +- value: Foundational patterns for cross-context communication: Context Map documents BC relationships, Published Language defines stable integration schemas, and ACL translates external models. diff --git a/specs/platform/patterns/integration-patterns-21-b.sdp.md b/specs/platform/patterns/integration-patterns-21-b.sdp.md index aace48c0..344431ba 100644 --- a/specs/platform/patterns/integration-patterns-21-b.sdp.md +++ b/specs/platform/patterns/integration-patterns-21-b.sdp.md @@ -9,4 +9,6 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "IntegrationPatterns21b" as an SDP Spec for delivery binding. +- outcome: Evolve integration schemas with upcasters, downcasters, and contract tests so producer-consumer mismatches fail before runtime. +- problem: Schema evolution breaks consumers. No tooling validates producer-consumer compatibility, leading to runtime failures and integration bugs. +- value: Schema evolution and contract testing patterns: upcasters and downcasters migrate versions, contract tests validate compatibility, and violation detection reports mismatches. diff --git a/specs/platform/patterns/integration-routes.sdp.md b/specs/platform/patterns/integration-routes.sdp.md index 81730b6c..dfbc5d45 100644 --- a/specs/platform/patterns/integration-routes.sdp.md +++ b/specs/platform/patterns/integration-routes.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "IntegrationRoutes" as an SDP Spec for delivery binding. +- outcome: Translate internal domain events to integration events for external consumers, currently mapping OrderSubmitted to OrderPlacedIntegration. diff --git a/specs/platform/patterns/invariant-framework.sdp.md b/specs/platform/patterns/invariant-framework.sdp.md index c6584da1..dda18f35 100644 --- a/specs/platform/patterns/invariant-framework.sdp.md +++ b/specs/platform/patterns/invariant-framework.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "InvariantFramework" as an SDP Spec for delivery binding. +- outcome: Create declarative business-rule invariants with check, assert, and validate from a single configuration object so validation stays type-safe and consistent. diff --git a/specs/platform/patterns/inventory-command-configs.sdp.md b/specs/platform/patterns/inventory-command-configs.sdp.md index a0506da2..9a68ffdd 100644 --- a/specs/platform/patterns/inventory-command-configs.sdp.md +++ b/specs/platform/patterns/inventory-command-configs.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "InventoryCommandConfigs" as an SDP Spec for delivery binding. +- outcome: Wire seven inventory commands to their primary and secondary projections, including the cross-context orderWithInventory projection. diff --git a/specs/platform/patterns/inventory-command-handlers.sdp.md b/specs/platform/patterns/inventory-command-handlers.sdp.md index 302f3fc9..99f06155 100644 --- a/specs/platform/patterns/inventory-command-handlers.sdp.md +++ b/specs/platform/patterns/inventory-command-handlers.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "InventoryCommandHandlers" as an SDP Spec for delivery binding. +- outcome: Handle inventory commands with the dual-write sequence: load CMS, lazy-upcast, validate invariants, apply logic, update CMS, and return event data for app-level persistence. diff --git a/specs/platform/patterns/inventory-deciders.sdp.md b/specs/platform/patterns/inventory-deciders.sdp.md index cfdbc8fb..f57f8af1 100644 --- a/specs/platform/patterns/inventory-deciders.sdp.md +++ b/specs/platform/patterns/inventory-deciders.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "InventoryDeciders" as an SDP Spec for delivery binding. +- outcome: Decide inventory product and reservation outcomes with pure functions that enforce SKU uniqueness, stock sufficiency, and reservation lifecycle invariants without I/O. diff --git a/specs/platform/patterns/inventory-domain-events.sdp.md b/specs/platform/patterns/inventory-domain-events.sdp.md index 30a3250b..cb1ad655 100644 --- a/specs/platform/patterns/inventory-domain-events.sdp.md +++ b/specs/platform/patterns/inventory-domain-events.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "InventoryDomainEvents" as an SDP Spec for delivery binding. +- outcome: Publish the seven Inventory bounded-context domain events covering product lifecycle and reservation reserved, failed, confirmed, released, and expired. diff --git a/specs/platform/patterns/inventory-internal-mutations.sdp.md b/specs/platform/patterns/inventory-internal-mutations.sdp.md index 91d0962e..604dea37 100644 --- a/specs/platform/patterns/inventory-internal-mutations.sdp.md +++ b/specs/platform/patterns/inventory-internal-mutations.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "InventoryInternalMutations" as an SDP Spec for delivery binding. +- outcome: Expose internal inventory mutations that sagas and process managers can invoke for programmatic inventory commands. diff --git a/specs/platform/patterns/inventory-public-api.sdp.md b/specs/platform/patterns/inventory-public-api.sdp.md index e895f842..4a44afad 100644 --- a/specs/platform/patterns/inventory-public-api.sdp.md +++ b/specs/platform/patterns/inventory-public-api.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "InventoryPublicAPI" as an SDP Spec for delivery binding. +- outcome: Expose an app-level Inventory public API whose mutations run through the CommandOrchestrator for external consumers. diff --git a/specs/platform/patterns/logging-infrastructure.sdp.md b/specs/platform/patterns/logging-infrastructure.sdp.md index 618a279a..3f61c347 100644 --- a/specs/platform/patterns/logging-infrastructure.sdp.md +++ b/specs/platform/patterns/logging-infrastructure.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "LoggingInfrastructure" as an SDP Spec for delivery binding. +- outcome: Create domain-specific loggers with scope prefixes and level filtering so platform components share a consistent Workpool-style logging surface. diff --git a/specs/platform/patterns/mock-payment-actions.sdp.md b/specs/platform/patterns/mock-payment-actions.sdp.md index 26f67d82..2503f892 100644 --- a/specs/platform/patterns/mock-payment-actions.sdp.md +++ b/specs/platform/patterns/mock-payment-actions.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "MockPaymentActions" as an SDP Spec for delivery binding. +- outcome: Simulate an external Stripe charge as a mock action for integration testing until production replaces it with the real Stripe SDK. diff --git a/specs/platform/patterns/order-command-configs.sdp.md b/specs/platform/patterns/order-command-configs.sdp.md index 29da0b07..d19613e1 100644 --- a/specs/platform/patterns/order-command-configs.sdp.md +++ b/specs/platform/patterns/order-command-configs.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "OrderCommandConfigs" as an SDP Spec for delivery binding. +- outcome: Wire six order commands to their primary and secondary projections, saga routes, and integration events. diff --git a/specs/platform/patterns/order-command-handlers.sdp.md b/specs/platform/patterns/order-command-handlers.sdp.md index 2034b7fc..c51e0c7c 100644 --- a/specs/platform/patterns/order-command-handlers.sdp.md +++ b/specs/platform/patterns/order-command-handlers.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "OrderCommandHandlers" as an SDP Spec for delivery binding. +- outcome: Handle order commands with the dual-write sequence and return event data so the app layer persists events and triggers projections across component boundaries. diff --git a/specs/platform/patterns/order-deciders.sdp.md b/specs/platform/patterns/order-deciders.sdp.md index 5b532300..734e45c2 100644 --- a/specs/platform/patterns/order-deciders.sdp.md +++ b/specs/platform/patterns/order-deciders.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "OrderDeciders" as an SDP Spec for delivery binding. +- outcome: Decide Order aggregate outcomes with pure functions that validate invariants and produce events without I/O or Convex context. diff --git a/specs/platform/patterns/order-domain-events.sdp.md b/specs/platform/patterns/order-domain-events.sdp.md index 480af3f0..d6a2d168 100644 --- a/specs/platform/patterns/order-domain-events.sdp.md +++ b/specs/platform/patterns/order-domain-events.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "OrderDomainEvents" as an SDP Spec for delivery binding. +- outcome: Publish the six Orders domain event types, including V2 OrderSubmitted with a CustomerSnapshot fat event, and upcast V1 events at read time. diff --git a/specs/platform/patterns/order-fulfillment-saga.sdp.md b/specs/platform/patterns/order-fulfillment-saga.sdp.md index 391fe867..79983ccb 100644 --- a/specs/platform/patterns/order-fulfillment-saga.sdp.md +++ b/specs/platform/patterns/order-fulfillment-saga.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "OrderFulfillmentSaga" as an SDP Spec for delivery binding. +- outcome: Coordinate order fulfillment across contexts by reserving inventory on OrderSubmitted, confirming on success, and cancelling the order as compensation on failure. diff --git a/specs/platform/patterns/order-items-projection.sdp.md b/specs/platform/patterns/order-items-projection.sdp.md index 2cdec190..fc065766 100644 --- a/specs/platform/patterns/order-items-projection.sdp.md +++ b/specs/platform/patterns/order-items-projection.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "OrderItemsProjection" as an SDP Spec for delivery binding. +- outcome: Maintain an order line-item read model that upserts items from OrderItemAdded and OrderItemRemoved events. diff --git a/specs/platform/patterns/order-management-infrastructure.sdp.md b/specs/platform/patterns/order-management-infrastructure.sdp.md index 775926d5..091d74af 100644 --- a/specs/platform/patterns/order-management-infrastructure.sdp.md +++ b/specs/platform/patterns/order-management-infrastructure.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "OrderManagementInfrastructure" as an SDP Spec for delivery binding. +- outcome: Initialize Workpool, Workflow, and the other infrastructure components required by the order-management application. diff --git a/specs/platform/patterns/order-notification-pm.sdp.md b/specs/platform/patterns/order-notification-pm.sdp.md index b5f33ce7..7f1e8fb0 100644 --- a/specs/platform/patterns/order-notification-pm.sdp.md +++ b/specs/platform/patterns/order-notification-pm.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "OrderNotificationPM" as an SDP Spec for delivery binding. +- outcome: React to OrderConfirmed with a fire-and-forget SendNotification command via an EventBus process manager at priority 200. diff --git a/specs/platform/patterns/order-public-api.sdp.md b/specs/platform/patterns/order-public-api.sdp.md index d29053bf..779cc76b 100644 --- a/specs/platform/patterns/order-public-api.sdp.md +++ b/specs/platform/patterns/order-public-api.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "OrderPublicAPI" as an SDP Spec for delivery binding. +- outcome: Expose an app-level Orders public API whose mutations run through the CommandOrchestrator for external consumers. diff --git a/specs/platform/patterns/order-summary-projection.sdp.md b/specs/platform/patterns/order-summary-projection.sdp.md index ee1f46aa..90924516 100644 --- a/specs/platform/patterns/order-summary-projection.sdp.md +++ b/specs/platform/patterns/order-summary-projection.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "OrderSummaryProjection" as an SDP Spec for delivery binding. +- outcome: Update the orderSummaries read model from order events only, using globalPosition checkpoints and poison-event handling. diff --git a/specs/platform/patterns/order-with-inventory-projection.sdp.md b/specs/platform/patterns/order-with-inventory-projection.sdp.md index 59d75624..e73c1d9e 100644 --- a/specs/platform/patterns/order-with-inventory-projection.sdp.md +++ b/specs/platform/patterns/order-with-inventory-projection.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "OrderWithInventoryProjection" as an SDP Spec for delivery binding. +- outcome: Combine order status with inventory reservation status in an app-level projection fed by both Orders and Inventory events. diff --git a/specs/platform/patterns/payment-outbox-handler.sdp.md b/specs/platform/patterns/payment-outbox-handler.sdp.md index 87afa927..a3cb2017 100644 --- a/specs/platform/patterns/payment-outbox-handler.sdp.md +++ b/specs/platform/patterns/payment-outbox-handler.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "PaymentOutboxHandler" as an SDP Spec for delivery binding. +- outcome: Capture payment action success or failure as domain events through an outbox onComplete handler so later processing failures cannot lose the result. diff --git a/specs/platform/patterns/polling-utilities.sdp.md b/specs/platform/patterns/polling-utilities.sdp.md index f9bd656c..71debe41 100644 --- a/specs/platform/patterns/polling-utilities.sdp.md +++ b/specs/platform/patterns/polling-utilities.sdp.md @@ -9,4 +9,5 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "PollingUtilities" as an SDP Spec for delivery binding. +- actor: a developer writing integration tests +- outcome: Provide async polling utilities so tests can wait for Workpool projections and other eventual-consistency patterns. diff --git a/specs/platform/patterns/process-manager-lifecycle.sdp.md b/specs/platform/patterns/process-manager-lifecycle.sdp.md index 6fdf9c07..14cc60e1 100644 --- a/specs/platform/patterns/process-manager-lifecycle.sdp.md +++ b/specs/platform/patterns/process-manager-lifecycle.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "ProcessManagerLifecycle" as an SDP Spec for delivery binding. +- outcome: Validate process-manager transitions among idle, processing, completed, and failed so invalid lifecycle changes are rejected. diff --git a/specs/platform/patterns/process-manager.sdp.md b/specs/platform/patterns/process-manager.sdp.md index f21c8089..594bfe08 100644 --- a/specs/platform/patterns/process-manager.sdp.md +++ b/specs/platform/patterns/process-manager.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "ProcessManager" as an SDP Spec for delivery binding. +- outcome: React to events by emitting fire-and-forget commands without saga compensation or projection read-model updates. diff --git a/specs/platform/patterns/product-catalog-projection.sdp.md b/specs/platform/patterns/product-catalog-projection.sdp.md index 4f802527..c6932955 100644 --- a/specs/platform/patterns/product-catalog-projection.sdp.md +++ b/specs/platform/patterns/product-catalog-projection.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "ProductCatalogProjection" as an SDP Spec for delivery binding. +- outcome: Maintain a product catalog read model from ProductCreated and StockAdded events and update stockAvailability as a secondary projection. diff --git a/specs/platform/patterns/projection-categories-executable-tests.sdp.md b/specs/platform/patterns/projection-categories-executable-tests.sdp.md index 444e1f42..0717ec27 100644 --- a/specs/platform/patterns/projection-categories-executable-tests.sdp.md +++ b/specs/platform/patterns/projection-categories-executable-tests.sdp.md @@ -9,4 +9,5 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "ProjectionCategoriesExecutableTests" as an SDP Spec for delivery binding. +- actor: a platform developer +- outcome: Query projections by category from the registry so each purpose can target the matching projection types. diff --git a/specs/platform/patterns/projection-categories.sdp.md b/specs/platform/patterns/projection-categories.sdp.md index d5f0f55c..f0641392 100644 --- a/specs/platform/patterns/projection-categories.sdp.md +++ b/specs/platform/patterns/projection-categories.sdp.md @@ -9,4 +9,6 @@ relations: {} ## Intent -- outcome: Projection Categories +- outcome: Categorize projections as logic, view, reporting, or integration so each query use case hits the right read model. +- problem: Projections exist but categories are implicit. Developers must know which projection to query for which use case, leading to misuse and performance issues. +- value: A taxonomy that categorizes projections by purpose and query pattern: Logic for command validation, View for UI queries, Reporting for analytics, and Integration for cross-context synchronization. diff --git a/specs/platform/patterns/projection-checkpointing.sdp.md b/specs/platform/patterns/projection-checkpointing.sdp.md index 0b6c2b6e..1592ba6e 100644 --- a/specs/platform/patterns/projection-checkpointing.sdp.md +++ b/specs/platform/patterns/projection-checkpointing.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "ProjectionCheckpointing" as an SDP Spec for delivery binding. +- outcome: Wrap projection handlers with a checkpoint helper so event processing stays idempotent without repeating boilerplate. diff --git a/specs/platform/patterns/projection-dead-letters.sdp.md b/specs/platform/patterns/projection-dead-letters.sdp.md index 2fac779a..7b61f7d7 100644 --- a/specs/platform/patterns/projection-dead-letters.sdp.md +++ b/specs/platform/patterns/projection-dead-letters.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "ProjectionDeadLetters" as an SDP Spec for delivery binding. +- outcome: Queue failed projection and EventBus subscription work in a shared onComplete dead-letter handler that supports replay, ignore, and bulk retry. diff --git a/specs/platform/patterns/projection-definitions.sdp.md b/specs/platform/patterns/projection-definitions.sdp.md index 9e142f76..372ad8fb 100644 --- a/specs/platform/patterns/projection-definitions.sdp.md +++ b/specs/platform/patterns/projection-definitions.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "ProjectionDefinitions" as an SDP Spec for delivery binding. +- outcome: Register every projection definition and replay handler in one central configuration for projection infrastructure. diff --git a/specs/platform/patterns/query-abstraction.sdp.md b/specs/platform/patterns/query-abstraction.sdp.md index 22a417f1..1b6dc911 100644 --- a/specs/platform/patterns/query-abstraction.sdp.md +++ b/specs/platform/patterns/query-abstraction.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "QueryAbstraction" as an SDP Spec for delivery binding. +- outcome: Build type-safe read-model queries with factory helpers for pagination, introspection, and registry grouping by context. diff --git a/specs/platform/patterns/rate-limit-definitions.sdp.md b/specs/platform/patterns/rate-limit-definitions.sdp.md index fe2e8843..a6256b23 100644 --- a/specs/platform/patterns/rate-limit-definitions.sdp.md +++ b/specs/platform/patterns/rate-limit-definitions.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "RateLimitDefinitions" as an SDP Spec for delivery binding. +- outcome: Centralize order-management rate-limit configuration on the Convex rate limiter with production-grade sharding. diff --git a/specs/platform/patterns/reactive-projection-conflict-detection.sdp.md b/specs/platform/patterns/reactive-projection-conflict-detection.sdp.md index 359ef673..4517261c 100644 --- a/specs/platform/patterns/reactive-projection-conflict-detection.sdp.md +++ b/specs/platform/patterns/reactive-projection-conflict-detection.sdp.md @@ -9,4 +9,5 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "ReactiveProjectionConflictDetection" as an SDP Spec for delivery binding. +- actor: a platform developer +- outcome: Detect and resolve optimistic-update conflicts automatically so clients discard stale overlays and keep durable data integrity. diff --git a/specs/platform/patterns/reactive-projection-eligibility.sdp.md b/specs/platform/patterns/reactive-projection-eligibility.sdp.md index 8dd52a6a..93469b5b 100644 --- a/specs/platform/patterns/reactive-projection-eligibility.sdp.md +++ b/specs/platform/patterns/reactive-projection-eligibility.sdp.md @@ -9,4 +9,5 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "ReactiveProjectionEligibility" as an SDP Spec for delivery binding. +- actor: a platform developer +- outcome: Allow reactive updates only on view projections so system resources stay optimized. diff --git a/specs/platform/patterns/reactive-projection-hybrid-model.sdp.md b/specs/platform/patterns/reactive-projection-hybrid-model.sdp.md index 271da03e..c8d6ba2a 100644 --- a/specs/platform/patterns/reactive-projection-hybrid-model.sdp.md +++ b/specs/platform/patterns/reactive-projection-hybrid-model.sdp.md @@ -9,4 +9,5 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "ReactiveProjectionHybridModel" as an SDP Spec for delivery binding. +- actor: a frontend developer +- outcome: Combine durable projection state with instant optimistic feedback so users see updates quickly while data integrity is preserved. diff --git a/specs/platform/patterns/reactive-projection-shared-evolve.sdp.md b/specs/platform/patterns/reactive-projection-shared-evolve.sdp.md index 4a874c3b..b89816e6 100644 --- a/specs/platform/patterns/reactive-projection-shared-evolve.sdp.md +++ b/specs/platform/patterns/reactive-projection-shared-evolve.sdp.md @@ -9,4 +9,5 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "ReactiveProjectionSharedEvolve" as an SDP Spec for delivery binding. +- actor: a platform developer +- outcome: Share evolve logic between client and server so optimistic and durable state transformations stay consistent. diff --git a/specs/platform/patterns/reactive-projections.sdp.md b/specs/platform/patterns/reactive-projections.sdp.md index ea289cf5..693e3d35 100644 --- a/specs/platform/patterns/reactive-projections.sdp.md +++ b/specs/platform/patterns/reactive-projections.sdp.md @@ -9,4 +9,6 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "ReactiveProjections" as an SDP Spec for delivery binding. +- outcome: Combine durable Workpool projections with reactive push so users see 10-50ms optimistic feedback without losing eventual consistency. +- problem: Workpool-based projections have 100-500ms latency. Users expect instant feedback (10-50ms) for their actions without polling. +- value: A hybrid model combining Workpool for durable, eventually-consistent updates and reactive push for instant UI feedback, with graceful fallback to durable state on conflict. diff --git a/specs/platform/patterns/reservation-pattern.sdp.md b/specs/platform/patterns/reservation-pattern.sdp.md index 589ee839..93ac4609 100644 --- a/specs/platform/patterns/reservation-pattern.sdp.md +++ b/specs/platform/patterns/reservation-pattern.sdp.md @@ -9,4 +9,14 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "ReservationPattern" as an SDP Spec for delivery binding. +- outcome: Enforce uniqueness before entity creation with TTL reservations that can be confirmed, released, or expired. +- problem: Uniqueness constraints before entity creation require check-then-create patterns with race condition risk, or post-creation unique indexes. +- value: TTL-based reservations claim a unique value, confirm converts it to a permanent entity, and release or expire frees unused claims. + +## Behavior + +- rule: Reservations prevent race conditions +- rule: Reservations have TTL for auto-cleanup +- rule: Confirmation converts to permanent entity +- rule: Release frees reservation before expiry +- rule: Reservation key combines type and value diff --git a/specs/platform/patterns/reservation-release-pm.sdp.md b/specs/platform/patterns/reservation-release-pm.sdp.md index 29b4238d..76928018 100644 --- a/specs/platform/patterns/reservation-release-pm.sdp.md +++ b/specs/platform/patterns/reservation-release-pm.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "ReservationReleasePM" as an SDP Spec for delivery binding. +- outcome: Emit ReleaseReservation when an order is cancelled after confirming an active reservation exists on the orderWithInventory projection. diff --git a/specs/platform/patterns/saga-completion-handler.sdp.md b/specs/platform/patterns/saga-completion-handler.sdp.md index 654e6cd5..131aa566 100644 --- a/specs/platform/patterns/saga-completion-handler.sdp.md +++ b/specs/platform/patterns/saga-completion-handler.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "SagaCompletionHandler" as an SDP Spec for delivery binding. +- outcome: Update saga status and clean up workflow state from the workflow onComplete callback outside the workflow itself. diff --git a/specs/platform/patterns/saga-orchestration-executable-tests.sdp.md b/specs/platform/patterns/saga-orchestration-executable-tests.sdp.md index 7a569d77..96531530 100644 --- a/specs/platform/patterns/saga-orchestration-executable-tests.sdp.md +++ b/specs/platform/patterns/saga-orchestration-executable-tests.sdp.md @@ -9,7 +9,7 @@ relations: {} ## Intent -- outcome: SagaOrchestration Executable Tests +- outcome: Transfer SagaOrchestration rule coverage into executable scenarios so cross-context compensation and sagaId idempotency can be wired once the order-management harness exists. ## Behavior diff --git a/specs/platform/patterns/saga-orchestration.sdp.md b/specs/platform/patterns/saga-orchestration.sdp.md index df2f65ad..71337124 100644 --- a/specs/platform/patterns/saga-orchestration.sdp.md +++ b/specs/platform/patterns/saga-orchestration.sdp.md @@ -9,4 +9,14 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "SagaOrchestration" as an SDP Spec for delivery binding. +- outcome: Coordinate cross-bounded-context operations with durable multi-step sagas so partial failures can compensate instead of leaving inconsistent state. +- problem: Cross-BC operations (for example Order to Inventory to Shipping) cannot use atomic transactions because bounded contexts have isolated databases. Without coordination infrastructure, partial failures leave the system in inconsistent states. +- value: Sagas use durable multi-step orchestration where each step calls a bounded context via the CommandOrchestrator, failures trigger compensation, saga idempotency prevents duplicate workflows, and onComplete updates saga status outside the workflow. + +## Behavior + +- rule: Sagas orchestrate operations across multiple bounded contexts +- rule: @convex-dev/workflow provides durability across server restarts +- rule: Compensation reverses partial operations on failure +- rule: Saga idempotency prevents duplicate workflows via sagaId +- rule: Saga status is updated via onComplete callback, not inside workflow diff --git a/specs/platform/patterns/saga-registry.sdp.md b/specs/platform/patterns/saga-registry.sdp.md index db9fc0d5..545e72fd 100644 --- a/specs/platform/patterns/saga-registry.sdp.md +++ b/specs/platform/patterns/saga-registry.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "SagaRegistry" as an SDP Spec for delivery binding. +- outcome: Start sagas idempotently through startSagaIfNotExists while tracking status and validating payloads with Zod. diff --git a/specs/platform/patterns/saga-router.sdp.md b/specs/platform/patterns/saga-router.sdp.md index bef7d402..2f8cd941 100644 --- a/specs/platform/patterns/saga-router.sdp.md +++ b/specs/platform/patterns/saga-router.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "SagaRouter" as an SDP Spec for delivery binding. +- outcome: Route domain events to saga workflows, starting OrderFulfillment idempotently from OrderSubmitted. diff --git a/specs/platform/patterns/test-environment-guards.sdp.md b/specs/platform/patterns/test-environment-guards.sdp.md index 76416069..fb3a6783 100644 --- a/specs/platform/patterns/test-environment-guards.sdp.md +++ b/specs/platform/patterns/test-environment-guards.sdp.md @@ -9,4 +9,5 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "TestEnvironmentGuards" as an SDP Spec for delivery binding. +- actor: a platform developer +- outcome: Guard test-only functions so utilities such as createTestEntity cannot run in production. diff --git a/specs/platform/patterns/workpool-partitioning-strategy.sdp.md b/specs/platform/patterns/workpool-partitioning-strategy.sdp.md index 4231e057..75f4c3b9 100644 --- a/specs/platform/patterns/workpool-partitioning-strategy.sdp.md +++ b/specs/platform/patterns/workpool-partitioning-strategy.sdp.md @@ -9,4 +9,4 @@ relations: {} ## Intent -- outcome: Preserve the former architect pattern "WorkpoolPartitioningStrategy" as an SDP Spec for delivery binding. +- outcome: Standardize Workpool partition-key patterns so projections keep per-entity event order and avoid OCC conflicts. diff --git a/specs/releases.pack.sdp.md b/specs/releases.pack.sdp.md index b2d8341a..e3dd4a1e 100644 --- a/specs/releases.pack.sdp.md +++ b/specs/releases.pack.sdp.md @@ -1,6 +1,7 @@ --- id: pack:releases specs: + - spec:releases.line - spec:releases.v0.1.0 - spec:releases.v0.2.0 - spec:releases.v0.3.0 diff --git a/specs/releases/_epic.sdp.md b/specs/releases/_epic.sdp.md new file mode 100644 index 00000000..30cb4028 --- /dev/null +++ b/specs/releases/_epic.sdp.md @@ -0,0 +1,16 @@ +--- +id: spec:releases.line +kind: decision +altitude: epic +readiness: idea +relations: {} +--- +# Release boundary registry + +## Intent + +- outcome: Hold numbered and vNEXT release-boundary Specs as a single refinement parent. + +## Decision + +- decision: Every release Spec under specs/releases/ refines spec:releases.line. diff --git a/specs/releases/v0.1.0.sdp.md b/specs/releases/v0.1.0.sdp.md index 69c6a689..d801f428 100644 --- a/specs/releases/v0.1.0.sdp.md +++ b/specs/releases/v0.1.0.sdp.md @@ -2,15 +2,19 @@ id: spec:releases.v0.1.0 kind: decision altitude: epic -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:releases.line --- # v0.1.0 - Delivery Process Foundation ## Intent -- outcome: v0.1.0 - Delivery Process Foundation +- outcome: Establish the software delivery process for the libar-dev platform monorepo. ## Decision -- decision: v0.1.0 - Delivery Process Foundation +- context: This is the initial process-setup release and has no breaking changes. +- decision: Formalize how the monorepo tracks work, makes decisions, and generates documentation from code by introducing the delivery-process package and Process Decision Record conventions, completing the scanner, extractor, and generator pipeline, and establishing a Gherkin-only testing policy with release-management infrastructure. +- rationale: The release records PDR-001 through PDR-005, including process-decisions folder structure, behavior feature file structure, the unified @architect-* tag prefix, and release management architecture. +- consequence: The @libar-process-* tag prefix is deprecated in favor of the unified @architect-* prefix per PDR-004; the scanner accepts both during migration and logs warnings for deprecated usage. diff --git a/specs/releases/v0.2.0.sdp.md b/specs/releases/v0.2.0.sdp.md index 2b054736..7ca91e2b 100644 --- a/specs/releases/v0.2.0.sdp.md +++ b/specs/releases/v0.2.0.sdp.md @@ -2,15 +2,21 @@ id: spec:releases.v0.2.0 kind: decision altitude: epic -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:releases.line --- # v0.2.0 - Platform Roadmap (Aggregate-Less Pivot) ## Intent -- outcome: v0.2.0 - Platform Roadmap (Aggregate-Less Pivot) +- outcome: Convert the aggregate-less pivot roadmap into executable specs for Phases 14-22. ## Decision -- decision: v0.2.0 - Platform Roadmap (Aggregate-Less Pivot) +- context: The platform is already aggregate-less; Convex-native event sourcing is neither traditional OOP aggregates nor Kafka-style streaming, and the CMS dual-write pattern eliminates rehydration. +- decision: Formalize the Third Way as the v0.2.0 platform roadmap and establish Phases 14-22 as the development path for the libar-dev platform infrastructure. +- rationale: Phase 14 (Decider Pattern) and Phase 16 (Dynamic Consistency Boundaries) are complete, Phase 19 (BDD Testing Infrastructure) is active, and Phases 15, 17, 18, and 20-22 remain on the roadmap. +- rationale: Phase 15-22 specs are defined from pattern briefs, a session context module is added to CLAUDE.md, DELIVERY-PROCESS-GUIDE.md is the reference document, and a single Platform product area is established. +- consequence: Pattern briefs in docs/project-management/aggregate-less-pivot/pattern-briefs/ are superseded by executable specs in specs/platform/; the pattern briefs remain as historical reference. +- consequence: There are no breaking changes; the release is additive for the platform roadmap. diff --git a/specs/releases/v0.3.0.sdp.md b/specs/releases/v0.3.0.sdp.md index 92a0f3ec..027f0397 100644 --- a/specs/releases/v0.3.0.sdp.md +++ b/specs/releases/v0.3.0.sdp.md @@ -2,15 +2,19 @@ id: spec:releases.v0.3.0 kind: decision altitude: epic -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:releases.line --- # v0.3.0 - TypeScript Taxonomy Migration ## Intent -- outcome: v0.3.0 - TypeScript Taxonomy Migration +- outcome: Complete the migration from JSON to TypeScript as the source of truth for the delivery process taxonomy. ## Decision -- decision: v0.3.0 - TypeScript Taxonomy Migration +- context: This release formalizes PDR-006 (TypeScript-Sourced Taxonomy), moving taxonomy definitions off hand-edited JSON files that lacked compile-time protection. +- decision: TypeScript as-const arrays define valid taxonomy values, Zod schemas use those constants for runtime validation, and JSON files become generated artifacts. +- rationale: Compile-time constants give a single typed source of truth while Zod stays at the runtime boundary and external JSON consumers keep generated output. +- consequence: There are no breaking changes; the release is backward compatible. diff --git a/specs/releases/vNEXT.sdp.md b/specs/releases/vNEXT.sdp.md index 6ba975f9..de7ca779 100644 --- a/specs/releases/vNEXT.sdp.md +++ b/specs/releases/vNEXT.sdp.md @@ -2,15 +2,19 @@ id: spec:releases.vNEXT kind: decision altitude: epic -readiness: idea -relations: {} +readiness: defined +relations: + refines: spec:releases.line --- # vNEXT - Unreleased Work ## Intent -- outcome: vNEXT - Unreleased Work +- outcome: Stage work in progress that has not yet been assigned to a specific release version. ## Decision -- decision: vNEXT - Unreleased Work +- context: Unreleased work needs a staging release until a version number is chosen. +- decision: Track deliverables tagged @architect-release:vNEXT here until a release is cut; then choose the version from the changes, create a new release Spec under specs/releases, retag those deliverables from vNEXT to the new version, and run pnpm docs:all to regenerate the changelog. +- rationale: Work in progress is staged here instead of being assigned a version before the release is cut. +- consequence: Deliverables tagged @architect-release:vNEXT stay on this boundary until a numbered release Spec is authored. diff --git a/specs/test-content-blocks.sdp.md b/specs/test-content-blocks.sdp.md deleted file mode 100644 index 025ef4b2..00000000 --- a/specs/test-content-blocks.sdp.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -id: spec:platform.test-content-blocks -kind: example -altitude: story -readiness: idea -relations: {} ---- -# Test Content Blocks - -## Intent - -- outcome: Test Content Blocks diff --git a/specs/unimplemented.pack.sdp.md b/specs/unimplemented.pack.sdp.md index 5e5e31ea..dead1474 100644 --- a/specs/unimplemented.pack.sdp.md +++ b/specs/unimplemented.pack.sdp.md @@ -62,13 +62,6 @@ specs: - spec:unimplemented.component-boundary-authentication-convention.identity-bearing-mutation-migration - spec:unimplemented.component-boundary-authentication-convention.pdr-014-placeholder - spec:unimplemented.component-boundary-authentication-convention.verify-actor-helper - - spec:unimplemented.current.phase-100-codec-driven-reference-generation - - spec:unimplemented.current.phase-100-themed-decision-architecture - - spec:unimplemented.current.phase-15-projection-categories-executable-tests - - spec:unimplemented.current.phase-22-agent-as-bounded-context - - spec:unimplemented.current.phase-22-agent-as-bounded-context-ai-driven-event-reactors - - spec:unimplemented.current.phase-22-agent-churn-risk-completion - - spec:unimplemented.current.phase-22-confirmed-order-cancellation - spec:unimplemented.deterministic-id-hashing.conflict-error-handling - spec:unimplemented.deterministic-id-hashing.deterministic-stream-id-function - spec:unimplemented.deterministic-id-hashing.hash-algorithm-selection @@ -118,16 +111,6 @@ specs: - spec:unimplemented.production-hardening.metrics-collection-types - spec:unimplemented.production-hardening.metrics-collector - spec:unimplemented.production-hardening.runbook-documentation - - spec:unimplemented.remaining.phase-100-themed-decision-architecture - - spec:unimplemented.remaining.phase-18-production-hardening - - spec:unimplemented.remaining.phase-18-workpool-partitioning-strategy - - spec:unimplemented.remaining.phase-20-reservation-pattern - - spec:unimplemented.remaining.phase-21-integration-patterns-21b - - spec:unimplemented.remaining.phase-22-agent-as-bounded-context - - spec:unimplemented.remaining.phase-22-agent-as-bounded-context-ai-driven-event-reactors - - spec:unimplemented.remaining.phase-22-agent-churn-risk-completion - - spec:unimplemented.remaining.phase-22-confirmed-order-cancellation - - spec:unimplemented.test-content-blocks.demo-item-1 - spec:unimplemented.themed-decision-architecture.add-adr-theme-tag-to-registry - spec:unimplemented.themed-decision-architecture.adr-migration-scripts - spec:unimplemented.themed-decision-architecture.dependency-graph-generator @@ -153,4 +136,4 @@ specs: --- # Unimplemented -Non-implemented architect deliverables, remaining-work items, and in-flight docs-living rows. +Named remaining-work items that refine a live platform Spec. Status dumps from docs-living are not carriers. diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-001-admin-directory-is-created-with-correct-structure.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-001-admin-directory-is-created-with-correct-structure.sdp.md deleted file mode 100644 index 89e050e9..00000000 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-001-admin-directory-is-created-with-correct-structure.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.admin-tooling-consolidation.admin-directory-is-created-with-correct-structure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.admin-tooling-consolidation ---- -# Admin directory is created with correct structure - -## Intent - -- outcome: Executable scenario: Admin directory is created with correct structure - -```gwt -Given the following deliverables: -And the example app has no admin/ directory -When admin tooling consolidation is implemented -Then convex/admin/ directory should exist -And it should contain projections.ts, deadLetters.ts, diagnostics.ts, durableFunctions.ts -And _auth.ts should provide authorization wrapper -``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-002-backward-compatibility-for-dlq-imports.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-002-backward-compatibility-for-dlq-imports.sdp.md deleted file mode 100644 index c886ff0e..00000000 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-002-backward-compatibility-for-dlq-imports.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.admin-tooling-consolidation.backward-compatibility-for-dlq-imports -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.admin-tooling-consolidation ---- -# Backward compatibility for DLQ imports - -## Intent - -- outcome: Executable scenario: Backward compatibility for DLQ imports - -```gwt -Given the following deliverables: -And code imports from "convex/projections/deadLetters" -When admin tooling consolidation is complete -Then old import path should still work via re-export -And deprecation warning should be logged -``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-003-get-dead-letter-statistics.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-003-get-dead-letter-statistics.sdp.md deleted file mode 100644 index fbad0dcb..00000000 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-003-get-dead-letter-statistics.sdp.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: spec:platform.admin-tooling-consolidation.get-dead-letter-statistics -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.admin-tooling-consolidation ---- -# Trace complete event flow - -## Intent - -- outcome: Executable scenario: Trace complete event flow - -```gwt -Given the following deliverables: -And a SubmitOrder command with correlationId "corr-123" -And the command produced OrderSubmitted and OrderConfirmed events -And both events were processed by orderSummary projection -And a saga was triggered -When getEventFlowTrace is called with "corr-123" -Then response should include the command -And response should include 2 events -And response should include projection updates -And response should include saga information -``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-004-bulk-retry-pending-dead-letters.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-004-bulk-retry-pending-dead-letters.sdp.md deleted file mode 100644 index 45a07e6a..00000000 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-004-bulk-retry-pending-dead-letters.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.admin-tooling-consolidation.bulk-retry-pending-dead-letters -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.admin-tooling-consolidation ---- -# Trace shows failure point - -## Intent - -- outcome: Executable scenario: Trace shows failure point - -```gwt -Given the following deliverables: -And a command that produced an event -And the event failed projection processing -When getEventFlowTrace is called -Then deadLetters array should include the failure -And error message should be visible -``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-005-trace-complete-event-flow.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-005-trace-complete-event-flow.sdp.md deleted file mode 100644 index ffd0297b..00000000 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-005-trace-complete-event-flow.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.admin-tooling-consolidation.trace-complete-event-flow -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.admin-tooling-consolidation ---- -# Query Workpool item status - -## Intent - -- outcome: Executable scenario: Query Workpool item status - -```gwt -Given the following deliverables: -And a Workpool item with ID "work-123" in "pending" state -When getWorkpoolItem is called with "work-123" -Then response should include state "pending" -And response should include previousAttempts count -``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-006-trace-shows-failure-point.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-006-trace-shows-failure-point.sdp.md deleted file mode 100644 index 41eb2b43..00000000 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-006-trace-shows-failure-point.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.admin-tooling-consolidation.trace-shows-failure-point -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.admin-tooling-consolidation ---- -# Query Workflow execution with steps - -## Intent - -- outcome: Executable scenario: Query Workflow execution with steps - -```gwt -Given the following deliverables: -And a Workflow with ID "wf-456" that has completed 3 steps -When getWorkflowExecution is called with "wf-456" -Then response should include workflow status -And response.steps should have 3 entries -And each step should include name, status, and duration -``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-007-system-state-provides-complete-overview.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-007-system-state-provides-complete-overview.sdp.md deleted file mode 100644 index 114c212c..00000000 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-007-system-state-provides-complete-overview.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.admin-tooling-consolidation.system-state-provides-complete-overview -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.admin-tooling-consolidation ---- -# Query non-existent durable function - -## Intent - -- outcome: Executable scenario: Query non-existent durable function - -```gwt -Given the following deliverables: -And no Workpool item with ID "work-nonexistent" -When getWorkpoolItem is called -Then response should indicate item not found -And no error should be thrown -``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-008-query-workpool-item-status.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-008-query-workpool-item-status.sdp.md deleted file mode 100644 index 6b855de5..00000000 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-008-query-workpool-item-status.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.admin-tooling-consolidation.query-workpool-item-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.admin-tooling-consolidation ---- -# Unauthenticated request is rejected - -## Intent - -- outcome: Executable scenario: Unauthenticated request is rejected - -```gwt -Given the following deliverables: -And no authentication token is provided -When an admin endpoint is called -Then error should be "UNAUTHENTICATED" -``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-009-query-workflow-execution-with-steps.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-009-query-workflow-execution-with-steps.sdp.md deleted file mode 100644 index 86a40041..00000000 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-009-query-workflow-execution-with-steps.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.admin-tooling-consolidation.query-workflow-execution-with-steps -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.admin-tooling-consolidation ---- -# Non-admin user is rejected - -## Intent - -- outcome: Executable scenario: Non-admin user is rejected - -```gwt -Given the following deliverables: -And a user without admin role -When an admin endpoint is called -Then error should be "UNAUTHORIZED: Admin role required" -``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-010-query-non-existent-durable-function.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-010-query-non-existent-durable-function.sdp.md deleted file mode 100644 index 029fcd69..00000000 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-010-query-non-existent-durable-function.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.admin-tooling-consolidation.query-non-existent-durable-function -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.admin-tooling-consolidation ---- -# Admin action is logged - -## Intent - -- outcome: Executable scenario: Admin action is logged - -```gwt -Given the following deliverables: -And an admin user triggers a projection rebuild -When the action completes -Then an entry should be added to adminAuditLog -And entry should include action, args, userId, and timestamp -``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-011-unauthenticated-request-is-rejected.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-011-unauthenticated-request-is-rejected.sdp.md deleted file mode 100644 index 6a71a2b3..00000000 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-011-unauthenticated-request-is-rejected.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.admin-tooling-consolidation.unauthenticated-request-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.admin-tooling-consolidation ---- -# Unauthenticated request is rejected - -## Intent - -- outcome: Executable scenario: Unauthenticated request is rejected - -```gwt -Given the following deliverables: -And no authentication token is provided -When an admin endpoint is called -Then error should be "UNAUTHENTICATED" -``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-012-non-admin-user-is-rejected.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-012-non-admin-user-is-rejected.sdp.md deleted file mode 100644 index 56a814d9..00000000 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-012-non-admin-user-is-rejected.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.admin-tooling-consolidation.non-admin-user-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.admin-tooling-consolidation ---- -# Non-admin user is rejected - -## Intent - -- outcome: Executable scenario: Non-admin user is rejected - -```gwt -Given the following deliverables: -And a user without admin role -When an admin endpoint is called -Then error should be "UNAUTHORIZED: Admin role required" -``` diff --git a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-013-admin-action-is-logged.sdp.md b/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-013-admin-action-is-logged.sdp.md deleted file mode 100644 index 97247265..00000000 --- a/specs/unimplemented/architect-scenarios/admin-tooling-consolidation/s-013-admin-action-is-logged.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.admin-tooling-consolidation.admin-action-is-logged -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.admin-tooling-consolidation ---- -# Admin action is logged - -## Intent - -- outcome: Executable scenario: Admin action is logged - -```gwt -Given the following deliverables: -And an admin user triggers a projection rebuild -When the action completes -Then an entry should be added to adminAuditLog -And entry should include action, args, userId, and timestamp -``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-001-dead-letter-list-displays-failed-events-from-both-agents.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-001-dead-letter-list-displays-failed-events-from-both-agents.sdp.md deleted file mode 100644 index eedfd8ef..00000000 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-001-dead-letter-list-displays-failed-events-from-both-agents.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.agent-admin-frontend.dead-letter-list-displays-failed-events-from-both-agents -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-admin-frontend ---- -# Dead letter list displays failed events from both agents - -## Intent - -- outcome: Executable scenario: Dead letter list displays failed events from both agents - -```gwt -Given the following deliverables: -And 2 dead letter entries exist for the churn-risk agent -And 1 dead letter entry exists for the high-value-order agent -When I navigate to the Monitoring tab -Then I see a "Dead Letters" section with 3 entries -And each entry shows agent ID, event type, error, and timestamp -And each entry has "Replay" and "Ignore" action buttons -``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-002-replay-action-triggers-backend-mutation-with-toast-feedback.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-002-replay-action-triggers-backend-mutation-with-toast-feedback.sdp.md deleted file mode 100644 index 194c4c19..00000000 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-002-replay-action-triggers-backend-mutation-with-toast-feedback.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.agent-admin-frontend.replay-action-triggers-backend-mutation-with-toast-feedback -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-admin-frontend ---- -# Replay action triggers backend mutation with toast feedback - -## Intent - -- outcome: Executable scenario: Replay action triggers backend mutation with toast feedback - -```gwt -Given the following deliverables: -And a dead letter entry for the churn-risk agent -When I click the "Replay" button -Then the replayDeadLetter mutation is called -And a success toast shows "Dead letter replayed successfully" -And the entry status updates to "replayed" -And the Replay button is replaced with a "Replayed" status indicator -``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-003-ignore-action-with-reason-provides-confirmation.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-003-ignore-action-with-reason-provides-confirmation.sdp.md deleted file mode 100644 index 15f6832f..00000000 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-003-ignore-action-with-reason-provides-confirmation.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.agent-admin-frontend.ignore-action-with-reason-provides-confirmation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-admin-frontend ---- -# Ignore action with reason provides confirmation - -## Intent - -- outcome: Executable scenario: Ignore action with reason provides confirmation - -```gwt -Given the following deliverables: -And a dead letter entry for event "evt_456" -When I click "Ignore" and enter reason "Duplicate event, already processed" -Then the ignoreDeadLetter mutation is called with the reason -And a success toast shows "Dead letter ignored" -And the entry status updates to "ignored" -``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-004-replay-failure-shows-error-toast.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-004-replay-failure-shows-error-toast.sdp.md deleted file mode 100644 index c2a817d1..00000000 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-004-replay-failure-shows-error-toast.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.agent-admin-frontend.replay-failure-shows-error-toast -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-admin-frontend ---- -# Replay failure shows error toast - -## Intent - -- outcome: Executable scenario: Replay failure shows error toast - -```gwt -Given the following deliverables: -And a dead letter entry whose original event no longer exists -When I click the "Replay" button -Then the mutation fails with an error -And an error toast shows a descriptive message -And the entry remains in "pending" status -``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-005-filter-dead-letters-by-agent.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-005-filter-dead-letters-by-agent.sdp.md deleted file mode 100644 index 1f18b203..00000000 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-005-filter-dead-letters-by-agent.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.agent-admin-frontend.filter-dead-letters-by-agent -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-admin-frontend ---- -# Filter dead letters by agent - -## Intent - -- outcome: Executable scenario: Filter dead letters by agent - -```gwt -Given the following deliverables: -And dead letters exist for both churn-risk and high-value-order agents -When I select "high-value-order-agent" in the agent filter -Then only dead letters for the high-value-order agent are shown -``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-006-view-decision-history-with-decisions-from-both-agents.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-006-view-decision-history-with-decisions-from-both-agents.sdp.md deleted file mode 100644 index 1591b639..00000000 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-006-view-decision-history-with-decisions-from-both-agents.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.agent-admin-frontend.view-decision-history-with-decisions-from-both-agents -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-admin-frontend ---- -# View decision history with decisions from both agents - -## Intent - -- outcome: Executable scenario: View decision history with decisions from both agents - -```gwt -Given the following deliverables: -And the churn-risk agent has detected 3 patterns -And the high-value-order agent has flagged 2 orders -When I click the "Decision History" tab -Then I see 5 audit entries in chronological order -And entries from both agents are interleaved by timestamp -``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-007-filter-decision-history-by-agent.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-007-filter-decision-history-by-agent.sdp.md deleted file mode 100644 index 05040b33..00000000 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-007-filter-decision-history-by-agent.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.agent-admin-frontend.filter-decision-history-by-agent -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-admin-frontend ---- -# Filter decision history by agent - -## Intent - -- outcome: Executable scenario: Filter decision history by agent - -```gwt -Given the following deliverables: -And decisions exist for "churn-risk-agent" and "high-value-order-agent" -When I select "churn-risk-agent" in the agent filter -Then only churn-risk agent decisions are displayed -And the entry count updates to reflect the filter -``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-008-filter-decision-history-by-action-type.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-008-filter-decision-history-by-action-type.sdp.md deleted file mode 100644 index d78f40b7..00000000 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-008-filter-decision-history-by-action-type.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.agent-admin-frontend.filter-decision-history-by-action-type -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-admin-frontend ---- -# Filter decision history by action type - -## Intent - -- outcome: Executable scenario: Filter decision history by action type - -```gwt -Given the following deliverables: -And decisions with actions "SuggestCustomerOutreach" and "FlagForVIPReview" -When I select "FlagForVIPReview" in the action filter -Then only FlagForVIPReview decisions are displayed -``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-009-view-decision-detail-with-full-reasoning.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-009-view-decision-detail-with-full-reasoning.sdp.md deleted file mode 100644 index a2702bda..00000000 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-009-view-decision-detail-with-full-reasoning.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.agent-admin-frontend.view-decision-detail-with-full-reasoning -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-admin-frontend ---- -# View decision detail with full reasoning - -## Intent - -- outcome: Executable scenario: View decision detail with full reasoning - -```gwt -Given the following deliverables: -And the churn-risk agent has made a decision with confidence 0.87 -When I click on the decision entry -Then I see the full LLM reasoning text -And I see the triggering event IDs -And I see whether a command was emitted -And I see whether approval was required -``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-010-empty-decision-history-shows-guidance-message.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-010-empty-decision-history-shows-guidance-message.sdp.md deleted file mode 100644 index f9ff001e..00000000 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-010-empty-decision-history-shows-guidance-message.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.agent-admin-frontend.empty-decision-history-shows-guidance-message -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-admin-frontend ---- -# Empty decision history shows guidance message - -## Intent - -- outcome: Executable scenario: Empty decision history shows guidance message - -```gwt -Given the following deliverables: -And no agents have made any decisions yet -When I view the "Decision History" tab -Then I see a message explaining what will appear here -And the message mentions both active agents by name -``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-011-approve-action-shows-success-toast.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-011-approve-action-shows-success-toast.sdp.md deleted file mode 100644 index 01910095..00000000 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-011-approve-action-shows-success-toast.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.agent-admin-frontend.approve-action-shows-success-toast -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-admin-frontend ---- -# Approve action shows success toast - -## Intent - -- outcome: Executable scenario: Approve action shows success toast - -```gwt -Given the following deliverables: -And a pending approval for the churn-risk agent -When I click "Approve" -Then a success toast appears with "Approval recorded" -And the toast auto-dismisses after 5 seconds -And the approval list refreshes -``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-012-reject-action-shows-success-toast.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-012-reject-action-shows-success-toast.sdp.md deleted file mode 100644 index d49552f5..00000000 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-012-reject-action-shows-success-toast.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.agent-admin-frontend.reject-action-shows-success-toast -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-admin-frontend ---- -# Reject action shows success toast - -## Intent - -- outcome: Executable scenario: Reject action shows success toast - -```gwt -Given the following deliverables: -And a pending approval for the high-value-order agent -When I click "Reject" and provide a note -Then a success toast appears with "Action rejected" -And the approval is removed from the pending list -``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-013-error-action-shows-descriptive-error-toast.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-013-error-action-shows-descriptive-error-toast.sdp.md deleted file mode 100644 index e2820f08..00000000 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-013-error-action-shows-descriptive-error-toast.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.agent-admin-frontend.error-action-shows-descriptive-error-toast -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-admin-frontend ---- -# Error action shows descriptive error toast - -## Intent - -- outcome: Executable scenario: Error action shows descriptive error toast - -```gwt -Given the following deliverables: -And a pending approval that has already been expired -When I attempt to approve it -Then an error toast appears with "Approval has expired" -And the toast has role="alert" for accessibility -And the approval status shows "expired" -``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-014-multiple-rapid-actions-show-stacked-toasts.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-014-multiple-rapid-actions-show-stacked-toasts.sdp.md deleted file mode 100644 index e3245938..00000000 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-014-multiple-rapid-actions-show-stacked-toasts.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.agent-admin-frontend.multiple-rapid-actions-show-stacked-toasts -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-admin-frontend ---- -# Multiple rapid actions show stacked toasts - -## Intent - -- outcome: Executable scenario: Multiple rapid actions show stacked toasts - -```gwt -Given the following deliverables: -And 3 pending approvals from different agents -When I quickly approve all 3 -Then 3 success toasts appear in sequence -And each toast is individually dismissable -And they auto-dismiss in order -``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-015-high-value-order-detected-and-surfaces-as-vip-approval.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-015-high-value-order-detected-and-surfaces-as-vip-approval.sdp.md deleted file mode 100644 index 71194f23..00000000 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-015-high-value-order-detected-and-surfaces-as-vip-approval.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:platform.agent-admin-frontend.high-value-order-detected-and-surfaces-as-vip-approval -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-admin-frontend ---- -# High-value order detected and surfaces as VIP approval - -## Intent - -- outcome: Executable scenario: High-value order detected and surfaces as VIP approval - -```gwt -Given the following deliverables: -And a product exists with price $200 per unit -And the product has sufficient stock -When a customer creates an order with 3 units (total $600) and the order is submitted and confirmed by the saga -Then the high-value-order-agent detects the OrderConfirmed event -And the LLM analyzes the order for VIP treatment -And a FlagForVIPReview approval appears in the admin dashboard -And the approval shows confidence, reasoning, and order details -``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-016-low-value-order-does-not-trigger-agent.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-016-low-value-order-does-not-trigger-agent.sdp.md deleted file mode 100644 index 8fb574f3..00000000 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-016-low-value-order-does-not-trigger-agent.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.agent-admin-frontend.low-value-order-does-not-trigger-agent -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-admin-frontend ---- -# Low-value order does not trigger agent - -## Intent - -- outcome: Executable scenario: Low-value order does not trigger agent - -```gwt -Given the following deliverables: -And a product exists with price $10 per unit -When a customer creates an order with 2 units (total $20) and the order is submitted and confirmed -Then the high-value-order-agent receives the event -And the pattern trigger does not fire (totalAmount < $500) -And no approval is created -``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-017-admin-approves-vip-flag-for-high-value-order.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-017-admin-approves-vip-flag-for-high-value-order.sdp.md deleted file mode 100644 index 1a669f64..00000000 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-017-admin-approves-vip-flag-for-high-value-order.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.agent-admin-frontend.admin-approves-vip-flag-for-high-value-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-admin-frontend ---- -# Admin approves VIP flag for high-value order - -## Intent - -- outcome: Executable scenario: Admin approves VIP flag for high-value order - -```gwt -Given the following deliverables: -And there is a pending FlagForVIPReview approval -And the approval shows order total $1,200 with confidence 0.91 -When the admin reviews the reasoning and clicks "Approve" -Then a success toast shows "Approval recorded for high-value-order-agent" -And the FlagForVIPReview command is routed to the VIP handler -And the decision appears in the decision history tab -``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-018-both-agents-trigger-from-same-customer-activity.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-018-both-agents-trigger-from-same-customer-activity.sdp.md deleted file mode 100644 index b283be50..00000000 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-018-both-agents-trigger-from-same-customer-activity.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:platform.agent-admin-frontend.both-agents-trigger-from-same-customer-activity -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-admin-frontend ---- -# Both agents trigger from same customer activity - -## Intent - -- outcome: Executable scenario: Both agents trigger from same customer activity - -```gwt -Given the following deliverables: -And a customer has cancelled 2 orders previously -And the customer places a new high-value order ($800) -When the customer cancels the high-value order (3rd cancellation) -Then the churn-risk agent detects the 3+ cancellation pattern -And the high-value-order agent had previously flagged the order -And both decisions appear in the decision history -And the admin can filter by agent to see each agent's perspective -``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-019-dashboard-shows-both-active-agents.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-019-dashboard-shows-both-active-agents.sdp.md deleted file mode 100644 index 0774df89..00000000 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-019-dashboard-shows-both-active-agents.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.agent-admin-frontend.dashboard-shows-both-active-agents -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-admin-frontend ---- -# Dashboard shows both active agents - -## Intent - -- outcome: Executable scenario: Dashboard shows both active agents - -```gwt -Given the following deliverables: -And the churn-risk agent has processed 100 events -And the high-value-order agent has processed 50 events -When I view the agents dashboard -Then the Active Agents count shows "2" -And the Events Processed count shows "150" -And both agent names are visible -``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-020-pending-approvals-count-includes-both-agents.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-020-pending-approvals-count-includes-both-agents.sdp.md deleted file mode 100644 index 4801fd74..00000000 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-020-pending-approvals-count-includes-both-agents.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.agent-admin-frontend.pending-approvals-count-includes-both-agents -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-admin-frontend ---- -# Pending approvals count includes both agents - -## Intent - -- outcome: Executable scenario: Pending approvals count includes both agents - -```gwt -Given the following deliverables: -And there are 2 pending approvals from churn-risk agent -And there is 1 pending approval from high-value-order agent -When I view the agents dashboard -Then the Pending Approvals count shows "3" -And the Pending Approvals tab badge shows "3" -``` diff --git a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-021-one-agent-stopped-one-active.sdp.md b/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-021-one-agent-stopped-one-active.sdp.md deleted file mode 100644 index 742f5de0..00000000 --- a/specs/unimplemented/architect-scenarios/agent-admin-frontend/s-021-one-agent-stopped-one-active.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.agent-admin-frontend.one-agent-stopped-one-active -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-admin-frontend ---- -# One agent stopped, one active - -## Intent - -- outcome: Executable scenario: One agent stopped, one active - -```gwt -Given the following deliverables: -And the churn-risk agent is in "active" status -And the high-value-order agent is in "stopped" status -When I view the monitoring tab -Then I see the churn-risk agent with "Active" badge -And I see the high-value-order agent with "Stopped" badge -And the Active Agents count on dashboard shows "1" -``` diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-001-agent-component-registers-with-isolated-schema.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-001-agent-component-registers-with-isolated-schema.sdp.md deleted file mode 100644 index 9a900f80..00000000 --- a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-001-agent-component-registers-with-isolated-schema.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.agent-bc-component-isolation.agent-component-registers-with-isolated-schema -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-bc-component-isolation ---- -# Agent component registers with isolated schema - -## Intent - -- outcome: Architect scenario: Agent component registers with isolated schema - -```gwt -Given the agent component is defined with defineComponent -When the app mounts the agent component via app.use -Then the agent's tables are isolated from the app schema -And the app cannot directly query agentCheckpoints -And all access goes through components.agent.* handlers -``` diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-002-component-api-provides-full-crud-for-checkpoints.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-002-component-api-provides-full-crud-for-checkpoints.sdp.md deleted file mode 100644 index 266ebd17..00000000 --- a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-002-component-api-provides-full-crud-for-checkpoints.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.agent-bc-component-isolation.component-api-provides-full-crud-for-checkpoints -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-bc-component-isolation ---- -# Component API provides full CRUD for checkpoints - -## Intent - -- outcome: Architect scenario: Component API provides full CRUD for checkpoints - -```gwt -Given the agent component is mounted -When a checkpoint is created via components.agent.checkpoints.load -Then the checkpoint is stored in the component's isolated database -And it can be updated via components.agent.checkpoints.update -And it can be queried via components.agent.checkpoints.load -``` diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-003-direct-table-access-is-not-possible-from-parent.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-003-direct-table-access-is-not-possible-from-parent.sdp.md deleted file mode 100644 index 2f2543e4..00000000 --- a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-003-direct-table-access-is-not-possible-from-parent.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.agent-bc-component-isolation.direct-table-access-is-not-possible-from-parent -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-bc-component-isolation ---- -# Direct table access is not possible from parent - -## Intent - -- outcome: Architect scenario: Direct table access is not possible from parent - -```gwt -Given the agent component is mounted -When the parent app attempts ctx.db.query("agentCheckpoints") -Then the query returns no results -And agent data is only accessible through component API handlers -``` diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-004-component-sub-transactions-provide-isolation.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-004-component-sub-transactions-provide-isolation.sdp.md deleted file mode 100644 index 099cb2a0..00000000 --- a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-004-component-sub-transactions-provide-isolation.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.agent-bc-component-isolation.component-sub-transactions-provide-isolation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-bc-component-isolation ---- -# Component sub-transactions provide isolation - -## Intent - -- outcome: Architect scenario: Component sub-transactions provide isolation - -```gwt -Given a parent mutation that calls agent component handlers -When the agent component handler throws an error and the parent catches the exception -Then only the agent component write is rolled back -And the parent mutation's other writes succeed -``` diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-005-agent-handler-receives-projection-data-as-argument.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-005-agent-handler-receives-projection-data-as-argument.sdp.md deleted file mode 100644 index 643f38f4..00000000 --- a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-005-agent-handler-receives-projection-data-as-argument.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.agent-bc-component-isolation.agent-handler-receives-projection-data-as-argument -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-bc-component-isolation ---- -# Agent handler receives projection data as argument - -## Intent - -- outcome: Architect scenario: Agent handler receives projection data as argument - -```gwt -Given the agent event handler is triggered by an OrderCancelled event -When the handler needs customer cancellation history -Then it receives the history as a pre-loaded argument -And it does not directly query customerCancellations table -``` diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-006-missing-projection-data-returns-empty-result.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-006-missing-projection-data-returns-empty-result.sdp.md deleted file mode 100644 index 0985fd89..00000000 --- a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-006-missing-projection-data-returns-empty-result.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.agent-bc-component-isolation.missing-projection-data-returns-empty-result -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-bc-component-isolation ---- -# Missing projection data returns empty result - -## Intent - -- outcome: Architect scenario: Missing projection data returns empty result - -```gwt -Given a new customer with no cancellation history -When the agent handler receives an event for this customer -Then the cancellation history argument is an empty array -And the handler proceeds with rule-based analysis -And no error is thrown -``` diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-007-agent-handler-cannot-directly-access-app-level-projection-tables.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-007-agent-handler-cannot-directly-access-app-level-projection-tables.sdp.md deleted file mode 100644 index aba4ed7e..00000000 --- a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-007-agent-handler-cannot-directly-access-app-level-projection-tables.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.agent-bc-component-isolation.agent-handler-cannot-directly-access-app-level-projection-tables -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-bc-component-isolation ---- -# Agent handler cannot directly access app-level projection tables - -## Intent - -- outcome: Architect scenario: Agent handler cannot directly access app-level projection tables - -```gwt -Given the agent component is processing an event -When the handler attempts to query customerCancellations directly -Then the query is not available inside the component context -And the handler must use the injected data argument instead -``` diff --git a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-008-app-level-queries-can-access-agent-data-via-component-api.sdp.md b/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-008-app-level-queries-can-access-agent-data-via-component-api.sdp.md deleted file mode 100644 index 014d51ee..00000000 --- a/specs/unimplemented/architect-scenarios/agent-bc-component-isolation/s-008-app-level-queries-can-access-agent-data-via-component-api.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.agent-bc-component-isolation.app-level-queries-can-access-agent-data-via-component-api -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-bc-component-isolation ---- -# App-level queries can access agent data via component API - -## Intent - -- outcome: Architect scenario: App-level queries can access agent data via component API - -```gwt -Given the admin UI needs to display agent audit events -When it queries via components.agent.audit.queryAuditEvents -Then it receives the audit events for the requested agent -And the query respects agent component boundaries -``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-001-agent-command-routes-through-command-orchestrator-to-handler.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-001-agent-command-routes-through-command-orchestrator-to-handler.sdp.md deleted file mode 100644 index 046a3f7e..00000000 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-001-agent-command-routes-through-command-orchestrator-to-handler.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.agent-command-infrastructure.agent-command-routes-through-command-orchestrator-to-handler -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-command-infrastructure ---- -# Agent command routes through CommandOrchestrator to handler - -## Intent - -- outcome: Executable scenario: Agent command routes through CommandOrchestrator to handler - -```gwt -Given the following deliverables: -And an agent has emitted a SuggestCustomerOutreach command -When the command is routed via CommandOrchestrator -Then the registered handler for SuggestCustomerOutreach is called -And the command status transitions pending -> processing -> completed -And an audit event records the command execution -``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-002-unknown-command-type-is-rejected-with-validation-error.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-002-unknown-command-type-is-rejected-with-validation-error.sdp.md deleted file mode 100644 index 595d0c4f..00000000 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-002-unknown-command-type-is-rejected-with-validation-error.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.agent-command-infrastructure.unknown-command-type-is-rejected-with-validation-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-command-infrastructure ---- -# Unknown command type is rejected with validation error - -## Intent - -- outcome: Executable scenario: Unknown command type is rejected with validation error - -```gwt -Given the following deliverables: -And an agent emits a command with unregistered type "UnknownAction" -When the command routing attempts to find a handler -Then the routing fails with UNKNOWN_COMMAND_TYPE error -And the command status transitions to "failed" -And an audit event records the failure -``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-003-command-idempotency-prevents-duplicate-processing.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-003-command-idempotency-prevents-duplicate-processing.sdp.md deleted file mode 100644 index dbbd616f..00000000 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-003-command-idempotency-prevents-duplicate-processing.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.agent-command-infrastructure.command-idempotency-prevents-duplicate-processing -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-command-infrastructure ---- -# Command idempotency prevents duplicate processing - -## Intent - -- outcome: Executable scenario: Command idempotency prevents duplicate processing - -```gwt -Given the following deliverables: -And an agent emits a SuggestCustomerOutreach command with commandId "cmd_123" -And the command has already been processed successfully -When the same commandId is submitted again -Then the Command Bus rejects it as a duplicate -And no handler is called -``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-004-pause-agent-transitions-active-agent-to-paused.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-004-pause-agent-transitions-active-agent-to-paused.sdp.md deleted file mode 100644 index 71b05c08..00000000 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-004-pause-agent-transitions-active-agent-to-paused.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.agent-command-infrastructure.pause-agent-transitions-active-agent-to-paused -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-command-infrastructure ---- -# PauseAgent transitions active agent to paused - -## Intent - -- outcome: Executable scenario: PauseAgent transitions active agent to paused - -```gwt -Given the following deliverables: -And a churn-risk agent in "active" state -When a PauseAgent command is executed -Then the agent state transitions to "paused" -And the checkpoint is preserved at current position -And new events are not processed while paused -And an AgentPaused audit event is recorded -``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-005-resume-agent-resumes-from-checkpoint-position.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-005-resume-agent-resumes-from-checkpoint-position.sdp.md deleted file mode 100644 index 6a48b41c..00000000 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-005-resume-agent-resumes-from-checkpoint-position.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.agent-command-infrastructure.resume-agent-resumes-from-checkpoint-position -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-command-infrastructure ---- -# ResumeAgent resumes from checkpoint position - -## Intent - -- outcome: Executable scenario: ResumeAgent resumes from checkpoint position - -```gwt -Given the following deliverables: -And a churn-risk agent in "paused" state -And the checkpoint is at position 42 -When a ResumeAgent command is executed -Then the agent state transitions to "active" -And event processing resumes from position 43 -And an AgentResumed audit event is recorded -``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-006-invalid-lifecycle-transition-is-rejected.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-006-invalid-lifecycle-transition-is-rejected.sdp.md deleted file mode 100644 index 35b7d9d4..00000000 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-006-invalid-lifecycle-transition-is-rejected.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.agent-command-infrastructure.invalid-lifecycle-transition-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-command-infrastructure ---- -# Invalid lifecycle transition is rejected - -## Intent - -- outcome: Executable scenario: Invalid lifecycle transition is rejected - -```gwt -Given the following deliverables: -And a churn-risk agent in "stopped" state -When a PauseAgent command is executed -Then the command is rejected with INVALID_LIFECYCLE_TRANSITION -And the agent remains in "stopped" state -And the rejection is recorded in audit trail -``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-007-reconfigure-agent-updates-configuration-without-losing-state.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-007-reconfigure-agent-updates-configuration-without-losing-state.sdp.md deleted file mode 100644 index 42abd4c4..00000000 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-007-reconfigure-agent-updates-configuration-without-losing-state.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.agent-command-infrastructure.reconfigure-agent-updates-configuration-without-losing-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-command-infrastructure ---- -# ReconfigureAgent updates configuration without losing state - -## Intent - -- outcome: Executable scenario: ReconfigureAgent updates configuration without losing state - -```gwt -Given the following deliverables: -And an active churn-risk agent with confidenceThreshold 0.8 -When a ReconfigureAgent command changes threshold to 0.7 -Then the agent continues from its current checkpoint -And future analysis uses the new threshold -And the config change is recorded in audit trail -``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-008-agent-config-references-patterns-from-registry.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-008-agent-config-references-patterns-from-registry.sdp.md deleted file mode 100644 index 7d2ffd9a..00000000 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-008-agent-config-references-patterns-from-registry.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.agent-command-infrastructure.agent-config-references-patterns-from-registry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-command-infrastructure ---- -# Agent config references patterns from registry - -## Intent - -- outcome: Executable scenario: Agent config references patterns from registry - -```gwt -Given the following deliverables: -And a pattern "churn-risk" registered in the pattern registry -When configuring a churn-risk agent -Then the agent config references patterns by name -And the handler loads pattern definitions from registry at startup -``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-009-handler-uses-pattern-trigger-for-cheap-detection.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-009-handler-uses-pattern-trigger-for-cheap-detection.sdp.md deleted file mode 100644 index a2258047..00000000 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-009-handler-uses-pattern-trigger-for-cheap-detection.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.agent-command-infrastructure.handler-uses-pattern-trigger-for-cheap-detection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-command-infrastructure ---- -# Handler uses pattern trigger for cheap detection - -## Intent - -- outcome: Executable scenario: Handler uses pattern trigger for cheap detection - -```gwt -Given the following deliverables: -And an event delivered to the agent handler -When the handler evaluates patterns -Then it calls pattern.trigger(eventHistory) first -And only proceeds to pattern.analyze() if trigger returns true -And this avoids unnecessary LLM calls for non-matching events -``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-010-handler-uses-pattern-analyze-for-llm-analysis.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-010-handler-uses-pattern-analyze-for-llm-analysis.sdp.md deleted file mode 100644 index 07c9670e..00000000 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-010-handler-uses-pattern-analyze-for-llm-analysis.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.agent-command-infrastructure.handler-uses-pattern-analyze-for-llm-analysis -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-command-infrastructure ---- -# Handler uses pattern analyze for LLM analysis - -## Intent - -- outcome: Executable scenario: Handler uses pattern analyze for LLM analysis - -```gwt -Given the following deliverables: -And a pattern trigger has fired for 3+ cancellations -When the handler calls pattern.analyze(eventHistory, agentContext) -Then the LLM analysis provides confidence, reasoning, and suggested action -And the result is wrapped in an AgentDecision -And the analysis method is recorded as "llm" in the audit trail -``` diff --git a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-011-unknown-pattern-name-in-config-fails-validation.sdp.md b/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-011-unknown-pattern-name-in-config-fails-validation.sdp.md deleted file mode 100644 index bcc21408..00000000 --- a/specs/unimplemented/architect-scenarios/agent-command-infrastructure/s-011-unknown-pattern-name-in-config-fails-validation.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.agent-command-infrastructure.unknown-pattern-name-in-config-fails-validation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-command-infrastructure ---- -# Unknown pattern name in config fails validation - -## Intent - -- outcome: Executable scenario: Unknown pattern name in config fails validation - -```gwt -Given the following deliverables: -And an agent config referencing pattern "nonexistent-pattern" -When the agent is initialized -Then initialization fails with PATTERN_NOT_FOUND error -And the error includes the pattern name for debugging -``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-001-agent-action-handler-calls-llm-and-returns-decision.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-001-agent-action-handler-calls-llm-and-returns-decision.sdp.md deleted file mode 100644 index 7492d0d8..00000000 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-001-agent-action-handler-calls-llm-and-returns-decision.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.agent-llm-integration.agent-action-handler-calls-llm-and-returns-decision -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-llm-integration ---- -# Agent action handler calls LLM and returns decision - -## Intent - -- outcome: Executable scenario: Agent action handler calls LLM and returns decision - -```gwt -Given an agent configured with LLM runtime -And an OrderCancelled event is delivered via EventBus -When the action handler processes the event -Then it loads the checkpoint via runQuery -And it loads event history via cross-component query -And it calls the LLM for pattern analysis -And it returns an AgentDecision with confidence and reasoning -``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-002-on-complete-mutation-persists-decision-atomically.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-002-on-complete-mutation-persists-decision-atomically.sdp.md deleted file mode 100644 index b0739345..00000000 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-002-on-complete-mutation-persists-decision-atomically.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.agent-llm-integration.on-complete-mutation-persists-decision-atomically -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-llm-integration ---- -# onComplete mutation persists decision atomically - -## Intent - -- outcome: Executable scenario: onComplete mutation persists decision atomically - -```gwt -Given an agent action returned a successful AgentDecision -When the onComplete handler fires with result.kind "success" -Then the decision is recorded as an audit event in agent component -And the command is emitted to agent component commands table -And the checkpoint is updated with new position -And all writes happen in a single atomic mutation -``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-003-action-handler-rejects-invalid-agent-configuration.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-003-action-handler-rejects-invalid-agent-configuration.sdp.md deleted file mode 100644 index 64a74fcf..00000000 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-003-action-handler-rejects-invalid-agent-configuration.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.agent-llm-integration.action-handler-rejects-invalid-agent-configuration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-llm-integration ---- -# Action handler rejects invalid agent configuration - -## Intent - -- outcome: Executable scenario: Action handler rejects invalid agent configuration - -```gwt -Given an agent action handler with missing LLM runtime config -And no fallback to rule-based analysis is configured -When the handler is initialized -Then it fails with AGENT_RUNTIME_REQUIRED error -And the error message indicates LLM runtime or fallback must be configured -``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-004-llm-unavailable-propagates-error-through-retries-to-dead-letter.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-004-llm-unavailable-propagates-error-through-retries-to-dead-letter.sdp.md deleted file mode 100644 index 5b56f039..00000000 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-004-llm-unavailable-propagates-error-through-retries-to-dead-letter.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.agent-llm-integration.llm-unavailable-propagates-error-through-retries-to-dead-letter -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-llm-integration ---- -# LLM unavailable propagates error through retries to dead letter - -## Intent - -- outcome: Executable scenario: LLM unavailable propagates error through retries to dead letter - -```gwt -Given an agent configured with LLM runtime -And the LLM API returns an error or times out -When the action handler processes the event -Then the error propagates to the Workpool for retry -And after retries exhausted the event is dead-lettered -And a DeadLetterRecorded audit event is created -``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-005-action-failure-triggers-dead-letter-via-on-complete.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-005-action-failure-triggers-dead-letter-via-on-complete.sdp.md deleted file mode 100644 index ff5cadc1..00000000 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-005-action-failure-triggers-dead-letter-via-on-complete.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.agent-llm-integration.action-failure-triggers-dead-letter-via-on-complete -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-llm-integration ---- -# Action failure triggers dead letter via onComplete - -## Intent - -- outcome: Executable scenario: Action failure triggers dead letter via onComplete - -```gwt -Given an agent action that throws an unrecoverable error -When the onComplete handler fires with result.kind "failed" -Then a dead letter entry is created in agent component -And the checkpoint is NOT advanced -And an AgentAnalysisFailed audit event is recorded -``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-006-rate-limiter-allows-llm-call-within-limits.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-006-rate-limiter-allows-llm-call-within-limits.sdp.md deleted file mode 100644 index 49474752..00000000 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-006-rate-limiter-allows-llm-call-within-limits.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.agent-llm-integration.rate-limiter-allows-llm-call-within-limits -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-llm-integration ---- -# Rate limiter allows LLM call within limits - -## Intent - -- outcome: Executable scenario: Rate limiter allows LLM call within limits - -```gwt -Given an agent with rate limit of 60 requests per minute -And 30 requests have been made this minute -When a new event triggers LLM analysis -Then the rate limiter allows the call -And the LLM analysis proceeds normally -``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-007-rate-limiter-blocks-llm-call-when-exceeded.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-007-rate-limiter-blocks-llm-call-when-exceeded.sdp.md deleted file mode 100644 index b29515db..00000000 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-007-rate-limiter-blocks-llm-call-when-exceeded.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.agent-llm-integration.rate-limiter-blocks-llm-call-when-exceeded -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-llm-integration ---- -# Rate limiter blocks LLM call when exceeded - -## Intent - -- outcome: Executable scenario: Rate limiter blocks LLM call when exceeded - -```gwt -Given an agent with rate limit of 60 requests per minute -And 60 requests have already been made this minute -When a new event triggers LLM analysis -Then the rate limiter denies the call -And the event is requeued for later processing -And an AgentRateLimited audit event is recorded -``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-008-cost-budget-exceeded-pauses-agent.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-008-cost-budget-exceeded-pauses-agent.sdp.md deleted file mode 100644 index a9b613be..00000000 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-008-cost-budget-exceeded-pauses-agent.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.agent-llm-integration.cost-budget-exceeded-pauses-agent -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-llm-integration ---- -# Cost budget exceeded pauses agent - -## Intent - -- outcome: Executable scenario: Cost budget exceeded pauses agent - -```gwt -Given an agent with daily cost budget of 10.00 USD -And 9.50 USD has been spent today -When a new LLM call would cost approximately 0.60 USD -Then the agent is paused automatically -And an AgentBudgetExceeded audit event is recorded -And the event is dead-lettered with reason "budget_exceeded" -``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-009-queue-overflow-triggers-dead-letter.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-009-queue-overflow-triggers-dead-letter.sdp.md deleted file mode 100644 index 05b4960d..00000000 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-009-queue-overflow-triggers-dead-letter.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.agent-llm-integration.queue-overflow-triggers-dead-letter -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-llm-integration ---- -# Queue overflow triggers dead letter - -## Intent - -- outcome: Executable scenario: Queue overflow triggers dead letter - -```gwt -Given an agent with queue depth of 100 -And 100 events are already queued -When another event is rate-limited -Then it is sent to dead letter with reason "queue_overflow" -And an AgentQueueOverflow audit event is recorded -``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-010-agent-subscription-with-on-complete-receives-completion-callbacks.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-010-agent-subscription-with-on-complete-receives-completion-callbacks.sdp.md deleted file mode 100644 index 2f712592..00000000 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-010-agent-subscription-with-on-complete-receives-completion-callbacks.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.agent-llm-integration.agent-subscription-with-on-complete-receives-completion-callbacks -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-llm-integration ---- -# Agent subscription with onComplete receives completion callbacks - -## Intent - -- outcome: Executable scenario: Agent subscription with onComplete receives completion callbacks - -```gwt -Given an agent subscription configured with custom onComplete handler -When the agent action completes successfully -Then the custom onComplete handler fires with result.kind "success" -And the handler can update the agent checkpoint -And the handler can record agent-specific audit events -``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-011-failed-agent-jobs-create-dead-letters-via-on-complete.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-011-failed-agent-jobs-create-dead-letters-via-on-complete.sdp.md deleted file mode 100644 index 4ac67f77..00000000 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-011-failed-agent-jobs-create-dead-letters-via-on-complete.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.agent-llm-integration.failed-agent-jobs-create-dead-letters-via-on-complete -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-llm-integration ---- -# Failed agent jobs create dead letters via onComplete - -## Intent - -- outcome: Executable scenario: Failed agent jobs create dead letters via onComplete - -```gwt -Given an agent subscription configured with custom onComplete handler -When the agent action fails with an error -Then the custom onComplete handler fires with result.kind "failed" -And a dead letter entry is created in the agent component -And the checkpoint is not advanced past the failed event -``` diff --git a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-012-agent-subscription-without-on-complete-uses-global-default.sdp.md b/specs/unimplemented/architect-scenarios/agent-llm-integration/s-012-agent-subscription-without-on-complete-uses-global-default.sdp.md deleted file mode 100644 index 0971c4c9..00000000 --- a/specs/unimplemented/architect-scenarios/agent-llm-integration/s-012-agent-subscription-without-on-complete-uses-global-default.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.agent-llm-integration.agent-subscription-without-on-complete-uses-global-default -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.agent-llm-integration ---- -# Agent subscription without onComplete uses global default - -## Intent - -- outcome: Executable scenario: Agent subscription without onComplete uses global default - -```gwt -Given an agent subscription without a custom onComplete handler -When the agent action fails -Then the EventBus defaultOnComplete handler fires -And the global dead letter handler processes the failure -``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-001-circuit-remains-closed-on-success.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-001-circuit-remains-closed-on-success.sdp.md deleted file mode 100644 index 96a787f6..00000000 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-001-circuit-remains-closed-on-success.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.circuit-breaker-pattern.circuit-remains-closed-on-success -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.circuit-breaker-pattern ---- -# Timeout transitions open to half-open - -## Intent - -- outcome: Executable scenario: Timeout transitions open to half-open - -```gwt -Given the following deliverables: -And a circuit "stripe-api" opened at timestamp 1000 -And resetTimeoutMs is 30000 -When timeout fires at timestamp 31000 -Then circuit should transition to "half_open" -``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-002-circuit-opens-after-threshold-failures.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-002-circuit-opens-after-threshold-failures.sdp.md deleted file mode 100644 index 0e4c2878..00000000 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-002-circuit-opens-after-threshold-failures.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.circuit-breaker-pattern.circuit-opens-after-threshold-failures -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.circuit-breaker-pattern ---- -# Stale timeout is ignored - -## Intent - -- outcome: Executable scenario: Stale timeout is ignored - -```gwt -Given the following deliverables: -And a circuit "stripe-api" was opened at timestamp 1000 -And circuit was manually closed at timestamp 10000 -And circuit opened again at timestamp 20000 -When stale timeout fires with openedAt=1000 -Then timeout should be skipped -And circuit should remain in current state -``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-003-circuit-transitions-to-half-open-after-timeout.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-003-circuit-transitions-to-half-open-after-timeout.sdp.md deleted file mode 100644 index d9bc4d58..00000000 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-003-circuit-transitions-to-half-open-after-timeout.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.circuit-breaker-pattern.circuit-transitions-to-half-open-after-timeout -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.circuit-breaker-pattern ---- -# Payment circuit opens after 3 failures - -## Intent - -- outcome: Executable scenario: Payment circuit opens after 3 failures - -```gwt -Given the following deliverables: -And a circuit "stripe-api" with failureThreshold 3 -When 3 consecutive failures occur -Then circuit should be "open" -``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-004-successful-probe-closes-circuit.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-004-successful-probe-closes-circuit.sdp.md deleted file mode 100644 index 7df1aabd..00000000 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-004-successful-probe-closes-circuit.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.circuit-breaker-pattern.successful-probe-closes-circuit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.circuit-breaker-pattern ---- -# Email circuit tolerates more failures - -## Intent - -- outcome: Executable scenario: Email circuit tolerates more failures - -```gwt -Given the following deliverables: -And a circuit "sendgrid" with failureThreshold 10 -When 5 failures occur -Then circuit should still be "closed" -And failureCount should be 5 -``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-005-failed-probe-reopens-circuit.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-005-failed-probe-reopens-circuit.sdp.md deleted file mode 100644 index c63a43a2..00000000 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-005-failed-probe-reopens-circuit.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.circuit-breaker-pattern.failed-probe-reopens-circuit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.circuit-breaker-pattern ---- -# Different services have independent circuits - -## Intent - -- outcome: Executable scenario: Different services have independent circuits - -```gwt -Given the following deliverables: -And circuit "stripe-api" is "open" -And circuit "sendgrid" is "closed" -When a Stripe request is made and a SendGrid request is made -Then it should fail fast -And it should execute normally -``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-006-circuit-state-persists-across-function-calls.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-006-circuit-state-persists-across-function-calls.sdp.md deleted file mode 100644 index 3a7106d3..00000000 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-006-circuit-state-persists-across-function-calls.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.circuit-breaker-pattern.circuit-state-persists-across-function-calls -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.circuit-breaker-pattern ---- -# Circuit state persists across function calls - -## Intent - -- outcome: Architect scenario: Circuit state persists across function calls - -```gwt -Given a circuit "stripe-api" in "closed" state -When two concurrent requests fail -Then both failures should be recorded -And failureCount should be 2 (not 1) -``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-007-non-existent-circuit-defaults-to-closed.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-007-non-existent-circuit-defaults-to-closed.sdp.md deleted file mode 100644 index 7b6dffa6..00000000 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-007-non-existent-circuit-defaults-to-closed.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.circuit-breaker-pattern.non-existent-circuit-defaults-to-closed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.circuit-breaker-pattern ---- -# Non-existent circuit defaults to closed - -## Intent - -- outcome: Architect scenario: Non-existent circuit defaults to closed - -```gwt -Given no circuit entry for "new-service" -When loading circuit state -Then state should be "closed" -And failureCount should be 0 -And default config should be applied -``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-008-timeout-transitions-open-to-half-open.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-008-timeout-transitions-open-to-half-open.sdp.md deleted file mode 100644 index a49cad66..00000000 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-008-timeout-transitions-open-to-half-open.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.circuit-breaker-pattern.timeout-transitions-open-to-half-open -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.circuit-breaker-pattern ---- -# Timeout transitions open to half-open - -## Intent - -- outcome: Executable scenario: Timeout transitions open to half-open - -```gwt -Given the following deliverables: -And a circuit "stripe-api" opened at timestamp 1000 -And resetTimeoutMs is 30000 -When timeout fires at timestamp 31000 -Then circuit should transition to "half_open" -``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-009-stale-timeout-is-ignored.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-009-stale-timeout-is-ignored.sdp.md deleted file mode 100644 index 07941374..00000000 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-009-stale-timeout-is-ignored.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.circuit-breaker-pattern.stale-timeout-is-ignored -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.circuit-breaker-pattern ---- -# Stale timeout is ignored - -## Intent - -- outcome: Executable scenario: Stale timeout is ignored - -```gwt -Given the following deliverables: -And a circuit "stripe-api" was opened at timestamp 1000 -And circuit was manually closed at timestamp 10000 -And circuit opened again at timestamp 20000 -When stale timeout fires with openedAt=1000 -Then timeout should be skipped -And circuit should remain in current state -``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-010-half-open-probe-closes-circuit-on-success.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-010-half-open-probe-closes-circuit-on-success.sdp.md deleted file mode 100644 index 5d45c551..00000000 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-010-half-open-probe-closes-circuit-on-success.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.circuit-breaker-pattern.half-open-probe-closes-circuit-on-success -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.circuit-breaker-pattern ---- -# Half-open probe closes circuit on success - -## Intent - -- outcome: Architect scenario: Half-open probe closes circuit on success - -```gwt -Given a circuit "stripe-api" in "half_open" state -When a probe request succeeds -Then onProbeComplete should receive success result -And circuit should transition to "closed" -And probeRunId should be cleared -``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-011-half-open-probe-reopens-circuit-on-failure.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-011-half-open-probe-reopens-circuit-on-failure.sdp.md deleted file mode 100644 index b3ab549a..00000000 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-011-half-open-probe-reopens-circuit-on-failure.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.circuit-breaker-pattern.half-open-probe-reopens-circuit-on-failure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.circuit-breaker-pattern ---- -# Half-open probe reopens circuit on failure - -## Intent - -- outcome: Architect scenario: Half-open probe reopens circuit on failure - -```gwt -Given a circuit "stripe-api" in "half_open" state -When a probe request fails -Then onProbeComplete should receive failed result -And circuit should transition to "open" -And a new timeout should be scheduled -``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-012-open-circuit-returns-fast-failure.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-012-open-circuit-returns-fast-failure.sdp.md deleted file mode 100644 index b9cafd0f..00000000 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-012-open-circuit-returns-fast-failure.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.circuit-breaker-pattern.open-circuit-returns-fast-failure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.circuit-breaker-pattern ---- -# Open circuit returns fast failure - -## Intent - -- outcome: Architect scenario: Open circuit returns fast failure - -```gwt -Given a circuit "stripe-api" in "open" state -And circuit opened 10 seconds ago -And resetTimeoutMs is 30000 -When a request is attempted -Then request should fail immediately with "CIRCUIT_OPEN:stripe-api" -And retryAfterMs should be approximately 20000 -``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-013-payment-circuit-opens-after-3-failures.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-013-payment-circuit-opens-after-3-failures.sdp.md deleted file mode 100644 index 272dd4a4..00000000 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-013-payment-circuit-opens-after-3-failures.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.circuit-breaker-pattern.payment-circuit-opens-after-3-failures -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.circuit-breaker-pattern ---- -# Payment circuit opens after 3 failures - -## Intent - -- outcome: Executable scenario: Payment circuit opens after 3 failures - -```gwt -Given the following deliverables: -And a circuit "stripe-api" with failureThreshold 3 -When 3 consecutive failures occur -Then circuit should be "open" -``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-014-email-circuit-tolerates-more-failures.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-014-email-circuit-tolerates-more-failures.sdp.md deleted file mode 100644 index 5f898103..00000000 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-014-email-circuit-tolerates-more-failures.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.circuit-breaker-pattern.email-circuit-tolerates-more-failures -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.circuit-breaker-pattern ---- -# Email circuit tolerates more failures - -## Intent - -- outcome: Executable scenario: Email circuit tolerates more failures - -```gwt -Given the following deliverables: -And a circuit "sendgrid" with failureThreshold 10 -When 5 failures occur -Then circuit should still be "closed" -And failureCount should be 5 -``` diff --git a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-015-different-services-have-independent-circuits.sdp.md b/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-015-different-services-have-independent-circuits.sdp.md deleted file mode 100644 index a8e09ebb..00000000 --- a/specs/unimplemented/architect-scenarios/circuit-breaker-pattern/s-015-different-services-have-independent-circuits.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.circuit-breaker-pattern.different-services-have-independent-circuits -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.circuit-breaker-pattern ---- -# Different services have independent circuits - -## Intent - -- outcome: Executable scenario: Different services have independent circuits - -```gwt -Given the following deliverables: -And circuit "stripe-api" is "open" -And circuit "sendgrid" is "closed" -When a Stripe request is made and a SendGrid request is made -Then it should fail fast -And it should execute normally -``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-001-generate-process-guard-reference-at-standard-detail-level.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-001-generate-process-guard-reference-at-standard-detail-level.sdp.md deleted file mode 100644 index e6cf225b..00000000 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-001-generate-process-guard-reference-at-standard-detail-level.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.codec-driven-reference-generation.generate-process-guard-reference-at-standard-detail-level -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.codec-driven-reference-generation ---- -# Generate process guard reference at standard detail level - -## Intent - -- outcome: Executable scenario: Generate process guard reference at standard detail level - -```gwt -Given the following deliverables: -And a ReferenceDocConfig for "Process Guard" -And convention-tagged decision records exist for "fsm-rules" -And TypeScript shapes are extracted from "src/lint/*.ts" -When the reference codec decodes the MasterDataset -Then a RenderableDocument is produced with Process Guard content -And sections include convention content, API types, and validation rules -``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-002-generate-process-guard-reference-at-summary-detail-level.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-002-generate-process-guard-reference-at-summary-detail-level.sdp.md deleted file mode 100644 index a008e357..00000000 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-002-generate-process-guard-reference-at-summary-detail-level.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.codec-driven-reference-generation.generate-process-guard-reference-at-summary-detail-level -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.codec-driven-reference-generation ---- -# Generate process guard reference at summary detail level - -## Intent - -- outcome: Executable scenario: Generate process guard reference at summary detail level - -```gwt -Given the following deliverables: -And a ReferenceDocConfig for "Process Guard" with detailLevel "summary" -When the reference codec decodes the MasterDataset -Then the output uses tables over prose -And type names are listed without full definitions -And no duplicate sections appear -And output is under 100 lines -``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-003-extract-conventions-by-tag-value.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-003-extract-conventions-by-tag-value.sdp.md deleted file mode 100644 index 691269e5..00000000 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-003-extract-conventions-by-tag-value.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.codec-driven-reference-generation.extract-conventions-by-tag-value -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.codec-driven-reference-generation ---- -# Extract conventions by tag value - -## Intent - -- outcome: Executable scenario: Extract conventions by tag value - -```gwt -Given the following deliverables: -And ADR-006 is tagged with "@architect-convention:fsm-rules" -And ADR-004 is tagged with "@architect-convention:testing-policy" -When extracting conventions for "fsm-rules" -Then only ADR-006 Rule block content is returned -And ADR-004 content is not included -``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-004-convention-content-preserves-rule-block-structure.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-004-convention-content-preserves-rule-block-structure.sdp.md deleted file mode 100644 index fa2d06d8..00000000 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-004-convention-content-preserves-rule-block-structure.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.codec-driven-reference-generation.convention-content-preserves-rule-block-structure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.codec-driven-reference-generation ---- -# Convention content preserves Rule block structure - -## Intent - -- outcome: Executable scenario: Convention content preserves Rule block structure - -```gwt -Given the following deliverables: -And a decision record with Rule blocks containing tables and context -When extracting convention content -Then tables are preserved as structured data -And Invariant/Rationale/Verified-by metadata is preserved -``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-005-no-conventions-found-for-requested-tag-values.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-005-no-conventions-found-for-requested-tag-values.sdp.md deleted file mode 100644 index fd8c3852..00000000 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-005-no-conventions-found-for-requested-tag-values.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.codec-driven-reference-generation.no-conventions-found-for-requested-tag-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.codec-driven-reference-generation ---- -# No conventions found for requested tag values - -## Intent - -- outcome: Executable scenario: No conventions found for requested tag values - -```gwt -Given the following deliverables: -And a MasterDataset with no decision records tagged "fsm-rules" -When the reference codec decodes for "Process Guard" -Then the output omits the conventions section -And the document is still valid with shape and behavior content -``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-006-no-shape-sources-match-any-pattern-file-paths.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-006-no-shape-sources-match-any-pattern-file-paths.sdp.md deleted file mode 100644 index be1d1d58..00000000 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-006-no-shape-sources-match-any-pattern-file-paths.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.codec-driven-reference-generation.no-shape-sources-match-any-pattern-file-paths -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.codec-driven-reference-generation ---- -# No shape sources match any pattern file paths - -## Intent - -- outcome: Executable scenario: No shape sources match any pattern file paths - -```gwt -Given the following deliverables: -And a ReferenceDocConfig with shapeSources "src/nonexistent/*.ts" -When the reference codec decodes the MasterDataset -Then the output omits the type definitions section -And no error is raised -``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-007-convention-tag-matches-multiple-decision-records.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-007-convention-tag-matches-multiple-decision-records.sdp.md deleted file mode 100644 index 4f266a6a..00000000 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-007-convention-tag-matches-multiple-decision-records.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.codec-driven-reference-generation.convention-tag-matches-multiple-decision-records -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.codec-driven-reference-generation ---- -# Convention tag matches multiple decision records - -## Intent - -- outcome: Executable scenario: Convention tag matches multiple decision records - -```gwt -Given the following deliverables: -And ADR-006 and ADR-012 are both tagged "fsm-rules" -When extracting conventions for "fsm-rules" -Then both decision records contribute Rule block content -And content is ordered by source decision record -``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-008-dual-output-generation.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-008-dual-output-generation.sdp.md deleted file mode 100644 index 9a44114f..00000000 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-008-dual-output-generation.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.codec-driven-reference-generation.dual-output-generation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.codec-driven-reference-generation ---- -# Dual output generation - -## Intent - -- outcome: Executable scenario: Dual output generation - -```gwt -Given the following deliverables: -And a ReferenceDocConfig with claudeMdSection "validation" -When the reference generator runs -Then "docs/PROCESS-GUARD-REFERENCE.md" is generated at "detailed" level -And "_claude-md/validation/process-guard.md" is generated at "summary" level -``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-009-summary-compaction-quality.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-009-summary-compaction-quality.sdp.md deleted file mode 100644 index ef21654d..00000000 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-009-summary-compaction-quality.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.codec-driven-reference-generation.summary-compaction-quality -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.codec-driven-reference-generation ---- -# Summary compaction quality - -## Intent - -- outcome: Executable scenario: Summary compaction quality - -```gwt -Given the following deliverables: -And a reference codec output at "summary" detail level -When the scenario runs -Then the output follows modular-claude-md conventions -And headings start at H3 level -And tables are preferred over prose -And total output is under 100 lines -``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-010-reference-generators-appear-in-available-generators-list.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-010-reference-generators-appear-in-available-generators-list.sdp.md deleted file mode 100644 index bda76c8b..00000000 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-010-reference-generators-appear-in-available-generators-list.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.codec-driven-reference-generation.reference-generators-appear-in-available-generators-list -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.codec-driven-reference-generation ---- -# Reference generators appear in available generators list - -## Intent - -- outcome: Executable scenario: Reference generators appear in available generators list - -```gwt -Given the following deliverables: -And reference generators are registered -When querying GeneratorRegistry.available() -Then "process-guard-reference" is listed -And "session-guides-reference" is listed -And all 11 reference types are available -``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-011-cli-invocation-generates-reference-docs.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-011-cli-invocation-generates-reference-docs.sdp.md deleted file mode 100644 index bc41ae10..00000000 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-011-cli-invocation-generates-reference-docs.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.codec-driven-reference-generation.cli-invocation-generates-reference-docs -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.codec-driven-reference-generation ---- -# CLI invocation generates reference docs - -## Intent - -- outcome: Executable scenario: CLI invocation generates reference docs - -```gwt -Given the following deliverables: -And the generate-docs CLI -When running with "--generators process-guard-reference" -Then dual output is produced for process guard -``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-012-convention-tag-is-registered-in-taxonomy.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-012-convention-tag-is-registered-in-taxonomy.sdp.md deleted file mode 100644 index 127aacce..00000000 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-012-convention-tag-is-registered-in-taxonomy.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.codec-driven-reference-generation.convention-tag-is-registered-in-taxonomy -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.codec-driven-reference-generation ---- -# Convention tag is registered in taxonomy - -## Intent - -- outcome: Executable scenario: Convention tag is registered in taxonomy - -```gwt -Given the following deliverables: -And the tag registry -When checking for "@architect-convention" -Then it exists with format "csv" -And it accepts the defined convention values -``` diff --git a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-013-recipe-rule-block-content-preserved-in-decision-record.sdp.md b/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-013-recipe-rule-block-content-preserved-in-decision-record.sdp.md deleted file mode 100644 index eaa1ee0e..00000000 --- a/specs/unimplemented/architect-scenarios/codec-driven-reference-generation/s-013-recipe-rule-block-content-preserved-in-decision-record.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.codec-driven-reference-generation.recipe-rule-block-content-preserved-in-decision-record -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.codec-driven-reference-generation ---- -# Recipe Rule block content preserved in decision record - -## Intent - -- outcome: Executable scenario: Recipe Rule block content preserved in decision record - -```gwt -Given the following deliverables: -And recipe "process-guard-reference.feature" has Rule "Escape Hatches" -And the Rule contains a table with "Situation", "Solution", "Example" columns -When the Rule is migrated to a decision record tagged "fsm-rules" -Then the decision record Rule block contains the same table -And Invariant/Rationale metadata is preserved -``` diff --git a/specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-001-auth-remediation-is-not-split-by-mutation-family.sdp.md b/specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-001-auth-remediation-is-not-split-by-mutation-family.sdp.md deleted file mode 100644 index 25c813ed..00000000 --- a/specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-001-auth-remediation-is-not-split-by-mutation-family.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.component-boundary-authentication-convention.auth-remediation-is-not-split-by-mutation-family -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.component-boundary-authentication-convention ---- -# Auth remediation is not split by mutation family - -## Intent - -- outcome: Executable scenario: Auth remediation is not split by mutation family - -```gwt -Given the following deliverables: -And the component-boundary auth packet is in roadmap state -When implementation begins -Then all identity-bearing mutation sites listed in the remediation plan are in the same packet -And PDR-014 is committed before the packet can complete -``` diff --git a/specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-by-default.sdp.md b/specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-by-default.sdp.md deleted file mode 100644 index 69ab7899..00000000 --- a/specs/unimplemented/architect-scenarios/component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-by-default.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.component-boundary-authentication-convention.missing-or-forged-proof-is-rejected-by-default -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.component-boundary-authentication-convention ---- -# Missing or forged proof is rejected by default - -## Intent - -- outcome: Executable scenario: Missing or forged proof is rejected by default - -```gwt -Given the following deliverables: -And a component mutation requiring actor identity -When the proof is missing, expired, mismatched, or forged -Then the mutation is rejected before any write occurs -``` diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-001-cancel-a-confirmed-order.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-001-cancel-a-confirmed-order.sdp.md deleted file mode 100644 index bee8d36d..00000000 --- a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-001-cancel-a-confirmed-order.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.confirmed-order-cancellation.cancel-a-confirmed-order -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.confirmed-order-cancellation ---- -# Cancel a confirmed order - -## Intent - -- outcome: Executable scenario: Cancel a confirmed order - -```gwt -Given the following deliverables: -And an order "ord-conf-cancel-01" exists with status "confirmed" -When I send a CancelOrder command for "ord-conf-cancel-01" with reason "Customer changed mind" -Then the command should succeed -And the order "ord-conf-cancel-01" status should be "cancelled" -``` diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-002-cannot-cancel-already-cancelled-order-unchanged-behavior.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-002-cannot-cancel-already-cancelled-order-unchanged-behavior.sdp.md deleted file mode 100644 index 0817c4f9..00000000 --- a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-002-cannot-cancel-already-cancelled-order-unchanged-behavior.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.confirmed-order-cancellation.cannot-cancel-already-cancelled-order-unchanged-behavior -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.confirmed-order-cancellation ---- -# Cannot cancel already cancelled order (unchanged behavior) - -## Intent - -- outcome: Executable scenario: Cannot cancel already cancelled order (unchanged behavior) - -```gwt -Given the following deliverables: -And an order "ord-conf-cancel-02" exists with status "cancelled" -When I send a CancelOrder command for "ord-conf-cancel-02" with reason "Double cancel attempt" -Then the command should be rejected with code "ORDER_ALREADY_CANCELLED" -``` diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-003-order-cancelled-evolves-confirmed-state-to-cancelled.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-003-order-cancelled-evolves-confirmed-state-to-cancelled.sdp.md deleted file mode 100644 index 3c72608e..00000000 --- a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-003-order-cancelled-evolves-confirmed-state-to-cancelled.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.confirmed-order-cancellation.order-cancelled-evolves-confirmed-state-to-cancelled -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.confirmed-order-cancellation ---- -# OrderCancelled evolves confirmed state to cancelled - -## Intent - -- outcome: Executable scenario: OrderCancelled evolves confirmed state to cancelled - -```gwt -Given the following deliverables: -And an order state with status "confirmed" -When OrderCancelled event is applied -Then state should have status "cancelled" -``` diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-004-reservation-is-released-after-confirmed-order-cancellation.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-004-reservation-is-released-after-confirmed-order-cancellation.sdp.md deleted file mode 100644 index 418bdc6d..00000000 --- a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-004-reservation-is-released-after-confirmed-order-cancellation.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.confirmed-order-cancellation.reservation-is-released-after-confirmed-order-cancellation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.confirmed-order-cancellation ---- -# Reservation is released after confirmed order cancellation - -## Intent - -- outcome: Architect scenario: Reservation is released after confirmed order cancellation - -```gwt -Given a product "prod-rel-01" exists with 10 available and 5 reserved stock -And a confirmed order "ord-rel-01" with a confirmed reservation for 5 units -When I cancel order "ord-rel-01" with reason "Customer changed mind" -Then the order "ord-rel-01" should have status "cancelled" -And I wait for projections to process -And the reservation for order "ord-rel-01" should have status "released" -And the product "prod-rel-01" should have 15 available and 0 reserved stock -``` diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-005-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-005-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md deleted file mode 100644 index 216d6ae6..00000000 --- a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-005-cancelling-draft-order-does-not-trigger-reservation-release.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.confirmed-order-cancellation.cancelling-draft-order-does-not-trigger-reservation-release -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.confirmed-order-cancellation ---- -# Cancelling draft order does not trigger reservation release - -## Intent - -- outcome: Architect scenario: Cancelling draft order does not trigger reservation release - -```gwt -Given a draft order "ord-rel-02" exists -When I cancel order "ord-rel-02" with reason "Changed mind early" -Then the order "ord-rel-02" should have status "cancelled" -And no ReleaseReservation command should be emitted -``` diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-006-cancelling-submitted-order-with-pending-reservation-releases-it.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-006-cancelling-submitted-order-with-pending-reservation-releases-it.sdp.md deleted file mode 100644 index 0511c940..00000000 --- a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-006-cancelling-submitted-order-with-pending-reservation-releases-it.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.confirmed-order-cancellation.cancelling-submitted-order-with-pending-reservation-releases-it -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.confirmed-order-cancellation ---- -# Cancelling submitted order with pending reservation releases it - -## Intent - -- outcome: Architect scenario: Cancelling submitted order with pending reservation releases it - -```gwt -Given a submitted order "ord-rel-03" with a pending reservation -When I cancel order "ord-rel-03" with reason "Changed mind before confirmation" -Then the order "ord-rel-03" should have status "cancelled" -And the reservation for order "ord-rel-03" should have status "released" -``` diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-007-pm-is-idempotent-for-duplicate-order-cancelled-events.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-007-pm-is-idempotent-for-duplicate-order-cancelled-events.sdp.md deleted file mode 100644 index 0c747160..00000000 --- a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-007-pm-is-idempotent-for-duplicate-order-cancelled-events.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:platform.confirmed-order-cancellation.pm-is-idempotent-for-duplicate-order-cancelled-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.confirmed-order-cancellation ---- -# PM is idempotent for duplicate OrderCancelled events - -## Intent - -- outcome: Architect scenario: PM is idempotent for duplicate OrderCancelled events - -```gwt -Given a confirmed order "ord-rel-04" with a confirmed reservation -When OrderCancelled event is delivered twice for "ord-rel-04" -Then the reservation should only be released once -``` diff --git a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-008-three-cancellations-trigger-churn-risk-agent.sdp.md b/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-008-three-cancellations-trigger-churn-risk-agent.sdp.md deleted file mode 100644 index 1e539d2b..00000000 --- a/specs/unimplemented/architect-scenarios/confirmed-order-cancellation/s-008-three-cancellations-trigger-churn-risk-agent.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.confirmed-order-cancellation.three-cancellations-trigger-churn-risk-agent -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.confirmed-order-cancellation ---- -# Three cancellations trigger churn risk agent - -## Intent - -- outcome: Architect scenario: Three cancellations trigger churn risk agent - -```gwt -Given a customer "cust-churn-01" exists -And 3 confirmed orders for customer "cust-churn-01" -When I cancel all 3 orders for customer "cust-churn-01" -Then the churn risk agent should detect the pattern -And an approval request should be created for customer outreach -``` diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-001-same-email-produces-same-stream-id.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-001-same-email-produces-same-stream-id.sdp.md deleted file mode 100644 index d44bb2a2..00000000 --- a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-001-same-email-produces-same-stream-id.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.deterministic-id-hashing.same-email-produces-same-stream-id -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.deterministic-id-hashing ---- -# Same email produces same stream ID - -## Intent - -- outcome: Executable scenario: Same email produces same stream ID - -```gwt -Given the following deliverables: -And entity type "User" -And business key "alice@example.com" -When deterministicStreamId is called twice -Then both calls return identical stream ID -And stream ID format is "User:{hash}" -``` diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-002-composite-key-produces-consistent-hash.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-002-composite-key-produces-consistent-hash.sdp.md deleted file mode 100644 index 17fd447b..00000000 --- a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-002-composite-key-produces-consistent-hash.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.deterministic-id-hashing.composite-key-produces-consistent-hash -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.deterministic-id-hashing ---- -# Composite key produces consistent hash - -## Intent - -- outcome: Executable scenario: Composite key produces consistent hash - -```gwt -Given the following deliverables: -And entity type "TenantUser" -And composite key ["tenant_123", "alice@example.com"] -When deterministicStreamId is called -Then stream ID is deterministic -And changing key order produces different hash -``` diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-003-different-emails-produce-different-stream-i-ds.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-003-different-emails-produce-different-stream-i-ds.sdp.md deleted file mode 100644 index 20828777..00000000 --- a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-003-different-emails-produce-different-stream-i-ds.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.deterministic-id-hashing.different-emails-produce-different-stream-i-ds -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.deterministic-id-hashing ---- -# Different emails produce different stream IDs - -## Intent - -- outcome: Executable scenario: Different emails produce different stream IDs - -```gwt -Given the following deliverables: -And entity type "User" -When deterministicStreamId is called with "alice@example.com" and deterministicStreamId is called with "bob@example.com" -Then the stream IDs are different -``` diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-004-first-create-succeeds.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-004-first-create-succeeds.sdp.md deleted file mode 100644 index 545d703c..00000000 --- a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-004-first-create-succeeds.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.deterministic-id-hashing.first-create-succeeds -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.deterministic-id-hashing ---- -# First create succeeds - -## Intent - -- outcome: Executable scenario: First create succeeds - -```gwt -Given the following deliverables: -And no existing stream for email "alice@example.com" -When User creation is attempted -Then UserCreated event is appended -And stream version becomes 1 -``` diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-005-second-create-fails-with-conflict.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-005-second-create-fails-with-conflict.sdp.md deleted file mode 100644 index ee3bd9a5..00000000 --- a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-005-second-create-fails-with-conflict.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.deterministic-id-hashing.second-create-fails-with-conflict -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.deterministic-id-hashing ---- -# Second create fails with conflict - -## Intent - -- outcome: Executable scenario: Second create fails with conflict - -```gwt -Given the following deliverables: -And existing stream for email "alice@example.com" -When second User creation is attempted with same email -Then VERSION_CONFLICT error is thrown -And error is translated to UniqueConstraintViolation -``` diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-006-concurrent-creates-exactly-one-succeeds.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-006-concurrent-creates-exactly-one-succeeds.sdp.md deleted file mode 100644 index 00e8b091..00000000 --- a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-006-concurrent-creates-exactly-one-succeeds.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.deterministic-id-hashing.concurrent-creates-exactly-one-succeeds -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.deterministic-id-hashing ---- -# Concurrent creates - exactly one succeeds - -## Intent - -- outcome: Executable scenario: Concurrent creates - exactly one succeeds - -```gwt -Given the following deliverables: -And no existing stream for email "alice@example.com" -When two concurrent User creations are attempted -Then exactly one succeeds -And the other fails with UniqueConstraintViolation -``` diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-007-hash-output-is-url-safe.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-007-hash-output-is-url-safe.sdp.md deleted file mode 100644 index a7e80c3a..00000000 --- a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-007-hash-output-is-url-safe.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.deterministic-id-hashing.hash-output-is-url-safe -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.deterministic-id-hashing ---- -# Hash output is URL-safe - -## Intent - -- outcome: Executable scenario: Hash output is URL-safe - -```gwt -Given the following deliverables: -And any business key input -When hash is computed -Then output contains only alphanumeric characters -And output is fixed length (e.g., 16 characters) -``` diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-008-hash-is-not-reversible.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-008-hash-is-not-reversible.sdp.md deleted file mode 100644 index 83c609c4..00000000 --- a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-008-hash-is-not-reversible.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.deterministic-id-hashing.hash-is-not-reversible -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.deterministic-id-hashing ---- -# Hash is not reversible - -## Intent - -- outcome: Executable scenario: Hash is not reversible - -```gwt -Given the following deliverables: -And a computed hash -When the scenario runs -Then original business key cannot be derived -And this protects sensitive keys like email -``` diff --git a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-009-pattern-selection-by-use-case.sdp.md b/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-009-pattern-selection-by-use-case.sdp.md deleted file mode 100644 index 9b10d739..00000000 --- a/specs/unimplemented/architect-scenarios/deterministic-id-hashing/s-009-pattern-selection-by-use-case.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.deterministic-id-hashing.pattern-selection-by-use-case -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.deterministic-id-hashing ---- -# Pattern selection by use case - -## Intent - -- outcome: Executable scenario: Pattern selection by use case - -```gwt -Given the following deliverables: -And a uniqueness requirement for "value" -And the field is "value" -And the flow is "value" -When selecting uniqueness pattern -Then recommended pattern is "value" -``` diff --git a/specs/unimplemented/architect-scenarios/epic-process-enhancements/s-001-specs-can-evolve-independently-of-phases.sdp.md b/specs/unimplemented/architect-scenarios/epic-process-enhancements/s-001-specs-can-evolve-independently-of-phases.sdp.md deleted file mode 100644 index b1ca3c3e..00000000 --- a/specs/unimplemented/architect-scenarios/epic-process-enhancements/s-001-specs-can-evolve-independently-of-phases.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.epic-process-enhancements.specs-can-evolve-independently-of-phases -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.epic-process-enhancements ---- -# Specs can evolve independently of phases - -## Intent - -- outcome: Executable scenario: Specs can evolve independently of phases - -```gwt -Given the following specs in this epic: -And a spec file in libar-platform/architect/specs/ -When the spec is refined, split, or combined -Then TypeScript phase files maintain release association -And no phase metadata needs updating in the spec -``` diff --git a/specs/unimplemented/architect-scenarios/epic-process-enhancements/s-002-type-script-phase-files-link-specs-to-releases.sdp.md b/specs/unimplemented/architect-scenarios/epic-process-enhancements/s-002-type-script-phase-files-link-specs-to-releases.sdp.md deleted file mode 100644 index 30e8d454..00000000 --- a/specs/unimplemented/architect-scenarios/epic-process-enhancements/s-002-type-script-phase-files-link-specs-to-releases.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.epic-process-enhancements.type-script-phase-files-link-specs-to-releases -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.epic-process-enhancements ---- -# TypeScript phase files link specs to releases - -## Intent - -- outcome: Executable scenario: TypeScript phase files link specs to releases - -```gwt -Given the following specs in this epic: -And a TypeScript phase file in architect/src/phases/ -When the scenario runs -Then it references the spec by pattern name -And contains minimal metadata (phase, status, quarter, effort) -And centralized location enables consistent release tracking -``` diff --git a/specs/unimplemented/architect-scenarios/event-correctness-migration/s-001-event-correctness-packet-starts-from-decisions-and-inventory.sdp.md b/specs/unimplemented/architect-scenarios/event-correctness-migration/s-001-event-correctness-packet-starts-from-decisions-and-inventory.sdp.md deleted file mode 100644 index 49f6a507..00000000 --- a/specs/unimplemented/architect-scenarios/event-correctness-migration/s-001-event-correctness-packet-starts-from-decisions-and-inventory.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.event-correctness-migration.event-correctness-packet-starts-from-decisions-and-inventory -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.event-correctness-migration ---- -# Event correctness packet starts from decisions and inventory - -## Intent - -- outcome: Executable scenario: Event correctness packet starts from decisions and inventory - -```gwt -Given the following deliverables: -And the correctness packet is planned -When implementation begins -Then PDR-018 and PDR-015 are committed before runtime changes complete -And a consumer inventory exists before 'globalPosition' migration work starts -``` diff --git a/specs/unimplemented/architect-scenarios/event-correctness-migration/s-002-old-and-new-checkpoint-formats-are-handled-explicitly.sdp.md b/specs/unimplemented/architect-scenarios/event-correctness-migration/s-002-old-and-new-checkpoint-formats-are-handled-explicitly.sdp.md deleted file mode 100644 index 45859b45..00000000 --- a/specs/unimplemented/architect-scenarios/event-correctness-migration/s-002-old-and-new-checkpoint-formats-are-handled-explicitly.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.event-correctness-migration.old-and-new-checkpoint-formats-are-handled-explicitly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.event-correctness-migration ---- -# Old and new checkpoint formats are handled explicitly - -## Intent - -- outcome: Executable scenario: Old and new checkpoint formats are handled explicitly - -```gwt -Given the following deliverables: -And historical checkpoint formats exist -When the new 'globalPosition' representation lands -Then old checkpoints are read through a compat path -And new checkpoints cannot be misread as old -``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-001-readiness-probe-returns-healthy-when-all-components-ok.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-001-readiness-probe-returns-healthy-when-all-components-ok.sdp.md deleted file mode 100644 index a577254e..00000000 --- a/specs/unimplemented/architect-scenarios/health-observability/s-001-readiness-probe-returns-healthy-when-all-components-ok.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:platform.health-observability.readiness-probe-returns-healthy-when-all-components-ok -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.health-observability ---- -# Workpool backlog fails readiness - -## Intent - -- outcome: Executable scenario: Workpool backlog fails readiness - -```gwt -Given the following deliverables: -And projectionPool maxParallelism is 10 -And projectionPool queue depth is 25 -And threshold is 20 (2x maxParallelism) -When GET /health/ready is called -Then HTTP status should be 503 -And response should identify "workpool_backlog" as degraded -And suggested action should be "reduce traffic or scale" -``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-002-readiness-probe-returns-unhealthy-on-projection-lag.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-002-readiness-probe-returns-unhealthy-on-projection-lag.sdp.md deleted file mode 100644 index b109aac4..00000000 --- a/specs/unimplemented/architect-scenarios/health-observability/s-002-readiness-probe-returns-unhealthy-on-projection-lag.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.health-observability.readiness-probe-returns-unhealthy-on-projection-lag -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.health-observability ---- -# Normal queue depth passes readiness - -## Intent - -- outcome: Executable scenario: Normal queue depth passes readiness - -```gwt -Given the following deliverables: -And projectionPool queue depth is 15 -And threshold is 20 -When GET /health/ready is called -Then workpool component should be "healthy" -``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-003-liveness-probe-always-returns-alive.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-003-liveness-probe-always-returns-alive.sdp.md deleted file mode 100644 index a930092b..00000000 --- a/specs/unimplemented/architect-scenarios/health-observability/s-003-liveness-probe-always-returns-alive.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:platform.health-observability.liveness-probe-always-returns-alive -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.health-observability ---- -# All components healthy yields healthy system - -## Intent - -- outcome: Executable scenario: All components healthy yields healthy system - -```gwt -Given the following deliverables: -And Event Store responds successfully -And all projections have lag < 100 -And all Workpool depths are below threshold -And DLQ has < 10 pending items -When system health is aggregated -Then system status should be "healthy" -And summary.healthy should be 4 -And summary.unhealthy should be 0 -``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-004-workpool-backlog-fails-readiness.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-004-workpool-backlog-fails-readiness.sdp.md deleted file mode 100644 index acf496ec..00000000 --- a/specs/unimplemented/architect-scenarios/health-observability/s-004-workpool-backlog-fails-readiness.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.health-observability.workpool-backlog-fails-readiness -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.health-observability ---- -# Single unhealthy component makes system unhealthy - -## Intent - -- outcome: Executable scenario: Single unhealthy component makes system unhealthy - -```gwt -Given the following deliverables: -And Event Store responds successfully -And projection "orderSummary" has lag of 5000 (critical) -And Workpool depths are normal -When system health is aggregated -Then system status should be "unhealthy" -And components should identify "projections" as unhealthy -``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-005-normal-queue-depth-passes-readiness.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-005-normal-queue-depth-passes-readiness.sdp.md deleted file mode 100644 index 8da4ede1..00000000 --- a/specs/unimplemented/architect-scenarios/health-observability/s-005-normal-queue-depth-passes-readiness.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.health-observability.normal-queue-depth-passes-readiness -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.health-observability ---- -# Degraded component yields degraded system - -## Intent - -- outcome: Executable scenario: Degraded component yields degraded system - -```gwt -Given the following deliverables: -And Event Store responds successfully -And projection "orderSummary" has lag of 150 (warning) -And all other components are healthy -When system health is aggregated -Then system status should be "degraded" -And components should identify "projections" as degraded -``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-006-projection-lag-is-calculated-correctly.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-006-projection-lag-is-calculated-correctly.sdp.md deleted file mode 100644 index 35313b0c..00000000 --- a/specs/unimplemented/architect-scenarios/health-observability/s-006-projection-lag-is-calculated-correctly.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.health-observability.projection-lag-is-calculated-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.health-observability ---- -# Projection lag is calculated correctly - -## Intent - -- outcome: Architect scenario: Projection lag is calculated correctly - -```gwt -Given Event Store max globalPosition is 1000 -And projection "orderSummary" checkpoint is at position 950 -When calculating projection lag -Then lag should be 50 -And status should be "warning" -``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-007-missing-checkpoint-treated-as-maximum-lag.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-007-missing-checkpoint-treated-as-maximum-lag.sdp.md deleted file mode 100644 index 79a3b4e7..00000000 --- a/specs/unimplemented/architect-scenarios/health-observability/s-007-missing-checkpoint-treated-as-maximum-lag.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.health-observability.missing-checkpoint-treated-as-maximum-lag -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.health-observability ---- -# Missing checkpoint treated as maximum lag - -## Intent - -- outcome: Architect scenario: Missing checkpoint treated as maximum lag - -```gwt -Given Event Store max globalPosition is 1000 -And projection "newProjection" has no checkpoint entry -When calculating projection lag -Then lag should be 1000 -And a warning should be logged "no checkpoint for newProjection" -``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-008-zero-lag-is-healthy.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-008-zero-lag-is-healthy.sdp.md deleted file mode 100644 index 30433839..00000000 --- a/specs/unimplemented/architect-scenarios/health-observability/s-008-zero-lag-is-healthy.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.health-observability.zero-lag-is-healthy -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.health-observability ---- -# Zero lag is healthy - -## Intent - -- outcome: Architect scenario: Zero lag is healthy - -```gwt -Given Event Store max globalPosition is 1000 -And projection "orderSummary" checkpoint is at position 1000 -When calculating projection lag -Then lag should be 0 -And status should be "healthy" -``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-009-metrics-collection-gathers-all-dimensions.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-009-metrics-collection-gathers-all-dimensions.sdp.md deleted file mode 100644 index aa918c52..00000000 --- a/specs/unimplemented/architect-scenarios/health-observability/s-009-metrics-collection-gathers-all-dimensions.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.health-observability.metrics-collection-gathers-all-dimensions -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.health-observability ---- -# Metrics collection gathers all dimensions - -## Intent - -- outcome: Architect scenario: Metrics collection gathers all dimensions - -```gwt -Given the feature fixture is in place -When system metrics are collected -Then response should include projectionLags for all projections -And response should include dlqSizes -And response should include workpoolDepths for all pools -And response should include timestamp -``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-010-metrics-emitted-as-json-for-log-streams.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-010-metrics-emitted-as-json-for-log-streams.sdp.md deleted file mode 100644 index 9482ecb4..00000000 --- a/specs/unimplemented/architect-scenarios/health-observability/s-010-metrics-emitted-as-json-for-log-streams.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.health-observability.metrics-emitted-as-json-for-log-streams -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.health-observability ---- -# Metrics emitted as JSON for Log Streams - -## Intent - -- outcome: Architect scenario: Metrics emitted as JSON for Log Streams - -```gwt -Given the feature fixture is in place -When emitMetrics mutation runs -Then a JSON log entry should be written at REPORT level -And log entry should have type "METRICS" -And log entry should be parseable by Log Streams -``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-011-metrics-collection-handles-empty-state.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-011-metrics-collection-handles-empty-state.sdp.md deleted file mode 100644 index c9f0ea34..00000000 --- a/specs/unimplemented/architect-scenarios/health-observability/s-011-metrics-collection-handles-empty-state.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.health-observability.metrics-collection-handles-empty-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.health-observability ---- -# Metrics collection handles empty state - -## Intent - -- outcome: Architect scenario: Metrics collection handles empty state - -```gwt -Given no events have been processed -And no dead letters exist -When system metrics are collected -Then projectionLags should be empty object or zeros -And dlqSizes should be empty object or zeros -And collection should not fail -``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-012-all-components-healthy-yields-healthy-system.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-012-all-components-healthy-yields-healthy-system.sdp.md deleted file mode 100644 index 69a173f4..00000000 --- a/specs/unimplemented/architect-scenarios/health-observability/s-012-all-components-healthy-yields-healthy-system.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:platform.health-observability.all-components-healthy-yields-healthy-system -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.health-observability ---- -# All components healthy yields healthy system - -## Intent - -- outcome: Executable scenario: All components healthy yields healthy system - -```gwt -Given the following deliverables: -And Event Store responds successfully -And all projections have lag < 100 -And all Workpool depths are below threshold -And DLQ has < 10 pending items -When system health is aggregated -Then system status should be "healthy" -And summary.healthy should be 4 -And summary.unhealthy should be 0 -``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-013-single-unhealthy-component-makes-system-unhealthy.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-013-single-unhealthy-component-makes-system-unhealthy.sdp.md deleted file mode 100644 index 32f26f41..00000000 --- a/specs/unimplemented/architect-scenarios/health-observability/s-013-single-unhealthy-component-makes-system-unhealthy.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.health-observability.single-unhealthy-component-makes-system-unhealthy -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.health-observability ---- -# Single unhealthy component makes system unhealthy - -## Intent - -- outcome: Executable scenario: Single unhealthy component makes system unhealthy - -```gwt -Given the following deliverables: -And Event Store responds successfully -And projection "orderSummary" has lag of 5000 (critical) -And Workpool depths are normal -When system health is aggregated -Then system status should be "unhealthy" -And components should identify "projections" as unhealthy -``` diff --git a/specs/unimplemented/architect-scenarios/health-observability/s-014-degraded-component-yields-degraded-system.sdp.md b/specs/unimplemented/architect-scenarios/health-observability/s-014-degraded-component-yields-degraded-system.sdp.md deleted file mode 100644 index 68cf4561..00000000 --- a/specs/unimplemented/architect-scenarios/health-observability/s-014-degraded-component-yields-degraded-system.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.health-observability.degraded-component-yields-degraded-system -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.health-observability ---- -# Degraded component yields degraded system - -## Intent - -- outcome: Executable scenario: Degraded component yields degraded system - -```gwt -Given the following deliverables: -And Event Store responds successfully -And projection "orderSummary" has lag of 150 (warning) -And all other components are healthy -When system health is aggregated -Then system status should be "degraded" -And components should identify "projections" as degraded -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-001-context-map-shows-bc-topology.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-001-context-map-shows-bc-topology.sdp.md deleted file mode 100644 index dd21a624..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-001-context-map-shows-bc-topology.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.integration-patterns-21a.context-map-shows-bc-topology -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21a ---- -# Context Map shows BC topology - -## Intent - -- outcome: Executable scenario: Context Map shows BC topology - -```gwt -Given the following deliverables: -And the platform Context Map -When viewing relationships -Then ProducerContext → ConsumerContext should be "upstream-downstream" -And ExternalSystem → IntegrationContext should be "anti-corruption-layer" -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-002-register-partnership-relationship.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-002-register-partnership-relationship.sdp.md deleted file mode 100644 index 88b12fab..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-002-register-partnership-relationship.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.integration-patterns-21a.register-partnership-relationship -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21a ---- -# Register Partnership relationship - -## Intent - -- outcome: Executable scenario: Register Partnership relationship - -```gwt -Given the following deliverables: -And BC "ProducerContext" and BC "ConsumerContext" collaborate on shared model -When I register the relationship as "partnership" -Then Context Map shows bidirectional partnership -And both BCs are listed as collaborators -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-003-register-shared-kernel-relationship.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-003-register-shared-kernel-relationship.sdp.md deleted file mode 100644 index 98d89ff8..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-003-register-shared-kernel-relationship.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.integration-patterns-21a.register-shared-kernel-relationship -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21a ---- -# Register Shared Kernel relationship - -## Intent - -- outcome: Executable scenario: Register Shared Kernel relationship - -```gwt -Given the following deliverables: -And BC "SharedKernel" provides shared types to "ProducerContext" and "ConsumerContext" -When I register the relationships as "shared-kernel" -Then Context Map shows SharedKernel as shared kernel provider -And dependents include ProducerContext and ConsumerContext -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-004-register-open-host-service-relationship.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-004-register-open-host-service-relationship.sdp.md deleted file mode 100644 index 7e65e277..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-004-register-open-host-service-relationship.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.integration-patterns-21a.register-open-host-service-relationship -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21a ---- -# Register Open Host Service relationship - -## Intent - -- outcome: Executable scenario: Register Open Host Service relationship - -```gwt -Given the following deliverables: -And BC "ProducerContext" exposes public API for external consumers -When I register the relationship as "open-host-service" -Then Context Map shows ProducerContext as OHS provider -And external consumers are listed -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-005-duplicate-relationship-is-rejected.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-005-duplicate-relationship-is-rejected.sdp.md deleted file mode 100644 index 584e8f4c..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-005-duplicate-relationship-is-rejected.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.integration-patterns-21a.duplicate-relationship-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21a ---- -# Duplicate relationship is rejected - -## Intent - -- outcome: Executable scenario: Duplicate relationship is rejected - -```gwt -Given the following deliverables: -And relationship "ProducerContext → ConsumerContext" already exists -When I attempt to register "ProducerContext → ConsumerContext" again -Then an error is thrown with code "DUPLICATE_RELATIONSHIP" -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-006-self-referential-relationship-is-rejected.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-006-self-referential-relationship-is-rejected.sdp.md deleted file mode 100644 index 32280746..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-006-self-referential-relationship-is-rejected.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.integration-patterns-21a.self-referential-relationship-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21a ---- -# Self-referential relationship is rejected - -## Intent - -- outcome: Executable scenario: Self-referential relationship is rejected - -```gwt -Given the following deliverables: -And the platform Context Map -When I attempt to register "ProducerContext → ProducerContext" -Then an error is thrown with code "SELF_REFERENCE" -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-007-integration-event-uses-published-language.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-007-integration-event-uses-published-language.sdp.md deleted file mode 100644 index f31f9ab9..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-007-integration-event-uses-published-language.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.integration-patterns-21a.integration-event-uses-published-language -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21a ---- -# Integration event uses Published Language - -## Intent - -- outcome: Executable scenario: Integration event uses Published Language - -```gwt -Given the following deliverables: -And an EntityCreated domain event -When converting for integration -Then toPublishedLanguage() should be called -And result should have schemaVersion field -And schema should be from publishedLanguage registry -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-008-event-tagging-for-routing-and-dcb.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-008-event-tagging-for-routing-and-dcb.sdp.md deleted file mode 100644 index e3dcc317..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-008-event-tagging-for-routing-and-dcb.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.integration-patterns-21a.event-tagging-for-routing-and-dcb -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21a ---- -# Event tagging for routing and DCB - -## Intent - -- outcome: Executable scenario: Event tagging for routing and DCB - -```gwt -Given the following deliverables: -And a registered schema for "EntityCreated" v1.0.0 -And a domain event with principalId "principal_456" -When I call toPublishedLanguage with tags { principalId: "principal_456" } -Then result.metadata.tags contains principalId -And tags can be used for DCB consistency queries -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-009-schema-compatibility-mode-is-enforced.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-009-schema-compatibility-mode-is-enforced.sdp.md deleted file mode 100644 index 58bdc4aa..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-009-schema-compatibility-mode-is-enforced.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.integration-patterns-21a.schema-compatibility-mode-is-enforced -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21a ---- -# Schema compatibility mode is enforced - -## Intent - -- outcome: Executable scenario: Schema compatibility mode is enforced - -```gwt -Given the following deliverables: -And "EntityCreated" v1.0.0 with compatibility "backward" -When I register "EntityCreated" v2.0.0 with compatibility "full" -Then v2.0.0 must support both forward and backward compatibility -And consumers on v1.0.0 can still process v2.0.0 events -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-010-register-schema-with-compatibility-mode.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-010-register-schema-with-compatibility-mode.sdp.md deleted file mode 100644 index 9136fd57..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-010-register-schema-with-compatibility-mode.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.integration-patterns-21a.register-schema-with-compatibility-mode -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21a ---- -# Register schema with compatibility mode - -## Intent - -- outcome: Executable scenario: Register schema with compatibility mode - -```gwt -Given the following deliverables: -And a new integration event type "ResourceAllocated" -When I call registerIntegrationSchema with version "1.0.0" and compatibility "backward" -Then the schema is available in the registry -And compatibility mode is stored with the schema -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-011-unregistered-event-type-fails-conversion.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-011-unregistered-event-type-fails-conversion.sdp.md deleted file mode 100644 index a9fe7f1e..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-011-unregistered-event-type-fails-conversion.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.integration-patterns-21a.unregistered-event-type-fails-conversion -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21a ---- -# Unregistered event type fails conversion - -## Intent - -- outcome: Executable scenario: Unregistered event type fails conversion - -```gwt -Given the following deliverables: -And no schema registered for "UnknownEvent" -When I call toPublishedLanguage('UnknownEvent', payload) -Then an error is thrown with code "SCHEMA_NOT_FOUND" -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-012-invalid-payload-fails-schema-validation.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-012-invalid-payload-fails-schema-validation.sdp.md deleted file mode 100644 index 7020d8f3..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-012-invalid-payload-fails-schema-validation.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.integration-patterns-21a.invalid-payload-fails-schema-validation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21a ---- -# Invalid payload fails schema validation - -## Intent - -- outcome: Executable scenario: Invalid payload fails schema validation - -```gwt -Given the following deliverables: -And a registered schema requiring "entityId" field -When I call toPublishedLanguage('EntityCreated', {}) -Then an error is thrown with code "SCHEMA_VALIDATION_FAILED" -And error details mention missing "entityId" -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-013-acl-translates-external-system-response.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-013-acl-translates-external-system-response.sdp.md deleted file mode 100644 index 3618c81f..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-013-acl-translates-external-system-response.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.integration-patterns-21a.acl-translates-external-system-response -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21a ---- -# ACL translates external system response - -## Intent - -- outcome: Architect scenario: ACL translates external system response - -```gwt -Given an external system response with { ext_ref, amount, unit } -When ACL processes the response -Then domain model should have { referenceId, value: { amount, unit } } -And external model details should not leak to domain -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-014-acl-handles-bidirectional-translation.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-014-acl-handles-bidirectional-translation.sdp.md deleted file mode 100644 index 3beaa74f..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-014-acl-handles-bidirectional-translation.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.integration-patterns-21a.acl-handles-bidirectional-translation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21a ---- -# ACL handles bidirectional translation - -## Intent - -- outcome: Architect scenario: ACL handles bidirectional translation - -```gwt -Given a domain ExternalRequest model -When I call externalACL.toExternal(domainModel) -Then result has external format { ext_ref, amount, unit } -And calling fromExternal() returns equivalent domain model -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-015-acl-validates-external-input.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-015-acl-validates-external-input.sdp.md deleted file mode 100644 index bbd90640..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-015-acl-validates-external-input.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.integration-patterns-21a.acl-validates-external-input -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21a ---- -# ACL validates external input - -## Intent - -- outcome: Architect scenario: ACL validates external input - -```gwt -Given an external response missing required field "ext_ref" -When ACL processes the response -Then an error is thrown with code "INVALID_EXTERNAL_RESPONSE" -And the error identifies the missing field -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-016-acl-rejects-unmapped-values.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-016-acl-rejects-unmapped-values.sdp.md deleted file mode 100644 index 70e01d70..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21a/s-016-acl-rejects-unmapped-values.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.integration-patterns-21a.acl-rejects-unmapped-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21a ---- -# ACL rejects unmapped values - -## Intent - -- outcome: Architect scenario: ACL rejects unmapped values - -```gwt -Given an external response with status: "unknown_external_status" -When ACL processes the response -Then an error is thrown with code "UNMAPPED_VALUE" -And error.field equals "status" -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-001-v1-consumer-receives-v2-event.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-001-v1-consumer-receives-v2-event.sdp.md deleted file mode 100644 index 7385660b..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-001-v1-consumer-receives-v2-event.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.integration-patterns-21b.v1-consumer-receives-v2-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21b ---- -# V1 consumer receives V2 event - -## Intent - -- outcome: Executable scenario: V1 consumer receives V2 event - -```gwt -Given the following deliverables: -And a consumer expecting EntityCreatedV1 -And producer emits EntityCreatedV2 -When event is delivered -Then downcaster should transform to V1 format -And consumer should process successfully -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-002-upcast-historical-events.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-002-upcast-historical-events.sdp.md deleted file mode 100644 index f5a32757..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-002-upcast-historical-events.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.integration-patterns-21b.upcast-historical-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21b ---- -# Upcast historical events - -## Intent - -- outcome: Executable scenario: Upcast historical events - -```gwt -Given the following deliverables: -And historical events stored as V1 -When loading events for V2 consumer -Then all events are upcasted to V2 -And default values are applied for missing fields -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-003-chain-upcasters-for-multi-version-migration.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-003-chain-upcasters-for-multi-version-migration.sdp.md deleted file mode 100644 index 8259b1a0..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-003-chain-upcasters-for-multi-version-migration.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.integration-patterns-21b.chain-upcasters-for-multi-version-migration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21b ---- -# Chain upcasters for multi-version migration - -## Intent - -- outcome: Executable scenario: Chain upcasters for multi-version migration - -```gwt -Given the following deliverables: -And versions V1, V2, V3 with upcasters V1→V2 and V2→V3 -When I upcast a V1 event to V3 -Then both upcasters are applied in sequence -And final result is valid V3 -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-004-upcast-adds-computed-field.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-004-upcast-adds-computed-field.sdp.md deleted file mode 100644 index bb294327..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-004-upcast-adds-computed-field.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.integration-patterns-21b.upcast-adds-computed-field -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21b ---- -# Upcast adds computed field - -## Intent - -- outcome: Executable scenario: Upcast adds computed field - -```gwt -Given the following deliverables: -And V1 has { entries } array -And V2 adds computed { entryCount } -When upcasting V1 to V2 -Then entryCount equals entries.length -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-005-incompatible-schema-change-is-rejected.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-005-incompatible-schema-change-is-rejected.sdp.md deleted file mode 100644 index ffc2dac7..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-005-incompatible-schema-change-is-rejected.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.integration-patterns-21b.incompatible-schema-change-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21b ---- -# Incompatible schema change is rejected - -## Intent - -- outcome: Executable scenario: Incompatible schema change is rejected - -```gwt -Given the following deliverables: -And a V3 schema with breaking changes -And no migration path from V2 -When attempting to register V3 -Then registration fails with code "NO_MIGRATION_PATH" -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-006-breaking-change-without-migration.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-006-breaking-change-without-migration.sdp.md deleted file mode 100644 index 979858ff..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-006-breaking-change-without-migration.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.integration-patterns-21b.breaking-change-without-migration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21b ---- -# Breaking change without migration - -## Intent - -- outcome: Executable scenario: Breaking change without migration - -```gwt -Given the following deliverables: -And V2 removes required V1 field "entityId" -When attempting to register V2 as backwardCompatible with V1 -Then an error is thrown with code "BREAKING_CHANGE" -And error suggests registering migration function -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-007-contract-test-validates-schema-compatibility.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-007-contract-test-validates-schema-compatibility.sdp.md deleted file mode 100644 index 911a452f..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-007-contract-test-validates-schema-compatibility.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.integration-patterns-21b.contract-test-validates-schema-compatibility -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21b ---- -# Contract test validates schema compatibility - -## Intent - -- outcome: Executable scenario: Contract test validates schema compatibility - -```gwt -Given the following deliverables: -And EntityCreatedV1 contract -When running contract tests -Then producer should emit valid V1 events -And consumer should accept valid V1 events -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-008-contract-sample-generation.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-008-contract-sample-generation.sdp.md deleted file mode 100644 index c26c95fc..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-008-contract-sample-generation.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.integration-patterns-21b.contract-sample-generation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21b ---- -# Contract sample generation - -## Intent - -- outcome: Executable scenario: Contract sample generation - -```gwt -Given the following deliverables: -And a registered schema "EntityCreatedV1" -When I call createContractSample('EntityCreatedV1') -Then a valid sample event is generated -And it passes schema validation -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-009-generate-multiple-unique-samples.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-009-generate-multiple-unique-samples.sdp.md deleted file mode 100644 index 9f39eb5a..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-009-generate-multiple-unique-samples.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.integration-patterns-21b.generate-multiple-unique-samples -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21b ---- -# Generate multiple unique samples - -## Intent - -- outcome: Executable scenario: Generate multiple unique samples - -```gwt -Given the following deliverables: -And a registered schema "EntityCreatedV1" -When I call createContractSamples('EntityCreatedV1', 10) -Then I receive 10 unique sample events -And all pass schema validation -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-010-producer-contract-test-utility.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-010-producer-contract-test-utility.sdp.md deleted file mode 100644 index 22d82b81..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-010-producer-contract-test-utility.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.integration-patterns-21b.producer-contract-test-utility -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21b ---- -# Producer contract test utility - -## Intent - -- outcome: Executable scenario: Producer contract test utility - -```gwt -Given the following deliverables: -And a producer function that creates EntityCreated events -When I run createProducerContractTest('EntityCreatedV1', producer) -Then test passes when producer emits valid V1 events -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-011-consumer-contract-test-utility.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-011-consumer-contract-test-utility.sdp.md deleted file mode 100644 index c8b427ab..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-011-consumer-contract-test-utility.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.integration-patterns-21b.consumer-contract-test-utility -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21b ---- -# Consumer contract test utility - -## Intent - -- outcome: Executable scenario: Consumer contract test utility - -```gwt -Given the following deliverables: -And a consumer handler for EntityCreated -When I run createConsumerContractTest('EntityCreatedV1', consumer) -Then test passes when consumer processes sample events -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-012-compatible-producer-and-consumer-verified.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-012-compatible-producer-and-consumer-verified.sdp.md deleted file mode 100644 index 4f7d8f47..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-012-compatible-producer-and-consumer-verified.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.integration-patterns-21b.compatible-producer-and-consumer-verified -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21b ---- -# Compatible producer and consumer verified - -## Intent - -- outcome: Executable scenario: Compatible producer and consumer verified - -```gwt -Given the following deliverables: -And producer emitting EntityCreatedV1 -And consumer expecting EntityCreatedV1 -When I run verifyContractCompatibility(producer, consumer, 'EntityCreatedV1') -Then verification passes -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-013-compatible-with-downcaster.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-013-compatible-with-downcaster.sdp.md deleted file mode 100644 index ad025dcb..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-013-compatible-with-downcaster.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.integration-patterns-21b.compatible-with-downcaster -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21b ---- -# Compatible with downcaster - -## Intent - -- outcome: Executable scenario: Compatible with downcaster - -```gwt -Given the following deliverables: -And producer emitting EntityCreatedV2 -And consumer expecting EntityCreatedV1 -And downcaster V2 → V1 is registered -When I run verifyContractCompatibility(producer, consumer) -Then verification passes -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-014-detect-producer-consumer-mismatch.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-014-detect-producer-consumer-mismatch.sdp.md deleted file mode 100644 index d4562251..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-014-detect-producer-consumer-mismatch.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.integration-patterns-21b.detect-producer-consumer-mismatch -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21b ---- -# Detect producer-consumer mismatch - -## Intent - -- outcome: Executable scenario: Detect producer-consumer mismatch - -```gwt -Given the following deliverables: -And producer emitting EntityCreatedV2 -And consumer expecting EntityCreatedV1 -And no downcaster registered -When running contract tests -Then test fails with "SCHEMA_MISMATCH" -And suggested fix mentions "register downcaster" -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-015-contract-violation-is-recorded.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-015-contract-violation-is-recorded.sdp.md deleted file mode 100644 index 8af6a387..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-015-contract-violation-is-recorded.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.integration-patterns-21b.contract-violation-is-recorded -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21b ---- -# Contract violation is recorded - -## Intent - -- outcome: Executable scenario: Contract violation is recorded - -```gwt -Given the following deliverables: -And a schema mismatch detected at runtime -When violation detection processes the mismatch -Then a ContractViolation is created -And it includes eventType, versions, and timestamp -And it is passed to ContractMetrics.recordViolation() -``` diff --git a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-016-contract-violations-are-queryable.sdp.md b/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-016-contract-violations-are-queryable.sdp.md deleted file mode 100644 index f71d26af..00000000 --- a/specs/unimplemented/architect-scenarios/integration-patterns-21b/s-016-contract-violations-are-queryable.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.integration-patterns-21b.contract-violations-are-queryable -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.integration-patterns-21b ---- -# Contract violations are queryable - -## Intent - -- outcome: Executable scenario: Contract violations are queryable - -```gwt -Given the following deliverables: -And multiple contract violations have been recorded -When I call contractMetrics.getViolations(since: oneHourAgo) -Then I receive violations from the last hour -And they are sorted by timestamp descending -``` diff --git a/specs/unimplemented/architect-scenarios/package-architecture/s-001-platform-fsm-has-no-dependencies.sdp.md b/specs/unimplemented/architect-scenarios/package-architecture/s-001-platform-fsm-has-no-dependencies.sdp.md deleted file mode 100644 index a3ffa1f6..00000000 --- a/specs/unimplemented/architect-scenarios/package-architecture/s-001-platform-fsm-has-no-dependencies.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.package-architecture.platform-fsm-has-no-dependencies -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.package-architecture ---- -# platform-fsm has no dependencies - -## Intent - -- outcome: Executable scenario: platform-fsm has no dependencies - -```gwt -Given the following deliverables: -And the @libar-dev/platform-fsm package -When checking its dependencies -Then it should have zero @libar-dev dependencies -And it should have zero convex dependencies -And it should be usable in pure Node.js/browser environments -``` diff --git a/specs/unimplemented/architect-scenarios/package-architecture/s-002-platform-decider-depends-only-on-platform-fsm.sdp.md b/specs/unimplemented/architect-scenarios/package-architecture/s-002-platform-decider-depends-only-on-platform-fsm.sdp.md deleted file mode 100644 index c471c61c..00000000 --- a/specs/unimplemented/architect-scenarios/package-architecture/s-002-platform-decider-depends-only-on-platform-fsm.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.package-architecture.platform-decider-depends-only-on-platform-fsm -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.package-architecture ---- -# platform-decider depends only on platform-fsm - -## Intent - -- outcome: Executable scenario: platform-decider depends only on platform-fsm - -```gwt -Given the following deliverables: -And the @libar-dev/platform-decider package -When checking its dependencies -Then it should only depend on @libar-dev/platform-fsm -And it should have zero convex dependencies -``` diff --git a/specs/unimplemented/architect-scenarios/package-architecture/s-003-decider-package-is-independently-usable.sdp.md b/specs/unimplemented/architect-scenarios/package-architecture/s-003-decider-package-is-independently-usable.sdp.md deleted file mode 100644 index 5e298bdc..00000000 --- a/specs/unimplemented/architect-scenarios/package-architecture/s-003-decider-package-is-independently-usable.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.package-architecture.decider-package-is-independently-usable -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.package-architecture ---- -# Decider package is independently usable - -## Intent - -- outcome: Executable scenario: Decider package is independently usable - -```gwt -Given the following deliverables: -And a consumer wants to use only the decider pattern -When they install @libar-dev/platform-decider -Then they get decider types and factory functions -And they do NOT get event-store, command-bus, or orchestration code -And bundle size is minimal -``` diff --git a/specs/unimplemented/architect-scenarios/package-architecture/s-004-packages-are-independently-publishable.sdp.md b/specs/unimplemented/architect-scenarios/package-architecture/s-004-packages-are-independently-publishable.sdp.md deleted file mode 100644 index fda5e73a..00000000 --- a/specs/unimplemented/architect-scenarios/package-architecture/s-004-packages-are-independently-publishable.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.package-architecture.packages-are-independently-publishable -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.package-architecture ---- -# Packages are independently publishable - -## Intent - -- outcome: Executable scenario: Packages are independently publishable - -```gwt -Given the following deliverables: -And all @libar-dev/platform-* packages -When publishing to NPM -Then each package can be versioned independently -And consumers can install individual packages -``` diff --git a/specs/unimplemented/architect-scenarios/package-architecture/s-005-framework-tests-live-in-framework-packages.sdp.md b/specs/unimplemented/architect-scenarios/package-architecture/s-005-framework-tests-live-in-framework-packages.sdp.md deleted file mode 100644 index fc8bab9d..00000000 --- a/specs/unimplemented/architect-scenarios/package-architecture/s-005-framework-tests-live-in-framework-packages.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.package-architecture.framework-tests-live-in-framework-packages -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.package-architecture ---- -# Framework tests live in framework packages - -## Intent - -- outcome: Executable scenario: Framework tests live in framework packages - -```gwt -Given the following deliverables: -And the @libar-dev/platform-decider package -When checking the package contents -Then tests/features/behavior/ contains BDD feature files -And tests/steps/ contains step definitions -And consumers can run tests to validate their environment -``` diff --git a/specs/unimplemented/architect-scenarios/package-architecture/s-006-existing-imports-continue-to-work.sdp.md b/specs/unimplemented/architect-scenarios/package-architecture/s-006-existing-imports-continue-to-work.sdp.md deleted file mode 100644 index 50b4a7c3..00000000 --- a/specs/unimplemented/architect-scenarios/package-architecture/s-006-existing-imports-continue-to-work.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.package-architecture.existing-imports-continue-to-work -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.package-architecture ---- -# Existing imports continue to work - -## Intent - -- outcome: Executable scenario: Existing imports continue to work - -```gwt -Given the following deliverables: -And existing code importing from @libar-dev/platform-core -When platform-core re-exports from platform-fsm and platform-decider -Then existing imports continue to work -And no code changes required for consumers -``` diff --git a/specs/unimplemented/architect-scenarios/package-architecture/s-007-platform-namespace-avoids-conflicts.sdp.md b/specs/unimplemented/architect-scenarios/package-architecture/s-007-platform-namespace-avoids-conflicts.sdp.md deleted file mode 100644 index c3e75ad3..00000000 --- a/specs/unimplemented/architect-scenarios/package-architecture/s-007-platform-namespace-avoids-conflicts.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.package-architecture.platform-namespace-avoids-conflicts -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.package-architecture ---- -# Platform namespace avoids conflicts - -## Intent - -- outcome: Executable scenario: Platform namespace avoids conflicts - -```gwt -Given the following deliverables: -And the @libar-dev namespace -When the scenario runs -Then @libar-dev/platform-* does not conflict with @libar-dev/core -And @libar-dev/platform-* does not conflict with @libar-dev/convex-* -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-001-pd-rs-appear-in-generated-decisions-md.sdp.md b/specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-001-pd-rs-appear-in-generated-decisions-md.sdp.md deleted file mode 100644 index e06a2aab..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-001-pd-rs-appear-in-generated-decisions-md.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-001-process-decisions-folder.pd-rs-appear-in-generated-decisions-md -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-001-process-decisions-folder ---- -# PDRs appear in generated DECISIONS.md - -## Intent - -- outcome: Executable scenario: PDRs appear in generated DECISIONS.md - -```gwt -Given the following deliverables: -And a Gherkin feature file with @architect-adr:001 tag -And the file is in libar-platform/architect/decisions/ -When running pnpm docs:pdrs -Then the decision appears in docs-living/DECISIONS.md -And the header shows "Process Decision Records" (not "Architecture Decision Records") -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-002-pdr-numbering-is-independent-from-package-ad-rs.sdp.md b/specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-002-pdr-numbering-is-independent-from-package-ad-rs.sdp.md deleted file mode 100644 index 0c90b60b..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-001-process-decisions-folder/s-002-pdr-numbering-is-independent-from-package-ad-rs.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-001-process-decisions-folder.pdr-numbering-is-independent-from-package-ad-rs -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-001-process-decisions-folder ---- -# PDR numbering is independent from package ADRs - -## Intent - -- outcome: Executable scenario: PDR numbering is independent from package ADRs - -```gwt -Given the following deliverables: -And package-level ADRs numbered ADR-001 through ADR-004 -And repo-level PDRs numbered PDR-001 through PDR-003 -When the scenario runs -Then there is no conflict in numbering -And each scope maintains its own sequence -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-001-minimal-release-file-structure.sdp.md b/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-001-minimal-release-file-structure.sdp.md deleted file mode 100644 index c4af3e57..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-001-minimal-release-file-structure.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-002-release-management-architecture.minimal-release-file-structure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-002-release-management-architecture ---- -# Minimal release file structure - -## Intent - -- outcome: Executable scenario: Minimal release file structure - -```gwt -Given the following deliverables: -And a release definition file -When checking its contents -Then it contains version, status, and highlights -And it does NOT contain deliverable DataTables -And deliverables are discovered by scanning -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-002-pdr-tagged-with-release-version.sdp.md b/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-002-pdr-tagged-with-release-version.sdp.md deleted file mode 100644 index 33c5bffb..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-002-pdr-tagged-with-release-version.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-002-release-management-architecture.pdr-tagged-with-release-version -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-002-release-management-architecture ---- -# PDR tagged with release version - -## Intent - -- outcome: Executable scenario: PDR tagged with release version - -```gwt -Given the following deliverables: -And a Process Decision Record feature file -When it includes "@architect-release:v0.1.0" -Then the scanner extracts the release field -And the changelog generator groups it under v0.1.0 -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-003-changelog-generation-from-scattered-tags.sdp.md b/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-003-changelog-generation-from-scattered-tags.sdp.md deleted file mode 100644 index 834120bc..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-002-release-management-architecture/s-003-changelog-generation-from-scattered-tags.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-002-release-management-architecture.changelog-generation-from-scattered-tags -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-002-release-management-architecture ---- -# Changelog generation from scattered tags - -## Intent - -- outcome: Executable scenario: Changelog generation from scattered tags - -```gwt -Given the following deliverables: -And multiple files tagged with "@architect-release:v0.1.0" -When running the changelog generator -Then all tagged deliverables appear under "## v0.1.0" -And the release file highlights appear as header -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-001-specs-and-type-script-phase-files-are-separate.sdp.md b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-001-specs-and-type-script-phase-files-are-separate.sdp.md deleted file mode 100644 index aa23991c..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-001-specs-and-type-script-phase-files-are-separate.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:decisions.pdr-003-behavior-feature-file-structure.specs-and-type-script-phase-files-are-separate -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-003-behavior-feature-file-structure ---- -# Specs and TypeScript phase files are separate - -## Intent - -- outcome: Executable scenario: Specs and TypeScript phase files are separate - -```gwt -Given the following deliverables: -And the libar-platform/architect/ directory structure -When the scenario runs -Then specs/ contains only pure requirement feature files -And src/phases/ contains TypeScript files with release annotations -And specs have NO libar-process-* tags -And TypeScript files reference specs by pattern name -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-002-spec-files-use-semantic-tags-only.sdp.md b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-002-spec-files-use-semantic-tags-only.sdp.md deleted file mode 100644 index 969fa4a9..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-002-spec-files-use-semantic-tags-only.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:decisions.pdr-003-behavior-feature-file-structure.spec-files-use-semantic-tags-only -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-003-behavior-feature-file-structure ---- -# Spec files use semantic tags only - -## Intent - -- outcome: Executable scenario: Spec files use semantic tags only - -```gwt -Given the following deliverables: -And a feature file in libar-platform/architect/specs/ -When the scenario runs -Then the file should have semantic tags (acceptance-criteria, opportunity-N, etc.) -And the file should have Background with deliverables DataTable -And the DataTable should NOT include Release column -And the file should NOT have libar-process-* tags -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-003-type-script-phase-files-centralize-release-information.sdp.md b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-003-type-script-phase-files-centralize-release-information.sdp.md deleted file mode 100644 index 3741f705..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-003-type-script-phase-files-centralize-release-information.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:decisions.pdr-003-behavior-feature-file-structure.type-script-phase-files-centralize-release-information -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-003-behavior-feature-file-structure ---- -# TypeScript phase files centralize release information - -## Intent - -- outcome: Executable scenario: TypeScript phase files centralize release information - -```gwt -Given the following deliverables: -And a TypeScript file in libar-platform/architect/src/phases/vX.Y.Z/ -When the scenario runs -Then the file should have @architect-pattern annotation -And the file should have @architect-phase annotation -And the file should have @architect-status annotation -And the file should reference the spec via comment or matching @architect-pattern metadata -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-004-specs-can-evolve-independently-of-phases.sdp.md b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-004-specs-can-evolve-independently-of-phases.sdp.md deleted file mode 100644 index 3fe25714..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-004-specs-can-evolve-independently-of-phases.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-003-behavior-feature-file-structure.specs-can-evolve-independently-of-phases -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-003-behavior-feature-file-structure ---- -# Specs can evolve independently of phases - -## Intent - -- outcome: Executable scenario: Specs can evolve independently of phases - -```gwt -Given the following deliverables: -And a spec file in libar-platform/architect/specs/ -When the spec is refined, split, or combined -Then only the TypeScript phase file needs updating -And no phase/release metadata exists in the spec to update -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-005-no-release-references-in-spec-data-tables.sdp.md b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-005-no-release-references-in-spec-data-tables.sdp.md deleted file mode 100644 index 17f16697..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-005-no-release-references-in-spec-data-tables.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-003-behavior-feature-file-structure.no-release-references-in-spec-data-tables -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-003-behavior-feature-file-structure ---- -# No release references in spec DataTables - -## Intent - -- outcome: Executable scenario: No release references in spec DataTables - -```gwt -Given the following deliverables: -And a spec feature file with a DataTable -When the DataTable includes a Release column -Then this violates PDR-003 conventions -And the Release column must be removed -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-006-type-script-phase-files-support-process-metadata.sdp.md b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-006-type-script-phase-files-support-process-metadata.sdp.md deleted file mode 100644 index 28cbb209..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-006-type-script-phase-files-support-process-metadata.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:decisions.pdr-003-behavior-feature-file-structure.type-script-phase-files-support-process-metadata -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-003-behavior-feature-file-structure ---- -# TypeScript phase files support process metadata - -## Intent - -- outcome: Executable scenario: TypeScript phase files support process metadata - -```gwt -Given the following deliverables: -And a TypeScript file in libar-platform/architect/src/phases/ -When the scenario runs -Then the file may include @architect-effort for planned effort -And the file may include @architect-effort-actual for variance tracking -And the file may include @architect-workflow for time distribution analysis -And the file may include @architect-priority for backlog ordering -And the file may include @architect-risk for progressive governance -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-007-type-script-phase-files-support-dependency-tracking.sdp.md b/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-007-type-script-phase-files-support-dependency-tracking.sdp.md deleted file mode 100644 index faee933d..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-003-behavior-feature-file-structure/s-007-type-script-phase-files-support-dependency-tracking.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-003-behavior-feature-file-structure.type-script-phase-files-support-dependency-tracking -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-003-behavior-feature-file-structure ---- -# TypeScript phase files support dependency tracking - -## Intent - -- outcome: Executable scenario: TypeScript phase files support dependency tracking - -```gwt -Given the following deliverables: -And a TypeScript file in libar-platform/architect/src/phases/ -When the scenario runs -Then the file may include @architect-depends-on for dependencies -And the file may include @architect-enables for downstream patterns -And dependency information enables critical path analysis -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-001-all-metadata-uses-architect-prefix.sdp.md b/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-001-all-metadata-uses-architect-prefix.sdp.md deleted file mode 100644 index 099d09d0..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-001-all-metadata-uses-architect-prefix.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-004-unified-tag-prefix-architecture.all-metadata-uses-architect-prefix -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-004-unified-tag-prefix-architecture ---- -# All metadata uses @architect-* prefix - -## Intent - -- outcome: Executable scenario: All metadata uses @architect-* prefix - -```gwt -Given the unified tag prefix "@architect-*" is established -And any documentation or process metadata tag -When applying the tag to source code or feature files -Then the tag must use @architect- prefix -And the file must begin with bare @architect opt-in tag -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-002-bdd-tags-remain-unprefixed.sdp.md b/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-002-bdd-tags-remain-unprefixed.sdp.md deleted file mode 100644 index f7cba121..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-002-bdd-tags-remain-unprefixed.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-004-unified-tag-prefix-architecture.bdd-tags-remain-unprefixed -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-004-unified-tag-prefix-architecture ---- -# BDD tags remain unprefixed - -## Intent - -- outcome: Executable scenario: BDD tags remain unprefixed - -```gwt -Given the unified tag prefix "@architect-*" is established -And a Gherkin scenario with tag "acceptance-criteria" -When the feature file is scanned -Then the tag is recognized as BDD category tag -And it is NOT prefixed with @architect- -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-003-scanner-accepts-deprecated-prefix-during-migration.sdp.md b/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-003-scanner-accepts-deprecated-prefix-during-migration.sdp.md deleted file mode 100644 index 026e88da..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-004-unified-tag-prefix-architecture/s-003-scanner-accepts-deprecated-prefix-during-migration.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-004-unified-tag-prefix-architecture.scanner-accepts-deprecated-prefix-during-migration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-004-unified-tag-prefix-architecture ---- -# Scanner accepts deprecated prefix during migration - -## Intent - -- outcome: Executable scenario: Scanner accepts deprecated prefix during migration - -```gwt -Given the unified tag prefix "@architect-*" is established -And a feature file with "libar-process-phase:42" -When the scanner parses the file -Then it extracts phase number 42 -And logs deprecation warning suggesting "@architect-phase:42" -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-001-compiler-enforces-taxonomy-values.sdp.md b/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-001-compiler-enforces-taxonomy-values.sdp.md deleted file mode 100644 index 12e67416..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-001-compiler-enforces-taxonomy-values.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:decisions.pdr-006-typescript-sourced-taxonomy.compiler-enforces-taxonomy-values -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-006-typescript-sourced-taxonomy ---- -# Compiler enforces taxonomy values - -## Intent - -- outcome: Executable scenario: Compiler enforces taxonomy values - -```gwt -Given the taxonomy is defined in TypeScript files -When I reference a status value in code -Then the compiler enforces it matches defined values -And IDE provides autocomplete for valid options -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-002-zod-schemas-derive-from-type-script-constants.sdp.md b/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-002-zod-schemas-derive-from-type-script-constants.sdp.md deleted file mode 100644 index 4299920a..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-002-zod-schemas-derive-from-type-script-constants.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:decisions.pdr-006-typescript-sourced-taxonomy.zod-schemas-derive-from-type-script-constants -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-006-typescript-sourced-taxonomy ---- -# Zod schemas derive from TypeScript constants - -## Intent - -- outcome: Executable scenario: Zod schemas derive from TypeScript constants - -```gwt -Given the TypeScript constant "PROCESS_STATUS_VALUES" -When the Zod schema is defined -Then it uses z.enum(PROCESS_STATUS_VALUES) not z.array(z.string()) -And invalid values are rejected at both compile and runtime -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-003-registry-builder-creates-valid-tag-registry.sdp.md b/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-003-registry-builder-creates-valid-tag-registry.sdp.md deleted file mode 100644 index 7f327a8c..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-003-registry-builder-creates-valid-tag-registry.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:decisions.pdr-006-typescript-sourced-taxonomy.registry-builder-creates-valid-tag-registry -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-006-typescript-sourced-taxonomy ---- -# Registry builder creates valid TagRegistry - -## Intent - -- outcome: Executable scenario: Registry builder creates valid TagRegistry - -```gwt -Given the TypeScript taxonomy definitions -When buildDefaultRegistry() is called -Then a TagRegistry object is returned -And the registry matches the TypeScript definitions exactly -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-004-type-inference-from-constants.sdp.md b/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-004-type-inference-from-constants.sdp.md deleted file mode 100644 index cf75d0d4..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-006-typescript-sourced-taxonomy/s-004-type-inference-from-constants.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:decisions.pdr-006-typescript-sourced-taxonomy.type-inference-from-constants -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-006-typescript-sourced-taxonomy ---- -# Type inference from constants - -## Intent - -- outcome: Executable scenario: Type inference from constants - -```gwt -Given the constant "PROCESS_STATUS_VALUES = ['roadmap', 'active', 'completed', 'deferred'] as const" -When ProcessStatusValue type is defined -Then it infers to "roadmap" "active" "completed" "deferred" -And no type duplication is required -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-001-roadmap-spec-structure.sdp.md b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-001-roadmap-spec-structure.sdp.md deleted file mode 100644 index 053a6381..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-001-roadmap-spec-structure.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:decisions.pdr-007-two-tier-spec-architecture.roadmap-spec-structure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-007-two-tier-spec-architecture ---- -# Roadmap spec structure - -## Intent - -- outcome: Executable scenario: Roadmap spec structure - -```gwt -Given the following deliverables: -And a pattern requiring implementation -When creating the roadmap spec -Then it should be in libar-platform/architect/specs/{product-area}/ -And it should have @architect-pattern tag -And it should have Background with deliverables table -And it should have high-level Rule blocks (not granular scenarios) -And it should NOT have step definitions -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-002-package-spec-structure.sdp.md b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-002-package-spec-structure.sdp.md deleted file mode 100644 index 36936431..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-002-package-spec-structure.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:decisions.pdr-007-two-tier-spec-architecture.package-spec-structure -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-007-two-tier-spec-architecture ---- -# Package spec structure - -## Intent - -- outcome: Executable scenario: Package spec structure - -```gwt -Given the following deliverables: -And implemented functionality in a package -When creating executable specs -Then they should be in libar-platform/packages/{package}/tests/features/behavior/ -And they should have @architect-pattern tag linking to roadmap -And they should have step definitions -And they should cover edge cases and error scenarios -And they should run via vitest-cucumber -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-003-linking-roadmap-to-package-specs.sdp.md b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-003-linking-roadmap-to-package-specs.sdp.md deleted file mode 100644 index 019384eb..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-003-linking-roadmap-to-package-specs.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:decisions.pdr-007-two-tier-spec-architecture.linking-roadmap-to-package-specs -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-007-two-tier-spec-architecture ---- -# Linking roadmap to package specs - -## Intent - -- outcome: Executable scenario: Linking roadmap to package specs - -```gwt -Given the following deliverables: -And a completed roadmap spec "DeciderPattern" -And package specs exist at platform-decider/tests/features/ -When adding traceability -Then roadmap spec should have @architect-executable-specs tag -And deliverables table should include "Executable Spec" column -And package spec should have @architect-roadmap-spec:DeciderPattern -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-004-completed-pattern-roadmap-spec.sdp.md b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-004-completed-pattern-roadmap-spec.sdp.md deleted file mode 100644 index 0675ee70..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-004-completed-pattern-roadmap-spec.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:decisions.pdr-007-two-tier-spec-architecture.completed-pattern-roadmap-spec -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-007-two-tier-spec-architecture ---- -# Completed pattern roadmap spec - -## Intent - -- outcome: Executable scenario: Completed pattern roadmap spec - -```gwt -Given the following deliverables: -And roadmap spec with @architect-status:completed -When the scenario runs -Then detailed scenarios should NOT be in roadmap spec -And high-level Rule descriptions should remain -And deliverables table should have all items "complete" -And @architect-executable-specs should point to package tests -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-005-active-pattern-with-acceptance-criteria.sdp.md b/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-005-active-pattern-with-acceptance-criteria.sdp.md deleted file mode 100644 index 4b460b9a..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-007-two-tier-spec-architecture/s-005-active-pattern-with-acceptance-criteria.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-007-two-tier-spec-architecture.active-pattern-with-acceptance-criteria -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-007-two-tier-spec-architecture ---- -# Active pattern with acceptance criteria - -## Intent - -- outcome: Executable scenario: Active pattern with acceptance criteria - -```gwt -Given the following deliverables: -And roadmap spec with @architect-status:active -When defining acceptance criteria -Then high-level scenarios can exist in roadmap spec -And they guide implementation (not executable) -And they are replaced with links when complete -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-001-evaluating-a-platform-demonstration-change.sdp.md b/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-001-evaluating-a-platform-demonstration-change.sdp.md deleted file mode 100644 index 4ffeca8a..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-001-evaluating-a-platform-demonstration-change.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:decisions.pdr-008-example-app-purpose.evaluating-a-platform-demonstration-change -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-008-example-app-purpose ---- -# Evaluating a platform demonstration change - -## Intent - -- outcome: Executable scenario: Evaluating a platform demonstration change - -```gwt -Given the following deliverables: -And a proposed change to add DCB multi-product reservation -When evaluating against the guidelines -Then it should be approved because it demonstrates DCB pattern -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-002-evaluating-a-business-feature-change.sdp.md b/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-002-evaluating-a-business-feature-change.sdp.md deleted file mode 100644 index 2263c803..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-002-evaluating-a-business-feature-change.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:decisions.pdr-008-example-app-purpose.evaluating-a-business-feature-change -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-008-example-app-purpose ---- -# Evaluating a business feature change - -## Intent - -- outcome: Executable scenario: Evaluating a business feature change - -```gwt -Given the following deliverables: -And a proposed change to add discount code system -When evaluating against the guidelines -Then it should be rejected as business feature unrelated to platform -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-003-evaluating-an-uncertain-change.sdp.md b/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-003-evaluating-an-uncertain-change.sdp.md deleted file mode 100644 index 6fb1d769..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-008-example-app-purpose/s-003-evaluating-an-uncertain-change.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:decisions.pdr-008-example-app-purpose.evaluating-an-uncertain-change -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-008-example-app-purpose ---- -# Evaluating an uncertain change - -## Intent - -- outcome: Executable scenario: Evaluating an uncertain change - -```gwt -Given the following deliverables: -And a proposed change to add a new bounded context -When evaluating against the guidelines -Then it should be evaluated based on whether it demonstrates integration patterns -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-001-design-session-produces-decision-specs-not-documents.sdp.md b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-001-design-session-produces-decision-specs-not-documents.sdp.md deleted file mode 100644 index e62ee134..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-001-design-session-produces-decision-specs-not-documents.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-009-design-session-methodology.design-session-produces-decision-specs-not-documents -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-009-design-session-methodology ---- -# Design session produces decision specs not documents - -## Intent - -- outcome: Executable scenario: Design session produces decision specs not documents - -```gwt -Given the following deliverables: -And a design session for a new bounded context component -When architectural decisions are made during the session -Then each lasting decision is recorded as a PDR in libar-platform/architect/decisions/ -And no markdown design documents are created in docs/ -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-002-design-session-produces-code-stubs.sdp.md b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-002-design-session-produces-code-stubs.sdp.md deleted file mode 100644 index 82ce5b96..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-002-design-session-produces-code-stubs.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-009-design-session-methodology.design-session-produces-code-stubs -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-009-design-session-methodology ---- -# Design session produces code stubs - -## Intent - -- outcome: Executable scenario: Design session produces code stubs - -```gwt -Given the following deliverables: -And a design session that defines API contracts -When handler signatures and schemas are specified -Then code stubs are created in libar-platform/architect/stubs/{pattern-name}/ -And each stub has @architect-implements linking to the parent pattern -And the real destination is indicated by an @architect-target tag in the JSDoc -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-003-stub-file-has-target-annotation.sdp.md b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-003-stub-file-has-target-annotation.sdp.md deleted file mode 100644 index 0169fdbd..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-003-stub-file-has-target-annotation.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-009-design-session-methodology.stub-file-has-target-annotation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-009-design-session-methodology ---- -# Stub file has target annotation - -## Intent - -- outcome: Executable scenario: Stub file has target annotation - -```gwt -Given the following deliverables: -And a code stub in libar-platform/architect/stubs/agent-component-isolation/ -When reviewing the stub file -Then @architect-* tags appear first in the JSDoc block -And it contains @architect-implements linking to the parent pattern -And the real destination is indicated by an @architect-target tag -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-004-stubs-use-pattern-based-folder-naming.sdp.md b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-004-stubs-use-pattern-based-folder-naming.sdp.md deleted file mode 100644 index 7ed9301d..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-004-stubs-use-pattern-based-folder-naming.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:decisions.pdr-009-design-session-methodology.stubs-use-pattern-based-folder-naming -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-009-design-session-methodology ---- -# Stubs use pattern-based folder naming - -## Intent - -- outcome: Executable scenario: Stubs use pattern-based folder naming - -```gwt -Given the following deliverables: -And a design session for agent handler architecture -When creating stubs -Then the folder is named "agent-handler-architecture" not "ds-2-handler-architecture" -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-005-design-session-decision-uses-design-category.sdp.md b/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-005-design-session-decision-uses-design-category.sdp.md deleted file mode 100644 index cb5f07d9..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-009-design-session-methodology/s-005-design-session-decision-uses-design-category.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:decisions.pdr-009-design-session-methodology.design-session-decision-uses-design-category -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-009-design-session-methodology ---- -# Design-session decision uses design category - -## Intent - -- outcome: Executable scenario: Design-session decision uses design category - -```gwt -Given the following deliverables: -And a PDR recording an API shape decision from a design session -When creating the decision record -Then it uses @architect-adr-category:design -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-001-agent-handler-receives-projection-data-as-argument.sdp.md b/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-001-agent-handler-receives-projection-data-as-argument.sdp.md deleted file mode 100644 index b5fa11f4..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-001-agent-handler-receives-projection-data-as-argument.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:decisions.pdr-010-cross-component-argument-injection.agent-handler-receives-projection-data-as-argument -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-010-cross-component-argument-injection ---- -# Agent handler receives projection data as argument - -## Intent - -- outcome: Executable scenario: Agent handler receives projection data as argument - -```gwt -Given the following deliverables: -And the agent component needs customer cancellation history -And the customerCancellations projection lives at the app level -When the app-level subscription handler triggers the agent -Then it pre-loads cancellation data from the projection -And passes it as an argument to the agent component handler -And the agent handler does not query any app-level tables -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-002-missing-external-data-is-handled-gracefully.sdp.md b/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-002-missing-external-data-is-handled-gracefully.sdp.md deleted file mode 100644 index 3e37f87e..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-002-missing-external-data-is-handled-gracefully.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-010-cross-component-argument-injection.missing-external-data-is-handled-gracefully -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-010-cross-component-argument-injection ---- -# Missing external data is handled gracefully - -## Intent - -- outcome: Executable scenario: Missing external data is handled gracefully - -```gwt -Given the following deliverables: -And a new customer with no cancellation history in the projection -When the agent handler receives an event for this customer -Then the injected customerHistory field is undefined -And the handler proceeds with available data -And no error is thrown -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-003-injected-data-interface-is-extensible.sdp.md b/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-003-injected-data-interface-is-extensible.sdp.md deleted file mode 100644 index e7d37c55..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-010-cross-component-argument-injection/s-003-injected-data-interface-is-extensible.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-010-cross-component-argument-injection.injected-data-interface-is-extensible -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-010-cross-component-argument-injection ---- -# InjectedData interface is extensible - -## Intent - -- outcome: Executable scenario: InjectedData interface is extensible - -```gwt -Given the following deliverables: -And the agent component currently only needs cancellation history -When a future pattern requires order frequency data -Then a new optional field is added to AgentEventHandlerInjectedData -And existing handlers continue to work without changes -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-001-action-handler-performs-analysis-without-persistence.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-001-action-handler-performs-analysis-without-persistence.sdp.md deleted file mode 100644 index f9dbc71e..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-001-action-handler-performs-analysis-without-persistence.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-011-agent-action-handler-architecture.action-handler-performs-analysis-without-persistence -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-011-agent-action-handler-architecture ---- -# EventBus uses subscription-specific pool when available - -## Intent - -- outcome: Executable scenario: EventBus uses subscription-specific pool when available - -```gwt -Given the following deliverables: -And an ActionSubscription with a dedicated agentPool -And a MutationSubscription with no pool specified -When EventBus dispatches to the ActionSubscription and EventBus dispatches to the MutationSubscription -Then it uses agentPool.enqueueAction -And it uses the default shared workpool.enqueueMutation -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-002-on-complete-mutation-persists-decision-atomically.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-002-on-complete-mutation-persists-decision-atomically.sdp.md deleted file mode 100644 index ecdfaf98..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-002-on-complete-mutation-persists-decision-atomically.sdp.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -id: spec:decisions.pdr-011-agent-action-handler-architecture.on-complete-mutation-persists-decision-atomically -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-011-agent-action-handler-architecture ---- -# onComplete mutation persists decision atomically - -## Intent - -- outcome: Architect scenario (not an SDP test carrier) "onComplete mutation persists decision atomically" from architect/decisions/pdr-011-agent-action-handler-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-003-llm-unavailable-falls-back-to-rule-based-analysis.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-003-llm-unavailable-falls-back-to-rule-based-analysis.sdp.md deleted file mode 100644 index 84aa65d8..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-003-llm-unavailable-falls-back-to-rule-based-analysis.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-011-agent-action-handler-architecture.llm-unavailable-falls-back-to-rule-based-analysis -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-011-agent-action-handler-architecture ---- -# LLM unavailable falls back to rule-based analysis - -## Intent - -- outcome: Architect scenario: LLM unavailable falls back to rule-based analysis - -```gwt -Given an agent action handler configured with LLM runtime -And the LLM API returns an error or times out -When the action handler catches the LLM error -Then it falls back to rule-based confidence scoring via config.onEvent -And the AgentActionResult has analysisMethod "rule-based-fallback" -And processing continues without failure -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-004-action-failure-triggers-dead-letter-via-on-complete.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-004-action-failure-triggers-dead-letter-via-on-complete.sdp.md deleted file mode 100644 index ae7c7a10..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-004-action-failure-triggers-dead-letter-via-on-complete.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-011-agent-action-handler-architecture.action-failure-triggers-dead-letter-via-on-complete -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-011-agent-action-handler-architecture ---- -# Action failure triggers dead letter via onComplete - -## Intent - -- outcome: Architect scenario: Action failure triggers dead letter via onComplete - -```gwt -Given an agent action that throws an unrecoverable error -And Workpool exhausts retry attempts -When the onComplete handler fires with result.kind "failed" -Then a dead letter entry is created via agent component deadLetters API -And the checkpoint is NOT advanced past the failed event -And an AgentAnalysisFailed audit event is recorded -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-005-null-decision-advances-checkpoint-without-side-effects.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-005-null-decision-advances-checkpoint-without-side-effects.sdp.md deleted file mode 100644 index fbca4f60..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-005-null-decision-advances-checkpoint-without-side-effects.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-011-agent-action-handler-architecture.null-decision-advances-checkpoint-without-side-effects -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-011-agent-action-handler-architecture ---- -# Null decision advances checkpoint without side effects - -## Intent - -- outcome: Architect scenario: Null decision advances checkpoint without side effects - -```gwt -Given an agent action processes an event -And the onEvent handler returns null (no pattern detected) -When the onComplete handler fires with result.kind "success" -Then no audit event, command, or approval is recorded -And the checkpoint IS advanced to the events globalPosition -And processing continues normally -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-006-event-bus-dispatches-action-subscription-via-enqueue-action.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-006-event-bus-dispatches-action-subscription-via-enqueue-action.sdp.md deleted file mode 100644 index ff44fd6f..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-006-event-bus-dispatches-action-subscription-via-enqueue-action.sdp.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -id: spec:decisions.pdr-011-agent-action-handler-architecture.event-bus-dispatches-action-subscription-via-enqueue-action -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-011-agent-action-handler-architecture ---- -# EventBus dispatches action subscription via enqueueAction - -## Intent - -- outcome: Architect scenario (not an SDP test carrier) "EventBus dispatches action subscription via enqueueAction" from architect/decisions/pdr-011-agent-action-handler-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-007-existing-mutation-subscriptions-remain-unchanged.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-007-existing-mutation-subscriptions-remain-unchanged.sdp.md deleted file mode 100644 index 25997dcb..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-007-existing-mutation-subscriptions-remain-unchanged.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-011-agent-action-handler-architecture.existing-mutation-subscriptions-remain-unchanged -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-011-agent-action-handler-architecture ---- -# Existing mutation subscriptions remain unchanged - -## Intent - -- outcome: Architect scenario: Existing mutation subscriptions remain unchanged - -```gwt -Given an EventSubscription with handlerType "mutation" -When EventBus.publish matches this subscription -Then it calls workpool.enqueueMutation with the mutation handler -And existing projections and process managers continue to work -And onComplete is optional as before -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-008-action-subscription-requires-on-complete-at-the-type-level.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-008-action-subscription-requires-on-complete-at-the-type-level.sdp.md deleted file mode 100644 index 7d8aed28..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-008-action-subscription-requires-on-complete-at-the-type-level.sdp.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -id: spec:decisions.pdr-011-agent-action-handler-architecture.action-subscription-requires-on-complete-at-the-type-level -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-011-agent-action-handler-architecture ---- -# ActionSubscription requires onComplete at the type level - -## Intent - -- outcome: Architect scenario (not an SDP test carrier) "ActionSubscription requires onComplete at the type level" from architect/decisions/pdr-011-agent-action-handler-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-009-sequential-events-process-correctly.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-009-sequential-events-process-correctly.sdp.md deleted file mode 100644 index 03a7ad73..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-009-sequential-events-process-correctly.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-011-agent-action-handler-architecture.sequential-events-process-correctly -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-011-agent-action-handler-architecture ---- -# Sequential events process correctly - -## Intent - -- outcome: Architect scenario: Sequential events process correctly - -```gwt -Given an agent with checkpoint at globalPosition 10 -And event E11 with globalPosition 11 arrives -When the action handler loads checkpoint and checks position -Then it processes E11 because 11 exceeds 10 -And the onComplete handler advances checkpoint to 11 -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-010-concurrent-actions-for-same-entity-are-serialized-at-on-complete.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-010-concurrent-actions-for-same-entity-are-serialized-at-on-complete.sdp.md deleted file mode 100644 index 72cb710b..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-010-concurrent-actions-for-same-entity-are-serialized-at-on-complete.sdp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: spec:decisions.pdr-011-agent-action-handler-architecture.concurrent-actions-for-same-entity-are-serialized-at-on-complete -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-011-agent-action-handler-architecture ---- -# Concurrent actions for same entity are serialized at onComplete - -## Intent - -- outcome: Architect scenario: Concurrent actions for same entity are serialized at onComplete - -```gwt -Given an agent with checkpoint at globalPosition 10 -And events E11 and E12 are dispatched concurrently by Workpool -When both action handlers load checkpoint (both see position 10) and both pass the position check and return decisions -Then the first onComplete advances checkpoint to 11 -And the second onComplete retries via OCC -And the second onComplete sees checkpoint at 11 -And the second onComplete advances checkpoint to 12 -And no duplicate audit events or commands are created -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-011-already-processed-event-is-skipped-in-action.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-011-already-processed-event-is-skipped-in-action.sdp.md deleted file mode 100644 index f4777968..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-011-already-processed-event-is-skipped-in-action.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-011-agent-action-handler-architecture.already-processed-event-is-skipped-in-action -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-011-agent-action-handler-architecture ---- -# Already-processed event is skipped in action - -## Intent - -- outcome: Architect scenario: Already-processed event is skipped in action - -```gwt -Given an agent with checkpoint at globalPosition 15 -And a retried event with globalPosition 12 arrives -When the action handler loads checkpoint and checks position -Then it skips processing because 12 does not exceed 15 -And it returns a null decision -And no LLM call is made (performance optimization) -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-012-partial-on-complete-failure-replays-safely.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-012-partial-on-complete-failure-replays-safely.sdp.md deleted file mode 100644 index 0146c3a3..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-012-partial-on-complete-failure-replays-safely.sdp.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -id: spec:decisions.pdr-011-agent-action-handler-architecture.partial-on-complete-failure-replays-safely -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-011-agent-action-handler-architecture ---- -# Partial onComplete failure replays safely - -## Intent - -- outcome: Architect scenario (not an SDP test carrier) "Partial onComplete failure replays safely" from architect/decisions/pdr-011-agent-action-handler-architecture.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-013-event-bus-uses-subscription-specific-pool-when-available.sdp.md b/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-013-event-bus-uses-subscription-specific-pool-when-available.sdp.md deleted file mode 100644 index b618442d..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-011-agent-action-handler-architecture/s-013-event-bus-uses-subscription-specific-pool-when-available.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-011-agent-action-handler-architecture.event-bus-uses-subscription-specific-pool-when-available -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-011-agent-action-handler-architecture ---- -# EventBus uses subscription-specific pool when available - -## Intent - -- outcome: Executable scenario: EventBus uses subscription-specific pool when available - -```gwt -Given the following deliverables: -And an ActionSubscription with a dedicated agentPool -And a MutationSubscription with no pool specified -When EventBus dispatches to the ActionSubscription and EventBus dispatches to the MutationSubscription -Then it uses agentPool.enqueueAction -And it uses the default shared workpool.enqueueMutation -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-001-command-routes-through-orchestrator-to-domain-handler.sdp.md b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-001-command-routes-through-orchestrator-to-domain-handler.sdp.md deleted file mode 100644 index 3c834125..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-001-command-routes-through-orchestrator-to-domain-handler.sdp.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: spec:decisions.pdr-012-agent-command-routing.command-routes-through-orchestrator-to-domain-handler -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-012-agent-command-routing ---- -# Command routes through orchestrator to domain handler - -## Intent - -- outcome: Architect scenario: Command routes through orchestrator to domain handler - -```gwt -Given an agent emits a SuggestCustomerOutreach command -And the command is recorded in the agent component with status "pending" -And a route is registered mapping SuggestCustomerOutreach to the outreach handler -When the routeAgentCommand mutation executes -Then it loads the command from the agent component by decisionId -And it looks up the route in AgentCommandRouter -And it transforms the agent command payload to orchestrator args format -And it calls CommandOrchestrator.execute with the matching CommandConfig -And the command status transitions from "pending" to "processing" to "completed" -And an audit event records the successful routing -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-002-unknown-command-type-fails-with-routing-error.sdp.md b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-002-unknown-command-type-fails-with-routing-error.sdp.md deleted file mode 100644 index 62a61bd3..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-002-unknown-command-type-fails-with-routing-error.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-012-agent-command-routing.unknown-command-type-fails-with-routing-error -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-012-agent-command-routing ---- -# Unknown command type fails with routing error - -## Intent - -- outcome: Architect scenario: Unknown command type fails with routing error - -```gwt -Given an agent emits a command with type "UnknownCommand" -And no route is registered for "UnknownCommand" -When the routeAgentCommand mutation executes -Then the command status is updated to "failed" -And the error message includes "No route registered for command type: UnknownCommand" -And an AgentCommandRoutingFailed audit event is recorded with the command type -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-003-duplicate-command-rejected-by-command-orchestrator-idempotency.sdp.md b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-003-duplicate-command-rejected-by-command-orchestrator-idempotency.sdp.md deleted file mode 100644 index a9fdf9ba..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-003-duplicate-command-rejected-by-command-orchestrator-idempotency.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-012-agent-command-routing.duplicate-command-rejected-by-command-orchestrator-idempotency -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-012-agent-command-routing ---- -# Duplicate command rejected by CommandOrchestrator idempotency - -## Intent - -- outcome: Architect scenario: Duplicate command rejected by CommandOrchestrator idempotency - -```gwt -Given an agent emits a command that has already been processed -And the CommandOrchestrator detects duplicate via Command Bus commandId -When the routeAgentCommand mutation executes -Then CommandOrchestrator rejects the command as duplicate -And the command status remains "completed" from the first processing -And no duplicate domain handler invocation occurs -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-004-handler-uses-trigger-for-cheap-detection-before-llm.sdp.md b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-004-handler-uses-trigger-for-cheap-detection-before-llm.sdp.md deleted file mode 100644 index 0b0ee64c..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-004-handler-uses-trigger-for-cheap-detection-before-llm.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-012-agent-command-routing.handler-uses-trigger-for-cheap-detection-before-llm -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-012-agent-command-routing ---- -# Handler uses trigger for cheap detection before LLM - -## Intent - -- outcome: Architect scenario: Handler uses trigger for cheap detection before LLM - -```gwt -Given a pattern with trigger requiring 3+ OrderCancelled events -And an event stream with 2 OrderCancelled events -When the PatternExecutor evaluates this pattern -Then pattern.trigger returns false (only 2 events) -And pattern.analyze is NOT called (no unnecessary LLM cost) -And the executor moves to the next pattern -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-005-handler-uses-analyze-for-llm-powered-detection.sdp.md b/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-005-handler-uses-analyze-for-llm-powered-detection.sdp.md deleted file mode 100644 index dd165f0c..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-012-agent-command-routing/s-005-handler-uses-analyze-for-llm-powered-detection.sdp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: spec:decisions.pdr-012-agent-command-routing.handler-uses-analyze-for-llm-powered-detection -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-012-agent-command-routing ---- -# Handler uses analyze for LLM-powered detection - -## Intent - -- outcome: Architect scenario: Handler uses analyze for LLM-powered detection - -```gwt -Given a pattern with trigger requiring 3+ OrderCancelled events -And a pattern.analyze function that calls agent.analyze with an LLM prompt -And an event stream with 5 OrderCancelled events -When the PatternExecutor evaluates this pattern -Then pattern.trigger returns true (5 events exceed threshold) -And pattern.analyze is called with the filtered events and agent interface -And the LLM returns a confidence of 0.92 -And the result is wrapped in an AgentDecision with analysisMethod "llm" -And the executor short-circuits (no further patterns evaluated) -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-001-invalid-lifecycle-transition-is-rejected.sdp.md b/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-001-invalid-lifecycle-transition-is-rejected.sdp.md deleted file mode 100644 index 1b158b16..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-001-invalid-lifecycle-transition-is-rejected.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-013-agent-lifecycle-fsm.invalid-lifecycle-transition-is-rejected -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-013-agent-lifecycle-fsm ---- -# ReconfigureAgent updates configuration without losing state - -## Intent - -- outcome: Executable scenario: ReconfigureAgent updates configuration without losing state - -```gwt -Given the following deliverables: -And an active churn-risk agent with confidenceThreshold 0.8 -When a ReconfigureAgent command changes threshold to 0.7 -Then the agent continues from its current checkpoint -And future analysis uses the new threshold -And the config change is recorded in audit trail -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-002-stop-agent-works-from-any-non-stopped-state.sdp.md b/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-002-stop-agent-works-from-any-non-stopped-state.sdp.md deleted file mode 100644 index 2bb016f3..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-002-stop-agent-works-from-any-non-stopped-state.sdp.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -id: spec:decisions.pdr-013-agent-lifecycle-fsm.stop-agent-works-from-any-non-stopped-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-013-agent-lifecycle-fsm ---- -# StopAgent works from any non-stopped state - -## Intent - -- outcome: Architect scenario (not an SDP test carrier) "StopAgent works from any non-stopped state" from architect/decisions/pdr-013-agent-lifecycle-fsm.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-003-pause-agent-transitions-active-agent-to-paused.sdp.md b/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-003-pause-agent-transitions-active-agent-to-paused.sdp.md deleted file mode 100644 index 83b90728..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-003-pause-agent-transitions-active-agent-to-paused.sdp.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -id: spec:decisions.pdr-013-agent-lifecycle-fsm.pause-agent-transitions-active-agent-to-paused -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-013-agent-lifecycle-fsm ---- -# PauseAgent transitions active agent to paused - -## Intent - -- outcome: Architect scenario (not an SDP test carrier) "PauseAgent transitions active agent to paused" from architect/decisions/pdr-013-agent-lifecycle-fsm.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-004-resume-agent-resumes-from-checkpoint-position.sdp.md b/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-004-resume-agent-resumes-from-checkpoint-position.sdp.md deleted file mode 100644 index 2037af65..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-004-resume-agent-resumes-from-checkpoint-position.sdp.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -id: spec:decisions.pdr-013-agent-lifecycle-fsm.resume-agent-resumes-from-checkpoint-position -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-013-agent-lifecycle-fsm ---- -# ResumeAgent resumes from checkpoint position - -## Intent - -- outcome: Architect scenario (not an SDP test carrier) "ResumeAgent resumes from checkpoint position" from architect/decisions/pdr-013-agent-lifecycle-fsm.feature diff --git a/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-005-reconfigure-agent-updates-configuration-without-losing-state.sdp.md b/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-005-reconfigure-agent-updates-configuration-without-losing-state.sdp.md deleted file mode 100644 index da208302..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-013-agent-lifecycle-fsm/s-005-reconfigure-agent-updates-configuration-without-losing-state.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-013-agent-lifecycle-fsm.reconfigure-agent-updates-configuration-without-losing-state -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-013-agent-lifecycle-fsm ---- -# ReconfigureAgent updates configuration without losing state - -## Intent - -- outcome: Executable scenario: ReconfigureAgent updates configuration without losing state - -```gwt -Given the following deliverables: -And an active churn-risk agent with confidenceThreshold 0.8 -When a ReconfigureAgent command changes threshold to 0.7 -Then the agent continues from its current checkpoint -And future analysis uses the new threshold -And the config change is recorded in audit trail -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-001-valid-proof-allows-a-legitimate-component-boundary-action.sdp.md b/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-001-valid-proof-allows-a-legitimate-component-boundary-action.sdp.md deleted file mode 100644 index 6927e57f..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-001-valid-proof-allows-a-legitimate-component-boundary-action.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-014-component-boundary-authentication-convention.valid-proof-allows-a-legitimate-component-boundary-action -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-014-component-boundary-authentication-convention ---- -# Valid proof allows a legitimate component-boundary action - -## Intent - -- outcome: Executable scenario: Valid proof allows a legitimate component-boundary action - -```gwt -Given the following deliverables: -And a parent mutation mints a verificationProof for the target component boundary -And the proof subject, boundedContext, and optional tenant binding match the requested action -When the component mutation calls verifyActor() before any write -Then the proof is accepted -And the mutation proceeds using the verified values as the trusted actor/context -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-before-any-write.sdp.md b/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-before-any-write.sdp.md deleted file mode 100644 index bcb97aba..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-002-missing-or-forged-proof-is-rejected-before-any-write.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-014-component-boundary-authentication-convention.missing-or-forged-proof-is-rejected-before-any-write -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-014-component-boundary-authentication-convention ---- -# Missing or forged proof is rejected before any write - -## Intent - -- outcome: Executable scenario: Missing or forged proof is rejected before any write - -```gwt -Given the following deliverables: -And a component mutation receives no verificationProof or a tampered signature -When verifyActor() runs at the mutation boundary -Then the mutation is rejected -And no component state is written on that path -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-003-targeted-mutation-family-migrates-in-one-packet.sdp.md b/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-003-targeted-mutation-family-migrates-in-one-packet.sdp.md deleted file mode 100644 index 1ee10ccb..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-014-component-boundary-authentication-convention/s-003-targeted-mutation-family-migrates-in-one-packet.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-014-component-boundary-authentication-convention.targeted-mutation-family-migrates-in-one-packet -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-014-component-boundary-authentication-convention ---- -# Targeted mutation family migrates in one packet - -## Intent - -- outcome: Executable scenario: Targeted mutation family migrates in one packet - -```gwt -Given the following deliverables: -And the P11 keystone packet is in review -When the targeted component mutations are inspected together -Then each of approve, reject, audit.record, agentCommands.record, and appendToStream requires verificationProof -And each calls verifyActor() inside the component mutation boundary -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-001-sequential-appends-remain-strictly-monotonic-at-real-timestamps.sdp.md b/specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-001-sequential-appends-remain-strictly-monotonic-at-real-timestamps.sdp.md deleted file mode 100644 index 4bc727ac..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-001-sequential-appends-remain-strictly-monotonic-at-real-timestamps.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-015-global-position-numeric-representation.sequential-appends-remain-strictly-monotonic-at-real-timestamps -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-015-global-position-numeric-representation ---- -# Sequential appends remain strictly monotonic at real timestamps - -## Intent - -- outcome: Executable scenario: Sequential appends remain strictly monotonic at real timestamps - -```gwt -Given the following deliverables: -And the store allocates positions using timestamp plus per-millisecond sequence -When 1000 sequential appends are allocated at a real 'Date.now()' scale -Then every later position is strictly greater than the prior position -And equality checks remain exact because the runtime representation is bigint -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-002-legacy-numeric-checkpoints-are-read-safely-by-the-new-code.sdp.md b/specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-002-legacy-numeric-checkpoints-are-read-safely-by-the-new-code.sdp.md deleted file mode 100644 index c9f86a05..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-015-global-position-numeric-representation/s-002-legacy-numeric-checkpoints-are-read-safely-by-the-new-code.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-015-global-position-numeric-representation.legacy-numeric-checkpoints-are-read-safely-by-the-new-code -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-015-global-position-numeric-representation ---- -# Legacy numeric checkpoints are read safely by the new code - -## Intent - -- outcome: Executable scenario: Legacy numeric checkpoints are read safely by the new code - -```gwt -Given the following deliverables: -And a historical checkpoint stores 'lastGlobalPosition' as a number -When the new checkpoint helper reads that document -Then the value is normalized through the compat path before comparison -And new bigint checkpoints are not misread as legacy numeric checkpoints -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-001-secondary-fanout-and-saga-routing-no-longer-share-the-primary-projection-p.sdp.md b/specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-001-secondary-fanout-and-saga-routing-no-longer-share-the-primary-projection-p.sdp.md deleted file mode 100644 index 6de7ea75..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-001-secondary-fanout-and-saga-routing-no-longer-share-the-primary-projection-p.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-016-projection-pool-split-named-pools-per-concern.secondary-fanout-and-saga-routing-no-longer-share-the-primary-projection-pool -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-016-projection-pool-split-named-pools-per-concern ---- -# Secondary fanout and saga routing no longer share the primary projection pool - -## Intent - -- outcome: Executable scenario: Secondary fanout and saga routing no longer share the primary projection pool - -```gwt -Given the following deliverables: -And the orchestrator is configured with projectionPool, sagaPool, and fanoutPool -When a command triggers a primary projection, a secondary projection, and a saga route -Then the primary projection stays on projectionPool -And the secondary projection runs on fanoutPool -And the saga route runs on sagaPool -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-002-the-pool-split-does-not-claim-nonexistent-workpool-ordering-behavior.sdp.md b/specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-002-the-pool-split-does-not-claim-nonexistent-workpool-ordering-behavior.sdp.md deleted file mode 100644 index a777db04..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-016-projection-pool-split-named-pools-per-concern/s-002-the-pool-split-does-not-claim-nonexistent-workpool-ordering-behavior.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-016-projection-pool-split-named-pools-per-concern.the-pool-split-does-not-claim-nonexistent-workpool-ordering-behavior -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-016-projection-pool-split-named-pools-per-concern ---- -# The pool split does not claim nonexistent Workpool ordering behavior - -## Intent - -- outcome: Executable scenario: The pool split does not claim nonexistent Workpool ordering behavior - -```gwt -Given the following deliverables: -And upstream Workpool still lacks the general native 'key:' ordering feature for projections -When the pool split is documented and implemented -Then no fake FIFO guarantee is added around projectionPool, sagaPool, or fanoutPool -And ordering expectations remain limited to the capabilities actually provided upstream -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-001-tranche-3-gate-chooses-the-low-blast-radius-path.sdp.md b/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-001-tranche-3-gate-chooses-the-low-blast-radius-path.sdp.md deleted file mode 100644 index 12c30865..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-001-tranche-3-gate-chooses-the-low-blast-radius-path.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-017-tranche-3-platform-architecture-gate.tranche-3-gate-chooses-the-low-blast-radius-path -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-017-tranche-3-platform-architecture-gate ---- -# Tranche-3 gate chooses the low-blast-radius path - -## Intent - -- outcome: Executable scenario: Tranche-3 gate chooses the low-blast-radius path - -```gwt -Given the following deliverables: -And tranche-3 packet 9 starts with the design gate -When PDR-017 is reviewed -Then it accepts the shared-contract extraction -And it rejects the platform-core and platform-store full split for this packet -And it keeps tranche-3 on the non-split execution path -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-002-optional-package-splits-are-not-silently-started.sdp.md b/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-002-optional-package-splits-are-not-silently-started.sdp.md deleted file mode 100644 index 1be2f6df..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-002-optional-package-splits-are-not-silently-started.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-017-tranche-3-platform-architecture-gate.optional-package-splits-are-not-silently-started -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-017-tranche-3-platform-architecture-gate ---- -# Optional package splits are not silently started - -## Intent - -- outcome: Executable scenario: Optional package splits are not silently started - -```gwt -Given the following deliverables: -And PDR-017 does not approve P42 or P43 -When tranche-3 packet 9 is executed -Then no package-split migration work is started in this packet -And any follow-on cleanup remains explicitly sequenced after the shared-contract extraction -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-003-shared-contracts-package-centralizes-the-non-split-contract-surfaces.sdp.md b/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-003-shared-contracts-package-centralizes-the-non-split-contract-surfaces.sdp.md deleted file mode 100644 index 91900011..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-003-shared-contracts-package-centralizes-the-non-split-contract-surfaces.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-017-tranche-3-platform-architecture-gate.shared-contracts-package-centralizes-the-non-split-contract-surfaces -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-017-tranche-3-platform-architecture-gate ---- -# Shared contracts package centralizes the non-split contract surfaces - -## Intent - -- outcome: Executable scenario: Shared contracts package centralizes the non-split contract surfaces - -```gwt -Given the following deliverables: -And the non-split tranche-3 path is approved -When the shared contracts package is inspected -Then EventCategory, ProcessManagerStatus, and DCB scope-key contracts live there -And platform-core, platform-store, and platform-bc consume the shared definitions instead of maintaining separate copies -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-004-layering-command-enforces-the-tranche-3-non-split-boundary-rules.sdp.md b/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-004-layering-command-enforces-the-tranche-3-non-split-boundary-rules.sdp.md deleted file mode 100644 index 73dcc626..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-017-tranche-3-platform-architecture-gate/s-004-layering-command-enforces-the-tranche-3-non-split-boundary-rules.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-017-tranche-3-platform-architecture-gate.layering-command-enforces-the-tranche-3-non-split-boundary-rules -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-017-tranche-3-platform-architecture-gate ---- -# Layering command enforces the tranche-3 non-split boundary rules - -## Intent - -- outcome: Executable scenario: Layering command enforces the tranche-3 non-split boundary rules - -```gwt -Given the following deliverables: -And packet 9 stays on the non-split PDR-017 path -When pnpm lint:layers runs -Then it validates the allowed package dependency matrix -And it rejects new cross-package reach-through imports beyond the acknowledged transitional allowlist -And it exits 0 for the current approved architecture state -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-001-same-key-plus-same-payload-returns-the-original-append-result.sdp.md b/specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-001-same-key-plus-same-payload-returns-the-original-append-result.sdp.md deleted file mode 100644 index 506af58e..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-001-same-key-plus-same-payload-returns-the-original-append-result.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-018-idempotency-enforcement-for-append-to-stream.same-key-plus-same-payload-returns-the-original-append-result -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-018-idempotency-enforcement-for-append-to-stream ---- -# Same key plus same payload returns the original append result - -## Intent - -- outcome: Executable scenario: Same key plus same payload returns the original append result - -```gwt -Given the following deliverables: -And an event already exists with idempotency key "payment:ord-123" -And a retry submits the same semantic payload for that key -When 'appendToStream' evaluates the request -Then it returns 'duplicate' -And the returned eventIds, globalPositions, and newVersion match the original append result -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-002-same-key-plus-different-payload-is-rejected-and-audited.sdp.md b/specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-002-same-key-plus-different-payload-is-rejected-and-audited.sdp.md deleted file mode 100644 index 62e68a79..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-018-idempotency-enforcement-for-append-to-stream/s-002-same-key-plus-different-payload-is-rejected-and-audited.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-018-idempotency-enforcement-for-append-to-stream.same-key-plus-different-payload-is-rejected-and-audited -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-018-idempotency-enforcement-for-append-to-stream ---- -# Same key plus different payload is rejected and audited - -## Intent - -- outcome: Executable scenario: Same key plus different payload is rejected and audited - -```gwt -Given the following deliverables: -And an event already exists with idempotency key "payment:ord-123" -And a second append reuses that key with a different semantic payload -When 'appendToStream' evaluates the request -Then it returns 'idempotency_conflict' -And an audit record is persisted with both payload fingerprints and the existing event identity -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-001-payload-below-the-configured-cap-passes-the-component-boundary.sdp.md b/specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-001-payload-below-the-configured-cap-passes-the-component-boundary.sdp.md deleted file mode 100644 index 12edd5ef..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-001-payload-below-the-configured-cap-passes-the-component-boundary.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-019-v-any-vs-v-unknown-boundary-policy.payload-below-the-configured-cap-passes-the-component-boundary -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-019-v-any-vs-v-unknown-boundary-policy ---- -# Payload below the configured cap passes the component boundary - -## Intent - -- outcome: Executable scenario: Payload below the configured cap passes the component boundary - -```gwt -Given the following deliverables: -And a boundary field is validated with 'v.unknown()' -And the serialized value stays below the configured byte cap -When the component mutation validates the request -Then the call proceeds -And the stored value retains its original flexible structure -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-002-oversized-payload-is-rejected-before-persistence.sdp.md b/specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-002-oversized-payload-is-rejected-before-persistence.sdp.md deleted file mode 100644 index f9990c8f..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-019-v-any-vs-v-unknown-boundary-policy/s-002-oversized-payload-is-rejected-before-persistence.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-019-v-any-vs-v-unknown-boundary-policy.oversized-payload-is-rejected-before-persistence -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-019-v-any-vs-v-unknown-boundary-policy ---- -# Oversized payload is rejected before persistence - -## Intent - -- outcome: Executable scenario: Oversized payload is rejected before persistence - -```gwt -Given the following deliverables: -And a boundary field is validated with 'v.unknown()' -And its serialized size exceeds the configured byte cap -When the component mutation validates the request -Then the mutation throws 'PAYLOAD_TOO_LARGE' -And no component state is written for that request -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-001-event-type-catch-up-uses-the-replacement-compound-index.sdp.md b/specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-001-event-type-catch-up-uses-the-replacement-compound-index.sdp.md deleted file mode 100644 index a681200e..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-001-event-type-catch-up-uses-the-replacement-compound-index.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-020-events-table-index-policy.event-type-catch-up-uses-the-replacement-compound-index -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-020-events-table-index-policy ---- -# Event-type catch-up uses the replacement compound index - -## Intent - -- outcome: Executable scenario: Event-type catch-up uses the replacement compound index - -```gwt -Given the following deliverables: -And the event store exposes 'readFromPosition' -When a caller filters by event type after a global position -Then the query uses the 'by_event_type_and_global_position' replacement index -And it returns '{ events, nextPosition, hasMore }' for continued paging -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-002-removed-indexes-stay-absent-after-the-audit-driven-cleanup.sdp.md b/specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-002-removed-indexes-stay-absent-after-the-audit-driven-cleanup.sdp.md deleted file mode 100644 index 829469f4..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-020-events-table-index-policy/s-002-removed-indexes-stay-absent-after-the-audit-driven-cleanup.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-020-events-table-index-policy.removed-indexes-stay-absent-after-the-audit-driven-cleanup -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-020-events-table-index-policy ---- -# Removed indexes stay absent after the audit-driven cleanup - -## Intent - -- outcome: Executable scenario: Removed indexes stay absent after the audit-driven cleanup - -```gwt -Given the following deliverables: -And the index audit is complete -When the events-table schema is inspected -Then 'by_event_type', 'by_bounded_context', 'by_event_id', and 'by_category' are absent -And the replacement compound index remains present -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-001-ac4-is-closed-by-a-constrained-dependency-decision-rather-than-a-package-r.sdp.md b/specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-001-ac4-is-closed-by-a-constrained-dependency-decision-rather-than-a-package-r.sdp.md deleted file mode 100644 index 44e1da6d..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-001-ac4-is-closed-by-a-constrained-dependency-decision-rather-than-a-package-r.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-021-platform-store-runtime-dependency-on-platform-core.ac4-is-closed-by-a-constrained-dependency-decision-rather-than-a-package-rewrite -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-021-platform-store-runtime-dependency-on-platform-core ---- -# AC4 is closed by a constrained dependency decision rather than a package rewrite - -## Intent - -- outcome: Executable scenario: AC4 is closed by a constrained dependency decision rather than a package rewrite - -```gwt -Given the following deliverables: -And '@libar-dev/platform-store' still declares '@libar-dev/platform-core' -When the live imports are audited -Then only the approved public subpaths are allowed -And the dependency is accepted with constraints instead of being described as phantom -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-002-the-constrained-dependency-does-not-reopen-the-deferred-platform-core-spli.sdp.md b/specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-002-the-constrained-dependency-does-not-reopen-the-deferred-platform-core-spli.sdp.md deleted file mode 100644 index 963e06a5..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-021-platform-store-runtime-dependency-on-platform-core/s-002-the-constrained-dependency-does-not-reopen-the-deferred-platform-core-spli.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-021-platform-store-runtime-dependency-on-platform-core.the-constrained-dependency-does-not-reopen-the-deferred-platform-core-split -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-021-platform-store-runtime-dependency-on-platform-core ---- -# The constrained dependency does not reopen the deferred platform-core split - -## Intent - -- outcome: Executable scenario: The constrained dependency does not reopen the deferred platform-core split - -```gwt -Given the following deliverables: -And AC2 remains a tranche-3 architecture concern -When the remediation sources are reviewed -Then AC4 is recorded as 'resolved-via-PDR-021' -And AC2 is recorded as 'deferred-to-Tranche-3-PDR-017' -And no approval is implied for agent, orchestration, reservations, DCB, monitoring, testing, or other new platform-core imports -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-001-bare-names-remain-canonical-across-roadmap-and-decision-sources.sdp.md b/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-001-bare-names-remain-canonical-across-roadmap-and-decision-sources.sdp.md deleted file mode 100644 index 76e12944..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-001-bare-names-remain-canonical-across-roadmap-and-decision-sources.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-022-value-transfer-doctrine-adoption.bare-names-remain-canonical-across-roadmap-and-decision-sources -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-022-value-transfer-doctrine-adoption ---- -# Bare names remain canonical across roadmap and decision sources - -## Intent - -- outcome: Executable scenario: Bare names remain canonical across roadmap and decision sources - -```gwt -Given the following deliverables: -And a semantic pattern named 'EventStoreFoundation' -When roadmap specs or decisions refer to that pattern -Then they should use the bare name 'EventStoreFoundation' -And they should not rename the concept to 'EventStoreFoundationExecutableTests' -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-002-executable-tests-names-identify-carrier-artifacts-only.sdp.md b/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-002-executable-tests-names-identify-carrier-artifacts-only.sdp.md deleted file mode 100644 index 7543ead4..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-002-executable-tests-names-identify-carrier-artifacts-only.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-022-value-transfer-doctrine-adoption.executable-tests-names-identify-carrier-artifacts-only -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-022-value-transfer-doctrine-adoption ---- -# ExecutableTests names identify carrier artifacts only - -## Intent - -- outcome: Executable scenario: ExecutableTests names identify carrier artifacts only - -```gwt -Given the following deliverables: -And an executable feature created to preserve a shipped pattern -When it is named in the repo -Then the carrier may use the suffix 'ExecutableTests' -And that suffix should describe the proving artifact rather than the semantic pattern itself -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-003-architect-implements-carries-the-continuity-edge.sdp.md b/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-003-architect-implements-carries-the-continuity-edge.sdp.md deleted file mode 100644 index 190b2d2e..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-022-value-transfer-doctrine-adoption/s-003-architect-implements-carries-the-continuity-edge.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:decisions.pdr-022-value-transfer-doctrine-adoption.architect-implements-carries-the-continuity-edge -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-022-value-transfer-doctrine-adoption ---- -# `@architect-implements` carries the continuity edge - -## Intent - -- outcome: Executable scenario: '@architect-implements' carries the continuity edge - -```gwt -Given the following deliverables: -And a carrier tagged '@architect-pattern:CommandBusFoundationExecutableTests' -When the repo needs continuity back to the semantic concept -Then the carrier should include '@architect-implements:CommandBusFoundation' -And graph consumers should treat that tag as the durable link to the bare pattern name -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-001-selective-rollback-restores-one-semantic-pattern-without-undoing-the-whole.sdp.md b/specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-001-selective-rollback-restores-one-semantic-pattern-without-undoing-the-whole.sdp.md deleted file mode 100644 index 59663196..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-001-selective-rollback-restores-one-semantic-pattern-without-undoing-the-whole.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-023-bulk-doctrine-rollback-and-recovery.selective-rollback-restores-one-semantic-pattern-without-undoing-the-whole-packe -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-023-bulk-doctrine-rollback-and-recovery ---- -# Selective rollback restores one semantic pattern without undoing the whole packet - -## Intent - -- outcome: Executable scenario: Selective rollback restores one semantic pattern without undoing the whole packet - -```gwt -Given the following deliverables: -And a deleted doctrine pattern needs to come back -When the maintainer restores that pattern -Then the maintainer should restore the source spec and its paired continuity evidence together -And the maintainer should not restore unrelated deleted specs by default -And validation should rerun before the selective recovery is considered complete -``` diff --git a/specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-002-whole-packet-rollback-keeps-enforcement-in-the-normal-ci-lanes.sdp.md b/specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-002-whole-packet-rollback-keeps-enforcement-in-the-normal-ci-lanes.sdp.md deleted file mode 100644 index 3c0164e0..00000000 --- a/specs/unimplemented/architect-scenarios/pdr-023-bulk-doctrine-rollback-and-recovery/s-002-whole-packet-rollback-keeps-enforcement-in-the-normal-ci-lanes.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:decisions.pdr-023-bulk-doctrine-rollback-and-recovery.whole-packet-rollback-keeps-enforcement-in-the-normal-ci-lanes -kind: example -altitude: story -readiness: idea -relations: - refines: spec:decisions.pdr-023-bulk-doctrine-rollback-and-recovery ---- -# Whole-packet rollback keeps enforcement in the normal CI lanes - -## Intent - -- outcome: Executable scenario: Whole-packet rollback keeps enforcement in the normal CI lanes - -```gwt -Given the following deliverables: -And the bulk doctrine packet must be reverted entirely -When the maintainer performs the revert -Then generated docs should be rebuilt -And hard enforcement should still run through the existing 'test.yml' lanes -And release governance should remain a summary and artifact surface only -``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-001-projection-lag-is-tracked.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-001-projection-lag-is-tracked.sdp.md deleted file mode 100644 index fd20de6e..00000000 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-001-projection-lag-is-tracked.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.production-hardening.projection-lag-is-tracked -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.production-hardening ---- -# Projection lag is tracked - -## Intent - -- outcome: Executable scenario: Projection lag is tracked - -```gwt -Given the following deliverables: -And a projection with checkpoint at position 100 -And the latest event is at position 150 -When metrics are collected -Then projection.lag_events should be 50 -And the metric should include projection name label -``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-002-metrics-collection-handles-missing-checkpoints.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-002-metrics-collection-handles-missing-checkpoints.sdp.md deleted file mode 100644 index 3cd98f78..00000000 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-002-metrics-collection-handles-missing-checkpoints.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.production-hardening.metrics-collection-handles-missing-checkpoints -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.production-hardening ---- -# Metrics collection handles missing checkpoints - -## Intent - -- outcome: Executable scenario: Metrics collection handles missing checkpoints - -```gwt -Given the following deliverables: -And a projection without a checkpoint entry -When metrics are collected -Then projection.lag_events should default to current global position -And a warning should be logged -``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-003-trace-spans-command-to-projection-flow.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-003-trace-spans-command-to-projection-flow.sdp.md deleted file mode 100644 index b31021a0..00000000 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-003-trace-spans-command-to-projection-flow.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.production-hardening.trace-spans-command-to-projection-flow -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.production-hardening ---- -# Trace spans command-to-projection flow - -## Intent - -- outcome: Executable scenario: Trace spans command-to-projection flow - -```gwt -Given the following deliverables: -And a SubmitOrder command with trace context -When the command is processed and OrderSubmitted event is published and projection is updated -Then all log entries should share the same trace ID -And logs should show parent-child relationships via spanId -``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-004-missing-trace-context-uses-default.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-004-missing-trace-context-uses-default.sdp.md deleted file mode 100644 index cb7c388b..00000000 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-004-missing-trace-context-uses-default.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.production-hardening.missing-trace-context-uses-default -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.production-hardening ---- -# Missing trace context uses default - -## Intent - -- outcome: Executable scenario: Missing trace context uses default - -```gwt -Given the following deliverables: -And a command without trace context -When the command is processed -Then a new trace ID should be generated -And all downstream operations should use the generated trace -``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-005-readiness-probe-checks-dependencies.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-005-readiness-probe-checks-dependencies.sdp.md deleted file mode 100644 index 61a069fc..00000000 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-005-readiness-probe-checks-dependencies.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.production-hardening.readiness-probe-checks-dependencies -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.production-hardening ---- -# Readiness probe checks dependencies - -## Intent - -- outcome: Architect scenario: Readiness probe checks dependencies - -```gwt -Given the health endpoint is configured -When event store is reachable and projections are within lag threshold -Then /health/ready should return 200 -And response body should include component statuses -``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-006-unhealthy-dependency-fails-readiness.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-006-unhealthy-dependency-fails-readiness.sdp.md deleted file mode 100644 index c533101e..00000000 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-006-unhealthy-dependency-fails-readiness.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.production-hardening.unhealthy-dependency-fails-readiness -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.production-hardening ---- -# Unhealthy dependency fails readiness - -## Intent - -- outcome: Architect scenario: Unhealthy dependency fails readiness - -```gwt -Given event store is unreachable -When /health/ready is called -Then response should be 503 -And response body should identify failed component -``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-007-liveness-probe-always-succeeds.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-007-liveness-probe-always-succeeds.sdp.md deleted file mode 100644 index ef936cbb..00000000 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-007-liveness-probe-always-succeeds.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.production-hardening.liveness-probe-always-succeeds -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.production-hardening ---- -# Liveness probe always succeeds - -## Intent - -- outcome: Architect scenario: Liveness probe always succeeds - -```gwt -Given the health endpoint is configured -When /health/live is called -Then response should be 200 -And no dependency checks should be performed -``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-008-workpool-backlog-fails-readiness.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-008-workpool-backlog-fails-readiness.sdp.md deleted file mode 100644 index c4bd2354..00000000 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-008-workpool-backlog-fails-readiness.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.production-hardening.workpool-backlog-fails-readiness -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.production-hardening ---- -# Workpool backlog fails readiness - -## Intent - -- outcome: Architect scenario: Workpool backlog fails readiness - -```gwt -Given the health endpoint is configured -And workpool maxParallelism is 10 -And workpool queue depth is 25 -When /health/ready is called -Then response should be 503 -And response body should identify "workpool_backlog" as degraded -And suggested action should be "reduce traffic or scale" -``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-009-circuit-opens-after-repeated-failures.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-009-circuit-opens-after-repeated-failures.sdp.md deleted file mode 100644 index 89c04dd7..00000000 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-009-circuit-opens-after-repeated-failures.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.production-hardening.circuit-opens-after-repeated-failures -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.production-hardening ---- -# Circuit opens after repeated failures - -## Intent - -- outcome: Architect scenario: Circuit opens after repeated failures - -```gwt -Given a circuit breaker with threshold 5 -When 5 consecutive failures occur -Then circuit state should be "OPEN" -And subsequent calls should fail fast with "CIRCUIT_OPEN" -``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-010-circuit-transitions-to-half-open-after-timeout.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-010-circuit-transitions-to-half-open-after-timeout.sdp.md deleted file mode 100644 index 3e1d08c9..00000000 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-010-circuit-transitions-to-half-open-after-timeout.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.production-hardening.circuit-transitions-to-half-open-after-timeout -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.production-hardening ---- -# Circuit transitions to half-open after timeout - -## Intent - -- outcome: Architect scenario: Circuit transitions to half-open after timeout - -```gwt -Given a circuit in "OPEN" state -When the reset timeout expires (via scheduled function) -Then circuit state should be "HALF_OPEN" -And one test request should be allowed through -``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-011-successful-half-open-request-closes-circuit.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-011-successful-half-open-request-closes-circuit.sdp.md deleted file mode 100644 index 588c9216..00000000 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-011-successful-half-open-request-closes-circuit.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.production-hardening.successful-half-open-request-closes-circuit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.production-hardening ---- -# Successful half-open request closes circuit - -## Intent - -- outcome: Architect scenario: Successful half-open request closes circuit - -```gwt -Given a circuit in "HALF_OPEN" state -When a request succeeds -Then circuit state should be "CLOSED" -And normal traffic should resume -``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-012-failed-half-open-request-reopens-circuit.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-012-failed-half-open-request-reopens-circuit.sdp.md deleted file mode 100644 index 8826368e..00000000 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-012-failed-half-open-request-reopens-circuit.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.production-hardening.failed-half-open-request-reopens-circuit -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.production-hardening ---- -# Failed half-open request reopens circuit - -## Intent - -- outcome: Architect scenario: Failed half-open request reopens circuit - -```gwt -Given a circuit in "HALF_OPEN" state -When a request fails -Then circuit state should return to "OPEN" -And timeout timer should reset -``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-013-projection-rebuild-re-processes-events.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-013-projection-rebuild-re-processes-events.sdp.md deleted file mode 100644 index 1d789b52..00000000 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-013-projection-rebuild-re-processes-events.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.production-hardening.projection-rebuild-re-processes-events -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.production-hardening ---- -# Projection rebuild re-processes events - -## Intent - -- outcome: Architect scenario: Projection rebuild re-processes events - -```gwt -Given a corrupted projection at position 500 -When admin triggers rebuild from position 0 -Then checkpoint should reset to position 0 -And projection status should be "rebuilding" -And workpool should re-process all events -``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-014-dead-letter-retry-re-enqueues-event.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-014-dead-letter-retry-re-enqueues-event.sdp.md deleted file mode 100644 index 8e7ac169..00000000 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-014-dead-letter-retry-re-enqueues-event.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.production-hardening.dead-letter-retry-re-enqueues-event -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.production-hardening ---- -# Dead letter retry re-enqueues event - -## Intent - -- outcome: Architect scenario: Dead letter retry re-enqueues event - -```gwt -Given a dead letter with status "pending" -When admin retries the dead letter -Then dead letter status should be "retrying" -And event should be re-enqueued to workpool -``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-015-event-flow-trace-returns-full-history.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-015-event-flow-trace-returns-full-history.sdp.md deleted file mode 100644 index 3baa8895..00000000 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-015-event-flow-trace-returns-full-history.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.production-hardening.event-flow-trace-returns-full-history -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.production-hardening ---- -# Event flow trace returns full history - -## Intent - -- outcome: Architect scenario: Event flow trace returns full history - -```gwt -Given events with correlation ID "corr-123" -When admin requests event flow trace -Then response should include command, events, and projection updates -And entries should be ordered by timestamp -``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-016-durable-function-run-diagnostics.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-016-durable-function-run-diagnostics.sdp.md deleted file mode 100644 index ed0c752f..00000000 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-016-durable-function-run-diagnostics.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.production-hardening.durable-function-run-diagnostics -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.production-hardening ---- -# Durable function run diagnostics - -## Intent - -- outcome: Architect scenario: Durable function run diagnostics - -```gwt -Given an Action Retrier run with ID "run-abc123" -When admin requests durable function run status -Then response should include run state (pending, running, completed, failed) -And response should include attempt count and last error if failed -And response should include associated context (eventId, projectionName, etc.) -``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-017-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-017-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md deleted file mode 100644 index d0d67dce..00000000 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-017-circuit-breaker-uses-action-retrier-for-half-open-probe.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.production-hardening.circuit-breaker-uses-action-retrier-for-half-open-probe -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.production-hardening ---- -# Circuit breaker uses action retrier for half-open probe - -## Intent - -- outcome: Architect scenario: Circuit breaker uses action retrier for half-open probe - -```gwt -Given a circuit breaker "payment-api" in "HALF_OPEN" state -When a test request is initiated -Then action retrier should execute with maxFailures=0 -And circuit state should update to "CLOSED" on success -``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-018-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-018-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md deleted file mode 100644 index 9d663590..00000000 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-018-failed-half-open-probe-reopens-circuit-via-action-retrier.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.production-hardening.failed-half-open-probe-reopens-circuit-via-action-retrier -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.production-hardening ---- -# Failed half-open probe reopens circuit via action retrier - -## Intent - -- outcome: Architect scenario: Failed half-open probe reopens circuit via action retrier - -```gwt -Given a circuit breaker "payment-api" in "HALF_OPEN" state -When the probe action fails -Then onCircuitProbeComplete should transition to "OPEN" -And timeout should be rescheduled for next half-open transition -``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-019-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-019-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md deleted file mode 100644 index b5352636..00000000 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-019-dead-letter-retry-uses-action-retrier-for-external-calls.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.production-hardening.dead-letter-retry-uses-action-retrier-for-external-calls -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.production-hardening ---- -# Dead letter retry uses action retrier for external calls - -## Intent - -- outcome: Architect scenario: Dead letter retry uses action retrier for external calls - -```gwt -Given a dead letter with status "pending" and eventId "evt-123" -When admin triggers retry -Then action retrier should execute processEvent action -And dead letter status should be "retrying" -And retryRunId should track the action run -``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-020-failed-dlq-retry-returns-to-pending-status.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-020-failed-dlq-retry-returns-to-pending-status.sdp.md deleted file mode 100644 index 97ec1dff..00000000 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-020-failed-dlq-retry-returns-to-pending-status.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.production-hardening.failed-dlq-retry-returns-to-pending-status -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.production-hardening ---- -# Failed DLQ retry returns to pending status - -## Intent - -- outcome: Architect scenario: Failed DLQ retry returns to pending status - -```gwt -Given a dead letter in "retrying" status -When action retrier exhausts all retry attempts -Then onDLQRetryComplete should update status to "pending" -And lastError should contain the failure reason -And item should be available for manual review -``` diff --git a/specs/unimplemented/architect-scenarios/production-hardening/s-021-durable-function-calls-propagate-trace-context.sdp.md b/specs/unimplemented/architect-scenarios/production-hardening/s-021-durable-function-calls-propagate-trace-context.sdp.md deleted file mode 100644 index 6e9e0bf2..00000000 --- a/specs/unimplemented/architect-scenarios/production-hardening/s-021-durable-function-calls-propagate-trace-context.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.production-hardening.durable-function-calls-propagate-trace-context -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.production-hardening ---- -# Durable function calls propagate trace context - -## Intent - -- outcome: Architect scenario: Durable function calls propagate trace context - -```gwt -Given an operation with traceContext { traceId: "trace-abc", spanId: "span-001" } -When action retrier executes the operation -Then the operation args should include traceContext -And retry attempts should preserve the same traceId -And logs from retries should be correlatable via traceId -``` diff --git a/specs/unimplemented/architect-scenarios/test-content-blocks/s-001-scenario-with-doc-string-for-rich-content.sdp.md b/specs/unimplemented/architect-scenarios/test-content-blocks/s-001-scenario-with-doc-string-for-rich-content.sdp.md deleted file mode 100644 index 3e4646b8..00000000 --- a/specs/unimplemented/architect-scenarios/test-content-blocks/s-001-scenario-with-doc-string-for-rich-content.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.test-content-blocks.scenario-with-doc-string-for-rich-content -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.test-content-blocks ---- -# Scenario with DocString for rich content - -## Intent - -- outcome: Executable scenario: Scenario with DocString for rich content - -```gwt -Given the following deliverables: -And a system in initial state -When the user provides the following configuration: -Then the expected outcome holds -``` diff --git a/specs/unimplemented/architect-scenarios/test-content-blocks/s-002-scenario-with-data-table-for-structured-data.sdp.md b/specs/unimplemented/architect-scenarios/test-content-blocks/s-002-scenario-with-data-table-for-structured-data.sdp.md deleted file mode 100644 index 67bb25c9..00000000 --- a/specs/unimplemented/architect-scenarios/test-content-blocks/s-002-scenario-with-data-table-for-structured-data.sdp.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -id: spec:platform.test-content-blocks.scenario-with-data-table-for-structured-data -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.test-content-blocks ---- -# Scenario with DataTable for structured data - -## Intent - -- outcome: Architect scenario (not an SDP test carrier) "Scenario with DataTable for structured data" from architect/specs/test-content-blocks.feature diff --git a/specs/unimplemented/architect-scenarios/test-content-blocks/s-003-simple-scenario-under-second-rule.sdp.md b/specs/unimplemented/architect-scenarios/test-content-blocks/s-003-simple-scenario-under-second-rule.sdp.md deleted file mode 100644 index 291d2d02..00000000 --- a/specs/unimplemented/architect-scenarios/test-content-blocks/s-003-simple-scenario-under-second-rule.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:platform.test-content-blocks.simple-scenario-under-second-rule -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.test-content-blocks ---- -# Simple scenario under second rule - -## Intent - -- outcome: Architect scenario: Simple scenario under second rule - -```gwt -Given a precondition -When an action occurs -Then the expected outcome happens -``` diff --git a/specs/unimplemented/architect-scenarios/test-content-blocks/s-004-scenario-with-examples-table.sdp.md b/specs/unimplemented/architect-scenarios/test-content-blocks/s-004-scenario-with-examples-table.sdp.md deleted file mode 100644 index 9f2bb44d..00000000 --- a/specs/unimplemented/architect-scenarios/test-content-blocks/s-004-scenario-with-examples-table.sdp.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: spec:platform.test-content-blocks.scenario-with-examples-table -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.test-content-blocks ---- -# Scenario with examples table - -## Intent - -- outcome: Architect scenario: Scenario with examples table - -```gwt -Given a value of value -When processed -Then the result is value -``` diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-001-generate-themed-decision-document.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-001-generate-themed-decision-document.sdp.md deleted file mode 100644 index 93af5e70..00000000 --- a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-001-generate-themed-decision-document.sdp.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: spec:platform.themed-decision-architecture.generate-themed-decision-document -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.themed-decision-architecture ---- -# Generate themed decision document - -## Intent - -- outcome: Executable scenario: Generate themed decision document - -```gwt -Given the following deliverables: -And decisions tagged with "@architect-adr-theme:persistence" -When running the themed-decisions generator -Then output file "docs-living/decisions/PERSISTENCE.md" is created -And it contains ADRs 001, 002, 010, 011 grouped together -And the theme description appears as header -``` diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-002-theme-tag-in-decision-file.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-002-theme-tag-in-decision-file.sdp.md deleted file mode 100644 index 67bcbfe2..00000000 --- a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-002-theme-tag-in-decision-file.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.themed-decision-architecture.theme-tag-in-decision-file -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.themed-decision-architecture ---- -# Theme tag in decision file - -## Intent - -- outcome: Executable scenario: Theme tag in decision file - -```gwt -Given the following deliverables: -And an ADR feature file -When adding theme classification -Then it includes "@architect-adr-theme:value" -And theme-name is one of: persistence, isolation, commands, projections, coordination, taxonomy, testing -``` diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-003-adr-with-dependency-declaration.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-003-adr-with-dependency-declaration.sdp.md deleted file mode 100644 index 32ae561d..00000000 --- a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-003-adr-with-dependency-declaration.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.themed-decision-architecture.adr-with-dependency-declaration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.themed-decision-architecture ---- -# ADR with dependency declaration - -## Intent - -- outcome: Executable scenario: ADR with dependency declaration - -```gwt -Given the following deliverables: -And ADR-016 (Checkpoint) depends on ADR-002 (Event Store) -When the ADR file includes "@architect-depends-on:002" -Then the dependency graph shows ADR-002 → ADR-016 -``` diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-004-generate-dependency-graph.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-004-generate-dependency-graph.sdp.md deleted file mode 100644 index f7a854c4..00000000 --- a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-004-generate-dependency-graph.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.themed-decision-architecture.generate-dependency-graph -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.themed-decision-architecture ---- -# Generate dependency graph - -## Intent - -- outcome: Executable scenario: Generate dependency graph - -```gwt -Given the following deliverables: -And all ADRs are tagged with their dependencies -When running the dependency-graph generator -Then output includes ASCII or Mermaid diagram -And the diagram shows the dependency tree: -``` diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-005-layer-information-in-generated-docs.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-005-layer-information-in-generated-docs.sdp.md deleted file mode 100644 index 22917a07..00000000 --- a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-005-layer-information-in-generated-docs.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.themed-decision-architecture.layer-information-in-generated-docs -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.themed-decision-architecture ---- -# Layer information in generated docs - -## Intent - -- outcome: Executable scenario: Layer information in generated docs - -```gwt -Given the following deliverables: -And a themed decision document -When it renders ADR entries -Then each entry shows its layer badge (Foundation/Infrastructure/Refinement) -And the layer provides context for the decision's maturity -``` diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-006-port-adr-from-old-format-to-feature-file.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-006-port-adr-from-old-format-to-feature-file.sdp.md deleted file mode 100644 index 1187a8d6..00000000 --- a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-006-port-adr-from-old-format-to-feature-file.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.themed-decision-architecture.port-adr-from-old-format-to-feature-file -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.themed-decision-architecture ---- -# Port ADR from old format to feature file - -## Intent - -- outcome: Executable scenario: Port ADR from old format to feature file - -```gwt -Given the following deliverables: -And an existing ADR in "docs/architecture/decisions/adr-001-*.md" -When migrating to architect format -Then create "deps/libar-dev-packages/packages/tooling/architect/tests/features/decisions/adr-001-*.feature" -And include original decision content in Gherkin format -And add theme, layer, and dependency tags -And mark status (active, superseded, deprecated) -``` diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-007-review-for-validity-during-migration.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-007-review-for-validity-during-migration.sdp.md deleted file mode 100644 index 1d370c91..00000000 --- a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-007-review-for-validity-during-migration.sdp.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: spec:platform.themed-decision-architecture.review-for-validity-during-migration -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.themed-decision-architecture ---- -# Review for validity during migration - -## Intent - -- outcome: Executable scenario: Review for validity during migration - -```gwt -Given the following deliverables: -And an ADR being migrated -When the content is reviewed -Then check if decision is still accurate -And check if it has been superseded by newer decisions -And check if implementation matches the decision -And update status accordingly -``` diff --git a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-008-generate-all-decision-artifacts.sdp.md b/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-008-generate-all-decision-artifacts.sdp.md deleted file mode 100644 index 0c3aef59..00000000 --- a/specs/unimplemented/architect-scenarios/themed-decision-architecture/s-008-generate-all-decision-artifacts.sdp.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: spec:platform.themed-decision-architecture.generate-all-decision-artifacts -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.themed-decision-architecture ---- -# Generate all decision artifacts - -## Intent - -- outcome: Executable scenario: Generate all decision artifacts - -```gwt -Given the following deliverables: -And all decisions are tagged with theme, layer, and dependencies -When running "pnpm docs:decisions" -Then the following are generated: -``` diff --git a/specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-001-store-and-bus-readiness-harnesses-exist-before-tranche-1-implementation.sdp.md b/specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-001-store-and-bus-readiness-harnesses-exist-before-tranche-1-implementation.sdp.md deleted file mode 100644 index 78f3419b..00000000 --- a/specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-001-store-and-bus-readiness-harnesses-exist-before-tranche-1-implementation.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.tranche-0-readiness-harness-and-dependency-hardening.store-and-bus-readiness-harnesses-exist-before-tranche-1-implementation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.tranche-0-readiness-harness-and-dependency-hardening ---- -# Store and bus readiness harnesses exist before tranche 1 implementation - -## Intent - -- outcome: Executable scenario: Store and bus readiness harnesses exist before tranche 1 implementation - -```gwt -Given the following deliverables: -And the tranche-0 readiness packet is planned -When implementation begins -Then store and bus backend integration harnesses are both in scope -And later security and correctness packets treat them as prerequisites -``` diff --git a/specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-002-readiness-validation-remains-machine-verifiable.sdp.md b/specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-002-readiness-validation-remains-machine-verifiable.sdp.md deleted file mode 100644 index 3a88eb4e..00000000 --- a/specs/unimplemented/architect-scenarios/tranche-0-readiness-harness-and-dependency-hardening/s-002-readiness-validation-remains-machine-verifiable.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.tranche-0-readiness-harness-and-dependency-hardening.readiness-validation-remains-machine-verifiable -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.tranche-0-readiness-harness-and-dependency-hardening ---- -# Readiness validation remains machine-verifiable - -## Intent - -- outcome: Executable scenario: Readiness validation remains machine-verifiable - -```gwt -Given the following deliverables: -And the readiness packet deliverables -When the packet is validated -Then 'pnpm typecheck' and 'pnpm lint' remain required gates -And 'pnpm test:integration' includes the new store and bus harnesses -``` diff --git a/specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-001-release-governance-points-to-pdr-002.sdp.md b/specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-001-release-governance-points-to-pdr-002.sdp.md deleted file mode 100644 index ac1cb03f..00000000 --- a/specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-001-release-governance-points-to-pdr-002.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.tranche-0-release-ci-and-docs-process-guardrails.release-governance-points-to-pdr-002 -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.tranche-0-release-ci-and-docs-process-guardrails ---- -# Release governance points to PDR-002 - -## Intent - -- outcome: Executable scenario: Release governance points to PDR-002 - -```gwt -Given the following deliverables: -And a remediation packet under tranche 0 -When its release-governance source is documented -Then it points to 'libar-platform/architect/decisions/pdr-002-release-management-architecture.feature' -And no alternate release authority is introduced -``` diff --git a/specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-002-docs-only-changes-still-run-architect-guard-and-docs-generation.sdp.md b/specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-002-docs-only-changes-still-run-architect-guard-and-docs-generation.sdp.md deleted file mode 100644 index 9992c721..00000000 --- a/specs/unimplemented/architect-scenarios/tranche-0-release-ci-and-docs-process-guardrails/s-002-docs-only-changes-still-run-architect-guard-and-docs-generation.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.tranche-0-release-ci-and-docs-process-guardrails.docs-only-changes-still-run-architect-guard-and-docs-generation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.tranche-0-release-ci-and-docs-process-guardrails ---- -# Docs-only changes still run architect guard and docs generation - -## Intent - -- outcome: Executable scenario: Docs-only changes still run architect guard and docs generation - -```gwt -Given the following deliverables: -And a docs-or-spec-only remediation change -When CI evaluates the change -Then a dedicated workflow runs 'pnpm architect-guard --all --strict' -And the same workflow runs 'pnpm docs:all' -``` diff --git a/specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-001-supporting-cleanup-does-not-bypass-the-auth-keystone.sdp.md b/specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-001-supporting-cleanup-does-not-bypass-the-auth-keystone.sdp.md deleted file mode 100644 index 82b503f4..00000000 --- a/specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-001-supporting-cleanup-does-not-bypass-the-auth-keystone.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.tranche-1-supporting-security-and-contract-sweep.supporting-cleanup-does-not-bypass-the-auth-keystone -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.tranche-1-supporting-security-and-contract-sweep ---- -# Supporting cleanup does not bypass the auth keystone - -## Intent - -- outcome: Executable scenario: Supporting cleanup does not bypass the auth keystone - -```gwt -Given the following deliverables: -And the supporting tranche-1 packet is planned -When implementation begins -Then it assumes the component-boundary auth convention already exists -And it does not introduce alternate trust or correlation shortcuts -``` diff --git a/specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-002-supporting-contract-gaps-fail-closed-after-remediation.sdp.md b/specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-002-supporting-contract-gaps-fail-closed-after-remediation.sdp.md deleted file mode 100644 index b662852b..00000000 --- a/specs/unimplemented/architect-scenarios/tranche-1-supporting-security-and-contract-sweep/s-002-supporting-contract-gaps-fail-closed-after-remediation.sdp.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: spec:platform.tranche-1-supporting-security-and-contract-sweep.supporting-contract-gaps-fail-closed-after-remediation -kind: example -altitude: story -readiness: idea -relations: - refines: spec:platform.tranche-1-supporting-security-and-contract-sweep ---- -# Supporting contract gaps fail closed after remediation - -## Intent - -- outcome: Executable scenario: Supporting contract gaps fail closed after remediation - -```gwt -Given the following deliverables: -And the supporting tranche-1 packet is implemented -When legacy shortcut paths are exercised -Then each path fails with the expected error or rejection -And 'pnpm test:packages' plus 'pnpm test:integration' remain required gates -``` diff --git a/specs/unimplemented/current/phase-100-codec-driven-reference-generation.sdp.md b/specs/unimplemented/current/phase-100-codec-driven-reference-generation.sdp.md deleted file mode 100644 index f21fff26..00000000 --- a/specs/unimplemented/current/phase-100-codec-driven-reference-generation.sdp.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: spec:unimplemented.current.phase-100-codec-driven-reference-generation -kind: behavior -altitude: feature -readiness: idea -relations: - refines: spec:unimplemented.backlog ---- -# CodecDrivenReferenceGeneration - -## Intent - -CodecDrivenReferenceGeneration Purpose: Active work details for CodecDrivenReferenceGeneration --- Progress Progress: [█████░░░░░░░░░░░░░░░] 1/4 (25%) --- 🚧 Active Work 🚧 Process Enhancements Vision: Transform the delivery process from a documentation tool into a delivery operating system. Enable code-driven, multi-workflow documentation where code + .feature files are authoritative sources, and all artifacts are generated projections. Problem: Current delivery process capabilities are limited to document generation. The convergence roadmap identified 8 opportunities: Process Views as Projections, DoD as Machine-Checkable, Earned-Value Tracking, Requirements-Tests Traceability, Architecture Change Control, Progressive Governance, and Living Roadmap. Solution: Incrementally implement conve… - -- outcome: Non-implemented or in-flight work captured from docs-living/current/phase-100-codec-driven-reference-generation.md. diff --git a/specs/unimplemented/current/phase-100-themed-decision-architecture.sdp.md b/specs/unimplemented/current/phase-100-themed-decision-architecture.sdp.md deleted file mode 100644 index 2bfbf8b0..00000000 --- a/specs/unimplemented/current/phase-100-themed-decision-architecture.sdp.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: spec:unimplemented.current.phase-100-themed-decision-architecture -kind: behavior -altitude: feature -readiness: idea -relations: - refines: spec:unimplemented.backlog ---- -# ThemedDecisionArchitecture - -## Intent - -ThemedDecisionArchitecture Purpose: Active work details for ThemedDecisionArchitecture --- Progress Progress: [█████░░░░░░░░░░░░░░░] 1/4 (25%) --- 🚧 Active Work 🚧 Process Enhancements Vision: Transform the delivery process from a documentation tool into a delivery operating system. Enable code-driven, multi-workflow documentation where code + .feature files are authoritative sources, and all artifacts are generated projections. Problem: Current delivery process capabilities are limited to document generation. The convergence roadmap identified 8 opportunities: Process Views as Projections, DoD as Machine-Checkable, Earned-Value Tracking, Requirements-Tests Traceability, Architecture Change Control, Progressive Governance, and Living Roadmap. Solution: Incrementally implement convergence o… - -- outcome: Non-implemented or in-flight work captured from docs-living/current/phase-100-themed-decision-architecture.md. diff --git a/specs/unimplemented/current/phase-15-projection-categories-executable-tests.sdp.md b/specs/unimplemented/current/phase-15-projection-categories-executable-tests.sdp.md deleted file mode 100644 index 2e62d441..00000000 --- a/specs/unimplemented/current/phase-15-projection-categories-executable-tests.sdp.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: spec:unimplemented.current.phase-15-projection-categories-executable-tests -kind: behavior -altitude: feature -readiness: idea -relations: - refines: spec:unimplemented.backlog ---- -# ProjectionCategoriesExecutableTests - -## Intent - -ProjectionCategoriesExecutableTests Purpose: Active work details for ProjectionCategoriesExecutableTests --- Progress Progress: [░░░░░░░░░░░░░░░░░░░░] 0/3 (0%) --- 🚧 Active Work 🚧 Projection Categories Executable Tests As a platform developer I want projections classified into four distinct categories So that I can route queries and optimize projection behavior Acceptance Criteria PROJECTION_CATEGORIES tuple contains all valid categories - When I access PROJECTION_CATEGORIES - Then it contains exactly "logic", "view", "reporting", "integration" - And it is a readonly tuple isProjectionCategory validates category strings - When I call isProjectionCategory with " " - Then I receive Category helper functions identify correct categories - Given a projection category " " - Then isLogicProjecti… - -- outcome: Non-implemented or in-flight work captured from docs-living/current/phase-15-projection-categories-executable-tests.md. diff --git a/specs/unimplemented/current/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md b/specs/unimplemented/current/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md deleted file mode 100644 index 251e0314..00000000 --- a/specs/unimplemented/current/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: spec:unimplemented.current.phase-22-agent-as-bounded-context-ai-driven-event-reactors -kind: behavior -altitude: feature -readiness: idea -relations: - refines: spec:unimplemented.backlog ---- -# Agent as Bounded Context - AI-Driven Event Reactors - -## Intent - -Agent as Bounded Context - AI-Driven Event Reactors Purpose: Active work details for Agent as Bounded Context - AI-Driven Event Reactors --- Progress Progress: [███░░░░░░░░░░░░░░░░░] 1/6 (17%) --- 🚧 Active Work 🚧 Agent as Bounded Context - AI-Driven Event Reactors Agent as Bounded Context - AI-Driven Event Reactors Demonstrates the Agent as Bounded Context pattern where AI agents subscribe to domain events via EventBus and emit commands based on pattern detection. Architecture Overview ┌─────────────────────────────────────────────────────────────────────────┐ │ EventBus │ │ (publishes OrderCancelled, OrderRefunded, OrderComplaintFiled, etc.) │ └────────────────────────────────┬────────────────────────────────────────┘ │ subscribe ▼ ┌───────────────────────────────────────────────────────… - -- outcome: Non-implemented or in-flight work captured from docs-living/current/phase-22-agent-as-bounded-context-ai-driven-event-reactors.md. diff --git a/specs/unimplemented/current/phase-22-agent-as-bounded-context.sdp.md b/specs/unimplemented/current/phase-22-agent-as-bounded-context.sdp.md deleted file mode 100644 index 9856c94f..00000000 --- a/specs/unimplemented/current/phase-22-agent-as-bounded-context.sdp.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: spec:unimplemented.current.phase-22-agent-as-bounded-context -kind: behavior -altitude: feature -readiness: idea -relations: - refines: spec:unimplemented.backlog ---- -# AgentAsBoundedContext - -## Intent - -AgentAsBoundedContext Purpose: Active work details for AgentAsBoundedContext --- Progress Progress: [░░░░░░░░░░░░░░░░░░░░] 0/1 (0%) --- 🚧 Active Work 🚧 Agent As Bounded Context Problem: AI agents are invoked manually without integration into the event-driven architecture. No pattern for agents to react to business events. Solution: AI agents implemented as bounded contexts that: 1. Subscribe to event streams via EventBus 2. Detect patterns across events using LLM or rules 3. Emit commands based on detected patterns This is the culminating pattern demonstrating full platform integration. Why It Matters for Convex-Native ES: Architectural Decisions: @convex-dev/agent Integration: Agent BC uses @convex-dev/agent for LLM reasoning while maintaining its own state model. Integration Pattern: ""… - -- outcome: Non-implemented or in-flight work captured from docs-living/current/phase-22-agent-as-bounded-context.md. diff --git a/specs/unimplemented/current/phase-22-agent-churn-risk-completion.sdp.md b/specs/unimplemented/current/phase-22-agent-churn-risk-completion.sdp.md deleted file mode 100644 index 844f1304..00000000 --- a/specs/unimplemented/current/phase-22-agent-churn-risk-completion.sdp.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: spec:unimplemented.current.phase-22-agent-churn-risk-completion -kind: behavior -altitude: feature -readiness: idea -relations: - refines: spec:unimplemented.backlog ---- -# AgentChurnRiskCompletion - -## Intent - -AgentChurnRiskCompletion Purpose: Active work details for AgentChurnRiskCompletion --- Progress Progress: [██████████░░░░░░░░░░] 3/6 (50%) --- 🚧 Active Work 🚧 Agent BC Component Isolation Problem: Agent BC tables ( agentCheckpoints , agentAuditEvents , agentDeadLetters , agentCommands , pendingApprovals ) reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. Solution: Implement agent as a proper Convex component: 1. defineComponent("agent") with isolated schema and private tables 2. Public API handlers for checkpoint, audit, dead letter, and command operations 3. Cross-component query pattern for… - -- outcome: Non-implemented or in-flight work captured from docs-living/current/phase-22-agent-churn-risk-completion.md. diff --git a/specs/unimplemented/current/phase-22-confirmed-order-cancellation.sdp.md b/specs/unimplemented/current/phase-22-confirmed-order-cancellation.sdp.md deleted file mode 100644 index 68790a39..00000000 --- a/specs/unimplemented/current/phase-22-confirmed-order-cancellation.sdp.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: spec:unimplemented.current.phase-22-confirmed-order-cancellation -kind: behavior -altitude: feature -readiness: idea -relations: - refines: spec:unimplemented.backlog ---- -# ConfirmedOrderCancellation - -## Intent - -ConfirmedOrderCancellation Purpose: Active work details for ConfirmedOrderCancellation --- Progress Progress: [██████████░░░░░░░░░░] 3/6 (50%) --- 🚧 Active Work 🚧 Agent BC Component Isolation Problem: Agent BC tables ( agentCheckpoints , agentAuditEvents , agentDeadLetters , agentCommands , pendingApprovals ) reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. Solution: Implement agent as a proper Convex component: 1. defineComponent("agent") with isolated schema and private tables 2. Public API handlers for checkpoint, audit, dead letter, and command operations 3. Cross-component query pattern… - -- outcome: Non-implemented or in-flight work captured from docs-living/current/phase-22-confirmed-order-cancellation.md. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-001-create-admin-directory.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-001-create-admin-directory.sdp.md index dacf309c..ab958cd0 100644 --- a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-001-create-admin-directory.sdp.md +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-001-create-admin-directory.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Create admin/ directory at examples/order-management/convex/admin/ +- outcome: Capture the still-unimplemented deliverable "Create admin/ directory" until it is authored to a higher readiness rung. - problem: Admin functionality is scattered across the codebase: - Dead letter queue at 'convex/projections/deadLetters.ts' - Saga admin at 'convex/sagas/admin.ts' - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-002-projection-admin-endpoints.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-002-projection-admin-endpoints.sdp.md index eccc4b82..186274e5 100644 --- a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-002-projection-admin-endpoints.sdp.md +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-002-projection-admin-endpoints.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Projection admin endpoints at examples/order-management/convex/admin/projections +- outcome: Capture the still-unimplemented deliverable "Projection admin endpoints" until it is authored to a higher readiness rung. - problem: Admin functionality is scattered across the codebase: - Dead letter queue at 'convex/projections/deadLetters.ts' - Saga admin at 'convex/sagas/admin.ts' - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-003-refactored-dlq-endpoints.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-003-refactored-dlq-endpoints.sdp.md index 34ebe5a5..e059b9e0 100644 --- a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-003-refactored-dlq-endpoints.sdp.md +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-003-refactored-dlq-endpoints.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Refactored DLQ endpoints at examples/order-management/convex/admin/deadLetters +- outcome: Capture the still-unimplemented deliverable "Refactored DLQ endpoints" until it is authored to a higher readiness rung. - problem: Admin functionality is scattered across the codebase: - Dead letter queue at 'convex/projections/deadLetters.ts' - Saga admin at 'convex/sagas/admin.ts' - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-004-event-flow-trace-query.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-004-event-flow-trace-query.sdp.md index c08c67f9..fbf43dcc 100644 --- a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-004-event-flow-trace-query.sdp.md +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-004-event-flow-trace-query.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Event flow trace query at examples/order-management/convex/admin/diagnostics +- outcome: Capture the still-unimplemented deliverable "Event flow trace query" until it is authored to a higher readiness rung. - problem: Admin functionality is scattered across the codebase: - Dead letter queue at 'convex/projections/deadLetters.ts' - Saga admin at 'convex/sagas/admin.ts' - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-005-system-state-snapshot-query.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-005-system-state-snapshot-query.sdp.md index 47b81089..d763f1b6 100644 --- a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-005-system-state-snapshot-query.sdp.md +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-005-system-state-snapshot-query.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: System state snapshot query at examples/order-management/convex/admin/diagnostics +- outcome: Capture the still-unimplemented deliverable "System state snapshot query" until it is authored to a higher readiness rung. - problem: Admin functionality is scattered across the codebase: - Dead letter queue at 'convex/projections/deadLetters.ts' - Saga admin at 'convex/sagas/admin.ts' - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-006-durable-function-run-queries.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-006-durable-function-run-queries.sdp.md index 76ae6d0c..0d611000 100644 --- a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-006-durable-function-run-queries.sdp.md +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-006-durable-function-run-queries.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Durable function run queries at examples/order-management/convex/admin/durableFunctions +- outcome: Capture the still-unimplemented deliverable "Durable function run queries" until it is authored to a higher readiness rung. - problem: Admin functionality is scattered across the codebase: - Dead letter queue at 'convex/projections/deadLetters.ts' - Saga admin at 'convex/sagas/admin.ts' - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-007-admin-authorization-wrapper.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-007-admin-authorization-wrapper.sdp.md index f227b197..eaea542b 100644 --- a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-007-admin-authorization-wrapper.sdp.md +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-007-admin-authorization-wrapper.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Admin authorization wrapper at examples/order-management/convex/admin/_auth +- outcome: Capture the still-unimplemented deliverable "Admin authorization wrapper" until it is authored to a higher readiness rung. - problem: Admin functionality is scattered across the codebase: - Dead letter queue at 'convex/projections/deadLetters.ts' - Saga admin at 'convex/sagas/admin.ts' - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. diff --git a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-008-admin-api-documentation.sdp.md b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-008-admin-api-documentation.sdp.md index f4593186..bbff3518 100644 --- a/specs/unimplemented/deliverables/admin-tooling-consolidation/d-008-admin-api-documentation.sdp.md +++ b/specs/unimplemented/deliverables/admin-tooling-consolidation/d-008-admin-api-documentation.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Admin API documentation at docs/operations/ADMIN-API +- outcome: Capture the still-unimplemented deliverable "Admin API documentation" until it is authored to a higher readiness rung. - problem: Admin functionality is scattered across the codebase: - Dead letter queue at 'convex/projections/deadLetters.ts' - Saga admin at 'convex/sagas/admin.ts' - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-001-high-value-agent-config.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-001-high-value-agent-config.sdp.md index 874d4528..d60e09e0 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-001-high-value-agent-config.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-001-high-value-agent-config.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: High-value agent config at order-management/convex/contexts/agent/high-value/_config +- outcome: Capture the still-unimplemented deliverable "High-value agent config" until it is authored to a higher readiness rung. - problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-002-high-value-pattern-definition.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-002-high-value-pattern-definition.sdp.md index df18abf0..918035c3 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-002-high-value-pattern-definition.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-002-high-value-pattern-definition.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: High-value pattern definition at order-management/convex/contexts/agent/high-value/_patterns/highValueOrder +- outcome: Capture the still-unimplemented deliverable "High-value pattern definition" until it is authored to a higher readiness rung. - problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-003-high-value-action-handler.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-003-high-value-action-handler.sdp.md index 66eb009f..84ee1c2c 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-003-high-value-action-handler.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-003-high-value-action-handler.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: High-value action handler at order-management/convex/contexts/agent/high-value/handlers/analyzeEvent +- outcome: Capture the still-unimplemented deliverable "High-value action handler" until it is authored to a higher readiness rung. - problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-004-high-value-on-complete-handler.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-004-high-value-on-complete-handler.sdp.md index f6b01184..06bc5e92 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-004-high-value-on-complete-handler.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-004-high-value-on-complete-handler.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: High-value onComplete handler at order-management/convex/contexts/agent/high-value/handlers/onComplete +- outcome: Capture the still-unimplemented deliverable "High-value onComplete handler" until it is authored to a higher readiness rung. - problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-005-high-value-command-route.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-005-high-value-command-route.sdp.md index ead93f47..fb8058d7 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-005-high-value-command-route.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-005-high-value-command-route.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: High-value command route at order-management/convex/contexts/agent/high-value/handlers/routeCommand +- outcome: Capture the still-unimplemented deliverable "High-value command route" until it is authored to a higher readiness rung. - problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-006-high-value-event-bus-subscription.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-006-high-value-event-bus-subscription.sdp.md index 1afa37f2..cdf4b864 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-006-high-value-event-bus-subscription.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-006-high-value-event-bus-subscription.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: High-value EventBus subscription at order-management/convex/eventSubscriptions +- outcome: Capture the still-unimplemented deliverable "High-value EventBus subscription" until it is authored to a higher readiness rung. - problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-007-high-value-integration-test-real-llm.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-007-high-value-integration-test-real-llm.sdp.md index 417d9f41..1d79c87b 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-007-high-value-integration-test-real-llm.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-007-high-value-integration-test-real-llm.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: High-value integration test (real LLM) at order-management/tests/integration/agent/high-value-order +- outcome: Capture the still-unimplemented deliverable "High-value integration test (real LLM)" until it is authored to a higher readiness rung. - problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-008-dead-letter-management-section-in-monitoring.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-008-dead-letter-management-section-in-monitoring.sdp.md index dc31f53c..9e8b8133 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-008-dead-letter-management-section-in-monitoring.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-008-dead-letter-management-section-in-monitoring.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Dead letter management section in Monitoring at apps/frontend/app/admin/agents +- outcome: Capture the still-unimplemented deliverable "Dead letter management section in Monitoring" until it is authored to a higher readiness rung. - problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-009-use-dead-letters-hook.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-009-use-dead-letters-hook.sdp.md index a2c34c31..24648bfd 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-009-use-dead-letters-hook.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-009-use-dead-letters-hook.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: useDeadLetters hook at apps/frontend/hooks/use-dead-letters +- outcome: Capture the still-unimplemented deliverable "useDeadLetters hook" until it is authored to a higher readiness rung. - problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-010-use-dead-letter-actions-hook.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-010-use-dead-letter-actions-hook.sdp.md index 0d75bbb3..4abc9ff4 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-010-use-dead-letter-actions-hook.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-010-use-dead-letter-actions-hook.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: useDeadLetterActions hook at apps/frontend/hooks/use-dead-letter-actions +- outcome: Capture the still-unimplemented deliverable "useDeadLetterActions hook" until it is authored to a higher readiness rung. - problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-011-decision-history-tab.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-011-decision-history-tab.sdp.md index 2503bae4..0c5b6342 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-011-decision-history-tab.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-011-decision-history-tab.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Decision history tab at apps/frontend/app/admin/agents +- outcome: Capture the still-unimplemented deliverable "Decision history tab" until it is authored to a higher readiness rung. - problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-012-use-decision-history-hook-with-filters.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-012-use-decision-history-hook-with-filters.sdp.md index 8affc589..5ff8ba04 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-012-use-decision-history-hook-with-filters.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-012-use-decision-history-hook-with-filters.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: useDecisionHistory hook with filters at apps/frontend/hooks/use-decision-history +- outcome: Capture the still-unimplemented deliverable "useDecisionHistory hook with filters" until it is authored to a higher readiness rung. - problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-013-toast-notification-integration-sonner.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-013-toast-notification-integration-sonner.sdp.md index ada9f18b..9da3840f 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-013-toast-notification-integration-sonner.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-013-toast-notification-integration-sonner.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Toast notification integration (Sonner) at apps/frontend/components/toast-provider +- outcome: Capture the still-unimplemented deliverable "Toast notification integration (Sonner)" until it is authored to a higher readiness rung. - problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-014-action-feedback-toasts.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-014-action-feedback-toasts.sdp.md index a4959884..acc81cd8 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-014-action-feedback-toasts.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-014-action-feedback-toasts.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Action feedback toasts at apps/frontend/hooks/use-approval-actions +- outcome: Capture the still-unimplemented deliverable "Action feedback toasts" until it is authored to a higher readiness rung. - problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-015-dashboard-update-for-multi-agent.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-015-dashboard-update-for-multi-agent.sdp.md index f1be8c22..9435c2fd 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-015-dashboard-update-for-multi-agent.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-015-dashboard-update-for-multi-agent.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Dashboard update for multi-agent at apps/frontend/app/admin/agents +- outcome: Capture the still-unimplemented deliverable "Dashboard update for multi-agent" until it is authored to a higher readiness rung. - problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-016-e2-e-step-definitions.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-016-e2-e-step-definitions.sdp.md index 89342635..65907517 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-016-e2-e-step-definitions.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-016-e2-e-step-definitions.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: E2E step definitions at apps/frontend/tests/e2e/steps/agent +- outcome: Capture the still-unimplemented deliverable "E2E step definitions" until it is authored to a higher readiness rung. - problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-017-agent-admin-page-page-object.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-017-agent-admin-page-page-object.sdp.md index 8d2740c0..6f7777f0 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-017-agent-admin-page-page-object.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-017-agent-admin-page-page-object.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: AgentAdminPage page object at apps/frontend/tests/e2e/support/pages/AgentAdminPage +- outcome: Capture the still-unimplemented deliverable "AgentAdminPage page object" until it is authored to a higher readiness rung. - problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-018-tag-unimplemented-agent-e2e-scenarios-skip.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-018-tag-unimplemented-agent-e2e-scenarios-skip.sdp.md index 6e582a37..b5d85ae2 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-018-tag-unimplemented-agent-e2e-scenarios-skip.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-018-tag-unimplemented-agent-e2e-scenarios-skip.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Tag unimplemented agent e2e scenarios @skip at apps/frontend/tests/e2e/features/admin/agent-approvals +- outcome: Capture the still-unimplemented deliverable "Tag unimplemented agent e2e scenarios @skip" until it is authored to a higher readiness rung. - problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-admin-frontend/d-019-auth-integration-documentation.sdp.md b/specs/unimplemented/deliverables/agent-admin-frontend/d-019-auth-integration-documentation.sdp.md index 919e21d5..f3c44d7a 100644 --- a/specs/unimplemented/deliverables/agent-admin-frontend/d-019-auth-integration-documentation.sdp.md +++ b/specs/unimplemented/deliverables/agent-admin-frontend/d-019-auth-integration-documentation.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Auth integration documentation at apps/frontend/hooks/use-reviewer-id +- outcome: Capture the still-unimplemented deliverable "Auth integration documentation" until it is authored to a higher readiness rung. - problem: The admin UI at '/admin/agents' has implementation gaps identified in the E2E feature file ('agent-approvals.feature') and investigation: 1. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-001-agent-component-definition.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-001-agent-component-definition.sdp.md index 7c1d23e7..ac250633 100644 --- a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-001-agent-component-definition.sdp.md +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-001-agent-component-definition.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Agent component definition at @libar-dev/platform-core/src/agent/component/convex +- outcome: Capture the still-unimplemented deliverable "Agent component definition" until it is authored to a higher readiness rung. - problem: Agent BC tables ('agentCheckpoints', 'agentAuditEvents', 'agentDeadLetters', 'agentCommands', 'pendingApprovals') reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-002-agent-component-schema.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-002-agent-component-schema.sdp.md index 1db79545..c040ecf8 100644 --- a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-002-agent-component-schema.sdp.md +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-002-agent-component-schema.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Agent component schema at @libar-dev/platform-core/src/agent/component/schema +- outcome: Capture the still-unimplemented deliverable "Agent component schema" until it is authored to a higher readiness rung. - problem: Agent BC tables ('agentCheckpoints', 'agentAuditEvents', 'agentDeadLetters', 'agentCommands', 'pendingApprovals') reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-003-checkpoint-public-api.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-003-checkpoint-public-api.sdp.md index da78921b..31408059 100644 --- a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-003-checkpoint-public-api.sdp.md +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-003-checkpoint-public-api.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Checkpoint public API at @libar-dev/platform-core/src/agent/component/checkpoints +- outcome: Capture the still-unimplemented deliverable "Checkpoint public API" until it is authored to a higher readiness rung. - problem: Agent BC tables ('agentCheckpoints', 'agentAuditEvents', 'agentDeadLetters', 'agentCommands', 'pendingApprovals') reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-004-audit-public-api.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-004-audit-public-api.sdp.md index 8acdf79f..0f4c0723 100644 --- a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-004-audit-public-api.sdp.md +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-004-audit-public-api.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Audit public API at @libar-dev/platform-core/src/agent/component/audit +- outcome: Capture the still-unimplemented deliverable "Audit public API" until it is authored to a higher readiness rung. - problem: Agent BC tables ('agentCheckpoints', 'agentAuditEvents', 'agentDeadLetters', 'agentCommands', 'pendingApprovals') reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-005-dead-letter-public-api.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-005-dead-letter-public-api.sdp.md index 47bba4c5..9f2281bc 100644 --- a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-005-dead-letter-public-api.sdp.md +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-005-dead-letter-public-api.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Dead letter public API at @libar-dev/platform-core/src/agent/component/deadLetters +- outcome: Capture the still-unimplemented deliverable "Dead letter public API" until it is authored to a higher readiness rung. - problem: Agent BC tables ('agentCheckpoints', 'agentAuditEvents', 'agentDeadLetters', 'agentCommands', 'pendingApprovals') reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-006-command-public-api.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-006-command-public-api.sdp.md index 7a0e1218..f7110fcc 100644 --- a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-006-command-public-api.sdp.md +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-006-command-public-api.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Command public API at @libar-dev/platform-core/src/agent/component/commands +- outcome: Capture the still-unimplemented deliverable "Command public API" until it is authored to a higher readiness rung. - problem: Agent BC tables ('agentCheckpoints', 'agentAuditEvents', 'agentDeadLetters', 'agentCommands', 'pendingApprovals') reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-007-approval-public-api.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-007-approval-public-api.sdp.md index 065f3c02..ef5cbac9 100644 --- a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-007-approval-public-api.sdp.md +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-007-approval-public-api.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Approval public API at @libar-dev/platform-core/src/agent/component/approvals +- outcome: Capture the still-unimplemented deliverable "Approval public API" until it is authored to a higher readiness rung. - problem: Agent BC tables ('agentCheckpoints', 'agentAuditEvents', 'agentDeadLetters', 'agentCommands', 'pendingApprovals') reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. diff --git a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-008-cross-component-query-pattern.sdp.md b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-008-cross-component-query-pattern.sdp.md index 3a9c4cc3..08a5f327 100644 --- a/specs/unimplemented/deliverables/agent-bc-component-isolation/d-008-cross-component-query-pattern.sdp.md +++ b/specs/unimplemented/deliverables/agent-bc-component-isolation/d-008-cross-component-query-pattern.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Cross-component query pattern at @libar-dev/platform-core/src/agent/cross-bc-query +- outcome: Capture the still-unimplemented deliverable "Cross-component query pattern" until it is authored to a higher readiness rung. - problem: Agent BC tables ('agentCheckpoints', 'agentAuditEvents', 'agentDeadLetters', 'agentCommands', 'pendingApprovals') reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-001-agent-action-handler-factory.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-001-agent-action-handler-factory.sdp.md index 29ccf4e1..e38d1c62 100644 --- a/specs/unimplemented/deliverables/agent-llm-integration/d-001-agent-action-handler-factory.sdp.md +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-001-agent-action-handler-factory.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Agent action handler factory at @libar-dev/platform-core/src/agent/action-handler +- outcome: Capture the still-unimplemented deliverable "Agent action handler factory" until it is authored to a higher readiness rung. - problem: The agent event handler ('handleChurnRiskEvent') is a Convex mutation that cannot call external APIs. The LLM runtime ('_llm/runtime.ts') exists with OpenRouter integration but is never invoked because mutations cannot make HTTP calls. Additionally, rate limiting config exists as types only — no runtime enforcement protects against runaway LLM costs. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-002-llm-integrated-on-complete-handler.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-002-llm-integrated-on-complete-handler.sdp.md index 90ade634..fa0a0c67 100644 --- a/specs/unimplemented/deliverables/agent-llm-integration/d-002-llm-integrated-on-complete-handler.sdp.md +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-002-llm-integrated-on-complete-handler.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: LLM-integrated onComplete handler at @libar-dev/platform-core/src/agent/oncomplete-handler +- outcome: Capture the still-unimplemented deliverable "LLM-integrated onComplete handler" until it is authored to a higher readiness rung. - problem: The agent event handler ('handleChurnRiskEvent') is a Convex mutation that cannot call external APIs. The LLM runtime ('_llm/runtime.ts') exists with OpenRouter integration but is never invoked because mutations cannot make HTTP calls. Additionally, rate limiting config exists as types only — no runtime enforcement protects against runaway LLM costs. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-003-rate-limiter-integration.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-003-rate-limiter-integration.sdp.md index 4cb577c2..3595e697 100644 --- a/specs/unimplemented/deliverables/agent-llm-integration/d-003-rate-limiter-integration.sdp.md +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-003-rate-limiter-integration.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Rate limiter integration at @libar-dev/platform-core/src/agent/rate-limiter +- outcome: Capture the still-unimplemented deliverable "Rate limiter integration" until it is authored to a higher readiness rung. - problem: The agent event handler ('handleChurnRiskEvent') is a Convex mutation that cannot call external APIs. The LLM runtime ('_llm/runtime.ts') exists with OpenRouter integration but is never invoked because mutations cannot make HTTP calls. Additionally, rate limiting config exists as types only — no runtime enforcement protects against runaway LLM costs. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-004-cost-budget-tracking.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-004-cost-budget-tracking.sdp.md index 8cf36dc1..fa861b99 100644 --- a/specs/unimplemented/deliverables/agent-llm-integration/d-004-cost-budget-tracking.sdp.md +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-004-cost-budget-tracking.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Cost budget tracking at @libar-dev/platform-core/src/agent/cost-budget +- outcome: Capture the still-unimplemented deliverable "Cost budget tracking" until it is authored to a higher readiness rung. - problem: The agent event handler ('handleChurnRiskEvent') is a Convex mutation that cannot call external APIs. The LLM runtime ('_llm/runtime.ts') exists with OpenRouter integration but is never invoked because mutations cannot make HTTP calls. Additionally, rate limiting config exists as types only — no runtime enforcement protects against runaway LLM costs. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-005-convex-dev-agent-thread-adapter.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-005-convex-dev-agent-thread-adapter.sdp.md index a370f4e2..7f4f5e79 100644 --- a/specs/unimplemented/deliverables/agent-llm-integration/d-005-convex-dev-agent-thread-adapter.sdp.md +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-005-convex-dev-agent-thread-adapter.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: @convex-dev/agent thread adapter at @libar-dev/platform-core/src/agent/thread-adapter +- outcome: Capture the still-unimplemented deliverable "@convex-dev/agent thread adapter" until it is authored to a higher readiness rung. - problem: The agent event handler ('handleChurnRiskEvent') is a Convex mutation that cannot call external APIs. The LLM runtime ('_llm/runtime.ts') exists with OpenRouter integration but is never invoked because mutations cannot make HTTP calls. Additionally, rate limiting config exists as types only — no runtime enforcement protects against runaway LLM costs. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-006-on-complete-in-create-agent-subscription-options.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-006-on-complete-in-create-agent-subscription-options.sdp.md index 8ef26a25..95474196 100644 --- a/specs/unimplemented/deliverables/agent-llm-integration/d-006-on-complete-in-create-agent-subscription-options.sdp.md +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-006-on-complete-in-create-agent-subscription-options.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: onComplete in CreateAgentSubscriptionOptions at @libar-dev/platform-bus/src/agent-subscription +- outcome: Capture the still-unimplemented deliverable "onComplete in CreateAgentSubscriptionOptions" until it is authored to a higher readiness rung. - problem: The agent event handler ('handleChurnRiskEvent') is a Convex mutation that cannot call external APIs. The LLM runtime ('_llm/runtime.ts') exists with OpenRouter integration but is never invoked because mutations cannot make HTTP calls. Additionally, rate limiting config exists as types only — no runtime enforcement protects against runaway LLM costs. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-007-circuit-breaker-for-llm.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-007-circuit-breaker-for-llm.sdp.md index ff3f89f4..3e28049a 100644 --- a/specs/unimplemented/deliverables/agent-llm-integration/d-007-circuit-breaker-for-llm.sdp.md +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-007-circuit-breaker-for-llm.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Circuit breaker for LLM at @libar-dev/platform-core/src/agent/circuit-breaker +- outcome: Capture the still-unimplemented deliverable "Circuit breaker for LLM" until it is authored to a higher readiness rung. - problem: The agent event handler ('handleChurnRiskEvent') is a Convex mutation that cannot call external APIs. The LLM runtime ('_llm/runtime.ts') exists with OpenRouter integration but is never invoked because mutations cannot make HTTP calls. Additionally, rate limiting config exists as types only — no runtime enforcement protects against runaway LLM costs. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-008-agent-workpool-configuration.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-008-agent-workpool-configuration.sdp.md index 3f7e2fe6..1880e146 100644 --- a/specs/unimplemented/deliverables/agent-llm-integration/d-008-agent-workpool-configuration.sdp.md +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-008-agent-workpool-configuration.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Agent workpool configuration at examples/order-management/convex/convex +- outcome: Capture the still-unimplemented deliverable "Agent workpool configuration" until it is authored to a higher readiness rung. - problem: The agent event handler ('handleChurnRiskEvent') is a Convex mutation that cannot call external APIs. The LLM runtime ('_llm/runtime.ts') exists with OpenRouter integration but is never invoked because mutations cannot make HTTP calls. Additionally, rate limiting config exists as types only — no runtime enforcement protects against runaway LLM costs. diff --git a/specs/unimplemented/deliverables/agent-llm-integration/d-009-action-mutation-integration-test.sdp.md b/specs/unimplemented/deliverables/agent-llm-integration/d-009-action-mutation-integration-test.sdp.md index 886eca58..51502d30 100644 --- a/specs/unimplemented/deliverables/agent-llm-integration/d-009-action-mutation-integration-test.sdp.md +++ b/specs/unimplemented/deliverables/agent-llm-integration/d-009-action-mutation-integration-test.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Action/mutation integration test at platform-core/tests/integration/agent/action-split +- outcome: Capture the still-unimplemented deliverable "Action/mutation integration test" until it is authored to a higher readiness rung. - problem: The agent event handler ('handleChurnRiskEvent') is a Convex mutation that cannot call external APIs. The LLM runtime ('_llm/runtime.ts') exists with OpenRouter integration but is never invoked because mutations cannot make HTTP calls. Additionally, rate limiting config exists as types only — no runtime enforcement protects against runaway LLM costs. diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-001-circuit-breaker-state-machine-pure.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-001-circuit-breaker-state-machine-pure.sdp.md index a5da0306..f491e0a4 100644 --- a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-001-circuit-breaker-state-machine-pure.sdp.md +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-001-circuit-breaker-state-machine-pure.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Circuit breaker state machine (pure) at @libar-dev/platform-core/src/monitoring/circuit-breaker/stateMachine +- outcome: Capture the still-unimplemented deliverable "Circuit breaker state machine (pure)" until it is authored to a higher readiness rung. - problem: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-002-circuit-breaker-types.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-002-circuit-breaker-types.sdp.md index 56c5369e..b3a142bd 100644 --- a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-002-circuit-breaker-types.sdp.md +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-002-circuit-breaker-types.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Circuit breaker types at @libar-dev/platform-core/src/monitoring/circuit-breaker/types +- outcome: Capture the still-unimplemented deliverable "Circuit breaker types" until it is authored to a higher readiness rung. - problem: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-003-circuit-breakers-table-schema.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-003-circuit-breakers-table-schema.sdp.md index a29f2291..f4fe90ab 100644 --- a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-003-circuit-breakers-table-schema.sdp.md +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-003-circuit-breakers-table-schema.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: circuitBreakers table schema at examples/order-management/convex/schema +- outcome: Capture the still-unimplemented deliverable "circuitBreakers table schema" until it is authored to a higher readiness rung. - problem: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-004-with-circuit-breaker-wrapper.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-004-with-circuit-breaker-wrapper.sdp.md index e89283bd..f0a75b91 100644 --- a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-004-with-circuit-breaker-wrapper.sdp.md +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-004-with-circuit-breaker-wrapper.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: withCircuitBreaker wrapper at @libar-dev/platform-core/src/monitoring/circuit-breaker/withCircuitBreaker +- outcome: Capture the still-unimplemented deliverable "withCircuitBreaker wrapper" until it is authored to a higher readiness rung. - problem: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-005-load-circuit-state-query.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-005-load-circuit-state-query.sdp.md index 3a3c1e9b..2ec933bb 100644 --- a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-005-load-circuit-state-query.sdp.md +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-005-load-circuit-state-query.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: loadCircuitState query at examples/order-management/convex/monitoring/circuitBreakers +- outcome: Capture the still-unimplemented deliverable "loadCircuitState query" until it is authored to a higher readiness rung. - problem: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-006-record-success-mutation.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-006-record-success-mutation.sdp.md index 483cf911..28849b97 100644 --- a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-006-record-success-mutation.sdp.md +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-006-record-success-mutation.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: recordSuccess mutation at examples/order-management/convex/monitoring/circuitBreakers +- outcome: Capture the still-unimplemented deliverable "recordSuccess mutation" until it is authored to a higher readiness rung. - problem: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-007-record-failure-mutation.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-007-record-failure-mutation.sdp.md index e4512d13..6c345a01 100644 --- a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-007-record-failure-mutation.sdp.md +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-007-record-failure-mutation.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: recordFailure mutation at examples/order-management/convex/monitoring/circuitBreakers +- outcome: Capture the still-unimplemented deliverable "recordFailure mutation" until it is authored to a higher readiness rung. - problem: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-008-check-half-open-scheduled-mutation.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-008-check-half-open-scheduled-mutation.sdp.md index d14a8f92..51b9eb6a 100644 --- a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-008-check-half-open-scheduled-mutation.sdp.md +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-008-check-half-open-scheduled-mutation.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: checkHalfOpen scheduled mutation at examples/order-management/convex/monitoring/circuitBreakers +- outcome: Capture the still-unimplemented deliverable "checkHalfOpen scheduled mutation" until it is authored to a higher readiness rung. - problem: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-009-on-circuit-probe-complete-handler.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-009-on-circuit-probe-complete-handler.sdp.md index f8f8a1af..38447f23 100644 --- a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-009-on-circuit-probe-complete-handler.sdp.md +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-009-on-circuit-probe-complete-handler.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: onCircuitProbeComplete handler at examples/order-management/convex/monitoring/circuitBreakers +- outcome: Capture the still-unimplemented deliverable "onCircuitProbeComplete handler" until it is authored to a higher readiness rung. - problem: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back diff --git a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-010-circuit-breaker-metrics.sdp.md b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-010-circuit-breaker-metrics.sdp.md index 15dbeb85..bf98a746 100644 --- a/specs/unimplemented/deliverables/circuit-breaker-pattern/d-010-circuit-breaker-metrics.sdp.md +++ b/specs/unimplemented/deliverables/circuit-breaker-pattern/d-010-circuit-breaker-metrics.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Circuit breaker metrics at examples/order-management/convex/monitoring/circuitBreakers +- outcome: Capture the still-unimplemented deliverable "Circuit breaker metrics" until it is authored to a higher readiness rung. - problem: External API failures (Stripe, SendGrid, webhooks) cascade through the system. Without automatic isolation: - Action budget is wasted on calls destined to fail - Users experience long timeouts instead of fast failures - Partial outages become full outages via resource exhaustion - No automatic recovery testing when service comes back diff --git a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-001-pdr-014-placeholder.sdp.md b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-001-pdr-014-placeholder.sdp.md index b9cb3747..87bf2f98 100644 --- a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-001-pdr-014-placeholder.sdp.md +++ b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-001-pdr-014-placeholder.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: PDR-014 placeholder at libar-platform/architect/decisions/pdr-014-component-boundary-authentication-convention +- outcome: Capture the still-unimplemented deliverable "PDR-014 placeholder" until it is authored to a higher readiness rung. - problem: Identity-bearing component mutations still trust caller-provided actor fields without a canonical component-side proof contract. Fixing the affected mutations piecemeal would create drift and leave a mixed-trust window across approvals, audit, and event append flows. diff --git a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-002-canonical-verification-proof-contract.sdp.md b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-002-canonical-verification-proof-contract.sdp.md index e346cf37..f6164338 100644 --- a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-002-canonical-verification-proof-contract.sdp.md +++ b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-002-canonical-verification-proof-contract.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Canonical verificationProof contract at PDR-014 and platform-core security surfaces +- outcome: Capture the still-unimplemented deliverable "Canonical verificationProof contract" until it is authored to a higher readiness rung. - problem: Identity-bearing component mutations still trust caller-provided actor fields without a canonical component-side proof contract. Fixing the affected mutations piecemeal would create drift and leave a mixed-trust window across approvals, audit, and event append flows. diff --git a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-003-verify-actor-helper.sdp.md b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-003-verify-actor-helper.sdp.md index df0d5d47..0fd1e65c 100644 --- a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-003-verify-actor-helper.sdp.md +++ b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-003-verify-actor-helper.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: verifyActor helper at libar-platform/packages/platform-core/ +- outcome: Capture the still-unimplemented deliverable "verifyActor helper" until it is authored to a higher readiness rung. - problem: Identity-bearing component mutations still trust caller-provided actor fields without a canonical component-side proof contract. Fixing the affected mutations piecemeal would create drift and leave a mixed-trust window across approvals, audit, and event append flows. diff --git a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-004-identity-bearing-mutation-migration.sdp.md b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-004-identity-bearing-mutation-migration.sdp.md index 4930d5f8..f8ca25ab 100644 --- a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-004-identity-bearing-mutation-migration.sdp.md +++ b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-004-identity-bearing-mutation-migration.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Identity-bearing mutation migration at approve, reject, audit +- outcome: Capture the still-unimplemented deliverable "Identity-bearing mutation migration" until it is authored to a higher readiness rung. - problem: Identity-bearing component mutations still trust caller-provided actor fields without a canonical component-side proof contract. Fixing the affected mutations piecemeal would create drift and leave a mixed-trust window across approvals, audit, and event append flows. diff --git a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-005-contract-status-tagging-for-system-only-exceptions.sdp.md b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-005-contract-status-tagging-for-system-only-exceptions.sdp.md index af24c7ed..a26739ba 100644 --- a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-005-contract-status-tagging-for-system-only-exceptions.sdp.md +++ b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-005-contract-status-tagging-for-system-only-exceptions.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Contract-status tagging for system-only exceptions at mutated component surfaces +- outcome: Capture the still-unimplemented deliverable "Contract-status tagging for system-only exceptions" until it is authored to a higher readiness rung. - problem: Identity-bearing component mutations still trust caller-provided actor fields without a canonical component-side proof contract. Fixing the affected mutations piecemeal would create drift and leave a mixed-trust window across approvals, audit, and event append flows. diff --git a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-006-component-boundary-auth-integration-suite.sdp.md b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-006-component-boundary-auth-integration-suite.sdp.md index c40b1d64..c94ab292 100644 --- a/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-006-component-boundary-auth-integration-suite.sdp.md +++ b/specs/unimplemented/deliverables/component-boundary-authentication-convention/d-006-component-boundary-auth-integration-suite.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Component-boundary auth integration suite at libar-platform/packages/platform-core/tests/integration/security/component-boundary-auth +- outcome: Capture the still-unimplemented deliverable "Component-boundary auth integration suite" until it is authored to a higher readiness rung. - problem: Identity-bearing component mutations still trust caller-provided actor fields without a canonical component-side proof contract. Fixing the affected mutations piecemeal would create drift and leave a mixed-trust window across approvals, audit, and event append flows. diff --git a/specs/unimplemented/deliverables/deterministic-id-hashing/d-001-deterministic-stream-id-function.sdp.md b/specs/unimplemented/deliverables/deterministic-id-hashing/d-001-deterministic-stream-id-function.sdp.md index 65d7db94..50181d89 100644 --- a/specs/unimplemented/deliverables/deterministic-id-hashing/d-001-deterministic-stream-id-function.sdp.md +++ b/specs/unimplemented/deliverables/deterministic-id-hashing/d-001-deterministic-stream-id-function.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: deterministicStreamId() function at @libar-dev/platform-core/src/uniqueness/deterministic-id +- outcome: Capture the still-unimplemented deliverable "deterministicStreamId() function" until it is authored to a higher readiness rung. - problem: TTL-based reservations work well for multi-step flows (registration wizards), but add overhead for simple "create if unique" operations. Need a lighter-weight alternative. diff --git a/specs/unimplemented/deliverables/deterministic-id-hashing/d-002-hash-algorithm-selection.sdp.md b/specs/unimplemented/deliverables/deterministic-id-hashing/d-002-hash-algorithm-selection.sdp.md index 7f34f3bf..781827ef 100644 --- a/specs/unimplemented/deliverables/deterministic-id-hashing/d-002-hash-algorithm-selection.sdp.md +++ b/specs/unimplemented/deliverables/deterministic-id-hashing/d-002-hash-algorithm-selection.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Hash algorithm selection at @libar-dev/platform-core/src/uniqueness/hash +- outcome: Capture the still-unimplemented deliverable "Hash algorithm selection" until it is authored to a higher readiness rung. - problem: TTL-based reservations work well for multi-step flows (registration wizards), but add overhead for simple "create if unique" operations. Need a lighter-weight alternative. diff --git a/specs/unimplemented/deliverables/deterministic-id-hashing/d-003-conflict-error-handling.sdp.md b/specs/unimplemented/deliverables/deterministic-id-hashing/d-003-conflict-error-handling.sdp.md index 21792ea9..6735753f 100644 --- a/specs/unimplemented/deliverables/deterministic-id-hashing/d-003-conflict-error-handling.sdp.md +++ b/specs/unimplemented/deliverables/deterministic-id-hashing/d-003-conflict-error-handling.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Conflict error handling at @libar-dev/platform-core/src/uniqueness/errors +- outcome: Capture the still-unimplemented deliverable "Conflict error handling" until it is authored to a higher readiness rung. - problem: TTL-based reservations work well for multi-step flows (registration wizards), but add overhead for simple "create if unique" operations. Need a lighter-weight alternative. diff --git a/specs/unimplemented/deliverables/deterministic-id-hashing/d-004-pattern-documentation.sdp.md b/specs/unimplemented/deliverables/deterministic-id-hashing/d-004-pattern-documentation.sdp.md index 6658a0f4..1e716f84 100644 --- a/specs/unimplemented/deliverables/deterministic-id-hashing/d-004-pattern-documentation.sdp.md +++ b/specs/unimplemented/deliverables/deterministic-id-hashing/d-004-pattern-documentation.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Pattern documentation at docs/architecture/UNIQUENESS-PATTERNS +- outcome: Capture the still-unimplemented deliverable "Pattern documentation" until it is authored to a higher readiness rung. - problem: TTL-based reservations work well for multi-step flows (registration wizards), but add overhead for simple "create if unique" operations. Need a lighter-weight alternative. diff --git a/specs/unimplemented/deliverables/event-correctness-migration/d-001-global-position-consumer-inventory.sdp.md b/specs/unimplemented/deliverables/event-correctness-migration/d-001-global-position-consumer-inventory.sdp.md index 3ca82659..bcef1dd3 100644 --- a/specs/unimplemented/deliverables/event-correctness-migration/d-001-global-position-consumer-inventory.sdp.md +++ b/specs/unimplemented/deliverables/event-correctness-migration/d-001-global-position-consumer-inventory.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: globalPosition consumer inventory at packet artifacts and implementation notes +- outcome: Capture the still-unimplemented deliverable "globalPosition consumer inventory" until it is authored to a higher readiness rung. - problem: 'appendToStream' idempotency semantics, 'globalPosition' precision, and process-manager lifecycle parity are coupled correctness concerns. Splitting them would create inconsistent event-store guarantees and leave downstream consumers migrating against moving contracts. diff --git a/specs/unimplemented/deliverables/event-correctness-migration/d-002-pdr-018-placeholder.sdp.md b/specs/unimplemented/deliverables/event-correctness-migration/d-002-pdr-018-placeholder.sdp.md index 59b63d25..9f22213d 100644 --- a/specs/unimplemented/deliverables/event-correctness-migration/d-002-pdr-018-placeholder.sdp.md +++ b/specs/unimplemented/deliverables/event-correctness-migration/d-002-pdr-018-placeholder.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: PDR-018 placeholder at libar-platform/architect/decisions/pdr-018-idempotency-enforcement-for-append-to-stream +- outcome: Capture the still-unimplemented deliverable "PDR-018 placeholder" until it is authored to a higher readiness rung. - problem: 'appendToStream' idempotency semantics, 'globalPosition' precision, and process-manager lifecycle parity are coupled correctness concerns. Splitting them would create inconsistent event-store guarantees and leave downstream consumers migrating against moving contracts. diff --git a/specs/unimplemented/deliverables/event-correctness-migration/d-003-pdr-015-placeholder.sdp.md b/specs/unimplemented/deliverables/event-correctness-migration/d-003-pdr-015-placeholder.sdp.md index e55472cc..4a1a726d 100644 --- a/specs/unimplemented/deliverables/event-correctness-migration/d-003-pdr-015-placeholder.sdp.md +++ b/specs/unimplemented/deliverables/event-correctness-migration/d-003-pdr-015-placeholder.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: PDR-015 placeholder at libar-platform/architect/decisions/pdr-015-global-position-numeric-representation +- outcome: Capture the still-unimplemented deliverable "PDR-015 placeholder" until it is authored to a higher readiness rung. - problem: 'appendToStream' idempotency semantics, 'globalPosition' precision, and process-manager lifecycle parity are coupled correctness concerns. Splitting them would create inconsistent event-store guarantees and leave downstream consumers migrating against moving contracts. diff --git a/specs/unimplemented/deliverables/event-correctness-migration/d-004-append-to-stream-idempotency-migration.sdp.md b/specs/unimplemented/deliverables/event-correctness-migration/d-004-append-to-stream-idempotency-migration.sdp.md index 1447f404..2c5df01e 100644 --- a/specs/unimplemented/deliverables/event-correctness-migration/d-004-append-to-stream-idempotency-migration.sdp.md +++ b/specs/unimplemented/deliverables/event-correctness-migration/d-004-append-to-stream-idempotency-migration.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: appendToStream idempotency migration at libar-platform/packages/platform-core/ and platform-store/ +- outcome: Capture the still-unimplemented deliverable "appendToStream idempotency migration" until it is authored to a higher readiness rung. - problem: 'appendToStream' idempotency semantics, 'globalPosition' precision, and process-manager lifecycle parity are coupled correctness concerns. Splitting them would create inconsistent event-store guarantees and leave downstream consumers migrating against moving contracts. diff --git a/specs/unimplemented/deliverables/event-correctness-migration/d-005-global-position-representation-migration-and-compat-reader.sdp.md b/specs/unimplemented/deliverables/event-correctness-migration/d-005-global-position-representation-migration-and-compat-reader.sdp.md index 8afb1fd5..9a326b22 100644 --- a/specs/unimplemented/deliverables/event-correctness-migration/d-005-global-position-representation-migration-and-compat-reader.sdp.md +++ b/specs/unimplemented/deliverables/event-correctness-migration/d-005-global-position-representation-migration-and-compat-reader.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: globalPosition representation migration and compat reader at libar-platform/packages/platform-store/ and downstream consumers +- outcome: Capture the still-unimplemented deliverable "globalPosition representation migration and compat reader" until it is authored to a higher readiness rung. - problem: 'appendToStream' idempotency semantics, 'globalPosition' precision, and process-manager lifecycle parity are coupled correctness concerns. Splitting them would create inconsistent event-store guarantees and leave downstream consumers migrating against moving contracts. diff --git a/specs/unimplemented/deliverables/event-correctness-migration/d-006-canonical-pm-transition-map-parity.sdp.md b/specs/unimplemented/deliverables/event-correctness-migration/d-006-canonical-pm-transition-map-parity.sdp.md index 0cdf82cf..34b151eb 100644 --- a/specs/unimplemented/deliverables/event-correctness-migration/d-006-canonical-pm-transition-map-parity.sdp.md +++ b/specs/unimplemented/deliverables/event-correctness-migration/d-006-canonical-pm-transition-map-parity.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Canonical PM transition map parity at processManager/lifecycle +- outcome: Capture the still-unimplemented deliverable "Canonical PM transition map parity" until it is authored to a higher readiness rung. - problem: 'appendToStream' idempotency semantics, 'globalPosition' precision, and process-manager lifecycle parity are coupled correctness concerns. Splitting them would create inconsistent event-store guarantees and leave downstream consumers migrating against moving contracts. diff --git a/specs/unimplemented/deliverables/event-correctness-migration/d-007-event-correctness-integration-suite.sdp.md b/specs/unimplemented/deliverables/event-correctness-migration/d-007-event-correctness-integration-suite.sdp.md index 62b79d43..fb560495 100644 --- a/specs/unimplemented/deliverables/event-correctness-migration/d-007-event-correctness-integration-suite.sdp.md +++ b/specs/unimplemented/deliverables/event-correctness-migration/d-007-event-correctness-integration-suite.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Event correctness integration suite at libar-platform/packages/platform-store/tests/integration/event-correctness +- outcome: Capture the still-unimplemented deliverable "Event correctness integration suite" until it is authored to a higher readiness rung. - problem: 'appendToStream' idempotency semantics, 'globalPosition' precision, and process-manager lifecycle parity are coupled correctness concerns. Splitting them would create inconsistent event-store guarantees and leave downstream consumers migrating against moving contracts. diff --git a/specs/unimplemented/deliverables/health-observability/d-001-health-check-types.sdp.md b/specs/unimplemented/deliverables/health-observability/d-001-health-check-types.sdp.md index 08147532..420eedba 100644 --- a/specs/unimplemented/deliverables/health-observability/d-001-health-check-types.sdp.md +++ b/specs/unimplemented/deliverables/health-observability/d-001-health-check-types.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Health check types at @libar-dev/platform-core/src/monitoring/health/types +- outcome: Capture the still-unimplemented deliverable "Health check types" until it is authored to a higher readiness rung. - problem: No Kubernetes integration (readiness/liveness probes), no metrics for projection lag, event throughput, or system health. Operations team has no visibility into system state, cannot detect degradation before it becomes an outage, and cannot integrate with standard orchestration platforms. diff --git a/specs/unimplemented/deliverables/health-observability/d-002-check-readiness-query.sdp.md b/specs/unimplemented/deliverables/health-observability/d-002-check-readiness-query.sdp.md index 962a77aa..47dd02da 100644 --- a/specs/unimplemented/deliverables/health-observability/d-002-check-readiness-query.sdp.md +++ b/specs/unimplemented/deliverables/health-observability/d-002-check-readiness-query.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: checkReadiness query at examples/order-management/convex/health +- outcome: Capture the still-unimplemented deliverable "checkReadiness query" until it is authored to a higher readiness rung. - problem: No Kubernetes integration (readiness/liveness probes), no metrics for projection lag, event throughput, or system health. Operations team has no visibility into system state, cannot detect degradation before it becomes an outage, and cannot integrate with standard orchestration platforms. diff --git a/specs/unimplemented/deliverables/health-observability/d-003-check-liveness-query.sdp.md b/specs/unimplemented/deliverables/health-observability/d-003-check-liveness-query.sdp.md index 929906f1..036fa2dc 100644 --- a/specs/unimplemented/deliverables/health-observability/d-003-check-liveness-query.sdp.md +++ b/specs/unimplemented/deliverables/health-observability/d-003-check-liveness-query.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: checkLiveness query at examples/order-management/convex/health +- outcome: Capture the still-unimplemented deliverable "checkLiveness query" until it is authored to a higher readiness rung. - problem: No Kubernetes integration (readiness/liveness probes), no metrics for projection lag, event throughput, or system health. Operations team has no visibility into system state, cannot detect degradation before it becomes an outage, and cannot integrate with standard orchestration platforms. diff --git a/specs/unimplemented/deliverables/health-observability/d-004-http-router-with-health-routes.sdp.md b/specs/unimplemented/deliverables/health-observability/d-004-http-router-with-health-routes.sdp.md index fd1df783..ad2e3896 100644 --- a/specs/unimplemented/deliverables/health-observability/d-004-http-router-with-health-routes.sdp.md +++ b/specs/unimplemented/deliverables/health-observability/d-004-http-router-with-health-routes.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: HTTP router with /health/* routes at examples/order-management/convex/http +- outcome: Capture the still-unimplemented deliverable "HTTP router with /health/* routes" until it is authored to a higher readiness rung. - problem: No Kubernetes integration (readiness/liveness probes), no metrics for projection lag, event throughput, or system health. Operations team has no visibility into system state, cannot detect degradation before it becomes an outage, and cannot integrate with standard orchestration platforms. diff --git a/specs/unimplemented/deliverables/health-observability/d-005-metrics-types.sdp.md b/specs/unimplemented/deliverables/health-observability/d-005-metrics-types.sdp.md index 40ee7924..01dac24f 100644 --- a/specs/unimplemented/deliverables/health-observability/d-005-metrics-types.sdp.md +++ b/specs/unimplemented/deliverables/health-observability/d-005-metrics-types.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Metrics types at @libar-dev/platform-core/src/monitoring/metrics/types +- outcome: Capture the still-unimplemented deliverable "Metrics types" until it is authored to a higher readiness rung. - problem: No Kubernetes integration (readiness/liveness probes), no metrics for projection lag, event throughput, or system health. Operations team has no visibility into system state, cannot detect degradation before it becomes an outage, and cannot integrate with standard orchestration platforms. diff --git a/specs/unimplemented/deliverables/health-observability/d-006-metrics-collector.sdp.md b/specs/unimplemented/deliverables/health-observability/d-006-metrics-collector.sdp.md index 7fbdfa17..9722679c 100644 --- a/specs/unimplemented/deliverables/health-observability/d-006-metrics-collector.sdp.md +++ b/specs/unimplemented/deliverables/health-observability/d-006-metrics-collector.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: MetricsCollector at @libar-dev/platform-core/src/monitoring/metrics/collector +- outcome: Capture the still-unimplemented deliverable "MetricsCollector" until it is authored to a higher readiness rung. - problem: No Kubernetes integration (readiness/liveness probes), no metrics for projection lag, event throughput, or system health. Operations team has no visibility into system state, cannot detect degradation before it becomes an outage, and cannot integrate with standard orchestration platforms. diff --git a/specs/unimplemented/deliverables/health-observability/d-007-projection-lag-calculator.sdp.md b/specs/unimplemented/deliverables/health-observability/d-007-projection-lag-calculator.sdp.md index d3c51b8d..2851ee3d 100644 --- a/specs/unimplemented/deliverables/health-observability/d-007-projection-lag-calculator.sdp.md +++ b/specs/unimplemented/deliverables/health-observability/d-007-projection-lag-calculator.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Projection lag calculator at @libar-dev/platform-core/src/monitoring/metrics/projectionLag +- outcome: Capture the still-unimplemented deliverable "Projection lag calculator" until it is authored to a higher readiness rung. - problem: No Kubernetes integration (readiness/liveness probes), no metrics for projection lag, event throughput, or system health. Operations team has no visibility into system state, cannot detect degradation before it becomes an outage, and cannot integrate with standard orchestration platforms. diff --git a/specs/unimplemented/deliverables/health-observability/d-008-workpool-depth-query.sdp.md b/specs/unimplemented/deliverables/health-observability/d-008-workpool-depth-query.sdp.md index 3b538726..87851f6a 100644 --- a/specs/unimplemented/deliverables/health-observability/d-008-workpool-depth-query.sdp.md +++ b/specs/unimplemented/deliverables/health-observability/d-008-workpool-depth-query.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Workpool depth query at examples/order-management/convex/health +- outcome: Capture the still-unimplemented deliverable "Workpool depth query" until it is authored to a higher readiness rung. - problem: No Kubernetes integration (readiness/liveness probes), no metrics for projection lag, event throughput, or system health. Operations team has no visibility into system state, cannot detect degradation before it becomes an outage, and cannot integrate with standard orchestration platforms. diff --git a/specs/unimplemented/deliverables/health-observability/d-009-system-health-aggregator.sdp.md b/specs/unimplemented/deliverables/health-observability/d-009-system-health-aggregator.sdp.md index e871bcf0..0f3b538e 100644 --- a/specs/unimplemented/deliverables/health-observability/d-009-system-health-aggregator.sdp.md +++ b/specs/unimplemented/deliverables/health-observability/d-009-system-health-aggregator.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: System health aggregator at @libar-dev/platform-core/src/monitoring/health/aggregator +- outcome: Capture the still-unimplemented deliverable "System health aggregator" until it is authored to a higher readiness rung. - problem: No Kubernetes integration (readiness/liveness probes), no metrics for projection lag, event throughput, or system health. Operations team has no visibility into system state, cannot detect degradation before it becomes an outage, and cannot integrate with standard orchestration platforms. diff --git a/specs/unimplemented/deliverables/integration-patterns-21a/d-001-context-map-registry.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21a/d-001-context-map-registry.sdp.md index 2f319943..e6f3771d 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21a/d-001-context-map-registry.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21a/d-001-context-map-registry.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Context Map registry at @libar-dev/platform-core/src/integration/context-map +- outcome: Capture the still-unimplemented deliverable "Context Map registry" until it is authored to a higher readiness rung. - problem: Cross-context communication is ad-hoc. Domain events are used directly for integration without explicit contracts, leading to tight coupling. diff --git a/specs/unimplemented/deliverables/integration-patterns-21a/d-002-context-map-documentation.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21a/d-002-context-map-documentation.sdp.md index 1a19db9f..01bd9f91 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21a/d-002-context-map-documentation.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21a/d-002-context-map-documentation.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Context Map documentation at docs/architecture/CONTEXT-MAP +- outcome: Capture the still-unimplemented deliverable "Context Map documentation" until it is authored to a higher readiness rung. - problem: Cross-context communication is ad-hoc. Domain events are used directly for integration without explicit contracts, leading to tight coupling. diff --git a/specs/unimplemented/deliverables/integration-patterns-21a/d-003-published-language-registry.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21a/d-003-published-language-registry.sdp.md index 881eae1e..e0d39607 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21a/d-003-published-language-registry.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21a/d-003-published-language-registry.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Published Language registry at @libar-dev/platform-core/src/integration/published-language +- outcome: Capture the still-unimplemented deliverable "Published Language registry" until it is authored to a higher readiness rung. - problem: Cross-context communication is ad-hoc. Domain events are used directly for integration without explicit contracts, leading to tight coupling. diff --git a/specs/unimplemented/deliverables/integration-patterns-21a/d-004-to-published-language-converter.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21a/d-004-to-published-language-converter.sdp.md index 27cbcf59..c29eb29b 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21a/d-004-to-published-language-converter.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21a/d-004-to-published-language-converter.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: toPublishedLanguage() converter at @libar-dev/platform-core/src/integration/converter +- outcome: Capture the still-unimplemented deliverable "toPublishedLanguage() converter" until it is authored to a higher readiness rung. - problem: Cross-context communication is ad-hoc. Domain events are used directly for integration without explicit contracts, leading to tight coupling. diff --git a/specs/unimplemented/deliverables/integration-patterns-21a/d-005-acl-builder-enhancement.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21a/d-005-acl-builder-enhancement.sdp.md index b35c7314..db11d7de 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21a/d-005-acl-builder-enhancement.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21a/d-005-acl-builder-enhancement.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: ACL builder enhancement at @libar-dev/platform-core/src/integration/acl +- outcome: Capture the still-unimplemented deliverable "ACL builder enhancement" until it is authored to a higher readiness rung. - problem: Cross-context communication is ad-hoc. Domain events are used directly for integration without explicit contracts, leading to tight coupling. diff --git a/specs/unimplemented/deliverables/integration-patterns-21a/d-006-integration-event-metadata-extension.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21a/d-006-integration-event-metadata-extension.sdp.md index 1c08b703..87ff6cae 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21a/d-006-integration-event-metadata-extension.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21a/d-006-integration-event-metadata-extension.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: IntegrationEventMetadata extension at @libar-dev/platform-core/src/integration/types +- outcome: Capture the still-unimplemented deliverable "IntegrationEventMetadata extension" until it is authored to a higher readiness rung. - problem: Cross-context communication is ad-hoc. Domain events are used directly for integration without explicit contracts, leading to tight coupling. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-001-upcaster-implementation.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-001-upcaster-implementation.sdp.md index 13048987..72780c8a 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21b/d-001-upcaster-implementation.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-001-upcaster-implementation.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Upcaster implementation at @libar-dev/platform-core/src/integration/versioning +- outcome: Capture the still-unimplemented deliverable "Upcaster implementation" until it is authored to a higher readiness rung. - problem: Schema evolution breaks consumers. No tooling validates producer-consumer compatibility, leading to runtime failures and integration bugs. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-002-downcaster-implementation.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-002-downcaster-implementation.sdp.md index b3f2fc2e..f58ff155 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21b/d-002-downcaster-implementation.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-002-downcaster-implementation.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Downcaster implementation at @libar-dev/platform-core/src/integration/versioning +- outcome: Capture the still-unimplemented deliverable "Downcaster implementation" until it is authored to a higher readiness rung. - problem: Schema evolution breaks consumers. No tooling validates producer-consumer compatibility, leading to runtime failures and integration bugs. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-003-migration-path-validation.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-003-migration-path-validation.sdp.md index 5848b698..72031bf5 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21b/d-003-migration-path-validation.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-003-migration-path-validation.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Migration path validation at @libar-dev/platform-core/src/integration/versioning +- outcome: Capture the still-unimplemented deliverable "Migration path validation" until it is authored to a higher readiness rung. - problem: Schema evolution breaks consumers. No tooling validates producer-consumer compatibility, leading to runtime failures and integration bugs. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-004-contract-sample-generation.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-004-contract-sample-generation.sdp.md index a4dda964..779aa496 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21b/d-004-contract-sample-generation.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-004-contract-sample-generation.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Contract sample generation at @libar-dev/platform-core/src/integration/testing/samples +- outcome: Capture the still-unimplemented deliverable "Contract sample generation" until it is authored to a higher readiness rung. - problem: Schema evolution breaks consumers. No tooling validates producer-consumer compatibility, leading to runtime failures and integration bugs. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-005-producer-contract-tests.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-005-producer-contract-tests.sdp.md index ecb56416..1b9b58ea 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21b/d-005-producer-contract-tests.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-005-producer-contract-tests.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Producer contract tests at @libar-dev/platform-core/src/integration/testing/producer +- outcome: Capture the still-unimplemented deliverable "Producer contract tests" until it is authored to a higher readiness rung. - problem: Schema evolution breaks consumers. No tooling validates producer-consumer compatibility, leading to runtime failures and integration bugs. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-006-consumer-contract-tests.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-006-consumer-contract-tests.sdp.md index 479f9329..b940bea0 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21b/d-006-consumer-contract-tests.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-006-consumer-contract-tests.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Consumer contract tests at @libar-dev/platform-core/src/integration/testing/consumer +- outcome: Capture the still-unimplemented deliverable "Consumer contract tests" until it is authored to a higher readiness rung. - problem: Schema evolution breaks consumers. No tooling validates producer-consumer compatibility, leading to runtime failures and integration bugs. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-007-compatibility-verification.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-007-compatibility-verification.sdp.md index 9dfc5ea8..d539503a 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21b/d-007-compatibility-verification.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-007-compatibility-verification.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Compatibility verification at @libar-dev/platform-core/src/integration/testing/compatibility +- outcome: Capture the still-unimplemented deliverable "Compatibility verification" until it is authored to a higher readiness rung. - problem: Schema evolution breaks consumers. No tooling validates producer-consumer compatibility, leading to runtime failures and integration bugs. diff --git a/specs/unimplemented/deliverables/integration-patterns-21b/d-008-contract-violation-detection.sdp.md b/specs/unimplemented/deliverables/integration-patterns-21b/d-008-contract-violation-detection.sdp.md index c2953860..f7c89c01 100644 --- a/specs/unimplemented/deliverables/integration-patterns-21b/d-008-contract-violation-detection.sdp.md +++ b/specs/unimplemented/deliverables/integration-patterns-21b/d-008-contract-violation-detection.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Contract violation detection at @libar-dev/platform-core/src/integration/testing/violations +- outcome: Capture the still-unimplemented deliverable "Contract violation detection" until it is authored to a higher readiness rung. - problem: Schema evolution breaks consumers. No tooling validates producer-consumer compatibility, leading to runtime failures and integration bugs. diff --git a/specs/unimplemented/deliverables/production-hardening/d-001-metrics-collection-types.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-001-metrics-collection-types.sdp.md index 3d39b7ad..96182268 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-001-metrics-collection-types.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-001-metrics-collection-types.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Metrics collection types at @libar-dev/platform-core/src/monitoring/metrics +- outcome: Capture the still-unimplemented deliverable "Metrics collection types" until it is authored to a higher readiness rung. - problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-002-metrics-collector.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-002-metrics-collector.sdp.md index dbd7f1bd..b13c9578 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-002-metrics-collector.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-002-metrics-collector.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Metrics collector at @libar-dev/platform-core/src/monitoring/collector +- outcome: Capture the still-unimplemented deliverable "Metrics collector" until it is authored to a higher readiness rung. - problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-003-health-check-queries.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-003-health-check-queries.sdp.md index 5ce19cf3..07c010e8 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-003-health-check-queries.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-003-health-check-queries.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Health check queries at examples/order-management/convex/health +- outcome: Capture the still-unimplemented deliverable "Health check queries" until it is authored to a higher readiness rung. - problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-004-health-http-router.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-004-health-http-router.sdp.md index 0c1ae62b..ca4f59da 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-004-health-http-router.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-004-health-http-router.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Health HTTP router at examples/order-management/convex/http +- outcome: Capture the still-unimplemented deliverable "Health HTTP router" until it is authored to a higher readiness rung. - problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-005-circuit-breaker-implementation.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-005-circuit-breaker-implementation.sdp.md index a87b179b..1ff52238 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-005-circuit-breaker-implementation.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-005-circuit-breaker-implementation.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Circuit breaker implementation at @libar-dev/platform-core/src/monitoring/circuit-breaker +- outcome: Capture the still-unimplemented deliverable "Circuit breaker implementation" until it is authored to a higher readiness rung. - problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-006-admin-projection-endpoints.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-006-admin-projection-endpoints.sdp.md index 2bf46fd4..2947ea6f 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-006-admin-projection-endpoints.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-006-admin-projection-endpoints.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Admin projection endpoints at examples/order-management/convex/admin/projections +- outcome: Capture the still-unimplemented deliverable "Admin projection endpoints" until it is authored to a higher readiness rung. - problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-007-admin-dlq-endpoints.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-007-admin-dlq-endpoints.sdp.md index 42987ec6..6b247319 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-007-admin-dlq-endpoints.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-007-admin-dlq-endpoints.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Admin DLQ endpoints at examples/order-management/convex/admin/deadLetters +- outcome: Capture the still-unimplemented deliverable "Admin DLQ endpoints" until it is authored to a higher readiness rung. - problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-008-admin-diagnostics.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-008-admin-diagnostics.sdp.md index be0b4820..9e5cd72f 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-008-admin-diagnostics.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-008-admin-diagnostics.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Admin diagnostics at examples/order-management/convex/admin/diagnostics +- outcome: Capture the still-unimplemented deliverable "Admin diagnostics" until it is authored to a higher readiness rung. - problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-009-durable-function-run-diagnostics.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-009-durable-function-run-diagnostics.sdp.md index 10017cbe..3bb4d90a 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-009-durable-function-run-diagnostics.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-009-durable-function-run-diagnostics.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Durable function run diagnostics at examples/order-management/convex/admin/durableFunctions +- outcome: Capture the still-unimplemented deliverable "Durable function run diagnostics" until it is authored to a higher readiness rung. - problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-010-contract-violation-types.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-010-contract-violation-types.sdp.md index 7952da87..11219b2f 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-010-contract-violation-types.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-010-contract-violation-types.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Contract violation types at @libar-dev/platform-core/src/monitoring/contracts +- outcome: Capture the still-unimplemented deliverable "Contract violation types" until it is authored to a higher readiness rung. - problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-011-grafana-dashboard-templates.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-011-grafana-dashboard-templates.sdp.md index ec79de84..1a254d84 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-011-grafana-dashboard-templates.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-011-grafana-dashboard-templates.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Grafana dashboard templates at infrastructure/grafana/ +- outcome: Capture the still-unimplemented deliverable "Grafana dashboard templates" until it is authored to a higher readiness rung. - problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-012-runbook-documentation.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-012-runbook-documentation.sdp.md index 336fae22..e731d2da 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-012-runbook-documentation.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-012-runbook-documentation.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Runbook documentation at docs/operations/RUNBOOK +- outcome: Capture the still-unimplemented deliverable "Runbook documentation" until it is authored to a higher readiness rung. - problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-013-circuit-breaker-retrier-integration.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-013-circuit-breaker-retrier-integration.sdp.md index db5c8009..62604b6e 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-013-circuit-breaker-retrier-integration.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-013-circuit-breaker-retrier-integration.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Circuit breaker retrier integration at @libar-dev/platform-core/src/monitoring/withCircuitBreaker +- outcome: Capture the still-unimplemented deliverable "Circuit breaker retrier integration" until it is authored to a higher readiness rung. - problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-014-dlq-action-retrier-pattern.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-014-dlq-action-retrier-pattern.sdp.md index 04beaae7..e2b63d25 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-014-dlq-action-retrier-pattern.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-014-dlq-action-retrier-pattern.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: DLQ action retrier pattern at examples/order-management/convex/admin/dlqRetrier +- outcome: Capture the still-unimplemented deliverable "DLQ action retrier pattern" until it is authored to a higher readiness rung. - problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/production-hardening/d-015-durable-function-decision-guide.sdp.md b/specs/unimplemented/deliverables/production-hardening/d-015-durable-function-decision-guide.sdp.md index 3d48bea0..43c82465 100644 --- a/specs/unimplemented/deliverables/production-hardening/d-015-durable-function-decision-guide.sdp.md +++ b/specs/unimplemented/deliverables/production-hardening/d-015-durable-function-decision-guide.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Durable function decision guide at docs/architecture/DURABLE-FUNCTION-SELECTION +- outcome: Capture the still-unimplemented deliverable "Durable function decision guide" until it is authored to a higher readiness rung. - problem: Structured logging (Phase 13) exists but no metrics collection, distributed tracing, or admin tooling for production operations. Teams cannot monitor system health, trace event flows, or perform operational tasks like projection rebuilds without direct database access. diff --git a/specs/unimplemented/deliverables/test-content-blocks/d-001-demo-item-1.sdp.md b/specs/unimplemented/deliverables/test-content-blocks/d-001-demo-item-1.sdp.md deleted file mode 100644 index 4dd6532f..00000000 --- a/specs/unimplemented/deliverables/test-content-blocks/d-001-demo-item-1.sdp.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -id: spec:unimplemented.test-content-blocks.demo-item-1 -kind: behavior -altitude: story -readiness: idea -relations: - refines: spec:platform.test-content-blocks ---- -# Demo item 1 - -## Intent - -- outcome: Unimplemented deliverable: Demo item 1 at No diff --git a/specs/unimplemented/deliverables/themed-decision-architecture/d-001-add-adr-theme-tag-to-registry.sdp.md b/specs/unimplemented/deliverables/themed-decision-architecture/d-001-add-adr-theme-tag-to-registry.sdp.md index 201f9db5..1c5ba7f9 100644 --- a/specs/unimplemented/deliverables/themed-decision-architecture/d-001-add-adr-theme-tag-to-registry.sdp.md +++ b/specs/unimplemented/deliverables/themed-decision-architecture/d-001-add-adr-theme-tag-to-registry.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Add 'adr-theme' tag to registry at No +- outcome: Capture the still-unimplemented deliverable "Add 'adr-theme' tag to registry" until it is authored to a higher readiness rung. diff --git a/specs/unimplemented/deliverables/themed-decision-architecture/d-002-theme-grouped-decision-generator.sdp.md b/specs/unimplemented/deliverables/themed-decision-architecture/d-002-theme-grouped-decision-generator.sdp.md index 7a89d924..725002ae 100644 --- a/specs/unimplemented/deliverables/themed-decision-architecture/d-002-theme-grouped-decision-generator.sdp.md +++ b/specs/unimplemented/deliverables/themed-decision-architecture/d-002-theme-grouped-decision-generator.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Theme-grouped decision generator at No +- outcome: Capture the still-unimplemented deliverable "Theme-grouped decision generator" until it is authored to a higher readiness rung. diff --git a/specs/unimplemented/deliverables/themed-decision-architecture/d-003-dependency-graph-generator.sdp.md b/specs/unimplemented/deliverables/themed-decision-architecture/d-003-dependency-graph-generator.sdp.md index 45deab40..950a0f3e 100644 --- a/specs/unimplemented/deliverables/themed-decision-architecture/d-003-dependency-graph-generator.sdp.md +++ b/specs/unimplemented/deliverables/themed-decision-architecture/d-003-dependency-graph-generator.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Dependency graph generator at No +- outcome: Capture the still-unimplemented deliverable "Dependency graph generator" until it is authored to a higher readiness rung. diff --git a/specs/unimplemented/deliverables/themed-decision-architecture/d-004-adr-migration-scripts.sdp.md b/specs/unimplemented/deliverables/themed-decision-architecture/d-004-adr-migration-scripts.sdp.md index 4178441d..68fd467a 100644 --- a/specs/unimplemented/deliverables/themed-decision-architecture/d-004-adr-migration-scripts.sdp.md +++ b/specs/unimplemented/deliverables/themed-decision-architecture/d-004-adr-migration-scripts.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Unimplemented deliverable: ADR migration scripts at No +- outcome: Capture the still-unimplemented deliverable "ADR migration scripts" until it is authored to a higher readiness rung. diff --git a/specs/unimplemented/deliverables/themed-decision-architecture/d-005-review-and-port-33-active-ad-rs.sdp.md b/specs/unimplemented/deliverables/themed-decision-architecture/d-005-review-and-port-33-active-ad-rs.sdp.md index 5fa288c4..ab672760 100644 --- a/specs/unimplemented/deliverables/themed-decision-architecture/d-005-review-and-port-33-active-ad-rs.sdp.md +++ b/specs/unimplemented/deliverables/themed-decision-architecture/d-005-review-and-port-33-active-ad-rs.sdp.md @@ -10,4 +10,4 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Review and port 33 active ADRs at No +- outcome: Capture the still-unimplemented deliverable "Review and port 33 active ADRs" until it is authored to a higher readiness rung. diff --git a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-001-dependency-delta-memo.sdp.md b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-001-dependency-delta-memo.sdp.md index 55aa738e..f7fd4fbf 100644 --- a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-001-dependency-delta-memo.sdp.md +++ b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-001-dependency-delta-memo.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Dependency delta memo +- outcome: Capture the still-unimplemented deliverable "Dependency delta memo" until it is authored to a higher readiness rung. - problem: The remediation program cannot safely begin security or correctness migrations while 'platform-store' lacks a real backend integration harness, 'platform-bus' relies on thin backend coverage, and package validation posture still permits configuration drift. diff --git a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-002-store-backend-integration-harness.sdp.md b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-002-store-backend-integration-harness.sdp.md index e9fe4e0d..e387419d 100644 --- a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-002-store-backend-integration-harness.sdp.md +++ b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-002-store-backend-integration-harness.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Store backend integration harness at libar-platform/packages/platform-store/tests/integration/store-harness +- outcome: Capture the still-unimplemented deliverable "Store backend integration harness" until it is authored to a higher readiness rung. - problem: The remediation program cannot safely begin security or correctness migrations while 'platform-store' lacks a real backend integration harness, 'platform-bus' relies on thin backend coverage, and package validation posture still permits configuration drift. diff --git a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-003-bus-backend-integration-harness.sdp.md b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-003-bus-backend-integration-harness.sdp.md index 6e6473f2..1c71a6f6 100644 --- a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-003-bus-backend-integration-harness.sdp.md +++ b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-003-bus-backend-integration-harness.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Bus backend integration harness at libar-platform/packages/platform-bus/tests/integration/command-bus-harness +- outcome: Capture the still-unimplemented deliverable "Bus backend integration harness" until it is authored to a higher readiness rung. - problem: The remediation program cannot safely begin security or correctness migrations while 'platform-store' lacks a real backend integration harness, 'platform-bus' relies on thin backend coverage, and package validation posture still permits configuration drift. diff --git a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-004-typecheck-and-vitest-config-alignment.sdp.md b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-004-typecheck-and-vitest-config-alignment.sdp.md index b11a1681..0a5cc4bf 100644 --- a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-004-typecheck-and-vitest-config-alignment.sdp.md +++ b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-004-typecheck-and-vitest-config-alignment.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Typecheck and Vitest config alignment at libar-platform/packages/platform-*/package +- outcome: Capture the still-unimplemented deliverable "Typecheck and Vitest config alignment" until it is authored to a higher readiness rung. - problem: The remediation program cannot safely begin security or correctness migrations while 'platform-store' lacks a real backend integration harness, 'platform-bus' relies on thin backend coverage, and package validation posture still permits configuration drift. diff --git a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-005-strict-ts-and-es-lint-hardening.sdp.md b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-005-strict-ts-and-es-lint-hardening.sdp.md index ce66ddf3..d1e39d73 100644 --- a/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-005-strict-ts-and-es-lint-hardening.sdp.md +++ b/specs/unimplemented/deliverables/tranche-0-readiness-harness-and-dependency-hardening/d-005-strict-ts-and-es-lint-hardening.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Strict TS and ESLint hardening at libar-platform/packages/platform-*/ +- outcome: Capture the still-unimplemented deliverable "Strict TS and ESLint hardening" until it is authored to a higher readiness rung. - problem: The remediation program cannot safely begin security or correctness migrations while 'platform-store' lacks a real backend integration harness, 'platform-bus' relies on thin backend coverage, and package validation posture still permits configuration drift. diff --git a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-001-release-automation-aligned-to-architect-releases.sdp.md b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-001-release-automation-aligned-to-architect-releases.sdp.md index d0f3f49d..441e17fe 100644 --- a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-001-release-automation-aligned-to-architect-releases.sdp.md +++ b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-001-release-automation-aligned-to-architect-releases.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Release automation aligned to architect releases +- outcome: Capture the still-unimplemented deliverable "Release automation aligned to architect releases" until it is authored to a higher readiness rung. - problem: 'test.yml' ignores markdown and docs-only changes, release automation is not yet normalized around architect release metadata, and new remediation contracts need an explicit advertised-vs-enforced convention before runtime fixes start landing. diff --git a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-002-dependency-scanning-in-ci.sdp.md b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-002-dependency-scanning-in-ci.sdp.md index c28fa4b0..f977f9d7 100644 --- a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-002-dependency-scanning-in-ci.sdp.md +++ b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-002-dependency-scanning-in-ci.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Dependency scanning in CI +- outcome: Capture the still-unimplemented deliverable "Dependency scanning in CI" until it is authored to a higher readiness rung. - problem: 'test.yml' ignores markdown and docs-only changes, release automation is not yet normalized around architect release metadata, and new remediation contracts need an explicit advertised-vs-enforced convention before runtime fixes start landing. diff --git a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-003-contract-status-convention-and-linting.sdp.md b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-003-contract-status-convention-and-linting.sdp.md index 56f852c7..2bf5686d 100644 --- a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-003-contract-status-convention-and-linting.sdp.md +++ b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-003-contract-status-convention-and-linting.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Contract-status convention and linting at libar-platform/architect/ and lint config +- outcome: Capture the still-unimplemented deliverable "Contract-status convention and linting" until it is authored to a higher readiness rung. - problem: 'test.yml' ignores markdown and docs-only changes, release automation is not yet normalized around architect release metadata, and new remediation contracts need an explicit advertised-vs-enforced convention before runtime fixes start landing. diff --git a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-004-convex-es-rename-guard.sdp.md b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-004-convex-es-rename-guard.sdp.md index 7e8d688f..d2972eb5 100644 --- a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-004-convex-es-rename-guard.sdp.md +++ b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-004-convex-es-rename-guard.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: @convex-es rename guard at lint config and docs checks +- outcome: Capture the still-unimplemented deliverable "@convex-es rename guard" until it is authored to a higher readiness rung. - problem: 'test.yml' ignores markdown and docs-only changes, release automation is not yet normalized around architect release metadata, and new remediation contracts need an explicit advertised-vs-enforced convention before runtime fixes start landing. diff --git a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-005-docs-process-validation-workflow.sdp.md b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-005-docs-process-validation-workflow.sdp.md index 0a3354ac..84741d67 100644 --- a/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-005-docs-process-validation-workflow.sdp.md +++ b/specs/unimplemented/deliverables/tranche-0-release-ci-and-docs-process-guardrails/d-005-docs-process-validation-workflow.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Docs/process validation workflow +- outcome: Capture the still-unimplemented deliverable "Docs/process validation workflow" until it is authored to a higher readiness rung. - problem: 'test.yml' ignores markdown and docs-only changes, release automation is not yet normalized around architect release metadata, and new remediation contracts need an explicit advertised-vs-enforced convention before runtime fixes start landing. diff --git a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-001-ensure-test-environment-fail-closed.sdp.md b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-001-ensure-test-environment-fail-closed.sdp.md index eabe2bed..bfaabc1c 100644 --- a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-001-ensure-test-environment-fail-closed.sdp.md +++ b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-001-ensure-test-environment-fail-closed.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: ensureTestEnvironment fail-closed at libar-platform/packages/platform-core/ +- outcome: Capture the still-unimplemented deliverable "ensureTestEnvironment fail-closed" until it is authored to a higher readiness rung. - problem: Several tranche-1 gaps remain after the auth keystone: test-mode checks fail open, correlation IDs can be fabricated, reviewer authorization still needs default-deny cleanup, lifecycle stubs leak placeholder behavior, and 'platform-store' still lacks a recorded decision for its constrained 'platform-core' runtime dependency. diff --git a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-002-correlation-id-required-at-validator-boundary.sdp.md b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-002-correlation-id-required-at-validator-boundary.sdp.md index 928a9418..788b9e3a 100644 --- a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-002-correlation-id-required-at-validator-boundary.sdp.md +++ b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-002-correlation-id-required-at-validator-boundary.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: correlationId required at validator boundary at validator boundary +- outcome: Capture the still-unimplemented deliverable "correlationId required" until it is authored to a higher readiness rung. - problem: Several tranche-1 gaps remain after the auth keystone: test-mode checks fail open, correlation IDs can be fabricated, reviewer authorization still needs default-deny cleanup, lifecycle stubs leak placeholder behavior, and 'platform-store' still lacks a recorded decision for its constrained 'platform-core' runtime dependency. diff --git a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-003-full-length-uui-dv7-helper-centralization.sdp.md b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-003-full-length-uui-dv7-helper-centralization.sdp.md index da3e9e48..74bdf227 100644 --- a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-003-full-length-uui-dv7-helper-centralization.sdp.md +++ b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-003-full-length-uui-dv7-helper-centralization.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Full-length UUIDv7 helper centralization at ids/generator +- outcome: Capture the still-unimplemented deliverable "Full-length UUIDv7 helper centralization" until it is authored to a higher readiness rung. - problem: Several tranche-1 gaps remain after the auth keystone: test-mode checks fail open, correlation IDs can be fabricated, reviewer authorization still needs default-deny cleanup, lifecycle stubs leak placeholder behavior, and 'platform-store' still lacks a recorded decision for its constrained 'platform-core' runtime dependency. diff --git a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-004-reviewer-authorization-default-deny-migration.sdp.md b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-004-reviewer-authorization-default-deny-migration.sdp.md index 1c9730e2..fcf0b1f2 100644 --- a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-004-reviewer-authorization-default-deny-migration.sdp.md +++ b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-004-reviewer-authorization-default-deny-migration.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Reviewer authorization default-deny migration at authorization middleware and call sites +- outcome: Capture the still-unimplemented deliverable "Reviewer authorization default-deny migration" until it is authored to a higher readiness rung. - problem: Several tranche-1 gaps remain after the auth keystone: test-mode checks fail open, correlation IDs can be fabricated, reviewer authorization still needs default-deny cleanup, lifecycle stubs leak placeholder behavior, and 'platform-store' still lacks a recorded decision for its constrained 'platform-core' runtime dependency. diff --git a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-005-approval-expiration-ordering-fix.sdp.md b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-005-approval-expiration-ordering-fix.sdp.md index 612a663f..9edd353c 100644 --- a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-005-approval-expiration-ordering-fix.sdp.md +++ b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-005-approval-expiration-ordering-fix.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Approval expiration ordering fix at approveAction and rejectAction surfaces +- outcome: Capture the still-unimplemented deliverable "Approval expiration ordering fix" until it is authored to a higher readiness rung. - problem: Several tranche-1 gaps remain after the auth keystone: test-mode checks fail open, correlation IDs can be fabricated, reviewer authorization still needs default-deny cleanup, lifecycle stubs leak placeholder behavior, and 'platform-store' still lacks a recorded decision for its constrained 'platform-core' runtime dependency. diff --git a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-006-lifecycle-stubs-throw-or-are-removed.sdp.md b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-006-lifecycle-stubs-throw-or-are-removed.sdp.md index c1b175b3..e88452ca 100644 --- a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-006-lifecycle-stubs-throw-or-are-removed.sdp.md +++ b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-006-lifecycle-stubs-throw-or-are-removed.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: Lifecycle stubs throw or are removed at public lifecycle surfaces +- outcome: Capture the still-unimplemented deliverable "Lifecycle stubs throw or are removed" until it is authored to a higher readiness rung. - problem: Several tranche-1 gaps remain after the auth keystone: test-mode checks fail open, correlation IDs can be fabricated, reviewer authorization still needs default-deny cleanup, lifecycle stubs leak placeholder behavior, and 'platform-store' still lacks a recorded decision for its constrained 'platform-core' runtime dependency. diff --git a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-007-platform-store-dependency-decision-guardrails.sdp.md b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-007-platform-store-dependency-decision-guardrails.sdp.md index ffe8e597..c66318ed 100644 --- a/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-007-platform-store-dependency-decision-guardrails.sdp.md +++ b/specs/unimplemented/deliverables/tranche-1-supporting-security-and-contract-sweep/d-007-platform-store-dependency-decision-guardrails.sdp.md @@ -10,5 +10,5 @@ relations: ## Intent -- outcome: Unimplemented deliverable: platform-store dependency decision + guardrails at libar-platform/architect/decisions/pdr-021-platform-store-runtime-dependency-on-platform-core +- outcome: Capture the still-unimplemented deliverable "platform-store dependency decision + guardrails" until it is authored to a higher readiness rung. - problem: Several tranche-1 gaps remain after the auth keystone: test-mode checks fail open, correlation IDs can be fabricated, reviewer authorization still needs default-deny cleanup, lifecycle stubs leak placeholder behavior, and 'platform-store' still lacks a recorded decision for its constrained 'platform-core' runtime dependency. diff --git a/specs/unimplemented/remaining/phase-100-themed-decision-architecture.sdp.md b/specs/unimplemented/remaining/phase-100-themed-decision-architecture.sdp.md deleted file mode 100644 index 91d3f568..00000000 --- a/specs/unimplemented/remaining/phase-100-themed-decision-architecture.sdp.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: spec:unimplemented.remaining.phase-100-themed-decision-architecture -kind: behavior -altitude: feature -readiness: idea -relations: - refines: spec:unimplemented.backlog ---- -# ThemedDecisionArchitecture - Remaining Work - -## Intent - -ThemedDecisionArchitecture - Remaining Work Purpose: Detailed remaining work for ThemedDecisionArchitecture --- Summary Progress: [██████████░░░░░░░░░░] 3/6 (50%) Remaining: 3 patterns (1 active, 2 planned) --- 🚧 In Progress --- ✅ Ready to Start These patterns can be started immediately: --- All Remaining Patterns 🚧 Process Enhancements Vision: Transform the delivery process from a documentation tool into a delivery operating system. Enable code-driven, multi-workflow documentation where code + .feature files are authoritative sources, and all artifacts are generated projections. Problem: Current delivery process capabilities are limited to document generation. The convergence roadmap identified 8 opportunities: Process Views as Projections, DoD as Machine-Checkable, Earned-Value Tracking… - -- outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-100-themed-decision-architecture.md. diff --git a/specs/unimplemented/remaining/phase-18-production-hardening.sdp.md b/specs/unimplemented/remaining/phase-18-production-hardening.sdp.md deleted file mode 100644 index de42f24b..00000000 --- a/specs/unimplemented/remaining/phase-18-production-hardening.sdp.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: spec:unimplemented.remaining.phase-18-production-hardening -kind: behavior -altitude: feature -readiness: idea -relations: - refines: spec:unimplemented.backlog ---- -# ProductionHardening - Remaining Work - -## Intent - -ProductionHardening - Remaining Work Purpose: Detailed remaining work for ProductionHardening --- Summary Progress: [█████████░░░░░░░░░░░] 3/7 (43%) Remaining: 4 patterns (0 active, 4 planned) --- ✅ Ready to Start These patterns can be started immediately: --- ⚠️ Blocked These patterns are waiting on dependencies: --- All Remaining Patterns 📋 Admin Tooling Consolidation Problem: Admin functionality is scattered across the codebase: - Dead letter queue at convex/projections/deadLetters.ts - Saga admin at convex/sagas/admin.ts - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. Solution: Consolidate admin functionality into convex/admin/ directory: - projections.ts - R… - -- outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-18-production-hardening.md. diff --git a/specs/unimplemented/remaining/phase-18-workpool-partitioning-strategy.sdp.md b/specs/unimplemented/remaining/phase-18-workpool-partitioning-strategy.sdp.md deleted file mode 100644 index e4a43f3d..00000000 --- a/specs/unimplemented/remaining/phase-18-workpool-partitioning-strategy.sdp.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: spec:unimplemented.remaining.phase-18-workpool-partitioning-strategy -kind: behavior -altitude: feature -readiness: idea -relations: - refines: spec:unimplemented.backlog ---- -# WorkpoolPartitioningStrategy - Remaining Work - -## Intent - -WorkpoolPartitioningStrategy - Remaining Work Purpose: Detailed remaining work for WorkpoolPartitioningStrategy --- Summary Progress: [███████████░░░░░░░░░] 5/9 (56%) Remaining: 4 patterns (0 active, 4 planned) --- ✅ Ready to Start These patterns can be started immediately: --- ⚠️ Blocked These patterns are waiting on dependencies: --- All Remaining Patterns 📋 Admin Tooling Consolidation Problem: Admin functionality is scattered across the codebase: - Dead letter queue at convex/projections/deadLetters.ts - Saga admin at convex/sagas/admin.ts - No centralized diagnostics or event flow tracing - No unified interface for durable function inspection This fragmentation makes operational tasks difficult and error-prone. Solution: Consolidate admin functionality into convex/admin/ directory: -… - -- outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-18-workpool-partitioning-strategy.md. diff --git a/specs/unimplemented/remaining/phase-20-reservation-pattern.sdp.md b/specs/unimplemented/remaining/phase-20-reservation-pattern.sdp.md deleted file mode 100644 index f3cf227c..00000000 --- a/specs/unimplemented/remaining/phase-20-reservation-pattern.sdp.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: spec:unimplemented.remaining.phase-20-reservation-pattern -kind: behavior -altitude: feature -readiness: idea -relations: - refines: spec:unimplemented.backlog ---- -# ReservationPattern - Remaining Work - -## Intent - -ReservationPattern - Remaining Work Purpose: Detailed remaining work for ReservationPattern --- Summary Progress: [█████████████░░░░░░░] 2/3 (67%) Remaining: 1 patterns (0 active, 1 planned) --- ✅ Ready to Start These patterns can be started immediately: --- All Remaining Patterns 📋 Deterministic Id Hashing Problem: TTL-based reservations work well for multi-step flows (registration wizards), but add overhead for simple "create if unique" operations. Need a lighter-weight alternative. Solution: Generate entity stream ID from unique business key via deterministic hash. Concurrent creates target the same stream ID; OCC detects conflict automatically. When to Use Each Pattern: Example: typescript // Two concurrent "create user with email" requests const streamId = deterministicStreamId("User… - -- outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-20-reservation-pattern.md. diff --git a/specs/unimplemented/remaining/phase-21-integration-patterns-21b.sdp.md b/specs/unimplemented/remaining/phase-21-integration-patterns-21b.sdp.md deleted file mode 100644 index 4da48ab0..00000000 --- a/specs/unimplemented/remaining/phase-21-integration-patterns-21b.sdp.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: spec:unimplemented.remaining.phase-21-integration-patterns-21b -kind: behavior -altitude: feature -readiness: idea -relations: - refines: spec:unimplemented.backlog ---- -# IntegrationPatterns21b - Remaining Work - -## Intent - -IntegrationPatterns21b - Remaining Work Purpose: Detailed remaining work for IntegrationPatterns21b --- Summary Progress: [░░░░░░░░░░░░░░░░░░░░] 0/2 (0%) Remaining: 2 patterns (0 active, 2 planned) --- ✅ Ready to Start These patterns can be started immediately: --- ⚠️ Blocked These patterns are waiting on dependencies: --- All Remaining Patterns 📋 Integration Patterns21a Problem: Cross-context communication is ad-hoc. Domain events are used directly for integration without explicit contracts, leading to tight coupling. Solution: Foundational patterns for cross-context communication: - Context Map — Document relationships between BCs (including Partnership, Shared Kernel, Open Host Service) - Published Language — Stable schema for integration events with event tagging and compatibility mod… - -- outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-21-integration-patterns-21b.md. diff --git a/specs/unimplemented/remaining/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md b/specs/unimplemented/remaining/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md deleted file mode 100644 index 827215fd..00000000 --- a/specs/unimplemented/remaining/phase-22-agent-as-bounded-context-ai-driven-event-reactors.sdp.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: spec:unimplemented.remaining.phase-22-agent-as-bounded-context-ai-driven-event-reactors -kind: behavior -altitude: feature -readiness: idea -relations: - refines: spec:unimplemented.backlog ---- -# Agent as Bounded Context - AI-Driven Event Reactors - Remaining Work - -## Intent - -Agent as Bounded Context - AI-Driven Event Reactors - Remaining Work Purpose: Detailed remaining work for Agent as Bounded Context - AI-Driven Event Reactors --- Summary Progress: [░░░░░░░░░░░░░░░░░░░░] 0/1 (0%) Remaining: 1 patterns (1 active, 0 planned) --- 🚧 In Progress --- All Remaining Patterns 🚧 Agent as Bounded Context - AI-Driven Event Reactors Agent as Bounded Context - AI-Driven Event Reactors Demonstrates the Agent as Bounded Context pattern where AI agents subscribe to domain events via EventBus and emit commands based on pattern detection. Architecture Overview ┌─────────────────────────────────────────────────────────────────────────┐ │ EventBus │ │ (publishes OrderCancelled, OrderRefunded, OrderComplaintFiled, etc.) │ └────────────────────────────────┬──────────────────────… - -- outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-22-agent-as-bounded-context-ai-driven-event-reactors.md. diff --git a/specs/unimplemented/remaining/phase-22-agent-as-bounded-context.sdp.md b/specs/unimplemented/remaining/phase-22-agent-as-bounded-context.sdp.md deleted file mode 100644 index 472b180a..00000000 --- a/specs/unimplemented/remaining/phase-22-agent-as-bounded-context.sdp.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: spec:unimplemented.remaining.phase-22-agent-as-bounded-context -kind: behavior -altitude: feature -readiness: idea -relations: - refines: spec:unimplemented.backlog ---- -# AgentAsBoundedContext - Remaining Work - -## Intent - -AgentAsBoundedContext - Remaining Work Purpose: Detailed remaining work for AgentAsBoundedContext --- Summary Progress: [░░░░░░░░░░░░░░░░░░░░] 0/1 (0%) Remaining: 1 patterns (1 active, 0 planned) --- 🚧 In Progress --- All Remaining Patterns 🚧 Agent As Bounded Context Problem: AI agents are invoked manually without integration into the event-driven architecture. No pattern for agents to react to business events. Solution: AI agents implemented as bounded contexts that: 1. Subscribe to event streams via EventBus 2. Detect patterns across events using LLM or rules 3. Emit commands based on detected patterns This is the culminating pattern demonstrating full platform integration. Why It Matters for Convex-Native ES: Architectural Decisions: @convex-dev/agent Integration: Agent BC uses @convex… - -- outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-22-agent-as-bounded-context.md. diff --git a/specs/unimplemented/remaining/phase-22-agent-churn-risk-completion.sdp.md b/specs/unimplemented/remaining/phase-22-agent-churn-risk-completion.sdp.md deleted file mode 100644 index 73b8f806..00000000 --- a/specs/unimplemented/remaining/phase-22-agent-churn-risk-completion.sdp.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: spec:unimplemented.remaining.phase-22-agent-churn-risk-completion -kind: behavior -altitude: feature -readiness: idea -relations: - refines: spec:unimplemented.backlog ---- -# AgentChurnRiskCompletion - Remaining Work - -## Intent - -AgentChurnRiskCompletion - Remaining Work Purpose: Detailed remaining work for AgentChurnRiskCompletion --- Summary Progress: [██████████░░░░░░░░░░] 3/6 (50%) Remaining: 3 patterns (3 active, 0 planned) --- 🚧 In Progress --- All Remaining Patterns 🚧 Agent BC Component Isolation Problem: Agent BC tables ( agentCheckpoints , agentAuditEvents , agentDeadLetters , agentCommands , pendingApprovals ) reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. Solution: Implement agent as a proper Convex component: 1. defineComponent("agent") with isolated schema and private tables 2. Public API handlers for… - -- outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-22-agent-churn-risk-completion.md. diff --git a/specs/unimplemented/remaining/phase-22-confirmed-order-cancellation.sdp.md b/specs/unimplemented/remaining/phase-22-confirmed-order-cancellation.sdp.md deleted file mode 100644 index beaa9f60..00000000 --- a/specs/unimplemented/remaining/phase-22-confirmed-order-cancellation.sdp.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: spec:unimplemented.remaining.phase-22-confirmed-order-cancellation -kind: behavior -altitude: feature -readiness: idea -relations: - refines: spec:unimplemented.backlog ---- -# ConfirmedOrderCancellation - Remaining Work - -## Intent - -ConfirmedOrderCancellation - Remaining Work Purpose: Detailed remaining work for ConfirmedOrderCancellation --- Summary Progress: [██████████░░░░░░░░░░] 3/6 (50%) Remaining: 3 patterns (3 active, 0 planned) --- 🚧 In Progress --- All Remaining Patterns 🚧 Agent BC Component Isolation Problem: Agent BC tables ( agentCheckpoints , agentAuditEvents , agentDeadLetters , agentCommands , pendingApprovals ) reside in the shared app schema without physical BC isolation. Any app mutation can read/write agent tables directly, violating the core platform principle that bounded contexts should have isolated databases enforced by Convex component boundaries. Solution: Implement agent as a proper Convex component: 1. defineComponent("agent") with isolated schema and private tables 2. Public API handlers… - -- outcome: Non-implemented or in-flight work captured from docs-living/remaining/phase-22-confirmed-order-cancellation.md. diff --git a/test/sdp-migration-guard.test.ts b/test/sdp-migration-guard.test.ts index 707c2e74..e6bb228a 100644 --- a/test/sdp-migration-guard.test.ts +++ b/test/sdp-migration-guard.test.ts @@ -69,15 +69,17 @@ describe("SDP migration guard", () => { expect(packs.length).toBeGreaterThan(0); const specs = carriers.filter((f) => f.endsWith(".sdp.md") && !f.endsWith(".pack.sdp.md")); - // Hundreds of executable scenarios plus unimplemented backlog Specs. - expect(specs.length).toBeGreaterThanOrEqual(3000); + // Behavior Specs plus unimplemented backlog Specs. Mechanical per-scenario test + // mirrors were pruned; .feature files remain the carriers for unit-level scenarios, + // and example Specs are kept only for user-facing and cross-component business flows. + expect(specs.length).toBeGreaterThanOrEqual(500); const exampleFiles = walkFiles(join(ROOT, "specs")).filter( (f) => f.endsWith(".sdp.md") && (f.includes(".examples") || f.includes("architect-scenarios")), ); - expect(exampleFiles.length).toBeGreaterThanOrEqual(2000); + expect(exampleFiles.length).toBeGreaterThanOrEqual(80); const withGwt = exampleFiles.filter((f) => readFileSync(f, "utf8").includes("```gwt")); - expect(withGwt.length).toBeGreaterThanOrEqual(2000); + expect(withGwt.length).toBeGreaterThanOrEqual(80); expect(existsSync(join(ROOT, "specs", "unimplemented"))).toBe(true); // Live architect/ is a pointer; Gherkin corpus was relocated to lineage.